@simplysm/angular 14.0.42 → 14.0.43

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 (241) hide show
  1. package/dist/controls/button/sd-additional-button.js +1 -1
  2. package/dist/controls/button/sd-anchor.js +1 -1
  3. package/dist/controls/button/sd-button.js +1 -1
  4. package/dist/controls/button/sd-modal-select-button.d.ts +1 -1
  5. package/dist/controls/button/sd-modal-select-button.d.ts.map +1 -1
  6. package/dist/controls/button/sd-modal-select-button.js +8 -6
  7. package/dist/controls/checkbox/sd-checkbox-group-item.js +1 -1
  8. package/dist/controls/checkbox/sd-checkbox-group.js +1 -1
  9. package/dist/controls/checkbox/sd-checkbox.js +1 -1
  10. package/dist/controls/checkbox/sd-switch.js +1 -1
  11. package/dist/controls/collapse/sd-collapse-icon.d.ts.map +1 -1
  12. package/dist/controls/collapse/sd-collapse-icon.js +3 -3
  13. package/dist/controls/collapse/sd-collapse.d.ts +1 -1
  14. package/dist/controls/collapse/sd-collapse.d.ts.map +1 -1
  15. package/dist/controls/collapse/sd-collapse.js +8 -7
  16. package/dist/controls/dropdown/sd-dropdown-popup.d.ts +2 -0
  17. package/dist/controls/dropdown/sd-dropdown-popup.d.ts.map +1 -1
  18. package/dist/controls/dropdown/sd-dropdown-popup.js +21 -8
  19. package/dist/controls/dropdown/sd-dropdown.d.ts.map +1 -1
  20. package/dist/controls/dropdown/sd-dropdown.js +5 -16
  21. package/dist/controls/form/sd-form.js +1 -1
  22. package/dist/controls/gap/sd-gap.js +5 -5
  23. package/dist/controls/input/sd-date-range-picker.d.ts +1 -0
  24. package/dist/controls/input/sd-date-range-picker.d.ts.map +1 -1
  25. package/dist/controls/input/sd-date-range-picker.js +14 -19
  26. package/dist/controls/input/sd-numpad.js +3 -3
  27. package/dist/controls/input/sd-range.js +1 -1
  28. package/dist/controls/input/sd-textarea.js +2 -2
  29. package/dist/controls/input/sd-textfield-type-handlers.js +2 -2
  30. package/dist/controls/input/sd-textfield.js +9 -9
  31. package/dist/controls/list/sd-list-item.d.ts +0 -1
  32. package/dist/controls/list/sd-list-item.d.ts.map +1 -1
  33. package/dist/controls/list/sd-list-item.js +38 -38
  34. package/dist/controls/list/sd-list.d.ts.map +1 -1
  35. package/dist/controls/list/sd-list.js +3 -3
  36. package/dist/controls/pagination/sd-pagination.js +1 -1
  37. package/dist/controls/select/sd-select-button.d.ts.map +1 -1
  38. package/dist/controls/select/sd-select-button.js +4 -8
  39. package/dist/controls/select/sd-select-item.d.ts +3 -3
  40. package/dist/controls/select/sd-select-item.d.ts.map +1 -1
  41. package/dist/controls/select/sd-select-item.js +27 -20
  42. package/dist/controls/select/sd-select.d.ts +5 -4
  43. package/dist/controls/select/sd-select.d.ts.map +1 -1
  44. package/dist/controls/select/sd-select.js +20 -17
  45. package/dist/controls/tab/sd-tab-item.js +1 -1
  46. package/dist/controls/tab/sd-tab.js +1 -1
  47. package/dist/core/app-structure/sd-app-structure.utils.js +1 -1
  48. package/dist/core/busy/sd-busy-container.d.ts.map +1 -1
  49. package/dist/core/busy/sd-busy-container.js +62 -68
  50. package/dist/core/busy/sd-busy.provider.js +1 -1
  51. package/dist/core/commands/sd-command.d.ts +13 -0
  52. package/dist/core/commands/sd-command.d.ts.map +1 -0
  53. package/dist/core/commands/sd-command.js +52 -0
  54. package/dist/core/error-handler/sd-global-error-handler.plugin.js +1 -1
  55. package/dist/core/events/sd-events.d.ts +1 -6
  56. package/dist/core/events/sd-events.d.ts.map +1 -1
  57. package/dist/core/events/sd-events.js +3 -11
  58. package/dist/core/events/sd-intersection.d.ts +13 -0
  59. package/dist/core/events/sd-intersection.d.ts.map +1 -0
  60. package/dist/core/events/sd-intersection.js +27 -0
  61. package/dist/core/events/sd-resize.d.ts +16 -0
  62. package/dist/core/events/sd-resize.d.ts.map +1 -0
  63. package/dist/core/events/{sd-resize-event.plugin.js → sd-resize.js} +18 -20
  64. package/dist/core/file-dialog/sd-file-dialog.provider.js +1 -1
  65. package/dist/core/modal/injectDragResize.js +9 -9
  66. package/dist/core/modal/injectFocusTrap.js +1 -1
  67. package/dist/core/modal/sd-confirm-modal.js +1 -1
  68. package/dist/core/modal/sd-modal.d.ts +8 -1
  69. package/dist/core/modal/sd-modal.d.ts.map +1 -1
  70. package/dist/core/modal/sd-modal.js +135 -39
  71. package/dist/core/modal/sd-modal.provider.js +5 -5
  72. package/dist/core/modal/sd-prompt-modal.js +1 -1
  73. package/dist/core/provideSdAngular.d.ts.map +1 -1
  74. package/dist/core/provideSdAngular.js +0 -10
  75. package/dist/core/ripple/setupRipple.js +5 -5
  76. package/dist/core/routing/menu-utils.js +1 -1
  77. package/dist/core/routing/sd-navigate-window.provider.js +1 -1
  78. package/dist/core/routing/sd-router-link.js +1 -1
  79. package/dist/core/selection/setupCumulateSelectedKeys.js +3 -3
  80. package/dist/core/setupModelHook.js +1 -1
  81. package/dist/core/toast/sd-toast-container.d.ts +1 -1
  82. package/dist/core/toast/sd-toast-container.js +3 -7
  83. package/dist/core/toast/sd-toast.d.ts.map +1 -1
  84. package/dist/core/toast/sd-toast.js +27 -24
  85. package/dist/core/toast/sd-toast.provider.js +6 -6
  86. package/dist/core/validation/setupInvalid.js +2 -1
  87. package/dist/data/data-detail/sd-data-detail.d.ts +2 -1
  88. package/dist/data/data-detail/sd-data-detail.d.ts.map +1 -1
  89. package/dist/data/data-detail/sd-data-detail.js +37 -33
  90. package/dist/data/data-select-button/sd-data-select-button.js +1 -1
  91. package/dist/data/data-sheet/sd-data-sheet.d.ts +2 -1
  92. package/dist/data/data-sheet/sd-data-sheet.d.ts.map +1 -1
  93. package/dist/data/data-sheet/sd-data-sheet.js +30 -22
  94. package/dist/data/kanban/sd-kanban-board.js +1 -1
  95. package/dist/data/kanban/sd-kanban-lane.js +1 -1
  96. package/dist/data/kanban/sd-kanban.d.ts +1 -1
  97. package/dist/data/kanban/sd-kanban.d.ts.map +1 -1
  98. package/dist/data/kanban/sd-kanban.js +4 -4
  99. package/dist/data/permission-table/sd-permission-table.js +6 -6
  100. package/dist/data/shared-data/sd-shared-data-select-button.js +1 -1
  101. package/dist/data/shared-data/sd-shared-data-select-list.js +3 -3
  102. package/dist/data/shared-data/sd-shared-data-select.d.ts +1 -1
  103. package/dist/data/shared-data/sd-shared-data-select.d.ts.map +1 -1
  104. package/dist/data/shared-data/sd-shared-data-select.js +29 -54
  105. package/dist/data/sheet/injectSheetDomAccessor.d.ts +6 -2
  106. package/dist/data/sheet/injectSheetDomAccessor.d.ts.map +1 -1
  107. package/dist/data/sheet/injectSheetDomAccessor.js +27 -22
  108. package/dist/data/sheet/injectSheetSelectRowIndicator.d.ts +10 -0
  109. package/dist/data/sheet/injectSheetSelectRowIndicator.d.ts.map +1 -0
  110. package/dist/data/sheet/injectSheetSelectRowIndicator.js +55 -0
  111. package/dist/data/sheet/sd-sheet-config.modal.d.ts +18 -19
  112. package/dist/data/sheet/sd-sheet-config.modal.d.ts.map +1 -1
  113. package/dist/data/sheet/sd-sheet-config.modal.js +357 -217
  114. package/dist/data/sheet/sd-sheet.d.ts +27 -13
  115. package/dist/data/sheet/sd-sheet.d.ts.map +1 -1
  116. package/dist/data/sheet/sd-sheet.js +609 -291
  117. package/dist/data/sheet/useSheetCellAgent.js +6 -6
  118. package/dist/data/sheet/useSheetCellStyling.d.ts.map +1 -1
  119. package/dist/data/sheet/useSheetCellStyling.js +4 -4
  120. package/dist/data/sheet/useSheetFocusIndicator.d.ts +7 -0
  121. package/dist/data/sheet/useSheetFocusIndicator.d.ts.map +1 -0
  122. package/dist/data/sheet/useSheetFocusIndicator.js +53 -0
  123. package/dist/data/sheet/useSheetLayoutEngine.js +1 -1
  124. package/dist/data/state-preset/sd-state-preset.d.ts.map +1 -1
  125. package/dist/data/state-preset/sd-state-preset.js +14 -14
  126. package/dist/features/address/sd-address-search.modal.js +3 -3
  127. package/dist/features/editor/sd-tiptap-editor.js +6 -6
  128. package/dist/features/editor/useTiptapToolbar.js +2 -2
  129. package/dist/features/theme/sd-theme-selector.js +1 -1
  130. package/dist/features/visual/sd-barcode.js +1 -1
  131. package/dist/features/visual/sd-calendar.js +2 -2
  132. package/dist/features/visual/sd-echarts.d.ts +2 -1
  133. package/dist/features/visual/sd-echarts.d.ts.map +1 -1
  134. package/dist/features/visual/sd-echarts.js +5 -3
  135. package/dist/features/visual/sd-label.js +1 -1
  136. package/dist/features/visual/sd-note.js +1 -1
  137. package/dist/features/visual/sd-progress.js +1 -1
  138. package/dist/index.d.ts +3 -5
  139. package/dist/index.d.ts.map +1 -1
  140. package/dist/index.js +3 -5
  141. package/dist/layout/base-container/sd-base-container.js +3 -3
  142. package/dist/layout/dock/sd-dock-container.js +1 -1
  143. package/dist/layout/dock/sd-dock.d.ts +3 -2
  144. package/dist/layout/dock/sd-dock.d.ts.map +1 -1
  145. package/dist/layout/dock/sd-dock.js +6 -4
  146. package/dist/layout/sidebar/sd-sidebar-container.js +5 -5
  147. package/dist/layout/sidebar/sd-sidebar-menu.d.ts.map +1 -1
  148. package/dist/layout/sidebar/sd-sidebar-menu.js +7 -6
  149. package/dist/layout/sidebar/sd-sidebar-user.js +1 -1
  150. package/dist/layout/sidebar/sd-sidebar.js +1 -1
  151. package/dist/layout/topbar/sd-topbar-container.js +1 -1
  152. package/dist/layout/topbar/sd-topbar-menu.d.ts.map +1 -1
  153. package/dist/layout/topbar/sd-topbar-menu.js +7 -7
  154. package/dist/layout/topbar/sd-topbar-user.js +1 -1
  155. package/dist/layout/topbar/sd-topbar.js +3 -3
  156. package/package.json +5 -5
  157. package/src/controls/button/sd-modal-select-button.ts +7 -2
  158. package/src/controls/collapse/sd-collapse-icon.ts +2 -2
  159. package/src/controls/collapse/sd-collapse.ts +4 -5
  160. package/src/controls/dropdown/sd-dropdown-popup.ts +15 -2
  161. package/src/controls/dropdown/sd-dropdown.ts +4 -16
  162. package/src/controls/gap/sd-gap.ts +4 -4
  163. package/src/controls/input/sd-date-range-picker.ts +13 -16
  164. package/src/controls/input/sd-numpad.ts +1 -1
  165. package/src/controls/input/sd-textarea.ts +1 -1
  166. package/src/controls/input/sd-textfield-type-handlers.ts +2 -2
  167. package/src/controls/input/sd-textfield.ts +6 -6
  168. package/src/controls/list/sd-list-item.ts +40 -26
  169. package/src/controls/list/sd-list.ts +2 -1
  170. package/src/controls/select/sd-select-button.ts +8 -11
  171. package/src/controls/select/sd-select-item.ts +35 -27
  172. package/src/controls/select/sd-select.ts +111 -41
  173. package/src/core/app-structure/sd-app-structure.utils.ts +1 -1
  174. package/src/core/busy/sd-busy-container.ts +235 -123
  175. package/src/core/busy/sd-busy.provider.ts +1 -1
  176. package/src/core/commands/sd-command.ts +46 -0
  177. package/src/core/error-handler/sd-global-error-handler.plugin.ts +1 -1
  178. package/src/core/events/sd-events.ts +1 -12
  179. package/src/core/events/sd-intersection.ts +29 -0
  180. package/src/core/events/{sd-resize-event.plugin.ts → sd-resize.ts} +17 -24
  181. package/src/core/file-dialog/sd-file-dialog.provider.ts +1 -1
  182. package/src/core/modal/injectDragResize.ts +9 -9
  183. package/src/core/modal/injectFocusTrap.ts +1 -1
  184. package/src/core/modal/sd-modal.provider.ts +5 -5
  185. package/src/core/modal/sd-modal.ts +119 -41
  186. package/src/core/provideSdAngular.ts +0 -10
  187. package/src/core/ripple/setupRipple.ts +5 -5
  188. package/src/core/routing/menu-utils.ts +1 -1
  189. package/src/core/routing/sd-navigate-window.provider.ts +1 -1
  190. package/src/core/routing/sd-router-link.ts +1 -1
  191. package/src/core/selection/setupCumulateSelectedKeys.ts +3 -3
  192. package/src/core/setupModelHook.ts +1 -1
  193. package/src/core/toast/sd-toast-container.ts +1 -1
  194. package/src/core/toast/sd-toast.provider.ts +6 -6
  195. package/src/core/toast/sd-toast.ts +25 -22
  196. package/src/core/validation/setupInvalid.ts +2 -1
  197. package/src/data/data-detail/sd-data-detail.ts +15 -11
  198. package/src/data/data-sheet/sd-data-sheet.ts +13 -15
  199. package/src/data/kanban/sd-kanban.ts +4 -5
  200. package/src/data/permission-table/sd-permission-table.ts +4 -4
  201. package/src/data/shared-data/sd-shared-data-select-list.ts +1 -1
  202. package/src/data/shared-data/sd-shared-data-select.ts +8 -27
  203. package/src/data/sheet/injectSheetDomAccessor.ts +37 -25
  204. package/src/data/sheet/injectSheetSelectRowIndicator.ts +69 -0
  205. package/src/data/sheet/sd-sheet-config.modal.ts +215 -191
  206. package/src/data/sheet/sd-sheet.ts +529 -209
  207. package/src/data/sheet/useSheetCellAgent.ts +8 -8
  208. package/src/data/sheet/useSheetCellStyling.ts +4 -8
  209. package/src/data/sheet/useSheetFocusIndicator.ts +66 -0
  210. package/src/data/sheet/useSheetLayoutEngine.ts +1 -1
  211. package/src/data/state-preset/sd-state-preset.ts +26 -13
  212. package/src/features/address/sd-address-search.modal.ts +1 -1
  213. package/src/features/editor/sd-tiptap-editor.ts +4 -4
  214. package/src/features/editor/useTiptapToolbar.ts +2 -2
  215. package/src/features/visual/sd-calendar.ts +1 -1
  216. package/src/features/visual/sd-echarts.ts +2 -0
  217. package/src/index.ts +4 -6
  218. package/src/layout/base-container/sd-base-container.ts +1 -1
  219. package/src/layout/dock/sd-dock.ts +3 -2
  220. package/src/layout/sidebar/sd-sidebar-container.ts +2 -2
  221. package/src/layout/sidebar/sd-sidebar-menu.ts +1 -3
  222. package/src/layout/topbar/sd-topbar-menu.ts +11 -15
  223. package/src/layout/topbar/sd-topbar.ts +1 -1
  224. package/dist/core/commands/sd-insert-command-event.plugin.d.ts +0 -11
  225. package/dist/core/commands/sd-insert-command-event.plugin.d.ts.map +0 -1
  226. package/dist/core/commands/sd-insert-command-event.plugin.js +0 -35
  227. package/dist/core/commands/sd-refresh-command-event.plugin.d.ts +0 -11
  228. package/dist/core/commands/sd-refresh-command-event.plugin.d.ts.map +0 -1
  229. package/dist/core/commands/sd-refresh-command-event.plugin.js +0 -38
  230. package/dist/core/commands/sd-save-command-event.plugin.d.ts +0 -11
  231. package/dist/core/commands/sd-save-command-event.plugin.d.ts.map +0 -1
  232. package/dist/core/commands/sd-save-command-event.plugin.js +0 -38
  233. package/dist/core/events/sd-intersection-event.plugin.d.ts +0 -13
  234. package/dist/core/events/sd-intersection-event.plugin.d.ts.map +0 -1
  235. package/dist/core/events/sd-intersection-event.plugin.js +0 -29
  236. package/dist/core/events/sd-resize-event.plugin.d.ts +0 -16
  237. package/dist/core/events/sd-resize-event.plugin.d.ts.map +0 -1
  238. package/src/core/commands/sd-insert-command-event.plugin.ts +0 -39
  239. package/src/core/commands/sd-refresh-command-event.plugin.ts +0 -44
  240. package/src/core/commands/sd-save-command-event.plugin.ts +0 -44
  241. package/src/core/events/sd-intersection-event.plugin.ts +0 -35
