vue-slim-tables 0.3.6 → 0.3.7

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.
@@ -1,4 +1,5 @@
1
- import type { TableColumn, TableOrders, TableFetchParams, TableRow, TableFilters, TableProps } from './ts/types';
2
- import VueSlimTable from './ts/components/slim_table.vue';
1
+ import { TableColumn, TableOrders, TableFetchParams, TableRow, TableFilters, TableProps } from './ts/types';
2
+ import { default as VueSlimTable } from './ts/components/slim_table.vue';
3
+
3
4
  export default VueSlimTable;
4
5
  export { TableColumn, TableOrders, TableFetchParams, TableRow, TableFilters, TableProps };
@@ -1,12 +1,12 @@
1
- declare const _default: import("vue").DefineComponent<{
1
+ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropTypes<{
2
2
  columnsLength: {
3
3
  type: NumberConstructor;
4
4
  required: true;
5
5
  };
6
- }, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
6
+ }>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<{
7
7
  columnsLength: {
8
8
  type: NumberConstructor;
9
9
  required: true;
10
10
  };
11
- }>>, {}, {}>;
11
+ }>> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
12
12
  export default _default;
@@ -1,26 +1,27 @@
1
- import type { TableOrders, TableRow, TableProps } from '../../ts/types';
2
- declare const _default: <TRow extends TableRow>(__VLS_props: TableProps<TRow> & import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, __VLS_ctx?: Pick<{
3
- props: TableProps<TRow>;
4
- expose(exposed: {
1
+ import { TableOrders, TableRow, TableProps } from '../types';
2
+
3
+ declare const _default: <TRow extends TableRow>(__VLS_props: Awaited<typeof __VLS_setup>["props"], __VLS_ctx?: __VLS_Prettify<Pick<Awaited<typeof __VLS_setup>, "attrs" | "emit" | "slots">>, __VLS_expose?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
4
+ props: __VLS_Prettify<__VLS_OmitKeepDiscriminatedUnion<(Partial<{}> & Omit<{} & import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps, never>) & TableProps<TRow>, keyof import('vue').VNodeProps | keyof import('vue').AllowedComponentProps>> & {} & (import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps);
5
+ expose(exposed: import('vue').ShallowUnwrapRef<{
5
6
  refetch: () => void;
6
7
  reload: () => Promise<void>;
7
- rows: import("vue").Ref<TRow[]>;
8
- }): void;
8
+ rows: import('vue').Ref<TRow[], TRow[]>;
9
+ }>): void;
9
10
  attrs: any;
10
- slots: Partial<{
11
+ slots: ReturnType<() => Readonly<Partial<{
11
12
  [key: `thead:${string}`]: (_props: {
12
- column: import('../../ts/types').TableColumn;
13
+ column: import('../types').TableColumn;
13
14
  orders: TableOrders;
14
15
  }) => any;
15
16
  [key: `cell:${string}`]: (_props: {
16
17
  row: TRow;
17
18
  index: number;
18
- column: import('../../ts/types').TableColumn;
19
+ column: import('../types').TableColumn;
19
20
  value: unknown;
20
21
  }) => any;
21
22
  'thead:before': () => any;
22
23
  thead: (_props: {
23
- columns: import('../../ts/types').TableColumn[];
24
+ columns: import('../types').TableColumn[];
24
25
  orders: TableOrders;
25
26
  }) => any;
26
27
  'thead:after': () => any;
@@ -29,36 +30,26 @@ declare const _default: <TRow extends TableRow>(__VLS_props: TableProps<TRow> &
29
30
  row: (_props: {
30
31
  row: TRow;
31
32
  index: number;
32
- columns: import('../../ts/types').TableColumn[];
33
+ columns: import('../types').TableColumn[];
33
34
  }) => any;
34
35
  pagination: (_props: {
35
36
  page: number;
36
37
  rows: TRow[];
37
38
  }) => any;
38
- }>;
39
- emit: any;
40
- }, "attrs" | "emit" | "slots"> | undefined, __VLS_setup?: Promise<{
41
- props: TableProps<TRow>;
42
- expose(exposed: {
43
- refetch: () => void;
44
- reload: () => Promise<void>;
45
- rows: import("vue").Ref<TRow[]>;
46
- }): void;
47
- attrs: any;
48
- slots: Partial<{
39
+ }>> & Partial<{
49
40
  [key: `thead:${string}`]: (_props: {
50
- column: import('../../ts/types').TableColumn;
41
+ column: import('../types').TableColumn;
51
42
  orders: TableOrders;
52
43
  }) => any;
53
44
  [key: `cell:${string}`]: (_props: {
54
45
  row: TRow;
55
46
  index: number;
56
- column: import('../../ts/types').TableColumn;
47
+ column: import('../types').TableColumn;
57
48
  value: unknown;
58
49
  }) => any;
59
50
  'thead:before': () => any;
60
51
  thead: (_props: {
61
- columns: import('../../ts/types').TableColumn[];
52
+ columns: import('../types').TableColumn[];
62
53
  orders: TableOrders;
63
54
  }) => any;
64
55
  'thead:after': () => any;
@@ -67,55 +58,18 @@ declare const _default: <TRow extends TableRow>(__VLS_props: TableProps<TRow> &
67
58
  row: (_props: {
68
59
  row: TRow;
69
60
  index: number;
70
- columns: import('../../ts/types').TableColumn[];
61
+ columns: import('../types').TableColumn[];
71
62
  }) => any;
72
63
  pagination: (_props: {
73
64
  page: number;
74
65
  rows: TRow[];
75
66
  }) => any;
76
- }>;
77
- emit: any;
78
- }>) => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
79
- [key: string]: any;
80
- }> & {
81
- __ctx?: {
82
- props: TableProps<TRow>;
83
- expose(exposed: {
84
- refetch: () => void;
85
- reload: () => Promise<void>;
86
- rows: import("vue").Ref<TRow[]>;
87
- }): void;
88
- attrs: any;
89
- slots: Partial<{
90
- [key: `thead:${string}`]: (_props: {
91
- column: import('../../ts/types').TableColumn;
92
- orders: TableOrders;
93
- }) => any;
94
- [key: `cell:${string}`]: (_props: {
95
- row: TRow;
96
- index: number;
97
- column: import('../../ts/types').TableColumn;
98
- value: unknown;
99
- }) => any;
100
- 'thead:before': () => any;
101
- thead: (_props: {
102
- columns: import('../../ts/types').TableColumn[];
103
- orders: TableOrders;
104
- }) => any;
105
- 'thead:after': () => any;
106
- 'row:loading': () => any;
107
- 'row:empty': () => any;
108
- row: (_props: {
109
- row: TRow;
110
- index: number;
111
- columns: import('../../ts/types').TableColumn[];
112
- }) => any;
113
- pagination: (_props: {
114
- page: number;
115
- rows: TRow[];
116
- }) => any;
117
- }>;
118
- emit: any;
119
- } | undefined;
67
+ }>>;
68
+ emit: typeof __VLS_emit;
69
+ }>) => import('vue').VNode & {
70
+ __ctx?: Awaited<typeof __VLS_setup>;
120
71
  };
121
72
  export default _default;
73
+ type __VLS_Prettify<T> = {
74
+ [K in keyof T]: T[K];
75
+ } & {};
@@ -1,4 +1,3 @@
1
- import { ShallowRef } from 'vue';
2
1
  export type TableColumn = {
3
2
  key: string;
4
3
  title: string;
@@ -9,7 +8,7 @@ export type TableOrders = {
9
8
  };
10
9
  export type TableFilters = {
11
10
  per_page: number;
12
- orders: ShallowRef<TableOrders>;
11
+ orders: TableOrders;
13
12
  };
14
13
  export type TableFetchParams = {
15
14
  page: number;
@@ -1,4 +1,5 @@
1
1
  import { Ref, ComputedRef } from 'vue';
2
+
2
3
  type UseFiltetableArgs<T, S> = {
3
4
  initialFilters: ComputedRef<T>;
4
5
  loadItems: (_params: T & {
@@ -13,9 +14,9 @@ export declare const SYNC_STATES: {
13
14
  };
14
15
  type SynsState = (typeof SYNC_STATES)[keyof typeof SYNC_STATES];
15
16
  declare const _default: <TFilters, TItem>({ initialFilters, loadItems, }: UseFiltetableArgs<TFilters, TItem>) => {
16
- page: Ref<number>;
17
- items: Ref<TItem[]>;
18
- syncState: Ref<SynsState>;
17
+ page: Ref<number, number>;
18
+ items: Ref<TItem[], TItem[]>;
19
+ syncState: Ref<SynsState, SynsState>;
19
20
  isSyncing: ComputedRef<boolean>;
20
21
  isSynced: ComputedRef<boolean>;
21
22
  isFailed: ComputedRef<boolean>;
package/dist/vst.es.js CHANGED
@@ -1,18 +1,18 @@
1
- import { defineComponent as F, openBlock as n, createElementBlock as u, createElementVNode as a, normalizeClass as $, ref as b, watch as _, computed as I, shallowRef as B, renderSlot as d, Fragment as N, renderList as f, mergeProps as M, toHandlers as V, createTextVNode as E, toDisplayString as P, createCommentVNode as w, unref as t, createBlock as R, withModifiers as A } from "vue";
2
- const q = ["colspan"], z = /* @__PURE__ */ a("div", null, null, -1), H = [
3
- z
4
- ], O = /* @__PURE__ */ F({
1
+ import { defineComponent as T, openBlock as n, createElementBlock as o, createElementVNode as a, normalizeClass as I, ref as b, watch as A, computed as S, shallowRef as M, renderSlot as u, Fragment as N, renderList as f, mergeProps as V, toHandlers as _, createTextVNode as E, toDisplayString as P, createCommentVNode as w, unref as l, createBlock as R, withModifiers as F } from "vue";
2
+ const q = ["colspan"], z = /* @__PURE__ */ T({
5
3
  __name: "loading_row",
6
4
  props: {
7
5
  columnsLength: { type: Number, required: !0 }
8
6
  },
9
7
  setup(v) {
10
8
  const h = Math.floor(Math.random() * 10) + 1;
11
- return (o, l) => (n(), u("tr", null, [
9
+ return (t, d) => (n(), o("tr", null, [
12
10
  a("td", {
13
11
  colspan: v.columnsLength,
14
- class: $(["vst-loading-row", `vst-loading-row-${h}`])
15
- }, H, 10, q)
12
+ class: I(["vst-loading-row", `vst-loading-row-${h}`])
13
+ }, d[0] || (d[0] = [
14
+ a("div", null, null, -1)
15
+ ]), 10, q)
16
16
  ]));
17
17
  }
18
18
  }), g = {
@@ -20,46 +20,50 @@ const q = ["colspan"], z = /* @__PURE__ */ a("div", null, null, -1), H = [
20
20
  SYNCING: "SYNCING",
21
21
  SYNCED: "SYNCED",
22
22
  FAILED: "FAILED"
23
- }, j = ({
23
+ }, H = ({
24
24
  initialFilters: v,
25
25
  loadItems: h
26
26
  }) => {
27
- const o = b(1), l = b([]), i = b(g.INITIAL), c = async () => {
27
+ const t = b(1), d = b([]), i = b(g.INITIAL), c = async () => {
28
28
  i.value = g.SYNCING;
29
29
  try {
30
- l.value = await h({
30
+ d.value = await h({
31
31
  ...v.value,
32
- page: o.value
32
+ page: t.value
33
33
  }), i.value = g.SYNCED;
34
34
  } catch {
35
- l.value = [], i.value = g.FAILED;
35
+ d.value = [], i.value = g.FAILED;
36
36
  }
37
37
  };
38
- return _(v, c), _(o, c), c(), {
39
- page: o,
40
- items: l,
38
+ return A(t, c), A(
39
+ v,
40
+ c,
41
+ { deep: !0 }
42
+ ), c(), {
43
+ page: t,
44
+ items: d,
41
45
  syncState: i,
42
- isSyncing: I(() => i.value === g.SYNCING),
43
- isSynced: I(() => i.value === g.SYNCED),
44
- isFailed: I(() => i.value === g.FAILED),
46
+ isSyncing: S(() => i.value === g.SYNCING),
47
+ isSynced: S(() => i.value === g.SYNCED),
48
+ isFailed: S(() => i.value === g.FAILED),
45
49
  nextPage: () => {
46
- o.value += 1;
50
+ t.value += 1;
47
51
  },
48
52
  prevPage: () => {
49
- o.value -= 1;
53
+ t.value -= 1;
50
54
  },
51
- setPage: (S) => {
52
- o.value = S;
55
+ setPage: ($) => {
56
+ t.value = $;
53
57
  },
54
58
  reload: c,
55
59
  refetch: () => {
56
- o.value === 1 ? c() : o.value = 1;
60
+ t.value === 1 ? c() : t.value = 1;
57
61
  }
58
62
  };
59
- }, J = { class: "vst" }, K = { key: 0 }, Q = { key: 0 }, U = ["colspan"], W = ["colspan"], X = {
63
+ }, O = { class: "vst" }, j = { key: 0 }, J = { key: 0 }, K = ["colspan"], Q = ["colspan"], U = {
60
64
  key: 0,
61
65
  class: "vst-pagination"
62
- }, x = /* @__PURE__ */ F({
66
+ }, X = /* @__PURE__ */ T({
63
67
  __name: "slim_table",
64
68
  props: {
65
69
  columns: {},
@@ -67,93 +71,93 @@ const q = ["colspan"], z = /* @__PURE__ */ a("div", null, null, -1), H = [
67
71
  source: {}
68
72
  },
69
73
  setup(v, { expose: h }) {
70
- const o = v, l = B({}), i = async (e) => {
74
+ const t = M({}), d = v, i = async (e) => {
71
75
  let r = [];
72
76
  try {
73
- r = await o.source(e);
77
+ r = await d.source(e);
74
78
  } catch {
75
79
  }
76
80
  return r;
77
81
  }, c = (e, r) => {
78
- e.preventDefault(), l.value[r] === "asc" ? l.value = { [r]: "desc" } : l.value[r] === "desc" ? l.value = {} : l.value = { [r]: "asc" };
79
- }, S = I(() => ({
80
- per_page: o.perPage,
81
- orders: l
82
+ e.preventDefault(), t.value[r] === "asc" ? t.value = { [r]: "desc" } : t.value[r] === "desc" ? t.value = {} : t.value = { [r]: "asc" };
83
+ }, $ = S(() => ({
84
+ per_page: d.perPage,
85
+ orders: t.value
82
86
  })), {
83
87
  page: C,
84
88
  isSyncing: m,
85
89
  isSynced: D,
86
90
  prevPage: L,
87
91
  nextPage: Y,
88
- reload: T,
89
- refetch: G,
92
+ reload: G,
93
+ refetch: B,
90
94
  items: p
91
- } = j({
92
- initialFilters: S,
95
+ } = H({
96
+ initialFilters: $,
93
97
  loadItems: i
94
98
  });
95
99
  return h({
96
- refetch: G,
97
- reload: T,
100
+ refetch: B,
101
+ reload: G,
98
102
  rows: p
99
- }), (e, r) => (n(), u("table", J, [
100
- e.columns.length ? (n(), u("thead", K, [
101
- d(e.$slots, "thead:before"),
102
- d(e.$slots, "thead", {
103
+ }), (e, r) => (n(), o("table", O, [
104
+ e.columns.length ? (n(), o("thead", j, [
105
+ u(e.$slots, "thead:before"),
106
+ u(e.$slots, "thead", {
103
107
  columns: e.columns,
104
- orders: l.value
108
+ orders: t.value
105
109
  }, () => [
106
110
  a("tr", null, [
107
- (n(!0), u(N, null, f(e.columns, (s) => (n(), u("th", M({
111
+ (n(!0), o(N, null, f(e.columns, (s) => (n(), o("th", V({
108
112
  key: s.key,
109
113
  class: ["vst-th", { "vst-orderable": s.orderable }]
110
- }, V(s.orderable ? { click: (y) => c(y, s.key) } : {}, !0)), [
111
- s.orderable ? (n(), u("div", Q, [
112
- d(e.$slots, `thead:${s.key}`, {
114
+ }, _(s.orderable ? { click: (y) => c(y, s.key) } : {}, !0)), [
115
+ s.orderable ? (n(), o("div", J, [
116
+ u(e.$slots, `thead:${s.key}`, {
113
117
  column: s,
114
- orders: l.value
118
+ orders: t.value
115
119
  }, () => [
116
120
  E(P(s.title), 1)
117
121
  ]),
118
122
  a("i", {
119
- class: $(["vst-orderable-toggle", l.value[s.key]])
123
+ class: I(["vst-orderable-toggle", t.value[s.key]])
120
124
  }, null, 2)
121
- ])) : d(e.$slots, `thead:${s.key}`, {
125
+ ])) : u(e.$slots, `thead:${s.key}`, {
122
126
  key: 1,
123
127
  column: s,
124
- orders: l.value
128
+ orders: t.value
125
129
  }, () => [
126
130
  E(P(s.title), 1)
127
131
  ])
128
132
  ], 16))), 128))
129
133
  ])
130
134
  ]),
131
- d(e.$slots, "thead:after")
135
+ u(e.$slots, "thead:after")
132
136
  ])) : w("", !0),
133
137
  a("tbody", null, [
134
- t(m) ? d(e.$slots, "row:loading", { key: 0 }, () => [
135
- (n(!0), u(N, null, f(e.perPage, (s) => (n(), R(O, {
138
+ l(m) ? u(e.$slots, "row:loading", { key: 0 }, () => [
139
+ (n(!0), o(N, null, f(e.perPage, (s) => (n(), R(z, {
136
140
  key: `loadingRow${s}`,
137
141
  "columns-length": e.columns.length
138
142
  }, null, 8, ["columns-length"]))), 128))
139
- ]) : t(D) && t(p).length === 0 ? d(e.$slots, "row:empty", { key: 1 }, () => [
143
+ ]) : l(D) && l(p).length === 0 ? u(e.$slots, "row:empty", { key: 1 }, () => [
140
144
  a("tr", null, [
141
145
  a("td", {
142
146
  colspan: e.columns.length
143
- }, " No records found ", 8, U)
147
+ }, " No records found ", 8, K)
144
148
  ])
145
- ]) : t(D) && t(p).length ? (n(!0), u(N, { key: 2 }, f(t(p), (s, y) => d(e.$slots, "row", {
149
+ ]) : l(D) && l(p).length ? (n(!0), o(N, { key: 2 }, f(l(p), (s, y) => u(e.$slots, "row", {
146
150
  row: s,
147
151
  index: y,
148
152
  columns: e.columns
149
153
  }, () => [
150
- (n(), u("tr", {
154
+ (n(), o("tr", {
151
155
  key: s.id || y
152
156
  }, [
153
- (n(!0), u(N, null, f(e.columns, (k) => (n(), u("td", {
157
+ (n(!0), o(N, null, f(e.columns, (k) => (n(), o("td", {
154
158
  key: k.key
155
159
  }, [
156
- d(e.$slots, `cell:${k.key}`, {
160
+ u(e.$slots, `cell:${k.key}`, {
157
161
  row: s,
158
162
  value: s[k.key],
159
163
  column: k,
@@ -170,44 +174,44 @@ const q = ["colspan"], z = /* @__PURE__ */ a("div", null, null, -1), H = [
170
174
  a("td", {
171
175
  colspan: e.columns.length
172
176
  }, [
173
- d(e.$slots, "pagination", {
174
- page: t(C),
175
- rows: t(p)
177
+ u(e.$slots, "pagination", {
178
+ page: l(C),
179
+ rows: l(p)
176
180
  }, () => [
177
- t(C) > 1 || t(p).length === e.perPage || t(m) ? (n(), u("ul", X, [
181
+ l(C) > 1 || l(p).length === e.perPage || l(m) ? (n(), o("ul", U, [
178
182
  a("li", {
179
- class: $(["vst-page-item", { disabled: t(C) === 1 || t(m) }])
183
+ class: I(["vst-page-item", { disabled: l(C) === 1 || l(m) }])
180
184
  }, [
181
185
  a("a", {
182
186
  class: "vst-page-link",
183
- onClick: r[0] || (r[0] = A(
187
+ onClick: r[0] || (r[0] = F(
184
188
  //@ts-ignore
185
- (...s) => t(L) && t(L)(...s),
189
+ (...s) => l(L) && l(L)(...s),
186
190
  ["prevent"]
187
191
  ))
188
192
  }, "←")
189
193
  ], 2),
190
194
  a("li", {
191
- class: $(["vst-page-item", { disabled: t(p).length < e.perPage || t(m) }])
195
+ class: I(["vst-page-item", { disabled: l(p).length < e.perPage || l(m) }])
192
196
  }, [
193
197
  a("a", {
194
198
  class: "vst-page-link",
195
- onClick: r[1] || (r[1] = A(
199
+ onClick: r[1] || (r[1] = F(
196
200
  //@ts-ignore
197
- (...s) => t(Y) && t(Y)(...s),
201
+ (...s) => l(Y) && l(Y)(...s),
198
202
  ["prevent"]
199
203
  ))
200
204
  }, "→")
201
205
  ], 2)
202
206
  ])) : w("", !0)
203
207
  ])
204
- ], 8, W)
208
+ ], 8, Q)
205
209
  ])
206
210
  ])
207
211
  ]));
208
212
  }
209
213
  });
210
214
  export {
211
- x as default
215
+ X as default
212
216
  };
213
217
  //# sourceMappingURL=vst.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"vst.es.js","sources":["../src/ts/components/loading_row.vue","../src/ts/use/filterable.ts","../src/ts/components/slim_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, watch, Ref, ComputedRef,\n} from 'vue'\n\ntype UseFiltetableArgs<T, S> = {\n initialFilters: ComputedRef<T>\n loadItems: (_params: T & { page: number }) => Promise<S[]>\n}\n\nexport const SYNC_STATES = {\n INITIAL: 'INITIAL',\n SYNCING: 'SYNCING',\n SYNCED: 'SYNCED',\n FAILED: 'FAILED',\n} as const\n\ntype SynsState = (typeof SYNC_STATES)[keyof typeof SYNC_STATES]\n\nexport default <TFilters, TItem>({\n initialFilters,\n loadItems,\n}: UseFiltetableArgs<TFilters, TItem>) => {\n const page = ref(1)\n const items: Ref<TItem[]> = ref([])\n const syncState = ref<SynsState>(SYNC_STATES.INITIAL)\n\n const reload = async () => {\n syncState.value = SYNC_STATES.SYNCING\n\n try {\n items.value = await loadItems({\n ...initialFilters.value,\n page: page.value,\n })\n syncState.value = SYNC_STATES.SYNCED\n } catch {\n items.value = []\n syncState.value = SYNC_STATES.FAILED\n }\n }\n\n watch(initialFilters, reload)\n watch(page, reload)\n reload()\n\n return {\n page,\n items,\n syncState,\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 nextPage: () => {\n page.value += 1\n },\n prevPage: () => {\n page.value -= 1\n },\n setPage: (num: number) => {\n page.value = num\n },\n reload,\n refetch: () => {\n if (page.value === 1) {\n reload()\n } else {\n page.value = 1\n }\n },\n }\n}\n","<template>\n <table class=\"vst\">\n <thead v-if=\"columns.length\">\n <slot name=\"thead:before\" />\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: (event: Event) => onOrderClick(event, column.key) } : {}\">\n <div v-if=\"column.orderable\">\n <slot\n :name=\"`thead:${column.key}`\"\n :column=\"column\"\n :orders=\"orders\">\n {{ column.title }}\n </slot>\n\n <i :class=\"['vst-orderable-toggle', orders[column.key]]\" />\n </div>\n\n <slot\n v-else\n :name=\"`thead:${column.key}`\"\n :column=\"column\"\n :orders=\"orders\">\n {{ column.title }}\n </slot>\n </th>\n </tr>\n </slot>\n <slot name=\"thead:after\" />\n </thead>\n <tbody>\n <slot v-if=\"isSyncing\" name=\"row:loading\">\n <LoadingRow v-for=\"i in perPage\" :key=\"`loadingRow${i}`\" :columns-length=\"columns.length\" />\n </slot>\n\n <slot v-else-if=\"isSynced && rows.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.length\">\n <slot\n v-for=\"(row, i) in rows\"\n name=\"row\"\n :row=\"row\"\n :index=\"i\"\n :columns=\"columns\">\n <tr :key=\"row['id'] || i\">\n <td v-for=\"column in columns\" :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\">\n <ul v-if=\"page > 1 || rows.length === perPage || isSyncing\" class=\"vst-pagination\">\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 :class=\"['vst-page-item', { disabled: rows.length < perPage || isSyncing }]\">\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\" generic=\"TRow extends TableRow\">\nimport { computed, shallowRef } from 'vue'\nimport LoadingRow from './loading_row.vue'\n\nimport useFilterable from '../use/filterable'\n\nimport type {\n TableOrders, TableFetchParams, TableRow, TableFilters, TableProps, TableSlots,\n} from '@/ts/types'\n\nconst orders = shallowRef<TableOrders>({})\nconst props = withDefaults(defineProps<TableProps<TRow>>(), {\n perPage: 25,\n})\n\nconst loadItems = async (params: TableFetchParams) => {\n let data: TRow[] = []\n\n try {\n data = await props.source(params)\n } catch {\n // TODO: show errors\n }\n\n return data\n}\n\nconst onOrderClick = (event: Event, key: string) => {\n event.preventDefault()\n\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 initialFilters = computed<TableFilters>(() => ({\n per_page: props.perPage,\n orders,\n}))\n\nconst {\n page, isSyncing, isSynced, prevPage, nextPage, reload, refetch, items: rows,\n} = useFilterable<TableFilters, TRow>({\n initialFilters,\n loadItems,\n})\n\ndefineSlots<TableSlots<TRow>>()\n\ndefineExpose({\n refetch,\n reload,\n rows,\n})\n</script>\n"],"names":["randNum","SYNC_STATES","useFilterable","initialFilters","loadItems","page","ref","items","syncState","reload","watch","computed","num","orders","shallowRef","params","data","props","onOrderClick","event","key","isSyncing","isSynced","prevPage","nextPage","refetch","rows","__expose"],"mappings":";;;;;;;;;AAeA,UAAMA,IAAU,KAAK,MAAM,KAAK,WAAW,EAAE,IAAI;;;;;;;;ICNpCC,IAAc;AAAA,EACzB,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AACV,GAIAC,IAAe,CAAkB;AAAA,EAC/B,gBAAAC;AAAA,EACA,WAAAC;AACF,MAA0C;AAClC,QAAAC,IAAOC,EAAI,CAAC,GACZC,IAAsBD,EAAI,CAAA,CAAE,GAC5BE,IAAYF,EAAeL,EAAY,OAAO,GAE9CQ,IAAS,YAAY;AACzB,IAAAD,EAAU,QAAQP,EAAY;AAE1B,QAAA;AACI,MAAAM,EAAA,QAAQ,MAAMH,EAAU;AAAA,QAC5B,GAAGD,EAAe;AAAA,QAClB,MAAME,EAAK;AAAA,MAAA,CACZ,GACDG,EAAU,QAAQP,EAAY;AAAA,IAAA,QACxB;AACN,MAAAM,EAAM,QAAQ,IACdC,EAAU,QAAQP,EAAY;AAAA,IAChC;AAAA,EAAA;AAGF,SAAAS,EAAMP,GAAgBM,CAAM,GAC5BC,EAAML,GAAMI,CAAM,GACXA,KAEA;AAAA,IACL,MAAAJ;AAAA,IACA,OAAAE;AAAA,IACA,WAAAC;AAAA,IACA,WAAWG,EAAS,MAAMH,EAAU,UAAUP,EAAY,OAAO;AAAA,IACjE,UAAUU,EAAS,MAAMH,EAAU,UAAUP,EAAY,MAAM;AAAA,IAC/D,UAAUU,EAAS,MAAMH,EAAU,UAAUP,EAAY,MAAM;AAAA,IAC/D,UAAU,MAAM;AACd,MAAAI,EAAK,SAAS;AAAA,IAChB;AAAA,IACA,UAAU,MAAM;AACd,MAAAA,EAAK,SAAS;AAAA,IAChB;AAAA,IACA,SAAS,CAACO,MAAgB;AACxB,MAAAP,EAAK,QAAQO;AAAA,IACf;AAAA,IACA,QAAAH;AAAA,IACA,SAAS,MAAM;AACT,MAAAJ,EAAK,UAAU,IACVI,MAEPJ,EAAK,QAAQ;AAAA,IAEjB;AAAA,EAAA;AAEJ;;;;;;;;;;;iBC6BMQ,IAASC,EAAwB,CAAA,CAAE,GAKnCV,IAAY,OAAOW,MAA6B;AACpD,UAAIC,IAAe,CAAA;AAEf,UAAA;AACK,QAAAA,IAAA,MAAMC,EAAM,OAAOF,CAAM;AAAA,MAAA,QAC1B;AAAA,MAER;AAEO,aAAAC;AAAA,IAAA,GAGHE,IAAe,CAACC,GAAcC,MAAgB;AAClD,MAAAD,EAAM,eAAe,GAEjBN,EAAO,MAAMO,CAAG,MAAM,QACxBP,EAAO,QAAQ,EAAE,CAACO,CAAG,GAAG,OAAO,IACtBP,EAAO,MAAMO,CAAG,MAAM,SAC/BP,EAAO,QAAQ,KAEfA,EAAO,QAAQ,EAAE,CAACO,CAAG,GAAG,MAAM;AAAA,IAChC,GAGIjB,IAAiBQ,EAAuB,OAAO;AAAA,MACnD,UAAUM,EAAM;AAAA,MAChB,QAAAJ;AAAA,IACA,EAAA,GAEI;AAAA,MACJ,MAAAR;AAAA,MAAM,WAAAgB;AAAA,MAAW,UAAAC;AAAA,MAAU,UAAAC;AAAA,MAAU,UAAAC;AAAA,MAAU,QAAAf;AAAA,MAAQ,SAAAgB;AAAA,MAAS,OAAOC;AAAA,QACrExB,EAAkC;AAAA,MACpC,gBAAAC;AAAA,MACA,WAAAC;AAAA,IAAA,CACD;AAIY,WAAAuB,EAAA;AAAA,MACX,SAAAF;AAAA,MACA,QAAAhB;AAAA,MACA,MAAAiB;AAAA,IAAA,CACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"vst.es.js","sources":["../src/ts/components/loading_row.vue","../src/ts/use/filterable.ts","../src/ts/components/slim_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, watch, Ref, ComputedRef,\n} from 'vue'\n\ntype UseFiltetableArgs<T, S> = {\n initialFilters: ComputedRef<T>\n loadItems: (_params: T & { page: number }) => Promise<S[]>\n}\n\nexport const SYNC_STATES = {\n INITIAL: 'INITIAL',\n SYNCING: 'SYNCING',\n SYNCED: 'SYNCED',\n FAILED: 'FAILED',\n} as const\n\ntype SynsState = (typeof SYNC_STATES)[keyof typeof SYNC_STATES]\n\nexport default <TFilters, TItem>({\n initialFilters,\n loadItems,\n}: UseFiltetableArgs<TFilters, TItem>) => {\n const page = ref(1)\n const items: Ref<TItem[]> = ref([])\n const syncState = ref<SynsState>(SYNC_STATES.INITIAL)\n\n const reload = async () => {\n syncState.value = SYNC_STATES.SYNCING\n\n try {\n items.value = await loadItems({\n ...initialFilters.value,\n page: page.value,\n })\n syncState.value = SYNC_STATES.SYNCED\n } catch {\n items.value = []\n syncState.value = SYNC_STATES.FAILED\n }\n }\n\n watch(page, reload)\n watch(\n initialFilters,\n reload,\n { deep: true },\n )\n reload()\n\n return {\n page,\n items,\n syncState,\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 nextPage: () => {\n page.value += 1\n },\n prevPage: () => {\n page.value -= 1\n },\n setPage: (num: number) => {\n page.value = num\n },\n reload,\n refetch: () => {\n if (page.value === 1) {\n reload()\n } else {\n page.value = 1\n }\n },\n }\n}\n","<template>\n <table class=\"vst\">\n <thead v-if=\"columns.length\">\n <slot name=\"thead:before\" />\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: (event: Event) => onOrderClick(event, column.key) } : {}\">\n <div v-if=\"column.orderable\">\n <slot\n :name=\"`thead:${column.key}`\"\n :column=\"column\"\n :orders=\"orders\">\n {{ column.title }}\n </slot>\n\n <i :class=\"['vst-orderable-toggle', orders[column.key]]\" />\n </div>\n\n <slot\n v-else\n :name=\"`thead:${column.key}`\"\n :column=\"column\"\n :orders=\"orders\">\n {{ column.title }}\n </slot>\n </th>\n </tr>\n </slot>\n <slot name=\"thead:after\" />\n </thead>\n <tbody>\n <slot v-if=\"isSyncing\" name=\"row:loading\">\n <LoadingRow v-for=\"i in perPage\" :key=\"`loadingRow${i}`\" :columns-length=\"columns.length\" />\n </slot>\n\n <slot v-else-if=\"isSynced && rows.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.length\">\n <slot\n v-for=\"(row, i) in rows\"\n name=\"row\"\n :row=\"row\"\n :index=\"i\"\n :columns=\"columns\">\n <tr :key=\"row['id'] || i\">\n <td v-for=\"column in columns\" :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\">\n <ul v-if=\"page > 1 || rows.length === perPage || isSyncing\" class=\"vst-pagination\">\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 :class=\"['vst-page-item', { disabled: rows.length < perPage || isSyncing }]\">\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\" generic=\"TRow extends TableRow\">\nimport { computed, shallowRef } from 'vue'\nimport LoadingRow from './loading_row.vue'\n\nimport useFilterable from '../use/filterable'\n\nimport type {\n TableOrders, TableFetchParams, TableRow, TableFilters, TableProps, TableSlots,\n} from '@/ts/types'\n\nconst orders = shallowRef<TableOrders>({})\nconst props = withDefaults(defineProps<TableProps<TRow>>(), {\n perPage: 25,\n})\n\nconst loadItems = async (params: TableFetchParams) => {\n let data: TRow[] = []\n\n try {\n data = await props.source(params)\n } catch {\n // TODO: show errors\n }\n\n return data\n}\n\nconst onOrderClick = (event: Event, key: string) => {\n event.preventDefault()\n\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 initialFilters = computed<TableFilters>(() => ({\n per_page: props.perPage,\n orders: orders.value,\n}))\n\nconst {\n page, isSyncing, isSynced, prevPage, nextPage, reload, refetch, items: rows,\n} = useFilterable<TableFilters, TRow>({\n initialFilters,\n loadItems,\n})\n\ndefineSlots<TableSlots<TRow>>()\n\ndefineExpose({\n refetch,\n reload,\n rows,\n})\n</script>\n"],"names":["randNum","SYNC_STATES","useFilterable","initialFilters","loadItems","page","ref","items","syncState","reload","watch","computed","num","orders","shallowRef","props","__props","params","data","onOrderClick","event","key","isSyncing","isSynced","prevPage","nextPage","refetch","rows","__expose"],"mappings":";;;;;;;AAeA,UAAMA,IAAU,KAAK,MAAM,KAAK,WAAW,EAAE,IAAI;;;;;;;;;;ICNpCC,IAAc;AAAA,EACzB,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AACV,GAIAC,IAAe,CAAkB;AAAA,EAC/B,gBAAAC;AAAA,EACA,WAAAC;AACF,MAA0C;AAClC,QAAAC,IAAOC,EAAI,CAAC,GACZC,IAAsBD,EAAI,CAAA,CAAE,GAC5BE,IAAYF,EAAeL,EAAY,OAAO,GAE9CQ,IAAS,YAAY;AACzB,IAAAD,EAAU,QAAQP,EAAY;AAE1B,QAAA;AACI,MAAAM,EAAA,QAAQ,MAAMH,EAAU;AAAA,QAC5B,GAAGD,EAAe;AAAA,QAClB,MAAME,EAAK;AAAA,MAAA,CACZ,GACDG,EAAU,QAAQP,EAAY;AAAA,IAAA,QACxB;AACN,MAAAM,EAAM,QAAQ,IACdC,EAAU,QAAQP,EAAY;AAAA,IAChC;AAAA,EAAA;AAGF,SAAAS,EAAML,GAAMI,CAAM,GAClBC;AAAA,IACEP;AAAA,IACAM;AAAA,IACA,EAAE,MAAM,GAAK;AAAA,EAAA,GAERA,KAEA;AAAA,IACL,MAAAJ;AAAA,IACA,OAAAE;AAAA,IACA,WAAAC;AAAA,IACA,WAAWG,EAAS,MAAMH,EAAU,UAAUP,EAAY,OAAO;AAAA,IACjE,UAAUU,EAAS,MAAMH,EAAU,UAAUP,EAAY,MAAM;AAAA,IAC/D,UAAUU,EAAS,MAAMH,EAAU,UAAUP,EAAY,MAAM;AAAA,IAC/D,UAAU,MAAM;AACd,MAAAI,EAAK,SAAS;AAAA,IAChB;AAAA,IACA,UAAU,MAAM;AACd,MAAAA,EAAK,SAAS;AAAA,IAChB;AAAA,IACA,SAAS,CAACO,MAAgB;AACxB,MAAAP,EAAK,QAAQO;AAAA,IACf;AAAA,IACA,QAAAH;AAAA,IACA,SAAS,MAAM;AACT,MAAAJ,EAAK,UAAU,IACVI,MAEPJ,EAAK,QAAQ;AAAA,IAEjB;AAAA,EAAA;AAEJ;;;;;;;;;;;ACyBM,UAAAQ,IAASC,EAAwB,CAAA,CAAE,GACnCC,IAAQC,GAIRZ,IAAY,OAAOa,MAA6B;AACpD,UAAIC,IAAe,CAAA;AAEf,UAAA;AACK,QAAAA,IAAA,MAAMH,EAAM,OAAOE,CAAM;AAAA,MAAA,QAC1B;AAAA,MAER;AAEO,aAAAC;AAAA,IAAA,GAGHC,IAAe,CAACC,GAAcC,MAAgB;AAClD,MAAAD,EAAM,eAAe,GAEjBP,EAAO,MAAMQ,CAAG,MAAM,QACxBR,EAAO,QAAQ,EAAE,CAACQ,CAAG,GAAG,OAAO,IACtBR,EAAO,MAAMQ,CAAG,MAAM,SAC/BR,EAAO,QAAQ,KAEfA,EAAO,QAAQ,EAAE,CAACQ,CAAG,GAAG,MAAM;AAAA,IAChC,GAGIlB,IAAiBQ,EAAuB,OAAO;AAAA,MACnD,UAAUI,EAAM;AAAA,MAChB,QAAQF,EAAO;AAAA,IACf,EAAA,GAEI;AAAA,MACJ,MAAAR;AAAA,MAAM,WAAAiB;AAAA,MAAW,UAAAC;AAAA,MAAU,UAAAC;AAAA,MAAU,UAAAC;AAAA,MAAU,QAAAhB;AAAA,MAAQ,SAAAiB;AAAA,MAAS,OAAOC;AAAA,QACrEzB,EAAkC;AAAA,MACpC,gBAAAC;AAAA,MACA,WAAAC;AAAA,IAAA,CACD;AAIY,WAAAwB,EAAA;AAAA,MACX,SAAAF;AAAA,MACA,QAAAjB;AAAA,MACA,MAAAkB;AAAA,IAAA,CACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/vst.umd.js CHANGED
@@ -1,2 +1,2 @@
1
- (function(e,g){typeof exports=="object"&&typeof module<"u"?module.exports=g(require("vue")):typeof define=="function"&&define.amd?define(["vue"],g):(e=typeof globalThis<"u"?globalThis:e||self,e.VueSlimTable=g(e.Vue))})(this,function(e){"use strict";const g="",B=["colspan"],V=[e.createElementVNode("div",null,null,-1)],C=e.defineComponent({__name:"loading_row",props:{columnsLength:{type:Number,required:!0}},setup(i){const p=Math.floor(Math.random()*10)+1;return(o,l)=>(e.openBlock(),e.createElementBlock("tr",null,[e.createElementVNode("td",{colspan:i.columnsLength,class:e.normalizeClass(["vst-loading-row",`vst-loading-row-${p}`])},V,10,B)]))}}),a={INITIAL:"INITIAL",SYNCING:"SYNCING",SYNCED:"SYNCED",FAILED:"FAILED"},$=({initialFilters:i,loadItems:p})=>{const o=e.ref(1),l=e.ref([]),s=e.ref(a.INITIAL),c=async()=>{s.value=a.SYNCING;try{l.value=await p({...i.value,page:o.value}),s.value=a.SYNCED}catch{l.value=[],s.value=a.FAILED}};return e.watch(i,c),e.watch(o,c),c(),{page:o,items:l,syncState:s,isSyncing:e.computed(()=>s.value===a.SYNCING),isSynced:e.computed(()=>s.value===a.SYNCED),isFailed:e.computed(()=>s.value===a.FAILED),nextPage:()=>{o.value+=1},prevPage:()=>{o.value-=1},setPage:h=>{o.value=h},reload:c,refetch:()=>{o.value===1?c():o.value=1}}},I={class:"vst"},b={key:0},L={key:0},_=["colspan"],w=["colspan"],D={key:0,class:"vst-pagination"};return e.defineComponent({__name:"slim_table",props:{columns:{},perPage:{default:25},source:{}},setup(i,{expose:p}){const o=i,l=e.shallowRef({}),s=async t=>{let r=[];try{r=await o.source(t)}catch{}return r},c=(t,r)=>{t.preventDefault(),l.value[r]==="asc"?l.value={[r]:"desc"}:l.value[r]==="desc"?l.value={}:l.value={[r]:"asc"}},h=e.computed(()=>({per_page:o.perPage,orders:l})),{page:N,isSyncing:k,isSynced:E,prevPage:y,nextPage:S,reload:P,refetch:T,items:d}=$({initialFilters:h,loadItems:s});return p({refetch:T,reload:P,rows:d}),(t,r)=>(e.openBlock(),e.createElementBlock("table",I,[t.columns.length?(e.openBlock(),e.createElementBlock("thead",b,[e.renderSlot(t.$slots,"thead:before"),e.renderSlot(t.$slots,"thead",{columns:t.columns,orders:l.value},()=>[e.createElementVNode("tr",null,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.columns,n=>(e.openBlock(),e.createElementBlock("th",e.mergeProps({key:n.key,class:["vst-th",{"vst-orderable":n.orderable}]},e.toHandlers(n.orderable?{click:m=>c(m,n.key)}:{},!0)),[n.orderable?(e.openBlock(),e.createElementBlock("div",L,[e.renderSlot(t.$slots,`thead:${n.key}`,{column:n,orders:l.value},()=>[e.createTextVNode(e.toDisplayString(n.title),1)]),e.createElementVNode("i",{class:e.normalizeClass(["vst-orderable-toggle",l.value[n.key]])},null,2)])):e.renderSlot(t.$slots,`thead:${n.key}`,{key:1,column:n,orders:l.value},()=>[e.createTextVNode(e.toDisplayString(n.title),1)])],16))),128))])]),e.renderSlot(t.$slots,"thead:after")])):e.createCommentVNode("",!0),e.createElementVNode("tbody",null,[e.unref(k)?e.renderSlot(t.$slots,"row:loading",{key:0},()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.perPage,n=>(e.openBlock(),e.createBlock(C,{key:`loadingRow${n}`,"columns-length":t.columns.length},null,8,["columns-length"]))),128))]):e.unref(E)&&e.unref(d).length===0?e.renderSlot(t.$slots,"row:empty",{key:1},()=>[e.createElementVNode("tr",null,[e.createElementVNode("td",{colspan:t.columns.length}," No records found ",8,_)])]):e.unref(E)&&e.unref(d).length?(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:2},e.renderList(e.unref(d),(n,m)=>e.renderSlot(t.$slots,"row",{row:n,index:m,columns:t.columns},()=>[(e.openBlock(),e.createElementBlock("tr",{key:n.id||m},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.columns,f=>(e.openBlock(),e.createElementBlock("td",{key:f.key},[e.renderSlot(t.$slots,`cell:${f.key}`,{row:n,value:n[f.key],column:f,index:m},()=>[e.createTextVNode(e.toDisplayString(n[f.key]),1)])]))),128))]))])),256)):e.createCommentVNode("",!0)]),e.createElementVNode("tfoot",null,[e.createElementVNode("tr",null,[e.createElementVNode("td",{colspan:t.columns.length},[e.renderSlot(t.$slots,"pagination",{page:e.unref(N),rows:e.unref(d)},()=>[e.unref(N)>1||e.unref(d).length===t.perPage||e.unref(k)?(e.openBlock(),e.createElementBlock("ul",D,[e.createElementVNode("li",{class:e.normalizeClass(["vst-page-item",{disabled:e.unref(N)===1||e.unref(k)}])},[e.createElementVNode("a",{class:"vst-page-link",onClick:r[0]||(r[0]=e.withModifiers((...n)=>e.unref(y)&&e.unref(y)(...n),["prevent"]))},"←")],2),e.createElementVNode("li",{class:e.normalizeClass(["vst-page-item",{disabled:e.unref(d).length<t.perPage||e.unref(k)}])},[e.createElementVNode("a",{class:"vst-page-link",onClick:r[1]||(r[1]=e.withModifiers((...n)=>e.unref(S)&&e.unref(S)(...n),["prevent"]))},"→")],2)])):e.createCommentVNode("",!0)])],8,w)])])]))}})});
1
+ (function(e,g){typeof exports=="object"&&typeof module<"u"?module.exports=g(require("vue")):typeof define=="function"&&define.amd?define(["vue"],g):(e=typeof globalThis<"u"?globalThis:e||self,e.VueSlimTable=g(e.Vue))})(this,function(e){"use strict";const g="",B=["colspan"],V=e.defineComponent({__name:"loading_row",props:{columnsLength:{type:Number,required:!0}},setup(i){const p=Math.floor(Math.random()*10)+1;return(l,o)=>(e.openBlock(),e.createElementBlock("tr",null,[e.createElementVNode("td",{colspan:i.columnsLength,class:e.normalizeClass(["vst-loading-row",`vst-loading-row-${p}`])},o[0]||(o[0]=[e.createElementVNode("div",null,null,-1)]),10,B)]))}}),a={INITIAL:"INITIAL",SYNCING:"SYNCING",SYNCED:"SYNCED",FAILED:"FAILED"},C=({initialFilters:i,loadItems:p})=>{const l=e.ref(1),o=e.ref([]),s=e.ref(a.INITIAL),d=async()=>{s.value=a.SYNCING;try{o.value=await p({...i.value,page:l.value}),s.value=a.SYNCED}catch{o.value=[],s.value=a.FAILED}};return e.watch(l,d),e.watch(i,d,{deep:!0}),d(),{page:l,items:o,syncState:s,isSyncing:e.computed(()=>s.value===a.SYNCING),isSynced:e.computed(()=>s.value===a.SYNCED),isFailed:e.computed(()=>s.value===a.FAILED),nextPage:()=>{l.value+=1},prevPage:()=>{l.value-=1},setPage:N=>{l.value=N},reload:d,refetch:()=>{l.value===1?d():l.value=1}}},I={class:"vst"},$={key:0},b={key:0},L=["colspan"],w=["colspan"],D={key:0,class:"vst-pagination"};return e.defineComponent({__name:"slim_table",props:{columns:{},perPage:{default:25},source:{}},setup(i,{expose:p}){const l=e.shallowRef({}),o=i,s=async t=>{let r=[];try{r=await o.source(t)}catch{}return r},d=(t,r)=>{t.preventDefault(),l.value[r]==="asc"?l.value={[r]:"desc"}:l.value[r]==="desc"?l.value={}:l.value={[r]:"asc"}},N=e.computed(()=>({per_page:o.perPage,orders:l.value})),{page:h,isSyncing:k,isSynced:E,prevPage:y,nextPage:S,reload:P,refetch:T,items:c}=C({initialFilters:N,loadItems:s});return p({refetch:T,reload:P,rows:c}),(t,r)=>(e.openBlock(),e.createElementBlock("table",I,[t.columns.length?(e.openBlock(),e.createElementBlock("thead",$,[e.renderSlot(t.$slots,"thead:before"),e.renderSlot(t.$slots,"thead",{columns:t.columns,orders:l.value},()=>[e.createElementVNode("tr",null,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.columns,n=>(e.openBlock(),e.createElementBlock("th",e.mergeProps({key:n.key,class:["vst-th",{"vst-orderable":n.orderable}]},e.toHandlers(n.orderable?{click:m=>d(m,n.key)}:{},!0)),[n.orderable?(e.openBlock(),e.createElementBlock("div",b,[e.renderSlot(t.$slots,`thead:${n.key}`,{column:n,orders:l.value},()=>[e.createTextVNode(e.toDisplayString(n.title),1)]),e.createElementVNode("i",{class:e.normalizeClass(["vst-orderable-toggle",l.value[n.key]])},null,2)])):e.renderSlot(t.$slots,`thead:${n.key}`,{key:1,column:n,orders:l.value},()=>[e.createTextVNode(e.toDisplayString(n.title),1)])],16))),128))])]),e.renderSlot(t.$slots,"thead:after")])):e.createCommentVNode("",!0),e.createElementVNode("tbody",null,[e.unref(k)?e.renderSlot(t.$slots,"row:loading",{key:0},()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.perPage,n=>(e.openBlock(),e.createBlock(V,{key:`loadingRow${n}`,"columns-length":t.columns.length},null,8,["columns-length"]))),128))]):e.unref(E)&&e.unref(c).length===0?e.renderSlot(t.$slots,"row:empty",{key:1},()=>[e.createElementVNode("tr",null,[e.createElementVNode("td",{colspan:t.columns.length}," No records found ",8,L)])]):e.unref(E)&&e.unref(c).length?(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:2},e.renderList(e.unref(c),(n,m)=>e.renderSlot(t.$slots,"row",{row:n,index:m,columns:t.columns},()=>[(e.openBlock(),e.createElementBlock("tr",{key:n.id||m},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.columns,f=>(e.openBlock(),e.createElementBlock("td",{key:f.key},[e.renderSlot(t.$slots,`cell:${f.key}`,{row:n,value:n[f.key],column:f,index:m},()=>[e.createTextVNode(e.toDisplayString(n[f.key]),1)])]))),128))]))])),256)):e.createCommentVNode("",!0)]),e.createElementVNode("tfoot",null,[e.createElementVNode("tr",null,[e.createElementVNode("td",{colspan:t.columns.length},[e.renderSlot(t.$slots,"pagination",{page:e.unref(h),rows:e.unref(c)},()=>[e.unref(h)>1||e.unref(c).length===t.perPage||e.unref(k)?(e.openBlock(),e.createElementBlock("ul",D,[e.createElementVNode("li",{class:e.normalizeClass(["vst-page-item",{disabled:e.unref(h)===1||e.unref(k)}])},[e.createElementVNode("a",{class:"vst-page-link",onClick:r[0]||(r[0]=e.withModifiers((...n)=>e.unref(y)&&e.unref(y)(...n),["prevent"]))},"←")],2),e.createElementVNode("li",{class:e.normalizeClass(["vst-page-item",{disabled:e.unref(c).length<t.perPage||e.unref(k)}])},[e.createElementVNode("a",{class:"vst-page-link",onClick:r[1]||(r[1]=e.withModifiers((...n)=>e.unref(S)&&e.unref(S)(...n),["prevent"]))},"→")],2)])):e.createCommentVNode("",!0)])],8,w)])])]))}})});
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/components/slim_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, watch, Ref, ComputedRef,\n} from 'vue'\n\ntype UseFiltetableArgs<T, S> = {\n initialFilters: ComputedRef<T>\n loadItems: (_params: T & { page: number }) => Promise<S[]>\n}\n\nexport const SYNC_STATES = {\n INITIAL: 'INITIAL',\n SYNCING: 'SYNCING',\n SYNCED: 'SYNCED',\n FAILED: 'FAILED',\n} as const\n\ntype SynsState = (typeof SYNC_STATES)[keyof typeof SYNC_STATES]\n\nexport default <TFilters, TItem>({\n initialFilters,\n loadItems,\n}: UseFiltetableArgs<TFilters, TItem>) => {\n const page = ref(1)\n const items: Ref<TItem[]> = ref([])\n const syncState = ref<SynsState>(SYNC_STATES.INITIAL)\n\n const reload = async () => {\n syncState.value = SYNC_STATES.SYNCING\n\n try {\n items.value = await loadItems({\n ...initialFilters.value,\n page: page.value,\n })\n syncState.value = SYNC_STATES.SYNCED\n } catch {\n items.value = []\n syncState.value = SYNC_STATES.FAILED\n }\n }\n\n watch(initialFilters, reload)\n watch(page, reload)\n reload()\n\n return {\n page,\n items,\n syncState,\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 nextPage: () => {\n page.value += 1\n },\n prevPage: () => {\n page.value -= 1\n },\n setPage: (num: number) => {\n page.value = num\n },\n reload,\n refetch: () => {\n if (page.value === 1) {\n reload()\n } else {\n page.value = 1\n }\n },\n }\n}\n","<template>\n <table class=\"vst\">\n <thead v-if=\"columns.length\">\n <slot name=\"thead:before\" />\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: (event: Event) => onOrderClick(event, column.key) } : {}\">\n <div v-if=\"column.orderable\">\n <slot\n :name=\"`thead:${column.key}`\"\n :column=\"column\"\n :orders=\"orders\">\n {{ column.title }}\n </slot>\n\n <i :class=\"['vst-orderable-toggle', orders[column.key]]\" />\n </div>\n\n <slot\n v-else\n :name=\"`thead:${column.key}`\"\n :column=\"column\"\n :orders=\"orders\">\n {{ column.title }}\n </slot>\n </th>\n </tr>\n </slot>\n <slot name=\"thead:after\" />\n </thead>\n <tbody>\n <slot v-if=\"isSyncing\" name=\"row:loading\">\n <LoadingRow v-for=\"i in perPage\" :key=\"`loadingRow${i}`\" :columns-length=\"columns.length\" />\n </slot>\n\n <slot v-else-if=\"isSynced && rows.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.length\">\n <slot\n v-for=\"(row, i) in rows\"\n name=\"row\"\n :row=\"row\"\n :index=\"i\"\n :columns=\"columns\">\n <tr :key=\"row['id'] || i\">\n <td v-for=\"column in columns\" :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\">\n <ul v-if=\"page > 1 || rows.length === perPage || isSyncing\" class=\"vst-pagination\">\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 :class=\"['vst-page-item', { disabled: rows.length < perPage || isSyncing }]\">\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\" generic=\"TRow extends TableRow\">\nimport { computed, shallowRef } from 'vue'\nimport LoadingRow from './loading_row.vue'\n\nimport useFilterable from '../use/filterable'\n\nimport type {\n TableOrders, TableFetchParams, TableRow, TableFilters, TableProps, TableSlots,\n} from '@/ts/types'\n\nconst orders = shallowRef<TableOrders>({})\nconst props = withDefaults(defineProps<TableProps<TRow>>(), {\n perPage: 25,\n})\n\nconst loadItems = async (params: TableFetchParams) => {\n let data: TRow[] = []\n\n try {\n data = await props.source(params)\n } catch {\n // TODO: show errors\n }\n\n return data\n}\n\nconst onOrderClick = (event: Event, key: string) => {\n event.preventDefault()\n\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 initialFilters = computed<TableFilters>(() => ({\n per_page: props.perPage,\n orders,\n}))\n\nconst {\n page, isSyncing, isSynced, prevPage, nextPage, reload, refetch, items: rows,\n} = useFilterable<TableFilters, TRow>({\n initialFilters,\n loadItems,\n})\n\ndefineSlots<TableSlots<TRow>>()\n\ndefineExpose({\n refetch,\n reload,\n rows,\n})\n</script>\n"],"names":["randNum","SYNC_STATES","useFilterable","initialFilters","loadItems","page","ref","items","syncState","reload","watch","computed","num","orders","shallowRef","params","data","props","onOrderClick","event","key","isSyncing","isSynced","prevPage","nextPage","refetch","rows","__expose"],"mappings":"kaAeA,MAAMA,EAAU,KAAK,MAAM,KAAK,SAAW,EAAE,EAAI,mMCNpCC,EAAc,CACzB,QAAS,UACT,QAAS,UACT,OAAQ,SACR,OAAQ,QACV,EAIAC,EAAe,CAAkB,CAC/B,eAAAC,EACA,UAAAC,CACF,IAA0C,CAClC,MAAAC,EAAOC,MAAI,CAAC,EACZC,EAAsBD,MAAI,CAAA,CAAE,EAC5BE,EAAYF,EAAAA,IAAeL,EAAY,OAAO,EAE9CQ,EAAS,SAAY,CACzBD,EAAU,MAAQP,EAAY,QAE1B,GAAA,CACIM,EAAA,MAAQ,MAAMH,EAAU,CAC5B,GAAGD,EAAe,MAClB,KAAME,EAAK,KAAA,CACZ,EACDG,EAAU,MAAQP,EAAY,MAAA,MACxB,CACNM,EAAM,MAAQ,GACdC,EAAU,MAAQP,EAAY,MAChC,CAAA,EAGFS,OAAAA,QAAMP,EAAgBM,CAAM,EAC5BC,QAAML,EAAMI,CAAM,EACXA,IAEA,CACL,KAAAJ,EACA,MAAAE,EACA,UAAAC,EACA,UAAWG,EAAS,SAAA,IAAMH,EAAU,QAAUP,EAAY,OAAO,EACjE,SAAUU,EAAS,SAAA,IAAMH,EAAU,QAAUP,EAAY,MAAM,EAC/D,SAAUU,EAAS,SAAA,IAAMH,EAAU,QAAUP,EAAY,MAAM,EAC/D,SAAU,IAAM,CACdI,EAAK,OAAS,CAChB,EACA,SAAU,IAAM,CACdA,EAAK,OAAS,CAChB,EACA,QAAUO,GAAgB,CACxBP,EAAK,MAAQO,CACf,EACA,OAAAH,EACA,QAAS,IAAM,CACTJ,EAAK,QAAU,EACVI,IAEPJ,EAAK,MAAQ,CAEjB,CAAA,CAEJ,iOC6BMQ,EAASC,aAAwB,CAAA,CAAE,EAKnCV,EAAY,MAAOW,GAA6B,CACpD,IAAIC,EAAe,CAAA,EAEf,GAAA,CACKA,EAAA,MAAMC,EAAM,OAAOF,CAAM,CAAA,MAC1B,CAER,CAEO,OAAAC,CAAA,EAGHE,EAAe,CAACC,EAAcC,IAAgB,CAClDD,EAAM,eAAe,EAEjBN,EAAO,MAAMO,CAAG,IAAM,MACxBP,EAAO,MAAQ,CAAE,CAACO,CAAG,EAAG,MAAO,EACtBP,EAAO,MAAMO,CAAG,IAAM,OAC/BP,EAAO,MAAQ,GAEfA,EAAO,MAAQ,CAAE,CAACO,CAAG,EAAG,KAAM,CAChC,EAGIjB,EAAiBQ,EAAAA,SAAuB,KAAO,CACnD,SAAUM,EAAM,QAChB,OAAAJ,CACA,EAAA,EAEI,CACJ,KAAAR,EAAM,UAAAgB,EAAW,SAAAC,EAAU,SAAAC,EAAU,SAAAC,EAAU,OAAAf,EAAQ,QAAAgB,EAAS,MAAOC,GACrExB,EAAkC,CACpC,eAAAC,EACA,UAAAC,CAAA,CACD,EAIY,OAAAuB,EAAA,CACX,QAAAF,EACA,OAAAhB,EACA,KAAAiB,CAAA,CACD"}
1
+ {"version":3,"file":"vst.umd.js","sources":["../src/ts/components/loading_row.vue","../src/ts/use/filterable.ts","../src/ts/components/slim_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, watch, Ref, ComputedRef,\n} from 'vue'\n\ntype UseFiltetableArgs<T, S> = {\n initialFilters: ComputedRef<T>\n loadItems: (_params: T & { page: number }) => Promise<S[]>\n}\n\nexport const SYNC_STATES = {\n INITIAL: 'INITIAL',\n SYNCING: 'SYNCING',\n SYNCED: 'SYNCED',\n FAILED: 'FAILED',\n} as const\n\ntype SynsState = (typeof SYNC_STATES)[keyof typeof SYNC_STATES]\n\nexport default <TFilters, TItem>({\n initialFilters,\n loadItems,\n}: UseFiltetableArgs<TFilters, TItem>) => {\n const page = ref(1)\n const items: Ref<TItem[]> = ref([])\n const syncState = ref<SynsState>(SYNC_STATES.INITIAL)\n\n const reload = async () => {\n syncState.value = SYNC_STATES.SYNCING\n\n try {\n items.value = await loadItems({\n ...initialFilters.value,\n page: page.value,\n })\n syncState.value = SYNC_STATES.SYNCED\n } catch {\n items.value = []\n syncState.value = SYNC_STATES.FAILED\n }\n }\n\n watch(page, reload)\n watch(\n initialFilters,\n reload,\n { deep: true },\n )\n reload()\n\n return {\n page,\n items,\n syncState,\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 nextPage: () => {\n page.value += 1\n },\n prevPage: () => {\n page.value -= 1\n },\n setPage: (num: number) => {\n page.value = num\n },\n reload,\n refetch: () => {\n if (page.value === 1) {\n reload()\n } else {\n page.value = 1\n }\n },\n }\n}\n","<template>\n <table class=\"vst\">\n <thead v-if=\"columns.length\">\n <slot name=\"thead:before\" />\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: (event: Event) => onOrderClick(event, column.key) } : {}\">\n <div v-if=\"column.orderable\">\n <slot\n :name=\"`thead:${column.key}`\"\n :column=\"column\"\n :orders=\"orders\">\n {{ column.title }}\n </slot>\n\n <i :class=\"['vst-orderable-toggle', orders[column.key]]\" />\n </div>\n\n <slot\n v-else\n :name=\"`thead:${column.key}`\"\n :column=\"column\"\n :orders=\"orders\">\n {{ column.title }}\n </slot>\n </th>\n </tr>\n </slot>\n <slot name=\"thead:after\" />\n </thead>\n <tbody>\n <slot v-if=\"isSyncing\" name=\"row:loading\">\n <LoadingRow v-for=\"i in perPage\" :key=\"`loadingRow${i}`\" :columns-length=\"columns.length\" />\n </slot>\n\n <slot v-else-if=\"isSynced && rows.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.length\">\n <slot\n v-for=\"(row, i) in rows\"\n name=\"row\"\n :row=\"row\"\n :index=\"i\"\n :columns=\"columns\">\n <tr :key=\"row['id'] || i\">\n <td v-for=\"column in columns\" :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\">\n <ul v-if=\"page > 1 || rows.length === perPage || isSyncing\" class=\"vst-pagination\">\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 :class=\"['vst-page-item', { disabled: rows.length < perPage || isSyncing }]\">\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\" generic=\"TRow extends TableRow\">\nimport { computed, shallowRef } from 'vue'\nimport LoadingRow from './loading_row.vue'\n\nimport useFilterable from '../use/filterable'\n\nimport type {\n TableOrders, TableFetchParams, TableRow, TableFilters, TableProps, TableSlots,\n} from '@/ts/types'\n\nconst orders = shallowRef<TableOrders>({})\nconst props = withDefaults(defineProps<TableProps<TRow>>(), {\n perPage: 25,\n})\n\nconst loadItems = async (params: TableFetchParams) => {\n let data: TRow[] = []\n\n try {\n data = await props.source(params)\n } catch {\n // TODO: show errors\n }\n\n return data\n}\n\nconst onOrderClick = (event: Event, key: string) => {\n event.preventDefault()\n\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 initialFilters = computed<TableFilters>(() => ({\n per_page: props.perPage,\n orders: orders.value,\n}))\n\nconst {\n page, isSyncing, isSynced, prevPage, nextPage, reload, refetch, items: rows,\n} = useFilterable<TableFilters, TRow>({\n initialFilters,\n loadItems,\n})\n\ndefineSlots<TableSlots<TRow>>()\n\ndefineExpose({\n refetch,\n reload,\n rows,\n})\n</script>\n"],"names":["randNum","SYNC_STATES","useFilterable","initialFilters","loadItems","page","ref","items","syncState","reload","watch","computed","num","orders","shallowRef","props","__props","params","data","onOrderClick","event","key","isSyncing","isSynced","prevPage","nextPage","refetch","rows","__expose"],"mappings":"qXAeA,MAAMA,EAAU,KAAK,MAAM,KAAK,SAAW,EAAE,EAAI,yPCNpCC,EAAc,CACzB,QAAS,UACT,QAAS,UACT,OAAQ,SACR,OAAQ,QACV,EAIAC,EAAe,CAAkB,CAC/B,eAAAC,EACA,UAAAC,CACF,IAA0C,CAClC,MAAAC,EAAOC,MAAI,CAAC,EACZC,EAAsBD,MAAI,CAAA,CAAE,EAC5BE,EAAYF,EAAAA,IAAeL,EAAY,OAAO,EAE9CQ,EAAS,SAAY,CACzBD,EAAU,MAAQP,EAAY,QAE1B,GAAA,CACIM,EAAA,MAAQ,MAAMH,EAAU,CAC5B,GAAGD,EAAe,MAClB,KAAME,EAAK,KAAA,CACZ,EACDG,EAAU,MAAQP,EAAY,MAAA,MACxB,CACNM,EAAM,MAAQ,GACdC,EAAU,MAAQP,EAAY,MAChC,CAAA,EAGFS,OAAAA,QAAML,EAAMI,CAAM,EAClBC,EAAA,MACEP,EACAM,EACA,CAAE,KAAM,EAAK,CAAA,EAERA,IAEA,CACL,KAAAJ,EACA,MAAAE,EACA,UAAAC,EACA,UAAWG,EAAS,SAAA,IAAMH,EAAU,QAAUP,EAAY,OAAO,EACjE,SAAUU,EAAS,SAAA,IAAMH,EAAU,QAAUP,EAAY,MAAM,EAC/D,SAAUU,EAAS,SAAA,IAAMH,EAAU,QAAUP,EAAY,MAAM,EAC/D,SAAU,IAAM,CACdI,EAAK,OAAS,CAChB,EACA,SAAU,IAAM,CACdA,EAAK,OAAS,CAChB,EACA,QAAUO,GAAgB,CACxBP,EAAK,MAAQO,CACf,EACA,OAAAH,EACA,QAAS,IAAM,CACTJ,EAAK,QAAU,EACVI,IAEPJ,EAAK,MAAQ,CAEjB,CAAA,CAEJ,uNCyBM,MAAAQ,EAASC,aAAwB,CAAA,CAAE,EACnCC,EAAQC,EAIRZ,EAAY,MAAOa,GAA6B,CACpD,IAAIC,EAAe,CAAA,EAEf,GAAA,CACKA,EAAA,MAAMH,EAAM,OAAOE,CAAM,CAAA,MAC1B,CAER,CAEO,OAAAC,CAAA,EAGHC,EAAe,CAACC,EAAcC,IAAgB,CAClDD,EAAM,eAAe,EAEjBP,EAAO,MAAMQ,CAAG,IAAM,MACxBR,EAAO,MAAQ,CAAE,CAACQ,CAAG,EAAG,MAAO,EACtBR,EAAO,MAAMQ,CAAG,IAAM,OAC/BR,EAAO,MAAQ,GAEfA,EAAO,MAAQ,CAAE,CAACQ,CAAG,EAAG,KAAM,CAChC,EAGIlB,EAAiBQ,EAAAA,SAAuB,KAAO,CACnD,SAAUI,EAAM,QAChB,OAAQF,EAAO,KACf,EAAA,EAEI,CACJ,KAAAR,EAAM,UAAAiB,EAAW,SAAAC,EAAU,SAAAC,EAAU,SAAAC,EAAU,OAAAhB,EAAQ,QAAAiB,EAAS,MAAOC,GACrEzB,EAAkC,CACpC,eAAAC,EACA,UAAAC,CAAA,CACD,EAIY,OAAAwB,EAAA,CACX,QAAAF,EACA,OAAAjB,EACA,KAAAkB,CAAA,CACD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vue-slim-tables",
3
- "version": "0.3.6",
3
+ "version": "0.3.7",
4
4
  "files": [
5
5
  "dist"
6
6
  ],