@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.
- package/dist/controls/button/sd-additional-button.js +1 -1
- package/dist/controls/button/sd-anchor.js +1 -1
- package/dist/controls/button/sd-button.js +1 -1
- package/dist/controls/button/sd-modal-select-button.d.ts +1 -1
- package/dist/controls/button/sd-modal-select-button.d.ts.map +1 -1
- package/dist/controls/button/sd-modal-select-button.js +8 -6
- package/dist/controls/checkbox/sd-checkbox-group-item.js +1 -1
- package/dist/controls/checkbox/sd-checkbox-group.js +1 -1
- package/dist/controls/checkbox/sd-checkbox.js +1 -1
- package/dist/controls/checkbox/sd-switch.js +1 -1
- package/dist/controls/collapse/sd-collapse-icon.d.ts.map +1 -1
- package/dist/controls/collapse/sd-collapse-icon.js +3 -3
- package/dist/controls/collapse/sd-collapse.d.ts +1 -1
- package/dist/controls/collapse/sd-collapse.d.ts.map +1 -1
- package/dist/controls/collapse/sd-collapse.js +8 -7
- package/dist/controls/dropdown/sd-dropdown-popup.d.ts +2 -0
- package/dist/controls/dropdown/sd-dropdown-popup.d.ts.map +1 -1
- package/dist/controls/dropdown/sd-dropdown-popup.js +21 -8
- package/dist/controls/dropdown/sd-dropdown.d.ts.map +1 -1
- package/dist/controls/dropdown/sd-dropdown.js +5 -16
- package/dist/controls/form/sd-form.js +1 -1
- package/dist/controls/gap/sd-gap.js +5 -5
- package/dist/controls/input/sd-date-range-picker.d.ts +1 -0
- package/dist/controls/input/sd-date-range-picker.d.ts.map +1 -1
- package/dist/controls/input/sd-date-range-picker.js +14 -19
- package/dist/controls/input/sd-numpad.js +3 -3
- package/dist/controls/input/sd-range.js +1 -1
- package/dist/controls/input/sd-textarea.js +2 -2
- package/dist/controls/input/sd-textfield-type-handlers.js +2 -2
- package/dist/controls/input/sd-textfield.js +9 -9
- package/dist/controls/list/sd-list-item.d.ts +0 -1
- package/dist/controls/list/sd-list-item.d.ts.map +1 -1
- package/dist/controls/list/sd-list-item.js +38 -38
- package/dist/controls/list/sd-list.d.ts.map +1 -1
- package/dist/controls/list/sd-list.js +3 -3
- package/dist/controls/pagination/sd-pagination.js +1 -1
- package/dist/controls/select/sd-select-button.d.ts.map +1 -1
- package/dist/controls/select/sd-select-button.js +4 -8
- package/dist/controls/select/sd-select-item.d.ts +3 -3
- package/dist/controls/select/sd-select-item.d.ts.map +1 -1
- package/dist/controls/select/sd-select-item.js +27 -20
- package/dist/controls/select/sd-select.d.ts +5 -4
- package/dist/controls/select/sd-select.d.ts.map +1 -1
- package/dist/controls/select/sd-select.js +20 -17
- package/dist/controls/tab/sd-tab-item.js +1 -1
- package/dist/controls/tab/sd-tab.js +1 -1
- package/dist/core/app-structure/sd-app-structure.utils.js +1 -1
- package/dist/core/busy/sd-busy-container.d.ts.map +1 -1
- package/dist/core/busy/sd-busy-container.js +62 -68
- package/dist/core/busy/sd-busy.provider.js +1 -1
- package/dist/core/commands/sd-command.d.ts +13 -0
- package/dist/core/commands/sd-command.d.ts.map +1 -0
- package/dist/core/commands/sd-command.js +52 -0
- package/dist/core/error-handler/sd-global-error-handler.plugin.js +1 -1
- package/dist/core/events/sd-events.d.ts +1 -6
- package/dist/core/events/sd-events.d.ts.map +1 -1
- package/dist/core/events/sd-events.js +3 -11
- package/dist/core/events/sd-intersection.d.ts +13 -0
- package/dist/core/events/sd-intersection.d.ts.map +1 -0
- package/dist/core/events/sd-intersection.js +27 -0
- package/dist/core/events/sd-resize.d.ts +16 -0
- package/dist/core/events/sd-resize.d.ts.map +1 -0
- package/dist/core/events/{sd-resize-event.plugin.js → sd-resize.js} +18 -20
- package/dist/core/file-dialog/sd-file-dialog.provider.js +1 -1
- package/dist/core/modal/injectDragResize.js +9 -9
- package/dist/core/modal/injectFocusTrap.js +1 -1
- package/dist/core/modal/sd-confirm-modal.js +1 -1
- package/dist/core/modal/sd-modal.d.ts +8 -1
- package/dist/core/modal/sd-modal.d.ts.map +1 -1
- package/dist/core/modal/sd-modal.js +135 -39
- package/dist/core/modal/sd-modal.provider.js +5 -5
- package/dist/core/modal/sd-prompt-modal.js +1 -1
- package/dist/core/provideSdAngular.d.ts.map +1 -1
- package/dist/core/provideSdAngular.js +0 -10
- package/dist/core/ripple/setupRipple.js +5 -5
- package/dist/core/routing/menu-utils.js +1 -1
- package/dist/core/routing/sd-navigate-window.provider.js +1 -1
- package/dist/core/routing/sd-router-link.js +1 -1
- package/dist/core/selection/setupCumulateSelectedKeys.js +3 -3
- package/dist/core/setupModelHook.js +1 -1
- package/dist/core/toast/sd-toast-container.d.ts +1 -1
- package/dist/core/toast/sd-toast-container.js +3 -7
- package/dist/core/toast/sd-toast.d.ts.map +1 -1
- package/dist/core/toast/sd-toast.js +27 -24
- package/dist/core/toast/sd-toast.provider.js +6 -6
- package/dist/core/validation/setupInvalid.js +2 -1
- package/dist/data/data-detail/sd-data-detail.d.ts +2 -1
- package/dist/data/data-detail/sd-data-detail.d.ts.map +1 -1
- package/dist/data/data-detail/sd-data-detail.js +37 -33
- package/dist/data/data-select-button/sd-data-select-button.js +1 -1
- package/dist/data/data-sheet/sd-data-sheet.d.ts +2 -1
- package/dist/data/data-sheet/sd-data-sheet.d.ts.map +1 -1
- package/dist/data/data-sheet/sd-data-sheet.js +30 -22
- package/dist/data/kanban/sd-kanban-board.js +1 -1
- package/dist/data/kanban/sd-kanban-lane.js +1 -1
- package/dist/data/kanban/sd-kanban.d.ts +1 -1
- package/dist/data/kanban/sd-kanban.d.ts.map +1 -1
- package/dist/data/kanban/sd-kanban.js +4 -4
- package/dist/data/permission-table/sd-permission-table.js +6 -6
- package/dist/data/shared-data/sd-shared-data-select-button.js +1 -1
- package/dist/data/shared-data/sd-shared-data-select-list.js +3 -3
- package/dist/data/shared-data/sd-shared-data-select.d.ts +1 -1
- package/dist/data/shared-data/sd-shared-data-select.d.ts.map +1 -1
- package/dist/data/shared-data/sd-shared-data-select.js +29 -54
- package/dist/data/sheet/injectSheetDomAccessor.d.ts +6 -2
- package/dist/data/sheet/injectSheetDomAccessor.d.ts.map +1 -1
- package/dist/data/sheet/injectSheetDomAccessor.js +27 -22
- package/dist/data/sheet/injectSheetSelectRowIndicator.d.ts +10 -0
- package/dist/data/sheet/injectSheetSelectRowIndicator.d.ts.map +1 -0
- package/dist/data/sheet/injectSheetSelectRowIndicator.js +55 -0
- package/dist/data/sheet/sd-sheet-config.modal.d.ts +18 -19
- package/dist/data/sheet/sd-sheet-config.modal.d.ts.map +1 -1
- package/dist/data/sheet/sd-sheet-config.modal.js +357 -217
- package/dist/data/sheet/sd-sheet.d.ts +27 -13
- package/dist/data/sheet/sd-sheet.d.ts.map +1 -1
- package/dist/data/sheet/sd-sheet.js +609 -291
- package/dist/data/sheet/useSheetCellAgent.js +6 -6
- package/dist/data/sheet/useSheetCellStyling.d.ts.map +1 -1
- package/dist/data/sheet/useSheetCellStyling.js +4 -4
- package/dist/data/sheet/useSheetFocusIndicator.d.ts +7 -0
- package/dist/data/sheet/useSheetFocusIndicator.d.ts.map +1 -0
- package/dist/data/sheet/useSheetFocusIndicator.js +53 -0
- package/dist/data/sheet/useSheetLayoutEngine.js +1 -1
- package/dist/data/state-preset/sd-state-preset.d.ts.map +1 -1
- package/dist/data/state-preset/sd-state-preset.js +14 -14
- package/dist/features/address/sd-address-search.modal.js +3 -3
- package/dist/features/editor/sd-tiptap-editor.js +6 -6
- package/dist/features/editor/useTiptapToolbar.js +2 -2
- package/dist/features/theme/sd-theme-selector.js +1 -1
- package/dist/features/visual/sd-barcode.js +1 -1
- package/dist/features/visual/sd-calendar.js +2 -2
- package/dist/features/visual/sd-echarts.d.ts +2 -1
- package/dist/features/visual/sd-echarts.d.ts.map +1 -1
- package/dist/features/visual/sd-echarts.js +5 -3
- package/dist/features/visual/sd-label.js +1 -1
- package/dist/features/visual/sd-note.js +1 -1
- package/dist/features/visual/sd-progress.js +1 -1
- package/dist/index.d.ts +3 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -5
- package/dist/layout/base-container/sd-base-container.js +3 -3
- package/dist/layout/dock/sd-dock-container.js +1 -1
- package/dist/layout/dock/sd-dock.d.ts +3 -2
- package/dist/layout/dock/sd-dock.d.ts.map +1 -1
- package/dist/layout/dock/sd-dock.js +6 -4
- package/dist/layout/sidebar/sd-sidebar-container.js +5 -5
- package/dist/layout/sidebar/sd-sidebar-menu.d.ts.map +1 -1
- package/dist/layout/sidebar/sd-sidebar-menu.js +7 -6
- package/dist/layout/sidebar/sd-sidebar-user.js +1 -1
- package/dist/layout/sidebar/sd-sidebar.js +1 -1
- package/dist/layout/topbar/sd-topbar-container.js +1 -1
- package/dist/layout/topbar/sd-topbar-menu.d.ts.map +1 -1
- package/dist/layout/topbar/sd-topbar-menu.js +7 -7
- package/dist/layout/topbar/sd-topbar-user.js +1 -1
- package/dist/layout/topbar/sd-topbar.js +3 -3
- package/package.json +5 -5
- package/src/controls/button/sd-modal-select-button.ts +7 -2
- package/src/controls/collapse/sd-collapse-icon.ts +2 -2
- package/src/controls/collapse/sd-collapse.ts +4 -5
- package/src/controls/dropdown/sd-dropdown-popup.ts +15 -2
- package/src/controls/dropdown/sd-dropdown.ts +4 -16
- package/src/controls/gap/sd-gap.ts +4 -4
- package/src/controls/input/sd-date-range-picker.ts +13 -16
- package/src/controls/input/sd-numpad.ts +1 -1
- package/src/controls/input/sd-textarea.ts +1 -1
- package/src/controls/input/sd-textfield-type-handlers.ts +2 -2
- package/src/controls/input/sd-textfield.ts +6 -6
- package/src/controls/list/sd-list-item.ts +40 -26
- package/src/controls/list/sd-list.ts +2 -1
- package/src/controls/select/sd-select-button.ts +8 -11
- package/src/controls/select/sd-select-item.ts +35 -27
- package/src/controls/select/sd-select.ts +111 -41
- package/src/core/app-structure/sd-app-structure.utils.ts +1 -1
- package/src/core/busy/sd-busy-container.ts +235 -123
- package/src/core/busy/sd-busy.provider.ts +1 -1
- package/src/core/commands/sd-command.ts +46 -0
- package/src/core/error-handler/sd-global-error-handler.plugin.ts +1 -1
- package/src/core/events/sd-events.ts +1 -12
- package/src/core/events/sd-intersection.ts +29 -0
- package/src/core/events/{sd-resize-event.plugin.ts → sd-resize.ts} +17 -24
- package/src/core/file-dialog/sd-file-dialog.provider.ts +1 -1
- package/src/core/modal/injectDragResize.ts +9 -9
- package/src/core/modal/injectFocusTrap.ts +1 -1
- package/src/core/modal/sd-modal.provider.ts +5 -5
- package/src/core/modal/sd-modal.ts +119 -41
- package/src/core/provideSdAngular.ts +0 -10
- package/src/core/ripple/setupRipple.ts +5 -5
- package/src/core/routing/menu-utils.ts +1 -1
- package/src/core/routing/sd-navigate-window.provider.ts +1 -1
- package/src/core/routing/sd-router-link.ts +1 -1
- package/src/core/selection/setupCumulateSelectedKeys.ts +3 -3
- package/src/core/setupModelHook.ts +1 -1
- package/src/core/toast/sd-toast-container.ts +1 -1
- package/src/core/toast/sd-toast.provider.ts +6 -6
- package/src/core/toast/sd-toast.ts +25 -22
- package/src/core/validation/setupInvalid.ts +2 -1
- package/src/data/data-detail/sd-data-detail.ts +15 -11
- package/src/data/data-sheet/sd-data-sheet.ts +13 -15
- package/src/data/kanban/sd-kanban.ts +4 -5
- package/src/data/permission-table/sd-permission-table.ts +4 -4
- package/src/data/shared-data/sd-shared-data-select-list.ts +1 -1
- package/src/data/shared-data/sd-shared-data-select.ts +8 -27
- package/src/data/sheet/injectSheetDomAccessor.ts +37 -25
- package/src/data/sheet/injectSheetSelectRowIndicator.ts +69 -0
- package/src/data/sheet/sd-sheet-config.modal.ts +215 -191
- package/src/data/sheet/sd-sheet.ts +529 -209
- package/src/data/sheet/useSheetCellAgent.ts +8 -8
- package/src/data/sheet/useSheetCellStyling.ts +4 -8
- package/src/data/sheet/useSheetFocusIndicator.ts +66 -0
- package/src/data/sheet/useSheetLayoutEngine.ts +1 -1
- package/src/data/state-preset/sd-state-preset.ts +26 -13
- package/src/features/address/sd-address-search.modal.ts +1 -1
- package/src/features/editor/sd-tiptap-editor.ts +4 -4
- package/src/features/editor/useTiptapToolbar.ts +2 -2
- package/src/features/visual/sd-calendar.ts +1 -1
- package/src/features/visual/sd-echarts.ts +2 -0
- package/src/index.ts +4 -6
- package/src/layout/base-container/sd-base-container.ts +1 -1
- package/src/layout/dock/sd-dock.ts +3 -2
- package/src/layout/sidebar/sd-sidebar-container.ts +2 -2
- package/src/layout/sidebar/sd-sidebar-menu.ts +1 -3
- package/src/layout/topbar/sd-topbar-menu.ts +11 -15
- package/src/layout/topbar/sd-topbar.ts +1 -1
- package/dist/core/commands/sd-insert-command-event.plugin.d.ts +0 -11
- package/dist/core/commands/sd-insert-command-event.plugin.d.ts.map +0 -1
- package/dist/core/commands/sd-insert-command-event.plugin.js +0 -35
- package/dist/core/commands/sd-refresh-command-event.plugin.d.ts +0 -11
- package/dist/core/commands/sd-refresh-command-event.plugin.d.ts.map +0 -1
- package/dist/core/commands/sd-refresh-command-event.plugin.js +0 -38
- package/dist/core/commands/sd-save-command-event.plugin.d.ts +0 -11
- package/dist/core/commands/sd-save-command-event.plugin.d.ts.map +0 -1
- package/dist/core/commands/sd-save-command-event.plugin.js +0 -38
- package/dist/core/events/sd-intersection-event.plugin.d.ts +0 -13
- package/dist/core/events/sd-intersection-event.plugin.d.ts.map +0 -1
- package/dist/core/events/sd-intersection-event.plugin.js +0 -29
- package/dist/core/events/sd-resize-event.plugin.d.ts +0 -16
- package/dist/core/events/sd-resize-event.plugin.d.ts.map +0 -1
- package/src/core/commands/sd-insert-command-event.plugin.ts +0 -39
- package/src/core/commands/sd-refresh-command-event.plugin.ts +0 -44
- package/src/core/commands/sd-save-command-event.plugin.ts +0 -44
- package/src/core/events/sd-intersection-event.plugin.ts +0 -35
|
@@ -30,10 +30,10 @@ export function injectDragResize(opt: DragResizeOptions): {
|
|
|
30
30
|
| undefined;
|
|
31
31
|
|
|
32
32
|
function applyDrag(event: MouseEvent): void {
|
|
33
|
-
if (dragState
|
|
33
|
+
if (dragState == null) return;
|
|
34
34
|
|
|
35
35
|
const dialogEl = opt.getDialogEl();
|
|
36
|
-
if (dialogEl
|
|
36
|
+
if (dialogEl == null) return;
|
|
37
37
|
|
|
38
38
|
const dx = event.clientX - dragState.startX;
|
|
39
39
|
const dy = event.clientY - dragState.startY;
|
|
@@ -43,10 +43,10 @@ export function injectDragResize(opt: DragResizeOptions): {
|
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
function applyResize(event: MouseEvent): void {
|
|
46
|
-
if (resizeState
|
|
46
|
+
if (resizeState == null) return;
|
|
47
47
|
|
|
48
48
|
const dialogEl = opt.getDialogEl();
|
|
49
|
-
if (dialogEl
|
|
49
|
+
if (dialogEl == null) return;
|
|
50
50
|
|
|
51
51
|
const dx = event.clientX - resizeState.startX;
|
|
52
52
|
const dy = event.clientY - resizeState.startY;
|
|
@@ -86,16 +86,16 @@ export function injectDragResize(opt: DragResizeOptions): {
|
|
|
86
86
|
}
|
|
87
87
|
|
|
88
88
|
function onDocumentMouseMove(event: MouseEvent): void {
|
|
89
|
-
if (resizeState
|
|
89
|
+
if (resizeState != null) {
|
|
90
90
|
applyResize(event);
|
|
91
91
|
}
|
|
92
|
-
if (dragState
|
|
92
|
+
if (dragState != null) {
|
|
93
93
|
applyDrag(event);
|
|
94
94
|
}
|
|
95
95
|
}
|
|
96
96
|
|
|
97
97
|
function onDocumentMouseUp(): void {
|
|
98
|
-
const hadState = resizeState
|
|
98
|
+
const hadState = resizeState != null || dragState != null;
|
|
99
99
|
resizeState = undefined;
|
|
100
100
|
dragState = undefined;
|
|
101
101
|
document.removeEventListener("mousemove", onDocumentMouseMove);
|
|
@@ -114,7 +114,7 @@ export function injectDragResize(opt: DragResizeOptions): {
|
|
|
114
114
|
|
|
115
115
|
function startDrag(event: MouseEvent): void {
|
|
116
116
|
const dialogEl = opt.getDialogEl();
|
|
117
|
-
if (dialogEl
|
|
117
|
+
if (dialogEl == null) return;
|
|
118
118
|
|
|
119
119
|
const dialogRect = dialogEl.getBoundingClientRect();
|
|
120
120
|
const parentRect = getParentRect(dialogEl);
|
|
@@ -131,7 +131,7 @@ export function injectDragResize(opt: DragResizeOptions): {
|
|
|
131
131
|
|
|
132
132
|
function startResize(event: MouseEvent, dir: string): void {
|
|
133
133
|
const dialogEl = opt.getDialogEl();
|
|
134
|
-
if (dialogEl
|
|
134
|
+
if (dialogEl == null) return;
|
|
135
135
|
|
|
136
136
|
const dialogRect = dialogEl.getBoundingClientRect();
|
|
137
137
|
const parentRect = getParentRect(dialogEl);
|
|
@@ -10,7 +10,7 @@ export function injectFocusTrap(): {
|
|
|
10
10
|
const result: HTMLElement[] = [];
|
|
11
11
|
const walker = document.createTreeWalker(container, NodeFilter.SHOW_ELEMENT);
|
|
12
12
|
let node = walker.nextNode();
|
|
13
|
-
while (node
|
|
13
|
+
while (node != null) {
|
|
14
14
|
if (node instanceof HTMLElement && isTabbable(node)) {
|
|
15
15
|
result.push(node);
|
|
16
16
|
}
|
|
@@ -125,9 +125,9 @@ export class SdModalProvider {
|
|
|
125
125
|
|
|
126
126
|
// 6. 옵션 바인딩
|
|
127
127
|
modalRef.setInput("title", modal.title);
|
|
128
|
-
if (options
|
|
128
|
+
if (options != null) {
|
|
129
129
|
for (const [key, value] of Object.entries(options)) {
|
|
130
|
-
if (value
|
|
130
|
+
if (value != null && key !== "noFirstControlFocusing") {
|
|
131
131
|
modalRef.setInput(key, value);
|
|
132
132
|
}
|
|
133
133
|
}
|
|
@@ -174,7 +174,7 @@ export class SdModalProvider {
|
|
|
174
174
|
// 컨텐츠 영역에서 첫 탭 이동 가능 요소 검색
|
|
175
175
|
const contentEl = modalEl.querySelector("._content");
|
|
176
176
|
const firstTabbable = contentEl?.findFirstTabbableChild();
|
|
177
|
-
if (firstTabbable
|
|
177
|
+
if (firstTabbable != null) {
|
|
178
178
|
firstTabbable.focus();
|
|
179
179
|
} else {
|
|
180
180
|
dialogEl.focus();
|
|
@@ -197,7 +197,7 @@ export class SdModalProvider {
|
|
|
197
197
|
|
|
198
198
|
const doDestroy = () => {
|
|
199
199
|
// DOM에서 제거
|
|
200
|
-
if (modalEl.parentNode
|
|
200
|
+
if (modalEl.parentNode != null) {
|
|
201
201
|
modalEl.parentNode.removeChild(modalEl);
|
|
202
202
|
}
|
|
203
203
|
|
|
@@ -211,7 +211,7 @@ export class SdModalProvider {
|
|
|
211
211
|
this.modalCount.update((v) => v - 1);
|
|
212
212
|
|
|
213
213
|
// 포커스 복귀
|
|
214
|
-
if (prevActiveEl
|
|
214
|
+
if (prevActiveEl != null && prevActiveEl.isConnected) {
|
|
215
215
|
prevActiveEl.focus();
|
|
216
216
|
}
|
|
217
217
|
|
|
@@ -18,6 +18,8 @@ import { SdActivatedModalProvider } from "./sd-activated-modal.provider";
|
|
|
18
18
|
import { SdSystemConfigProvider } from "../config/sd-system-config.provider";
|
|
19
19
|
import { injectFocusTrap } from "./injectFocusTrap";
|
|
20
20
|
import { injectDragResize } from "./injectDragResize";
|
|
21
|
+
import { SdAnchor } from "../../controls/button/sd-anchor";
|
|
22
|
+
import { SdResizeDirective, type SdResizeEvent } from "../events/sd-resize";
|
|
21
23
|
import "@simplysm/core-browser";
|
|
22
24
|
|
|
23
25
|
@Component({
|
|
@@ -25,39 +27,86 @@ import "@simplysm/core-browser";
|
|
|
25
27
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
26
28
|
encapsulation: ViewEncapsulation.None,
|
|
27
29
|
standalone: true,
|
|
28
|
-
imports: [NgTemplateOutlet, NgIcon],
|
|
30
|
+
imports: [NgTemplateOutlet, NgIcon, SdAnchor, SdResizeDirective],
|
|
31
|
+
hostDirectives: [{ directive: SdResizeDirective, outputs: ["sdResize"] }],
|
|
29
32
|
host: {
|
|
30
33
|
"[attr.data-sd-open]": "open() || undefined",
|
|
31
34
|
"[attr.data-sd-float]": "float() || undefined",
|
|
32
35
|
"[attr.data-sd-fill]": "fill() || undefined",
|
|
33
36
|
"[attr.data-sd-position]": "position() || undefined",
|
|
37
|
+
"(sdResize)": "onHostResize($event)",
|
|
38
|
+
"(window:resize)": "onWindowResize()",
|
|
34
39
|
},
|
|
35
40
|
template: `
|
|
36
|
-
<div
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
41
|
+
<div
|
|
42
|
+
class="_backdrop"
|
|
43
|
+
tabindex="-1"
|
|
44
|
+
role="button"
|
|
45
|
+
(click)="onBackdropClick()"
|
|
46
|
+
(keydown.enter)="onBackdropClick()"
|
|
47
|
+
></div>
|
|
48
|
+
<div
|
|
49
|
+
class="_dialog"
|
|
50
|
+
tabindex="-1"
|
|
51
|
+
(keydown)="onDialogKeydown($event)"
|
|
52
|
+
(focus)="onDialogFocus()"
|
|
53
|
+
(sdResize)="onDialogResize($event)"
|
|
54
|
+
>
|
|
40
55
|
@if (!hideHeader()) {
|
|
41
56
|
<div class="_header" (mousedown)="onHeaderMouseDown($event)" [style]="headerStyle()">
|
|
42
|
-
<
|
|
57
|
+
<h5 class="_title">{{ title() }}</h5>
|
|
43
58
|
@if (actionTplRef()) {
|
|
44
59
|
<ng-container *ngTemplateOutlet="actionTplRef()!" />
|
|
45
60
|
}
|
|
46
61
|
@if (!hideCloseButton()) {
|
|
47
|
-
<
|
|
62
|
+
<sd-anchor [theme]="'gray'" class="_close-btn" (click)="onCloseButtonClick()">
|
|
63
|
+
<ng-icon [svg]="tablerX" />
|
|
64
|
+
</sd-anchor>
|
|
48
65
|
}
|
|
49
66
|
</div>
|
|
50
67
|
}
|
|
51
68
|
<div class="_content"><ng-content /></div>
|
|
52
69
|
@if (resizable()) {
|
|
53
|
-
<div
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
<div
|
|
59
|
-
|
|
60
|
-
|
|
70
|
+
<div
|
|
71
|
+
class="_resize-handle _resize-top"
|
|
72
|
+
data-resize-dir="top"
|
|
73
|
+
(mousedown)="onResizeMouseDown($event, 'top')"
|
|
74
|
+
></div>
|
|
75
|
+
<div
|
|
76
|
+
class="_resize-handle _resize-bottom"
|
|
77
|
+
data-resize-dir="bottom"
|
|
78
|
+
(mousedown)="onResizeMouseDown($event, 'bottom')"
|
|
79
|
+
></div>
|
|
80
|
+
<div
|
|
81
|
+
class="_resize-handle _resize-left"
|
|
82
|
+
data-resize-dir="left"
|
|
83
|
+
(mousedown)="onResizeMouseDown($event, 'left')"
|
|
84
|
+
></div>
|
|
85
|
+
<div
|
|
86
|
+
class="_resize-handle _resize-right"
|
|
87
|
+
data-resize-dir="right"
|
|
88
|
+
(mousedown)="onResizeMouseDown($event, 'right')"
|
|
89
|
+
></div>
|
|
90
|
+
<div
|
|
91
|
+
class="_resize-handle _resize-top-left"
|
|
92
|
+
data-resize-dir="top-left"
|
|
93
|
+
(mousedown)="onResizeMouseDown($event, 'top-left')"
|
|
94
|
+
></div>
|
|
95
|
+
<div
|
|
96
|
+
class="_resize-handle _resize-top-right"
|
|
97
|
+
data-resize-dir="top-right"
|
|
98
|
+
(mousedown)="onResizeMouseDown($event, 'top-right')"
|
|
99
|
+
></div>
|
|
100
|
+
<div
|
|
101
|
+
class="_resize-handle _resize-bottom-left"
|
|
102
|
+
data-resize-dir="bottom-left"
|
|
103
|
+
(mousedown)="onResizeMouseDown($event, 'bottom-left')"
|
|
104
|
+
></div>
|
|
105
|
+
<div
|
|
106
|
+
class="_resize-handle _resize-bottom-right"
|
|
107
|
+
data-resize-dir="bottom-right"
|
|
108
|
+
(mousedown)="onResizeMouseDown($event, 'bottom-right')"
|
|
109
|
+
></div>
|
|
61
110
|
}
|
|
62
111
|
</div>
|
|
63
112
|
`,
|
|
@@ -117,19 +166,7 @@ import "@simplysm/core-browser";
|
|
|
117
166
|
}
|
|
118
167
|
|
|
119
168
|
> ._close-btn {
|
|
120
|
-
display: flex;
|
|
121
|
-
align-items: center;
|
|
122
|
-
justify-content: center;
|
|
123
169
|
padding: var(--gap-sm) var(--gap-default);
|
|
124
|
-
border: none;
|
|
125
|
-
background: transparent;
|
|
126
|
-
cursor: pointer;
|
|
127
|
-
font-size: inherit;
|
|
128
|
-
color: inherit;
|
|
129
|
-
|
|
130
|
-
&:hover {
|
|
131
|
-
background: var(--trans-lightest);
|
|
132
|
-
}
|
|
133
170
|
}
|
|
134
171
|
}
|
|
135
172
|
|
|
@@ -329,16 +366,16 @@ export class SdModal {
|
|
|
329
366
|
// widthPx/heightPx를 dialog 스타일에 적용
|
|
330
367
|
effect(() => {
|
|
331
368
|
const dialogEl = this._getDialogEl();
|
|
332
|
-
if (dialogEl
|
|
369
|
+
if (dialogEl == null) return;
|
|
333
370
|
|
|
334
371
|
const w = this.widthPx();
|
|
335
372
|
const h = this.heightPx();
|
|
336
|
-
if (w
|
|
373
|
+
if (w != null) {
|
|
337
374
|
dialogEl.style.width = `${w}px`;
|
|
338
375
|
} else {
|
|
339
376
|
dialogEl.style.width = "";
|
|
340
377
|
}
|
|
341
|
-
if (h
|
|
378
|
+
if (h != null) {
|
|
342
379
|
dialogEl.style.height = `${h}px`;
|
|
343
380
|
} else {
|
|
344
381
|
dialogEl.style.height = "";
|
|
@@ -348,11 +385,10 @@ export class SdModal {
|
|
|
348
385
|
// key 기반 설정 복원
|
|
349
386
|
effect(() => {
|
|
350
387
|
const k = this.key();
|
|
351
|
-
if (k
|
|
388
|
+
if (k == null || this._sdSystemConfig == null) return;
|
|
352
389
|
|
|
353
390
|
void this._restoreConfig(k).catch((err) => this._errorHandler.handleError(err));
|
|
354
391
|
});
|
|
355
|
-
|
|
356
392
|
}
|
|
357
393
|
|
|
358
394
|
onResizeMouseDown(event: MouseEvent, dir: string): void {
|
|
@@ -362,7 +398,7 @@ export class SdModal {
|
|
|
362
398
|
|
|
363
399
|
onHeaderMouseDown(event: MouseEvent): void {
|
|
364
400
|
if (!this.movable()) return;
|
|
365
|
-
if ((event.target as HTMLElement).closest("button")
|
|
401
|
+
if ((event.target as HTMLElement).closest("button, sd-anchor") != null) return;
|
|
366
402
|
event.preventDefault();
|
|
367
403
|
this._dragResize.startDrag(event);
|
|
368
404
|
}
|
|
@@ -389,8 +425,30 @@ export class SdModal {
|
|
|
389
425
|
this._bringToFront();
|
|
390
426
|
}
|
|
391
427
|
|
|
428
|
+
onHostResize(event: SdResizeEvent): void {
|
|
429
|
+
if (event.heightChanged) this._calcHeight();
|
|
430
|
+
if (event.widthChanged) this._calcWidth();
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
onDialogResize(event: SdResizeEvent): void {
|
|
434
|
+
if (event.heightChanged) this._calcHeight();
|
|
435
|
+
if (event.widthChanged) this._calcWidth();
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
onWindowResize(): void {
|
|
439
|
+
const dialogEl = this._getDialogEl();
|
|
440
|
+
if (dialogEl == null) return;
|
|
441
|
+
const hostEl = this._elRef.nativeElement;
|
|
442
|
+
if (dialogEl.offsetLeft > hostEl.offsetWidth - 100) {
|
|
443
|
+
dialogEl.style.left = hostEl.offsetWidth - 100 + "px";
|
|
444
|
+
}
|
|
445
|
+
if (dialogEl.offsetTop > hostEl.offsetHeight - 100) {
|
|
446
|
+
dialogEl.style.top = hostEl.offsetHeight - 100 + "px";
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
|
|
392
450
|
private _requestClose(): void {
|
|
393
|
-
if (this._sdActivatedModal
|
|
451
|
+
if (this._sdActivatedModal != null && !this._sdActivatedModal.canDeactivateFn()) {
|
|
394
452
|
return;
|
|
395
453
|
}
|
|
396
454
|
void this._saveConfig().catch((err) => this._errorHandler.handleError(err));
|
|
@@ -413,16 +471,36 @@ export class SdModal {
|
|
|
413
471
|
hostEl.style.zIndex = String(maxZ + 1);
|
|
414
472
|
}
|
|
415
473
|
|
|
474
|
+
private _calcHeight(): void {
|
|
475
|
+
const dialogEl = this._getDialogEl();
|
|
476
|
+
if (dialogEl == null) return;
|
|
477
|
+
const style = getComputedStyle(this._elRef.nativeElement);
|
|
478
|
+
const paddingTop = style.paddingTop === "" ? 0 : parseInt(style.paddingTop, 10) || 0;
|
|
479
|
+
if (dialogEl.offsetHeight > this._elRef.nativeElement.offsetHeight - paddingTop) {
|
|
480
|
+
dialogEl.style.maxHeight = "100%";
|
|
481
|
+
dialogEl.style.height = "100%";
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
private _calcWidth(): void {
|
|
486
|
+
const dialogEl = this._getDialogEl();
|
|
487
|
+
if (dialogEl == null) return;
|
|
488
|
+
if (dialogEl.offsetWidth > this._elRef.nativeElement.offsetWidth) {
|
|
489
|
+
dialogEl.style.maxWidth = "100%";
|
|
490
|
+
dialogEl.style.width = "100%";
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
|
|
416
494
|
private _getDialogEl(): HTMLElement | null {
|
|
417
495
|
return this._elRef.nativeElement.querySelector("._dialog");
|
|
418
496
|
}
|
|
419
497
|
|
|
420
498
|
private async _saveConfig(): Promise<void> {
|
|
421
499
|
const k = this.key();
|
|
422
|
-
if (k
|
|
500
|
+
if (k == null || this._sdSystemConfig == null) return;
|
|
423
501
|
|
|
424
502
|
const dialogEl = this._getDialogEl();
|
|
425
|
-
if (dialogEl
|
|
503
|
+
if (dialogEl == null) return;
|
|
426
504
|
|
|
427
505
|
const config: Record<string, string> = {};
|
|
428
506
|
if (dialogEl.style.width !== "") config["width"] = dialogEl.style.width;
|
|
@@ -442,11 +520,11 @@ export class SdModal {
|
|
|
442
520
|
if (config == null) return;
|
|
443
521
|
|
|
444
522
|
const dialogEl = this._getDialogEl();
|
|
445
|
-
if (dialogEl
|
|
523
|
+
if (dialogEl == null) return;
|
|
446
524
|
|
|
447
|
-
if (config["width"]
|
|
448
|
-
if (config["height"]
|
|
449
|
-
if (config["left"]
|
|
450
|
-
if (config["top"]
|
|
525
|
+
if (config["width"] != null) dialogEl.style.width = config["width"];
|
|
526
|
+
if (config["height"] != null) dialogEl.style.height = config["height"];
|
|
527
|
+
if (config["left"] != null) dialogEl.style.left = config["left"];
|
|
528
|
+
if (config["top"] != null) dialogEl.style.top = config["top"];
|
|
451
529
|
}
|
|
452
530
|
}
|
|
@@ -27,11 +27,6 @@ import { SdAngularConfigProvider } from "./config/sd-angular-config.provider";
|
|
|
27
27
|
import { SdThemeProvider } from "../features/theme/sd-theme-provider";
|
|
28
28
|
import { SdLocalStorageProvider } from "./config/sd-local-storage.provider";
|
|
29
29
|
import { SdGlobalErrorHandlerPlugin } from "./error-handler/sd-global-error-handler.plugin";
|
|
30
|
-
import { SdSaveCommandEventPlugin } from "./commands/sd-save-command-event.plugin";
|
|
31
|
-
import { SdRefreshCommandEventPlugin } from "./commands/sd-refresh-command-event.plugin";
|
|
32
|
-
import { SdInsertCommandEventPlugin } from "./commands/sd-insert-command-event.plugin";
|
|
33
|
-
import { SdResizeEventPlugin } from "./events/sd-resize-event.plugin";
|
|
34
|
-
import { SdIntersectionEventPlugin } from "./events/sd-intersection-event.plugin";
|
|
35
30
|
import { SdOptionEventPlugin } from "./events/sd-option-event.plugin";
|
|
36
31
|
|
|
37
32
|
export function provideSdAngular(opt: { clientName: string }): EnvironmentProviders {
|
|
@@ -109,11 +104,6 @@ export function provideSdAngular(opt: { clientName: string }): EnvironmentProvid
|
|
|
109
104
|
return provider;
|
|
110
105
|
},
|
|
111
106
|
},
|
|
112
|
-
{ provide: EVENT_MANAGER_PLUGINS, useClass: SdSaveCommandEventPlugin, multi: true },
|
|
113
|
-
{ provide: EVENT_MANAGER_PLUGINS, useClass: SdRefreshCommandEventPlugin, multi: true },
|
|
114
|
-
{ provide: EVENT_MANAGER_PLUGINS, useClass: SdInsertCommandEventPlugin, multi: true },
|
|
115
|
-
{ provide: EVENT_MANAGER_PLUGINS, useClass: SdResizeEventPlugin, multi: true },
|
|
116
|
-
{ provide: EVENT_MANAGER_PLUGINS, useClass: SdIntersectionEventPlugin, multi: true },
|
|
117
107
|
{ provide: EVENT_MANAGER_PLUGINS, useClass: SdOptionEventPlugin, multi: true },
|
|
118
108
|
{ provide: ErrorHandler, useClass: SdGlobalErrorHandlerPlugin },
|
|
119
109
|
provideZonelessChangeDetection(),
|
|
@@ -14,7 +14,7 @@ export function setupRipple(enableFn?: () => boolean): void {
|
|
|
14
14
|
let indicatorEl: HTMLElement | undefined;
|
|
15
15
|
|
|
16
16
|
const onPointerDown = (event: PointerEvent): void => {
|
|
17
|
-
if (enableFn
|
|
17
|
+
if (enableFn != null && !enableFn()) return;
|
|
18
18
|
|
|
19
19
|
const rect = el.getBoundingClientRect();
|
|
20
20
|
const size = Math.max(rect.width, rect.height);
|
|
@@ -22,7 +22,7 @@ export function setupRipple(enableFn?: () => boolean): void {
|
|
|
22
22
|
const x = event.clientX - rect.left;
|
|
23
23
|
const y = event.clientY - rect.top;
|
|
24
24
|
|
|
25
|
-
if (indicatorEl
|
|
25
|
+
if (indicatorEl != null) {
|
|
26
26
|
indicatorEl.remove();
|
|
27
27
|
}
|
|
28
28
|
|
|
@@ -45,21 +45,21 @@ export function setupRipple(enableFn?: () => boolean): void {
|
|
|
45
45
|
el.appendChild(indicatorEl);
|
|
46
46
|
|
|
47
47
|
indicatorEl.ontransitionend = (ev: TransitionEvent) => {
|
|
48
|
-
if (ev.propertyName === "opacity" && indicatorEl
|
|
48
|
+
if (ev.propertyName === "opacity" && indicatorEl != null) {
|
|
49
49
|
indicatorEl.remove();
|
|
50
50
|
indicatorEl = undefined;
|
|
51
51
|
}
|
|
52
52
|
};
|
|
53
53
|
|
|
54
54
|
requestAnimationFrame(() => {
|
|
55
|
-
if (indicatorEl
|
|
55
|
+
if (indicatorEl != null) {
|
|
56
56
|
indicatorEl.style.transform = "scale(1)";
|
|
57
57
|
}
|
|
58
58
|
});
|
|
59
59
|
};
|
|
60
60
|
|
|
61
61
|
const onPointerUp = (): void => {
|
|
62
|
-
if (indicatorEl
|
|
62
|
+
if (indicatorEl != null) {
|
|
63
63
|
indicatorEl.style.opacity = "0";
|
|
64
64
|
}
|
|
65
65
|
};
|
|
@@ -5,7 +5,7 @@ export type { SdMenu } from "../app-structure/sd-app-structure.types";
|
|
|
5
5
|
export function getMenuRouterLinkOption(
|
|
6
6
|
menu: SdMenu,
|
|
7
7
|
): { link: string; queryParams: Record<string, string> | undefined } | undefined {
|
|
8
|
-
if (menu.children
|
|
8
|
+
if (menu.children != null || menu.url != null) {
|
|
9
9
|
return undefined;
|
|
10
10
|
}
|
|
11
11
|
|
|
@@ -34,7 +34,7 @@ export class SdNavigateWindowProvider {
|
|
|
34
34
|
});
|
|
35
35
|
}
|
|
36
36
|
} else {
|
|
37
|
-
const paramStr = params
|
|
37
|
+
const paramStr = params != null ? new URLSearchParams(params).toString() : "";
|
|
38
38
|
const suffix = paramStr !== "" ? `;${paramStr}` : "";
|
|
39
39
|
window.open(
|
|
40
40
|
`${location.pathname}#${navigate}${suffix}`,
|
|
@@ -55,7 +55,7 @@ export class SdRouterLink {
|
|
|
55
55
|
? "?" + new URLSearchParams(option.queryParams).toString()
|
|
56
56
|
: "";
|
|
57
57
|
this._sdNavigateWindow.open(option.link + qp, option.params);
|
|
58
|
-
} else if (option.outletName
|
|
58
|
+
} else if (option.outletName == null) {
|
|
59
59
|
await this._router.navigate(
|
|
60
60
|
[option.link, ...(option.params ? [option.params] : [])],
|
|
61
61
|
option.queryParams ? { queryParams: option.queryParams } : undefined,
|
|
@@ -15,11 +15,11 @@ export function setupCumulateSelectedKeys<TItem, TKey>(options: {
|
|
|
15
15
|
if (selectedItems.length === 0) return;
|
|
16
16
|
|
|
17
17
|
const itemKeySet = new Set(
|
|
18
|
-
items.map((item) => options.keySelectorFn(item)).filter((k) => k
|
|
18
|
+
items.map((item) => options.keySelectorFn(item)).filter((k) => k != null),
|
|
19
19
|
);
|
|
20
20
|
const filtered = selectedItems.filter((item) => {
|
|
21
21
|
const key = options.keySelectorFn(item);
|
|
22
|
-
return key
|
|
22
|
+
return key != null && itemKeySet.has(key);
|
|
23
23
|
});
|
|
24
24
|
|
|
25
25
|
if (filtered.length !== selectedItems.length) {
|
|
@@ -32,7 +32,7 @@ export function setupCumulateSelectedKeys<TItem, TKey>(options: {
|
|
|
32
32
|
const selectedItems = options.selectedItems();
|
|
33
33
|
const keys = selectedItems
|
|
34
34
|
.map((item) => options.keySelectorFn(item))
|
|
35
|
-
.filter((k): k is TKey => k
|
|
35
|
+
.filter((k): k is TKey => k != null);
|
|
36
36
|
options.selectedItemKeys.set(keys);
|
|
37
37
|
});
|
|
38
38
|
}
|
|
@@ -48,14 +48,14 @@ export class SdToastProvider {
|
|
|
48
48
|
|
|
49
49
|
constructor() {
|
|
50
50
|
effect(() => {
|
|
51
|
-
if (this._containerRef
|
|
51
|
+
if (this._containerRef != null) {
|
|
52
52
|
this._containerRef.setInput("overlap", this.overlap());
|
|
53
53
|
}
|
|
54
54
|
});
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
private _getContainerRef(): ComponentRef<SdToastContainer> {
|
|
58
|
-
if (this._containerRef
|
|
58
|
+
if (this._containerRef == null) {
|
|
59
59
|
this._containerRef = createComponent(SdToastContainer, {
|
|
60
60
|
environmentInjector: this._envInjector,
|
|
61
61
|
});
|
|
@@ -158,7 +158,7 @@ export class SdToastProvider {
|
|
|
158
158
|
throw err;
|
|
159
159
|
}
|
|
160
160
|
|
|
161
|
-
const message = messageFn
|
|
161
|
+
const message = messageFn != null ? messageFn(err) : err.message;
|
|
162
162
|
this.danger(message);
|
|
163
163
|
await this._sdSystemLog.writeAsync("error", err.stack ?? err.message);
|
|
164
164
|
return undefined;
|
|
@@ -177,7 +177,7 @@ export class SdToastProvider {
|
|
|
177
177
|
}
|
|
178
178
|
|
|
179
179
|
// beforeShowFn 콜백
|
|
180
|
-
if (this.beforeShowFn
|
|
180
|
+
if (this.beforeShowFn != null) {
|
|
181
181
|
this.beforeShowFn(theme);
|
|
182
182
|
}
|
|
183
183
|
|
|
@@ -299,14 +299,14 @@ export class SdToastProvider {
|
|
|
299
299
|
|
|
300
300
|
// 연결된 contentRef 파괴
|
|
301
301
|
const contentRef = this._contentRefs.get(toastRef);
|
|
302
|
-
if (contentRef
|
|
302
|
+
if (contentRef != null) {
|
|
303
303
|
this._contentRefs.delete(toastRef);
|
|
304
304
|
this._appRef.detachView(contentRef.hostView);
|
|
305
305
|
contentRef.destroy();
|
|
306
306
|
}
|
|
307
307
|
|
|
308
308
|
const el = toastRef.location.nativeElement as HTMLElement;
|
|
309
|
-
if (el.parentNode
|
|
309
|
+
if (el.parentNode != null) {
|
|
310
310
|
el.parentNode.removeChild(el);
|
|
311
311
|
}
|
|
312
312
|
this._appRef.detachView(toastRef.hostView);
|