@simplysm/solid 13.0.53 → 13.0.56

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 (222) hide show
  1. package/README.md +6 -2
  2. package/dist/components/data/crud-detail/CrudDetail.d.ts +14 -0
  3. package/dist/components/data/crud-detail/CrudDetail.d.ts.map +1 -0
  4. package/dist/components/data/crud-detail/CrudDetail.js +348 -0
  5. package/dist/components/data/crud-detail/CrudDetail.js.map +6 -0
  6. package/dist/components/data/crud-detail/CrudDetailAfter.d.ts +7 -0
  7. package/dist/components/data/crud-detail/CrudDetailAfter.d.ts.map +1 -0
  8. package/dist/components/data/crud-detail/CrudDetailAfter.js +14 -0
  9. package/dist/components/data/crud-detail/CrudDetailAfter.js.map +6 -0
  10. package/dist/components/data/crud-detail/CrudDetailBefore.d.ts +7 -0
  11. package/dist/components/data/crud-detail/CrudDetailBefore.d.ts.map +1 -0
  12. package/dist/components/data/crud-detail/CrudDetailBefore.js +14 -0
  13. package/dist/components/data/crud-detail/CrudDetailBefore.js.map +6 -0
  14. package/dist/components/data/crud-detail/CrudDetailTools.d.ts +7 -0
  15. package/dist/components/data/crud-detail/CrudDetailTools.d.ts.map +1 -0
  16. package/dist/components/data/crud-detail/CrudDetailTools.js +14 -0
  17. package/dist/components/data/crud-detail/CrudDetailTools.js.map +6 -0
  18. package/dist/components/data/crud-detail/types.d.ts +45 -0
  19. package/dist/components/data/crud-detail/types.d.ts.map +1 -0
  20. package/dist/components/data/crud-detail/types.js +1 -0
  21. package/dist/components/data/crud-detail/types.js.map +6 -0
  22. package/dist/components/data/crud-sheet/CrudSheet.d.ts +17 -0
  23. package/dist/components/data/crud-sheet/CrudSheet.d.ts.map +1 -0
  24. package/dist/components/data/crud-sheet/CrudSheet.js +679 -0
  25. package/dist/components/data/crud-sheet/CrudSheet.js.map +6 -0
  26. package/dist/components/data/crud-sheet/CrudSheetColumn.d.ts +5 -0
  27. package/dist/components/data/crud-sheet/CrudSheetColumn.d.ts.map +1 -0
  28. package/dist/components/data/crud-sheet/CrudSheetColumn.js +29 -0
  29. package/dist/components/data/crud-sheet/CrudSheetColumn.js.map +6 -0
  30. package/dist/components/data/crud-sheet/CrudSheetFilter.d.ts +7 -0
  31. package/dist/components/data/crud-sheet/CrudSheetFilter.d.ts.map +1 -0
  32. package/dist/components/data/crud-sheet/CrudSheetFilter.js +14 -0
  33. package/dist/components/data/crud-sheet/CrudSheetFilter.js.map +6 -0
  34. package/dist/components/data/crud-sheet/CrudSheetHeader.d.ts +7 -0
  35. package/dist/components/data/crud-sheet/CrudSheetHeader.d.ts.map +1 -0
  36. package/dist/components/data/crud-sheet/CrudSheetHeader.js +14 -0
  37. package/dist/components/data/crud-sheet/CrudSheetHeader.js.map +6 -0
  38. package/dist/components/data/crud-sheet/CrudSheetTools.d.ts +7 -0
  39. package/dist/components/data/crud-sheet/CrudSheetTools.d.ts.map +1 -0
  40. package/dist/components/data/crud-sheet/CrudSheetTools.js +14 -0
  41. package/dist/components/data/crud-sheet/CrudSheetTools.js.map +6 -0
  42. package/dist/components/data/crud-sheet/types.d.ts +109 -0
  43. package/dist/components/data/crud-sheet/types.d.ts.map +1 -0
  44. package/dist/components/data/crud-sheet/types.js +1 -0
  45. package/dist/components/data/crud-sheet/types.js.map +6 -0
  46. package/dist/components/data/kanban/Kanban.d.ts.map +1 -1
  47. package/dist/components/data/kanban/Kanban.js +137 -138
  48. package/dist/components/data/kanban/Kanban.js.map +2 -2
  49. package/dist/components/data/kanban/KanbanContext.d.ts +5 -1
  50. package/dist/components/data/kanban/KanbanContext.d.ts.map +1 -1
  51. package/dist/components/data/kanban/KanbanContext.js.map +1 -1
  52. package/dist/components/data/list/ListItem.d.ts.map +1 -1
  53. package/dist/components/data/list/ListItem.js +109 -99
  54. package/dist/components/data/list/ListItem.js.map +2 -2
  55. package/dist/components/data/sheet/DataSheet.css +28 -10
  56. package/dist/components/data/sheet/DataSheet.js +1 -1
  57. package/dist/components/data/sheet/DataSheet.js.map +2 -2
  58. package/dist/components/data/sheet/DataSheet.styles.d.ts.map +1 -1
  59. package/dist/components/data/sheet/DataSheet.styles.js +1 -1
  60. package/dist/components/data/sheet/DataSheet.styles.js.map +1 -1
  61. package/dist/components/disclosure/Dialog.d.ts +16 -10
  62. package/dist/components/disclosure/Dialog.d.ts.map +1 -1
  63. package/dist/components/disclosure/Dialog.js +126 -91
  64. package/dist/components/disclosure/Dialog.js.map +2 -2
  65. package/dist/components/disclosure/DialogContext.d.ts +2 -4
  66. package/dist/components/disclosure/DialogContext.d.ts.map +1 -1
  67. package/dist/components/disclosure/DialogContext.js.map +1 -1
  68. package/dist/components/disclosure/DialogProvider.d.ts.map +1 -1
  69. package/dist/components/disclosure/DialogProvider.js +14 -9
  70. package/dist/components/disclosure/DialogProvider.js.map +2 -2
  71. package/dist/components/disclosure/Dropdown.d.ts +46 -22
  72. package/dist/components/disclosure/Dropdown.d.ts.map +1 -1
  73. package/dist/components/disclosure/Dropdown.js +100 -65
  74. package/dist/components/disclosure/Dropdown.js.map +2 -2
  75. package/dist/components/feedback/notification/NotificationBanner.d.ts.map +1 -1
  76. package/dist/components/feedback/notification/NotificationBanner.js +3 -3
  77. package/dist/components/feedback/notification/NotificationBanner.js.map +1 -1
  78. package/dist/components/feedback/notification/NotificationBell.d.ts.map +1 -1
  79. package/dist/components/feedback/notification/NotificationBell.js +84 -84
  80. package/dist/components/feedback/notification/NotificationBell.js.map +2 -2
  81. package/dist/components/form-control/Invalid.js +1 -1
  82. package/dist/components/form-control/combobox/Combobox.d.ts +6 -3
  83. package/dist/components/form-control/combobox/Combobox.d.ts.map +1 -1
  84. package/dist/components/form-control/combobox/Combobox.js +150 -168
  85. package/dist/components/form-control/combobox/Combobox.js.map +2 -2
  86. package/dist/components/form-control/combobox/ComboboxContext.d.ts +3 -0
  87. package/dist/components/form-control/combobox/ComboboxContext.d.ts.map +1 -1
  88. package/dist/components/form-control/combobox/ComboboxContext.js.map +1 -1
  89. package/dist/components/form-control/date-range-picker/DateRangePicker.d.ts +0 -2
  90. package/dist/components/form-control/date-range-picker/DateRangePicker.d.ts.map +1 -1
  91. package/dist/components/form-control/date-range-picker/DateRangePicker.js +9 -17
  92. package/dist/components/form-control/date-range-picker/DateRangePicker.js.map +2 -2
  93. package/dist/components/form-control/field/DatePicker.d.ts.map +1 -1
  94. package/dist/components/form-control/field/DatePicker.js +3 -2
  95. package/dist/components/form-control/field/DatePicker.js.map +2 -2
  96. package/dist/components/form-control/field/DateTimePicker.d.ts.map +1 -1
  97. package/dist/components/form-control/field/DateTimePicker.js +3 -2
  98. package/dist/components/form-control/field/DateTimePicker.js.map +2 -2
  99. package/dist/components/form-control/field/Field.styles.d.ts.map +1 -1
  100. package/dist/components/form-control/field/Field.styles.js +2 -1
  101. package/dist/components/form-control/field/Field.styles.js.map +1 -1
  102. package/dist/components/form-control/field/NumberInput.d.ts +15 -5
  103. package/dist/components/form-control/field/NumberInput.d.ts.map +1 -1
  104. package/dist/components/form-control/field/NumberInput.js +181 -141
  105. package/dist/components/form-control/field/NumberInput.js.map +2 -2
  106. package/dist/components/form-control/field/TextInput.d.ts +9 -5
  107. package/dist/components/form-control/field/TextInput.d.ts.map +1 -1
  108. package/dist/components/form-control/field/TextInput.js +199 -154
  109. package/dist/components/form-control/field/TextInput.js.map +2 -2
  110. package/dist/components/form-control/field/TimePicker.d.ts.map +1 -1
  111. package/dist/components/form-control/field/TimePicker.js +3 -2
  112. package/dist/components/form-control/field/TimePicker.js.map +2 -2
  113. package/dist/components/form-control/select/Select.d.ts +3 -3
  114. package/dist/components/form-control/select/Select.d.ts.map +1 -1
  115. package/dist/components/form-control/select/Select.js +116 -100
  116. package/dist/components/form-control/select/Select.js.map +2 -2
  117. package/dist/components/form-control/select/SelectContext.d.ts +9 -1
  118. package/dist/components/form-control/select/SelectContext.d.ts.map +1 -1
  119. package/dist/components/form-control/select/SelectContext.js.map +1 -1
  120. package/dist/components/form-control/select/SelectItem.d.ts.map +1 -1
  121. package/dist/components/form-control/select/SelectItem.js +77 -67
  122. package/dist/components/form-control/select/SelectItem.js.map +2 -2
  123. package/dist/components/form-control/state-preset/StatePreset.d.ts.map +1 -1
  124. package/dist/components/form-control/state-preset/StatePreset.js +1 -1
  125. package/dist/components/form-control/state-preset/StatePreset.js.map +1 -1
  126. package/dist/components/layout/topbar/Topbar.d.ts +2 -0
  127. package/dist/components/layout/topbar/Topbar.d.ts.map +1 -1
  128. package/dist/components/layout/topbar/Topbar.js +2 -0
  129. package/dist/components/layout/topbar/Topbar.js.map +2 -2
  130. package/dist/components/layout/topbar/TopbarActions.d.ts +3 -0
  131. package/dist/components/layout/topbar/TopbarActions.d.ts.map +1 -0
  132. package/dist/components/layout/topbar/TopbarActions.js +17 -0
  133. package/dist/components/layout/topbar/TopbarActions.js.map +6 -0
  134. package/dist/components/layout/topbar/TopbarContainer.d.ts +1 -1
  135. package/dist/components/layout/topbar/TopbarContainer.d.ts.map +1 -1
  136. package/dist/components/layout/topbar/TopbarContainer.js +21 -12
  137. package/dist/components/layout/topbar/TopbarContainer.js.map +2 -2
  138. package/dist/components/layout/topbar/TopbarContext.d.ts +9 -0
  139. package/dist/components/layout/topbar/TopbarContext.d.ts.map +1 -0
  140. package/dist/components/layout/topbar/TopbarContext.js +29 -0
  141. package/dist/components/layout/topbar/TopbarContext.js.map +6 -0
  142. package/dist/components/layout/topbar/TopbarMenu.d.ts.map +1 -1
  143. package/dist/components/layout/topbar/TopbarMenu.js +63 -57
  144. package/dist/components/layout/topbar/TopbarMenu.js.map +2 -2
  145. package/dist/components/layout/topbar/TopbarUser.d.ts.map +1 -1
  146. package/dist/components/layout/topbar/TopbarUser.js +53 -54
  147. package/dist/components/layout/topbar/TopbarUser.js.map +2 -2
  148. package/dist/hooks/createControllableStore.d.ts +29 -0
  149. package/dist/hooks/createControllableStore.d.ts.map +1 -0
  150. package/dist/hooks/createControllableStore.js +19 -0
  151. package/dist/hooks/createControllableStore.js.map +6 -0
  152. package/dist/index.d.ts +6 -1
  153. package/dist/index.d.ts.map +1 -1
  154. package/dist/index.js +7 -2
  155. package/dist/index.js.map +1 -1
  156. package/dist/styles/patterns.styles.d.ts.map +1 -1
  157. package/dist/styles/patterns.styles.js +7 -1
  158. package/dist/styles/patterns.styles.js.map +1 -1
  159. package/docs/data-components.md +428 -0
  160. package/docs/disclosure.md +65 -35
  161. package/docs/form-controls.md +18 -3
  162. package/docs/helpers.md +0 -39
  163. package/docs/hooks.md +39 -0
  164. package/docs/layout.md +70 -1
  165. package/package.json +4 -3
  166. package/src/components/data/crud-detail/CrudDetail.tsx +346 -0
  167. package/src/components/data/crud-detail/CrudDetailAfter.tsx +19 -0
  168. package/src/components/data/crud-detail/CrudDetailBefore.tsx +19 -0
  169. package/src/components/data/crud-detail/CrudDetailTools.tsx +19 -0
  170. package/src/components/data/crud-detail/types.ts +58 -0
  171. package/src/components/data/crud-sheet/CrudSheet.tsx +628 -0
  172. package/src/components/data/crud-sheet/CrudSheetColumn.tsx +34 -0
  173. package/src/components/data/crud-sheet/CrudSheetFilter.tsx +21 -0
  174. package/src/components/data/crud-sheet/CrudSheetHeader.tsx +19 -0
  175. package/src/components/data/crud-sheet/CrudSheetTools.tsx +21 -0
  176. package/src/components/data/crud-sheet/types.ts +133 -0
  177. package/src/components/data/kanban/Kanban.tsx +72 -65
  178. package/src/components/data/kanban/KanbanContext.ts +7 -1
  179. package/src/components/data/list/ListItem.tsx +31 -18
  180. package/src/components/data/sheet/DataSheet.css +28 -10
  181. package/src/components/data/sheet/DataSheet.styles.ts +1 -1
  182. package/src/components/data/sheet/DataSheet.tsx +1 -1
  183. package/src/components/disclosure/Dialog.tsx +143 -105
  184. package/src/components/disclosure/DialogContext.ts +2 -4
  185. package/src/components/disclosure/DialogProvider.tsx +4 -2
  186. package/src/components/disclosure/Dropdown.tsx +174 -86
  187. package/src/components/feedback/notification/NotificationBanner.tsx +3 -9
  188. package/src/components/feedback/notification/NotificationBell.tsx +51 -57
  189. package/src/components/form-control/Invalid.tsx +1 -1
  190. package/src/components/form-control/combobox/Combobox.tsx +109 -133
  191. package/src/components/form-control/combobox/ComboboxContext.ts +4 -1
  192. package/src/components/form-control/date-range-picker/DateRangePicker.tsx +6 -16
  193. package/src/components/form-control/field/DatePicker.tsx +4 -1
  194. package/src/components/form-control/field/DateTimePicker.tsx +3 -0
  195. package/src/components/form-control/field/Field.styles.ts +1 -0
  196. package/src/components/form-control/field/NumberInput.tsx +131 -86
  197. package/src/components/form-control/field/TextInput.tsx +139 -88
  198. package/src/components/form-control/field/TimePicker.tsx +3 -0
  199. package/src/components/form-control/select/Select.tsx +85 -67
  200. package/src/components/form-control/select/SelectContext.ts +12 -1
  201. package/src/components/form-control/select/SelectItem.tsx +39 -18
  202. package/src/components/form-control/state-preset/StatePreset.tsx +1 -0
  203. package/src/components/layout/topbar/Topbar.tsx +3 -0
  204. package/src/components/layout/topbar/TopbarActions.tsx +8 -0
  205. package/src/components/layout/topbar/TopbarContainer.tsx +9 -5
  206. package/src/components/layout/topbar/TopbarContext.ts +36 -0
  207. package/src/components/layout/topbar/TopbarMenu.tsx +52 -55
  208. package/src/components/layout/topbar/TopbarUser.tsx +28 -31
  209. package/src/hooks/createControllableStore.ts +47 -0
  210. package/src/index.ts +6 -1
  211. package/src/styles/patterns.styles.ts +7 -1
  212. package/tailwind.css +4 -0
  213. package/dist/helpers/splitSlots.d.ts +0 -25
  214. package/dist/helpers/splitSlots.d.ts.map +0 -1
  215. package/dist/helpers/splitSlots.js +0 -25
  216. package/dist/helpers/splitSlots.js.map +0 -6
  217. package/dist/hooks/createItemTemplate.d.ts +0 -17
  218. package/dist/hooks/createItemTemplate.d.ts.map +0 -1
  219. package/dist/hooks/createItemTemplate.js +0 -40
  220. package/dist/hooks/createItemTemplate.js.map +0 -6
  221. package/src/helpers/splitSlots.ts +0 -51
  222. package/src/hooks/createItemTemplate.tsx +0 -42
