@arbidocs/blocks 0.4.96 → 0.4.97

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 (73) hide show
  1. package/dist/agents/index.cjs +280 -280
  2. package/dist/agents/index.js +4 -4
  3. package/dist/{chunk-3WW32OUU.cjs → chunk-3US5OIDQ.cjs} +3 -3
  4. package/dist/{chunk-3WW32OUU.cjs.map → chunk-3US5OIDQ.cjs.map} +1 -1
  5. package/dist/{chunk-SJVUKXS6.js → chunk-5NQIBJPP.js} +5 -5
  6. package/dist/{chunk-SJVUKXS6.js.map → chunk-5NQIBJPP.js.map} +1 -1
  7. package/dist/chunk-D54JXTPG.cjs +164 -0
  8. package/dist/chunk-D54JXTPG.cjs.map +1 -0
  9. package/dist/{chunk-MROSCSPW.cjs → chunk-DDYXFALG.cjs} +43 -43
  10. package/dist/{chunk-MROSCSPW.cjs.map → chunk-DDYXFALG.cjs.map} +1 -1
  11. package/dist/{chunk-CK6TU76J.cjs → chunk-EHB7J6SR.cjs} +5 -5
  12. package/dist/{chunk-CK6TU76J.cjs.map → chunk-EHB7J6SR.cjs.map} +1 -1
  13. package/dist/{chunk-SC33PQTQ.cjs → chunk-GVOTXXZG.cjs} +5 -5
  14. package/dist/{chunk-SC33PQTQ.cjs.map → chunk-GVOTXXZG.cjs.map} +1 -1
  15. package/dist/{chunk-7RI3G5BO.cjs → chunk-HGJGALLN.cjs} +296 -53
  16. package/dist/chunk-HGJGALLN.cjs.map +1 -0
  17. package/dist/{chunk-PSN4VWI7.cjs → chunk-LENXDIMY.cjs} +5 -5
  18. package/dist/{chunk-PSN4VWI7.cjs.map → chunk-LENXDIMY.cjs.map} +1 -1
  19. package/dist/{chunk-SF4BDUZS.js → chunk-PGDL26TQ.js} +3 -3
  20. package/dist/{chunk-SF4BDUZS.js.map → chunk-PGDL26TQ.js.map} +1 -1
  21. package/dist/{chunk-K27SDLLN.js → chunk-QIEEFBZ5.js} +299 -56
  22. package/dist/chunk-QIEEFBZ5.js.map +1 -0
  23. package/dist/{chunk-Y52CEKVD.js → chunk-RSUOOMPT.js} +3 -3
  24. package/dist/{chunk-Y52CEKVD.js.map → chunk-RSUOOMPT.js.map} +1 -1
  25. package/dist/{chunk-H4SVY5FH.js → chunk-YH6SSJDW.js} +3 -3
  26. package/dist/{chunk-H4SVY5FH.js.map → chunk-YH6SSJDW.js.map} +1 -1
  27. package/dist/{chunk-JID3CZSY.js → chunk-Z3G65XHZ.js} +3 -3
  28. package/dist/{chunk-JID3CZSY.js.map → chunk-Z3G65XHZ.js.map} +1 -1
  29. package/dist/chunk-ZCOVDK2E.js +153 -0
  30. package/dist/chunk-ZCOVDK2E.js.map +1 -0
  31. package/dist/components/DetailPanel.d.ts +106 -0
  32. package/dist/connect/docx.cjs +6 -6
  33. package/dist/connect/docx.js +4 -4
  34. package/dist/connect/index.cjs +25 -25
  35. package/dist/connect/index.js +5 -5
  36. package/dist/databases/DatabaseRowDetail.d.ts +32 -0
  37. package/dist/databases/DatabaseTable.d.ts +3 -1
  38. package/dist/databases/DatabaseToolbar.d.ts +9 -1
  39. package/dist/databases/PickCellEditor.d.ts +8 -1
  40. package/dist/databases/SelectCellEditor.d.ts +6 -1
  41. package/dist/databases/column-types.d.ts +5 -0
  42. package/dist/databases/databaseColumns.d.ts +7 -0
  43. package/dist/databases/index.cjs +381 -11
  44. package/dist/databases/index.cjs.map +1 -1
  45. package/dist/databases/index.d.ts +7 -5
  46. package/dist/databases/index.js +379 -14
  47. package/dist/databases/index.js.map +1 -1
  48. package/dist/databases/linkCells.d.ts +4 -2
  49. package/dist/docx/RibbonMenu.d.ts +15 -0
  50. package/dist/docx/StyleGallery.d.ts +9 -0
  51. package/dist/docx/WordReferences.d.ts +21 -0
  52. package/dist/docx/index.cjs +24 -24
  53. package/dist/docx/index.js +3 -3
  54. package/dist/docx/wordStyles.d.ts +21 -0
  55. package/dist/files/index.cjs +308 -0
  56. package/dist/files/index.cjs.map +1 -1
  57. package/dist/files/index.js +298 -2
  58. package/dist/files/index.js.map +1 -1
  59. package/dist/files/views/gridViews.d.ts +80 -0
  60. package/dist/files/views/index.d.ts +2 -0
  61. package/dist/files/views/useGridViews.d.ts +38 -0
  62. package/dist/index.cjs +428 -428
  63. package/dist/index.cjs.map +1 -1
  64. package/dist/index.d.ts +1 -0
  65. package/dist/index.js +87 -126
  66. package/dist/index.js.map +1 -1
  67. package/dist/tags/TagDetail.d.ts +1 -0
  68. package/dist/workflow-canvas/index.cjs +47 -47
  69. package/dist/workflow-canvas/index.js +4 -4
  70. package/package.json +4 -4
  71. package/src/docx/styles.css +91 -0
  72. package/dist/chunk-7RI3G5BO.cjs.map +0 -1
  73. package/dist/chunk-K27SDLLN.js.map +0 -1
