@panneau/lists 5.0.0-alpha.2 → 5.0.0-alpha.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -15
- package/dist/ItemDetails.css +50 -0
- package/dist/ItemDetails.d.ts +27 -0
- package/dist/ItemDetails.d.ts.map +1 -0
- package/dist/ItemDetails.js +134 -0
- package/dist/ItemDetails.js.map +1 -0
- package/dist/ItemDetails.module.js +20 -0
- package/dist/ItemDetails.module.js.map +1 -0
- package/dist/List.d.ts +3 -3
- package/dist/List.d.ts.map +1 -1
- package/dist/List.js +31 -10
- package/dist/List.js.map +1 -1
- package/dist/ListSkeleton.d.ts +19 -0
- package/dist/ListSkeleton.d.ts.map +1 -0
- package/dist/ListSkeleton.js +115 -0
- package/dist/ListSkeleton.js.map +1 -0
- package/dist/ListView.d.ts +73 -8
- package/dist/ListView.d.ts.map +1 -1
- package/dist/ListView.js +616 -218
- package/dist/ListView.js.map +1 -1
- package/dist/actions/ActionButton.d.ts +8 -2
- package/dist/actions/ActionButton.d.ts.map +1 -1
- package/dist/actions/ActionButton.js +98 -26
- package/dist/actions/ActionButton.js.map +1 -1
- package/dist/actions/Actions.css +16 -38
- package/dist/actions/Actions.module.js +6 -6
- package/dist/actions/Actions.module.js.map +1 -1
- package/dist/actions/ConfirmDialog.d.ts +20 -4
- package/dist/actions/ConfirmDialog.d.ts.map +1 -1
- package/dist/actions/ConfirmDialog.js +110 -92
- package/dist/actions/ConfirmDialog.js.map +1 -1
- package/dist/actions/RowActions.d.ts +25 -9
- package/dist/actions/RowActions.d.ts.map +1 -1
- package/dist/actions/RowActions.js +151 -80
- package/dist/actions/RowActions.js.map +1 -1
- package/dist/actions/actions.d.ts +5 -4
- package/dist/actions/actions.d.ts.map +1 -1
- package/dist/actions/actions.js +7 -14
- package/dist/actions/actions.js.map +1 -1
- package/dist/actions/fit.d.ts +25 -0
- package/dist/actions/fit.d.ts.map +1 -0
- package/dist/actions/fit.js +197 -0
- package/dist/actions/fit.js.map +1 -0
- package/dist/actions/icons.d.ts +5 -0
- package/dist/actions/icons.d.ts.map +1 -1
- package/dist/actions/icons.js +15 -1
- package/dist/actions/icons.js.map +1 -1
- package/dist/columns.d.ts +10 -0
- package/dist/columns.d.ts.map +1 -0
- package/dist/columns.js +25 -0
- package/dist/columns.js.map +1 -0
- package/dist/cx.js.map +1 -1
- package/dist/displays/Displays.css +48 -0
- package/dist/displays/Displays.module.js +18 -2
- package/dist/displays/Displays.module.js.map +1 -1
- package/dist/displays/displays.d.ts +62 -6
- package/dist/displays/displays.d.ts.map +1 -1
- package/dist/displays/displays.js +1151 -89
- package/dist/displays/displays.js.map +1 -1
- package/dist/filters/Filters.css +25 -11
- package/dist/filters/Filters.d.ts +1 -1
- package/dist/filters/Filters.js.map +1 -1
- package/dist/filters/Filters.module.js +5 -1
- package/dist/filters/Filters.module.js.map +1 -1
- package/dist/filters/controls.d.ts +1 -1
- package/dist/filters/controls.d.ts.map +1 -1
- package/dist/filters/controls.js +57 -35
- package/dist/filters/controls.js.map +1 -1
- package/dist/filters/format.d.ts +1 -1
- package/dist/filters/format.js.map +1 -1
- package/dist/images.d.ts +7 -0
- package/dist/images.d.ts.map +1 -0
- package/dist/images.js +39 -0
- package/dist/images.js.map +1 -0
- package/dist/index.d.ts +22 -18
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -3
- package/dist/inline/Inline.css +58 -0
- package/dist/inline/Inline.module.js +20 -0
- package/dist/inline/Inline.module.js.map +1 -0
- package/dist/inline/InlineCell.d.ts +29 -0
- package/dist/inline/InlineCell.d.ts.map +1 -0
- package/dist/inline/InlineCell.js +490 -0
- package/dist/inline/InlineCell.js.map +1 -0
- package/dist/inline/editable.d.ts +12 -0
- package/dist/inline/editable.d.ts.map +1 -0
- package/dist/inline/editable.js +29 -0
- package/dist/inline/editable.js.map +1 -0
- package/dist/layouts/CalendarLayout.css +153 -0
- package/dist/layouts/CalendarLayout.d.ts +9 -0
- package/dist/layouts/CalendarLayout.d.ts.map +1 -0
- package/dist/layouts/CalendarLayout.js +303 -0
- package/dist/layouts/CalendarLayout.js.map +1 -0
- package/dist/layouts/CalendarLayout.module.js +28 -0
- package/dist/layouts/CalendarLayout.module.js.map +1 -0
- package/dist/layouts/CardsLayout.css +5 -0
- package/dist/layouts/CardsLayout.d.ts +2 -2
- package/dist/layouts/CardsLayout.d.ts.map +1 -1
- package/dist/layouts/CardsLayout.js +92 -91
- package/dist/layouts/CardsLayout.js.map +1 -1
- package/dist/layouts/CardsLayout.module.js.map +1 -1
- package/dist/layouts/GalleryLayout.css +87 -0
- package/dist/layouts/GalleryLayout.d.ts +8 -0
- package/dist/layouts/GalleryLayout.d.ts.map +1 -0
- package/dist/layouts/GalleryLayout.js +152 -0
- package/dist/layouts/GalleryLayout.js.map +1 -0
- package/dist/layouts/GalleryLayout.module.js +26 -0
- package/dist/layouts/GalleryLayout.module.js.map +1 -0
- package/dist/layouts/ItemTitle.d.ts +3 -1
- package/dist/layouts/ItemTitle.d.ts.map +1 -1
- package/dist/layouts/ItemTitle.js +12 -8
- package/dist/layouts/ItemTitle.js.map +1 -1
- package/dist/layouts/TableLayout.css +56 -0
- package/dist/layouts/TableLayout.d.ts +5 -4
- package/dist/layouts/TableLayout.d.ts.map +1 -1
- package/dist/layouts/TableLayout.js +171 -101
- package/dist/layouts/TableLayout.js.map +1 -1
- package/dist/layouts/TableLayout.module.js +8 -4
- package/dist/layouts/TableLayout.module.js.map +1 -1
- package/dist/layouts/builtIn.d.ts +2 -2
- package/dist/layouts/builtIn.d.ts.map +1 -1
- package/dist/layouts/builtIn.js +6 -2
- package/dist/layouts/builtIn.js.map +1 -1
- package/dist/layouts/calendarDays.d.ts +14 -0
- package/dist/layouts/calendarDays.d.ts.map +1 -0
- package/dist/layouts/calendarDays.js +44 -0
- package/dist/layouts/calendarDays.js.map +1 -0
- package/dist/plugin.d.ts +1 -1
- package/dist/plugin.js.map +1 -1
- package/dist/query.d.ts +4 -3
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +15 -4
- package/dist/query.js.map +1 -1
- package/dist/selection.d.ts +1 -1
- package/dist/selection.js.map +1 -1
- package/dist/toolbar/ColumnMenu.d.ts +17 -0
- package/dist/toolbar/ColumnMenu.d.ts.map +1 -0
- package/dist/toolbar/ColumnMenu.js +193 -0
- package/dist/toolbar/ColumnMenu.js.map +1 -0
- package/dist/toolbar/LayoutSwitch.d.ts.map +1 -1
- package/dist/toolbar/LayoutSwitch.js +73 -55
- package/dist/toolbar/LayoutSwitch.js.map +1 -1
- package/dist/toolbar/Pagination.d.ts +33 -0
- package/dist/toolbar/Pagination.d.ts.map +1 -1
- package/dist/toolbar/Pagination.js +282 -42
- package/dist/toolbar/Pagination.js.map +1 -1
- package/dist/toolbar/SearchField.js.map +1 -1
- package/dist/toolbar/SortSelect.d.ts +1 -1
- package/dist/toolbar/SortSelect.js.map +1 -1
- package/dist/toolbar/Toolbar.css +36 -0
- package/dist/toolbar/Toolbar.module.js +12 -2
- package/dist/toolbar/Toolbar.module.js.map +1 -1
- package/dist/types.d.ts +69 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/useDraft.js.map +1 -1
- package/dist/useListState.js.map +1 -1
- package/dist/useRenderValue.d.ts +10 -0
- package/dist/useRenderValue.d.ts.map +1 -0
- package/dist/useRenderValue.js +84 -0
- package/dist/useRenderValue.js.map +1 -0
- package/dist/values.d.ts +4 -1
- package/dist/values.d.ts.map +1 -1
- package/dist/values.js +6 -2
- package/dist/values.js.map +1 -1
- package/package.json +9 -9
|
@@ -0,0 +1,490 @@
|
|
|
1
|
+
import { messages } from "../messages.js";
|
|
2
|
+
import Inline_module_default from "./Inline.module.js";
|
|
3
|
+
import { getProblem } from "@panneau/core";
|
|
4
|
+
import { c } from "react/compiler-runtime";
|
|
5
|
+
import { Button, IconButton, Spinner, usePanneauIntl, useToast } from "@panneau/ui";
|
|
6
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
+
import { Pencil } from "lucide-react";
|
|
8
|
+
import { useEffect, useRef, useState } from "react";
|
|
9
|
+
import { DateFieldEntry } from "@panneau/fields/date";
|
|
10
|
+
import { checkValues } from "@panneau/protocol/runtime";
|
|
11
|
+
import { BooleanFieldEntry } from "@panneau/fields/boolean";
|
|
12
|
+
import { NumberFieldEntry } from "@panneau/fields/number";
|
|
13
|
+
import { SelectFieldEntry } from "@panneau/fields/select";
|
|
14
|
+
import { TextFieldEntry } from "@panneau/fields/text";
|
|
15
|
+
//#region src/inline/InlineCell.tsx
|
|
16
|
+
var ENTRIES = {
|
|
17
|
+
text: TextFieldEntry,
|
|
18
|
+
number: NumberFieldEntry,
|
|
19
|
+
select: SelectFieldEntry,
|
|
20
|
+
boolean: BooleanFieldEntry,
|
|
21
|
+
date: DateFieldEntry
|
|
22
|
+
};
|
|
23
|
+
/** Types that save as soon as a value is picked, rather than on Enter or when leaving the cell. */
|
|
24
|
+
var PICKED = /* @__PURE__ */ new Set(["select", "date"]);
|
|
25
|
+
function isEqualValue(a, b) {
|
|
26
|
+
return JSON.stringify(a ?? null) === JSON.stringify(b ?? null);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* A cell that edits its field in place (decision 0043): a checkbox for a boolean, otherwise the
|
|
30
|
+
* value with a button that turns it into the field's control. Enter or leaving the cell saves,
|
|
31
|
+
* Escape cancels; a select and a date save when one is picked. The value is checked by the
|
|
32
|
+
* field's portable rules, then saved alone; errors and conflicts show in the cell.
|
|
33
|
+
*/
|
|
34
|
+
function InlineCell(t0) {
|
|
35
|
+
const $ = c(78);
|
|
36
|
+
const { item, field, itemLabel, getItemLabel, children, renderValue, onSave, onItem, formatError } = t0;
|
|
37
|
+
const intl = usePanneauIntl();
|
|
38
|
+
const toasts = useToast();
|
|
39
|
+
let t1;
|
|
40
|
+
if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
|
|
41
|
+
t1 = { mode: "idle" };
|
|
42
|
+
$[0] = t1;
|
|
43
|
+
} else t1 = $[0];
|
|
44
|
+
const [state, setState] = useState(t1);
|
|
45
|
+
const root = useRef(null);
|
|
46
|
+
const focus = useRef(null);
|
|
47
|
+
const label = field.label ?? field.name;
|
|
48
|
+
const value = item[field.name];
|
|
49
|
+
const isBoolean = field.type === "boolean";
|
|
50
|
+
const Entry = ENTRIES[field.type];
|
|
51
|
+
let bare;
|
|
52
|
+
if ($[1] !== field) {
|
|
53
|
+
const { help: _help, ...t2 } = field;
|
|
54
|
+
bare = t2;
|
|
55
|
+
$[1] = field;
|
|
56
|
+
$[2] = bare;
|
|
57
|
+
} else bare = $[2];
|
|
58
|
+
let t2;
|
|
59
|
+
if ($[3] === Symbol.for("react.memo_cache_sentinel")) {
|
|
60
|
+
t2 = () => {
|
|
61
|
+
if (focus.current === "editor") root.current?.querySelector("input, [role=\"spinbutton\"], button")?.focus();
|
|
62
|
+
else if (focus.current === "button") root.current?.querySelector("button")?.focus();
|
|
63
|
+
focus.current = null;
|
|
64
|
+
};
|
|
65
|
+
$[3] = t2;
|
|
66
|
+
} else t2 = $[3];
|
|
67
|
+
useEffect(t2);
|
|
68
|
+
let save;
|
|
69
|
+
let t3;
|
|
70
|
+
let t4;
|
|
71
|
+
let t5;
|
|
72
|
+
let t6;
|
|
73
|
+
let t7;
|
|
74
|
+
let t8;
|
|
75
|
+
let t9;
|
|
76
|
+
if ($[4] !== Entry || $[5] !== bare || $[6] !== children || $[7] !== field || $[8] !== formatError || $[9] !== getItemLabel || $[10] !== intl || $[11] !== isBoolean || $[12] !== item || $[13] !== itemLabel || $[14] !== label || $[15] !== onItem || $[16] !== onSave || $[17] !== renderValue || $[18] !== state.current || $[19] !== state.draft || $[20] !== state.errors || $[21] !== state.mode || $[22] !== toasts || $[23] !== value) {
|
|
77
|
+
t9 = Symbol.for("react.early_return_sentinel");
|
|
78
|
+
bb0: {
|
|
79
|
+
save = (base, draft, t10) => {
|
|
80
|
+
const { undoing: t11 } = t10 === void 0 ? {} : t10;
|
|
81
|
+
const undoing = t11 === void 0 ? false : t11;
|
|
82
|
+
const previous = base[field.name];
|
|
83
|
+
setState({
|
|
84
|
+
mode: "saving",
|
|
85
|
+
draft
|
|
86
|
+
});
|
|
87
|
+
onSave(base, draft).then((saved) => {
|
|
88
|
+
onItem(saved);
|
|
89
|
+
focus.current = isBoolean ? null : "button";
|
|
90
|
+
setState({ mode: "idle" });
|
|
91
|
+
const names = {
|
|
92
|
+
item: getItemLabel?.(saved) ?? itemLabel,
|
|
93
|
+
field: label
|
|
94
|
+
};
|
|
95
|
+
const key = { key: `panneau-inline:${item.id}:${field.name}` };
|
|
96
|
+
toasts.show(undoing ? { title: intl.formatMessage(messages.inlineUndone, names) } : {
|
|
97
|
+
title: intl.formatMessage(messages.inlineSaved, names),
|
|
98
|
+
tone: "success",
|
|
99
|
+
action: {
|
|
100
|
+
label: intl.formatMessage(messages.undo),
|
|
101
|
+
onAction: () => save(saved, previous, { undoing: true })
|
|
102
|
+
}
|
|
103
|
+
}, key);
|
|
104
|
+
}, (error) => {
|
|
105
|
+
const problem = getProblem(error);
|
|
106
|
+
if (problem?.status === 412 && problem.current !== void 0) {
|
|
107
|
+
onItem(problem.current);
|
|
108
|
+
setState({
|
|
109
|
+
mode: "conflict",
|
|
110
|
+
draft,
|
|
111
|
+
current: problem.current
|
|
112
|
+
});
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const own = Object.entries(problem?.errors ?? {}).filter((t12) => {
|
|
116
|
+
const [path] = t12;
|
|
117
|
+
return path === field.name || path.startsWith(`${field.name}.`);
|
|
118
|
+
}).flatMap(_temp);
|
|
119
|
+
const message = problem?.detail ?? (problem !== null ? problem.title : null) ?? (error instanceof Error && error.message !== "" ? error.message : null) ?? intl.formatMessage(messages.saveValueFailed);
|
|
120
|
+
focus.current = "editor";
|
|
121
|
+
setState({
|
|
122
|
+
mode: "editing",
|
|
123
|
+
draft,
|
|
124
|
+
errors: own.length > 0 ? own : [message]
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
};
|
|
128
|
+
const commit = (draft_0) => {
|
|
129
|
+
if (isEqualValue(draft_0, value)) {
|
|
130
|
+
focus.current = "button";
|
|
131
|
+
setState({ mode: "idle" });
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
const failures = checkValues([field], { [field.name]: draft_0 }, {
|
|
135
|
+
mode: "update",
|
|
136
|
+
partial: true,
|
|
137
|
+
item
|
|
138
|
+
});
|
|
139
|
+
const errors = Object.values(failures).flat().map((failure) => formatError(failure));
|
|
140
|
+
if (errors.length > 0) {
|
|
141
|
+
setState({
|
|
142
|
+
mode: "editing",
|
|
143
|
+
draft: draft_0,
|
|
144
|
+
errors
|
|
145
|
+
});
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
save(item, draft_0);
|
|
149
|
+
};
|
|
150
|
+
const cancel = () => {
|
|
151
|
+
focus.current = "button";
|
|
152
|
+
setState({ mode: "idle" });
|
|
153
|
+
};
|
|
154
|
+
const onKeyDown = (event) => {
|
|
155
|
+
if (state.mode !== "editing") return;
|
|
156
|
+
if (event.key === "Escape") {
|
|
157
|
+
event.stopPropagation();
|
|
158
|
+
cancel();
|
|
159
|
+
} else if (event.key === "Enter" && !PICKED.has(field.type)) {
|
|
160
|
+
event.preventDefault();
|
|
161
|
+
commit(state.draft);
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
const onBlur = (event_0) => {
|
|
165
|
+
const next = event_0.relatedTarget;
|
|
166
|
+
if (state.mode !== "editing" || next instanceof Element && (event_0.currentTarget.contains(next) || next.closest(".panneau-popover") !== null)) return;
|
|
167
|
+
commit(state.draft);
|
|
168
|
+
};
|
|
169
|
+
const control = (draft_1, errors_0, disabled) => /* @__PURE__ */ jsx(Entry, {
|
|
170
|
+
field: bare,
|
|
171
|
+
path: field.name,
|
|
172
|
+
value: draft_1,
|
|
173
|
+
onChange: (next_0) => {
|
|
174
|
+
if (isBoolean || PICKED.has(field.type) && next_0 !== null) commit(next_0);
|
|
175
|
+
else setState({
|
|
176
|
+
mode: "editing",
|
|
177
|
+
draft: next_0,
|
|
178
|
+
errors: []
|
|
179
|
+
});
|
|
180
|
+
},
|
|
181
|
+
errors: errors_0,
|
|
182
|
+
disabled,
|
|
183
|
+
hideLabel: true
|
|
184
|
+
});
|
|
185
|
+
if (isBoolean) {
|
|
186
|
+
let t13;
|
|
187
|
+
if ($[32] !== state.errors || $[33] !== state.mode) {
|
|
188
|
+
t13 = state.mode === "editing" ? state.errors : [];
|
|
189
|
+
$[32] = state.errors;
|
|
190
|
+
$[33] = state.mode;
|
|
191
|
+
$[34] = t13;
|
|
192
|
+
} else t13 = $[34];
|
|
193
|
+
let t14;
|
|
194
|
+
if ($[35] !== intl || $[36] !== state.mode) {
|
|
195
|
+
t14 = state.mode === "saving" ? /* @__PURE__ */ jsx(Spinner, {
|
|
196
|
+
size: "sm",
|
|
197
|
+
label: intl.formatMessage(messages.savingValue)
|
|
198
|
+
}) : null;
|
|
199
|
+
$[35] = intl;
|
|
200
|
+
$[36] = state.mode;
|
|
201
|
+
$[37] = t14;
|
|
202
|
+
} else t14 = $[37];
|
|
203
|
+
const t15 = /* @__PURE__ */ jsxs("div", {
|
|
204
|
+
className: Inline_module_default.control,
|
|
205
|
+
children: [control(state.mode === "idle" ? value : state.draft, t13, state.mode === "saving"), t14]
|
|
206
|
+
});
|
|
207
|
+
const t16 = state.mode === "conflict" ? /* @__PURE__ */ jsx(Conflict, {
|
|
208
|
+
current: renderValue(state.current),
|
|
209
|
+
onKeep: () => setState({ mode: "idle" }),
|
|
210
|
+
onSave: () => save(state.current, state.draft)
|
|
211
|
+
}) : null;
|
|
212
|
+
let t17;
|
|
213
|
+
if ($[38] !== t15 || $[39] !== t16) {
|
|
214
|
+
t17 = /* @__PURE__ */ jsxs("div", {
|
|
215
|
+
className: Inline_module_default.cell,
|
|
216
|
+
children: [t15, t16]
|
|
217
|
+
});
|
|
218
|
+
$[38] = t15;
|
|
219
|
+
$[39] = t16;
|
|
220
|
+
$[40] = t17;
|
|
221
|
+
} else t17 = $[40];
|
|
222
|
+
t9 = t17;
|
|
223
|
+
break bb0;
|
|
224
|
+
}
|
|
225
|
+
if (state.mode === "idle") {
|
|
226
|
+
let t13;
|
|
227
|
+
if ($[41] !== children) {
|
|
228
|
+
t13 = /* @__PURE__ */ jsx("span", {
|
|
229
|
+
className: Inline_module_default.value,
|
|
230
|
+
children
|
|
231
|
+
});
|
|
232
|
+
$[41] = children;
|
|
233
|
+
$[42] = t13;
|
|
234
|
+
} else t13 = $[42];
|
|
235
|
+
let t14;
|
|
236
|
+
if ($[43] !== intl || $[44] !== itemLabel || $[45] !== label) {
|
|
237
|
+
t14 = intl.formatMessage(messages.editValue, {
|
|
238
|
+
field: label,
|
|
239
|
+
item: itemLabel
|
|
240
|
+
});
|
|
241
|
+
$[43] = intl;
|
|
242
|
+
$[44] = itemLabel;
|
|
243
|
+
$[45] = label;
|
|
244
|
+
$[46] = t14;
|
|
245
|
+
} else t14 = $[46];
|
|
246
|
+
let t15;
|
|
247
|
+
if ($[47] !== value) {
|
|
248
|
+
t15 = () => {
|
|
249
|
+
focus.current = "editor";
|
|
250
|
+
setState({
|
|
251
|
+
mode: "editing",
|
|
252
|
+
draft: value,
|
|
253
|
+
errors: []
|
|
254
|
+
});
|
|
255
|
+
};
|
|
256
|
+
$[47] = value;
|
|
257
|
+
$[48] = t15;
|
|
258
|
+
} else t15 = $[48];
|
|
259
|
+
let t16;
|
|
260
|
+
if ($[49] !== t14 || $[50] !== t15) {
|
|
261
|
+
t16 = /* @__PURE__ */ jsx(IconButton, {
|
|
262
|
+
icon: Pencil,
|
|
263
|
+
size: "sm",
|
|
264
|
+
label: t14,
|
|
265
|
+
showTooltip: false,
|
|
266
|
+
className: Inline_module_default.edit,
|
|
267
|
+
onPress: t15
|
|
268
|
+
});
|
|
269
|
+
$[49] = t14;
|
|
270
|
+
$[50] = t15;
|
|
271
|
+
$[51] = t16;
|
|
272
|
+
} else t16 = $[51];
|
|
273
|
+
let t17;
|
|
274
|
+
if ($[52] !== t13 || $[53] !== t16) {
|
|
275
|
+
t17 = /* @__PURE__ */ jsxs("div", {
|
|
276
|
+
ref: root,
|
|
277
|
+
className: Inline_module_default.cell,
|
|
278
|
+
children: [t13, t16]
|
|
279
|
+
});
|
|
280
|
+
$[52] = t13;
|
|
281
|
+
$[53] = t16;
|
|
282
|
+
$[54] = t17;
|
|
283
|
+
} else t17 = $[54];
|
|
284
|
+
t9 = t17;
|
|
285
|
+
break bb0;
|
|
286
|
+
}
|
|
287
|
+
t5 = root;
|
|
288
|
+
t6 = Inline_module_default.cell;
|
|
289
|
+
t7 = onKeyDown;
|
|
290
|
+
t8 = onBlur;
|
|
291
|
+
t3 = Inline_module_default.control;
|
|
292
|
+
let t13;
|
|
293
|
+
if ($[55] !== state.errors || $[56] !== state.mode) {
|
|
294
|
+
t13 = state.mode === "editing" ? state.errors : [];
|
|
295
|
+
$[55] = state.errors;
|
|
296
|
+
$[56] = state.mode;
|
|
297
|
+
$[57] = t13;
|
|
298
|
+
} else t13 = $[57];
|
|
299
|
+
t4 = control(state.draft, t13, state.mode === "saving");
|
|
300
|
+
}
|
|
301
|
+
$[4] = Entry;
|
|
302
|
+
$[5] = bare;
|
|
303
|
+
$[6] = children;
|
|
304
|
+
$[7] = field;
|
|
305
|
+
$[8] = formatError;
|
|
306
|
+
$[9] = getItemLabel;
|
|
307
|
+
$[10] = intl;
|
|
308
|
+
$[11] = isBoolean;
|
|
309
|
+
$[12] = item;
|
|
310
|
+
$[13] = itemLabel;
|
|
311
|
+
$[14] = label;
|
|
312
|
+
$[15] = onItem;
|
|
313
|
+
$[16] = onSave;
|
|
314
|
+
$[17] = renderValue;
|
|
315
|
+
$[18] = state.current;
|
|
316
|
+
$[19] = state.draft;
|
|
317
|
+
$[20] = state.errors;
|
|
318
|
+
$[21] = state.mode;
|
|
319
|
+
$[22] = toasts;
|
|
320
|
+
$[23] = value;
|
|
321
|
+
$[24] = save;
|
|
322
|
+
$[25] = t3;
|
|
323
|
+
$[26] = t4;
|
|
324
|
+
$[27] = t5;
|
|
325
|
+
$[28] = t6;
|
|
326
|
+
$[29] = t7;
|
|
327
|
+
$[30] = t8;
|
|
328
|
+
$[31] = t9;
|
|
329
|
+
} else {
|
|
330
|
+
save = $[24];
|
|
331
|
+
t3 = $[25];
|
|
332
|
+
t4 = $[26];
|
|
333
|
+
t5 = $[27];
|
|
334
|
+
t6 = $[28];
|
|
335
|
+
t7 = $[29];
|
|
336
|
+
t8 = $[30];
|
|
337
|
+
t9 = $[31];
|
|
338
|
+
}
|
|
339
|
+
if (t9 !== Symbol.for("react.early_return_sentinel")) return t9;
|
|
340
|
+
let t10;
|
|
341
|
+
if ($[58] !== intl || $[59] !== state.mode) {
|
|
342
|
+
t10 = state.mode === "saving" ? /* @__PURE__ */ jsx(Spinner, {
|
|
343
|
+
size: "sm",
|
|
344
|
+
label: intl.formatMessage(messages.savingValue)
|
|
345
|
+
}) : null;
|
|
346
|
+
$[58] = intl;
|
|
347
|
+
$[59] = state.mode;
|
|
348
|
+
$[60] = t10;
|
|
349
|
+
} else t10 = $[60];
|
|
350
|
+
let t11;
|
|
351
|
+
if ($[61] !== t10 || $[62] !== t3 || $[63] !== t4) {
|
|
352
|
+
t11 = /* @__PURE__ */ jsxs("div", {
|
|
353
|
+
className: t3,
|
|
354
|
+
children: [t4, t10]
|
|
355
|
+
});
|
|
356
|
+
$[61] = t10;
|
|
357
|
+
$[62] = t3;
|
|
358
|
+
$[63] = t4;
|
|
359
|
+
$[64] = t11;
|
|
360
|
+
} else t11 = $[64];
|
|
361
|
+
let t12;
|
|
362
|
+
if ($[65] !== renderValue || $[66] !== save || $[67] !== state.current || $[68] !== state.draft || $[69] !== state.mode) {
|
|
363
|
+
t12 = state.mode === "conflict" ? /* @__PURE__ */ jsx(Conflict, {
|
|
364
|
+
current: renderValue(state.current),
|
|
365
|
+
onKeep: () => {
|
|
366
|
+
focus.current = "button";
|
|
367
|
+
setState({ mode: "idle" });
|
|
368
|
+
},
|
|
369
|
+
onSave: () => save(state.current, state.draft)
|
|
370
|
+
}) : null;
|
|
371
|
+
$[65] = renderValue;
|
|
372
|
+
$[66] = save;
|
|
373
|
+
$[67] = state.current;
|
|
374
|
+
$[68] = state.draft;
|
|
375
|
+
$[69] = state.mode;
|
|
376
|
+
$[70] = t12;
|
|
377
|
+
} else t12 = $[70];
|
|
378
|
+
let t13;
|
|
379
|
+
if ($[71] !== t11 || $[72] !== t12 || $[73] !== t5 || $[74] !== t6 || $[75] !== t7 || $[76] !== t8) {
|
|
380
|
+
t13 = /* @__PURE__ */ jsxs("div", {
|
|
381
|
+
ref: t5,
|
|
382
|
+
className: t6,
|
|
383
|
+
onKeyDown: t7,
|
|
384
|
+
onBlur: t8,
|
|
385
|
+
children: [t11, t12]
|
|
386
|
+
});
|
|
387
|
+
$[71] = t11;
|
|
388
|
+
$[72] = t12;
|
|
389
|
+
$[73] = t5;
|
|
390
|
+
$[74] = t6;
|
|
391
|
+
$[75] = t7;
|
|
392
|
+
$[76] = t8;
|
|
393
|
+
$[77] = t13;
|
|
394
|
+
} else t13 = $[77];
|
|
395
|
+
return t13;
|
|
396
|
+
}
|
|
397
|
+
/** What someone else saved, with the choice of keeping it or saving over it. */
|
|
398
|
+
function _temp(t0) {
|
|
399
|
+
const [, list] = t0;
|
|
400
|
+
return list;
|
|
401
|
+
}
|
|
402
|
+
function Conflict(t0) {
|
|
403
|
+
const $ = c(23);
|
|
404
|
+
const { current, onKeep, onSave } = t0;
|
|
405
|
+
const intl = usePanneauIntl();
|
|
406
|
+
let t1;
|
|
407
|
+
if ($[0] !== intl) {
|
|
408
|
+
t1 = intl.formatMessage(messages.valueConflict);
|
|
409
|
+
$[0] = intl;
|
|
410
|
+
$[1] = t1;
|
|
411
|
+
} else t1 = $[1];
|
|
412
|
+
let t2;
|
|
413
|
+
if ($[2] !== current) {
|
|
414
|
+
t2 = /* @__PURE__ */ jsx("strong", { children: current });
|
|
415
|
+
$[2] = current;
|
|
416
|
+
$[3] = t2;
|
|
417
|
+
} else t2 = $[3];
|
|
418
|
+
let t3;
|
|
419
|
+
if ($[4] !== t1 || $[5] !== t2) {
|
|
420
|
+
t3 = /* @__PURE__ */ jsxs("span", { children: [
|
|
421
|
+
t1,
|
|
422
|
+
" ",
|
|
423
|
+
t2
|
|
424
|
+
] });
|
|
425
|
+
$[4] = t1;
|
|
426
|
+
$[5] = t2;
|
|
427
|
+
$[6] = t3;
|
|
428
|
+
} else t3 = $[6];
|
|
429
|
+
let t4;
|
|
430
|
+
if ($[7] !== intl) {
|
|
431
|
+
t4 = intl.formatMessage(messages.keepTheirs);
|
|
432
|
+
$[7] = intl;
|
|
433
|
+
$[8] = t4;
|
|
434
|
+
} else t4 = $[8];
|
|
435
|
+
let t5;
|
|
436
|
+
if ($[9] !== onKeep || $[10] !== t4) {
|
|
437
|
+
t5 = /* @__PURE__ */ jsx(Button, {
|
|
438
|
+
size: "sm",
|
|
439
|
+
appearance: "ghost",
|
|
440
|
+
onPress: onKeep,
|
|
441
|
+
children: t4
|
|
442
|
+
});
|
|
443
|
+
$[9] = onKeep;
|
|
444
|
+
$[10] = t4;
|
|
445
|
+
$[11] = t5;
|
|
446
|
+
} else t5 = $[11];
|
|
447
|
+
let t6;
|
|
448
|
+
if ($[12] !== intl) {
|
|
449
|
+
t6 = intl.formatMessage(messages.saveMine);
|
|
450
|
+
$[12] = intl;
|
|
451
|
+
$[13] = t6;
|
|
452
|
+
} else t6 = $[13];
|
|
453
|
+
let t7;
|
|
454
|
+
if ($[14] !== onSave || $[15] !== t6) {
|
|
455
|
+
t7 = /* @__PURE__ */ jsx(Button, {
|
|
456
|
+
size: "sm",
|
|
457
|
+
onPress: onSave,
|
|
458
|
+
children: t6
|
|
459
|
+
});
|
|
460
|
+
$[14] = onSave;
|
|
461
|
+
$[15] = t6;
|
|
462
|
+
$[16] = t7;
|
|
463
|
+
} else t7 = $[16];
|
|
464
|
+
let t8;
|
|
465
|
+
if ($[17] !== t5 || $[18] !== t7) {
|
|
466
|
+
t8 = /* @__PURE__ */ jsxs("span", {
|
|
467
|
+
className: Inline_module_default.conflictActions,
|
|
468
|
+
children: [t5, t7]
|
|
469
|
+
});
|
|
470
|
+
$[17] = t5;
|
|
471
|
+
$[18] = t7;
|
|
472
|
+
$[19] = t8;
|
|
473
|
+
} else t8 = $[19];
|
|
474
|
+
let t9;
|
|
475
|
+
if ($[20] !== t3 || $[21] !== t8) {
|
|
476
|
+
t9 = /* @__PURE__ */ jsxs("div", {
|
|
477
|
+
className: Inline_module_default.conflict,
|
|
478
|
+
role: "alert",
|
|
479
|
+
children: [t3, t8]
|
|
480
|
+
});
|
|
481
|
+
$[20] = t3;
|
|
482
|
+
$[21] = t8;
|
|
483
|
+
$[22] = t9;
|
|
484
|
+
} else t9 = $[22];
|
|
485
|
+
return t9;
|
|
486
|
+
}
|
|
487
|
+
//#endregion
|
|
488
|
+
export { InlineCell };
|
|
489
|
+
|
|
490
|
+
//# sourceMappingURL=InlineCell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InlineCell.js","names":["Pencil","FocusEvent","KeyboardEvent","ReactNode","useEffect","useRef","useState","getProblem","BooleanFieldEntry","DateFieldEntry","NumberFieldEntry","SelectFieldEntry","TextFieldEntry","Field","RuleFailure","checkValues","Button","IconButton","Spinner","usePanneauIntl","useToast","messages","ListItem","styles","ENTRIES","text","number","select","boolean","date","const","PICKED","Set","State","mode","draft","errors","current","InlineCellProps","item","field","itemLabel","getItemLabel","children","renderValue","onSave","value","Promise","onItem","formatError","failure","isEqualValue","a","b","JSON","stringify","InlineCell","t0","$","_c","intl","toasts","t1","Symbol","for","state","setState","root","focus","label","name","isBoolean","type","Entry","bare","help","_help","t2","querySelector","save","t3","t4","t5","t6","t7","t8","t9","bb0","base","t10","undoing","t11","undefined","previous","then","saved","names","key","id","show","title","formatMessage","inlineUndone","inlineSaved","tone","action","undo","onAction","error","problem","status","own","Object","entries","filter","t12","path","startsWith","flatMap","_temp","message","detail","Error","saveValueFailed","length","commit","draft_0","failures","partial","values","flat","map","cancel","onKeyDown","event","stopPropagation","has","preventDefault","onBlur","event_0","next","relatedTarget","Element","currentTarget","contains","closest","control","draft_1","errors_0","disabled","next_0","t13","t14","savingValue","t15","t16","t17","cell","editValue","edit","list","Conflict","onKeep","valueConflict","keepTheirs","saveMine","conflictActions","conflict","_c","styles"],"sources":["../../src/inline/InlineCell.tsx"],"sourcesContent":["import { Pencil } from 'lucide-react';\nimport {\n type FocusEvent,\n type KeyboardEvent,\n type ReactNode,\n useEffect,\n useRef,\n useState,\n} from 'react';\n\nimport { getProblem } from '@panneau/core';\nimport { BooleanFieldEntry } from '@panneau/fields/boolean';\nimport { DateFieldEntry } from '@panneau/fields/date';\nimport { NumberFieldEntry } from '@panneau/fields/number';\nimport { SelectFieldEntry } from '@panneau/fields/select';\nimport { TextFieldEntry } from '@panneau/fields/text';\nimport type { Field, RuleFailure } from '@panneau/protocol';\nimport { checkValues } from '@panneau/protocol/runtime';\nimport { Button, IconButton, Spinner, usePanneauIntl, useToast } from '@panneau/ui';\n\nimport { messages } from '../messages';\nimport type { ListItem } from '../types';\nimport styles from './Inline.module.css';\n\nconst ENTRIES = {\n text: TextFieldEntry,\n number: NumberFieldEntry,\n select: SelectFieldEntry,\n boolean: BooleanFieldEntry,\n date: DateFieldEntry,\n} as const;\n\n/** Types that save as soon as a value is picked, rather than on Enter or when leaving the cell. */\nconst PICKED = new Set(['select', 'date']);\n\ntype State =\n | { mode: 'idle' }\n | { mode: 'editing'; draft: unknown; errors: readonly string[] }\n | { mode: 'saving'; draft: unknown }\n | { mode: 'conflict'; draft: unknown; current: ListItem };\n\nexport interface InlineCellProps {\n item: ListItem;\n /** The field the cell edits, of a type of `INLINE_TYPES`. */\n field: Field;\n /** The label of the item, for the name of the edit button. */\n itemLabel: string;\n /** The label of an item the backend gave back, for the toast that says it was saved. */\n getItemLabel?: (item: ListItem) => string;\n /** The content of the cell when it doesn't edit: the value, or the title's link. */\n children: ReactNode;\n /** Renders a value of the field, for the current value of a conflict. */\n renderValue: (item: ListItem) => ReactNode;\n /** Saves the value on an item (the current one after a conflict), with its version. */\n onSave: (item: ListItem, value: unknown) => Promise<ListItem>;\n /** Shows an item the backend gave back: saved, or changed by someone else. */\n onItem: (item: ListItem) => void;\n formatError: (failure: RuleFailure) => string;\n}\n\nfunction isEqualValue(a: unknown, b: unknown): boolean {\n return JSON.stringify(a ?? null) === JSON.stringify(b ?? null);\n}\n\n/**\n * A cell that edits its field in place (decision 0043): a checkbox for a boolean, otherwise the\n * value with a button that turns it into the field's control. Enter or leaving the cell saves,\n * Escape cancels; a select and a date save when one is picked. The value is checked by the\n * field's portable rules, then saved alone; errors and conflicts show in the cell.\n */\nexport function InlineCell({\n item,\n field,\n itemLabel,\n getItemLabel,\n children,\n renderValue,\n onSave,\n onItem,\n formatError,\n}: InlineCellProps) {\n const intl = usePanneauIntl();\n const toasts = useToast();\n const [state, setState] = useState<State>({ mode: 'idle' });\n const root = useRef<HTMLDivElement>(null);\n // Where focus goes once the cell has drawn its new state.\n const focus = useRef<'editor' | 'button' | null>(null);\n const label = field.label ?? field.name;\n const value = item[field.name];\n const isBoolean = field.type === 'boolean';\n const Entry = ENTRIES[field.type as keyof typeof ENTRIES];\n // The help of the field is for its form: a cell has no room for it.\n const { help: _help, ...bare } = field;\n\n useEffect(() => {\n if (focus.current === 'editor') {\n root.current?.querySelector<HTMLElement>('input, [role=\"spinbutton\"], button')?.focus();\n } else if (focus.current === 'button') {\n root.current?.querySelector<HTMLElement>('button')?.focus();\n }\n focus.current = null;\n });\n\n /**\n * Saves a value on an item. The toast that says it has \"Undo\", which saves the previous value\n * the same way, with the version the save just got (decision 0063): a conflict then shows in\n * the cell, as for any change. After an undo, a short toast says the value is back.\n */\n const save = (base: ListItem, draft: unknown, { undoing = false } = {}) => {\n const previous = base[field.name];\n setState({ mode: 'saving', draft });\n onSave(base, draft).then(\n (saved) => {\n onItem(saved);\n focus.current = isBoolean ? null : 'button';\n setState({ mode: 'idle' });\n const names = { item: getItemLabel?.(saved) ?? itemLabel, field: label };\n const key = { key: `panneau-inline:${item.id}:${field.name}` };\n toasts.show(\n undoing\n ? { title: intl.formatMessage(messages.inlineUndone, names) }\n : {\n title: intl.formatMessage(messages.inlineSaved, names),\n tone: 'success',\n action: {\n label: intl.formatMessage(messages.undo),\n onAction: () => save(saved, previous, { undoing: true }),\n },\n },\n key,\n );\n },\n (error: unknown) => {\n const problem = getProblem(error);\n if (problem?.status === 412 && problem.current !== undefined) {\n onItem(problem.current);\n setState({ mode: 'conflict', draft, current: problem.current });\n return;\n }\n const own = Object.entries(problem?.errors ?? {})\n .filter(([path]) => path === field.name || path.startsWith(`${field.name}.`))\n .flatMap(([, list]) => list);\n const message =\n problem?.detail ??\n (problem !== null ? problem.title : null) ??\n (error instanceof Error && error.message !== '' ? error.message : null) ??\n intl.formatMessage(messages.saveValueFailed);\n focus.current = 'editor';\n setState({ mode: 'editing', draft, errors: own.length > 0 ? own : [message] });\n },\n );\n };\n\n const commit = (draft: unknown) => {\n if (isEqualValue(draft, value)) {\n focus.current = 'button';\n setState({ mode: 'idle' });\n return;\n }\n const failures = checkValues(\n [field],\n { [field.name]: draft },\n {\n mode: 'update',\n partial: true,\n item,\n },\n );\n const errors = Object.values(failures)\n .flat()\n .map((failure) => formatError(failure));\n if (errors.length > 0) {\n setState({ mode: 'editing', draft, errors });\n return;\n }\n save(item, draft);\n };\n\n const cancel = () => {\n focus.current = 'button';\n setState({ mode: 'idle' });\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (state.mode !== 'editing') {\n return;\n }\n if (event.key === 'Escape') {\n event.stopPropagation();\n cancel();\n } else if (event.key === 'Enter' && !PICKED.has(field.type)) {\n event.preventDefault();\n commit(state.draft);\n }\n };\n\n // Leaving the cell saves; the popover of a select or a date picker is part of it.\n const onBlur = (event: FocusEvent) => {\n const next = event.relatedTarget;\n if (\n state.mode !== 'editing' ||\n (next instanceof Element &&\n (event.currentTarget.contains(next) || next.closest('.panneau-popover') !== null))\n ) {\n return;\n }\n commit(state.draft);\n };\n\n const control = (draft: unknown, errors: readonly string[], disabled: boolean) => (\n <Entry\n field={bare}\n path={field.name}\n value={draft}\n onChange={(next) => {\n if (isBoolean || (PICKED.has(field.type) && next !== null)) {\n commit(next);\n } else {\n setState({ mode: 'editing', draft: next, errors: [] });\n }\n }}\n errors={errors}\n disabled={disabled}\n hideLabel\n />\n );\n\n if (isBoolean) {\n return (\n <div className={styles.cell}>\n <div className={styles.control}>\n {control(\n state.mode === 'idle' ? value : state.draft,\n state.mode === 'editing' ? state.errors : [],\n state.mode === 'saving',\n )}\n {state.mode === 'saving' ? (\n <Spinner size=\"sm\" label={intl.formatMessage(messages.savingValue)} />\n ) : null}\n </div>\n {state.mode === 'conflict' ? (\n <Conflict\n current={renderValue(state.current)}\n onKeep={() => setState({ mode: 'idle' })}\n onSave={() => save(state.current, state.draft)}\n />\n ) : null}\n </div>\n );\n }\n\n if (state.mode === 'idle') {\n return (\n <div ref={root} className={styles.cell}>\n <span className={styles.value}>{children}</span>\n <IconButton\n icon={Pencil}\n size=\"sm\"\n label={intl.formatMessage(messages.editValue, {\n field: label,\n item: itemLabel,\n })}\n showTooltip={false}\n className={styles.edit}\n onPress={() => {\n focus.current = 'editor';\n setState({ mode: 'editing', draft: value, errors: [] });\n }}\n />\n </div>\n );\n }\n\n return (\n <div ref={root} className={styles.cell} onKeyDown={onKeyDown} onBlur={onBlur}>\n <div className={styles.control}>\n {control(\n state.draft,\n state.mode === 'editing' ? state.errors : [],\n state.mode === 'saving',\n )}\n {state.mode === 'saving' ? (\n <Spinner size=\"sm\" label={intl.formatMessage(messages.savingValue)} />\n ) : null}\n </div>\n {state.mode === 'conflict' ? (\n <Conflict\n current={renderValue(state.current)}\n onKeep={() => {\n focus.current = 'button';\n setState({ mode: 'idle' });\n }}\n onSave={() => save(state.current, state.draft)}\n />\n ) : null}\n </div>\n );\n}\n\n/** What someone else saved, with the choice of keeping it or saving over it. */\nfunction Conflict({\n current,\n onKeep,\n onSave,\n}: {\n current: ReactNode;\n onKeep: () => void;\n onSave: () => void;\n}) {\n const intl = usePanneauIntl();\n return (\n <div className={styles.conflict} role=\"alert\">\n <span>\n {intl.formatMessage(messages.valueConflict)} <strong>{current}</strong>\n </span>\n <span className={styles.conflictActions}>\n <Button size=\"sm\" appearance=\"ghost\" onPress={onKeep}>\n {intl.formatMessage(messages.keepTheirs)}\n </Button>\n <Button size=\"sm\" onPress={onSave}>\n {intl.formatMessage(messages.saveMine)}\n </Button>\n </span>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Field } from '@panneau/protocol';
|
|
2
|
+
import type { ListColumn, ListItem } from '../types.js';
|
|
3
|
+
/** The types a column edits in place (decision 0043). */
|
|
4
|
+
export declare const INLINE_TYPES: ReadonlySet<string>;
|
|
5
|
+
/** Whether a field can be edited in place: a simple type, one value, not read-only. */
|
|
6
|
+
export declare function isInlineField(field: Field | null | undefined): field is Field;
|
|
7
|
+
/**
|
|
8
|
+
* The field a column edits in place on an item, or `null`: a field of `inlineEdit`, of a simple
|
|
9
|
+
* type, shown for the item (`visibleWhen`), on an item that can be updated.
|
|
10
|
+
*/
|
|
11
|
+
export declare function getInlineField(column: ListColumn, item: ListItem, inlineEdit: readonly string[]): Field | null;
|
|
12
|
+
//# sourceMappingURL=editable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editable.d.ts","sourceRoot":"","sources":["../../src/inline/editable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAG/C,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAErD,yDAAyD;AACzD,eAAO,MAAM,YAAY,EAAE,WAAW,CAAC,MAAM,CAM3C,CAAC;AAEH,uFAAuF;AACvF,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,GAAG,SAAS,GAAG,KAAK,IAAI,KAAK,CAU7E;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC1B,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,QAAQ,EACd,UAAU,EAAE,SAAS,MAAM,EAAE,GAC9B,KAAK,GAAG,IAAI,CAYd"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { evaluateCondition } from "@panneau/protocol/runtime";
|
|
2
|
+
//#region src/inline/editable.ts
|
|
3
|
+
/** The types a column edits in place (decision 0043). */
|
|
4
|
+
var INLINE_TYPES = /* @__PURE__ */ new Set([
|
|
5
|
+
"text",
|
|
6
|
+
"number",
|
|
7
|
+
"select",
|
|
8
|
+
"boolean",
|
|
9
|
+
"date"
|
|
10
|
+
]);
|
|
11
|
+
/** Whether a field can be edited in place: a simple type, one value, not read-only. */
|
|
12
|
+
function isInlineField(field) {
|
|
13
|
+
return field !== null && field !== void 0 && INLINE_TYPES.has(field.type) && field.localized !== true && field.multiple !== true && field.readOnly !== true && field.createOnly !== true;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* The field a column edits in place on an item, or `null`: a field of `inlineEdit`, of a simple
|
|
17
|
+
* type, shown for the item (`visibleWhen`), on an item that can be updated.
|
|
18
|
+
*/
|
|
19
|
+
function getInlineField(column, item, inlineEdit) {
|
|
20
|
+
const field = column.field;
|
|
21
|
+
if (!isInlineField(field) || !inlineEdit.includes(field.name)) return null;
|
|
22
|
+
if (item.abilities?.update !== true) return null;
|
|
23
|
+
if (field.visibleWhen !== void 0 && !evaluateCondition(field.visibleWhen, item)) return null;
|
|
24
|
+
return field;
|
|
25
|
+
}
|
|
26
|
+
//#endregion
|
|
27
|
+
export { INLINE_TYPES, getInlineField, isInlineField };
|
|
28
|
+
|
|
29
|
+
//# sourceMappingURL=editable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editable.js","names":["Field","evaluateCondition","ListColumn","ListItem","INLINE_TYPES","ReadonlySet","Set","isInlineField","field","undefined","has","type","localized","multiple","readOnly","createOnly","getInlineField","column","item","inlineEdit","includes","name","abilities","update","visibleWhen"],"sources":["../../src/inline/editable.ts"],"sourcesContent":["import type { Field } from '@panneau/protocol';\nimport { evaluateCondition } from '@panneau/protocol/runtime';\n\nimport type { ListColumn, ListItem } from '../types';\n\n/** The types a column edits in place (decision 0043). */\nexport const INLINE_TYPES: ReadonlySet<string> = new Set([\n 'text',\n 'number',\n 'select',\n 'boolean',\n 'date',\n]);\n\n/** Whether a field can be edited in place: a simple type, one value, not read-only. */\nexport function isInlineField(field: Field | null | undefined): field is Field {\n return (\n field !== null &&\n field !== undefined &&\n INLINE_TYPES.has(field.type) &&\n field.localized !== true &&\n field.multiple !== true &&\n field.readOnly !== true &&\n field.createOnly !== true\n );\n}\n\n/**\n * The field a column edits in place on an item, or `null`: a field of `inlineEdit`, of a simple\n * type, shown for the item (`visibleWhen`), on an item that can be updated.\n */\nexport function getInlineField(\n column: ListColumn,\n item: ListItem,\n inlineEdit: readonly string[],\n): Field | null {\n const field = column.field;\n if (!isInlineField(field) || !inlineEdit.includes(field.name)) {\n return null;\n }\n if (item.abilities?.update !== true) {\n return null;\n }\n if (field.visibleWhen !== undefined && !evaluateCondition(field.visibleWhen, item)) {\n return null;\n }\n return field;\n}\n"],"mappings":";;;AAMA,IAAaI,+BAAoC,IAAIE,IAAI;CACrD;CACA;CACA;CACA;CACA;AAAM,CACT;;AAGD,SAAgBC,cAAcC,OAAiD;CAC3E,OACIA,UAAU,QACVA,UAAUC,KAAAA,KACVL,aAAaM,IAAIF,MAAMG,IAAI,KAC3BH,MAAMI,cAAc,QACpBJ,MAAMK,aAAa,QACnBL,MAAMM,aAAa,QACnBN,MAAMO,eAAe;AAE7B;;;;;AAMA,SAAgBC,eACZC,QACAC,MACAC,YACY;CACZ,MAAMX,QAAQS,OAAOT;CACrB,IAAI,CAACD,cAAcC,KAAK,KAAK,CAACW,WAAWC,SAASZ,MAAMa,IAAI,GACxD,OAAO;CAEX,IAAIH,KAAKI,WAAWC,WAAW,MAC3B,OAAO;CAEX,IAAIf,MAAMgB,gBAAgBf,KAAAA,KAAa,CAACR,kBAAkBO,MAAMgB,aAAaN,IAAI,GAC7E,OAAO;CAEX,OAAOV;AACX"}
|