@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.
Files changed (328) hide show
  1. package/claude/references/sd-simplysm-v14/angular/README.md +164 -291
  2. package/claude/references/sd-simplysm-v14/angular/_api-index.md +250 -0
  3. package/claude/references/sd-simplysm-v14/angular/bootstrap/provide-sd-angular.md +2 -0
  4. package/claude/references/sd-simplysm-v14/angular/bootstrap/sd-angular-config-provider.md +2 -0
  5. package/claude/references/sd-simplysm-v14/angular/directives/sd-command-directive.md +2 -0
  6. package/claude/references/sd-simplysm-v14/angular/directives/sd-events.md +2 -0
  7. package/claude/references/sd-simplysm-v14/angular/directives/sd-intersection-directive.md +2 -0
  8. package/claude/references/sd-simplysm-v14/angular/directives/sd-invalid.md +2 -0
  9. package/claude/references/sd-simplysm-v14/angular/directives/sd-resize-directive.md +2 -0
  10. package/claude/references/sd-simplysm-v14/angular/directives/sd-ripple.md +2 -0
  11. package/claude/references/sd-simplysm-v14/angular/directives/sd-router-link.md +2 -0
  12. package/claude/references/sd-simplysm-v14/angular/directives/sd-show-effect.md +2 -0
  13. package/claude/references/sd-simplysm-v14/angular/directives/sd-typed-template.md +2 -0
  14. package/claude/references/sd-simplysm-v14/angular/features/sd-address-search-modal.md +2 -0
  15. package/claude/references/sd-simplysm-v14/angular/features/sd-permission-table.md +2 -0
  16. package/claude/references/sd-simplysm-v14/angular/features/sd-shared-data-components.md +2 -0
  17. package/claude/references/sd-simplysm-v14/angular/features/sd-tiptap-editor.md +2 -0
  18. package/claude/references/sd-simplysm-v14/angular/pipes/format-pipe.md +2 -0
  19. package/claude/references/sd-simplysm-v14/angular/plugins/sd-global-error-handler.md +2 -0
  20. package/claude/references/sd-simplysm-v14/angular/plugins/sd-option-event-plugin.md +2 -0
  21. package/claude/references/sd-simplysm-v14/angular/provider-types/sd-menu.md +2 -0
  22. package/claude/references/sd-simplysm-v14/angular/provider-types/sd-modal-content-def.md +9 -9
  23. package/claude/references/sd-simplysm-v14/angular/provider-types/sd-toast-content-def.md +2 -0
  24. package/claude/references/sd-simplysm-v14/angular/provider-types/shared-data-base.md +2 -0
  25. package/claude/references/sd-simplysm-v14/angular/providers/sd-activated-modal-provider.md +2 -0
  26. package/claude/references/sd-simplysm-v14/angular/providers/sd-app-structure-provider.md +2 -0
  27. package/claude/references/sd-simplysm-v14/angular/providers/sd-busy-provider.md +2 -0
  28. package/claude/references/sd-simplysm-v14/angular/providers/sd-file-dialog-provider.md +2 -0
  29. package/claude/references/sd-simplysm-v14/angular/providers/sd-local-storage-provider.md +2 -0
  30. package/claude/references/sd-simplysm-v14/angular/providers/sd-modal-provider.md +2 -0
  31. package/claude/references/sd-simplysm-v14/angular/providers/sd-navigate-window-provider.md +2 -0
  32. package/claude/references/sd-simplysm-v14/angular/providers/sd-print-provider.md +2 -0
  33. package/claude/references/sd-simplysm-v14/angular/providers/sd-service-client-factory-provider.md +2 -0
  34. package/claude/references/sd-simplysm-v14/angular/providers/sd-shared-data-provider.md +2 -0
  35. package/claude/references/sd-simplysm-v14/angular/providers/sd-system-config-provider.md +2 -0
  36. package/claude/references/sd-simplysm-v14/angular/providers/sd-system-log-provider.md +2 -0
  37. package/claude/references/sd-simplysm-v14/angular/providers/sd-theme-provider.md +2 -0
  38. package/claude/references/sd-simplysm-v14/angular/providers/sd-toast-provider.md +2 -0
  39. package/claude/references/sd-simplysm-v14/angular/styling/classes.md +2 -0
  40. package/claude/references/sd-simplysm-v14/angular/styling/mixins.md +2 -0
  41. package/claude/references/sd-simplysm-v14/angular/styling/themes.md +2 -0
  42. package/claude/references/sd-simplysm-v14/angular/styling/variables.md +2 -0
  43. package/claude/references/sd-simplysm-v14/angular/type-utilities/directive-input-signals.md +2 -0
  44. package/claude/references/sd-simplysm-v14/angular/ui-data/sd-base-container.md +141 -0
  45. package/claude/references/sd-simplysm-v14/angular/ui-data/sd-crud-detail.md +273 -0
  46. package/claude/references/sd-simplysm-v14/angular/ui-data/sd-crud-list.md +623 -0
  47. package/claude/references/sd-simplysm-v14/angular/ui-data/sd-list.md +2 -0
  48. package/claude/references/sd-simplysm-v14/angular/ui-data/sd-sheet.md +34 -39
  49. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-additional-button.md +2 -0
  50. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-anchor.md +2 -7
  51. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-button.md +2 -11
  52. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-checkbox-group.md +2 -0
  53. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-checkbox.md +2 -4
  54. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-date-range-picker.md +2 -0
  55. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-form.md +2 -7
  56. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-modal-select-button.md +7 -7
  57. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-numpad.md +2 -0
  58. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-range.md +2 -0
  59. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-select.md +2 -0
  60. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-shared-data-select.md +2 -4
  61. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-state-preset.md +2 -0
  62. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-switch.md +2 -0
  63. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-textarea.md +2 -0
  64. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-textfield.md +2 -8
  65. package/claude/references/sd-simplysm-v14/angular/ui-layout/sd-dock-container.md +2 -7
  66. package/claude/references/sd-simplysm-v14/angular/ui-layout/sd-dock.md +2 -6
  67. package/claude/references/sd-simplysm-v14/angular/ui-layout/sd-gap.md +2 -0
  68. package/claude/references/sd-simplysm-v14/angular/ui-layout/sd-kanban-board.md +2 -0
  69. package/claude/references/sd-simplysm-v14/angular/ui-layout/sd-kanban-lane.md +2 -0
  70. package/claude/references/sd-simplysm-v14/angular/ui-layout/sd-kanban.md +2 -0
  71. package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-collapse.md +2 -0
  72. package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-pagination.md +2 -0
  73. package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-sidebar-container.md +2 -0
  74. package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-sidebar-menu.md +2 -0
  75. package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-sidebar-user.md +2 -0
  76. package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-tab.md +2 -0
  77. package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-topbar-container.md +2 -9
  78. package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-topbar-menu.md +2 -0
  79. package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-topbar-user.md +2 -0
  80. package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-topbar.md +2 -7
  81. package/claude/references/sd-simplysm-v14/angular/ui-overlay/sd-busy-container.md +2 -5
  82. package/claude/references/sd-simplysm-v14/angular/ui-overlay/sd-confirm-modal.md +2 -0
  83. package/claude/references/sd-simplysm-v14/angular/ui-overlay/sd-dropdown.md +2 -0
  84. package/claude/references/sd-simplysm-v14/angular/ui-overlay/sd-modal.md +2 -0
  85. package/claude/references/sd-simplysm-v14/angular/ui-overlay/sd-prompt-modal.md +2 -0
  86. package/claude/references/sd-simplysm-v14/angular/ui-overlay/sd-toast.md +2 -0
  87. package/claude/references/sd-simplysm-v14/angular/ui-visual/sd-barcode.md +2 -0
  88. package/claude/references/sd-simplysm-v14/angular/ui-visual/sd-calendar.md +2 -0
  89. package/claude/references/sd-simplysm-v14/angular/ui-visual/sd-echarts.md +2 -0
  90. package/claude/references/sd-simplysm-v14/angular/ui-visual/sd-label.md +2 -0
  91. package/claude/references/sd-simplysm-v14/angular/ui-visual/sd-note.md +2 -0
  92. package/claude/references/sd-simplysm-v14/angular/ui-visual/sd-progress.md +2 -0
  93. package/claude/references/sd-simplysm-v14/angular/utils/inject-routing-signals.md +3 -16
  94. package/claude/references/sd-simplysm-v14/angular/utils/inject-sd-system-config-resource.md +2 -0
  95. package/claude/references/sd-simplysm-v14/angular/utils/mark.md +2 -5
  96. package/claude/references/sd-simplysm-v14/angular/utils/selection-managers.md +3 -1
  97. package/claude/references/sd-simplysm-v14/angular/utils/set-safe-style.md +2 -0
  98. package/claude/references/sd-simplysm-v14/angular/utils/setup-functions.md +2 -4
  99. package/claude/references/sd-simplysm-v14/capacitor-plugin-auto-update/README.md +16 -18
  100. package/claude/references/sd-simplysm-v14/capacitor-plugin-auto-update/_api-index.md +18 -0
  101. package/claude/references/sd-simplysm-v14/capacitor-plugin-auto-update/apk-installer/apk-installer.md +1 -1
  102. package/claude/references/sd-simplysm-v14/capacitor-plugin-auto-update/auto-update/auto-update.md +1 -1
  103. package/claude/references/sd-simplysm-v14/capacitor-plugin-file-system/README.md +24 -45
  104. package/claude/references/sd-simplysm-v14/core-browser/README.md +22 -29
  105. package/claude/references/sd-simplysm-v14/core-browser/_api-index.md +37 -0
  106. package/claude/references/sd-simplysm-v14/core-browser/extensions/copy-paste.md +1 -1
  107. package/claude/references/sd-simplysm-v14/core-browser/extensions/element-prototype-extensions.md +2 -0
  108. package/claude/references/sd-simplysm-v14/core-browser/extensions/get-bounds.md +1 -1
  109. package/claude/references/sd-simplysm-v14/core-browser/utils/download-blob.md +1 -1
  110. package/claude/references/sd-simplysm-v14/core-browser/utils/fetch-url-bytes.md +1 -1
  111. package/claude/references/sd-simplysm-v14/core-browser/utils/indexed-db-store.md +1 -1
  112. package/claude/references/sd-simplysm-v14/core-browser/utils/indexed-db-virtual-fs.md +1 -1
  113. package/claude/references/sd-simplysm-v14/core-browser/utils/open-file-dialog.md +1 -1
  114. package/claude/references/sd-simplysm-v14/core-common/README.md +71 -153
  115. package/claude/references/sd-simplysm-v14/core-common/_api-index.md +70 -0
  116. package/claude/references/sd-simplysm-v14/core-common/errors/argument-error.md +3 -1
  117. package/claude/references/sd-simplysm-v14/core-common/errors/not-implemented-error.md +3 -1
  118. package/claude/references/sd-simplysm-v14/core-common/errors/sd-error.md +3 -1
  119. package/claude/references/sd-simplysm-v14/core-common/errors/timeout-error.md +3 -1
  120. package/claude/references/sd-simplysm-v14/core-common/extensions/array.md +2 -0
  121. package/claude/references/sd-simplysm-v14/core-common/extensions/map.md +2 -0
  122. package/claude/references/sd-simplysm-v14/core-common/extensions/set.md +2 -0
  123. package/claude/references/sd-simplysm-v14/core-common/features/debounce-queue.md +3 -1
  124. package/claude/references/sd-simplysm-v14/core-common/features/event-emitter.md +3 -1
  125. package/claude/references/sd-simplysm-v14/core-common/features/serial-queue.md +3 -1
  126. package/claude/references/sd-simplysm-v14/core-common/type-utils/common-types.md +2 -0
  127. package/claude/references/sd-simplysm-v14/core-common/type-utils/env.md +3 -1
  128. package/claude/references/sd-simplysm-v14/core-common/types/date-only.md +3 -1
  129. package/claude/references/sd-simplysm-v14/core-common/types/date-time.md +9 -1
  130. package/claude/references/sd-simplysm-v14/core-common/types/lazy-gc-map.md +3 -1
  131. package/claude/references/sd-simplysm-v14/core-common/types/time.md +3 -1
  132. package/claude/references/sd-simplysm-v14/core-common/types/uuid.md +3 -1
  133. package/claude/references/sd-simplysm-v14/core-common/utils/bytes.md +3 -1
  134. package/claude/references/sd-simplysm-v14/core-common/utils/dt.md +3 -1
  135. package/claude/references/sd-simplysm-v14/core-common/utils/err.md +3 -1
  136. package/claude/references/sd-simplysm-v14/core-common/utils/json.md +3 -1
  137. package/claude/references/sd-simplysm-v14/core-common/utils/num.md +3 -1
  138. package/claude/references/sd-simplysm-v14/core-common/utils/obj.md +3 -1
  139. package/claude/references/sd-simplysm-v14/core-common/utils/path.md +3 -1
  140. package/claude/references/sd-simplysm-v14/core-common/utils/primitive.md +3 -1
  141. package/claude/references/sd-simplysm-v14/core-common/utils/str.md +3 -1
  142. package/claude/references/sd-simplysm-v14/core-common/utils/template-strings.md +2 -0
  143. package/claude/references/sd-simplysm-v14/core-common/utils/transfer.md +3 -1
  144. package/claude/references/sd-simplysm-v14/core-common/utils/wait.md +3 -1
  145. package/claude/references/sd-simplysm-v14/core-common/utils/xml.md +3 -1
  146. package/claude/references/sd-simplysm-v14/core-common/utils/zip-archive.md +3 -1
  147. package/claude/references/sd-simplysm-v14/core-node/README.md +25 -35
  148. package/claude/references/sd-simplysm-v14/core-node/_api-index.md +34 -0
  149. package/claude/references/sd-simplysm-v14/core-node/features/fs-watcher.md +3 -1
  150. package/claude/references/sd-simplysm-v14/core-node/logging/create-file-reporter.md +3 -1
  151. package/claude/references/sd-simplysm-v14/core-node/logging/pretty-reporter.md +3 -1
  152. package/claude/references/sd-simplysm-v14/core-node/logging/setup-consola.md +3 -1
  153. package/claude/references/sd-simplysm-v14/core-node/utils/cpx.md +3 -1
  154. package/claude/references/sd-simplysm-v14/core-node/utils/fsx.md +3 -1
  155. package/claude/references/sd-simplysm-v14/core-node/utils/pathx.md +3 -1
  156. package/claude/references/sd-simplysm-v14/core-node/worker/create-worker.md +3 -1
  157. package/claude/references/sd-simplysm-v14/core-node/worker/worker.md +3 -1
  158. package/claude/references/sd-simplysm-v14/excel/README.md +35 -49
  159. package/claude/references/sd-simplysm-v14/excel/_api-index.md +40 -0
  160. package/claude/references/sd-simplysm-v14/excel/core-classes/excel-cell.md +3 -1
  161. package/claude/references/sd-simplysm-v14/excel/core-classes/excel-col.md +3 -1
  162. package/claude/references/sd-simplysm-v14/excel/core-classes/excel-row.md +3 -1
  163. package/claude/references/sd-simplysm-v14/excel/core-classes/excel-workbook.md +6 -3
  164. package/claude/references/sd-simplysm-v14/excel/core-classes/excel-worksheet.md +3 -1
  165. package/claude/references/sd-simplysm-v14/excel/types/excel-address-point.md +3 -1
  166. package/claude/references/sd-simplysm-v14/excel/types/excel-style-options.md +3 -1
  167. package/claude/references/sd-simplysm-v14/excel/types/excel-value-type.md +3 -1
  168. package/claude/references/sd-simplysm-v14/excel/utilities/excel-utils.md +3 -1
  169. package/claude/references/sd-simplysm-v14/excel/wrapper/excel-wrapper.md +3 -1
  170. package/claude/references/sd-simplysm-v14/orm-common/README.md +66 -71
  171. package/claude/references/sd-simplysm-v14/orm-common/_api-index.md +59 -0
  172. package/claude/references/sd-simplysm-v14/orm-common/core/db-context.md +3 -1
  173. package/claude/references/sd-simplysm-v14/orm-common/core/db-transaction-error.md +3 -1
  174. package/claude/references/sd-simplysm-v14/orm-common/expression/expr-unit.md +3 -1
  175. package/claude/references/sd-simplysm-v14/orm-common/expression/expr.md +3 -1
  176. package/claude/references/sd-simplysm-v14/orm-common/models/migration.md +3 -1
  177. package/claude/references/sd-simplysm-v14/orm-common/query-builder/create-query-builder.md +3 -1
  178. package/claude/references/sd-simplysm-v14/orm-common/queryable-executable/executable.md +3 -1
  179. package/claude/references/sd-simplysm-v14/orm-common/queryable-executable/parse-search-query.md +3 -1
  180. package/claude/references/sd-simplysm-v14/orm-common/queryable-executable/queryable.md +3 -1
  181. package/claude/references/sd-simplysm-v14/orm-common/schema-builders/column-builder.md +3 -1
  182. package/claude/references/sd-simplysm-v14/orm-common/schema-builders/foreign-key-builder.md +3 -1
  183. package/claude/references/sd-simplysm-v14/orm-common/schema-builders/index-builder.md +3 -1
  184. package/claude/references/sd-simplysm-v14/orm-common/schema-builders/procedure.md +3 -1
  185. package/claude/references/sd-simplysm-v14/orm-common/schema-builders/table.md +3 -1
  186. package/claude/references/sd-simplysm-v14/orm-common/schema-builders/view.md +3 -1
  187. package/claude/references/sd-simplysm-v14/orm-common/types/data-type.md +3 -1
  188. package/claude/references/sd-simplysm-v14/orm-common/types/dialect.md +3 -1
  189. package/claude/references/sd-simplysm-v14/orm-common/types/expr.md +3 -1
  190. package/claude/references/sd-simplysm-v14/orm-common/types/parse-query-result.md +3 -1
  191. package/claude/references/sd-simplysm-v14/orm-common/types/query-def.md +3 -1
  192. package/claude/references/sd-simplysm-v14/orm-node/README.md +27 -28
  193. package/claude/references/sd-simplysm-v14/orm-node/_api-index.md +29 -0
  194. package/claude/references/sd-simplysm-v14/orm-node/connections/mssql-db-conn.md +2 -0
  195. package/claude/references/sd-simplysm-v14/orm-node/connections/mysql-db-conn.md +2 -0
  196. package/claude/references/sd-simplysm-v14/orm-node/connections/postgresql-db-conn.md +2 -0
  197. package/claude/references/sd-simplysm-v14/orm-node/core/create-db-conn.md +2 -0
  198. package/claude/references/sd-simplysm-v14/orm-node/core/create-orm.md +2 -0
  199. package/claude/references/sd-simplysm-v14/orm-node/core/node-db-context-executor.md +2 -0
  200. package/claude/references/sd-simplysm-v14/orm-node/types/db-conn-config.md +2 -0
  201. package/claude/references/sd-simplysm-v14/orm-node/types/db-conn-constants.md +2 -0
  202. package/claude/references/sd-simplysm-v14/orm-node/types/db-conn.md +2 -0
  203. package/claude/references/sd-simplysm-v14/orm-node/types/get-dialect-from-config.md +2 -0
  204. package/claude/references/sd-simplysm-v14/sd-claude/README.md +26 -65
  205. package/claude/references/sd-simplysm-v14/sd-claude/_api-index.md +39 -0
  206. package/claude/references/sd-simplysm-v14/sd-claude/assets.md +2 -0
  207. package/claude/references/sd-simplysm-v14/sd-claude/cli.md +3 -1
  208. package/claude/references/sd-simplysm-v14/sd-claude/hooks.md +11 -7
  209. package/claude/references/sd-simplysm-v14/sd-claude/scripts.md +2 -0
  210. package/claude/references/sd-simplysm-v14/sd-cli/README.md +48 -119
  211. package/claude/references/sd-simplysm-v14/sd-cli/_api-index.md +49 -0
  212. package/claude/references/sd-simplysm-v14/sd-cli/angular-vite-plugin/sd-angular-plugin.md +3 -1
  213. package/claude/references/sd-simplysm-v14/sd-cli/config/build-target.md +3 -1
  214. package/claude/references/sd-simplysm-v14/sd-cli/config/npm-config.md +3 -1
  215. package/claude/references/sd-simplysm-v14/sd-cli/config/sd-browser-support-config.md +3 -1
  216. package/claude/references/sd-simplysm-v14/sd-cli/config/sd-build-package-config.md +4 -2
  217. package/claude/references/sd-simplysm-v14/sd-cli/config/sd-capacitor-config.md +3 -1
  218. package/claude/references/sd-simplysm-v14/sd-cli/config/sd-client-package-config.md +4 -2
  219. package/claude/references/sd-simplysm-v14/sd-cli/config/sd-config.md +4 -2
  220. package/claude/references/sd-simplysm-v14/sd-cli/config/sd-electron-config.md +3 -1
  221. package/claude/references/sd-simplysm-v14/sd-cli/config/sd-package-config.md +3 -1
  222. package/claude/references/sd-simplysm-v14/sd-cli/config/sd-post-publish-script-config.md +3 -1
  223. package/claude/references/sd-simplysm-v14/sd-cli/config/sd-publish-config.md +3 -1
  224. package/claude/references/sd-simplysm-v14/sd-cli/config/sd-pwa-config.md +3 -1
  225. package/claude/references/sd-simplysm-v14/sd-cli/config/sd-scripts-package-config.md +4 -2
  226. package/claude/references/sd-simplysm-v14/sd-cli/config/sd-server-package-config.md +4 -2
  227. package/claude/references/sd-simplysm-v14/sd-cli/config/sd-watch-hook-config.md +3 -1
  228. package/claude/references/sd-simplysm-v14/sd-cli/ts-compiler/sd-ts-compiler.md +3 -1
  229. package/claude/references/sd-simplysm-v14/service-client/README.md +33 -42
  230. package/claude/references/sd-simplysm-v14/service-client/_api-index.md +58 -0
  231. package/claude/references/sd-simplysm-v14/service-client/features/event-client.md +1 -1
  232. package/claude/references/sd-simplysm-v14/service-client/features/file-client.md +1 -1
  233. package/claude/references/sd-simplysm-v14/service-client/features/orm-client-connector.md +1 -1
  234. package/claude/references/sd-simplysm-v14/service-client/features/orm-client-db-context-executor.md +1 -1
  235. package/claude/references/sd-simplysm-v14/service-client/main/service-client.md +1 -1
  236. package/claude/references/sd-simplysm-v14/service-client/protocol/client-protocol-wrapper.md +1 -1
  237. package/claude/references/sd-simplysm-v14/service-client/transport/service-transport.md +1 -1
  238. package/claude/references/sd-simplysm-v14/service-client/transport/socket-provider.md +1 -1
  239. package/claude/references/sd-simplysm-v14/service-client/types/blob-input.md +2 -2
  240. package/claude/references/sd-simplysm-v14/service-client/types/browser-worker.md +2 -2
  241. package/claude/references/sd-simplysm-v14/service-client/types/file-collection.md +2 -2
  242. package/claude/references/sd-simplysm-v14/service-client/types/service-connection-options.md +2 -2
  243. package/claude/references/sd-simplysm-v14/service-client/types/service-progress.md +2 -2
  244. package/claude/references/sd-simplysm-v14/service-common/README.md +34 -127
  245. package/claude/references/sd-simplysm-v14/service-common/_api-index.md +51 -0
  246. package/claude/references/sd-simplysm-v14/service-common/app-structure/app-structure-item.md +3 -1
  247. package/claude/references/sd-simplysm-v14/service-common/app-structure/get-flat-permissions.md +7 -1
  248. package/claude/references/sd-simplysm-v14/service-common/app-structure/is-usable-modules-chain.md +3 -1
  249. package/claude/references/sd-simplysm-v14/service-common/app-structure/is-usable-modules.md +3 -1
  250. package/claude/references/sd-simplysm-v14/service-common/events/define-event.md +7 -1
  251. package/claude/references/sd-simplysm-v14/service-common/protocol/create-service-protocol.md +8 -1
  252. package/claude/references/sd-simplysm-v14/service-common/protocol/protocol-config.md +3 -1
  253. package/claude/references/sd-simplysm-v14/service-common/protocol/service-add-event-listener-message.md +3 -1
  254. package/claude/references/sd-simplysm-v14/service-common/protocol/service-auth-message.md +3 -1
  255. package/claude/references/sd-simplysm-v14/service-common/protocol/service-emit-event-message.md +3 -1
  256. package/claude/references/sd-simplysm-v14/service-common/protocol/service-error-message.md +3 -1
  257. package/claude/references/sd-simplysm-v14/service-common/protocol/service-event-message.md +3 -1
  258. package/claude/references/sd-simplysm-v14/service-common/protocol/service-get-event-listener-infos-message.md +3 -1
  259. package/claude/references/sd-simplysm-v14/service-common/protocol/service-message.md +3 -1
  260. package/claude/references/sd-simplysm-v14/service-common/protocol/service-progress-message.md +3 -1
  261. package/claude/references/sd-simplysm-v14/service-common/protocol/service-remove-event-listener-message.md +3 -1
  262. package/claude/references/sd-simplysm-v14/service-common/protocol/service-request-message.md +3 -1
  263. package/claude/references/sd-simplysm-v14/service-common/protocol/service-response-message.md +3 -1
  264. package/claude/references/sd-simplysm-v14/service-common/service-types/app-structure-service.md +3 -1
  265. package/claude/references/sd-simplysm-v14/service-common/service-types/auto-update-service.md +3 -1
  266. package/claude/references/sd-simplysm-v14/service-common/service-types/orm-service.md +3 -1
  267. package/claude/references/sd-simplysm-v14/service-common/types/service-upload-result.md +3 -1
  268. package/claude/references/sd-simplysm-v14/service-server/README.md +50 -135
  269. package/claude/references/sd-simplysm-v14/service-server/_api-index.md +87 -0
  270. package/claude/references/sd-simplysm-v14/service-server/auth/auth-token-payload.md +3 -1
  271. package/claude/references/sd-simplysm-v14/service-server/auth/sign-jwt.md +3 -1
  272. package/claude/references/sd-simplysm-v14/service-server/auth/verify-jwt.md +3 -1
  273. package/claude/references/sd-simplysm-v14/service-server/core/auth.md +3 -1
  274. package/claude/references/sd-simplysm-v14/service-server/core/define-service.md +3 -1
  275. package/claude/references/sd-simplysm-v14/service-server/core/execute-service-method.md +3 -1
  276. package/claude/references/sd-simplysm-v14/service-server/core/service-context.md +3 -1
  277. package/claude/references/sd-simplysm-v14/service-server/legacy/handle-v1-connection.md +3 -1
  278. package/claude/references/sd-simplysm-v14/service-server/main/create-service-server.md +3 -1
  279. package/claude/references/sd-simplysm-v14/service-server/main/service-server.md +3 -1
  280. package/claude/references/sd-simplysm-v14/service-server/protocol/server-protocol-wrapper.md +3 -1
  281. package/claude/references/sd-simplysm-v14/service-server/services/app-structure-service.md +3 -1
  282. package/claude/references/sd-simplysm-v14/service-server/services/auto-update-service.md +3 -1
  283. package/claude/references/sd-simplysm-v14/service-server/services/orm-service.md +3 -1
  284. package/claude/references/sd-simplysm-v14/service-server/transport-http/handle-http-request.md +3 -1
  285. package/claude/references/sd-simplysm-v14/service-server/transport-http/handle-static-file.md +3 -1
  286. package/claude/references/sd-simplysm-v14/service-server/transport-http/handle-upload.md +3 -1
  287. package/claude/references/sd-simplysm-v14/service-server/transport-socket/service-socket.md +3 -1
  288. package/claude/references/sd-simplysm-v14/service-server/transport-socket/websocket-handler.md +3 -1
  289. package/claude/references/sd-simplysm-v14/service-server/types/service-server-options.md +3 -1
  290. package/claude/references/sd-simplysm-v14/service-server/utils/get-config.md +3 -1
  291. package/claude/references/sd-simplysm-v14/storage/README.md +17 -80
  292. package/claude/references/sd-simplysm-v14/storage/_api-index.md +26 -0
  293. package/claude/references/sd-simplysm-v14/storage/clients/ftp-storage-client.md +3 -1
  294. package/claude/references/sd-simplysm-v14/storage/clients/sftp-storage-client.md +3 -1
  295. package/claude/references/sd-simplysm-v14/storage/factory/storage-factory.md +1 -1
  296. package/claude/references/sd-simplysm-v14/storage/types/file-info.md +3 -1
  297. package/claude/references/sd-simplysm-v14/storage/types/storage-client.md +2 -0
  298. package/claude/references/sd-simplysm-v14/storage/types/storage-conn-config.md +3 -1
  299. package/claude/rules/sd-claude-rules.md +1 -1
  300. package/claude/skills/sd-dev/SKILL.md +62 -8
  301. package/claude/skills/sd-dev/subagent-preamble.md +22 -0
  302. package/package.json +1 -1
  303. package/claude/references/sd-simplysm-v14/angular/recipes/_common-rules.md +0 -336
  304. package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail/extension-a-edit-save.md +0 -191
  305. package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail/extension-b-delete-restore.md +0 -103
  306. package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail/extension-c-modal-view.md +0 -198
  307. package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail/extension-d-control-view.md +0 -109
  308. package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail/extension-e-auxiliary.md +0 -87
  309. package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail/extension-f-complex-detail.md +0 -202
  310. package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail.md +0 -280
  311. package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-a-inline-edit.md +0 -386
  312. package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-b-selection.md +0 -215
  313. package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-c-inline-delete.md +0 -64
  314. package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-d-select-modal.md +0 -193
  315. package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-e-readonly-modal.md +0 -140
  316. package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-f-modal-edit.md +0 -123
  317. package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-g-excel.md +0 -145
  318. package/claude/references/sd-simplysm-v14/angular/recipes/crud-list.md +0 -377
  319. package/claude/references/sd-simplysm-v14/angular/recipes/data-select-button.md +0 -368
  320. package/claude/references/sd-simplysm-v14/angular/recipes/page-modal-container.md +0 -238
  321. package/claude/references/sd-simplysm-v14/excel/types/excel-xml-content-type-data.md +0 -23
  322. package/claude/references/sd-simplysm-v14/excel/types/excel-xml-drawing-data.md +0 -29
  323. package/claude/references/sd-simplysm-v14/excel/types/excel-xml-relationship-data.md +0 -39
  324. package/claude/references/sd-simplysm-v14/excel/types/excel-xml-shared-string-data.md +0 -42
  325. package/claude/references/sd-simplysm-v14/excel/types/excel-xml-style-data.md +0 -97
  326. package/claude/references/sd-simplysm-v14/excel/types/excel-xml-workbook-data.md +0 -22
  327. package/claude/references/sd-simplysm-v14/excel/types/excel-xml-worksheet-data.md +0 -68
  328. 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
+ ```
@@ -1,5 +1,7 @@
1
1
  # `SdList`
2
2
 
3
+ > **읽어야 하는 상황**: 리스트 형태로 데이터를 표시할 때. 스프레드시트 형태는 [`SdSheet`](./sd-sheet.md) 참조.
4
+
3
5
  리스트 컴포넌트.
4
6
 
5
7
  ```typescript