vue-slim-tables 0.1.2 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -9,7 +9,7 @@ npm install vue-slim-tables
9
9
 
10
10
  ```html
11
11
  <template>
12
- <VueSlimTables :columns="columns" remote="/users" />
12
+ <VueSlimTables :columns="columns" source="/users" />
13
13
  </template>
14
14
 
15
15
  <script>
@@ -42,7 +42,8 @@ npm install vue-slim-tables
42
42
  ### Slots
43
43
  | Slot | Props | Description |
44
44
  | - | - | - |
45
- | #head:${column.key} | { column } | Rewrite column thead with custom html |
45
+ | #thead | { columns, orders } | Rewrite whole thead row |
46
+ | #thead:${column.key} | { column } | Rewrite column thead with custom html |
46
47
  | #row | { row, index, columns } | Rewrite whole row |
47
48
  | #row:empty | - | Rewrite empty table row markup |
48
49
  | #row:loading | - | Rewrite loading table rows markup |
package/dist/style.css ADDED
@@ -0,0 +1 @@
1
+ @charset "UTF-8";@keyframes moving-gradient{0%{background-position:-250px 0}to{background-position:250px 0}}.vst-th{line-height:20px}.vst-orderable div{display:flex;justify-content:space-between;align-items:center}.vst-orderable div:hover{cursor:pointer}.vst-orderable div:hover .vst-orderable-toggle{color:#555!important}.vst-orderable div .vst-orderable-toggle{font-size:20px;color:#ccc!important}.vst-orderable div .vst-orderable-toggle:after{content:" \2194";display:inline-block;transform:rotate(-90deg)}.vst-orderable div .vst-orderable-toggle.desc:after{content:" \2191";transform:rotate(0)}.vst-orderable div .vst-orderable-toggle.asc:after{content:" \2193";transform:rotate(0)}.vst-loading-row div{height:1.5rem;background:linear-gradient(to right,#eee 20%,#ddd 50%,#eee 80%);background-size:500px 1.5rem;animation-name:moving-gradient;animation-duration:1s;animation-iteration-count:infinite;animation-timing-function:linear;animation-fill-mode:forwards}.vst tr td.vst-loading-row-1 div{animation-delay:-1s}.vst tr td.vst-loading-row-2 div{animation-delay:-.9s}.vst tr td.vst-loading-row-3 div{animation-delay:-.8s}.vst tr td.vst-loading-row-4 div{animation-delay:-.7s}.vst tr td.vst-loading-row-5 div{animation-delay:-.6s}.vst tr td.vst-loading-row-6 div{animation-delay:-.5s}.vst tr td.vst-loading-row-7 div{animation-delay:-.4s}.vst tr td.vst-loading-row-8 div{animation-delay:-.3s}.vst tr td.vst-loading-row-9 div{animation-delay:-.2s}.vst tr td.vst-loading-row-10 div{animation-delay:-.1s}.vst-pagination{display:flex;padding-left:0;list-style:none;border-radius:.25rem}.vst-pagination a{position:relative;display:block;padding:8px 12px;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.vst-pagination a:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.vst-page-item.disabled .vst-page-link{pointer-events:none;color:#6c757d;cursor:auto;background-color:#fff}.vst-page-item .vst-page-link{cursor:pointer}
@@ -0,0 +1,14 @@
1
+ declare const _sfc_main: import("vue").DefineComponent<{
2
+ columnsLength: {
3
+ type: NumberConstructor;
4
+ required: true;
5
+ };
6
+ }, {
7
+ randNum: number;
8
+ }, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, Record<string, any>, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
9
+ columnsLength: {
10
+ type: NumberConstructor;
11
+ required: true;
12
+ };
13
+ }>>, {}>;
14
+ export default _sfc_main;
@@ -0,0 +1,81 @@
1
+ import { ShallowRef } from 'vue';
2
+ interface TableColumn {
3
+ key: string;
4
+ title: string;
5
+ orderable?: boolean;
6
+ }
7
+ interface TableOrders {
8
+ [key: string]: 'asc' | 'desc';
9
+ }
10
+ interface TableFetchParams {
11
+ per_page: number;
12
+ page: number;
13
+ orders?: TableOrders;
14
+ }
15
+ interface TableRow {
16
+ [key: string]: any;
17
+ }
18
+ declare const _sfc_main: import("vue").DefineComponent<{
19
+ columns: {
20
+ type: ArrayConstructor;
21
+ required: true;
22
+ };
23
+ source: {
24
+ type: (StringConstructor | FunctionConstructor)[];
25
+ required: true;
26
+ };
27
+ perPage: {
28
+ type: NumberConstructor;
29
+ required: false;
30
+ default: number;
31
+ };
32
+ }, {
33
+ props: {
34
+ columns: Array<TableColumn>;
35
+ source: string | ((_: TableFetchParams) => Promise<TableRow[]> | TableRow[]);
36
+ perPage: number;
37
+ };
38
+ orders: ShallowRef<TableOrders>;
39
+ loadItems: (params: TableFetchParams) => Promise<TableRow[]>;
40
+ onOrderClick: (key: string) => void;
41
+ page: import("vue").Ref<number>;
42
+ isSyncing: import("vue").ComputedRef<boolean>;
43
+ isSynced: import("vue").ComputedRef<boolean>;
44
+ prevPage: () => void;
45
+ nextPage: () => void;
46
+ reload: () => void;
47
+ refetch: () => void;
48
+ rows: {
49
+ value: TableRow[];
50
+ };
51
+ LoadingRow: import("vue").DefineComponent<{
52
+ columnsLength: {
53
+ type: NumberConstructor;
54
+ required: true;
55
+ };
56
+ }, {
57
+ randNum: number;
58
+ }, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, Record<string, any>, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
59
+ columnsLength: {
60
+ type: NumberConstructor;
61
+ required: true;
62
+ };
63
+ }>>, {}>;
64
+ }, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, Record<string, any>, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
65
+ columns: {
66
+ type: ArrayConstructor;
67
+ required: true;
68
+ };
69
+ source: {
70
+ type: (StringConstructor | FunctionConstructor)[];
71
+ required: true;
72
+ };
73
+ perPage: {
74
+ type: NumberConstructor;
75
+ required: false;
76
+ default: number;
77
+ };
78
+ }>>, {
79
+ perPage: number;
80
+ }>;
81
+ export default _sfc_main;
@@ -0,0 +1,2 @@
1
+ declare const _default: (obj: any) => string;
2
+ export default _default;
@@ -0,0 +1,2 @@
1
+ import VueSlimTable from './components/table.vue';
2
+ export default VueSlimTable;
@@ -0,0 +1,22 @@
1
+ declare type CombinedFilters<Filters> = Filters & {
2
+ page: number;
3
+ };
4
+ interface UseFiltetableArgs<Filters, Item> {
5
+ initialFilters: Filters;
6
+ loadItems: (_filters: CombinedFilters<Filters>) => Promise<Item[]>;
7
+ }
8
+ declare const useFilterable: <Filters, Item>({ initialFilters, loadItems }: UseFiltetableArgs<Filters, Item>) => {
9
+ page: import("vue").Ref<number>;
10
+ items: {
11
+ value: Item[];
12
+ };
13
+ syncState: import("vue").Ref<string>;
14
+ nextPage: () => void;
15
+ prevPage: () => void;
16
+ isSyncing: import("vue").ComputedRef<boolean>;
17
+ isSynced: import("vue").ComputedRef<boolean>;
18
+ isFailed: import("vue").ComputedRef<boolean>;
19
+ reload: () => void;
20
+ refetch: () => void;
21
+ };
22
+ export default useFilterable;
package/dist/vst.es.js ADDED
@@ -0,0 +1,271 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
3
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
4
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
5
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
6
+ var __spreadValues = (a, b) => {
7
+ for (var prop in b || (b = {}))
8
+ if (__hasOwnProp.call(b, prop))
9
+ __defNormalProp(a, prop, b[prop]);
10
+ if (__getOwnPropSymbols)
11
+ for (var prop of __getOwnPropSymbols(b)) {
12
+ if (__propIsEnum.call(b, prop))
13
+ __defNormalProp(a, prop, b[prop]);
14
+ }
15
+ return a;
16
+ };
17
+ import { defineComponent, openBlock, createElementBlock, createElementVNode, normalizeClass, computed, ref, reactive, watch, shallowRef, renderSlot, unref, Fragment, renderList, mergeProps, toHandlers, createTextVNode, toDisplayString, createCommentVNode, createBlock, withModifiers } from "vue";
18
+ var index = "";
19
+ const _hoisted_1$1 = ["colspan"];
20
+ const _hoisted_2$1 = /* @__PURE__ */ createElementVNode("div", null, null, -1);
21
+ const _hoisted_3$1 = [
22
+ _hoisted_2$1
23
+ ];
24
+ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
25
+ props: {
26
+ columnsLength: { type: Number, required: true }
27
+ },
28
+ setup(__props) {
29
+ const randNum = Math.floor(Math.random() * 10) + 1;
30
+ return (_ctx, _cache) => {
31
+ return openBlock(), createElementBlock("tr", null, [
32
+ createElementVNode("td", {
33
+ colspan: __props.columnsLength,
34
+ class: normalizeClass(["vst-loading-row", `vst-loading-row-${randNum}`])
35
+ }, _hoisted_3$1, 10, _hoisted_1$1)
36
+ ]);
37
+ };
38
+ }
39
+ });
40
+ const SYNC_STATES = {
41
+ INITIAL: "initial",
42
+ SYNCING: "syncing",
43
+ SYNCED: "synced",
44
+ FAILED: "failed"
45
+ };
46
+ const useFilterable = ({ initialFilters, loadItems }) => {
47
+ const page = ref(1);
48
+ const items = reactive({ value: [] });
49
+ const syncState = ref(SYNC_STATES.INITIAL);
50
+ const filters = reactive({ value: initialFilters });
51
+ const combinedFilters = computed(() => __spreadValues({
52
+ page: page.value
53
+ }, filters.value));
54
+ const load = () => {
55
+ syncState.value = SYNC_STATES.SYNCING;
56
+ return loadItems(combinedFilters.value).then((res) => {
57
+ items.value = res;
58
+ syncState.value = SYNC_STATES.SYNCED;
59
+ }).catch(() => {
60
+ items.value = [];
61
+ syncState.value = SYNC_STATES.FAILED;
62
+ });
63
+ };
64
+ load();
65
+ watch(combinedFilters, load);
66
+ return {
67
+ page,
68
+ items,
69
+ syncState,
70
+ nextPage: () => {
71
+ page.value += 1;
72
+ },
73
+ prevPage: () => {
74
+ page.value -= 1;
75
+ },
76
+ isSyncing: computed(() => syncState.value === SYNC_STATES.SYNCING),
77
+ isSynced: computed(() => syncState.value === SYNC_STATES.SYNCED),
78
+ isFailed: computed(() => syncState.value === SYNC_STATES.FAILED),
79
+ reload: () => {
80
+ load();
81
+ },
82
+ refetch: () => {
83
+ if (page.value === 1) {
84
+ load();
85
+ } else {
86
+ page.value = 1;
87
+ }
88
+ }
89
+ };
90
+ };
91
+ const stringify = (obj, parentPrefix) => (outputArray, [key, val]) => {
92
+ if (val === null || val === void 0) {
93
+ return outputArray;
94
+ }
95
+ const encodedKey = encodeURIComponent(key);
96
+ const prefix = parentPrefix ? `${parentPrefix}[${encodedKey}]` : encodedKey;
97
+ if (["number", "string"].includes(typeof val)) {
98
+ outputArray.push(`${prefix}=${encodeURIComponent(val)}`);
99
+ return outputArray;
100
+ }
101
+ outputArray.push(Object.entries(val).reduce(stringify(val, prefix), []).join("&"));
102
+ return outputArray;
103
+ };
104
+ var toQueryString = (obj) => Object.entries(obj).reduce(stringify(), []).join("&");
105
+ const _hoisted_1 = { class: "vst" };
106
+ const _hoisted_2 = { key: 0 };
107
+ const _hoisted_3 = { key: 0 };
108
+ const _hoisted_4 = ["colspan"];
109
+ const _hoisted_5 = ["colspan"];
110
+ const _hoisted_6 = {
111
+ key: 0,
112
+ class: "vst-pagination mt-3"
113
+ };
114
+ const _sfc_main = /* @__PURE__ */ defineComponent({
115
+ props: {
116
+ columns: null,
117
+ source: null,
118
+ perPage: { default: 25 }
119
+ },
120
+ setup(__props, { expose }) {
121
+ const props = __props;
122
+ const orders = shallowRef({});
123
+ const loadItems = async (params) => {
124
+ let data;
125
+ if (typeof props.source === "string") {
126
+ const response = await fetch(`${props.source}?${toQueryString(params)}`);
127
+ data = await response.json();
128
+ } else {
129
+ data = await props.source(params);
130
+ }
131
+ return data;
132
+ };
133
+ const onOrderClick = (key) => {
134
+ if (orders.value[key] === "asc") {
135
+ orders.value = { [key]: "desc" };
136
+ } else if (orders.value[key] === "desc") {
137
+ orders.value = {};
138
+ } else {
139
+ orders.value = { [key]: "asc" };
140
+ }
141
+ };
142
+ const {
143
+ page,
144
+ isSyncing,
145
+ isSynced,
146
+ prevPage,
147
+ nextPage,
148
+ reload,
149
+ refetch,
150
+ items: rows
151
+ } = useFilterable({
152
+ initialFilters: { per_page: props.perPage, orders: orders.value },
153
+ loadItems
154
+ });
155
+ expose({
156
+ refetch,
157
+ reload,
158
+ rows
159
+ });
160
+ return (_ctx, _cache) => {
161
+ return openBlock(), createElementBlock("table", _hoisted_1, [
162
+ __props.columns.length ? (openBlock(), createElementBlock("thead", _hoisted_2, [
163
+ renderSlot(_ctx.$slots, "thead", {
164
+ columns: __props.columns,
165
+ orders: unref(orders)
166
+ }, () => [
167
+ createElementVNode("tr", null, [
168
+ (openBlock(true), createElementBlock(Fragment, null, renderList(__props.columns, (column) => {
169
+ return openBlock(), createElementBlock("th", mergeProps({
170
+ key: column.key,
171
+ class: ["vst-th", { "vst-orderable": column.orderable }]
172
+ }, toHandlers(column.orderable ? { click: () => onOrderClick(column.key) } : {})), [
173
+ column.orderable ? (openBlock(), createElementBlock("div", _hoisted_3, [
174
+ renderSlot(_ctx.$slots, `head:${column.key}`, { column }, () => [
175
+ createTextVNode(toDisplayString(column.title), 1)
176
+ ]),
177
+ createElementVNode("a", {
178
+ href: "#",
179
+ class: normalizeClass(["vst-orderable-toggle", unref(orders)[column.key]])
180
+ }, null, 2)
181
+ ])) : renderSlot(_ctx.$slots, `thead:${column.key}`, {
182
+ key: 1,
183
+ column
184
+ }, () => [
185
+ createTextVNode(toDisplayString(column.title), 1)
186
+ ])
187
+ ], 16);
188
+ }), 128))
189
+ ])
190
+ ])
191
+ ])) : createCommentVNode("", true),
192
+ createElementVNode("tbody", null, [
193
+ unref(isSyncing) ? renderSlot(_ctx.$slots, "row:loading", { key: 0 }, () => [
194
+ (openBlock(true), createElementBlock(Fragment, null, renderList(__props.perPage, (i) => {
195
+ return openBlock(), createBlock(_sfc_main$1, {
196
+ key: `loadingRow${i}`,
197
+ "columns-length": __props.columns.length
198
+ }, null, 8, ["columns-length"]);
199
+ }), 128))
200
+ ]) : unref(isSynced) && unref(rows).value.length === 0 ? renderSlot(_ctx.$slots, "row:empty", { key: 1 }, () => [
201
+ createElementVNode("tr", null, [
202
+ createElementVNode("td", {
203
+ colspan: __props.columns.length
204
+ }, " No records found ", 8, _hoisted_4)
205
+ ])
206
+ ]) : unref(isSynced) && unref(rows).value.length ? (openBlock(true), createElementBlock(Fragment, { key: 2 }, renderList(unref(rows).value, (row, i) => {
207
+ return renderSlot(_ctx.$slots, "row", {
208
+ row,
209
+ index: i,
210
+ columns: __props.columns
211
+ }, () => [
212
+ (openBlock(), createElementBlock("tr", {
213
+ key: row["id"] || i
214
+ }, [
215
+ (openBlock(true), createElementBlock(Fragment, null, renderList(__props.columns, (column) => {
216
+ return openBlock(), createElementBlock("td", {
217
+ key: column.key
218
+ }, [
219
+ renderSlot(_ctx.$slots, `cell:${column.key}`, {
220
+ row,
221
+ value: row[column.key],
222
+ column,
223
+ index: i
224
+ }, () => [
225
+ createTextVNode(toDisplayString(row[column.key]), 1)
226
+ ])
227
+ ]);
228
+ }), 128))
229
+ ]))
230
+ ]);
231
+ }), 256)) : createCommentVNode("", true)
232
+ ]),
233
+ createElementVNode("tfoot", null, [
234
+ createElementVNode("tr", null, [
235
+ createElementVNode("td", {
236
+ colspan: __props.columns.length
237
+ }, [
238
+ renderSlot(_ctx.$slots, "pagination", {
239
+ page: unref(page),
240
+ rows: unref(rows).value
241
+ }, () => [
242
+ unref(page) > 1 || unref(rows).value.length === __props.perPage || unref(isSyncing) ? (openBlock(), createElementBlock("ul", _hoisted_6, [
243
+ createElementVNode("li", {
244
+ class: normalizeClass(["vst-page-item", { disabled: unref(page) === 1 || unref(isSyncing) }])
245
+ }, [
246
+ createElementVNode("a", {
247
+ class: "vst-page-link",
248
+ onClick: _cache[0] || (_cache[0] = withModifiers((...args) => unref(prevPage) && unref(prevPage)(...args), ["prevent"]))
249
+ }, "\u2190")
250
+ ], 2),
251
+ createElementVNode("li", {
252
+ class: normalizeClass(["vst-page-item", {
253
+ disabled: unref(rows).value.length < __props.perPage || unref(isSyncing)
254
+ }])
255
+ }, [
256
+ createElementVNode("a", {
257
+ class: "vst-page-link",
258
+ onClick: _cache[1] || (_cache[1] = withModifiers((...args) => unref(nextPage) && unref(nextPage)(...args), ["prevent"]))
259
+ }, "\u2192")
260
+ ], 2)
261
+ ])) : createCommentVNode("", true)
262
+ ])
263
+ ], 8, _hoisted_5)
264
+ ])
265
+ ])
266
+ ]);
267
+ };
268
+ }
269
+ });
270
+ export { _sfc_main as default };
271
+ //# sourceMappingURL=vst.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vst.es.js","sources":["../src/ts/components/loading_row.vue","../src/ts/use/filterable.ts","../src/ts/helpers/to_query_string.ts","../src/ts/components/table.vue"],"sourcesContent":["<template>\n <tr>\n <td\n :colspan=\"columnsLength\"\n :class=\"['vst-loading-row', `vst-loading-row-${randNum}`]\">\n <div />\n </td>\n </tr>\n</template>\n\n<script lang=\"ts\" setup>\ndefineProps({\n columnsLength: { type: Number, required: true },\n})\n\nconst randNum = Math.floor(Math.random() * 10) + 1\n</script>\n","import {\n ref, computed, reactive, watch,\n} from 'vue'\n\ntype CombinedFilters<Filters> = Filters & {\n page: number\n}\n\ninterface UseFiltetableArgs<Filters, Item> {\n initialFilters: Filters,\n loadItems: (_filters: CombinedFilters<Filters>) => Promise<Item[]>\n}\n\nconst SYNC_STATES = {\n INITIAL: 'initial',\n SYNCING: 'syncing',\n SYNCED: 'synced',\n FAILED: 'failed',\n}\n\nconst useFilterable = <Filters, Item>({ initialFilters, loadItems }: UseFiltetableArgs<Filters, Item>) => {\n const page = ref(1)\n const items = reactive({ value: [] as Item[] }) as { value: Item[] }\n const syncState = ref(SYNC_STATES.INITIAL)\n const filters = reactive({ value: initialFilters })\n\n const combinedFilters = computed(() => ({\n page: page.value,\n ...filters.value as Filters,\n }))\n\n const load = () => {\n syncState.value = SYNC_STATES.SYNCING\n\n return loadItems(combinedFilters.value)\n .then((res: Item[]) => {\n items.value = res\n syncState.value = SYNC_STATES.SYNCED\n })\n .catch(() => {\n items.value = []\n syncState.value = SYNC_STATES.FAILED\n })\n }\n load()\n\n watch(combinedFilters, load)\n\n return {\n page,\n items,\n syncState,\n nextPage: () => {\n page.value += 1\n },\n prevPage: () => {\n page.value -= 1\n },\n isSyncing: computed(() => syncState.value === SYNC_STATES.SYNCING),\n isSynced: computed(() => syncState.value === SYNC_STATES.SYNCED),\n isFailed: computed(() => syncState.value === SYNC_STATES.FAILED),\n reload: () => {\n load()\n },\n refetch: () => {\n if (page.value === 1) {\n load()\n } else {\n page.value = 1\n }\n },\n }\n}\n\nexport default useFilterable\n","const stringify = (obj, parentPrefix?: string) => (outputArray, [key, val]) => {\n if (val === null || val === undefined) {\n return outputArray\n }\n\n const encodedKey = encodeURIComponent(key)\n const prefix = parentPrefix ? `${parentPrefix}[${encodedKey}]` : encodedKey\n\n if (['number', 'string'].includes(typeof val)) {\n outputArray.push(`${prefix}=${encodeURIComponent(val)}`)\n return outputArray\n }\n\n outputArray.push(Object.entries(val).reduce(stringify(val, prefix), []).join('&'))\n return outputArray\n}\n\nexport default (obj): string => Object.entries(obj).reduce(stringify(obj), []).join('&')\n","<template>\n <table class=\"vst\">\n <thead v-if=\"columns.length\">\n <slot name=\"thead\" :columns=\"columns\" :orders=\"orders\">\n <tr>\n <th\n v-for=\"column in columns\"\n :key=\"column.key\"\n :class=\"['vst-th', { 'vst-orderable': column.orderable }]\"\n v-on=\"column.orderable ? { click: () => onOrderClick(column.key) } : {}\">\n <div v-if=\"column.orderable\">\n <slot\n :name=\"`head:${column.key}`\"\n :column=\"column\">\n {{ column.title }}\n </slot>\n\n <a href=\"#\" :class=\"['vst-orderable-toggle', orders[column.key]]\" />\n </div>\n\n <slot\n v-else\n :name=\"`thead:${column.key}`\"\n :column=\"column\">\n {{ column.title }}\n </slot>\n </th>\n </tr>\n </slot>\n </thead>\n <tbody>\n <slot v-if=\"isSyncing\" name=\"row:loading\">\n <LoadingRow\n v-for=\"i in perPage\"\n :key=\"`loadingRow${i}`\"\n :columns-length=\"columns.length\" />\n </slot>\n\n <slot v-else-if=\"isSynced && rows.value.length === 0\" name=\"row:empty\">\n <tr>\n <td :colspan=\"columns.length\">\n No records found\n </td>\n </tr>\n </slot>\n\n <template v-else-if=\"isSynced && rows.value.length\">\n <slot\n v-for=\"(row, i) in rows.value\"\n name=\"row\"\n :row=\"row\"\n :index=\"i\"\n :columns=\"columns\">\n <tr :key=\"row['id'] || i\">\n <td\n v-for=\"column in columns\"\n :key=\"column.key\">\n <slot\n :name=\"`cell:${column.key}`\"\n :row=\"row\"\n :value=\"row[column.key]\"\n :column=\"column\"\n :index=\"i\">\n {{ row[column.key] }}\n </slot>\n </td>\n </tr>\n </slot>\n </template>\n </tbody>\n <tfoot>\n <tr>\n <td :colspan=\"columns.length\">\n <slot name=\"pagination\" :page=\"page\" :rows=\"rows.value\">\n <ul\n v-if=\"page > 1 || rows.value.length === perPage || isSyncing\"\n class=\"vst-pagination mt-3\">\n <li :class=\"['vst-page-item', { disabled: page === 1 || isSyncing }]\">\n <a class=\"vst-page-link\" @click.prevent=\"prevPage\">←</a>\n </li>\n\n <li\n :class=\"['vst-page-item', {\n disabled: rows.value.length < perPage || isSyncing\n }]\">\n <a class=\"vst-page-link\" @click.prevent=\"nextPage\">→</a>\n </li>\n </ul>\n </slot>\n </td>\n </tr>\n </tfoot>\n </table>\n</template>\n\n<script setup lang=\"ts\">\nimport { shallowRef, ShallowRef } from 'vue'\nimport LoadingRow from './loading_row.vue'\n\nimport useFilterable from '../use/filterable'\nimport toQueryString from '../helpers/to_query_string'\n\ninterface TableColumn {\n key: string,\n title: string,\n orderable?: boolean\n}\n\ninterface TableOrders {\n [key: string]: 'asc' | 'desc'\n}\n\ninterface TableFetchParams {\n per_page: number,\n page: number,\n orders?: TableOrders\n}\n\ninterface TableRow {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any\n}\n\ninterface TableFilters {\n per_page: number,\n orders: TableOrders\n}\n\ninterface TableProps {\n columns: Array<TableColumn>\n source: string | ((_: TableFetchParams) => Promise<TableRow[]> | TableRow[])\n perPage?: number\n}\n\nconst props = withDefaults(defineProps<TableProps>(), {\n perPage: 25,\n})\n\nconst orders: ShallowRef<TableOrders> = shallowRef({})\n\nconst loadItems = async (params: TableFetchParams) => {\n let data: TableRow[]\n if (typeof props.source === 'string') {\n const response = await fetch(`${props.source}?${toQueryString(params)}`)\n data = await response.json()\n } else {\n data = await props.source(params) as TableRow[]\n }\n\n return data\n}\n\nconst onOrderClick = (key: string) => {\n if (orders.value[key] === 'asc') {\n orders.value = { [key]: 'desc' }\n } else if (orders.value[key] === 'desc') {\n orders.value = {}\n } else {\n orders.value = { [key]: 'asc' }\n }\n}\n\nconst {\n page, isSyncing, isSynced, prevPage, nextPage, reload, refetch, items: rows,\n} = useFilterable<TableFilters, TableRow>({\n initialFilters: { per_page: props.perPage, orders: orders.value },\n loadItems,\n})\n\ndefineExpose({\n refetch,\n reload,\n rows,\n})\n</script>\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;UAeM,UAAU,KAAK,MAAM,KAAK,WAAW,EAAE,IAAI;;;;;;;;;;;ACFjD,MAAM,cAAc;AAAA,EAClB,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AACV;AAEA,MAAM,gBAAgB,CAAgB,EAAE,gBAAgB,gBAAkD;QAClG,OAAO,IAAI,CAAC;QACZ,QAAQ,SAAS,EAAE,OAAO,IAAc;QACxC,YAAY,IAAI,YAAY,OAAO;QACnC,UAAU,SAAS,EAAE,OAAO,gBAAgB;QAE5C,kBAAkB,SAAS;IAC/B,MAAM,KAAK;AAAA,KACR,QAAQ,MACX;QAEI,OAAO,MAAM;cACP,QAAQ,YAAY;WAEvB,UAAU,gBAAgB,KAAK,EACnC,KAAK,CAAC,QAAgB;YACf,QAAQ;gBACJ,QAAQ,YAAY;AAAA,KAC/B,EACA,MAAM,MAAM;YACL,QAAQ;gBACJ,QAAQ,YAAY;AAAA,KAC/B;AAAA;;QAIC,iBAAiB,IAAI;SAEpB;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU,MAAM;WACT,SAAS;AAAA;IAEhB,UAAU,MAAM;WACT,SAAS;AAAA;IAEhB,WAAW,SAAS,MAAM,UAAU,UAAU,YAAY,OAAO;AAAA,IACjE,UAAU,SAAS,MAAM,UAAU,UAAU,YAAY,MAAM;AAAA,IAC/D,UAAU,SAAS,MAAM,UAAU,UAAU,YAAY,MAAM;AAAA,IAC/D,QAAQ,MAAM;;;IAGd,SAAS,MAAM;UACT,KAAK,UAAU,GAAG;;aAEf;aACA,QAAQ;AAAA;;;AAIrB;ACxEA,MAAM,YAAY,CAAC,KAAK,iBAA0B,CAAC,aAAa,CAAC,KAAK,SAAS;MACzE,QAAQ,QAAQ,QAAQ,QAAW;WAC9B;AAAA;QAGH,aAAa,mBAAmB,GAAG;QACnC,SAAS,eAAe,GAAG,gBAAgB,gBAAgB;MAE7D,CAAC,UAAU,QAAQ,EAAE,SAAS,OAAO,GAAG,GAAG;gBACjC,KAAK,GAAG,UAAU,mBAAmB,GAAG,GAAG;WAChD;AAAA;cAGG,KAAK,OAAO,QAAQ,GAAG,EAAE,OAAO,UAAU,KAAK,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG,CAAC;SAC1E;AACT;AAEA,oBAAe,CAAC,QAAgB,OAAO,QAAQ,GAAG,EAAE,OAAO,UAAa,GAAG,EAAE,EAAE,KAAK,GAAG;;;;;;;;;;;;;;;;;;UCyHjF,SAAkC,WAAW,EAAE;UAE/C,YAAY,OAAO,WAA6B;UAChD;UACA,OAAO,MAAM,WAAW,UAAU;cAC9B,WAAW,MAAM,MAAM,GAAG,MAAM,UAAU,cAAc,MAAM,GAAG;eAChE,MAAM,SAAS;aACjB;eACE,MAAM,MAAM,OAAO,MAAM;AAAA;aAG3B;AAAA;UAGH,eAAe,CAAC,QAAgB;UAChC,OAAO,MAAM,SAAS,OAAO;eACxB,QAAQ,GAAG,MAAM;iBACf,OAAO,MAAM,SAAS,QAAQ;eAChC,QAAQ;aACV;eACE,QAAQ,GAAG,MAAM;;;UAItB;AAAA,MACJ;AAAA,MAAM;AAAA,MAAW;AAAA,MAAU;AAAA,MAAU;AAAA,MAAU;AAAA,MAAQ;AAAA,MAAS,OAAO;AAAA,QACrE,cAAsC;AAAA,MACxC,gBAAgB,EAAE,UAAU,MAAM,SAAS,QAAQ,OAAO;MAC1D;AAAA,KACD;WAEY;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,KACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,2 @@
1
+ (function(e,s){typeof exports=="object"&&typeof module!="undefined"?module.exports=s(require("vue")):typeof define=="function"&&define.amd?define(["vue"],s):(e=typeof globalThis!="undefined"?globalThis:e||self,e.VueSlimTable=s(e.Vue))})(this,function(e){"use strict";var z=Object.defineProperty;var $=Object.getOwnPropertySymbols;var M=Object.prototype.hasOwnProperty,R=Object.prototype.propertyIsEnumerable;var V=(e,s,c)=>s in e?z(e,s,{enumerable:!0,configurable:!0,writable:!0,value:c}):e[s]=c,C=(e,s)=>{for(var c in s||(s={}))M.call(s,c)&&V(e,c,s[c]);if($)for(var c of $(s))R.call(s,c)&&V(e,c,s[c]);return e};var s="";const c=["colspan"],b=[e.createElementVNode("div",null,null,-1)],u=e.defineComponent({props:{columnsLength:{type:Number,required:!0}},setup(n){const m=Math.floor(Math.random()*10)+1;return(l,a)=>(e.openBlock(),e.createElementBlock("tr",null,[e.createElementVNode("td",{colspan:n.columnsLength,class:e.normalizeClass(["vst-loading-row",`vst-loading-row-${m}`])},b,10,c)]))}}),g={INITIAL:"initial",SYNCING:"syncing",SYNCED:"synced",FAILED:"failed"},I=({initialFilters:n,loadItems:m})=>{const l=e.ref(1),a=e.reactive({value:[]}),o=e.ref(g.INITIAL),p=e.reactive({value:n}),i=e.computed(()=>C({page:l.value},p.value)),d=()=>(o.value=g.SYNCING,m(i.value).then(N=>{a.value=N,o.value=g.SYNCED}).catch(()=>{a.value=[],o.value=g.FAILED}));return d(),e.watch(i,d),{page:l,items:a,syncState:o,nextPage:()=>{l.value+=1},prevPage:()=>{l.value-=1},isSyncing:e.computed(()=>o.value===g.SYNCING),isSynced:e.computed(()=>o.value===g.SYNCED),isFailed:e.computed(()=>o.value===g.FAILED),reload:()=>{d()},refetch:()=>{l.value===1?d():l.value=1}}},E=(n,m)=>(l,[a,o])=>{if(o==null)return l;const p=encodeURIComponent(a),i=m?`${m}[${p}]`:p;return["number","string"].includes(typeof o)?(l.push(`${i}=${encodeURIComponent(o)}`),l):(l.push(Object.entries(o).reduce(E(o,i),[]).join("&")),l)};var w=n=>Object.entries(n).reduce(E(),[]).join("&");const F={class:"vst"},L={key:0},T={key:0},D=["colspan"],P=["colspan"],j={key:0,class:"vst-pagination mt-3"};return e.defineComponent({props:{columns:null,source:null,perPage:{default:25}},setup(n,{expose:m}){const l=n,a=e.shallowRef({}),o=async r=>{let f;return typeof l.source=="string"?f=await(await fetch(`${l.source}?${w(r)}`)).json():f=await l.source(r),f},p=r=>{a.value[r]==="asc"?a.value={[r]:"desc"}:a.value[r]==="desc"?a.value={}:a.value={[r]:"asc"}},{page:i,isSyncing:d,isSynced:N,prevPage:S,nextPage:B,reload:Y,refetch:x,items:k}=I({initialFilters:{per_page:l.perPage,orders:a.value},loadItems:o});return m({refetch:x,reload:Y,rows:k}),(r,f)=>(e.openBlock(),e.createElementBlock("table",F,[n.columns.length?(e.openBlock(),e.createElementBlock("thead",L,[e.renderSlot(r.$slots,"thead",{columns:n.columns,orders:e.unref(a)},()=>[e.createElementVNode("tr",null,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.columns,t=>(e.openBlock(),e.createElementBlock("th",e.mergeProps({key:t.key,class:["vst-th",{"vst-orderable":t.orderable}]},e.toHandlers(t.orderable?{click:()=>p(t.key)}:{})),[t.orderable?(e.openBlock(),e.createElementBlock("div",T,[e.renderSlot(r.$slots,`head:${t.key}`,{column:t},()=>[e.createTextVNode(e.toDisplayString(t.title),1)]),e.createElementVNode("a",{href:"#",class:e.normalizeClass(["vst-orderable-toggle",e.unref(a)[t.key]])},null,2)])):e.renderSlot(r.$slots,`thead:${t.key}`,{key:1,column:t},()=>[e.createTextVNode(e.toDisplayString(t.title),1)])],16))),128))])])])):e.createCommentVNode("",!0),e.createElementVNode("tbody",null,[e.unref(d)?e.renderSlot(r.$slots,"row:loading",{key:0},()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.perPage,t=>(e.openBlock(),e.createBlock(u,{key:`loadingRow${t}`,"columns-length":n.columns.length},null,8,["columns-length"]))),128))]):e.unref(N)&&e.unref(k).value.length===0?e.renderSlot(r.$slots,"row:empty",{key:1},()=>[e.createElementVNode("tr",null,[e.createElementVNode("td",{colspan:n.columns.length}," No records found ",8,D)])]):e.unref(N)&&e.unref(k).value.length?(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:2},e.renderList(e.unref(k).value,(t,y)=>e.renderSlot(r.$slots,"row",{row:t,index:y,columns:n.columns},()=>[(e.openBlock(),e.createElementBlock("tr",{key:t.id||y},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.columns,h=>(e.openBlock(),e.createElementBlock("td",{key:h.key},[e.renderSlot(r.$slots,`cell:${h.key}`,{row:t,value:t[h.key],column:h,index:y},()=>[e.createTextVNode(e.toDisplayString(t[h.key]),1)])]))),128))]))])),256)):e.createCommentVNode("",!0)]),e.createElementVNode("tfoot",null,[e.createElementVNode("tr",null,[e.createElementVNode("td",{colspan:n.columns.length},[e.renderSlot(r.$slots,"pagination",{page:e.unref(i),rows:e.unref(k).value},()=>[e.unref(i)>1||e.unref(k).value.length===n.perPage||e.unref(d)?(e.openBlock(),e.createElementBlock("ul",j,[e.createElementVNode("li",{class:e.normalizeClass(["vst-page-item",{disabled:e.unref(i)===1||e.unref(d)}])},[e.createElementVNode("a",{class:"vst-page-link",onClick:f[0]||(f[0]=e.withModifiers((...t)=>e.unref(S)&&e.unref(S)(...t),["prevent"]))},"\u2190")],2),e.createElementVNode("li",{class:e.normalizeClass(["vst-page-item",{disabled:e.unref(k).value.length<n.perPage||e.unref(d)}])},[e.createElementVNode("a",{class:"vst-page-link",onClick:f[1]||(f[1]=e.withModifiers((...t)=>e.unref(B)&&e.unref(B)(...t),["prevent"]))},"\u2192")],2)])):e.createCommentVNode("",!0)])],8,P)])])]))}})});
2
+ //# sourceMappingURL=vst.umd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vst.umd.js","sources":["../src/ts/components/loading_row.vue","../src/ts/use/filterable.ts","../src/ts/helpers/to_query_string.ts","../src/ts/components/table.vue"],"sourcesContent":["<template>\n <tr>\n <td\n :colspan=\"columnsLength\"\n :class=\"['vst-loading-row', `vst-loading-row-${randNum}`]\">\n <div />\n </td>\n </tr>\n</template>\n\n<script lang=\"ts\" setup>\ndefineProps({\n columnsLength: { type: Number, required: true },\n})\n\nconst randNum = Math.floor(Math.random() * 10) + 1\n</script>\n","import {\n ref, computed, reactive, watch,\n} from 'vue'\n\ntype CombinedFilters<Filters> = Filters & {\n page: number\n}\n\ninterface UseFiltetableArgs<Filters, Item> {\n initialFilters: Filters,\n loadItems: (_filters: CombinedFilters<Filters>) => Promise<Item[]>\n}\n\nconst SYNC_STATES = {\n INITIAL: 'initial',\n SYNCING: 'syncing',\n SYNCED: 'synced',\n FAILED: 'failed',\n}\n\nconst useFilterable = <Filters, Item>({ initialFilters, loadItems }: UseFiltetableArgs<Filters, Item>) => {\n const page = ref(1)\n const items = reactive({ value: [] as Item[] }) as { value: Item[] }\n const syncState = ref(SYNC_STATES.INITIAL)\n const filters = reactive({ value: initialFilters })\n\n const combinedFilters = computed(() => ({\n page: page.value,\n ...filters.value as Filters,\n }))\n\n const load = () => {\n syncState.value = SYNC_STATES.SYNCING\n\n return loadItems(combinedFilters.value)\n .then((res: Item[]) => {\n items.value = res\n syncState.value = SYNC_STATES.SYNCED\n })\n .catch(() => {\n items.value = []\n syncState.value = SYNC_STATES.FAILED\n })\n }\n load()\n\n watch(combinedFilters, load)\n\n return {\n page,\n items,\n syncState,\n nextPage: () => {\n page.value += 1\n },\n prevPage: () => {\n page.value -= 1\n },\n isSyncing: computed(() => syncState.value === SYNC_STATES.SYNCING),\n isSynced: computed(() => syncState.value === SYNC_STATES.SYNCED),\n isFailed: computed(() => syncState.value === SYNC_STATES.FAILED),\n reload: () => {\n load()\n },\n refetch: () => {\n if (page.value === 1) {\n load()\n } else {\n page.value = 1\n }\n },\n }\n}\n\nexport default useFilterable\n","const stringify = (obj, parentPrefix?: string) => (outputArray, [key, val]) => {\n if (val === null || val === undefined) {\n return outputArray\n }\n\n const encodedKey = encodeURIComponent(key)\n const prefix = parentPrefix ? `${parentPrefix}[${encodedKey}]` : encodedKey\n\n if (['number', 'string'].includes(typeof val)) {\n outputArray.push(`${prefix}=${encodeURIComponent(val)}`)\n return outputArray\n }\n\n outputArray.push(Object.entries(val).reduce(stringify(val, prefix), []).join('&'))\n return outputArray\n}\n\nexport default (obj): string => Object.entries(obj).reduce(stringify(obj), []).join('&')\n","<template>\n <table class=\"vst\">\n <thead v-if=\"columns.length\">\n <slot name=\"thead\" :columns=\"columns\" :orders=\"orders\">\n <tr>\n <th\n v-for=\"column in columns\"\n :key=\"column.key\"\n :class=\"['vst-th', { 'vst-orderable': column.orderable }]\"\n v-on=\"column.orderable ? { click: () => onOrderClick(column.key) } : {}\">\n <div v-if=\"column.orderable\">\n <slot\n :name=\"`head:${column.key}`\"\n :column=\"column\">\n {{ column.title }}\n </slot>\n\n <a href=\"#\" :class=\"['vst-orderable-toggle', orders[column.key]]\" />\n </div>\n\n <slot\n v-else\n :name=\"`thead:${column.key}`\"\n :column=\"column\">\n {{ column.title }}\n </slot>\n </th>\n </tr>\n </slot>\n </thead>\n <tbody>\n <slot v-if=\"isSyncing\" name=\"row:loading\">\n <LoadingRow\n v-for=\"i in perPage\"\n :key=\"`loadingRow${i}`\"\n :columns-length=\"columns.length\" />\n </slot>\n\n <slot v-else-if=\"isSynced && rows.value.length === 0\" name=\"row:empty\">\n <tr>\n <td :colspan=\"columns.length\">\n No records found\n </td>\n </tr>\n </slot>\n\n <template v-else-if=\"isSynced && rows.value.length\">\n <slot\n v-for=\"(row, i) in rows.value\"\n name=\"row\"\n :row=\"row\"\n :index=\"i\"\n :columns=\"columns\">\n <tr :key=\"row['id'] || i\">\n <td\n v-for=\"column in columns\"\n :key=\"column.key\">\n <slot\n :name=\"`cell:${column.key}`\"\n :row=\"row\"\n :value=\"row[column.key]\"\n :column=\"column\"\n :index=\"i\">\n {{ row[column.key] }}\n </slot>\n </td>\n </tr>\n </slot>\n </template>\n </tbody>\n <tfoot>\n <tr>\n <td :colspan=\"columns.length\">\n <slot name=\"pagination\" :page=\"page\" :rows=\"rows.value\">\n <ul\n v-if=\"page > 1 || rows.value.length === perPage || isSyncing\"\n class=\"vst-pagination mt-3\">\n <li :class=\"['vst-page-item', { disabled: page === 1 || isSyncing }]\">\n <a class=\"vst-page-link\" @click.prevent=\"prevPage\">←</a>\n </li>\n\n <li\n :class=\"['vst-page-item', {\n disabled: rows.value.length < perPage || isSyncing\n }]\">\n <a class=\"vst-page-link\" @click.prevent=\"nextPage\">→</a>\n </li>\n </ul>\n </slot>\n </td>\n </tr>\n </tfoot>\n </table>\n</template>\n\n<script setup lang=\"ts\">\nimport { shallowRef, ShallowRef } from 'vue'\nimport LoadingRow from './loading_row.vue'\n\nimport useFilterable from '../use/filterable'\nimport toQueryString from '../helpers/to_query_string'\n\ninterface TableColumn {\n key: string,\n title: string,\n orderable?: boolean\n}\n\ninterface TableOrders {\n [key: string]: 'asc' | 'desc'\n}\n\ninterface TableFetchParams {\n per_page: number,\n page: number,\n orders?: TableOrders\n}\n\ninterface TableRow {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any\n}\n\ninterface TableFilters {\n per_page: number,\n orders: TableOrders\n}\n\ninterface TableProps {\n columns: Array<TableColumn>\n source: string | ((_: TableFetchParams) => Promise<TableRow[]> | TableRow[])\n perPage?: number\n}\n\nconst props = withDefaults(defineProps<TableProps>(), {\n perPage: 25,\n})\n\nconst orders: ShallowRef<TableOrders> = shallowRef({})\n\nconst loadItems = async (params: TableFetchParams) => {\n let data: TableRow[]\n if (typeof props.source === 'string') {\n const response = await fetch(`${props.source}?${toQueryString(params)}`)\n data = await response.json()\n } else {\n data = await props.source(params) as TableRow[]\n }\n\n return data\n}\n\nconst onOrderClick = (key: string) => {\n if (orders.value[key] === 'asc') {\n orders.value = { [key]: 'desc' }\n } else if (orders.value[key] === 'desc') {\n orders.value = {}\n } else {\n orders.value = { [key]: 'asc' }\n }\n}\n\nconst {\n page, isSyncing, isSynced, prevPage, nextPage, reload, refetch, items: rows,\n} = useFilterable<TableFilters, TableRow>({\n initialFilters: { per_page: props.perPage, orders: orders.value },\n loadItems,\n})\n\ndefineExpose({\n refetch,\n reload,\n rows,\n})\n</script>\n"],"names":["ref","reactive","computed","shallowRef"],"mappings":"iwBAeM,GAAU,KAAK,MAAM,KAAK,SAAW,EAAE,EAAI,mMCF3C,EAAc,CAClB,QAAS,UACT,QAAS,UACT,OAAQ,SACR,OAAQ,QACV,EAEM,EAAgB,CAAgB,CAAE,iBAAgB,eAAkD,MAClG,GAAOA,MAAI,CAAC,EACZ,EAAQC,WAAS,CAAE,MAAO,GAAc,EACxC,EAAYD,MAAI,EAAY,OAAO,EACnC,EAAUC,WAAS,CAAE,MAAO,EAAgB,EAE5C,EAAkBC,WAAS,OAC/B,KAAM,EAAK,OACR,EAAQ,MACX,EAEI,EAAO,OACD,MAAQ,EAAY,QAEvB,EAAU,EAAgB,KAAK,EACnC,KAAK,AAAC,GAAgB,GACf,MAAQ,IACJ,MAAQ,EAAY,OAC/B,EACA,MAAM,IAAM,GACL,MAAQ,KACJ,MAAQ,EAAY,OAC/B,sBAIC,EAAiB,CAAI,EAEpB,CACL,OACA,QACA,YACA,SAAU,IAAM,GACT,OAAS,GAEhB,SAAU,IAAM,GACT,OAAS,GAEhB,UAAWA,WAAS,IAAM,EAAU,QAAU,EAAY,OAAO,EACjE,SAAUA,WAAS,IAAM,EAAU,QAAU,EAAY,MAAM,EAC/D,SAAUA,WAAS,IAAM,EAAU,QAAU,EAAY,MAAM,EAC/D,OAAQ,IAAM,MAGd,QAAS,IAAM,CACT,EAAK,QAAU,QAGZ,MAAQ,GAIrB,ECxEM,EAAY,CAAC,EAAK,IAA0B,CAAC,EAAa,CAAC,EAAK,KAAS,IACzE,GAAQ,WACH,QAGH,GAAa,mBAAmB,CAAG,EACnC,EAAS,EAAe,GAAG,KAAgB,KAAgB,QAE7D,CAAC,SAAU,QAAQ,EAAE,SAAS,MAAO,EAAG,KAC9B,KAAK,GAAG,KAAU,mBAAmB,CAAG,GAAG,EAChD,MAGG,KAAK,OAAO,QAAQ,CAAG,EAAE,OAAO,EAAU,EAAK,CAAM,EAAG,EAAE,EAAE,KAAK,GAAG,CAAC,EAC1E,EACT,QAEe,AAAC,GAAgB,OAAO,QAAQ,CAAG,EAAE,OAAO,EAAa,EAAG,EAAE,EAAE,KAAK,GAAG,4NCyHjF,EAAkCC,aAAW,EAAE,EAE/C,EAAY,KAAO,IAA6B,IAChD,SACA,OAAO,GAAM,QAAW,WAEnB,KAAM,AADI,MAAM,OAAM,GAAG,EAAM,UAAU,EAAc,CAAM,GAAG,GACjD,SAEf,KAAM,GAAM,OAAO,CAAM,EAG3B,GAGH,EAAe,AAAC,GAAgB,CAChC,EAAO,MAAM,KAAS,QACjB,MAAQ,EAAG,GAAM,QACf,EAAO,MAAM,KAAS,SACxB,MAAQ,KAER,MAAQ,EAAG,GAAM,QAItB,CACJ,OAAM,YAAW,WAAU,WAAU,WAAU,SAAQ,UAAS,MAAO,GACrE,EAAsC,CACxC,eAAgB,CAAE,SAAU,EAAM,QAAS,OAAQ,EAAO,OAC1D,YACD,WAEY,CACX,UACA,SACA,OACD"}
package/package.json CHANGED
@@ -1,11 +1,26 @@
1
1
  {
2
2
  "name": "vue-slim-tables",
3
- "version": "0.1.2",
4
- "main": "dist/bundle.js",
3
+ "version": "0.3.2",
4
+ "files": [
5
+ "dist"
6
+ ],
7
+ "main": "./dist/vst.umd.js",
8
+ "module": "./dist/vst.es.js",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist/vst.es.js",
12
+ "require": "./dist/vst.umd.js"
13
+ },
14
+ "./stylesheets": "dist/style.css",
15
+ "./src/ts/index": "./src/ts/index.ts",
16
+ "./filterable": "./src/ts/use/filterable",
17
+ "./dist/vst.umd.js": "./dist/vst.umd.js"
18
+ },
5
19
  "scripts": {
6
- "build": "rm -rf ./dist && NODE_ENV=production webpack --config ./webpack.config.js",
7
- "eslint": "eslint ./src/js/ --ext 'js,vue'",
8
- "lint": "yarn run eslint --fix"
20
+ "build": "vite build",
21
+ "lint": "eslint ./src/ts/ --ext 'ts,vue'",
22
+ "test": "vitest",
23
+ "coverage": "vitest run --coverage"
9
24
  },
10
25
  "keywords": [
11
26
  "vue",
@@ -20,25 +35,26 @@
20
35
  "license": "MIT",
21
36
  "private": false,
22
37
  "devDependencies": {
23
- "@babel/core": "^7.16.7",
24
- "babel-loader": "^8.2.3",
25
- "css-loader": "^6.5.1",
26
- "eslint": "^8.6.0",
38
+ "@babel/types": "^7.17.10",
39
+ "@typescript-eslint/eslint-plugin": "^5.22.0",
40
+ "@typescript-eslint/parser": "^5.22.0",
41
+ "@vitejs/plugin-vue": "^2.3.1",
42
+ "@vue/test-utils": "^2.0.0-rc.21",
43
+ "c8": "^7.11.2",
44
+ "eslint": "^8.14.0",
27
45
  "eslint-config-airbnb-base": "^15.0.0",
28
- "eslint-plugin-import": "^2.25.4",
29
- "eslint-plugin-vue": "8.2.0",
30
- "mini-css-extract-plugin": "^2.4.6",
31
- "node-sass": "^7.0.1",
32
- "sass-loader": "^12.4.0",
33
- "style-loader": "^3.3.1",
34
- "vue": "^2.6.14",
35
- "vue-loader": "^15.9.8",
36
- "vue-template-compiler": "^2.6.14",
37
- "webpack": "^5.65.0",
38
- "webpack-cli": "^4.9.1",
39
- "webpack-dev-server": "^4.7.2"
46
+ "eslint-plugin-import": "^2.26.0",
47
+ "eslint-plugin-vue": "^8.7.1",
48
+ "happy-dom": "^3.1.0",
49
+ "sass": "^1.51.0",
50
+ "typescript": "4.6.4",
51
+ "vite": "^2.9.7",
52
+ "vite-plugin-dts": "^1.1.1",
53
+ "vitest": "^0.10.2",
54
+ "vue-eslint-parser": "^8.3.0"
40
55
  },
41
56
  "dependencies": {
42
- "qs": "^6.10.2"
43
- }
57
+ "vue": "^3.2.33"
58
+ },
59
+ "types": "dist/types/index.d.ts"
44
60
  }
package/.eslintrc.yml DELETED
@@ -1,28 +0,0 @@
1
- extends:
2
- - airbnb-base
3
- - plugin:vue/base
4
- - plugin:vue/recommended
5
- - plugin:vue/strongly-recommended
6
- plugins:
7
- - vue
8
- env:
9
- browser: true
10
- parserOptions:
11
- ecmaVersion: 2019
12
- rules:
13
- semi:
14
- - error
15
- - never
16
- vue/html-closing-bracket-newline:
17
- - error
18
- - { singleline: never, multiline: never }
19
- vue/html-indent:
20
- - error
21
- - 2
22
- - { alignAttributesVertically: false }
23
- vue/max-attributes-per-line:
24
- - error
25
- - { singleline: 3, multiline: { max: 3 } }
26
- vue/multi-word-component-names:
27
- - error
28
- - ignores: ['table']
package/dist/bundle.css DELETED
@@ -1,2 +0,0 @@
1
- @keyframes moving-gradient{0%{background-position:-250px 0}100%{background-position:250px 0}}.vst-th{line-height:20px}.vst-orderable:hover{cursor:pointer}.vst-orderable:hover .vst-orderable-toggle{color:#555 !important}.vst-orderable-toggle{font-size:20px;float:right;color:#ccc !important}.vst-orderable-toggle:after{content:" \2194";display:inline-block;transform:rotate(-90deg)}.vst-orderable-toggle.desc:after{content:" \2191";transform:rotate(0)}.vst-orderable-toggle.asc:after{content:" \2193";transform:rotate(0)}.vst-loading-row div{height:20px;background:linear-gradient(to right, #eee 20%, #ddd 50%, #eee 80%);background-size:500px 20px;animation-name:moving-gradient;animation-duration:1s;animation-iteration-count:infinite;animation-timing-function:linear;animation-fill-mode:forwards}.vst tr td.vst-loading-row-1 div{animation-delay:-1000ms}.vst tr td.vst-loading-row-2 div{animation-delay:-900ms}.vst tr td.vst-loading-row-3 div{animation-delay:-800ms}.vst tr td.vst-loading-row-4 div{animation-delay:-700ms}.vst tr td.vst-loading-row-5 div{animation-delay:-600ms}.vst tr td.vst-loading-row-6 div{animation-delay:-500ms}.vst tr td.vst-loading-row-7 div{animation-delay:-400ms}.vst tr td.vst-loading-row-8 div{animation-delay:-300ms}.vst tr td.vst-loading-row-9 div{animation-delay:-200ms}.vst tr td.vst-loading-row-10 div{animation-delay:-100ms}.vst-pagination{display:flex;padding-left:0;list-style:none;border-radius:0.25rem}.vst-pagination a{position:relative;display:block;padding:8px 12px;padding:0.5rem 0.75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.vst-pagination a:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.vst-page-item.disabled .vst-page-link{pointer-events:none;color:#6c757d;cursor:auto;background-color:#fff}.vst-page-item .vst-page-link{cursor:pointer}
2
-
package/dist/bundle.js DELETED
@@ -1 +0,0 @@
1
- !function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.VueSlimTable=e():t.VueSlimTable=e()}(self,(function(){return(()=>{var t={924:(t,e,r)=>{"use strict";var o=r(210),n=r(559),i=n(o("String.prototype.indexOf"));t.exports=function(t,e){var r=o(t,!!e);return"function"==typeof r&&i(t,".prototype.")>-1?n(r):r}},559:(t,e,r)=>{"use strict";var o=r(612),n=r(210),i=n("%Function.prototype.apply%"),a=n("%Function.prototype.call%"),c=n("%Reflect.apply%",!0)||o.call(a,i),p=n("%Object.getOwnPropertyDescriptor%",!0),l=n("%Object.defineProperty%",!0),u=n("%Math.max%");if(l)try{l({},"a",{value:1})}catch(t){l=null}t.exports=function(t){var e=c(o,a,arguments);if(p&&l){var r=p(e,"length");r.configurable&&l(e,"length",{value:1+u(0,t.length-(arguments.length-1))})}return e};var f=function(){return c(o,i,arguments)};l?l(t.exports,"apply",{value:f}):t.exports.apply=f},648:t=>{"use strict";var e="Function.prototype.bind called on incompatible ",r=Array.prototype.slice,o=Object.prototype.toString,n="[object Function]";t.exports=function(t){var i=this;if("function"!=typeof i||o.call(i)!==n)throw new TypeError(e+i);for(var a,c=r.call(arguments,1),p=function(){if(this instanceof a){var e=i.apply(this,c.concat(r.call(arguments)));return Object(e)===e?e:this}return i.apply(t,c.concat(r.call(arguments)))},l=Math.max(0,i.length-c.length),u=[],f=0;f<l;f++)u.push("$"+f);if(a=Function("binder","return function ("+u.join(",")+"){ return binder.apply(this,arguments); }")(p),i.prototype){var s=function(){};s.prototype=i.prototype,a.prototype=new s,s.prototype=null}return a}},612:(t,e,r)=>{"use strict";var o=r(648);t.exports=Function.prototype.bind||o},210:(t,e,r)=>{"use strict";var o,n=SyntaxError,i=Function,a=TypeError,c=function(t){try{return i('"use strict"; return ('+t+").constructor;")()}catch(t){}},p=Object.getOwnPropertyDescriptor;if(p)try{p({},"")}catch(t){p=null}var l=function(){throw new a},u=p?function(){try{return l}catch(t){try{return p(arguments,"callee").get}catch(t){return l}}}():l,f=r(405)(),s=Object.getPrototypeOf||function(t){return t.__proto__},y={},d="undefined"==typeof Uint8Array?o:s(Uint8Array),g={"%AggregateError%":"undefined"==typeof AggregateError?o:AggregateError,"%Array%":Array,"%ArrayBuffer%":"undefined"==typeof ArrayBuffer?o:ArrayBuffer,"%ArrayIteratorPrototype%":f?s([][Symbol.iterator]()):o,"%AsyncFromSyncIteratorPrototype%":o,"%AsyncFunction%":y,"%AsyncGenerator%":y,"%AsyncGeneratorFunction%":y,"%AsyncIteratorPrototype%":y,"%Atomics%":"undefined"==typeof Atomics?o:Atomics,"%BigInt%":"undefined"==typeof BigInt?o:BigInt,"%Boolean%":Boolean,"%DataView%":"undefined"==typeof DataView?o:DataView,"%Date%":Date,"%decodeURI%":decodeURI,"%decodeURIComponent%":decodeURIComponent,"%encodeURI%":encodeURI,"%encodeURIComponent%":encodeURIComponent,"%Error%":Error,"%eval%":eval,"%EvalError%":EvalError,"%Float32Array%":"undefined"==typeof Float32Array?o:Float32Array,"%Float64Array%":"undefined"==typeof Float64Array?o:Float64Array,"%FinalizationRegistry%":"undefined"==typeof FinalizationRegistry?o:FinalizationRegistry,"%Function%":i,"%GeneratorFunction%":y,"%Int8Array%":"undefined"==typeof Int8Array?o:Int8Array,"%Int16Array%":"undefined"==typeof Int16Array?o:Int16Array,"%Int32Array%":"undefined"==typeof Int32Array?o:Int32Array,"%isFinite%":isFinite,"%isNaN%":isNaN,"%IteratorPrototype%":f?s(s([][Symbol.iterator]())):o,"%JSON%":"object"==typeof JSON?JSON:o,"%Map%":"undefined"==typeof Map?o:Map,"%MapIteratorPrototype%":"undefined"!=typeof Map&&f?s((new Map)[Symbol.iterator]()):o,"%Math%":Math,"%Number%":Number,"%Object%":Object,"%parseFloat%":parseFloat,"%parseInt%":parseInt,"%Promise%":"undefined"==typeof Promise?o:Promise,"%Proxy%":"undefined"==typeof Proxy?o:Proxy,"%RangeError%":RangeError,"%ReferenceError%":ReferenceError,"%Reflect%":"undefined"==typeof Reflect?o:Reflect,"%RegExp%":RegExp,"%Set%":"undefined"==typeof Set?o:Set,"%SetIteratorPrototype%":"undefined"!=typeof Set&&f?s((new Set)[Symbol.iterator]()):o,"%SharedArrayBuffer%":"undefined"==typeof SharedArrayBuffer?o:SharedArrayBuffer,"%String%":String,"%StringIteratorPrototype%":f?s(""[Symbol.iterator]()):o,"%Symbol%":f?Symbol:o,"%SyntaxError%":n,"%ThrowTypeError%":u,"%TypedArray%":d,"%TypeError%":a,"%Uint8Array%":"undefined"==typeof Uint8Array?o:Uint8Array,"%Uint8ClampedArray%":"undefined"==typeof Uint8ClampedArray?o:Uint8ClampedArray,"%Uint16Array%":"undefined"==typeof Uint16Array?o:Uint16Array,"%Uint32Array%":"undefined"==typeof Uint32Array?o:Uint32Array,"%URIError%":URIError,"%WeakMap%":"undefined"==typeof WeakMap?o:WeakMap,"%WeakRef%":"undefined"==typeof WeakRef?o:WeakRef,"%WeakSet%":"undefined"==typeof WeakSet?o:WeakSet},h=function t(e){var r;if("%AsyncFunction%"===e)r=c("async function () {}");else if("%GeneratorFunction%"===e)r=c("function* () {}");else if("%AsyncGeneratorFunction%"===e)r=c("async function* () {}");else if("%AsyncGenerator%"===e){var o=t("%AsyncGeneratorFunction%");o&&(r=o.prototype)}else if("%AsyncIteratorPrototype%"===e){var n=t("%AsyncGenerator%");n&&(r=s(n.prototype))}return g[e]=r,r},b={"%ArrayBufferPrototype%":["ArrayBuffer","prototype"],"%ArrayPrototype%":["Array","prototype"],"%ArrayProto_entries%":["Array","prototype","entries"],"%ArrayProto_forEach%":["Array","prototype","forEach"],"%ArrayProto_keys%":["Array","prototype","keys"],"%ArrayProto_values%":["Array","prototype","values"],"%AsyncFunctionPrototype%":["AsyncFunction","prototype"],"%AsyncGenerator%":["AsyncGeneratorFunction","prototype"],"%AsyncGeneratorPrototype%":["AsyncGeneratorFunction","prototype","prototype"],"%BooleanPrototype%":["Boolean","prototype"],"%DataViewPrototype%":["DataView","prototype"],"%DatePrototype%":["Date","prototype"],"%ErrorPrototype%":["Error","prototype"],"%EvalErrorPrototype%":["EvalError","prototype"],"%Float32ArrayPrototype%":["Float32Array","prototype"],"%Float64ArrayPrototype%":["Float64Array","prototype"],"%FunctionPrototype%":["Function","prototype"],"%Generator%":["GeneratorFunction","prototype"],"%GeneratorPrototype%":["GeneratorFunction","prototype","prototype"],"%Int8ArrayPrototype%":["Int8Array","prototype"],"%Int16ArrayPrototype%":["Int16Array","prototype"],"%Int32ArrayPrototype%":["Int32Array","prototype"],"%JSONParse%":["JSON","parse"],"%JSONStringify%":["JSON","stringify"],"%MapPrototype%":["Map","prototype"],"%NumberPrototype%":["Number","prototype"],"%ObjectPrototype%":["Object","prototype"],"%ObjProto_toString%":["Object","prototype","toString"],"%ObjProto_valueOf%":["Object","prototype","valueOf"],"%PromisePrototype%":["Promise","prototype"],"%PromiseProto_then%":["Promise","prototype","then"],"%Promise_all%":["Promise","all"],"%Promise_reject%":["Promise","reject"],"%Promise_resolve%":["Promise","resolve"],"%RangeErrorPrototype%":["RangeError","prototype"],"%ReferenceErrorPrototype%":["ReferenceError","prototype"],"%RegExpPrototype%":["RegExp","prototype"],"%SetPrototype%":["Set","prototype"],"%SharedArrayBufferPrototype%":["SharedArrayBuffer","prototype"],"%StringPrototype%":["String","prototype"],"%SymbolPrototype%":["Symbol","prototype"],"%SyntaxErrorPrototype%":["SyntaxError","prototype"],"%TypedArrayPrototype%":["TypedArray","prototype"],"%TypeErrorPrototype%":["TypeError","prototype"],"%Uint8ArrayPrototype%":["Uint8Array","prototype"],"%Uint8ClampedArrayPrototype%":["Uint8ClampedArray","prototype"],"%Uint16ArrayPrototype%":["Uint16Array","prototype"],"%Uint32ArrayPrototype%":["Uint32Array","prototype"],"%URIErrorPrototype%":["URIError","prototype"],"%WeakMapPrototype%":["WeakMap","prototype"],"%WeakSetPrototype%":["WeakSet","prototype"]},m=r(612),v=r(642),S=m.call(Function.call,Array.prototype.concat),j=m.call(Function.apply,Array.prototype.splice),O=m.call(Function.call,String.prototype.replace),w=m.call(Function.call,String.prototype.slice),A=/[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g,P=/\\(\\)?/g,x=function(t){var e=w(t,0,1),r=w(t,-1);if("%"===e&&"%"!==r)throw new n("invalid intrinsic syntax, expected closing `%`");if("%"===r&&"%"!==e)throw new n("invalid intrinsic syntax, expected opening `%`");var o=[];return O(t,A,(function(t,e,r,n){o[o.length]=r?O(n,P,"$1"):e||t})),o},E=function(t,e){var r,o=t;if(v(b,o)&&(o="%"+(r=b[o])[0]+"%"),v(g,o)){var i=g[o];if(i===y&&(i=h(o)),void 0===i&&!e)throw new a("intrinsic "+t+" exists, but is not available. Please file an issue!");return{alias:r,name:o,value:i}}throw new n("intrinsic "+t+" does not exist!")};t.exports=function(t,e){if("string"!=typeof t||0===t.length)throw new a("intrinsic name must be a non-empty string");if(arguments.length>1&&"boolean"!=typeof e)throw new a('"allowMissing" argument must be a boolean');var r=x(t),o=r.length>0?r[0]:"",i=E("%"+o+"%",e),c=i.name,l=i.value,u=!1,f=i.alias;f&&(o=f[0],j(r,S([0,1],f)));for(var s=1,y=!0;s<r.length;s+=1){var d=r[s],h=w(d,0,1),b=w(d,-1);if(('"'===h||"'"===h||"`"===h||'"'===b||"'"===b||"`"===b)&&h!==b)throw new n("property names with quotes must have matching quotes");if("constructor"!==d&&y||(u=!0),v(g,c="%"+(o+="."+d)+"%"))l=g[c];else if(null!=l){if(!(d in l)){if(!e)throw new a("base intrinsic for "+t+" exists, but the property is not available.");return}if(p&&s+1>=r.length){var m=p(l,d);l=(y=!!m)&&"get"in m&&!("originalValue"in m.get)?m.get:l[d]}else y=v(l,d),l=l[d];y&&!u&&(g[c]=l)}}return l}},405:(t,e,r)=>{"use strict";var o="undefined"!=typeof Symbol&&Symbol,n=r(419);t.exports=function(){return"function"==typeof o&&("function"==typeof Symbol&&("symbol"==typeof o("foo")&&("symbol"==typeof Symbol("bar")&&n())))}},419:t=>{"use strict";t.exports=function(){if("function"!=typeof Symbol||"function"!=typeof Object.getOwnPropertySymbols)return!1;if("symbol"==typeof Symbol.iterator)return!0;var t={},e=Symbol("test"),r=Object(e);if("string"==typeof e)return!1;if("[object Symbol]"!==Object.prototype.toString.call(e))return!1;if("[object Symbol]"!==Object.prototype.toString.call(r))return!1;for(e in t[e]=42,t)return!1;if("function"==typeof Object.keys&&0!==Object.keys(t).length)return!1;if("function"==typeof Object.getOwnPropertyNames&&0!==Object.getOwnPropertyNames(t).length)return!1;var o=Object.getOwnPropertySymbols(t);if(1!==o.length||o[0]!==e)return!1;if(!Object.prototype.propertyIsEnumerable.call(t,e))return!1;if("function"==typeof Object.getOwnPropertyDescriptor){var n=Object.getOwnPropertyDescriptor(t,e);if(42!==n.value||!0!==n.enumerable)return!1}return!0}},642:(t,e,r)=>{"use strict";var o=r(612);t.exports=o.call(Function.call,Object.prototype.hasOwnProperty)},631:(t,e,r)=>{var o="function"==typeof Map&&Map.prototype,n=Object.getOwnPropertyDescriptor&&o?Object.getOwnPropertyDescriptor(Map.prototype,"size"):null,i=o&&n&&"function"==typeof n.get?n.get:null,a=o&&Map.prototype.forEach,c="function"==typeof Set&&Set.prototype,p=Object.getOwnPropertyDescriptor&&c?Object.getOwnPropertyDescriptor(Set.prototype,"size"):null,l=c&&p&&"function"==typeof p.get?p.get:null,u=c&&Set.prototype.forEach,f="function"==typeof WeakMap&&WeakMap.prototype?WeakMap.prototype.has:null,s="function"==typeof WeakSet&&WeakSet.prototype?WeakSet.prototype.has:null,y="function"==typeof WeakRef&&WeakRef.prototype?WeakRef.prototype.deref:null,d=Boolean.prototype.valueOf,g=Object.prototype.toString,h=Function.prototype.toString,b=String.prototype.match,m="function"==typeof BigInt?BigInt.prototype.valueOf:null,v=Object.getOwnPropertySymbols,S="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?Symbol.prototype.toString:null,j="function"==typeof Symbol&&"object"==typeof Symbol.iterator,O=Object.prototype.propertyIsEnumerable,w=("function"==typeof Reflect?Reflect.getPrototypeOf:Object.getPrototypeOf)||([].__proto__===Array.prototype?function(t){return t.__proto__}:null),A=r(654).custom,P=A&&R(A)?A:null,x="function"==typeof Symbol&&void 0!==Symbol.toStringTag?Symbol.toStringTag:null;function E(t,e,r){var o="double"===(r.quoteStyle||e)?'"':"'";return o+t+o}function k(t){return String(t).replace(/"/g,"&quot;")}function _(t){return!("[object Array]"!==I(t)||x&&"object"==typeof t&&x in t)}function R(t){if(j)return t&&"object"==typeof t&&t instanceof Symbol;if("symbol"==typeof t)return!0;if(!t||"object"!=typeof t||!S)return!1;try{return S.call(t),!0}catch(t){}return!1}t.exports=function t(e,r,o,n){var c=r||{};if(N(c,"quoteStyle")&&"single"!==c.quoteStyle&&"double"!==c.quoteStyle)throw new TypeError('option "quoteStyle" must be "single" or "double"');if(N(c,"maxStringLength")&&("number"==typeof c.maxStringLength?c.maxStringLength<0&&c.maxStringLength!==1/0:null!==c.maxStringLength))throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`');var p=!N(c,"customInspect")||c.customInspect;if("boolean"!=typeof p&&"symbol"!==p)throw new TypeError("option \"customInspect\", if provided, must be `true`, `false`, or `'symbol'`");if(N(c,"indent")&&null!==c.indent&&"\t"!==c.indent&&!(parseInt(c.indent,10)===c.indent&&c.indent>0))throw new TypeError('options "indent" must be "\\t", an integer > 0, or `null`');if(void 0===e)return"undefined";if(null===e)return"null";if("boolean"==typeof e)return e?"true":"false";if("string"==typeof e)return M(e,c);if("number"==typeof e)return 0===e?1/0/e>0?"0":"-0":String(e);if("bigint"==typeof e)return String(e)+"n";var g=void 0===c.depth?5:c.depth;if(void 0===o&&(o=0),o>=g&&g>0&&"object"==typeof e)return _(e)?"[Array]":"[Object]";var v=function(t,e){var r;if("\t"===t.indent)r="\t";else{if(!("number"==typeof t.indent&&t.indent>0))return null;r=Array(t.indent+1).join(" ")}return{base:r,prev:Array(e+1).join(r)}}(c,o);if(void 0===n)n=[];else if(D(n,e)>=0)return"[Circular]";function O(e,r,i){if(r&&(n=n.slice()).push(r),i){var a={depth:c.depth};return N(c,"quoteStyle")&&(a.quoteStyle=c.quoteStyle),t(e,a,o+1,n)}return t(e,c,o+1,n)}if("function"==typeof e){var A=function(t){if(t.name)return t.name;var e=b.call(h.call(t),/^function\s*([\w$]+)/);if(e)return e[1];return null}(e),F=B(e,O);return"[Function"+(A?": "+A:" (anonymous)")+"]"+(F.length>0?" { "+F.join(", ")+" }":"")}if(R(e)){var C=j?String(e).replace(/^(Symbol\(.*\))_[^)]*$/,"$1"):S.call(e);return"object"!=typeof e||j?C:U(C)}if(function(t){if(!t||"object"!=typeof t)return!1;if("undefined"!=typeof HTMLElement&&t instanceof HTMLElement)return!0;return"string"==typeof t.nodeName&&"function"==typeof t.getAttribute}(e)){for(var $="<"+String(e.nodeName).toLowerCase(),G=e.attributes||[],V=0;V<G.length;V++)$+=" "+G[V].name+"="+E(k(G[V].value),"double",c);return $+=">",e.childNodes&&e.childNodes.length&&($+="..."),$+="</"+String(e.nodeName).toLowerCase()+">"}if(_(e)){if(0===e.length)return"[]";var q=B(e,O);return v&&!function(t){for(var e=0;e<t.length;e++)if(D(t[e],"\n")>=0)return!1;return!0}(q)?"["+L(q,v)+"]":"[ "+q.join(", ")+" ]"}if(function(t){return!("[object Error]"!==I(t)||x&&"object"==typeof t&&x in t)}(e)){var H=B(e,O);return 0===H.length?"["+String(e)+"]":"{ ["+String(e)+"] "+H.join(", ")+" }"}if("object"==typeof e&&p){if(P&&"function"==typeof e[P])return e[P]();if("symbol"!==p&&"function"==typeof e.inspect)return e.inspect()}if(function(t){if(!i||!t||"object"!=typeof t)return!1;try{i.call(t);try{l.call(t)}catch(t){return!0}return t instanceof Map}catch(t){}return!1}(e)){var z=[];return a.call(e,(function(t,r){z.push(O(r,e,!0)+" => "+O(t,e))})),W("Map",i.call(e),z,v)}if(function(t){if(!l||!t||"object"!=typeof t)return!1;try{l.call(t);try{i.call(t)}catch(t){return!0}return t instanceof Set}catch(t){}return!1}(e)){var Q=[];return u.call(e,(function(t){Q.push(O(t,e))})),W("Set",l.call(e),Q,v)}if(function(t){if(!f||!t||"object"!=typeof t)return!1;try{f.call(t,f);try{s.call(t,s)}catch(t){return!0}return t instanceof WeakMap}catch(t){}return!1}(e))return T("WeakMap");if(function(t){if(!s||!t||"object"!=typeof t)return!1;try{s.call(t,s);try{f.call(t,f)}catch(t){return!0}return t instanceof WeakSet}catch(t){}return!1}(e))return T("WeakSet");if(function(t){if(!y||!t||"object"!=typeof t)return!1;try{return y.call(t),!0}catch(t){}return!1}(e))return T("WeakRef");if(function(t){return!("[object Number]"!==I(t)||x&&"object"==typeof t&&x in t)}(e))return U(O(Number(e)));if(function(t){if(!t||"object"!=typeof t||!m)return!1;try{return m.call(t),!0}catch(t){}return!1}(e))return U(O(m.call(e)));if(function(t){return!("[object Boolean]"!==I(t)||x&&"object"==typeof t&&x in t)}(e))return U(d.call(e));if(function(t){return!("[object String]"!==I(t)||x&&"object"==typeof t&&x in t)}(e))return U(O(String(e)));if(!function(t){return!("[object Date]"!==I(t)||x&&"object"==typeof t&&x in t)}(e)&&!function(t){return!("[object RegExp]"!==I(t)||x&&"object"==typeof t&&x in t)}(e)){var J=B(e,O),X=w?w(e)===Object.prototype:e instanceof Object||e.constructor===Object,K=e instanceof Object?"":"null prototype",Y=!X&&x&&Object(e)===e&&x in e?I(e).slice(8,-1):K?"Object":"",Z=(X||"function"!=typeof e.constructor?"":e.constructor.name?e.constructor.name+" ":"")+(Y||K?"["+[].concat(Y||[],K||[]).join(": ")+"] ":"");return 0===J.length?Z+"{}":v?Z+"{"+L(J,v)+"}":Z+"{ "+J.join(", ")+" }"}return String(e)};var F=Object.prototype.hasOwnProperty||function(t){return t in this};function N(t,e){return F.call(t,e)}function I(t){return g.call(t)}function D(t,e){if(t.indexOf)return t.indexOf(e);for(var r=0,o=t.length;r<o;r++)if(t[r]===e)return r;return-1}function M(t,e){if(t.length>e.maxStringLength){var r=t.length-e.maxStringLength,o="... "+r+" more character"+(r>1?"s":"");return M(t.slice(0,e.maxStringLength),e)+o}return E(t.replace(/(['\\])/g,"\\$1").replace(/[\x00-\x1f]/g,C),"single",e)}function C(t){var e=t.charCodeAt(0),r={8:"b",9:"t",10:"n",12:"f",13:"r"}[e];return r?"\\"+r:"\\x"+(e<16?"0":"")+e.toString(16).toUpperCase()}function U(t){return"Object("+t+")"}function T(t){return t+" { ? }"}function W(t,e,r,o){return t+" ("+e+") {"+(o?L(r,o):r.join(", "))+"}"}function L(t,e){if(0===t.length)return"";var r="\n"+e.prev+e.base;return r+t.join(","+r)+"\n"+e.prev}function B(t,e){var r=_(t),o=[];if(r){o.length=t.length;for(var n=0;n<t.length;n++)o[n]=N(t,n)?e(t[n],t):""}var i,a="function"==typeof v?v(t):[];if(j){i={};for(var c=0;c<a.length;c++)i["$"+a[c]]=a[c]}for(var p in t)N(t,p)&&(r&&String(Number(p))===p&&p<t.length||j&&i["$"+p]instanceof Symbol||(/[^\w$]/.test(p)?o.push(e(p,t)+": "+e(t[p],t)):o.push(p+": "+e(t[p],t))));if("function"==typeof v)for(var l=0;l<a.length;l++)O.call(t,a[l])&&o.push("["+e(a[l])+"]: "+e(t[a[l]],t));return o}},798:t=>{"use strict";var e=String.prototype.replace,r=/%20/g,o="RFC1738",n="RFC3986";t.exports={default:n,formatters:{RFC1738:function(t){return e.call(t,r,"+")},RFC3986:function(t){return String(t)}},RFC1738:o,RFC3986:n}},129:(t,e,r)=>{"use strict";var o=r(261),n=r(235),i=r(798);t.exports={formats:i,parse:n,stringify:o}},235:(t,e,r)=>{"use strict";var o=r(769),n=Object.prototype.hasOwnProperty,i=Array.isArray,a={allowDots:!1,allowPrototypes:!1,allowSparse:!1,arrayLimit:20,charset:"utf-8",charsetSentinel:!1,comma:!1,decoder:o.decode,delimiter:"&",depth:5,ignoreQueryPrefix:!1,interpretNumericEntities:!1,parameterLimit:1e3,parseArrays:!0,plainObjects:!1,strictNullHandling:!1},c=function(t){return t.replace(/&#(\d+);/g,(function(t,e){return String.fromCharCode(parseInt(e,10))}))},p=function(t,e){return t&&"string"==typeof t&&e.comma&&t.indexOf(",")>-1?t.split(","):t},l=function(t,e,r,o){if(t){var i=r.allowDots?t.replace(/\.([^.[]+)/g,"[$1]"):t,a=/(\[[^[\]]*])/g,c=r.depth>0&&/(\[[^[\]]*])/.exec(i),l=c?i.slice(0,c.index):i,u=[];if(l){if(!r.plainObjects&&n.call(Object.prototype,l)&&!r.allowPrototypes)return;u.push(l)}for(var f=0;r.depth>0&&null!==(c=a.exec(i))&&f<r.depth;){if(f+=1,!r.plainObjects&&n.call(Object.prototype,c[1].slice(1,-1))&&!r.allowPrototypes)return;u.push(c[1])}return c&&u.push("["+i.slice(c.index)+"]"),function(t,e,r,o){for(var n=o?e:p(e,r),i=t.length-1;i>=0;--i){var a,c=t[i];if("[]"===c&&r.parseArrays)a=[].concat(n);else{a=r.plainObjects?Object.create(null):{};var l="["===c.charAt(0)&&"]"===c.charAt(c.length-1)?c.slice(1,-1):c,u=parseInt(l,10);r.parseArrays||""!==l?!isNaN(u)&&c!==l&&String(u)===l&&u>=0&&r.parseArrays&&u<=r.arrayLimit?(a=[])[u]=n:a[l]=n:a={0:n}}n=a}return n}(u,e,r,o)}};t.exports=function(t,e){var r=function(t){if(!t)return a;if(null!==t.decoder&&void 0!==t.decoder&&"function"!=typeof t.decoder)throw new TypeError("Decoder has to be a function.");if(void 0!==t.charset&&"utf-8"!==t.charset&&"iso-8859-1"!==t.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");var e=void 0===t.charset?a.charset:t.charset;return{allowDots:void 0===t.allowDots?a.allowDots:!!t.allowDots,allowPrototypes:"boolean"==typeof t.allowPrototypes?t.allowPrototypes:a.allowPrototypes,allowSparse:"boolean"==typeof t.allowSparse?t.allowSparse:a.allowSparse,arrayLimit:"number"==typeof t.arrayLimit?t.arrayLimit:a.arrayLimit,charset:e,charsetSentinel:"boolean"==typeof t.charsetSentinel?t.charsetSentinel:a.charsetSentinel,comma:"boolean"==typeof t.comma?t.comma:a.comma,decoder:"function"==typeof t.decoder?t.decoder:a.decoder,delimiter:"string"==typeof t.delimiter||o.isRegExp(t.delimiter)?t.delimiter:a.delimiter,depth:"number"==typeof t.depth||!1===t.depth?+t.depth:a.depth,ignoreQueryPrefix:!0===t.ignoreQueryPrefix,interpretNumericEntities:"boolean"==typeof t.interpretNumericEntities?t.interpretNumericEntities:a.interpretNumericEntities,parameterLimit:"number"==typeof t.parameterLimit?t.parameterLimit:a.parameterLimit,parseArrays:!1!==t.parseArrays,plainObjects:"boolean"==typeof t.plainObjects?t.plainObjects:a.plainObjects,strictNullHandling:"boolean"==typeof t.strictNullHandling?t.strictNullHandling:a.strictNullHandling}}(e);if(""===t||null==t)return r.plainObjects?Object.create(null):{};for(var u="string"==typeof t?function(t,e){var r,l={},u=e.ignoreQueryPrefix?t.replace(/^\?/,""):t,f=e.parameterLimit===1/0?void 0:e.parameterLimit,s=u.split(e.delimiter,f),y=-1,d=e.charset;if(e.charsetSentinel)for(r=0;r<s.length;++r)0===s[r].indexOf("utf8=")&&("utf8=%E2%9C%93"===s[r]?d="utf-8":"utf8=%26%2310003%3B"===s[r]&&(d="iso-8859-1"),y=r,r=s.length);for(r=0;r<s.length;++r)if(r!==y){var g,h,b=s[r],m=b.indexOf("]="),v=-1===m?b.indexOf("="):m+1;-1===v?(g=e.decoder(b,a.decoder,d,"key"),h=e.strictNullHandling?null:""):(g=e.decoder(b.slice(0,v),a.decoder,d,"key"),h=o.maybeMap(p(b.slice(v+1),e),(function(t){return e.decoder(t,a.decoder,d,"value")}))),h&&e.interpretNumericEntities&&"iso-8859-1"===d&&(h=c(h)),b.indexOf("[]=")>-1&&(h=i(h)?[h]:h),n.call(l,g)?l[g]=o.combine(l[g],h):l[g]=h}return l}(t,r):t,f=r.plainObjects?Object.create(null):{},s=Object.keys(u),y=0;y<s.length;++y){var d=s[y],g=l(d,u[d],r,"string"==typeof t);f=o.merge(f,g,r)}return!0===r.allowSparse?f:o.compact(f)}},261:(t,e,r)=>{"use strict";var o=r(478),n=r(769),i=r(798),a=Object.prototype.hasOwnProperty,c={brackets:function(t){return t+"[]"},comma:"comma",indices:function(t,e){return t+"["+e+"]"},repeat:function(t){return t}},p=Array.isArray,l=String.prototype.split,u=Array.prototype.push,f=function(t,e){u.apply(t,p(e)?e:[e])},s=Date.prototype.toISOString,y=i.default,d={addQueryPrefix:!1,allowDots:!1,charset:"utf-8",charsetSentinel:!1,delimiter:"&",encode:!0,encoder:n.encode,encodeValuesOnly:!1,format:y,formatter:i.formatters[y],indices:!1,serializeDate:function(t){return s.call(t)},skipNulls:!1,strictNullHandling:!1},g={},h=function t(e,r,i,a,c,u,s,y,h,b,m,v,S,j,O){for(var w,A=e,P=O,x=0,E=!1;void 0!==(P=P.get(g))&&!E;){var k=P.get(e);if(x+=1,void 0!==k){if(k===x)throw new RangeError("Cyclic object value");E=!0}void 0===P.get(g)&&(x=0)}if("function"==typeof s?A=s(r,A):A instanceof Date?A=b(A):"comma"===i&&p(A)&&(A=n.maybeMap(A,(function(t){return t instanceof Date?b(t):t}))),null===A){if(a)return u&&!S?u(r,d.encoder,j,"key",m):r;A=""}if("string"==typeof(w=A)||"number"==typeof w||"boolean"==typeof w||"symbol"==typeof w||"bigint"==typeof w||n.isBuffer(A)){if(u){var _=S?r:u(r,d.encoder,j,"key",m);if("comma"===i&&S){for(var R=l.call(String(A),","),F="",N=0;N<R.length;++N)F+=(0===N?"":",")+v(u(R[N],d.encoder,j,"value",m));return[v(_)+"="+F]}return[v(_)+"="+v(u(A,d.encoder,j,"value",m))]}return[v(r)+"="+v(String(A))]}var I,D=[];if(void 0===A)return D;if("comma"===i&&p(A))I=[{value:A.length>0?A.join(",")||null:void 0}];else if(p(s))I=s;else{var M=Object.keys(A);I=y?M.sort(y):M}for(var C=0;C<I.length;++C){var U=I[C],T="object"==typeof U&&void 0!==U.value?U.value:A[U];if(!c||null!==T){var W=p(A)?"function"==typeof i?i(r,U):r:r+(h?"."+U:"["+U+"]");O.set(e,x);var L=o();L.set(g,O),f(D,t(T,W,i,a,c,u,s,y,h,b,m,v,S,j,L))}}return D};t.exports=function(t,e){var r,n=t,l=function(t){if(!t)return d;if(null!==t.encoder&&void 0!==t.encoder&&"function"!=typeof t.encoder)throw new TypeError("Encoder has to be a function.");var e=t.charset||d.charset;if(void 0!==t.charset&&"utf-8"!==t.charset&&"iso-8859-1"!==t.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");var r=i.default;if(void 0!==t.format){if(!a.call(i.formatters,t.format))throw new TypeError("Unknown format option provided.");r=t.format}var o=i.formatters[r],n=d.filter;return("function"==typeof t.filter||p(t.filter))&&(n=t.filter),{addQueryPrefix:"boolean"==typeof t.addQueryPrefix?t.addQueryPrefix:d.addQueryPrefix,allowDots:void 0===t.allowDots?d.allowDots:!!t.allowDots,charset:e,charsetSentinel:"boolean"==typeof t.charsetSentinel?t.charsetSentinel:d.charsetSentinel,delimiter:void 0===t.delimiter?d.delimiter:t.delimiter,encode:"boolean"==typeof t.encode?t.encode:d.encode,encoder:"function"==typeof t.encoder?t.encoder:d.encoder,encodeValuesOnly:"boolean"==typeof t.encodeValuesOnly?t.encodeValuesOnly:d.encodeValuesOnly,filter:n,format:r,formatter:o,serializeDate:"function"==typeof t.serializeDate?t.serializeDate:d.serializeDate,skipNulls:"boolean"==typeof t.skipNulls?t.skipNulls:d.skipNulls,sort:"function"==typeof t.sort?t.sort:null,strictNullHandling:"boolean"==typeof t.strictNullHandling?t.strictNullHandling:d.strictNullHandling}}(e);"function"==typeof l.filter?n=(0,l.filter)("",n):p(l.filter)&&(r=l.filter);var u,s=[];if("object"!=typeof n||null===n)return"";u=e&&e.arrayFormat in c?e.arrayFormat:e&&"indices"in e?e.indices?"indices":"repeat":"indices";var y=c[u];r||(r=Object.keys(n)),l.sort&&r.sort(l.sort);for(var g=o(),b=0;b<r.length;++b){var m=r[b];l.skipNulls&&null===n[m]||f(s,h(n[m],m,y,l.strictNullHandling,l.skipNulls,l.encode?l.encoder:null,l.filter,l.sort,l.allowDots,l.serializeDate,l.format,l.formatter,l.encodeValuesOnly,l.charset,g))}var v=s.join(l.delimiter),S=!0===l.addQueryPrefix?"?":"";return l.charsetSentinel&&("iso-8859-1"===l.charset?S+="utf8=%26%2310003%3B&":S+="utf8=%E2%9C%93&"),v.length>0?S+v:""}},769:(t,e,r)=>{"use strict";var o=r(798),n=Object.prototype.hasOwnProperty,i=Array.isArray,a=function(){for(var t=[],e=0;e<256;++e)t.push("%"+((e<16?"0":"")+e.toString(16)).toUpperCase());return t}(),c=function(t,e){for(var r=e&&e.plainObjects?Object.create(null):{},o=0;o<t.length;++o)void 0!==t[o]&&(r[o]=t[o]);return r};t.exports={arrayToObject:c,assign:function(t,e){return Object.keys(e).reduce((function(t,r){return t[r]=e[r],t}),t)},combine:function(t,e){return[].concat(t,e)},compact:function(t){for(var e=[{obj:{o:t},prop:"o"}],r=[],o=0;o<e.length;++o)for(var n=e[o],a=n.obj[n.prop],c=Object.keys(a),p=0;p<c.length;++p){var l=c[p],u=a[l];"object"==typeof u&&null!==u&&-1===r.indexOf(u)&&(e.push({obj:a,prop:l}),r.push(u))}return function(t){for(;t.length>1;){var e=t.pop(),r=e.obj[e.prop];if(i(r)){for(var o=[],n=0;n<r.length;++n)void 0!==r[n]&&o.push(r[n]);e.obj[e.prop]=o}}}(e),t},decode:function(t,e,r){var o=t.replace(/\+/g," ");if("iso-8859-1"===r)return o.replace(/%[0-9a-f]{2}/gi,unescape);try{return decodeURIComponent(o)}catch(t){return o}},encode:function(t,e,r,n,i){if(0===t.length)return t;var c=t;if("symbol"==typeof t?c=Symbol.prototype.toString.call(t):"string"!=typeof t&&(c=String(t)),"iso-8859-1"===r)return escape(c).replace(/%u[0-9a-f]{4}/gi,(function(t){return"%26%23"+parseInt(t.slice(2),16)+"%3B"}));for(var p="",l=0;l<c.length;++l){var u=c.charCodeAt(l);45===u||46===u||95===u||126===u||u>=48&&u<=57||u>=65&&u<=90||u>=97&&u<=122||i===o.RFC1738&&(40===u||41===u)?p+=c.charAt(l):u<128?p+=a[u]:u<2048?p+=a[192|u>>6]+a[128|63&u]:u<55296||u>=57344?p+=a[224|u>>12]+a[128|u>>6&63]+a[128|63&u]:(l+=1,u=65536+((1023&u)<<10|1023&c.charCodeAt(l)),p+=a[240|u>>18]+a[128|u>>12&63]+a[128|u>>6&63]+a[128|63&u])}return p},isBuffer:function(t){return!(!t||"object"!=typeof t)&&!!(t.constructor&&t.constructor.isBuffer&&t.constructor.isBuffer(t))},isRegExp:function(t){return"[object RegExp]"===Object.prototype.toString.call(t)},maybeMap:function(t,e){if(i(t)){for(var r=[],o=0;o<t.length;o+=1)r.push(e(t[o]));return r}return e(t)},merge:function t(e,r,o){if(!r)return e;if("object"!=typeof r){if(i(e))e.push(r);else{if(!e||"object"!=typeof e)return[e,r];(o&&(o.plainObjects||o.allowPrototypes)||!n.call(Object.prototype,r))&&(e[r]=!0)}return e}if(!e||"object"!=typeof e)return[e].concat(r);var a=e;return i(e)&&!i(r)&&(a=c(e,o)),i(e)&&i(r)?(r.forEach((function(r,i){if(n.call(e,i)){var a=e[i];a&&"object"==typeof a&&r&&"object"==typeof r?e[i]=t(a,r,o):e.push(r)}else e[i]=r})),e):Object.keys(r).reduce((function(e,i){var a=r[i];return n.call(e,i)?e[i]=t(e[i],a,o):e[i]=a,e}),a)}}},478:(t,e,r)=>{"use strict";var o=r(210),n=r(924),i=r(631),a=o("%TypeError%"),c=o("%WeakMap%",!0),p=o("%Map%",!0),l=n("WeakMap.prototype.get",!0),u=n("WeakMap.prototype.set",!0),f=n("WeakMap.prototype.has",!0),s=n("Map.prototype.get",!0),y=n("Map.prototype.set",!0),d=n("Map.prototype.has",!0),g=function(t,e){for(var r,o=t;null!==(r=o.next);o=r)if(r.key===e)return o.next=r.next,r.next=t.next,t.next=r,r};t.exports=function(){var t,e,r,o={assert:function(t){if(!o.has(t))throw new a("Side channel does not contain "+i(t))},get:function(o){if(c&&o&&("object"==typeof o||"function"==typeof o)){if(t)return l(t,o)}else if(p){if(e)return s(e,o)}else if(r)return function(t,e){var r=g(t,e);return r&&r.value}(r,o)},has:function(o){if(c&&o&&("object"==typeof o||"function"==typeof o)){if(t)return f(t,o)}else if(p){if(e)return d(e,o)}else if(r)return function(t,e){return!!g(t,e)}(r,o);return!1},set:function(o,n){c&&o&&("object"==typeof o||"function"==typeof o)?(t||(t=new c),u(t,o,n)):p?(e||(e=new p),y(e,o,n)):(r||(r={key:{},next:null}),function(t,e,r){var o=g(t,e);o?o.value=r:t.next={key:e,next:t.next,value:r}}(r,o,n))}};return o}},654:()=>{}},e={};function r(o){var n=e[o];if(void 0!==n)return n.exports;var i=e[o]={exports:{}};return t[o](i,i.exports,r),i.exports}r.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return r.d(e,{a:e}),e},r.d=(t,e)=>{for(var o in e)r.o(e,o)&&!r.o(t,o)&&Object.defineProperty(t,o,{enumerable:!0,get:e[o]})},r.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var o={};return(()=>{"use strict";r.r(o),r.d(o,{default:()=>a});var t=r(129),e=r.n(t);function n(t,e,r,o,n,i,a,c){var p,l="function"==typeof t?t.options:t;if(e&&(l.render=e,l.staticRenderFns=r,l._compiled=!0),o&&(l.functional=!0),i&&(l._scopeId="data-v-"+i),a?(p=function(t){(t=t||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(t=__VUE_SSR_CONTEXT__),n&&n.call(this,t),t&&t._registeredComponents&&t._registeredComponents.add(a)},l._ssrRegister=p):n&&(p=c?function(){n.call(this,(l.functional?this.parent:this).$root.$options.shadowRoot)}:n),p)if(l.functional){l._injectStyles=p;var u=l.render;l.render=function(t,e){return p.call(e),u(t,e)}}else{var f=l.beforeCreate;l.beforeCreate=f?[].concat(f,p):[p]}return{exports:t,options:l}}var i=n({props:{columnsLength:{type:Number,required:!0}},data:()=>({randNum:Math.floor(10*Math.random())+1})},(function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("tr",[r("td",{class:["vst-loading-row","vst-loading-row-"+t.randNum],attrs:{colspan:t.columnsLength}},[r("div")])])}),[],!1,null,null,null);const a=n({components:{LoadingRow:i.exports},props:{columns:{type:Array,required:!0},source:{type:[String,Function],required:!0},perPage:{type:Number,default:25}},data:()=>({page:1,rows:[],syncState:"initial",orders:{}}),watch:{page:"fetchData",orders:"refetch",perPage:"refetch"},created(){this.fetchData()},methods:{reload(){this.fetchData(this.page)},async fetchData(t=1){const r={per_page:this.perPage,page:t},o=Object.keys(this.orders);let n;if(o.length&&(r.order=o.map((t=>({field:t,direction:this.orders[t]})))),this.syncState="syncing",this.rows=[],"string"==typeof this.source){const t=await fetch(`${this.source}?${e().stringify(r,{arrayFormat:"brackets"})}`);n=await t.json()}else n=await this.source(r);this.rows=n,this.syncState="fetched"},onOrderClick(t){"asc"===this.orders[t]?this.orders={[t]:"desc"}:"desc"===this.orders[t]?this.orders={}:this.orders={[t]:"asc"}},refetch(){1===this.page?this.fetchData(1):this.page=1}}},(function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("table",{staticClass:"vst"},[t.columns.length?r("thead",[r("tr",t._l(t.columns,(function(e){return r("th",{key:e.key,class:["vst-th",{"vst-orderable":e.orderable}],on:{click:function(r){r.preventDefault(),e.orderable&&t.onOrderClick(e.key)}}},[t._t("head:"+e.key,(function(){return[t._v("\n "+t._s(e.title)+"\n ")]}),{column:e}),t._v(" "),e.orderable?r("a",{class:"vst-orderable-toggle "+(t.orders[e.key]||""),attrs:{href:"#"}}):t._e()],2)})),0)]):t._e(),t._v(" "),r("tbody",[t._l(t.rows,(function(e,o){return t._t("row",(function(){return[r("tr",{key:e.id||o},t._l(t.columns,(function(n){return r("td",{key:n.key},[t._t("cell:"+n.key,(function(){return[t._v("\n "+t._s(e[n.key])+"\n ")]}),{row:e,value:e[n.key],column:n,index:o})],2)})),0)]}),{row:e,index:o,columns:t.columns})})),t._v(" "),"fetched"===t.syncState&&0===t.rows.length?t._t("row:empty",(function(){return[r("tr",[r("td",{attrs:{colspan:t.columns.length}},[t._v("\n No records found\n ")])])]})):t._e(),t._v(" "),"syncing"===t.syncState?t._t("row:loading",(function(){return t._l(t.perPage,(function(e,o){return r("LoadingRow",{key:"loadingRow"+o,attrs:{"columns-length":t.columns.length}})}))})):t._e()],2),t._v(" "),r("tfoot",[r("tr",[r("td",{attrs:{colspan:t.columns.length}},[t._t("pagination",(function(){return[t.page>1||t.rows.length===t.perPage?r("ul",{staticClass:"vst-pagination mt-3"},[r("li",{class:["vst-page-item",{disabled:1===t.page}]},[r("a",{staticClass:"vst-page-link",on:{click:function(e){e.preventDefault(),t.page-=1}}},[t._v("←")])]),t._v(" "),r("li",{class:["vst-page-item",{disabled:t.rows.length<t.perPage}]},[r("a",{staticClass:"vst-page-link",on:{click:function(e){e.preventDefault(),t.page+=1}}},[t._v("→")])])]):t._e()]}),{page:t.page,rows:t.rows})],2)])])])}),[],!1,null,null,null).exports})(),o})()}));
@@ -1,22 +0,0 @@
1
- <template>
2
- <tr>
3
- <td
4
- :colspan="columnsLength"
5
- :class="['vst-loading-row', `vst-loading-row-${randNum}`]">
6
- <div />
7
- </td>
8
- </tr>
9
- </template>
10
-
11
- <script>
12
- export default {
13
- props: {
14
- columnsLength: { type: Number, required: true },
15
- },
16
- data() {
17
- return {
18
- randNum: Math.floor(Math.random() * 10) + 1,
19
- }
20
- },
21
- }
22
- </script>
@@ -1,151 +0,0 @@
1
- <template>
2
- <table class="vst">
3
- <thead v-if="columns.length">
4
- <tr>
5
- <th
6
- v-for="column in columns"
7
- :key="column.key"
8
- :class="['vst-th', { 'vst-orderable': column.orderable }]"
9
- @click.prevent="column.orderable ? onOrderClick(column.key) : null">
10
- <slot
11
- :name="`head:${column.key}`"
12
- :column="column">
13
- {{ column.title }}
14
- </slot>
15
- <a
16
- v-if="column.orderable"
17
- href="#"
18
- :class="`vst-orderable-toggle ${orders[column.key] || ''}`" />
19
- </th>
20
- </tr>
21
- </thead>
22
- <tbody>
23
- <slot
24
- v-for="(row, i) in rows"
25
- name="row"
26
- :row="row"
27
- :index="i"
28
- :columns="columns">
29
- <tr :key="row.id || i">
30
- <td
31
- v-for="column in columns"
32
- :key="column.key">
33
- <slot
34
- :name="`cell:${column.key}`"
35
- :row="row"
36
- :value="row[column.key]"
37
- :column="column"
38
- :index="i">
39
- {{ row[column.key] }}
40
- </slot>
41
- </td>
42
- </tr>
43
- </slot>
44
-
45
- <slot v-if="syncState === 'fetched' && rows.length === 0" name="row:empty">
46
- <tr>
47
- <td :colspan="columns.length">
48
- No records found
49
- </td>
50
- </tr>
51
- </slot>
52
-
53
- <slot v-if="syncState === 'syncing'" name="row:loading">
54
- <LoadingRow
55
- v-for="(row, i) in perPage"
56
- :key="`loadingRow${i}`"
57
- :columns-length="columns.length" />
58
- </slot>
59
- </tbody>
60
- <tfoot>
61
- <tr>
62
- <td :colspan="columns.length">
63
- <slot name="pagination" :page="page" :rows="rows">
64
- <ul v-if="page > 1 || rows.length === perPage" class="vst-pagination mt-3">
65
- <li :class="['vst-page-item', { disabled: page === 1 }]">
66
- <a class="vst-page-link" @click.prevent="page -= 1">←</a>
67
- </li>
68
-
69
- <li :class="['vst-page-item', { disabled: rows.length < perPage }]">
70
- <a class="vst-page-link" @click.prevent="page += 1">→</a>
71
- </li>
72
- </ul>
73
- </slot>
74
- </td>
75
- </tr>
76
- </tfoot>
77
- </table>
78
- </template>
79
-
80
- <script>
81
- import qs from 'qs'
82
- import LoadingRow from './loading_row.vue'
83
-
84
- export default {
85
- components: { LoadingRow },
86
- props: {
87
- columns: { type: Array, required: true },
88
- source: { type: [String, Function], required: true },
89
- perPage: { type: Number, default: 25 },
90
- },
91
- data() {
92
- return {
93
- page: 1,
94
- rows: [],
95
- syncState: 'initial',
96
- orders: {},
97
- }
98
- },
99
- watch: {
100
- page: 'fetchData',
101
- orders: 'refetch',
102
- perPage: 'refetch',
103
- },
104
- created() {
105
- this.fetchData()
106
- },
107
- methods: {
108
- reload() {
109
- this.fetchData(this.page)
110
- },
111
- async fetchData(page = 1) {
112
- const params = { per_page: this.perPage, page }
113
-
114
- const orderKeys = Object.keys(this.orders)
115
- if (orderKeys.length) {
116
- params.order = orderKeys.map((key) => ({ field: key, direction: this.orders[key] }))
117
- }
118
-
119
- this.syncState = 'syncing'
120
- this.rows = []
121
-
122
- let data
123
- if (typeof this.source === 'string') {
124
- const response = await fetch(`${this.source}?${qs.stringify(params, { arrayFormat: 'brackets' })}`)
125
- data = await response.json()
126
- } else {
127
- data = await this.source(params)
128
- }
129
-
130
- this.rows = data
131
- this.syncState = 'fetched'
132
- },
133
- onOrderClick(key) {
134
- if (this.orders[key] === 'asc') {
135
- this.orders = { [key]: 'desc' }
136
- } else if (this.orders[key] === 'desc') {
137
- this.orders = {}
138
- } else {
139
- this.orders = { [key]: 'asc' }
140
- }
141
- },
142
- refetch() {
143
- if (this.page === 1) {
144
- this.fetchData(1)
145
- } else {
146
- this.page = 1
147
- }
148
- },
149
- },
150
- }
151
- </script>
package/src/js/index.js DELETED
@@ -1,5 +0,0 @@
1
- import '../stylesheets/index.scss'
2
-
3
- import VueSlimTable from './components/table.vue'
4
-
5
- export default VueSlimTable
@@ -1,97 +0,0 @@
1
- @keyframes moving-gradient {
2
- 0% { background-position: -250px 0; }
3
- 100% { background-position: 250px 0; }
4
- }
5
-
6
- .vst {
7
- &-th {
8
- line-height: 20px;
9
- }
10
-
11
- &-orderable:hover {
12
- cursor: pointer;
13
-
14
- .vst-orderable-toggle {
15
- color: #555 !important;
16
- }
17
- }
18
-
19
- &-orderable-toggle {
20
- font-size: 20px;
21
- float: right;
22
- color: #ccc !important;
23
-
24
- &:after {
25
- content: " \2194";
26
- display: inline-block;
27
- transform: rotate(-90deg);
28
- }
29
-
30
- &.desc:after {
31
- content: " \2191";
32
- transform: rotate(0);
33
- }
34
-
35
- &.asc:after {
36
- content: " \2193";
37
- transform: rotate(0);
38
- }
39
- }
40
-
41
- &-loading-row div {
42
- height: 20px;
43
- background: linear-gradient(to right, #eee 20%, #ddd 50%, #eee 80%);
44
- background-size: 500px 20px;
45
- animation-name: moving-gradient;
46
- animation-duration: 1s;
47
- animation-iteration-count: infinite;
48
- animation-timing-function: linear;
49
- animation-fill-mode: forwards;
50
- }
51
-
52
- tr td.vst-loading-row {
53
- @for $i from 1 through 10 {
54
- &-#{$i} div {
55
- animation-delay: #{($i - 11)*100}ms;
56
- }
57
- }
58
- }
59
-
60
- &-pagination {
61
- display: flex;
62
- padding-left: 0;
63
- list-style: none;
64
- border-radius: 0.25rem;
65
-
66
- a {
67
- position: relative;
68
- display: block;
69
- padding: 8px 12px;
70
- padding: 0.5rem 0.75rem;
71
- margin-left: -1px;
72
- line-height: 1.25;
73
- color: #007bff;
74
- background-color: #fff;
75
- border: 1px solid #dee2e6;
76
-
77
- &:hover {
78
- z-index: 2;
79
- color: #0056b3;
80
- text-decoration: none;
81
- background-color: #e9ecef;
82
- border-color: #dee2e6;
83
- }
84
- }
85
- }
86
-
87
- &-page-item.disabled .vst-page-link {
88
- pointer-events: none;
89
- color: #6c757d;
90
- cursor: auto;
91
- background-color: #fff;
92
- }
93
-
94
- &-page-item .vst-page-link {
95
- cursor: pointer;
96
- }
97
- }
package/webpack.config.js DELETED
@@ -1,48 +0,0 @@
1
- const path = require('path');
2
- const { VueLoaderPlugin } = require('vue-loader');
3
- const TerserPlugin = require('terser-webpack-plugin');
4
- const MiniCssExtractPlugin = require('mini-css-extract-plugin');
5
-
6
- module.exports = {
7
- mode: 'production',
8
- entry: {
9
- bundle: './src/js/index.js'
10
- },
11
- output: {
12
- filename: '[name].js',
13
- library: 'VueSlimTable',
14
- libraryTarget: 'umd'
15
- },
16
- module: {
17
- rules: [
18
- {
19
- test: /\.vue$/,
20
- loader: 'vue-loader'
21
- },
22
- {
23
- test: /\.js$/,
24
- loader: 'babel-loader',
25
- include: __dirname,
26
- exclude: /node_modules/
27
- },
28
- {
29
- test: /\.scss$/,
30
- use: [
31
- process.env.NODE_ENV === 'production' ? MiniCssExtractPlugin.loader : 'style-loader',
32
- 'css-loader',
33
- 'sass-loader'
34
- ],
35
- }
36
- ]
37
- },
38
- plugins: [
39
- new VueLoaderPlugin(),
40
- new MiniCssExtractPlugin({
41
- filename: '[name].css'
42
- })
43
- ],
44
- optimization: {
45
- minimize: true,
46
- minimizer: [new TerserPlugin()]
47
- }
48
- };