@@ -0,0 +1,153 @@
1
+ "use client";
2
+ import { X, Loader2 } from 'lucide-react';
3
+ import { Button, cn } from '@arbidocs/react/ui';
4
+ import { jsxs, jsx } from 'react/jsx-runtime';
5
+
6
+ // src/components/DetailPanel.tsx
7
+ var DEFAULT_DETAIL_PANEL_LABELS = {
8
+ close: "Close",
9
+ loading: "Loading\u2026",
10
+ showing: "Showing {shown} of {count}"
11
+ };
12
+ function DetailPanel({
13
+ title,
14
+ icon,
15
+ subtitle,
16
+ actions,
17
+ onClose,
18
+ isLoading,
19
+ children,
20
+ labels,
21
+ className,
22
+ testId = "detail-panel"
23
+ }) {
24
+ const l = { ...DEFAULT_DETAIL_PANEL_LABELS, ...labels };
25
+ return /* @__PURE__ */ jsxs(
26
+ "section",
27
+ {
28
+ className: cn("flex h-full min-h-0 flex-col bg-card", className),
29
+ "data-slot": "detail-panel",
30
+ "data-testid": testId,
31
+ children: [
32
+ /* @__PURE__ */ jsxs("header", { className: "flex items-start gap-2 border-b border-border px-4 py-3", children: [
33
+ icon && /* @__PURE__ */ jsx("span", { className: "mt-1 shrink-0 text-muted-foreground", children: icon }),
34
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
35
+ /* @__PURE__ */ jsx(
36
+ "h2",
37
+ {
38
+ className: "break-words text-base font-semibold leading-snug",
39
+ "data-testid": `${testId}-title`,
40
+ children: title
41
+ }
42
+ ),
43
+ subtitle && /* @__PURE__ */ jsx("p", { className: "mt-0.5 text-xs text-muted-foreground", children: subtitle })
44
+ ] }),
45
+ actions && /* @__PURE__ */ jsx("div", { className: "flex shrink-0 items-center gap-1", children: actions }),
46
+ onClose && /* @__PURE__ */ jsx(
47
+ Button,
48
+ {
49
+ variant: "ghost",
50
+ size: "icon",
51
+ className: "size-8 shrink-0",
52
+ onClick: onClose,
53
+ "aria-label": l.close,
54
+ title: l.close,
55
+ "data-testid": `${testId}-close`,
56
+ children: /* @__PURE__ */ jsx(X, { className: "size-4" })
57
+ }
58
+ )
59
+ ] }),
60
+ /* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1 overflow-y-auto px-4 py-4", children: isLoading ? /* @__PURE__ */ jsx(DetailLoading, { label: l.loading }) : /* @__PURE__ */ jsx(DetailBody, { children }) })
61
+ ]
62
+ }
63
+ );
64
+ }
65
+ function DetailBody({
66
+ children,
67
+ className,
68
+ testId
69
+ }) {
70
+ return /* @__PURE__ */ jsx("div", { className: cn("flex flex-col gap-6", className), "data-testid": testId, children });
71
+ }
72
+ function DetailLoading({ label = DEFAULT_DETAIL_PANEL_LABELS.loading }) {
73
+ return /* @__PURE__ */ jsxs("p", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [
74
+ /* @__PURE__ */ jsx(Loader2, { className: "size-4 animate-spin" }),
75
+ " ",
76
+ label
77
+ ] });
78
+ }
79
+ function DetailSection({
80
+ title,
81
+ count,
82
+ shown,
83
+ showingLabel = DEFAULT_DETAIL_PANEL_LABELS.showing,
84
+ children,
85
+ testId
86
+ }) {
87
+ return /* @__PURE__ */ jsxs("section", { className: "flex flex-col gap-2", "data-testid": testId, children: [
88
+ /* @__PURE__ */ jsxs("div", { className: "flex items-baseline gap-2", children: [
89
+ /* @__PURE__ */ jsx("h2", { className: "text-sm font-semibold", children: title }),
90
+ count !== void 0 && /* @__PURE__ */ jsx("span", { className: "text-sm tabular-nums text-muted-foreground", children: count }),
91
+ count !== void 0 && shown !== void 0 && shown < count && /* @__PURE__ */ jsx("span", { className: "ml-auto text-xs text-muted-foreground", children: showingLabel.replace("{shown}", String(shown)).replace("{count}", String(count)) })
92
+ ] }),
93
+ children
94
+ ] });
95
+ }
96
+ function DetailFields({ children, className }) {
97
+ return /* @__PURE__ */ jsx(
98
+ "dl",
99
+ {
100
+ className: cn(
101
+ "grid grid-cols-1 gap-x-4 gap-y-2 sm:grid-cols-[minmax(8rem,auto)_1fr]",
102
+ className
103
+ ),
104
+ children
105
+ }
106
+ );
107
+ }
108
+ function DetailField({ label, icon, children, testId }) {
109
+ return /* @__PURE__ */ jsxs("div", { className: "contents", "data-testid": testId, children: [
110
+ /* @__PURE__ */ jsxs("dt", { className: "flex items-start gap-1.5 pt-1.5 text-sm text-muted-foreground", children: [
111
+ icon && /* @__PURE__ */ jsx("span", { className: "mt-0.5 shrink-0", children: icon }),
112
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 break-words", children: label })
113
+ ] }),
114
+ /* @__PURE__ */ jsx("dd", { className: "min-w-0", children })
115
+ ] });
116
+ }
117
+ function DetailLinkList({ children }) {
118
+ return /* @__PURE__ */ jsx("ul", { className: "divide-y divide-border overflow-hidden rounded-lg border border-border", children });
119
+ }
120
+ function DetailLinkItem({
121
+ icon,
122
+ children,
123
+ trailing,
124
+ after,
125
+ onClick,
126
+ testId
127
+ }) {
128
+ return /* @__PURE__ */ jsxs("li", { className: "flex items-start", children: [
129
+ /* @__PURE__ */ jsxs(
130
+ "button",
131
+ {
132
+ type: "button",
133
+ className: "flex w-full items-start gap-2 px-3 py-2 text-left text-sm transition-colors hover:bg-muted/50 disabled:hover:bg-transparent",
134
+ disabled: !onClick,
135
+ onClick,
136
+ "data-testid": testId,
137
+ children: [
138
+ icon && /* @__PURE__ */ jsx("span", { className: "mt-0.5 shrink-0 text-muted-foreground", children: icon }),
139
+ children,
140
+ trailing
141
+ ]
142
+ }
143
+ ),
144
+ after
145
+ ] });
146
+ }
147
+ function DetailEmpty({ children }) {
148
+ return /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children });
149
+ }
150
+
151
+ export { DEFAULT_DETAIL_PANEL_LABELS, DetailBody, DetailEmpty, DetailField, DetailFields, DetailLinkItem, DetailLinkList, DetailLoading, DetailPanel, DetailSection };
152
+ //# sourceMappingURL=chunk-ZCOVDK2E.js.map
153
+ //# sourceMappingURL=chunk-ZCOVDK2E.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/DetailPanel.tsx"],"names":[],"mappings":"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","file":"chunk-ZCOVDK2E.js","sourcesContent":["/**\n * DetailPanel: one record in full, the same way for every kind of record (a tag, a database row,\n * …). The parts compose:\n *\n * <DetailPanel title=\"Acme Ltd\" icon={…} actions={…} onClose={…}> header + scrolling body\n * <DetailSection title=\"Fields\"> a titled block (with a count)\n * <DetailFields> label / value grid\n * <DetailField label=\"Status\">{typed editor}</DetailField>\n * </DetailFields>\n * </DetailSection>\n * <DetailSection title=\"Documents\" count={12} shown={5}>\n * <DetailLinkList> linked items, each openable\n * <DetailLinkItem icon={…} onClick={…}>Engagement letter.pdf</DetailLinkItem>\n * </DetailLinkList>\n * </DetailSection>\n * </DetailPanel>\n *\n * `DetailBody` is the body alone (sections stacked, no header) for a host that has its own header,\n * like a page section. Presentational: values and edits belong to the host.\n */\nimport type { ReactNode } from 'react'\nimport { Loader2, X } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\n\nexport interface DetailPanelLabels {\n close: string\n loading: string\n /** `{shown}` of `{count}` listed. */\n showing: string\n}\n\nexport const DEFAULT_DETAIL_PANEL_LABELS: DetailPanelLabels = {\n close: 'Close',\n loading: 'Loading…',\n showing: 'Showing {shown} of {count}',\n}\n\nexport interface DetailPanelProps {\n title: ReactNode\n /** A glyph before the title (the record's kind). */\n icon?: ReactNode\n /** A quieter line under the title. */\n subtitle?: ReactNode\n /** Buttons on the header's right (delete, open elsewhere, …). */\n actions?: ReactNode\n /** Shows a close button. */\n onClose?: () => void\n isLoading?: boolean\n children?: ReactNode\n labels?: Partial<DetailPanelLabels>\n className?: string\n testId?: string\n}\n\n/** A record's header (title, actions, close) over its sections, which scroll. */\nexport function DetailPanel({\n title,\n icon,\n subtitle,\n actions,\n onClose,\n isLoading,\n children,\n labels,\n className,\n testId = 'detail-panel',\n}: DetailPanelProps) {\n const l = { ...DEFAULT_DETAIL_PANEL_LABELS, ...labels }\n return (\n <section\n className={cn('flex h-full min-h-0 flex-col bg-card', className)}\n data-slot=\"detail-panel\"\n data-testid={testId}\n >\n <header className=\"flex items-start gap-2 border-b border-border px-4 py-3\">\n {icon && <span className=\"mt-1 shrink-0 text-muted-foreground\">{icon}</span>}\n <div className=\"min-w-0 flex-1\">\n <h2\n className=\"break-words text-base font-semibold leading-snug\"\n data-testid={`${testId}-title`}\n >\n {title}\n </h2>\n {subtitle && <p className=\"mt-0.5 text-xs text-muted-foreground\">{subtitle}</p>}\n </div>\n {actions && <div className=\"flex shrink-0 items-center gap-1\">{actions}</div>}\n {onClose && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-8 shrink-0\"\n onClick={onClose}\n aria-label={l.close}\n title={l.close}\n data-testid={`${testId}-close`}\n >\n <X className=\"size-4\" />\n </Button>\n )}\n </header>\n <div className=\"min-h-0 flex-1 overflow-y-auto px-4 py-4\">\n {isLoading ? <DetailLoading label={l.loading} /> : <DetailBody>{children}</DetailBody>}\n </div>\n </section>\n )\n}\n\n/** The sections of a record, stacked (a host with its own header renders this alone). */\nexport function DetailBody({\n children,\n className,\n testId,\n}: {\n children?: ReactNode\n className?: string\n testId?: string\n}) {\n return (\n <div className={cn('flex flex-col gap-6', className)} data-testid={testId}>\n {children}\n </div>\n )\n}\n\n/** The record is still loading. */\nexport function DetailLoading({ label = DEFAULT_DETAIL_PANEL_LABELS.loading }: { label?: string }) {\n return (\n <p className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Loader2 className=\"size-4 animate-spin\" /> {label}\n </p>\n )\n}\n\nexport interface DetailSectionProps {\n title: ReactNode\n /** How many there are (shown after the title). */\n count?: number\n /** How many are listed, when fewer than `count`: \"Showing 5 of 12\". */\n shown?: number\n /** The \"showing\" line, `{shown}` and `{count}` filled in. */\n showingLabel?: string\n children: ReactNode\n testId?: string\n}\n\n/** A titled block of a record: its fields, or a kind of linked item. */\nexport function DetailSection({\n title,\n count,\n shown,\n showingLabel = DEFAULT_DETAIL_PANEL_LABELS.showing,\n children,\n testId,\n}: DetailSectionProps) {\n return (\n <section className=\"flex flex-col gap-2\" data-testid={testId}>\n <div className=\"flex items-baseline gap-2\">\n <h2 className=\"text-sm font-semibold\">{title}</h2>\n {count !== undefined && (\n <span className=\"text-sm tabular-nums text-muted-foreground\">{count}</span>\n )}\n {count !== undefined && shown !== undefined && shown < count && (\n <span className=\"ml-auto text-xs text-muted-foreground\">\n {showingLabel.replace('{shown}', String(shown)).replace('{count}', String(count))}\n </span>\n )}\n </div>\n {children}\n </section>\n )\n}\n\n/** The fields of a record: labels beside their values (stacked on a narrow screen). */\nexport function DetailFields({ children, className }: { children: ReactNode; className?: string }) {\n return (\n <dl\n className={cn(\n 'grid grid-cols-1 gap-x-4 gap-y-2 sm:grid-cols-[minmax(8rem,auto)_1fr]',\n className\n )}\n >\n {children}\n </dl>\n )\n}\n\nexport interface DetailFieldProps {\n label: ReactNode\n /** A glyph before the label (the field's type). */\n icon?: ReactNode\n /** The value: read-only text or the field's editor. */\n children: ReactNode\n testId?: string\n}\n\n/** One field: its label and its value (or editor). */\nexport function DetailField({ label, icon, children, testId }: DetailFieldProps) {\n return (\n <div className=\"contents\" data-testid={testId}>\n <dt className=\"flex items-start gap-1.5 pt-1.5 text-sm text-muted-foreground\">\n {icon && <span className=\"mt-0.5 shrink-0\">{icon}</span>}\n <span className=\"min-w-0 break-words\">{label}</span>\n </dt>\n <dd className=\"min-w-0\">{children}</dd>\n </div>\n )\n}\n\n/** Linked items (documents, facts, threads, rows), one per line. */\nexport function DetailLinkList({ children }: { children: ReactNode }) {\n return (\n <ul className=\"divide-y divide-border overflow-hidden rounded-lg border border-border\">\n {children}\n </ul>\n )\n}\n\nexport interface DetailLinkItemProps {\n icon?: ReactNode\n /** The item: its name, and any quieter lines under it. */\n children: ReactNode\n /** Right of the item, inside its button (a date, a count). */\n trailing?: ReactNode\n /** Right of the item, outside its button (its own control: a popover, …). */\n after?: ReactNode\n /** Open the item. Without it the line is inert. */\n onClick?: () => void\n testId?: string\n}\n\n/** One linked item: the whole line opens it. */\nexport function DetailLinkItem({\n icon,\n children,\n trailing,\n after,\n onClick,\n testId,\n}: DetailLinkItemProps) {\n return (\n <li className=\"flex items-start\">\n <button\n type=\"button\"\n className=\"flex w-full items-start gap-2 px-3 py-2 text-left text-sm transition-colors hover:bg-muted/50 disabled:hover:bg-transparent\"\n disabled={!onClick}\n onClick={onClick}\n data-testid={testId}\n >\n {icon && <span className=\"mt-0.5 shrink-0 text-muted-foreground\">{icon}</span>}\n {children}\n {trailing}\n </button>\n {after}\n </li>\n )\n}\n\n/** Nothing of a kind is linked yet. */\nexport function DetailEmpty({ children }: { children: ReactNode }) {\n return <p className=\"text-sm text-muted-foreground\">{children}</p>\n}\n"]}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * DetailPanel: one record in full, the same way for every kind of record (a tag, a database row,
3
+ * …). The parts compose:
4
+ *
5
+ * <DetailPanel title="Acme Ltd" icon={…} actions={…} onClose={…}> header + scrolling body
6
+ * <DetailSection title="Fields"> a titled block (with a count)
7
+ * <DetailFields> label / value grid
8
+ * <DetailField label="Status">{typed editor}</DetailField>
9
+ * </DetailFields>
10
+ * </DetailSection>
11
+ * <DetailSection title="Documents" count={12} shown={5}>
12
+ * <DetailLinkList> linked items, each openable
13
+ * <DetailLinkItem icon={…} onClick={…}>Engagement letter.pdf</DetailLinkItem>
14
+ * </DetailLinkList>
15
+ * </DetailSection>
16
+ * </DetailPanel>
17
+ *
18
+ * `DetailBody` is the body alone (sections stacked, no header) for a host that has its own header,
19
+ * like a page section. Presentational: values and edits belong to the host.
20
+ */
21
+ import type { ReactNode } from 'react';
22
+ export interface DetailPanelLabels {
23
+ close: string;
24
+ loading: string;
25
+ /** `{shown}` of `{count}` listed. */
26
+ showing: string;
27
+ }
28
+ export declare const DEFAULT_DETAIL_PANEL_LABELS: DetailPanelLabels;
29
+ export interface DetailPanelProps {
30
+ title: ReactNode;
31
+ /** A glyph before the title (the record's kind). */
32
+ icon?: ReactNode;
33
+ /** A quieter line under the title. */
34
+ subtitle?: ReactNode;
35
+ /** Buttons on the header's right (delete, open elsewhere, …). */
36
+ actions?: ReactNode;
37
+ /** Shows a close button. */
38
+ onClose?: () => void;
39
+ isLoading?: boolean;
40
+ children?: ReactNode;
41
+ labels?: Partial<DetailPanelLabels>;
42
+ className?: string;
43
+ testId?: string;
44
+ }
45
+ /** A record's header (title, actions, close) over its sections, which scroll. */
46
+ export declare function DetailPanel({ title, icon, subtitle, actions, onClose, isLoading, children, labels, className, testId, }: DetailPanelProps): import("react").JSX.Element;
47
+ /** The sections of a record, stacked (a host with its own header renders this alone). */
48
+ export declare function DetailBody({ children, className, testId, }: {
49
+ children?: ReactNode;
50
+ className?: string;
51
+ testId?: string;
52
+ }): import("react").JSX.Element;
53
+ /** The record is still loading. */
54
+ export declare function DetailLoading({ label }: {
55
+ label?: string;
56
+ }): import("react").JSX.Element;
57
+ export interface DetailSectionProps {
58
+ title: ReactNode;
59
+ /** How many there are (shown after the title). */
60
+ count?: number;
61
+ /** How many are listed, when fewer than `count`: "Showing 5 of 12". */
62
+ shown?: number;
63
+ /** The "showing" line, `{shown}` and `{count}` filled in. */
64
+ showingLabel?: string;
65
+ children: ReactNode;
66
+ testId?: string;
67
+ }
68
+ /** A titled block of a record: its fields, or a kind of linked item. */
69
+ export declare function DetailSection({ title, count, shown, showingLabel, children, testId, }: DetailSectionProps): import("react").JSX.Element;
70
+ /** The fields of a record: labels beside their values (stacked on a narrow screen). */
71
+ export declare function DetailFields({ children, className }: {
72
+ children: ReactNode;
73
+ className?: string;
74
+ }): import("react").JSX.Element;
75
+ export interface DetailFieldProps {
76
+ label: ReactNode;
77
+ /** A glyph before the label (the field's type). */
78
+ icon?: ReactNode;
79
+ /** The value: read-only text or the field's editor. */
80
+ children: ReactNode;
81
+ testId?: string;
82
+ }
83
+ /** One field: its label and its value (or editor). */
84
+ export declare function DetailField({ label, icon, children, testId }: DetailFieldProps): import("react").JSX.Element;
85
+ /** Linked items (documents, facts, threads, rows), one per line. */
86
+ export declare function DetailLinkList({ children }: {
87
+ children: ReactNode;
88
+ }): import("react").JSX.Element;
89
+ export interface DetailLinkItemProps {
90
+ icon?: ReactNode;
91
+ /** The item: its name, and any quieter lines under it. */
92
+ children: ReactNode;
93
+ /** Right of the item, inside its button (a date, a count). */
94
+ trailing?: ReactNode;
95
+ /** Right of the item, outside its button (its own control: a popover, …). */
96
+ after?: ReactNode;
97
+ /** Open the item. Without it the line is inert. */
98
+ onClick?: () => void;
99
+ testId?: string;
100
+ }
101
+ /** One linked item: the whole line opens it. */
102
+ export declare function DetailLinkItem({ icon, children, trailing, after, onClick, testId, }: DetailLinkItemProps): import("react").JSX.Element;
103
+ /** Nothing of a kind is linked yet. */
104
+ export declare function DetailEmpty({ children }: {
105
+ children: ReactNode;
106
+ }): import("react").JSX.Element;
@@ -1,10 +1,10 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkCK6TU76J_cjs = require('../chunk-CK6TU76J.cjs');
4
+ var chunkEHB7J6SR_cjs = require('../chunk-EHB7J6SR.cjs');
5
5
  require('../chunk-MUMH3Z6K.cjs');
