@simplysm/sd-cli 13.0.75 → 13.0.76
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/lint.d.ts +2 -2
- package/dist/commands/lint.d.ts.map +1 -1
- package/dist/commands/lint.js +0 -94
- package/dist/commands/lint.js.map +1 -1
- package/package.json +4 -5
- package/src/commands/lint.ts +2 -113
- package/templates/init/package.json.hbs +2 -3
- package/templates/init/packages/client-admin/package.json.hbs +5 -5
- package/templates/init/packages/client-admin/src/views/home/base/employee/EmployeeDetail.tsx.hbs +86 -105
- package/templates/init/packages/client-admin/src/views/home/base/role-permission/RoleDetail.tsx.hbs +4 -12
- package/templates/init/packages/client-admin/src/views/home/base/role-permission/RolePermissionDetail.tsx.hbs +0 -2
- package/templates/init/packages/client-admin/src/views/home/base/role-permission/RolePermissionView.tsx +1 -1
- package/templates/init/packages/client-admin/src/views/home/my-info/MyInfoDetail.tsx.hbs +36 -43
- package/templates/init/packages/db-main/package.json.hbs +2 -2
- package/templates/init/packages/server/package.json.hbs +4 -4
- package/templates/init/tests/e2e/package.json.hbs +1 -1
- package/tests/get-compiler-options-for-package.spec.ts +0 -45
- package/tests/get-package-source-files.spec.ts +0 -42
- package/tests/get-types-from-package-json.spec.ts +0 -19
- package/tests/infra/ResultCollector.spec.ts +0 -9
- package/tests/infra/WorkerManager.spec.ts +0 -34
- package/tests/load-ignore-patterns.spec.ts +0 -29
- package/tests/load-sd-config.spec.ts +0 -39
- package/tests/run-lint.spec.ts +0 -53
- package/tests/run-typecheck.spec.ts +0 -168
- package/tests/run-watch.spec.ts +0 -34
- package/tests/sd-cli.spec.ts +0 -88
- package/templates/init/stylelint.config.ts +0 -1
package/dist/commands/lint.d.ts
CHANGED
|
@@ -16,9 +16,9 @@ export interface LintOptions {
|
|
|
16
16
|
export interface LintResult {
|
|
17
17
|
/** true if there are no lint errors */
|
|
18
18
|
success: boolean;
|
|
19
|
-
/** Total error count from ESLint
|
|
19
|
+
/** Total error count from ESLint */
|
|
20
20
|
errorCount: number;
|
|
21
|
-
/** Total warning count from ESLint
|
|
21
|
+
/** Total warning count from ESLint */
|
|
22
22
|
warningCount: number;
|
|
23
23
|
/** Formatter output string (content to write to stdout) */
|
|
24
24
|
formattedOutput: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["..\\..\\src\\commands\\lint.ts"],"names":[],"mappings":"AAIA,OAAO,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["..\\..\\src\\commands\\lint.ts"],"names":[],"mappings":"AAIA,OAAO,uBAAuB,CAAC;AAM/B;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,6FAA6F;IAC7F,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,sBAAsB;IACtB,GAAG,EAAE,OAAO,CAAC;IACb,2FAA2F;IAC3F,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,uCAAuC;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,oCAAoC;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,2DAA2D;IAC3D,eAAe,EAAE,MAAM,CAAC;CACzB;AA0BD;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAuCvE;AAMD;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAoF3E;AAED;;;;;;;GAOG;AACH,wBAAsB,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAQjE"}
|
package/dist/commands/lint.js
CHANGED
|
@@ -5,21 +5,12 @@ import { fsExists, fsGlob, pathFilterByTargets } from "@simplysm/core-node";
|
|
|
5
5
|
import "@simplysm/core-common";
|
|
6
6
|
import { SdError } from "@simplysm/core-common";
|
|
7
7
|
import { consola } from "consola";
|
|
8
|
-
import stylelint from "stylelint";
|
|
9
8
|
const ESLINT_CONFIG_FILES = [
|
|
10
9
|
"eslint.config.ts",
|
|
11
10
|
"eslint.config.mts",
|
|
12
11
|
"eslint.config.js",
|
|
13
12
|
"eslint.config.mjs"
|
|
14
13
|
];
|
|
15
|
-
const STYLELINT_CONFIG_FILES = [
|
|
16
|
-
"stylelint.config.ts",
|
|
17
|
-
"stylelint.config.mts",
|
|
18
|
-
"stylelint.config.js",
|
|
19
|
-
"stylelint.config.mjs",
|
|
20
|
-
".stylelintrc.json",
|
|
21
|
-
".stylelintrc.yml"
|
|
22
|
-
];
|
|
23
14
|
function isGlobalIgnoresConfig(item) {
|
|
24
15
|
if (item == null || typeof item !== "object") return false;
|
|
25
16
|
if (!("ignores" in item)) return false;
|
|
@@ -59,12 +50,6 @@ async function loadIgnorePatterns(cwd) {
|
|
|
59
50
|
}
|
|
60
51
|
return configs.filter(isGlobalIgnoresConfig).flatMap((item) => item.ignores);
|
|
61
52
|
}
|
|
62
|
-
async function hasStylelintConfig(cwd) {
|
|
63
|
-
for (const f of STYLELINT_CONFIG_FILES) {
|
|
64
|
-
if (await fsExists(path.join(cwd, f))) return true;
|
|
65
|
-
}
|
|
66
|
-
return false;
|
|
67
|
-
}
|
|
68
53
|
async function executeLint(options) {
|
|
69
54
|
const { targets, fix, timing } = options;
|
|
70
55
|
const cwd = process.cwd();
|
|
@@ -105,54 +90,6 @@ async function executeLint(options) {
|
|
|
105
90
|
logger.debug("auto-fix applied");
|
|
106
91
|
}
|
|
107
92
|
}
|
|
108
|
-
const hasStylelintCfg = await hasStylelintConfig(cwd);
|
|
109
|
-
let stylelintResult;
|
|
110
|
-
if (hasStylelintCfg) {
|
|
111
|
-
logger.start("collecting CSS files");
|
|
112
|
-
let cssFiles = await fsGlob("**/*.css", {
|
|
113
|
-
cwd,
|
|
114
|
-
ignore: ignorePatterns,
|
|
115
|
-
nodir: true,
|
|
116
|
-
absolute: true
|
|
117
|
-
});
|
|
118
|
-
cssFiles = pathFilterByTargets(cssFiles, targets, cwd);
|
|
119
|
-
logger.success(`collected CSS files (${cssFiles.length} files)`);
|
|
120
|
-
if (cssFiles.length > 0) {
|
|
121
|
-
logger.start(`running Stylelint... (${cssFiles.length} files)`);
|
|
122
|
-
let configFile;
|
|
123
|
-
for (const f of STYLELINT_CONFIG_FILES) {
|
|
124
|
-
const configPath = path.join(cwd, f);
|
|
125
|
-
if (await fsExists(configPath)) {
|
|
126
|
-
configFile = configPath;
|
|
127
|
-
break;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
let stylelintOptions;
|
|
131
|
-
if (configFile != null && /\.ts$/.test(configFile)) {
|
|
132
|
-
const jiti = createJiti(import.meta.url);
|
|
133
|
-
const configModule = await jiti.import(configFile);
|
|
134
|
-
const config = configModule.default;
|
|
135
|
-
stylelintOptions = {
|
|
136
|
-
files: cssFiles,
|
|
137
|
-
config,
|
|
138
|
-
configBasedir: cwd,
|
|
139
|
-
fix,
|
|
140
|
-
cache: true,
|
|
141
|
-
cacheLocation: path.join(cwd, ".cache", "stylelint.cache")
|
|
142
|
-
};
|
|
143
|
-
} else {
|
|
144
|
-
stylelintOptions = {
|
|
145
|
-
files: cssFiles,
|
|
146
|
-
configFile,
|
|
147
|
-
fix,
|
|
148
|
-
cache: true,
|
|
149
|
-
cacheLocation: path.join(cwd, ".cache", "stylelint.cache")
|
|
150
|
-
};
|
|
151
|
-
}
|
|
152
|
-
stylelintResult = await stylelint.lint(stylelintOptions);
|
|
153
|
-
logger.success("Stylelint execution complete");
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
93
|
if (files.length === 0 || eslintResults == null || eslint == null) {
|
|
157
94
|
logger.info("no files to lint");
|
|
158
95
|
return { success: true, errorCount: 0, warningCount: 0, formattedOutput: "" };
|
|
@@ -172,37 +109,6 @@ async function executeLint(options) {
|
|
|
172
109
|
if (resultText) {
|
|
173
110
|
formattedOutput += resultText;
|
|
174
111
|
}
|
|
175
|
-
if (stylelintResult != null && stylelintResult.results.length > 0) {
|
|
176
|
-
const stylelintErrorCount = stylelintResult.results.sum(
|
|
177
|
-
(r) => r.warnings.filter((w) => w.severity === "error").length
|
|
178
|
-
);
|
|
179
|
-
const stylelintWarningCount = stylelintResult.results.sum(
|
|
180
|
-
(r) => r.warnings.filter((w) => w.severity === "warning").length
|
|
181
|
-
);
|
|
182
|
-
errorCount += stylelintErrorCount;
|
|
183
|
-
warningCount += stylelintWarningCount;
|
|
184
|
-
if (stylelintErrorCount > 0) {
|
|
185
|
-
logger.error("Stylelint errors occurred", {
|
|
186
|
-
errorCount: stylelintErrorCount,
|
|
187
|
-
warningCount: stylelintWarningCount
|
|
188
|
-
});
|
|
189
|
-
} else if (stylelintWarningCount > 0) {
|
|
190
|
-
logger.info("Stylelint complete (warnings present)", {
|
|
191
|
-
errorCount: stylelintErrorCount,
|
|
192
|
-
warningCount: stylelintWarningCount
|
|
193
|
-
});
|
|
194
|
-
} else {
|
|
195
|
-
logger.info("Stylelint complete", {
|
|
196
|
-
errorCount: stylelintErrorCount,
|
|
197
|
-
warningCount: stylelintWarningCount
|
|
198
|
-
});
|
|
199
|
-
}
|
|
200
|
-
const stylelintFormatter = await stylelint.formatters.string;
|
|
201
|
-
const stylelintOutput = stylelintFormatter(stylelintResult.results, stylelintResult);
|
|
202
|
-
if (stylelintOutput) {
|
|
203
|
-
formattedOutput += stylelintOutput;
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
112
|
return {
|
|
207
113
|
success: errorCount === 0,
|
|
208
114
|
errorCount,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/commands/lint.ts"],
|
|
4
|
-
"mappings": "AAAA,SAAS,cAAc;AACvB,SAAS,kBAAkB;AAC3B,OAAO,UAAU;AACjB,SAAS,UAAU,QAAQ,2BAA2B;AACtD,OAAO;AACP,SAAS,eAAe;AACxB,SAAS,eAAe;
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@simplysm/sd-cli",
|
|
3
|
-
"version": "13.0.
|
|
3
|
+
"version": "13.0.76",
|
|
4
4
|
"description": "Simplysm package - CLI tool",
|
|
5
5
|
"author": "simplysm",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -34,7 +34,6 @@
|
|
|
34
34
|
"sharp": "^0.34.5",
|
|
35
35
|
"solid-js": "^1.9.11",
|
|
36
36
|
"ssh2": "^1.17.0",
|
|
37
|
-
"stylelint": "^16.26.1",
|
|
38
37
|
"tailwindcss": "^3.4.19",
|
|
39
38
|
"ts-morph": "^27.0.2",
|
|
40
39
|
"typescript": "^5.9.3",
|
|
@@ -43,9 +42,9 @@
|
|
|
43
42
|
"vite-plugin-solid": "^2.11.10",
|
|
44
43
|
"vite-tsconfig-paths": "^6.1.1",
|
|
45
44
|
"yargs": "^18.0.0",
|
|
46
|
-
"@simplysm/core-common": "13.0.
|
|
47
|
-
"@simplysm/core-node": "13.0.
|
|
48
|
-
"@simplysm/storage": "13.0.
|
|
45
|
+
"@simplysm/core-common": "13.0.76",
|
|
46
|
+
"@simplysm/core-node": "13.0.76",
|
|
47
|
+
"@simplysm/storage": "13.0.76"
|
|
49
48
|
},
|
|
50
49
|
"devDependencies": {
|
|
51
50
|
"@types/semver": "^7.7.1",
|
package/src/commands/lint.ts
CHANGED
|
@@ -5,7 +5,6 @@ import { fsExists, fsGlob, pathFilterByTargets } from "@simplysm/core-node";
|
|
|
5
5
|
import "@simplysm/core-common";
|
|
6
6
|
import { SdError } from "@simplysm/core-common";
|
|
7
7
|
import { consola } from "consola";
|
|
8
|
-
import stylelint from "stylelint";
|
|
9
8
|
|
|
10
9
|
//#region Types
|
|
11
10
|
|
|
@@ -27,9 +26,9 @@ export interface LintOptions {
|
|
|
27
26
|
export interface LintResult {
|
|
28
27
|
/** true if there are no lint errors */
|
|
29
28
|
success: boolean;
|
|
30
|
-
/** Total error count from ESLint
|
|
29
|
+
/** Total error count from ESLint */
|
|
31
30
|
errorCount: number;
|
|
32
|
-
/** Total warning count from ESLint
|
|
31
|
+
/** Total warning count from ESLint */
|
|
33
32
|
warningCount: number;
|
|
34
33
|
/** Formatter output string (content to write to stdout) */
|
|
35
34
|
formattedOutput: string;
|
|
@@ -47,16 +46,6 @@ const ESLINT_CONFIG_FILES = [
|
|
|
47
46
|
"eslint.config.mjs",
|
|
48
47
|
] as const;
|
|
49
48
|
|
|
50
|
-
/** Stylelint config file search order */
|
|
51
|
-
const STYLELINT_CONFIG_FILES = [
|
|
52
|
-
"stylelint.config.ts",
|
|
53
|
-
"stylelint.config.mts",
|
|
54
|
-
"stylelint.config.js",
|
|
55
|
-
"stylelint.config.mjs",
|
|
56
|
-
".stylelintrc.json",
|
|
57
|
-
".stylelintrc.yml",
|
|
58
|
-
] as const;
|
|
59
|
-
|
|
60
49
|
/**
|
|
61
50
|
* Type guard to check if an ESLint config object has only ignores property
|
|
62
51
|
*/
|
|
@@ -115,16 +104,6 @@ export async function loadIgnorePatterns(cwd: string): Promise<string[]> {
|
|
|
115
104
|
return configs.filter(isGlobalIgnoresConfig).flatMap((item) => item.ignores);
|
|
116
105
|
}
|
|
117
106
|
|
|
118
|
-
/**
|
|
119
|
-
* Check if Stylelint config file exists.
|
|
120
|
-
*/
|
|
121
|
-
async function hasStylelintConfig(cwd: string): Promise<boolean> {
|
|
122
|
-
for (const f of STYLELINT_CONFIG_FILES) {
|
|
123
|
-
if (await fsExists(path.join(cwd, f))) return true;
|
|
124
|
-
}
|
|
125
|
-
return false;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
107
|
//#endregion
|
|
129
108
|
|
|
130
109
|
//#region Main
|
|
@@ -192,59 +171,6 @@ export async function executeLint(options: LintOptions): Promise<LintResult> {
|
|
|
192
171
|
}
|
|
193
172
|
}
|
|
194
173
|
|
|
195
|
-
// Stylelint
|
|
196
|
-
const hasStylelintCfg = await hasStylelintConfig(cwd);
|
|
197
|
-
let stylelintResult: stylelint.LinterResult | undefined;
|
|
198
|
-
if (hasStylelintCfg) {
|
|
199
|
-
logger.start("collecting CSS files");
|
|
200
|
-
let cssFiles = await fsGlob("**/*.css", {
|
|
201
|
-
cwd,
|
|
202
|
-
ignore: ignorePatterns,
|
|
203
|
-
nodir: true,
|
|
204
|
-
absolute: true,
|
|
205
|
-
});
|
|
206
|
-
cssFiles = pathFilterByTargets(cssFiles, targets, cwd);
|
|
207
|
-
logger.success(`collected CSS files (${cssFiles.length} files)`);
|
|
208
|
-
|
|
209
|
-
if (cssFiles.length > 0) {
|
|
210
|
-
logger.start(`running Stylelint... (${cssFiles.length} files)`);
|
|
211
|
-
let configFile: string | undefined;
|
|
212
|
-
for (const f of STYLELINT_CONFIG_FILES) {
|
|
213
|
-
const configPath = path.join(cwd, f);
|
|
214
|
-
if (await fsExists(configPath)) {
|
|
215
|
-
configFile = configPath;
|
|
216
|
-
break;
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
// Support TypeScript config files: load with jiti, pass as config object
|
|
221
|
-
let stylelintOptions: stylelint.LinterOptions;
|
|
222
|
-
if (configFile != null && /\.ts$/.test(configFile)) {
|
|
223
|
-
const jiti = createJiti(import.meta.url);
|
|
224
|
-
const configModule = await jiti.import<{ default: stylelint.Config }>(configFile);
|
|
225
|
-
const config = configModule.default;
|
|
226
|
-
stylelintOptions = {
|
|
227
|
-
files: cssFiles,
|
|
228
|
-
config,
|
|
229
|
-
configBasedir: cwd,
|
|
230
|
-
fix,
|
|
231
|
-
cache: true,
|
|
232
|
-
cacheLocation: path.join(cwd, ".cache", "stylelint.cache"),
|
|
233
|
-
};
|
|
234
|
-
} else {
|
|
235
|
-
stylelintOptions = {
|
|
236
|
-
files: cssFiles,
|
|
237
|
-
configFile,
|
|
238
|
-
fix,
|
|
239
|
-
cache: true,
|
|
240
|
-
cacheLocation: path.join(cwd, ".cache", "stylelint.cache"),
|
|
241
|
-
};
|
|
242
|
-
}
|
|
243
|
-
stylelintResult = await stylelint.lint(stylelintOptions);
|
|
244
|
-
logger.success("Stylelint execution complete");
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
|
|
248
174
|
// Return success result if no files or lint was not executed
|
|
249
175
|
if (files.length === 0 || eslintResults == null || eslint == null) {
|
|
250
176
|
logger.info("no files to lint");
|
|
@@ -271,43 +197,6 @@ export async function executeLint(options: LintOptions): Promise<LintResult> {
|
|
|
271
197
|
formattedOutput += resultText;
|
|
272
198
|
}
|
|
273
199
|
|
|
274
|
-
// Collect Stylelint results
|
|
275
|
-
if (stylelintResult != null && stylelintResult.results.length > 0) {
|
|
276
|
-
const stylelintErrorCount = stylelintResult.results.sum(
|
|
277
|
-
(r) => r.warnings.filter((w) => w.severity === "error").length,
|
|
278
|
-
);
|
|
279
|
-
const stylelintWarningCount = stylelintResult.results.sum(
|
|
280
|
-
(r) => r.warnings.filter((w) => w.severity === "warning").length,
|
|
281
|
-
);
|
|
282
|
-
|
|
283
|
-
errorCount += stylelintErrorCount;
|
|
284
|
-
warningCount += stylelintWarningCount;
|
|
285
|
-
|
|
286
|
-
if (stylelintErrorCount > 0) {
|
|
287
|
-
logger.error("Stylelint errors occurred", {
|
|
288
|
-
errorCount: stylelintErrorCount,
|
|
289
|
-
warningCount: stylelintWarningCount,
|
|
290
|
-
});
|
|
291
|
-
} else if (stylelintWarningCount > 0) {
|
|
292
|
-
logger.info("Stylelint complete (warnings present)", {
|
|
293
|
-
errorCount: stylelintErrorCount,
|
|
294
|
-
warningCount: stylelintWarningCount,
|
|
295
|
-
});
|
|
296
|
-
} else {
|
|
297
|
-
logger.info("Stylelint complete", {
|
|
298
|
-
errorCount: stylelintErrorCount,
|
|
299
|
-
warningCount: stylelintWarningCount,
|
|
300
|
-
});
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
// Stylelint formatter output
|
|
304
|
-
const stylelintFormatter = await stylelint.formatters.string;
|
|
305
|
-
const stylelintOutput = stylelintFormatter(stylelintResult.results, stylelintResult);
|
|
306
|
-
if (stylelintOutput) {
|
|
307
|
-
formattedOutput += stylelintOutput;
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
|
|
311
200
|
return {
|
|
312
201
|
success: errorCount === 0,
|
|
313
202
|
errorCount,
|
|
@@ -17,12 +17,11 @@
|
|
|
17
17
|
"vitest": "vitest"
|
|
18
18
|
},
|
|
19
19
|
"devDependencies": {
|
|
20
|
-
"@simplysm/lint": "~13.0.
|
|
21
|
-
"@simplysm/sd-cli": "~13.0.
|
|
20
|
+
"@simplysm/lint": "~13.0.76",
|
|
21
|
+
"@simplysm/sd-cli": "~13.0.76",
|
|
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.
|
|
10
|
-
"@simplysm/core-common": "~13.0.
|
|
9
|
+
"@simplysm/core-browser": "~13.0.76",
|
|
10
|
+
"@simplysm/core-common": "~13.0.76",
|
|
11
11
|
"@simplysm/excel": "^13.0.71",
|
|
12
|
-
"@simplysm/orm-common": "~13.0.
|
|
13
|
-
"@simplysm/service-client": "~13.0.
|
|
14
|
-
"@simplysm/solid": "~13.0.
|
|
12
|
+
"@simplysm/orm-common": "~13.0.76",
|
|
13
|
+
"@simplysm/service-client": "~13.0.76",
|
|
14
|
+
"@simplysm/solid": "~13.0.76",
|
|
15
15
|
"@solid-primitives/event-listener": "^2.4.5",
|
|
16
16
|
"@solidjs/router": "^0.15.4",
|
|
17
17
|
"@tabler/icons-solidjs": "^3.37.1",
|
package/templates/init/packages/client-admin/src/views/home/base/employee/EmployeeDetail.tsx.hbs
CHANGED
|
@@ -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
|
-
<
|
|
128
|
-
<
|
|
129
|
-
<
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
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
|
-
<
|
|
193
|
-
<
|
|
194
|
-
<
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
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
|
-
<
|
|
214
|
-
<
|
|
215
|
-
<
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
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
|
-
<
|
|
235
|
-
<
|
|
236
|
-
<
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
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>
|