@webiny/app-headless-cms 6.6.0-alpha.3 → 6.6.0-alpha.5

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.
@@ -14,6 +14,7 @@ export declare const ModelFieldContext: React.Context<{
14
14
  validation?: (import("~/types.js").CmsModelFieldValidator | import("@webiny/validation/types").Validator)[];
15
15
  listValidation?: import("~/types.js").CmsModelFieldValidator[];
16
16
  list?: boolean;
17
+ disabled?: boolean;
17
18
  predefinedValues?: import("~/types.js").CmsEditorFieldPredefinedValues;
18
19
  settings?: import("~/types.js").CmsModelFieldSettings<unknown> | undefined;
19
20
  renderer: {
@@ -1,6 +1,6 @@
1
1
  import type { CmsErrorResponse, CmsModel } from "../../types.js";
2
- export declare const FIELDS_FIELDS = "\n id\n fieldId\n storageId\n type\n label\n tags\n placeholder\n description\n note\n help\n predefinedValues {\n enabled\n values {\n label\n value\n selected\n }\n }\n list\n renderer {\n name\n settings\n }\n validation {\n name\n settings\n message\n }\n listValidation {\n name\n settings\n message\n }\n settings\n rules {\n type\n target\n operator\n value\n action\n }\n";
3
- export declare const MODEL_FIELDS = "\n name\n group\n icon\n description\n modelId\n singularApiName\n pluralApiName\n savedOn\n createdBy {\n id\n displayName\n }\n titleFieldId\n descriptionFieldId\n imageFieldId\n layout\n tags\n fields {\n \n id\n fieldId\n storageId\n type\n label\n tags\n placeholder\n description\n note\n help\n predefinedValues {\n enabled\n values {\n label\n value\n selected\n }\n }\n list\n renderer {\n name\n settings\n }\n validation {\n name\n settings\n message\n }\n listValidation {\n name\n settings\n message\n }\n settings\n rules {\n type\n target\n operator\n value\n action\n }\n\n }\n plugin\n isBeingDeleted\n metadata { valuesSelection }\n settings\n";
2
+ export declare const FIELDS_FIELDS = "\n id\n fieldId\n storageId\n type\n label\n tags\n placeholder\n description\n note\n help\n predefinedValues {\n enabled\n values {\n label\n value\n selected\n }\n }\n list\n disabled\n renderer {\n name\n settings\n }\n validation {\n name\n settings\n message\n }\n listValidation {\n name\n settings\n message\n }\n settings\n rules {\n type\n target\n operator\n value\n action\n }\n";
3
+ export declare const MODEL_FIELDS = "\n name\n group\n icon\n description\n modelId\n singularApiName\n pluralApiName\n savedOn\n createdBy {\n id\n displayName\n }\n titleFieldId\n descriptionFieldId\n imageFieldId\n layout\n tags\n fields {\n \n id\n fieldId\n storageId\n type\n label\n tags\n placeholder\n description\n note\n help\n predefinedValues {\n enabled\n values {\n label\n value\n selected\n }\n }\n list\n disabled\n renderer {\n name\n settings\n }\n validation {\n name\n settings\n message\n }\n listValidation {\n name\n settings\n message\n }\n settings\n rules {\n type\n target\n operator\n value\n action\n }\n\n }\n plugin\n isBeingDeleted\n metadata { valuesSelection }\n settings\n";
4
4
  /**
5
5
  * ############################
6
6
  * Get Query
@@ -24,6 +24,7 @@ const FIELDS_FIELDS = `
24
24
  }
25
25
  }
26
26
  list
27
+ disabled
27
28
  renderer {
28
29
  name
29
30
  settings
@@ -1 +1 @@
1
- {"version":3,"file":"admin/graphql/contentModels.js","sources":["../../../src/admin/graphql/contentModels.ts"],"sourcesContent":["import gql from \"graphql-tag\";\nimport type { CmsErrorResponse, CmsModel } from \"~/types.js\";\n\nconst ERROR_FIELDS = `\n message\n code\n data\n`;\nexport const FIELDS_FIELDS = `\n id\n fieldId\n storageId\n type\n label\n tags\n placeholder\n description\n note\n help\n predefinedValues {\n enabled\n values {\n label\n value\n selected\n }\n }\n list\n renderer {\n name\n settings\n }\n validation {\n name\n settings\n message\n }\n listValidation {\n name\n settings\n message\n }\n settings\n rules {\n type\n target\n operator\n value\n action\n }\n`;\n\nexport const MODEL_FIELDS = `\n name\n group\n icon\n description\n modelId\n singularApiName\n pluralApiName\n savedOn\n createdBy {\n id\n displayName\n }\n titleFieldId\n descriptionFieldId\n imageFieldId\n layout\n tags\n fields {\n ${FIELDS_FIELDS}\n }\n plugin\n isBeingDeleted\n metadata { valuesSelection }\n settings\n`;\n/**\n * ############################\n * Get Query\n */\nexport interface GetCmsModelQueryResponse {\n getContentModel: {\n data?: CmsModel;\n error?: CmsErrorResponse;\n };\n}\nexport interface GetCmsModelQueryVariables {\n modelId: string;\n}\nexport const GET_CONTENT_MODEL = gql`\n query CmsGetContentModel($modelId: ID!) {\n getContentModel(modelId: $modelId) {\n data {\n ${MODEL_FIELDS}\n }\n error {\n ${ERROR_FIELDS}\n }\n }\n }\n`;\n\n/**\n * ############################\n * Update Mutation\n */\nexport interface UpdateCmsModelMutationResponse {\n updateContentModel: {\n data: CmsModel | null;\n error: CmsErrorResponse | null;\n };\n}\nexport interface UpdateCmsModelMutationVariables {\n modelId: string;\n // TODO @ts-refactor write the types.\n data: Partial<CmsModel>;\n}\nexport const UPDATE_CONTENT_MODEL = gql`\n mutation CmsUpdateContentModel($modelId: ID!, $data: CmsContentModelUpdateInput!) {\n updateContentModel(modelId: $modelId, data: $data) {\n data {\n ${MODEL_FIELDS}\n }\n error {\n ${ERROR_FIELDS}\n }\n }\n }\n`;\n"],"names":["ERROR_FIELDS","FIELDS_FIELDS","MODEL_FIELDS","GET_CONTENT_MODEL","gql","UPDATE_CONTENT_MODEL"],"mappings":";AAGA,MAAMA,eAAe,CAAC;;;;AAItB,CAAC;AACM,MAAMC,gBAAgB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0C9B,CAAC;AAEM,MAAMC,eAAe,CAAC;;;;;;;;;;;;;;;;;;;QAmBrB,EAAED,cAAc;;;;;;AAMxB,CAAC;AAcM,MAAME,oBAAoBC,WAAG,CAAC;;;;gBAIrB,EAAEF,aAAa;;;gBAGf,EAAEF,aAAa;;;;AAI/B,CAAC;AAiBM,MAAMK,uBAAuBD,WAAG,CAAC;;;;gBAIxB,EAAEF,aAAa;;;gBAGf,EAAEF,aAAa;;;;AAI/B,CAAC"}
1
+ {"version":3,"file":"admin/graphql/contentModels.js","sources":["../../../src/admin/graphql/contentModels.ts"],"sourcesContent":["import gql from \"graphql-tag\";\nimport type { CmsErrorResponse, CmsModel } from \"~/types.js\";\n\nconst ERROR_FIELDS = `\n message\n code\n data\n`;\nexport const FIELDS_FIELDS = `\n id\n fieldId\n storageId\n type\n label\n tags\n placeholder\n description\n note\n help\n predefinedValues {\n enabled\n values {\n label\n value\n selected\n }\n }\n list\n disabled\n renderer {\n name\n settings\n }\n validation {\n name\n settings\n message\n }\n listValidation {\n name\n settings\n message\n }\n settings\n rules {\n type\n target\n operator\n value\n action\n }\n`;\n\nexport const MODEL_FIELDS = `\n name\n group\n icon\n description\n modelId\n singularApiName\n pluralApiName\n savedOn\n createdBy {\n id\n displayName\n }\n titleFieldId\n descriptionFieldId\n imageFieldId\n layout\n tags\n fields {\n ${FIELDS_FIELDS}\n }\n plugin\n isBeingDeleted\n metadata { valuesSelection }\n settings\n`;\n/**\n * ############################\n * Get Query\n */\nexport interface GetCmsModelQueryResponse {\n getContentModel: {\n data?: CmsModel;\n error?: CmsErrorResponse;\n };\n}\nexport interface GetCmsModelQueryVariables {\n modelId: string;\n}\nexport const GET_CONTENT_MODEL = gql`\n query CmsGetContentModel($modelId: ID!) {\n getContentModel(modelId: $modelId) {\n data {\n ${MODEL_FIELDS}\n }\n error {\n ${ERROR_FIELDS}\n }\n }\n }\n`;\n\n/**\n * ############################\n * Update Mutation\n */\nexport interface UpdateCmsModelMutationResponse {\n updateContentModel: {\n data: CmsModel | null;\n error: CmsErrorResponse | null;\n };\n}\nexport interface UpdateCmsModelMutationVariables {\n modelId: string;\n // TODO @ts-refactor write the types.\n data: Partial<CmsModel>;\n}\nexport const UPDATE_CONTENT_MODEL = gql`\n mutation CmsUpdateContentModel($modelId: ID!, $data: CmsContentModelUpdateInput!) {\n updateContentModel(modelId: $modelId, data: $data) {\n data {\n ${MODEL_FIELDS}\n }\n error {\n ${ERROR_FIELDS}\n }\n }\n }\n`;\n"],"names":["ERROR_FIELDS","FIELDS_FIELDS","MODEL_FIELDS","GET_CONTENT_MODEL","gql","UPDATE_CONTENT_MODEL"],"mappings":";AAGA,MAAMA,eAAe,CAAC;;;;AAItB,CAAC;AACM,MAAMC,gBAAgB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2C9B,CAAC;AAEM,MAAMC,eAAe,CAAC;;;;;;;;;;;;;;;;;;;QAmBrB,EAAED,cAAc;;;;;;AAMxB,CAAC;AAcM,MAAME,oBAAoBC,WAAG,CAAC;;;;gBAIrB,EAAEF,aAAa;;;gBAGf,EAAEF,aAAa;;;;AAI/B,CAAC;AAiBM,MAAMK,uBAAuBD,WAAG,CAAC;;;;gBAIxB,EAAEF,aAAa;;;gBAGf,EAAEF,aAAa;;;;AAI/B,CAAC"}
@@ -9,6 +9,7 @@ function applyFieldProps(builder, field, rendererMap) {
9
9
  if (Array.isArray(field.tags)) builder.tags(field.tags);
10
10
  if (field.settings?.defaultValue != null) builder.defaultValue(field.settings.defaultValue);
11
11
  if (field.list) builder.list();
12
+ if (field.disabled) builder.disabled(true);
12
13
  if (field.predefinedValues?.enabled && field.predefinedValues.values) {
13
14
  const optionsBuilder = builder;
14
15
  if ("function" == typeof optionsBuilder.options) optionsBuilder.options(field.predefinedValues.values.map((v)=>({
@@ -1 +1 @@
1
- {"version":3,"file":"features/formModel/mappers/applyFieldProps.js","sources":["../../../../src/features/formModel/mappers/applyFieldProps.ts"],"sourcesContent":["import { z } from \"zod\";\nimport type { IFieldBuilder } from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport type { CmsModelField } from \"~/types.js\";\nimport { mapCmsValidators, mapCmsListValidators } from \"../CmsValidationMapper.js\";\n\nexport function applyFieldProps(\n builder: IFieldBuilder,\n field: CmsModelField,\n rendererMap: Map<string, string>\n): IFieldBuilder {\n if (field.label) {\n builder.label(field.label);\n }\n if (field.help) {\n builder.help(String(field.help));\n }\n if (field.description) {\n builder.description(String(field.description));\n }\n if (field.note) {\n builder.note(String(field.note));\n }\n if (field.placeholder) {\n builder.placeholder(field.placeholder);\n }\n\n if (Array.isArray(field.tags)) {\n builder.tags(field.tags);\n }\n\n if (field.settings?.defaultValue != null) {\n builder.defaultValue(field.settings.defaultValue);\n }\n\n if (field.list) {\n builder.list();\n }\n\n if (field.predefinedValues?.enabled && field.predefinedValues.values) {\n const optionsBuilder = builder as any;\n if (typeof optionsBuilder.options === \"function\") {\n optionsBuilder.options(\n field.predefinedValues.values.map(\n (v: { label: string; value: string; selected?: boolean }) => ({\n label: v.label,\n value: v.value\n })\n )\n );\n }\n }\n\n if (field.list) {\n const itemResult = mapCmsValidators(field.validation);\n const listResult = mapCmsListValidators(field.listValidation);\n\n if (itemResult.required || listResult.required) {\n builder.required(itemResult.requiredMessage || listResult.requiredMessage);\n }\n\n const itemSchema = itemResult.schema ? z.array(itemResult.schema) : null;\n const listSchema = listResult.schema;\n\n if (itemSchema && listSchema) {\n builder.schema(z.intersection(itemSchema, listSchema));\n } else if (itemSchema) {\n builder.schema(itemSchema);\n } else if (listSchema) {\n builder.schema(listSchema);\n }\n } else {\n const { required, requiredMessage, schema } = mapCmsValidators(field.validation);\n if (required) {\n builder.required(requiredMessage);\n }\n if (schema) {\n builder.schema(schema);\n }\n }\n\n if (field.renderer && typeof field.renderer === \"object\") {\n const mappedRenderer = rendererMap.get(field.renderer.name);\n if (mappedRenderer) {\n builder.renderer(mappedRenderer as any, field.renderer.settings);\n }\n }\n\n if (field.rules && field.rules.length > 0) {\n builder.rules(\n field.rules.map(r => ({\n type: r.type,\n target: r.target,\n operator: r.operator,\n value: r.value != null ? String(r.value) : null,\n action: r.action as \"hide\" | \"disable\"\n }))\n );\n }\n\n if (field.tags && field.tags.length > 0) {\n builder.tags(field.tags);\n }\n\n return builder;\n}\n"],"names":["applyFieldProps","builder","field","rendererMap","String","Array","optionsBuilder","v","itemResult","mapCmsValidators","listResult","mapCmsListValidators","itemSchema","z","listSchema","required","requiredMessage","schema","mappedRenderer","r"],"mappings":";;AAKO,SAASA,gBACZC,OAAsB,EACtBC,KAAoB,EACpBC,WAAgC;IAEhC,IAAID,MAAM,KAAK,EACXD,QAAQ,KAAK,CAACC,MAAM,KAAK;IAE7B,IAAIA,MAAM,IAAI,EACVD,QAAQ,IAAI,CAACG,OAAOF,MAAM,IAAI;IAElC,IAAIA,MAAM,WAAW,EACjBD,QAAQ,WAAW,CAACG,OAAOF,MAAM,WAAW;IAEhD,IAAIA,MAAM,IAAI,EACVD,QAAQ,IAAI,CAACG,OAAOF,MAAM,IAAI;IAElC,IAAIA,MAAM,WAAW,EACjBD,QAAQ,WAAW,CAACC,MAAM,WAAW;IAGzC,IAAIG,MAAM,OAAO,CAACH,MAAM,IAAI,GACxBD,QAAQ,IAAI,CAACC,MAAM,IAAI;IAG3B,IAAIA,MAAM,QAAQ,EAAE,gBAAgB,MAChCD,QAAQ,YAAY,CAACC,MAAM,QAAQ,CAAC,YAAY;IAGpD,IAAIA,MAAM,IAAI,EACVD,QAAQ,IAAI;IAGhB,IAAIC,MAAM,gBAAgB,EAAE,WAAWA,MAAM,gBAAgB,CAAC,MAAM,EAAE;QAClE,MAAMI,iBAAiBL;QACvB,IAAI,AAAkC,cAAlC,OAAOK,eAAe,OAAO,EAC7BA,eAAe,OAAO,CAClBJ,MAAM,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAC7B,CAACK,IAA6D;gBAC1D,OAAOA,EAAE,KAAK;gBACd,OAAOA,EAAE,KAAK;YAClB;IAIhB;IAEA,IAAIL,MAAM,IAAI,EAAE;QACZ,MAAMM,aAAaC,iBAAiBP,MAAM,UAAU;QACpD,MAAMQ,aAAaC,qBAAqBT,MAAM,cAAc;QAE5D,IAAIM,WAAW,QAAQ,IAAIE,WAAW,QAAQ,EAC1CT,QAAQ,QAAQ,CAACO,WAAW,eAAe,IAAIE,WAAW,eAAe;QAG7E,MAAME,aAAaJ,WAAW,MAAM,GAAGK,EAAE,KAAK,CAACL,WAAW,MAAM,IAAI;QACpE,MAAMM,aAAaJ,WAAW,MAAM;QAEpC,IAAIE,cAAcE,YACdb,QAAQ,MAAM,CAACY,EAAE,YAAY,CAACD,YAAYE;aACvC,IAAIF,YACPX,QAAQ,MAAM,CAACW;aACZ,IAAIE,YACPb,QAAQ,MAAM,CAACa;IAEvB,OAAO;QACH,MAAM,EAAEC,QAAQ,EAAEC,eAAe,EAAEC,MAAM,EAAE,GAAGR,iBAAiBP,MAAM,UAAU;QAC/E,IAAIa,UACAd,QAAQ,QAAQ,CAACe;QAErB,IAAIC,QACAhB,QAAQ,MAAM,CAACgB;IAEvB;IAEA,IAAIf,MAAM,QAAQ,IAAI,AAA0B,YAA1B,OAAOA,MAAM,QAAQ,EAAe;QACtD,MAAMgB,iBAAiBf,YAAY,GAAG,CAACD,MAAM,QAAQ,CAAC,IAAI;QAC1D,IAAIgB,gBACAjB,QAAQ,QAAQ,CAACiB,gBAAuBhB,MAAM,QAAQ,CAAC,QAAQ;IAEvE;IAEA,IAAIA,MAAM,KAAK,IAAIA,MAAM,KAAK,CAAC,MAAM,GAAG,GACpCD,QAAQ,KAAK,CACTC,MAAM,KAAK,CAAC,GAAG,CAACiB,CAAAA,IAAM;YAClB,MAAMA,EAAE,IAAI;YACZ,QAAQA,EAAE,MAAM;YAChB,UAAUA,EAAE,QAAQ;YACpB,OAAOA,AAAW,QAAXA,EAAE,KAAK,GAAWf,OAAOe,EAAE,KAAK,IAAI;YAC3C,QAAQA,EAAE,MAAM;QACpB;IAIR,IAAIjB,MAAM,IAAI,IAAIA,MAAM,IAAI,CAAC,MAAM,GAAG,GAClCD,QAAQ,IAAI,CAACC,MAAM,IAAI;IAG3B,OAAOD;AACX"}
1
+ {"version":3,"file":"features/formModel/mappers/applyFieldProps.js","sources":["../../../../src/features/formModel/mappers/applyFieldProps.ts"],"sourcesContent":["import { z } from \"zod\";\nimport type { IFieldBuilder } from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport type { CmsModelField } from \"~/types.js\";\nimport { mapCmsValidators, mapCmsListValidators } from \"../CmsValidationMapper.js\";\n\nexport function applyFieldProps(\n builder: IFieldBuilder,\n field: CmsModelField,\n rendererMap: Map<string, string>\n): IFieldBuilder {\n if (field.label) {\n builder.label(field.label);\n }\n if (field.help) {\n builder.help(String(field.help));\n }\n if (field.description) {\n builder.description(String(field.description));\n }\n if (field.note) {\n builder.note(String(field.note));\n }\n if (field.placeholder) {\n builder.placeholder(field.placeholder);\n }\n\n if (Array.isArray(field.tags)) {\n builder.tags(field.tags);\n }\n\n if (field.settings?.defaultValue != null) {\n builder.defaultValue(field.settings.defaultValue);\n }\n\n if (field.list) {\n builder.list();\n }\n\n if (field.disabled) {\n builder.disabled(true);\n }\n\n if (field.predefinedValues?.enabled && field.predefinedValues.values) {\n const optionsBuilder = builder as any;\n if (typeof optionsBuilder.options === \"function\") {\n optionsBuilder.options(\n field.predefinedValues.values.map(\n (v: { label: string; value: string; selected?: boolean }) => ({\n label: v.label,\n value: v.value\n })\n )\n );\n }\n }\n\n if (field.list) {\n const itemResult = mapCmsValidators(field.validation);\n const listResult = mapCmsListValidators(field.listValidation);\n\n if (itemResult.required || listResult.required) {\n builder.required(itemResult.requiredMessage || listResult.requiredMessage);\n }\n\n const itemSchema = itemResult.schema ? z.array(itemResult.schema) : null;\n const listSchema = listResult.schema;\n\n if (itemSchema && listSchema) {\n builder.schema(z.intersection(itemSchema, listSchema));\n } else if (itemSchema) {\n builder.schema(itemSchema);\n } else if (listSchema) {\n builder.schema(listSchema);\n }\n } else {\n const { required, requiredMessage, schema } = mapCmsValidators(field.validation);\n if (required) {\n builder.required(requiredMessage);\n }\n if (schema) {\n builder.schema(schema);\n }\n }\n\n if (field.renderer && typeof field.renderer === \"object\") {\n const mappedRenderer = rendererMap.get(field.renderer.name);\n if (mappedRenderer) {\n builder.renderer(mappedRenderer as any, field.renderer.settings);\n }\n }\n\n if (field.rules && field.rules.length > 0) {\n builder.rules(\n field.rules.map(r => ({\n type: r.type,\n target: r.target,\n operator: r.operator,\n value: r.value != null ? String(r.value) : null,\n action: r.action as \"hide\" | \"disable\"\n }))\n );\n }\n\n if (field.tags && field.tags.length > 0) {\n builder.tags(field.tags);\n }\n\n return builder;\n}\n"],"names":["applyFieldProps","builder","field","rendererMap","String","Array","optionsBuilder","v","itemResult","mapCmsValidators","listResult","mapCmsListValidators","itemSchema","z","listSchema","required","requiredMessage","schema","mappedRenderer","r"],"mappings":";;AAKO,SAASA,gBACZC,OAAsB,EACtBC,KAAoB,EACpBC,WAAgC;IAEhC,IAAID,MAAM,KAAK,EACXD,QAAQ,KAAK,CAACC,MAAM,KAAK;IAE7B,IAAIA,MAAM,IAAI,EACVD,QAAQ,IAAI,CAACG,OAAOF,MAAM,IAAI;IAElC,IAAIA,MAAM,WAAW,EACjBD,QAAQ,WAAW,CAACG,OAAOF,MAAM,WAAW;IAEhD,IAAIA,MAAM,IAAI,EACVD,QAAQ,IAAI,CAACG,OAAOF,MAAM,IAAI;IAElC,IAAIA,MAAM,WAAW,EACjBD,QAAQ,WAAW,CAACC,MAAM,WAAW;IAGzC,IAAIG,MAAM,OAAO,CAACH,MAAM,IAAI,GACxBD,QAAQ,IAAI,CAACC,MAAM,IAAI;IAG3B,IAAIA,MAAM,QAAQ,EAAE,gBAAgB,MAChCD,QAAQ,YAAY,CAACC,MAAM,QAAQ,CAAC,YAAY;IAGpD,IAAIA,MAAM,IAAI,EACVD,QAAQ,IAAI;IAGhB,IAAIC,MAAM,QAAQ,EACdD,QAAQ,QAAQ,CAAC;IAGrB,IAAIC,MAAM,gBAAgB,EAAE,WAAWA,MAAM,gBAAgB,CAAC,MAAM,EAAE;QAClE,MAAMI,iBAAiBL;QACvB,IAAI,AAAkC,cAAlC,OAAOK,eAAe,OAAO,EAC7BA,eAAe,OAAO,CAClBJ,MAAM,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAC7B,CAACK,IAA6D;gBAC1D,OAAOA,EAAE,KAAK;gBACd,OAAOA,EAAE,KAAK;YAClB;IAIhB;IAEA,IAAIL,MAAM,IAAI,EAAE;QACZ,MAAMM,aAAaC,iBAAiBP,MAAM,UAAU;QACpD,MAAMQ,aAAaC,qBAAqBT,MAAM,cAAc;QAE5D,IAAIM,WAAW,QAAQ,IAAIE,WAAW,QAAQ,EAC1CT,QAAQ,QAAQ,CAACO,WAAW,eAAe,IAAIE,WAAW,eAAe;QAG7E,MAAME,aAAaJ,WAAW,MAAM,GAAGK,EAAE,KAAK,CAACL,WAAW,MAAM,IAAI;QACpE,MAAMM,aAAaJ,WAAW,MAAM;QAEpC,IAAIE,cAAcE,YACdb,QAAQ,MAAM,CAACY,EAAE,YAAY,CAACD,YAAYE;aACvC,IAAIF,YACPX,QAAQ,MAAM,CAACW;aACZ,IAAIE,YACPb,QAAQ,MAAM,CAACa;IAEvB,OAAO;QACH,MAAM,EAAEC,QAAQ,EAAEC,eAAe,EAAEC,MAAM,EAAE,GAAGR,iBAAiBP,MAAM,UAAU;QAC/E,IAAIa,UACAd,QAAQ,QAAQ,CAACe;QAErB,IAAIC,QACAhB,QAAQ,MAAM,CAACgB;IAEvB;IAEA,IAAIf,MAAM,QAAQ,IAAI,AAA0B,YAA1B,OAAOA,MAAM,QAAQ,EAAe;QACtD,MAAMgB,iBAAiBf,YAAY,GAAG,CAACD,MAAM,QAAQ,CAAC,IAAI;QAC1D,IAAIgB,gBACAjB,QAAQ,QAAQ,CAACiB,gBAAuBhB,MAAM,QAAQ,CAAC,QAAQ;IAEvE;IAEA,IAAIA,MAAM,KAAK,IAAIA,MAAM,KAAK,CAAC,MAAM,GAAG,GACpCD,QAAQ,KAAK,CACTC,MAAM,KAAK,CAAC,GAAG,CAACiB,CAAAA,IAAM;YAClB,MAAMA,EAAE,IAAI;YACZ,QAAQA,EAAE,MAAM;YAChB,UAAUA,EAAE,QAAQ;YACpB,OAAOA,AAAW,QAAXA,EAAE,KAAK,GAAWf,OAAOe,EAAE,KAAK,IAAI;YAC3C,QAAQA,EAAE,MAAM;QACpB;IAIR,IAAIjB,MAAM,IAAI,IAAIA,MAAM,IAAI,CAAC,MAAM,GAAG,GAClCD,QAAQ,IAAI,CAACC,MAAM,IAAI;IAG3B,OAAOD;AACX"}
@@ -0,0 +1,57 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { Container } from "@webiny/di";
3
+ import { FormModelFeature } from "@webiny/app-admin/features/formModel/feature.js";
4
+ import { FormModelFactory } from "@webiny/app-admin/features/formModel/abstractions.js";
5
+ import { applyFieldProps } from "./applyFieldProps.js";
6
+ const createField = (overrides)=>({
7
+ id: "externalId",
8
+ fieldId: "externalId",
9
+ storageId: "text@externalId",
10
+ type: "text",
11
+ label: "External ID",
12
+ renderer: {
13
+ name: "text-input"
14
+ },
15
+ validation: [],
16
+ listValidation: [],
17
+ ...overrides
18
+ });
19
+ const buildForm = (field)=>{
20
+ const container = new Container();
21
+ FormModelFeature.register(container);
22
+ return container.resolve(FormModelFactory).create({
23
+ fields: (registry)=>({
24
+ [field.fieldId]: applyFieldProps(registry.text(), field, new Map())
25
+ })
26
+ });
27
+ };
28
+ describe("applyFieldProps disabled", ()=>{
29
+ it("disables the form field when the model field is disabled", ()=>{
30
+ const form = buildForm(createField({
31
+ disabled: true
32
+ }));
33
+ expect(form.field("externalId").disabled).toBe(true);
34
+ });
35
+ it("leaves the field editable when disabled is false or absent", ()=>{
36
+ expect(buildForm(createField({
37
+ disabled: false
38
+ })).field("externalId").disabled).toBe(false);
39
+ expect(buildForm(createField({})).field("externalId").disabled).toBe(false);
40
+ });
41
+ it("keeps the field visible", ()=>{
42
+ const form = buildForm(createField({
43
+ disabled: true
44
+ }));
45
+ expect(form.field("externalId").visible).toBe(true);
46
+ });
47
+ it("does not stop the field from holding a value", ()=>{
48
+ const form = buildForm(createField({
49
+ disabled: true
50
+ }));
51
+ form.field("externalId").setValue("abc-123");
52
+ expect(form.field("externalId").getValue()).toBe("abc-123");
53
+ expect(form.field("externalId").disabled).toBe(true);
54
+ });
55
+ });
56
+
57
+ //# sourceMappingURL=applyFieldProps.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/formModel/mappers/applyFieldProps.test.js","sources":["../../../../src/features/formModel/mappers/applyFieldProps.test.ts"],"sourcesContent":["import { describe, it, expect } from \"vitest\";\nimport { Container } from \"@webiny/di\";\nimport { FormModelFeature } from \"@webiny/app-admin/features/formModel/feature.js\";\nimport { FormModelFactory } from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport { applyFieldProps } from \"./applyFieldProps.js\";\nimport type { CmsModelField } from \"~/types.js\";\n\nconst createField = (overrides: Partial<CmsModelField>): CmsModelField =>\n ({\n id: \"externalId\",\n fieldId: \"externalId\",\n storageId: \"text@externalId\",\n type: \"text\",\n label: \"External ID\",\n renderer: { name: \"text-input\" },\n validation: [],\n listValidation: [],\n ...overrides\n }) as CmsModelField;\n\n/**\n * Builds a one-field form the way CmsFormModelBuilder does, so we assert on the\n * field the entry form actually renders rather than on the builder in isolation.\n */\nconst buildForm = (field: CmsModelField) => {\n const container = new Container();\n FormModelFeature.register(container);\n\n return container.resolve(FormModelFactory).create({\n fields: registry => ({\n [field.fieldId]: applyFieldProps(registry.text(), field, new Map())\n })\n });\n};\n\ndescribe(\"applyFieldProps disabled\", () => {\n it(\"disables the form field when the model field is disabled\", () => {\n const form = buildForm(createField({ disabled: true }));\n\n expect(form.field(\"externalId\").disabled).toBe(true);\n });\n\n it(\"leaves the field editable when disabled is false or absent\", () => {\n expect(buildForm(createField({ disabled: false })).field(\"externalId\").disabled).toBe(\n false\n );\n expect(buildForm(createField({})).field(\"externalId\").disabled).toBe(false);\n });\n\n it(\"keeps the field visible\", () => {\n const form = buildForm(createField({ disabled: true }));\n\n expect(form.field(\"externalId\").visible).toBe(true);\n });\n\n it(\"does not stop the field from holding a value\", () => {\n const form = buildForm(createField({ disabled: true }));\n form.field(\"externalId\").setValue(\"abc-123\");\n\n expect(form.field(\"externalId\").getValue()).toBe(\"abc-123\");\n expect(form.field(\"externalId\").disabled).toBe(true);\n });\n});\n"],"names":["createField","overrides","buildForm","field","container","Container","FormModelFeature","FormModelFactory","registry","applyFieldProps","Map","describe","it","form","expect"],"mappings":";;;;;AAOA,MAAMA,cAAc,CAACC,YAChB;QACG,IAAI;QACJ,SAAS;QACT,WAAW;QACX,MAAM;QACN,OAAO;QACP,UAAU;YAAE,MAAM;QAAa;QAC/B,YAAY,EAAE;QACd,gBAAgB,EAAE;QAClB,GAAGA,SAAS;IAChB;AAMJ,MAAMC,YAAY,CAACC;IACf,MAAMC,YAAY,IAAIC;IACtBC,iBAAiB,QAAQ,CAACF;IAE1B,OAAOA,UAAU,OAAO,CAACG,kBAAkB,MAAM,CAAC;QAC9C,QAAQC,CAAAA,WAAa;gBACjB,CAACL,MAAM,OAAO,CAAC,EAAEM,gBAAgBD,SAAS,IAAI,IAAIL,OAAO,IAAIO;YACjE;IACJ;AACJ;AAEAC,SAAS,4BAA4B;IACjCC,GAAG,4DAA4D;QAC3D,MAAMC,OAAOX,UAAUF,YAAY;YAAE,UAAU;QAAK;QAEpDc,OAAOD,KAAK,KAAK,CAAC,cAAc,QAAQ,EAAE,IAAI,CAAC;IACnD;IAEAD,GAAG,8DAA8D;QAC7DE,OAAOZ,UAAUF,YAAY;YAAE,UAAU;QAAM,IAAI,KAAK,CAAC,cAAc,QAAQ,EAAE,IAAI,CACjF;QAEJc,OAAOZ,UAAUF,YAAY,CAAC,IAAI,KAAK,CAAC,cAAc,QAAQ,EAAE,IAAI,CAAC;IACzE;IAEAY,GAAG,2BAA2B;QAC1B,MAAMC,OAAOX,UAAUF,YAAY;YAAE,UAAU;QAAK;QAEpDc,OAAOD,KAAK,KAAK,CAAC,cAAc,OAAO,EAAE,IAAI,CAAC;IAClD;IAEAD,GAAG,gDAAgD;QAC/C,MAAMC,OAAOX,UAAUF,YAAY;YAAE,UAAU;QAAK;QACpDa,KAAK,KAAK,CAAC,cAAc,QAAQ,CAAC;QAElCC,OAAOD,KAAK,KAAK,CAAC,cAAc,QAAQ,IAAI,IAAI,CAAC;QACjDC,OAAOD,KAAK,KAAK,CAAC,cAAc,QAAQ,EAAE,IAAI,CAAC;IACnD;AACJ"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webiny/app-headless-cms",
3
- "version": "6.6.0-alpha.3",
3
+ "version": "6.6.0-alpha.5",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./index.js",
@@ -28,24 +28,24 @@
28
28
  "@fortawesome/react-fontawesome": "3.5.0",
29
29
  "@lexical/utils": "0.49.0",
30
30
  "@types/react": "18.3.31",
31
- "@webiny/admin-ui": "6.6.0-alpha.3",
32
- "@webiny/app": "6.6.0-alpha.3",
33
- "@webiny/app-aco": "6.6.0-alpha.3",
34
- "@webiny/app-admin": "6.6.0-alpha.3",
35
- "@webiny/app-graphql-playground": "6.6.0-alpha.3",
36
- "@webiny/app-headless-cms-common": "6.6.0-alpha.3",
37
- "@webiny/cms-sdk": "6.6.0-alpha.3",
31
+ "@webiny/admin-ui": "6.6.0-alpha.5",
32
+ "@webiny/app": "6.6.0-alpha.5",
33
+ "@webiny/app-aco": "6.6.0-alpha.5",
34
+ "@webiny/app-admin": "6.6.0-alpha.5",
35
+ "@webiny/app-graphql-playground": "6.6.0-alpha.5",
36
+ "@webiny/app-headless-cms-common": "6.6.0-alpha.5",
37
+ "@webiny/cms-sdk": "6.6.0-alpha.5",
38
38
  "@webiny/di": "1.1.0",
39
- "@webiny/feature": "6.6.0-alpha.3",
40
- "@webiny/form": "6.6.0-alpha.3",
41
- "@webiny/icons": "6.6.0-alpha.3",
42
- "@webiny/lexical-editor": "6.6.0-alpha.3",
43
- "@webiny/lexical-nodes": "6.6.0-alpha.3",
44
- "@webiny/plugins": "6.6.0-alpha.3",
45
- "@webiny/react-composition": "6.6.0-alpha.3",
46
- "@webiny/react-properties": "6.6.0-alpha.3",
47
- "@webiny/utils": "6.6.0-alpha.3",
48
- "@webiny/validation": "6.6.0-alpha.3",
39
+ "@webiny/feature": "6.6.0-alpha.5",
40
+ "@webiny/form": "6.6.0-alpha.5",
41
+ "@webiny/icons": "6.6.0-alpha.5",
42
+ "@webiny/lexical-editor": "6.6.0-alpha.5",
43
+ "@webiny/lexical-nodes": "6.6.0-alpha.5",
44
+ "@webiny/plugins": "6.6.0-alpha.5",
45
+ "@webiny/react-composition": "6.6.0-alpha.5",
46
+ "@webiny/react-properties": "6.6.0-alpha.5",
47
+ "@webiny/utils": "6.6.0-alpha.5",
48
+ "@webiny/validation": "6.6.0-alpha.5",
49
49
  "dot-prop-immutable": "2.1.1",
50
50
  "graphql": "16.14.2",
51
51
  "graphql-tag": "2.12.7",
@@ -61,7 +61,7 @@
61
61
  "zod": "4.4.3"
62
62
  },
63
63
  "devDependencies": {
64
- "@webiny/build-tools": "6.6.0-alpha.3",
64
+ "@webiny/build-tools": "6.6.0-alpha.5",
65
65
  "rimraf": "6.1.3",
66
66
  "typescript": "7.0.2",
67
67
  "vitest": "4.1.11"
@@ -1,7 +1,7 @@
1
1
  import { CmsFieldEditorGroup } from "../abstractions.js";
2
2
  import type { ICmsFieldEditorFormBuilder, ICmsFieldEditorContext } from "../abstractions.js";
3
3
  import type { CmsModelField } from "../../../types.js";
4
- declare class GeneralGroupImpl implements CmsFieldEditorGroup.Interface {
4
+ export declare class GeneralGroupImpl implements CmsFieldEditorGroup.Interface {
5
5
  name: string;
6
6
  label: string;
7
7
  buildForm(form: ICmsFieldEditorFormBuilder, context: ICmsFieldEditorContext): void;
@@ -10,6 +10,7 @@ declare class GeneralGroupImpl implements CmsFieldEditorGroup.Interface {
10
10
  fieldId: string;
11
11
  list: boolean;
12
12
  predefinedValuesEnabled: boolean;
13
+ disabled: boolean;
13
14
  description: string | number | boolean | Iterable<import("react").ReactNode> | import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>>;
14
15
  note: string | number | boolean | Iterable<import("react").ReactNode> | import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>>;
15
16
  help: string | number | boolean | Iterable<import("react").ReactNode> | import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>>;
@@ -20,4 +21,3 @@ declare class GeneralGroupImpl implements CmsFieldEditorGroup.Interface {
20
21
  export declare const GeneralGroup: typeof GeneralGroupImpl & {
21
22
  __abstraction: import("@webiny/di").Abstraction<import("../abstractions.js").ICmsFieldEditorGroup>;
22
23
  };
23
- export {};
@@ -18,6 +18,7 @@ class GeneralGroupImpl {
18
18
  fieldId: fieldIdBuilder,
19
19
  list: fields.boolean().label(fieldType.listLabel || "Use as a list").disabled(!fieldType.allowList),
20
20
  predefinedValuesEnabled: fields.boolean().label("Use predefined values").disabled(!fieldType.allowPredefinedValues),
21
+ disabled: fields.boolean().label("Disabled").description("Shows the value but doesn't let editors change it. Only useful when something else writes it, such as your code or an integration calling the API."),
21
22
  description: fields.text().label("Description").description("This text will be shown below the label (optional)"),
22
23
  note: fields.text().label("Note").description("This text will be shown below the input (optional)"),
23
24
  help: fields.text().label("Help").renderer("textarea").description("This text will be shown in a tooltip (optional)"),
@@ -27,6 +28,7 @@ class GeneralGroupImpl {
27
28
  form.layout((layout)=>[
28
29
  layout.row("label", "fieldId"),
29
30
  layout.row("list", "predefinedValuesEnabled"),
31
+ layout.row("disabled"),
30
32
  layout.row("description"),
31
33
  layout.row("note"),
32
34
  layout.row("help"),
@@ -39,6 +41,7 @@ class GeneralGroupImpl {
39
41
  fieldId: field.fieldId ?? "",
40
42
  list: field.list ?? false,
41
43
  predefinedValuesEnabled: field.predefinedValues?.enabled ?? false,
44
+ disabled: field.disabled ?? false,
42
45
  description: field.description ?? "",
43
46
  note: field.note ?? "",
44
47
  help: field.help ?? "",
@@ -54,6 +57,7 @@ class GeneralGroupImpl {
54
57
  values: []
55
58
  };
56
59
  field.predefinedValues.enabled = formData.predefinedValuesEnabled;
60
+ field.disabled = formData.disabled;
57
61
  field.description = formData.description;
58
62
  field.note = formData.note;
59
63
  field.help = formData.help;
@@ -68,6 +72,6 @@ const GeneralGroup = CmsFieldEditorGroup.createImplementation({
68
72
  implementation: GeneralGroupImpl,
69
73
  dependencies: []
70
74
  });
71
- export { GeneralGroup };
75
+ export { GeneralGroup, GeneralGroupImpl };
72
76
 
73
77
  //# sourceMappingURL=GeneralGroup.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"presentation/fieldEditor/groups/GeneralGroup.js","sources":["../../../../src/presentation/fieldEditor/groups/GeneralGroup.ts"],"sourcesContent":["import zod from \"zod\";\nimport camelCase from \"lodash/camelCase.js\";\nimport { CmsFieldEditorGroup } from \"../abstractions.js\";\nimport type { ICmsFieldEditorFormBuilder, ICmsFieldEditorContext } from \"../abstractions.js\";\nimport type { CmsModelField } from \"~/types.js\";\n\nconst fieldIdSchema = zod\n .string()\n .max(100)\n .regex(/^!?[a-zA-Z]/, { message: \"Must not start with a number.\" })\n .regex(/^(^[a-zA-Z0-9]+)$/, { message: \"Must be alphanumeric string.\" });\n\nclass GeneralGroupImpl implements CmsFieldEditorGroup.Interface {\n name = \"general\";\n label = \"General\";\n\n buildForm(form: ICmsFieldEditorFormBuilder, context: ICmsFieldEditorContext) {\n const { fieldType, field } = context;\n const isNewField = !field.id;\n\n form.fields(fields => {\n const fieldIdBuilder = fields\n .text()\n .label(\"Field ID\")\n .required()\n .schema(fieldIdSchema)\n .beforeChange(value => String(value).trim());\n\n if (isNewField) {\n fieldIdBuilder.computedUntilDirty(({ form }) => {\n return camelCase(String(form.field(\"general.label\").getValue() || \"\"));\n });\n }\n\n return {\n label: fields.text().label(\"Label\").required().autoFocus(),\n fieldId: fieldIdBuilder,\n list: fields\n .boolean()\n .label(fieldType.listLabel || \"Use as a list\")\n .disabled(!fieldType.allowList),\n predefinedValuesEnabled: fields\n .boolean()\n .label(\"Use predefined values\")\n .disabled(!fieldType.allowPredefinedValues),\n description: fields\n .text()\n .label(\"Description\")\n .description(\"This text will be shown below the label (optional)\"),\n note: fields\n .text()\n .label(\"Note\")\n .description(\"This text will be shown below the input (optional)\"),\n help: fields\n .text()\n .label(\"Help\")\n .renderer(\"textarea\")\n .description(\"This text will be shown in a tooltip (optional)\"),\n tags: fields\n .text()\n .label(\"Tags\")\n .renderer(\"tags\")\n .list()\n .description(\n \"Field tags are useful for developers and are not visible in the UI (optional)\"\n )\n };\n });\n\n form.layout(layout => [\n layout.row(\"label\", \"fieldId\"),\n layout.row(\"list\", \"predefinedValuesEnabled\"),\n layout.row(\"description\"),\n layout.row(\"note\"),\n layout.row(\"help\"),\n layout.row(\"tags\")\n ]);\n }\n\n mapToForm(field: CmsModelField) {\n return {\n label: field.label ?? \"\",\n fieldId: field.fieldId ?? \"\",\n list: field.list ?? false,\n predefinedValuesEnabled: field.predefinedValues?.enabled ?? false,\n description: field.description ?? \"\",\n note: field.note ?? \"\",\n help: field.help ?? \"\",\n tags: field.tags ?? []\n };\n }\n\n mapFromForm(formData: Record<string, any>, field: CmsModelField) {\n field.label = formData.label;\n field.fieldId = formData.fieldId;\n field.list = formData.list;\n if (!field.predefinedValues) {\n field.predefinedValues = { enabled: false, values: [] };\n }\n field.predefinedValues.enabled = formData.predefinedValuesEnabled;\n field.description = formData.description;\n field.note = formData.note;\n field.help = formData.help;\n field.tags = formData.tags;\n }\n}\n\nexport const GeneralGroup = CmsFieldEditorGroup.createImplementation({\n implementation: GeneralGroupImpl,\n dependencies: []\n});\n"],"names":["fieldIdSchema","zod","GeneralGroupImpl","form","context","fieldType","field","isNewField","fields","fieldIdBuilder","value","String","camelCase","layout","formData","GeneralGroup","CmsFieldEditorGroup"],"mappings":";;;AAMA,MAAMA,gBAAgBC,IAAAA,MACX,GACN,GAAG,CAAC,KACJ,KAAK,CAAC,eAAe;IAAE,SAAS;AAAgC,GAChE,KAAK,CAAC,qBAAqB;IAAE,SAAS;AAA+B;AAE1E,MAAMC;IAIF,UAAUC,IAAgC,EAAEC,OAA+B,EAAE;QACzE,MAAM,EAAEC,SAAS,EAAEC,KAAK,EAAE,GAAGF;QAC7B,MAAMG,aAAa,CAACD,MAAM,EAAE;QAE5BH,KAAK,MAAM,CAACK,CAAAA;YACR,MAAMC,iBAAiBD,OAClB,IAAI,GACJ,KAAK,CAAC,YACN,QAAQ,GACR,MAAM,CAACR,eACP,YAAY,CAACU,CAAAA,QAASC,OAAOD,OAAO,IAAI;YAE7C,IAAIH,YACAE,eAAe,kBAAkB,CAAC,CAAC,EAAEN,IAAI,EAAE,GAChCS,UAAUD,OAAOR,KAAK,KAAK,CAAC,iBAAiB,QAAQ,MAAM;YAI1E,OAAO;gBACH,OAAOK,OAAO,IAAI,GAAG,KAAK,CAAC,SAAS,QAAQ,GAAG,SAAS;gBACxD,SAASC;gBACT,MAAMD,OACD,OAAO,GACP,KAAK,CAACH,UAAU,SAAS,IAAI,iBAC7B,QAAQ,CAAC,CAACA,UAAU,SAAS;gBAClC,yBAAyBG,OACpB,OAAO,GACP,KAAK,CAAC,yBACN,QAAQ,CAAC,CAACH,UAAU,qBAAqB;gBAC9C,aAAaG,OACR,IAAI,GACJ,KAAK,CAAC,eACN,WAAW,CAAC;gBACjB,MAAMA,OACD,IAAI,GACJ,KAAK,CAAC,QACN,WAAW,CAAC;gBACjB,MAAMA,OACD,IAAI,GACJ,KAAK,CAAC,QACN,QAAQ,CAAC,YACT,WAAW,CAAC;gBACjB,MAAMA,OACD,IAAI,GACJ,KAAK,CAAC,QACN,QAAQ,CAAC,QACT,IAAI,GACJ,WAAW,CACR;YAEZ;QACJ;QAEAL,KAAK,MAAM,CAACU,CAAAA,SAAU;gBAClBA,OAAO,GAAG,CAAC,SAAS;gBACpBA,OAAO,GAAG,CAAC,QAAQ;gBACnBA,OAAO,GAAG,CAAC;gBACXA,OAAO,GAAG,CAAC;gBACXA,OAAO,GAAG,CAAC;gBACXA,OAAO,GAAG,CAAC;aACd;IACL;IAEA,UAAUP,KAAoB,EAAE;QAC5B,OAAO;YACH,OAAOA,MAAM,KAAK,IAAI;YACtB,SAASA,MAAM,OAAO,IAAI;YAC1B,MAAMA,MAAM,IAAI,IAAI;YACpB,yBAAyBA,MAAM,gBAAgB,EAAE,WAAW;YAC5D,aAAaA,MAAM,WAAW,IAAI;YAClC,MAAMA,MAAM,IAAI,IAAI;YACpB,MAAMA,MAAM,IAAI,IAAI;YACpB,MAAMA,MAAM,IAAI,IAAI,EAAE;QAC1B;IACJ;IAEA,YAAYQ,QAA6B,EAAER,KAAoB,EAAE;QAC7DA,MAAM,KAAK,GAAGQ,SAAS,KAAK;QAC5BR,MAAM,OAAO,GAAGQ,SAAS,OAAO;QAChCR,MAAM,IAAI,GAAGQ,SAAS,IAAI;QAC1B,IAAI,CAACR,MAAM,gBAAgB,EACvBA,MAAM,gBAAgB,GAAG;YAAE,SAAS;YAAO,QAAQ,EAAE;QAAC;QAE1DA,MAAM,gBAAgB,CAAC,OAAO,GAAGQ,SAAS,uBAAuB;QACjER,MAAM,WAAW,GAAGQ,SAAS,WAAW;QACxCR,MAAM,IAAI,GAAGQ,SAAS,IAAI;QAC1BR,MAAM,IAAI,GAAGQ,SAAS,IAAI;QAC1BR,MAAM,IAAI,GAAGQ,SAAS,IAAI;IAC9B;;aA3FA,IAAI,GAAG;aACP,KAAK,GAAG;;AA2FZ;AAEO,MAAMC,eAAeC,oBAAoB,oBAAoB,CAAC;IACjE,gBAAgBd;IAChB,cAAc,EAAE;AACpB"}
1
+ {"version":3,"file":"presentation/fieldEditor/groups/GeneralGroup.js","sources":["../../../../src/presentation/fieldEditor/groups/GeneralGroup.ts"],"sourcesContent":["import zod from \"zod\";\nimport camelCase from \"lodash/camelCase.js\";\nimport { CmsFieldEditorGroup } from \"../abstractions.js\";\nimport type { ICmsFieldEditorFormBuilder, ICmsFieldEditorContext } from \"../abstractions.js\";\nimport type { CmsModelField } from \"~/types.js\";\n\nconst fieldIdSchema = zod\n .string()\n .max(100)\n .regex(/^!?[a-zA-Z]/, { message: \"Must not start with a number.\" })\n .regex(/^(^[a-zA-Z0-9]+)$/, { message: \"Must be alphanumeric string.\" });\n\nexport class GeneralGroupImpl implements CmsFieldEditorGroup.Interface {\n name = \"general\";\n label = \"General\";\n\n buildForm(form: ICmsFieldEditorFormBuilder, context: ICmsFieldEditorContext) {\n const { fieldType, field } = context;\n const isNewField = !field.id;\n\n form.fields(fields => {\n const fieldIdBuilder = fields\n .text()\n .label(\"Field ID\")\n .required()\n .schema(fieldIdSchema)\n .beforeChange(value => String(value).trim());\n\n if (isNewField) {\n fieldIdBuilder.computedUntilDirty(({ form }) => {\n return camelCase(String(form.field(\"general.label\").getValue() || \"\"));\n });\n }\n\n return {\n label: fields.text().label(\"Label\").required().autoFocus(),\n fieldId: fieldIdBuilder,\n list: fields\n .boolean()\n .label(fieldType.listLabel || \"Use as a list\")\n .disabled(!fieldType.allowList),\n predefinedValuesEnabled: fields\n .boolean()\n .label(\"Use predefined values\")\n .disabled(!fieldType.allowPredefinedValues),\n disabled: fields\n .boolean()\n .label(\"Disabled\")\n .description(\n \"Shows the value but doesn't let editors change it. Only useful when something else writes it, such as your code or an integration calling the API.\"\n ),\n description: fields\n .text()\n .label(\"Description\")\n .description(\"This text will be shown below the label (optional)\"),\n note: fields\n .text()\n .label(\"Note\")\n .description(\"This text will be shown below the input (optional)\"),\n help: fields\n .text()\n .label(\"Help\")\n .renderer(\"textarea\")\n .description(\"This text will be shown in a tooltip (optional)\"),\n tags: fields\n .text()\n .label(\"Tags\")\n .renderer(\"tags\")\n .list()\n .description(\n \"Field tags are useful for developers and are not visible in the UI (optional)\"\n )\n };\n });\n\n form.layout(layout => [\n layout.row(\"label\", \"fieldId\"),\n layout.row(\"list\", \"predefinedValuesEnabled\"),\n layout.row(\"disabled\"),\n layout.row(\"description\"),\n layout.row(\"note\"),\n layout.row(\"help\"),\n layout.row(\"tags\")\n ]);\n }\n\n mapToForm(field: CmsModelField) {\n return {\n label: field.label ?? \"\",\n fieldId: field.fieldId ?? \"\",\n list: field.list ?? false,\n predefinedValuesEnabled: field.predefinedValues?.enabled ?? false,\n disabled: field.disabled ?? false,\n description: field.description ?? \"\",\n note: field.note ?? \"\",\n help: field.help ?? \"\",\n tags: field.tags ?? []\n };\n }\n\n mapFromForm(formData: Record<string, any>, field: CmsModelField) {\n field.label = formData.label;\n field.fieldId = formData.fieldId;\n field.list = formData.list;\n if (!field.predefinedValues) {\n field.predefinedValues = { enabled: false, values: [] };\n }\n field.predefinedValues.enabled = formData.predefinedValuesEnabled;\n field.disabled = formData.disabled;\n field.description = formData.description;\n field.note = formData.note;\n field.help = formData.help;\n field.tags = formData.tags;\n }\n}\n\nexport const GeneralGroup = CmsFieldEditorGroup.createImplementation({\n implementation: GeneralGroupImpl,\n dependencies: []\n});\n"],"names":["fieldIdSchema","zod","GeneralGroupImpl","form","context","fieldType","field","isNewField","fields","fieldIdBuilder","value","String","camelCase","layout","formData","GeneralGroup","CmsFieldEditorGroup"],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { GeneralGroupImpl } from "./GeneralGroup.js";
3
+ const createGroup = ()=>new GeneralGroupImpl();
4
+ const createField = (overrides = {})=>({
5
+ id: "externalId",
6
+ fieldId: "externalId",
7
+ storageId: "text@externalId",
8
+ type: "text",
9
+ label: "External ID",
10
+ renderer: {
11
+ name: "text-input"
12
+ },
13
+ validation: [],
14
+ listValidation: [],
15
+ ...overrides
16
+ });
17
+ const formData = (disabled)=>({
18
+ label: "External ID",
19
+ fieldId: "externalId",
20
+ list: false,
21
+ predefinedValuesEnabled: false,
22
+ disabled,
23
+ description: "",
24
+ note: "",
25
+ help: "",
26
+ tags: []
27
+ });
28
+ describe("GeneralGroup disabled flag", ()=>{
29
+ it("reads the flag off the field", ()=>{
30
+ const group = createGroup();
31
+ expect(group.mapToForm(createField({
32
+ disabled: true
33
+ })).disabled).toBe(true);
34
+ expect(group.mapToForm(createField({
35
+ disabled: false
36
+ })).disabled).toBe(false);
37
+ });
38
+ it("defaults to false for a field that predates the flag", ()=>{
39
+ const group = createGroup();
40
+ expect(group.mapToForm(createField()).disabled).toBe(false);
41
+ });
42
+ it("writes the flag back to the field", ()=>{
43
+ const group = createGroup();
44
+ const enabled = createField();
45
+ createGroup().mapFromForm(formData(true), enabled);
46
+ expect(enabled.disabled).toBe(true);
47
+ const cleared = createField({
48
+ disabled: true
49
+ });
50
+ group.mapFromForm(formData(false), cleared);
51
+ expect(cleared.disabled).toBe(false);
52
+ });
53
+ it("round-trips without changing the value", ()=>{
54
+ const group = createGroup();
55
+ const field = createField({
56
+ disabled: true
57
+ });
58
+ group.mapFromForm({
59
+ ...formData(group.mapToForm(field).disabled)
60
+ }, field);
61
+ group.mapFromForm({
62
+ ...formData(group.mapToForm(field).disabled)
63
+ }, field);
64
+ expect(field.disabled).toBe(true);
65
+ });
66
+ });
67
+
68
+ //# sourceMappingURL=GeneralGroup.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation/fieldEditor/groups/GeneralGroup.test.js","sources":["../../../../src/presentation/fieldEditor/groups/GeneralGroup.test.ts"],"sourcesContent":["import { describe, it, expect } from \"vitest\";\nimport { GeneralGroupImpl } from \"./GeneralGroup.js\";\nimport type { CmsModelField } from \"~/types.js\";\n\nconst createGroup = () => new GeneralGroupImpl();\n\nconst createField = (overrides: Partial<CmsModelField> = {}): CmsModelField =>\n ({\n id: \"externalId\",\n fieldId: \"externalId\",\n storageId: \"text@externalId\",\n type: \"text\",\n label: \"External ID\",\n renderer: { name: \"text-input\" },\n validation: [],\n listValidation: [],\n ...overrides\n }) as CmsModelField;\n\nconst formData = (disabled: boolean) => ({\n label: \"External ID\",\n fieldId: \"externalId\",\n list: false,\n predefinedValuesEnabled: false,\n disabled,\n description: \"\",\n note: \"\",\n help: \"\",\n tags: []\n});\n\ndescribe(\"GeneralGroup disabled flag\", () => {\n it(\"reads the flag off the field\", () => {\n const group = createGroup();\n\n expect(group.mapToForm(createField({ disabled: true })).disabled).toBe(true);\n expect(group.mapToForm(createField({ disabled: false })).disabled).toBe(false);\n });\n\n it(\"defaults to false for a field that predates the flag\", () => {\n const group = createGroup();\n\n expect(group.mapToForm(createField()).disabled).toBe(false);\n });\n\n it(\"writes the flag back to the field\", () => {\n const group = createGroup();\n\n const enabled = createField();\n createGroup().mapFromForm(formData(true), enabled);\n expect(enabled.disabled).toBe(true);\n\n const cleared = createField({ disabled: true });\n group.mapFromForm(formData(false), cleared);\n expect(cleared.disabled).toBe(false);\n });\n\n it(\"round-trips without changing the value\", () => {\n const group = createGroup();\n const field = createField({ disabled: true });\n\n group.mapFromForm({ ...formData(group.mapToForm(field).disabled) }, field);\n group.mapFromForm({ ...formData(group.mapToForm(field).disabled) }, field);\n\n expect(field.disabled).toBe(true);\n });\n});\n"],"names":["createGroup","GeneralGroupImpl","createField","overrides","formData","disabled","describe","it","group","expect","enabled","cleared","field"],"mappings":";;AAIA,MAAMA,cAAc,IAAM,IAAIC;AAE9B,MAAMC,cAAc,CAACC,YAAoC,CAAC,CAAC,GACtD;QACG,IAAI;QACJ,SAAS;QACT,WAAW;QACX,MAAM;QACN,OAAO;QACP,UAAU;YAAE,MAAM;QAAa;QAC/B,YAAY,EAAE;QACd,gBAAgB,EAAE;QAClB,GAAGA,SAAS;IAChB;AAEJ,MAAMC,WAAW,CAACC,WAAuB;QACrC,OAAO;QACP,SAAS;QACT,MAAM;QACN,yBAAyB;QACzBA;QACA,aAAa;QACb,MAAM;QACN,MAAM;QACN,MAAM,EAAE;IACZ;AAEAC,SAAS,8BAA8B;IACnCC,GAAG,gCAAgC;QAC/B,MAAMC,QAAQR;QAEdS,OAAOD,MAAM,SAAS,CAACN,YAAY;YAAE,UAAU;QAAK,IAAI,QAAQ,EAAE,IAAI,CAAC;QACvEO,OAAOD,MAAM,SAAS,CAACN,YAAY;YAAE,UAAU;QAAM,IAAI,QAAQ,EAAE,IAAI,CAAC;IAC5E;IAEAK,GAAG,wDAAwD;QACvD,MAAMC,QAAQR;QAEdS,OAAOD,MAAM,SAAS,CAACN,eAAe,QAAQ,EAAE,IAAI,CAAC;IACzD;IAEAK,GAAG,qCAAqC;QACpC,MAAMC,QAAQR;QAEd,MAAMU,UAAUR;QAChBF,cAAc,WAAW,CAACI,SAAS,OAAOM;QAC1CD,OAAOC,QAAQ,QAAQ,EAAE,IAAI,CAAC;QAE9B,MAAMC,UAAUT,YAAY;YAAE,UAAU;QAAK;QAC7CM,MAAM,WAAW,CAACJ,SAAS,QAAQO;QACnCF,OAAOE,QAAQ,QAAQ,EAAE,IAAI,CAAC;IAClC;IAEAJ,GAAG,0CAA0C;QACzC,MAAMC,QAAQR;QACd,MAAMY,QAAQV,YAAY;YAAE,UAAU;QAAK;QAE3CM,MAAM,WAAW,CAAC;YAAE,GAAGJ,SAASI,MAAM,SAAS,CAACI,OAAO,QAAQ,CAAC;QAAC,GAAGA;QACpEJ,MAAM,WAAW,CAAC;YAAE,GAAGJ,SAASI,MAAM,SAAS,CAACI,OAAO,QAAQ,CAAC;QAAC,GAAGA;QAEpEH,OAAOG,MAAM,QAAQ,EAAE,IAAI,CAAC;IAChC;AACJ"}