@simplysm/sd-cli 13.0.75 → 13.0.77

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 (167) hide show
  1. package/README.md +341 -16
  2. package/dist/builders/DtsBuilder.js +2 -2
  3. package/dist/builders/DtsBuilder.js.map +1 -1
  4. package/dist/builders/LibraryBuilder.d.ts +3 -3
  5. package/dist/builders/LibraryBuilder.d.ts.map +1 -1
  6. package/dist/builders/LibraryBuilder.js +2 -2
  7. package/dist/builders/LibraryBuilder.js.map +1 -1
  8. package/dist/builders/types.d.ts +7 -1
  9. package/dist/builders/types.d.ts.map +1 -1
  10. package/dist/capacitor/capacitor.d.ts +5 -0
  11. package/dist/capacitor/capacitor.d.ts.map +1 -1
  12. package/dist/capacitor/capacitor.js +59 -59
  13. package/dist/capacitor/capacitor.js.map +1 -1
  14. package/dist/commands/check.js +4 -4
  15. package/dist/commands/check.js.map +1 -1
  16. package/dist/commands/device.js +3 -3
  17. package/dist/commands/device.js.map +1 -1
  18. package/dist/commands/lint.d.ts +2 -2
  19. package/dist/commands/lint.d.ts.map +1 -1
  20. package/dist/commands/lint.js +4 -98
  21. package/dist/commands/lint.js.map +1 -1
  22. package/dist/commands/publish.js +20 -20
  23. package/dist/commands/publish.js.map +1 -1
  24. package/dist/commands/replace-deps.js +1 -1
  25. package/dist/commands/replace-deps.js.map +1 -1
  26. package/dist/commands/typecheck.js +9 -9
  27. package/dist/commands/typecheck.js.map +1 -1
  28. package/dist/electron/electron.js +16 -16
  29. package/dist/electron/electron.js.map +1 -1
  30. package/dist/orchestrators/BuildOrchestrator.js +6 -6
  31. package/dist/orchestrators/BuildOrchestrator.js.map +1 -1
  32. package/dist/orchestrators/DevOrchestrator.d.ts +7 -6
  33. package/dist/orchestrators/DevOrchestrator.d.ts.map +1 -1
  34. package/dist/orchestrators/DevOrchestrator.js +157 -203
  35. package/dist/orchestrators/DevOrchestrator.js.map +1 -1
  36. package/dist/orchestrators/WatchOrchestrator.d.ts.map +1 -1
  37. package/dist/orchestrators/WatchOrchestrator.js +3 -4
  38. package/dist/orchestrators/WatchOrchestrator.js.map +1 -1
  39. package/dist/sd-cli.js +1 -1
  40. package/dist/sd-cli.js.map +1 -1
  41. package/dist/sd-config.types.d.ts +9 -3
  42. package/dist/sd-config.types.d.ts.map +1 -1
  43. package/dist/utils/copy-public.d.ts.map +1 -1
  44. package/dist/utils/copy-public.js +23 -27
  45. package/dist/utils/copy-public.js.map +1 -1
  46. package/dist/utils/copy-src.d.ts.map +1 -1
  47. package/dist/utils/copy-src.js +7 -7
  48. package/dist/utils/copy-src.js.map +1 -1
  49. package/dist/utils/esbuild-config.d.ts.map +1 -1
  50. package/dist/utils/esbuild-config.js +36 -42
  51. package/dist/utils/esbuild-config.js.map +1 -1
  52. package/dist/utils/replace-deps.js +7 -7
  53. package/dist/utils/replace-deps.js.map +1 -1
  54. package/dist/utils/sd-config.js +2 -2
  55. package/dist/utils/sd-config.js.map +1 -1
  56. package/dist/utils/template.js +7 -7
  57. package/dist/utils/template.js.map +1 -1
  58. package/dist/utils/tsconfig.d.ts +1 -2
  59. package/dist/utils/tsconfig.d.ts.map +1 -1
  60. package/dist/utils/tsconfig.js +5 -8
  61. package/dist/utils/tsconfig.js.map +1 -1
  62. package/dist/utils/typecheck-serialization.js +2 -2
  63. package/dist/utils/typecheck-serialization.js.map +1 -1
  64. package/dist/utils/vite-config.d.ts +2 -0
  65. package/dist/utils/vite-config.d.ts.map +1 -1
  66. package/dist/utils/vite-config.js +36 -3
  67. package/dist/utils/vite-config.js.map +1 -1
  68. package/dist/utils/worker-events.d.ts +11 -1
  69. package/dist/utils/worker-events.d.ts.map +1 -1
  70. package/dist/utils/worker-events.js +3 -5
  71. package/dist/utils/worker-events.js.map +1 -1
  72. package/dist/utils/worker-utils.d.ts +2 -2
  73. package/dist/utils/worker-utils.d.ts.map +1 -1
  74. package/dist/utils/worker-utils.js +1 -1
  75. package/dist/utils/worker-utils.js.map +1 -1
  76. package/dist/workers/client.worker.d.ts +1 -1
  77. package/dist/workers/client.worker.js +3 -3
  78. package/dist/workers/client.worker.js.map +1 -1
  79. package/dist/workers/dts.worker.d.ts +1 -1
  80. package/dist/workers/dts.worker.d.ts.map +1 -1
  81. package/dist/workers/dts.worker.js +13 -28
  82. package/dist/workers/dts.worker.js.map +1 -1
  83. package/dist/workers/library.worker.d.ts +1 -1
  84. package/dist/workers/library.worker.js +4 -4
  85. package/dist/workers/library.worker.js.map +1 -1
  86. package/dist/workers/lint.worker.d.ts +1 -1
  87. package/dist/workers/server-runtime.worker.d.ts +1 -1
  88. package/dist/workers/server-runtime.worker.js +4 -4
  89. package/dist/workers/server-runtime.worker.js.map +1 -1
  90. package/dist/workers/server.worker.d.ts +1 -1
  91. package/dist/workers/server.worker.js +6 -6
  92. package/dist/workers/server.worker.js.map +1 -1
  93. package/package.json +4 -5
  94. package/src/builders/DtsBuilder.ts +2 -2
  95. package/src/builders/LibraryBuilder.ts +7 -10
  96. package/src/builders/types.ts +6 -1
  97. package/src/capacitor/capacitor.ts +61 -60
  98. package/src/commands/check.ts +4 -4
  99. package/src/commands/device.ts +3 -3
  100. package/src/commands/lint.ts +6 -117
  101. package/src/commands/publish.ts +20 -20
  102. package/src/commands/replace-deps.ts +1 -1
  103. package/src/commands/typecheck.ts +9 -9
  104. package/src/electron/electron.ts +16 -16
  105. package/src/orchestrators/BuildOrchestrator.ts +6 -6
  106. package/src/orchestrators/DevOrchestrator.ts +210 -256
  107. package/src/orchestrators/WatchOrchestrator.ts +8 -10
  108. package/src/sd-cli.ts +1 -1
  109. package/src/sd-config.types.ts +10 -3
  110. package/src/utils/copy-public.ts +22 -26
  111. package/src/utils/copy-src.ts +7 -7
  112. package/src/utils/esbuild-config.ts +51 -63
  113. package/src/utils/replace-deps.ts +7 -7
  114. package/src/utils/sd-config.ts +2 -2
  115. package/src/utils/template.ts +7 -7
  116. package/src/utils/tsconfig.ts +6 -10
  117. package/src/utils/typecheck-serialization.ts +2 -2
  118. package/src/utils/vite-config.ts +376 -341
  119. package/src/utils/worker-events.ts +13 -10
  120. package/src/utils/worker-utils.ts +45 -45
  121. package/src/workers/client.worker.ts +3 -3
  122. package/src/workers/dts.worker.ts +451 -467
  123. package/src/workers/library.worker.ts +4 -4
  124. package/src/workers/server-runtime.worker.ts +4 -4
  125. package/src/workers/server.worker.ts +572 -572
  126. package/templates/init/package.json.hbs +2 -3
  127. package/templates/init/packages/client-admin/package.json.hbs +5 -5
  128. package/templates/init/packages/client-admin/src/views/auth/LoginView.tsx +2 -2
  129. package/templates/init/packages/client-admin/src/views/home/base/employee/EmployeeDetail.tsx.hbs +86 -105
  130. package/templates/init/packages/client-admin/src/views/home/base/employee/EmployeeSheet.tsx.hbs +1 -1
  131. package/templates/init/packages/client-admin/src/views/home/base/role-permission/RoleDetail.tsx.hbs +4 -12
  132. package/templates/init/packages/client-admin/src/views/home/base/role-permission/RolePermissionDetail.tsx.hbs +0 -2
  133. package/templates/init/packages/client-admin/src/views/home/base/role-permission/RolePermissionView.tsx +1 -1
  134. package/templates/init/packages/client-admin/src/views/home/base/role-permission/RoleSheet.tsx.hbs +1 -1
  135. package/templates/init/packages/client-admin/src/views/home/my-info/MyInfoDetail.tsx.hbs +36 -43
  136. package/templates/init/packages/db-main/package.json.hbs +2 -2
  137. package/templates/init/packages/server/package.json.hbs +4 -4
  138. package/templates/init/tests/e2e/package.json.hbs +1 -1
  139. package/tests/get-compiler-options-for-package.spec.ts +13 -72
  140. package/tests/get-package-source-files.spec.ts +0 -42
  141. package/tests/get-types-from-package-json.spec.ts +15 -30
  142. package/tests/infra/ResultCollector.spec.ts +0 -9
  143. package/tests/infra/WorkerManager.spec.ts +0 -34
  144. package/tests/load-ignore-patterns.spec.ts +15 -40
  145. package/tests/load-sd-config.spec.ts +16 -53
  146. package/tests/publish-config-narrowing.spec.ts +20 -0
  147. package/tests/run-lint.spec.ts +38 -87
  148. package/tests/run-typecheck.spec.ts +194 -303
  149. package/tests/run-watch.spec.ts +0 -34
  150. package/tests/sd-cli.spec.ts +0 -88
  151. package/tests/sd-public-dev-plugin-mime.spec.ts +19 -0
  152. package/dist/builders/index.d.ts +0 -5
  153. package/dist/builders/index.d.ts.map +0 -1
  154. package/dist/builders/index.js +0 -5
  155. package/dist/builders/index.js.map +0 -6
  156. package/dist/infra/index.d.ts +0 -4
  157. package/dist/infra/index.d.ts.map +0 -1
  158. package/dist/infra/index.js +0 -4
  159. package/dist/infra/index.js.map +0 -6
  160. package/dist/orchestrators/index.d.ts +0 -4
  161. package/dist/orchestrators/index.d.ts.map +0 -1
  162. package/dist/orchestrators/index.js +0 -4
  163. package/dist/orchestrators/index.js.map +0 -6
  164. package/src/builders/index.ts +0 -4
  165. package/src/infra/index.ts +0 -3
  166. package/src/orchestrators/index.ts +0 -3
  167. package/templates/init/stylelint.config.ts +0 -1
