@pstdio/ui 0.43.0-nightly.20261012031318 → 0.43.0
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/dist/{MermaidComponent-Ck8YZ-eC.js → MermaidComponent-X7N-8w2S.js} +2 -2
- package/dist/{MermaidComponent-Ck8YZ-eC.js.map → MermaidComponent-X7N-8w2S.js.map} +1 -1
- package/dist/chat-ui.d.ts +50 -50
- package/dist/chat-ui.js +2 -2
- package/dist/{collection-view-grouping-DmjlnPQj.js → collection-view-grouping-DnuJ1U4R.js} +24 -24
- package/dist/{collection-view-grouping-DmjlnPQj.js.map → collection-view-grouping-DnuJ1U4R.js.map} +1 -1
- package/dist/{collection-view-search-CW7B2YP1.js → collection-view-search-D_7Qvz7p.js} +22 -16
- package/dist/collection-view-search-D_7Qvz7p.js.map +1 -0
- package/dist/collection-view.d.ts +90 -3
- package/dist/collection-view.js +112 -2
- package/dist/collection-view.js.map +1 -0
- package/dist/{data-table-stats-row-B2MYAoHu.js → data-table-stats-row-C8CtvdDt.js} +2 -2
- package/dist/{data-table-stats-row-B2MYAoHu.js.map → data-table-stats-row-C8CtvdDt.js.map} +1 -1
- package/dist/data-table.d.ts +1 -2
- package/dist/data-table.js +14 -14
- package/dist/data-table.js.map +1 -1
- package/dist/{display-sort-control-CmFg-wcP.js → display-sort-control-n3L5WvkJ.js} +86 -86
- package/dist/{display-sort-control-CmFg-wcP.js.map → display-sort-control-n3L5WvkJ.js.map} +1 -1
- package/dist/{edit-mode-data-table-oEYutEBB.js → edit-mode-data-table-BclZ-pWe.js} +8 -8
- package/dist/{edit-mode-data-table-oEYutEBB.js.map → edit-mode-data-table-BclZ-pWe.js.map} +1 -1
- package/dist/{index-DNurZJZ3.d.ts → index-DjZsR4Ey.d.ts} +1 -1
- package/dist/index.d.ts +50 -50
- package/dist/kanban-renderer.d.ts +1 -1
- package/dist/kanban-renderer.js +79 -79
- package/dist/kanban-renderer.js.map +1 -1
- package/dist/{markdown-editor-oklbG4fY.js → markdown-editor-CN4qOKky.js} +4 -4
- package/dist/{markdown-editor-oklbG4fY.js.map → markdown-editor-CN4qOKky.js.map} +1 -1
- package/dist/{param-editor-Br3Qm5B4.js → param-editor-28dBRSV4.js} +2 -2
- package/dist/{param-editor-Br3Qm5B4.js.map → param-editor-28dBRSV4.js.map} +1 -1
- package/dist/{param-editor-field-Cg-C40tt.js → param-editor-field-GxhFb86w.js} +2 -2
- package/dist/{param-editor-field-Cg-C40tt.js.map → param-editor-field-GxhFb86w.js.map} +1 -1
- package/dist/param-editor.js +2 -2
- package/dist/{rich-text-DSZ23B46.js → rich-text-DOK4dDeb.js} +2 -2
- package/dist/{rich-text-DSZ23B46.js.map → rich-text-DOK4dDeb.js.map} +1 -1
- package/dist/rich-text.js +3 -3
- package/dist/{workspace-badge-BKtB805G.d.ts → workspace-badge-oFp29Gbe.d.ts} +1 -1
- package/package.json +2 -2
- package/dist/collection-view-search-CW7B2YP1.js.map +0 -1
- package/dist/index-DgwJmKVC.d.ts +0 -80
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { n as e } from "./scroll-area-crJfiiuF.js";
|
|
2
2
|
import { t } from "./empty-state-3mVV_pV-.js";
|
|
3
|
-
import { C as n,
|
|
4
|
-
import { n as g, t as _ } from "./collection-view-grouping-
|
|
3
|
+
import { C as n, D as r, E as i, M as a, O as o, S as s, b as c, h as l, j as u, k as d, m as f, p, u as m, y as h } from "./collection-view-search-D_7Qvz7p.js";
|
|
4
|
+
import { n as g, t as _ } from "./collection-view-grouping-DnuJ1U4R.js";
|
|
5
5
|
import { Badge as v, Button as y, HStack as b, Icon as x, IconButton as ee, Menu as S, Popover as C, Portal as te, Stack as w, Text as T } from "@chakra-ui/react";
|
|
6
6
|
import { c as E } from "react/compiler-runtime";
|
|
7
7
|
import { Fragment as D, jsx as O, jsxs as k } from "react/jsx-runtime";
|
|
@@ -83,51 +83,51 @@ var R = (e) => e.split(/[^a-zA-Z0-9]+/).filter(Boolean).map((e) => `${e.charAt(0
|
|
|
83
83
|
cursor: "default",
|
|
84
84
|
children: u
|
|
85
85
|
}), t[15] = u, t[16] = p), p;
|
|
86
|
-
}, V = (e, t) => e.length === 0 ? null : e.length <= 2 ? e.map((e) =>
|
|
86
|
+
}, V = (e, t) => e.length === 0 ? null : e.length <= 2 ? e.map((e) => i(t, e)).join(", ") : `${i(t, e[0])}, ${i(t, e[1])} +${e.length - 2}`, H = (e, t, n) => {
|
|
87
87
|
if (t.kind !== "enum") return null;
|
|
88
|
-
let
|
|
89
|
-
if (!
|
|
88
|
+
let i = typeof n == "string" ? n : null, a = e.editable === !0;
|
|
89
|
+
if (!i) return a ? {
|
|
90
90
|
attributeId: e.id,
|
|
91
91
|
attributeLabel: e.label,
|
|
92
92
|
label: e.label,
|
|
93
|
-
value:
|
|
94
|
-
options:
|
|
93
|
+
value: i ?? void 0,
|
|
94
|
+
options: o(t),
|
|
95
95
|
isEditable: !0
|
|
96
96
|
} : null;
|
|
97
|
-
let s =
|
|
97
|
+
let s = r(t, i);
|
|
98
98
|
return {
|
|
99
99
|
attributeId: e.id,
|
|
100
100
|
attributeLabel: e.label,
|
|
101
|
-
label: s?.label ??
|
|
101
|
+
label: s?.label ?? d(i),
|
|
102
102
|
color: s?.color,
|
|
103
103
|
icon: s?.icon,
|
|
104
|
-
...
|
|
105
|
-
value:
|
|
106
|
-
options:
|
|
104
|
+
...a ? {
|
|
105
|
+
value: i,
|
|
106
|
+
options: o(t),
|
|
107
107
|
isEditable: !0
|
|
108
108
|
} : {}
|
|
109
109
|
};
|
|
110
110
|
}, U = (e, t, n) => {
|
|
111
111
|
if (t.kind !== "enum-multi") return null;
|
|
112
|
-
let
|
|
113
|
-
if (!a) return
|
|
112
|
+
let i = Array.isArray(n) ? n.filter((e) => typeof e == "string") : [], a = V(i, t), s = e.editable === !0;
|
|
113
|
+
if (!a) return s ? {
|
|
114
114
|
attributeId: e.id,
|
|
115
115
|
attributeLabel: e.label,
|
|
116
116
|
label: e.label,
|
|
117
|
-
value:
|
|
118
|
-
options:
|
|
117
|
+
value: i,
|
|
118
|
+
options: o(t),
|
|
119
119
|
isEditable: !0
|
|
120
120
|
} : null;
|
|
121
|
-
let
|
|
121
|
+
let c = i[0] ? r(t, i[0]) : void 0;
|
|
122
122
|
return {
|
|
123
123
|
attributeId: e.id,
|
|
124
124
|
attributeLabel: e.label,
|
|
125
125
|
label: a,
|
|
126
|
-
color:
|
|
127
|
-
icon:
|
|
128
|
-
...
|
|
129
|
-
value:
|
|
130
|
-
options:
|
|
126
|
+
color: c?.color,
|
|
127
|
+
icon: c?.icon,
|
|
128
|
+
...s ? {
|
|
129
|
+
value: i,
|
|
130
|
+
options: o(t),
|
|
131
131
|
isEditable: !0
|
|
132
132
|
} : {}
|
|
133
133
|
};
|
|
@@ -158,96 +158,96 @@ var R = (e) => e.split(/[^a-zA-Z0-9]+/).filter(Boolean).map((e) => `${e.charAt(0
|
|
|
158
158
|
onClick: e.resource && r ? () => r(e.resource) : void 0
|
|
159
159
|
})) : null;
|
|
160
160
|
}, Z = (e, t) => {
|
|
161
|
-
let
|
|
161
|
+
let r = e.type, i = n(t, e);
|
|
162
162
|
if (e.render || e.display) return null;
|
|
163
|
-
if (
|
|
164
|
-
if (
|
|
165
|
-
if (
|
|
166
|
-
let t = W(
|
|
163
|
+
if (r.kind === "enum") return H(e, r, i);
|
|
164
|
+
if (r.kind === "enum-multi") return U(e, r, i);
|
|
165
|
+
if (r.kind === "date") {
|
|
166
|
+
let t = W(i);
|
|
167
167
|
return t ? {
|
|
168
168
|
attributeId: e.id,
|
|
169
169
|
label: t
|
|
170
170
|
} : null;
|
|
171
171
|
}
|
|
172
|
-
if (
|
|
173
|
-
let t = G(
|
|
172
|
+
if (r.kind === "number") {
|
|
173
|
+
let t = G(i);
|
|
174
174
|
return t ? {
|
|
175
175
|
attributeId: e.id,
|
|
176
176
|
label: t
|
|
177
177
|
} : null;
|
|
178
178
|
}
|
|
179
|
-
if (
|
|
180
|
-
let t = q(
|
|
179
|
+
if (r.kind === "user") {
|
|
180
|
+
let t = q(i);
|
|
181
181
|
return t ? {
|
|
182
182
|
attributeId: e.id,
|
|
183
183
|
label: t,
|
|
184
184
|
color: "blue"
|
|
185
185
|
} : null;
|
|
186
186
|
}
|
|
187
|
-
let
|
|
188
|
-
return
|
|
187
|
+
let a = K(i);
|
|
188
|
+
return a ? {
|
|
189
189
|
attributeId: e.id,
|
|
190
|
-
label:
|
|
190
|
+
label: a
|
|
191
191
|
} : null;
|
|
192
192
|
}, ue = (e, t, n) => {
|
|
193
|
-
let
|
|
194
|
-
for (let
|
|
195
|
-
let n =
|
|
193
|
+
let r = [];
|
|
194
|
+
for (let i of n) {
|
|
195
|
+
let n = a(t, i);
|
|
196
196
|
if (!n || n.displayable === !1) continue;
|
|
197
197
|
let o = Z(n, e);
|
|
198
|
-
o &&
|
|
198
|
+
o && r.push(o);
|
|
199
199
|
}
|
|
200
|
-
return
|
|
201
|
-
}, de = (e, t,
|
|
200
|
+
return r;
|
|
201
|
+
}, de = (e, t, r) => {
|
|
202
202
|
let i = [];
|
|
203
|
-
for (let
|
|
204
|
-
let
|
|
205
|
-
if (!
|
|
206
|
-
let s =
|
|
203
|
+
for (let o of r) {
|
|
204
|
+
let r = a(t, o);
|
|
205
|
+
if (!r || r.displayable === !1) continue;
|
|
206
|
+
let s = n(e, r), c = r.render ? r.render(s, e) : X(r, s, e);
|
|
207
207
|
se(c) && i.push(c);
|
|
208
208
|
}
|
|
209
209
|
return i;
|
|
210
210
|
}, Q = (e, t) => {
|
|
211
211
|
let n = /* @__PURE__ */ new Set();
|
|
212
|
-
for (let r of e) for (let e of
|
|
212
|
+
for (let r of e) for (let e of s(r, t)) n.add(e);
|
|
213
213
|
return n;
|
|
214
214
|
}, fe = (e, t) => {
|
|
215
|
-
let
|
|
216
|
-
for (let
|
|
217
|
-
if (!
|
|
218
|
-
if (
|
|
219
|
-
let e =
|
|
215
|
+
let n = [];
|
|
216
|
+
for (let r of e) {
|
|
217
|
+
if (!r.filterable) continue;
|
|
218
|
+
if (r.type.kind === "enum" || r.type.kind === "enum-multi") {
|
|
219
|
+
let e = o(r.type), i = Q(t, r), a = new Set(e.map((e) => e.value)), s = [...i].filter((e) => !a.has(e)).sort((e, t) => e.localeCompare(t, void 0, { numeric: !0 })).map((e) => ({
|
|
220
220
|
value: e,
|
|
221
|
-
label:
|
|
221
|
+
label: d(e)
|
|
222
222
|
}));
|
|
223
|
-
|
|
224
|
-
id:
|
|
225
|
-
label:
|
|
223
|
+
n.push({
|
|
224
|
+
id: r.id,
|
|
225
|
+
label: r.label,
|
|
226
226
|
selectionMode: "multiple",
|
|
227
227
|
options: [...e.map((e) => ({
|
|
228
228
|
value: e.value,
|
|
229
229
|
label: e.label,
|
|
230
230
|
color: e.color,
|
|
231
231
|
icon: e.icon
|
|
232
|
-
})), ...
|
|
232
|
+
})), ...s]
|
|
233
233
|
});
|
|
234
234
|
continue;
|
|
235
235
|
}
|
|
236
|
-
let e = [...Q(t,
|
|
236
|
+
let e = [...Q(t, r)].sort((e, t) => e.localeCompare(t, void 0, { numeric: !0 })).map((e) => ({
|
|
237
237
|
value: e,
|
|
238
|
-
label:
|
|
238
|
+
label: d(e)
|
|
239
239
|
}));
|
|
240
|
-
|
|
241
|
-
id:
|
|
242
|
-
label:
|
|
240
|
+
n.push({
|
|
241
|
+
id: r.id,
|
|
242
|
+
label: r.label,
|
|
243
243
|
selectionMode: "multiple",
|
|
244
244
|
options: e
|
|
245
245
|
});
|
|
246
246
|
}
|
|
247
|
-
return
|
|
247
|
+
return n;
|
|
248
248
|
}, pe = (e) => {
|
|
249
249
|
let t = [{
|
|
250
|
-
value:
|
|
250
|
+
value: u,
|
|
251
251
|
label: "None"
|
|
252
252
|
}];
|
|
253
253
|
for (let n of e) n.groupable && n.type.kind !== "enum-multi" && t.push({
|
|
@@ -262,21 +262,21 @@ var R = (e) => e.split(/[^a-zA-Z0-9]+/).filter(Boolean).map((e) => `${e.charAt(0
|
|
|
262
262
|
label: n.label
|
|
263
263
|
});
|
|
264
264
|
return t;
|
|
265
|
-
}, he = (e, t) => t === "none" ? e.filter((e) => e.value ===
|
|
265
|
+
}, he = (e, t) => t === "none" ? e.filter((e) => e.value === u) : e.filter((e) => e.value === "none" || e.value !== t), ge = (e, t) => e === "none" ? "all" : t?.columnKey, _e = (e, t, n, r = []) => {
|
|
266
266
|
if (e === "none") return;
|
|
267
|
-
let
|
|
268
|
-
if (!
|
|
269
|
-
let s = i
|
|
270
|
-
if (
|
|
271
|
-
let
|
|
267
|
+
let i = a(t, e);
|
|
268
|
+
if (!i || i.type.kind !== "enum") return;
|
|
269
|
+
let s = o(i.type).map((e) => e.value), c = _(i);
|
|
270
|
+
if (r.some((e) => g(e, i) === c) && s.push(c), n?.conjunction !== "and") return s;
|
|
271
|
+
let l = s.map((t) => ({
|
|
272
272
|
id: t,
|
|
273
273
|
title: t,
|
|
274
|
-
attributes: t ===
|
|
274
|
+
attributes: t === c ? {} : { [e]: t }
|
|
275
275
|
}));
|
|
276
|
-
return
|
|
276
|
+
return m(l, {
|
|
277
277
|
conjunction: "and",
|
|
278
278
|
rules: n.rules.filter((t) => t.attributeId === e)
|
|
279
|
-
}, [
|
|
279
|
+
}, [i]).map((e) => e.id);
|
|
280
280
|
}, ve = (e) => {
|
|
281
281
|
let t = E(2), n;
|
|
282
282
|
return t[0] === e.children ? n = t[1] : (n = /* @__PURE__ */ O(T, {
|
|
@@ -513,40 +513,40 @@ var R = (e) => e.split(/[^a-zA-Z0-9]+/).filter(Boolean).map((e) => `${e.charAt(0
|
|
|
513
513
|
}, xe = (e) => {
|
|
514
514
|
let t = E(15), { fields: n, sorts: r, onSortsChange: i } = e, a = r[0], o;
|
|
515
515
|
if (t[0] !== n || t[1] !== i || t[2] !== a) {
|
|
516
|
-
let e = a ?
|
|
516
|
+
let e = a ? c(n, a.attributeId) : void 0, r;
|
|
517
517
|
t[4] === Symbol.for("react.memo_cache_sentinel") ? (r = /* @__PURE__ */ O(T, {
|
|
518
518
|
textStyle: "label/S/regular",
|
|
519
519
|
flex: "1",
|
|
520
520
|
children: "Ordering"
|
|
521
521
|
}), t[4] = r) : r = t[4];
|
|
522
|
-
let s = a ? `field:${a.attributeId}` : "none",
|
|
523
|
-
t[5] === Symbol.for("react.memo_cache_sentinel") ? (
|
|
522
|
+
let s = a ? `field:${a.attributeId}` : "none", l;
|
|
523
|
+
t[5] === Symbol.for("react.memo_cache_sentinel") ? (l = {
|
|
524
524
|
value: "none",
|
|
525
525
|
label: "None"
|
|
526
|
-
}, t[5] =
|
|
526
|
+
}, t[5] = l) : l = t[5];
|
|
527
527
|
let u;
|
|
528
|
-
t[6] === n ? u = t[7] : (u = [
|
|
528
|
+
t[6] === n ? u = t[7] : (u = [l, ...n.filter(h).map(Se)], t[6] = n, t[7] = u);
|
|
529
529
|
let d;
|
|
530
530
|
t[8] !== i || t[9] !== a?.direction ? (d = (e) => i(e === "none" ? [] : [{
|
|
531
531
|
attributeId: e.slice(6),
|
|
532
532
|
direction: a?.direction ?? "asc"
|
|
533
533
|
}]), t[8] = i, t[9] = a?.direction, t[10] = d) : d = t[10];
|
|
534
|
-
let
|
|
535
|
-
t[11] !== s || t[12] !== u || t[13] !== d ? (
|
|
534
|
+
let m;
|
|
535
|
+
t[11] !== s || t[12] !== u || t[13] !== d ? (m = /* @__PURE__ */ k(b, {
|
|
536
536
|
paddingX: "xs",
|
|
537
537
|
minH: "7",
|
|
538
538
|
gap: "xs",
|
|
539
|
-
children: [r, /* @__PURE__ */ O(
|
|
539
|
+
children: [r, /* @__PURE__ */ O(f, {
|
|
540
540
|
"aria-label": "Ordering",
|
|
541
541
|
width: "9rem",
|
|
542
542
|
value: s,
|
|
543
543
|
options: u,
|
|
544
544
|
onSelect: d
|
|
545
545
|
})]
|
|
546
|
-
}), t[11] = s, t[12] = u, t[13] = d, t[14] =
|
|
546
|
+
}), t[11] = s, t[12] = u, t[13] = d, t[14] = m) : m = t[14], o = /* @__PURE__ */ k(w, {
|
|
547
547
|
"data-testid": "display-sort-control",
|
|
548
548
|
gap: "1px",
|
|
549
|
-
children: [
|
|
549
|
+
children: [m, a ? /* @__PURE__ */ k(b, {
|
|
550
550
|
paddingX: "xs",
|
|
551
551
|
minH: "7",
|
|
552
552
|
gap: "xs",
|
|
@@ -554,16 +554,16 @@ var R = (e) => e.split(/[^a-zA-Z0-9]+/).filter(Boolean).map((e) => `${e.charAt(0
|
|
|
554
554
|
textStyle: "label/S/regular",
|
|
555
555
|
flex: "1",
|
|
556
556
|
children: "Direction"
|
|
557
|
-
}), /* @__PURE__ */ O(
|
|
557
|
+
}), /* @__PURE__ */ O(f, {
|
|
558
558
|
"aria-label": "Sort direction",
|
|
559
559
|
width: "9rem",
|
|
560
560
|
value: a.direction,
|
|
561
561
|
options: [{
|
|
562
562
|
value: "asc",
|
|
563
|
-
label:
|
|
563
|
+
label: p(e, "asc")
|
|
564
564
|
}, {
|
|
565
565
|
value: "desc",
|
|
566
|
-
label:
|
|
566
|
+
label: p(e, "desc")
|
|
567
567
|
}],
|
|
568
568
|
onSelect: (e) => i([{
|
|
569
569
|
...a,
|
|
@@ -579,10 +579,10 @@ function Se(e) {
|
|
|
579
579
|
return {
|
|
580
580
|
value: `field:${e.id}`,
|
|
581
581
|
label: e.label,
|
|
582
|
-
icon:
|
|
582
|
+
icon: l(e)
|
|
583
583
|
};
|
|
584
584
|
}
|
|
585
585
|
//#endregion
|
|
586
586
|
export { me as a, ue as c, X as d, _e as f, $ as i, de as l, be as n, fe as o, ge as p, ye as r, pe as s, xe as t, Z as u };
|
|
587
587
|
|
|
588
|
-
//# sourceMappingURL=display-sort-control-
|
|
588
|
+
//# sourceMappingURL=display-sort-control-n3L5WvkJ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"display-sort-control-CmFg-wcP.js","names":["Badge","Icon","Text","LucideIcon","lucideIcons","CollectionBadgeProps","label","icon","onClick","toPascalCase","value","split","filter","Boolean","map","part","charAt","toUpperCase","slice","join","resolveIcon","name","undefined","pascalName","candidate","component","Record","CollectionBadge","props","$","_c","t0","BadgeIcon","t1","t2","t3","content","t4","Symbol","for","display","gap","alignItems","minW","maxW","variant","bg","_light","_dark","color","textStyle","sharedProps","const","t5","event","stopPropagation","t6","_c","_Fragment","enumOptionLabel","findEnumOption","getEnumOptions","toTitleCase","AttributeDescriptor","AttributeType","EnumOption","summarizeMultiEnum","values","type","length","map","value","join","AttributeBadge","attributeId","attributeLabel","label","color","icon","options","isEditable","getAttributeBadgeColorPalette","_badge","renderEnumBadge","descriptor","kind","stringValue","editable","id","undefined","option","renderMultiEnumBadge","Array","isArray","filter","entry","summary","firstOption","ViewFilterGroup","createElement","ReactNode","getAttributeStringValues","getAttributeValue","filterRowsByView","emptyGroupKey","groupKey","CollectionBadge","AttributeBadge","renderEnumBadge","renderMultiEnumBadge","getEnumOptions","toTitleCase","AttributeDescriptor","CollectionBadgeItem","KanbanRendererRow","findAttribute","NO_GROUPING","getAttributeBadgeColorPalette","enumOptionLabel","findEnumOption","formatDateValue","value","date","Date","Number","isNaN","getTime","toLocaleDateString","formatNumberValue","isFinite","String","formatStringValue","undefined","formatUserValue","isRenderableNode","isRecord","Record","Array","isArray","textValue","trim","isCollectionResource","NonNullable","type","id","normalizeCollectionBadgeItems","flatMap","item","label","icon","resource","renderBadgeListDisplay","descriptor","row","openResource","display","kind","items","attributes","itemsAttributeId","length","selectedId","selectedItem","find","orderedItems","filter","map","key","onClick","renderAttributeBadge","render","formatted","attributeId","color","collectDisplayBadges","displayProperties","badges","displayable","badge","push","collectDisplayCustomSlots","slots","slot","collectValuesFromRows","rows","values","Set","add","FilterCategoryView","selectionMode","options","buildFilterCategories","categories","filterable","declared","auto","declaredValues","option","undeclared","has","sort","a","b","localeCompare","numeric","MenuOption","buildGroupingOptions","groupable","buildDisplayPropertyOptions","resolveSubGroupingOptions","columnGrouping","resolveListDropTargetColumnKey","placement","columnKey","resolveKnownColumnKeys","structureRows","keys","empty","some","conjunction","candidates","title","rules","rule","Button","HStack","Icon","IconButton","Menu","Popover","Portal","Text","Check","ChevronDown","List","Settings2","SquareKanban","Fragment","ReactNode","useEffect","useRef","useState","Tooltip","MenuOption","resolveSubGroupingOptions","KanbanRendererSettings","DisplayMenuProps","settings","sortControl","groupingOptions","displayPropertyOptions","onViewModeChange","value","onColumnGroupingChange","onRowGroupingChange","onDisplayPropertyToggle","property","SectionLabel","props","$","_c","t0","children","DisplayMenuSelectProps","label","options","onSelect","DisplayMenuSelect","find","option","selectedLabel","hasNoneFirst","t1","Symbol","for","strategy","hideWhenDetached","t2","t3","t4","t5","t6","map","option_0","index","t7","t8","DisplayMenu","triggerRef","contentRef","open","setOpen","closeOnOutsidePointerDown","event","target","Node","current","contains","document","addEventListener","removeEventListener","placement","offset","mainAxis","getAnchorElement","details","viewMode","t9","t10","t11","t12","t13","t14","t15","rowGrouping","t16","columnGrouping","t17","t18","t19","t20","t21","t22","displayProperties","t23","active","includes","t24","t25","_c","Fragment","Tooltip","Button","Icon","SearchX","X","EmptyState","CollectionViewEmptyStateProps","search","onClearSearch","CollectionViewEmptyState","props","$","_c","t0","Symbol","for","t1","trim","t2","t3","t4","t5","_c","EmptyState","HStack","Stack","Text","ViewSort","AttributeDescriptor","fieldIcon","canSortField","findField","sortDirectionLabel","RuleSelect","DisplaySortControlProps","fields","sorts","onSortsChange","DisplaySortControl","props","$","_c","sort","t0","field","attributeId","undefined","t1","Symbol","for","t2","t3","value","label","t4","filter","map","_temp","t5","direction","choice","slice","t6","entry","id","icon","_c","Tooltip$1","toTitleCase","findAttribute","getEnumOptions","NO_GROUPING","getAttributeValue","enumOptionLabel","RuleSelect","fieldIcon","getAttributeStringValues","findField","sortDirectionLabel","findEnumOption","groupKey","emptyGroupKey","Fragment$1","lucideIcons","toPascalCase","value","part","resolveIcon","name","pascalName","candidate","component","CollectionBadge","$","c","props","t0","icon","BadgeIcon","t1","Icon","t2","label","Text","t3","Fragment","content","t4","sharedProps","onClick","t5","event","t6","Badge","summarizeMultiEnum","values","type","renderEnumBadge","stringValue","editable","descriptor","option","renderMultiEnumBadge","entry","summary","firstOption","formatDateValue","date","formatNumberValue","formatStringValue","formatUserValue","isRenderableNode","isRecord","textValue","isCollectionResource","normalizeCollectionBadgeItems","item","id","resource","renderBadgeListDisplay","items","row","selectedId","selectedItem","createElement","openResource","renderAttributeBadge","formatted","collectDisplayBadges","badges","displayProperties","attributes","badge","collectDisplayCustomSlots","slots","slot","collectValuesFromRows","rows","buildFilterCategories","categories","declared","auto","declaredValues","undeclared","a","b","buildGroupingOptions","options","buildDisplayPropertyOptions","resolveSubGroupingOptions","columnGrouping","resolveListDropTargetColumnKey","placement","resolveKnownColumnKeys","keys","empty","structureRows","filter","candidates","key","filterRowsByView","rule","SectionLabel","DisplayMenuSelect","selectedLabel","hasNoneFirst","HStack","ChevronDown","Menu","Button","index","option_0","Check","t7","t8","DisplayMenu","triggerRef","useRef","contentRef","open","setOpen","useState","closeOnOutsidePointerDown","target","useEffect","details","Popover","IconButton","Settings2","settings","onViewModeChange","List","t9","t10","t11","t12","SquareKanban","t13","t14","t15","onColumnGroupingChange","onRowGroupingChange","t16","groupingOptions","t17","t18","t19","t20","t21","t22","displayPropertyOptions","onDisplayPropertyToggle","t23","active","t24","Portal","t25","CollectionViewEmptyState","SearchX","search","X","onClearSearch","EmptyState$1","DisplaySortControl","sort","sorts","fields","onSortsChange","field","canSortField","_temp","choice","Stack"],"sources":["../src/components/kanban-renderer/collection-badge.tsx","../src/components/kanban-renderer/kanban-renderer-badge-helpers.ts","../src/components/kanban-renderer/kanban-renderer-helpers.ts","../src/components/kanban-renderer/display-menu.tsx","../src/components/collection-view/collection-view-empty-state.tsx","../src/components/collection-view/display-sort-control.tsx"],"sourcesContent":["import { Badge, Icon, Text } from \"@chakra-ui/react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport * as lucideIcons from \"lucide-react\";\n\ninterface CollectionBadgeProps {\n label: string;\n icon?: string;\n onClick?: () => void;\n}\n\nconst toPascalCase = (value: string) =>\n value\n .split(/[^a-zA-Z0-9]+/)\n .filter(Boolean)\n .map((part) => `${part.charAt(0).toUpperCase()}${part.slice(1)}`)\n .join(\"\");\n\nconst resolveIcon = (name: string | undefined) => {\n if (!name) return undefined;\n const pascalName = toPascalCase(name);\n for (const candidate of [name, pascalName, `${pascalName}Icon`]) {\n const component = (lucideIcons as Record<string, unknown>)[candidate];\n if (component && (typeof component === \"function\" || typeof component === \"object\")) {\n return component as LucideIcon;\n }\n }\n return undefined;\n};\n\nexport const CollectionBadge = (props: CollectionBadgeProps) => {\n const { label, icon, onClick } = props;\n const BadgeIcon = resolveIcon(icon);\n\n const content = (\n <>\n {BadgeIcon ? <Icon as={BadgeIcon} boxSize=\"3.5\" flexShrink={0} aria-hidden=\"true\" /> : null}\n <Text as=\"span\" textStyle=\"label/XS/medium\" color=\"fg.muted\" minW=\"0\" maxW=\"10rem\" truncate>\n {label}\n </Text>\n </>\n );\n\n const sharedProps = {\n display: \"inline-flex\",\n gap: \"2xs\",\n alignItems: \"center\",\n minW: \"0\",\n maxW: \"100%\",\n variant: \"subtle\",\n bg: { _light: \"bg.muted\", _dark: \"bg.subtle\" },\n color: \"fg.muted\",\n textStyle: \"label/XS/medium\",\n \"data-testid\": \"collection-badge\",\n } as const;\n\n if (onClick) {\n return (\n <Badge asChild {...sharedProps} cursor=\"pointer\">\n <button\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n onClick();\n }}\n >\n {content}\n </button>\n </Badge>\n );\n }\n\n return (\n <Badge as=\"span\" {...sharedProps} cursor=\"default\">\n {content}\n </Badge>\n );\n};\n","import { enumOptionLabel, findEnumOption, getEnumOptions, toTitleCase } from \"./kanban-renderer-enum-helpers\";\nimport type { AttributeDescriptor, AttributeType, EnumOption } from \"./types\";\n\nconst summarizeMultiEnum = (values: string[], type: AttributeType) => {\n if (values.length === 0) return null;\n if (values.length <= 2) return values.map((value) => enumOptionLabel(type, value)).join(\", \");\n return `${enumOptionLabel(type, values[0]!)}, ${enumOptionLabel(type, values[1]!)} +${values.length - 2}`;\n};\n\nexport interface AttributeBadge {\n attributeId: string;\n attributeLabel?: string;\n label: string;\n color?: string;\n icon?: string | null;\n value?: string | string[];\n options?: EnumOption[];\n isEditable?: boolean;\n}\n\nexport const getAttributeBadgeColorPalette = (_badge: AttributeBadge) => \"gray\";\n\nexport const renderEnumBadge = (descriptor: AttributeDescriptor, type: AttributeType, value: unknown) => {\n if (type.kind !== \"enum\") return null;\n const stringValue = typeof value === \"string\" ? value : null;\n const editable = descriptor.editable === true;\n if (!stringValue) {\n return editable\n ? {\n attributeId: descriptor.id,\n attributeLabel: descriptor.label,\n label: descriptor.label,\n value: stringValue ?? undefined,\n options: getEnumOptions(type),\n isEditable: true,\n }\n : null;\n }\n const option = findEnumOption(type, stringValue);\n return {\n attributeId: descriptor.id,\n attributeLabel: descriptor.label,\n label: option?.label ?? toTitleCase(stringValue),\n color: option?.color,\n icon: option?.icon,\n ...(editable ? { value: stringValue, options: getEnumOptions(type), isEditable: true } : {}),\n };\n};\n\nexport const renderMultiEnumBadge = (descriptor: AttributeDescriptor, type: AttributeType, value: unknown) => {\n if (type.kind !== \"enum-multi\") return null;\n const values = Array.isArray(value) ? value.filter((entry): entry is string => typeof entry === \"string\") : [];\n const summary = summarizeMultiEnum(values, type);\n const editable = descriptor.editable === true;\n if (!summary) {\n return editable\n ? {\n attributeId: descriptor.id,\n attributeLabel: descriptor.label,\n label: descriptor.label,\n value: values,\n options: getEnumOptions(type),\n isEditable: true,\n }\n : null;\n }\n const firstOption = values[0] ? findEnumOption(type, values[0]) : undefined;\n return {\n attributeId: descriptor.id,\n attributeLabel: descriptor.label,\n label: summary,\n color: firstOption?.color,\n icon: firstOption?.icon,\n ...(editable ? { value: values, options: getEnumOptions(type), isEditable: true } : {}),\n };\n};\n","import type { ViewFilterGroup } from \"@pstdio/sdk/extensions\";\nimport { createElement, type ReactNode } from \"react\";\nimport { getAttributeStringValues, getAttributeValue } from \"../collection-view/collection-view-fields\";\nimport { filterRowsByView } from \"../collection-view/collection-view-filter\";\nimport { emptyGroupKey, groupKey } from \"../collection-view/collection-view-grouping\";\nimport { CollectionBadge } from \"./collection-badge\";\nimport type { AttributeBadge } from \"./kanban-renderer-badge-helpers\";\nimport { renderEnumBadge, renderMultiEnumBadge } from \"./kanban-renderer-badge-helpers\";\nimport { getEnumOptions, toTitleCase } from \"./kanban-renderer-enum-helpers\";\nimport type { AttributeDescriptor, CollectionBadgeItem, KanbanRendererRow } from \"./types\";\nimport { findAttribute, NO_GROUPING } from \"./types\";\n\nexport type { AttributeBadge } from \"./kanban-renderer-badge-helpers\";\nexport { getAttributeBadgeColorPalette } from \"./kanban-renderer-badge-helpers\";\nexport { enumOptionLabel, findEnumOption, getEnumOptions, toTitleCase } from \"./kanban-renderer-enum-helpers\";\n\nconst formatDateValue = (value: unknown) => {\n if (typeof value !== \"string\" || value === \"\") return null;\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return null;\n return date.toLocaleDateString();\n};\n\nconst formatNumberValue = (value: unknown) => {\n if (typeof value === \"number\" && Number.isFinite(value)) return String(value);\n if (typeof value === \"string\" && value !== \"\" && !Number.isNaN(Number(value))) return value;\n return null;\n};\n\nconst formatStringValue = (value: unknown) => {\n if (value === null || value === undefined) return null;\n if (typeof value === \"string\") return value === \"\" ? null : value;\n return String(value);\n};\n\nconst formatUserValue = (value: unknown) => formatStringValue(value);\n\nconst isRenderableNode = (value: unknown) => value !== null && value !== undefined && value !== false;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst textValue = (value: unknown) => (typeof value === \"string\" && value.trim() ? value.trim() : undefined);\n\nconst isCollectionResource = (value: unknown): value is NonNullable<CollectionBadgeItem[\"resource\"]> =>\n isRecord(value) && typeof value.type === \"string\" && typeof value.id === \"string\";\n\nconst normalizeCollectionBadgeItems = (value: unknown): CollectionBadgeItem[] => {\n if (!Array.isArray(value)) return [];\n\n return value.flatMap((item) => {\n if (!isRecord(item)) return [];\n const id = textValue(item.id);\n if (!id) return [];\n const label = textValue(item.label) ?? id;\n const icon = textValue(item.icon);\n const resource = isCollectionResource(item.resource) ? item.resource : undefined;\n return [{ id, label, ...(icon ? { icon } : {}), ...(resource ? { resource } : {}) }];\n });\n};\n\nexport const renderBadgeListDisplay = (\n descriptor: AttributeDescriptor,\n value: unknown,\n row: KanbanRendererRow,\n openResource?: (resource: NonNullable<CollectionBadgeItem[\"resource\"]>) => void,\n): ReactNode => {\n if (descriptor.display?.kind !== \"badge-list\") return null;\n const items = normalizeCollectionBadgeItems(row.attributes[descriptor.display.itemsAttributeId]);\n if (items.length === 0) return null;\n\n const selectedId = typeof value === \"string\" ? value : undefined;\n const selectedItem = items.find((item) => item.id === selectedId) ?? items[0];\n if (!selectedItem) return null;\n\n const orderedItems = [selectedItem, ...items.filter((item) => item.id !== selectedItem.id)];\n return orderedItems.map((item) =>\n createElement(CollectionBadge, {\n key: item.id,\n label: item.label,\n icon: item.icon,\n onClick: item.resource && openResource ? () => openResource(item.resource!) : undefined,\n }),\n );\n};\n\n/**\n * Per-type default cell summary used by the card / list end-content. Returns\n * null when the attribute has no displayable value.\n */\nexport const renderAttributeBadge = (\n descriptor: AttributeDescriptor,\n row: KanbanRendererRow,\n): AttributeBadge | null => {\n const type = descriptor.type;\n const value = getAttributeValue(row, descriptor);\n\n if (descriptor.render || descriptor.display) return null;\n\n if (type.kind === \"enum\") return renderEnumBadge(descriptor, type, value);\n if (type.kind === \"enum-multi\") return renderMultiEnumBadge(descriptor, type, value);\n\n if (type.kind === \"date\") {\n const formatted = formatDateValue(value);\n return formatted ? { attributeId: descriptor.id, label: formatted } : null;\n }\n\n if (type.kind === \"number\") {\n const formatted = formatNumberValue(value);\n return formatted ? { attributeId: descriptor.id, label: formatted } : null;\n }\n\n if (type.kind === \"user\") {\n const formatted = formatUserValue(value);\n return formatted ? { attributeId: descriptor.id, label: formatted, color: \"blue\" } : null;\n }\n\n const formatted = formatStringValue(value);\n return formatted ? { attributeId: descriptor.id, label: formatted } : null;\n};\n\nexport const collectDisplayBadges = (\n row: KanbanRendererRow,\n attributes: AttributeDescriptor[],\n displayProperties: string[],\n): AttributeBadge[] => {\n const badges: AttributeBadge[] = [];\n for (const id of displayProperties) {\n const descriptor = findAttribute(attributes, id);\n if (!descriptor || descriptor.displayable === false) continue;\n const badge = renderAttributeBadge(descriptor, row);\n if (badge) badges.push(badge);\n }\n return badges;\n};\n\nexport const collectDisplayCustomSlots = (\n row: KanbanRendererRow,\n attributes: AttributeDescriptor[],\n displayProperties: string[],\n): ReactNode[] => {\n const slots: ReactNode[] = [];\n for (const id of displayProperties) {\n const descriptor = findAttribute(attributes, id);\n if (!descriptor || descriptor.displayable === false) continue;\n\n const value = getAttributeValue(row, descriptor);\n const slot = descriptor.render ? descriptor.render(value, row) : renderBadgeListDisplay(descriptor, value, row);\n if (isRenderableNode(slot)) slots.push(slot);\n }\n return slots;\n};\n\nconst collectValuesFromRows = (rows: KanbanRendererRow[], descriptor: AttributeDescriptor) => {\n const values = new Set<string>();\n for (const row of rows) {\n for (const value of getAttributeStringValues(row, descriptor)) values.add(value);\n }\n return values;\n};\n\nexport interface FilterCategoryView {\n id: string;\n label: string;\n selectionMode: \"multiple\";\n options: { value: string; label: string; color?: string; icon?: string | null }[];\n}\n\n/**\n * Build the filter menu's category list from the declared attributes. Enum\n * descriptors expose their declared options first; auto-derived values from\n * the data fill in the gaps for string / date / number / user attributes (so\n * filter chips for free-form fields don't require declaring every option).\n */\nexport const buildFilterCategories = (\n attributes: AttributeDescriptor[],\n rows: KanbanRendererRow[],\n): FilterCategoryView[] => {\n const categories: FilterCategoryView[] = [];\n for (const descriptor of attributes) {\n if (!descriptor.filterable) continue;\n\n if (descriptor.type.kind === \"enum\" || descriptor.type.kind === \"enum-multi\") {\n const declared = getEnumOptions(descriptor.type);\n const auto = collectValuesFromRows(rows, descriptor);\n const declaredValues = new Set(declared.map((option) => option.value));\n const undeclared = [...auto]\n .filter((value) => !declaredValues.has(value))\n .sort((a, b) => a.localeCompare(b, undefined, { numeric: true }))\n .map((value) => ({ value, label: toTitleCase(value) }));\n\n categories.push({\n id: descriptor.id,\n label: descriptor.label,\n selectionMode: \"multiple\",\n options: [\n ...declared.map((option) => ({\n value: option.value,\n label: option.label,\n color: option.color,\n icon: option.icon,\n })),\n ...undeclared,\n ],\n });\n continue;\n }\n\n const auto = [...collectValuesFromRows(rows, descriptor)]\n .sort((a, b) => a.localeCompare(b, undefined, { numeric: true }))\n .map((value) => ({ value, label: toTitleCase(value) }));\n categories.push({ id: descriptor.id, label: descriptor.label, selectionMode: \"multiple\", options: auto });\n }\n return categories;\n};\n\nexport interface MenuOption {\n value: string;\n label: string;\n}\n\nexport const buildGroupingOptions = (attributes: AttributeDescriptor[]): MenuOption[] => {\n const options: MenuOption[] = [{ value: NO_GROUPING, label: \"None\" }];\n for (const descriptor of attributes) {\n if (!descriptor.groupable) continue;\n // enum-multi is intentionally not offered for grouping (one row can hold\n // multiple values; we don't double-render).\n if (descriptor.type.kind === \"enum-multi\") continue;\n options.push({ value: descriptor.id, label: descriptor.label });\n }\n return options;\n};\n\nexport const buildDisplayPropertyOptions = (attributes: AttributeDescriptor[]): MenuOption[] => {\n const options: MenuOption[] = [];\n for (const descriptor of attributes) {\n if (!descriptor.displayable) continue;\n options.push({ value: descriptor.id, label: descriptor.label });\n }\n return options;\n};\n\nexport const resolveSubGroupingOptions = (options: MenuOption[], columnGrouping: string) => {\n if (columnGrouping === NO_GROUPING) return options.filter((option) => option.value === NO_GROUPING);\n return options.filter((option) => option.value === NO_GROUPING || option.value !== columnGrouping);\n};\n\nexport const resolveListDropTargetColumnKey = (columnGrouping: string, placement?: { columnKey?: string }) => {\n if (columnGrouping === NO_GROUPING) return \"all\";\n return placement?.columnKey;\n};\n\n/**\n * Source rows keep the unassigned column visible. Only rules on the grouping field\n * limit which columns the filter can still show.\n */\nexport const resolveKnownColumnKeys = (\n columnGrouping: string,\n attributes: AttributeDescriptor[],\n filter?: ViewFilterGroup,\n structureRows: KanbanRendererRow[] = [],\n) => {\n if (columnGrouping === NO_GROUPING) return undefined;\n const descriptor = findAttribute(attributes, columnGrouping);\n if (!descriptor || descriptor.type.kind !== \"enum\") return undefined;\n const keys = getEnumOptions(descriptor.type).map((option) => option.value);\n const empty = emptyGroupKey(descriptor);\n if (structureRows.some((row) => groupKey(row, descriptor) === empty)) keys.push(empty);\n if (filter?.conjunction !== \"and\") return keys;\n const candidates = keys.map((key) => ({\n id: key,\n title: key,\n attributes: key === empty ? {} : { [columnGrouping]: key },\n }));\n return filterRowsByView(\n candidates,\n { conjunction: \"and\", rules: filter.rules.filter((rule) => rule.attributeId === columnGrouping) },\n [descriptor],\n ).map((row) => row.id);\n};\n","import { Button, HStack, Icon, IconButton, Menu, Popover, Portal, Text } from \"@chakra-ui/react\";\nimport { Check, ChevronDown, List, Settings2, SquareKanban } from \"lucide-react\";\nimport { Fragment, type ReactNode, useEffect, useRef, useState } from \"react\";\nimport { Tooltip } from \"@/components/primitives/tooltip\";\nimport { type MenuOption, resolveSubGroupingOptions } from \"./kanban-renderer-helpers\";\nimport type { KanbanRendererSettings } from \"./types\";\n\ninterface DisplayMenuProps {\n settings: KanbanRendererSettings;\n sortControl?: ReactNode;\n groupingOptions: MenuOption[];\n displayPropertyOptions: MenuOption[];\n onViewModeChange: (value: KanbanRendererSettings[\"viewMode\"]) => void;\n onColumnGroupingChange: (value: string) => void;\n onRowGroupingChange: (value: string) => void;\n onDisplayPropertyToggle: (property: string) => void;\n}\n\nconst SectionLabel = (props: { children: string }) => (\n <Text paddingX=\"xs\" paddingTop=\"xs\" paddingBottom=\"2xs\" textStyle=\"label/XS/medium\" color=\"fg.muted\">\n {props.children}\n </Text>\n);\n\nexport interface DisplayMenuSelectProps {\n label: string;\n value: string;\n options: MenuOption[];\n onSelect: (value: string) => void;\n}\n\n/** A Display menu row: the setting's name on the left, its value and a menu on the right. */\nexport const DisplayMenuSelect = (props: DisplayMenuSelectProps) => {\n const selectedLabel = props.options.find((option) => option.value === props.value)?.label ?? props.label;\n const hasNoneFirst = props.options[0]?.value === \"none\";\n\n return (\n <Menu.Root positioning={{ strategy: \"fixed\", hideWhenDetached: true }}>\n <Menu.Trigger asChild>\n <Button size=\"xs\" variant=\"ghost\" width=\"full\" justifyContent=\"flex-start\" gap=\"xs\">\n <Text textStyle=\"label/S/regular\">{props.label}</Text>\n <HStack marginLeft=\"auto\" minW=\"0\" gap=\"2xs\" color=\"fg.muted\">\n <Text textStyle=\"label/S/regular\" truncate>\n {selectedLabel}\n </Text>\n </HStack>\n <ChevronDown size={12} />\n </Button>\n </Menu.Trigger>\n <Menu.Positioner>\n <Menu.Content>\n {props.options.map((option, index) => (\n <Fragment key={option.value}>\n {hasNoneFirst && index === 1 ? <Menu.Separator /> : null}\n <Menu.Item value={option.value} onClick={() => props.onSelect(option.value)}>\n <HStack width=\"full\" gap=\"xs\">\n <Text textStyle=\"label/S/regular\">{option.label}</Text>\n {option.value === props.value ? <Icon as={Check} marginLeft=\"auto\" boxSize=\"0.875rem\" /> : null}\n </HStack>\n </Menu.Item>\n </Fragment>\n ))}\n </Menu.Content>\n </Menu.Positioner>\n </Menu.Root>\n );\n};\n\nexport const DisplayMenu = (props: DisplayMenuProps) => {\n const {\n settings,\n groupingOptions,\n displayPropertyOptions,\n onViewModeChange,\n onColumnGroupingChange,\n onRowGroupingChange,\n onDisplayPropertyToggle,\n } = props;\n const triggerRef = useRef<HTMLButtonElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const [open, setOpen] = useState(false);\n useEffect(() => {\n if (!open) return;\n const closeOnOutsidePointerDown = (event: PointerEvent) => {\n const target = event.target;\n if (!(target instanceof Node)) return;\n if (contentRef.current?.contains(target) || triggerRef.current?.contains(target)) return;\n setOpen(false);\n };\n document.addEventListener(\"pointerdown\", closeOnOutsidePointerDown);\n return () => document.removeEventListener(\"pointerdown\", closeOnOutsidePointerDown);\n }, [open]);\n\n return (\n <Popover.Root\n open={open}\n closeOnInteractOutside={false}\n positioning={{\n placement: \"bottom-end\",\n offset: { mainAxis: 8 },\n getAnchorElement: () => triggerRef.current,\n }}\n onOpenChange={(details) => setOpen(details.open)}\n >\n <Tooltip content=\"Display\">\n <Popover.Trigger asChild>\n <IconButton ref={triggerRef} aria-label=\"Display settings\" variant=\"ghost\" size=\"2xs\">\n <Icon as={Settings2} />\n </IconButton>\n </Popover.Trigger>\n </Tooltip>\n <Portal>\n <Popover.Positioner>\n <Popover.Content ref={contentRef} width=\"18.75rem\" padding=\"xs\" gap=\"1px\">\n <SectionLabel>DISPLAY</SectionLabel>\n <HStack borderRadius=\"sm\" bg=\"bg.subtle\" padding=\"2xs\" gap=\"2xs\">\n <Button\n flex=\"1\"\n size=\"2xs\"\n variant=\"ghost\"\n aria-pressed={settings.viewMode === \"list\"}\n onClick={() => onViewModeChange(\"list\")}\n >\n <List />\n List\n </Button>\n <Button\n flex=\"1\"\n size=\"2xs\"\n variant=\"ghost\"\n aria-pressed={settings.viewMode === \"board\"}\n onClick={() => onViewModeChange(\"board\")}\n >\n <SquareKanban />\n Board\n </Button>\n </HStack>\n\n <DisplayMenuSelect\n label=\"Grouping\"\n value={settings.columnGrouping}\n options={groupingOptions}\n onSelect={(value) => {\n onColumnGroupingChange(value);\n if (value === \"none\" || value === settings.rowGrouping) onRowGroupingChange(\"none\");\n }}\n />\n <DisplayMenuSelect\n label=\"Sub-grouping\"\n value={settings.rowGrouping}\n options={resolveSubGroupingOptions(groupingOptions, settings.columnGrouping)}\n onSelect={onRowGroupingChange}\n />\n\n {props.sortControl}\n <SectionLabel>PROPERTIES</SectionLabel>\n <HStack paddingX=\"xs\" paddingBottom=\"xs\" flexWrap=\"wrap\" gap=\"2xs\">\n {displayPropertyOptions.map((option) => {\n const active = settings.displayProperties.includes(option.value);\n return (\n <Button\n key={option.value}\n size=\"2xs\"\n variant=\"ghost\"\n aria-pressed={active}\n onClick={() => onDisplayPropertyToggle(option.value)}\n >\n {option.label}\n </Button>\n );\n })}\n </HStack>\n </Popover.Content>\n </Popover.Positioner>\n </Portal>\n </Popover.Root>\n );\n};\n","import { Button, Icon } from \"@chakra-ui/react\";\nimport { SearchX, X } from \"lucide-react\";\nimport { EmptyState } from \"@/components/primitives/empty-state\";\n\nexport interface CollectionViewEmptyStateProps {\n search: string;\n onClearSearch: () => void;\n}\n\n/** Search feedback offers a direct way back to the collection. */\nexport const CollectionViewEmptyState = (props: CollectionViewEmptyStateProps) => {\n const { search, onClearSearch } = props;\n return (\n <EmptyState\n h=\"full\"\n icon={<Icon as={SearchX} />}\n title={`No results for “${search.trim()}”`}\n description=\"Search looks at the titles and properties this view shows.\"\n >\n <Button size=\"2xs\" variant=\"outline\" onClick={onClearSearch}>\n <X /> Clear search\n </Button>\n </EmptyState>\n );\n};\n","import { HStack, Stack, Text } from \"@chakra-ui/react\";\nimport type { ViewSort } from \"@pstdio/sdk/extensions\";\nimport type { AttributeDescriptor } from \"../kanban-renderer/types\";\nimport { fieldIcon } from \"./collection-view-field-icon\";\nimport { canSortField, findField } from \"./collection-view-fields\";\nimport { sortDirectionLabel } from \"./collection-view-labels\";\nimport { RuleSelect } from \"./rule-select\";\n\nexport interface DisplaySortControlProps {\n fields: AttributeDescriptor[];\n sorts: ViewSort[];\n onSortsChange: (sorts: ViewSort[]) => void;\n}\n\n/** Display settings and table headers edit the same single sort. */\nexport const DisplaySortControl = (props: DisplaySortControlProps) => {\n const { fields, sorts, onSortsChange } = props;\n const sort = sorts[0];\n const field = sort ? findField(fields, sort.attributeId) : undefined;\n return (\n <Stack data-testid=\"display-sort-control\" gap=\"1px\">\n <HStack paddingX=\"xs\" minH=\"7\" gap=\"xs\">\n <Text textStyle=\"label/S/regular\" flex=\"1\">\n Ordering\n </Text>\n <RuleSelect\n aria-label=\"Ordering\"\n width=\"9rem\"\n value={sort ? `field:${sort.attributeId}` : \"none\"}\n options={[\n { value: \"none\", label: \"None\" },\n ...fields\n .filter(canSortField)\n .map((entry) => ({ value: `field:${entry.id}`, label: entry.label, icon: fieldIcon(entry) })),\n ]}\n onSelect={(choice) =>\n onSortsChange(\n choice === \"none\" ? [] : [{ attributeId: choice.slice(6), direction: sort?.direction ?? \"asc\" }],\n )\n }\n />\n </HStack>\n {sort ? (\n <HStack paddingX=\"xs\" minH=\"7\" gap=\"xs\">\n <Text textStyle=\"label/S/regular\" flex=\"1\">\n Direction\n </Text>\n <RuleSelect\n aria-label=\"Sort direction\"\n width=\"9rem\"\n value={sort.direction}\n options={[\n { value: \"asc\", label: sortDirectionLabel(field, \"asc\") },\n { value: \"desc\", label: sortDirectionLabel(field, \"desc\") },\n ]}\n onSelect={(direction) => onSortsChange([{ ...sort, direction: direction as ViewSort[\"direction\"] }])}\n />\n </HStack>\n ) : null}\n </Stack>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"display-sort-control-n3L5WvkJ.js","names":["Badge","Icon","Text","LucideIcon","lucideIcons","CollectionBadgeProps","label","icon","onClick","toPascalCase","value","split","filter","Boolean","map","part","charAt","toUpperCase","slice","join","resolveIcon","name","undefined","pascalName","candidate","component","Record","CollectionBadge","props","$","_c","t0","BadgeIcon","t1","t2","t3","content","t4","Symbol","for","display","gap","alignItems","minW","maxW","variant","bg","_light","_dark","color","textStyle","sharedProps","const","t5","event","stopPropagation","t6","_c","_Fragment","enumOptionLabel","findEnumOption","getEnumOptions","toTitleCase","AttributeDescriptor","AttributeType","EnumOption","summarizeMultiEnum","values","type","length","map","value","join","AttributeBadge","attributeId","attributeLabel","label","color","icon","options","isEditable","getAttributeBadgeColorPalette","_badge","renderEnumBadge","descriptor","kind","stringValue","editable","id","undefined","option","renderMultiEnumBadge","Array","isArray","filter","entry","summary","firstOption","ViewFilterGroup","createElement","ReactNode","getAttributeStringValues","getAttributeValue","filterRowsByView","emptyGroupKey","groupKey","CollectionBadge","AttributeBadge","renderEnumBadge","renderMultiEnumBadge","getEnumOptions","toTitleCase","AttributeDescriptor","CollectionBadgeItem","KanbanRendererRow","findAttribute","NO_GROUPING","getAttributeBadgeColorPalette","enumOptionLabel","findEnumOption","formatDateValue","value","date","Date","Number","isNaN","getTime","toLocaleDateString","formatNumberValue","isFinite","String","formatStringValue","undefined","formatUserValue","isRenderableNode","isRecord","Record","Array","isArray","textValue","trim","isCollectionResource","NonNullable","type","id","normalizeCollectionBadgeItems","flatMap","item","label","icon","resource","renderBadgeListDisplay","descriptor","row","openResource","display","kind","items","attributes","itemsAttributeId","length","selectedId","selectedItem","find","orderedItems","filter","map","key","onClick","renderAttributeBadge","render","formatted","attributeId","color","collectDisplayBadges","displayProperties","badges","displayable","badge","push","collectDisplayCustomSlots","slots","slot","collectValuesFromRows","rows","values","Set","add","FilterCategoryView","selectionMode","options","buildFilterCategories","categories","filterable","declared","auto","declaredValues","option","undeclared","has","sort","a","b","localeCompare","numeric","MenuOption","buildGroupingOptions","groupable","buildDisplayPropertyOptions","resolveSubGroupingOptions","columnGrouping","resolveListDropTargetColumnKey","placement","columnKey","resolveKnownColumnKeys","structureRows","keys","empty","some","conjunction","candidates","title","rules","rule","Button","HStack","Icon","IconButton","Menu","Popover","Portal","Text","Check","ChevronDown","List","Settings2","SquareKanban","Fragment","ReactNode","useEffect","useRef","useState","Tooltip","MenuOption","resolveSubGroupingOptions","KanbanRendererSettings","DisplayMenuProps","settings","sortControl","groupingOptions","displayPropertyOptions","onViewModeChange","value","onColumnGroupingChange","onRowGroupingChange","onDisplayPropertyToggle","property","SectionLabel","props","$","_c","t0","children","DisplayMenuSelectProps","label","options","onSelect","DisplayMenuSelect","find","option","selectedLabel","hasNoneFirst","t1","Symbol","for","strategy","hideWhenDetached","t2","t3","t4","t5","t6","map","option_0","index","t7","t8","DisplayMenu","triggerRef","contentRef","open","setOpen","closeOnOutsidePointerDown","event","target","Node","current","contains","document","addEventListener","removeEventListener","placement","offset","mainAxis","getAnchorElement","details","viewMode","t9","t10","t11","t12","t13","t14","t15","rowGrouping","t16","columnGrouping","t17","t18","t19","t20","t21","t22","displayProperties","t23","active","includes","t24","t25","_c","Fragment","Tooltip","Button","Icon","SearchX","X","EmptyState","CollectionViewEmptyStateProps","search","onClearSearch","CollectionViewEmptyState","props","$","_c","t0","Symbol","for","t1","trim","t2","t3","t4","t5","_c","EmptyState","HStack","Stack","Text","ViewSort","AttributeDescriptor","fieldIcon","canSortField","findField","sortDirectionLabel","RuleSelect","DisplaySortControlProps","fields","sorts","onSortsChange","DisplaySortControl","props","$","_c","sort","t0","field","attributeId","undefined","t1","Symbol","for","t2","t3","value","label","t4","filter","map","_temp","t5","direction","choice","slice","t6","entry","id","icon","_c","Tooltip$1","getAttributeValue","findEnumOption","enumOptionLabel","findAttribute","getEnumOptions","getAttributeStringValues","findField","fieldIcon","NO_GROUPING","toTitleCase","RuleSelect","filterRowsByView","canSortField","groupKey","emptyGroupKey","Fragment$1","lucideIcons","toPascalCase","value","part","resolveIcon","name","pascalName","candidate","component","CollectionBadge","$","c","props","t0","icon","BadgeIcon","t1","Icon","t2","label","Text","t3","Fragment","content","t4","sharedProps","onClick","t5","event","t6","Badge","summarizeMultiEnum","values","type","renderEnumBadge","stringValue","editable","descriptor","option","renderMultiEnumBadge","entry","summary","firstOption","formatDateValue","date","formatNumberValue","formatStringValue","formatUserValue","isRenderableNode","isRecord","textValue","isCollectionResource","normalizeCollectionBadgeItems","item","id","resource","renderBadgeListDisplay","items","row","selectedId","selectedItem","createElement","openResource","renderAttributeBadge","formatted","collectDisplayBadges","badges","displayProperties","attributes","badge","collectDisplayCustomSlots","slots","slot","collectValuesFromRows","rows","buildFilterCategories","categories","declared","auto","declaredValues","undeclared","a","b","buildGroupingOptions","options","buildDisplayPropertyOptions","resolveSubGroupingOptions","columnGrouping","resolveListDropTargetColumnKey","placement","resolveKnownColumnKeys","keys","empty","structureRows","filter","candidates","key","rule","SectionLabel","DisplayMenuSelect","selectedLabel","hasNoneFirst","HStack","ChevronDown","Menu","Button","index","option_0","Check","t7","t8","DisplayMenu","triggerRef","useRef","contentRef","open","setOpen","useState","closeOnOutsidePointerDown","target","useEffect","details","Popover","IconButton","Settings2","settings","onViewModeChange","List","t9","t10","t11","t12","SquareKanban","t13","t14","t15","onColumnGroupingChange","onRowGroupingChange","t16","groupingOptions","t17","t18","t19","t20","t21","t22","displayPropertyOptions","onDisplayPropertyToggle","t23","active","t24","Portal","t25","CollectionViewEmptyState","SearchX","search","X","onClearSearch","EmptyState$1","DisplaySortControl","sort","sorts","fields","onSortsChange","field","_temp","choice","Stack","sortDirectionLabel"],"sources":["../src/components/kanban-renderer/collection-badge.tsx","../src/components/kanban-renderer/kanban-renderer-badge-helpers.ts","../src/components/kanban-renderer/kanban-renderer-helpers.ts","../src/components/kanban-renderer/display-menu.tsx","../src/components/collection-view/collection-view-empty-state.tsx","../src/components/collection-view/display-sort-control.tsx"],"sourcesContent":["import { Badge, Icon, Text } from \"@chakra-ui/react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport * as lucideIcons from \"lucide-react\";\n\ninterface CollectionBadgeProps {\n label: string;\n icon?: string;\n onClick?: () => void;\n}\n\nconst toPascalCase = (value: string) =>\n value\n .split(/[^a-zA-Z0-9]+/)\n .filter(Boolean)\n .map((part) => `${part.charAt(0).toUpperCase()}${part.slice(1)}`)\n .join(\"\");\n\nconst resolveIcon = (name: string | undefined) => {\n if (!name) return undefined;\n const pascalName = toPascalCase(name);\n for (const candidate of [name, pascalName, `${pascalName}Icon`]) {\n const component = (lucideIcons as Record<string, unknown>)[candidate];\n if (component && (typeof component === \"function\" || typeof component === \"object\")) {\n return component as LucideIcon;\n }\n }\n return undefined;\n};\n\nexport const CollectionBadge = (props: CollectionBadgeProps) => {\n const { label, icon, onClick } = props;\n const BadgeIcon = resolveIcon(icon);\n\n const content = (\n <>\n {BadgeIcon ? <Icon as={BadgeIcon} boxSize=\"3.5\" flexShrink={0} aria-hidden=\"true\" /> : null}\n <Text as=\"span\" textStyle=\"label/XS/medium\" color=\"fg.muted\" minW=\"0\" maxW=\"10rem\" truncate>\n {label}\n </Text>\n </>\n );\n\n const sharedProps = {\n display: \"inline-flex\",\n gap: \"2xs\",\n alignItems: \"center\",\n minW: \"0\",\n maxW: \"100%\",\n variant: \"subtle\",\n bg: { _light: \"bg.muted\", _dark: \"bg.subtle\" },\n color: \"fg.muted\",\n textStyle: \"label/XS/medium\",\n \"data-testid\": \"collection-badge\",\n } as const;\n\n if (onClick) {\n return (\n <Badge asChild {...sharedProps} cursor=\"pointer\">\n <button\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n onClick();\n }}\n >\n {content}\n </button>\n </Badge>\n );\n }\n\n return (\n <Badge as=\"span\" {...sharedProps} cursor=\"default\">\n {content}\n </Badge>\n );\n};\n","import { enumOptionLabel, findEnumOption, getEnumOptions, toTitleCase } from \"./kanban-renderer-enum-helpers\";\nimport type { AttributeDescriptor, AttributeType, EnumOption } from \"./types\";\n\nconst summarizeMultiEnum = (values: string[], type: AttributeType) => {\n if (values.length === 0) return null;\n if (values.length <= 2) return values.map((value) => enumOptionLabel(type, value)).join(\", \");\n return `${enumOptionLabel(type, values[0]!)}, ${enumOptionLabel(type, values[1]!)} +${values.length - 2}`;\n};\n\nexport interface AttributeBadge {\n attributeId: string;\n attributeLabel?: string;\n label: string;\n color?: string;\n icon?: string | null;\n value?: string | string[];\n options?: EnumOption[];\n isEditable?: boolean;\n}\n\nexport const getAttributeBadgeColorPalette = (_badge: AttributeBadge) => \"gray\";\n\nexport const renderEnumBadge = (descriptor: AttributeDescriptor, type: AttributeType, value: unknown) => {\n if (type.kind !== \"enum\") return null;\n const stringValue = typeof value === \"string\" ? value : null;\n const editable = descriptor.editable === true;\n if (!stringValue) {\n return editable\n ? {\n attributeId: descriptor.id,\n attributeLabel: descriptor.label,\n label: descriptor.label,\n value: stringValue ?? undefined,\n options: getEnumOptions(type),\n isEditable: true,\n }\n : null;\n }\n const option = findEnumOption(type, stringValue);\n return {\n attributeId: descriptor.id,\n attributeLabel: descriptor.label,\n label: option?.label ?? toTitleCase(stringValue),\n color: option?.color,\n icon: option?.icon,\n ...(editable ? { value: stringValue, options: getEnumOptions(type), isEditable: true } : {}),\n };\n};\n\nexport const renderMultiEnumBadge = (descriptor: AttributeDescriptor, type: AttributeType, value: unknown) => {\n if (type.kind !== \"enum-multi\") return null;\n const values = Array.isArray(value) ? value.filter((entry): entry is string => typeof entry === \"string\") : [];\n const summary = summarizeMultiEnum(values, type);\n const editable = descriptor.editable === true;\n if (!summary) {\n return editable\n ? {\n attributeId: descriptor.id,\n attributeLabel: descriptor.label,\n label: descriptor.label,\n value: values,\n options: getEnumOptions(type),\n isEditable: true,\n }\n : null;\n }\n const firstOption = values[0] ? findEnumOption(type, values[0]) : undefined;\n return {\n attributeId: descriptor.id,\n attributeLabel: descriptor.label,\n label: summary,\n color: firstOption?.color,\n icon: firstOption?.icon,\n ...(editable ? { value: values, options: getEnumOptions(type), isEditable: true } : {}),\n };\n};\n","import type { ViewFilterGroup } from \"@pstdio/sdk/extensions\";\nimport { createElement, type ReactNode } from \"react\";\nimport { getAttributeStringValues, getAttributeValue } from \"../collection-view/collection-view-fields\";\nimport { filterRowsByView } from \"../collection-view/collection-view-filter\";\nimport { emptyGroupKey, groupKey } from \"../collection-view/collection-view-grouping\";\nimport { CollectionBadge } from \"./collection-badge\";\nimport type { AttributeBadge } from \"./kanban-renderer-badge-helpers\";\nimport { renderEnumBadge, renderMultiEnumBadge } from \"./kanban-renderer-badge-helpers\";\nimport { getEnumOptions, toTitleCase } from \"./kanban-renderer-enum-helpers\";\nimport type { AttributeDescriptor, CollectionBadgeItem, KanbanRendererRow } from \"./types\";\nimport { findAttribute, NO_GROUPING } from \"./types\";\n\nexport type { AttributeBadge } from \"./kanban-renderer-badge-helpers\";\nexport { getAttributeBadgeColorPalette } from \"./kanban-renderer-badge-helpers\";\nexport { enumOptionLabel, findEnumOption, getEnumOptions, toTitleCase } from \"./kanban-renderer-enum-helpers\";\n\nconst formatDateValue = (value: unknown) => {\n if (typeof value !== \"string\" || value === \"\") return null;\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return null;\n return date.toLocaleDateString();\n};\n\nconst formatNumberValue = (value: unknown) => {\n if (typeof value === \"number\" && Number.isFinite(value)) return String(value);\n if (typeof value === \"string\" && value !== \"\" && !Number.isNaN(Number(value))) return value;\n return null;\n};\n\nconst formatStringValue = (value: unknown) => {\n if (value === null || value === undefined) return null;\n if (typeof value === \"string\") return value === \"\" ? null : value;\n return String(value);\n};\n\nconst formatUserValue = (value: unknown) => formatStringValue(value);\n\nconst isRenderableNode = (value: unknown) => value !== null && value !== undefined && value !== false;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst textValue = (value: unknown) => (typeof value === \"string\" && value.trim() ? value.trim() : undefined);\n\nconst isCollectionResource = (value: unknown): value is NonNullable<CollectionBadgeItem[\"resource\"]> =>\n isRecord(value) && typeof value.type === \"string\" && typeof value.id === \"string\";\n\nconst normalizeCollectionBadgeItems = (value: unknown): CollectionBadgeItem[] => {\n if (!Array.isArray(value)) return [];\n\n return value.flatMap((item) => {\n if (!isRecord(item)) return [];\n const id = textValue(item.id);\n if (!id) return [];\n const label = textValue(item.label) ?? id;\n const icon = textValue(item.icon);\n const resource = isCollectionResource(item.resource) ? item.resource : undefined;\n return [{ id, label, ...(icon ? { icon } : {}), ...(resource ? { resource } : {}) }];\n });\n};\n\nexport const renderBadgeListDisplay = (\n descriptor: AttributeDescriptor,\n value: unknown,\n row: KanbanRendererRow,\n openResource?: (resource: NonNullable<CollectionBadgeItem[\"resource\"]>) => void,\n): ReactNode => {\n if (descriptor.display?.kind !== \"badge-list\") return null;\n const items = normalizeCollectionBadgeItems(row.attributes[descriptor.display.itemsAttributeId]);\n if (items.length === 0) return null;\n\n const selectedId = typeof value === \"string\" ? value : undefined;\n const selectedItem = items.find((item) => item.id === selectedId) ?? items[0];\n if (!selectedItem) return null;\n\n const orderedItems = [selectedItem, ...items.filter((item) => item.id !== selectedItem.id)];\n return orderedItems.map((item) =>\n createElement(CollectionBadge, {\n key: item.id,\n label: item.label,\n icon: item.icon,\n onClick: item.resource && openResource ? () => openResource(item.resource!) : undefined,\n }),\n );\n};\n\n/**\n * Per-type default cell summary used by the card / list end-content. Returns\n * null when the attribute has no displayable value.\n */\nexport const renderAttributeBadge = (\n descriptor: AttributeDescriptor,\n row: KanbanRendererRow,\n): AttributeBadge | null => {\n const type = descriptor.type;\n const value = getAttributeValue(row, descriptor);\n\n if (descriptor.render || descriptor.display) return null;\n\n if (type.kind === \"enum\") return renderEnumBadge(descriptor, type, value);\n if (type.kind === \"enum-multi\") return renderMultiEnumBadge(descriptor, type, value);\n\n if (type.kind === \"date\") {\n const formatted = formatDateValue(value);\n return formatted ? { attributeId: descriptor.id, label: formatted } : null;\n }\n\n if (type.kind === \"number\") {\n const formatted = formatNumberValue(value);\n return formatted ? { attributeId: descriptor.id, label: formatted } : null;\n }\n\n if (type.kind === \"user\") {\n const formatted = formatUserValue(value);\n return formatted ? { attributeId: descriptor.id, label: formatted, color: \"blue\" } : null;\n }\n\n const formatted = formatStringValue(value);\n return formatted ? { attributeId: descriptor.id, label: formatted } : null;\n};\n\nexport const collectDisplayBadges = (\n row: KanbanRendererRow,\n attributes: AttributeDescriptor[],\n displayProperties: string[],\n): AttributeBadge[] => {\n const badges: AttributeBadge[] = [];\n for (const id of displayProperties) {\n const descriptor = findAttribute(attributes, id);\n if (!descriptor || descriptor.displayable === false) continue;\n const badge = renderAttributeBadge(descriptor, row);\n if (badge) badges.push(badge);\n }\n return badges;\n};\n\nexport const collectDisplayCustomSlots = (\n row: KanbanRendererRow,\n attributes: AttributeDescriptor[],\n displayProperties: string[],\n): ReactNode[] => {\n const slots: ReactNode[] = [];\n for (const id of displayProperties) {\n const descriptor = findAttribute(attributes, id);\n if (!descriptor || descriptor.displayable === false) continue;\n\n const value = getAttributeValue(row, descriptor);\n const slot = descriptor.render ? descriptor.render(value, row) : renderBadgeListDisplay(descriptor, value, row);\n if (isRenderableNode(slot)) slots.push(slot);\n }\n return slots;\n};\n\nconst collectValuesFromRows = (rows: KanbanRendererRow[], descriptor: AttributeDescriptor) => {\n const values = new Set<string>();\n for (const row of rows) {\n for (const value of getAttributeStringValues(row, descriptor)) values.add(value);\n }\n return values;\n};\n\nexport interface FilterCategoryView {\n id: string;\n label: string;\n selectionMode: \"multiple\";\n options: { value: string; label: string; color?: string; icon?: string | null }[];\n}\n\n/**\n * Build the filter menu's category list from the declared attributes. Enum\n * descriptors expose their declared options first; auto-derived values from\n * the data fill in the gaps for string / date / number / user attributes (so\n * filter chips for free-form fields don't require declaring every option).\n */\nexport const buildFilterCategories = (\n attributes: AttributeDescriptor[],\n rows: KanbanRendererRow[],\n): FilterCategoryView[] => {\n const categories: FilterCategoryView[] = [];\n for (const descriptor of attributes) {\n if (!descriptor.filterable) continue;\n\n if (descriptor.type.kind === \"enum\" || descriptor.type.kind === \"enum-multi\") {\n const declared = getEnumOptions(descriptor.type);\n const auto = collectValuesFromRows(rows, descriptor);\n const declaredValues = new Set(declared.map((option) => option.value));\n const undeclared = [...auto]\n .filter((value) => !declaredValues.has(value))\n .sort((a, b) => a.localeCompare(b, undefined, { numeric: true }))\n .map((value) => ({ value, label: toTitleCase(value) }));\n\n categories.push({\n id: descriptor.id,\n label: descriptor.label,\n selectionMode: \"multiple\",\n options: [\n ...declared.map((option) => ({\n value: option.value,\n label: option.label,\n color: option.color,\n icon: option.icon,\n })),\n ...undeclared,\n ],\n });\n continue;\n }\n\n const auto = [...collectValuesFromRows(rows, descriptor)]\n .sort((a, b) => a.localeCompare(b, undefined, { numeric: true }))\n .map((value) => ({ value, label: toTitleCase(value) }));\n categories.push({ id: descriptor.id, label: descriptor.label, selectionMode: \"multiple\", options: auto });\n }\n return categories;\n};\n\nexport interface MenuOption {\n value: string;\n label: string;\n}\n\nexport const buildGroupingOptions = (attributes: AttributeDescriptor[]): MenuOption[] => {\n const options: MenuOption[] = [{ value: NO_GROUPING, label: \"None\" }];\n for (const descriptor of attributes) {\n if (!descriptor.groupable) continue;\n // enum-multi is intentionally not offered for grouping (one row can hold\n // multiple values; we don't double-render).\n if (descriptor.type.kind === \"enum-multi\") continue;\n options.push({ value: descriptor.id, label: descriptor.label });\n }\n return options;\n};\n\nexport const buildDisplayPropertyOptions = (attributes: AttributeDescriptor[]): MenuOption[] => {\n const options: MenuOption[] = [];\n for (const descriptor of attributes) {\n if (!descriptor.displayable) continue;\n options.push({ value: descriptor.id, label: descriptor.label });\n }\n return options;\n};\n\nexport const resolveSubGroupingOptions = (options: MenuOption[], columnGrouping: string) => {\n if (columnGrouping === NO_GROUPING) return options.filter((option) => option.value === NO_GROUPING);\n return options.filter((option) => option.value === NO_GROUPING || option.value !== columnGrouping);\n};\n\nexport const resolveListDropTargetColumnKey = (columnGrouping: string, placement?: { columnKey?: string }) => {\n if (columnGrouping === NO_GROUPING) return \"all\";\n return placement?.columnKey;\n};\n\n/**\n * Source rows keep the unassigned column visible. Only rules on the grouping field\n * limit which columns the filter can still show.\n */\nexport const resolveKnownColumnKeys = (\n columnGrouping: string,\n attributes: AttributeDescriptor[],\n filter?: ViewFilterGroup,\n structureRows: KanbanRendererRow[] = [],\n) => {\n if (columnGrouping === NO_GROUPING) return undefined;\n const descriptor = findAttribute(attributes, columnGrouping);\n if (!descriptor || descriptor.type.kind !== \"enum\") return undefined;\n const keys = getEnumOptions(descriptor.type).map((option) => option.value);\n const empty = emptyGroupKey(descriptor);\n if (structureRows.some((row) => groupKey(row, descriptor) === empty)) keys.push(empty);\n if (filter?.conjunction !== \"and\") return keys;\n const candidates = keys.map((key) => ({\n id: key,\n title: key,\n attributes: key === empty ? {} : { [columnGrouping]: key },\n }));\n return filterRowsByView(\n candidates,\n { conjunction: \"and\", rules: filter.rules.filter((rule) => rule.attributeId === columnGrouping) },\n [descriptor],\n ).map((row) => row.id);\n};\n","import { Button, HStack, Icon, IconButton, Menu, Popover, Portal, Text } from \"@chakra-ui/react\";\nimport { Check, ChevronDown, List, Settings2, SquareKanban } from \"lucide-react\";\nimport { Fragment, type ReactNode, useEffect, useRef, useState } from \"react\";\nimport { Tooltip } from \"@/components/primitives/tooltip\";\nimport { type MenuOption, resolveSubGroupingOptions } from \"./kanban-renderer-helpers\";\nimport type { KanbanRendererSettings } from \"./types\";\n\ninterface DisplayMenuProps {\n settings: KanbanRendererSettings;\n sortControl?: ReactNode;\n groupingOptions: MenuOption[];\n displayPropertyOptions: MenuOption[];\n onViewModeChange: (value: KanbanRendererSettings[\"viewMode\"]) => void;\n onColumnGroupingChange: (value: string) => void;\n onRowGroupingChange: (value: string) => void;\n onDisplayPropertyToggle: (property: string) => void;\n}\n\nconst SectionLabel = (props: { children: string }) => (\n <Text paddingX=\"xs\" paddingTop=\"xs\" paddingBottom=\"2xs\" textStyle=\"label/XS/medium\" color=\"fg.muted\">\n {props.children}\n </Text>\n);\n\nexport interface DisplayMenuSelectProps {\n label: string;\n value: string;\n options: MenuOption[];\n onSelect: (value: string) => void;\n}\n\n/** A Display menu row: the setting's name on the left, its value and a menu on the right. */\nexport const DisplayMenuSelect = (props: DisplayMenuSelectProps) => {\n const selectedLabel = props.options.find((option) => option.value === props.value)?.label ?? props.label;\n const hasNoneFirst = props.options[0]?.value === \"none\";\n\n return (\n <Menu.Root positioning={{ strategy: \"fixed\", hideWhenDetached: true }}>\n <Menu.Trigger asChild>\n <Button size=\"xs\" variant=\"ghost\" width=\"full\" justifyContent=\"flex-start\" gap=\"xs\">\n <Text textStyle=\"label/S/regular\">{props.label}</Text>\n <HStack marginLeft=\"auto\" minW=\"0\" gap=\"2xs\" color=\"fg.muted\">\n <Text textStyle=\"label/S/regular\" truncate>\n {selectedLabel}\n </Text>\n </HStack>\n <ChevronDown size={12} />\n </Button>\n </Menu.Trigger>\n <Menu.Positioner>\n <Menu.Content>\n {props.options.map((option, index) => (\n <Fragment key={option.value}>\n {hasNoneFirst && index === 1 ? <Menu.Separator /> : null}\n <Menu.Item value={option.value} onClick={() => props.onSelect(option.value)}>\n <HStack width=\"full\" gap=\"xs\">\n <Text textStyle=\"label/S/regular\">{option.label}</Text>\n {option.value === props.value ? <Icon as={Check} marginLeft=\"auto\" boxSize=\"0.875rem\" /> : null}\n </HStack>\n </Menu.Item>\n </Fragment>\n ))}\n </Menu.Content>\n </Menu.Positioner>\n </Menu.Root>\n );\n};\n\nexport const DisplayMenu = (props: DisplayMenuProps) => {\n const {\n settings,\n groupingOptions,\n displayPropertyOptions,\n onViewModeChange,\n onColumnGroupingChange,\n onRowGroupingChange,\n onDisplayPropertyToggle,\n } = props;\n const triggerRef = useRef<HTMLButtonElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const [open, setOpen] = useState(false);\n useEffect(() => {\n if (!open) return;\n const closeOnOutsidePointerDown = (event: PointerEvent) => {\n const target = event.target;\n if (!(target instanceof Node)) return;\n if (contentRef.current?.contains(target) || triggerRef.current?.contains(target)) return;\n setOpen(false);\n };\n document.addEventListener(\"pointerdown\", closeOnOutsidePointerDown);\n return () => document.removeEventListener(\"pointerdown\", closeOnOutsidePointerDown);\n }, [open]);\n\n return (\n <Popover.Root\n open={open}\n closeOnInteractOutside={false}\n positioning={{\n placement: \"bottom-end\",\n offset: { mainAxis: 8 },\n getAnchorElement: () => triggerRef.current,\n }}\n onOpenChange={(details) => setOpen(details.open)}\n >\n <Tooltip content=\"Display\">\n <Popover.Trigger asChild>\n <IconButton ref={triggerRef} aria-label=\"Display settings\" variant=\"ghost\" size=\"2xs\">\n <Icon as={Settings2} />\n </IconButton>\n </Popover.Trigger>\n </Tooltip>\n <Portal>\n <Popover.Positioner>\n <Popover.Content ref={contentRef} width=\"18.75rem\" padding=\"xs\" gap=\"1px\">\n <SectionLabel>DISPLAY</SectionLabel>\n <HStack borderRadius=\"sm\" bg=\"bg.subtle\" padding=\"2xs\" gap=\"2xs\">\n <Button\n flex=\"1\"\n size=\"2xs\"\n variant=\"ghost\"\n aria-pressed={settings.viewMode === \"list\"}\n onClick={() => onViewModeChange(\"list\")}\n >\n <List />\n List\n </Button>\n <Button\n flex=\"1\"\n size=\"2xs\"\n variant=\"ghost\"\n aria-pressed={settings.viewMode === \"board\"}\n onClick={() => onViewModeChange(\"board\")}\n >\n <SquareKanban />\n Board\n </Button>\n </HStack>\n\n <DisplayMenuSelect\n label=\"Grouping\"\n value={settings.columnGrouping}\n options={groupingOptions}\n onSelect={(value) => {\n onColumnGroupingChange(value);\n if (value === \"none\" || value === settings.rowGrouping) onRowGroupingChange(\"none\");\n }}\n />\n <DisplayMenuSelect\n label=\"Sub-grouping\"\n value={settings.rowGrouping}\n options={resolveSubGroupingOptions(groupingOptions, settings.columnGrouping)}\n onSelect={onRowGroupingChange}\n />\n\n {props.sortControl}\n <SectionLabel>PROPERTIES</SectionLabel>\n <HStack paddingX=\"xs\" paddingBottom=\"xs\" flexWrap=\"wrap\" gap=\"2xs\">\n {displayPropertyOptions.map((option) => {\n const active = settings.displayProperties.includes(option.value);\n return (\n <Button\n key={option.value}\n size=\"2xs\"\n variant=\"ghost\"\n aria-pressed={active}\n onClick={() => onDisplayPropertyToggle(option.value)}\n >\n {option.label}\n </Button>\n );\n })}\n </HStack>\n </Popover.Content>\n </Popover.Positioner>\n </Portal>\n </Popover.Root>\n );\n};\n","import { Button, Icon } from \"@chakra-ui/react\";\nimport { SearchX, X } from \"lucide-react\";\nimport { EmptyState } from \"@/components/primitives/empty-state\";\n\nexport interface CollectionViewEmptyStateProps {\n search: string;\n onClearSearch: () => void;\n}\n\n/** Search feedback offers a direct way back to the collection. */\nexport const CollectionViewEmptyState = (props: CollectionViewEmptyStateProps) => {\n const { search, onClearSearch } = props;\n return (\n <EmptyState\n h=\"full\"\n icon={<Icon as={SearchX} />}\n title={`No results for “${search.trim()}”`}\n description=\"Search looks at the titles and properties this view shows.\"\n >\n <Button size=\"2xs\" variant=\"outline\" onClick={onClearSearch}>\n <X /> Clear search\n </Button>\n </EmptyState>\n );\n};\n","import { HStack, Stack, Text } from \"@chakra-ui/react\";\nimport type { ViewSort } from \"@pstdio/sdk/extensions\";\nimport type { AttributeDescriptor } from \"../kanban-renderer/types\";\nimport { fieldIcon } from \"./collection-view-field-icon\";\nimport { canSortField, findField } from \"./collection-view-fields\";\nimport { sortDirectionLabel } from \"./collection-view-labels\";\nimport { RuleSelect } from \"./rule-select\";\n\nexport interface DisplaySortControlProps {\n fields: AttributeDescriptor[];\n sorts: ViewSort[];\n onSortsChange: (sorts: ViewSort[]) => void;\n}\n\n/** Display settings and table headers edit the same single sort. */\nexport const DisplaySortControl = (props: DisplaySortControlProps) => {\n const { fields, sorts, onSortsChange } = props;\n const sort = sorts[0];\n const field = sort ? findField(fields, sort.attributeId) : undefined;\n return (\n <Stack data-testid=\"display-sort-control\" gap=\"1px\">\n <HStack paddingX=\"xs\" minH=\"7\" gap=\"xs\">\n <Text textStyle=\"label/S/regular\" flex=\"1\">\n Ordering\n </Text>\n <RuleSelect\n aria-label=\"Ordering\"\n width=\"9rem\"\n value={sort ? `field:${sort.attributeId}` : \"none\"}\n options={[\n { value: \"none\", label: \"None\" },\n ...fields\n .filter(canSortField)\n .map((entry) => ({ value: `field:${entry.id}`, label: entry.label, icon: fieldIcon(entry) })),\n ]}\n onSelect={(choice) =>\n onSortsChange(\n choice === \"none\" ? [] : [{ attributeId: choice.slice(6), direction: sort?.direction ?? \"asc\" }],\n )\n }\n />\n </HStack>\n {sort ? (\n <HStack paddingX=\"xs\" minH=\"7\" gap=\"xs\">\n <Text textStyle=\"label/S/regular\" flex=\"1\">\n Direction\n </Text>\n <RuleSelect\n aria-label=\"Sort direction\"\n width=\"9rem\"\n value={sort.direction}\n options={[\n { value: \"asc\", label: sortDirectionLabel(field, \"asc\") },\n { value: \"desc\", label: sortDirectionLabel(field, \"desc\") },\n ]}\n onSelect={(direction) => onSortsChange([{ ...sort, direction: direction as ViewSort[\"direction\"] }])}\n />\n </HStack>\n ) : null}\n </Stack>\n );\n};\n"],"mappings":"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"}
|