worsoft-frontend-codegen-local-mcp 0.1.54 → 0.1.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.
@@ -79,6 +79,9 @@ const {
79
79
  commonActionLabel,
80
80
  } = useCrudPageMeta(dataMasterEntity, dictRefs, childFieldGroups);
81
81
 
82
+ const formInputPlaceholder = (label: string, disabled = false) => (detail.value || disabled ? '' : inputPlaceholder(label));
83
+ const formSelectPlaceholder = (label: string, disabled = false) => (detail.value || disabled ? '' : selectPlaceholder(label));
84
+
82
85
  // 子表分组标题从功能级词条中读取
83
86
  const childSectionTitle = (groupName: string) => t(`${pageI18nKey}.children.${groupName}.title`);
84
87
 
@@ -54,6 +54,9 @@ const {
54
54
  fieldRequiredMessage,
55
55
  } = useCrudPageMeta(dataMasterEntity, dictRefs);
56
56
 
57
+ const formInputPlaceholder = (label: string, disabled = false) => (disabled ? '' : inputPlaceholder(label));
58
+ const formSelectPlaceholder = (label: string, disabled = false) => (disabled ? '' : selectPlaceholder(label));
59
+
57
60
  // 统一维护表单默认值
58
61
  const createDefaultFormState = () => ({
59
62
  {{FORM_DEFAULTS}}
@@ -70,6 +70,9 @@ const {
70
70
  commonActionLabel,
71
71
  } = useCrudPageMeta(dataMasterEntity, dictRefs);
72
72
 
73
+ const formInputPlaceholder = (label: string, disabled = false) => (detail.value || disabled ? '' : inputPlaceholder(label));
74
+ const formSelectPlaceholder = (label: string, disabled = false) => (detail.value || disabled ? '' : selectPlaceholder(label));
75
+
73
76
  // 统一维护表单默认值
74
77
  const createDefaultFormState = () => ({
75
78
  {{FORM_DEFAULTS}}
package/mcp_server.js CHANGED
@@ -5,7 +5,7 @@ const fs = require('fs');
5
5
  const path = require('path');
6
6
 
7
7
  const SERVER_NAME = 'worsoft-codegen-local';
8
- const SERVER_VERSION = '0.1.54';
8
+ const SERVER_VERSION = '0.1.55';
9
9
  const PROTOCOL_VERSION = '2024-11-05';
10
10
  const TOOL_NAME = 'worsoft_codegen_local_generate_frontend';
11
11
  const STYLE_CATALOG_PATH = path.join(__dirname, 'assets', 'style-catalog.json');
@@ -1712,23 +1712,24 @@ function renderTableColumn(field) {
1712
1712
  function renderChildTableColumn(field, childListName) {
1713
1713
  const rules = field.notNull ? ` :rules="[{ required: true, trigger: 'blur' }]"` : '';
1714
1714
  const labelExpr = `getChildFieldLabel('${childListName}', '${field.attrName}')`;
1715
- const inputPlaceholderExpr = `inputPlaceholder(getChildFieldLabel('${childListName}', '${field.attrName}'))`;
1716
- const selectPlaceholderExpr = `selectPlaceholder(getChildFieldLabel('${childListName}', '${field.attrName}'))`;
1715
+ const inputPlaceholderExpr = `formInputPlaceholder(${labelExpr}, ${renderDisabledBoolV2(field)})`;
1716
+ const selectPlaceholderExpr = `formSelectPlaceholder(${labelExpr}, ${renderDisabledBoolV2(field)})`;
1717
+ const disabledAttr = renderDisabledAttrV2(field);
1717
1718
 
1718
- let control = ` <el-input v-model="row.${field.attrName}" :placeholder="${inputPlaceholderExpr}" />`;
1719
+ let control = ` <el-input v-model="row.${field.attrName}" :placeholder="${inputPlaceholderExpr}"${disabledAttr} />`;
1719
1720
  if (field.formType === 'upload') {
1720
- control = ` <UploadFile v-model="row.${field.attrName}" />`;
1721
+ control = ` <UploadFile v-model="row.${field.attrName}"${disabledAttr} />`;
1721
1722
  } else if (field.formType === 'select' && field.dictType) {
1722
1723
  control = [
1723
- ` <el-select v-model="row.${field.attrName}" :placeholder="${selectPlaceholderExpr}" style="width: 100%">`,
1724
+ ` <el-select v-model="row.${field.attrName}" :placeholder="${selectPlaceholderExpr}" style="width: 100%"${disabledAttr}>`,
1724
1725
  ` <el-option v-for="item in ${field.dictType}" :key="item.value" :label="item.label" :value="item.value" />`,
1725
1726
  ' </el-select>',
1726
- ].join('\n');
1727
- } else if (field.formType === 'number') {
1728
- const max = field.comment.includes('%') || /\u6BD4\u4F8B/.test(field.comment) ? ' :max="100"' : '';
1729
- const precision = field.sqlType === 'DECIMAL' && field.scale ? ` :precision="${field.scale}" :step="0.01"` : '';
1730
- control = ` <el-input-number v-model="row.${field.attrName}" :min="0"${max}${precision} style="width: 100%" />`;
1731
- }
1727
+ ].join('\n');
1728
+ } else if (field.formType === 'number') {
1729
+ const max = field.comment.includes('%') || /\u6BD4\u4F8B/.test(field.comment) ? ' :max="100"' : '';
1730
+ const precision = field.sqlType === 'DECIMAL' && field.scale ? ` :precision="${field.scale}" :step="0.01"` : '';
1731
+ control = ` <el-input-number v-model="row.${field.attrName}" :min="0"${max}${precision} :placeholder="${inputPlaceholderExpr}" style="width: 100%"${disabledAttr} />`;
1732
+ }
1732
1733
 
1733
1734
  return [
1734
1735
  ` <el-table-column :label="${labelExpr}" prop="${field.attrName}">`,
@@ -1942,11 +1943,15 @@ function renderTextareaMaxlengthAttrsV2(field) {
1942
1943
  return ` :maxlength="${field.length}" show-word-limit`;
1943
1944
  }
1944
1945
 
1945
- function renderDisabledAttrV2(field) {
1946
- return field.readonly ? ' disabled' : '';
1947
- }
1948
-
1949
- function isAttachmentLikeField(field) {
1946
+ function renderDisabledAttrV2(field) {
1947
+ return field.readonly ? ' disabled' : '';
1948
+ }
1949
+
1950
+ function renderDisabledBoolV2(field) {
1951
+ return field.readonly ? 'true' : 'false';
1952
+ }
1953
+
1954
+ function isAttachmentLikeField(field) {
1950
1955
  const fieldName = String(field?.fieldName || field?.attrName || '').toLowerCase();
1951
1956
  const comment = String(field?.comment || field?.description || '').toLowerCase();
1952
1957
  return fieldName.includes('attachment') || comment.includes('\u9644\u4ef6') || comment.includes('\u4e0a\u4f20');
@@ -1962,6 +1967,7 @@ function renderFormFieldV2(field) {
1962
1967
  const labelExpr = `getMasterFieldLabel('${prop}')`;
1963
1968
  const dictExpr = `getMasterFieldMeta('${prop}')?.dictType`;
1964
1969
  const disabledAttr = renderDisabledAttrV2(field);
1970
+ const disabledBool = renderDisabledBoolV2(field);
1965
1971
 
1966
1972
  if (field.formType === 'upload') {
1967
1973
  return [
@@ -1979,7 +1985,7 @@ function renderFormFieldV2(field) {
1979
1985
  renderFieldCommentV2(field),
1980
1986
  ` <el-col :span="12" class="mb20">`,
1981
1987
  ` <el-form-item :label="${labelExpr}" prop="${prop}">`,
1982
- ` <el-select v-model="form.${prop}" :placeholder="selectPlaceholder(${labelExpr})" style="width: 100%"${disabledAttr}>`,
1988
+ ` <el-select v-model="form.${prop}" :placeholder="formSelectPlaceholder(${labelExpr}, ${disabledBool})" style="width: 100%"${disabledAttr}>`,
1983
1989
  ` <el-option v-for="item in getDictOptions(${dictExpr})" :key="item.value" :label="item.label" :value="item.value" />`,
1984
1990
  ' </el-select>',
1985
1991
  ' </el-form-item>',
@@ -1994,7 +2000,7 @@ function renderFormFieldV2(field) {
1994
2000
  renderFieldCommentV2(field),
1995
2001
  ` <el-col :span="12" class="mb20">`,
1996
2002
  ` <el-form-item :label="${labelExpr}" prop="${prop}">`,
1997
- ` <el-input-number v-model="form.${prop}" :min="0"${max}${precision} :placeholder="inputPlaceholder(${labelExpr})" style="width: 100%"${disabledAttr} />`,
2003
+ ` <el-input-number v-model="form.${prop}" :min="0"${max}${precision} :placeholder="formInputPlaceholder(${labelExpr}, ${disabledBool})" style="width: 100%"${disabledAttr} />`,
1998
2004
  ' </el-form-item>',
1999
2005
  ' </el-col>',
2000
2006
  ].join('\n');
@@ -2007,7 +2013,7 @@ function renderFormFieldV2(field) {
2007
2013
  renderFieldCommentV2(field),
2008
2014
  ` <el-col :span="12" class="mb20">`,
2009
2015
  ` <el-form-item :label="${labelExpr}" prop="${prop}">`,
2010
- ` <el-date-picker type="${pickerType}" :placeholder="inputPlaceholder(${labelExpr})" v-model="form.${prop}" :value-format="${formatName}" style="width: 100%"${disabledAttr}></el-date-picker>`,
2016
+ ` <el-date-picker type="${pickerType}" :placeholder="formInputPlaceholder(${labelExpr}, ${disabledBool})" v-model="form.${prop}" :value-format="${formatName}" style="width: 100%"${disabledAttr}></el-date-picker>`,
2011
2017
  ' </el-form-item>',
2012
2018
  ' </el-col>',
2013
2019
  ].join('\n');
@@ -2019,7 +2025,7 @@ function renderFormFieldV2(field) {
2019
2025
  renderFieldCommentV2(field),
2020
2026
  ` <el-col :span="24" class="mb20">`,
2021
2027
  ` <el-form-item :label="${labelExpr}" prop="${prop}">`,
2022
- ` <el-input type="textarea" v-model="form.${prop}" :placeholder="inputPlaceholder(${labelExpr})"${textareaAttrs}${disabledAttr} />`,
2028
+ ` <el-input type="textarea" v-model="form.${prop}" :placeholder="formInputPlaceholder(${labelExpr}, ${disabledBool})"${textareaAttrs}${disabledAttr} />`,
2023
2029
  ' </el-form-item>',
2024
2030
  ' </el-col>',
2025
2031
  ].join('\n');
@@ -2030,7 +2036,7 @@ function renderFormFieldV2(field) {
2030
2036
  renderFieldCommentV2(field),
2031
2037
  ` <el-col :span="12" class="mb20">`,
2032
2038
  ` <el-form-item :label="${labelExpr}" prop="${prop}">`,
2033
- ` <el-input v-model="form.${prop}" :placeholder="inputPlaceholder(${labelExpr})"${maxlengthAttr}${disabledAttr} />`,
2039
+ ` <el-input v-model="form.${prop}" :placeholder="formInputPlaceholder(${labelExpr}, ${disabledBool})"${maxlengthAttr}${disabledAttr} />`,
2034
2040
  ' </el-form-item>',
2035
2041
  ' </el-col>',
2036
2042
  ].join('\n');
@@ -2222,10 +2228,11 @@ function renderMultiLevelApiTs(model) {
2222
2228
  ].join('\n');
2223
2229
  }
2224
2230
 
2225
- function renderMultiLevelFormField(field) {
2226
- const labelExpr = `getFieldLabel('${field.attrName}')`;
2227
- const prop = field.attrName;
2228
- const disabledAttr = renderDisabledAttrV2(field);
2231
+ function renderMultiLevelFormField(field) {
2232
+ const labelExpr = `getFieldLabel('${field.attrName}')`;
2233
+ const prop = field.attrName;
2234
+ const disabledAttr = renderDisabledAttrV2(field);
2235
+ const disabledBool = renderDisabledBoolV2(field);
2229
2236
 
2230
2237
  if (isAttachmentLikeField(field)) {
2231
2238
  return [
@@ -2243,7 +2250,7 @@ function renderMultiLevelFormField(field) {
2243
2250
  renderFieldCommentV2(field),
2244
2251
  ' <el-col :span="12" class="mb20">',
2245
2252
  ` <el-form-item :label="${labelExpr}" prop="${prop}">`,
2246
- ` <el-select v-model="form.${prop}" :placeholder="selectPlaceholder(${labelExpr})" style="width: 100%"${disabledAttr}>`,
2253
+ ` <el-select v-model="form.${prop}" :placeholder="formSelectPlaceholder(${labelExpr}, ${disabledBool})" style="width: 100%"${disabledAttr}>`,
2247
2254
  ` <el-option v-for="item in getDictOptions(getFieldMeta('${prop}')?.dictType)" :key="item.value" :label="item.label" :value="item.value" />`,
2248
2255
  ' </el-select>',
2249
2256
  ' </el-form-item>',
@@ -2258,7 +2265,7 @@ function renderMultiLevelFormField(field) {
2258
2265
  renderFieldCommentV2(field),
2259
2266
  ' <el-col :span="12" class="mb20">',
2260
2267
  ` <el-form-item :label="${labelExpr}" prop="${prop}">`,
2261
- ` <el-input-number v-model="form.${prop}" :min="0"${max}${precision} :placeholder="inputPlaceholder(${labelExpr})" style="width: 100%"${disabledAttr} />`,
2268
+ ` <el-input-number v-model="form.${prop}" :min="0"${max}${precision} :placeholder="formInputPlaceholder(${labelExpr}, ${disabledBool})" style="width: 100%"${disabledAttr} />`,
2262
2269
  ' </el-form-item>',
2263
2270
  ' </el-col>',
2264
2271
  ].join('\n');
@@ -2271,7 +2278,7 @@ function renderMultiLevelFormField(field) {
2271
2278
  renderFieldCommentV2(field),
2272
2279
  ' <el-col :span="12" class="mb20">',
2273
2280
  ` <el-form-item :label="${labelExpr}" prop="${prop}">`,
2274
- ` <el-date-picker type="${pickerType}" :placeholder="inputPlaceholder(${labelExpr})" v-model="form.${prop}" :value-format="${formatName}" style="width: 100%"${disabledAttr}></el-date-picker>`,
2281
+ ` <el-date-picker type="${pickerType}" :placeholder="formInputPlaceholder(${labelExpr}, ${disabledBool})" v-model="form.${prop}" :value-format="${formatName}" style="width: 100%"${disabledAttr}></el-date-picker>`,
2275
2282
  ' </el-form-item>',
2276
2283
  ' </el-col>',
2277
2284
  ].join('\n');
@@ -2283,7 +2290,7 @@ function renderMultiLevelFormField(field) {
2283
2290
  renderFieldCommentV2(field),
2284
2291
  ' <el-col :span="24" class="mb20">',
2285
2292
  ` <el-form-item :label="${labelExpr}" prop="${prop}">`,
2286
- ` <el-input type="textarea" v-model="form.${prop}" :placeholder="inputPlaceholder(${labelExpr})"${textareaAttrs}${disabledAttr} />`,
2293
+ ` <el-input type="textarea" v-model="form.${prop}" :placeholder="formInputPlaceholder(${labelExpr}, ${disabledBool})"${textareaAttrs}${disabledAttr} />`,
2287
2294
  ' </el-form-item>',
2288
2295
  ' </el-col>',
2289
2296
  ].join('\n');
@@ -2293,7 +2300,7 @@ function renderMultiLevelFormField(field) {
2293
2300
  renderFieldCommentV2(field),
2294
2301
  ' <el-col :span="12" class="mb20">',
2295
2302
  ` <el-form-item :label="${labelExpr}" prop="${prop}">`,
2296
- ` <el-input v-model="form.${prop}" :placeholder="inputPlaceholder(${labelExpr})"${renderInputMaxlengthAttr(field)}${disabledAttr} />`,
2303
+ ` <el-input v-model="form.${prop}" :placeholder="formInputPlaceholder(${labelExpr}, ${disabledBool})"${renderInputMaxlengthAttr(field)}${disabledAttr} />`,
2297
2304
  ' </el-form-item>',
2298
2305
  ' </el-col>',
2299
2306
  ].join('\n');
@@ -2359,6 +2366,8 @@ ${moduleModel.visibleFields.map(renderMultiLevelFormField).join('\n')}
2359
2366
 
2360
2367
  // 字段标签、字典和校验提示
2361
2368
  const { getFieldMeta, getFieldLabel, getDictOptions, inputPlaceholder, selectPlaceholder, fieldRequiredMessage } = useCrudPageMeta(${fieldsMapExpr}, dictRefs);
2369
+ const formInputPlaceholder = (label: string, disabled = false) => (disabled ? '' : inputPlaceholder(label));
2370
+ const formSelectPlaceholder = (label: string, disabled = false) => (disabled ? '' : selectPlaceholder(label));
2362
2371
 
2363
2372
  // 统一维护表单默认值
2364
2373
  const createDefaultFormState = () => ({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "worsoft-frontend-codegen-local-mcp",
3
- "version": "0.1.54",
3
+ "version": "0.1.55",
4
4
  "description": "Worsoft frontend local-template code generation MCP server.",
5
5
  "license": "UNLICENSED",
6
6
  "author": "worsoft <sw@worsoft.vip>",