vue-slim-tables 0.3.1 → 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
@@ -42,11 +42,10 @@ 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 |
49
50
  | #cell:${column.key} | { row, index, column, value } | Rewrite cell with custom html |
50
51
  | #pagination | { page, rows } | Rewrite pagination with your own implementation |
51
- | #thead:before | { columns } | Render row before base header |
52
- | #thead:after | { columns } | Render row after base header |
@@ -10,10 +10,10 @@ interface TableOrders {
10
10
  interface TableFetchParams {
11
11
  per_page: number;
12
12
  page: number;
13
- order?: Array<{
14
- field: string;
15
- direction: 'asc' | 'desc';
16
- }>;
13
+ orders?: TableOrders;
14
+ }
15
+ interface TableRow {
16
+ [key: string]: any;
17
17
  }
18
18
  declare const _sfc_main: import("vue").DefineComponent<{
19
19
  columns: {
@@ -32,11 +32,11 @@ declare const _sfc_main: import("vue").DefineComponent<{
32
32
  }, {
33
33
  props: {
34
34
  columns: Array<TableColumn>;
35
- source: string | ((_: TableFetchParams) => Promise<Array<unknown>> | Array<unknown>);
35
+ source: string | ((_: TableFetchParams) => Promise<TableRow[]> | TableRow[]);
36
36
  perPage: number;
37
37
  };
38
38
  orders: ShallowRef<TableOrders>;
39
- fetchData: (params: TableFetchParams) => Promise<any>;
39
+ loadItems: (params: TableFetchParams) => Promise<TableRow[]>;
40
40
  onOrderClick: (key: string) => void;
41
41
  page: import("vue").Ref<number>;
42
42
  isSyncing: import("vue").ComputedRef<boolean>;
@@ -46,9 +46,7 @@ declare const _sfc_main: import("vue").DefineComponent<{
46
46
  reload: () => void;
47
47
  refetch: () => void;
48
48
  rows: {
49
- value: {
50
- [x: string]: any;
51
- }[];
49
+ value: TableRow[];
52
50
  };
53
51
  LoadingRow: import("vue").DefineComponent<{
54
52
  columnsLength: {
@@ -1,2 +1,2 @@
1
- declare const _default: (obj: any) => any;
1
+ declare const _default: (obj: any) => string;
2
2
  export default _default;
@@ -1,15 +1,14 @@
1
- interface UseFiltetableArgs {
2
- initialFilters: {
3
- [key: string]: any;
4
- };
5
- loadItems: any;
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[]>;
6
7
  }
7
- declare const useFilterable: ({ initialFilters, loadItems }: UseFiltetableArgs) => {
8
+ declare const useFilterable: <Filters, Item>({ initialFilters, loadItems }: UseFiltetableArgs<Filters, Item>) => {
8
9
  page: import("vue").Ref<number>;
9
10
  items: {
10
- value: {
11
- [x: string]: any;
12
- }[];
11
+ value: Item[];
13
12
  };
14
13
  syncState: import("vue").Ref<string>;
15
14
  nextPage: () => void;
package/dist/vst.es.js CHANGED
@@ -14,7 +14,7 @@ var __spreadValues = (a, b) => {
14
14
  }
15
15
  return a;
16
16
  };
17
- import { defineComponent, openBlock, createElementBlock, createElementVNode, normalizeClass, computed, ref, reactive, isReactive, watch, shallowRef, renderSlot, Fragment, renderList, createTextVNode, toDisplayString, unref, createCommentVNode, createBlock, withModifiers } from "vue";
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
18
  var index = "";
19
19
  const _hoisted_1$1 = ["colspan"];
20
20
  const _hoisted_2$1 = /* @__PURE__ */ createElementVNode("div", null, null, -1);
@@ -47,13 +47,13 @@ const useFilterable = ({ initialFilters, loadItems }) => {
47
47
  const page = ref(1);
48
48
  const items = reactive({ value: [] });
49
49
  const syncState = ref(SYNC_STATES.INITIAL);
50
- const reactiveInitialFilters = isReactive(initialFilters) ? initialFilters : reactive({ value: initialFilters });
51
- const filters = computed(() => __spreadValues({
50
+ const filters = reactive({ value: initialFilters });
51
+ const combinedFilters = computed(() => __spreadValues({
52
52
  page: page.value
53
- }, reactiveInitialFilters.value));
53
+ }, filters.value));
54
54
  const load = () => {
55
55
  syncState.value = SYNC_STATES.SYNCING;
56
- return loadItems(filters.value).then((res) => {
56
+ return loadItems(combinedFilters.value).then((res) => {
57
57
  items.value = res;
58
58
  syncState.value = SYNC_STATES.SYNCED;
59
59
  }).catch(() => {
@@ -61,8 +61,8 @@ const useFilterable = ({ initialFilters, loadItems }) => {
61
61
  syncState.value = SYNC_STATES.FAILED;
62
62
  });
63
63
  };
64
- watch(filters, load);
65
64
  load();
65
+ watch(combinedFilters, load);
66
66
  return {
67
67
  page,
68
68
  items,
@@ -104,11 +104,10 @@ const stringify = (obj, parentPrefix) => (outputArray, [key, val]) => {
104
104
  var toQueryString = (obj) => Object.entries(obj).reduce(stringify(), []).join("&");
105
105
  const _hoisted_1 = { class: "vst" };
106
106
  const _hoisted_2 = { key: 0 };
107
- const _hoisted_3 = ["onClick"];
108
- const _hoisted_4 = { key: 0 };
107
+ const _hoisted_3 = { key: 0 };
108
+ const _hoisted_4 = ["colspan"];
109
109
  const _hoisted_5 = ["colspan"];
110
- const _hoisted_6 = ["colspan"];
111
- const _hoisted_7 = {
110
+ const _hoisted_6 = {
112
111
  key: 0,
113
112
  class: "vst-pagination mt-3"
114
113
  };
@@ -121,7 +120,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
121
120
  setup(__props, { expose }) {
122
121
  const props = __props;
123
122
  const orders = shallowRef({});
124
- const fetchData = async (params) => {
123
+ const loadItems = async (params) => {
125
124
  let data;
126
125
  if (typeof props.source === "string") {
127
126
  const response = await fetch(`${props.source}?${toQueryString(params)}`);
@@ -150,8 +149,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
150
149
  refetch,
151
150
  items: rows
152
151
  } = useFilterable({
153
- initialFilters: { per_page: props.perPage, orders },
154
- loadItems: fetchData
152
+ initialFilters: { per_page: props.perPage, orders: orders.value },
153
+ loadItems
155
154
  });
156
155
  expose({
157
156
  refetch,
@@ -161,33 +160,34 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
161
160
  return (_ctx, _cache) => {
162
161
  return openBlock(), createElementBlock("table", _hoisted_1, [
163
162
  __props.columns.length ? (openBlock(), createElementBlock("thead", _hoisted_2, [
164
- renderSlot(_ctx.$slots, "thead:before", { columns: __props.columns }),
165
- createElementVNode("tr", null, [
166
- (openBlock(true), createElementBlock(Fragment, null, renderList(__props.columns, (column) => {
167
- return openBlock(), createElementBlock("th", {
168
- key: column.key,
169
- class: normalizeClass(["vst-th", { "vst-orderable": column.orderable }]),
170
- onClick: ($event) => column.orderable ? onOrderClick(column.key) : null
171
- }, [
172
- column.orderable ? (openBlock(), createElementBlock("div", _hoisted_4, [
173
- renderSlot(_ctx.$slots, `head:${column.key}`, { column }, () => [
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
+ }, () => [
174
185
  createTextVNode(toDisplayString(column.title), 1)
175
- ]),
176
- column.orderable ? (openBlock(), createElementBlock("a", {
177
- key: 0,
178
- href: "#",
179
- class: normalizeClass(["vst-orderable-toggle", unref(orders)[column.key]])
180
- }, null, 2)) : createCommentVNode("", true)
181
- ])) : renderSlot(_ctx.$slots, `head:${column.key}`, {
182
- key: 1,
183
- column
184
- }, () => [
185
- createTextVNode(toDisplayString(column.title), 1)
186
- ])
187
- ], 10, _hoisted_3);
188
- }), 128))
189
- ]),
190
- renderSlot(_ctx.$slots, "thead:after", { columns: __props.columns })
186
+ ])
187
+ ], 16);
188
+ }), 128))
189
+ ])
190
+ ])
191
191
  ])) : createCommentVNode("", true),
192
192
  createElementVNode("tbody", null, [
193
193
  unref(isSyncing) ? renderSlot(_ctx.$slots, "row:loading", { key: 0 }, () => [
@@ -201,7 +201,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
201
201
  createElementVNode("tr", null, [
202
202
  createElementVNode("td", {
203
203
  colspan: __props.columns.length
204
- }, " No records found ", 8, _hoisted_5)
204
+ }, " No records found ", 8, _hoisted_4)
205
205
  ])
206
206
  ]) : unref(isSynced) && unref(rows).value.length ? (openBlock(true), createElementBlock(Fragment, { key: 2 }, renderList(unref(rows).value, (row, i) => {
207
207
  return renderSlot(_ctx.$slots, "row", {
@@ -239,7 +239,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
239
239
  page: unref(page),
240
240
  rows: unref(rows).value
241
241
  }, () => [
242
- unref(page) > 1 || unref(rows).value.length === __props.perPage || unref(isSyncing) ? (openBlock(), createElementBlock("ul", _hoisted_7, [
242
+ unref(page) > 1 || unref(rows).value.length === __props.perPage || unref(isSyncing) ? (openBlock(), createElementBlock("ul", _hoisted_6, [
243
243
  createElementVNode("li", {
244
244
  class: normalizeClass(["vst-page-item", { disabled: unref(page) === 1 || unref(isSyncing) }])
245
245
  }, [
@@ -260,7 +260,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
260
260
  ], 2)
261
261
  ])) : createCommentVNode("", true)
262
262
  ])
263
- ], 8, _hoisted_6)
263
+ ], 8, _hoisted_5)
264
264
  ])
265
265
  ])
266
266
  ]);
@@ -1 +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, isReactive,\n} from 'vue'\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ninterface Item { [key: string]: any }\n\ninterface UseFiltetableArgs {\n initialFilters: {\n [key: string]: any // eslint-disable-line @typescript-eslint/no-explicit-any\n },\n loadItems: any // eslint-disable-line @typescript-eslint/no-explicit-any\n}\n\nconst SYNC_STATES = {\n INITIAL: 'initial',\n SYNCING: 'syncing',\n SYNCED: 'synced',\n FAILED: 'failed',\n}\n\nconst useFilterable = ({ initialFilters, loadItems }: UseFiltetableArgs) => {\n const page = ref(1)\n const items = reactive({ value: [] as Item[] })\n const syncState = ref(SYNC_STATES.INITIAL)\n const reactiveInitialFilters = isReactive(initialFilters) ? initialFilters : reactive({ value: initialFilters })\n\n const filters = computed(() => ({\n page: page.value,\n ...reactiveInitialFilters.value,\n }))\n\n const load = () => {\n syncState.value = SYNC_STATES.SYNCING\n\n return loadItems(filters.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\n watch(filters, load)\n\n 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) => (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) => Object.entries(obj).reduce(stringify(obj), []).join('&')\n","<template>\n <table class=\"vst\">\n <thead v-if=\"columns.length\">\n <slot name=\"thead:before\" :columns=\"columns\" />\n <tr>\n <th\n v-for=\"column in columns\"\n :key=\"column.key\"\n :class=\"['vst-th', { 'vst-orderable': column.orderable }]\"\n @click=\"column.orderable ? onOrderClick(column.key) : null\">\n <div v-if=\"column.orderable\">\n <slot\n :name=\"`head:${column.key}`\"\n :column=\"column\">\n {{ column.title }}\n </slot>\n\n <a\n v-if=\"column.orderable\"\n href=\"#\"\n :class=\"['vst-orderable-toggle', orders[column.key]]\" />\n </div>\n\n <slot\n v-else\n :name=\"`head:${column.key}`\"\n :column=\"column\">\n {{ column.title }}\n </slot>\n </th>\n </tr>\n <slot name=\"thead:after\" :columns=\"columns\" />\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 order?: Array<{\n field: string\n direction: 'asc' | 'desc'\n }>\n}\n\ninterface TableProps {\n columns: Array<TableColumn>\n source: string | ((_: TableFetchParams) => Promise<Array<unknown>> | Array<unknown>)\n perPage?: number\n}\n\nconst props = withDefaults(defineProps<TableProps>(), {\n perPage: 25,\n})\n\nconst orders: ShallowRef<TableOrders> = shallowRef({})\n\nconst fetchData = async (params: TableFetchParams) => {\n let data\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)\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({\n initialFilters: { per_page: props.perPage, orders },\n loadItems: fetchData,\n})\n\ndefineExpose({\n refetch,\n reload,\n rows,\n})\n</script>\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;UAeM,UAAU,KAAK,MAAM,KAAK,WAAW,EAAE,IAAI;;;;;;;;;;;ACDjD,MAAM,cAAc;AAAA,EAClB,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AACV;AAEA,MAAM,gBAAgB,CAAC,EAAE,gBAAgB,gBAAmC;QACpE,OAAO,IAAI,CAAC;QACZ,QAAQ,SAAS,EAAE,OAAO,IAAc;QACxC,YAAY,IAAI,YAAY,OAAO;QACnC,yBAAyB,WAAW,cAAc,IAAI,iBAAiB,SAAS,EAAE,OAAO,gBAAgB;QAEzG,UAAU,SAAS;IACvB,MAAM,KAAK;AAAA,KACR,uBAAuB,MAC1B;QAEI,OAAO,MAAM;cACP,QAAQ,YAAY;WAEvB,UAAU,QAAQ,KAAK,EAC3B,KAAK,CAAC,QAAgB;YACf,QAAQ;gBACJ,QAAQ,YAAY;AAAA,KAC/B,EACA,MAAM,MAAM;YACL,QAAQ;gBACJ,QAAQ,YAAY;AAAA,KAC/B;AAAA;QAGC,SAAS,IAAI;;SAIZ;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;AC1EA,MAAM,YAAY,CAAC,KAAK,iBAAiB,CAAC,aAAa,CAAC,KAAK,SAAS;MAChE,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,QAAQ,OAAO,QAAQ,GAAG,EAAE,OAAO,UAAa,GAAG,EAAE,EAAE,KAAK,GAAG;;;;;;;;;;;;;;;;;;;UCqHzE,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,cAAc;AAAA,MAChB,gBAAgB,EAAE,UAAU,MAAM,SAAS;MAC3C,WAAW;AAAA,KACZ;WAEY;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,KACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/vst.umd.js CHANGED
@@ -1,2 +1,2 @@
1
- var M=Object.defineProperty;var $=Object.getOwnPropertySymbols;var x=Object.prototype.hasOwnProperty,G=Object.prototype.propertyIsEnumerable;var C=(e,s,c)=>s in e?M(e,s,{enumerable:!0,configurable:!0,writable:!0,value:c}):e[s]=c,V=(e,s)=>{for(var c in s||(s={}))x.call(s,c)&&C(e,c,s[c]);if($)for(var c of $(s))G.call(s,c)&&C(e,c,s[c]);return e};(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 s="";const c=["colspan"],b=[e.createElementVNode("div",null,null,-1)],I=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)]))}}),k={INITIAL:"initial",SYNCING:"syncing",SYNCED:"synced",FAILED:"failed"},u=({initialFilters:n,loadItems:m})=>{const l=e.ref(1),a=e.reactive({value:[]}),r=e.ref(k.INITIAL),h=e.isReactive(n)?n:e.reactive({value:n}),d=e.computed(()=>V({page:l.value},h.value)),i=()=>(r.value=k.SYNCING,m(d.value).then(y=>{a.value=y,r.value=k.SYNCED}).catch(()=>{a.value=[],r.value=k.FAILED}));return e.watch(d,i),i(),{page:l,items:a,syncState:r,nextPage:()=>{l.value+=1},prevPage:()=>{l.value-=1},isSyncing:e.computed(()=>r.value===k.SYNCING),isSynced:e.computed(()=>r.value===k.SYNCED),isFailed:e.computed(()=>r.value===k.FAILED),reload:()=>{i()},refetch:()=>{l.value===1?i():l.value=1}}},E=(n,m)=>(l,[a,r])=>{if(r==null)return l;const h=encodeURIComponent(a),d=m?`${m}[${h}]`:h;return["number","string"].includes(typeof r)?(l.push(`${d}=${encodeURIComponent(r)}`),l):(l.push(Object.entries(r).reduce(E(r,d),[]).join("&")),l)};var w=n=>Object.entries(n).reduce(E(),[]).join("&");const L={class:"vst"},D={key:0},T=["onClick"],F={key:0},P=["colspan"],j=["colspan"],Y={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({}),r=async o=>{let f;return typeof l.source=="string"?f=await(await fetch(`${l.source}?${w(o)}`)).json():f=await l.source(o),f},h=o=>{a.value[o]==="asc"?a.value={[o]:"desc"}:a.value[o]==="desc"?a.value={}:a.value={[o]:"asc"}},{page:d,isSyncing:i,isSynced:y,prevPage:B,nextPage:S,reload:z,refetch:R,items:g}=u({initialFilters:{per_page:l.perPage,orders:a},loadItems:r});return m({refetch:R,reload:z,rows:g}),(o,f)=>(e.openBlock(),e.createElementBlock("table",L,[n.columns.length?(e.openBlock(),e.createElementBlock("thead",D,[e.renderSlot(o.$slots,"thead:before",{columns:n.columns}),e.createElementVNode("tr",null,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.columns,t=>(e.openBlock(),e.createElementBlock("th",{key:t.key,class:e.normalizeClass(["vst-th",{"vst-orderable":t.orderable}]),onClick:N=>t.orderable?h(t.key):null},[t.orderable?(e.openBlock(),e.createElementBlock("div",F,[e.renderSlot(o.$slots,`head:${t.key}`,{column:t},()=>[e.createTextVNode(e.toDisplayString(t.title),1)]),t.orderable?(e.openBlock(),e.createElementBlock("a",{key:0,href:"#",class:e.normalizeClass(["vst-orderable-toggle",e.unref(a)[t.key]])},null,2)):e.createCommentVNode("",!0)])):e.renderSlot(o.$slots,`head:${t.key}`,{key:1,column:t},()=>[e.createTextVNode(e.toDisplayString(t.title),1)])],10,T))),128))]),e.renderSlot(o.$slots,"thead:after",{columns:n.columns})])):e.createCommentVNode("",!0),e.createElementVNode("tbody",null,[e.unref(i)?e.renderSlot(o.$slots,"row:loading",{key:0},()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.perPage,t=>(e.openBlock(),e.createBlock(I,{key:`loadingRow${t}`,"columns-length":n.columns.length},null,8,["columns-length"]))),128))]):e.unref(y)&&e.unref(g).value.length===0?e.renderSlot(o.$slots,"row:empty",{key:1},()=>[e.createElementVNode("tr",null,[e.createElementVNode("td",{colspan:n.columns.length}," No records found ",8,P)])]):e.unref(y)&&e.unref(g).value.length?(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:2},e.renderList(e.unref(g).value,(t,N)=>e.renderSlot(o.$slots,"row",{row:t,index:N,columns:n.columns},()=>[(e.openBlock(),e.createElementBlock("tr",{key:t.id||N},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.columns,p=>(e.openBlock(),e.createElementBlock("td",{key:p.key},[e.renderSlot(o.$slots,`cell:${p.key}`,{row:t,value:t[p.key],column:p,index:N},()=>[e.createTextVNode(e.toDisplayString(t[p.key]),1)])]))),128))]))])),256)):e.createCommentVNode("",!0)]),e.createElementVNode("tfoot",null,[e.createElementVNode("tr",null,[e.createElementVNode("td",{colspan:n.columns.length},[e.renderSlot(o.$slots,"pagination",{page:e.unref(d),rows:e.unref(g).value},()=>[e.unref(d)>1||e.unref(g).value.length===n.perPage||e.unref(i)?(e.openBlock(),e.createElementBlock("ul",Y,[e.createElementVNode("li",{class:e.normalizeClass(["vst-page-item",{disabled:e.unref(d)===1||e.unref(i)}])},[e.createElementVNode("a",{class:"vst-page-link",onClick:f[0]||(f[0]=e.withModifiers((...t)=>e.unref(B)&&e.unref(B)(...t),["prevent"]))},"\u2190")],2),e.createElementVNode("li",{class:e.normalizeClass(["vst-page-item",{disabled:e.unref(g).value.length<n.perPage||e.unref(i)}])},[e.createElementVNode("a",{class:"vst-page-link",onClick:f[1]||(f[1]=e.withModifiers((...t)=>e.unref(S)&&e.unref(S)(...t),["prevent"]))},"\u2192")],2)])):e.createCommentVNode("",!0)])],8,j)])])]))}})});
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
2
  //# sourceMappingURL=vst.umd.js.map
