@webiny/app-headless-cms 6.0.0-rc.3 → 6.0.0-rc.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.
Files changed (99) hide show
  1. package/admin/components/CmsModelFieldRenderer.d.ts +4 -0
  2. package/admin/components/CmsModelFieldRenderer.js +14 -0
  3. package/admin/components/CmsModelFieldRenderer.js.map +1 -0
  4. package/admin/components/CmsModelFieldType.d.ts +4 -0
  5. package/admin/components/CmsModelFieldType.js +14 -0
  6. package/admin/components/CmsModelFieldType.js.map +1 -0
  7. package/admin/components/CmsModelLayoutFieldRenderer.d.ts +13 -0
  8. package/admin/components/CmsModelLayoutFieldRenderer.js +15 -0
  9. package/admin/components/CmsModelLayoutFieldRenderer.js.map +1 -0
  10. package/admin/components/CmsModelLayoutFieldType.d.ts +2 -0
  11. package/admin/components/CmsModelLayoutFieldType.js +14 -0
  12. package/admin/components/CmsModelLayoutFieldType.js.map +1 -0
  13. package/admin/components/ContentModelEditor/ContentModelEditorProvider.js.map +1 -1
  14. package/admin/components/ContentModelEditor/FieldsSidebar.js.map +1 -1
  15. package/admin/components/FieldEditor/EditFieldDialog/getValidators.d.ts +3 -3
  16. package/admin/components/FieldEditor/EditFieldDialog/getValidators.js.map +1 -1
  17. package/admin/components/FieldEditor/FieldEditor.js +10 -10
  18. package/admin/components/FieldEditor/FieldEditor.js.map +1 -1
  19. package/admin/components/FieldEditor/FieldEditorContext.d.ts +11 -11
  20. package/admin/components/FieldEditor/FieldEditorContext.js +41 -41
  21. package/admin/components/FieldEditor/FieldEditorContext.js.map +1 -1
  22. package/admin/components/FieldEditor/LayoutCell.d.ts +3 -3
  23. package/admin/components/FieldEditor/LayoutCell.js +6 -6
  24. package/admin/components/FieldEditor/LayoutCell.js.map +1 -1
  25. package/admin/plugins/fieldRenderers/boolean/booleanSwitch.js +2 -2
  26. package/admin/plugins/fieldRenderers/boolean/booleanSwitch.js.map +1 -1
  27. package/admin/plugins/fieldRenderers/checkboxes.js +2 -2
  28. package/admin/plugins/fieldRenderers/checkboxes.js.map +1 -1
  29. package/admin/plugins/fieldRenderers/dateTime/Input.js +2 -2
  30. package/admin/plugins/fieldRenderers/dateTime/Input.js.map +1 -1
  31. package/admin/plugins/fieldRenderers/dateTime/Select.js +2 -2
  32. package/admin/plugins/fieldRenderers/dateTime/Select.js.map +1 -1
  33. package/admin/plugins/fieldRenderers/dynamicZone/MultiValueDynamicZone.js +2 -2
  34. package/admin/plugins/fieldRenderers/dynamicZone/MultiValueDynamicZone.js.map +1 -1
  35. package/admin/plugins/fieldRenderers/dynamicZone/SingleValueDynamicZone.js +2 -2
  36. package/admin/plugins/fieldRenderers/dynamicZone/SingleValueDynamicZone.js.map +1 -1
  37. package/admin/plugins/fieldRenderers/lexicalText/lexicalTextInput.js +2 -2
  38. package/admin/plugins/fieldRenderers/lexicalText/lexicalTextInput.js.map +1 -1
  39. package/admin/plugins/fieldRenderers/lexicalText/lexicalTextInputs.js +2 -2
  40. package/admin/plugins/fieldRenderers/lexicalText/lexicalTextInputs.js.map +1 -1
  41. package/admin/plugins/fieldRenderers/longText/longText.js +2 -2
  42. package/admin/plugins/fieldRenderers/longText/longText.js.map +1 -1
  43. package/admin/plugins/fieldRenderers/longText/longTexts.js +2 -2
  44. package/admin/plugins/fieldRenderers/longText/longTexts.js.map +1 -1
  45. package/admin/plugins/fieldRenderers/number/numberInput.js +2 -2
  46. package/admin/plugins/fieldRenderers/number/numberInput.js.map +1 -1
  47. package/admin/plugins/fieldRenderers/number/numberInputs.js +2 -2
  48. package/admin/plugins/fieldRenderers/number/numberInputs.js.map +1 -1
  49. package/admin/plugins/fieldRenderers/object/MultiValueContainer.js +2 -2
  50. package/admin/plugins/fieldRenderers/object/MultiValueContainer.js.map +1 -1
  51. package/admin/plugins/fieldRenderers/radioButtons.js +2 -2
  52. package/admin/plugins/fieldRenderers/radioButtons.js.map +1 -1
  53. package/admin/plugins/fieldRenderers/ref/advanced/components/AdvancedMultipleReferenceField.js +2 -2
  54. package/admin/plugins/fieldRenderers/ref/advanced/components/AdvancedMultipleReferenceField.js.map +1 -1
  55. package/admin/plugins/fieldRenderers/ref/advanced/components/AdvancedSingleReferenceField.js +2 -2
  56. package/admin/plugins/fieldRenderers/ref/advanced/components/AdvancedSingleReferenceField.js.map +1 -1
  57. package/admin/plugins/fieldRenderers/ref/components/ContentEntriesAutocomplete.js +2 -2
  58. package/admin/plugins/fieldRenderers/ref/components/ContentEntriesAutocomplete.js.map +1 -1
  59. package/admin/plugins/fieldRenderers/ref/components/ContentEntriesMultiAutoComplete.js +2 -2
  60. package/admin/plugins/fieldRenderers/ref/components/ContentEntriesMultiAutoComplete.js.map +1 -1
  61. package/admin/plugins/fieldRenderers/ref/simple/components/SimpleMultipleRenderer.js +2 -2
  62. package/admin/plugins/fieldRenderers/ref/simple/components/SimpleMultipleRenderer.js.map +1 -1
  63. package/admin/plugins/fieldRenderers/ref/simple/components/SimpleSingleRenderer.js +2 -2
  64. package/admin/plugins/fieldRenderers/ref/simple/components/SimpleSingleRenderer.js.map +1 -1
  65. package/admin/plugins/fieldRenderers/select.js +2 -2
  66. package/admin/plugins/fieldRenderers/select.js.map +1 -1
  67. package/admin/plugins/fieldRenderers/text/tags.js +2 -2
  68. package/admin/plugins/fieldRenderers/text/tags.js.map +1 -1
  69. package/admin/plugins/fieldRenderers/text/textInput.js +2 -2
  70. package/admin/plugins/fieldRenderers/text/textInput.js.map +1 -1
  71. package/admin/plugins/fieldRenderers/text/textInputs.js +2 -2
  72. package/admin/plugins/fieldRenderers/text/textInputs.js.map +1 -1
  73. package/admin/plugins/fields/ui/TabsLayoutEditor.d.ts +4 -4
  74. package/admin/plugins/fields/ui/TabsLayoutEditor.js +44 -44
  75. package/admin/plugins/fields/ui/TabsLayoutEditor.js.map +1 -1
  76. package/admin/plugins/fields/ui/alert.d.ts +2 -2
  77. package/admin/plugins/fields/ui/alert.js +11 -11
  78. package/admin/plugins/fields/ui/alert.js.map +1 -1
  79. package/admin/plugins/fields/ui/separator.d.ts +2 -2
  80. package/admin/plugins/fields/ui/separator.js +10 -10
  81. package/admin/plugins/fields/ui/separator.js.map +1 -1
  82. package/admin/plugins/fields/ui/tabs.d.ts +2 -2
  83. package/admin/plugins/fields/ui/tabs.js +10 -10
  84. package/admin/plugins/fields/ui/tabs.js.map +1 -1
  85. package/allPlugins.d.ts +1 -1
  86. package/exports/admin/cms/{fieldRenderers/dynamicZone.js → field-renderers/dynamic-zone.js} +1 -1
  87. package/exports/admin/cms/field-renderers/dynamic-zone.js.map +1 -0
  88. package/exports/admin/cms.d.ts +4 -0
  89. package/exports/admin/cms.js +4 -0
  90. package/exports/admin/cms.js.map +1 -1
  91. package/package.json +23 -23
  92. package/types.d.ts +1 -1
  93. package/types.js +1 -1
  94. package/types.js.map +1 -1
  95. package/exports/admin/cms/fieldRenderers/dynamicZone.js.map +0 -1
  96. /package/exports/admin/cms/{fieldRenderers/dynamicZone.d.ts → field-renderers/dynamic-zone.d.ts} +0 -0
  97. /package/exports/admin/cms/{fieldRenderers → field-renderers}/object.d.ts +0 -0
  98. /package/exports/admin/cms/{fieldRenderers → field-renderers}/object.js +0 -0
  99. /package/exports/admin/cms/{fieldRenderers → field-renderers}/object.js.map +0 -0
@@ -1,7 +1,7 @@
1
1
  import React, { useCallback, useState } from "react";
2
2
  import dot from "dot-prop-immutable";
3
3
  import useDeepCompareEffect from "use-deep-compare-effect";
4
- import { isLayoutDescriptor } from "@webiny/app-headless-cms-common/types/model.js";
4
+ import { isLayoutField } from "@webiny/app-headless-cms-common/types/model.js";
5
5
  import { plugins } from "@webiny/plugins";
6
6
  import * as utils from "./utils/index.js";
7
7
  import { useModelFieldEditor } from "./useModelFieldEditor.js";
