@oneflowui/ui 0.8.4 → 0.8.6

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.
Files changed (36) hide show
  1. package/README.en.md +296 -0
  2. package/README.md +296 -0
  3. package/dist/components/ai/AiMessageList.vue.js +1 -1
  4. package/dist/components/ai/AiMessageList.vue2.js +28 -27
  5. package/dist/components/common/ThemeScope.vue.d.ts +24 -0
  6. package/dist/components/common/ThemeScope.vue.js +24 -0
  7. package/dist/components/common/ThemeScope.vue2.js +4 -0
  8. package/dist/components/common/ThemeScopeScene.vue.d.ts +31 -0
  9. package/dist/components/common/ThemeScopeScene.vue.js +7 -0
  10. package/dist/components/common/ThemeScopeScene.vue2.js +56 -0
  11. package/dist/components/common/index.d.ts +2 -0
  12. package/dist/components/database/DatabaseView.vue.d.ts +4 -4
  13. package/dist/components/database/DatabaseView.vue.js +4 -4
  14. package/dist/components/database/DatabaseView.vue2.js +135 -134
  15. package/dist/components/database/index.d.ts +1 -1
  16. package/dist/components/kanban/KanbanColumn.vue.js +3 -3
  17. package/dist/components/kanban/KanbanColumn.vue2.js +31 -30
  18. package/dist/components/table/DataTable.vue.js +2 -2
  19. package/dist/components/table/DataTable.vue2.js +251 -249
  20. package/dist/composables/index.d.ts +5 -3
  21. package/dist/composables/useDataTableLayout.d.ts +1 -0
  22. package/dist/composables/useDataTableLayout.js +29 -26
  23. package/dist/composables/useDatabaseView.d.ts +1 -1
  24. package/dist/composables/useDatabaseView.js +311 -284
  25. package/dist/composables/useDatabaseViewMiddleware.d.ts +56 -0
  26. package/dist/composables/useDatabaseViewMiddleware.js +158 -0
  27. package/dist/composables/useVirtualList.d.ts +11 -0
  28. package/dist/composables/useVirtualList.js +146 -104
  29. package/dist/composables.js +74 -0
  30. package/dist/contracts/database.d.ts +23 -0
  31. package/dist/index.d.ts +6 -3
  32. package/dist/index.js +267 -253
  33. package/dist/style.css +1 -1
  34. package/dist/theme.d.ts +1 -0
  35. package/dist/theme.js +4 -0
  36. package/package.json +16 -2