6
- var chunkSC33PQTQ_cjs = require('../chunk-SC33PQTQ.cjs');
7
- require('../chunk-7RI3G5BO.cjs');
6
+ var chunkGVOTXXZG_cjs = require('../chunk-GVOTXXZG.cjs');
7
+ require('../chunk-HGJGALLN.cjs');
8
8
  require('../chunk-AOFATOT3.cjs');
9
9
  require('../chunk-RC25WMVB.cjs');
10
10
  require('../chunk-7UTB4PHM.cjs');
@@ -16,13 +16,13 @@ function ConnectedStreamedWordArtifact({
16
16
  fontBaseUrl,
17
17
  ...props
18
18
  }) {
19
- const adapter = chunkCK6TU76J_cjs.useConnectedNativeDocxAdapter(fontBaseUrl);
20
- return /* @__PURE__ */ jsxRuntime.jsx(chunkSC33PQTQ_cjs.StreamedWordArtifact, { ...props, adapter });
19
+ const adapter = chunkEHB7J6SR_cjs.useConnectedNativeDocxAdapter(fontBaseUrl);
20
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkGVOTXXZG_cjs.StreamedWordArtifact, { ...props, adapter });
21
21
  }
22
22
 
23
23
  Object.defineProperty(exports, "ConnectedNativeDocxEditor", {
24
24
  enumerable: true,
25
- get: function () { return chunkCK6TU76J_cjs.ConnectedNativeDocxEditor; }
25
+ get: function () { return chunkEHB7J6SR_cjs.ConnectedNativeDocxEditor; }
26
26
  });
