@simplysm/solid 13.0.70 → 13.0.71
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 +1 -1
- package/dist/components/disclosure/Dropdown.d.ts +6 -4
- package/dist/components/disclosure/Dropdown.d.ts.map +1 -1
- package/dist/components/disclosure/Dropdown.js +24 -8
- package/dist/components/disclosure/Dropdown.js.map +2 -2
- package/dist/components/disclosure/dialogZIndex.d.ts +2 -0
- package/dist/components/disclosure/dialogZIndex.d.ts.map +1 -1
- package/dist/components/disclosure/dialogZIndex.js +4 -0
- package/dist/components/disclosure/dialogZIndex.js.map +1 -1
- package/dist/components/features/crud-detail/CrudDetail.d.ts.map +1 -1
- package/dist/components/features/crud-detail/CrudDetail.js +16 -7
- package/dist/components/features/crud-detail/CrudDetail.js.map +2 -2
- package/dist/components/features/crud-sheet/CrudSheet.d.ts.map +1 -1
- package/dist/components/features/crud-sheet/CrudSheet.js +14 -5
- package/dist/components/features/crud-sheet/CrudSheet.js.map +2 -2
- package/dist/components/features/crudRegistry.d.ts +16 -0
- package/dist/components/features/crudRegistry.d.ts.map +1 -0
- package/dist/components/features/crudRegistry.js +37 -0
- package/dist/components/features/crudRegistry.js.map +6 -0
- package/dist/components/features/permission-table/PermissionTable.d.ts.map +1 -1
- package/dist/components/features/permission-table/PermissionTable.js +71 -86
- package/dist/components/features/permission-table/PermissionTable.js.map +2 -2
- package/dist/components/features/shared-data/SharedDataSelect.js +2 -4
- package/dist/components/features/shared-data/SharedDataSelect.js.map +2 -2
- package/dist/components/features/shared-data/SharedDataSelectList.d.ts +2 -4
- package/dist/components/features/shared-data/SharedDataSelectList.d.ts.map +1 -1
- package/dist/components/features/shared-data/SharedDataSelectList.js +11 -46
- package/dist/components/features/shared-data/SharedDataSelectList.js.map +2 -2
- package/dist/components/form-control/select/Select.d.ts.map +1 -1
- package/dist/components/form-control/select/Select.js +1 -1
- package/dist/components/form-control/select/Select.js.map +1 -1
- package/dist/helpers/createAppStructure.d.ts.map +1 -1
- package/dist/helpers/createAppStructure.js +3 -2
- package/dist/helpers/createAppStructure.js.map +1 -1
- package/dist/helpers/createHmrSafeContext.d.ts +3 -0
- package/dist/helpers/createHmrSafeContext.d.ts.map +1 -0
- package/dist/helpers/createHmrSafeContext.js +10 -0
- package/dist/helpers/createHmrSafeContext.js.map +6 -0
- package/dist/hooks/createSelectionGroup.d.ts.map +1 -1
- package/dist/hooks/createSelectionGroup.js +3 -2
- package/dist/hooks/createSelectionGroup.js.map +2 -2
- package/package.json +6 -5
- package/src/components/disclosure/Dropdown.tsx +31 -17
- package/src/components/disclosure/dialogZIndex.ts +5 -0
- package/src/components/features/crud-detail/CrudDetail.tsx +16 -5
- package/src/components/features/crud-sheet/CrudSheet.tsx +13 -3
- package/src/components/features/crudRegistry.ts +60 -0
- package/src/components/features/permission-table/PermissionTable.tsx +49 -46
- package/src/components/features/shared-data/SharedDataSelect.tsx +2 -2
- package/src/components/features/shared-data/SharedDataSelectList.tsx +11 -36
- package/src/components/form-control/select/Select.tsx +1 -5
- package/src/helpers/createAppStructure.ts +3 -2
- package/src/helpers/createHmrSafeContext.ts +8 -0
- package/src/hooks/createSelectionGroup.tsx +4 -2
- package/tests/components/data/List.spec.tsx +52 -52
- package/tests/components/data/Pagination.spec.tsx +43 -43
- package/tests/components/data/Table.spec.tsx +4 -4
- package/tests/components/data/kanban/Kanban.selection.spec.tsx +21 -21
- package/tests/components/data/sheet/DataSheet.spec.tsx +50 -50
- package/tests/components/disclosure/Collapse.spec.tsx +24 -24
- package/tests/components/disclosure/Dialog.spec.tsx +33 -33
- package/tests/components/disclosure/DialogProvider.spec.tsx +9 -9
- package/tests/components/disclosure/Dropdown.spec.tsx +134 -14
- package/tests/components/disclosure/Tabs.spec.tsx +21 -21
- package/tests/components/disclosure/dialogZIndex.spec.ts +45 -0
- package/tests/components/display/Alert.spec.tsx +4 -4
- package/tests/components/display/Barcode.spec.tsx +7 -7
- package/tests/components/display/Card.spec.tsx +3 -3
- package/tests/components/display/Link.spec.tsx +5 -5
- package/tests/components/display/Tag.spec.tsx +4 -4
- package/tests/components/features/address/AddressSearch.spec.tsx +3 -3
- package/tests/components/features/crudRegistry.spec.ts +119 -0
- package/tests/components/features/data-select-button/DataSelectButton.spec.tsx +8 -8
- package/tests/components/features/permission-table/PermissionTable.spec.tsx +43 -43
- package/tests/components/features/shared-data/SharedDataSelectList.spec.tsx +2 -17
- package/tests/components/feedback/busy/BusyContainer.spec.tsx +7 -7
- package/tests/components/feedback/notification/NotificationBell.spec.tsx +9 -9
- package/tests/components/feedback/print/Print.spec.tsx +4 -4
- package/tests/components/form-control/Button.spec.tsx +18 -18
- package/tests/components/form-control/checkbox/Checkbox.spec.tsx +20 -20
- package/tests/components/form-control/checkbox/CheckboxGroup.spec.tsx +12 -12
- package/tests/components/form-control/checkbox/Radio.spec.tsx +21 -21
- package/tests/components/form-control/checkbox/RadioGroup.spec.tsx +12 -12
- package/tests/components/form-control/color-picker/ColorPicker.spec.tsx +10 -10
- package/tests/components/form-control/combobox/Combobox.spec.tsx +16 -16
- package/tests/components/form-control/combobox/ComboboxItem.spec.tsx +7 -7
- package/tests/components/form-control/date-range-picker/DateRangePicker.spec.tsx +24 -24
- package/tests/components/form-control/field/DatePicker.spec.tsx +50 -50
- package/tests/components/form-control/field/DateTimePicker.spec.tsx +47 -47
- package/tests/components/form-control/field/NumberInput.spec.tsx +54 -54
- package/tests/components/form-control/field/TextInput.spec.tsx +49 -49
- package/tests/components/form-control/field/Textarea.spec.tsx +33 -33
- package/tests/components/form-control/field/TimePicker.spec.tsx +42 -42
- package/tests/components/form-control/numpad/Numpad.spec.tsx +40 -40
- package/tests/components/form-control/select/Select.spec.tsx +9 -9
- package/tests/components/form-control/select/SelectItem.spec.tsx +10 -10
- package/tests/helpers/createAppStructure.spec.tsx +57 -57
- package/tests/helpers/mergeStyles.spec.ts +31 -31
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/helpers/createAppStructure.ts"],
|
|
4
|
-
"mappings": "AACA,SAAwB,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createHmrSafeContext.d.ts","sourceRoot":"","sources":["..\\..\\src\\helpers\\createHmrSafeContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAiB,MAAM,UAAU,CAAC;AAKvD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAErF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { createContext } from "solid-js";
|
|
2
|
+
const CACHE_KEY = "__simplysm_ctx__";
|
|
3
|
+
const cache = globalThis[CACHE_KEY] ?? (globalThis[CACHE_KEY] = {});
|
|
4
|
+
function createHmrSafeContext(key) {
|
|
5
|
+
return cache[key] ?? (cache[key] = createContext());
|
|
6
|
+
}
|
|
7
|
+
export {
|
|
8
|
+
createHmrSafeContext
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=createHmrSafeContext.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createSelectionGroup.d.ts","sourceRoot":"","sources":["..\\..\\src\\hooks\\createSelectionGroup.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,GAAG,
|
|
1
|
+
{"version":3,"file":"createSelectionGroup.d.ts","sourceRoot":"","sources":["..\\..\\src\\hooks\\createSelectionGroup.tsx"],"names":[],"mappings":"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"}
|
|
@@ -5,12 +5,13 @@ import { mergeProps as _$mergeProps } from "solid-js/web";
|
|
|
5
5
|
import { createComponent as _$createComponent } from "solid-js/web";
|
|
6
6
|
import { memo as _$memo } from "solid-js/web";
|
|
7
7
|
var _tmpl$ = /* @__PURE__ */ _$template(`<div>`);
|
|
8
|
-
import {
|
|
8
|
+
import { createMemo, splitProps, useContext } from "solid-js";
|
|
9
|
+
import { createHmrSafeContext } from "../helpers/createHmrSafeContext.js";
|
|
9
10
|
import { twMerge } from "tailwind-merge";
|
|
10
11
|
import { createControllableSignal } from "./createControllableSignal.js";
|
|
11
12
|
import { Invalid } from "../components/form-control/Invalid.js";
|
|
12
13
|
function createSelectionGroup(config) {
|
|
13
|
-
const Context =
|
|
14
|
+
const Context = createHmrSafeContext(`SelectionGroup_${config.contextName}`);
|
|
14
15
|
const ItemComponent = config.ItemComponent;
|
|
15
16
|
function ItemInner(props) {
|
|
16
17
|
const ctx = useContext(Context);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/hooks/createSelectionGroup.tsx"],
|
|
4
|
-
"mappings": ";;;;;;;AAAA,SAGEA,
|
|
5
|
-
"names": ["
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": ["createMemo", "splitProps", "useContext", "createHmrSafeContext", "twMerge", "createControllableSignal", "Invalid", "createSelectionGroup", "config", "Context", "contextName", "ItemComponent", "ItemInner", "props", "ctx", "Error", "isSelected", "mode", "value", "includes", "handleChange", "toggle", "select", "_$createComponent", "onValueChange", "disabled", "size", "inline", "inset", "children", "GroupInner", "local", "rest", "contextValue", "setValue", "onChange", "item", "prev", "filter", "v", "errorMsg", "required", "length", "emptyErrorMsg", "validate", "undefined", "message", "variant", "touchMode", "Provider", "_el$", "_tmpl$", "_$spread", "_$mergeProps", "class", "style", "_$insert", "Group", "Item"]
|
|
6
6
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@simplysm/solid",
|
|
3
|
-
"version": "13.0.
|
|
3
|
+
"version": "13.0.71",
|
|
4
4
|
"description": "Simplysm package - SolidJS library",
|
|
5
5
|
"author": "simplysm",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -48,12 +48,13 @@
|
|
|
48
48
|
"jspdf": "^4.2.0",
|
|
49
49
|
"solid-js": "^1.9.11",
|
|
50
50
|
"solid-tiptap": "^0.8.0",
|
|
51
|
+
"tabbable": "^6.4.0",
|
|
51
52
|
"tailwind-merge": "^3.5.0",
|
|
52
53
|
"tailwindcss": "^3.4.19",
|
|
53
|
-
"@simplysm/core-
|
|
54
|
-
"@simplysm/core-
|
|
55
|
-
"@simplysm/service-
|
|
56
|
-
"@simplysm/service-
|
|
54
|
+
"@simplysm/core-common": "13.0.71",
|
|
55
|
+
"@simplysm/core-browser": "13.0.71",
|
|
56
|
+
"@simplysm/service-client": "13.0.71",
|
|
57
|
+
"@simplysm/service-common": "13.0.71"
|
|
57
58
|
},
|
|
58
59
|
"devDependencies": {
|
|
59
60
|
"@solidjs/testing-library": "^0.8.10"
|
|
@@ -18,6 +18,7 @@ import { twMerge } from "tailwind-merge";
|
|
|
18
18
|
import { mergeStyles } from "../../helpers/mergeStyles";
|
|
19
19
|
import { createSlotComponent } from "../../helpers/createSlotComponent";
|
|
20
20
|
import { borderSubtle } from "../../styles/tokens.styles";
|
|
21
|
+
import { tabbable } from "tabbable";
|
|
21
22
|
|
|
22
23
|
// --- DropdownContext (internal) ---
|
|
23
24
|
|
|
@@ -70,13 +71,15 @@ export interface DropdownProps {
|
|
|
70
71
|
* Enable keyboard navigation (used in Select, etc)
|
|
71
72
|
*
|
|
72
73
|
* When direction=down:
|
|
73
|
-
* - ArrowDown from trigger -> focus first
|
|
74
|
-
* - ArrowUp
|
|
74
|
+
* - ArrowDown from trigger -> focus first tabbable item in popup
|
|
75
|
+
* - ArrowUp/ArrowDown within popup -> navigate between tabbable items
|
|
76
|
+
* - ArrowUp from first tabbable -> focus trigger
|
|
75
77
|
* - ArrowUp from trigger -> close
|
|
76
78
|
*
|
|
77
79
|
* When direction=up:
|
|
78
|
-
* - ArrowUp from trigger -> focus last
|
|
79
|
-
* - ArrowDown
|
|
80
|
+
* - ArrowUp from trigger -> focus last tabbable item in popup
|
|
81
|
+
* - ArrowUp/ArrowDown within popup -> navigate between tabbable items
|
|
82
|
+
* - ArrowDown from last tabbable -> focus trigger
|
|
80
83
|
* - ArrowDown from trigger -> close
|
|
81
84
|
*/
|
|
82
85
|
keyboardNav?: boolean;
|
|
@@ -319,11 +322,7 @@ export const Dropdown: DropdownComponent = ((props: DropdownProps) => {
|
|
|
319
322
|
if (!popup) return;
|
|
320
323
|
|
|
321
324
|
const dir = direction();
|
|
322
|
-
const focusables =
|
|
323
|
-
...popup.querySelectorAll<HTMLElement>(
|
|
324
|
-
'[tabindex]:not([tabindex="-1"]), button, [data-list-item]',
|
|
325
|
-
),
|
|
326
|
-
];
|
|
325
|
+
const focusables = tabbable(popup);
|
|
327
326
|
|
|
328
327
|
if (dir === "down") {
|
|
329
328
|
if (e.key === "ArrowDown" && focusables.length > 0) {
|
|
@@ -354,16 +353,30 @@ export const Dropdown: DropdownComponent = ((props: DropdownProps) => {
|
|
|
354
353
|
|
|
355
354
|
if (!triggerRef) return;
|
|
356
355
|
|
|
356
|
+
const popup = popupRef();
|
|
357
|
+
if (!popup) return;
|
|
358
|
+
|
|
357
359
|
const dir = direction();
|
|
360
|
+
const allTabbable = tabbable(popup);
|
|
361
|
+
const current = (document.activeElement ?? e.target) as HTMLElement;
|
|
362
|
+
const currentIdx = allTabbable.indexOf(current);
|
|
358
363
|
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
364
|
+
if (e.key === "ArrowUp") {
|
|
365
|
+
if (currentIdx > 0) {
|
|
366
|
+
e.preventDefault();
|
|
367
|
+
allTabbable[currentIdx - 1].focus();
|
|
368
|
+
} else if (dir === "down") {
|
|
369
|
+
e.preventDefault();
|
|
370
|
+
triggerRef.focus();
|
|
371
|
+
}
|
|
372
|
+
} else if (e.key === "ArrowDown") {
|
|
373
|
+
if (currentIdx >= 0 && currentIdx < allTabbable.length - 1) {
|
|
374
|
+
e.preventDefault();
|
|
375
|
+
allTabbable[currentIdx + 1].focus();
|
|
376
|
+
} else if (dir === "up") {
|
|
377
|
+
e.preventDefault();
|
|
378
|
+
triggerRef.focus();
|
|
379
|
+
}
|
|
367
380
|
}
|
|
368
381
|
};
|
|
369
382
|
|
|
@@ -432,6 +445,7 @@ export const Dropdown: DropdownComponent = ((props: DropdownProps) => {
|
|
|
432
445
|
ref={(el) => {
|
|
433
446
|
triggerRef = el;
|
|
434
447
|
}}
|
|
448
|
+
tabIndex={-1}
|
|
435
449
|
data-dropdown-trigger
|
|
436
450
|
onClick={toggle}
|
|
437
451
|
onKeyDown={handleTriggerKeyDown}
|
|
@@ -46,3 +46,8 @@ function reindex(): void {
|
|
|
46
46
|
export function isTopmost(el: HTMLElement): boolean {
|
|
47
47
|
return stack.length > 0 && stack[stack.length - 1] === el;
|
|
48
48
|
}
|
|
49
|
+
|
|
50
|
+
/** Get the topmost (front-most) Dialog element, or null if none are open */
|
|
51
|
+
export function getTopmostDialog(): HTMLElement | null {
|
|
52
|
+
return stack.length > 0 ? stack[stack.length - 1] : null;
|
|
53
|
+
}
|
|
@@ -2,12 +2,15 @@ import {
|
|
|
2
2
|
children,
|
|
3
3
|
createMemo,
|
|
4
4
|
createSignal,
|
|
5
|
+
createUniqueId,
|
|
5
6
|
type JSX,
|
|
7
|
+
onCleanup,
|
|
6
8
|
onMount,
|
|
7
9
|
Show,
|
|
8
10
|
splitProps,
|
|
9
11
|
useContext,
|
|
10
12
|
} from "solid-js";
|
|
13
|
+
import { registerCrud, unregisterCrud, activateCrud, isActiveCrud } from "../crudRegistry";
|
|
11
14
|
import { reconcile, unwrap } from "solid-js/store";
|
|
12
15
|
import { createControllableStore } from "../../../hooks/createControllableStore";
|
|
13
16
|
import { objClone, objEqual } from "@simplysm/core-common";
|
|
@@ -82,6 +85,8 @@ const CrudDetailBase = <TData extends object>(props: CrudDetailProps<TData>) =>
|
|
|
82
85
|
|
|
83
86
|
let formRef: HTMLFormElement | undefined;
|
|
84
87
|
|
|
88
|
+
const crudId = createUniqueId();
|
|
89
|
+
|
|
85
90
|
// -- Load --
|
|
86
91
|
async function doLoad() {
|
|
87
92
|
setBusyCount((c) => c + 1);
|
|
@@ -100,6 +105,10 @@ const CrudDetailBase = <TData extends object>(props: CrudDetailProps<TData>) =>
|
|
|
100
105
|
onMount(() => {
|
|
101
106
|
void doLoad();
|
|
102
107
|
});
|
|
108
|
+
onCleanup(() => unregisterCrud(crudId));
|
|
109
|
+
|
|
110
|
+
createEventListener(() => formRef, "pointerdown", () => activateCrud(crudId));
|
|
111
|
+
createEventListener(() => formRef, "focusin", () => activateCrud(crudId));
|
|
103
112
|
|
|
104
113
|
// -- Change Detection --
|
|
105
114
|
function hasChanges(): boolean {
|
|
@@ -177,13 +186,15 @@ const CrudDetailBase = <TData extends object>(props: CrudDetailProps<TData>) =>
|
|
|
177
186
|
|
|
178
187
|
// -- Keyboard Shortcuts --
|
|
179
188
|
createEventListener(document, "keydown", (e: KeyboardEvent) => {
|
|
180
|
-
if (!
|
|
189
|
+
if (!isActiveCrud(crudId)) return;
|
|
181
190
|
if (e.ctrlKey && e.key === "s") {
|
|
182
191
|
e.preventDefault();
|
|
183
|
-
|
|
192
|
+
e.stopImmediatePropagation();
|
|
193
|
+
formRef?.requestSubmit();
|
|
184
194
|
}
|
|
185
195
|
if (e.ctrlKey && e.altKey && e.key === "l") {
|
|
186
196
|
e.preventDefault();
|
|
197
|
+
e.stopImmediatePropagation();
|
|
187
198
|
void handleRefresh();
|
|
188
199
|
}
|
|
189
200
|
});
|
|
@@ -273,11 +284,11 @@ const CrudDetailBase = <TData extends object>(props: CrudDetailProps<TData>) =>
|
|
|
273
284
|
<BusyContainer
|
|
274
285
|
ready={ready()}
|
|
275
286
|
busy={busyCount() > 0}
|
|
276
|
-
class={clsx("flex h-full flex-col", local.class)}
|
|
287
|
+
class={clsx("flex h-full flex-col gap-2", local.class)}
|
|
277
288
|
>
|
|
278
289
|
{/* Toolbar */}
|
|
279
290
|
<Show when={(!isModal && !topbarCtx) || defs().tools}>
|
|
280
|
-
<div class="flex gap-2
|
|
291
|
+
<div class="flex gap-2 pb-0">
|
|
281
292
|
<Show when={!topbarCtx && !isModal}>
|
|
282
293
|
<Show when={canEdit() && local.submit}>
|
|
283
294
|
<Button
|
|
@@ -324,7 +335,7 @@ const CrudDetailBase = <TData extends object>(props: CrudDetailProps<TData>) =>
|
|
|
324
335
|
<Show when={defs().before}>{(beforeDef) => beforeDef().children}</Show>
|
|
325
336
|
|
|
326
337
|
{/* Form */}
|
|
327
|
-
<form ref={formRef} class="flex-1 overflow-auto
|
|
338
|
+
<form ref={(el) => { formRef = el; registerCrud(crudId, el); }} class="flex-1 overflow-auto" onSubmit={handleFormSubmit}>
|
|
328
339
|
{formContent()}
|
|
329
340
|
</form>
|
|
330
341
|
|
|
@@ -3,8 +3,10 @@ import {
|
|
|
3
3
|
createEffect,
|
|
4
4
|
createMemo,
|
|
5
5
|
createSignal,
|
|
6
|
+
createUniqueId,
|
|
6
7
|
For,
|
|
7
8
|
type JSX,
|
|
9
|
+
onCleanup,
|
|
8
10
|
Show,
|
|
9
11
|
splitProps,
|
|
10
12
|
useContext,
|
|
@@ -41,6 +43,7 @@ import {
|
|
|
41
43
|
IconTrashOff,
|
|
42
44
|
IconUpload,
|
|
43
45
|
} from "@tabler/icons-solidjs";
|
|
46
|
+
import { registerCrud, unregisterCrud, activateCrud, isActiveCrud } from "../crudRegistry";
|
|
44
47
|
import { CrudSheetColumn, isCrudSheetColumnDef } from "./CrudSheetColumn";
|
|
45
48
|
import { CrudSheetFilter, isCrudSheetFilterDef } from "./CrudSheetFilter";
|
|
46
49
|
import { CrudSheetTools, isCrudSheetToolsDef } from "./CrudSheetTools";
|
|
@@ -134,6 +137,11 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
134
137
|
|
|
135
138
|
let formRef: HTMLFormElement | undefined;
|
|
136
139
|
|
|
140
|
+
const crudId = createUniqueId();
|
|
141
|
+
onCleanup(() => unregisterCrud(crudId));
|
|
142
|
+
createEventListener(() => formRef, "pointerdown", () => activateCrud(crudId));
|
|
143
|
+
createEventListener(() => formRef, "focusin", () => activateCrud(crudId));
|
|
144
|
+
|
|
137
145
|
createEffect(() => {
|
|
138
146
|
void doRefresh();
|
|
139
147
|
});
|
|
@@ -389,13 +397,15 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
389
397
|
|
|
390
398
|
// -- Keyboard Shortcuts --
|
|
391
399
|
createEventListener(document, "keydown", async (e: KeyboardEvent) => {
|
|
392
|
-
if (!
|
|
400
|
+
if (!isActiveCrud(crudId)) return;
|
|
393
401
|
if (e.ctrlKey && e.key === "s" && !isSelectMode()) {
|
|
394
402
|
e.preventDefault();
|
|
395
|
-
|
|
403
|
+
e.stopImmediatePropagation();
|
|
404
|
+
formRef?.requestSubmit();
|
|
396
405
|
}
|
|
397
406
|
if (e.ctrlKey && e.altKey && e.key === "l") {
|
|
398
407
|
e.preventDefault();
|
|
408
|
+
e.stopImmediatePropagation();
|
|
399
409
|
if (!checkIgnoreChanges()) return;
|
|
400
410
|
await doRefresh();
|
|
401
411
|
}
|
|
@@ -602,7 +612,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
602
612
|
</Show>
|
|
603
613
|
|
|
604
614
|
{/* DataSheet */}
|
|
605
|
-
<form ref={formRef} class="flex-1 overflow-hidden p-2 pt-1" onSubmit={handleFormSubmit}>
|
|
615
|
+
<form ref={(el) => { formRef = el; registerCrud(crudId, el); }} class="flex-1 overflow-hidden p-2 pt-1" onSubmit={handleFormSubmit}>
|
|
606
616
|
<DataSheet
|
|
607
617
|
class="h-full"
|
|
608
618
|
items={items}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Crud activation registry
|
|
3
|
+
*
|
|
4
|
+
* Tracks mounted CrudDetail/CrudSheet instances and determines which one
|
|
5
|
+
* should respond to keyboard shortcuts (Ctrl+S, Ctrl+Alt+L).
|
|
6
|
+
*
|
|
7
|
+
* Priority rules:
|
|
8
|
+
* 1. If a Dialog is open, only cruds inside the topmost Dialog are candidates.
|
|
9
|
+
* 2. Among candidates, the most recently activated (interacted) crud wins.
|
|
10
|
+
* 3. On mount, cruds are auto-activated (last mounted = active).
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { getTopmostDialog } from "../disclosure/dialogZIndex";
|
|
14
|
+
|
|
15
|
+
interface CrudEntry {
|
|
16
|
+
id: string;
|
|
17
|
+
formEl: HTMLFormElement;
|
|
18
|
+
lastActivatedAt: number;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const entries: CrudEntry[] = [];
|
|
22
|
+
let _counter = 0;
|
|
23
|
+
|
|
24
|
+
export function registerCrud(id: string, formEl: HTMLFormElement): void {
|
|
25
|
+
const existing = entries.find((e) => e.id === id);
|
|
26
|
+
if (existing) return;
|
|
27
|
+
entries.push({ id, formEl, lastActivatedAt: ++_counter });
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function unregisterCrud(id: string): void {
|
|
31
|
+
const idx = entries.findIndex((e) => e.id === id);
|
|
32
|
+
if (idx >= 0) entries.splice(idx, 1);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function activateCrud(id: string): void {
|
|
36
|
+
const entry = entries.find((e) => e.id === id);
|
|
37
|
+
if (entry) entry.lastActivatedAt = ++_counter;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function isActiveCrud(id: string): boolean {
|
|
41
|
+
const entry = entries.find((e) => e.id === id);
|
|
42
|
+
if (!entry) return false;
|
|
43
|
+
|
|
44
|
+
const topDialog = getTopmostDialog();
|
|
45
|
+
|
|
46
|
+
const candidates = topDialog
|
|
47
|
+
? entries.filter((e) => topDialog.contains(e.formEl))
|
|
48
|
+
: entries;
|
|
49
|
+
|
|
50
|
+
if (candidates.length === 0) return false;
|
|
51
|
+
|
|
52
|
+
let best = candidates[0];
|
|
53
|
+
for (let i = 1; i < candidates.length; i++) {
|
|
54
|
+
if (candidates[i].lastActivatedAt > best.lastActivatedAt) {
|
|
55
|
+
best = candidates[i];
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return best.id === id;
|
|
60
|
+
}
|
|
@@ -10,7 +10,6 @@ import {
|
|
|
10
10
|
splitProps,
|
|
11
11
|
} from "solid-js";
|
|
12
12
|
import clsx from "clsx";
|
|
13
|
-
import { twMerge } from "tailwind-merge";
|
|
14
13
|
import { DataSheet } from "../../data/sheet/DataSheet";
|
|
15
14
|
import { Checkbox } from "../../form-control/checkbox/Checkbox";
|
|
16
15
|
import { borderDefault } from "../../../styles/tokens.styles";
|
|
@@ -261,51 +260,55 @@ export const PermissionTable: Component<PermissionTableProps> = (props) => {
|
|
|
261
260
|
};
|
|
262
261
|
|
|
263
262
|
return (
|
|
264
|
-
<
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
263
|
+
<DataSheet
|
|
264
|
+
data-permission-table
|
|
265
|
+
items={visibleItems()}
|
|
266
|
+
getChildren={getChildren}
|
|
267
|
+
expandedItems={expandedItems()}
|
|
268
|
+
onExpandedItemsChange={setExpandedItems}
|
|
269
|
+
hideConfigBar
|
|
270
|
+
>
|
|
271
|
+
<DataSheet.Column
|
|
272
|
+
key="title"
|
|
273
|
+
header={i18n?.t("permissionTable.permissionItem") ?? "Permission Item"}
|
|
274
|
+
sortable={false}
|
|
275
|
+
resizable={false}
|
|
271
276
|
>
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
<
|
|
277
|
-
|
|
278
|
-
{
|
|
279
|
-
<div class={
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
{
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
<
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
</DataSheet>
|
|
309
|
-
</div>
|
|
277
|
+
{(ctx) => {
|
|
278
|
+
const item = ctx.item as AppPerm;
|
|
279
|
+
return (
|
|
280
|
+
<div class={titleCellClass}>
|
|
281
|
+
<For each={Array.from({ length: ctx.depth })}>
|
|
282
|
+
{() => (
|
|
283
|
+
<div class={indentGuideWrapperClass}>
|
|
284
|
+
<div class={indentGuideLineClass} />
|
|
285
|
+
</div>
|
|
286
|
+
)}
|
|
287
|
+
</For>
|
|
288
|
+
<span class="py-1">{item.title}</span>
|
|
289
|
+
</div>
|
|
290
|
+
);
|
|
291
|
+
}}
|
|
292
|
+
</DataSheet.Column>
|
|
293
|
+
<For each={allPerms()}>
|
|
294
|
+
{(perm) => (
|
|
295
|
+
<DataSheet.Column key={`perm-${perm}`} header={perm} sortable={false} resizable={false}>
|
|
296
|
+
{(ctx) => {
|
|
297
|
+
const item = ctx.item as AppPerm;
|
|
298
|
+
return (
|
|
299
|
+
<Show when={hasPermInTree(item, perm)}>
|
|
300
|
+
<Checkbox
|
|
301
|
+
value={isGroupPermChecked(item, perm, currentValue())}
|
|
302
|
+
onValueChange={(checked) => handlePermChange(item, perm, checked)}
|
|
303
|
+
disabled={local.disabled || isPermDisabled(item, perm, currentValue())}
|
|
304
|
+
inset
|
|
305
|
+
/>
|
|
306
|
+
</Show>
|
|
307
|
+
);
|
|
308
|
+
}}
|
|
309
|
+
</DataSheet.Column>
|
|
310
|
+
)}
|
|
311
|
+
</For>
|
|
312
|
+
</DataSheet>
|
|
310
313
|
);
|
|
311
314
|
};
|
|
@@ -90,12 +90,12 @@ export function SharedDataSelect<TItem>(props: SharedDataSelectProps<TItem>): JS
|
|
|
90
90
|
<Select.ItemTemplate>{local.children}</Select.ItemTemplate>
|
|
91
91
|
{local.modal && (
|
|
92
92
|
<Select.Action onClick={() => void handleOpenModal()} aria-label={i18n?.t("sharedDataSelect.search") ?? "Search"}>
|
|
93
|
-
<Icon icon={IconSearch}
|
|
93
|
+
<Icon icon={IconSearch} />
|
|
94
94
|
</Select.Action>
|
|
95
95
|
)}
|
|
96
96
|
{local.editModal && (
|
|
97
97
|
<Select.Action onClick={() => void handleOpenEditModal()} aria-label={i18n?.t("sharedDataSelect.edit") ?? "Edit"}>
|
|
98
|
-
<Icon icon={IconEdit}
|
|
98
|
+
<Icon icon={IconEdit} />
|
|
99
99
|
</Select.Action>
|
|
100
100
|
)}
|
|
101
101
|
</Select>
|