@@ -21,12 +21,12 @@ export function useSheetCellAgent(options: {
21
21
 
22
22
  function _enterEditMode(r: number, c: number): void {
23
23
  editModeCellAddr.set({ r, c });
24
- // Re-query DOM inside queueMicrotask to avoid stale reference after Angular re-render
25
- queueMicrotask(() => {
24
+ // requestAnimationFrame: Angular가 edit=true로 re-render focus해야 readonly가 해제된 상태
25
+ requestAnimationFrame(() => {
26
26
  const cell = options.domAccessor.getCell(r, c);
27
27
  if (cell == null) return;
28
- const tabbable =cell.findFirstTabbableChild();
29
- if (tabbable !== undefined) {
28
+ const tabbable = cell.findFirstTabbableChild();
29
+ if (tabbable != null) {
30
30
  tabbable.focus();
31
31
  }
32
32
  });
@@ -47,12 +47,12 @@ export function useSheetCellAgent(options: {
47
47
  _exitEditMode();
48
48
  if (enterEdit) {
49
49
  editModeCellAddr.set({ r, c });
50
- queueMicrotask(() => {
50
+ requestAnimationFrame(() => {
51
51
  _isTransitioning = false;
52
52
  const targetCell = options.domAccessor.getCell(r, c);
53
53
  if (targetCell == null) return;
54
- const tabbable =targetCell.findFirstTabbableChild();
55
- if (tabbable !== undefined) {
54
+ const tabbable = targetCell.findFirstTabbableChild();
55
+ if (tabbable != null) {
56
56
  tabbable.focus();
57
57
  }
58
58
  });
@@ -211,7 +211,7 @@ export function useSheetCellAgent(options: {
211
211
  _enterEditMode(addr.r, addr.c);
212
212
 
213
213
  // Wait for edit mode to render, then paste
214
- queueMicrotask(() => {
214
+ requestAnimationFrame(() => {
215
215
  const cell = options.domAccessor.getCell(addr.r, addr.c);
216
216
  if (cell == null) return;
217
217
  const inputEl = cell.querySelector<HTMLInputElement | HTMLTextAreaElement>(
@@ -21,15 +21,11 @@ export function useSheetCellStyling<T>(options: {
21
21
  return null;
22
22
  }
23
23
 
24
- function getFixedStyle(
25
- colDef: SdSheetColumnDef,
26
- zIndex: number = 1,
27
- background: string = "var(--control-color)",
28
- ): string | null {
24
+ function getFixedStyle(colDef: SdSheetColumnDef): string | null {
29
25
  const leftValue = options.fixedLeftMap().get(colDef.key);
30
26
  if (leftValue == null) return null;
31
27
 
32
- return `position: sticky; left: ${leftValue}px; z-index: ${zIndex}; background: ${background}`;
28
+ return `left: ${leftValue}px`;
33
29
  }
34
30
 
35
31
  const headerColumnStyles = computed(() => {
@@ -38,7 +34,7 @@ export function useSheetCellStyling<T>(options: {
38
34
  const parts: string[] = [];
39
35
  const colStyle = getColDefStyle(colDef);
40
36
  if (colStyle != null) parts.push(colStyle);
41
- const fixedStyle = getFixedStyle(colDef, 3, "var(--theme-secondary-lightest)");
37
+ const fixedStyle = getFixedStyle(colDef);
42
38
  if (fixedStyle != null) parts.push(fixedStyle);
43
39
  map.set(colDef.key, parts.length > 0 ? parts.join("; ") : null);
44
40
  }
@@ -76,7 +72,7 @@ export function useSheetCellStyling<T>(options: {
76
72
  }
77
73
 
78
74
  function getFixedCellStyle(colDef: SdSheetColumnDef): string | null {
79
- return getFixedStyle(colDef, 3);
75
+ return getFixedStyle(colDef);
80
76
  }
81
77
 
82
78
  function getCellStyleWithIndent(item: T, colDef: SdSheetColumnDef, colIdx: number): string | null {
@@ -0,0 +1,66 @@
1
+ import type { injectSheetDomAccessor } from "./injectSheetDomAccessor";
2
+
3
+ export function useSheetFocusIndicator(options: {
4
+ domAccessor: ReturnType<typeof injectSheetDomAccessor>;
5
+ }) {
6
+ function redraw(): void {
7
+ const containerEl = options.domAccessor.getContainer();
8
+ const rowIndicatorEl = options.domAccessor.getFocusRowIndicator();
9
+ const cellIndicatorEl = options.domAccessor.getFocusCellIndicator();
10
+
11
+ const focusedEl = document.activeElement;
12
+ if (!(focusedEl instanceof HTMLElement) || !containerEl.contains(focusedEl)) {
13
+ cellIndicatorEl.style.display = "none";
14
+ rowIndicatorEl.style.display = "none";
15
+ return;
16
+ }
17
+
18
+ const tdEl =
19
+ focusedEl.tagName.toLowerCase() === "td" ? focusedEl : focusedEl.closest("td");
20
+ if (!(tdEl instanceof HTMLTableCellElement)) {
21
+ cellIndicatorEl.style.display = "none";
22
+ rowIndicatorEl.style.display = "none";
23
+ return;
24
+ }
25
+
26
+ // Cell indicator
27
+ const isFixed = tdEl.classList.contains("_fixed");
28
+ const fixedScrollLeft = isFixed ? containerEl.scrollLeft : 0;
29
+ Object.assign(cellIndicatorEl.style, {
30
+ display: focusedEl.tagName.toLowerCase() === "td" ? "block" : "none",
31
+ position: isFixed ? "sticky" : "absolute",
32
+ left: tdEl.offsetLeft - fixedScrollLeft - 2 + "px",
33
+ width: tdEl.offsetWidth + 3 + "px",
34
+ height: tdEl.offsetHeight + 3 + "px",
35
+ opacity: "1",
36
+ });
37
+
38
+ // Row indicator
39
+ const trEl = tdEl.parentElement!;
40
+ Object.assign(rowIndicatorEl.style, {
41
+ display: "block",
42
+ top: trEl.offsetTop - 2 + "px",
43
+ left: trEl.offsetLeft + "px",
44
+ width: trEl.offsetWidth + "px",
45
+ height: trEl.offsetHeight + 3 + "px",
46
+ });
47
+
48
+ // Dim cell indicator when behind sticky header or fixed columns
49
+ if (!(focusedEl instanceof HTMLTableCellElement)) return;
50
+ if (focusedEl.classList.contains("_fixed")) return;
51
+
52
+ const theadEl = options.domAccessor.getTHead();
53
+ const fixedHeaderEls = options.domAccessor.getLastDepthFixedHeaders();
54
+
55
+ const fixedAreaTop = theadEl.offsetHeight;
56
+ const fixedAreaLeft = fixedHeaderEls.reduce((sum, el) => sum + el.offsetWidth, 0);
57
+
58
+ const indicatorTop = rowIndicatorEl.offsetTop - containerEl.scrollTop + 2;
59
+ const indicatorLeft = cellIndicatorEl.offsetLeft - containerEl.scrollLeft + 2;
60
+
61
+ cellIndicatorEl.style.opacity =
62
+ indicatorTop < fixedAreaTop || indicatorLeft < fixedAreaLeft - 1 ? ".3" : "1";
63
+ }
64
+
65
+ return { redraw };
66
+ }
@@ -29,7 +29,7 @@ export function useSheetLayoutEngine(options: {
29
29
  };
30
30
  })
31
31
  .filter((def) => !def.hidden)
32
- .sort((a, b) => a.ordering - b.ordering);
32
+ .orderBy((a) => a.ordering);
33
33
  });
34
34
 
35
35
  const hasSummary = computed((): boolean => {
@@ -31,18 +31,18 @@ export interface SdStatePresetDef {
31
31
  template: `
32
32
  <div class="_sd-state-preset">
33
33
  <sd-anchor (click)="onAddClick()" class="_add-btn">
34
- <ng-icon [svg]="tablerStar" />
34
+ <ng-icon [svg]="tablerStar" class="tx-theme-warning-default" />
35
35
  </sd-anchor>
36
36
  @for (preset of _presets(); track preset.name) {
37
37
  <div class="_preset-item">
38
- <sd-anchor class="_preset-name" (click)="onPresetClick(preset)">
38
+ <sd-anchor class="_preset-name tx-trans-default" (click)="onPresetClick(preset)">
39
39
  {{ preset.name }}
40
40
  </sd-anchor>
41
41
  <sd-anchor class="_preset-save" (click)="onSaveClick(preset)">
42
- <ng-icon [svg]="tablerDeviceFloppy" />
42
+ <ng-icon [svg]="tablerDeviceFloppy" [size]="'1em'" />
43
43
  </sd-anchor>
44
44
  <sd-anchor class="_preset-delete" [theme]="'danger'" (click)="onDeleteClick(preset)">
45
- <ng-icon [svg]="tablerX" />
45
+ <ng-icon [svg]="tablerX" [size]="'1em'" />
46
46
  </sd-anchor>
47
47
  </div>
48
48
  }
@@ -51,7 +51,8 @@ export interface SdStatePresetDef {
51
51
  styles: [
52
52
  /* language=SCSS */ `
53
53
  sd-state-preset {
54
- display: block;
54
+ display: inline-block;
55
+ vertical-align: top;
55
56
 
56
57
  > ._sd-state-preset {
57
58
  display: flex;
@@ -60,36 +61,48 @@ export interface SdStatePresetDef {
60
61
  flex-wrap: wrap;
61
62
 
62
63
  > ._add-btn {
63
- padding: var(--gap-xs);
64
+ line-height: var(--line-height);
65
+ border: 1px solid transparent;
66
+ padding: var(--gap-sm) var(--gap-default);
64
67
  }
65
68
 
66
69
  > ._preset-item {
67
70
  display: inline-flex;
68
71
  align-items: center;
69
72
  gap: var(--gap-xs);
70
- border: 1px solid var(--trans-lighter);
71
- border-radius: var(--border-radius-default);
72
- padding: var(--gap-xs) var(--gap-sm);
73
+ line-height: var(--line-height);
74
+ border: 1px solid transparent;
75
+ border-radius: var(--border-radius-lg);
76
+ padding: var(--gap-sm) var(--gap-default);
77
+ background: var(--theme-gray-lightest);
78
+
79
+ &:hover {
80
+ background: var(--theme-gray-lighter);
81
+ }
82
+
83
+ > sd-anchor {
84
+ padding: 0 var(--gap-sm);
85
+ }
73
86
  }
74
87
  }
75
88
 
76
89
  &[data-sd-size="sm"] > ._sd-state-preset {
77
90
  > ._add-btn {
78
- padding: var(--gap-xxs);
91
+ padding: var(--gap-xs) var(--gap-default);
79
92
  }
80
93
 
81
94
  > ._preset-item {
82
- padding: var(--gap-xxs) var(--gap-xs);
95
+ padding: var(--gap-xs) var(--gap-default);
83
96
  }
84
97
  }
85
98
 
86
99
  &[data-sd-size="lg"] > ._sd-state-preset {
87
100
  > ._add-btn {
88
- padding: var(--gap-sm);
101
+ padding: var(--gap-default) var(--gap-lg);
89
102
  }
90
103
 
91
104
  > ._preset-item {
92
- padding: var(--gap-sm) var(--gap-default);
105
+ padding: var(--gap-default) var(--gap-lg);
93
106
  }
94
107
  }
95
108
  }
@@ -94,7 +94,7 @@ function loadDaumPostcodeScript(): Promise<void> {
94
94
  imports: [SdBusyContainer],
95
95
  template: `
96
96
  <sd-busy-container [busy]="!initialized()">
97
- @if (errorMessage() !== null) {
97
+ @if (errorMessage() != null) {
98
98
  <div class="_error">{{ errorMessage() }}</div>
99
99
  } @else {
100
100
  <div #content style="min-height: 100px;"></div>
@@ -101,7 +101,7 @@ const DEFAULT_EXTENSIONS: AnyExtension[] = [
101
101
  <button type="button" data-cmd="clean" (click)="execCmd('clean')">Tx</button>
102
102
  </div>
103
103
  </div>
104
- @if (colorPickerMode() !== undefined) {
104
+ @if (colorPickerMode() != undefined) {
105
105
  <div class="_color-picker">
106
106
  @for (color of colorPresets; track color) {
107
107
  <button type="button" class="_color-swatch"
@@ -271,10 +271,10 @@ export class SdTiptapEditor {
271
271
 
272
272
  private readonly _resolvedExtensions = computed(() => {
273
273
  const custom = this.extensions();
274
- if (custom !== undefined) return custom;
274
+ if (custom != null) return custom;
275
275
 
276
276
  const ph = this.placeholder();
277
- if (ph !== undefined) {
277
+ if (ph != null) {
278
278
  return [...DEFAULT_EXTENSIONS, Placeholder.configure({ placeholder: ph })];
279
279
  }
280
280
  return DEFAULT_EXTENSIONS;
@@ -325,7 +325,7 @@ export class SdTiptapEditor {
325
325
 
326
326
  if (this.validatorFn()) {
327
327
  const message = this.validatorFn()!(this.value());
328
- if (message !== undefined) {
328
+ if (message != null) {
329
329
  errorMessages.push(message);
330
330
  }
331
331
  }
@@ -151,13 +151,13 @@ export function useTiptapToolbar(opt: TiptapToolbarOptions): {
151
151
  const chain = ed.chain().focus();
152
152
  const mode = colorPickerMode();
153
153
  if (mode === "text") {
154
- if (color !== undefined) {
154
+ if (color != null) {
155
155
  chain.setColor(color).run();
156
156
  } else {
157
157
  chain.unsetColor().run();
158
158
  }
159
159
  } else if (mode === "bg") {
160
- if (color !== undefined) {
160
+ if (color != null) {
161
161
  chain.setHighlight({ color }).run();
162
162
  } else {
163
163
  chain.unsetHighlight().run();
@@ -157,7 +157,7 @@ export class SdCalendar<T> {
157
157
  const item = this.items()[i];
158
158
  const tick = getDateFn(item, i).tick;
159
159
  const arr = itemsByTick.get(tick);
160
- if (arr !== undefined) {
160
+ if (arr != null) {
161
161
  arr.push(item);
162
162
  } else {
163
163
  itemsByTick.set(tick, [item]);
@@ -11,6 +11,7 @@ import {
11
11
  ViewEncapsulation,
12
12
  } from "@angular/core";
13
13
  import * as echarts from "echarts";
14
+ import { SdResizeDirective } from "../../core/events/sd-resize";
14
15
 
15
16
  @Component({
16
17
  selector: "sd-echarts",
@@ -18,6 +19,7 @@ import * as echarts from "echarts";
18
19
  encapsulation: ViewEncapsulation.None,
19
20
  standalone: true,
20
21
  imports: [],
22
+ hostDirectives: [{ directive: SdResizeDirective, outputs: ["sdResize"] }],
21
23
  host: {
22
24
  "(sdResize)": "onHostResize()",
23
25
  },
package/src/index.ts CHANGED
@@ -19,17 +19,15 @@ export type {
19
19
 
20
20
  // core/events
21
21
  export { SdOptionEventPlugin } from "./core/events/sd-option-event.plugin";
22
- export { SdResizeEventPlugin, type SdResizeEvent } from "./core/events/sd-resize-event.plugin";
22
+ export { SdResizeDirective, type SdResizeEvent } from "./core/events/sd-resize";
23
23
  export {
24
- SdIntersectionEventPlugin,
24
+ SdIntersectionDirective,
25
25
  type SdIntersectionEvent,
26
- } from "./core/events/sd-intersection-event.plugin";
26
+ } from "./core/events/sd-intersection";
27
27
  export { SdEvents } from "./core/events/sd-events";
28
28
 
29
29
  // core/commands
30
- export { SdSaveCommandEventPlugin } from "./core/commands/sd-save-command-event.plugin";
31
- export { SdRefreshCommandEventPlugin } from "./core/commands/sd-refresh-command-event.plugin";
32
- export { SdInsertCommandEventPlugin } from "./core/commands/sd-insert-command-event.plugin";
30
+ export { SdCommandDirective } from "./core/commands/sd-command";
33
31
 
34
32
  // core/error-handler
35
33
  export { SdGlobalErrorHandlerPlugin } from "./core/error-handler/sd-global-error-handler.plugin";
@@ -40,7 +40,7 @@ import { tablerAlertTriangle } from "@ng-icons/tabler-icons";
40
40
  ],
41
41
  template: `
42
42
  <sd-busy-container [busy]="busy()" [message]="busyMessage()">
43
- @if (initialized() === undefined || initialized()) {
43
+ @if (initialized() == null || initialized()) {
44
44
  @if (restricted()) {
45
45
  <div class="fill tx-theme-gray-light p-xxl tx-center">
46
46
  <br />
@@ -11,7 +11,7 @@ import {
11
11
  ViewEncapsulation,
12
12
  } from "@angular/core";
13
13
  import { injectSdSystemConfigResource } from "../../core/config/injectSdSystemConfigResource";
14
- import type { SdResizeEvent } from "../../core/events/sd-resize-event.plugin";
14
+ import { SdResizeDirective, type SdResizeEvent } from "../../core/events/sd-resize";
15
15
 
16
16
  @Component({
17
17
  selector: "sd-dock",
@@ -19,10 +19,11 @@ import type { SdResizeEvent } from "../../core/events/sd-resize-event.plugin";
19
19
  encapsulation: ViewEncapsulation.None,
20
20
  standalone: true,
21
21
  imports: [],
22
+ hostDirectives: [{ directive: SdResizeDirective, outputs: ["sdResize"] }],
22
23
  host: {
23
24
  "[attr.data-sd-position]": "position()",
24
25
  "[attr.data-sd-resizable]": "resizable()",
25
- "(sdResize)": "onHostResize($any($event))",
26
+ "(sdResize)": "onHostResize($event)",
26
27
  },
27
28
  template: `
28
29
  <ng-content></ng-content>
@@ -14,7 +14,7 @@ import { filter } from "rxjs";
14
14
  },
15
15
  template: `
16
16
  <ng-content />
17
- <div class="_backdrop" (mousedown)="onBackdropClick()"></div>
17
+ <div class="_backdrop" tabindex="0" role="button" (click)="onBackdropClick()" (keydown.enter)="onBackdropClick()"></div>
18
18
  `,
19
19
  styles: [
20
20
  /* language=SCSS */ `
@@ -87,6 +87,6 @@ export class SdSidebarContainer {
87
87
  }
88
88
 
89
89
  onBackdropClick(): void {
90
- this.toggle.set(false);
90
+ this.toggle.update((v) => !v);
91
91
  }
92
92
  }
@@ -42,6 +42,7 @@ import { NgIcon } from "@ng-icons/core";
42
42
  <ng-template #itemTpl [typed]="itemTemplateType" let-currMenus="menus" let-depth="depth">
43
43
  @for (menu of currMenus; track menu.codeChain.join(".")) {
44
44
  <sd-list-item
45
+ [contentClass]="depth === 0 ? 'pv-default' : ''"
45
46
  [style.text-indent.em]="depth > 0 ? (depth + 1) * 0.5 : undefined"
46
47
  [sdRouterLink]="getMenuRouterLinkOption(menu)"
47
48
  (click)="onMenuClick(menu)"
@@ -76,9 +77,6 @@ import { NgIcon } from "@ng-icons/core";
76
77
  background: var(--trans-lightest);
77
78
  }
78
79
 
79
- > sd-list-item > ._content {
80
- padding-block: var(--gap-default);
81
- }
82
80
  }
83
81
 
84
82
  &:not([data-sd-root-layout="accordion"]) {
@@ -41,6 +41,15 @@ import { tablerCaretDown } from "@ng-icons/tabler-icons";
41
41
  host: {
42
42
  "class": "flex-row gap-sm",
43
43
  },
44
+ styles: [
45
+ /* language=SCSS */ `
46
+ sd-topbar-menu {
47
+ sd-list sd-list {
48
+ background: var(--trans-lightest);
49
+ }
50
+ }
51
+ `,
52
+ ],
44
53
  template: `
45
54
  @for (menu of menus(); track menu.codeChain.join("."); let i = $index) {
46
55
  <sd-dropdown>
@@ -83,7 +92,7 @@ import { tablerCaretDown } from "@ng-icons/tabler-icons";
83
92
  [sdRouterLink]="getMenuRouterLinkOption(menu)"
84
93
  (click)="onMenuClick(menu, dropdownIndex)"
85
94
  [selected]="getIsMenuSelected(menu)"
86
- [open]="true"
95
+ [layout]="'flat'"
87
96
  >
88
97
  @if (menu.icon) {
89
98
  <ng-icon [svg]="menu.icon" />
@@ -106,19 +115,6 @@ import { tablerCaretDown } from "@ng-icons/tabler-icons";
106
115
  }
107
116
  </ng-template>
108
117
  `,
109
- styles: [
110
- /* language=SCSS */ `
111
- sd-topbar-menu {
112
- sd-dropdown-popup {
113
- sd-list[data-sd-inset="true"] {
114
- sd-list {
115
- background: var(--trans-lightest);
116
- }
117
- }
118
- }
119
- }
120
- `,
121
- ],
122
118
  })
123
119
  export class SdTopbarMenu {
124
120
  menus = input<SdMenu[]>([]);
@@ -143,7 +139,7 @@ export class SdTopbarMenu {
143
139
  window.open(menu.url, "_blank");
144
140
  }
145
141
 
146
- if (menu.children === undefined) {
142
+ if (menu.children == null) {
147
143
  this._dropdowns()[dropdownIndex].open.set(false);
148
144
  }
149
145
  }
@@ -36,7 +36,7 @@ import { tablerMenu2 } from "@ng-icons/tabler-icons";
36
36
  styles: [
37
37
  /* language=SCSS */ `
38
38
  sd-topbar {
39
- height: var(--topbar-height);
39
+ min-height: var(--topbar-height);
40
40
  overflow-x: auto;
41
41
  overflow-y: hidden;
42
42
  user-select: none;
@@ -1,11 +0,0 @@
1
- import { EventManagerPlugin } from "@angular/platform-browser";
2
- import * as i0 from "@angular/core";
3
- export declare class SdInsertCommandEventPlugin extends EventManagerPlugin {
4
- private readonly _document;
5
- constructor();
6
- supports(eventName: string): boolean;
7
- addEventListener(element: HTMLElement, eventName: string, handler: (event: Event) => void): () => void;
8
- static ɵfac: i0.ɵɵFactoryDeclaration<SdInsertCommandEventPlugin, never>;
9
- static ɵprov: i0.ɵɵInjectableDeclaration<SdInsertCommandEventPlugin>;
10
- }
11
- //# sourceMappingURL=sd-insert-command-event.plugin.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sd-insert-command-event.plugin.d.ts","sourceRoot":"","sources":["../../../src/core/commands/sd-insert-command-event.plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;;AAI/D,qBACa,0BAA2B,SAAQ,kBAAkB;IAChE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoB;;IAMrC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAIpC,gBAAgB,CACvB,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAC9B,MAAM,IAAI;yCAfF,0BAA0B;6CAA1B,0BAA0B;CAgCtC"}
@@ -1,35 +0,0 @@
1
- import { inject, Injectable } from "@angular/core";
2
- import { EventManagerPlugin } from "@angular/platform-browser";
3
- import { DOCUMENT } from "@angular/common";
4
- import { shouldProcessCommandEvent } from "./findTopOpenModalEl";
5
- import * as i0 from "@angular/core";
6
- export class SdInsertCommandEventPlugin extends EventManagerPlugin {
7
- _document = inject(DOCUMENT);
8
- constructor() {
9
- super(inject(DOCUMENT));
10
- }
11
- supports(eventName) {
12
- return eventName === "sdInsertCommand";
13
- }
14
- addEventListener(element, eventName, handler) {
15
- const listener = (event) => {
16
- if (event.key === "Insert" && event.ctrlKey && !event.altKey && !event.shiftKey) {
17
- if (!shouldProcessCommandEvent(this._document, element))
18
- return;
19
- event.preventDefault();
20
- event.stopPropagation();
21
- handler(event);
22
- }
23
- };
24
- this._document.addEventListener("keydown", listener);
25
- return () => {
26
- this._document.removeEventListener("keydown", listener);
27
- };
28
- }
29
- static ɵfac = function SdInsertCommandEventPlugin_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || SdInsertCommandEventPlugin)(); };
30
- static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: SdInsertCommandEventPlugin, factory: SdInsertCommandEventPlugin.ɵfac, providedIn: null });
31
- }
32
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SdInsertCommandEventPlugin, [{
33
- type: Injectable,
34
- args: [{ providedIn: null }]
35
- }], () => [], null); })();
@@ -1,11 +0,0 @@
1
- import { EventManagerPlugin } from "@angular/platform-browser";
2
- import * as i0 from "@angular/core";
3
- export declare class SdRefreshCommandEventPlugin extends EventManagerPlugin {
4
- private readonly _document;
5
- constructor();
6
- supports(eventName: string): eventName is "sdRefreshCommand";
7
- addEventListener(element: HTMLElement, eventName: string, handler: (event: Event) => void): () => void;
8
- static ɵfac: i0.ɵɵFactoryDeclaration<SdRefreshCommandEventPlugin, never>;
9
- static ɵprov: i0.ɵɵInjectableDeclaration<SdRefreshCommandEventPlugin>;
10
- }
11
- //# sourceMappingURL=sd-refresh-command-event.plugin.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sd-refresh-command-event.plugin.d.ts","sourceRoot":"","sources":["../../../src/core/commands/sd-refresh-command-event.plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;;AAI/D,qBACa,2BAA4B,SAAQ,kBAAkB;IACjE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoB;;IAMrC,QAAQ,CAAC,SAAS,EAAE,MAAM;IAI1B,gBAAgB,CACvB,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAC9B,MAAM,IAAI;yCAfF,2BAA2B;6CAA3B,2BAA2B;CAqCvC"}
@@ -1,38 +0,0 @@
1
- import { inject, Injectable } from "@angular/core";
2
- import { EventManagerPlugin } from "@angular/platform-browser";
3
- import { DOCUMENT } from "@angular/common";
4
- import { shouldProcessCommandEvent } from "./findTopOpenModalEl";
5
- import * as i0 from "@angular/core";
6
- export class SdRefreshCommandEventPlugin extends EventManagerPlugin {
7
- _document = inject(DOCUMENT);
8
- constructor() {
9
- super(inject(DOCUMENT));
10
- }
11
- supports(eventName) {
12
- return eventName === "sdRefreshCommand";
13
- }
14
- addEventListener(element, eventName, handler) {
15
- const listener = (event) => {
16
- if ((event.key === "l" || event.key === "L") &&
17
- event.ctrlKey &&
18
- event.altKey &&
19
- !event.shiftKey) {
20
- if (!shouldProcessCommandEvent(this._document, element))
21
- return;
22
- event.preventDefault();
23
- event.stopPropagation();
24
- handler(event);
25
- }
26
- };
27
- this._document.addEventListener("keydown", listener);
28
- return () => {
29
- this._document.removeEventListener("keydown", listener);
30
- };
31
- }
32
- static ɵfac = function SdRefreshCommandEventPlugin_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || SdRefreshCommandEventPlugin)(); };
33
- static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: SdRefreshCommandEventPlugin, factory: SdRefreshCommandEventPlugin.ɵfac, providedIn: null });
34
- }
35
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SdRefreshCommandEventPlugin, [{
36
- type: Injectable,
37
- args: [{ providedIn: null }]
38
- }], () => [], null); })();
@@ -1,11 +0,0 @@
1
- import { EventManagerPlugin } from "@angular/platform-browser";
2
- import * as i0 from "@angular/core";
3
- export declare class SdSaveCommandEventPlugin extends EventManagerPlugin {
4
- private readonly _document;
5
- constructor();
6
- supports(eventName: string): eventName is "sdSaveCommand";
7
- addEventListener(element: HTMLElement, eventName: string, handler: (event: Event) => void): () => void;
8
- static ɵfac: i0.ɵɵFactoryDeclaration<SdSaveCommandEventPlugin, never>;
9
- static ɵprov: i0.ɵɵInjectableDeclaration<SdSaveCommandEventPlugin>;
10
- }
11
- //# sourceMappingURL=sd-save-command-event.plugin.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sd-save-command-event.plugin.d.ts","sourceRoot":"","sources":["../../../src/core/commands/sd-save-command-event.plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;;AAI/D,qBACa,wBAAyB,SAAQ,kBAAkB;IAC9D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoB;;IAMrC,QAAQ,CAAC,SAAS,EAAE,MAAM;IAI1B,gBAAgB,CACvB,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAC9B,MAAM,IAAI;yCAfF,wBAAwB;6CAAxB,wBAAwB;CAqCpC"}
@@ -1,38 +0,0 @@
1
- import { inject, Injectable } from "@angular/core";
2
- import { EventManagerPlugin } from "@angular/platform-browser";
3
- import { DOCUMENT } from "@angular/common";
4
- import { shouldProcessCommandEvent } from "./findTopOpenModalEl";
5
- import * as i0 from "@angular/core";
6
- export class SdSaveCommandEventPlugin extends EventManagerPlugin {
7
- _document = inject(DOCUMENT);
8
- constructor() {
9
- super(inject(DOCUMENT));
10
- }
11
- supports(eventName) {
12
- return eventName === "sdSaveCommand";
13
- }
14
- addEventListener(element, eventName, handler) {
15
- const listener = (event) => {
16
- if ((event.key === "s" || event.key === "S") &&
17
- event.ctrlKey &&
18
- !event.altKey &&
19
- !event.shiftKey) {
20
- if (!shouldProcessCommandEvent(this._document, element))
21
- return;
22
- event.preventDefault();
23
- event.stopPropagation();
24
- handler(event);
25
- }
26
- };
27
- this._document.addEventListener("keydown", listener);
28
- return () => {
29
- this._document.removeEventListener("keydown", listener);
30
- };
31
- }
32
- static ɵfac = function SdSaveCommandEventPlugin_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || SdSaveCommandEventPlugin)(); };
33
- static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: SdSaveCommandEventPlugin, factory: SdSaveCommandEventPlugin.ɵfac, providedIn: null });
34
- }
35
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SdSaveCommandEventPlugin, [{
36
- type: Injectable,
37
- args: [{ providedIn: null }]
38
- }], () => [], null); })();