lv2-datatable
Version:
Integrate the Laravel datatables with your Vue app without using JQuery. It can handle listing data locally and remote.
1,372 lines (1,238 loc) • 40.3 kB
JavaScript
const debounce = (func, wait, immediate) => {
let timeout, args, context, timestamp, result;
if (null == wait) wait = 100;
function later() {
let last = Date.now() - timestamp;
if (last < wait && last >= 0) {
timeout = setTimeout(later, wait - last);
} else {
timeout = null;
if (!immediate) {
result = func.apply(context, args);
context = args = null;
}
}
}
let debounced = function () {
context = this;
args = arguments;
timestamp = Date.now();
let callNow = immediate && !timeout;
if (!timeout) timeout = setTimeout(later, wait);
if (callNow) {
result = func.apply(context, args);
context = args = null;
}
return result;
};
debounced.clear = function () {
if (timeout) {
clearTimeout(timeout);
timeout = null;
}
};
debounced.flush = function () {
if (timeout) {
result = func.apply(context, args);
context = args = null;
clearTimeout(timeout);
timeout = null;
}
};
return debounced;
};
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
var script$1 = {
name: "Paginate",
props: {
value: {
type: Number
},
pageCount: {
type: Number,
required: true
},
forcePage: {
type: Number
},
clickHandler: {
type: Function,
default: () => {}
},
pageRange: {
type: Number,
default: 3
},
marginPages: {
type: Number,
default: 1
},
prevText: {
type: String,
default: 'Prev'
},
nextText: {
type: String,
default: 'Next'
},
breakViewText: {
type: String,
default: '…'
},
containerClass: {
type: String
},
pageClass: {
type: String
},
pageLinkClass: {
type: String
},
prevClass: {
type: String
},
prevLinkClass: {
type: String
},
nextClass: {
type: String
},
nextLinkClass: {
type: String
},
breakViewClass: {
type: String
},
breakViewLinkClass: {
type: String
},
activeClass: {
type: String,
default: 'active'
},
disabledClass: {
type: String,
default: 'disabled'
},
noLiSurround: {
type: Boolean,
default: false
},
firstLastButton: {
type: Boolean,
default: false
},
firstButtonText: {
type: String,
default: 'First'
},
lastButtonText: {
type: String,
default: 'Last'
},
hidePrevNext: {
type: Boolean,
default: false
}
},
beforeUpdate() {
if (this.forcePage === undefined) return;
if (this.forcePage !== this.selected) {
this.selected = this.forcePage;
}
},
computed: {
selected: {
get: function () {
return this.value || this.innerValue;
},
set: function (newValue) {
this.innerValue = newValue;
}
},
pages: function () {
let items = {};
if (this.pageCount <= this.pageRange) {
for (let index = 0; index < this.pageCount; index++) {
items[index] = {
index: index,
content: index + 1,
selected: index === this.selected - 1
};
}
} else {
const halfPageRange = Math.floor(this.pageRange / 2);
let setPageItem = index => {
items[index] = {
index: index,
content: index + 1,
selected: index === this.selected - 1
};
};
let setBreakView = index => {
items[index] = {
disabled: true,
breakView: true
};
}; // 1st - loop thru low end of margin pages
for (let i = 0; i < this.marginPages; i++) {
setPageItem(i);
} // 2nd - loop thru selected range
let selectedRangeLow = 0;
if (this.selected - halfPageRange > 0) {
selectedRangeLow = this.selected - 1 - halfPageRange;
}
let selectedRangeHigh = selectedRangeLow + this.pageRange - 1;
if (selectedRangeHigh >= this.pageCount) {
selectedRangeHigh = this.pageCount - 1;
selectedRangeLow = selectedRangeHigh - this.pageRange + 1;
}
for (let i = selectedRangeLow; i <= selectedRangeHigh && i <= this.pageCount - 1; i++) {
setPageItem(i);
} // Check if there is breakView in the left of selected range
if (selectedRangeLow > this.marginPages) {
setBreakView(selectedRangeLow - 1);
} // Check if there is breakView in the right of selected range
if (selectedRangeHigh + 1 < this.pageCount - this.marginPages) {
setBreakView(selectedRangeHigh + 1);
} // 3rd - loop thru high end of margin pages
for (let i = this.pageCount - 1; i >= this.pageCount - this.marginPages; i--) {
setPageItem(i);
}
}
return items;
}
},
data() {
return {
innerValue: 1
};
},
methods: {
handlePageSelected(selected) {
if (this.selected === selected) return;
this.innerValue = selected;
this.$emit('input', selected);
this.clickHandler(selected);
},
prevPage() {
if (this.selected <= 1) return;
this.handlePageSelected(this.selected - 1);
},
nextPage() {
if (this.selected >= this.pageCount) return;
this.handlePageSelected(this.selected + 1);
},
firstPageSelected() {
return this.selected === 1;
},
lastPageSelected() {
return this.selected === this.pageCount || this.pageCount === 0;
},
selectFirstPage() {
if (this.selected <= 1) return;
this.handlePageSelected(1);
},
selectLastPage() {
if (this.selected >= this.pageCount) return;
this.handlePageSelected(this.pageCount);
}
}
};
function normalizeComponent(template, style, script, scopeId, isFunctionalTemplate, moduleIdentifier /* server only */, shadowMode, createInjector, createInjectorSSR, createInjectorShadow) {
if (typeof shadowMode !== 'boolean') {
createInjectorSSR = createInjector;
createInjector = shadowMode;
shadowMode = false;
}
// Vue.extend constructor export interop.
const options = typeof script === 'function' ? script.options : script;
// render functions
if (template && template.render) {
options.render = template.render;
options.staticRenderFns = template.staticRenderFns;
options._compiled = true;
// functional template
if (isFunctionalTemplate) {
options.functional = true;
}
}
// scopedId
if (scopeId) {
options._scopeId = scopeId;
}
let hook;
if (moduleIdentifier) {
// server build
hook = function (context) {
// 2.3 injection
context =
context || // cached call
(this.$vnode && this.$vnode.ssrContext) || // stateful
(this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext); // functional
// 2.2 with runInNewContext: true
if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {
context = __VUE_SSR_CONTEXT__;
}
// inject component styles
if (style) {
style.call(this, createInjectorSSR(context));
}
// register component module identifier for async chunk inference
if (context && context._registeredComponents) {
context._registeredComponents.add(moduleIdentifier);
}
};
// used by ssr in case component is cached and beforeCreate
// never gets called
options._ssrRegister = hook;
}
else if (style) {
hook = shadowMode
? function (context) {
style.call(this, createInjectorShadow(context, this.$root.$options.shadowRoot));
}
: function (context) {
style.call(this, createInjector(context));
};
}
if (hook) {
if (options.functional) {
// register for functional component in vue file
const originalRender = options.render;
options.render = function renderWithStyleInjection(h, context) {
hook.call(context);
return originalRender(h, context);
};
}
else {
// inject component registration as beforeCreate hook
const existing = options.beforeCreate;
options.beforeCreate = existing ? [].concat(existing, hook) : [hook];
}
}
return script;
}
const isOldIE = typeof navigator !== 'undefined' &&
/msie [6-9]\\b/.test(navigator.userAgent.toLowerCase());
function createInjector(context) {
return (id, style) => addStyle(id, style);
}
let HEAD;
const styles = {};
function addStyle(id, css) {
const group = isOldIE ? css.media || 'default' : id;
const style = styles[group] || (styles[group] = { ids: new Set(), styles: [] });
if (!style.ids.has(id)) {
style.ids.add(id);
let code = css.source;
if (css.map) {
// https://developer.chrome.com/devtools/docs/javascript-debugging
// this makes source maps inside style tags work properly in Chrome
code += '\n/*# sourceURL=' + css.map.sources[0] + ' */';
// http://stackoverflow.com/a/26603875
code +=
'\n/*# sourceMappingURL=data:application/json;base64,' +
btoa(unescape(encodeURIComponent(JSON.stringify(css.map)))) +
' */';
}
if (!style.element) {
style.element = document.createElement('style');
style.element.type = 'text/css';
if (css.media)
style.element.setAttribute('media', css.media);
if (HEAD === undefined) {
HEAD = document.head || document.getElementsByTagName('head')[0];
}
HEAD.appendChild(style.element);
}
if ('styleSheet' in style.element) {
style.styles.push(code);
style.element.styleSheet.cssText = style.styles
.filter(Boolean)
.join('\n');
}
else {
const index = style.ids.size - 1;
const textNode = document.createTextNode(code);
const nodes = style.element.childNodes;
if (nodes[index])
style.element.removeChild(nodes[index]);
if (nodes.length)
style.element.insertBefore(textNode, nodes[index]);
else
style.element.appendChild(textNode);
}
}
}
/* script */
const __vue_script__$1 = script$1;
/* template */
var __vue_render__$1 = function () {
var _vm = this;
var _h = _vm.$createElement;
var _c = _vm._self._c || _h;
return !_vm.noLiSurround ? _c('ul', {
class: _vm.containerClass
}, [_vm.firstLastButton ? _c('li', {
class: [_vm.pageClass, _vm.firstPageSelected() ? _vm.disabledClass : '']
}, [_c('a', {
class: _vm.pageLinkClass,
attrs: {
"tabindex": _vm.firstPageSelected() ? -1 : 0
},
domProps: {
"innerHTML": _vm._s(_vm.firstButtonText)
},
on: {
"click": function ($event) {
return _vm.selectFirstPage();
},
"keyup": function ($event) {
if (!$event.type.indexOf('key') && _vm._k($event.keyCode, "enter", 13, $event.key, "Enter")) {
return null;
}
return _vm.selectFirstPage();
}
}
})]) : _vm._e(), _vm._v(" "), !(_vm.firstPageSelected() && _vm.hidePrevNext) ? _c('li', {
class: [_vm.prevClass, _vm.firstPageSelected() ? _vm.disabledClass : '']
}, [_c('a', {
class: _vm.prevLinkClass,
attrs: {
"tabindex": _vm.firstPageSelected() ? -1 : 0
},
domProps: {
"innerHTML": _vm._s(_vm.prevText)
},
on: {
"click": function ($event) {
return _vm.prevPage();
},
"keyup": function ($event) {
if (!$event.type.indexOf('key') && _vm._k($event.keyCode, "enter", 13, $event.key, "Enter")) {
return null;
}
return _vm.prevPage();
}
}
})]) : _vm._e(), _vm._v(" "), _vm._l(_vm.pages, function (page) {
return _c('li', {
class: [_vm.pageClass, page.selected ? _vm.activeClass : '', page.disabled ? _vm.disabledClass : '', page.breakView ? _vm.breakViewClass : '']
}, [page.breakView ? _c('a', {
class: [_vm.pageLinkClass, _vm.breakViewLinkClass],
attrs: {
"tabindex": "0"
}
}, [_vm._t("breakViewContent", function () {
return [_vm._v(_vm._s(_vm.breakViewText))];
})], 2) : page.disabled ? _c('a', {
class: _vm.pageLinkClass,
attrs: {
"tabindex": "0"
}
}, [_vm._v(_vm._s(page.content))]) : _c('a', {
class: _vm.pageLinkClass,
attrs: {
"tabindex": "0"
},
on: {
"click": function ($event) {
return _vm.handlePageSelected(page.index + 1);
},
"keyup": function ($event) {
if (!$event.type.indexOf('key') && _vm._k($event.keyCode, "enter", 13, $event.key, "Enter")) {
return null;
}
return _vm.handlePageSelected(page.index + 1);
}
}
}, [_vm._v(_vm._s(page.content))])]);
}), _vm._v(" "), !(_vm.lastPageSelected() && _vm.hidePrevNext) ? _c('li', {
class: [_vm.nextClass, _vm.lastPageSelected() ? _vm.disabledClass : '']
}, [_c('a', {
class: _vm.nextLinkClass,
attrs: {
"tabindex": _vm.lastPageSelected() ? -1 : 0
},
domProps: {
"innerHTML": _vm._s(_vm.nextText)
},
on: {
"click": function ($event) {
return _vm.nextPage();
},
"keyup": function ($event) {
if (!$event.type.indexOf('key') && _vm._k($event.keyCode, "enter", 13, $event.key, "Enter")) {
return null;
}
return _vm.nextPage();
}
}
})]) : _vm._e(), _vm._v(" "), _vm.firstLastButton ? _c('li', {
class: [_vm.pageClass, _vm.lastPageSelected() ? _vm.disabledClass : '']
}, [_c('a', {
class: _vm.pageLinkClass,
attrs: {
"tabindex": _vm.lastPageSelected() ? -1 : 0
},
domProps: {
"innerHTML": _vm._s(_vm.lastButtonText)
},
on: {
"click": function ($event) {
return _vm.selectLastPage();
},
"keyup": function ($event) {
if (!$event.type.indexOf('key') && _vm._k($event.keyCode, "enter", 13, $event.key, "Enter")) {
return null;
}
return _vm.selectLastPage();
}
}
})]) : _vm._e()], 2) : _c('div', {
class: _vm.containerClass
}, [_vm.firstLastButton ? _c('a', {
class: [_vm.pageLinkClass, _vm.firstPageSelected() ? _vm.disabledClass : ''],
attrs: {
"tabindex": "0"
},
domProps: {
"innerHTML": _vm._s(_vm.firstButtonText)
},
on: {
"click": function ($event) {
return _vm.selectFirstPage();
},
"keyup": function ($event) {
if (!$event.type.indexOf('key') && _vm._k($event.keyCode, "enter", 13, $event.key, "Enter")) {
return null;
}
return _vm.selectFirstPage();
}
}
}) : _vm._e(), _vm._v(" "), !(_vm.firstPageSelected() && _vm.hidePrevNext) ? _c('a', {
class: [_vm.prevLinkClass, _vm.firstPageSelected() ? _vm.disabledClass : ''],
attrs: {
"tabindex": "0"
},
domProps: {
"innerHTML": _vm._s(_vm.prevText)
},
on: {
"click": function ($event) {
return _vm.prevPage();
},
"keyup": function ($event) {
if (!$event.type.indexOf('key') && _vm._k($event.keyCode, "enter", 13, $event.key, "Enter")) {
return null;
}
return _vm.prevPage();
}
}
}) : _vm._e(), _vm._v(" "), _vm._l(_vm.pages, function (page) {
return [page.breakView ? _c('a', {
class: [_vm.pageLinkClass, _vm.breakViewLinkClass, page.disabled ? _vm.disabledClass : ''],
attrs: {
"tabindex": "0"
}
}, [_vm._t("breakViewContent", function () {
return [_vm._v(_vm._s(_vm.breakViewText))];
})], 2) : page.disabled ? _c('a', {
class: [_vm.pageLinkClass, page.selected ? _vm.activeClass : '', _vm.disabledClass],
attrs: {
"tabindex": "0"
}
}, [_vm._v(_vm._s(page.content))]) : _c('a', {
class: [_vm.pageLinkClass, page.selected ? _vm.activeClass : ''],
attrs: {
"tabindex": "0"
},
on: {
"click": function ($event) {
return _vm.handlePageSelected(page.index + 1);
},
"keyup": function ($event) {
if (!$event.type.indexOf('key') && _vm._k($event.keyCode, "enter", 13, $event.key, "Enter")) {
return null;
}
return _vm.handlePageSelected(page.index + 1);
}
}
}, [_vm._v(_vm._s(page.content))])];
}), _vm._v(" "), !(_vm.lastPageSelected() && _vm.hidePrevNext) ? _c('a', {
class: [_vm.nextLinkClass, _vm.lastPageSelected() ? _vm.disabledClass : ''],
attrs: {
"tabindex": "0"
},
domProps: {
"innerHTML": _vm._s(_vm.nextText)
},
on: {
"click": function ($event) {
return _vm.nextPage();
},
"keyup": function ($event) {
if (!$event.type.indexOf('key') && _vm._k($event.keyCode, "enter", 13, $event.key, "Enter")) {
return null;
}
return _vm.nextPage();
}
}
}) : _vm._e(), _vm._v(" "), _vm.firstLastButton ? _c('a', {
class: [_vm.pageLinkClass, _vm.lastPageSelected() ? _vm.disabledClass : ''],
attrs: {
"tabindex": "0"
},
domProps: {
"innerHTML": _vm._s(_vm.lastButtonText)
},
on: {
"click": function ($event) {
return _vm.selectLastPage();
},
"keyup": function ($event) {
if (!$event.type.indexOf('key') && _vm._k($event.keyCode, "enter", 13, $event.key, "Enter")) {
return null;
}
return _vm.selectLastPage();
}
}
}) : _vm._e()], 2);
};
var __vue_staticRenderFns__$1 = [];
/* style */
const __vue_inject_styles__$1 = function (inject) {
if (!inject) return;
inject("data-v-bd4124a2_0", {
source: "a[data-v-bd4124a2]{cursor:pointer}",
map: undefined,
media: undefined
});
};
/* scoped */
const __vue_scope_id__$1 = "data-v-bd4124a2";
/* module identifier */
const __vue_module_identifier__$1 = undefined;
/* functional template */
const __vue_is_functional_template__$1 = false;
/* style inject SSR */
/* style inject shadow dom */
const __vue_component__$1 = /*#__PURE__*/normalizeComponent({
render: __vue_render__$1,
staticRenderFns: __vue_staticRenderFns__$1
}, __vue_inject_styles__$1, __vue_script__$1, __vue_scope_id__$1, __vue_is_functional_template__$1, __vue_module_identifier__$1, false, createInjector, undefined, undefined);
var Paginate = __vue_component__$1;
const theme = _ref => {
let {
rowClasses,
colClasses,
table,
paginate
} = _ref;
return {
row: rowClasses,
col: colClasses,
table,
paginate
};
};
const themeData = function () {
let design = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'bootstrap3';
switch (design) {
case 'bootstrap5':
return theme({
rowClasses: 'row',
colClasses: 'col-md-12',
table: {
colClasses: 'col-md-12',
tableClasses: 'table table-striped table-bordered table-sm',
tableContainer: 'position-relative',
formClasses: 'form-horizontal',
inputSearchClasses: 'form-control',
inputLengthOptionClasses: 'form-control'
},
paginate: {
colClasses: 'col-md-12',
containerClass: 'pagination',
pageClass: 'page-item',
pageLinkClass: 'page-link'
}
});
case 'bootstrap4':
return theme({
rowClasses: 'row',
colClasses: 'col-md-12',
table: {
colClasses: 'col-md-12',
tableClasses: 'table table-striped table-bordered table-sm',
tableContainer: 'position-relative',
formClasses: 'form-horizontal',
inputSearchClasses: 'form-control',
inputLengthOptionClasses: 'form-control'
},
paginate: {
colClasses: 'col-md-12',
containerClass: 'pagination',
pageClass: 'page-item',
pageLinkClass: 'page-link'
}
});
default:
return theme({
rowClasses: 'row',
colClasses: 'col-md-12',
table: {
colClasses: 'col-md-12',
tableClasses: 'table table-striped table-bordered',
tableContainer: 'position-relative',
formClasses: 'form-horizontal',
inputSearchClasses: 'form-control',
inputLengthOptionClasses: 'form-control'
},
paginate: {
colClasses: 'col-md-12',
containerClass: 'pagination',
pageClass: 'page-item',
pageLinkClass: null
}
});
}
};
var themeData$1 = themeData;
const setState = (key, initValue) => {
if (initValue === undefined || initValue === null) {
localStorage.removeItem(key);
} else {
localStorage.setItem(key, JSON.stringify(initValue));
}
};
const getState = key => {
return JSON.parse(localStorage.getItem(key));
};
const setDataTableState$1 = (tableId, _ref) => {
let {
length,
search,
page,
start,
defaultOrder,
recordsTotal,
recordsFiltered
} = _ref;
setState(`${tableId}_length`, length);
setState(`${tableId}_search`, search);
setState(`${tableId}_page`, page);
setState(`${tableId}_start`, start);
setState(`${tableId}_defaultOrder`, defaultOrder);
setState(`${tableId}_recordsTotal`, recordsTotal);
setState(`${tableId}_recordsFiltered`, recordsFiltered);
};
const getDataTableState$1 = tableId => {
const length = getState(`${tableId}_length`);
const search = getState(`${tableId}_search`);
const page = getState(`${tableId}_page`);
const start = getState(`${tableId}_start`);
const defaultOrder = getState(`${tableId}_defaultOrder`);
const recordsTotal = getState(`${tableId}_recordsTotal`);
const recordsFiltered = getState(`${tableId}_recordsFiltered`);
return {
length,
search,
page,
start,
defaultOrder,
recordsTotal,
recordsFiltered
};
};
var useLocalStorage = {
setDataTableState: setDataTableState$1,
getDataTableState: getDataTableState$1
};
var sEmptyTable$1="No data available in table";var sInfo$1="Showing _START_ to _END_ of _TOTAL_ entries";var sInfoEmpty$1="Showing 0 to 0 of 0 entries";var sInfoFiltered$1="(filtered from _MAX_ total entries)";var sInfoPostFix$1="";var sInfoThousands$1=",";var sLengthMenu$1="Show _MENU_ entries";var sLoadingRecords$1="Loading...";var sProcessing$1="Processing...";var sSearch$1="Search:";var sZeroRecords$1="No matching records found";var oPaginate$1={sFirst:"First",sLast:"Last",sNext:"Next",sPrevious:"Previous"};var oAria$1={sSortAscending:": activate to sort column ascending",sSortDescending:": activate to sort column descending"};var en = {sEmptyTable:sEmptyTable$1,sInfo:sInfo$1,sInfoEmpty:sInfoEmpty$1,sInfoFiltered:sInfoFiltered$1,sInfoPostFix:sInfoPostFix$1,sInfoThousands:sInfoThousands$1,sLengthMenu:sLengthMenu$1,sLoadingRecords:sLoadingRecords$1,sProcessing:sProcessing$1,sSearch:sSearch$1,sZeroRecords:sZeroRecords$1,oPaginate:oPaginate$1,oAria:oAria$1};
var sEmptyTable="មិនមានទិន្នន័យក្នុងតារាងនេះទេ";var sInfo="បង្ហាញជួរទី _START_ ដល់ទី _END_ ក្នុងចំណោម _TOTAL_ ជួរ";var sInfoEmpty="បង្ហាញជួរទី 0 ដល់ទី 0 ក្នុងចំណោម 0 ជួរ";var sInfoFiltered="(បានចម្រាញ់ចេញពីទិន្នន័យសរុប _MAX_ ជួរ)";var sInfoPostFix="";var sInfoThousands=",";var sLengthMenu="បង្ហាញ _MENU_ ជួរ";var sLoadingRecords="កំពុងផ្ទុក...";var sProcessing="កំពុងដំណើរការ...";var sSearch="ស្វែងរក:";var sZeroRecords="មិនមានទិន្នន័យត្រូវតាមលក្ខខណ្ឌស្វែងរកទេ";var oPaginate={sFirst:"ដំបូងគេ",sLast:"ចុងក្រោយ",sNext:"បន្ទាប់",sPrevious:"ក្រោយ"};var oAria={sSortAscending:": ចុចដើម្បីរៀបជួរឈរនេះតាមលំដាប់ឡើង",sSortDescending:": ចុចដើម្បីរៀបជួរឈរនេះតាមលំដាប់ចុះ"};var km = {sEmptyTable:sEmptyTable,sInfo:sInfo,sInfoEmpty:sInfoEmpty,sInfoFiltered:sInfoFiltered,sInfoPostFix:sInfoPostFix,sInfoThousands:sInfoThousands,sLengthMenu:sLengthMenu,sLoadingRecords:sLoadingRecords,sProcessing:sProcessing,sSearch:sSearch,sZeroRecords:sZeroRecords,oPaginate:oPaginate,oAria:oAria};
const useLocales = () => {
return {
en,
km
};
};
var useLocale = useLocales;
//
const {
setDataTableState,
getDataTableState
} = useLocalStorage;
var script = {
name: "DataTable",
components: {
Paginate
},
props: {
axios: {
type: [Object, Function, null],
default: null
},
tableId: {
type: String,
required: true
},
columns: {
type: Array,
required: true
},
locale: {
type: String,
default: "en"
},
lengthOptions: {
type: Array,
default: () => {
return [{
label: 10,
value: 10
}, {
label: 25,
value: 25
}, {
label: 50,
value: 50
}, {
label: 100,
value: 100
}];
}
},
order: {
type: [null, Array],
default: null
},
design: {
type: String,
default: "bootstrap3"
},
savedState: {
type: Boolean,
default: false
},
serverSide: {
type: Boolean,
default: false
},
url: {
type: String,
default: null
},
dataRows: {
type: Array,
default: () => {
return [];
}
}
},
data() {
return {
rows: [],
length: this.lengthOptions[0].value,
start: 0,
pages: 0,
page: 1,
recordsTotal: 0,
recordsFiltered: 0,
search: null,
draw: 0,
locales: useLocale(),
defaultOrder: [null, "asc"],
isLoading: false
};
},
computed: {
sInfo() {
return this.selectedLocale.sInfo.replace("_START_", this.length * this.start + 1).replace("_END_", this.length * (this.start + 1)).replace("_TOTAL_", this.recordsTotal);
},
sLengthMenu() {
return this.selectedLocale.sLengthMenu.split(" _MENU_ ");
},
selectedLocale() {
return this.locales[this.locale];
},
theme() {
return themeData$1(this.design);
}
},
watch: {
length() {
this.fetchData(this.page);
}
},
methods: {
refresh() {
this.fetchData(this.page);
},
onClickOrderColumn() {
let index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
if (index !== null && index >= 0) {
if (index > this.columns.length - 1) {
console.error(`The order column index ${index} is out of range`);
return;
}
if (!this.columns[index].orderable) {
return;
}
this.defaultOrder = [index, this.defaultOrder[1] === "asc" ? "desc" : "asc"];
this.fetchData(this.page);
}
},
onSearch: debounce(function (event) {
this.search = event.target.value;
this.fetchData();
}, 500),
fetchData: function () {
let page = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;
if (this.serverSide) {
this.requestDataApi(page);
} else {
this.requestLocalData(page);
}
},
requestDataApi(page) {
this.page = page;
this.start = page - 1;
this.draw++;
const formData = new FormData();
formData.append("draw", this.draw);
this.columns.forEach((column, index) => {
Object.keys(column).forEach(key => {
if (["data", "name", "orderable", "searchable"].includes(key)) {
formData.append(`columns[${index}][${key}]`, column[key] ?? null);
if (key === "searchable" && column[key]) {
formData.append(`columns[${index}][search][value]`, "");
formData.append(`columns[${index}][search][regex]`, "false");
}
}
});
});
if (this.defaultOrder[0] !== null && this.defaultOrder[0] >= 0) {
formData.append("order[0][column]", this.defaultOrder[0]);
formData.append("order[0][dir]", this.defaultOrder[1]);
}
formData.append("start", this.start);
formData.append("length", this.length);
formData.append("search[value]", this.search ?? "");
formData.append("search[regex]", "false");
this.saveStates();
this.isLoading = true;
this.axios.post(this.url, formData).then(_ref => {
let {
data
} = _ref;
if (data.data) {
this.rows = data.data;
const {
recordsTotal,
recordsFiltered
} = data;
this.recordsTotal = recordsTotal;
this.recordsFiltered = recordsFiltered;
this.pages = Math.ceil(this.recordsFiltered / this.length);
}
}).finally(() => {
this.isLoading = false;
});
},
requestLocalData(page) {
this.page = page;
this.start = page - 1;
this.saveStates();
let recordFiltered = this.dataRows;
const searchColumns = this.columns.map(column => {
if (column.searchable) {
return column;
}
}).filter(column => column !== undefined);
if (searchColumns.length && this.search !== "" && this.search !== null) {
recordFiltered = recordFiltered.map(row => {
for (const column in searchColumns) {
const _column = searchColumns[column].data;
const value = row[_column].toString();
if (value.includes(this.search)) {
return row;
}
}
}).filter(row => row !== undefined);
}
recordFiltered = recordFiltered.sort(function (a, b) {
return a > b ? 1 : -1;
});
if (this.defaultOrder) {
this.rows = recordFiltered.slice(this.start * this.length, this.start * this.length + parseInt(this.length));
}
this.recordsTotal = this.dataRows.length;
this.recordsFiltered = recordFiltered.length;
this.pages = Math.ceil(this.recordsFiltered / this.length);
},
initStates() {
if (this.savedState) {
const {
length,
search,
page,
start,
defaultOrder,
recordsTotal,
recordsFiltered
} = getDataTableState(this.tableId);
this.length = length ?? this.lengthOptions[0].value;
this.search = search ?? null;
this.page = page ?? 1;
this.start = start ?? 0;
this.defaultOrder = defaultOrder ?? this.defaultOrder;
this.recordsTotal = recordsTotal ?? 0;
this.recordsFiltered = recordsFiltered ?? 0;
}
},
saveStates() {
if (this.savedState) {
setDataTableState(this.tableId, {
length: this.length,
search: this.search,
page: this.page,
start: this.start,
defaultOrder: this.defaultOrder,
recordsTotal: this.recordsTotal,
recordsFiltered: this.recordsFiltered
});
}
}
},
mounted() {
if (this.order) {
this.defaultOrder = this.order;
this.onClickOrderColumn(this.defaultOrder[0]);
}
this.initStates();
this.fetchData(this.page);
}
};
/* script */
const __vue_script__ = script;
/* template */
var __vue_render__ = function () {
var _vm = this;
var _h = _vm.$createElement;
var _c = _vm._self._c || _h;
return _c('div', {
class: _vm.theme.row
}, [_c('div', {
class: _vm.theme.col
}, [_c('div', {
staticClass: "table-header-container"
}, [_c('div', {
staticClass: "table-header-length-options"
}, [_vm._v("\n " + _vm._s(_vm.sLengthMenu[0]) + "\n "), _c('div', {
class: _vm.theme.table.formClasses
}, [_c('select', {
directives: [{
name: "model",
rawName: "v-model",
value: _vm.length,
expression: "length"
}],
class: _vm.theme.table.inputLengthOptionClasses,
on: {
"change": function ($event) {
var $$selectedVal = Array.prototype.filter.call($event.target.options, function (o) {
return o.selected;
}).map(function (o) {
var val = "_value" in o ? o._value : o.value;
return val;
});
_vm.length = $event.target.multiple ? $$selectedVal : $$selectedVal[0];
}
}
}, _vm._l(_vm.lengthOptions, function (option, key) {
return _c('option', {
key: key,
domProps: {
"value": option.value
}
}, [_vm._v("\n " + _vm._s(option.label) + "\n ")]);
}), 0)]), _vm._v("\n " + _vm._s(_vm.sLengthMenu[1]) + "\n ")]), _vm._v(" "), _c('div', {
staticClass: "table-header-search"
}, [_vm._v("\n " + _vm._s(_vm.selectedLocale.sSearch) + "\n "), _c('div', {
class: _vm.theme.table.formClasses
}, [_c('input', {
directives: [{
name: "model",
rawName: "v-model",
value: _vm.search,
expression: "search"
}],
class: _vm.theme.table.inputSearchClasses,
attrs: {
"type": "text"
},
domProps: {
"value": _vm.search
},
on: {
"keydown": _vm.onSearch,
"input": function ($event) {
if ($event.target.composing) {
return;
}
_vm.search = $event.target.value;
}
}
})])])])]), _vm._v(" "), _c('div', {
class: _vm.theme.table.colClasses
}, [_c('div', {
class: _vm.theme.table.tableContainer
}, [_vm.isLoading ? _c('div', {
staticClass: "loading-container"
}, [_c('div', {
staticClass: "loading-content"
}, [_c('p', {
staticClass: "m-0"
}, [_vm._v("\n " + _vm._s(_vm.selectedLocale.sLoadingRecords) + "\n ")])])]) : _vm._e(), _vm._v(" "), _c('table', {
class: _vm.theme.table.tableClasses,
attrs: {
"id": _vm.tableId
}
}, [_c('thead', [_c('tr', _vm._l(_vm.columns, function (column, headerIndex) {
return _c('th', {
key: headerIndex,
style: "" + (column.width ? "width: " + column.width + "!important;" : '')
}, [_c('div', {
staticClass: "table-header-th",
class: {
'cursor-pointer': column.orderable
},
on: {
"click": function ($event) {
return _vm.onClickOrderColumn(headerIndex);
}
}
}, [_c('span', [_vm._v(_vm._s(column.title))]), _vm._v(" "), column.orderable ? [_vm.defaultOrder[0] !== null && _vm.defaultOrder[0] === headerIndex ? [_vm.defaultOrder[1] === 'asc' ? _c('i', {
staticClass: "fa-solid fa-arrow-down-short-wide"
}) : _vm._e(), _vm._v(" "), _vm.defaultOrder[1] === 'desc' ? _c('i', {
staticClass: "fa-solid fa-arrow-up-short-wide"
}) : _vm._e()] : [_c('i', {
staticClass: "fa fa-sort",
staticStyle: {
"color": "#dddddd"
}
})]] : _vm._e()], 2)]);
}), 0)]), _vm._v(" "), _c('tbody', [_vm.rows.length ? _vm._l(_vm.rows, function (row, key) {
return _c('tr', {
key: key
}, _vm._l(_vm.columns, function (column, _key) {
return _c('td', {
key: _key
}, [column.slot ? [_vm._t(column.slot, null, {
"column": column,
"row": row
})] : [column.data.split('.').length > 1 ? [_vm._v("\n " + _vm._s(column.data.split('.').reduce(function (o, i) {
return o[i];
}, row)) + "\n ")] : [_vm._v("\n " + _vm._s(row[column.data]) + "\n ")]]], 2);
}), 0);
}) : [_c('tr', [_c('td', {
attrs: {
"colspan": _vm.columns.length
}
}, [_c('p', {
staticClass: "text-muted text-center"
}, [_vm.search ? [_vm._v("\n " + _vm._s(_vm.selectedLocale.sZeroRecords) + "\n ")] : [_vm._v("\n " + _vm._s(_vm.selectedLocale.sEmptyTable) + "\n ")]], 2)])])]], 2)])])]), _vm._v(" "), _c('div', {
class: _vm.theme.paginate.colClasses
}, [_c('div', {
staticClass: "table-paginate-container"
}, [_c('p', [_vm._v(_vm._s(_vm.sInfo))]), _vm._v(" "), _c('paginate', {
attrs: {
"click-handler": _vm.fetchData,
"container-class": _vm.theme.paginate.containerClass,
"force-page": _vm.page,
"next-link-class": _vm.theme.paginate.pageLinkClass,
"next-text": _vm.selectedLocale.oPaginate.sNext,
"page-class": _vm.theme.paginate.pageClass,
"page-count": _vm.pages,
"page-link-class": _vm.theme.paginate.pageLinkClass,
"prev-link-class": _vm.theme.paginate.pageLinkClass,
"prev-text": _vm.selectedLocale.oPaginate.sPrevious
}
})], 1)])]);
};
var __vue_staticRenderFns__ = [];
/* style */
const __vue_inject_styles__ = function (inject) {
if (!inject) return;
inject("data-v-007b53a3_0", {
source: ".table-header-th{display:flex;justify-content:space-between;align-items:center;gap:10px;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.cursor-pointer{cursor:pointer}.pagination{margin:0}.table-header-container{display:flex;align-items:center;justify-content:space-between}.table-header-container .table-header-length-options{display:flex;align-items:center;gap:10px;margin:20px 0}.table-header-container .table-header-search{display:flex;align-items:center;gap:10px;width:15vw;justify-content:flex-end;margin:20px 0}.table-paginate-container{display:flex;justify-content:space-between;align-items:center}.loading-container{width:100%;height:100%;position:absolute;background:rgba(136,136,136,.5);display:flex;align-items:center;justify-content:center;border-radius:4px}.position-relative{position:relative}.loading-container .loading-content{background-color:#888;color:#fff;padding:10px;border-radius:8px}.m-0{margin:0}",
map: undefined,
media: undefined
});
};
/* scoped */
const __vue_scope_id__ = undefined;
/* module identifier */
const __vue_module_identifier__ = undefined;
/* functional template */
const __vue_is_functional_template__ = false;
/* style inject SSR */
/* style inject shadow dom */
const __vue_component__ = /*#__PURE__*/normalizeComponent({
render: __vue_render__,
staticRenderFns: __vue_staticRenderFns__
}, __vue_inject_styles__, __vue_script__, __vue_scope_id__, __vue_is_functional_template__, __vue_module_identifier__, false, createInjector, undefined, undefined);
var component = __vue_component__;
// Import vue component
// IIFE injects install function into component, allowing component
// to be registered via Vue.use() as well as Vue.component(),
var entry_esm = /*#__PURE__*/(() => {
// Get component instance
const installable = component; // Attach install function executed by Vue.use()
installable.install = Vue => {
Vue.component('DataTable', installable);
};
return installable;
})(); // It's possible to expose named exports when writing components that can
// also be used as directives, etc. - eg. import { RollupDemoDirective } from 'rollup-demo';
// export const RollupDemoDirective = directive;
export { entry_esm as default };