27
27
  exports.ConnectedStreamedWordArtifact = ConnectedStreamedWordArtifact;
28
28
  //# sourceMappingURL=docx.cjs.map
@@ -1,9 +1,9 @@
1
1
  "use client";
2
- import { useConnectedNativeDocxAdapter } from '../chunk-H4SVY5FH.js';
3
- export { ConnectedNativeDocxEditor } from '../chunk-H4SVY5FH.js';
2
+ import { useConnectedNativeDocxAdapter } from '../chunk-YH6SSJDW.js';
3
+ export { ConnectedNativeDocxEditor } from '../chunk-YH6SSJDW.js';
4
4
  import '../chunk-OYMWV45N.js';
5
- import { StreamedWordArtifact } from '../chunk-Y52CEKVD.js';
6
- import '../chunk-K27SDLLN.js';
5
+ import { StreamedWordArtifact } from '../chunk-RSUOOMPT.js';
6
+ import '../chunk-QIEEFBZ5.js';
7
7
  import '../chunk-D3QPYKZG.js';
8
8
  import '../chunk-AF6RDAJF.js';
9
9
  import '../chunk-AA3PT6KR.js';
@@ -3,21 +3,21 @@
3
3
 
4
4
  var chunk5YXG342J_cjs = require('../chunk-5YXG342J.cjs');
