@simplysm/sd-claude 14.0.50 → 14.0.52
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/claude/references/sd-frontend-design.md +10 -9
- package/claude/references/sd-simplysm-v14/angular/README.md +497 -0
- package/claude/references/sd-simplysm-v14/angular/bootstrap/provide-sd-angular.md +37 -0
- package/claude/references/sd-simplysm-v14/angular/bootstrap/sd-angular-config-provider.md +16 -0
- package/claude/references/sd-simplysm-v14/angular/directives/sd-command-directive.md +27 -0
- package/claude/references/sd-simplysm-v14/angular/directives/sd-events.md +25 -0
- package/claude/references/sd-simplysm-v14/angular/directives/sd-intersection-directive.md +36 -0
- package/claude/references/sd-simplysm-v14/angular/directives/sd-invalid.md +24 -0
- package/claude/references/sd-simplysm-v14/angular/directives/sd-resize-directive.md +42 -0
- package/claude/references/sd-simplysm-v14/angular/directives/sd-ripple.md +23 -0
- package/claude/references/sd-simplysm-v14/angular/directives/sd-router-link.md +38 -0
- package/claude/references/sd-simplysm-v14/angular/directives/sd-show-effect.md +18 -0
- package/claude/references/sd-simplysm-v14/angular/directives/sd-typed-template.md +69 -0
- package/claude/references/sd-simplysm-v14/angular/features/sd-address-search-modal.md +50 -0
- package/claude/references/sd-simplysm-v14/angular/features/sd-permission-table.md +20 -0
- package/claude/references/sd-simplysm-v14/angular/features/sd-shared-data-components.md +158 -0
- package/claude/references/sd-simplysm-v14/angular/features/sd-tiptap-editor.md +26 -0
- package/claude/references/sd-simplysm-v14/angular/pipes/format-pipe.md +41 -0
- package/claude/references/sd-simplysm-v14/angular/plugins/sd-global-error-handler.md +23 -0
- package/claude/references/sd-simplysm-v14/angular/plugins/sd-option-event-plugin.md +34 -0
- package/claude/references/sd-simplysm-v14/angular/provider-types/sd-menu.md +65 -0
- package/claude/references/sd-simplysm-v14/angular/provider-types/sd-modal-content-def.md +148 -0
- package/claude/references/sd-simplysm-v14/angular/provider-types/sd-toast-content-def.md +73 -0
- package/claude/references/sd-simplysm-v14/angular/provider-types/shared-data-base.md +59 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-activated-modal-provider.md +34 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-app-structure-provider.md +81 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-busy-provider.md +18 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-file-dialog-provider.md +40 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-local-storage-provider.md +20 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-modal-provider.md +67 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-navigate-window-provider.md +18 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-print-provider.md +25 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-service-client-factory-provider.md +43 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-shared-data-provider.md +64 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-system-config-provider.md +46 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-system-log-provider.md +18 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-theme-provider.md +38 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-toast-provider.md +65 -0
- package/claude/references/sd-simplysm-v14/angular/recipes/_common-rules.md +336 -0
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail/extension-a-edit-save.md +191 -0
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail/extension-b-delete-restore.md +103 -0
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail/extension-c-modal-view.md +198 -0
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail/extension-d-control-view.md +109 -0
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail/extension-e-auxiliary.md +87 -0
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail/extension-f-complex-detail.md +202 -0
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail.md +280 -0
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-a-inline-edit.md +386 -0
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-b-selection.md +215 -0
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-c-inline-delete.md +64 -0
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-d-select-modal.md +193 -0
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-e-readonly-modal.md +140 -0
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-f-modal-edit.md +123 -0
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-g-excel.md +145 -0
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-list.md +377 -0
- package/claude/references/sd-simplysm-v14/angular/recipes/data-select-button.md +368 -0
- package/claude/references/sd-simplysm-v14/angular/recipes/page-modal-container.md +238 -0
- package/claude/references/sd-simplysm-v14/angular/styling/classes.md +149 -0
- package/claude/references/sd-simplysm-v14/angular/styling/mixins.md +100 -0
- package/claude/references/sd-simplysm-v14/angular/styling/themes.md +35 -0
- package/claude/references/sd-simplysm-v14/angular/styling/variables.md +147 -0
- package/claude/references/sd-simplysm-v14/angular/type-utilities/directive-input-signals.md +232 -0
- package/claude/references/sd-simplysm-v14/angular/ui-data/sd-list.md +37 -0
- package/claude/references/sd-simplysm-v14/angular/ui-data/sd-sheet.md +212 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-additional-button.md +26 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-anchor.md +31 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-button.md +103 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-checkbox-group.md +39 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-checkbox.md +81 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-date-range-picker.md +27 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-form.md +89 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-modal-select-button.md +54 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-numpad.md +26 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-range.md +26 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-select.md +68 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-shared-data-select.md +52 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-state-preset.md +37 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-switch.md +27 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-textarea.md +33 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-textfield.md +145 -0
- package/claude/references/sd-simplysm-v14/angular/ui-layout/sd-dock-container.md +64 -0
- package/claude/references/sd-simplysm-v14/angular/ui-layout/sd-dock.md +37 -0
- package/claude/references/sd-simplysm-v14/angular/ui-layout/sd-gap.md +26 -0
- package/claude/references/sd-simplysm-v14/angular/ui-layout/sd-kanban-board.md +96 -0
- package/claude/references/sd-simplysm-v14/angular/ui-layout/sd-kanban-lane.md +34 -0
- package/claude/references/sd-simplysm-v14/angular/ui-layout/sd-kanban.md +29 -0
- package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-collapse.md +35 -0
- package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-pagination.md +26 -0
- package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-sidebar-container.md +49 -0
- package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-sidebar-menu.md +22 -0
- package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-sidebar-user.md +43 -0
- package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-tab.md +51 -0
- package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-topbar-container.md +97 -0
- package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-topbar-menu.md +23 -0
- package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-topbar-user.md +38 -0
- package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-topbar.md +30 -0
- package/claude/references/sd-simplysm-v14/angular/ui-overlay/sd-busy-container.md +69 -0
- package/claude/references/sd-simplysm-v14/angular/ui-overlay/sd-confirm-modal.md +30 -0
- package/claude/references/sd-simplysm-v14/angular/ui-overlay/sd-dropdown.md +40 -0
- package/claude/references/sd-simplysm-v14/angular/ui-overlay/sd-modal.md +34 -0
- package/claude/references/sd-simplysm-v14/angular/ui-overlay/sd-prompt-modal.md +30 -0
- package/claude/references/sd-simplysm-v14/angular/ui-overlay/sd-toast.md +35 -0
- package/claude/references/sd-simplysm-v14/angular/ui-visual/sd-barcode.md +36 -0
- package/claude/references/sd-simplysm-v14/angular/ui-visual/sd-calendar.md +34 -0
- package/claude/references/sd-simplysm-v14/angular/ui-visual/sd-echarts.md +32 -0
- package/claude/references/sd-simplysm-v14/angular/ui-visual/sd-label.md +24 -0
- package/claude/references/sd-simplysm-v14/angular/ui-visual/sd-note.md +23 -0
- package/claude/references/sd-simplysm-v14/angular/ui-visual/sd-progress.md +23 -0
- package/claude/references/sd-simplysm-v14/angular/utils/inject-routing-signals.md +161 -0
- package/claude/references/sd-simplysm-v14/angular/utils/inject-sd-system-config-resource.md +35 -0
- package/claude/references/sd-simplysm-v14/angular/utils/mark.md +43 -0
- package/claude/references/sd-simplysm-v14/angular/utils/selection-managers.md +96 -0
- package/claude/references/sd-simplysm-v14/angular/utils/set-safe-style.md +19 -0
- package/claude/references/sd-simplysm-v14/angular/utils/setup-functions.md +93 -0
- package/claude/references/sd-simplysm-v14/capacitor-plugin-auto-update/README.md +38 -0
- package/claude/references/sd-simplysm-v14/capacitor-plugin-auto-update/apk-installer/apk-installer.md +115 -0
- package/claude/references/sd-simplysm-v14/capacitor-plugin-auto-update/auto-update/auto-update.md +113 -0
- package/claude/references/sd-simplysm-v14/capacitor-plugin-file-system/README.md +197 -0
- package/claude/references/sd-simplysm-v14/capacitor-plugin-intent/README.md +235 -0
- package/claude/references/sd-simplysm-v14/capacitor-plugin-usb-storage/README.md +251 -0
- package/claude/references/sd-simplysm-v14/core-browser/README.md +52 -0
- package/claude/references/sd-simplysm-v14/core-browser/extensions/copy-paste.md +59 -0
- package/claude/references/sd-simplysm-v14/core-browser/extensions/element-prototype-extensions.md +137 -0
- package/claude/references/sd-simplysm-v14/core-browser/extensions/get-bounds.md +84 -0
- package/claude/references/sd-simplysm-v14/core-browser/utils/download-blob.md +59 -0
- package/claude/references/sd-simplysm-v14/core-browser/utils/fetch-url-bytes.md +91 -0
- package/claude/references/sd-simplysm-v14/core-browser/utils/indexed-db-store.md +131 -0
- package/claude/references/sd-simplysm-v14/core-browser/utils/indexed-db-virtual-fs.md +121 -0
- package/claude/references/sd-simplysm-v14/core-browser/utils/open-file-dialog.md +60 -0
- package/claude/references/sd-simplysm-v14/core-common/README.md +179 -0
- package/claude/references/sd-simplysm-v14/core-common/errors/argument-error.md +26 -0
- package/claude/references/sd-simplysm-v14/core-common/errors/not-implemented-error.md +33 -0
- package/claude/references/sd-simplysm-v14/core-common/errors/sd-error.md +38 -0
- package/claude/references/sd-simplysm-v14/core-common/errors/timeout-error.md +36 -0
- package/claude/references/sd-simplysm-v14/core-common/extensions/array.md +125 -0
- package/claude/references/sd-simplysm-v14/core-common/extensions/map.md +43 -0
- package/claude/references/sd-simplysm-v14/core-common/extensions/set.md +35 -0
- package/claude/references/sd-simplysm-v14/core-common/features/debounce-queue.md +48 -0
- package/claude/references/sd-simplysm-v14/core-common/features/event-emitter.md +52 -0
- package/claude/references/sd-simplysm-v14/core-common/features/serial-queue.md +44 -0
- package/claude/references/sd-simplysm-v14/core-common/type-utils/common-types.md +100 -0
- package/claude/references/sd-simplysm-v14/core-common/type-utils/env.md +42 -0
- package/claude/references/sd-simplysm-v14/core-common/types/date-only.md +86 -0
- package/claude/references/sd-simplysm-v14/core-common/types/date-time.md +106 -0
- package/claude/references/sd-simplysm-v14/core-common/types/lazy-gc-map.md +59 -0
- package/claude/references/sd-simplysm-v14/core-common/types/time.md +62 -0
- package/claude/references/sd-simplysm-v14/core-common/types/uuid.md +41 -0
- package/claude/references/sd-simplysm-v14/core-common/utils/bytes.md +36 -0
- package/claude/references/sd-simplysm-v14/core-common/utils/dt.md +60 -0
- package/claude/references/sd-simplysm-v14/core-common/utils/err.md +26 -0
- package/claude/references/sd-simplysm-v14/core-common/utils/json.md +58 -0
- package/claude/references/sd-simplysm-v14/core-common/utils/num.md +56 -0
- package/claude/references/sd-simplysm-v14/core-common/utils/obj.md +107 -0
- package/claude/references/sd-simplysm-v14/core-common/utils/path.md +30 -0
- package/claude/references/sd-simplysm-v14/core-common/utils/primitive.md +28 -0
- package/claude/references/sd-simplysm-v14/core-common/utils/str.md +63 -0
- package/claude/references/sd-simplysm-v14/core-common/utils/template-strings.md +49 -0
- package/claude/references/sd-simplysm-v14/core-common/utils/transfer.md +35 -0
- package/claude/references/sd-simplysm-v14/core-common/utils/wait.md +35 -0
- package/claude/references/sd-simplysm-v14/core-common/utils/xml.md +49 -0
- package/claude/references/sd-simplysm-v14/core-common/utils/zip-archive.md +77 -0
- package/claude/references/sd-simplysm-v14/core-node/README.md +59 -0
- package/claude/references/sd-simplysm-v14/core-node/features/fs-watcher.md +110 -0
- package/claude/references/sd-simplysm-v14/core-node/logging/create-file-reporter.md +78 -0
- package/claude/references/sd-simplysm-v14/core-node/logging/pretty-reporter.md +38 -0
- package/claude/references/sd-simplysm-v14/core-node/logging/setup-consola.md +77 -0
- package/claude/references/sd-simplysm-v14/core-node/utils/cpx.md +128 -0
- package/claude/references/sd-simplysm-v14/core-node/utils/fsx.md +168 -0
- package/claude/references/sd-simplysm-v14/core-node/utils/pathx.md +73 -0
- package/claude/references/sd-simplysm-v14/core-node/worker/create-worker.md +85 -0
- package/claude/references/sd-simplysm-v14/core-node/worker/worker.md +160 -0
- package/claude/references/sd-simplysm-v14/excel/README.md +66 -0
- package/claude/references/sd-simplysm-v14/excel/core-classes/excel-cell.md +79 -0
- package/claude/references/sd-simplysm-v14/excel/core-classes/excel-col.md +36 -0
- package/claude/references/sd-simplysm-v14/excel/core-classes/excel-row.md +34 -0
- package/claude/references/sd-simplysm-v14/excel/core-classes/excel-workbook.md +93 -0
- package/claude/references/sd-simplysm-v14/excel/core-classes/excel-worksheet.md +147 -0
- package/claude/references/sd-simplysm-v14/excel/types/excel-address-point.md +33 -0
- package/claude/references/sd-simplysm-v14/excel/types/excel-style-options.md +57 -0
- package/claude/references/sd-simplysm-v14/excel/types/excel-value-type.md +28 -0
- package/claude/references/sd-simplysm-v14/excel/types/excel-xml-content-type-data.md +23 -0
- package/claude/references/sd-simplysm-v14/excel/types/excel-xml-drawing-data.md +29 -0
- package/claude/references/sd-simplysm-v14/excel/types/excel-xml-relationship-data.md +39 -0
- package/claude/references/sd-simplysm-v14/excel/types/excel-xml-shared-string-data.md +42 -0
- package/claude/references/sd-simplysm-v14/excel/types/excel-xml-style-data.md +97 -0
- package/claude/references/sd-simplysm-v14/excel/types/excel-xml-workbook-data.md +22 -0
- package/claude/references/sd-simplysm-v14/excel/types/excel-xml-worksheet-data.md +68 -0
- package/claude/references/sd-simplysm-v14/excel/types/excel-xml.md +15 -0
- package/claude/references/sd-simplysm-v14/excel/utilities/excel-utils.md +101 -0
- package/claude/references/sd-simplysm-v14/excel/wrapper/excel-wrapper.md +108 -0
- package/claude/references/sd-simplysm-v14/lint/README.md +183 -0
- package/claude/references/sd-simplysm-v14/orm-common/README.md +156 -0
- package/claude/references/sd-simplysm-v14/orm-common/core/db-context.md +208 -0
- package/claude/references/sd-simplysm-v14/orm-common/core/db-transaction-error.md +64 -0
- package/claude/references/sd-simplysm-v14/orm-common/expression/expr-unit.md +62 -0
- package/claude/references/sd-simplysm-v14/orm-common/expression/expr.md +198 -0
- package/claude/references/sd-simplysm-v14/orm-common/models/migration.md +37 -0
- package/claude/references/sd-simplysm-v14/orm-common/query-builder/create-query-builder.md +80 -0
- package/claude/references/sd-simplysm-v14/orm-common/queryable-executable/executable.md +54 -0
- package/claude/references/sd-simplysm-v14/orm-common/queryable-executable/parse-search-query.md +75 -0
- package/claude/references/sd-simplysm-v14/orm-common/queryable-executable/queryable.md +238 -0
- package/claude/references/sd-simplysm-v14/orm-common/schema-builders/column-builder.md +63 -0
- package/claude/references/sd-simplysm-v14/orm-common/schema-builders/foreign-key-builder.md +137 -0
- package/claude/references/sd-simplysm-v14/orm-common/schema-builders/index-builder.md +54 -0
- package/claude/references/sd-simplysm-v14/orm-common/schema-builders/procedure.md +67 -0
- package/claude/references/sd-simplysm-v14/orm-common/schema-builders/table.md +95 -0
- package/claude/references/sd-simplysm-v14/orm-common/schema-builders/view.md +71 -0
- package/claude/references/sd-simplysm-v14/orm-common/types/data-type.md +146 -0
- package/claude/references/sd-simplysm-v14/orm-common/types/dialect.md +151 -0
- package/claude/references/sd-simplysm-v14/orm-common/types/expr.md +175 -0
- package/claude/references/sd-simplysm-v14/orm-common/types/parse-query-result.md +58 -0
- package/claude/references/sd-simplysm-v14/orm-common/types/query-def.md +224 -0
- package/claude/references/sd-simplysm-v14/orm-node/README.md +65 -0
- package/claude/references/sd-simplysm-v14/orm-node/connections/mssql-db-conn.md +85 -0
- package/claude/references/sd-simplysm-v14/orm-node/connections/mysql-db-conn.md +83 -0
- package/claude/references/sd-simplysm-v14/orm-node/connections/postgresql-db-conn.md +86 -0
- package/claude/references/sd-simplysm-v14/orm-node/core/create-db-conn.md +62 -0
- package/claude/references/sd-simplysm-v14/orm-node/core/create-orm.md +107 -0
- package/claude/references/sd-simplysm-v14/orm-node/core/node-db-context-executor.md +50 -0
- package/claude/references/sd-simplysm-v14/orm-node/types/db-conn-config.md +91 -0
- package/claude/references/sd-simplysm-v14/orm-node/types/db-conn-constants.md +33 -0
- package/claude/references/sd-simplysm-v14/orm-node/types/db-conn.md +60 -0
- package/claude/references/sd-simplysm-v14/orm-node/types/get-dialect-from-config.md +17 -0
- package/{README.md → claude/references/sd-simplysm-v14/sd-claude/README.md} +85 -84
- package/{docs → claude/references/sd-simplysm-v14/sd-claude}/assets.md +2 -2
- package/{docs → claude/references/sd-simplysm-v14/sd-claude}/hooks.md +15 -1
- package/claude/references/sd-simplysm-v14/sd-cli/README.md +138 -0
- package/claude/references/sd-simplysm-v14/sd-cli/angular-vite-plugin/sd-angular-plugin.md +60 -0
- package/claude/references/sd-simplysm-v14/sd-cli/config/build-target.md +31 -0
- package/claude/references/sd-simplysm-v14/sd-cli/config/npm-config.md +27 -0
- package/claude/references/sd-simplysm-v14/sd-cli/config/sd-browser-support-config.md +19 -0
- package/claude/references/sd-simplysm-v14/sd-cli/config/sd-build-package-config.md +21 -0
- package/claude/references/sd-simplysm-v14/sd-cli/config/sd-capacitor-config.md +109 -0
- package/claude/references/sd-simplysm-v14/sd-cli/config/sd-client-package-config.md +33 -0
- package/claude/references/sd-simplysm-v14/sd-cli/config/sd-config.md +78 -0
- package/claude/references/sd-simplysm-v14/sd-cli/config/sd-electron-config.md +27 -0
- package/claude/references/sd-simplysm-v14/sd-cli/config/sd-package-config.md +18 -0
- package/claude/references/sd-simplysm-v14/sd-cli/config/sd-post-publish-script-config.md +19 -0
- package/claude/references/sd-simplysm-v14/sd-cli/config/sd-publish-config.md +72 -0
- package/claude/references/sd-simplysm-v14/sd-cli/config/sd-pwa-config.md +41 -0
- package/claude/references/sd-simplysm-v14/sd-cli/config/sd-scripts-package-config.md +19 -0
- package/claude/references/sd-simplysm-v14/sd-cli/config/sd-server-package-config.md +32 -0
- package/claude/references/sd-simplysm-v14/sd-cli/config/sd-watch-hook-config.md +19 -0
- package/claude/references/sd-simplysm-v14/sd-cli/ts-compiler/sd-ts-compiler.md +158 -0
- package/claude/references/sd-simplysm-v14/service-client/README.md +74 -0
- package/claude/references/sd-simplysm-v14/service-client/features/event-client.md +93 -0
- package/claude/references/sd-simplysm-v14/service-client/features/file-client.md +63 -0
- package/claude/references/sd-simplysm-v14/service-client/features/orm-client-connector.md +89 -0
- package/claude/references/sd-simplysm-v14/service-client/features/orm-client-db-context-executor.md +31 -0
- package/claude/references/sd-simplysm-v14/service-client/main/service-client.md +206 -0
- package/claude/references/sd-simplysm-v14/service-client/protocol/client-protocol-wrapper.md +64 -0
- package/claude/references/sd-simplysm-v14/service-client/transport/service-transport.md +68 -0
- package/claude/references/sd-simplysm-v14/service-client/transport/socket-provider.md +100 -0
- package/claude/references/sd-simplysm-v14/service-client/types/blob-input.md +7 -0
- package/claude/references/sd-simplysm-v14/service-client/types/browser-worker.md +47 -0
- package/claude/references/sd-simplysm-v14/service-client/types/file-collection.md +21 -0
- package/claude/references/sd-simplysm-v14/service-client/types/service-connection-options.md +22 -0
- package/claude/references/sd-simplysm-v14/service-client/types/service-progress.md +39 -0
- package/claude/references/sd-simplysm-v14/service-common/README.md +161 -0
- package/claude/references/sd-simplysm-v14/service-common/app-structure/app-structure-item.md +107 -0
- package/claude/references/sd-simplysm-v14/service-common/app-structure/get-flat-permissions.md +57 -0
- package/claude/references/sd-simplysm-v14/service-common/app-structure/is-usable-modules-chain.md +23 -0
- package/claude/references/sd-simplysm-v14/service-common/app-structure/is-usable-modules.md +42 -0
- package/claude/references/sd-simplysm-v14/service-common/events/define-event.md +68 -0
- package/claude/references/sd-simplysm-v14/service-common/protocol/create-service-protocol.md +93 -0
- package/claude/references/sd-simplysm-v14/service-common/protocol/protocol-config.md +21 -0
- package/claude/references/sd-simplysm-v14/service-common/protocol/service-add-event-listener-message.md +23 -0
- package/claude/references/sd-simplysm-v14/service-common/protocol/service-auth-message.md +17 -0
- package/claude/references/sd-simplysm-v14/service-common/protocol/service-emit-event-message.md +21 -0
- package/claude/references/sd-simplysm-v14/service-common/protocol/service-error-message.md +29 -0
- package/claude/references/sd-simplysm-v14/service-common/protocol/service-event-message.md +21 -0
- package/claude/references/sd-simplysm-v14/service-common/protocol/service-get-event-listener-infos-message.md +19 -0
- package/claude/references/sd-simplysm-v14/service-common/protocol/service-message.md +52 -0
- package/claude/references/sd-simplysm-v14/service-common/protocol/service-progress-message.md +21 -0
- package/claude/references/sd-simplysm-v14/service-common/protocol/service-remove-event-listener-message.md +19 -0
- package/claude/references/sd-simplysm-v14/service-common/protocol/service-request-message.md +17 -0
- package/claude/references/sd-simplysm-v14/service-common/protocol/service-response-message.md +17 -0
- package/claude/references/sd-simplysm-v14/service-common/service-types/app-structure-service.md +15 -0
- package/claude/references/sd-simplysm-v14/service-common/service-types/auto-update-service.md +20 -0
- package/claude/references/sd-simplysm-v14/service-common/service-types/orm-service.md +61 -0
- package/claude/references/sd-simplysm-v14/service-common/types/service-upload-result.md +19 -0
- package/claude/references/sd-simplysm-v14/service-server/README.md +162 -0
- package/claude/references/sd-simplysm-v14/service-server/auth/auth-token-payload.md +18 -0
- package/claude/references/sd-simplysm-v14/service-server/auth/sign-jwt.md +30 -0
- package/claude/references/sd-simplysm-v14/service-server/auth/verify-jwt.md +35 -0
- package/claude/references/sd-simplysm-v14/service-server/core/auth.md +64 -0
- package/claude/references/sd-simplysm-v14/service-server/core/define-service.md +81 -0
- package/claude/references/sd-simplysm-v14/service-server/core/execute-service-method.md +43 -0
- package/claude/references/sd-simplysm-v14/service-server/core/service-context.md +79 -0
- package/claude/references/sd-simplysm-v14/service-server/legacy/handle-v1-connection.md +25 -0
- package/claude/references/sd-simplysm-v14/service-server/main/create-service-server.md +32 -0
- package/claude/references/sd-simplysm-v14/service-server/main/service-server.md +113 -0
- package/claude/references/sd-simplysm-v14/service-server/protocol/server-protocol-wrapper.md +35 -0
- package/claude/references/sd-simplysm-v14/service-server/services/app-structure-service.md +59 -0
- package/claude/references/sd-simplysm-v14/service-server/services/auto-update-service.md +34 -0
- package/claude/references/sd-simplysm-v14/service-server/services/orm-service.md +43 -0
- package/claude/references/sd-simplysm-v14/service-server/transport-http/handle-http-request.md +33 -0
- package/claude/references/sd-simplysm-v14/service-server/transport-http/handle-static-file.md +29 -0
- package/claude/references/sd-simplysm-v14/service-server/transport-http/handle-upload.md +33 -0
- package/claude/references/sd-simplysm-v14/service-server/transport-socket/service-socket.md +64 -0
- package/claude/references/sd-simplysm-v14/service-server/transport-socket/websocket-handler.md +57 -0
- package/claude/references/sd-simplysm-v14/service-server/types/service-server-options.md +36 -0
- package/claude/references/sd-simplysm-v14/service-server/utils/get-config.md +29 -0
- package/claude/references/sd-simplysm-v14/storage/README.md +99 -0
- package/claude/references/sd-simplysm-v14/storage/clients/ftp-storage-client.md +99 -0
- package/claude/references/sd-simplysm-v14/storage/clients/sftp-storage-client.md +108 -0
- package/claude/references/sd-simplysm-v14/storage/factory/storage-factory.md +114 -0
- package/claude/references/sd-simplysm-v14/storage/types/file-info.md +32 -0
- package/claude/references/sd-simplysm-v14/storage/types/storage-client.md +55 -0
- package/claude/references/sd-simplysm-v14/storage/types/storage-conn-config.md +34 -0
- package/claude/rules/sd-claude-rules.md +8 -8
- package/claude/rules/sd-simplysm-v14.md +33 -0
- package/claude/skills/sd-claude-docs/SKILL.md +41 -24
- package/claude/skills/sd-claude-docs/references/package-docs.md +240 -116
- package/claude/skills/sd-inner-debug/SKILL.md +1 -1
- package/claude/skills/sd-inner-review/SKILL.md +4 -2
- package/package.json +2 -3
- /package/{docs → claude/references/sd-simplysm-v14/sd-claude}/cli.md +0 -0
- /package/{docs → claude/references/sd-simplysm-v14/sd-claude}/scripts.md +0 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# `SdSharedDataProvider`
|
|
2
|
+
|
|
3
|
+
이벤트 기반 공유 데이터 캐시 추상 프로바이더. `@Injectable()`로 제공되며, 소비 프로젝트에서 상속한다.
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
@Injectable()
|
|
7
|
+
abstract class SdSharedDataProvider<T extends Record<string, SharedDataBase<string | number>>> {
|
|
8
|
+
readonly loadingCount: WritableSignal<number>;
|
|
9
|
+
|
|
10
|
+
abstract initialize(): void;
|
|
11
|
+
register<K extends string & keyof T>(name: K, info: SharedDataInfo<T[K]>): void;
|
|
12
|
+
getHandle<K extends string & keyof T>(name: K): SharedDataHandle<T[K]>;
|
|
13
|
+
async emitAsync<K extends string & keyof T>(name: K, changeKeys?: (string | number)[]): Promise<void>;
|
|
14
|
+
async wait(): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Members
|
|
19
|
+
|
|
20
|
+
| Member | Kind | Type | Description |
|
|
21
|
+
|--------|------|------|-------------|
|
|
22
|
+
| `loadingCount` | property | `WritableSignal<number>` | 현재 로딩 중인 데이터 타입 수 |
|
|
23
|
+
| `initialize()` | method | abstract | 공유 데이터 등록 진입점 |
|
|
24
|
+
| `register(name, info)` | method | `(K, SharedDataInfo<T[K]>) => void` | 공유 데이터 등록 (getter, serviceKey, filter, orderBy) |
|
|
25
|
+
| `getHandle(name)` | method | `(K) => SharedDataHandle<T[K]>` | 등록된 공유 데이터 핸들 반환 (items signal + get 메서드) |
|
|
26
|
+
| `emitAsync(name, changeKeys?)` | method | `(K, (string\|number)[]?) => Promise<void>` | 변경 이벤트 발행 |
|
|
27
|
+
| `wait()` | method | `() => Promise<void>` | 모든 로딩 완료까지 대기 |
|
|
28
|
+
|
|
29
|
+
## 로딩 전략 (Lazy Loading)
|
|
30
|
+
|
|
31
|
+
`register()`는 메타정보만 등록하고 실제 데이터를 가져오지 않는다. 타입별 데이터는 해당 타입의 `getHandle(name)`이 **처음 호출되는 시점**에 `info.getter()`를 실행하여 로딩된다.
|
|
32
|
+
|
|
33
|
+
- 첫 `getHandle()` 호출 → `getter()` 실행 + `SdSharedDataChange` 리스너 등록
|
|
34
|
+
- 이후 같은 타입의 `getHandle()` 호출은 캐시된 `itemsSignal`을 재사용
|
|
35
|
+
- 갱신은 서버에서 `emitAsync()`로 발행된 `SdSharedDataChange` 이벤트 수신 시에만 발생
|
|
36
|
+
|
|
37
|
+
## 소비 화면에서의 사용 규칙
|
|
38
|
+
|
|
39
|
+
### 변경 전파 의무
|
|
40
|
+
|
|
41
|
+
화면에서 `SdSharedDataProvider`에 등록된 데이터를 변경(INSERT/UPDATE/DELETE)하는 경우, 저장 로직 완료 후 **반드시** `emitAsync(name, changedKeys)`를 호출하여 변경을 전파한다.
|
|
42
|
+
|
|
43
|
+
- `name`: 변경된 공유 데이터의 등록 이름 (예: `"고객"`)
|
|
44
|
+
- `changedKeys`: 변경된 레코드의 키 배열 (부분 갱신 최적화용). 전체 갱신은 생략 가능
|
|
45
|
+
|
|
46
|
+
호출하지 않으면 다른 화면의 공유 데이터 캐시가 갱신되지 않는다.
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
// 저장 후 변경 전파 패턴
|
|
50
|
+
await this._sdSharedData.emitAsync("고객", changedIds);
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Related Types
|
|
54
|
+
|
|
55
|
+
### `SdSharedDataChangeEvent`
|
|
56
|
+
|
|
57
|
+
공유 데이터 변경 이벤트 정의.
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
const SdSharedDataChangeEvent = defineEvent<
|
|
61
|
+
{ name: string; filter: unknown },
|
|
62
|
+
(string | number)[] | undefined
|
|
63
|
+
>("SdSharedDataChange");
|
|
64
|
+
```
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# `SdSystemConfigProvider`
|
|
2
|
+
|
|
3
|
+
비동기 설정 저장/조회 프로바이더. `fn` 필드를 설정하면 서버 저장, 미설정 시 localStorage에 저장.
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
@Injectable({ providedIn: "root" })
|
|
7
|
+
class SdSystemConfigProvider<T> {
|
|
8
|
+
fn?: {
|
|
9
|
+
set<K extends keyof T & string>(key: K, data: T[K]): Promise<void> | void;
|
|
10
|
+
get(key: keyof T & string): PromiseLike<any>;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
async setAsync<K extends keyof T & string>(key: K, data: T[K]): Promise<void>;
|
|
14
|
+
async getAsync(key: keyof T & string): Promise<any>;
|
|
15
|
+
}
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Members
|
|
19
|
+
|
|
20
|
+
| Member | Kind | Type | Description |
|
|
21
|
+
|--------|------|------|-------------|
|
|
22
|
+
| `fn` | property | `{ set, get } \| undefined` | 서버 저장 함수. 미설정 시 localStorage 사용 |
|
|
23
|
+
| `setAsync(key, data)` | method | `(K, T[K]) => Promise<void>` | 설정 저장 |
|
|
24
|
+
| `getAsync(key)` | method | `(keyof T & string) => Promise<any>` | 설정 조회 |
|
|
25
|
+
|
|
26
|
+
## Related Types
|
|
27
|
+
|
|
28
|
+
### `injectSdSystemConfigResource`
|
|
29
|
+
|
|
30
|
+
컴포넌트 태그명 기반 키로 시스템 설정을 읽고 쓰는 resource 래퍼. 생성자에서 호출한다.
|
|
31
|
+
|
|
32
|
+
```typescript
|
|
33
|
+
function injectSdSystemConfigResource<T>(options: {
|
|
34
|
+
key: Signal<string | undefined>;
|
|
35
|
+
}): {
|
|
36
|
+
value: Signal<T | undefined>;
|
|
37
|
+
isLoading: Signal<boolean>;
|
|
38
|
+
status: Signal<ResourceStatus>;
|
|
39
|
+
hasValue: () => boolean;
|
|
40
|
+
reload: () => void;
|
|
41
|
+
set(value: T | undefined): void;
|
|
42
|
+
update(fn: (prev: T | undefined) => T | undefined): void;
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
`set()`/`update()` 호출 시 signal을 즉시 업데이트하고, 비동기로 `SdSystemConfigProvider.setAsync()`를 호출하여 영속화한다.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# `SdSystemLogProvider`
|
|
2
|
+
|
|
3
|
+
시스템 로그 기록 프로바이더. console 출력 + 커스텀 `writeFn` 콜백 호출.
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
@Injectable({ providedIn: "root" })
|
|
7
|
+
class SdSystemLogProvider {
|
|
8
|
+
writeFn?: (severity: "error" | "warn" | "log", ...data: any[]) => Promise<void> | void;
|
|
9
|
+
async writeAsync(severity: "error" | "warn" | "log", ...data: any[]): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Members
|
|
14
|
+
|
|
15
|
+
| Member | Kind | Type | Description |
|
|
16
|
+
|--------|------|------|-------------|
|
|
17
|
+
| `writeFn` | property | `((severity, ...data) => Promise<void> \| void) \| undefined` | 커스텀 로그 기록 함수 |
|
|
18
|
+
| `writeAsync(severity, ...data)` | method | `(...) => Promise<void>` | console 출력 후 `writeFn` 호출 |
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# `SdThemeProvider`
|
|
2
|
+
|
|
3
|
+
다크모드/폰트 크기 프로바이더. `dark` signal 변경 시 body에 `sd-theme-dark` 클래스를 토글하고, `fontSize` signal 변경 시 `html` 요소의 font-size를 설정한다.
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
@Injectable({ providedIn: "root" })
|
|
7
|
+
class SdThemeProvider {
|
|
8
|
+
dark = signal<boolean>(false);
|
|
9
|
+
readonly fontSizePresets: readonly number[] = [12, 14, 16, 20, 24, 28];
|
|
10
|
+
fontSize = signal<number>(12);
|
|
11
|
+
|
|
12
|
+
increaseFontSize(): void;
|
|
13
|
+
decreaseFontSize(): void;
|
|
14
|
+
}
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Members
|
|
18
|
+
|
|
19
|
+
| Member | Kind | Type | Description |
|
|
20
|
+
|--------|------|------|-------------|
|
|
21
|
+
| `dark` | property | `WritableSignal<boolean>` | 다크모드 활성화 여부 |
|
|
22
|
+
| `fontSizePresets` | property | `readonly number[]` | 사용 가능한 폰트 크기 프리셋 배열 |
|
|
23
|
+
| `fontSize` | property | `WritableSignal<number>` | 현재 폰트 크기 (px). 기본값 12 |
|
|
24
|
+
| `increaseFontSize()` | method | `() => void` | `fontSizePresets`에서 현재보다 큰 다음 크기로 변경 |
|
|
25
|
+
| `decreaseFontSize()` | method | `() => void` | `fontSizePresets`에서 현재보다 작은 이전 크기로 변경 |
|
|
26
|
+
|
|
27
|
+
## Related Types
|
|
28
|
+
|
|
29
|
+
### `SdThemeSelector`
|
|
30
|
+
|
|
31
|
+
테마 설정 드롭다운 컴포넌트. 다크모드 토글과 폰트 크기 증감 버튼을 제공한다. `SdThemeProvider`를 inject하여 사용한다.
|
|
32
|
+
|
|
33
|
+
```typescript
|
|
34
|
+
@Component({ selector: "sd-theme-selector", standalone: true })
|
|
35
|
+
class SdThemeSelector {}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
inputs 없음. `SdThemeProvider`의 `dark`, `fontSize`를 직접 조작한다.
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# `SdToastProvider`
|
|
2
|
+
|
|
3
|
+
토스트 알림 프로바이더. 4가지 심각도(info/success/warning/danger) 메시지, 프로그래스 모드, 커스텀 토스트를 지원한다.
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
@Injectable({ providedIn: "root" })
|
|
7
|
+
class SdToastProvider {
|
|
8
|
+
alertThemes = signal<SdToastSeverity[]>([]);
|
|
9
|
+
overlap = signal(false);
|
|
10
|
+
beforeShowFn?: (theme: SdToastSeverity) => void;
|
|
11
|
+
|
|
12
|
+
info(message: string, useProgress?: true): WritableSignal<number>;
|
|
13
|
+
info(message: string, useProgress?: false): void;
|
|
14
|
+
success(message: string, useProgress?: true): WritableSignal<number>;
|
|
15
|
+
success(message: string, useProgress?: false): void;
|
|
16
|
+
warning(message: string, useProgress?: true): WritableSignal<number>;
|
|
17
|
+
warning(message: string, useProgress?: false): void;
|
|
18
|
+
danger(message: string, useProgress?: true): WritableSignal<number>;
|
|
19
|
+
danger(message: string, useProgress?: false): void;
|
|
20
|
+
|
|
21
|
+
notify<T extends SdToastContentDef<any>>(input: SdToastInput<T>): Promise<...>;
|
|
22
|
+
async try<R>(fn: () => Promise<R>, messageFn?: (err: Error) => string): Promise<R | undefined>;
|
|
23
|
+
try<R>(fn: () => R, messageFn?: (err: Error) => string): R | undefined;
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Members
|
|
28
|
+
|
|
29
|
+
| Member | Kind | Type | Description |
|
|
30
|
+
|--------|------|------|-------------|
|
|
31
|
+
| `alertThemes` | property | `WritableSignal<SdToastSeverity[]>` | alert()로 표시할 테마 목록 |
|
|
32
|
+
| `overlap` | property | `WritableSignal<boolean>` | 오버랩 모드 (새 토스트 시 기존 제거) |
|
|
33
|
+
| `beforeShowFn` | property | `((theme) => void) \| undefined` | 토스트 표시 전 콜백 |
|
|
34
|
+
| `info/success/warning/danger(message, useProgress?)` | method | overloaded | 토스트 표시. `useProgress=true`면 progress signal 반환 |
|
|
35
|
+
| `notify(input)` | method | `(SdToastInput<T>) => Promise<...>` | 커스텀 토스트 컴포넌트 표시 |
|
|
36
|
+
| `try(fn, messageFn?)` | method | overloaded | 에러 catch 시 danger 토스트 표시 후 undefined 반환 |
|
|
37
|
+
|
|
38
|
+
## Usage
|
|
39
|
+
|
|
40
|
+
### `try` 사용 패턴
|
|
41
|
+
|
|
42
|
+
비동기 작업을 `try`로 감싸면 에러 발생 시 자동으로 danger 토스트를 표시하고 `undefined`를 반환한다:
|
|
43
|
+
|
|
44
|
+
```typescript
|
|
45
|
+
private readonly _sdToast = inject(SdToastProvider);
|
|
46
|
+
busyCount = signal(0);
|
|
47
|
+
|
|
48
|
+
async _refresh(): Promise<void> {
|
|
49
|
+
this.busyCount.update((v) => v + 1);
|
|
50
|
+
await this._sdToast.try(async () => {
|
|
51
|
+
const result = await this._search(true);
|
|
52
|
+
this.items.set(result.items);
|
|
53
|
+
});
|
|
54
|
+
this.busyCount.update((v) => v - 1);
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
`messageFn`을 전달하면 에러 메시지를 커스텀할 수 있다:
|
|
59
|
+
|
|
60
|
+
```typescript
|
|
61
|
+
await this._sdToast.try(
|
|
62
|
+
async () => { /* ... */ },
|
|
63
|
+
(err) => `저장 실패: ${err.message}`,
|
|
64
|
+
);
|
|
65
|
+
```
|
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
# 레시피 공통 규칙
|
|
2
|
+
|
|
3
|
+
CRUD 리스트·상세폼, 데이터 선택 버튼, 페이지·모달 컨테이너 레시피 전반에 적용되는 횡단 규칙 모음. 각 레시피 고유 규칙은 해당 recipe 문서 내부에 둔다.
|
|
4
|
+
|
|
5
|
+
## 적용 범위
|
|
6
|
+
|
|
7
|
+
아래 레시피와 그 확장에 모두 적용된다.
|
|
8
|
+
|
|
9
|
+
- [`crud-list.md`](./crud-list.md) 및 `crud-list/extension-*`
|
|
10
|
+
- [`crud-detail.md`](./crud-detail.md) 및 `crud-detail/extension-*`
|
|
11
|
+
- [`data-select-button.md`](./data-select-button.md)
|
|
12
|
+
- [`page-modal-container.md`](./page-modal-container.md)
|
|
13
|
+
|
|
14
|
+
## ✅ Always (반드시)
|
|
15
|
+
|
|
16
|
+
### Full-screen Dock 레이아웃과 Flex 정렬을 구분한다
|
|
17
|
+
|
|
18
|
+
페이지는 **뷰포트 전체를 full-screen으로 채운 뒤, dock으로 고정 영역을 배치하고, 나머지 fill 영역에 스크롤이 생기는** 구조다. 페이지 전체가 스크롤되는 것이 아니라, 필터·액션 바 등 dock 영역은 항상 화면에 고정되고 **fill 영역(시트·폼 등)만 독립적으로 스크롤**된다.
|
|
19
|
+
|
|
20
|
+
Dock과 Flex는 역할이 다르며 혼용하지 않는다.
|
|
21
|
+
|
|
22
|
+
| 수단 | 역할 | 스크롤 | 예시 |
|
|
23
|
+
|------|------|--------|------|
|
|
24
|
+
| `<sd-dock>` | **고정 구획** — 필터, 액션 바, 하단 버튼 등 항상 보여야 하는 영역 | 스크롤 없음 (absolute 고정) | `<sd-dock class="p-default pb-0">` (필터) |
|
|
25
|
+
| `fill` 영역 | **나머지 공간** — dock이 차지하지 않은 나머지를 채움 | **스크롤 발생** (`overflow: auto`) | `<div class="fill p-default">` (시트) |
|
|
26
|
+
| `flex-row` / `flex-column` | **컨트롤 정렬** — dock 내부에서 버튼·인풋 등 작은 요소 배치 | 부모를 따름 | `<sd-dock class="flex-row gap-sm">` (버튼 나열) |
|
|
27
|
+
|
|
28
|
+
#### Full-screen 높이 체인과 스크롤
|
|
29
|
+
|
|
30
|
+
전체 화면을 빈틈 없이 채우려면 `height: 100%` 체인이 끊기지 않아야 한다. 이 체인이 유지되어야 fill 영역이 정확한 높이를 가지고, 그 안에서만 스크롤이 동작한다.
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
viewport (100vh)
|
|
34
|
+
└─ <sd-topbar-container> ← height: 100%, flex-column
|
|
35
|
+
├─ <sd-topbar> ← 고정 (페이지 타이틀 + 메인 액션)
|
|
36
|
+
└─ <sd-dock-container> ← height: 100% (나머지 채움)
|
|
37
|
+
├─ <sd-dock> ← 고정 (필터)
|
|
38
|
+
├─ <sd-dock> ← 고정 (인라인 액션: 등록/삭제/엑셀)
|
|
39
|
+
├─ <div class="fill"> ← 나머지 = 스크롤 영역 (시트/폼)
|
|
40
|
+
└─ <sd-dock position="bottom"> ← 고정 (모달 하단 확인/취소)
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
#### Dock vs Flex 판단 기준
|
|
44
|
+
|
|
45
|
+
- **화면 구획 배치**(필터, 시트, 하단 액션 바 등 독립 영역 분할) → `<sd-dock-container>` + `<sd-dock>` + `fill`
|
|
46
|
+
- **컨트롤 정렬**(버튼 나란히, 라벨+인풋, 우측 정렬 등 구획 내부 배치) → `flex-row` / `flex-column` / `flex-fill` / `main-align-*`
|
|
47
|
+
|
|
48
|
+
```html
|
|
49
|
+
<!-- ✅ 구획은 dock으로 고정, fill 영역에서만 스크롤 -->
|
|
50
|
+
<sd-dock-container>
|
|
51
|
+
<sd-dock class="p-default pb-0">필터 영역</sd-dock>
|
|
52
|
+
<div class="fill p-default">시트 영역 (여기만 스크롤)</div>
|
|
53
|
+
</sd-dock-container>
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
**예외**: modal 뷰 본문처럼 dock이 불필요한(단순 상하 2분할) 경우에는 `<div class="flex-column fill">` + `<div class="flex-fill">`을 사용한다 — [`page-modal-container.md` modal 전용 변형](./page-modal-container.md#modal-전용-pagecontrol-분기-생략) 참조.
|
|
57
|
+
|
|
58
|
+
### topbar / dock 내 버튼 배치 순서를 지킨다
|
|
59
|
+
|
|
60
|
+
`<sd-topbar>`, `<sd-dock>` 등 메인 액션 영역에 여러 버튼을 배치할 때, **중요도순(왼쪽 → 오른쪽)**으로 나열한다.
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
저장(primary) > 삭제/복구(danger/warning) > 기타 액션
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
```html
|
|
67
|
+
<!-- ✅ 저장 > 삭제/복구 > 기타 순서 -->
|
|
68
|
+
<sd-topbar>
|
|
69
|
+
<h4>{{ viewTitle() }}</h4>
|
|
70
|
+
@if (canEdit()) {
|
|
71
|
+
<sd-button [theme]="'link-primary'" (click)="onSaveButtonClick()">저장</sd-button>
|
|
72
|
+
}
|
|
73
|
+
@if (!isNew() && canEdit()) {
|
|
74
|
+
<sd-button [theme]="'link-danger'" (click)="onDeleteButtonClick()">삭제</sd-button>
|
|
75
|
+
}
|
|
76
|
+
</sd-topbar>
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
**근거**: 데이터 변경 액션(저장·삭제·복구)이 먼저, 나머지 기타 액션이 마지막이다. page topbar뿐 아니라 control 뷰의 상단 dock, modal 뷰의 하단 dock에도 동일 순서를 적용한다.
|
|
80
|
+
|
|
81
|
+
### 화면 레이아웃 구간과 버튼 스타일을 구분한다
|
|
82
|
+
|
|
83
|
+
CRUD 리스트·상세폼 화면은 아래 구간으로 나뉘며, 각 구간의 버튼 스타일이 다르다. **다른 구간의 스타일을 섞지 않는다.**
|
|
84
|
+
|
|
85
|
+
#### 레이아웃 구간 (crud-list 기준)
|
|
86
|
+
|
|
87
|
+
```
|
|
88
|
+
┌─ ① 메인 액션 영역 ──────────────────────────────────────┐
|
|
89
|
+
│ page: <sd-topbar> 내부 │
|
|
90
|
+
│ control: 상단 <sd-dock> (p-default bdb ...) │
|
|
91
|
+
│ modal: 하단 <sd-dock [position]="'bottom'"> │
|
|
92
|
+
├─ ② 조회 필터 ───────────────────────────────────────────┤
|
|
93
|
+
│ <sd-dock class="p-default pb-0"> │
|
|
94
|
+
│ <sd-form> 조회 버튼, 검색어 등 │
|
|
95
|
+
├─ ③ 인라인 액션 dock ────────────────────────────────────┤
|
|
96
|
+
│ <sd-dock class="flex-row gap-sm p-xs-default"> │
|
|
97
|
+
│ 등록, 선택삭제/복구, 엑셀 업/다운 등 │
|
|
98
|
+
├─ ④ 시트 ────────────────────────────────────────────────┤
|
|
99
|
+
│ <div class="fill p-default pt-0"> <sd-sheet ...> │
|
|
100
|
+
└──────────────────────────────────────────────────────────┘
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
③ 인라인 액션 dock이 있을 때 ④ 시트 영역에 `pt-0`을 붙여 상단 패딩 중복을 제거한다. ③이 없는 조회 전용 리스트에서는 `pt-0` 없이 `fill p-default`를 사용한다.
|
|
104
|
+
|
|
105
|
+
crud-detail 기준에서는 ②③④ 대신 폼 본문(`<sd-form>` + `form-table`)이 들어간다. ① 메인 액션 영역의 구간 규칙은 동일하다 (단, crud-list의 control 뷰에서는 ① 상단 dock 불필요).
|
|
106
|
+
|
|
107
|
+
#### 구간별 버튼 스타일
|
|
108
|
+
|
|
109
|
+
| 구간 | dock 클래스 | 버튼 테마 | 크기 | 예시 |
|
|
110
|
+
|------|------------|----------|------|------|
|
|
111
|
+
| ① topbar (page) | — | link-style (`'link-primary'`, `'link-danger'`, `'link-warning'`) | 기본값 | 저장, 삭제, 복구 |
|
|
112
|
+
| ① 상단 dock (control) — 주요 액션 | `p-default flex-row gap-default bdb bdb-theme-gray-lightest` | solid (`'primary'`, `'danger'`, `'warning'`, `'success'`) | 기본값 | 저장, 삭제, 상태 변경 |
|
|
113
|
+
| ① 상단 dock (control) — 보조 액션 | 위와 같은 dock 내부 | link-style (`'link-warning'`, `'link-success'`, `'link-info'`) | 기본값 | 출력, 다운로드 |
|
|
114
|
+
| ① 하단 dock (modal) | `p-sm-default flex-row gap-sm bdt bdt-theme-gray-lightest` | solid (`'primary'`, `'danger'`, `'warning'`, `'gray'`) | `'sm'` | 확인, 취소, 삭제, 복구 |
|
|
115
|
+
| ③ 인라인 액션 dock | `flex-row gap-sm p-xs-default` | link-style (`'link-primary'`, `'link-success'`, `'link-danger'`) | `'sm'` | 등록, 선택삭제, 엑셀 |
|
|
116
|
+
|
|
117
|
+
```html
|
|
118
|
+
<!-- ✅ topbar = link-style 기본 크기 / 인라인 dock = link-style sm -->
|
|
119
|
+
<sd-topbar>
|
|
120
|
+
<sd-button [theme]="'link-primary'"> 저장 </sd-button>
|
|
121
|
+
<sd-button [theme]="'link-danger'"> 삭제 </sd-button>
|
|
122
|
+
</sd-topbar>
|
|
123
|
+
<sd-dock class="flex-row gap-sm p-xs-default">
|
|
124
|
+
<sd-button [size]="'sm'" [theme]="'link-primary'" (click)="onAddItemButtonClick()"> 등록 </sd-button>
|
|
125
|
+
</sd-dock>
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
**근거**: topbar는 페이지 전체 액션, 인라인 dock은 시트 직전의 데이터 조작 액션이다. 시각적 위계가 다르므로 크기와 테마로 구분한다. ① 상단/하단 dock은 topbar가 없는 뷰에서 메인 액션을 배치하며, solid 테마와 border(`bdb`/`bdt`)로 영역을 구분한다. 상단 dock 내에서도 주요 액션(저장·삭제·상태 변경)은 solid 테마로, 보조 액션(출력·다운로드)은 link-style 테마로 시각적 위계를 나눈다. ③ 인라인 액션 dock은 가볍게 배치하므로 border 없이 `p-xs-default`로 최소 패딩만 둔다.
|
|
129
|
+
|
|
130
|
+
### `injectViewTypeSignal()`은 생성자 또는 필드 이니셜라이저에서만 호출한다
|
|
131
|
+
|
|
132
|
+
```typescript
|
|
133
|
+
// ✅ 생성자·필드 이니셜라이저에서 한 번만 호출, 이후엔 signal을 읽는다
|
|
134
|
+
private _viewType = injectViewTypeSignal();
|
|
135
|
+
canEdit = computed(() => this._viewType() === "page");
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
**근거**: Angular `inject()`는 injection context에서만 호출 가능하다. 생성자 시점에 signal로 캡처해 두면, 이후 computed 안에서 **읽기**는 문제없다 (`packages/angular/src/core/routing/injectViewTypeSignal.ts:7`).
|
|
139
|
+
|
|
140
|
+
### page 컴포넌트가 `<sd-topbar-container>`와 `<sd-topbar>`를 소유한다
|
|
141
|
+
|
|
142
|
+
마스터-디테일 구조(시트 + 상세를 나란히 배치하는 페이지)에서 페이지 타이틀·주요 액션을 담는 `<sd-topbar-container>` + `<sd-topbar>`는 **page 컴포넌트에만** 둔다. 임베딩되는 sheet·detail control 컴포넌트에서는 `<sd-dock-container>`만 사용한다.
|
|
143
|
+
|
|
144
|
+
```html
|
|
145
|
+
<!-- ✅ page가 topbar를 소유, control은 sd-dock-container만 -->
|
|
146
|
+
<!-- Page -->
|
|
147
|
+
<sd-topbar-container>
|
|
148
|
+
<sd-topbar><h4>{{ viewTitle() }}</h4> ...</sd-topbar>
|
|
149
|
+
<div class="flex-row fill">
|
|
150
|
+
<app-sheet /> <!-- 내부: <sd-dock-container> -->
|
|
151
|
+
<app-detail /> <!-- 내부: <sd-dock-container> -->
|
|
152
|
+
</div>
|
|
153
|
+
</sd-topbar-container>
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
**근거**: control 뷰는 page의 일부로 포함되므로 topbar 중첩이 발생하면 레이아웃이 깨진다. control 내부 도구바(필터·등록·저장 등)는 `<sd-dock-container>` + `<sd-dock>`으로 구성한다.
|
|
157
|
+
|
|
158
|
+
### 마스터-디테일 좌측 시트에 `[autoSelect]="'focus'"`를 적용한다
|
|
159
|
+
|
|
160
|
+
마스터-디테일 구조(좌측 리스트 + 우측 상세)에서, 좌측 시트에 `[autoSelect]="'focus'"`를 추가한다. 사용자가 행에 포커스를 이동하면(키보드 탐색 포함) 즉시 선택되어 우측 디테일 패널이 반응한다.
|
|
161
|
+
|
|
162
|
+
```html
|
|
163
|
+
<sd-sheet
|
|
164
|
+
[selectMode]="'single'"
|
|
165
|
+
[autoSelect]="'focus'"
|
|
166
|
+
[(selectedItems)]="selectedItems"
|
|
167
|
+
...
|
|
168
|
+
>
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
**근거**: 마스터-디테일에서 클릭 없이 키보드 방향키로 행을 탐색할 때 우측 디테일이 따라오지 않으면 UX가 어색하다. `'focus'`는 포커스 이동 시 자동 선택을, `'click'`은 클릭 시 자동 선택을 트리거한다(선택 모달의 single 모드에서 사용 — [확장 D](./crud-list/extension-d-select-modal.md) 참조).
|
|
172
|
+
|
|
173
|
+
### 시트 셀 내부 컨트롤에 `[inset]="true" [size]="'sm'"`을 명시한다
|
|
174
|
+
|
|
175
|
+
상세: [셀 내용 작성 지침](../ui-data/sd-sheet.md#sdsheetcolumncelltemplate)
|
|
176
|
+
|
|
177
|
+
`<sd-sheet-column>`의 `[cell]` 템플릿 안에 들어가는 `sd-textfield` / `sd-select` / `sd-checkbox` / `sd-numpad` / `sd-date-range-picker` / `sd-textarea`는 **항상** `[inset]="true" [size]="'sm'"`을 함께 명시한다.
|
|
178
|
+
|
|
179
|
+
```html
|
|
180
|
+
<!-- ✅ -->
|
|
181
|
+
<ng-template [cell]="column" let-item="item">
|
|
182
|
+
<sd-textfield [(value)]="item.name" [inset]="true" [size]="'sm'" />
|
|
183
|
+
</ng-template>
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
**근거**: 누락해도 컴파일 에러가 발생하지 않으므로 LLM이 빠뜨리기 쉽다. 예외는 "예외 케이스" 섹션 참조.
|
|
187
|
+
|
|
188
|
+
### input 변경을 effect 내부에서 filter·lastFilter·page에 반영한다
|
|
189
|
+
|
|
190
|
+
input signal 값이 바뀌었을 때 조회 결과에 반영하려면, **effect에서 감지 → `untracked`로 상태 갱신 → 재조회 트리거** 순서로 구성한다.
|
|
191
|
+
|
|
192
|
+
```typescript
|
|
193
|
+
constructor() {
|
|
194
|
+
effect(() => {
|
|
195
|
+
if (!this.perms().includes("use")) { /* ... */ }
|
|
196
|
+
|
|
197
|
+
// input 변경 감지 → lastFilter 재반영
|
|
198
|
+
const ids = this.includeIds() ?? [];
|
|
199
|
+
const lf = this.lastFilter();
|
|
200
|
+
if (!obj.equal(ids, lf.includeIds)) {
|
|
201
|
+
untracked(() => {
|
|
202
|
+
this.filter.update((f) => ({ ...f, includeIds: ids }));
|
|
203
|
+
this.lastFilter.set({ ...this.filter() });
|
|
204
|
+
this.page.set(0);
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// 재조회 트리거 의존성
|
|
209
|
+
this.lastFilter();
|
|
210
|
+
this.page();
|
|
211
|
+
this.sortingDefs();
|
|
212
|
+
|
|
213
|
+
void untracked(async () => { /* refresh */ });
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
**근거**: filter·lastFilter·page를 갱신하면 effect 의존성이 즉시 재트리거될 수 있으므로, 중간 상태 갱신은 `untracked`로 감싸야 무한 루프를 피한다. 짝 규칙: "signal 필드 초기값에서 다른 signal 읽기" 금지([🚫 Never](#signal-필드-초기값에서-다른-signal을-읽지-않는다) 참조).
|
|
219
|
+
|
|
220
|
+
## ⚠️ Ask first (조건부)
|
|
221
|
+
|
|
222
|
+
### 공유 데이터 사용 화면은 `_refresh()` 선두에서 `_sdSharedData.wait()`를 호출한다
|
|
223
|
+
|
|
224
|
+
화면에서 `useSharedSignal` / `getHandle` 등 `SdSharedDataProvider`를 사용한다면, `_refresh()`의 **첫 줄**에 `await this._sdSharedData.wait();`를 둔다. 공유 데이터가 사용되지 않는 화면이라면 호출하지 않는다.
|
|
225
|
+
|
|
226
|
+
```typescript
|
|
227
|
+
// ✅ 공유 데이터 사용 화면
|
|
228
|
+
async _refresh(): Promise<void> {
|
|
229
|
+
await this._sdSharedData.wait();
|
|
230
|
+
/* ... */
|
|
231
|
+
}
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
**근거**: 공유 데이터 로딩이 완료되기 전에 렌더하면 셀렉트 드롭다운 등이 빈 상태로 노출된다 (`packages/angular/src/core/shared-data/sd-shared-data.provider.ts:120`).
|
|
235
|
+
|
|
236
|
+
**판단 기준**: 현재 화면이 `useSharedSignal`(각 앱이 `SdSharedDataProvider` 위에 정의하는 공용 훅 — `@simplysm/angular` 미제공) / `getHandle` / `emitAsync` 중 하나라도 사용하면 호출한다. 하나도 사용하지 않으면 호출하지 않는다.
|
|
237
|
+
|
|
238
|
+
### `SdCommandDirective` 부착 위치를 한 곳에 둔다
|
|
239
|
+
|
|
240
|
+
`SdCommandDirective`(`[sdSaveCommand]` / `[sdInsertCommand]`)는 **document 레벨** keydown 리스너를 등록한다(`packages/angular/src/core/commands/sd-command.ts:40`). 같은 화면에서 여러 컴포넌트에 부착하면 모두 발동된다.
|
|
241
|
+
|
|
242
|
+
**판단 기준**:
|
|
243
|
+
|
|
244
|
+
- `onSubmit()`을 **직접 소유하는** 컴포넌트에만 부착한다.
|
|
245
|
+
- 자식 컴포넌트를 조합만 하는 page 래퍼, 권한 체크·레이아웃만 담당하는 컨테이너에는 부착하지 않는다.
|
|
246
|
+
- 마스터-디테일에서는 의도된 쪽 한 곳에만 부착한다 (보통 sheet 쪽).
|
|
247
|
+
|
|
248
|
+
**근거**: 최상위 모달 판정(`shouldProcessCommandEvent`)은 모달 내부만 구분하고, 형제 컴포넌트 간 구분은 하지 않는다.
|
|
249
|
+
|
|
250
|
+
### 삭제 방식은 DB 스키마에 따라 결정한다
|
|
251
|
+
|
|
252
|
+
DB 테이블 스키마에 따라 soft-delete와 물리 삭제 중 하나를 선택한다.
|
|
253
|
+
|
|
254
|
+
- **`isDeleted` 컬럼이 있는 테이블**: `isDeleted: true` 업데이트로 **soft-delete**. 삭제·복구 토글을 제공한다. `crud-list` 확장 B/C, `crud-detail` 확장 B가 이 경로에 해당한다.
|
|
255
|
+
- **`isDeleted` 컬럼이 없는 테이블**: row DELETE로 **물리 삭제**. 복구 기능 없이 바로 삭제한다. 위 확장들은 사용하지 않는다.
|
|
256
|
+
|
|
257
|
+
**근거**: 동일 화면에서 두 방식을 혼용하면 삭제 의미가 불명확해진다. 컬럼 유무 하나로 결정되므로 선택 기준이 명확하다.
|
|
258
|
+
|
|
259
|
+
## 🚫 Never (금지)
|
|
260
|
+
|
|
261
|
+
### input 의존 데이터 로딩에 `void this._initAsync()`를 사용하지 않는다
|
|
262
|
+
|
|
263
|
+
`input()` / `input.required()` signal 값에 따라 데이터를 로드하는 컴포넌트에서, 생성자에서 `void this._initAsync()`를 호출하고 별도 메서드에서 비동기 로직을 수행하는 패턴은 사용하지 않는다.
|
|
264
|
+
|
|
265
|
+
```typescript
|
|
266
|
+
// ✅ input 변경 시 자동 재실행
|
|
267
|
+
constructor() {
|
|
268
|
+
effect(() => {
|
|
269
|
+
this.someInput(); // 의존성 등록 (untracked 바깥)
|
|
270
|
+
void untracked(async () => { /* ... */ });
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
**근거**: 생성자 호출은 최초 1회뿐이므로 input signal 변경에 반응하지 못한다.
|
|
276
|
+
|
|
277
|
+
**대안**: `effect`로 input 의존성을 등록하고, 비동기 작업은 `void untracked(async () => { /* ... */ })`로 감싼다. 최소 뼈대의 초기 effect, [확장 E(조회 전용 modal)](./crud-list/extension-e-readonly-modal.md)의 부모 식별자 input 등 모든 input 의존 로딩에 동일하게 적용된다.
|
|
278
|
+
|
|
279
|
+
### signal 필드 초기값에서 다른 signal을 읽지 않는다
|
|
280
|
+
|
|
281
|
+
`signal()` 필드 이니셜라이저에서 `this.someInput()` 같은 다른 signal을 읽지 않는다. 필드 이니셜라이저는 클래스 생성 시점에 실행되며, input signal은 부모로부터 값을 전달받기 전이므로 항상 기본값만 반환한다.
|
|
282
|
+
|
|
283
|
+
```typescript
|
|
284
|
+
// ✅ 기본값만 사용, input 반영은 effect에서 수행
|
|
285
|
+
filter = signal<IFilter>({
|
|
286
|
+
includeIds: [],
|
|
287
|
+
isIncludeDeleted: false,
|
|
288
|
+
});
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
**근거**: 초기값에서 빼는 것만으로는 부족하다. input 값을 반영하는 로직이 effect 안에 있어야 input 변경 시 filter·lastFilter·page가 갱신된다.
|
|
292
|
+
|
|
293
|
+
**대안**: [✅ Always의 "input 변경을 effect 내부에서 filter·lastFilter·page에 반영한다"](#input-변경을-effect-내부에서-filterlastfilterpage에-반영한다) 참조.
|
|
294
|
+
|
|
295
|
+
### `mark(sig)`를 "저장 감지" 수단으로 사용하지 않는다
|
|
296
|
+
|
|
297
|
+
상세: [`mark` — 역할·주의사항](../utils/mark.md)
|
|
298
|
+
|
|
299
|
+
`mark(sig)`는 `WritableSignal`의 값을 shallow copy(배열: `[...v]`, 객체: `{...v}`)하여 참조를 갱신한다(`packages/angular/src/core/mark.ts:7`). 역할은 두 가지다.
|
|
300
|
+
|
|
301
|
+
- **OnPush 템플릿 재렌더링** 유발
|
|
302
|
+
- **다른 computed / effect의 의존성 갱신**
|
|
303
|
+
|
|
304
|
+
```typescript
|
|
305
|
+
// ✅ snapshot과 현재값을 obj.equal로 비교하여 변경 판단
|
|
306
|
+
onSubmit() {
|
|
307
|
+
if (!obj.equal(this._snapshot(), this.item())) {
|
|
308
|
+
void this._saveAsync();
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
// mark의 용도는 별개 — OnPush 재렌더링과 의존 computed/effect 통지
|
|
313
|
+
applyBulkEdit() {
|
|
314
|
+
for (const row of this.items()) row.selected = true;
|
|
315
|
+
mark(this.items); // 배열 참조 갱신 → 템플릿 재렌더링
|
|
316
|
+
}
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
**근거**: 값 차이 감지는 `obj.equal`(`packages/core-common/src/utils/obj.ts:172`)의 deep equal이 담당하므로, 필드 mutation은 `mark` 없이도 snapshot 비교(`_checkIgnoreChanges` / `onSubmit` / `diffs()`)에서 감지된다. Chrome 61 호환(`Proxy` 폴리필 불가)으로 signal 자동 notify가 불가해 명시적 호출이 필요할 뿐, "감지"와 "통지"는 별개다.
|
|
320
|
+
|
|
321
|
+
**대안**: UI 재렌더링과 effect 의존성 갱신이 목적일 때만 `mark`를 사용한다. 저장 여부 판정은 snapshot 비교 로직이 담당한다.
|
|
322
|
+
|
|
323
|
+
## 예외 케이스
|
|
324
|
+
|
|
325
|
+
### 시트 셀 `[inset]="true" [size]="'sm'"` 예외
|
|
326
|
+
|
|
327
|
+
- **복합 구조(텍스트+컨트롤)**: `[inset]="false"`로 셀 외곽을 유지한다.
|
|
328
|
+
- **큰 시트 행**: `[size]` 속성을 생략한다.
|
|
329
|
+
|
|
330
|
+
### 공유 데이터 미사용 화면
|
|
331
|
+
|
|
332
|
+
`useSharedSignal` / `getHandle` / `emitAsync`를 전혀 사용하지 않는 화면이라면 `_refresh()` 선두의 `await this._sdSharedData.wait();` 호출은 불필요하다.
|
|
333
|
+
|
|
334
|
+
### `isDeleted` 컬럼이 없는 테이블
|
|
335
|
+
|
|
336
|
+
soft-delete 관련 확장(`crud-list` 확장 B/C, `crud-detail` 확장 B)을 사용하지 않는다. 삭제 UI는 물리 삭제 단일 경로로만 제공한다.
|