@box/metadata-template-editor 2.3.19 → 2.3.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/metadata-template-editor-form.js +1 -1
- package/dist/chunks/metadata-template-editor.js +1 -1
- package/dist/esm/lib/index.js +1 -1
- package/dist/esm/lib/utils/template-type-conversion/convertTemplateFieldToLocalConfigurator.js +1 -1
- package/dist/esm/lib/utils/template-type-conversion/generateJSONPatchTemplateOperations.js +1 -1
- package/dist/types/lib/metadata-template-editor.d.ts +3 -3
- package/dist/types/lib/types.d.ts +14 -17
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as FieldSelector}from"./field-selector.js";import{t as FieldTypeDropdown}from"./field-type-dropdown.js";import{FieldTypeTiles}from"../esm/lib/components/field-type-tiles/field-type-tiles.js";import{createDefaultFieldValues}from"../esm/lib/components/metadata-field-configurator/utils.js";import{FieldExtensionsContext}from"../esm/lib/components/metadata-field-configurator/context/field-extensions-context.js";import{t as MetadataFieldList}from"./metadata-field-list.js";import messages_default from"../esm/lib/messages.js";import{Button,EmptyState,Link,Text,TextInput}from"@box/blueprint-web";import{FormattedMessage,useIntl}from"react-intl";import{Fragment,jsx,jsxs}from"react/jsx-runtime";import{useEffect,useMemo,useRef}from"react";import clsx from"clsx";import{
|
|
1
|
+
import{t as FieldSelector}from"./field-selector.js";import{t as FieldTypeDropdown}from"./field-type-dropdown.js";import{FieldTypeTiles}from"../esm/lib/components/field-type-tiles/field-type-tiles.js";import{createDefaultFieldValues}from"../esm/lib/components/metadata-field-configurator/utils.js";import{FieldExtensionsContext}from"../esm/lib/components/metadata-field-configurator/context/field-extensions-context.js";import{t as MetadataFieldList}from"./metadata-field-list.js";import messages_default from"../esm/lib/messages.js";import{Button,EmptyState,Link,Text,TextInput}from"@box/blueprint-web";import{FormattedMessage,useIntl}from"react-intl";import{Fragment,jsx,jsxs}from"react/jsx-runtime";import{useEffect,useMemo,useRef}from"react";import clsx from"clsx";import{NoTemplates}from"@box/blueprint-web-assets/illustrations/Medium";import{Form,useFormikContext}from"formik";import '../styles/metadata-template-editor-form.css';var metadata_template_editor_form_module_default={form:`_form_1r59b_1`,fields:`_fields_1r59b_10`,emptyFields:`_emptyFields_1r59b_16`,actions:`_actions_1r59b_21`,fieldsHeader:`_fieldsHeader_1r59b_28`},FIELD_NAME_VARIANT=`bodyDefaultBold`,FIELD_NAME_VARIANT_AS_ELEMENT=`h2`,BOX_METADATA_FIELDS_GUIDE_URL=`https://developer.box.com/guides/metadata/fields/`,MetadataTemplateEditorForm=({formId,onCancel,taxonomyOptions,fetchTaxonomies,hideActions,isEditMode,readOnly=!1,onDirtyStateChange,onValidationChange,fieldExtensions})=>{let intl=useIntl(),{errors,values,setFieldValue,setFieldTouched,isSubmitting,isValid,handleChange,submitCount,dirty,touched}=useFormikContext(),fieldListRef=useRef(null),hasUserFocusedDisplayNameRef=useRef(!1),markDisplayNameUserFocused=()=>{hasUserFocusedDisplayNameRef.current=!0},handleDisplayNameBlur=()=>{hasUserFocusedDisplayNameRef.current&&setFieldTouched(`displayName`,!0)},firstInvalidFieldIndex=useMemo(()=>{if(!Array.isArray(errors.fields))return null;let idx=errors.fields.findIndex(Boolean);return idx>=0?idx:null},[errors.fields]),handleFieldAdd=fieldType=>{let newField=createDefaultFieldValues(fieldType.type);setFieldValue(`fields`,[...values.fields,newField])},handleFieldsChange=fields=>{setFieldValue(`fields`,fields)};useEffect(()=>{onDirtyStateChange?.(dirty)},[dirty,onDirtyStateChange]),useEffect(()=>{onValidationChange?.(isValid)},[isValid,onValidationChange]);let isSaveDisabled=isSubmitting||isEditMode&&!dirty,fieldsContent;fieldsContent=readOnly&&values.fields.length===0?jsx(EmptyState,{size:`large`,illustration:NoTemplates,body:jsx(Text,{as:`p`,children:intl.formatMessage(messages_default.noFields)})}):readOnly?jsx(MetadataFieldList,{ref:fieldListRef,fields:values.fields,taxonomyOptions,fetchTaxonomies,readOnly:!0}):values.fields.length===0?jsxs(Fragment,{children:[jsx(FieldTypeTiles,{onFieldAdd:handleFieldAdd}),jsx(Link,{href:BOX_METADATA_FIELDS_GUIDE_URL,isExternal:!0,target:`_blank`,children:jsx(FormattedMessage,{...messages_default.fieldsLearnMore})})]}):jsxs(Fragment,{children:[jsx(MetadataFieldList,{ref:fieldListRef,fields:values.fields,taxonomyOptions,fetchTaxonomies,onChangeFields:handleFieldsChange,firstInvalidFieldIndex,submitAttemptCount:submitCount}),jsx(FieldTypeDropdown,{onFieldAdd:handleFieldAdd})]});let formElement=jsxs(Form,{noValidate:!0,id:formId,className:metadata_template_editor_form_module_default.form,children:[jsx(`div`,{children:jsx(TextInput,{name:`displayName`,label:intl.formatMessage(messages_default.templateName),placeholder:intl.formatMessage(messages_default.templateNameDescription),value:values.displayName,error:!readOnly&&touched.displayName&&errors.displayName?errors.displayName:void 0,onChange:e=>{handleChange(e)},onPointerDown:markDisplayNameUserFocused,onKeyDown:markDisplayNameUserFocused,onBlur:handleDisplayNameBlur,readOnly})}),jsxs(`div`,{className:metadata_template_editor_form_module_default.fieldsHeader,children:[jsx(Text,{as:FIELD_NAME_VARIANT_AS_ELEMENT,variant:FIELD_NAME_VARIANT,children:jsx(FormattedMessage,{...!readOnly&&values.fields.length===0?messages_default.fieldsAddFirst:messages_default.fields})}),values.fields.length>0&&jsx(FieldSelector,{fields:values.fields,onSelect:fieldId=>fieldListRef.current?.scrollToAndExpand(fieldId)})]}),jsx(`div`,{className:clsx(metadata_template_editor_form_module_default.fields,{[metadata_template_editor_form_module_default.emptyFields]:values.fields.length===0&&readOnly}),children:fieldsContent}),!hideActions&&jsx(`div`,{className:metadata_template_editor_form_module_default.actions,children:readOnly?onCancel&&jsx(Button,{variant:`primary`,type:`button`,onClick:onCancel,children:intl.formatMessage(messages_default.close)}):jsxs(Fragment,{children:[onCancel&&jsx(Button,{variant:`secondary`,type:`button`,onClick:onCancel,loading:isSubmitting,disabled:isSubmitting,loadingAriaLabel:intl.formatMessage(messages_default.submitting),children:intl.formatMessage(messages_default.cancel)}),jsx(Button,{variant:`primary`,type:`submit`,disabled:isSaveDisabled,children:intl.formatMessage(messages_default.save)})]})})]});return fieldExtensions===void 0?formElement:jsx(FieldExtensionsContext.Provider,{value:fieldExtensions,children:formElement})};export{MetadataTemplateEditorForm as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o as MetadataTemplateEditorMode}from"./types.js";import{EditorConfigContext}from"../esm/lib/components/metadata-field-configurator/context/editor-config-context.js";import"../esm/lib/utils/constants.js";import ConfirmationModal from"../esm/lib/components/metadata-field-configurator/components/confirmation-modal/confirmation-modal.js";import messages_default from"../esm/lib/messages.js";import{useMetadataTemplateFormSchema}from"../esm/lib/hooks/useMetadataTemplateFormSchema.js";import{convertApiMetadataTemplateFieldToLocalConfiguratorField}from"../esm/lib/utils/template-type-conversion/convertTemplateFieldToLocalConfigurator.js";import{
|
|
1
|
+
import{o as MetadataTemplateEditorMode}from"./types.js";import{EditorConfigContext}from"../esm/lib/components/metadata-field-configurator/context/editor-config-context.js";import"../esm/lib/utils/constants.js";import ConfirmationModal from"../esm/lib/components/metadata-field-configurator/components/confirmation-modal/confirmation-modal.js";import messages_default from"../esm/lib/messages.js";import{t as MetadataTemplateEditorForm}from"./metadata-template-editor-form.js";import{useMetadataTemplateFormSchema}from"../esm/lib/hooks/useMetadataTemplateFormSchema.js";import{convertApiMetadataTemplateFieldToLocalConfiguratorField}from"../esm/lib/utils/template-type-conversion/convertTemplateFieldToLocalConfigurator.js";import{generateJSONPatchTemplateOperations}from"../esm/lib/utils/template-type-conversion/generateJSONPatchTemplateOperations.js";import{mapFieldsWithUniqueKeys}from"../esm/lib/utils/template-type-conversion/mapFieldsWithUniqueKeys.js";import{EmptyState,LoadingIndicator,Text,useNotification}from"@box/blueprint-web";import{useIntl}from"react-intl";import{jsx,jsxs}from"react/jsx-runtime";import{forwardRef,useCallback,useEffect,useImperativeHandle,useMemo,useState}from"react";import{ArrowsRotating}from"@box/blueprint-web-assets/icons/Line";import{ErrorState404}from"@box/blueprint-web-assets/illustrations/Medium";import{Formik}from"formik";import '../styles/metadata-template-editor.css';var metadata_template_editor_module_default={loading:`_loading_fd3t9_1`,error:`_error_fd3t9_8`},DEFAULT_VALUES={displayName:``,templateKey:``,fields:[],hidden:!1},MetadataTemplateEditor=forwardRef(function({onCancel,onDirtyStateChange,onValidationChange,onSubmitError,onTemplateLoad,taxonomyOptions,fetchTaxonomies,disabledFieldTypes,taxonomyInitialStateLabels,formId,hideActions=!1,fieldExtensions,...modeProps},ref){let schema=useMetadataTemplateFormSchema(),{formatMessage}=useIntl(),{addNotification}=useNotification(),isEditMode=modeProps.mode===MetadataTemplateEditorMode.Edit,isReadOnlyMode=modeProps.mode===MetadataTemplateEditorMode.ReadOnly,[isDirty,setIsDirty]=useState(!1),[isUnsavedChangesModalOpen,setIsUnsavedChangesModalOpen]=useState(!1),handleCancel=useCallback(()=>{isDirty?setIsUnsavedChangesModalOpen(!0):onCancel?.()},[isDirty,onCancel]);useImperativeHandle(ref,()=>({requestClose:handleCancel}),[handleCancel]);let handleDirtyStateChange=useCallback(dirty=>{setIsDirty(dirty),onDirtyStateChange?.(dirty)},[onDirtyStateChange]),[isLoading,setIsLoading]=useState(isEditMode||isReadOnlyMode),[hasFetchError,setHasFetchError]=useState(!1),[retryCount,setRetryCount]=useState(0),[fetchedValues,setFetchedValues]=useState(void 0),fetchTemplate=isEditMode||isReadOnlyMode?modeProps.fetchTemplate:void 0,handleRetry=()=>{setRetryCount(c=>c+1)};useEffect(()=>{if(!fetchTemplate)return;let cancelled=!1;return setIsLoading(!0),setHasFetchError(!1),setFetchedValues(void 0),(async()=>{try{let response=await fetchTemplate();cancelled||setFetchedValues(response)}catch{cancelled||setHasFetchError(!0)}finally{cancelled||setIsLoading(!1)}})(),()=>{cancelled=!0}},[fetchTemplate,retryCount]),useEffect(()=>{fetchedValues!==void 0&&onTemplateLoad?.(fetchedValues)},[fetchedValues,onTemplateLoad]);let createNamespace=isEditMode||isReadOnlyMode?void 0:modeProps.namespace,mergedInitialValues=useMemo(()=>fetchedValues?{displayName:fetchedValues.displayName,templateKey:fetchedValues.templateKey,namespace:fetchedValues.namespace,hidden:fetchedValues.hidden,fields:fetchedValues.fields.map(field=>convertApiMetadataTemplateFieldToLocalConfiguratorField(field))}:{...DEFAULT_VALUES,namespace:createNamespace??``},[fetchedValues,createNamespace]),editorConfigValue=useMemo(()=>({disabledFieldTypes,taxonomyInitialStateLabels}),[disabledFieldTypes,taxonomyInitialStateLabels]);return isLoading?jsx(`div`,{className:metadata_template_editor_module_default.loading,children:jsx(LoadingIndicator,{size:`large`,"aria-label":formatMessage(messages_default.loading)})}):hasFetchError?jsx(`div`,{className:metadata_template_editor_module_default.error,children:jsx(EmptyState,{body:jsx(Text,{as:`p`,children:formatMessage(messages_default.fetchError)}),illustration:ErrorState404,size:`large`,children:jsx(EmptyState.PrimaryAction,{startIcon:ArrowsRotating,onClick:handleRetry,children:formatMessage(messages_default.reload)})})}):jsxs(EditorConfigContext.Provider,{value:editorConfigValue,children:[jsx(Formik,{initialValues:mergedInitialValues,validationSchema:isReadOnlyMode?void 0:schema,onSubmit:async values=>{if(!isReadOnlyMode)try{if(isEditMode){let patchItems=generateJSONPatchTemplateOperations(mergedInitialValues,values);await modeProps.onEditTemplate(patchItems,{namespaceFQN:mergedInitialValues.namespace,templateKey:mergedInitialValues.templateKey})}else{let convertedFields=mapFieldsWithUniqueKeys(values.fields),createBody={namespace:values.namespace,templateKey:values.templateKey,displayName:values.displayName,hidden:values.hidden,fields:convertedFields};await modeProps.onCreateTemplate(createBody)}addNotification({sensitivity:`foreground`,variant:`success`,styledText:formatMessage(messages_default.saveSuccessNotification),typeIconAriaLabel:formatMessage(messages_default.notificationSuccessIconAriaLabel),closeButtonAriaLabel:formatMessage(messages_default.notificationCloseButtonAriaLabel)})}catch(error){let errorMessage;if(error instanceof Error&&`status`in error){let{status}=error;errorMessage=formatMessage(status===409?messages_default.displayNameUsedBefore:messages_default.saveErrorNotification)}else errorMessage=formatMessage(messages_default.saveErrorNotification);addNotification({sensitivity:`foreground`,variant:`error`,styledText:errorMessage,typeIconAriaLabel:formatMessage(messages_default.notificationErrorIconAriaLabel),closeButtonAriaLabel:formatMessage(messages_default.notificationCloseButtonAriaLabel)});try{onSubmitError?.(error)}catch{}throw error}},children:jsx(MetadataTemplateEditorForm,{formId,onCancel:handleCancel,taxonomyOptions,fetchTaxonomies,hideActions,isEditMode,readOnly:isReadOnlyMode,onDirtyStateChange:handleDirtyStateChange,onValidationChange,fieldExtensions})}),isUnsavedChangesModalOpen&&jsx(ConfirmationModal,{onClose:()=>setIsUnsavedChangesModalOpen(!1),onConfirm:()=>{setIsUnsavedChangesModalOpen(!1),onCancel?.()},title:formatMessage(messages_default.unsavedChangesTitle),body:formatMessage(messages_default.unsavedChangesBody),confirmLabel:formatMessage(messages_default.unsavedChangesDiscard),cancelLabel:formatMessage(messages_default.unsavedChangesKeepEditing)})]})});export{MetadataTemplateEditor as t};
|
package/dist/esm/lib/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{EditorConfigContext,useEditorConfig}from"./components/metadata-field-configurator/context/editor-config-context.js";import{useTemplateNameSchema}from"./hooks/useTemplateNameSchema.js";import{useMetadataTemplateFormSchema}from"./hooks/useMetadataTemplateFormSchema.js";import{
|
|
1
|
+
import{EditorConfigContext,useEditorConfig}from"./components/metadata-field-configurator/context/editor-config-context.js";import{useTemplateNameSchema}from"./hooks/useTemplateNameSchema.js";import{useMetadataTemplateFormSchema}from"./hooks/useMetadataTemplateFormSchema.js";import{t as MetadataTemplateEditor}from"../../chunks/metadata-template-editor.js";import{convertApiMetadataTemplateFieldToLocalConfiguratorField}from"./utils/template-type-conversion/convertTemplateFieldToLocalConfigurator.js";import{generateJSONPatchTemplateOperations}from"./utils/template-type-conversion/generateJSONPatchTemplateOperations.js";import{mapFieldsWithUniqueKeys}from"./utils/template-type-conversion/mapFieldsWithUniqueKeys.js";export{EditorConfigContext,MetadataTemplateEditor,convertApiMetadataTemplateFieldToLocalConfiguratorField,generateJSONPatchTemplateOperations,mapFieldsWithUniqueKeys,useEditorConfig,useMetadataTemplateFormSchema,useTemplateNameSchema};
|
package/dist/esm/lib/utils/template-type-conversion/convertTemplateFieldToLocalConfigurator.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as FieldType,c as TaxonomySelection,n as ApiMetadataTemplateFieldType}from"../../../../chunks/types.js";import uniqueId from"lodash/uniqueId";var convertApiMetadataTemplateFieldToLocalConfiguratorField=(field,isReadOnly=!1)=>{let{key,displayName:name,description,type,
|
|
1
|
+
import{a as FieldType,c as TaxonomySelection,n as ApiMetadataTemplateFieldType}from"../../../../chunks/types.js";import uniqueId from"lodash/uniqueId";var convertApiMetadataTemplateFieldToLocalConfiguratorField=(field,isReadOnly=!1)=>{let{key,displayName:name,description,type,hidden}=field,baseField={key,name,id:uniqueId(),description:description||``,hidden,dropdown:{allowMultipleSelections:!1,options:[],isAllowMultipleSelectionsEnabled:!1},taxonomy:{availableTaxonomies:[],allowMultipleSelections:!1,selection:TaxonomySelection.RequireSpecific,selectedLevels:[],taxonomySearchValue:``,taxonomyKey:``,namespace:``},isFieldNew:!1,isFieldReadOnly:isReadOnly};switch(type){case ApiMetadataTemplateFieldType.String:return{...baseField,type:FieldType.Text};case ApiMetadataTemplateFieldType.Float:return{...baseField,type:FieldType.Number};case ApiMetadataTemplateFieldType.Date:return{...baseField,type:FieldType.Date};case ApiMetadataTemplateFieldType.Enum:case ApiMetadataTemplateFieldType.MultiSelect:return{...baseField,type:FieldType.Dropdown,dropdown:{options:field.options?.map(option=>({id:uniqueId(),key:option.key,isNew:!1}))||[],allowMultipleSelections:type===ApiMetadataTemplateFieldType.MultiSelect,isAllowMultipleSelectionsEnabled:type===ApiMetadataTemplateFieldType.MultiSelect}};case ApiMetadataTemplateFieldType.Taxonomy:return{...baseField,type:FieldType.Taxonomy,taxonomy:{availableTaxonomies:[],allowMultipleSelections:field.optionsRules?.multiSelect||!1,selection:field.optionsRules?.selectableLevels?.length===1?TaxonomySelection.RequireSpecific:TaxonomySelection.AllowAny,selectedLevels:field.optionsRules.selectableLevels,taxonomySearchValue:``,taxonomyKey:field.taxonomyKey||``,namespace:field.namespace||``}};default:throw Error(`Unsupported field type: ${type}`)}};export{convertApiMetadataTemplateFieldToLocalConfiguratorField};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as FieldType,l as TemplateOperations,n as ApiMetadataTemplateFieldType,t as AllOps}from"../../../../chunks/types.js";import"../constants.js";import{generateKey}from"../key-generation.js";import{resolveSelectableLevels}from"./convertLocalConfiguratorToTemplateField.js";import isEqual from"lodash/isEqual";var configuratorFieldTypeToMetadataFieldTypeMap={[FieldType.Text]:ApiMetadataTemplateFieldType.String,[FieldType.Date]:ApiMetadataTemplateFieldType.Date,[FieldType.Number]:ApiMetadataTemplateFieldType.Float};function handleTemplateLevelChanges(initialTemplate,updatedTemplate){let patchItems=[],data={};return initialTemplate.displayName!==updatedTemplate.displayName&&(data.displayName=updatedTemplate.displayName),initialTemplate.hidden!==updatedTemplate.hidden&&(data.hidden=updatedTemplate.hidden),Object.keys(data).length>0&&patchItems.push({op:AllOps.EditTemplate,data}),patchItems}function handleFieldEdits(field,initialField,patchItems){if(field.description!==initialField.description||field.name!==initialField.name||field.hidden!==initialField.hidden){let data={};field.name!==initialField.name&&(data.displayName=field.name),field.description!==initialField.description&&(data.description=field.description),field.hidden!==initialField.hidden&&(data.hidden=field.hidden),patchItems.push({op:AllOps.EditField,fieldKey:field.key,data})}}function handleDropdownOptionChanges(field,initialField,patchItems){if(field.type!==FieldType.Dropdown||initialField?.type!==FieldType.Dropdown)return;let isMultiSelect=field.dropdown.allowMultipleSelections,initialOptions=initialField.dropdown.options,updatedOptions=field.dropdown.options,initialOptionKeysMap=new Map(initialOptions.map(option=>[option.id,option])),updatedOptionKeysMap=new Map(updatedOptions.map(option=>[option.id,option]));initialOptions.forEach(option=>{if(!updatedOptionKeysMap.has(option.id)&&field.key){if(!option.key)throw Error(`optionKey is required`);patchItems.push({fieldKey:field.key,...isMultiSelect?{op:AllOps.RemoveMultiSelectOption,multiSelectOptionKey:option.key}:{op:AllOps.RemoveEnumOption,enumOptionKey:option.key}})}}),updatedOptions.forEach(option=>{let initialOption=initialOptionKeysMap.get(option.id);if(!initialOption)patchItems.push({op:isMultiSelect?AllOps.AddMultiSelectOption:AllOps.AddEnumOption,fieldKey:field.key,data:{key:option.key}});else if(initialOption.key!==option.key){if(!option.key)throw Error(`optionKey is required`);patchItems.push({fieldKey:field.key,...isMultiSelect?{op:AllOps.EditMultiSelectOption,multiSelectOptionKey:initialOption.key}:{op:AllOps.EditEnumOption,enumOptionKey:initialOption.key},data:{key:option.key}})}});let initialOptionOrder=initialOptions.map(option=>option.key),updatedOptionOrder=updatedOptions.map(option=>option.key);isEqual(initialOptionOrder,updatedOptionOrder)||patchItems.push({fieldKey:field.key,...isMultiSelect?{op:AllOps.ReorderMultiSelectOptions,multiSelectOptionKeys:updatedOptionOrder}:{op:AllOps.ReorderEnumOptions,enumOptionKeys:updatedOptionOrder}})}function buildApiFieldData(field,key){let baseData={displayName:field.name,
|
|
1
|
+
import{a as FieldType,l as TemplateOperations,n as ApiMetadataTemplateFieldType,t as AllOps}from"../../../../chunks/types.js";import"../constants.js";import{generateKey}from"../key-generation.js";import{resolveSelectableLevels}from"./convertLocalConfiguratorToTemplateField.js";import isEqual from"lodash/isEqual";var configuratorFieldTypeToMetadataFieldTypeMap={[FieldType.Text]:ApiMetadataTemplateFieldType.String,[FieldType.Date]:ApiMetadataTemplateFieldType.Date,[FieldType.Number]:ApiMetadataTemplateFieldType.Float};function handleTemplateLevelChanges(initialTemplate,updatedTemplate){let patchItems=[],data={};return initialTemplate.displayName!==updatedTemplate.displayName&&(data.displayName=updatedTemplate.displayName),initialTemplate.hidden!==updatedTemplate.hidden&&(data.hidden=updatedTemplate.hidden),Object.keys(data).length>0&&patchItems.push({op:AllOps.EditTemplate,data}),patchItems}function handleFieldEdits(field,initialField,patchItems){if(field.description!==initialField.description||field.name!==initialField.name||field.hidden!==initialField.hidden){let data={};field.name!==initialField.name&&(data.displayName=field.name),field.description!==initialField.description&&(data.description=field.description),field.hidden!==initialField.hidden&&(data.hidden=field.hidden),patchItems.push({op:AllOps.EditField,fieldKey:field.key,data})}}function handleDropdownOptionChanges(field,initialField,patchItems){if(field.type!==FieldType.Dropdown||initialField?.type!==FieldType.Dropdown)return;let isMultiSelect=field.dropdown.allowMultipleSelections,initialOptions=initialField.dropdown.options,updatedOptions=field.dropdown.options,initialOptionKeysMap=new Map(initialOptions.map(option=>[option.id,option])),updatedOptionKeysMap=new Map(updatedOptions.map(option=>[option.id,option]));initialOptions.forEach(option=>{if(!updatedOptionKeysMap.has(option.id)&&field.key){if(!option.key)throw Error(`optionKey is required`);patchItems.push({fieldKey:field.key,...isMultiSelect?{op:AllOps.RemoveMultiSelectOption,multiSelectOptionKey:option.key}:{op:AllOps.RemoveEnumOption,enumOptionKey:option.key}})}}),updatedOptions.forEach(option=>{let initialOption=initialOptionKeysMap.get(option.id);if(!initialOption)patchItems.push({op:isMultiSelect?AllOps.AddMultiSelectOption:AllOps.AddEnumOption,fieldKey:field.key,data:{key:option.key}});else if(initialOption.key!==option.key){if(!option.key)throw Error(`optionKey is required`);patchItems.push({fieldKey:field.key,...isMultiSelect?{op:AllOps.EditMultiSelectOption,multiSelectOptionKey:initialOption.key}:{op:AllOps.EditEnumOption,enumOptionKey:initialOption.key},data:{key:option.key}})}});let initialOptionOrder=initialOptions.map(option=>option.key),updatedOptionOrder=updatedOptions.map(option=>option.key);isEqual(initialOptionOrder,updatedOptionOrder)||patchItems.push({fieldKey:field.key,...isMultiSelect?{op:AllOps.ReorderMultiSelectOptions,multiSelectOptionKeys:updatedOptionOrder}:{op:AllOps.ReorderEnumOptions,enumOptionKeys:updatedOptionOrder}})}function buildApiFieldData(field,key){let baseData={displayName:field.name,hidden:field.hidden,key,description:field.description};return field.type===FieldType.Taxonomy?{...baseData,type:ApiMetadataTemplateFieldType.Taxonomy,taxonomyKey:field.taxonomy.taxonomyKey,optionsRules:{selectableLevels:resolveSelectableLevels(field),multiSelect:field.taxonomy.allowMultipleSelections},namespace:field.taxonomy.namespace}:field.type===FieldType.Dropdown?{...baseData,type:field.dropdown.allowMultipleSelections?ApiMetadataTemplateFieldType.MultiSelect:ApiMetadataTemplateFieldType.Enum,options:field.dropdown.options.map(option=>({key:option.key}))}:{...baseData,type:configuratorFieldTypeToMetadataFieldTypeMap[field.type]}}function handleNewField(field,knownKeys,patchItems){let uniqueKey=generateKey({displayName:field.name,existingKeys:Array.from(knownKeys),defaultKey:`field`,maxKeyLength:256});return knownKeys.add(uniqueKey),patchItems.push({op:AllOps.AddField,fieldKey:uniqueKey,data:buildApiFieldData(field,uniqueKey)}),{...field,key:uniqueKey}}function handleFieldChanges(initialFields,updatedFields){let initialFieldMap=new Map(initialFields.map(field=>[field.key,field])),knownKeys=new Set([...initialFields.map(f=>f.key),...updatedFields.map(f=>f.key)].filter(Boolean)),removePatchItems=[],updatedFieldKeySet=new Set(updatedFields.filter(f=>f.key).map(f=>f.key));initialFields.forEach(field=>{updatedFieldKeySet.has(field.key)||removePatchItems.push({op:AllOps.RemoveField,fieldKey:field.key})});let addEditPatchItems=[],resolvedFields=[];return updatedFields.forEach(field=>{let initialField=initialFieldMap.get(field.key);if(!initialField){resolvedFields.push(handleNewField(field,knownKeys,addEditPatchItems));return}resolvedFields.push(field),handleFieldEdits(field,initialField,addEditPatchItems),handleDropdownOptionChanges(field,initialField,addEditPatchItems)}),{patchItems:[...removePatchItems,...addEditPatchItems],resolvedFields}}function handleFieldReordering(initialFields,updatedFields){let initialFieldOrder=initialFields.map(field=>field.key).filter(Boolean),updatedFieldOrder=updatedFields.map(field=>field.key).filter(Boolean);return initialFieldOrder.length!==updatedFieldOrder.length||initialFieldOrder.some((key,i)=>key!==updatedFieldOrder[i])?[{op:AllOps.ReorderFields,fieldKeys:updatedFieldOrder}]:[]}function generateJSONPatchTemplateOperations(initialTemplate,updatedTemplate){let patchItems=[];patchItems.push(...handleTemplateLevelChanges(initialTemplate,updatedTemplate));let{patchItems:fieldPatchItems,resolvedFields}=handleFieldChanges(initialTemplate.fields||[],updatedTemplate.fields||[]);return patchItems.push(...fieldPatchItems),patchItems.push(...handleFieldReordering(initialTemplate.fields||[],resolvedFields)),patchItems}function generateJSONPatchTemplateOperationToUpdateTemplateName(displayName){return[{op:TemplateOperations.EditTemplate,data:{displayName}}]}export{configuratorFieldTypeToMetadataFieldTypeMap,generateJSONPatchTemplateOperationToUpdateTemplateName,generateJSONPatchTemplateOperations};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { FieldType, MetadataTemplateCreateBody, MetadataTemplateEditorMode, MetadataTemplatePatchItem, MetadataTemplateApiResponse } from './types';
|
|
2
|
-
import { MetadataFieldListProps } from './components/metadata-field-list';
|
|
3
|
-
import { FieldConfiguratorExtension } from './components/metadata-field-configurator/context/field-extensions-context';
|
|
4
1
|
import { TaxonomyInitialStateLabels } from './components/metadata-field-configurator/context/editor-config-context';
|
|
2
|
+
import { FieldConfiguratorExtension } from './components/metadata-field-configurator/context/field-extensions-context';
|
|
3
|
+
import { MetadataFieldListProps } from './components/metadata-field-list';
|
|
4
|
+
import { FieldType, MetadataTemplateApiResponse, MetadataTemplateCreateBody, MetadataTemplateEditorMode, MetadataTemplatePatchItem } from './types';
|
|
5
5
|
type MetadataTemplateEditorCommonProps = {
|
|
6
6
|
/** Called when the user dismisses the form without saving. */
|
|
7
7
|
onCancel?: () => void;
|
|
@@ -127,7 +127,7 @@ export type ApiMetadataTemplateFieldBase = {
|
|
|
127
127
|
key: string;
|
|
128
128
|
displayName: string;
|
|
129
129
|
description?: string;
|
|
130
|
-
|
|
130
|
+
hidden: boolean;
|
|
131
131
|
};
|
|
132
132
|
export type ApiMetadataTemplateTextField = {
|
|
133
133
|
type: ApiMetadataTemplateFieldType.String;
|
|
@@ -157,32 +157,29 @@ type MetadataTemplateBase = {
|
|
|
157
157
|
templateKey: string;
|
|
158
158
|
displayName: string;
|
|
159
159
|
};
|
|
160
|
+
/**
|
|
161
|
+
* Metadata template as returned by GET endpoints (e.g. get template by ID).
|
|
162
|
+
* Matches the Box API shape — visibility is `hidden` on both template and fields.
|
|
163
|
+
*/
|
|
160
164
|
export type MetadataTemplateApiResponse = MetadataTemplateBase & {
|
|
161
165
|
fields: ApiMetadataTemplateField[];
|
|
162
|
-
|
|
166
|
+
hidden: boolean;
|
|
163
167
|
};
|
|
168
|
+
/**
|
|
169
|
+
* Form values for the metadata template editor/creator.
|
|
170
|
+
* Field shapes are converted from the API into `FieldData` for the configurator UI.
|
|
171
|
+
*/
|
|
164
172
|
export type MetadataTemplateEditorFormValues = MetadataTemplateBase & {
|
|
165
|
-
/**
|
|
166
|
-
this is a parameter after type conversion from api (MetadataTemplateField)
|
|
167
|
-
for easier handling in the field editor
|
|
168
|
-
*/
|
|
169
173
|
fields: FieldData[];
|
|
170
|
-
/**
|
|
171
|
-
* This visibility property parameter is different from the API response's `isHidden`
|
|
172
|
-
because there is a param name mismatch between get and put/post endpoints (`isHidden` vs `hidden`)
|
|
173
|
-
*/
|
|
174
174
|
hidden: boolean;
|
|
175
175
|
};
|
|
176
176
|
/**
|
|
177
|
-
* A template field as expected by
|
|
178
|
-
*
|
|
177
|
+
* A template field as expected by create (POST) and AddField patch payloads.
|
|
178
|
+
* Same visibility property (`hidden`) as the GET response field shape.
|
|
179
179
|
*/
|
|
180
|
-
export type MetadataTemplateFieldCreateBody =
|
|
181
|
-
hidden: boolean;
|
|
182
|
-
} & (ApiMetadataTemplateTextField | ApiMetadataTemplateNumberField | ApiMetadataTemplateDateField | ApiMetadataTemplateTaxonomyField | ApiMetadataTemplateDropdownField);
|
|
180
|
+
export type MetadataTemplateFieldCreateBody = ApiMetadataTemplateField;
|
|
183
181
|
/**
|
|
184
182
|
* The full request body sent to the create (POST) endpoint.
|
|
185
|
-
* Fields are in the converted API-ready shape (with `hidden` instead of `isHidden`).
|
|
186
183
|
*/
|
|
187
184
|
export type MetadataTemplateCreateBody = MetadataTemplateBase & {
|
|
188
185
|
hidden: boolean;
|
|
@@ -238,7 +235,7 @@ interface EditTemplateOperation extends BaseOperation {
|
|
|
238
235
|
interface AddFieldOperation extends BaseOperation {
|
|
239
236
|
op: FieldOperations.AddField;
|
|
240
237
|
fieldKey?: string;
|
|
241
|
-
data:
|
|
238
|
+
data: MetadataTemplateFieldCreateBody;
|
|
242
239
|
}
|
|
243
240
|
interface ReorderFieldsOperation extends BaseOperation {
|
|
244
241
|
op: FieldOperations.ReorderFields;
|