5
5
  var chunkXMBYDLZQ_cjs = require('../chunk-XMBYDLZQ.cjs');
6
- var chunkCK6TU76J_cjs = require('../chunk-CK6TU76J.cjs');
6
+ var chunkEHB7J6SR_cjs = require('../chunk-EHB7J6SR.cjs');
7
7
  var chunkMUMH3Z6K_cjs = require('../chunk-MUMH3Z6K.cjs');
8
8
  var chunkJH6JTI76_cjs = require('../chunk-JH6JTI76.cjs');
9
- require('../chunk-7RI3G5BO.cjs');
9
+ require('../chunk-HGJGALLN.cjs');
10
10
  var chunkO4YPVYPO_cjs = require('../chunk-O4YPVYPO.cjs');
11
- var chunkPSN4VWI7_cjs = require('../chunk-PSN4VWI7.cjs');
11
+ var chunkLENXDIMY_cjs = require('../chunk-LENXDIMY.cjs');
12
12
  var chunkAOFATOT3_cjs = require('../chunk-AOFATOT3.cjs');
13
13
  require('../chunk-RC25WMVB.cjs');
14
- var chunk3WW32OUU_cjs = require('../chunk-3WW32OUU.cjs');
14
+ var chunk3US5OIDQ_cjs = require('../chunk-3US5OIDQ.cjs');
15
15
  var chunkN26CXGXC_cjs = require('../chunk-N26CXGXC.cjs');
16
16
  var chunk7RGLTF76_cjs = require('../chunk-7RGLTF76.cjs');
17
- require('../chunk-7D737FLE.cjs');
18
17
  require('../chunk-DETZZBG2.cjs');
19
18
  require('../chunk-32HW2Q33.cjs');
20
19
  var chunk2EI7NCUA_cjs = require('../chunk-2EI7NCUA.cjs');
20
+ require('../chunk-7D737FLE.cjs');
21
21
  var chunkQVBZESYQ_cjs = require('../chunk-QVBZESYQ.cjs');
22
22
  require('../chunk-ADOKTJHV.cjs');
23
23
  var chunkMP6FK43E_cjs = require('../chunk-MP6FK43E.cjs');
