UNPKG

v-tables-3

Version:

Vue.js 3 grid components

227 lines (187 loc) 7.36 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = install; var _vuex = _interopRequireDefault(require("./state/vuex")); var _normal = _interopRequireDefault(require("./state/normal")); var _merge = _interopRequireDefault(require("merge")); var _data2 = _interopRequireDefault(require("./state/data")); var _resizeableColumns = _interopRequireDefault(require("./helpers/resizeable-columns")); var _VtClientTable = _interopRequireDefault(require("./components/VtClientTable")); var _table = _interopRequireDefault(require("./table")); var _themes = _interopRequireDefault(require("./themes/themes")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } var _data = require("./mixins/data"); var _created = require("./mixins/created"); var provide = require("./mixins/provide"); function install(app, globalOptions) { var theme = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "bootstrap3"; var componentsOverride = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; var themeOverride = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; var useVuex = false; var client = _merge["default"].recursive(true, (0, _table["default"])(), { name: "r-l-client-table", render: require('./components/renderless/RLDataTable'), provide: provide, props: { columns: { type: Array, required: true }, data: { type: Array, required: true }, name: { type: String, required: false }, options: { type: Object, required: false, "default": function _default() { return {}; } } }, created: function created() { _created(this); if (this.opts.toMomentFormat) this.transformDateStringsToMoment(); if (!this.vuex) { this.initOrderBy(); this.query = this.initQuery(); this.customQueries = this.initCustomFilters(); } }, mounted: function mounted() { var _this = this; this._setFiltersDOM(this.query); if (this.opts.resizableColumns) { (0, _resizeableColumns["default"])(this.refs.table, this.hasChildRow, this.opts.childRowTogglerFirst, this.resizableColumns, this.opts.stickyHeader); } if (this.groupBy && this.groupBy.length > 1) { this.options.multiSorting = {}; this.options.multiSorting[this.groupBy[0]] = [{ column: this.groupBy[1], matchDir: true }]; } if (!this.vuex) { this.registerClientFilters(); if (this.options.initialPage) this.setPage(this.options.initialPage); } if (this.groupBy && !this.orderBy) { this.orderBy.column = this.groupBy[0]; } this.loadState(); if (this.hasDateFilters()) { this.initDateFilters(); } // listen for data being removed // and nav to last page if current page is greater than total pages this.$watch('data', function () { if (_this.page > _this.totalPages) { _this.setPage(_this.totalPages); } }); }, model: { prop: "data" }, data: function data() { var Theme = typeof theme === 'string' ? _themes["default"][theme] : theme(); return _merge["default"].recursive(_data(), { source: "client", loading: false, theme: _merge["default"].recursive(Theme, themeOverride), globalOptions: globalOptions, componentsOverride: componentsOverride, currentlySorting: {}, time: Date.now() }, (0, _data2["default"])(useVuex, "client", this.options.initialPage)); }, computed: { q: require("./computed/q"), customQ: require("./computed/custom-q"), totalPages: require("./computed/total-pages"), filteredData: require("./computed/filtered-data"), groupBy: function groupBy() { return typeof this.opts.groupBy === 'string' ? [this.opts.groupBy] : this.opts.groupBy; }, hasMultiSort: function hasMultiSort() { return this.opts.clientMultiSorting; } }, methods: { transformDateStringsToMoment: require("./methods/transform-date-strings-to-moment"), registerClientFilters: require("./methods/register-client-filters"), search: require("./methods/client-search"), defaultSort: require("./methods/default-sort"), getGroupSlot: require("./methods/get-group-slot"), toggleGroup: function toggleGroup(group, e) { e.stopPropagation(); var i = this.collapsedGroups.indexOf(group); if (i >= 0) { this.collapsedGroups.splice(i, 1); } else { this.collapsedGroups.push(group); } }, groupToggleIcon: function groupToggleIcon(group) { var cls = this.opts.sortIcon.base + " "; cls += this.collapsedGroups.indexOf(group) > -1 ? this.opts.sortIcon.down : this.opts.sortIcon.up; return cls; }, downloadCsv: function downloadCsv() { var _this2 = this; var filename = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'table.csv'; var r; var rows = [this.columns].concat(this.allFilteredData.map(function (row) { r = {}; _this2.columns.forEach(function (column) { r[column] = row[column]; }); return Object.values(r); })); var csvContent = "data:text/csv;charset=utf-8," + rows.map(function (e) { return e.join(","); }).join("\n"); var encodedUri = encodeURI(csvContent); var link = document.createElement("a"); link.setAttribute("href", encodedUri); link.setAttribute("download", filename); document.body.appendChild(link); // Required for FF link.click(); // This will download the data file link.remove(); }, loadState: function loadState() { if (!this.opts.saveState) return; if (!this.storage.getItem(this.stateKey)) { this.initState(); this.activeState = true; return; } var state = JSON.parse(this.storage.getItem(this.stateKey)); if (this.opts.filterable) this.setFilter(state.query); this.setOrder(state.orderBy.column, state.orderBy.ascending); if (this.vuex) { this.commit("SET_LIMIT", state.perPage); } else { this.limit = state.perPage; } this.setPage(state.page); this.activeState = true; if (state.userControlsColumns) { this.userColumnsDisplay = state.userColumnsDisplay; this.userControlsColumns = state.userControlsColumns; } // TODO: Custom Queries } } }); var state = useVuex ? (0, _vuex["default"])() : (0, _normal["default"])(); client = _merge["default"].recursive(client, state); var comp = (0, _VtClientTable["default"])(client); app.component("v-client-table", comp); return comp; } ;