@@ -0,0 +1,56 @@
1
+ import { DataRecord } from '../types';
2
+ import { DatabaseViewActionContext, DatabaseViewActionErrorContext, DatabaseViewActionMiddleware } from '../contracts/database';
3
+ export interface DatabaseViewToastMiddlewareOptions<T extends DataRecord = DataRecord> {
4
+ onSuccess?: (message: string, context: DatabaseViewActionContext<T>) => void | Promise<void>;
5
+ onError?: (message: string, context: DatabaseViewActionErrorContext<T>) => void | Promise<void>;
6
+ resolveSuccessMessage?: (context: DatabaseViewActionContext<T>) => string;
7
+ resolveErrorMessage?: (context: DatabaseViewActionErrorContext<T>) => string;
8
+ }
9
+ export interface DatabaseViewAnalyticsEvent<T extends DataRecord = DataRecord> {
10
+ phase: "before" | "after" | "error";
11
+ action: DatabaseViewActionContext<T>["action"];
12
+ tableId: string;
13
+ viewId: string;
14
+ selectedRecordId: string | null;
15
+ page: number;
16
+ pageSize: number;
17
+ totalCount: number;
18
+ payload: unknown;
19
+ error?: unknown;
20
+ }
21
+ export interface DatabaseViewAnalyticsMiddlewareOptions<T extends DataRecord = DataRecord> {
22
+ onEvent: (event: DatabaseViewAnalyticsEvent<T>) => void;
23
+ }
24
+ export interface DatabaseViewOptimisticMiddlewareOptions<T extends DataRecord = DataRecord> {
25
+ apply: (context: DatabaseViewActionContext<T>) => void | Promise<void>;
26
+ revert: (context: DatabaseViewActionErrorContext<T>) => void | Promise<void>;
27
+ shouldApply?: (context: DatabaseViewActionContext<T>) => boolean;
28
+ }
29
+ export interface DatabaseViewPresetMiddlewareOptions<T extends DataRecord = DataRecord> {
30
+ toast?: DatabaseViewToastMiddlewareOptions<T> | false;
31
+ analytics?: DatabaseViewAnalyticsMiddlewareOptions<T> | false;
32
+ optimistic?: DatabaseViewOptimisticMiddlewareOptions<T> | false;
33
+ extra?: readonly DatabaseViewMiddlewareInput<T>[];
34
+ }
35
+ export interface DatabaseViewPresetBundleOptions<T extends DataRecord = DataRecord> {
36
+ middlewares?: DatabaseViewMiddlewareInput<T>[];
37
+ toast?: DatabaseViewToastMiddlewareOptions<T>;
38
+ analytics?: DatabaseViewAnalyticsMiddlewareOptions<T>;
39
+ optimistic?: DatabaseViewOptimisticMiddlewareOptions<T>;
40
+ }
41
+ export interface DatabaseViewPresetBundle<T extends DataRecord = DataRecord> {
42
+ middleware: DatabaseViewActionMiddleware<T>;
43
+ presets: {
44
+ toast?: DatabaseViewActionMiddleware<T>;
45
+ analytics?: DatabaseViewActionMiddleware<T>;
46
+ optimistic?: DatabaseViewActionMiddleware<T>;
47
+ };
48
+ }
49
+ export type DatabaseViewMiddlewareInput<T extends DataRecord = DataRecord> = DatabaseViewActionMiddleware<T> | readonly DatabaseViewMiddlewareInput<T>[] | null | undefined;
50
+ export declare function createDatabaseViewToastMiddleware<T extends DataRecord = DataRecord>(options?: DatabaseViewToastMiddlewareOptions<T>): DatabaseViewActionMiddleware<T>;
51
+ export declare function createDatabaseViewAnalyticsMiddleware<T extends DataRecord = DataRecord>(options: DatabaseViewAnalyticsMiddlewareOptions<T>): DatabaseViewActionMiddleware<T>;
52
+ export declare function createDatabaseViewOptimisticMiddleware<T extends DataRecord = DataRecord>(options: DatabaseViewOptimisticMiddlewareOptions<T>): DatabaseViewActionMiddleware<T>;
53
+ export declare function createDatabaseViewPresetBundle<T extends DataRecord = DataRecord>(options?: DatabaseViewPresetBundleOptions<T>): DatabaseViewPresetBundle<T>;
54
+ export declare function composeDatabaseViewMiddlewares<T extends DataRecord = DataRecord>(...inputs: DatabaseViewMiddlewareInput<T>[]): DatabaseViewActionMiddleware<T>;
55
+ export declare function createDatabaseViewPresetInputs<T extends DataRecord = DataRecord>(options: DatabaseViewPresetMiddlewareOptions<T>): DatabaseViewMiddlewareInput<T>[];
56
+ export declare function createDatabaseViewPresetMiddleware<T extends DataRecord = DataRecord>(options?: DatabaseViewPresetBundleOptions<T>): DatabaseViewActionMiddleware<T>;
@@ -0,0 +1,158 @@
1
+ function n(e) {
2
+ switch (e.action) {
3
+ case "cell-edit":
4
+ return "单元格更新已完成";
5
+ case "select-record":
6
+ return "记录选择已更新";
7
+ case "schema-event":
8
+ return "结构变更已处理";
9
+ case "save-view":
10
+ return "视图已保存";
11
+ case "delete-view":
12
+ return "视图已删除";
13
+ case "refresh":
14
+ return "数据视图已刷新";
15
+ }
16
+ }
17
+ function o(e) {
18
+ return `${n(e)}失败`;
19
+ }
20
+ function l(e = {}) {
21
+ return {
22
+ async after(a) {
23
+ var t;
24
+ const r = (e.resolveSuccessMessage ?? n)(a);
25
+ await ((t = e.onSuccess) == null ? void 0 : t.call(e, r, a));
26
+ },
27
+ async error(a) {
28
+ var t;
29
+ const r = (e.resolveErrorMessage ?? o)(a);
30
+ await ((t = e.onError) == null ? void 0 : t.call(e, r, a));
31
+ }
32
+ };
33
+ }
34
+ function u(e) {
35
+ const a = (r, t, i) => {
36
+ e.onEvent({
37
+ phase: r,
38
+ action: t.action,
39
+ tableId: t.tableId,
40
+ viewId: t.activeViewId,
41
+ selectedRecordId: t.selectedRecordId,
42
+ page: t.page,
43
+ pageSize: t.pageSize,
44
+ totalCount: t.totalCount,
45
+ payload: t.payload,
46
+ error: i
47
+ });
48
+ };
49
+ return {
50
+ before(r) {
51
+ a("before", r);
52
+ },
53
+ after(r) {
54
+ a("after", r);
55
+ },
56
+ error(r) {
57
+ a("error", r, r.error);
58
+ }
59
+ };
60
+ }
61
+ function f(e) {
62
+ const a = e.shouldApply ?? ((r) => r.action === "cell-edit");
63
+ return {
64
+ async before(r) {
65
+ a(r) && await e.apply(r);
66
+ },
67
+ async error(r) {
68
+ a(r) && await e.revert(r);
69
+ }
70
+ };
71
+ }
72
+ function w(e = {}) {
73
+ const a = {
74
+ toast: e.toast ? l(e.toast) : void 0,
75
+ analytics: e.analytics ? u(e.analytics) : void 0,
76
+ optimistic: e.optimistic ? f(e.optimistic) : void 0
77
+ };
78
+ return {
79
+ middleware: y(
80
+ ...e.middlewares ?? [],
81
+ a.analytics,
82
+ a.toast,
83
+ a.optimistic
84
+ ),
85
+ presets: a
86
+ };
87
+ }
88
+ function d(e) {
89
+ const a = [];
90
+ for (const r of e)
91
+ if (r) {
92
+ if (Array.isArray(r)) {
93
+ a.push(...d(r));
94
+ continue;
95
+ }
96
+ a.push(r);
97
+ }
98
+ return a;
99
+ }
100
+ function y(...e) {
101
+ const a = d(e), r = /* @__PURE__ */ new WeakMap();
102
+ return {
103
+ async before(t) {
104
+ let i = 0;
105
+ try {
106
+ for (const s of a) {
107
+ if (!s.before) {
108
+ i += 1;
109
+ continue;
110
+ }
111
+ await s.before(t), i += 1;
112
+ }
113
+ r.set(t, i);
114
+ } catch (s) {
115
+ throw r.set(t, i), s;
116
+ }
117
+ },
118
+ async after(t) {
119
+ const i = r.get(t) ?? a.length;
120
+ try {
121
+ for (let s = i - 1; s >= 0; s -= 1) {
122
+ const c = a[s];
123
+ c != null && c.after && await c.after(t);
124
+ }
125
+ } finally {
126
+ r.delete(t);
127
+ }
128
+ },
129
+ async error(t) {
130
+ const i = r.get(t) ?? a.length;
131
+ try {
132
+ for (let s = i - 1; s >= 0; s -= 1) {
133
+ const c = a[s];
134
+ c != null && c.error && await c.error(t);
135
+ }
136
+ } finally {
137
+ r.delete(t);
138
+ }
139
+ }
140
+ };
141
+ }
142
+ function g(e) {
143
+ var r;
144
+ const a = [];
145
+ return e.toast && a.push(l(e.toast)), e.analytics && a.push(u(e.analytics)), e.optimistic && a.push(f(e.optimistic)), (r = e.extra) != null && r.length && a.push(e.extra), a;
146
+ }
147
+ function h(e = {}) {
148
+ return w(e).middleware;
149
+ }
150
+ export {
151
+ y as composeDatabaseViewMiddlewares,
152
+ u as createDatabaseViewAnalyticsMiddleware,
153
+ f as createDatabaseViewOptimisticMiddleware,
154
+ w as createDatabaseViewPresetBundle,
155
+ g as createDatabaseViewPresetInputs,
156
+ h as createDatabaseViewPresetMiddleware,
157
+ l as createDatabaseViewToastMiddleware
158
+ };
@@ -1,10 +1,19 @@
1
1
  import { ComputedRef, Ref } from 'vue';
