
const GridFilter = {
    template: '#grid-filter-template',
    props: {
        filter: Object
    },

    methods: {

        changeVerb() {
            // set focus to value input, "as quickly as we can"
            this.$nextTick(function() {
                this.focusValue()
            })
        },

        focusValue: function() {
            this.$refs.valueInput.focus()
            // this.$refs.valueInput.select()
        }
    }
}

Vue.component('grid-filter', GridFilter)


let TailboneGrid = {
    template: '#tailbone-grid-template',

    methods: {

        getRowClass(row, index) {
            return this.rowStatusMap[index]
        },

        loadAsyncData(params) {

            if (params === undefined) {
                params = [
                    'partial=true',
                    `sortkey=${this.sortField}`,
                    `sortdir=${this.sortOrder}`,
                    `pagesize=${this.perPage}`,
                    `page=${this.page}`
                ].join('&')
            }

            this.loading = true
            this.$http.get(`?${params}`).then(({ data }) => {
                this.data = data.data
                this.rowStatusMap = data.row_status_map
                this.total = data.total_items
                this.firstItem = data.first_item
                this.lastItem = data.last_item
                this.loading = false
            })
            .catch((error) => {
                this.data = []
                this.total = 0
                this.loading = false
                throw error
            })
        },

        onPageChange(page) {
            this.page = page
            this.loadAsyncData()
        },

        onSort(field, order) {
            this.sortField = field
            this.sortOrder = order
            // always reset to first page when changing sort options
            // TODO: i mean..right? would we ever not want that?
            this.page = 1
            this.loadAsyncData()
        },

        resetView() {
            this.loading = true
            location.href = '?reset-to-default-filters=true'
        },

        addFilter(filter_key) {

            // reset dropdown so user again sees "Add Filter" placeholder
            this.$nextTick(function() {
                this.selectedFilter = null
            })

            // show corresponding grid filter
            this.filters[filter_key].visible = true
            this.filters[filter_key].active = true

            // track down the component
            var gridFilter = null
            for (var gf of this.$refs.gridFilters) {
                if (gf.filter.key == filter_key) {
                    gridFilter = gf
                    break
                }
            }

            // tell component to focus the value field, ASAP
            this.$nextTick(function() {
                gridFilter.focusValue()
            })

        },

        applyFilters(params) {
            if (params === undefined) {
                params = []
            }

            params.push('partial=true')
            params.push('filter=true')

            for (var key in this.filters) {
                var filter = this.filters[key]
                if (filter.active) {
                    params.push(key + '=' + encodeURIComponent(filter.value))
                    params.push(key + '.verb=' + encodeURIComponent(filter.verb))
                } else {
                    filter.visible = false
                }
            }

            this.loadAsyncData(params.join('&'))
        },

        clearFilters() {

            // explicitly deactivate all filters
            for (var key in this.filters) {
                this.filters[key].active = false
            }

            // then just "apply" as normal
            this.applyFilters()
        },

        saveDefaults() {

            // apply current filters as normal, but add special directive
            const params = ['save-current-filters-as-defaults=true']
            this.applyFilters(params)
        },

        deleteObject(event) {
            // we let parent component/app deal with this, in whatever way makes sense...
            // TODO: should we ever provide anything besides the URL for this?
            this.$emit('deleteActionClicked', event.target.href)
        },

        deleteResults(event) {

            // submit form if user confirms
            // TODO: how/where to get/show "plural model title" here?
            // if (confirm("You are about to delete " + this.total + " ${grid.model_title_plural}.\n\nAre you sure?")) {
            if (confirm("You are about to delete " + this.total.toLocaleString('en') + " objects.\n\nAre you sure?")) {
                event.target.form.submit()
            }
        },

        checkedRowUUIDs() {
            var uuids = [];
            for (var row of this.$data.checkedRows) {
                uuids.push(row.uuid)
            }
            return uuids
        }
    }
}


let GridPage = {
    template: '#grid-page-template',
    methods: {}
}
