@simplysm/sd-claude 14.0.53 → 14.0.55
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-simplysm-v14/angular/README.md +164 -291
- package/claude/references/sd-simplysm-v14/angular/_api-index.md +250 -0
- package/claude/references/sd-simplysm-v14/angular/bootstrap/provide-sd-angular.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/bootstrap/sd-angular-config-provider.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/directives/sd-command-directive.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/directives/sd-events.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/directives/sd-intersection-directive.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/directives/sd-invalid.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/directives/sd-resize-directive.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/directives/sd-ripple.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/directives/sd-router-link.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/directives/sd-show-effect.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/directives/sd-typed-template.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/features/sd-address-search-modal.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/features/sd-permission-table.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/features/sd-shared-data-components.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/features/sd-tiptap-editor.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/pipes/format-pipe.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/plugins/sd-global-error-handler.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/plugins/sd-option-event-plugin.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/provider-types/sd-menu.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/provider-types/sd-modal-content-def.md +9 -9
- package/claude/references/sd-simplysm-v14/angular/provider-types/sd-toast-content-def.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/provider-types/shared-data-base.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-activated-modal-provider.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-app-structure-provider.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-busy-provider.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-file-dialog-provider.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-local-storage-provider.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-modal-provider.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-navigate-window-provider.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-print-provider.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-service-client-factory-provider.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-shared-data-provider.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-system-config-provider.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-system-log-provider.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-theme-provider.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-toast-provider.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/styling/classes.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/styling/mixins.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/styling/themes.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/styling/variables.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/type-utilities/directive-input-signals.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/ui-data/sd-base-container.md +141 -0
- package/claude/references/sd-simplysm-v14/angular/ui-data/sd-crud-detail.md +273 -0
- package/claude/references/sd-simplysm-v14/angular/ui-data/sd-crud-list.md +623 -0
- package/claude/references/sd-simplysm-v14/angular/ui-data/sd-list.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/ui-data/sd-sheet.md +34 -39
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-additional-button.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-anchor.md +2 -7
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-button.md +2 -11
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-checkbox-group.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-checkbox.md +2 -4
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-date-range-picker.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-form.md +2 -7
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-modal-select-button.md +7 -7
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-numpad.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-range.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-select.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-shared-data-select.md +2 -4
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-state-preset.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-switch.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-textarea.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-textfield.md +2 -8
- package/claude/references/sd-simplysm-v14/angular/ui-layout/sd-dock-container.md +2 -7
- package/claude/references/sd-simplysm-v14/angular/ui-layout/sd-dock.md +2 -6
- package/claude/references/sd-simplysm-v14/angular/ui-layout/sd-gap.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/ui-layout/sd-kanban-board.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/ui-layout/sd-kanban-lane.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/ui-layout/sd-kanban.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-collapse.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-pagination.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-sidebar-container.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-sidebar-menu.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-sidebar-user.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-tab.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-topbar-container.md +2 -9
- package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-topbar-menu.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-topbar-user.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-topbar.md +2 -7
- package/claude/references/sd-simplysm-v14/angular/ui-overlay/sd-busy-container.md +2 -5
- package/claude/references/sd-simplysm-v14/angular/ui-overlay/sd-confirm-modal.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/ui-overlay/sd-dropdown.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/ui-overlay/sd-modal.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/ui-overlay/sd-prompt-modal.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/ui-overlay/sd-toast.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/ui-visual/sd-barcode.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/ui-visual/sd-calendar.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/ui-visual/sd-echarts.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/ui-visual/sd-label.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/ui-visual/sd-note.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/ui-visual/sd-progress.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/utils/inject-routing-signals.md +3 -16
- package/claude/references/sd-simplysm-v14/angular/utils/inject-sd-system-config-resource.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/utils/mark.md +2 -5
- package/claude/references/sd-simplysm-v14/angular/utils/selection-managers.md +3 -1
- package/claude/references/sd-simplysm-v14/angular/utils/set-safe-style.md +2 -0
- package/claude/references/sd-simplysm-v14/angular/utils/setup-functions.md +2 -4
- package/claude/references/sd-simplysm-v14/capacitor-plugin-auto-update/README.md +16 -18
- package/claude/references/sd-simplysm-v14/capacitor-plugin-auto-update/_api-index.md +18 -0
- package/claude/references/sd-simplysm-v14/capacitor-plugin-auto-update/apk-installer/apk-installer.md +1 -1
- package/claude/references/sd-simplysm-v14/capacitor-plugin-auto-update/auto-update/auto-update.md +1 -1
- package/claude/references/sd-simplysm-v14/capacitor-plugin-file-system/README.md +24 -45
- package/claude/references/sd-simplysm-v14/core-browser/README.md +22 -29
- package/claude/references/sd-simplysm-v14/core-browser/_api-index.md +37 -0
- package/claude/references/sd-simplysm-v14/core-browser/extensions/copy-paste.md +1 -1
- package/claude/references/sd-simplysm-v14/core-browser/extensions/element-prototype-extensions.md +2 -0
- package/claude/references/sd-simplysm-v14/core-browser/extensions/get-bounds.md +1 -1
- package/claude/references/sd-simplysm-v14/core-browser/utils/download-blob.md +1 -1
- package/claude/references/sd-simplysm-v14/core-browser/utils/fetch-url-bytes.md +1 -1
- package/claude/references/sd-simplysm-v14/core-browser/utils/indexed-db-store.md +1 -1
- package/claude/references/sd-simplysm-v14/core-browser/utils/indexed-db-virtual-fs.md +1 -1
- package/claude/references/sd-simplysm-v14/core-browser/utils/open-file-dialog.md +1 -1
- package/claude/references/sd-simplysm-v14/core-common/README.md +71 -153
- package/claude/references/sd-simplysm-v14/core-common/_api-index.md +70 -0
- package/claude/references/sd-simplysm-v14/core-common/errors/argument-error.md +3 -1
- package/claude/references/sd-simplysm-v14/core-common/errors/not-implemented-error.md +3 -1
- package/claude/references/sd-simplysm-v14/core-common/errors/sd-error.md +3 -1
- package/claude/references/sd-simplysm-v14/core-common/errors/timeout-error.md +3 -1
- package/claude/references/sd-simplysm-v14/core-common/extensions/array.md +2 -0
- package/claude/references/sd-simplysm-v14/core-common/extensions/map.md +2 -0
- package/claude/references/sd-simplysm-v14/core-common/extensions/set.md +2 -0
- package/claude/references/sd-simplysm-v14/core-common/features/debounce-queue.md +3 -1
- package/claude/references/sd-simplysm-v14/core-common/features/event-emitter.md +3 -1
- package/claude/references/sd-simplysm-v14/core-common/features/serial-queue.md +3 -1
- package/claude/references/sd-simplysm-v14/core-common/type-utils/common-types.md +2 -0
- package/claude/references/sd-simplysm-v14/core-common/type-utils/env.md +3 -1
- package/claude/references/sd-simplysm-v14/core-common/types/date-only.md +3 -1
- package/claude/references/sd-simplysm-v14/core-common/types/date-time.md +9 -1
- package/claude/references/sd-simplysm-v14/core-common/types/lazy-gc-map.md +3 -1
- package/claude/references/sd-simplysm-v14/core-common/types/time.md +3 -1
- package/claude/references/sd-simplysm-v14/core-common/types/uuid.md +3 -1
- package/claude/references/sd-simplysm-v14/core-common/utils/bytes.md +3 -1
- package/claude/references/sd-simplysm-v14/core-common/utils/dt.md +3 -1
- package/claude/references/sd-simplysm-v14/core-common/utils/err.md +3 -1
- package/claude/references/sd-simplysm-v14/core-common/utils/json.md +3 -1
- package/claude/references/sd-simplysm-v14/core-common/utils/num.md +3 -1
- package/claude/references/sd-simplysm-v14/core-common/utils/obj.md +3 -1
- package/claude/references/sd-simplysm-v14/core-common/utils/path.md +3 -1
- package/claude/references/sd-simplysm-v14/core-common/utils/primitive.md +3 -1
- package/claude/references/sd-simplysm-v14/core-common/utils/str.md +3 -1
- package/claude/references/sd-simplysm-v14/core-common/utils/template-strings.md +2 -0
- package/claude/references/sd-simplysm-v14/core-common/utils/transfer.md +3 -1
- package/claude/references/sd-simplysm-v14/core-common/utils/wait.md +3 -1
- package/claude/references/sd-simplysm-v14/core-common/utils/xml.md +3 -1
- package/claude/references/sd-simplysm-v14/core-common/utils/zip-archive.md +3 -1
- package/claude/references/sd-simplysm-v14/core-node/README.md +25 -35
- package/claude/references/sd-simplysm-v14/core-node/_api-index.md +34 -0
- package/claude/references/sd-simplysm-v14/core-node/features/fs-watcher.md +3 -1
- package/claude/references/sd-simplysm-v14/core-node/logging/create-file-reporter.md +3 -1
- package/claude/references/sd-simplysm-v14/core-node/logging/pretty-reporter.md +3 -1
- package/claude/references/sd-simplysm-v14/core-node/logging/setup-consola.md +3 -1
- package/claude/references/sd-simplysm-v14/core-node/utils/cpx.md +3 -1
- package/claude/references/sd-simplysm-v14/core-node/utils/fsx.md +3 -1
- package/claude/references/sd-simplysm-v14/core-node/utils/pathx.md +3 -1
- package/claude/references/sd-simplysm-v14/core-node/worker/create-worker.md +3 -1
- package/claude/references/sd-simplysm-v14/core-node/worker/worker.md +3 -1
- package/claude/references/sd-simplysm-v14/excel/README.md +35 -49
- package/claude/references/sd-simplysm-v14/excel/_api-index.md +40 -0
- package/claude/references/sd-simplysm-v14/excel/core-classes/excel-cell.md +3 -1
- package/claude/references/sd-simplysm-v14/excel/core-classes/excel-col.md +3 -1
- package/claude/references/sd-simplysm-v14/excel/core-classes/excel-row.md +3 -1
- package/claude/references/sd-simplysm-v14/excel/core-classes/excel-workbook.md +6 -3
- package/claude/references/sd-simplysm-v14/excel/core-classes/excel-worksheet.md +3 -1
- package/claude/references/sd-simplysm-v14/excel/types/excel-address-point.md +3 -1
- package/claude/references/sd-simplysm-v14/excel/types/excel-style-options.md +3 -1
- package/claude/references/sd-simplysm-v14/excel/types/excel-value-type.md +3 -1
- package/claude/references/sd-simplysm-v14/excel/utilities/excel-utils.md +3 -1
- package/claude/references/sd-simplysm-v14/excel/wrapper/excel-wrapper.md +3 -1
- package/claude/references/sd-simplysm-v14/orm-common/README.md +66 -71
- package/claude/references/sd-simplysm-v14/orm-common/_api-index.md +59 -0
- package/claude/references/sd-simplysm-v14/orm-common/core/db-context.md +3 -1
- package/claude/references/sd-simplysm-v14/orm-common/core/db-transaction-error.md +3 -1
- package/claude/references/sd-simplysm-v14/orm-common/expression/expr-unit.md +3 -1
- package/claude/references/sd-simplysm-v14/orm-common/expression/expr.md +3 -1
- package/claude/references/sd-simplysm-v14/orm-common/models/migration.md +3 -1
- package/claude/references/sd-simplysm-v14/orm-common/query-builder/create-query-builder.md +3 -1
- package/claude/references/sd-simplysm-v14/orm-common/queryable-executable/executable.md +3 -1
- package/claude/references/sd-simplysm-v14/orm-common/queryable-executable/parse-search-query.md +3 -1
- package/claude/references/sd-simplysm-v14/orm-common/queryable-executable/queryable.md +3 -1
- package/claude/references/sd-simplysm-v14/orm-common/schema-builders/column-builder.md +3 -1
- package/claude/references/sd-simplysm-v14/orm-common/schema-builders/foreign-key-builder.md +3 -1
- package/claude/references/sd-simplysm-v14/orm-common/schema-builders/index-builder.md +3 -1
- package/claude/references/sd-simplysm-v14/orm-common/schema-builders/procedure.md +3 -1
- package/claude/references/sd-simplysm-v14/orm-common/schema-builders/table.md +3 -1
- package/claude/references/sd-simplysm-v14/orm-common/schema-builders/view.md +3 -1
- package/claude/references/sd-simplysm-v14/orm-common/types/data-type.md +3 -1
- package/claude/references/sd-simplysm-v14/orm-common/types/dialect.md +3 -1
- package/claude/references/sd-simplysm-v14/orm-common/types/expr.md +3 -1
- package/claude/references/sd-simplysm-v14/orm-common/types/parse-query-result.md +3 -1
- package/claude/references/sd-simplysm-v14/orm-common/types/query-def.md +3 -1
- package/claude/references/sd-simplysm-v14/orm-node/README.md +27 -28
- package/claude/references/sd-simplysm-v14/orm-node/_api-index.md +29 -0
- package/claude/references/sd-simplysm-v14/orm-node/connections/mssql-db-conn.md +2 -0
- package/claude/references/sd-simplysm-v14/orm-node/connections/mysql-db-conn.md +2 -0
- package/claude/references/sd-simplysm-v14/orm-node/connections/postgresql-db-conn.md +2 -0
- package/claude/references/sd-simplysm-v14/orm-node/core/create-db-conn.md +2 -0
- package/claude/references/sd-simplysm-v14/orm-node/core/create-orm.md +2 -0
- package/claude/references/sd-simplysm-v14/orm-node/core/node-db-context-executor.md +2 -0
- package/claude/references/sd-simplysm-v14/orm-node/types/db-conn-config.md +2 -0
- package/claude/references/sd-simplysm-v14/orm-node/types/db-conn-constants.md +2 -0
- package/claude/references/sd-simplysm-v14/orm-node/types/db-conn.md +2 -0
- package/claude/references/sd-simplysm-v14/orm-node/types/get-dialect-from-config.md +2 -0
- package/claude/references/sd-simplysm-v14/sd-claude/README.md +26 -65
- package/claude/references/sd-simplysm-v14/sd-claude/_api-index.md +39 -0
- package/claude/references/sd-simplysm-v14/sd-claude/assets.md +2 -0
- package/claude/references/sd-simplysm-v14/sd-claude/cli.md +3 -1
- package/claude/references/sd-simplysm-v14/sd-claude/hooks.md +11 -7
- package/claude/references/sd-simplysm-v14/sd-claude/scripts.md +2 -0
- package/claude/references/sd-simplysm-v14/sd-cli/README.md +48 -119
- package/claude/references/sd-simplysm-v14/sd-cli/_api-index.md +49 -0
- package/claude/references/sd-simplysm-v14/sd-cli/angular-vite-plugin/sd-angular-plugin.md +3 -1
- package/claude/references/sd-simplysm-v14/sd-cli/config/build-target.md +3 -1
- package/claude/references/sd-simplysm-v14/sd-cli/config/npm-config.md +3 -1
- package/claude/references/sd-simplysm-v14/sd-cli/config/sd-browser-support-config.md +3 -1
- package/claude/references/sd-simplysm-v14/sd-cli/config/sd-build-package-config.md +4 -2
- package/claude/references/sd-simplysm-v14/sd-cli/config/sd-capacitor-config.md +3 -1
- package/claude/references/sd-simplysm-v14/sd-cli/config/sd-client-package-config.md +4 -2
- package/claude/references/sd-simplysm-v14/sd-cli/config/sd-config.md +4 -2
- package/claude/references/sd-simplysm-v14/sd-cli/config/sd-electron-config.md +3 -1
- package/claude/references/sd-simplysm-v14/sd-cli/config/sd-package-config.md +3 -1
- package/claude/references/sd-simplysm-v14/sd-cli/config/sd-post-publish-script-config.md +3 -1
- package/claude/references/sd-simplysm-v14/sd-cli/config/sd-publish-config.md +3 -1
- package/claude/references/sd-simplysm-v14/sd-cli/config/sd-pwa-config.md +3 -1
- package/claude/references/sd-simplysm-v14/sd-cli/config/sd-scripts-package-config.md +4 -2
- package/claude/references/sd-simplysm-v14/sd-cli/config/sd-server-package-config.md +4 -2
- package/claude/references/sd-simplysm-v14/sd-cli/config/sd-watch-hook-config.md +3 -1
- package/claude/references/sd-simplysm-v14/sd-cli/ts-compiler/sd-ts-compiler.md +3 -1
- package/claude/references/sd-simplysm-v14/service-client/README.md +33 -42
- package/claude/references/sd-simplysm-v14/service-client/_api-index.md +58 -0
- package/claude/references/sd-simplysm-v14/service-client/features/event-client.md +1 -1
- package/claude/references/sd-simplysm-v14/service-client/features/file-client.md +1 -1
- package/claude/references/sd-simplysm-v14/service-client/features/orm-client-connector.md +1 -1
- package/claude/references/sd-simplysm-v14/service-client/features/orm-client-db-context-executor.md +1 -1
- package/claude/references/sd-simplysm-v14/service-client/main/service-client.md +1 -1
- package/claude/references/sd-simplysm-v14/service-client/protocol/client-protocol-wrapper.md +1 -1
- package/claude/references/sd-simplysm-v14/service-client/transport/service-transport.md +1 -1
- package/claude/references/sd-simplysm-v14/service-client/transport/socket-provider.md +1 -1
- package/claude/references/sd-simplysm-v14/service-client/types/blob-input.md +2 -2
- package/claude/references/sd-simplysm-v14/service-client/types/browser-worker.md +2 -2
- package/claude/references/sd-simplysm-v14/service-client/types/file-collection.md +2 -2
- package/claude/references/sd-simplysm-v14/service-client/types/service-connection-options.md +2 -2
- package/claude/references/sd-simplysm-v14/service-client/types/service-progress.md +2 -2
- package/claude/references/sd-simplysm-v14/service-common/README.md +34 -127
- package/claude/references/sd-simplysm-v14/service-common/_api-index.md +51 -0
- package/claude/references/sd-simplysm-v14/service-common/app-structure/app-structure-item.md +3 -1
- package/claude/references/sd-simplysm-v14/service-common/app-structure/get-flat-permissions.md +7 -1
- package/claude/references/sd-simplysm-v14/service-common/app-structure/is-usable-modules-chain.md +3 -1
- package/claude/references/sd-simplysm-v14/service-common/app-structure/is-usable-modules.md +3 -1
- package/claude/references/sd-simplysm-v14/service-common/events/define-event.md +7 -1
- package/claude/references/sd-simplysm-v14/service-common/protocol/create-service-protocol.md +8 -1
- package/claude/references/sd-simplysm-v14/service-common/protocol/protocol-config.md +3 -1
- package/claude/references/sd-simplysm-v14/service-common/protocol/service-add-event-listener-message.md +3 -1
- package/claude/references/sd-simplysm-v14/service-common/protocol/service-auth-message.md +3 -1
- package/claude/references/sd-simplysm-v14/service-common/protocol/service-emit-event-message.md +3 -1
- package/claude/references/sd-simplysm-v14/service-common/protocol/service-error-message.md +3 -1
- package/claude/references/sd-simplysm-v14/service-common/protocol/service-event-message.md +3 -1
- package/claude/references/sd-simplysm-v14/service-common/protocol/service-get-event-listener-infos-message.md +3 -1
- package/claude/references/sd-simplysm-v14/service-common/protocol/service-message.md +3 -1
- package/claude/references/sd-simplysm-v14/service-common/protocol/service-progress-message.md +3 -1
- package/claude/references/sd-simplysm-v14/service-common/protocol/service-remove-event-listener-message.md +3 -1
- package/claude/references/sd-simplysm-v14/service-common/protocol/service-request-message.md +3 -1
- package/claude/references/sd-simplysm-v14/service-common/protocol/service-response-message.md +3 -1
- package/claude/references/sd-simplysm-v14/service-common/service-types/app-structure-service.md +3 -1
- package/claude/references/sd-simplysm-v14/service-common/service-types/auto-update-service.md +3 -1
- package/claude/references/sd-simplysm-v14/service-common/service-types/orm-service.md +3 -1
- package/claude/references/sd-simplysm-v14/service-common/types/service-upload-result.md +3 -1
- package/claude/references/sd-simplysm-v14/service-server/README.md +50 -135
- package/claude/references/sd-simplysm-v14/service-server/_api-index.md +87 -0
- package/claude/references/sd-simplysm-v14/service-server/auth/auth-token-payload.md +3 -1
- package/claude/references/sd-simplysm-v14/service-server/auth/sign-jwt.md +3 -1
- package/claude/references/sd-simplysm-v14/service-server/auth/verify-jwt.md +3 -1
- package/claude/references/sd-simplysm-v14/service-server/core/auth.md +3 -1
- package/claude/references/sd-simplysm-v14/service-server/core/define-service.md +3 -1
- package/claude/references/sd-simplysm-v14/service-server/core/execute-service-method.md +3 -1
- package/claude/references/sd-simplysm-v14/service-server/core/service-context.md +3 -1
- package/claude/references/sd-simplysm-v14/service-server/legacy/handle-v1-connection.md +3 -1
- package/claude/references/sd-simplysm-v14/service-server/main/create-service-server.md +3 -1
- package/claude/references/sd-simplysm-v14/service-server/main/service-server.md +3 -1
- package/claude/references/sd-simplysm-v14/service-server/protocol/server-protocol-wrapper.md +3 -1
- package/claude/references/sd-simplysm-v14/service-server/services/app-structure-service.md +3 -1
- package/claude/references/sd-simplysm-v14/service-server/services/auto-update-service.md +3 -1
- package/claude/references/sd-simplysm-v14/service-server/services/orm-service.md +3 -1
- package/claude/references/sd-simplysm-v14/service-server/transport-http/handle-http-request.md +3 -1
- package/claude/references/sd-simplysm-v14/service-server/transport-http/handle-static-file.md +3 -1
- package/claude/references/sd-simplysm-v14/service-server/transport-http/handle-upload.md +3 -1
- package/claude/references/sd-simplysm-v14/service-server/transport-socket/service-socket.md +3 -1
- package/claude/references/sd-simplysm-v14/service-server/transport-socket/websocket-handler.md +3 -1
- package/claude/references/sd-simplysm-v14/service-server/types/service-server-options.md +3 -1
- package/claude/references/sd-simplysm-v14/service-server/utils/get-config.md +3 -1
- package/claude/references/sd-simplysm-v14/storage/README.md +17 -80
- package/claude/references/sd-simplysm-v14/storage/_api-index.md +26 -0
- package/claude/references/sd-simplysm-v14/storage/clients/ftp-storage-client.md +3 -1
- package/claude/references/sd-simplysm-v14/storage/clients/sftp-storage-client.md +3 -1
- package/claude/references/sd-simplysm-v14/storage/factory/storage-factory.md +1 -1
- package/claude/references/sd-simplysm-v14/storage/types/file-info.md +3 -1
- package/claude/references/sd-simplysm-v14/storage/types/storage-client.md +2 -0
- package/claude/references/sd-simplysm-v14/storage/types/storage-conn-config.md +3 -1
- package/claude/rules/sd-claude-rules.md +1 -1
- package/claude/skills/sd-dev/SKILL.md +62 -8
- package/claude/skills/sd-dev/subagent-preamble.md +22 -0
- package/package.json +1 -1
- package/claude/references/sd-simplysm-v14/angular/recipes/_common-rules.md +0 -336
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail/extension-a-edit-save.md +0 -191
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail/extension-b-delete-restore.md +0 -103
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail/extension-c-modal-view.md +0 -198
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail/extension-d-control-view.md +0 -109
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail/extension-e-auxiliary.md +0 -87
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail/extension-f-complex-detail.md +0 -202
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail.md +0 -280
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-a-inline-edit.md +0 -386
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-b-selection.md +0 -215
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-c-inline-delete.md +0 -64
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-d-select-modal.md +0 -193
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-e-readonly-modal.md +0 -140
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-f-modal-edit.md +0 -123
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-g-excel.md +0 -145
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-list.md +0 -377
- package/claude/references/sd-simplysm-v14/angular/recipes/data-select-button.md +0 -368
- package/claude/references/sd-simplysm-v14/angular/recipes/page-modal-container.md +0 -238
- package/claude/references/sd-simplysm-v14/excel/types/excel-xml-content-type-data.md +0 -23
- package/claude/references/sd-simplysm-v14/excel/types/excel-xml-drawing-data.md +0 -29
- package/claude/references/sd-simplysm-v14/excel/types/excel-xml-relationship-data.md +0 -39
- package/claude/references/sd-simplysm-v14/excel/types/excel-xml-shared-string-data.md +0 -42
- package/claude/references/sd-simplysm-v14/excel/types/excel-xml-style-data.md +0 -97
- package/claude/references/sd-simplysm-v14/excel/types/excel-xml-workbook-data.md +0 -22
- package/claude/references/sd-simplysm-v14/excel/types/excel-xml-worksheet-data.md +0 -68
- package/claude/references/sd-simplysm-v14/excel/types/excel-xml.md +0 -15
|
@@ -0,0 +1,623 @@
|
|
|
1
|
+
# `SdCrudList`
|
|
2
|
+
|
|
3
|
+
> **읽어야 하는 상황**: CRUD 목록 화면(시트 + 필터 + 등록/삭제)을 만들 때. 상세 화면은 [`SdCrudDetail`](./sd-crud-detail.md) 참조.
|
|
4
|
+
|
|
5
|
+
CRUD 목록 화면 스캐폴드. `SdBaseContainer`를 내부에 사용하며, `SdSheet` 기반 데이터 표시, 필터 폼, 등록/삭제/복구 버튼, 모달 선택 모드를 제공한다.
|
|
6
|
+
|
|
7
|
+
## Import
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
import { SdCrudList } from "@simplysm/angular";
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Selector
|
|
14
|
+
|
|
15
|
+
`sd-crud-list`
|
|
16
|
+
|
|
17
|
+
## Type Parameters
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
SdCrudList<TItem, TKey>
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
- `TItem` — 목록 항목 타입 (`items` 배열의 요소)
|
|
24
|
+
- `TKey` — 항목 식별자 타입 (`trackByFn`의 반환 타입, 보통 `number`)
|
|
25
|
+
|
|
26
|
+
## Inputs
|
|
27
|
+
|
|
28
|
+
| Input | Type | Default | Description |
|
|
29
|
+
|-------|------|---------|-------------|
|
|
30
|
+
| `initialized` | `boolean` | `false` | 외부 초기화 완료 여부. `true`일 때만 콘텐츠 렌더링. |
|
|
31
|
+
| `restricted` | `boolean` | `false` | `true`이면 "사용권한이 없습니다" 메시지 표시. |
|
|
32
|
+
| `readonly` | `boolean` | `false` | 읽기 전용 모드. 저장/등록/삭제/복구 버튼 숨김, 시트 셀 편집 비활성, `<sd-form>` 비활성. |
|
|
33
|
+
| `viewType` | `SdViewType` | **required** | `"page"` \| `"modal"` \| `"control"`. 레이아웃과 저장 버튼 위치를 결정. |
|
|
34
|
+
| `selectMode` | `"single" \| "multi"` | `undefined` | 모달 선택 모드. 미지정 시 일반 CRUD 모드. |
|
|
35
|
+
| `key` | `string` | **required** | `SdSheet`의 `key`에 `"-sheet"` 접미사를 붙여 전달. 컬럼 너비/순서 등 사용자 설정 저장에 사용. |
|
|
36
|
+
| `items` | `TItem[]` | `[]` | 시트에 표시할 데이터 배열. |
|
|
37
|
+
| `currDeletedItems` | `TItem[]` | `[]` | 현재 삭제 표시할 항목 배열. 이 배열에 포함된 항목은 `text-decoration: line-through` 스타일이 적용되고, 행별 삭제 버튼이 복구 버튼으로 변경된다. |
|
|
38
|
+
| `totalPageCount` | `number` | `0` | 서버 페이징 시 총 페이지 수. `0`이면 클라이언트 정렬(`useAutoSort=true`)이 활성화된다. |
|
|
39
|
+
| `trackByFn` | `(item: TItem) => TKey` | **required** | 항목 식별 함수. 보통 `(item: IItem) => item.id`로 정의. |
|
|
40
|
+
|
|
41
|
+
## Two-way Bindings (model)
|
|
42
|
+
|
|
43
|
+
| Model | Type | Default | Description |
|
|
44
|
+
|-------|------|---------|-------------|
|
|
45
|
+
| `ready` | `boolean` | `false` | SdBaseContainer의 공유 데이터 로딩 완료 시 `true`. |
|
|
46
|
+
| `busyCount` | `number` | `0` | 로딩 카운터. |
|
|
47
|
+
| `selectedKeys` | `NonNullable<TKey>[]` | `[]` | 현재 선택된 항목들의 키 배열. |
|
|
48
|
+
| `currentPage` | `number` | `0` | 현재 페이지 번호 (0-based). |
|
|
49
|
+
| `sorts` | `SortingDef[]` | `[]` | 현재 정렬 상태. `SortingDef = { key: string; desc: boolean }`. |
|
|
50
|
+
|
|
51
|
+
## Outputs
|
|
52
|
+
|
|
53
|
+
| Output | Type | Description |
|
|
54
|
+
|--------|------|-------------|
|
|
55
|
+
| `filterSubmit` | `void` | 필터 폼의 "조회" 버튼 클릭 시 발생. 소비 컴포넌트에서 `page`를 0으로 리셋하고 `lastFilter`를 갱신하는 데 사용. |
|
|
56
|
+
| `submit` | `void` | 데이터 폼 제출 시 발생 (저장 버튼 클릭 또는 `Ctrl+S`). |
|
|
57
|
+
| `create` | `void` | "등록" 버튼 클릭 시 발생. 소비 컴포넌트에서 items 배열 앞에 빈 항목을 추가하는 데 사용. |
|
|
58
|
+
| `delete` | `TItem[]` | 삭제 버튼 클릭 시 발생. 행별 삭제 아이콘 클릭 시 `[해당항목]`, 선택 삭제 버튼 클릭 시 `선택된 항목들` 배열. |
|
|
59
|
+
| `restore` | `TItem[]` | 복구 버튼 클릭 시 발생. 행별 복구 아이콘 클릭 시 `[해당항목]`, 선택 복구 버튼 클릭 시 `선택된 항목들` 배열. |
|
|
60
|
+
|
|
61
|
+
## Content Children (ng-template)
|
|
62
|
+
|
|
63
|
+
### `#filterTpl` — 필터 폼 영역
|
|
64
|
+
|
|
65
|
+
`<sd-form>` 내부에 렌더링된다. "조회" 버튼은 `SdCrudList`가 자동으로 추가하므로 직접 넣지 않는다.
|
|
66
|
+
`form-box-inline` 클래스의 `<div>` 안에 배치되며, 각 필터 항목은 `form-box-item` 클래스의 `<div>`로 감싼다.
|
|
67
|
+
|
|
68
|
+
```html
|
|
69
|
+
<ng-template #filterTpl>
|
|
70
|
+
<div class="form-box-item">
|
|
71
|
+
<label>검색어</label>
|
|
72
|
+
<sd-textfield
|
|
73
|
+
[type]="'text'"
|
|
74
|
+
[placeholder]="'코드/명칭'"
|
|
75
|
+
[(value)]="filter().searchText"
|
|
76
|
+
(valueChange)="mark(filter)"
|
|
77
|
+
/>
|
|
78
|
+
</div>
|
|
79
|
+
<div class="form-box-item">
|
|
80
|
+
<label>기간</label>
|
|
81
|
+
<sd-date-range-picker
|
|
82
|
+
[(from)]="filter().fromDate"
|
|
83
|
+
(fromChange)="mark(filter)"
|
|
84
|
+
[(to)]="filter().toDate"
|
|
85
|
+
(toChange)="mark(filter)"
|
|
86
|
+
/>
|
|
87
|
+
</div>
|
|
88
|
+
<div class="form-box-item">
|
|
89
|
+
<sd-checkbox [(value)]="filter().isIncludeDeleted" (valueChange)="mark(filter)">
|
|
90
|
+
삭제항목 포함
|
|
91
|
+
</sd-checkbox>
|
|
92
|
+
</div>
|
|
93
|
+
</ng-template>
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
> **`mark(filter)` 패턴**: 필터 객체는 `signal<IFilter>`로 관리하며, 내부 프로퍼티 변경 시 `mark(filter)`를 호출하여 signal의 참조를 갱신한다. `mark`는 `@simplysm/angular`에서 import한다.
|
|
97
|
+
|
|
98
|
+
### `#commandTpl` — 추가 명령 버튼 영역
|
|
99
|
+
|
|
100
|
+
viewType에 따라 렌더링 위치가 달라진다:
|
|
101
|
+
|
|
102
|
+
| viewType | 렌더링 위치 |
|
|
103
|
+
|----------|------------|
|
|
104
|
+
| `page` | `<sd-topbar>` 내부 (저장 버튼 우측) |
|
|
105
|
+
| 그 외 | 상단 명령 영역 (저장 버튼 우측) |
|
|
106
|
+
|
|
107
|
+
```html
|
|
108
|
+
<ng-template #commandTpl>
|
|
109
|
+
<sd-button [theme]="'link-success'" (click)="onExportExcel()">
|
|
110
|
+
<ng-icon [svg]="tablerFileExcel" />
|
|
111
|
+
엑셀 다운로드
|
|
112
|
+
</sd-button>
|
|
113
|
+
</ng-template>
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### `#toolTpl` — 도구 버튼 영역
|
|
117
|
+
|
|
118
|
+
"등록/삭제/복구" 버튼 옆에 렌더링된다. `readonly=false`일 때만 도구 영역 전체가 표시되지만, `toolTpl`이 있으면 `readonly=true`여도 도구 영역이 표시된다.
|
|
119
|
+
|
|
120
|
+
```html
|
|
121
|
+
<ng-template #toolTpl>
|
|
122
|
+
@if (canEdit()) {
|
|
123
|
+
<sd-button [size]="'sm'" [theme]="'link-success'" (click)="onUploadExcelButtonClick()">
|
|
124
|
+
<ng-icon [svg]="tablerUpload" />
|
|
125
|
+
엑셀 업로드
|
|
126
|
+
</sd-button>
|
|
127
|
+
}
|
|
128
|
+
<sd-button [size]="'sm'" [theme]="'link-success'" (click)="onDownloadExcelButtonClick()">
|
|
129
|
+
<ng-icon [svg]="tablerFileExcel" />
|
|
130
|
+
엑셀 다운로드
|
|
131
|
+
</sd-button>
|
|
132
|
+
</ng-template>
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
```html
|
|
136
|
+
<!-- readonly=true인 목록에서 toolTpl만 사용하는 경우 -->
|
|
137
|
+
@if (canEdit()) {
|
|
138
|
+
<ng-template #toolTpl>
|
|
139
|
+
<sd-button [size]="'sm'" [theme]="'link-primary'" (click)="onAddItemButtonClick()">
|
|
140
|
+
<ng-icon [svg]="tablerCirclePlus" />
|
|
141
|
+
신규등록
|
|
142
|
+
</sd-button>
|
|
143
|
+
</ng-template>
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### `#bottomCommandTpl` — 하단 명령 영역
|
|
148
|
+
|
|
149
|
+
모달 선택 모드의 "선택 해제"/"확인" 버튼 옆(좌측)에 렌더링된다. `bottomCommandTpl`이 있으면 `selectMode` 없이도 하단 영역이 표시된다.
|
|
150
|
+
|
|
151
|
+
## Content Children (컴포넌트): `SdSheetColumn`
|
|
152
|
+
|
|
153
|
+
`SdSheetColumn` 디렉티브를 `<sd-crud-list>` 직접 자식으로 배치하면 내부 `<sd-sheet>`의 `columnControlsInput`에 자동 전달된다.
|
|
154
|
+
|
|
155
|
+
### `SdSheetColumn` Inputs
|
|
156
|
+
|
|
157
|
+
| Input | Type | Default | Description |
|
|
158
|
+
|-------|------|---------|-------------|
|
|
159
|
+
| `key` | `string` | **required** | 컬럼 식별자. 사용자 설정 저장, 정렬 키로 사용. |
|
|
160
|
+
| `header` | `string \| string[]` | `""` | 헤더 텍스트. `string[]`이면 다단 헤더(병합) — 예: `['납품', '담당자명']`은 "납품" 그룹 아래 "담당자명" 서브 헤더. |
|
|
161
|
+
| `headerStyle` | `string` | — | 헤더 셀 인라인 CSS. |
|
|
162
|
+
| `tooltip` | `string` | — | 헤더 셀 툴팁. |
|
|
163
|
+
| `width` | `string` | — | CSS 너비 문자열 (예: `"120px"`). |
|
|
164
|
+
| `fixed` | `boolean` | `false` | 좌측 고정 컬럼 여부 (가로 스크롤 시 고정). |
|
|
165
|
+
| `hidden` | `boolean` | `false` | 기본 숨김 여부 (사용자가 토글 가능). |
|
|
166
|
+
| `collapse` | `boolean` | `false` | 축소 상태 여부. |
|
|
167
|
+
| `disableSorting` | `boolean` | `false` | 정렬 비활성화. |
|
|
168
|
+
| `disableResizing` | `boolean` | `false` | 너비 조절 비활성화. |
|
|
169
|
+
| `ordering` | `number` | `0` | 컬럼 표시 순서. |
|
|
170
|
+
|
|
171
|
+
### `SdSheetColumn` Content Children (ng-template)
|
|
172
|
+
|
|
173
|
+
#### 셀 템플릿: `<ng-template [cell]="items()" let-item="item">`
|
|
174
|
+
|
|
175
|
+
**필수**. `SdSheetColumnCellTemplate` 디렉티브(`ng-template[cell]`)를 사용한다. `[cell]` input에 items 배열을 바인딩하면 TypeScript 타입 추론이 활성화된다.
|
|
176
|
+
|
|
177
|
+
**템플릿 컨텍스트 변수:**
|
|
178
|
+
|
|
179
|
+
| 변수 | Type | Description |
|
|
180
|
+
|------|------|-------------|
|
|
181
|
+
| `$implicit` | `TItem` | 현재 행 항목 (기본 let- 변수) |
|
|
182
|
+
| `item` | `TItem` | 현재 행 항목 (명시적 이름) |
|
|
183
|
+
| `index` | `number` | 행 인덱스 |
|
|
184
|
+
| `depth` | `number` | 트리 데이터의 중첩 깊이 |
|
|
185
|
+
| `edit` | `boolean` | 현재 행이 편집 모드인지 여부. 행 클릭(또는 더블클릭) 시 `true`가 된다. `SdTextfield`의 `[readonly]`에 `!edit`을 바인딩하여 인라인 편집을 구현한다. |
|
|
186
|
+
|
|
187
|
+
```html
|
|
188
|
+
<!-- 읽기 전용 셀 -->
|
|
189
|
+
<sd-sheet-column [key]="'id'" [header]="'#'" [fixed]="true">
|
|
190
|
+
<ng-template [cell]="items()" let-item="item">
|
|
191
|
+
<div class="p-xs-sm tx-right">
|
|
192
|
+
{{ item.id }}
|
|
193
|
+
</div>
|
|
194
|
+
</ng-template>
|
|
195
|
+
</sd-sheet-column>
|
|
196
|
+
|
|
197
|
+
<!-- 편집 가능한 텍스트 셀 -->
|
|
198
|
+
<sd-sheet-column [key]="'code'" [header]="'코드'">
|
|
199
|
+
<ng-template [cell]="items()" let-item="item" let-edit="edit">
|
|
200
|
+
<sd-textfield
|
|
201
|
+
[type]="'text'"
|
|
202
|
+
[inset]="true"
|
|
203
|
+
[size]="'sm'"
|
|
204
|
+
[required]="true"
|
|
205
|
+
[disabled]="!canEdit()"
|
|
206
|
+
[readonly]="!edit"
|
|
207
|
+
[(value)]="item.code"
|
|
208
|
+
(valueChange)="mark(items)"
|
|
209
|
+
/>
|
|
210
|
+
</ng-template>
|
|
211
|
+
</sd-sheet-column>
|
|
212
|
+
|
|
213
|
+
<!-- 드롭다운 셀 (edit 무관하게 항상 편집 가능) -->
|
|
214
|
+
<sd-sheet-column [key]="'endCustomerName'" [header]="'최종고객사'">
|
|
215
|
+
<ng-template [cell]="items()" let-item="item">
|
|
216
|
+
<sd-shared-data-select
|
|
217
|
+
[inset]="true"
|
|
218
|
+
[size]="'sm'"
|
|
219
|
+
[required]="true"
|
|
220
|
+
[disabled]="!canEdit()"
|
|
221
|
+
[items]="sharedEndCustomers.items()"
|
|
222
|
+
[(value)]="item.endCustomerId"
|
|
223
|
+
(valueChange)="mark(items)"
|
|
224
|
+
>
|
|
225
|
+
<ng-template [itemOf]="sharedEndCustomers.items()" let-ec>
|
|
226
|
+
{{ ec.name }}
|
|
227
|
+
</ng-template>
|
|
228
|
+
</sd-shared-data-select>
|
|
229
|
+
</ng-template>
|
|
230
|
+
</sd-sheet-column>
|
|
231
|
+
|
|
232
|
+
<!-- 다단 헤더 셀 -->
|
|
233
|
+
<sd-sheet-column [header]="['납품', '담당자명']" [key]="'contactName'">
|
|
234
|
+
<ng-template [cell]="items()" let-item="item" let-edit="edit">
|
|
235
|
+
<sd-textfield
|
|
236
|
+
[inset]="true"
|
|
237
|
+
[size]="'sm'"
|
|
238
|
+
[type]="'text'"
|
|
239
|
+
[disabled]="!canEdit()"
|
|
240
|
+
[readonly]="!edit"
|
|
241
|
+
[(value)]="item.contactName"
|
|
242
|
+
(valueChange)="mark(items)"
|
|
243
|
+
/>
|
|
244
|
+
</ng-template>
|
|
245
|
+
</sd-sheet-column>
|
|
246
|
+
|
|
247
|
+
<!-- 날짜 포맷 셀 -->
|
|
248
|
+
<sd-sheet-column [key]="'lastModifiedAt'" [header]="'수정일시'" [hidden]="true">
|
|
249
|
+
<ng-template [cell]="items()" let-item="item">
|
|
250
|
+
<div class="p-xs-sm tx-center">
|
|
251
|
+
{{ item.lastModifiedAt | format: "yyyy-MM-dd HH:mm" }}
|
|
252
|
+
</div>
|
|
253
|
+
</ng-template>
|
|
254
|
+
</sd-sheet-column>
|
|
255
|
+
|
|
256
|
+
<!-- 숫자 포맷 셀 -->
|
|
257
|
+
<sd-sheet-column [header]="['박스수', '지시']" [key]="'instructionBoxCount'">
|
|
258
|
+
<ng-template [cell]="items()" let-item="item">
|
|
259
|
+
<div class="p-xs-sm tx-right">
|
|
260
|
+
{{ item.instructionBoxCount | number }}
|
|
261
|
+
</div>
|
|
262
|
+
</ng-template>
|
|
263
|
+
</sd-sheet-column>
|
|
264
|
+
|
|
265
|
+
<!-- 버튼 셀 (정렬 비활성) -->
|
|
266
|
+
<sd-sheet-column [header]="'내역'" [key]="'historyButton'" [disableSorting]="true">
|
|
267
|
+
<ng-template [cell]="items()" let-item="item">
|
|
268
|
+
<sd-button [inset]="true" [size]="'sm'" (click)="onItemHistoryButtonClick(item, $event)">
|
|
269
|
+
<ng-icon [svg]="tablerHistory" />
|
|
270
|
+
내역
|
|
271
|
+
</sd-button>
|
|
272
|
+
</ng-template>
|
|
273
|
+
</sd-sheet-column>
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
#### 헤더 템플릿: `<ng-template #headerTpl>`
|
|
277
|
+
|
|
278
|
+
기본 텍스트 헤더 대신 커스텀 헤더를 렌더링한다 (잘 사용하지 않음).
|
|
279
|
+
|
|
280
|
+
#### 요약 템플릿: `<ng-template #summaryTpl>`
|
|
281
|
+
|
|
282
|
+
시트 하단 요약 행에 렌더링된다.
|
|
283
|
+
|
|
284
|
+
## Host Directives
|
|
285
|
+
|
|
286
|
+
- `SdCommandDirective` — `Ctrl+S` 키보드 단축키를 `sdSaveCommand` 이벤트로 변환. `formCtrl.requestSubmit()` → `submit` 이벤트.
|
|
287
|
+
|
|
288
|
+
## 내부 레이아웃 구조
|
|
289
|
+
|
|
290
|
+
```
|
|
291
|
+
<sd-base-container>
|
|
292
|
+
┌─ #topbarTpl (page) 또는 #commandTpl (기타) ──────┐
|
|
293
|
+
│ [저장 버튼] [#commandTpl 내용] │
|
|
294
|
+
│ (readonly=true이면 저장 버튼 숨김) │
|
|
295
|
+
└──────────────────────────────────────────────────┘
|
|
296
|
+
|
|
297
|
+
<div class="flex-column fill">
|
|
298
|
+
┌─ 필터 영역 (filterTpl이 있을 때만) ────────────┐
|
|
299
|
+
│ <sd-form (formSubmit)="filterSubmit.emit()"> │
|
|
300
|
+
│ <div class="form-box-inline"> │
|
|
301
|
+
│ <div> │
|
|
302
|
+
│ [조회 버튼: info 테마, search 아이콘] │
|
|
303
|
+
│ </div> │
|
|
304
|
+
│ [#filterTpl 내용] │
|
|
305
|
+
│ </div> │
|
|
306
|
+
│ </sd-form> │
|
|
307
|
+
└────────────────────────────────────────────────┘
|
|
308
|
+
|
|
309
|
+
┌─ 도구 영역 (readonly=false 또는 toolTpl) ──────┐
|
|
310
|
+
│ [등록 버튼] [선택 삭제 버튼] [선택 복구 버튼] │
|
|
311
|
+
│ [#toolTpl 내용] │
|
|
312
|
+
│ (readonly=true이면 등록/삭제/복구 숨김) │
|
|
313
|
+
└────────────────────────────────────────────────┘
|
|
314
|
+
|
|
315
|
+
┌─ 시트 영역 ────────────────────────────────────┐
|
|
316
|
+
│ <sd-form> (또는 readonly=true이면 <div>) │
|
|
317
|
+
│ <sd-sheet │
|
|
318
|
+
│ [key]="key + '-sheet'" │
|
|
319
|
+
│ [items]="items()" │
|
|
320
|
+
│ [(currentPage)]="currentPage" │
|
|
321
|
+
│ [totalPageCount]="totalPageCount()" │
|
|
322
|
+
│ [(sorts)]="sorts" │
|
|
323
|
+
│ [useAutoSort]="totalPageCount() === 0" │
|
|
324
|
+
│ [selectMode]="selectMode ?? (readonly ? undefined : 'multi')" │
|
|
325
|
+
│ [(selectedKeys)]="selectedKeys" │
|
|
326
|
+
│ [trackByFn]="trackByFn()" │
|
|
327
|
+
│ [columnControlsInput]="columnControls()" │
|
|
328
|
+
│ > │
|
|
329
|
+
│ [자동 삭제/복구 버튼 컬럼] (readonly=false)│
|
|
330
|
+
│ </sd-sheet> │
|
|
331
|
+
│ </sd-form> │
|
|
332
|
+
└────────────────────────────────────────────────┘
|
|
333
|
+
</div>
|
|
334
|
+
|
|
335
|
+
┌─ #bottomCommandTpl (modal+selectMode 또는 있을 때) ┐
|
|
336
|
+
│ [#bottomCommandTpl 내용 (좌측)] │
|
|
337
|
+
│ [선택 해제 버튼] [확인 버튼(multi만)] │
|
|
338
|
+
└────────────────────────────────────────────────────┘
|
|
339
|
+
</sd-base-container>
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
## 자동 생성되는 삭제/복구 컬럼
|
|
343
|
+
|
|
344
|
+
`readonly=false`일 때 시트 맨 앞(좌측 고정)에 삭제/복구 아이콘 컬럼이 자동 추가된다:
|
|
345
|
+
- `currDeletedItems`에 포함되지 않은 항목: 삭제(eraser) 아이콘 → 클릭 시 `delete.emit([item])`
|
|
346
|
+
- `currDeletedItems`에 포함된 항목: 복구(restore) 아이콘 → 클릭 시 `restore.emit([item])`
|
|
347
|
+
|
|
348
|
+
## selectMode (시트 선택 모드) 상세
|
|
349
|
+
|
|
350
|
+
| `selectMode` 값 | 시트 `selectMode` | 동작 |
|
|
351
|
+
|-----------------|-------------------|------|
|
|
352
|
+
| `undefined` (미지정) | `readonly ? undefined : 'multi'` | 일반 CRUD: 쓰기 모드이면 multi 선택(체크박스), 읽기 모드이면 선택 없음 |
|
|
353
|
+
| `"single"` | `"single"` | 모달 선택: 항목 클릭 시 즉시 선택 → `SdActivatedModalProvider.close` 호출 |
|
|
354
|
+
| `"multi"` | `"multi"` | 모달 선택: 체크박스 선택 → 하단 "확인" 버튼 클릭 시 `close` 호출 |
|
|
355
|
+
|
|
356
|
+
### 모달 선택 모드에서 자동 close
|
|
357
|
+
|
|
358
|
+
- `selectMode="single"`: `selectedKeysChange` 이벤트에서 `selectedKeys.length === 1`이면 자동으로 `SdActivatedModalProvider.close.emit({ selectedKeys })`
|
|
359
|
+
- `selectMode="multi"`: "확인" 버튼 클릭 시 `close.emit({ selectedKeys })`
|
|
360
|
+
- "선택 해제" 버튼: `selectedKeys`를 `[]`로 초기화. `single` 모드에서는 추가로 `close.emit({ selectedKeys: [] })`
|
|
361
|
+
|
|
362
|
+
## `totalPageCount`와 정렬 동작
|
|
363
|
+
|
|
364
|
+
| `totalPageCount` | `useAutoSort` | 정렬 동작 |
|
|
365
|
+
|-------------------|--------------|----------|
|
|
366
|
+
| `0` (기본) | `true` | 클라이언트 측 정렬 (SdSheet 내부) |
|
|
367
|
+
| `> 0` | `false` | 서버 측 정렬 (소비 컴포넌트에서 `sorts` 변경 감지 → 재조회) |
|
|
368
|
+
|
|
369
|
+
## Usage: 전체 CRUD 목록 (페이지 viewType)
|
|
370
|
+
|
|
371
|
+
```typescript
|
|
372
|
+
@Component({
|
|
373
|
+
imports: [SdCrudList, SdSheetColumn, SdSheetColumnCellTemplate, SdTextfield, SdCheckbox, FormatPipe],
|
|
374
|
+
template: `
|
|
375
|
+
<sd-crud-list
|
|
376
|
+
[(ready)]="ready"
|
|
377
|
+
[initialized]="initialized()"
|
|
378
|
+
[(busyCount)]="busyCount"
|
|
379
|
+
[restricted]="!perms().includes('use')"
|
|
380
|
+
[readonly]="!canEdit()"
|
|
381
|
+
[viewType]="viewType()"
|
|
382
|
+
[selectMode]="selectMode()"
|
|
383
|
+
[key]="'customer'"
|
|
384
|
+
[items]="items()"
|
|
385
|
+
[currDeletedItems]="currDeletedItems()"
|
|
386
|
+
[(selectedKeys)]="selectedKeys"
|
|
387
|
+
[(currentPage)]="page"
|
|
388
|
+
[totalPageCount]="pageLength()"
|
|
389
|
+
[(sorts)]="sortingDefs"
|
|
390
|
+
[trackByFn]="trackByFn"
|
|
391
|
+
(filterSubmit)="onFilterSubmit()"
|
|
392
|
+
(submit)="onSubmit()"
|
|
393
|
+
(create)="onCreate()"
|
|
394
|
+
(delete)="onDelete($event)"
|
|
395
|
+
(restore)="onRestore($event)"
|
|
396
|
+
>
|
|
397
|
+
<ng-template #filterTpl>
|
|
398
|
+
<div class="form-box-item">
|
|
399
|
+
<label>검색어</label>
|
|
400
|
+
<sd-textfield
|
|
401
|
+
[type]="'text'"
|
|
402
|
+
[placeholder]="'코드/명칭'"
|
|
403
|
+
[(value)]="filter().searchText"
|
|
404
|
+
(valueChange)="mark(filter)"
|
|
405
|
+
/>
|
|
406
|
+
</div>
|
|
407
|
+
<div class="form-box-item">
|
|
408
|
+
<sd-checkbox [(value)]="filter().isIncludeDeleted" (valueChange)="mark(filter)">
|
|
409
|
+
삭제항목 포함
|
|
410
|
+
</sd-checkbox>
|
|
411
|
+
</div>
|
|
412
|
+
</ng-template>
|
|
413
|
+
|
|
414
|
+
<sd-sheet-column [fixed]="true" [key]="'id'" [header]="'#'">
|
|
415
|
+
<ng-template [cell]="items()" let-item="item">
|
|
416
|
+
<div class="p-xs-sm tx-right">
|
|
417
|
+
{{ item.id }}
|
|
418
|
+
</div>
|
|
419
|
+
</ng-template>
|
|
420
|
+
</sd-sheet-column>
|
|
421
|
+
|
|
422
|
+
<sd-sheet-column [header]="'코드'" [key]="'code'">
|
|
423
|
+
<ng-template [cell]="items()" let-item="item" let-edit="edit">
|
|
424
|
+
<sd-textfield
|
|
425
|
+
[type]="'text'"
|
|
426
|
+
[inset]="true"
|
|
427
|
+
[size]="'sm'"
|
|
428
|
+
[required]="true"
|
|
429
|
+
[disabled]="!canEdit()"
|
|
430
|
+
[readonly]="!edit"
|
|
431
|
+
[(value)]="item.code"
|
|
432
|
+
(valueChange)="mark(items)"
|
|
433
|
+
/>
|
|
434
|
+
</ng-template>
|
|
435
|
+
</sd-sheet-column>
|
|
436
|
+
|
|
437
|
+
<sd-sheet-column [header]="'명칭'" [key]="'name'">
|
|
438
|
+
<ng-template [cell]="items()" let-item="item" let-edit="edit">
|
|
439
|
+
<sd-textfield
|
|
440
|
+
[type]="'text'"
|
|
441
|
+
[inset]="true"
|
|
442
|
+
[size]="'sm'"
|
|
443
|
+
[required]="true"
|
|
444
|
+
[disabled]="!canEdit()"
|
|
445
|
+
[readonly]="!edit"
|
|
446
|
+
[(value)]="item.name"
|
|
447
|
+
(valueChange)="mark(items)"
|
|
448
|
+
/>
|
|
449
|
+
</ng-template>
|
|
450
|
+
</sd-sheet-column>
|
|
451
|
+
|
|
452
|
+
<sd-sheet-column [key]="'lastModifiedAt'" [header]="'수정일시'" [hidden]="true">
|
|
453
|
+
<ng-template [cell]="items()" let-item="item">
|
|
454
|
+
<div class="p-xs-sm tx-center">
|
|
455
|
+
{{ item.lastModifiedAt | format: "yyyy-MM-dd HH:mm" }}
|
|
456
|
+
</div>
|
|
457
|
+
</ng-template>
|
|
458
|
+
</sd-sheet-column>
|
|
459
|
+
</sd-crud-list>
|
|
460
|
+
`,
|
|
461
|
+
})
|
|
462
|
+
export class CustomerList implements SdSelectModal<number> {
|
|
463
|
+
//== DI ==
|
|
464
|
+
private readonly _appOrm = inject(AppOrmProvider);
|
|
465
|
+
private readonly _sdToast = inject(SdToastProvider);
|
|
466
|
+
|
|
467
|
+
//== 권한 ==
|
|
468
|
+
perms = injectPermsSignal(["base.customer"], ["use", "edit"]);
|
|
469
|
+
canEdit = computed(() => this.perms().includes("edit") && this.viewType() === "page");
|
|
470
|
+
|
|
471
|
+
viewType = injectViewTypeSignal();
|
|
472
|
+
|
|
473
|
+
//== SdSelectModal<number> 계약 (모달로 열릴 때) ==
|
|
474
|
+
selectMode = input<"single" | "multi" | undefined>();
|
|
475
|
+
selectedKeys = model<number[]>([]);
|
|
476
|
+
close = output<SelectModalOutputResult<number> | undefined>();
|
|
477
|
+
|
|
478
|
+
//== 상태 ==
|
|
479
|
+
ready = signal(false);
|
|
480
|
+
initialized = signal(false);
|
|
481
|
+
busyCount = signal(0);
|
|
482
|
+
|
|
483
|
+
private _itemsSnapshot: IItem[] = [];
|
|
484
|
+
items = signal<IItem[]>([]);
|
|
485
|
+
currDeletedItems = computed(() => this.items().filter((it) => it.isDeleted));
|
|
486
|
+
diffs = computed(() => this.items().oneWayDiffs(this._itemsSnapshot, "id"));
|
|
487
|
+
|
|
488
|
+
page = signal(0);
|
|
489
|
+
pageLength = signal(0);
|
|
490
|
+
sortingDefs = signal<SortingDef[]>([]);
|
|
491
|
+
|
|
492
|
+
filter = signal<IFilter>({ isIncludeDeleted: false });
|
|
493
|
+
lastFilter = signal<IFilter>({ isIncludeDeleted: false });
|
|
494
|
+
|
|
495
|
+
trackByFn = (item: IItem) => item.id;
|
|
496
|
+
|
|
497
|
+
constructor() {
|
|
498
|
+
effect(() => {
|
|
499
|
+
if (!this.perms().includes("use") || !this.ready()) {
|
|
500
|
+
this.initialized.set(true);
|
|
501
|
+
return;
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
this.lastFilter(); // 변경 감지 의존성
|
|
505
|
+
this.page();
|
|
506
|
+
this.sortingDefs();
|
|
507
|
+
|
|
508
|
+
void untracked(async () => {
|
|
509
|
+
this.busyCount.update((v) => v + 1);
|
|
510
|
+
await this._sdToast.try(async () => {
|
|
511
|
+
await this._refresh();
|
|
512
|
+
});
|
|
513
|
+
this.busyCount.update((v) => v - 1);
|
|
514
|
+
this.initialized.set(true);
|
|
515
|
+
});
|
|
516
|
+
});
|
|
517
|
+
|
|
518
|
+
setupCanDeactivate(() => this.viewType() === "modal" || this._checkIgnoreChanges());
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
onFilterSubmit() {
|
|
522
|
+
this.page.set(0);
|
|
523
|
+
this.lastFilter.set({ ...this.filter() });
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
async onSubmit(): Promise<void> {
|
|
527
|
+
if (this.busyCount() > 0) return;
|
|
528
|
+
const diffs = this.diffs();
|
|
529
|
+
if (diffs.length === 0) {
|
|
530
|
+
this._sdToast.info("변경사항이 없습니다.");
|
|
531
|
+
return;
|
|
532
|
+
}
|
|
533
|
+
// ... 저장 로직
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
onCreate(): void {
|
|
537
|
+
this.items.update((list) => [{ isDeleted: false }, ...list]);
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
async onDelete(items: IItem[]): Promise<void> {
|
|
541
|
+
// id 없는 신규 항목: 목록에서 제거
|
|
542
|
+
if (items.every((it) => it.id == null)) {
|
|
543
|
+
this.items.update((list) => list.filter((it) => !items.includes(it)));
|
|
544
|
+
return;
|
|
545
|
+
}
|
|
546
|
+
// id 있는 항목: DB에서 삭제 처리
|
|
547
|
+
// ...
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
async onRestore(items: IItem[]): Promise<void> {
|
|
551
|
+
// DB에서 복구 처리
|
|
552
|
+
// ...
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
```
|
|
556
|
+
|
|
557
|
+
## Usage: 읽기 전용 목록 (control viewType, readonly)
|
|
558
|
+
|
|
559
|
+
```html
|
|
560
|
+
<sd-crud-list
|
|
561
|
+
[(ready)]="ready"
|
|
562
|
+
[initialized]="initialized()"
|
|
563
|
+
[(busyCount)]="busyCount"
|
|
564
|
+
[restricted]="!perms().includes('use')"
|
|
565
|
+
[readonly]="true"
|
|
566
|
+
[viewType]="viewType()"
|
|
567
|
+
[selectMode]="selectMode() ?? 'multi'"
|
|
568
|
+
[key]="'outbound-instruction'"
|
|
569
|
+
[items]="items()"
|
|
570
|
+
[totalPageCount]="pageLength()"
|
|
571
|
+
[trackByFn]="trackByFn"
|
|
572
|
+
[(currentPage)]="page"
|
|
573
|
+
[(sorts)]="sortingDefs"
|
|
574
|
+
[(selectedKeys)]="selectedKeys"
|
|
575
|
+
(filterSubmit)="onFilterSubmit()"
|
|
576
|
+
>
|
|
577
|
+
<!-- readonly=true이므로 submit/create/delete/restore 이벤트 불필요 -->
|
|
578
|
+
|
|
579
|
+
<!-- toolTpl로 커스텀 등록 버튼만 제공 -->
|
|
580
|
+
@if (canEdit()) {
|
|
581
|
+
<ng-template #toolTpl>
|
|
582
|
+
<sd-button [size]="'sm'" [theme]="'link-primary'" (click)="onAddItemButtonClick()">
|
|
583
|
+
<ng-icon [svg]="tablerCirclePlus" />
|
|
584
|
+
신규등록
|
|
585
|
+
</sd-button>
|
|
586
|
+
</ng-template>
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
<sd-sheet-column [fixed]="true" [header]="'#'" [key]="'id'">
|
|
590
|
+
<!-- ... -->
|
|
591
|
+
</sd-sheet-column>
|
|
592
|
+
</sd-crud-list>
|
|
593
|
+
```
|
|
594
|
+
|
|
595
|
+
## Anti-patterns
|
|
596
|
+
|
|
597
|
+
```html
|
|
598
|
+
<!-- ❌ filterTpl 안에 조회 버튼을 직접 넣지 않는다 (자동 추가됨) -->
|
|
599
|
+
<ng-template #filterTpl>
|
|
600
|
+
<sd-button [type]="'submit'">조회</sd-button> <!-- ❌ -->
|
|
601
|
+
<sd-textfield [(value)]="filter().name" />
|
|
602
|
+
</ng-template>
|
|
603
|
+
|
|
604
|
+
<!-- ❌ sd-sheet를 직접 배치하지 않는다 (SdCrudList가 내부에서 생성) -->
|
|
605
|
+
<sd-crud-list>
|
|
606
|
+
<sd-sheet> <!-- ❌ -->
|
|
607
|
+
<sd-sheet-column />
|
|
608
|
+
</sd-sheet>
|
|
609
|
+
</sd-crud-list>
|
|
610
|
+
|
|
611
|
+
<!-- ✅ sd-sheet-column을 sd-crud-list 직접 자식으로 배치한다 -->
|
|
612
|
+
<sd-crud-list>
|
|
613
|
+
<sd-sheet-column [key]="'name'" [header]="'이름'"> <!-- ✅ -->
|
|
614
|
+
<ng-template [cell]="items()" let-item="item">
|
|
615
|
+
{{ item.name }}
|
|
616
|
+
</ng-template>
|
|
617
|
+
</sd-sheet-column>
|
|
618
|
+
</sd-crud-list>
|
|
619
|
+
|
|
620
|
+
<!-- ❌ cell 템플릿에서 items 시그널 호출을 빠뜨리지 않는다 -->
|
|
621
|
+
<ng-template [cell]="[]" let-item="item"> <!-- ❌ 타입 추론 불가 -->
|
|
622
|
+
<ng-template [cell]="items()" let-item="item"> <!-- ✅ -->
|
|
623
|
+
```
|