@simplysm/angular 14.0.41 → 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 +2 -4
- package/dist/controls/collapse/sd-collapse-icon.d.ts.map +1 -1
- package/dist/controls/collapse/sd-collapse-icon.js +7 -7
- 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 +9 -1
- package/dist/core/modal/sd-modal.d.ts.map +1 -1
- package/dist/core/modal/sd-modal.js +140 -42
- package/dist/core/modal/sd-modal.provider.d.ts +1 -0
- package/dist/core/modal/sd-modal.provider.d.ts.map +1 -1
- 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 +99 -59
- 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-column-cell-template.d.ts +9 -0
- package/dist/data/sheet/sd-sheet-column-cell-template.d.ts.map +1 -0
- package/dist/data/sheet/sd-sheet-column-cell-template.js +17 -0
- package/dist/data/sheet/sd-sheet-column.d.ts +10 -7
- package/dist/data/sheet/sd-sheet-column.d.ts.map +1 -1
- package/dist/data/sheet/sd-sheet-column.js +10 -6
- package/dist/data/sheet/sd-sheet-config.modal.d.ts +19 -20
- 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 +30 -15
- package/dist/data/sheet/sd-sheet.d.ts.map +1 -1
- package/dist/data/sheet/sd-sheet.js +617 -274
- package/dist/data/sheet/types.d.ts +2 -0
- package/dist/data/sheet/types.d.ts.map +1 -1
- package/dist/data/sheet/useSheetCellAgent.js +6 -6
- package/dist/data/sheet/useSheetCellStyling.d.ts.map +1 -1
- package/dist/data/sheet/useSheetCellStyling.js +11 -5
- 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.d.ts.map +1 -1
- package/dist/data/sheet/useSheetLayoutEngine.js +3 -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 +5 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -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 +6 -6
- package/src/controls/button/sd-modal-select-button.ts +7 -2
- package/src/controls/collapse/sd-collapse-icon.ts +3 -4
- 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 +6 -5
- package/src/core/modal/sd-modal.ts +121 -42
- 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 +27 -20
- 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-column-cell-template.ts +17 -0
- package/src/data/sheet/sd-sheet-column.ts +12 -5
- package/src/data/sheet/sd-sheet-config.modal.ts +215 -191
- package/src/data/sheet/sd-sheet.ts +534 -203
- package/src/data/sheet/types.ts +2 -0
- package/src/data/sheet/useSheetCellAgent.ts +8 -8
- package/src/data/sheet/useSheetCellStyling.ts +9 -9
- package/src/data/sheet/useSheetFocusIndicator.ts +66 -0
- package/src/data/sheet/useSheetLayoutEngine.ts +3 -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 +6 -7
- 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
|
}
|
|
@@ -56,6 +56,7 @@ export interface SdModalOptions {
|
|
|
56
56
|
key?: string;
|
|
57
57
|
hideHeader?: boolean;
|
|
58
58
|
hideCloseButton?: boolean;
|
|
59
|
+
headerStyle?: string;
|
|
59
60
|
useCloseByBackdrop?: boolean;
|
|
60
61
|
useCloseByEscapeKey?: boolean;
|
|
61
62
|
float?: boolean;
|
|
@@ -124,9 +125,9 @@ export class SdModalProvider {
|
|
|
124
125
|
|
|
125
126
|
// 6. 옵션 바인딩
|
|
126
127
|
modalRef.setInput("title", modal.title);
|
|
127
|
-
if (options
|
|
128
|
+
if (options != null) {
|
|
128
129
|
for (const [key, value] of Object.entries(options)) {
|
|
129
|
-
if (value
|
|
130
|
+
if (value != null && key !== "noFirstControlFocusing") {
|
|
130
131
|
modalRef.setInput(key, value);
|
|
131
132
|
}
|
|
132
133
|
}
|
|
@@ -173,7 +174,7 @@ export class SdModalProvider {
|
|
|
173
174
|
// 컨텐츠 영역에서 첫 탭 이동 가능 요소 검색
|
|
174
175
|
const contentEl = modalEl.querySelector("._content");
|
|
175
176
|
const firstTabbable = contentEl?.findFirstTabbableChild();
|
|
176
|
-
if (firstTabbable
|
|
177
|
+
if (firstTabbable != null) {
|
|
177
178
|
firstTabbable.focus();
|
|
178
179
|
} else {
|
|
179
180
|
dialogEl.focus();
|
|
@@ -196,7 +197,7 @@ export class SdModalProvider {
|
|
|
196
197
|
|
|
197
198
|
const doDestroy = () => {
|
|
198
199
|
// DOM에서 제거
|
|
199
|
-
if (modalEl.parentNode
|
|
200
|
+
if (modalEl.parentNode != null) {
|
|
200
201
|
modalEl.parentNode.removeChild(modalEl);
|
|
201
202
|
}
|
|
202
203
|
|
|
@@ -210,7 +211,7 @@ export class SdModalProvider {
|
|
|
210
211
|
this.modalCount.update((v) => v - 1);
|
|
211
212
|
|
|
212
213
|
// 포커스 복귀
|
|
213
|
-
if (prevActiveEl
|
|
214
|
+
if (prevActiveEl != null && prevActiveEl.isConnected) {
|
|
214
215
|
prevActiveEl.focus();
|
|
215
216
|
}
|
|
216
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
|
-
<div class="_header" (mousedown)="onHeaderMouseDown($event)">
|
|
42
|
-
<
|
|
56
|
+
<div class="_header" (mousedown)="onHeaderMouseDown($event)" [style]="headerStyle()">
|
|
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
|
|
|
@@ -297,6 +334,7 @@ export class SdModal {
|
|
|
297
334
|
title = input("");
|
|
298
335
|
hideHeader = input(false);
|
|
299
336
|
hideCloseButton = input(false);
|
|
337
|
+
headerStyle = input<string | undefined>(undefined);
|
|
300
338
|
useCloseByBackdrop = input(true);
|
|
301
339
|
useCloseByEscapeKey = input(true);
|
|
302
340
|
float = input(false);
|
|
@@ -328,16 +366,16 @@ export class SdModal {
|
|
|
328
366
|
// widthPx/heightPx를 dialog 스타일에 적용
|
|
329
367
|
effect(() => {
|
|
330
368
|
const dialogEl = this._getDialogEl();
|
|
331
|
-
if (dialogEl
|
|
369
|
+
if (dialogEl == null) return;
|
|
332
370
|
|
|
333
371
|
const w = this.widthPx();
|
|
334
372
|
const h = this.heightPx();
|
|
335
|
-
if (w
|
|
373
|
+
if (w != null) {
|
|
336
374
|
dialogEl.style.width = `${w}px`;
|
|
337
375
|
} else {
|
|
338
376
|
dialogEl.style.width = "";
|
|
339
377
|
}
|
|
340
|
-
if (h
|
|
378
|
+
if (h != null) {
|
|
341
379
|
dialogEl.style.height = `${h}px`;
|
|
342
380
|
} else {
|
|
343
381
|
dialogEl.style.height = "";
|
|
@@ -347,11 +385,10 @@ export class SdModal {
|
|
|
347
385
|
// key 기반 설정 복원
|
|
348
386
|
effect(() => {
|
|
349
387
|
const k = this.key();
|
|
350
|
-
if (k
|
|
388
|
+
if (k == null || this._sdSystemConfig == null) return;
|
|
351
389
|
|
|
352
390
|
void this._restoreConfig(k).catch((err) => this._errorHandler.handleError(err));
|
|
353
391
|
});
|
|
354
|
-
|
|
355
392
|
}
|
|
356
393
|
|
|
357
394
|
onResizeMouseDown(event: MouseEvent, dir: string): void {
|
|
@@ -361,7 +398,7 @@ export class SdModal {
|
|
|
361
398
|
|
|
362
399
|
onHeaderMouseDown(event: MouseEvent): void {
|
|
363
400
|
if (!this.movable()) return;
|
|
364
|
-
if ((event.target as HTMLElement).closest("button")
|
|
401
|
+
if ((event.target as HTMLElement).closest("button, sd-anchor") != null) return;
|
|
365
402
|
event.preventDefault();
|
|
366
403
|
this._dragResize.startDrag(event);
|
|
367
404
|
}
|
|
@@ -388,8 +425,30 @@ export class SdModal {
|
|
|
388
425
|
this._bringToFront();
|
|
389
426
|
}
|
|
390
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
|
+
|
|
391
450
|
private _requestClose(): void {
|
|
392
|
-
if (this._sdActivatedModal
|
|
451
|
+
if (this._sdActivatedModal != null && !this._sdActivatedModal.canDeactivateFn()) {
|
|
393
452
|
return;
|
|
394
453
|
}
|
|
395
454
|
void this._saveConfig().catch((err) => this._errorHandler.handleError(err));
|
|
@@ -412,16 +471,36 @@ export class SdModal {
|
|
|
412
471
|
hostEl.style.zIndex = String(maxZ + 1);
|
|
413
472
|
}
|
|
414
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
|
+
|
|
415
494
|
private _getDialogEl(): HTMLElement | null {
|
|
416
495
|
return this._elRef.nativeElement.querySelector("._dialog");
|
|
417
496
|
}
|
|
418
497
|
|
|
419
498
|
private async _saveConfig(): Promise<void> {
|
|
420
499
|
const k = this.key();
|
|
421
|
-
if (k
|
|
500
|
+
if (k == null || this._sdSystemConfig == null) return;
|
|
422
501
|
|
|
423
502
|
const dialogEl = this._getDialogEl();
|
|
424
|
-
if (dialogEl
|
|
503
|
+
if (dialogEl == null) return;
|
|
425
504
|
|
|
426
505
|
const config: Record<string, string> = {};
|
|
427
506
|
if (dialogEl.style.width !== "") config["width"] = dialogEl.style.width;
|
|
@@ -441,11 +520,11 @@ export class SdModal {
|
|
|
441
520
|
if (config == null) return;
|
|
442
521
|
|
|
443
522
|
const dialogEl = this._getDialogEl();
|
|
444
|
-
if (dialogEl
|
|
523
|
+
if (dialogEl == null) return;
|
|
445
524
|
|
|
446
|
-
if (config["width"]
|
|
447
|
-
if (config["height"]
|
|
448
|
-
if (config["left"]
|
|
449
|
-
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"];
|
|
450
529
|
}
|
|
451
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);
|