@@ -1 +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, isReactive,\n} from 'vue'\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ninterface Item { [key: string]: any }\n\ninterface UseFiltetableArgs {\n initialFilters: {\n [key: string]: any // eslint-disable-line @typescript-eslint/no-explicit-any\n },\n loadItems: any // eslint-disable-line @typescript-eslint/no-explicit-any\n}\n\nconst SYNC_STATES = {\n INITIAL: 'initial',\n SYNCING: 'syncing',\n SYNCED: 'synced',\n FAILED: 'failed',\n}\n\nconst useFilterable = ({ initialFilters, loadItems }: UseFiltetableArgs) => {\n const page = ref(1)\n const items = reactive({ value: [] as Item[] })\n const syncState = ref(SYNC_STATES.INITIAL)\n const reactiveInitialFilters = isReactive(initialFilters) ? initialFilters : reactive({ value: initialFilters })\n\n const filters = computed(() => ({\n page: page.value,\n ...reactiveInitialFilters.value,\n }))\n\n const load = () => {\n syncState.value = SYNC_STATES.SYNCING\n\n return loadItems(filters.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\n watch(filters, load)\n\n 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) => (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) => Object.entries(obj).reduce(stringify(obj), []).join('&')\n","<template>\n <table class=\"vst\">\n <thead v-if=\"columns.length\">\n <slot name=\"thead:before\" :columns=\"columns\" />\n <tr>\n <th\n v-for=\"column in columns\"\n :key=\"column.key\"\n :class=\"['vst-th', { 'vst-orderable': column.orderable }]\"\n @click=\"column.orderable ? onOrderClick(column.key) : null\">\n <div v-if=\"column.orderable\">\n <slot\n :name=\"`head:${column.key}`\"\n :column=\"column\">\n {{ column.title }}\n </slot>\n\n <a\n v-if=\"column.orderable\"\n href=\"#\"\n :class=\"['vst-orderable-toggle', orders[column.key]]\" />\n </div>\n\n <slot\n v-else\n :name=\"`head:${column.key}`\"\n :column=\"column\">\n {{ column.title }}\n </slot>\n </th>\n </tr>\n <slot name=\"thead:after\" :columns=\"columns\" />\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 order?: Array<{\n field: string\n direction: 'asc' | 'desc'\n }>\n}\n\ninterface TableProps {\n columns: Array<TableColumn>\n source: string | ((_: TableFetchParams) => Promise<Array<unknown>> | Array<unknown>)\n perPage?: number\n}\n\nconst props = withDefaults(defineProps<TableProps>(), {\n perPage: 25,\n})\n\nconst orders: ShallowRef<TableOrders> = shallowRef({})\n\nconst fetchData = async (params: TableFetchParams) => {\n let data\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)\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({\n initialFilters: { per_page: props.perPage, orders },\n loadItems: fetchData,\n})\n\ndefineExpose({\n refetch,\n reload,\n rows,\n})\n</script>\n"],"names":["ref","reactive","isReactive","computed","shallowRef"],"mappings":"iwBAeM,GAAU,KAAK,MAAM,KAAK,SAAW,EAAE,EAAI,mMCD3C,EAAc,CAClB,QAAS,UACT,QAAS,UACT,OAAQ,SACR,OAAQ,QACV,EAEM,EAAgB,CAAC,CAAE,iBAAgB,eAAmC,MACpE,GAAOA,MAAI,CAAC,EACZ,EAAQC,WAAS,CAAE,MAAO,GAAc,EACxC,EAAYD,MAAI,EAAY,OAAO,EACnC,EAAyBE,aAAW,CAAc,EAAI,EAAiBD,WAAS,CAAE,MAAO,EAAgB,EAEzG,EAAUE,WAAS,OACvB,KAAM,EAAK,OACR,EAAuB,MAC1B,EAEI,EAAO,OACD,MAAQ,EAAY,QAEvB,EAAU,EAAQ,KAAK,EAC3B,KAAK,AAAC,GAAgB,GACf,MAAQ,IACJ,MAAQ,EAAY,OAC/B,EACA,MAAM,IAAM,GACL,MAAQ,KACJ,MAAQ,EAAY,OAC/B,kBAGC,EAAS,CAAI,MAIZ,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,EC1EM,EAAY,CAAC,EAAK,IAAiB,CAAC,EAAa,CAAC,EAAK,KAAS,IAChE,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,GAAQ,OAAO,QAAQ,CAAG,EAAE,OAAO,EAAa,EAAG,EAAE,EAAE,KAAK,GAAG,0OCqHzE,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,EAAc,CAChB,eAAgB,CAAE,SAAU,EAAM,QAAS,UAC3C,UAAW,EACZ,WAEY,CACX,UACA,SACA,OACD"}
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,6 +1,6 @@
1
1
  {
2
2
  "name": "vue-slim-tables",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
4
4
  "files": [
5
5
  "dist"
6
6
  ],
@@ -13,7 +13,8 @@
13
13
  },
14
14
  "./stylesheets": "dist/style.css",
15
15
  "./src/ts/index": "./src/ts/index.ts",
16
- "./filterable": "./src/ts/use/filterable"
16
+ "./filterable": "./src/ts/use/filterable",
17
+ "./dist/vst.umd.js": "./dist/vst.umd.js"
17
18
  },
18
19
  "scripts": {
19
20
  "build": "vite build",
@@ -34,25 +35,26 @@
34
35
  "license": "MIT",
35
36
  "private": false,
36
37
  "devDependencies": {
37
- "@typescript-eslint/eslint-plugin": "^5.17.0",
38
- "@typescript-eslint/parser": "^5.17.0",
38
+ "@babel/types": "^7.17.10",
39
+ "@typescript-eslint/eslint-plugin": "^5.22.0",
40
+ "@typescript-eslint/parser": "^5.22.0",
39
41
  "@vitejs/plugin-vue": "^2.3.1",
40
- "@vue/test-utils": "^2.0.0-rc.17",
42
+ "@vue/test-utils": "^2.0.0-rc.21",
41
43
  "c8": "^7.11.2",
42
- "eslint": "^8.12.0",
44
+ "eslint": "^8.14.0",
43
45
  "eslint-config-airbnb-base": "^15.0.0",
44
- "eslint-plugin-import": "^2.25.4",
45
- "eslint-plugin-vue": "^8.5.0",
46
- "happy-dom": "^2.55.0",
47
- "sass": "^1.49.11",
48
- "typescript": "4.6.3",
49
- "vite": "^2.9.1",
50
- "vite-plugin-dts": "^1.0.5",
51
- "vitest": "^0.8.4",
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",
52
54
  "vue-eslint-parser": "^8.3.0"
53
55
  },
54
56
  "dependencies": {
55
- "vue": "^3.2.31"
57
+ "vue": "^3.2.33"
56
58
  },
57
59
  "types": "dist/types/index.d.ts"
58
60
  }