2
+ export interface VirtualListState {
3
+ scrollTop: Ref<number>;
4
+ containerHeight: Ref<number>;
5
+ invalidateVersion: Ref<number>;
6
+ setScrollTop: (scrollTop: number) => void;
7
+ setContainerHeight: (containerHeight: number) => void;
8
+ invalidate: () => void;
9
+ }
2
10
  export interface UseVirtualListOptions<T> {
3
11
  items: Ref<T[]>;
4
12
  itemHeight: number | ((index: number) => number);
5
13
  overscan?: number;
6
14
  containerRef: Ref<HTMLElement | null>;
7
15
  invalidateKey?: Ref<unknown>;
16
+ state?: VirtualListState;
8
17
  /** Optional callback to measure actual row height after render. When provided, measured heights override itemHeight. */
9
18
  measureRow?: boolean;
10
19
  }
@@ -12,6 +21,8 @@ export type VirtualItem<T> = {
12
21
  data: T;
13
22
  index: number;
14
23
  };
24
+ export declare function createVirtualListState(): VirtualListState;
25
+ export declare function useVirtualListStateCache(cacheKey?: string): VirtualListState;
15
26
  export declare function useVirtualList<T>(options: UseVirtualListOptions<T>): {
16
27
  visibleItems: ComputedRef<VirtualItem<T>[]>;
17
28
  totalHeight: ComputedRef<number>;
@@ -1,153 +1,195 @@
1
- import { ref as T, computed as p, watch as z, getCurrentScope as W, onScopeDispose as X } from "vue";
2
- function _(x) {
3
- var V;
4
- const { items: n, itemHeight: c, overscan: B = 5, containerRef: A } = x, s = T(0), v = T(0), h = typeof c == "number", m = Math.max(0, B), a = /* @__PURE__ */ new Map(), b = T(0);
5
- let d = null, f = null, l = null;
6
- function D(e) {
7
- return a.has(e) ? a.get(e) : h ? c : c(e);
1
+ import { ref as b, computed as S, watch as I, getCurrentScope as $, onScopeDispose as tt } from "vue";
2
+ const K = Symbol("oneui.virtual-list-state-persistent"), B = /* @__PURE__ */ new Map();
3
+ function _() {
4
+ const l = b(0), n = b(0), a = b(0);
5
+ return {
6
+ scrollTop: l,
7
+ containerHeight: n,
8
+ invalidateVersion: a,
9
+ setScrollTop(c) {
10
+ l.value = c;
11
+ },
12
+ setContainerHeight(c) {
13
+ n.value = c;
14
+ },
15
+ invalidate() {
16
+ a.value += 1;
17
+ }
18
+ };
19
+ }
20
+ function et(l) {
21
+ return l[K] = !0, l;
22
+ }
23
+ function nt(l) {
24
+ return !!l[K];
25
+ }
26
+ function it(l) {
27
+ const n = l.trim();
28
+ return n.length > 0 ? n : "default";
29
+ }
30
+ function rt(l = "default") {
31
+ const n = it(l), a = B.get(n);
32
+ if (a)
33
+ return a;
34
+ const c = et(_());
35
+ return B.set(n, c), c;
36
+ }
37
+ function at(l) {
38
+ var A;
39
+ const { items: n, itemHeight: a, overscan: c = 5, containerRef: U } = l, v = l.state ?? _(), { scrollTop: h, containerHeight: d } = v, m = typeof a == "number", M = Math.max(0, c), o = /* @__PURE__ */ new Map(), w = b(0);
40
+ let g = null, f = null, r = null;
41
+ function k(t) {
42
+ return o.has(t) ? o.get(t) : m ? a : a(t);
8
43
  }
9
- function K() {
10
- !x.measureRow || typeof ResizeObserver > "u" || (f = new ResizeObserver((e) => {
11
- let t = !1;
12
- for (const i of e) {
13
- const r = i.target.dataset.virtualIndex;
14
- if (r == null) continue;
15
- const u = parseInt(r, 10), g = i.contentRect.height;
16
- a.get(u) !== g && (a.set(u, g), t = !0);
44
+ function D() {
45
+ !l.measureRow || typeof ResizeObserver > "u" || (f = new ResizeObserver((t) => {
46
+ let e = !1;
47
+ for (const i of t) {
48
+ const s = i.target.dataset.virtualIndex;
49
+ if (s == null) continue;
50
+ const p = parseInt(s, 10), x = i.contentRect.height;
51
+ o.get(p) !== x && (o.set(p, x), e = !0);
17
52
  }
18
- t && b.value++;
53
+ e && w.value++;
19
54
  }));
20
55
  }
21
- K();
56
+ D();
22
57
  function C() {
23
- a.size !== 0 && (a.clear(), b.value++, l && M(l));
58
+ if (r && T(r), o.size > 0 && (o.clear(), w.value++), r) {
59
+ const t = Math.max(0, H.value - d.value);
60
+ h.value > t && (r.scrollTop = t, v.setScrollTop(t));
61
+ }
24
62
  }
25
- function P(e, t) {
26
- !e || !f || (e.dataset.virtualIndex = String(t), f.observe(e));
63
+ function N(t, e) {
64
+ !t || !f || (t.dataset.virtualIndex = String(e), f.observe(t));
27
65
  }
28
- const w = p(() => {
29
- if (b.value, h && a.size === 0) return [];
30
- const e = new Array(n.value.length + 1).fill(0);
31
- for (let t = 0; t < n.value.length; t += 1)
32
- e[t + 1] = e[t] + Math.max(0, D(t));
33
- return e;
34
- }), I = p(() => h && a.size === 0 ? n.value.length * c : w.value[n.value.length] ?? 0);
35
- function H(e) {
36
- const t = Math.max(0, Math.min(e, n.value.length));
37
- return h && a.size === 0 ? t * c : w.value[t] ?? 0;
66
+ const z = S(() => {
67
+ if (w.value, m && o.size === 0) return [];
68
+ const t = new Array(n.value.length + 1).fill(0);
69
+ for (let e = 0; e < n.value.length; e += 1)
70
+ t[e + 1] = t[e] + Math.max(0, k(e));
71
+ return t;
72
+ }), H = S(() => m && o.size === 0 ? n.value.length * a : z.value[n.value.length] ?? 0);
73
+ function L(t) {
74
+ const e = Math.max(0, Math.min(t, n.value.length));
75
+ return m && o.size === 0 ? e * a : z.value[e] ?? 0;
38
76
  }
39
- function R(e) {
77
+ function R(t) {
40
78
  if (n.value.length === 0) return 0;
41
- if (h && a.size === 0) {
42
- const r = c;
79
+ if (m && o.size === 0) {
80
+ const s = a;
43
81
  return Math.max(
44
82
  0,
45
- Math.min(n.value.length - 1, Math.floor(Math.max(0, e) / r))
83
+ Math.min(n.value.length - 1, Math.floor(Math.max(0, t) / s))
46
84
  );
47
85
  }
48
- const t = w.value;
49
- let i = 0, o = n.value.length;
50
- for (; i < o; ) {
51
- const r = Math.floor((i + o) / 2);
52
- t[r + 1] <= e ? i = r + 1 : o = r;
86
+ const e = z.value;
87
+ let i = 0, u = n.value.length;
88
+ for (; i < u; ) {
89
+ const s = Math.floor((i + u) / 2);
90
+ e[s + 1] <= t ? i = s + 1 : u = s;
53
91
  }
54
92
  return Math.max(0, Math.min(i, n.value.length - 1));
55
93
  }
56
- const y = p(() => {
57
- const e = n.value.length;
58
- if (e === 0)
94
+ const V = S(() => {
95
+ const t = n.value.length;
96
+ if (t === 0)
59
97
  return { start: 0, end: 0 };
60
- if (v.value <= 0)
61
- return { start: 0, end: Math.min(e, m * 2 + 1) };
62
- if (h && a.size === 0) {
63
- const u = c, g = Math.floor(s.value / u), J = Math.ceil(v.value / u), N = Math.max(0, g - m), Q = Math.min(e, g + J + m);
64
- return { start: N, end: Q };
98
+ if (d.value <= 0)
99
+ return { start: 0, end: Math.min(t, M * 2 + 1) };
100
+ if (m && o.size === 0) {
101
+ const p = a, x = Math.floor(h.value / p), W = Math.ceil(d.value / p), X = Math.max(0, x - M), Z = Math.min(t, x + W + M);
102
+ return { start: X, end: Z };
65
103
  }
66
- const t = Math.max(0, s.value), i = t + v.value, o = R(t), r = Math.min(e - 1, R(i));
104
+ const e = Math.max(0, h.value), i = e + d.value, u = R(e), s = Math.min(t - 1, R(i));
67
105
  return {
68
- start: Math.max(0, o - m),
69
- end: Math.min(e, r + m + 1)
106
+ start: Math.max(0, u - M),
107
+ end: Math.min(t, s + M + 1)
70
108
  };
71
- }), U = p(() => H(y.value.start)), Y = p(() => {
72
- const { start: e, end: t } = y.value;
73
- return n.value.slice(e, t).map((i, o) => ({
109
+ }), Y = S(() => L(V.value.start)), j = S(() => {
110
+ const { start: t, end: e } = V.value;
111
+ return n.value.slice(t, e).map((i, u) => ({
74
112
  data: i,
75
- index: e + o
113
+ index: t + u
76
114
  }));
77
115
  });
78
- function M(e) {
79
- if (!e) {
80
- s.value = 0, v.value = 0;
116
+ function T(t) {
117
+ if (!t) {
118
+ nt(v) || (d.value = 0);
81
119
  return;
82
120
  }
83
- s.value = e.scrollTop, v.value = e.clientHeight;
121
+ t.scrollTop !== h.value && (t.scrollTop = h.value), d.value = t.clientHeight;
84
122
  }
85
- function S() {
86
- l && (s.value = l.scrollTop);
123
+ function y() {
124
+ r && (h.value = r.scrollTop);
87
125
  }
88
- function O() {
89
- d == null || d.disconnect(), d = null;
126
+ function E() {
127
+ g == null || g.disconnect(), g = null;
90
128
  }
91
- function E(e) {
92
- e && e.removeEventListener("scroll", S);
129
+ function O(t) {
130
+ t && t.removeEventListener("scroll", y);
93
131
  }
94
- function j(e) {
95
- if (!e) {
96
- l = null, M(null);
132
+ function q(t) {
133
+ if (!t) {
134
+ r = null, T(null);
97
135
  return;
98
136
  }
99
- l = e, e.addEventListener("scroll", S, { passive: !0 }), M(e), typeof ResizeObserver < "u" && (d = new ResizeObserver(() => {
100
- M(e);
101
- }), d.observe(e));
137
+ r = t, t.addEventListener("scroll", y, { passive: !0 }), T(t), typeof ResizeObserver < "u" && (g = new ResizeObserver(() => {
138
+ T(t);
139
+ }), g.observe(t));
102
140
  }
103
- z(
104
- A,
105
- (e, t) => {
106
- E(t), O(), j(e);
141
+ I(
142
+ U,
143
+ (t, e) => {
144
+ O(e), E(), q(t);
107
145
  },
108
146
  { immediate: !0 }
109
- ), z(
147
+ ), I(
110
148
  () => {
111
- var e;
112
- return (e = x.invalidateKey) == null ? void 0 : e.value;
149
+ var t;
150
+ return (t = l.invalidateKey) == null ? void 0 : t.value;
113
151
  },
114
152
  () => {
115
153
  C();
116
154
  },
117
155
  { immediate: !0 }
156
+ ), I(
157
+ () => v.invalidateVersion.value,
158
+ () => {
159
+ C();
160
+ },
161
+ { immediate: !0 }
118
162
  );
119
- let F = n.value.length, L = n.value.length > 0 ? (V = n.value[0]) == null ? void 0 : V.id : void 0;
120
- z(n, (e) => {
121
- var u;
122
- const t = e.length, i = t > 0 ? (u = e[0]) == null ? void 0 : u.id : void 0, o = t === F && i === L;
123
- if (F = t, L = i, o)
124
- return;
125
- C();
126
- const r = Math.max(0, I.value - v.value);
127
- s.value > r && (s.value = r, l && (l.scrollTop = r));
163
+ let F = n.value.length, P = n.value.length > 0 ? (A = n.value[0]) == null ? void 0 : A.id : void 0;
164
+ I(n, (t) => {
165
+ var s;
166
+ const e = t.length, i = e > 0 ? (s = t[0]) == null ? void 0 : s.id : void 0, u = e === F && i === P;
167
+ F = e, P = i, !u && C();
128
168
  });
129
- function k(e) {
130
- if (!l || n.value.length === 0) return;
131
- const t = Math.max(0, Math.min(e, n.value.length - 1)), i = H(t);
132
- l.scrollTop = i, s.value = i;
169
+ function G(t) {
170
+ if (!r || n.value.length === 0) return;
171
+ const e = Math.max(0, Math.min(t, n.value.length - 1)), i = L(e);
172
+ r.scrollTop = i, v.setScrollTop(i);
133
173
  }
134
- function q() {
135
- if (!l) return;
136
- const e = Math.max(0, I.value - l.clientHeight);
137
- l.scrollTop = e, s.value = e;
174
+ function J() {
175
+ if (!r) return;
176
+ const t = Math.max(0, H.value - r.clientHeight);
177
+ r.scrollTop = t, v.setScrollTop(t);
138
178
  }
139
- const G = () => {
140
- E(l), O(), f == null || f.disconnect(), f = null, l = null;
179
+ const Q = () => {
180
+ O(r), E(), f == null || f.disconnect(), f = null, r = null;
141
181
  };
142
- return W() && X(G), {
143
- visibleItems: Y,
144
- totalHeight: I,
145
- offsetY: U,
146
- scrollToIndex: k,
147
- scrollToBottom: q,
148
- observeRow: P
182
+ return $() && tt(Q), {
183
+ visibleItems: j,
184
+ totalHeight: H,
185
+ offsetY: Y,
186
+ scrollToIndex: G,
187
+ scrollToBottom: J,
188
+ observeRow: N
149
189
  };
150
190
  }
151
191
  export {
152
- _ as useVirtualList
192
+ _ as createVirtualListState,
193
+ at as useVirtualList,
194
+ rt as useVirtualListStateCache
153
195
  };
@@ -0,0 +1,74 @@
1
+ import { DEFAULT_PRIORITY_MAP as a, DEFAULT_STATUS_MAP as t, mergeColorMap as o, resolveBadge as s, useBadge as i } from "./composables/useBadge.js";
2
+ import { useStream as p } from "./composables/useStream.js";
3
+ import { useTypewriter as l } from "./composables/useTypewriter.js";
4
+ import { useAiChat as x } from "./composables/useAiChat.js";
5
+ import { useTableFilter as c } from "./composables/useTableFilter.js";
6
+ import { useTable as w } from "./composables/useTable.js";
7
+ import { useMarkdown as n } from "./composables/useMarkdown.js";
8
+ import { useInlineEdit as T } from "./composables/useInlineEdit.js";
9
+ import { createVirtualListState as M, useVirtualList as P, useVirtualListStateCache as g } from "./composables/useVirtualList.js";
10
+ import { useToast as C } from "./composables/useToast.js";
11
+ import { useTableData as k } from "./composables/useTableData.js";
12
+ import { useTableColumns as L } from "./composables/useTableColumns.js";
13
+ import { useBreakpoint as R } from "./composables/useBreakpoint.js";
14
+ import { useColumnResize as F } from "./composables/useColumnResize.js";
15
+ import { useFixedColumns as _ } from "./composables/useFixedColumns.js";
16
+ import { useKeyboardNavigation as U } from "./composables/useKeyboardNavigation.js";
17
+ import { useRowDrag as W } from "./composables/useRowDrag.js";
18
+ import { useDraftRows as K } from "./composables/useDraftRows.js";
19
+ import { useWorkerSort as Y } from "./composables/useWorkerSort.js";
20
+ import { useDataTableSelection as q } from "./composables/useDataTableSelection.js";
21
+ import { buildDetailSheetCellEditPayloads as H, useDataTableDetailSheet as J } from "./composables/useDataTableDetailSheet.js";
22
+ import { useSchemaEngine as X } from "./composables/useSchemaEngine.js";
23
+ import { useSupabaseProvider as $ } from "./composables/useSupabaseProvider.js";
24
+ import { createLocalStorageBackend as re, createSupabaseBackend as ae, useViewPersistence as te } from "./composables/useViewPersistence.js";
25
+ import { useDatabaseView as se } from "./composables/useDatabaseView.js";
26
+ import { composeDatabaseViewMiddlewares as ue, createDatabaseViewAnalyticsMiddleware as pe, createDatabaseViewOptimisticMiddleware as me, createDatabaseViewPresetBundle as le, createDatabaseViewPresetInputs as fe, createDatabaseViewPresetMiddleware as xe, createDatabaseViewToastMiddleware as de } from "./composables/useDatabaseViewMiddleware.js";
27
+ import { useDatabaseViewport as be, useDatabaseWorkspaceState as we } from "./composables/useDatabaseWorkspace.js";
28
+ import { useSearch as ne } from "./composables/useSearch.js";
29
+ export {
30
+ a as DEFAULT_PRIORITY_MAP,
31
+ t as DEFAULT_STATUS_MAP,
32
+ H as buildDetailSheetCellEditPayloads,
33
+ ue as composeDatabaseViewMiddlewares,
34
+ pe as createDatabaseViewAnalyticsMiddleware,
35
+ me as createDatabaseViewOptimisticMiddleware,
36
+ le as createDatabaseViewPresetBundle,
37
+ fe as createDatabaseViewPresetInputs,
38
+ xe as createDatabaseViewPresetMiddleware,
39
+ de as createDatabaseViewToastMiddleware,
40
+ re as createLocalStorageBackend,
41
+ ae as createSupabaseBackend,
42
+ M as createVirtualListState,
43
+ o as mergeColorMap,
44
+ s as resolveBadge,
45
+ x as useAiChat,
46
+ i as useBadge,
47
+ R as useBreakpoint,
48
+ F as useColumnResize,
49
+ J as useDataTableDetailSheet,
50
+ q as useDataTableSelection,
51
+ se as useDatabaseView,
52
+ be as useDatabaseViewport,
53
+ we as useDatabaseWorkspaceState,
54
+ K as useDraftRows,
55
+ _ as useFixedColumns,
56
+ T as useInlineEdit,
57
+ U as useKeyboardNavigation,
58
+ n as useMarkdown,
59
+ W as useRowDrag,
60
+ X as useSchemaEngine,
61
+ ne as useSearch,
62
+ p as useStream,
63
+ $ as useSupabaseProvider,
64
+ w as useTable,
65
+ L as useTableColumns,
66
+ k as useTableData,
67
+ c as useTableFilter,
68
+ C as useToast,
69
+ l as useTypewriter,
70
+ te as useViewPersistence,
71
+ P as useVirtualList,
72
+ g as useVirtualListStateCache,
73
+ Y as useWorkerSort
74
+ };
@@ -30,6 +30,28 @@ export interface DatabaseViewProvider<T extends DataRecord = DataRecord> {
30
30
  onFetch?: (params: DatabaseViewFetchParams) => Promise<DatabaseViewFetchResult<T>>;
31
31
  onRefresh?: (params: DatabaseViewFetchParams) => Promise<void> | void;
32
32
  }
33
+ export interface DatabaseViewActionContext<T extends DataRecord = DataRecord> {
34
+ action: "cell-edit" | "select-record" | "schema-event" | "save-view" | "delete-view" | "refresh";
35
+ payload: unknown;
36
+ tableId: string;
37
+ mode: DatabaseViewMode;
38
+ view: ViewConfig;
39
+ activeViewId: string;
40
+ selectedRecordId: string | null;
41
+ selectedRecord: T | null;
42
+ page: number;
43
+ pageSize: number;
44
+ totalCount: number;
45
+ }
46
+ export interface DatabaseViewActionErrorContext<T extends DataRecord = DataRecord> extends DatabaseViewActionContext<T> {
47
+ error: unknown;
48
+ }
49
+ export interface DatabaseViewActionMiddleware<T extends DataRecord = DataRecord> {
50
+ before?: (context: DatabaseViewActionContext<T>) => Promise<void> | void;
51
+ after?: (context: DatabaseViewActionContext<T>) => Promise<void> | void;
52
+ error?: (context: DatabaseViewActionErrorContext<T>) => Promise<void> | void;
53
+ }
54
+ export type DatabaseViewActionMiddlewareList<T extends DataRecord = DataRecord> = DatabaseViewActionMiddleware<T> | readonly DatabaseViewActionMiddleware<T>[];
33
55
  export type DatabaseSchemaEvent = {
34
56
  type: "schema-add-field";
35
57
  fieldType: string;
@@ -53,6 +75,7 @@ export type DatabaseSchemaEvent = {
53
75
  };
54
76
  export type DatabaseViewSchemaEvent = DatabaseSchemaEvent;
55
77
  export interface DatabaseViewActions<T extends DataRecord = DataRecord> {
78
+ middleware?: DatabaseViewActionMiddlewareList<T>;
56
79
  onCellEdit?: (payload: {
57
80
  rowId: string;
58
81
  fieldId: string;