@@ -0,0 +1,679 @@
1
+ import { template as _$template } from "solid-js/web";
2
+ import { delegateEvents as _$delegateEvents } from "solid-js/web";
3
+ import { use as _$use } from "solid-js/web";
4
+ import { insert as _$insert } from "solid-js/web";
5
+ import { createComponent as _$createComponent } from "solid-js/web";
6
+ import { memo as _$memo } from "solid-js/web";
7
+ var _tmpl$ = /* @__PURE__ */ _$template(`<button class="flex items-center px-2 text-base-400 hover:text-base-600">`), _tmpl$2 = /* @__PURE__ */ _$template(`<div class="flex gap-2 p-2 pb-0">`), _tmpl$3 = /* @__PURE__ */ _$template(`<form class="flex-1 overflow-hidden p-2 pt-1">`), _tmpl$4 = /* @__PURE__ */ _$template(`<div class="flex gap-2 border-t p-2"><div class=flex-1>`), _tmpl$5 = /* @__PURE__ */ _$template(`<form class=p-2>`), _tmpl$6 = /* @__PURE__ */ _$template(`<div class="flex items-center justify-center px-1 py-0.5">`);
8
+ import { children, createEffect, createMemo, createSignal, For, Show, splitProps, useContext } from "solid-js";
9
+ import { createStore, produce, reconcile } from "solid-js/store";
10
+ import { createControllableStore } from "../../../hooks/createControllableStore.js";
11
+ import { objClone } from "@simplysm/core-common";
12
+ import "@simplysm/core-common";
13
+ import { DataSheet } from "../sheet/DataSheet.js";
14
+ import { DataSheetColumn } from "../sheet/DataSheetColumn.js";
15
+ import { BusyContainer } from "../../feedback/busy/BusyContainer.js";
16
+ import { useNotification } from "../../feedback/notification/NotificationContext.js";
17
+ import { Button } from "../../form-control/Button.js";
18
+ import { Icon } from "../../display/Icon.js";
19
+ import { FormGroup } from "../../layout/FormGroup.js";
20
+ import { TopbarContext, createTopbarActions } from "../../layout/topbar/TopbarContext.js";
21
+ import { useDialogInstance } from "../../disclosure/DialogInstanceContext.js";
22
+ import { Dialog } from "../../disclosure/Dialog.js";
23
+ import { Link } from "../../display/Link.js";
24
+ import { createEventListener } from "@solid-primitives/event-listener";
25
+ import clsx from "clsx";
26
+ import { IconDeviceFloppy, IconFileExcel, IconPlus, IconRefresh, IconSearch, IconTrash, IconTrashOff, IconUpload } from "@tabler/icons-solidjs";
27
+ import { isCrudSheetColumnDef, CrudSheetColumn } from "./CrudSheetColumn.js";
28
+ import { isCrudSheetFilterDef, CrudSheetFilter } from "./CrudSheetFilter.js";
29
+ import { isCrudSheetToolsDef, CrudSheetTools } from "./CrudSheetTools.js";
30
+ import { isCrudSheetHeaderDef, CrudSheetHeader } from "./CrudSheetHeader.js";
31
+ const CrudSheetBase = (props) => {
32
+ const [local, _rest] = splitProps(props, ["search", "getItemKey", "persistKey", "itemsPerPage", "editable", "itemEditable", "itemDeletable", "filterInitial", "items", "onItemsChange", "inlineEdit", "modalEdit", "excel", "selectMode", "onSelect", "hideAutoTools", "class", "children"]);
33
+ const noti = useNotification();
34
+ const topbarCtx = useContext(TopbarContext);
35
+ const dialogInstance = useDialogInstance();
36
+ const isModal = dialogInstance !== void 0;
37
+ const isSelectMode = () => local.selectMode != null;
38
+ const canEdit = () => isSelectMode() ? false : local.editable ?? true;
39
+ const resolved = children(() => local.children);
40
+ const defs = createMemo(() => {
41
+ const arr = resolved.toArray();
42
+ return {
43
+ filter: arr.find(isCrudSheetFilterDef),
44
+ columns: arr.filter(isCrudSheetColumnDef),
45
+ tools: arr.find(isCrudSheetToolsDef),
46
+ header: arr.find(isCrudSheetHeaderDef)
47
+ };
48
+ });
49
+ const [items, setItems] = createControllableStore({
50
+ value: () => local.items ?? [],
51
+ onChange: () => local.onItemsChange
52
+ });
53
+ let originalItems = [];
54
+ const [filter, setFilter] = createStore(local.filterInitial ?? {});
55
+ const [lastFilter, setLastFilter] = createSignal(objClone(filter));
56
+ const [page, setPage] = createSignal(1);
57
+ const [totalPageCount, setTotalPageCount] = createSignal(0);
58
+ const [sorts, setSorts] = createSignal([]);
59
+ const [busyCount, setBusyCount] = createSignal(0);
60
+ const [ready, setReady] = createSignal(false);
61
+ const [selectedItems, setSelectedItems] = createSignal([]);
62
+ let formRef;
63
+ createEffect(() => {
64
+ const currLastFilter = lastFilter();
65
+ const currSorts = sorts();
66
+ const currPage = page();
67
+ queueMicrotask(async () => {
68
+ setBusyCount((c) => c + 1);
69
+ await noti.try(async () => {
70
+ await refresh(currLastFilter, currSorts, currPage);
71
+ }, "\uC870\uD68C \uC2E4\uD328");
72
+ setBusyCount((c) => c - 1);
73
+ setReady(true);
74
+ });
75
+ });
76
+ async function refresh(currLastFilter, currSorts, currPage) {
77
+ const usePagination = local.itemsPerPage != null;
78
+ const result = await local.search(currLastFilter, usePagination ? currPage : 0, currSorts);
79
+ setItems(reconcile(result.items));
80
+ originalItems = objClone(result.items);
81
+ setTotalPageCount(result.pageCount ?? 0);
82
+ }
83
+ function getItemDiffs() {
84
+ return items.oneWayDiffs(originalItems, (item) => {
85
+ return local.getItemKey(item);
86
+ });
87
+ }
88
+ function handleFilterSubmit(e) {
89
+ e.preventDefault();
90
+ setPage(1);
91
+ setLastFilter(() => objClone(filter));
92
+ }
93
+ function handleRefresh() {
94
+ setLastFilter(() => ({
95
+ ...lastFilter()
96
+ }));
97
+ }
98
+ function handleAddRow() {
99
+ if (!local.inlineEdit) return;
100
+ setItems(produce((draft) => {
101
+ draft.unshift(local.inlineEdit.newItem());
102
+ }));
103
+ }
104
+ function handleToggleDelete(item, index) {
105
+ var _a, _b;
106
+ if (!(((_a = local.itemDeletable) == null ? void 0 : _a.call(local, item)) ?? true)) return;
107
+ if (((_b = local.inlineEdit) == null ? void 0 : _b.deleteProp) == null) return;
108
+ const dp = local.inlineEdit.deleteProp;
109
+ if (local.getItemKey(item) == null) {
110
+ setItems(produce((draft) => {
111
+ draft.splice(index, 1);
112
+ }));
113
+ return;
114
+ }
115
+ setItems(index, dp, !item[dp]);
116
+ }
117
+ async function handleSave() {
118
+ if (busyCount() > 0) return;
119
+ if (!canEdit()) return;
120
+ if (!local.inlineEdit) return;
121
+ const diffs = getItemDiffs();
122
+ if (diffs.length === 0) {
123
+ noti.info("\uC548\uB0B4", "\uBCC0\uACBD\uC0AC\uD56D\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.");
124
+ return;
125
+ }
126
+ const currLastFilter = lastFilter();
127
+ const currSorts = sorts();
128
+ const currPage = page();
129
+ setBusyCount((c) => c + 1);
130
+ await noti.try(async () => {
131
+ await local.inlineEdit.submit(diffs);
132
+ noti.success("\uC800\uC7A5 \uC644\uB8CC", "\uC800\uC7A5\uB418\uC5C8\uC2B5\uB2C8\uB2E4.");
133
+ await refresh(currLastFilter, currSorts, currPage);
134
+ }, "\uC800\uC7A5 \uC2E4\uD328");
135
+ setBusyCount((c) => c - 1);
136
+ }
137
+ async function handleFormSubmit(e) {
138
+ e.preventDefault();
139
+ await handleSave();
140
+ }
141
+ async function handleEditItem(item) {
142
+ if (!local.modalEdit) return;
143
+ const result = await local.modalEdit.editItem(item);
144
+ if (!result) return;
145
+ setBusyCount((c) => c + 1);
146
+ await noti.try(async () => {
147
+ await refresh(lastFilter(), sorts(), page());
148
+ }, "\uC870\uD68C \uC2E4\uD328");
149
+ setBusyCount((c) => c - 1);
150
+ }
151
+ async function handleDeleteItems() {
152
+ var _a;
153
+ if (!((_a = local.modalEdit) == null ? void 0 : _a.deleteItems)) return;
154
+ const result = await local.modalEdit.deleteItems(selectedItems());
155
+ if (!result) return;
156
+ setBusyCount((c) => c + 1);
157
+ await noti.try(async () => {
158
+ await refresh(lastFilter(), sorts(), page());
159
+ noti.success("\uC0AD\uC81C \uC644\uB8CC", "\uC0AD\uC81C\uB418\uC5C8\uC2B5\uB2C8\uB2E4.");
160
+ }, "\uC0AD\uC81C \uC2E4\uD328");
161
+ setBusyCount((c) => c - 1);
162
+ }
163
+ async function handleExcelDownload() {
164
+ if (!local.excel) return;
165
+ setBusyCount((c) => c + 1);
166
+ await noti.try(async () => {
167
+ const result = await local.search(lastFilter(), 0, sorts());
168
+ await local.excel.download(result.items);
169
+ }, "\uC5D1\uC140 \uB2E4\uC6B4\uB85C\uB4DC \uC2E4\uD328");
170
+ setBusyCount((c) => c - 1);
171
+ }
172
+ function handleExcelUpload() {
173
+ var _a;
174
+ if (!((_a = local.excel) == null ? void 0 : _a.upload)) return;
175
+ const input = document.createElement("input");
176
+ input.type = "file";
177
+ input.accept = ".xlsx";
178
+ input.onchange = async () => {
179
+ var _a2;
180
+ const file = (_a2 = input.files) == null ? void 0 : _a2[0];
181
+ if (file == null) return;
182
+ setBusyCount((c) => c + 1);
183
+ await noti.try(async () => {
184
+ await local.excel.upload(file);
185
+ noti.success("\uC644\uB8CC", "\uC5D1\uC140 \uC5C5\uB85C\uB4DC\uAC00 \uC644\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4.");
186
+ await refresh(lastFilter(), sorts(), page());
187
+ }, "\uC5D1\uC140 \uC5C5\uB85C\uB4DC \uC2E4\uD328");
188
+ setBusyCount((c) => c - 1);
189
+ };
190
+ input.click();
191
+ }
192
+ function handleSelectConfirm() {
193
+ var _a;
194
+ (_a = local.onSelect) == null ? void 0 : _a.call(local, {
195
+ items: selectedItems(),
196
+ keys: selectedItems().map((item) => local.getItemKey(item)).filter((k) => k != null)
197
+ });
198
+ }
199
+ function handleSelectCancel() {
200
+ var _a;
201
+ (_a = local.onSelect) == null ? void 0 : _a.call(local, {
202
+ items: [],
203
+ keys: []
204
+ });
205
+ }
206
+ createEventListener(document, "keydown", (e) => {
207
+ if (e.ctrlKey && e.key === "s" && !isSelectMode()) {
208
+ e.preventDefault();
209
+ formRef == null ? void 0 : formRef.requestSubmit();
210
+ }
211
+ if (e.ctrlKey && e.altKey && e.key === "l") {
212
+ e.preventDefault();
213
+ handleRefresh();
214
+ }
215
+ });
216
+ if (topbarCtx) {
217
+ createTopbarActions(() => [_$createComponent(Show, {
218
+ get when() {
219
+ return _$memo(() => !!canEdit())() && local.inlineEdit;
220
+ },
221
+ get children() {
222
+ return _$createComponent(Button, {
223
+ size: "lg",
224
+ variant: "ghost",
225
+ theme: "primary",
226
+ onClick: () => formRef == null ? void 0 : formRef.requestSubmit(),
227
+ get children() {
228
+ return [_$createComponent(Icon, {
229
+ icon: IconDeviceFloppy,
230
+ "class": "mr-1"
231
+ }), "\uC800\uC7A5"];
232
+ }
233
+ });
234
+ }
235
+ }), _$createComponent(Button, {
236
+ size: "lg",
237
+ variant: "ghost",
238
+ theme: "info",
239
+ onClick: handleRefresh,
240
+ get children() {
241
+ return [_$createComponent(Icon, {
242
+ icon: IconRefresh,
243
+ "class": "mr-1"
244
+ }), "\uC0C8\uB85C\uACE0\uCE68"];
245
+ }
246
+ })]);
247
+ }
248
+ const ctx = {
249
+ items: () => items,
250
+ selectedItems,
251
+ page,
252
+ sorts,
253
+ busy: () => busyCount() > 0,
254
+ hasChanges: () => {
255
+ if (!local.inlineEdit) return false;
256
+ return getItemDiffs().length > 0;
257
+ },
258
+ save: handleSave,
259
+ refresh: async () => {
260
+ handleRefresh();
261
+ await Promise.resolve();
262
+ },
263
+ addItem: handleAddRow,
264
+ setPage,
265
+ setSorts
266
+ };
267
+ const deleteProp = () => {
268
+ var _a;
269
+ return (_a = local.inlineEdit) == null ? void 0 : _a.deleteProp;
270
+ };
271
+ return [_$createComponent(Show, {
272
+ when: isModal,
273
+ get children() {
274
+ return _$createComponent(Dialog.Action, {
275
+ get children() {
276
+ var _el$ = _tmpl$();
277
+ _el$.$$click = handleRefresh;
278
+ _$insert(_el$, _$createComponent(Icon, {
279
+ icon: IconRefresh
280
+ }));
281
+ return _el$;
282
+ }
283
+ });
284
+ }
285
+ }), _$createComponent(BusyContainer, {
286
+ get ready() {
287
+ return ready();
288
+ },
289
+ get busy() {
290
+ return busyCount() > 0;
291
+ },
292
+ get ["class"]() {
293
+ return clsx("flex h-full flex-col", local.class);
294
+ },
295
+ get children() {
296
+ return [_$createComponent(Show, {
297
+ get when() {
298
+ return _$memo(() => !!(!isModal && !topbarCtx && canEdit()))() && local.inlineEdit;
299
+ },
300
+ get children() {
301
+ var _el$2 = _tmpl$2();
302
+ _$insert(_el$2, _$createComponent(Button, {
303
+ size: "sm",
304
+ theme: "primary",
305
+ variant: "ghost",
306
+ onClick: () => formRef == null ? void 0 : formRef.requestSubmit(),
307
+ get children() {
308
+ return [_$createComponent(Icon, {
309
+ icon: IconDeviceFloppy,
310
+ "class": "mr-1"
311
+ }), "\uC800\uC7A5"];
312
+ }
313
+ }), null);
314
+ _$insert(_el$2, _$createComponent(Button, {
315
+ size: "sm",
316
+ theme: "info",
317
+ variant: "ghost",
318
+ onClick: handleRefresh,
319
+ get children() {
320
+ return [_$createComponent(Icon, {
321
+ icon: IconRefresh,
322
+ "class": "mr-1"
323
+ }), "\uC0C8\uB85C\uACE0\uCE68"];
324
+ }
325
+ }), null);
326
+ return _el$2;
327
+ }
328
+ }), _$createComponent(Show, {
329
+ get when() {
330
+ return defs().header;
331
+ },
332
+ children: (headerDef) => headerDef().children
333
+ }), _$createComponent(Show, {
334
+ get when() {
335
+ return defs().filter;
336
+ },
337
+ children: (filterDef) => (() => {
338
+ var _el$7 = _tmpl$5();
339
+ _el$7.addEventListener("submit", handleFilterSubmit);
340
+ _$insert(_el$7, _$createComponent(FormGroup, {
341
+ inline: true,
342
+ get children() {
343
+ return [_$createComponent(FormGroup.Item, {
344
+ get children() {
345
+ return _$createComponent(Button, {
346
+ type: "submit",
347
+ theme: "info",
348
+ variant: "solid",
349
+ get children() {
350
+ return [_$createComponent(Icon, {
351
+ icon: IconSearch,
352
+ "class": "mr-1"
353
+ }), "\uC870\uD68C"];
354
+ }
355
+ });
356
+ }
357
+ }), _$memo(() => filterDef().children(filter, setFilter))];
358
+ }
359
+ }));
360
+ return _el$7;
361
+ })()
362
+ }), _$createComponent(Show, {
363
+ get when() {
364
+ return !isSelectMode();
365
+ },
366
+ get children() {
367
+ var _el$3 = _tmpl$2();
368
+ _$insert(_el$3, _$createComponent(Show, {
369
+ get when() {
370
+ return !local.hideAutoTools;
371
+ },
372
+ get children() {
373
+ return [_$createComponent(Show, {
374
+ get when() {
375
+ return _$memo(() => !!canEdit())() && local.inlineEdit;
376
+ },
377
+ get children() {
378
+ return _$createComponent(Button, {
379
+ size: "sm",
380
+ theme: "primary",
381
+ variant: "ghost",
382
+ onClick: handleAddRow,
383
+ get children() {
384
+ return [_$createComponent(Icon, {
385
+ icon: IconPlus,
386
+ "class": "mr-1"
387
+ }), "\uD589 \uCD94\uAC00"];
388
+ }
389
+ });
390
+ }
391
+ }), _$createComponent(Show, {
392
+ get when() {
393
+ return _$memo(() => !!canEdit())() && local.modalEdit;
394
+ },
395
+ get children() {
396
+ return _$createComponent(Button, {
397
+ size: "sm",
398
+ theme: "primary",
399
+ variant: "ghost",
400
+ onClick: () => void handleEditItem(),
401
+ get children() {
402
+ return [_$createComponent(Icon, {
403
+ icon: IconPlus,
404
+ "class": "mr-1"
405
+ }), "\uB4F1\uB85D"];
406
+ }
407
+ });
408
+ }
409
+ }), _$createComponent(Show, {
410
+ get when() {
411
+ var _a;
412
+ return _$memo(() => !!canEdit())() && ((_a = local.modalEdit) == null ? void 0 : _a.deleteItems);
413
+ },
414
+ get children() {
415
+ return _$createComponent(Button, {
416
+ size: "sm",
417
+ theme: "danger",
418
+ variant: "ghost",
419
+ onClick: handleDeleteItems,
420
+ get disabled() {
421
+ return selectedItems().length === 0 || !selectedItems().some((item) => {
422
+ var _a;
423
+ return ((_a = local.itemDeletable) == null ? void 0 : _a.call(local, item)) ?? true;
424
+ });
425
+ },
426
+ get children() {
427
+ return [_$createComponent(Icon, {
428
+ icon: IconTrash,
429
+ "class": "mr-1"
430
+ }), "\uC120\uD0DD \uC0AD\uC81C"];
431
+ }
432
+ });
433
+ }
434
+ }), _$createComponent(Show, {
435
+ get when() {
436
+ var _a;
437
+ return _$memo(() => !!canEdit())() && ((_a = local.excel) == null ? void 0 : _a.upload);
438
+ },
439
+ get children() {
440
+ return _$createComponent(Button, {
441
+ size: "sm",
442
+ theme: "success",
443
+ variant: "ghost",
444
+ onClick: handleExcelUpload,
445
+ get children() {
446
+ return [_$createComponent(Icon, {
447
+ icon: IconUpload,
448
+ "class": "mr-1"
449
+ }), "\uC5D1\uC140 \uC5C5\uB85C\uB4DC"];
450
+ }
451
+ });
452
+ }
453
+ }), _$createComponent(Show, {
454
+ get when() {
455
+ return local.excel;
456
+ },
457
+ get children() {
458
+ return _$createComponent(Button, {
459
+ size: "sm",
460
+ theme: "success",
461
+ variant: "ghost",
462
+ onClick: handleExcelDownload,
463
+ get children() {
464
+ return [_$createComponent(Icon, {
465
+ icon: IconFileExcel,
466
+ "class": "mr-1"
467
+ }), "\uC5D1\uC140 \uB2E4\uC6B4\uB85C\uB4DC"];
468
+ }
469
+ });
470
+ }
471
+ })];
472
+ }
473
+ }), null);
474
+ _$insert(_el$3, _$createComponent(Show, {
475
+ get when() {
476
+ return defs().tools;
477
+ },
478
+ children: (toolsDef) => toolsDef().children(ctx)
479
+ }), null);
480
+ return _el$3;
481
+ }
482
+ }), (() => {
483
+ var _el$4 = _tmpl$3();
484
+ _el$4.addEventListener("submit", handleFormSubmit);
485
+ var _ref$ = formRef;
486
+ typeof _ref$ === "function" ? _$use(_ref$, _el$4) : formRef = _el$4;
487
+ _$insert(_el$4, _$createComponent(DataSheet, {
488
+ "class": "h-full",
489
+ items,
490
+ get persistKey() {
491
+ return _$memo(() => local.persistKey != null)() ? `${local.persistKey}-sheet` : void 0;
492
+ },
493
+ get page() {
494
+ return _$memo(() => local.itemsPerPage != null)() ? page() : void 0;
495
+ },
496
+ onPageChange: setPage,
497
+ get totalPageCount() {
498
+ return totalPageCount();
499
+ },
500
+ get itemsPerPage() {
501
+ return local.itemsPerPage;
502
+ },
503
+ get sorts() {
504
+ return sorts();
505
+ },
506
+ onSortsChange: setSorts,
507
+ get selectMode() {
508
+ var _a;
509
+ return _$memo(() => !!isSelectMode())() ? local.selectMode === "multi" ? "multiple" : "single" : ((_a = local.modalEdit) == null ? void 0 : _a.deleteItems) != null ? "multiple" : void 0;
510
+ },
511
+ get selectedItems() {
512
+ return selectedItems();
513
+ },
514
+ onSelectedItemsChange: setSelectedItems,
515
+ get autoSelect() {
516
+ return isSelectMode() && local.selectMode === "single" ? "click" : void 0;
517
+ },
518
+ cellClass: (item, _colKey) => {
519
+ const dp = deleteProp();
520
+ if (dp != null && Boolean(item[dp])) {
521
+ return clsx("line-through");
522
+ }
523
+ return void 0;
524
+ },
525
+ get children() {
526
+ return [_$createComponent(Show, {
527
+ get when() {
528
+ return _$memo(() => !!(deleteProp() != null && canEdit()))() ? deleteProp() : void 0;
529
+ },
530
+ children: (dp) => _$createComponent(DataSheetColumn, {
531
+ key: "__delete",
532
+ header: "",
533
+ fixed: true,
534
+ sortable: false,
535
+ resizable: false,
536
+ children: (dsCtx) => (() => {
537
+ var _el$8 = _tmpl$6();
538
+ _$insert(_el$8, _$createComponent(Link, {
539
+ theme: "danger",
540
+ get disabled() {
541
+ var _a;
542
+ return !(((_a = local.itemDeletable) == null ? void 0 : _a.call(local, dsCtx.item)) ?? true);
543
+ },
544
+ onClick: () => handleToggleDelete(dsCtx.item, dsCtx.index),
545
+ get children() {
546
+ return _$createComponent(Icon, {
547
+ get icon() {
548
+ return Boolean(dsCtx.item[dp()]) ? IconTrashOff : IconTrash;
549
+ }
550
+ });
551
+ }
552
+ }));
553
+ return _el$8;
554
+ })()
555
+ })
556
+ }), _$createComponent(For, {
557
+ get each() {
558
+ return defs().columns;
559
+ },
560
+ children: (col) => _$createComponent(DataSheetColumn, {
561
+ get key() {
562
+ return col.key;
563
+ },
564
+ get header() {
565
+ return col.header;
566
+ },
567
+ get headerContent() {
568
+ return col.headerContent;
569
+ },
570
+ get headerStyle() {
571
+ return col.headerStyle;
572
+ },
573
+ get summary() {
574
+ return col.summary;
575
+ },
576
+ get tooltip() {
577
+ return col.tooltip;
578
+ },
579
+ get fixed() {
580
+ return col.fixed;
581
+ },
582
+ get hidden() {
583
+ return col.hidden;
584
+ },
585
+ get collapse() {
586
+ return col.collapse;
587
+ },
588
+ get width() {
589
+ return col.width;
590
+ },
591
+ get ["class"]() {
592
+ return col.class;
593
+ },
594
+ get sortable() {
595
+ return col.sortable;
596
+ },
597
+ get resizable() {
598
+ return col.resizable;
599
+ },
600
+ children: (dsCtx) => {
601
+ var _a;
602
+ const crudCtx = {
603
+ ...dsCtx,
604
+ setItem: (key, value) => {
605
+ setItems(dsCtx.index, key, value);
606
+ }
607
+ };
608
+ if (local.modalEdit && col.editable && canEdit() && (((_a = local.itemEditable) == null ? void 0 : _a.call(local, dsCtx.item)) ?? true)) {
609
+ return _$createComponent(Link, {
610
+ "class": "flex w-full",
611
+ onClick: (e) => {
612
+ e.preventDefault();
613
+ e.stopPropagation();
614
+ void handleEditItem(dsCtx.item);
615
+ },
616
+ get children() {
617
+ return col.cell(crudCtx);
618
+ }
619
+ });
620
+ }
621
+ return col.cell(crudCtx);
622
+ }
623
+ })
624
+ })];
625
+ }
626
+ }));
627
+ return _el$4;
628
+ })(), _$createComponent(Show, {
629
+ get when() {
630
+ return isModal && isSelectMode();
631
+ },
632
+ get children() {
633
+ var _el$5 = _tmpl$4(), _el$6 = _el$5.firstChild;
634
+ _$insert(_el$5, _$createComponent(Show, {
635
+ get when() {
636
+ return selectedItems().length > 0;
637
+ },
638
+ get children() {
639
+ return _$createComponent(Button, {
640
+ size: "sm",
641
+ theme: "danger",
642
+ onClick: handleSelectCancel,
643
+ get children() {
644
+ return [_$memo(() => local.selectMode === "multi" ? "\uBAA8\uB450" : "\uC120\uD0DD"), " \uD574\uC81C"];
645
+ }
646
+ });
647
+ }
648
+ }), null);
649
+ _$insert(_el$5, _$createComponent(Show, {
650
+ get when() {
651
+ return local.selectMode === "multi";
652
+ },
653
+ get children() {
654
+ return _$createComponent(Button, {
655
+ size: "sm",
656
+ theme: "primary",
657
+ onClick: handleSelectConfirm,
658
+ get children() {
659
+ return ["\uD655\uC778(", _$memo(() => selectedItems().length), ")"];
660
+ }
661
+ });
662
+ }
663
+ }), null);
664
+ return _el$5;
665
+ }
666
+ })];
667
+ }
668
+ })];
669
+ };
670
+ const CrudSheet = CrudSheetBase;
671
+ CrudSheet.Column = CrudSheetColumn;
672
+ CrudSheet.Filter = CrudSheetFilter;
673
+ CrudSheet.Tools = CrudSheetTools;
674
+ CrudSheet.Header = CrudSheetHeader;
675
+ _$delegateEvents(["click"]);
676
+ export {
677
+ CrudSheet
678
+ };
679
+ //# sourceMappingURL=CrudSheet.js.map