@@ -106,18 +106,18 @@ export const FieldEditorProvider = ({
106
106
  if (!plugin) {
107
107
  return null;
108
108
  }
109
- const descriptor = plugin.field.createDescriptor();
110
- insertLayoutCell(descriptor, dropTarget);
109
+ const layoutField = plugin.field.createField();
110
+ insertLayoutCell(layoutField, dropTarget);
111
111
  return null;
112
112
  }
113
113
 
114
114
  // Handle moving an existing layout field to a new position
115
115
  if (type === "layoutField") {
116
- if (source.descriptor) {
116
+ if (source.layoutField) {
117
117
  if (parentId !== source.parent) {
118
- // Cross-parent: insert a copy of the descriptor into this context
119
- insertLayoutCell(source.descriptor, dropTarget);
120
- // Also add any fields carried by this descriptor (e.g. fields inside tabs)
118
+ // Cross-parent: insert a copy of the layout field into this context
119
+ insertLayoutCell(source.layoutField, dropTarget);
120
+ // Also add any fields carried by this layout field (e.g. fields inside tabs)
121
121
  if (fields.length > 0) {
122
122
  for (const f of fields) {
123
123
  addField(f);
@@ -125,7 +125,7 @@ export const FieldEditorProvider = ({
125
125
  }
126
126
  } else {
127
127
  // Same parent: move within this context
128
- moveLayoutCell(source.descriptor.id, dropTarget);
128
+ moveLayoutCell(source.layoutField.id, dropTarget);
129
129
  }
130
130
  }
131
131
  return onDropTarget;
@@ -177,7 +177,7 @@ export const FieldEditorProvider = ({
177
177
  type,
178
178
  field,
179
179
  fields,
180
- descriptor
180
+ layoutField
181
181
  }, monitor) => {
182
182
  if (!monitor.didDrop()) {
183
183
  return;
@@ -189,18 +189,18 @@ export const FieldEditorProvider = ({
189
189
  if (monitorResult?.dropTarget === parentId) {
190
190
  return;
191
191
  }
192
- if (type === "layoutField" && descriptor?.id) {
193
- deleteLayoutCell(descriptor.id);
192
+ if (type === "layoutField" && layoutField?.id) {
193
+ deleteLayoutCell(layoutField.id);
194
194
  return;
195
195
  }
196
196
  const removeFields = type === "row" ? fields || [] : field ? [field] : [];
197
197
  removeFields.forEach(field => deleteField(field));
198
198
  };
199
199
  const getFieldsInLayout = () => {
200
- // Replace every field ID with actual field object, pass through layout descriptors.
200
+ // Replace every field ID with actual field object, pass through layout fields.
201
201
  return state.layout.filter(arr => arr.length).map(row => {
202
202
  return row.map(cell => {
203
- if (isLayoutDescriptor(cell)) {
203
+ if (isLayoutField(cell)) {
204
204
  return cell;
205
205
  }
206
206
  return getField({
@@ -362,12 +362,12 @@ export const FieldEditorProvider = ({
362
362
  };
363
363
 
364
364
  /**
365
- * Insert a layout descriptor into the layout at the given position.
365
+ * Insert a layout field into the layout at the given position.
366
366
  */
367
- const insertLayoutCell = (descriptor, position) => {
368
- // Auto-assign a unique ID to the descriptor.
367
+ const insertLayoutCell = (layoutField, position) => {
368
+ // Auto-assign a unique ID to the layout field.
369
369
  const cell = {
370
- ...descriptor,
370
+ ...layoutField,
371
371
  id: generateAlphaNumericLowerCaseId(8)
372
372
  };
373
373
  setState(prev => {
@@ -386,15 +386,15 @@ export const FieldEditorProvider = ({
386
386
  };
387
387
 
388
388
  /**
389
- * Update a layout descriptor found by its ID.
389
+ * Update a layout field found by its ID.
390
390
  */
391
- const updateLayoutCell = (descriptorId, descriptor) => {
391
+ const updateLayoutCell = (fieldId, layoutField) => {
392
392
  setState(prev => {
393
393
  const newLayout = prev.layout.map(row => row.map(cell => {
394
- if (isLayoutDescriptor(cell) && cell.id === descriptorId) {
394
+ if (isLayoutField(cell) && cell.id === fieldId) {
395
395
  return {
396
- ...descriptor,
397
- id: descriptorId
396
+ ...layoutField,
397
+ id: fieldId
398
398
  };
399
399
  }
400
400
  return cell;
@@ -407,20 +407,20 @@ export const FieldEditorProvider = ({
407
407
  };
408
408
 
409
409
  /**
410
- * Delete a layout descriptor found by its ID.
411
- * If it's a tabs descriptor, also remove all hoisted fields from the fields array.
410
+ * Delete a layout field found by its ID.
411
+ * If it's a tabs layout field, also remove all hoisted fields from the fields array.
412
412
  */
413
- const deleteLayoutCell = descriptorId => {
413
+ const deleteLayoutCell = fieldId => {
414
414
  setState(prev => {
415
415
  let fields = prev.fields;
416
416
 
417
417
  // Find the descriptor to check if it's tabs (need to clean up hoisted fields)
418
418
  for (const row of prev.layout) {
419
419
  for (const cell of row) {
420
- if (isLayoutDescriptor(cell) && cell.id === descriptorId && cell.type === "tabs") {
421
- const tabsDescriptor = cell;
420
+ if (isLayoutField(cell) && cell.id === fieldId && cell.type === "tabs") {
421
+ const tabsField = cell;
422
422
  const fieldIdsInTabs = new Set();
423
- tabsDescriptor.tabs.forEach(tab => {
423
+ tabsField.tabs.forEach(tab => {
424
424
  tab.layout.forEach(r => {
425
425
  r.forEach(c => {
426
426
  if (typeof c === "string") {
@@ -435,7 +435,7 @@ export const FieldEditorProvider = ({
435
435
  }
436
436
  }
437
437
  }
438
- const newLayout = prev.layout.map(row => row.filter(cell => !(isLayoutDescriptor(cell) && cell.id === descriptorId)));
438
+ const newLayout = prev.layout.map(row => row.filter(cell => !(isLayoutField(cell) && cell.id === fieldId)));
439
439
  return {
440
440
  ...prev,
441
441
  fields,
@@ -445,31 +445,31 @@ export const FieldEditorProvider = ({
445
445
  };
446
446
 
447
447
  /**
448
- * Move a layout descriptor (found by its ID) to a new position.
448
+ * Move a layout field (found by its ID) to a new position.
449
449
  */
450
- const moveLayoutCell = (descriptorId, position) => {
450
+ const moveLayoutCell = (fieldId, position) => {
451
451
  setState(prev => {
452
- // Find the descriptor by ID.
453
- let descriptor;
452
+ // Find the layout field by ID.
453
+ let layoutField;
454
454
  let sourceRow = -1;
455
455
  for (let ri = 0; ri < prev.layout.length; ri++) {
456
456
  for (const cell of prev.layout[ri]) {
457
- if (isLayoutDescriptor(cell) && cell.id === descriptorId) {
458
- descriptor = cell;
457
+ if (isLayoutField(cell) && cell.id === fieldId) {
458
+ layoutField = cell;
459
459
  sourceRow = ri;
460
460
  break;
461
461
  }
462
462
  }
463
- if (descriptor) {
463
+ if (layoutField) {
464
464
  break;
465
465
  }
466
466
  }
467
- if (!descriptor || sourceRow === -1) {
467
+ if (!layoutField || sourceRow === -1) {
468
468
  return prev;
469
469
  }
470
470
 
471
- // 1. Remove the descriptor from its source position.
472
- const withoutSource = prev.layout.map(row => row.filter(cell => !(isLayoutDescriptor(cell) && cell.id === descriptorId)));
471
+ // 1. Remove the layout field from its source position.
472
+ const withoutSource = prev.layout.map(row => row.filter(cell => !(isLayoutField(cell) && cell.id === fieldId)));
473
473
 
474
474
  // 2. Was the source row emptied?
475
475
  const sourceRowEmptied = withoutSource[sourceRow].length === 0;
@@ -485,9 +485,9 @@ export const FieldEditorProvider = ({
485
485
  // 4. Remove empty rows.
486
486
  const cleaned = withoutSource.filter(r => r.length > 0);
487
487
 
488
- // 5. Clamp target row and insert the descriptor as its own row.
488
+ // 5. Clamp target row and insert the layout field as its own row.
489
489
  targetRow = Math.max(0, Math.min(targetRow, cleaned.length));
490
- cleaned.splice(targetRow, 0, [descriptor]);
490
+ cleaned.splice(targetRow, 0, [layoutField]);
491
491
  return {
492
492
  ...prev,
493
493
  layout: cleaned
@@ -1 +1 @@
1
- {"version":3,"names":["React","useCallback","useState","dot","useDeepCompareEffect","isLayoutDescriptor","plugins","utils","useModelFieldEditor","generateAlphaNumericLowerCaseId","FieldEditorContext","createContext","undefined","maxGenerateIdIterations","generateFieldId","layout","id","iteration","includes","Error","FieldEditorProvider","parent","fields","onChange","children","depth","parentEditorContext","editor","state","setState","field","dropTarget","row","index","editField","onDropTarget","fieldId","onFieldDrop","source","pos","type","fieldType","parentId","forEach","insertField","position","moveRow","plugin","getLayoutFieldPlugin","layoutFieldType","descriptor","createDescriptor","insertLayoutCell","length","f","addField","moveLayoutCell","moveField","getFieldPlugin","fieldData","createField","canEditSettings","onEndDrag","monitor","didDrop","monitorResult","getDropResult","deleteLayoutCell","removeFields","deleteField","getFieldsInLayout","filter","arr","map","cell","getField","Boolean","byType","find","getFieldRendererPlugin","name","renderer","rendererName","query","key","flat","c","fieldPlugin","prev","next","concat","data","destination","updateField","i","set","some","removeField","newLayout","splice","r","updateLayoutCell","descriptorId","tabsDescriptor","fieldIdsInTabs","Set","tabs","tab","add","size","has","sourceRow","ri","withoutSource","sourceRowEmptied","targetRow","cleaned","Math","max","min","noConflict","isVisible","item","sameParent","draggedFields","push","join","value","createElement","Provider"],"sources":["FieldEditorContext.tsx"],"sourcesContent":["import React, { useCallback, useState } from \"react\";\nimport dot from \"dot-prop-immutable\";\nimport useDeepCompareEffect from \"use-deep-compare-effect\";\nimport type {\n CmsEditorFieldId,\n CmsEditorFieldRendererPlugin,\n CmsEditorFieldsLayout,\n CmsEditorFieldTypePlugin,\n CmsLayoutFieldTypePlugin,\n CmsModelField,\n DragSource,\n FieldLayoutPosition\n} from \"~/types.js\";\nimport type {\n CmsLayoutDescriptor,\n CmsEditorLayoutCell\n} from \"@webiny/app-headless-cms-common/types/model.js\";\nimport { isLayoutDescriptor } from \"@webiny/app-headless-cms-common/types/model.js\";\nimport { plugins } from \"@webiny/plugins\";\nimport * as utils from \"./utils/index.js\";\nimport type { FieldEditorProps } from \"./FieldEditor.js\";\nimport type { DragSourceMonitor } from \"react-dnd\";\nimport { useModelFieldEditor } from \"~/admin/components/FieldEditor/useModelFieldEditor.js\";\nimport { generateAlphaNumericLowerCaseId } from \"@webiny/utils\";\nimport type { DragObject } from \"../Droppable.js\";\n\ninterface DropTarget {\n row: number;\n index: number | null;\n}\n\n/**\n * Property in GetFieldParams can be any key from CmsEditorField, but TS does not allow union types\n */\ninterface GetFieldParams {\n id?: string;\n fieldId?: string;\n}\ninterface InsertFieldParams {\n field: CmsModelField;\n position: FieldLayoutPosition;\n}\ninterface AddFieldCallable {\n (field: CmsModelField): void;\n}\ninterface RemoveFieldCallable {\n (fieldId: string): void;\n}\ninterface MoveFieldParams {\n field: CmsEditorFieldId | CmsModelField;\n position: FieldLayoutPosition;\n}\ninterface GetFieldsInLayoutCallable {\n (): (CmsModelField | CmsLayoutDescriptor)[][];\n}\ninterface InsertLayoutCellCallable {\n (\n descriptor: Omit<CmsLayoutDescriptor, \"id\"> | CmsLayoutDescriptor,\n position: FieldLayoutPosition\n ): void;\n}\ninterface UpdateLayoutCellCallable {\n (descriptorId: string, descriptor: CmsLayoutDescriptor): void;\n}\ninterface DeleteLayoutCellCallable {\n (descriptorId: string): void;\n}\ninterface MoveLayoutCellCallable {\n (descriptorId: string, position: FieldLayoutPosition): void;\n}\ninterface GetLayoutFieldPluginCallable {\n (type: string): CmsLayoutFieldTypePlugin | undefined;\n}\ninterface GetFieldPluginCallable {\n (type: string): CmsEditorFieldTypePlugin | undefined;\n}\ninterface GetFieldCallable {\n (query: GetFieldParams): CmsModelField | undefined;\n}\ninterface GetFieldRendererCallable {\n (rendererName: string): CmsEditorFieldRendererPlugin | undefined;\n}\ninterface OnFieldDropCallable {\n (source: Partial<DragSource>, target: DropTarget): void;\n}\ninterface InsertFieldCallable {\n (params: InsertFieldParams): void;\n}\ninterface MoveFieldCallable {\n (params: MoveFieldParams): void;\n}\ninterface OnEndDragCallable<DragObject = unknown, DropResult = unknown> {\n (item: DragSource, monitor: DragSourceMonitor<DragObject, DropResult>): void;\n}\ninterface MoveRowCallable {\n (source: number, destination: number): void;\n}\ninterface UpdateFieldCallable {\n (field: CmsModelField): void;\n}\ninterface DeleteFieldCallable {\n (field: Pick<CmsModelField, \"id\">): void;\n}\nexport interface IsVisibleCallable {\n (item: DragSource): boolean;\n}\ninterface NoConflictCallable {\n (cb?: IsVisibleCallable): (item: DragSource) => boolean;\n}\nexport interface FieldEditorContext {\n fields: (CmsModelField | CmsLayoutDescriptor)[][];\n noConflict: NoConflictCallable;\n layout: CmsEditorFieldsLayout;\n onChange?: (data: any) => void;\n getFieldsInLayout: GetFieldsInLayoutCallable;\n getFieldPlugin: GetFieldPluginCallable;\n getField: GetFieldCallable;\n getFieldRendererPlugin: GetFieldRendererCallable;\n editField: (field: CmsModelField | null) => void;\n field: CmsModelField | null;\n parent?: CmsModelField;\n parentEditorContext?: FieldEditorContext;\n depth: number;\n dropTarget: DropTarget;\n onFieldDrop: OnFieldDropCallable;\n onEndDrag: OnEndDragCallable;\n insertField: InsertFieldCallable;\n moveField: MoveFieldCallable;\n moveRow: MoveRowCallable;\n updateField: UpdateFieldCallable;\n deleteField: DeleteFieldCallable;\n insertLayoutCell: InsertLayoutCellCallable;\n updateLayoutCell: UpdateLayoutCellCallable;\n deleteLayoutCell: DeleteLayoutCellCallable;\n moveLayoutCell: MoveLayoutCellCallable;\n getLayoutFieldPlugin: GetLayoutFieldPluginCallable;\n addField: AddFieldCallable;\n removeField: RemoveFieldCallable;\n}\n\ninterface FieldEditorProviderProps extends FieldEditorProps {\n children: React.ReactElement;\n}\n\ntype DropResult = {\n dropTarget: string | null;\n};\n\nexport const FieldEditorContext = React.createContext<FieldEditorContext | undefined>(undefined);\n/**\n * We try to generate the random id string but with the check that it does not exist already.\n * Chances that the same string exists are quite small, but let's check it anyway.\n *\n * In most cases, there will be no iterations anyway...\n */\nconst maxGenerateIdIterations = 100;\nconst generateFieldId = (layout: string[]): string => {\n let id = generateAlphaNumericLowerCaseId(8);\n\n let iteration = 0;\n while (layout.includes(id) && iteration < maxGenerateIdIterations) {\n id = generateAlphaNumericLowerCaseId(8);\n iteration++;\n }\n if (iteration >= maxGenerateIdIterations) {\n throw new Error(`Could not generate field ID in ${maxGenerateIdIterations} iterations.`);\n }\n return id;\n};\n\ninterface State {\n layout: CmsEditorFieldsLayout;\n fields: CmsModelField[];\n field: CmsModelField | null;\n dropTarget: DropTarget;\n}\nexport const FieldEditorProvider = ({\n parent,\n fields,\n layout,\n onChange,\n children\n}: FieldEditorProviderProps) => {\n // We need to determine depth of this provider so we can render drop zones with correct z-indexes.\n let depth = 0;\n let parentEditorContext: FieldEditorContext | undefined;\n try {\n const editor = useModelFieldEditor();\n depth = editor.depth + 1;\n parentEditorContext = editor;\n } catch {\n // There's no parent provider, so this is the top-level one.\n }\n\n const [state, setState] = useState<State>({\n layout,\n fields,\n field: null,\n dropTarget: {\n row: -1,\n index: null\n }\n });\n\n useDeepCompareEffect(() => {\n onChange({ fields: state.fields, layout: state.layout });\n }, [state.fields, state.layout]);\n\n const editField = useCallback((field: CmsModelField | null) => {\n setState(state => ({ ...state, field }));\n }, []);\n\n const onDropTarget = {\n dropTarget: parent ? parent.fieldId : null\n };\n\n const onFieldDrop = useCallback<OnFieldDropCallable>((source, dropTarget) => {\n const { pos, type, fieldType, field, fields = [] } = source;\n\n const parentId = parent ? parent.fieldId : null;\n\n if (type === \"row\") {\n if (parentId !== source.parent) {\n // We're dragging an existing row from another fieldset\n fields.forEach((field, index) => {\n insertField({\n field,\n position: {\n row: dropTarget.row,\n index: index === 0 ? null : index\n }\n });\n });\n } else if (pos && pos.row !== undefined) {\n // We're dragging a row within the same fieldset\n moveRow(pos.row, dropTarget.row);\n }\n\n return onDropTarget;\n }\n\n // Handle new layout field drops (separator, alert, tabs, etc.)\n if (type === \"newLayoutField\") {\n const plugin = getLayoutFieldPlugin(source.layoutFieldType || \"\");\n if (!plugin) {\n return null;\n }\n const descriptor = plugin.field.createDescriptor();\n insertLayoutCell(descriptor, dropTarget);\n return null;\n }\n\n // Handle moving an existing layout field to a new position\n if (type === \"layoutField\") {\n if (source.descriptor) {\n if (parentId !== source.parent) {\n // Cross-parent: insert a copy of the descriptor into this context\n insertLayoutCell(source.descriptor, dropTarget);\n // Also add any fields carried by this descriptor (e.g. fields inside tabs)\n if (fields.length > 0) {\n for (const f of fields) {\n addField(f);\n }\n }\n } else {\n // Same parent: move within this context\n moveLayoutCell(source.descriptor.id, dropTarget);\n }\n }\n return onDropTarget;\n }\n\n // If source pos is set, we are moving an existing field.\n if (pos) {\n if (!field) {\n return onDropTarget;\n }\n if (parentId !== source.parent) {\n // We're dragging an existing field from another fieldset\n insertField({ field, position: dropTarget });\n } else {\n // We're dragging a field within the same fieldset\n moveField({ field, position: dropTarget });\n }\n return onDropTarget;\n }\n\n if (!fieldType) {\n return null;\n }\n const plugin = getFieldPlugin(fieldType);\n if (!plugin) {\n return null;\n }\n\n const fieldData = plugin.field.createField() as CmsModelField;\n\n if (plugin.field.canEditSettings !== false) {\n editField(fieldData);\n setState(state => ({\n ...state,\n dropTarget\n }));\n } else {\n insertField({ field: fieldData, position: dropTarget });\n }\n return null;\n }, []);\n\n const onEndDrag: OnEndDragCallable<DragObject, DropResult> = (\n { type, field, fields, descriptor },\n monitor\n ) => {\n if (!monitor.didDrop()) {\n return;\n }\n\n // Check if we dropped outside of the source fieldset, and if yes, remove the item from the original parent.\n const monitorResult = monitor.getDropResult();\n const parentId = parent ? parent.fieldId : null;\n if (monitorResult?.dropTarget === parentId) {\n return;\n }\n\n if (type === \"layoutField\" && descriptor?.id) {\n deleteLayoutCell(descriptor.id);\n return;\n }\n\n const removeFields = type === \"row\" ? fields || [] : field ? [field] : [];\n removeFields.forEach(field => deleteField(field));\n };\n\n const getFieldsInLayout: GetFieldsInLayoutCallable = () => {\n // Replace every field ID with actual field object, pass through layout descriptors.\n return state.layout\n .filter(arr => arr.length)\n .map(row => {\n return row\n .map((cell: CmsEditorLayoutCell) => {\n if (isLayoutDescriptor(cell)) {\n return cell;\n }\n return getField({ id: cell });\n })\n .filter(Boolean);\n })\n .filter(row => {\n return row.length > 0;\n }) as (CmsModelField | CmsLayoutDescriptor)[][];\n };\n\n /**\n * Return field plugin.\n */\n const getFieldPlugin: GetFieldPluginCallable = type => {\n return plugins\n .byType<CmsEditorFieldTypePlugin>(\"cms-editor-field-type\")\n .find(plugin => plugin.field.type === type);\n };\n\n const getFieldRendererPlugin: GetFieldRendererCallable = name => {\n return plugins\n .byType<CmsEditorFieldRendererPlugin>(\"cms-editor-field-renderer\")\n .find(plugin => plugin.renderer.rendererName === name);\n };\n\n /**\n * Checks if field of given type already exists in the list of fields.\n */\n const getField: GetFieldCallable = query => {\n return state.fields.find(field => {\n for (const key in query) {\n if (!(key in field)) {\n return false;\n }\n\n if (field[key as keyof typeof field] !== query[key as keyof typeof query]) {\n return false;\n }\n }\n\n return true;\n });\n };\n\n /**\n * Inserts a new field into the target position.\n */\n const insertField: InsertFieldCallable = ({ field, position }) => {\n if (!field.id) {\n field.id = generateFieldId(\n layout.flat().filter((c): c is string => typeof c === \"string\")\n );\n }\n\n if (!field.type) {\n throw new Error(`Field \"type\" missing.`);\n }\n\n const fieldPlugin = getFieldPlugin(field.type);\n if (!fieldPlugin) {\n throw new Error(`No plugin found for field type \"${field.type}\".`);\n }\n\n setState(prev => {\n const next: State = {\n ...prev,\n fields: (prev.fields || []).concat(field)\n };\n\n // Move field to position where it was dropped.\n return utils.moveField({ field, position, data: next });\n });\n };\n\n /**\n * Moves field to the given target position.\n */\n const moveField: MoveFieldCallable = ({ field, position }) => {\n setState(data => {\n return utils.moveField<State>({ field, position, data });\n });\n };\n\n /**\n * Moves row to a destination row.\n */\n const moveRow: MoveRowCallable = (source, destination) => {\n setState(data => {\n return utils.moveRow({ data, source, destination });\n });\n };\n\n /**\n * Updates field.\n */\n const updateField: UpdateFieldCallable = field => {\n setState(data => {\n for (let i = 0; i < data.fields.length; i++) {\n if (data.fields[i].id === field.id) {\n return dot.set(data, `fields.${i}`, field);\n }\n }\n return data;\n });\n };\n\n /**\n * Deletes a field (both from the list of field and the layout).\n */\n const deleteField: DeleteFieldCallable = field => {\n setState(data => {\n return utils.deleteField({ field, data });\n });\n };\n\n /**\n * Add a field to the fields array without placing it in the layout.\n * Used by tabs to hoist fields to the parent context.\n */\n const addField: AddFieldCallable = field => {\n setState(prev => {\n // Don't add if already exists\n if (prev.fields.some(f => f.id === field.id)) {\n return prev;\n }\n return { ...prev, fields: [...prev.fields, field] };\n });\n };\n\n /**\n * Remove a field from the fields array by ID.\n * Used by tabs to un-hoist fields from the parent context.\n */\n const removeField: RemoveFieldCallable = fieldId => {\n setState(prev => ({\n ...prev,\n fields: prev.fields.filter(f => f.id !== fieldId)\n }));\n };\n\n /**\n * Return layout field plugin by type.\n */\n const getLayoutFieldPlugin: GetLayoutFieldPluginCallable = type => {\n return plugins\n .byType<CmsLayoutFieldTypePlugin>(\"cms-editor-layout-field-type\")\n .find(plugin => plugin.field.type === type);\n };\n\n /**\n * Insert a layout descriptor into the layout at the given position.\n */\n const insertLayoutCell: InsertLayoutCellCallable = (descriptor, position) => {\n // Auto-assign a unique ID to the descriptor.\n const cell = {\n ...descriptor,\n id: generateAlphaNumericLowerCaseId(8)\n } as CmsLayoutDescriptor;\n\n setState(prev => {\n const newLayout = [...prev.layout.map(row => [...row])];\n const { row } = position;\n\n // Layout fields always occupy a full row.\n newLayout.splice(row, 0, [cell]);\n\n return { ...prev, layout: newLayout.filter(r => r.length > 0) };\n });\n };\n\n /**\n * Update a layout descriptor found by its ID.\n */\n const updateLayoutCell: UpdateLayoutCellCallable = (descriptorId, descriptor) => {\n setState(prev => {\n const newLayout = prev.layout.map(row =>\n row.map(cell => {\n if (isLayoutDescriptor(cell) && cell.id === descriptorId) {\n return { ...descriptor, id: descriptorId };\n }\n return cell;\n })\n );\n return { ...prev, layout: newLayout };\n });\n };\n\n /**\n * Delete a layout descriptor found by its ID.\n * If it's a tabs descriptor, also remove all hoisted fields from the fields array.\n */\n const deleteLayoutCell: DeleteLayoutCellCallable = descriptorId => {\n setState(prev => {\n let fields = prev.fields;\n\n // Find the descriptor to check if it's tabs (need to clean up hoisted fields)\n for (const row of prev.layout) {\n for (const cell of row) {\n if (\n isLayoutDescriptor(cell) &&\n cell.id === descriptorId &&\n cell.type === \"tabs\"\n ) {\n const tabsDescriptor =\n cell as import(\"@webiny/app-headless-cms-common/types/model.js\").CmsTabLayoutDescriptor;\n const fieldIdsInTabs = new Set<string>();\n tabsDescriptor.tabs.forEach(tab => {\n tab.layout.forEach(r => {\n r.forEach(c => {\n if (typeof c === \"string\") {\n fieldIdsInTabs.add(c);\n }\n });\n });\n });\n if (fieldIdsInTabs.size > 0) {\n fields = fields.filter(f => !fieldIdsInTabs.has(f.id));\n }\n }\n }\n }\n\n const newLayout = prev.layout.map(row =>\n row.filter(cell => !(isLayoutDescriptor(cell) && cell.id === descriptorId))\n );\n\n return {\n ...prev,\n fields,\n layout: newLayout.filter(r => r.length > 0)\n };\n });\n };\n\n /**\n * Move a layout descriptor (found by its ID) to a new position.\n */\n const moveLayoutCell: MoveLayoutCellCallable = (descriptorId, position) => {\n setState(prev => {\n // Find the descriptor by ID.\n let descriptor: CmsLayoutDescriptor | undefined;\n let sourceRow = -1;\n\n for (let ri = 0; ri < prev.layout.length; ri++) {\n for (const cell of prev.layout[ri]) {\n if (isLayoutDescriptor(cell) && cell.id === descriptorId) {\n descriptor = cell;\n sourceRow = ri;\n break;\n }\n }\n if (descriptor) {\n break;\n }\n }\n\n if (!descriptor || sourceRow === -1) {\n return prev;\n }\n\n // 1. Remove the descriptor from its source position.\n const withoutSource = prev.layout.map(row =>\n row.filter(cell => !(isLayoutDescriptor(cell) && cell.id === descriptorId))\n );\n\n // 2. Was the source row emptied?\n const sourceRowEmptied = withoutSource[sourceRow].length === 0;\n\n // 3. Calculate the effective target row index.\n // The drop target row was computed against the original layout.\n // If we emptied a source row that was BEFORE the target, shift down by 1.\n let targetRow = position.row;\n if (sourceRowEmptied && sourceRow < targetRow) {\n targetRow--;\n }\n\n // 4. Remove empty rows.\n const cleaned = withoutSource.filter(r => r.length > 0);\n\n // 5. Clamp target row and insert the descriptor as its own row.\n targetRow = Math.max(0, Math.min(targetRow, cleaned.length));\n cleaned.splice(targetRow, 0, [descriptor]);\n\n return { ...prev, layout: cleaned };\n });\n };\n\n const noConflict: NoConflictCallable = useCallback(\n (isVisible?: IsVisibleCallable) => item => {\n const sameParent = item.parent === onDropTarget.dropTarget;\n const draggedFields: string[] = [];\n switch (item.type) {\n case \"row\":\n (item.fields || []).forEach(field => draggedFields.push(field.fieldId));\n break;\n case \"field\":\n if (!item.field) {\n break;\n }\n draggedFields.push(item.field.fieldId);\n break;\n default:\n break;\n }\n\n if (\n draggedFields.length &&\n !sameParent &&\n fields.some(field => draggedFields.includes(field.fieldId))\n ) {\n return false;\n }\n\n return typeof isVisible === \"function\" ? isVisible(item) : true;\n },\n [fields.map(f => f.fieldId).join(\".\")]\n );\n\n const value: FieldEditorContext = {\n parent,\n parentEditorContext,\n depth,\n getFieldsInLayout,\n getFieldPlugin,\n getFieldRendererPlugin,\n getField,\n editField,\n field: state.field,\n dropTarget: state.dropTarget,\n onFieldDrop,\n onEndDrag,\n insertField,\n moveField,\n moveRow,\n updateField,\n deleteField,\n insertLayoutCell,\n updateLayoutCell,\n deleteLayoutCell,\n moveLayoutCell,\n getLayoutFieldPlugin,\n addField,\n removeField,\n fields: getFieldsInLayout(),\n noConflict,\n layout: state.layout\n };\n\n return <FieldEditorContext.Provider value={value}>{children}</FieldEditorContext.Provider>;\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","useCallback","useState","dot","useDeepCompareEffect","isLayoutField","plugins","utils","useModelFieldEditor","generateAlphaNumericLowerCaseId","FieldEditorContext","createContext","undefined","maxGenerateIdIterations","generateFieldId","layout","id","iteration","includes","Error","FieldEditorProvider","parent","fields","onChange","children","depth","parentEditorContext","editor","state","setState","field","dropTarget","row","index","editField","onDropTarget","fieldId","onFieldDrop","source","pos","type","fieldType","parentId","forEach","insertField","position","moveRow","plugin","getLayoutFieldPlugin","layoutFieldType","layoutField","createField","insertLayoutCell","length","f","addField","moveLayoutCell","moveField","getFieldPlugin","fieldData","canEditSettings","onEndDrag","monitor","didDrop","monitorResult","getDropResult","deleteLayoutCell","removeFields","deleteField","getFieldsInLayout","filter","arr","map","cell","getField","Boolean","byType","find","getFieldRendererPlugin","name","renderer","rendererName","query","key","flat","c","fieldPlugin","prev","next","concat","data","destination","updateField","i","set","some","removeField","newLayout","splice","r","updateLayoutCell","tabsField","fieldIdsInTabs","Set","tabs","tab","add","size","has","sourceRow","ri","withoutSource","sourceRowEmptied","targetRow","cleaned","Math","max","min","noConflict","isVisible","item","sameParent","draggedFields","push","join","value","createElement","Provider"],"sources":["FieldEditorContext.tsx"],"sourcesContent":["import React, { useCallback, useState } from \"react\";\nimport dot from \"dot-prop-immutable\";\nimport useDeepCompareEffect from \"use-deep-compare-effect\";\nimport type {\n CmsEditorFieldId,\n CmsModelFieldRendererPlugin,\n CmsEditorFieldsLayout,\n CmsModelFieldTypePlugin,\n CmsModelLayoutFieldTypePlugin,\n CmsModelField,\n DragSource,\n FieldLayoutPosition\n} from \"~/types.js\";\nimport type {\n CmsLayoutField,\n CmsEditorLayoutCell\n} from \"@webiny/app-headless-cms-common/types/model.js\";\nimport { isLayoutField } from \"@webiny/app-headless-cms-common/types/model.js\";\nimport { plugins } from \"@webiny/plugins\";\nimport * as utils from \"./utils/index.js\";\nimport type { FieldEditorProps } from \"./FieldEditor.js\";\nimport type { DragSourceMonitor } from \"react-dnd\";\nimport { useModelFieldEditor } from \"~/admin/components/FieldEditor/useModelFieldEditor.js\";\nimport { generateAlphaNumericLowerCaseId } from \"@webiny/utils\";\nimport type { DragObject } from \"../Droppable.js\";\n\ninterface DropTarget {\n row: number;\n index: number | null;\n}\n\n/**\n * Property in GetFieldParams can be any key from CmsEditorField, but TS does not allow union types\n */\ninterface GetFieldParams {\n id?: string;\n fieldId?: string;\n}\ninterface InsertFieldParams {\n field: CmsModelField;\n position: FieldLayoutPosition;\n}\ninterface AddFieldCallable {\n (field: CmsModelField): void;\n}\ninterface RemoveFieldCallable {\n (fieldId: string): void;\n}\ninterface MoveFieldParams {\n field: CmsEditorFieldId | CmsModelField;\n position: FieldLayoutPosition;\n}\ninterface GetFieldsInLayoutCallable {\n (): (CmsModelField | CmsLayoutField)[][];\n}\ninterface InsertLayoutCellCallable {\n (field: Omit<CmsLayoutField, \"id\"> | CmsLayoutField, position: FieldLayoutPosition): void;\n}\ninterface UpdateLayoutCellCallable {\n (fieldId: string, field: CmsLayoutField): void;\n}\ninterface DeleteLayoutCellCallable {\n (fieldId: string): void;\n}\ninterface MoveLayoutCellCallable {\n (fieldId: string, position: FieldLayoutPosition): void;\n}\ninterface GetLayoutFieldPluginCallable {\n (type: string): CmsModelLayoutFieldTypePlugin | undefined;\n}\ninterface GetFieldPluginCallable {\n (type: string): CmsModelFieldTypePlugin | undefined;\n}\ninterface GetFieldCallable {\n (query: GetFieldParams): CmsModelField | undefined;\n}\ninterface GetFieldRendererCallable {\n (rendererName: string): CmsModelFieldRendererPlugin | undefined;\n}\ninterface OnFieldDropCallable {\n (source: Partial<DragSource>, target: DropTarget): void;\n}\ninterface InsertFieldCallable {\n (params: InsertFieldParams): void;\n}\ninterface MoveFieldCallable {\n (params: MoveFieldParams): void;\n}\ninterface OnEndDragCallable<DragObject = unknown, DropResult = unknown> {\n (item: DragSource, monitor: DragSourceMonitor<DragObject, DropResult>): void;\n}\ninterface MoveRowCallable {\n (source: number, destination: number): void;\n}\ninterface UpdateFieldCallable {\n (field: CmsModelField): void;\n}\ninterface DeleteFieldCallable {\n (field: Pick<CmsModelField, \"id\">): void;\n}\nexport interface IsVisibleCallable {\n (item: DragSource): boolean;\n}\ninterface NoConflictCallable {\n (cb?: IsVisibleCallable): (item: DragSource) => boolean;\n}\nexport interface FieldEditorContext {\n fields: (CmsModelField | CmsLayoutField)[][];\n noConflict: NoConflictCallable;\n layout: CmsEditorFieldsLayout;\n onChange?: (data: any) => void;\n getFieldsInLayout: GetFieldsInLayoutCallable;\n getFieldPlugin: GetFieldPluginCallable;\n getField: GetFieldCallable;\n getFieldRendererPlugin: GetFieldRendererCallable;\n editField: (field: CmsModelField | null) => void;\n field: CmsModelField | null;\n parent?: CmsModelField;\n parentEditorContext?: FieldEditorContext;\n depth: number;\n dropTarget: DropTarget;\n onFieldDrop: OnFieldDropCallable;\n onEndDrag: OnEndDragCallable;\n insertField: InsertFieldCallable;\n moveField: MoveFieldCallable;\n moveRow: MoveRowCallable;\n updateField: UpdateFieldCallable;\n deleteField: DeleteFieldCallable;\n insertLayoutCell: InsertLayoutCellCallable;\n updateLayoutCell: UpdateLayoutCellCallable;\n deleteLayoutCell: DeleteLayoutCellCallable;\n moveLayoutCell: MoveLayoutCellCallable;\n getLayoutFieldPlugin: GetLayoutFieldPluginCallable;\n addField: AddFieldCallable;\n removeField: RemoveFieldCallable;\n}\n\ninterface FieldEditorProviderProps extends FieldEditorProps {\n children: React.ReactElement;\n}\n\ntype DropResult = {\n dropTarget: string | null;\n};\n\nexport const FieldEditorContext = React.createContext<FieldEditorContext | undefined>(undefined);\n/**\n * We try to generate the random id string but with the check that it does not exist already.\n * Chances that the same string exists are quite small, but let's check it anyway.\n *\n * In most cases, there will be no iterations anyway...\n */\nconst maxGenerateIdIterations = 100;\nconst generateFieldId = (layout: string[]): string => {\n let id = generateAlphaNumericLowerCaseId(8);\n\n let iteration = 0;\n while (layout.includes(id) && iteration < maxGenerateIdIterations) {\n id = generateAlphaNumericLowerCaseId(8);\n iteration++;\n }\n if (iteration >= maxGenerateIdIterations) {\n throw new Error(`Could not generate field ID in ${maxGenerateIdIterations} iterations.`);\n }\n return id;\n};\n\ninterface State {\n layout: CmsEditorFieldsLayout;\n fields: CmsModelField[];\n field: CmsModelField | null;\n dropTarget: DropTarget;\n}\nexport const FieldEditorProvider = ({\n parent,\n fields,\n layout,\n onChange,\n children\n}: FieldEditorProviderProps) => {\n // We need to determine depth of this provider so we can render drop zones with correct z-indexes.\n let depth = 0;\n let parentEditorContext: FieldEditorContext | undefined;\n try {\n const editor = useModelFieldEditor();\n depth = editor.depth + 1;\n parentEditorContext = editor;\n } catch {\n // There's no parent provider, so this is the top-level one.\n }\n\n const [state, setState] = useState<State>({\n layout,\n fields,\n field: null,\n dropTarget: {\n row: -1,\n index: null\n }\n });\n\n useDeepCompareEffect(() => {\n onChange({ fields: state.fields, layout: state.layout });\n }, [state.fields, state.layout]);\n\n const editField = useCallback((field: CmsModelField | null) => {\n setState(state => ({ ...state, field }));\n }, []);\n\n const onDropTarget = {\n dropTarget: parent ? parent.fieldId : null\n };\n\n const onFieldDrop = useCallback<OnFieldDropCallable>((source, dropTarget) => {\n const { pos, type, fieldType, field, fields = [] } = source;\n\n const parentId = parent ? parent.fieldId : null;\n\n if (type === \"row\") {\n if (parentId !== source.parent) {\n // We're dragging an existing row from another fieldset\n fields.forEach((field, index) => {\n insertField({\n field,\n position: {\n row: dropTarget.row,\n index: index === 0 ? null : index\n }\n });\n });\n } else if (pos && pos.row !== undefined) {\n // We're dragging a row within the same fieldset\n moveRow(pos.row, dropTarget.row);\n }\n\n return onDropTarget;\n }\n\n // Handle new layout field drops (separator, alert, tabs, etc.)\n if (type === \"newLayoutField\") {\n const plugin = getLayoutFieldPlugin(source.layoutFieldType || \"\");\n if (!plugin) {\n return null;\n }\n const layoutField = plugin.field.createField();\n insertLayoutCell(layoutField, dropTarget);\n return null;\n }\n\n // Handle moving an existing layout field to a new position\n if (type === \"layoutField\") {\n if (source.layoutField) {\n if (parentId !== source.parent) {\n // Cross-parent: insert a copy of the layout field into this context\n insertLayoutCell(source.layoutField, dropTarget);\n // Also add any fields carried by this layout field (e.g. fields inside tabs)\n if (fields.length > 0) {\n for (const f of fields) {\n addField(f);\n }\n }\n } else {\n // Same parent: move within this context\n moveLayoutCell(source.layoutField.id, dropTarget);\n }\n }\n return onDropTarget;\n }\n\n // If source pos is set, we are moving an existing field.\n if (pos) {\n if (!field) {\n return onDropTarget;\n }\n if (parentId !== source.parent) {\n // We're dragging an existing field from another fieldset\n insertField({ field, position: dropTarget });\n } else {\n // We're dragging a field within the same fieldset\n moveField({ field, position: dropTarget });\n }\n return onDropTarget;\n }\n\n if (!fieldType) {\n return null;\n }\n const plugin = getFieldPlugin(fieldType);\n if (!plugin) {\n return null;\n }\n\n const fieldData = plugin.field.createField() as CmsModelField;\n\n if (plugin.field.canEditSettings !== false) {\n editField(fieldData);\n setState(state => ({\n ...state,\n dropTarget\n }));\n } else {\n insertField({ field: fieldData, position: dropTarget });\n }\n return null;\n }, []);\n\n const onEndDrag: OnEndDragCallable<DragObject, DropResult> = (\n { type, field, fields, layoutField },\n monitor\n ) => {\n if (!monitor.didDrop()) {\n return;\n }\n\n // Check if we dropped outside of the source fieldset, and if yes, remove the item from the original parent.\n const monitorResult = monitor.getDropResult();\n const parentId = parent ? parent.fieldId : null;\n if (monitorResult?.dropTarget === parentId) {\n return;\n }\n\n if (type === \"layoutField\" && layoutField?.id) {\n deleteLayoutCell(layoutField.id);\n return;\n }\n\n const removeFields = type === \"row\" ? fields || [] : field ? [field] : [];\n removeFields.forEach(field => deleteField(field));\n };\n\n const getFieldsInLayout: GetFieldsInLayoutCallable = () => {\n // Replace every field ID with actual field object, pass through layout fields.\n return state.layout\n .filter(arr => arr.length)\n .map(row => {\n return row\n .map((cell: CmsEditorLayoutCell) => {\n if (isLayoutField(cell)) {\n return cell;\n }\n return getField({ id: cell });\n })\n .filter(Boolean);\n })\n .filter(row => {\n return row.length > 0;\n }) as (CmsModelField | CmsLayoutField)[][];\n };\n\n /**\n * Return field plugin.\n */\n const getFieldPlugin: GetFieldPluginCallable = type => {\n return plugins\n .byType<CmsModelFieldTypePlugin>(\"cms-editor-field-type\")\n .find(plugin => plugin.field.type === type);\n };\n\n const getFieldRendererPlugin: GetFieldRendererCallable = name => {\n return plugins\n .byType<CmsModelFieldRendererPlugin>(\"cms-editor-field-renderer\")\n .find(plugin => plugin.renderer.rendererName === name);\n };\n\n /**\n * Checks if field of given type already exists in the list of fields.\n */\n const getField: GetFieldCallable = query => {\n return state.fields.find(field => {\n for (const key in query) {\n if (!(key in field)) {\n return false;\n }\n\n if (field[key as keyof typeof field] !== query[key as keyof typeof query]) {\n return false;\n }\n }\n\n return true;\n });\n };\n\n /**\n * Inserts a new field into the target position.\n */\n const insertField: InsertFieldCallable = ({ field, position }) => {\n if (!field.id) {\n field.id = generateFieldId(\n layout.flat().filter((c): c is string => typeof c === \"string\")\n );\n }\n\n if (!field.type) {\n throw new Error(`Field \"type\" missing.`);\n }\n\n const fieldPlugin = getFieldPlugin(field.type);\n if (!fieldPlugin) {\n throw new Error(`No plugin found for field type \"${field.type}\".`);\n }\n\n setState(prev => {\n const next: State = {\n ...prev,\n fields: (prev.fields || []).concat(field)\n };\n\n // Move field to position where it was dropped.\n return utils.moveField({ field, position, data: next });\n });\n };\n\n /**\n * Moves field to the given target position.\n */\n const moveField: MoveFieldCallable = ({ field, position }) => {\n setState(data => {\n return utils.moveField<State>({ field, position, data });\n });\n };\n\n /**\n * Moves row to a destination row.\n */\n const moveRow: MoveRowCallable = (source, destination) => {\n setState(data => {\n return utils.moveRow({ data, source, destination });\n });\n };\n\n /**\n * Updates field.\n */\n const updateField: UpdateFieldCallable = field => {\n setState(data => {\n for (let i = 0; i < data.fields.length; i++) {\n if (data.fields[i].id === field.id) {\n return dot.set(data, `fields.${i}`, field);\n }\n }\n return data;\n });\n };\n\n /**\n * Deletes a field (both from the list of field and the layout).\n */\n const deleteField: DeleteFieldCallable = field => {\n setState(data => {\n return utils.deleteField({ field, data });\n });\n };\n\n /**\n * Add a field to the fields array without placing it in the layout.\n * Used by tabs to hoist fields to the parent context.\n */\n const addField: AddFieldCallable = field => {\n setState(prev => {\n // Don't add if already exists\n if (prev.fields.some(f => f.id === field.id)) {\n return prev;\n }\n return { ...prev, fields: [...prev.fields, field] };\n });\n };\n\n /**\n * Remove a field from the fields array by ID.\n * Used by tabs to un-hoist fields from the parent context.\n */\n const removeField: RemoveFieldCallable = fieldId => {\n setState(prev => ({\n ...prev,\n fields: prev.fields.filter(f => f.id !== fieldId)\n }));\n };\n\n /**\n * Return layout field plugin by type.\n */\n const getLayoutFieldPlugin: GetLayoutFieldPluginCallable = type => {\n return plugins\n .byType<CmsModelLayoutFieldTypePlugin>(\"cms-editor-layout-field-type\")\n .find(plugin => plugin.field.type === type);\n };\n\n /**\n * Insert a layout field into the layout at the given position.\n */\n const insertLayoutCell: InsertLayoutCellCallable = (layoutField, position) => {\n // Auto-assign a unique ID to the layout field.\n const cell = {\n ...layoutField,\n id: generateAlphaNumericLowerCaseId(8)\n } as CmsLayoutField;\n\n setState(prev => {\n const newLayout = [...prev.layout.map(row => [...row])];\n const { row } = position;\n\n // Layout fields always occupy a full row.\n newLayout.splice(row, 0, [cell]);\n\n return { ...prev, layout: newLayout.filter(r => r.length > 0) };\n });\n };\n\n /**\n * Update a layout field found by its ID.\n */\n const updateLayoutCell: UpdateLayoutCellCallable = (fieldId, layoutField) => {\n setState(prev => {\n const newLayout = prev.layout.map(row =>\n row.map(cell => {\n if (isLayoutField(cell) && cell.id === fieldId) {\n return { ...layoutField, id: fieldId };\n }\n return cell;\n })\n );\n return { ...prev, layout: newLayout };\n });\n };\n\n /**\n * Delete a layout field found by its ID.\n * If it's a tabs layout field, also remove all hoisted fields from the fields array.\n */\n const deleteLayoutCell: DeleteLayoutCellCallable = fieldId => {\n setState(prev => {\n let fields = prev.fields;\n\n // Find the descriptor to check if it's tabs (need to clean up hoisted fields)\n for (const row of prev.layout) {\n for (const cell of row) {\n if (isLayoutField(cell) && cell.id === fieldId && cell.type === \"tabs\") {\n const tabsField =\n cell as import(\"@webiny/app-headless-cms-common/types/model.js\").CmsTabLayoutField;\n const fieldIdsInTabs = new Set<string>();\n tabsField.tabs.forEach(tab => {\n tab.layout.forEach(r => {\n r.forEach(c => {\n if (typeof c === \"string\") {\n fieldIdsInTabs.add(c);\n }\n });\n });\n });\n if (fieldIdsInTabs.size > 0) {\n fields = fields.filter(f => !fieldIdsInTabs.has(f.id));\n }\n }\n }\n }\n\n const newLayout = prev.layout.map(row =>\n row.filter(cell => !(isLayoutField(cell) && cell.id === fieldId))\n );\n\n return {\n ...prev,\n fields,\n layout: newLayout.filter(r => r.length > 0)\n };\n });\n };\n\n /**\n * Move a layout field (found by its ID) to a new position.\n */\n const moveLayoutCell: MoveLayoutCellCallable = (fieldId, position) => {\n setState(prev => {\n // Find the layout field by ID.\n let layoutField: CmsLayoutField | undefined;\n let sourceRow = -1;\n\n for (let ri = 0; ri < prev.layout.length; ri++) {\n for (const cell of prev.layout[ri]) {\n if (isLayoutField(cell) && cell.id === fieldId) {\n layoutField = cell;\n sourceRow = ri;\n break;\n }\n }\n if (layoutField) {\n break;\n }\n }\n\n if (!layoutField || sourceRow === -1) {\n return prev;\n }\n\n // 1. Remove the layout field from its source position.\n const withoutSource = prev.layout.map(row =>\n row.filter(cell => !(isLayoutField(cell) && cell.id === fieldId))\n );\n\n // 2. Was the source row emptied?\n const sourceRowEmptied = withoutSource[sourceRow].length === 0;\n\n // 3. Calculate the effective target row index.\n // The drop target row was computed against the original layout.\n // If we emptied a source row that was BEFORE the target, shift down by 1.\n let targetRow = position.row;\n if (sourceRowEmptied && sourceRow < targetRow) {\n targetRow--;\n }\n\n // 4. Remove empty rows.\n const cleaned = withoutSource.filter(r => r.length > 0);\n\n // 5. Clamp target row and insert the layout field as its own row.\n targetRow = Math.max(0, Math.min(targetRow, cleaned.length));\n cleaned.splice(targetRow, 0, [layoutField]);\n\n return { ...prev, layout: cleaned };\n });\n };\n\n const noConflict: NoConflictCallable = useCallback(\n (isVisible?: IsVisibleCallable) => item => {\n const sameParent = item.parent === onDropTarget.dropTarget;\n const draggedFields: string[] = [];\n switch (item.type) {\n case \"row\":\n (item.fields || []).forEach(field => draggedFields.push(field.fieldId));\n break;\n case \"field\":\n if (!item.field) {\n break;\n }\n draggedFields.push(item.field.fieldId);\n break;\n default:\n break;\n }\n\n if (\n draggedFields.length &&\n !sameParent &&\n fields.some(field => draggedFields.includes(field.fieldId))\n ) {\n return false;\n }\n\n return typeof isVisible === \"function\" ? isVisible(item) : true;\n },\n [fields.map(f => f.fieldId).join(\".\")]\n );\n\n const value: FieldEditorContext = {\n parent,\n parentEditorContext,\n depth,\n getFieldsInLayout,\n getFieldPlugin,\n getFieldRendererPlugin,\n getField,\n editField,\n field: state.field,\n dropTarget: state.dropTarget,\n onFieldDrop,\n onEndDrag,\n insertField,\n moveField,\n moveRow,\n updateField,\n deleteField,\n insertLayoutCell,\n updateLayoutCell,\n deleteLayoutCell,\n moveLayoutCell,\n getLayoutFieldPlugin,\n addField,\n removeField,\n fields: getFieldsInLayout(),\n noConflict,\n layout: state.layout\n };\n\n return <FieldEditorContext.Provider value={value}>{children}</FieldEditorContext.Provider>;\n};\n"],"mappings":"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","ignoreList":[]}
@@ -1,9 +1,9 @@
1
1
  import React from "react";
2
- import type { CmsLayoutDescriptor } from "@webiny/app-headless-cms-common/types/model.js";
2
+ import type { CmsLayoutField } from "@webiny/app-headless-cms-common/types/model.js";
3
3
  interface LayoutCellProps {
4
- descriptor: CmsLayoutDescriptor;
4
+ field: CmsLayoutField;
5
5
  rowIndex: number;
6
6
  cellIndex: number;
7
7
  }
8
- export declare const LayoutCell: ({ descriptor }: LayoutCellProps) => React.JSX.Element;
8
+ export declare const LayoutCell: ({ field }: LayoutCellProps) => React.JSX.Element;
9
9
  export {};
@@ -2,29 +2,29 @@ import React from "react";
2
2
  import { useModelFieldEditor } from "./useModelFieldEditor.js";
3
3
  import { Text } from "@webiny/admin-ui";
4
4
  export const LayoutCell = ({
5
- descriptor
5
+ field
6
6
  }) => {
7
7
  const {
8
8
  getLayoutFieldPlugin,
9
9
  updateLayoutCell,
10
10
  deleteLayoutCell
11
11
  } = useModelFieldEditor();
12
- const plugin = getLayoutFieldPlugin(descriptor.type);
12
+ const plugin = getLayoutFieldPlugin(field.type);
13
13
  if (!plugin) {
14
14
  return /*#__PURE__*/React.createElement("div", {
15
15
  className: "p-md bg-destructive-dimmed rounded-xs"
16
16
  }, /*#__PURE__*/React.createElement(Text, {
17
17
  size: "sm"
18
- }, "Unknown layout field type: \"", descriptor.type, "\""));
18
+ }, "Unknown layout field type: \"", field.type, "\""));
19
19
  }
20
20
  const onUpdate = d => {
21
- updateLayoutCell(descriptor.id, d);
21
+ updateLayoutCell(field.id, d);
22
22
  };
23
23
  const onDelete = () => {
24
- deleteLayoutCell(descriptor.id);
24
+ deleteLayoutCell(field.id);
25
25
  };
26
26
  return plugin.field.render({
27
- descriptor,
27
+ field,
28
28
  onUpdate,
29
29
  onDelete
30
30
  });
@@ -1 +1 @@
1
- {"version":3,"names":["React","useModelFieldEditor","Text","LayoutCell","descriptor","getLayoutFieldPlugin","updateLayoutCell","deleteLayoutCell","plugin","type","createElement","className","size","onUpdate","d","id","onDelete","field","render"],"sources":["LayoutCell.tsx"],"sourcesContent":["import React from \"react\";\nimport type { CmsLayoutDescriptor } from \"@webiny/app-headless-cms-common/types/model.js\";\nimport { useModelFieldEditor } from \"./useModelFieldEditor.js\";\nimport { Text } from \"@webiny/admin-ui\";\n\ninterface LayoutCellProps {\n descriptor: CmsLayoutDescriptor;\n rowIndex: number;\n cellIndex: number;\n}\n\nexport const LayoutCell = ({ descriptor }: LayoutCellProps) => {\n const { getLayoutFieldPlugin, updateLayoutCell, deleteLayoutCell } = useModelFieldEditor();\n\n const plugin = getLayoutFieldPlugin(descriptor.type);\n\n if (!plugin) {\n return (\n <div className={\"p-md bg-destructive-dimmed rounded-xs\"}>\n <Text size={\"sm\"}>Unknown layout field type: &quot;{descriptor.type}&quot;</Text>\n </div>\n );\n }\n\n const onUpdate = (d: CmsLayoutDescriptor) => {\n updateLayoutCell(descriptor.id, d);\n };\n\n const onDelete = () => {\n deleteLayoutCell(descriptor.id);\n };\n\n return plugin.field.render({ descriptor, onUpdate, onDelete });\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AAEzB,SAASC,mBAAmB;AAC5B,SAASC,IAAI,QAAQ,kBAAkB;AAQvC,OAAO,MAAMC,UAAU,GAAGA,CAAC;EAAEC;AAA4B,CAAC,KAAK;EAC3D,MAAM;IAAEC,oBAAoB;IAAEC,gBAAgB;IAAEC;EAAiB,CAAC,GAAGN,mBAAmB,CAAC,CAAC;EAE1F,MAAMO,MAAM,GAAGH,oBAAoB,CAACD,UAAU,CAACK,IAAI,CAAC;EAEpD,IAAI,CAACD,MAAM,EAAE;IACT,oBACIR,KAAA,CAAAU,aAAA;MAAKC,SAAS,EAAE;IAAwC,gBACpDX,KAAA,CAAAU,aAAA,CAACR,IAAI;MAACU,IAAI,EAAE;IAAK,GAAC,+BAAiC,EAACR,UAAU,CAACK,IAAI,EAAC,IAAY,CAC/E,CAAC;EAEd;EAEA,MAAMI,QAAQ,GAAIC,CAAsB,IAAK;IACzCR,gBAAgB,CAACF,UAAU,CAACW,EAAE,EAAED,CAAC,CAAC;EACtC,CAAC;EAED,MAAME,QAAQ,GAAGA,CAAA,KAAM;IACnBT,gBAAgB,CAACH,UAAU,CAACW,EAAE,CAAC;EACnC,CAAC;EAED,OAAOP,MAAM,CAACS,KAAK,CAACC,MAAM,CAAC;IAAEd,UAAU;IAAES,QAAQ;IAAEG;EAAS,CAAC,CAAC;AAClE,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["React","useModelFieldEditor","Text","LayoutCell","field","getLayoutFieldPlugin","updateLayoutCell","deleteLayoutCell","plugin","type","createElement","className","size","onUpdate","d","id","onDelete","render"],"sources":["LayoutCell.tsx"],"sourcesContent":["import React from \"react\";\nimport type { CmsLayoutField } from \"@webiny/app-headless-cms-common/types/model.js\";\nimport { useModelFieldEditor } from \"./useModelFieldEditor.js\";\nimport { Text } from \"@webiny/admin-ui\";\n\ninterface LayoutCellProps {\n field: CmsLayoutField;\n rowIndex: number;\n cellIndex: number;\n}\n\nexport const LayoutCell = ({ field }: LayoutCellProps) => {\n const { getLayoutFieldPlugin, updateLayoutCell, deleteLayoutCell } = useModelFieldEditor();\n\n const plugin = getLayoutFieldPlugin(field.type);\n\n if (!plugin) {\n return (\n <div className={\"p-md bg-destructive-dimmed rounded-xs\"}>\n <Text size={\"sm\"}>Unknown layout field type: &quot;{field.type}&quot;</Text>\n </div>\n );\n }\n\n const onUpdate = (d: CmsLayoutField) => {\n updateLayoutCell(field.id, d);\n };\n\n const onDelete = () => {\n deleteLayoutCell(field.id);\n };\n\n return plugin.field.render({ field, onUpdate, onDelete });\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AAEzB,SAASC,mBAAmB;AAC5B,SAASC,IAAI,QAAQ,kBAAkB;AAQvC,OAAO,MAAMC,UAAU,GAAGA,CAAC;EAAEC;AAAuB,CAAC,KAAK;EACtD,MAAM;IAAEC,oBAAoB;IAAEC,gBAAgB;IAAEC;EAAiB,CAAC,GAAGN,mBAAmB,CAAC,CAAC;EAE1F,MAAMO,MAAM,GAAGH,oBAAoB,CAACD,KAAK,CAACK,IAAI,CAAC;EAE/C,IAAI,CAACD,MAAM,EAAE;IACT,oBACIR,KAAA,CAAAU,aAAA;MAAKC,SAAS,EAAE;IAAwC,gBACpDX,KAAA,CAAAU,aAAA,CAACR,IAAI;MAACU,IAAI,EAAE;IAAK,GAAC,+BAAiC,EAACR,KAAK,CAACK,IAAI,EAAC,IAAY,CAC1E,CAAC;EAEd;EAEA,MAAMI,QAAQ,GAAIC,CAAiB,IAAK;IACpCR,gBAAgB,CAACF,KAAK,CAACW,EAAE,EAAED,CAAC,CAAC;EACjC,CAAC;EAED,MAAME,QAAQ,GAAGA,CAAA,KAAM;IACnBT,gBAAgB,CAACH,KAAK,CAACW,EAAE,CAAC;EAC9B,CAAC;EAED,OAAOP,MAAM,CAACJ,KAAK,CAACa,MAAM,CAAC;IAAEb,KAAK;IAAES,QAAQ;IAAEG;EAAS,CAAC,CAAC;AAC7D,CAAC","ignoreList":[]}
@@ -2,7 +2,7 @@ import React from "react";
2
2
  import get from "lodash/get.js";
3
3
  import { i18n } from "@webiny/app/i18n/index.js";
4
4
  import { Switch } from "@webiny/admin-ui";
5
- import { useEffectiveRules, useModelField } from "@webiny/app-headless-cms-common";
5
+ import { useFieldEffectiveRules, useModelField } from "@webiny/app-headless-cms-common";
6
6
  const t = i18n.ns("app-headless-cms/admin/fields/boolean");
7
7
  const plugin = {
8
8
  type: "cms-editor-field-renderer",
@@ -22,7 +22,7 @@ const plugin = {
22
22
  const {
23
23
  field
24
24
  } = useModelField();
25
- const rules = useEffectiveRules(field);
25
+ const rules = useFieldEffectiveRules(field);
26
26
  const Bind = getBind();
27
27
  const disabled = !rules.canEdit || rules.disabled;
28
28
  return /*#__PURE__*/React.createElement(Bind, null, bindProps => /*#__PURE__*/React.createElement(Switch, Object.assign({}, bindProps, {
@@ -1 +1 @@
1
- {"version":3,"names":["React","get","i18n","Switch","useEffectiveRules","useModelField","t","ns","plugin","type","name","renderer","rendererName","description","canUse","field","list","render","getBind","rules","Bind","disabled","canEdit","createElement","bindProps","Object","assign","label","note"],"sources":["booleanSwitch.tsx"],"sourcesContent":["import React from \"react\";\nimport get from \"lodash/get.js\";\nimport type { CmsModelFieldRendererPlugin } from \"~/types.js\";\nimport { i18n } from \"@webiny/app/i18n/index.js\";\nimport { Switch } from \"@webiny/admin-ui\";\nimport { useEffectiveRules, useModelField } from \"@webiny/app-headless-cms-common\";\n\nconst t = i18n.ns(\"app-headless-cms/admin/fields/boolean\");\n\nconst plugin: CmsModelFieldRendererPlugin = {\n type: \"cms-editor-field-renderer\",\n name: \"cms-editor-field-renderer-boolean\",\n renderer: {\n rendererName: \"boolean-input\",\n name: t`Boolean Input`,\n description: t`Renders a simple switch button.`,\n canUse({ field }) {\n return (\n field.type === \"boolean\" && !field.list && !get(field, \"predefinedValues.enabled\")\n );\n },\n render({ getBind }) {\n const { field } = useModelField();\n const rules = useEffectiveRules(field);\n const Bind = getBind();\n\n const disabled = !rules.canEdit || rules.disabled;\n\n return (\n <Bind>\n {bindProps => (\n <Switch\n {...bindProps}\n disabled={disabled}\n label={field.label}\n description={field.description}\n note={field.note}\n data-testid={`fr.input.boolean.${field.label}`}\n />\n )}\n </Bind>\n );\n }\n }\n};\n\nexport default plugin;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,OAAOC,GAAG,MAAM,eAAe;AAE/B,SAASC,IAAI,QAAQ,2BAA2B;AAChD,SAASC,MAAM,QAAQ,kBAAkB;AACzC,SAASC,iBAAiB,EAAEC,aAAa,QAAQ,iCAAiC;AAElF,MAAMC,CAAC,GAAGJ,IAAI,CAACK,EAAE,CAAC,uCAAuC,CAAC;AAE1D,MAAMC,MAAmC,GAAG;EACxCC,IAAI,EAAE,2BAA2B;EACjCC,IAAI,EAAE,mCAAmC;EACzCC,QAAQ,EAAE;IACNC,YAAY,EAAE,eAAe;IAC7BF,IAAI,EAAEJ,CAAC,eAAe;IACtBO,WAAW,EAAEP,CAAC,iCAAiC;IAC/CQ,MAAMA,CAAC;MAAEC;IAAM,CAAC,EAAE;MACd,OACIA,KAAK,CAACN,IAAI,KAAK,SAAS,IAAI,CAACM,KAAK,CAACC,IAAI,IAAI,CAACf,GAAG,CAACc,KAAK,EAAE,0BAA0B,CAAC;IAE1F,CAAC;IACDE,MAAMA,CAAC;MAAEC;IAAQ,CAAC,EAAE;MAChB,MAAM;QAAEH;MAAM,CAAC,GAAGV,aAAa,CAAC,CAAC;MACjC,MAAMc,KAAK,GAAGf,iBAAiB,CAACW,KAAK,CAAC;MACtC,MAAMK,IAAI,GAAGF,OAAO,CAAC,CAAC;MAEtB,MAAMG,QAAQ,GAAG,CAACF,KAAK,CAACG,OAAO,IAAIH,KAAK,CAACE,QAAQ;MAEjD,oBACIrB,KAAA,CAAAuB,aAAA,CAACH,IAAI,QACAI,SAAS,iBACNxB,KAAA,CAAAuB,aAAA,CAACpB,MAAM,EAAAsB,MAAA,CAAAC,MAAA,KACCF,SAAS;QACbH,QAAQ,EAAEA,QAAS;QACnBM,KAAK,EAAEZ,KAAK,CAACY,KAAM;QACnBd,WAAW,EAAEE,KAAK,CAACF,WAAY;QAC/Be,IAAI,EAAEb,KAAK,CAACa,IAAK;QACjB,eAAa,oBAAoBb,KAAK,CAACY,KAAK;MAAG,EAClD,CAEH,CAAC;IAEf;EACJ;AACJ,CAAC;AAED,eAAenB,MAAM","ignoreList":[]}
1
+ {"version":3,"names":["React","get","i18n","Switch","useFieldEffectiveRules","useModelField","t","ns","plugin","type","name","renderer","rendererName","description","canUse","field","list","render","getBind","rules","Bind","disabled","canEdit","createElement","bindProps","Object","assign","label","note"],"sources":["booleanSwitch.tsx"],"sourcesContent":["import React from \"react\";\nimport get from \"lodash/get.js\";\nimport type { CmsModelFieldRendererPlugin } from \"~/types.js\";\nimport { i18n } from \"@webiny/app/i18n/index.js\";\nimport { Switch } from \"@webiny/admin-ui\";\nimport { useFieldEffectiveRules, useModelField } from \"@webiny/app-headless-cms-common\";\n\nconst t = i18n.ns(\"app-headless-cms/admin/fields/boolean\");\n\nconst plugin: CmsModelFieldRendererPlugin = {\n type: \"cms-editor-field-renderer\",\n name: \"cms-editor-field-renderer-boolean\",\n renderer: {\n rendererName: \"boolean-input\",\n name: t`Boolean Input`,\n description: t`Renders a simple switch button.`,\n canUse({ field }) {\n return (\n field.type === \"boolean\" && !field.list && !get(field, \"predefinedValues.enabled\")\n );\n },\n render({ getBind }) {\n const { field } = useModelField();\n const rules = useFieldEffectiveRules(field);\n const Bind = getBind();\n\n const disabled = !rules.canEdit || rules.disabled;\n\n return (\n <Bind>\n {bindProps => (\n <Switch\n {...bindProps}\n disabled={disabled}\n label={field.label}\n description={field.description}\n note={field.note}\n data-testid={`fr.input.boolean.${field.label}`}\n />\n )}\n </Bind>\n );\n }\n }\n};\n\nexport default plugin;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,OAAOC,GAAG,MAAM,eAAe;AAE/B,SAASC,IAAI,QAAQ,2BAA2B;AAChD,SAASC,MAAM,QAAQ,kBAAkB;AACzC,SAASC,sBAAsB,EAAEC,aAAa,QAAQ,iCAAiC;AAEvF,MAAMC,CAAC,GAAGJ,IAAI,CAACK,EAAE,CAAC,uCAAuC,CAAC;AAE1D,MAAMC,MAAmC,GAAG;EACxCC,IAAI,EAAE,2BAA2B;EACjCC,IAAI,EAAE,mCAAmC;EACzCC,QAAQ,EAAE;IACNC,YAAY,EAAE,eAAe;IAC7BF,IAAI,EAAEJ,CAAC,eAAe;IACtBO,WAAW,EAAEP,CAAC,iCAAiC;IAC/CQ,MAAMA,CAAC;MAAEC;IAAM,CAAC,EAAE;MACd,OACIA,KAAK,CAACN,IAAI,KAAK,SAAS,IAAI,CAACM,KAAK,CAACC,IAAI,IAAI,CAACf,GAAG,CAACc,KAAK,EAAE,0BAA0B,CAAC;IAE1F,CAAC;IACDE,MAAMA,CAAC;MAAEC;IAAQ,CAAC,EAAE;MAChB,MAAM;QAAEH;MAAM,CAAC,GAAGV,aAAa,CAAC,CAAC;MACjC,MAAMc,KAAK,GAAGf,sBAAsB,CAACW,KAAK,CAAC;MAC3C,MAAMK,IAAI,GAAGF,OAAO,CAAC,CAAC;MAEtB,MAAMG,QAAQ,GAAG,CAACF,KAAK,CAACG,OAAO,IAAIH,KAAK,CAACE,QAAQ;MAEjD,oBACIrB,KAAA,CAAAuB,aAAA,CAACH,IAAI,QACAI,SAAS,iBACNxB,KAAA,CAAAuB,aAAA,CAACpB,MAAM,EAAAsB,MAAA,CAAAC,MAAA,KACCF,SAAS;QACbH,QAAQ,EAAEA,QAAS;QACnBM,KAAK,EAAEZ,KAAK,CAACY,KAAM;QACnBd,WAAW,EAAEE,KAAK,CAACF,WAAY;QAC/Be,IAAI,EAAEb,KAAK,CAACa,IAAK;QACjB,eAAa,oBAAoBb,KAAK,CAACY,KAAK;MAAG,EAClD,CAEH,CAAC;IAEf;EACJ;AACJ,CAAC;AAED,eAAenB,MAAM","ignoreList":[]}
@@ -2,7 +2,7 @@ import React from "react";
2
2
  import get from "lodash/get.js";
3
3
  import { i18n } from "@webiny/app/i18n/index.js";
4
4
  import { CheckboxGroup } from "@webiny/admin-ui";
5
- import { useEffectiveRules, useModelField } from "@webiny/app-headless-cms-common";
5
+ import { useFieldEffectiveRules, useModelField } from "@webiny/app-headless-cms-common";
6
6
  const t = i18n.ns("app-headless-cms/admin/fields/text");
7
7
  const adaptToField = (field, value) => {
8
8
  return field.type === "number" ? Number(value) : value;
@@ -25,7 +25,7 @@ const plugin = {
25
25
  const {
26
26
  field
27
27
  } = useModelField();
28
- const rules = useEffectiveRules(field);
28
+ const rules = useFieldEffectiveRules(field);
29
29
  const Bind = getBind();
30
30
  const {
31
31
  values: predefinedOptions = []
@@ -1 +1 @@
1
- {"version":3,"names":["React","get","i18n","CheckboxGroup","useEffectiveRules","useModelField","t","ns","adaptToField","field","value","type","Number","plugin","name","renderer","rendererName","description","canUse","list","render","getBind","rules","Bind","values","predefinedOptions","predefinedValues","options","map","opt","defaults","filter","option","selected","defaultValue","length","undefined","disabled","canEdit","createElement","bind","ValidationContainer","Object","assign","label","note","hint","help","items"],"sources":["checkboxes.tsx"],"sourcesContent":["import React from \"react\";\nimport get from \"lodash/get.js\";\nimport type { CmsModelField, CmsModelFieldRendererPlugin } from \"~/types.js\";\nimport { i18n } from \"@webiny/app/i18n/index.js\";\nimport { CheckboxGroup } from \"@webiny/admin-ui\";\nimport { useEffectiveRules, useModelField } from \"@webiny/app-headless-cms-common\";\n\nconst t = i18n.ns(\"app-headless-cms/admin/fields/text\");\n\nconst adaptToField = (field: CmsModelField, value: string) => {\n return field.type === \"number\" ? Number(value) : value;\n};\n\nconst plugin: CmsModelFieldRendererPlugin = {\n type: \"cms-editor-field-renderer\",\n name: \"cms-editor-field-renderer-checkboxes-buttons\",\n renderer: {\n rendererName: \"checkboxes\",\n name: t`Checkboxes`,\n description: t`Renders checkboxes, allowing selection of multiple values.`,\n canUse({ field }) {\n return !!field.list && !!get(field, \"predefinedValues.enabled\");\n },\n render({ getBind }) {\n const { field } = useModelField();\n const rules = useEffectiveRules(field);\n const Bind = getBind();\n\n const { values: predefinedOptions = [] } = field.predefinedValues || {\n values: []\n };\n\n // For `number` field, we want to convert the value to actual Number.\n const options = predefinedOptions.map(opt => ({\n ...opt,\n value: adaptToField(field, opt.value)\n }));\n\n const defaults = options.filter(option => option.selected);\n const defaultValue = defaults.length > 0 ? defaults.map(opt => opt.value) : undefined;\n\n const disabled = !rules.canEdit || rules.disabled;\n\n return (\n <Bind defaultValue={defaultValue}>\n {bind => (\n <Bind.ValidationContainer>\n <CheckboxGroup\n {...bind}\n disabled={disabled}\n label={field.label}\n description={field.description}\n note={field.note}\n hint={field.help}\n value={bind.value}\n items={options.map(opt => ({\n label: opt.label,\n value: opt.value,\n selected: opt.selected\n }))}\n />\n </Bind.ValidationContainer>\n )}\n </Bind>\n );\n }\n }\n};\n\nexport default plugin;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,OAAOC,GAAG,MAAM,eAAe;AAE/B,SAASC,IAAI,QAAQ,2BAA2B;AAChD,SAASC,aAAa,QAAQ,kBAAkB;AAChD,SAASC,iBAAiB,EAAEC,aAAa,QAAQ,iCAAiC;AAElF,MAAMC,CAAC,GAAGJ,IAAI,CAACK,EAAE,CAAC,oCAAoC,CAAC;AAEvD,MAAMC,YAAY,GAAGA,CAACC,KAAoB,EAAEC,KAAa,KAAK;EAC1D,OAAOD,KAAK,CAACE,IAAI,KAAK,QAAQ,GAAGC,MAAM,CAACF,KAAK,CAAC,GAAGA,KAAK;AAC1D,CAAC;AAED,MAAMG,MAAmC,GAAG;EACxCF,IAAI,EAAE,2BAA2B;EACjCG,IAAI,EAAE,8CAA8C;EACpDC,QAAQ,EAAE;IACNC,YAAY,EAAE,YAAY;IAC1BF,IAAI,EAAER,CAAC,YAAY;IACnBW,WAAW,EAAEX,CAAC,4DAA4D;IAC1EY,MAAMA,CAAC;MAAET;IAAM,CAAC,EAAE;MACd,OAAO,CAAC,CAACA,KAAK,CAACU,IAAI,IAAI,CAAC,CAAClB,GAAG,CAACQ,KAAK,EAAE,0BAA0B,CAAC;IACnE,CAAC;IACDW,MAAMA,CAAC;MAAEC;IAAQ,CAAC,EAAE;MAChB,MAAM;QAAEZ;MAAM,CAAC,GAAGJ,aAAa,CAAC,CAAC;MACjC,MAAMiB,KAAK,GAAGlB,iBAAiB,CAACK,KAAK,CAAC;MACtC,MAAMc,IAAI,GAAGF,OAAO,CAAC,CAAC;MAEtB,MAAM;QAAEG,MAAM,EAAEC,iBAAiB,GAAG;MAAG,CAAC,GAAGhB,KAAK,CAACiB,gBAAgB,IAAI;QACjEF,MAAM,EAAE;MACZ,CAAC;;MAED;MACA,MAAMG,OAAO,GAAGF,iBAAiB,CAACG,GAAG,CAACC,GAAG,KAAK;QAC1C,GAAGA,GAAG;QACNnB,KAAK,EAAEF,YAAY,CAACC,KAAK,EAAEoB,GAAG,CAACnB,KAAK;MACxC,CAAC,CAAC,CAAC;MAEH,MAAMoB,QAAQ,GAAGH,OAAO,CAACI,MAAM,CAACC,MAAM,IAAIA,MAAM,CAACC,QAAQ,CAAC;MAC1D,MAAMC,YAAY,GAAGJ,QAAQ,CAACK,MAAM,GAAG,CAAC,GAAGL,QAAQ,CAACF,GAAG,CAACC,GAAG,IAAIA,GAAG,CAACnB,KAAK,CAAC,GAAG0B,SAAS;MAErF,MAAMC,QAAQ,GAAG,CAACf,KAAK,CAACgB,OAAO,IAAIhB,KAAK,CAACe,QAAQ;MAEjD,oBACIrC,KAAA,CAAAuC,aAAA,CAAChB,IAAI;QAACW,YAAY,EAAEA;MAAa,GAC5BM,IAAI,iBACDxC,KAAA,CAAAuC,aAAA,CAAChB,IAAI,CAACkB,mBAAmB,qBACrBzC,KAAA,CAAAuC,aAAA,CAACpC,aAAa,EAAAuC,MAAA,CAAAC,MAAA,KACNH,IAAI;QACRH,QAAQ,EAAEA,QAAS;QACnBO,KAAK,EAAEnC,KAAK,CAACmC,KAAM;QACnB3B,WAAW,EAAER,KAAK,CAACQ,WAAY;QAC/B4B,IAAI,EAAEpC,KAAK,CAACoC,IAAK;QACjBC,IAAI,EAAErC,KAAK,CAACsC,IAAK;QACjBrC,KAAK,EAAE8B,IAAI,CAAC9B,KAAM;QAClBsC,KAAK,EAAErB,OAAO,CAACC,GAAG,CAACC,GAAG,KAAK;UACvBe,KAAK,EAAEf,GAAG,CAACe,KAAK;UAChBlC,KAAK,EAAEmB,GAAG,CAACnB,KAAK;UAChBuB,QAAQ,EAAEJ,GAAG,CAACI;QAClB,CAAC,CAAC;MAAE,EACP,CACqB,CAE5B,CAAC;IAEf;EACJ;AACJ,CAAC;AAED,eAAepB,MAAM","ignoreList":[]}
1
+ {"version":3,"names":["React","get","i18n","CheckboxGroup","useFieldEffectiveRules","useModelField","t","ns","adaptToField","field","value","type","Number","plugin","name","renderer","rendererName","description","canUse","list","render","getBind","rules","Bind","values","predefinedOptions","predefinedValues","options","map","opt","defaults","filter","option","selected","defaultValue","length","undefined","disabled","canEdit","createElement","bind","ValidationContainer","Object","assign","label","note","hint","help","items"],"sources":["checkboxes.tsx"],"sourcesContent":["import React from \"react\";\nimport get from \"lodash/get.js\";\nimport type { CmsModelField, CmsModelFieldRendererPlugin } from \"~/types.js\";\nimport { i18n } from \"@webiny/app/i18n/index.js\";\nimport { CheckboxGroup } from \"@webiny/admin-ui\";\nimport { useFieldEffectiveRules, useModelField } from \"@webiny/app-headless-cms-common\";\n\nconst t = i18n.ns(\"app-headless-cms/admin/fields/text\");\n\nconst adaptToField = (field: CmsModelField, value: string) => {\n return field.type === \"number\" ? Number(value) : value;\n};\n\nconst plugin: CmsModelFieldRendererPlugin = {\n type: \"cms-editor-field-renderer\",\n name: \"cms-editor-field-renderer-checkboxes-buttons\",\n renderer: {\n rendererName: \"checkboxes\",\n name: t`Checkboxes`,\n description: t`Renders checkboxes, allowing selection of multiple values.`,\n canUse({ field }) {\n return !!field.list && !!get(field, \"predefinedValues.enabled\");\n },\n render({ getBind }) {\n const { field } = useModelField();\n const rules = useFieldEffectiveRules(field);\n const Bind = getBind();\n\n const { values: predefinedOptions = [] } = field.predefinedValues || {\n values: []\n };\n\n // For `number` field, we want to convert the value to actual Number.\n const options = predefinedOptions.map(opt => ({\n ...opt,\n value: adaptToField(field, opt.value)\n }));\n\n const defaults = options.filter(option => option.selected);\n const defaultValue = defaults.length > 0 ? defaults.map(opt => opt.value) : undefined;\n\n const disabled = !rules.canEdit || rules.disabled;\n\n return (\n <Bind defaultValue={defaultValue}>\n {bind => (\n <Bind.ValidationContainer>\n <CheckboxGroup\n {...bind}\n disabled={disabled}\n label={field.label}\n description={field.description}\n note={field.note}\n hint={field.help}\n value={bind.value}\n items={options.map(opt => ({\n label: opt.label,\n value: opt.value,\n selected: opt.selected\n }))}\n />\n </Bind.ValidationContainer>\n )}\n </Bind>\n );\n }\n }\n};\n\nexport default plugin;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,OAAOC,GAAG,MAAM,eAAe;AAE/B,SAASC,IAAI,QAAQ,2BAA2B;AAChD,SAASC,aAAa,QAAQ,kBAAkB;AAChD,SAASC,sBAAsB,EAAEC,aAAa,QAAQ,iCAAiC;AAEvF,MAAMC,CAAC,GAAGJ,IAAI,CAACK,EAAE,CAAC,oCAAoC,CAAC;AAEvD,MAAMC,YAAY,GAAGA,CAACC,KAAoB,EAAEC,KAAa,KAAK;EAC1D,OAAOD,KAAK,CAACE,IAAI,KAAK,QAAQ,GAAGC,MAAM,CAACF,KAAK,CAAC,GAAGA,KAAK;AAC1D,CAAC;AAED,MAAMG,MAAmC,GAAG;EACxCF,IAAI,EAAE,2BAA2B;EACjCG,IAAI,EAAE,8CAA8C;EACpDC,QAAQ,EAAE;IACNC,YAAY,EAAE,YAAY;IAC1BF,IAAI,EAAER,CAAC,YAAY;IACnBW,WAAW,EAAEX,CAAC,4DAA4D;IAC1EY,MAAMA,CAAC;MAAET;IAAM,CAAC,EAAE;MACd,OAAO,CAAC,CAACA,KAAK,CAACU,IAAI,IAAI,CAAC,CAAClB,GAAG,CAACQ,KAAK,EAAE,0BAA0B,CAAC;IACnE,CAAC;IACDW,MAAMA,CAAC;MAAEC;IAAQ,CAAC,EAAE;MAChB,MAAM;QAAEZ;MAAM,CAAC,GAAGJ,aAAa,CAAC,CAAC;MACjC,MAAMiB,KAAK,GAAGlB,sBAAsB,CAACK,KAAK,CAAC;MAC3C,MAAMc,IAAI,GAAGF,OAAO,CAAC,CAAC;MAEtB,MAAM;QAAEG,MAAM,EAAEC,iBAAiB,GAAG;MAAG,CAAC,GAAGhB,KAAK,CAACiB,gBAAgB,IAAI;QACjEF,MAAM,EAAE;MACZ,CAAC;;MAED;MACA,MAAMG,OAAO,GAAGF,iBAAiB,CAACG,GAAG,CAACC,GAAG,KAAK;QAC1C,GAAGA,GAAG;QACNnB,KAAK,EAAEF,YAAY,CAACC,KAAK,EAAEoB,GAAG,CAACnB,KAAK;MACxC,CAAC,CAAC,CAAC;MAEH,MAAMoB,QAAQ,GAAGH,OAAO,CAACI,MAAM,CAACC,MAAM,IAAIA,MAAM,CAACC,QAAQ,CAAC;MAC1D,MAAMC,YAAY,GAAGJ,QAAQ,CAACK,MAAM,GAAG,CAAC,GAAGL,QAAQ,CAACF,GAAG,CAACC,GAAG,IAAIA,GAAG,CAACnB,KAAK,CAAC,GAAG0B,SAAS;MAErF,MAAMC,QAAQ,GAAG,CAACf,KAAK,CAACgB,OAAO,IAAIhB,KAAK,CAACe,QAAQ;MAEjD,oBACIrC,KAAA,CAAAuC,aAAA,CAAChB,IAAI;QAACW,YAAY,EAAEA;MAAa,GAC5BM,IAAI,iBACDxC,KAAA,CAAAuC,aAAA,CAAChB,IAAI,CAACkB,mBAAmB,qBACrBzC,KAAA,CAAAuC,aAAA,CAACpC,aAAa,EAAAuC,MAAA,CAAAC,MAAA,KACNH,IAAI;QACRH,QAAQ,EAAEA,QAAS;QACnBO,KAAK,EAAEnC,KAAK,CAACmC,KAAM;QACnB3B,WAAW,EAAER,KAAK,CAACQ,WAAY;QAC/B4B,IAAI,EAAEpC,KAAK,CAACoC,IAAK;QACjBC,IAAI,EAAErC,KAAK,CAACsC,IAAK;QACjBrC,KAAK,EAAE8B,IAAI,CAAC9B,KAAM;QAClBsC,KAAK,EAAErB,OAAO,CAACC,GAAG,CAACC,GAAG,KAAK;UACvBe,KAAK,EAAEf,GAAG,CAACe,KAAK;UAChBlC,KAAK,EAAEmB,GAAG,CAACnB,KAAK;UAChBuB,QAAQ,EAAEJ,GAAG,CAACI;QAClB,CAAC,CAAC;MAAE,EACP,CACqB,CAE5B,CAAC;IAEf;EACJ;AACJ,CAAC;AAED,eAAepB,MAAM","ignoreList":[]}
@@ -1,6 +1,6 @@
1
1
  import * as React from "react";
2
2
  import { Input as UiInput, Icon } from "@webiny/admin-ui";
3
- import { useEffectiveRules, useModelField } from "@webiny/app-headless-cms-common";
3
+ import { useFieldEffectiveRules, useModelField } from "@webiny/app-headless-cms-common";
4
4
  export const Input = ({
5
5
  bind,
6
6
  trailingIcon,
@@ -9,7 +9,7 @@ export const Input = ({
9
9
  const {
10
10
  field
11
11
  } = useModelField();
12
- const rules = useEffectiveRules(field);
12
+ const rules = useFieldEffectiveRules(field);
13
13
  const disabled = !rules.canEdit || rules.disabled;
14
14
  const endIcon = React.useMemo(() => {
15
15
  if (!trailingIcon) {
@@ -1 +1 @@
1
- {"version":3,"names":["React","Input","UiInput","Icon","useEffectiveRules","useModelField","bind","trailingIcon","props","field","rules","disabled","canEdit","endIcon","useMemo","undefined","createElement","label","icon","onClick","className","Object","assign","onChange","value","type","parseFloat","note","description","placeholder"],"sources":["Input.tsx"],"sourcesContent":["import * as React from \"react\";\nimport type { CmsModelField } from \"~/types.js\";\nimport type { BindComponentRenderProp } from \"@webiny/form\";\nimport { Input as UiInput, Icon } from \"@webiny/admin-ui\";\nimport { useEffectiveRules, useModelField } from \"@webiny/app-headless-cms-common\";\n\nexport interface TrailingIcon {\n icon: React.ReactNode;\n onClick: any;\n}\n\nexport interface InputProps {\n step?: number;\n type?: string;\n bind: BindComponentRenderProp;\n field: CmsModelField;\n trailingIcon?: TrailingIcon;\n}\n\nexport const Input = ({ bind, trailingIcon, ...props }: InputProps) => {\n const { field } = useModelField();\n const rules = useEffectiveRules(field);\n const disabled = !rules.canEdit || rules.disabled;\n\n const endIcon = React.useMemo(() => {\n if (!trailingIcon) {\n return undefined;\n }\n\n return (\n <Icon\n label={\"Icon\"}\n icon={trailingIcon?.icon}\n onClick={trailingIcon?.onClick}\n className={\"cursor-pointer\"}\n />\n );\n }, [trailingIcon]);\n\n return (\n <UiInput\n {...props}\n {...bind}\n disabled={disabled}\n onChange={value => {\n if (props.type === \"number\") {\n value = parseFloat(value);\n }\n return bind.onChange(value);\n }}\n label={null}\n note={null}\n description={null}\n placeholder={field.placeholder}\n type={props.type}\n endIcon={endIcon}\n data-testid={`fr.input.${field.label}`}\n />\n );\n};\n"],"mappings":"AAAA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAG9B,SAASC,KAAK,IAAIC,OAAO,EAAEC,IAAI,QAAQ,kBAAkB;AACzD,SAASC,iBAAiB,EAAEC,aAAa,QAAQ,iCAAiC;AAelF,OAAO,MAAMJ,KAAK,GAAGA,CAAC;EAAEK,IAAI;EAAEC,YAAY;EAAE,GAAGC;AAAkB,CAAC,KAAK;EACnE,MAAM;IAAEC;EAAM,CAAC,GAAGJ,aAAa,CAAC,CAAC;EACjC,MAAMK,KAAK,GAAGN,iBAAiB,CAACK,KAAK,CAAC;EACtC,MAAME,QAAQ,GAAG,CAACD,KAAK,CAACE,OAAO,IAAIF,KAAK,CAACC,QAAQ;EAEjD,MAAME,OAAO,GAAGb,KAAK,CAACc,OAAO,CAAC,MAAM;IAChC,IAAI,CAACP,YAAY,EAAE;MACf,OAAOQ,SAAS;IACpB;IAEA,oBACIf,KAAA,CAAAgB,aAAA,CAACb,IAAI;MACDc,KAAK,EAAE,MAAO;MACdC,IAAI,EAAEX,YAAY,EAAEW,IAAK;MACzBC,OAAO,EAAEZ,YAAY,EAAEY,OAAQ;MAC/BC,SAAS,EAAE;IAAiB,CAC/B,CAAC;EAEV,CAAC,EAAE,CAACb,YAAY,CAAC,CAAC;EAElB,oBACIP,KAAA,CAAAgB,aAAA,CAACd,OAAO,EAAAmB,MAAA,CAAAC,MAAA,KACAd,KAAK,EACLF,IAAI;IACRK,QAAQ,EAAEA,QAAS;IACnBY,QAAQ,EAAEC,KAAK,IAAI;MACf,IAAIhB,KAAK,CAACiB,IAAI,KAAK,QAAQ,EAAE;QACzBD,KAAK,GAAGE,UAAU,CAACF,KAAK,CAAC;MAC7B;MACA,OAAOlB,IAAI,CAACiB,QAAQ,CAACC,KAAK,CAAC;IAC/B,CAAE;IACFP,KAAK,EAAE,IAAK;IACZU,IAAI,EAAE,IAAK;IACXC,WAAW,EAAE,IAAK;IAClBC,WAAW,EAAEpB,KAAK,CAACoB,WAAY;IAC/BJ,IAAI,EAAEjB,KAAK,CAACiB,IAAK;IACjBZ,OAAO,EAAEA,OAAQ;IACjB,eAAa,YAAYJ,KAAK,CAACQ,KAAK;EAAG,EAC1C,CAAC;AAEV,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["React","Input","UiInput","Icon","useFieldEffectiveRules","useModelField","bind","trailingIcon","props","field","rules","disabled","canEdit","endIcon","useMemo","undefined","createElement","label","icon","onClick","className","Object","assign","onChange","value","type","parseFloat","note","description","placeholder"],"sources":["Input.tsx"],"sourcesContent":["import * as React from \"react\";\nimport type { CmsModelField } from \"~/types.js\";\nimport type { BindComponentRenderProp } from \"@webiny/form\";\nimport { Input as UiInput, Icon } from \"@webiny/admin-ui\";\nimport { useFieldEffectiveRules, useModelField } from \"@webiny/app-headless-cms-common\";\n\nexport interface TrailingIcon {\n icon: React.ReactNode;\n onClick: any;\n}\n\nexport interface InputProps {\n step?: number;\n type?: string;\n bind: BindComponentRenderProp;\n field: CmsModelField;\n trailingIcon?: TrailingIcon;\n}\n\nexport const Input = ({ bind, trailingIcon, ...props }: InputProps) => {\n const { field } = useModelField();\n const rules = useFieldEffectiveRules(field);\n const disabled = !rules.canEdit || rules.disabled;\n\n const endIcon = React.useMemo(() => {\n if (!trailingIcon) {\n return undefined;\n }\n\n return (\n <Icon\n label={\"Icon\"}\n icon={trailingIcon?.icon}\n onClick={trailingIcon?.onClick}\n className={\"cursor-pointer\"}\n />\n );\n }, [trailingIcon]);\n\n return (\n <UiInput\n {...props}\n {...bind}\n disabled={disabled}\n onChange={value => {\n if (props.type === \"number\") {\n value = parseFloat(value);\n }\n return bind.onChange(value);\n }}\n label={null}\n note={null}\n description={null}\n placeholder={field.placeholder}\n type={props.type}\n endIcon={endIcon}\n data-testid={`fr.input.${field.label}`}\n />\n );\n};\n"],"mappings":"AAAA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAG9B,SAASC,KAAK,IAAIC,OAAO,EAAEC,IAAI,QAAQ,kBAAkB;AACzD,SAASC,sBAAsB,EAAEC,aAAa,QAAQ,iCAAiC;AAevF,OAAO,MAAMJ,KAAK,GAAGA,CAAC;EAAEK,IAAI;EAAEC,YAAY;EAAE,GAAGC;AAAkB,CAAC,KAAK;EACnE,MAAM;IAAEC;EAAM,CAAC,GAAGJ,aAAa,CAAC,CAAC;EACjC,MAAMK,KAAK,GAAGN,sBAAsB,CAACK,KAAK,CAAC;EAC3C,MAAME,QAAQ,GAAG,CAACD,KAAK,CAACE,OAAO,IAAIF,KAAK,CAACC,QAAQ;EAEjD,MAAME,OAAO,GAAGb,KAAK,CAACc,OAAO,CAAC,MAAM;IAChC,IAAI,CAACP,YAAY,EAAE;MACf,OAAOQ,SAAS;IACpB;IAEA,oBACIf,KAAA,CAAAgB,aAAA,CAACb,IAAI;MACDc,KAAK,EAAE,MAAO;MACdC,IAAI,EAAEX,YAAY,EAAEW,IAAK;MACzBC,OAAO,EAAEZ,YAAY,EAAEY,OAAQ;MAC/BC,SAAS,EAAE;IAAiB,CAC/B,CAAC;EAEV,CAAC,EAAE,CAACb,YAAY,CAAC,CAAC;EAElB,oBACIP,KAAA,CAAAgB,aAAA,CAACd,OAAO,EAAAmB,MAAA,CAAAC,MAAA,KACAd,KAAK,EACLF,IAAI;IACRK,QAAQ,EAAEA,QAAS;IACnBY,QAAQ,EAAEC,KAAK,IAAI;MACf,IAAIhB,KAAK,CAACiB,IAAI,KAAK,QAAQ,EAAE;QACzBD,KAAK,GAAGE,UAAU,CAACF,KAAK,CAAC;MAC7B;MACA,OAAOlB,IAAI,CAACiB,QAAQ,CAACC,KAAK,CAAC;IAC/B,CAAE;IACFP,KAAK,EAAE,IAAK;IACZU,IAAI,EAAE,IAAK;IACXC,WAAW,EAAE,IAAK;IAClBC,WAAW,EAAEpB,KAAK,CAACoB,WAAY;IAC/BJ,IAAI,EAAEjB,KAAK,CAACiB,IAAK;IACjBZ,OAAO,EAAEA,OAAQ;IACjB,eAAa,YAAYJ,KAAK,CAACQ,KAAK;EAAG,EAC1C,CAAC;AAEV,CAAC","ignoreList":[]}
@@ -1,11 +1,11 @@
1
1
  import * as React from "react";
2
2
  import { Select as UiSelect } from "@webiny/admin-ui";
3
- import { useEffectiveRules, useModelField } from "@webiny/app-headless-cms-common";
3
+ import { useFieldEffectiveRules, useModelField } from "@webiny/app-headless-cms-common";
4
4
  export const Select = props => {
5
5
  const {
6
6
  field
7
7
  } = useModelField();
8
- const rules = useEffectiveRules(field);
8
+ const rules = useFieldEffectiveRules(field);
9
9
  const disabled = !rules.canEdit || rules.disabled;
10
10
  return /*#__PURE__*/React.createElement(UiSelect, Object.assign({}, props, {
11
11
  disabled: disabled,
@@ -1 +1 @@
1
- {"version":3,"names":["React","Select","UiSelect","useEffectiveRules","useModelField","props","field","rules","disabled","canEdit","createElement","Object","assign","options","map","option","value","label"],"sources":["Select.tsx"],"sourcesContent":["import * as React from \"react\";\nimport type { SelectProps as UiSelectProps } from \"@webiny/admin-ui\";\nimport { Select as UiSelect } from \"@webiny/admin-ui\";\nimport { useEffectiveRules, useModelField } from \"@webiny/app-headless-cms-common\";\n\nexport interface Option {\n value: string;\n label: string;\n}\n\nexport interface SelectProps extends UiSelectProps {\n options: Option[];\n}\nexport const Select = (props: SelectProps) => {\n const { field } = useModelField();\n const rules = useEffectiveRules(field);\n\n const disabled = !rules.canEdit || rules.disabled;\n\n return (\n <UiSelect\n {...props}\n disabled={disabled}\n options={props.options.map(option => ({\n value: option.value,\n label: option.label,\n \"data-testid\": `fr.input.${option.label}`\n }))}\n />\n );\n};\n"],"mappings":"AAAA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAE9B,SAASC,MAAM,IAAIC,QAAQ,QAAQ,kBAAkB;AACrD,SAASC,iBAAiB,EAAEC,aAAa,QAAQ,iCAAiC;AAUlF,OAAO,MAAMH,MAAM,GAAII,KAAkB,IAAK;EAC1C,MAAM;IAAEC;EAAM,CAAC,GAAGF,aAAa,CAAC,CAAC;EACjC,MAAMG,KAAK,GAAGJ,iBAAiB,CAACG,KAAK,CAAC;EAEtC,MAAME,QAAQ,GAAG,CAACD,KAAK,CAACE,OAAO,IAAIF,KAAK,CAACC,QAAQ;EAEjD,oBACIR,KAAA,CAAAU,aAAA,CAACR,QAAQ,EAAAS,MAAA,CAAAC,MAAA,KACDP,KAAK;IACTG,QAAQ,EAAEA,QAAS;IACnBK,OAAO,EAAER,KAAK,CAACQ,OAAO,CAACC,GAAG,CAACC,MAAM,KAAK;MAClCC,KAAK,EAAED,MAAM,CAACC,KAAK;MACnBC,KAAK,EAAEF,MAAM,CAACE,KAAK;MACnB,aAAa,EAAE,YAAYF,MAAM,CAACE,KAAK;IAC3C,CAAC,CAAC;EAAE,EACP,CAAC;AAEV,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["React","Select","UiSelect","useFieldEffectiveRules","useModelField","props","field","rules","disabled","canEdit","createElement","Object","assign","options","map","option","value","label"],"sources":["Select.tsx"],"sourcesContent":["import * as React from \"react\";\nimport type { SelectProps as UiSelectProps } from \"@webiny/admin-ui\";\nimport { Select as UiSelect } from \"@webiny/admin-ui\";\nimport { useFieldEffectiveRules, useModelField } from \"@webiny/app-headless-cms-common\";\n\nexport interface Option {\n value: string;\n label: string;\n}\n\nexport interface SelectProps extends UiSelectProps {\n options: Option[];\n}\nexport const Select = (props: SelectProps) => {\n const { field } = useModelField();\n const rules = useFieldEffectiveRules(field);\n\n const disabled = !rules.canEdit || rules.disabled;\n\n return (\n <UiSelect\n {...props}\n disabled={disabled}\n options={props.options.map(option => ({\n value: option.value,\n label: option.label,\n \"data-testid\": `fr.input.${option.label}`\n }))}\n />\n );\n};\n"],"mappings":"AAAA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAE9B,SAASC,MAAM,IAAIC,QAAQ,QAAQ,kBAAkB;AACrD,SAASC,sBAAsB,EAAEC,aAAa,QAAQ,iCAAiC;AAUvF,OAAO,MAAMH,MAAM,GAAII,KAAkB,IAAK;EAC1C,MAAM;IAAEC;EAAM,CAAC,GAAGF,aAAa,CAAC,CAAC;EACjC,MAAMG,KAAK,GAAGJ,sBAAsB,CAACG,KAAK,CAAC;EAE3C,MAAME,QAAQ,GAAG,CAACD,KAAK,CAACE,OAAO,IAAIF,KAAK,CAACC,QAAQ;EAEjD,oBACIR,KAAA,CAAAU,aAAA,CAACR,QAAQ,EAAAS,MAAA,CAAAC,MAAA,KACDP,KAAK;IACTG,QAAQ,EAAEA,QAAS;IACnBK,OAAO,EAAER,KAAK,CAACQ,OAAO,CAACC,GAAG,CAACC,MAAM,KAAK;MAClCC,KAAK,EAAED,MAAM,CAACC,KAAK;MACnBC,KAAK,EAAEF,MAAM,CAACE,KAAK;MACnB,aAAa,EAAE,YAAYF,MAAM,CAACE,KAAK;IAC3C,CAAC,CAAC;EAAE,EACP,CAAC;AAEV,CAAC","ignoreList":[]}