@@ -119,7 +119,7 @@ function ConnectedWorkspaceActivity({
119
119
  [feed.data]
120
120
  );
121
121
  return /* @__PURE__ */ jsxRuntime.jsx(
122
- chunkPSN4VWI7_cjs.WorkspaceActivityList,
122
+ chunkLENXDIMY_cjs.WorkspaceActivityList,
123
123
  {
124
124
  ...listProps,
125
125
  items,
@@ -145,7 +145,7 @@ function ConnectedWorkspaceNotificationMenu({
145
145
  });
146
146
  if (!workspaceId) return null;
147
147
  return /* @__PURE__ */ jsxRuntime.jsx(
148
- chunkPSN4VWI7_cjs.WorkspaceNotificationMenu,
148
+ chunkLENXDIMY_cjs.WorkspaceNotificationMenu,
149
149
  {
150
150
  ...menuProps,
151
151
  level,
@@ -164,7 +164,7 @@ function ConnectedThreadFollow({
164
164
  enabled: status === "authenticated"
165
165
  });
166
166
  if (!conversationId) return null;
167
- const Control = as === "menu-item" ? chunkPSN4VWI7_cjs.ThreadFollowMenuItem : chunkPSN4VWI7_cjs.ThreadFollowButton;
167
+ const Control = as === "menu-item" ? chunkLENXDIMY_cjs.ThreadFollowMenuItem : chunkLENXDIMY_cjs.ThreadFollowButton;
168
168
  return /* @__PURE__ */ jsxRuntime.jsx(
169
169
  Control,
170
170
  {
@@ -290,7 +290,7 @@ function StreamedArtifact({
290
290
  }
291
291
  var STARTING = /* @__PURE__ */ new Set(["pending", "running"]);
292
292
  function formValues(step, inputs) {
293
- const fields = chunk3WW32OUU_cjs.stepFields(step);
293
+ const fields = chunk3US5OIDQ_cjs.stepFields(step);
294
294
  if (!fields.length) return void 0;
295
295
  if (step.kind === "form")
296
296
  return Object.fromEntries(fields.map((f) => [f.name, inputs[f.name] ?? ""]));
@@ -328,7 +328,7 @@ function useWorkflowThread(workflow, options = {}) {
328
328
  const { wsId } = chunkXMBYDLZQ_cjs.useWorkspaceDocs();
329
329
  const [threadId, setThreadId] = react.useState(options.conversationId);
330
330
  const [localInputs, setLocalInputs] = react.useState(
331
- () => chunk3WW32OUU_cjs.initialRunInputs(workflow, options.initialInputs)
331
+ () => chunk3US5OIDQ_cjs.initialRunInputs(workflow, options.initialInputs)
332
332
  );
333
333
  const [edits, setEdits] = react.useState({});
334
334
  const [localStates, setLocalStates] = react.useState({});
@@ -348,12 +348,12 @@ function useWorkflowThread(workflow, options = {}) {
348
348
  );
349
349
  const conversation = conversations.data?.find((c) => c.external_id === threadId);
350
350
  const steps = react.useMemo(
351
- () => chunk3WW32OUU_cjs.workflowSteps(workflow).length > 0 ? chunk3WW32OUU_cjs.workflowSteps(workflow) : chunk3WW32OUU_cjs.fromPlanSteps(conversation?.plan?.steps ?? []),
351
+ () => chunk3US5OIDQ_cjs.workflowSteps(workflow).length > 0 ? chunk3US5OIDQ_cjs.workflowSteps(workflow) : chunk3US5OIDQ_cjs.fromPlanSteps(conversation?.plan?.steps ?? []),
352
352
  [workflow, conversation?.plan?.steps]
353
353
  );
354
354
  const activity = react$1.useConversationActivity(threadId, { live: !!threadId });
355
355
  const serverStates = react.useMemo(
356
- () => chunk3WW32OUU_cjs.stepStatesFromActivity(activity.data ?? []),
356
+ () => chunk3US5OIDQ_cjs.stepStatesFromActivity(activity.data ?? []),
357
357
  [activity.data]
358
358
  );
359
359
  const working = steps.some(
@@ -396,7 +396,7 @@ function useWorkflowThread(workflow, options = {}) {
396
396
  async (values, done) => {
397
397
  await ensureWorkspaceOpen();
398
398
  const created = await createWork.mutateAsync({
399
- title: chunk3WW32OUU_cjs.runThreadTitle(workflow, values).slice(0, 60),
399
+ title: chunk3US5OIDQ_cjs.runThreadTitle(workflow, values).slice(0, 60),
400
400
  description: workflow.description || null,
401
401
  prompt: null,
402
402
  skill_ref: null,
@@ -408,7 +408,7 @@ function useWorkflowThread(workflow, options = {}) {
408
408
  criteria: [],
409
409
  max_passes: 3,
410
410
  documents: [],
411
- steps: chunk3WW32OUU_cjs.toPlanSteps(workflow, {
411
+ steps: chunk3US5OIDQ_cjs.toPlanSteps(workflow, {
412
412
  inputs: values,
413
413
  resolveWorkflow: options.resolveWorkflow,
414
414
  compose: options.compose
@@ -495,7 +495,7 @@ function useWorkflowThread(workflow, options = {}) {
495
495
  const anyRunning = Object.values(states).some((s) => s.status === "running");
496
496
  const needsStart = !threadId || idle && !anyRunning;
497
497
  const runError = idle ? conversation?.last_error ?? null : null;
498
- const view = chunk3WW32OUU_cjs.useWorkflowView({
498
+ const view = chunk3US5OIDQ_cjs.useWorkflowView({
499
499
  steps,
500
500
  states,
501
501
  inputs,
@@ -576,7 +576,7 @@ function WorkflowSignDialog({
576
576
  const arbi = react$1.useArbi();
577
577
  const { user, ensureWorkspaceOpen } = chunkMUMH3Z6K_cjs.useConnection();
578
578
  const tools = documentTools.useOptionalDocumentTools();
579
- const { id, version: stepVersion } = chunk3WW32OUU_cjs.splitDocRef(docRef);
579
+ const { id, version: stepVersion } = chunk3US5OIDQ_cjs.splitDocRef(docRef);
580
580
  const [version, setVersion] = react.useState(stepVersion);
581
581
  const [pdf, setPdf] = react.useState(null);
582
582
  const [preparing, setPreparing] = react.useState(false);
@@ -654,7 +654,7 @@ function WorkflowWordDialog({
654
654
  onClose,
655
655
  labels
656
656
  }) {
657
- const { id } = chunk3WW32OUU_cjs.splitDocRef(docRef);
657
+ const { id } = chunk3US5OIDQ_cjs.splitDocRef(docRef);
658
658
  return /* @__PURE__ */ jsxRuntime.jsx(
659
659
  chunkULWRNGGE_cjs.ModalScaffold,
660
660
  {
@@ -663,7 +663,7 @@ function WorkflowWordDialog({
663
663
  title: title ?? labels.wordTitle,
664
664
  size: "xl",
665
665
  testId: "workflow-word-dialog",
666
- children: /* @__PURE__ */ jsxRuntime.jsx(chunkULWRNGGE_cjs.ModalScaffold.Body, { className: "h-[70dvh] p-0", children: /* @__PURE__ */ jsxRuntime.jsx(chunkCK6TU76J_cjs.ConnectedNativeDocxEditor, { documentId: id, title: title ?? labels.wordTitle }) })
666
+ children: /* @__PURE__ */ jsxRuntime.jsx(chunkULWRNGGE_cjs.ModalScaffold.Body, { className: "h-[70dvh] p-0", children: /* @__PURE__ */ jsxRuntime.jsx(chunkEHB7J6SR_cjs.ConnectedNativeDocxEditor, { documentId: id, title: title ?? labels.wordTitle }) })
667
667
  }
668
668
  );
669
669
  }
@@ -826,7 +826,7 @@ function ConnectedWorkflowRunner({
826
826
  () => ({
827
827
  me: user?.externalId,
828
828
  openDocument: onOpenDocument && ((ref) => {
829
- const { id, version } = chunk3WW32OUU_cjs.splitDocRef(ref);
829
+ const { id, version } = chunk3US5OIDQ_cjs.splitDocRef(ref);
830
830
  onOpenDocument(id, version);
831
831
  }),
832
832
  openDraft: onOpenDraft && ((draftId) => onOpenDraft(draftId)),
@@ -836,7 +836,7 @@ function ConnectedWorkflowRunner({
836
836
  const w = state.waiting;
837
837
  if (w?.doc_ext_id) setDialog({ kind: "sign", docRef: w.doc_ext_id });
838
838
  }),
839
- openRedline: hostActions?.openRedline ?? ((ref) => setDialog({ kind: "word", docRef: ref, title: nameOfDoc(chunk3WW32OUU_cjs.splitDocRef(ref).id) ?? "" })),
839
+ openRedline: hostActions?.openRedline ?? ((ref) => setDialog({ kind: "word", docRef: ref, title: nameOfDoc(chunk3US5OIDQ_cjs.splitDocRef(ref).id) ?? "" })),
840
840
  openReview: hostActions?.openReview ?? ((tags, documents) => setDialog({ kind: "review", tags, documents }))
841
841
  }),
842
842
  [user?.externalId, onOpenDocument, onOpenDraft, onOpenMessage, hostActions, nameOfDoc, inThread]
@@ -972,7 +972,7 @@ function ConnectedWorkflowRunner({
972
972
  );
973
973
  };
974
974
  const runner = (compact) => /* @__PURE__ */ jsxRuntime.jsx(
975
- chunk3WW32OUU_cjs.WorkflowRunner,
975
+ chunk3US5OIDQ_cjs.WorkflowRunner,
976
976
  {
977
977
  people,
978
978
  ...runnerProps,
@@ -1018,10 +1018,10 @@ function ConnectedWorkflowRunner({
1018
1018
  ) }),
1019
1019
  inThread && conversationId ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1020
1020
  /* @__PURE__ */ jsxRuntime.jsx(
1021
- chunk3WW32OUU_cjs.WorkflowStepBar,
1021
+ chunk3US5OIDQ_cjs.WorkflowStepBar,
1022
1022
  {
1023
1023
  run: view,
1024
- levels: chunk3WW32OUU_cjs.stepLevels(view.steps),
1024
+ levels: chunk3US5OIDQ_cjs.stepLevels(view.steps),
1025
1025
  doneTitle: (workflow.run.kind === "steps" ? workflow.run.completion?.title : void 0) ?? runnerProps.labels?.complete ?? "Done",
1026
1026
  icon: (key) => key && runnerProps.renderIcon ? runnerProps.renderIcon(key) : void 0,
1027
1027
  tid: (suffix) => `${testIdPrefix}-${suffix}`
@@ -1202,7 +1202,7 @@ function ConnectedTagTable({
1202
1202
  const fail = (e) => setError(e instanceof Error ? e.message : String(e));
1203
1203
  const snapshot = (data) => {
1204
1204
  const title = exportTitle ?? KIND_TITLES[kind];
1205
- const bytes = chunkPSN4VWI7_cjs.tagTableDocx(data, {
1205
+ const bytes = chunkLENXDIMY_cjs.tagTableDocx(data, {
1206
1206
  title,
1207
1207
  nameOf: (id) => people.find((p) => p.value === id)?.label
1208
1208
  });
@@ -1212,7 +1212,7 @@ function ConnectedTagTable({
1212
1212
  };
1213
1213
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2", children: [
1214
1214
  /* @__PURE__ */ jsxRuntime.jsx(
1215
- chunkPSN4VWI7_cjs.TagTable,
1215
+ chunkLENXDIMY_cjs.TagTable,
1216
1216
  {
1217
1217
  ...props,
1218
1218
  table,
@@ -2,22 +2,22 @@
2
2
  import { SettingsSection, ProfileCard, AvatarPicker, IdentityVerificationCard, IdentityVerificationDialog, RequireVerified, SettingsCard, SettingsActionRow, PasswordChangeDialog, EMAIL_NOTIFICATION_KEYS, EMAIL_NOTIFICATION_CATEGORIES, NotificationCategoryList, toNotificationCategories, toActiveSessionViews, SettingsRow, ActiveSessionsDialog, LogoutDialog, toLogoutSessionViews, SettingsDangerZone, DeleteAccountDialog, toDeleteBlockerViews } from '../chunk-W7NZRZ54.js';
3
3
  import { useWorkspaceDocs } from '../chunk-XQDM6T6C.js';
4
4
  export { ConnectedAssistantDock, redlineStats, textToArtifact, toRedlineMarkdown, useConnectedAiTask, useConnectedChat, useSemanticSearch, useWorkspaceDocs } from '../chunk-XQDM6T6C.js';
5
- import { ConnectedNativeDocxEditor } from '../chunk-H4SVY5FH.js';
5
+ import { ConnectedNativeDocxEditor } from '../chunk-YH6SSJDW.js';
6
6
  import { ConnectionProvider, useConnection } from '../chunk-OYMWV45N.js';
7
7
  export { ConnectionProvider, SESSION_EXPIRED_MESSAGE, isAuthenticated, useConnection } from '../chunk-OYMWV45N.js';
8
8
  import { SignDocumentDialog } from '../chunk-2YOVK524.js';
9
- import '../chunk-K27SDLLN.js';
9
+ import '../chunk-QIEEFBZ5.js';
10
10
  import { FilesFilterBar, FolderFilterButton, FolderPickerRow } from '../chunk-7RJTEWYM.js';
11
- import { WorkspaceActivityList, WorkspaceNotificationMenu, ThreadFollowMenuItem, ThreadFollowButton, TagTable, tagTableDocx } from '../chunk-JID3CZSY.js';
11
+ import { WorkspaceActivityList, WorkspaceNotificationMenu, ThreadFollowMenuItem, ThreadFollowButton, TagTable, tagTableDocx } from '../chunk-Z3G65XHZ.js';
12
12
  import { DOCX_MIME_TYPE } from '../chunk-D3QPYKZG.js';
13
13
  import '../chunk-AF6RDAJF.js';
14
- import { splitDocRef, WorkflowStepBar, stepLevels, WorkflowRunner, initialRunInputs, workflowSteps, fromPlanSteps, stepStatesFromActivity, toPlanSteps, runThreadTitle, useWorkflowView, stepFields } from '../chunk-SF4BDUZS.js';
14
+ import { splitDocRef, WorkflowStepBar, stepLevels, WorkflowRunner, initialRunInputs, workflowSteps, fromPlanSteps, stepStatesFromActivity, toPlanSteps, runThreadTitle, useWorkflowView, stepFields } from '../chunk-PGDL26TQ.js';
15
15
  import { TriStateFilterMenu } from '../chunk-6S5FLMWG.js';
16
16
  import { TabHeader } from '../chunk-4WWM3GQ5.js';
17
- import '../chunk-XD2M6LIG.js';
18
17
  import '../chunk-EVUEIBNU.js';
19
18
  import '../chunk-AUS3KBHJ.js';
20
19
  import { FilterInput } from '../chunk-YU2KUMGE.js';
20
+ import '../chunk-XD2M6LIG.js';
21
21
  import { StreamedArtifactFrame } from '../chunk-LOJVUGBJ.js';
22
22
  import '../chunk-VILAPTCB.js';
23
23
  import { ChatPage } from '../chunk-EWSEQEPL.js';
@@ -0,0 +1,32 @@
1
+ import { type DatabaseColumnView, type DatabaseRowView } from './column-types';
2
+ import { type DatabaseCellSources } from './linkCells';
3
+ export interface DatabaseRowDetailLabels {
4
+ untitled: string;
5
+ fields: string;
6
+ documents: string;
7
+ noDocuments: string;
8
+ /** An empty cell that can be filled in. */
9
+ empty: string;
10
+ deleteRow: string;
11
+ close: string;
12
+ /** Under a computed (lookup / rollup) field. */
13
+ computed: string;
14
+ }
15
+ export declare const DEFAULT_DATABASE_ROW_DETAIL_LABELS: DatabaseRowDetailLabels;
16
+ export interface DatabaseRowDetailProps {
17
+ /** The row (absent while it loads). */
18
+ row: DatabaseRowView | undefined;
19
+ columns: DatabaseColumnView[];
20
+ /** A field edited here: the value is in the API's form (`null` empties the cell). */
21
+ onChange?: (row: DatabaseRowView, columnId: string, value: unknown) => void;
22
+ /** The pickers' choices and what a document opens (the grid's sources). */
23
+ sources?: DatabaseCellSources;
24
+ onDelete?: (row: DatabaseRowView) => void;
25
+ onClose?: () => void;
26
+ readOnly?: boolean;
27
+ locale?: string;
28
+ labels?: Partial<DatabaseRowDetailLabels>;
29
+ className?: string;
30
+ testId?: string;
31
+ }
32
+ export declare function DatabaseRowDetail({ row, columns, onChange, sources, onDelete, onClose, readOnly, locale, labels, className, testId, }: DatabaseRowDetailProps): import("react").JSX.Element;
@@ -19,6 +19,8 @@ export interface DatabaseTableProps {
19
19
  onAddRow?: () => void;
20
20
  onAddColumn?: () => void;
21
21
  onEditColumn?: (column: DatabaseColumnView) => void;
22
+ /** Open a row in full (its detail): a leading column of "open" buttons. */
23
+ onOpenRow?: (row: DatabaseRowView) => void;
22
24
  /**
23
25
  * Choices for person, document and relation cells (workspace members, documents, a search of
24
26
  * the related database's rows) and what a document chip opens. Keep it stable (memoise it): the
@@ -42,4 +44,4 @@ export interface DatabaseTableProps {
42
44
  gridProps?: Partial<Omit<GridViewProps<DatabaseRowView>, 'items' | 'columnDefs' | 'getItemId'>>;
43
45
  testId?: string;
44
46
  }
45
- export declare function DatabaseTable({ columns, rows, onCellChange, onAddRow, onAddColumn, onEditColumn, sources, onSelectionChange, selected, readOnly, isFiltered, isLoading, locale, gridId, height, labels, columnLabels, gridProps, testId, }: DatabaseTableProps): import("react").JSX.Element;
47
+ export declare function DatabaseTable({ columns, rows, onCellChange, onAddRow, onAddColumn, onEditColumn, onOpenRow, sources, onSelectionChange, selected, readOnly, isFiltered, isLoading, locale, gridId, height, labels, columnLabels, gridProps, testId, }: DatabaseTableProps): import("react").JSX.Element;
@@ -1,3 +1,9 @@
1
+ /**
2
+ * DatabaseToolbar: the header of an open database. Back to the list, the database's name (rename
3
+ * in place), its row count, a search box, the saved-views menu, the bulk delete for ticked rows, and the import/export
4
+ * menu. A database of another workspace is read-only here and says where to edit it.
5
+ */
6
+ import { type ReactNode } from 'react';
1
7
  export type DatabaseExportFormat = 'csv' | 'xlsx';
2
8
  export interface DatabaseToolbarLabels {
3
9
  back: string;
@@ -33,6 +39,8 @@ export interface DatabaseToolbarProps {
33
39
  /** Delete the whole database (the host confirms first). */
34
40
  onDeleteDatabase?: () => void;
35
41
  readOnly?: boolean;
42
+ /** The saved-views menu (`ViewSelectorMenu`, as the Files table has), beside the search. */
43
+ views?: ReactNode;
36
44
  labels?: Partial<DatabaseToolbarLabels>;
37
45
  }
38
- export declare function DatabaseToolbar({ name, description, total, shown, search, onSearchChange, onBack, onRename, selectedCount, onDeleteSelected, onImportRows, onExport, onDeleteDatabase, readOnly, labels, }: DatabaseToolbarProps): import("react").JSX.Element;
46
+ export declare function DatabaseToolbar({ name, description, total, shown, search, onSearchChange, onBack, onRename, selectedCount, onDeleteSelected, onImportRows, onExport, onDeleteDatabase, readOnly, views, labels, }: DatabaseToolbarProps): import("react").JSX.Element;
@@ -18,4 +18,11 @@ export interface PickCellEditorParams {
18
18
  search?: (q: string) => Promise<DatabasePickOption[]>;
19
19
  labels?: Partial<PickCellEditorLabels>;
20
20
  }
21
- export declare function PickCellEditor(props: CustomCellEditorProps<DatabaseRowView> & PickCellEditorParams): import("react").JSX.Element;
21
+ /**
22
+ * What the editor reads of AG Grid's editor props: the value, a setter, a close and the row (whose
23
+ * `titles` name the chosen ids). A host outside the grid (a row's detail panel) passes just these.
24
+ */
25
+ export type PickCellEditorProps = Pick<CustomCellEditorProps<DatabaseRowView>, 'value' | 'onValueChange' | 'stopEditing'> & {
26
+ data?: DatabaseRowView;
27
+ } & PickCellEditorParams;
28
+ export declare function PickCellEditor(props: PickCellEditorProps): import("react").JSX.Element;