@@ -17,12 +17,11 @@
17
17
  "vitest": "vitest"
18
18
  },
19
19
  "devDependencies": {
20
- "@simplysm/lint": "~13.0.75",
21
- "@simplysm/sd-cli": "~13.0.75",
20
+ "@simplysm/lint": "~13.0.77",
21
+ "@simplysm/sd-cli": "~13.0.77",
22
22
  "@types/node": "^20.19.35",
23
23
  "eslint": "^9.39.3",
24
24
  "prettier": "^3.8.1",
25
- "stylelint": "^16.26.1",
26
25
  "typescript": "^5.9.3",
27
26
  "vite-tsconfig-paths": "^6.1.1",
28
27
  "vitest": "^4.0.18"
@@ -6,12 +6,12 @@
6
6
  "private": true,
7
7
  "dependencies": {
8
8
  "@{{projectName}}/db-main": "workspace:*",
9
- "@simplysm/core-browser": "~13.0.75",
10
- "@simplysm/core-common": "~13.0.75",
9
+ "@simplysm/core-browser": "~13.0.77",
10
+ "@simplysm/core-common": "~13.0.77",
11
11
  "@simplysm/excel": "^13.0.71",
12
- "@simplysm/orm-common": "~13.0.75",
13
- "@simplysm/service-client": "~13.0.75",
14
- "@simplysm/solid": "~13.0.75",
12
+ "@simplysm/orm-common": "~13.0.77",
13
+ "@simplysm/service-client": "~13.0.77",
14
+ "@simplysm/solid": "~13.0.77",
15
15
  "@solid-primitives/event-listener": "^2.4.5",
16
16
  "@solidjs/router": "^0.15.4",
17
17
  "@tabler/icons-solidjs": "^3.37.1",
@@ -81,7 +81,7 @@ export function LoginView() {
81
81
  type="email"
82
82
  placeholder="이메일을 입력하세요"
83
83
  required
84
- touchMode
84
+ lazyValidation
85
85
  size="lg"
86
86
  autocomplete="employeename"
87
87
  value={data.email}
@@ -95,7 +95,7 @@ export function LoginView() {
95
95
  <FormGroup.Item>
96
96
  <TextInput
97
97
  required
98
- touchMode
98
+ lazyValidation
99
99
  class="w-full"
100
100
  type="password"
101
101
  placeholder="비밀번호를 입력하세요"
@@ -53,7 +53,6 @@ export function EmployeeDetail(props: { itemId?: number }) {
53
53
  const emp = await db
54
54
  .employee()
55
55
  .joinLastDataLog()
56
- // eslint-disable-next-line solid/reactivity -- 비동기 콜백 내부
57
56
  .where((c) => [expr.eq(c.id, props.itemId)])
58
57
  .select((c) => ({
59
58
  name: c.name,
@@ -124,64 +123,56 @@ export function EmployeeDetail(props: { itemId?: number }) {
124
123
  <section class={"flex flex-col gap-2"}>
125
124
  <h3 class="font-bold text-base-400">직원정보</h3>
126
125
  <FormTable>
127
- <tbody>
128
- <tr>
129
- <th>이름</th>
130
- <td>
131
- <TextInput
132
- required
133
- disabled={!perms().edit}
134
- value={ctx.data.name ?? ""}
135
- onValueChange={(v) => ctx.setData("name", v)}
136
- />
137
- </td>
138
- <th>이메일</th>
139
- <td>
140
- <TextInput
141
- type="email"
142
- disabled={!perms().edit}
143
- value={ctx.data.email ?? ""}
144
- onValueChange={(v) => ctx.setData("email", v)}
145
- />
146
- </td>
147
- </tr>
148
- <tr>
149
- <th>전화번호</th>
150
- <td>
151
- <TextInput
152
- disabled={!perms().edit}
153
- value={ctx.data.phoneNumber ?? ""}
154
- onValueChange={(v) => ctx.setData("phoneNumber", v)}
155
- />
156
- </td>
157
- <th>생년월일</th>
158
- <td>
159
- <DatePicker
160
- disabled={!perms().edit}
161
- value={ctx.data.birthDate}
162
- onValueChange={(v) => ctx.setData("birthDate", v)}
163
- />
164
- </td>
165
- </tr>
166
- <tr>
167
- <th>입사일자</th>
168
- <td>
169
- <DatePicker
170
- disabled={!perms().edit}
171
- value={ctx.data.enteringDate}
172
- onValueChange={(v) => ctx.setData("enteringDate", v)}
173
- />
174
- </td>
175
- <th>퇴사일자</th>
176
- <td>
177
- <DatePicker
178
- disabled={!perms().edit}
179
- value={ctx.data.leavingDate}
180
- onValueChange={(v) => ctx.setData("leavingDate", v)}
181
- />
182
- </td>
183
- </tr>
184
- </tbody>
126
+ <FormTable.Row>
127
+ <FormTable.Item label="이름">
128
+ <TextInput
129
+ required
130
+ disabled={!perms().edit}
131
+ value={ctx.data.name ?? ""}
132
+ onValueChange={(v) => ctx.setData("name", v)}
133
+ />
134
+ </FormTable.Item>
135
+ <FormTable.Item label="이메일">
136
+ <TextInput
137
+ type="email"
138
+ disabled={!perms().edit}
139
+ value={ctx.data.email ?? ""}
140
+ onValueChange={(v) => ctx.setData("email", v)}
141
+ />
142
+ </FormTable.Item>
143
+ </FormTable.Row>
144
+ <FormTable.Row>
145
+ <FormTable.Item label="전화번호">
146
+ <TextInput
147
+ disabled={!perms().edit}
148
+ value={ctx.data.phoneNumber ?? ""}
149
+ onValueChange={(v) => ctx.setData("phoneNumber", v)}
150
+ />
151
+ </FormTable.Item>
152
+ <FormTable.Item label="생년월일">
153
+ <DatePicker
154
+ disabled={!perms().edit}
155
+ value={ctx.data.birthDate}
156
+ onValueChange={(v) => ctx.setData("birthDate", v)}
157
+ />
158
+ </FormTable.Item>
159
+ </FormTable.Row>
160
+ <FormTable.Row>
161
+ <FormTable.Item label="입사일자">
162
+ <DatePicker
163
+ disabled={!perms().edit}
164
+ value={ctx.data.enteringDate}
165
+ onValueChange={(v) => ctx.setData("enteringDate", v)}
166
+ />
167
+ </FormTable.Item>
168
+ <FormTable.Item label="퇴사일자">
169
+ <DatePicker
170
+ disabled={!perms().edit}
171
+ value={ctx.data.leavingDate}
172
+ onValueChange={(v) => ctx.setData("leavingDate", v)}
173
+ />
174
+ </FormTable.Item>
175
+ </FormTable.Row>
185
176
  </FormTable>
186
177
  </section>
187
178
 
@@ -189,19 +180,16 @@ export function EmployeeDetail(props: { itemId?: number }) {
189
180
  <section class={"flex flex-col gap-2"}>
190
181
  <h3 class="font-bold text-base-400">인증정보</h3>
191
182
  <FormTable>
192
- <tbody>
193
- <tr>
194
- <th>비밀번호</th>
195
- <td colSpan={3}>
196
- <TextInput
197
- type="password"
198
- disabled={!perms().authEdit}
199
- value={ctx.data.password ?? ""}
200
- onValueChange={(v) => ctx.setData("password", v)}
201
- />
202
- </td>
203
- </tr>
204
- </tbody>
183
+ <FormTable.Row>
184
+ <FormTable.Item label="비밀번호" colspan={3}>
185
+ <TextInput
186
+ type="password"
187
+ disabled={!perms().authEdit}
188
+ value={ctx.data.password ?? ""}
189
+ onValueChange={(v) => ctx.setData("password", v)}
190
+ />
191
+ </FormTable.Item>
192
+ </FormTable.Row>
205
193
  </FormTable>
206
194
  </section>
207
195
  </Show>
@@ -210,19 +198,16 @@ export function EmployeeDetail(props: { itemId?: number }) {
210
198
  <section class={"flex flex-col gap-2"}>
211
199
  <h3 class="font-bold text-base-400">개인정보</h3>
212
200
  <FormTable>
213
- <tbody>
214
- <tr>
215
- <th>주민번호</th>
216
- <td colSpan={3}>
217
- <TextInput
218
- format="XXXXXX-XXXXXXX"
219
- disabled={!perms().personalEdit}
220
- value={ctx.data.socialSecurityNumber ?? ""}
221
- onValueChange={(v) => ctx.setData("socialSecurityNumber", v)}
222
- />
223
- </td>
224
- </tr>
225
- </tbody>
201
+ <FormTable.Row>
202
+ <FormTable.Item label="주민번호" colspan={3}>
203
+ <TextInput
204
+ format="XXXXXX-XXXXXXX"
205
+ disabled={!perms().personalEdit}
206
+ value={ctx.data.socialSecurityNumber ?? ""}
207
+ onValueChange={(v) => ctx.setData("socialSecurityNumber", v)}
208
+ />
209
+ </FormTable.Item>
210
+ </FormTable.Row>
226
211
  </FormTable>
227
212
  </section>
228
213
  </Show>
@@ -231,26 +216,22 @@ export function EmployeeDetail(props: { itemId?: number }) {
231
216
  <section class={"flex flex-col gap-2"}>
232
217
  <h3 class="font-bold text-base-400">급여정보</h3>
233
218
  <FormTable>
234
- <tbody>
235
- <tr>
236
- <th>계좌은행</th>
237
- <td>
238
- <TextInput
239
- disabled={!perms().payrollEdit}
240
- value={ctx.data.payrollAccountBank ?? ""}
241
- onValueChange={(v) => ctx.setData("payrollAccountBank", v)}
242
- />
243
- </td>
244
- <th>계좌번호</th>
245
- <td>
246
- <TextInput
247
- disabled={!perms().payrollEdit}
248
- value={ctx.data.payrollAccountNumber ?? ""}
249
- onValueChange={(v) => ctx.setData("payrollAccountNumber", v)}
250
- />
251
- </td>
252
- </tr>
253
- </tbody>
219
+ <FormTable.Row>
220
+ <FormTable.Item label="계좌은행">
221
+ <TextInput
222
+ disabled={!perms().payrollEdit}
223
+ value={ctx.data.payrollAccountBank ?? ""}
224
+ onValueChange={(v) => ctx.setData("payrollAccountBank", v)}
225
+ />
226
+ </FormTable.Item>
227
+ <FormTable.Item label="계좌번호">
228
+ <TextInput
229
+ disabled={!perms().payrollEdit}
230
+ value={ctx.data.payrollAccountNumber ?? ""}
231
+ onValueChange={(v) => ctx.setData("payrollAccountNumber", v)}
232
+ />
233
+ </FormTable.Item>
234
+ </FormTable.Row>
254
235
  </FormTable>
255
236
  </section>
256
237
  </Show>
@@ -164,7 +164,7 @@ export function EmployeeSheet() {
164
164
  <CrudSheet<SheetItem, Filter>
165
165
  search={search}
166
166
  getItemKey={(item) => item.id}
167
- itemDeleted={(item) => item.isDeleted}
167
+ isItemDeleted={(item) => item.isDeleted}
168
168
  isItemSelectable={(item) => item.id != null}
169
169
  persistKey="employee-page"
170
170
  editable={employeePerms.edit}
@@ -33,7 +33,6 @@ export function RoleDetail(props: { itemId?: number }) {
33
33
  return appService.orm.connectWithoutTransaction(async (db) => {
34
34
  const role = await db
35
35
  .role()
36
- // eslint-disable-next-line solid/reactivity -- 비동기 콜백 내부
37
36
  .where((c) => [expr.eq(c.id, props.itemId)])
38
37
  .select((c) => ({
39
38
  name: c.name,
@@ -61,7 +60,6 @@ export function RoleDetail(props: { itemId?: number }) {
61
60
  await appService.orm.connect(async (db) => {
62
61
  const count = await db
63
62
  .role()
64
- // eslint-disable-next-line solid/reactivity -- 비동기 콜백 내부
65
63
  .where((c) => [
66
64
  expr.eq(c.name, data.name ?? ""),
67
65
 
@@ -78,7 +76,6 @@ export function RoleDetail(props: { itemId?: number }) {
78
76
  });
79
77
 
80
78
  // 저장
81
- // eslint-disable-next-line solid/reactivity -- 비동기 콜백 내부
82
79
  const savedId = await appService.orm.connect(async (db) => {
83
80
  if (props.itemId == null) {
84
81
  const [inserted] = await db.role().insert(
@@ -95,7 +92,6 @@ export function RoleDetail(props: { itemId?: number }) {
95
92
  } else {
96
93
  await db
97
94
  .role()
98
- // eslint-disable-next-line solid/reactivity -- 비동기 콜백 내부
99
95
  .where((_c) => [expr.eq(_c.id, props.itemId)])
100
96
  .update((_c) => ({
101
97
  name: data.name ?? "",
@@ -112,7 +108,6 @@ export function RoleDetail(props: { itemId?: number }) {
112
108
  await appService.orm.connect(async (db) => {
113
109
  await db
114
110
  .role()
115
- // eslint-disable-next-line solid/reactivity -- 비동기 콜백 내부
116
111
  .where((_c) => [expr.eq(_c.id, props.itemId!)])
117
112
  .update((_c) => ({
118
113
  isDeleted: del,
@@ -133,19 +128,16 @@ export function RoleDetail(props: { itemId?: number }) {
133
128
  {(ctx) => (
134
129
  <div class="p-2">
135
130
  <FormTable>
136
- <tbody>
137
- <tr>
138
- <th>이름</th>
139
- <td>
131
+ <FormTable.Row>
132
+ <FormTable.Item label="이름">
140
133
  <TextInput
141
134
  required
142
135
  disabled={!perms().edit}
143
136
  value={ctx.data.name ?? ""}
144
137
  onValueChange={(v) => ctx.setData("name", v)}
145
138
  />
146
- </td>
147
- </tr>
148
- </tbody>
139
+ </FormTable.Item>
140
+ </FormTable.Row>
149
141
  </FormTable>
150
142
  </div>
151
143
  )}
@@ -57,11 +57,9 @@ export function RolePermissionDetail(props: { roleId: number }) {
57
57
  }
58
58
 
59
59
  async function handleSubmit(data: Record<string, boolean>) {
60
- // eslint-disable-next-line solid/reactivity -- 비동기 콜백 내부
61
60
  await appService.orm.connect(async (db) => {
62
61
  await db
63
62
  .rolePermission()
64
- // eslint-disable-next-line solid/reactivity -- 비동기 콜백 내부
65
63
  .where((c) => [expr.eq(c.roleId, props.roleId)])
66
64
  .delete();
67
65
 
@@ -24,7 +24,7 @@ export function RolePermissionView() {
24
24
  variant={"ghost"}
25
25
  theme={"primary"}
26
26
  size={"xs"}
27
- onClick={() => dialog.show(() => <RoleSheet />, { header: "권한그룹", closeOnBackdrop: true })}
27
+ onClick={() => dialog.show(() => <RoleSheet />, { header: "권한그룹", closeOnInteractOutside: true })}
28
28
  >
29
29
  <Icon icon={IconExternalLink} />
30
30
  </Button>
@@ -85,7 +85,7 @@ export function RoleSheet() {
85
85
  <CrudSheet<SheetItem, Filter>
86
86
  search={search}
87
87
  getItemKey={(item) => item.id}
88
- itemDeleted={(item) => item.isDeleted}
88
+ isItemDeleted={(item) => item.isDeleted}
89
89
  isItemSelectable={(item) => item.id != null}
90
90
  persistKey="role-sheet-page"
91
91
  editable={rolePerms.edit}
@@ -148,9 +148,8 @@ export function MyInfoDetail() {
148
148
  <section>
149
149
  <h3 class="mb-4 border-l-4 border-base-500 pl-3 font-bold text-base-500">인증정보</h3>
150
150
  <FormTable>
151
- <tr>
152
- <th>이메일</th>
153
- <td>
151
+ <FormTable.Row>
152
+ <FormTable.Item label="이메일">
154
153
  <TextInput
155
154
  type="email"
156
155
  required
@@ -158,11 +157,10 @@ export function MyInfoDetail() {
158
157
  onValueChange={(v) => ctx.setData("email", v)}
159
158
  autocomplete="off"
160
159
  />
161
- </td>
162
- </tr>
163
- <tr>
164
- <th>현재 비밀번호</th>
165
- <td>
160
+ </FormTable.Item>
161
+ </FormTable.Row>
162
+ <FormTable.Row>
163
+ <FormTable.Item label="현재 비밀번호">
166
164
  <TextInput
167
165
  required={Boolean(ctx.data.newPassword || ctx.data.confirmPassword)}
168
166
  class="w-56"
@@ -172,11 +170,10 @@ export function MyInfoDetail() {
172
170
  onValueChange={(v) => ctx.setData("currentPassword", v)}
173
171
  placeholder="비밀번호 변경 시에만 입력"
174
172
  />
175
- </td>
176
- </tr>
177
- <tr>
178
- <th>새 비밀번호</th>
179
- <td>
173
+ </FormTable.Item>
174
+ </FormTable.Row>
175
+ <FormTable.Row>
176
+ <FormTable.Item label="새 비밀번호">
180
177
  <TextInput
181
178
  required={Boolean(ctx.data.currentPassword || ctx.data.confirmPassword)}
182
179
  minLength={8}
@@ -187,11 +184,10 @@ export function MyInfoDetail() {
187
184
  onValueChange={(v) => ctx.setData("newPassword", v)}
188
185
  placeholder="비밀번호 변경 시에만 입력"
189
186
  />
190
- </td>
191
- </tr>
192
- <tr>
193
- <th>새 비밀번호 확인</th>
194
- <td>
187
+ </FormTable.Item>
188
+ </FormTable.Row>
189
+ <FormTable.Row>
190
+ <FormTable.Item label="새 비밀번호 확인">
195
191
  <TextInput
196
192
  required={Boolean(ctx.data.currentPassword || ctx.data.newPassword)}
197
193
  minLength={8}
@@ -207,38 +203,35 @@ export function MyInfoDetail() {
207
203
  onValueChange={(v) => ctx.setData("confirmPassword", v)}
208
204
  placeholder="비밀번호 변경 시에만 입력"
209
205
  />
210
- </td>
211
- </tr>
206
+ </FormTable.Item>
207
+ </FormTable.Row>
212
208
  </FormTable>
213
209
  </section>
214
210
 
215
211
  <section>
216
212
  <h3 class="mb-4 border-l-4 border-base-500 pl-3 font-bold text-base-500">시스템설정</h3>
217
213
  <FormTable>
218
- <tbody>
219
- <tr>
220
- <th>로그인 시 화면</th>
221
- <td>
222
- <Select
223
- class="w-full"
224
- value={ctx.data.firstRouterLink}
225
- onValueChange={(v) => ctx.setData("firstRouterLink", v)}
226
- items={routeOptions()}
227
- renderValue={(v) => <>{routeMap().get(v) ?? v}</>}
228
- placeholder="선택 안함"
214
+ <FormTable.Row>
215
+ <FormTable.Item label="로그인 시 화면">
216
+ <Select
217
+ class="w-full"
218
+ value={ctx.data.firstRouterLink}
219
+ onValueChange={(v) => ctx.setData("firstRouterLink", v)}
220
+ items={routeOptions()}
221
+ renderValue={(v) => <>{routeMap().get(v) ?? v}</>}
222
+ placeholder="선택 안함"
223
+ >
224
+ <Select.ItemTemplate>
225
+ {(href: string) => <>{routeMap().get(href) ?? href}</>}
226
+ </Select.ItemTemplate>
227
+ <Select.Action
228
+ onClick={() => ctx.setData("firstRouterLink", undefined as any)}
229
229
  >
230
- <Select.ItemTemplate>
231
- {(href: string) => <>{routeMap().get(href) ?? href}</>}
232
- </Select.ItemTemplate>
233
- <Select.Action
234
- onClick={() => ctx.setData("firstRouterLink", undefined as any)}
235
- >
236
- <Icon icon={IconX} class={"text-danger-500"} />
237
- </Select.Action>
238
- </Select>
239
- </td>
240
- </tr>
241
- </tbody>
230
+ <Icon icon={IconX} class={"text-danger-500"} />
231
+ </Select.Action>
232
+ </Select>
233
+ </FormTable.Item>
234
+ </FormTable.Row>
242
235
  </FormTable>
243
236
  </section>
244
237
  </div>
@@ -7,7 +7,7 @@
7
7
  ".": "./src/index.ts"
8
8
  },
9
9
  "dependencies": {
10
- "@simplysm/core-common": "~13.0.75",
11
- "@simplysm/orm-common": "~13.0.75"
10
+ "@simplysm/core-common": "~13.0.77",
11
+ "@simplysm/orm-common": "~13.0.77"
12
12
  }
13
13
  }
@@ -5,11 +5,11 @@
5
5
  "private": true,
6
6
  "dependencies": {
7
7
  "@{{projectName}}/db-main": "workspace:*",
8
- "@simplysm/core-common": "~13.0.75",
8
+ "@simplysm/core-common": "~13.0.77",
9
9
  "@simplysm/excel": "^13.0.71",
10
- "@simplysm/orm-common": "~13.0.75",
11
- "@simplysm/orm-node": "~13.0.75",
12
- "@simplysm/service-server": "~13.0.75",
10
+ "@simplysm/orm-common": "~13.0.77",
11
+ "@simplysm/orm-node": "~13.0.77",
12
+ "@simplysm/service-server": "~13.0.77",
13
13
  "bcrypt": "^6.0.0",
14
14
  "pg": "^8.19.0",
15
15
  "pg-copy-streams": "^7.0.0"
@@ -6,7 +6,7 @@
6
6
  "private": true,
7
7
  "dependencies": {
8
8
  "@{{projectName}}/db-main": "workspace:*",
9
- "@simplysm/orm-node": "~13.0.75",
9
+ "@simplysm/orm-node": "~13.0.77",
10
10
  "bcrypt": "^6.0.0",
11
11
  "playwright": "^1.58.2"
12
12
  },