@box/metadata-editor 2.4.0 → 2.4.1
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/utils2.js +1 -1
- package/dist/esm/lib/components/metadata-editor-fields/components/ai-suggestion-field/utils.js +1 -1
- package/dist/esm/lib/components/metadata-editor-fields/components/metadata-user-field/metadata-user-field.js +1 -0
- package/dist/esm/lib/components/metadata-editor-fields/editor-field-types.js +1 -1
- package/dist/esm/lib/components/metadata-editor-fields/metadata-editor-field-wrapper.js +1 -1
- package/dist/esm/lib/components/metadata-editor-fields/metadata-editor-fields.js +1 -1
- package/dist/esm/lib/components/metadata-instance-editor/subcomponents/metadata-instance-form/metadata-instance-form.js +1 -1
- package/dist/types/lib/components/metadata-editor-fields/components/metadata-user-field/metadata-user-field.d.ts +3 -0
- package/dist/types/lib/components/metadata-editor-fields/editor-field-types.d.ts +1 -0
- package/dist/types/lib/components/metadata-editor-fields/types.d.ts +1 -0
- package/dist/types/lib/components/metadata-instance-editor/subcomponents/metadata-instance-form/types.d.ts +2 -0
- package/dist/types/lib/test-utils/sample-data.d.ts +6 -1
- package/dist/types/lib/types.d.ts +9 -3
- package/package.json +12 -12
package/dist/chunks/utils2.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{TEMPLATE_CUSTOM_PROPERTIES}from"../esm/lib/constants.js";import isEqual from"lodash/isEqual";import isArray from"lodash/isArray";import isEmpty from"lodash/isEmpty";var JSONPatchOp={ADD:`add`,REMOVE:`remove`,REPLACE:`replace`,TEST:`test`},AI_ACCEPTED_PROCESS=`AI_ACCEPTED`,AI_EXTRACTED_PROCESS=`AI_EXTRACTED`,getAiExtractedOperations=(key,originalField,newField)=>{let isValueNewlyExtracted=!originalField.isExtracted&&newField.isExtracted,isTargetLocationChanged=newField.targetLocation&&!isEqual(originalField.targetLocation,newField.targetLocation);return isValueNewlyExtracted||isTargetLocationChanged?[getAddOperation(`${key}/process`,AI_EXTRACTED_PROCESS)]:[]},isScoreUnchanged=(a,b)=>a.value===b.value&&a.level===b.level&&a.isAccepted===b.isAccepted,isFieldEmpty=field=>field.value===void 0||field.value===null||field.value===``||isArray(field.value)&&isEmpty(field.value),getConfidenceScoreOperations=(key,originalField,newField)=>{let originalScore=originalField.confidenceScore,newScore=newField.confidenceScore;return!newScore||originalScore&&isScoreUnchanged(originalScore,newScore)?[]:getScoreUpsertOps(key,newScore)},getScoreUpsertOps=(key,newScore)=>{let ops=[];return newScore.isAccepted&&ops.push(getAddOperation(`${key}/process`,AI_ACCEPTED_PROCESS)),ops.push(getAddOperation(`${key}/confidenceScore`,newScore.value),getAddOperation(`${key}/confidenceLevel`,newScore.level)),ops},getTargetLocationOperations=(key,originalField,newField)=>{let originalTargetLocation=originalField.targetLocation,newTargetLocation=newField.targetLocation,originalAcceptanceStatus=originalField.confidenceScore?.isAccepted??!1,newAcceptanceStatus=newField.confidenceScore?.isAccepted??!1,isValueNewlyAccepted=!originalAcceptanceStatus&&newAcceptanceStatus;return newTargetLocation&&(!isEqual(originalTargetLocation,newTargetLocation)||isValueNewlyAccepted)?[getAddOperation(`${key}/targetLocation`,JSON.stringify(newTargetLocation))]:[]},createJSONPatch=(formValues,originalData)=>{let operations=[],newFields=formValues.metadata.fields,isCustomMetadataInstance=originalData.templateKey===TEMPLATE_CUSTOM_PROPERTIES,originalDataMap=new Map(originalData.fields.map(item=>[item.key,item])),newDataMap=new Map(newFields.map(item=>[item.key,item]));return newFields.forEach(newField=>{let originalField=originalDataMap.get(newField.key);if(!originalField){operations.push(getAddOperation(newField.key,getFormatedFieldValue(newField)));return}if(isEqual(newField,originalField))return;let isValueChanged=!isEqual(newField.value,originalField.value);!isCustomMetadataInstance&&isFieldEmpty(originalField)&&!isFieldEmpty(newField)?operations.push(getAddOperation(newField.key,getFormatedFieldValue(newField))):(!isCustomMetadataInstance&&isValueChanged&&originalField.value!==null&&!isFieldEmpty(newField)||isCustomMetadataInstance&&isValueChanged)&&(operations.push(getTestOperation(originalField.key,getFormatedFieldValue(originalField))),operations.push(getReplaceOperation(newField.key,getFormatedFieldValue(newField)))),operations.push(...getAiExtractedOperations(newField.key,originalField,newField)),operations.push(...getConfidenceScoreOperations(newField.key,originalField,newField)),operations.push(...getTargetLocationOperations(newField.key,originalField,newField))}),originalData.fields.forEach(originalField=>{let newField=newDataMap.get(originalField.key);(!newField||!isCustomMetadataInstance&&isFieldEmpty(newField)&&!isFieldEmpty(originalField))&&(operations.push(getTestOperation(originalField.key,getFormatedFieldValue(originalField))),operations.push(getRemoveOperation(originalField.key)))}),operations},getFormatedFieldValue=field=>field.type===`float`?Number(field.value):field.type===`taxonomy`?field.value.map(option=>option.value):field.type===`date`&&typeof field.value==`string`?new Date(field.value).toISOString():field.value,getTestOperation=(key,value)=>({op:JSONPatchOp.TEST,path:`/${key}`,value}),getAddOperation=(key,value)=>({op:JSONPatchOp.ADD,path:`/${key}`,value}),getRemoveOperation=key=>({op:JSONPatchOp.REMOVE,path:`/${key}`}),getReplaceOperation=(key,value)=>({op:JSONPatchOp.REPLACE,path:`/${key}`,value});export{getFormatedFieldValue as n,JSONPatchOp as r,createJSONPatch as t};
|
|
1
|
+
import{TEMPLATE_CUSTOM_PROPERTIES}from"../esm/lib/constants.js";import isEqual from"lodash/isEqual";import isArray from"lodash/isArray";import isEmpty from"lodash/isEmpty";var JSONPatchOp={ADD:`add`,REMOVE:`remove`,REPLACE:`replace`,TEST:`test`},AI_ACCEPTED_PROCESS=`AI_ACCEPTED`,AI_EXTRACTED_PROCESS=`AI_EXTRACTED`,getAiExtractedOperations=(key,originalField,newField)=>{let isValueNewlyExtracted=!originalField.isExtracted&&newField.isExtracted,isTargetLocationChanged=newField.targetLocation&&!isEqual(originalField.targetLocation,newField.targetLocation);return isValueNewlyExtracted||isTargetLocationChanged?[getAddOperation(`${key}/process`,AI_EXTRACTED_PROCESS)]:[]},isScoreUnchanged=(a,b)=>a.value===b.value&&a.level===b.level&&a.isAccepted===b.isAccepted,isFieldEmpty=field=>field.value===void 0||field.value===null||field.value===``||isArray(field.value)&&isEmpty(field.value),getConfidenceScoreOperations=(key,originalField,newField)=>{let originalScore=originalField.confidenceScore,newScore=newField.confidenceScore;return!newScore||originalScore&&isScoreUnchanged(originalScore,newScore)?[]:getScoreUpsertOps(key,newScore)},getScoreUpsertOps=(key,newScore)=>{let ops=[];return newScore.isAccepted&&ops.push(getAddOperation(`${key}/process`,AI_ACCEPTED_PROCESS)),ops.push(getAddOperation(`${key}/confidenceScore`,newScore.value),getAddOperation(`${key}/confidenceLevel`,newScore.level)),ops},getTargetLocationOperations=(key,originalField,newField)=>{let originalTargetLocation=originalField.targetLocation,newTargetLocation=newField.targetLocation,originalAcceptanceStatus=originalField.confidenceScore?.isAccepted??!1,newAcceptanceStatus=newField.confidenceScore?.isAccepted??!1,isValueNewlyAccepted=!originalAcceptanceStatus&&newAcceptanceStatus;return newTargetLocation&&(!isEqual(originalTargetLocation,newTargetLocation)||isValueNewlyAccepted)?[getAddOperation(`${key}/targetLocation`,JSON.stringify(newTargetLocation))]:[]},createJSONPatch=(formValues,originalData)=>{let operations=[],newFields=formValues.metadata.fields,isCustomMetadataInstance=originalData.templateKey===TEMPLATE_CUSTOM_PROPERTIES,originalDataMap=new Map(originalData.fields.map(item=>[item.key,item])),newDataMap=new Map(newFields.map(item=>[item.key,item]));return newFields.forEach(newField=>{if(newField.type===`user`)return;let originalField=originalDataMap.get(newField.key);if(!originalField){operations.push(getAddOperation(newField.key,getFormatedFieldValue(newField)));return}if(isEqual(newField,originalField))return;let isValueChanged=!isEqual(newField.value,originalField.value);!isCustomMetadataInstance&&isFieldEmpty(originalField)&&!isFieldEmpty(newField)?operations.push(getAddOperation(newField.key,getFormatedFieldValue(newField))):(!isCustomMetadataInstance&&isValueChanged&&originalField.value!==null&&!isFieldEmpty(newField)||isCustomMetadataInstance&&isValueChanged)&&(operations.push(getTestOperation(originalField.key,getFormatedFieldValue(originalField))),operations.push(getReplaceOperation(newField.key,getFormatedFieldValue(newField)))),operations.push(...getAiExtractedOperations(newField.key,originalField,newField)),operations.push(...getConfidenceScoreOperations(newField.key,originalField,newField)),operations.push(...getTargetLocationOperations(newField.key,originalField,newField))}),originalData.fields.forEach(originalField=>{let newField=newDataMap.get(originalField.key);originalField.type!==`user`&&(!newField||!isCustomMetadataInstance&&isFieldEmpty(newField)&&!isFieldEmpty(originalField))&&(operations.push(getTestOperation(originalField.key,getFormatedFieldValue(originalField))),operations.push(getRemoveOperation(originalField.key)))}),operations},getFormatedFieldValue=field=>field.type===`float`?Number(field.value):field.type===`taxonomy`?field.value.map(option=>option.value):field.type===`date`&&typeof field.value==`string`?new Date(field.value).toISOString():field.value,getTestOperation=(key,value)=>({op:JSONPatchOp.TEST,path:`/${key}`,value}),getAddOperation=(key,value)=>({op:JSONPatchOp.ADD,path:`/${key}`,value}),getRemoveOperation=key=>({op:JSONPatchOp.REMOVE,path:`/${key}`}),getReplaceOperation=(key,value)=>({op:JSONPatchOp.REPLACE,path:`/${key}`,value});export{getFormatedFieldValue as n,JSONPatchOp as r,createJSONPatch as t};
|
package/dist/esm/lib/components/metadata-editor-fields/components/ai-suggestion-field/utils.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{convertIsoStringToCalendarDate}from"../../../../utils/convertDate.js";import{DateFormatter,getLocalTimeZone}from"@box/blueprint-web";function formatSuggestionValue(value,{type=`string`,locale=`en`}={}){if(type===`date`&&typeof value==`string`){let isValidDate=!isNaN(new Date(value).getTime()),calendarDate=convertIsoStringToCalendarDate(value);if(calendarDate&&isValidDate){let dateValue=calendarDate.toDate(getLocalTimeZone());return new DateFormatter(locale).format(dateValue)}}return type===`taxonomy`?Array.isArray(value)&&value.length>0?value.map(item=>item.displayValue).join(`, `):value.toString():value==null?null:typeof value==`number`?value.toString():Array.isArray(value)?value.join(`, `):value}export{formatSuggestionValue};
|
|
1
|
+
import{convertIsoStringToCalendarDate}from"../../../../utils/convertDate.js";import{DateFormatter,getLocalTimeZone}from"@box/blueprint-web";function formatSuggestionValue(value,{type=`string`,locale=`en`}={}){if(type===`date`&&typeof value==`string`){let isValidDate=!isNaN(new Date(value).getTime()),calendarDate=convertIsoStringToCalendarDate(value);if(calendarDate&&isValidDate){let dateValue=calendarDate.toDate(getLocalTimeZone());return new DateFormatter(locale).format(dateValue)}}return type===`taxonomy`?Array.isArray(value)&&value.length>0?value.map(item=>item.displayValue).join(`, `):value.toString():type===`user`?Array.isArray(value)&&value.length>0?value.map(user=>user.name).join(`, `):value==null?null:String(value):value==null?null:typeof value==`number`?value.toString():Array.isArray(value)?value.join(`, `):value}export{formatSuggestionValue};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import messages from"../../../../messages.js";import{useMemoizedFieldLabel}from"../../hooks/use-memoized-field-label.js";import{forwardRef}from"react";import{useIntl}from"react-intl";import{jsx}from"react/jsx-runtime";import{TextInput}from"@box/blueprint-web";import{Field,useFormikContext}from"formik";var getDisplayValue=value=>!Array.isArray(value)||value.length===0?``:value.map(entry=>entry.name).join(`, `),toUserContacts=inputValue=>{let trimmedValue=inputValue.trim();return trimmedValue?[{id:1,name:trimmedValue,email:`${trimmedValue.toLowerCase().replace(/\s+/g,`.`)}@example.com`,value:`1`}]:[]},MetadataUserField=forwardRef(({className,description,isAiSuggestionApplied,confidenceScore,disableForm,fieldNamePrefix,label,onValueEdited,updateModePrefix},forwardedRef)=>{let intl=useIntl(),{setFieldValue}=useFormikContext(),fieldName=`${updateModePrefix??fieldNamePrefix}.value`,fieldLabel=useMemoizedFieldLabel(label,description,isAiSuggestionApplied,`label`,confidenceScore);return jsx(`div`,{"data-testid":`${label}-field`,children:jsx(Field,{name:fieldName,children:({field,meta})=>jsx(TextInput,{...field,ref:forwardedRef,className,"data-target-id":`TextInput-metadataEditorUserField`,disabled:disableForm,error:meta.error,label:fieldLabel,placeholder:intl.formatMessage(messages.setValuePlaceholder),value:getDisplayValue(field.value),onChange:event=>{setFieldValue(fieldName,toUserContacts(event.target.value)),onValueEdited()}})})})});MetadataUserField.displayName=`MetadataUserField`;export{MetadataUserField,MetadataUserField as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{MetadataDateField}from"./components/metadata-date-field/metadata-date-field.js";import{MetadataEnumField}from"./components/metadata-enum-field/metadata-enum-field.js";import{MetadataFloatField}from"./components/metadata-float-field/metadata-float-field.js";import{MetadataMultiSelectField}from"./components/metadata-multi-select-field/metadata-multi-select-field.js";import{MetadataStringField}from"./components/metadata-string-field/metadata-string-field.js";import{MetadataTaxonomyField}from"./components/metadata-taxonomy-field/metadata-taxonomy-field.js";import{forwardRef}from"react";import{jsx}from"react/jsx-runtime";var editorFieldTypes={date:forwardRef((props,forwardedRef)=>jsx(MetadataDateField,{...props,ref:forwardedRef})),enum:forwardRef((props,forwardedRef)=>jsx(MetadataEnumField,{...props,ref:forwardedRef})),float:forwardRef((props,forwardedRef)=>jsx(MetadataFloatField,{...props,ref:forwardedRef})),multiSelect:forwardRef((props,forwardedRef)=>jsx(MetadataMultiSelectField,{...props,ref:forwardedRef})),string:forwardRef((props,forwardedRef)=>jsx(MetadataStringField,{...props,ref:forwardedRef})),taxonomy:props=>jsx(MetadataTaxonomyField,{...props})};export{editorFieldTypes};
|
|
1
|
+
import{MetadataDateField}from"./components/metadata-date-field/metadata-date-field.js";import{MetadataEnumField}from"./components/metadata-enum-field/metadata-enum-field.js";import{MetadataFloatField}from"./components/metadata-float-field/metadata-float-field.js";import{MetadataMultiSelectField}from"./components/metadata-multi-select-field/metadata-multi-select-field.js";import{MetadataStringField}from"./components/metadata-string-field/metadata-string-field.js";import{MetadataTaxonomyField}from"./components/metadata-taxonomy-field/metadata-taxonomy-field.js";import{MetadataUserField}from"./components/metadata-user-field/metadata-user-field.js";import{forwardRef}from"react";import{jsx}from"react/jsx-runtime";var editorFieldTypes={date:forwardRef((props,forwardedRef)=>jsx(MetadataDateField,{...props,ref:forwardedRef})),enum:forwardRef((props,forwardedRef)=>jsx(MetadataEnumField,{...props,ref:forwardedRef})),float:forwardRef((props,forwardedRef)=>jsx(MetadataFloatField,{...props,ref:forwardedRef})),multiSelect:forwardRef((props,forwardedRef)=>jsx(MetadataMultiSelectField,{...props,ref:forwardedRef})),string:forwardRef((props,forwardedRef)=>jsx(MetadataStringField,{...props,ref:forwardedRef})),taxonomy:props=>jsx(MetadataTaxonomyField,{...props}),user:forwardRef((props,forwardedRef)=>jsx(MetadataUserField,{...props,ref:forwardedRef}))};export{editorFieldTypes};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import messages from"../../messages.js";import{t as AiSuggestionState}from"../../../../chunks/types.js";import{checkIfHasBoundingBoxes}from"../../utils/check-if-has-bounding-boxes.js";import{isConfidenceScoreNeedingReview}from"../../utils/confidence-score/is-confidence-score-needing-review.js";import{isInteractiveFormElement}from"../../utils/is-interactive-form-element.js";import{t as shared_field_styles_module_default}from"../../../../chunks/shared-field-styles.module.js";import{t as AiSuggestionField}from"../../../../chunks/ai-suggestion-field.js";import{LowConfidenceSuggestionField}from"./components/low-confidence-suggestion-field/low-confidence-suggestion-field.js";import{t as UpdateModeFieldWrapper}from"../../../../chunks/update-mode-field-wrapper.js";import{i as metadata_editor_fields_module_default}from"../../../../chunks/utils.js";import{editorFieldTypes}from"./editor-field-types.js";import{useViewReferenceTooltip}from"./hooks/use-view-reference-tooltip.js";import{forwardRef,memo,useCallback,useEffect,useMemo}from"react";import{useIntl}from"react-intl";import{jsx,jsxs}from"react/jsx-runtime";import clsx from"clsx";import{Tooltip}from"@box/blueprint-web";import{useFormikContext}from"formik";import isEqual from"lodash/isEqual";import isUndefined from"lodash/isUndefined";var MetadataEditorFieldWrapper=memo(forwardRef(({disableForm,portalElement,field,index,taxonomyOptionsFetcher,isExternallyOwned,isMultilevelTaxonomyFieldEnabled,isTaxonomyPickerEnabled,createTaxonomyItemsService,isConfidenceScoreReviewEnabled=!1,isBoundingBoxEnabled=!1,onSelectMetadataField,selectedMetadataFieldId},forwardedRef)=>{let{setFieldValue}=useFormikContext(),{formatMessage}=useIntl(),aiSuggestionState=field.aiSuggestionState||AiSuggestionState.Initial,isSuggestionPending=aiSuggestionState===AiSuggestionState.Pending,isSuggestionApplied=aiSuggestionState===AiSuggestionState.Applied,isInitial=aiSuggestionState===AiSuggestionState.Initial,MetadataEditorField=editorFieldTypes[field.type],{aiSuggestion,aiSuggestionConfidenceScore,aiSuggestionTargetLocation,type,value}=field,showField=MetadataEditorField&&!field.hidden,withUpdateModeWrapper=!isUndefined(field.updateMode),fieldNamePrefix=`metadata.fields[${index}]`,isTaxonomyMultiSelect=field.type===`taxonomy`&&field.optionsRules?.multiSelect,isBoundingBoxOrConfidenceScoreReviewEnabled=isBoundingBoxEnabled||isConfidenceScoreReviewEnabled,hasConfidenceScore=isConfidenceScoreReviewEnabled&&!!field.confidenceScore,isConfidenceScoreReviewNeeded=hasConfidenceScore&&isConfidenceScoreNeedingReview(field.confidenceScore),hasApprovedConfidence=hasConfidenceScore&&!isSuggestionPending&&!isConfidenceScoreNeedingReview(field.confidenceScore),isSelected=selectedMetadataFieldId===field.id,hasBoundingBoxes=checkIfHasBoundingBoxes(field.targetLocation),isClickable=isBoundingBoxOrConfidenceScoreReviewEnabled&&hasBoundingBoxes&&!!onSelectMetadataField,{isTooltipOpen,handleMouseOver,handleMouseLeave,handleFocus,handleBlur}=useViewReferenceTooltip(isClickable),fieldWrapperClassName=clsx({[metadata_editor_fields_module_default.aiApproved]:isSuggestionApplied||hasApprovedConfidence||field.isExtracted,[metadata_editor_fields_module_default.hasSuggestion]:isSuggestionPending,[metadata_editor_fields_module_default.hasConfidenceReview]:!isSuggestionPending&&isConfidenceScoreReviewNeeded,[metadata_editor_fields_module_default.dateField]:type===`date`}),setField=useCallback((name,fieldValue)=>{setFieldValue(`${fieldNamePrefix}.${name}`,fieldValue)},[fieldNamePrefix,setFieldValue]),setAiSuggestionState=useCallback(state=>{setField(`aiSuggestionState`,state)},[setField]),handleApplyAiSuggestion=useCallback((newValue,acceptConfidence=!1)=>{setField(`value`,newValue),setAiSuggestionState(AiSuggestionState.Applied),setField(`isExtracted`,!0),isBoundingBoxOrConfidenceScoreReviewEnabled&&aiSuggestionTargetLocation&&(setField(`targetLocation`,aiSuggestionTargetLocation),setField(`aiSuggestionTargetLocation`,void 0)),isConfidenceScoreReviewEnabled&&aiSuggestionConfidenceScore&&(setField(`confidenceScore`,acceptConfidence?{...aiSuggestionConfidenceScore,isAccepted:!0}:aiSuggestionConfidenceScore),setField(`aiSuggestionConfidenceScore`,void 0))},[setField,setAiSuggestionState,aiSuggestionConfidenceScore,aiSuggestionTargetLocation,isConfidenceScoreReviewEnabled,isBoundingBoxOrConfidenceScoreReviewEnabled]),clearAiSuggestion=useCallback(()=>{setAiSuggestionState(AiSuggestionState.Initial),setField(`aiSuggestion`,void 0),isBoundingBoxOrConfidenceScoreReviewEnabled&&setField(`aiSuggestionTargetLocation`,void 0),isConfidenceScoreReviewEnabled&&setField(`aiSuggestionConfidenceScore`,void 0)},[setAiSuggestionState,setField,isConfidenceScoreReviewEnabled,isBoundingBoxOrConfidenceScoreReviewEnabled]),handleAcceptConfidenceScore=useCallback(()=>{field.confidenceScore&&setField(`confidenceScore`,{...field.confidenceScore,isAccepted:!0}),onSelectMetadataField?.(null)},[setField,field.confidenceScore,onSelectMetadataField]),handleClearLowConfidenceValue=useCallback(()=>{setAiSuggestionState(AiSuggestionState.Initial),setField(`aiSuggestion`,void 0),setField(`isExtracted`,!1),setField(`value`,type===`multiSelect`||type===`taxonomy`?[]:``),setField(`confidenceScore`,void 0),setField(`targetLocation`,void 0),onSelectMetadataField?.(null)},[setField,type,onSelectMetadataField,setAiSuggestionState]),handleValueEdited=useCallback(()=>{clearAiSuggestion(),field.isExtracted&&setField(`isExtracted`,!1),isBoundingBoxOrConfidenceScoreReviewEnabled&&field.targetLocation&&(setField(`targetLocation`,void 0),onSelectMetadataField?.(null)),isConfidenceScoreReviewEnabled&&field.confidenceScore&&(setField(`confidenceScore`,void 0),onSelectMetadataField?.(null))},[clearAiSuggestion,isConfidenceScoreReviewEnabled,field.confidenceScore,field.isExtracted,field.targetLocation,setField,onSelectMetadataField,isBoundingBoxOrConfidenceScoreReviewEnabled]),handleFieldClick=useCallback(event=>{onSelectMetadataField&&(isInteractiveFormElement(event.target)||onSelectMetadataField(field))},[field,onSelectMetadataField]),handleFieldKeyDown=useCallback(event=>{if(event.key===`Enter`){if(!onSelectMetadataField||isInteractiveFormElement(event.target))return;event.preventDefault(),event.stopPropagation(),onSelectMetadataField(field)}},[field,onSelectMetadataField]);useEffect(()=>{isSuggestionPending&&(!value||Array.isArray(value)&&value.length===0)&&handleApplyAiSuggestion(aiSuggestion)},[aiSuggestion,isSuggestionPending,handleApplyAiSuggestion]),useEffect(()=>{isInitial&&aiSuggestion&&setAiSuggestionState(AiSuggestionState.Pending)},[isInitial,aiSuggestion,setAiSuggestionState]);let isSameValue=useMemo(()=>aiSuggestion?isEqual(value,aiSuggestion):!1,[aiSuggestion,value]);if(!showField)return null;let clickableFieldProps={"data-metadata-field":!0,"data-target-id":`Button-metadataEditorFieldEditClick`,"data-testid":`metadata-field`,onClick:handleFieldClick,onKeyDown:handleFieldKeyDown,onMouseOver:handleMouseOver,onMouseLeave:handleMouseLeave,onFocus:handleFocus,onBlur:handleBlur,role:`button`,tabIndex:0};if(withUpdateModeWrapper){let updateModeContent=jsx(UpdateModeFieldWrapper,{fieldNamePrefix,fieldType:field.type,isTaxonomyMultiSelect,children:jsx(MetadataEditorField,{ref:forwardedRef,description:field.description,disableForm,fieldNamePrefix,isAiSuggestionApplied:!1,isExternallyOwned,isMultilevelTaxonomyFieldEnabled,isTaxonomyPickerEnabled,createTaxonomyItemsService,label:field.displayName,levels:field.levels,onValueEdited:handleValueEdited,portalElement,taxonomyOptionsFetcher})},field.key);return isClickable?jsx(Tooltip,{content:formatMessage(messages.viewOnDocument),open:isTooltipOpen,children:jsx(`div`,{className:clsx(shared_field_styles_module_default.spacious,shared_field_styles_module_default.clickableField,isSelected&&shared_field_styles_module_default.selectedField),...clickableFieldProps,children:updateModeContent})}):updateModeContent}let fieldContent=jsxs(`div`,{className:clsx(metadata_editor_fields_module_default.fieldWrapper,isBoundingBoxOrConfidenceScoreReviewEnabled&&shared_field_styles_module_default.spacious,isClickable&&shared_field_styles_module_default.clickableField,isClickable&&isSelected&&shared_field_styles_module_default.selectedField),...isClickable&&clickableFieldProps,children:[jsx(MetadataEditorField,{ref:forwardedRef,className:fieldWrapperClassName,description:field.description,disableForm,fieldNamePrefix,isAiSuggestionApplied:isSuggestionApplied||field.isExtracted,isExternallyOwned,confidenceScore:isConfidenceScoreReviewEnabled?field.confidenceScore:void 0,isMultilevelTaxonomyFieldEnabled,isTaxonomyPickerEnabled,createTaxonomyItemsService,label:field.displayName,onValueEdited:handleValueEdited,portalElement,taxonomyOptionsFetcher}),isSuggestionPending&&jsx(AiSuggestionField,{aiSuggestion,confidenceLevel:isConfidenceScoreReviewEnabled?aiSuggestionConfidenceScore?.level:void 0,isSameValue,onAiSuggestionAppend:()=>{handleApplyAiSuggestion([...new Set([value,aiSuggestion].flat().filter(Boolean))],!0)},onAiSuggestionIgnore:clearAiSuggestion,onAiSuggestionReplace:()=>handleApplyAiSuggestion(aiSuggestion,!0),type}),!isSuggestionPending&&isConfidenceScoreReviewNeeded&&jsx(LowConfidenceSuggestionField,{onAccept:handleAcceptConfidenceScore,onClear:handleClearLowConfidenceValue})]},field.key);return jsx(Tooltip,{content:formatMessage(messages.viewOnDocument),open:isClickable&&isTooltipOpen,children:fieldContent})}));export{MetadataEditorFieldWrapper};
|
|
1
|
+
import messages from"../../messages.js";import{t as AiSuggestionState}from"../../../../chunks/types.js";import{checkIfHasBoundingBoxes}from"../../utils/check-if-has-bounding-boxes.js";import{isConfidenceScoreNeedingReview}from"../../utils/confidence-score/is-confidence-score-needing-review.js";import{isInteractiveFormElement}from"../../utils/is-interactive-form-element.js";import{t as shared_field_styles_module_default}from"../../../../chunks/shared-field-styles.module.js";import{t as AiSuggestionField}from"../../../../chunks/ai-suggestion-field.js";import{LowConfidenceSuggestionField}from"./components/low-confidence-suggestion-field/low-confidence-suggestion-field.js";import{t as UpdateModeFieldWrapper}from"../../../../chunks/update-mode-field-wrapper.js";import{i as metadata_editor_fields_module_default}from"../../../../chunks/utils.js";import{editorFieldTypes}from"./editor-field-types.js";import{useViewReferenceTooltip}from"./hooks/use-view-reference-tooltip.js";import{forwardRef,memo,useCallback,useEffect,useMemo}from"react";import{useIntl}from"react-intl";import{jsx,jsxs}from"react/jsx-runtime";import clsx from"clsx";import{Tooltip}from"@box/blueprint-web";import{useFormikContext}from"formik";import isEqual from"lodash/isEqual";import isUndefined from"lodash/isUndefined";var MetadataEditorFieldWrapper=memo(forwardRef(({disableForm,portalElement,field,index,taxonomyOptionsFetcher,isExternallyOwned,isMultilevelTaxonomyFieldEnabled,isTaxonomyPickerEnabled,createTaxonomyItemsService,isConfidenceScoreReviewEnabled=!1,isBoundingBoxEnabled=!1,isUserFieldEnabled=!1,onSelectMetadataField,selectedMetadataFieldId},forwardedRef)=>{let{setFieldValue}=useFormikContext(),{formatMessage}=useIntl(),aiSuggestionState=field.aiSuggestionState||AiSuggestionState.Initial,isSuggestionPending=aiSuggestionState===AiSuggestionState.Pending,isSuggestionApplied=aiSuggestionState===AiSuggestionState.Applied,isInitial=aiSuggestionState===AiSuggestionState.Initial,MetadataEditorField=editorFieldTypes[field.type],{aiSuggestion,aiSuggestionConfidenceScore,aiSuggestionTargetLocation,type,value}=field,isUserFieldHiddenByFlag=field.type===`user`&&!isUserFieldEnabled,showField=MetadataEditorField&&!field.hidden&&!isUserFieldHiddenByFlag,withUpdateModeWrapper=!isUndefined(field.updateMode),fieldNamePrefix=`metadata.fields[${index}]`,isTaxonomyMultiSelect=field.type===`taxonomy`&&field.optionsRules?.multiSelect,isBoundingBoxOrConfidenceScoreReviewEnabled=isBoundingBoxEnabled||isConfidenceScoreReviewEnabled,hasConfidenceScore=isConfidenceScoreReviewEnabled&&!!field.confidenceScore,isConfidenceScoreReviewNeeded=hasConfidenceScore&&isConfidenceScoreNeedingReview(field.confidenceScore),hasApprovedConfidence=hasConfidenceScore&&!isSuggestionPending&&!isConfidenceScoreNeedingReview(field.confidenceScore),isSelected=selectedMetadataFieldId===field.id,hasBoundingBoxes=checkIfHasBoundingBoxes(field.targetLocation),isClickable=isBoundingBoxOrConfidenceScoreReviewEnabled&&hasBoundingBoxes&&!!onSelectMetadataField,{isTooltipOpen,handleMouseOver,handleMouseLeave,handleFocus,handleBlur}=useViewReferenceTooltip(isClickable),fieldWrapperClassName=clsx({[metadata_editor_fields_module_default.aiApproved]:isSuggestionApplied||hasApprovedConfidence||field.isExtracted,[metadata_editor_fields_module_default.hasSuggestion]:isSuggestionPending,[metadata_editor_fields_module_default.hasConfidenceReview]:!isSuggestionPending&&isConfidenceScoreReviewNeeded,[metadata_editor_fields_module_default.dateField]:type===`date`}),setField=useCallback((name,fieldValue)=>{setFieldValue(`${fieldNamePrefix}.${name}`,fieldValue)},[fieldNamePrefix,setFieldValue]),setAiSuggestionState=useCallback(state=>{setField(`aiSuggestionState`,state)},[setField]),handleApplyAiSuggestion=useCallback((newValue,acceptConfidence=!1)=>{setField(`value`,newValue),setAiSuggestionState(AiSuggestionState.Applied),setField(`isExtracted`,!0),isBoundingBoxOrConfidenceScoreReviewEnabled&&aiSuggestionTargetLocation&&(setField(`targetLocation`,aiSuggestionTargetLocation),setField(`aiSuggestionTargetLocation`,void 0)),isConfidenceScoreReviewEnabled&&aiSuggestionConfidenceScore&&(setField(`confidenceScore`,acceptConfidence?{...aiSuggestionConfidenceScore,isAccepted:!0}:aiSuggestionConfidenceScore),setField(`aiSuggestionConfidenceScore`,void 0))},[setField,setAiSuggestionState,aiSuggestionConfidenceScore,aiSuggestionTargetLocation,isConfidenceScoreReviewEnabled,isBoundingBoxOrConfidenceScoreReviewEnabled]),clearAiSuggestion=useCallback(()=>{setAiSuggestionState(AiSuggestionState.Initial),setField(`aiSuggestion`,void 0),isBoundingBoxOrConfidenceScoreReviewEnabled&&setField(`aiSuggestionTargetLocation`,void 0),isConfidenceScoreReviewEnabled&&setField(`aiSuggestionConfidenceScore`,void 0)},[setAiSuggestionState,setField,isConfidenceScoreReviewEnabled,isBoundingBoxOrConfidenceScoreReviewEnabled]),handleAcceptConfidenceScore=useCallback(()=>{field.confidenceScore&&setField(`confidenceScore`,{...field.confidenceScore,isAccepted:!0}),onSelectMetadataField?.(null)},[setField,field.confidenceScore,onSelectMetadataField]),handleClearLowConfidenceValue=useCallback(()=>{setAiSuggestionState(AiSuggestionState.Initial),setField(`aiSuggestion`,void 0),setField(`isExtracted`,!1),setField(`value`,type===`multiSelect`||type===`taxonomy`||type===`user`?[]:``),setField(`confidenceScore`,void 0),setField(`targetLocation`,void 0),onSelectMetadataField?.(null)},[setField,type,onSelectMetadataField,setAiSuggestionState]),handleValueEdited=useCallback(()=>{clearAiSuggestion(),field.isExtracted&&setField(`isExtracted`,!1),isBoundingBoxOrConfidenceScoreReviewEnabled&&field.targetLocation&&(setField(`targetLocation`,void 0),onSelectMetadataField?.(null)),isConfidenceScoreReviewEnabled&&field.confidenceScore&&(setField(`confidenceScore`,void 0),onSelectMetadataField?.(null))},[clearAiSuggestion,isConfidenceScoreReviewEnabled,field.confidenceScore,field.isExtracted,field.targetLocation,setField,onSelectMetadataField,isBoundingBoxOrConfidenceScoreReviewEnabled]),handleFieldClick=useCallback(event=>{onSelectMetadataField&&(isInteractiveFormElement(event.target)||onSelectMetadataField(field))},[field,onSelectMetadataField]),handleFieldKeyDown=useCallback(event=>{if(event.key===`Enter`){if(!onSelectMetadataField||isInteractiveFormElement(event.target))return;event.preventDefault(),event.stopPropagation(),onSelectMetadataField(field)}},[field,onSelectMetadataField]);useEffect(()=>{isSuggestionPending&&(!value||Array.isArray(value)&&value.length===0)&&handleApplyAiSuggestion(aiSuggestion)},[aiSuggestion,isSuggestionPending,handleApplyAiSuggestion]),useEffect(()=>{isInitial&&aiSuggestion&&setAiSuggestionState(AiSuggestionState.Pending)},[isInitial,aiSuggestion,setAiSuggestionState]);let isSameValue=useMemo(()=>aiSuggestion?isEqual(value,aiSuggestion):!1,[aiSuggestion,value]);if(!showField)return null;let clickableFieldProps={"data-metadata-field":!0,"data-target-id":`Button-metadataEditorFieldEditClick`,"data-testid":`metadata-field`,onClick:handleFieldClick,onKeyDown:handleFieldKeyDown,onMouseOver:handleMouseOver,onMouseLeave:handleMouseLeave,onFocus:handleFocus,onBlur:handleBlur,role:`button`,tabIndex:0};if(withUpdateModeWrapper){let updateModeContent=jsx(UpdateModeFieldWrapper,{fieldNamePrefix,fieldType:field.type,isTaxonomyMultiSelect,children:jsx(MetadataEditorField,{ref:forwardedRef,description:field.description,disableForm,fieldNamePrefix,isAiSuggestionApplied:!1,isExternallyOwned,isMultilevelTaxonomyFieldEnabled,isTaxonomyPickerEnabled,createTaxonomyItemsService,label:field.displayName,levels:field.levels,onValueEdited:handleValueEdited,portalElement,taxonomyOptionsFetcher})},field.key);return isClickable?jsx(Tooltip,{content:formatMessage(messages.viewOnDocument),open:isTooltipOpen,children:jsx(`div`,{className:clsx(shared_field_styles_module_default.spacious,shared_field_styles_module_default.clickableField,isSelected&&shared_field_styles_module_default.selectedField),...clickableFieldProps,children:updateModeContent})}):updateModeContent}let fieldContent=jsxs(`div`,{className:clsx(metadata_editor_fields_module_default.fieldWrapper,isBoundingBoxOrConfidenceScoreReviewEnabled&&shared_field_styles_module_default.spacious,isClickable&&shared_field_styles_module_default.clickableField,isClickable&&isSelected&&shared_field_styles_module_default.selectedField),...isClickable&&clickableFieldProps,children:[jsx(MetadataEditorField,{ref:forwardedRef,className:fieldWrapperClassName,description:field.description,disableForm,fieldNamePrefix,isAiSuggestionApplied:isSuggestionApplied||field.isExtracted,isExternallyOwned,confidenceScore:isConfidenceScoreReviewEnabled?field.confidenceScore:void 0,isMultilevelTaxonomyFieldEnabled,isTaxonomyPickerEnabled,createTaxonomyItemsService,label:field.displayName,onValueEdited:handleValueEdited,portalElement,taxonomyOptionsFetcher}),isSuggestionPending&&jsx(AiSuggestionField,{aiSuggestion,confidenceLevel:isConfidenceScoreReviewEnabled?aiSuggestionConfidenceScore?.level:void 0,isSameValue,onAiSuggestionAppend:()=>{handleApplyAiSuggestion([...new Set([value,aiSuggestion].flat().filter(Boolean))],!0)},onAiSuggestionIgnore:clearAiSuggestion,onAiSuggestionReplace:()=>handleApplyAiSuggestion(aiSuggestion,!0),type}),!isSuggestionPending&&isConfidenceScoreReviewNeeded&&jsx(LowConfidenceSuggestionField,{onAccept:handleAcceptConfidenceScore,onClear:handleClearLowConfidenceValue})]},field.key);return jsx(Tooltip,{content:formatMessage(messages.viewOnDocument),open:isClickable&&isTooltipOpen,children:fieldContent})}));export{MetadataEditorFieldWrapper};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import messages from"../../messages.js";import{i as metadata_editor_fields_module_default}from"../../../../chunks/utils.js";import{MetadataEditorFieldWrapper}from"./metadata-editor-field-wrapper.js";import{useReviewFieldFilter}from"./hooks/use-review-field-filter.js";import{createElement,useEffect,useRef}from"react";import{FormattedMessage}from"react-intl";import{jsx}from"react/jsx-runtime";import{Text}from"@box/blueprint-web";import{FieldArray,getIn,useFormikContext}from"formik";var TemplateInstance=props=>{let{shouldShowOnlyReviewFields=!1}=props,{values}=useFormikContext(),fieldName=`metadata.fields`,fields=getIn(values,fieldName),focusRef=useRef(null),visibleFieldEntries=useReviewFieldFilter(fields,shouldShowOnlyReviewFields),autoFocusIndex=fields.findIndex(field
|
|
1
|
+
import messages from"../../messages.js";import{i as metadata_editor_fields_module_default}from"../../../../chunks/utils.js";import{MetadataEditorFieldWrapper}from"./metadata-editor-field-wrapper.js";import{useReviewFieldFilter}from"./hooks/use-review-field-filter.js";import{createElement,useEffect,useRef}from"react";import{FormattedMessage}from"react-intl";import{jsx}from"react/jsx-runtime";import{Text}from"@box/blueprint-web";import{FieldArray,getIn,useFormikContext}from"formik";var TemplateInstance=props=>{let{shouldShowOnlyReviewFields=!1,isUserFieldEnabled=!1}=props,{values}=useFormikContext(),fieldName=`metadata.fields`,fields=getIn(values,fieldName),focusRef=useRef(null),visibleFieldEntries=useReviewFieldFilter(fields,shouldShowOnlyReviewFields),autoFocusIndex=fields.findIndex(field=>{let isUserFieldHiddenByFlag=field.type===`user`&&!isUserFieldEnabled;return!field.hidden&&!isUserFieldHiddenByFlag});return useEffect(()=>{autoFocusIndex>-1&&focusRef.current?.focus()},[]),fields.length?jsx(FieldArray,{name:fieldName,validateOnChange:!1,children:()=>visibleFieldEntries.map(({field,originalIndex})=>createElement(MetadataEditorFieldWrapper,{...props,key:field.key,ref:originalIndex===autoFocusIndex?focusRef:null,field,index:originalIndex}))}):jsx(Text,{as:`span`,className:metadata_editor_fields_module_default.noAttributesText,color:`textOnLightSecondary`,children:jsx(FormattedMessage,{...messages.noTemplateAtributesError})})};export{TemplateInstance,TemplateInstance as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{TEMPLATE_CUSTOM_PROPERTIES}from"../../../../constants.js";import{MetadataEmptyState}from"../../../metadata-empty-state/metadata-empty-state.js";import{useMetadataEditorAnalytics}from"../../../../utils/analytics/analytics-context.js";import{useAutofill}from"../../../../utils/autofill-context.js";import{TemplateInstance}from"../../../metadata-editor-fields/metadata-editor-fields.js";import{UnsavedChangesModal}from"../../../unsaved-changes-modal/unsaved-changes-modal.js";import{t as AutofillOverlay}from"../../../../../../chunks/autofill-overlay.js";import{t as CustomInstance}from"../../../../../../chunks/custom-instance.js";import{t as DeleteConfirmationModal}from"../../../../../../chunks/delete-confirmation-modal.js";import{t as createJSONPatch}from"../../../../../../chunks/utils2.js";import{n as metadata_instance_form_module_default,t as MetadataInstanceFormCardWrapper}from"../../../../../../chunks/metadata-instance-form-card-wrapper.js";import{useEffect,useMemo,useRef,useState}from"react";import{jsx,jsxs}from"react/jsx-runtime";import clsx from"clsx";import{Form,Formik}from"formik";import isEqual from"lodash/isEqual";var FormikObserver=({dirty,onChange,values})=>{let prevValuesRef=useRef(values);return dirty&&!isEqual(prevValuesRef.current.metadata.fields,values.metadata.fields)&&(prevValuesRef.current=values,onChange(values)),null},MetadataInstanceForm=props=>{let{areAiSuggestionsAvailable,customRef,isLargeFile,errorCode,isAiSuggestionsFeatureEnabled,isAdvancedExtractAgentEnabled=!1,isBetaLanguageEnabled,isDeleteButtonDisabled,isDeleteConfirmationModalCheckboxEnabled,isMultilevelTaxonomyFieldEnabled,isTaxonomyPickerEnabled,createTaxonomyItemsService,isUnsavedChangesModalOpen=!1,MetadataInstanceFormCustomWrapper,selectedTemplateInstance,onCancel,onChange,onDelete,onDiscardUnsavedChanges,onSubmit,onToggleReviewFilter,setIsUnsavedChangesModalOpen,shouldShowOnlyReviewFields=!1,taxonomyOptionsFetcher,isConfidenceScoreReviewEnabled=!1,isBoundingBoxEnabled=!1,onSelectMetadataField,selectedMetadataFieldId}=props,isBoundingBoxOrConfidenceScoreReviewEnabled=isBoundingBoxEnabled||isConfidenceScoreReviewEnabled,FormWrapper=MetadataInstanceFormCustomWrapper??MetadataInstanceFormCardWrapper,[isDeleteConfirmationModalOpen,setIsDeleteConfirmationModalOpen]=useState(!1),{isFetchingSuggestions,isLongLoading,getAiSuggestions,clearState,suggestions}=useAutofill(),{trackEvent}=useMetadataEditorAnalytics();useEffect(()=>()=>{clearState()},[clearState,selectedTemplateInstance?.id]);let isCustomMetadata=selectedTemplateInstance?.templateKey===TEMPLATE_CUSTOM_PROPERTIES,handleSubmit=async values=>{await onSubmit(values,createJSONPatch(values,selectedTemplateInstance))},handleCancel=isFormDirty=>{isFormDirty?setIsUnsavedChangesModalOpen(!0):onCancel()},handleDelete=()=>{setIsDeleteConfirmationModalOpen(!0)},initialValues={metadata:{...selectedTemplateInstance}},formRef=useRef(null),[portalElement,setPortalElement]=useState(null);useEffect(()=>{setPortalElement(customRef??formRef.current)},[customRef,selectedTemplateInstance?.templateKey,selectedTemplateInstance?.scope]);let content=useMemo(()=>{let isEmpty=selectedTemplateInstance?.fields.length===0;if(isCustomMetadata)return jsx(CustomInstance,{isLoading:isFetchingSuggestions});if(isEmpty)return jsx(MetadataEmptyState,{isBoxAiSuggestionsFeatureEnabled:isAiSuggestionsFeatureEnabled,level:`instance`});let showOverlay=!!(isFetchingSuggestions||errorCode);return jsxs(`div`,{className:clsx(metadata_instance_form_module_default.metadataInstanceFormContent,showOverlay&&metadata_instance_form_module_default.showOverlay,isBoundingBoxOrConfidenceScoreReviewEnabled&&metadata_instance_form_module_default.metadataInstanceFormContentReducedGap),children:[jsx(AutofillOverlay,{errorCode,isFetchingSuggestions,isLongLoading}),jsx(TemplateInstance,{disableForm:isFetchingSuggestions,isConfidenceScoreReviewEnabled,isBoundingBoxEnabled,isExternallyOwned:selectedTemplateInstance?.isExternallyOwned,isMultilevelTaxonomyFieldEnabled,isTaxonomyPickerEnabled,createTaxonomyItemsService,onSelectMetadataField,selectedMetadataFieldId,portalElement:customRef??portalElement,shouldShowOnlyReviewFields,taxonomyOptionsFetcher})]})},[selectedTemplateInstance?.fields.length,selectedTemplateInstance?.isExternallyOwned,isCustomMetadata,isFetchingSuggestions,isLongLoading,customRef,portalElement,taxonomyOptionsFetcher,isAiSuggestionsFeatureEnabled,isConfidenceScoreReviewEnabled,isBoundingBoxEnabled,isMultilevelTaxonomyFieldEnabled,isTaxonomyPickerEnabled,createTaxonomyItemsService,errorCode,shouldShowOnlyReviewFields,onSelectMetadataField,selectedMetadataFieldId]);return jsx(Formik,{initialValues,onSubmit:handleSubmit,children:({values,dirty})=>jsxs(Form,{children:[jsx(FormWrapper,{areAiSuggestionsAvailable,className:metadata_instance_form_module_default.metadataInstanceForm,formRef,formValues:values,getAiSuggestions,handleCancel,handleDelete,isAdvancedExtractAgentEnabled,isAiSuggestionsFeatureEnabled,isBetaLanguageEnabled,isConfidenceScoreReviewEnabled,isBoundingBoxEnabled,isDeleteButtonDisabled,isFetchingSuggestions,isFormDirty:dirty,isLargeFile,onToggleReviewFilter,selectedTemplateInstance,shouldShowOnlyReviewFields,suggestions,children:selectedTemplateInstance&&content}),onChange&&jsx(FormikObserver,{dirty,onChange,values}),jsx(UnsavedChangesModal,{onBackToEdit:()=>setIsUnsavedChangesModalOpen(!1),onDiscardChanges:onDiscardUnsavedChanges,open:isUnsavedChangesModalOpen,trackEvent}),jsx(DeleteConfirmationModal,{isCheckboxEnabled:isDeleteConfirmationModalCheckboxEnabled,onConfirm:()=>onDelete(selectedTemplateInstance),onDismiss:()=>setIsDeleteConfirmationModalOpen(!1),open:isDeleteConfirmationModalOpen,templateName:selectedTemplateInstance?.displayName})]})},`${selectedTemplateInstance?.scope}.${selectedTemplateInstance?.templateKey}`)};export{MetadataInstanceForm};
|
|
1
|
+
import{TEMPLATE_CUSTOM_PROPERTIES}from"../../../../constants.js";import{MetadataEmptyState}from"../../../metadata-empty-state/metadata-empty-state.js";import{useMetadataEditorAnalytics}from"../../../../utils/analytics/analytics-context.js";import{useAutofill}from"../../../../utils/autofill-context.js";import{TemplateInstance}from"../../../metadata-editor-fields/metadata-editor-fields.js";import{UnsavedChangesModal}from"../../../unsaved-changes-modal/unsaved-changes-modal.js";import{t as AutofillOverlay}from"../../../../../../chunks/autofill-overlay.js";import{t as CustomInstance}from"../../../../../../chunks/custom-instance.js";import{t as DeleteConfirmationModal}from"../../../../../../chunks/delete-confirmation-modal.js";import{t as createJSONPatch}from"../../../../../../chunks/utils2.js";import{n as metadata_instance_form_module_default,t as MetadataInstanceFormCardWrapper}from"../../../../../../chunks/metadata-instance-form-card-wrapper.js";import{useEffect,useMemo,useRef,useState}from"react";import{jsx,jsxs}from"react/jsx-runtime";import clsx from"clsx";import{Form,Formik}from"formik";import isEqual from"lodash/isEqual";var FormikObserver=({dirty,onChange,values})=>{let prevValuesRef=useRef(values);return dirty&&!isEqual(prevValuesRef.current.metadata.fields,values.metadata.fields)&&(prevValuesRef.current=values,onChange(values)),null},MetadataInstanceForm=props=>{let{areAiSuggestionsAvailable,customRef,isLargeFile,errorCode,isAiSuggestionsFeatureEnabled,isAdvancedExtractAgentEnabled=!1,isBetaLanguageEnabled,isDeleteButtonDisabled,isDeleteConfirmationModalCheckboxEnabled,isMultilevelTaxonomyFieldEnabled,isTaxonomyPickerEnabled,createTaxonomyItemsService,isUnsavedChangesModalOpen=!1,MetadataInstanceFormCustomWrapper,selectedTemplateInstance,onCancel,onChange,onDelete,onDiscardUnsavedChanges,onSubmit,onToggleReviewFilter,setIsUnsavedChangesModalOpen,shouldShowOnlyReviewFields=!1,taxonomyOptionsFetcher,isConfidenceScoreReviewEnabled=!1,isBoundingBoxEnabled=!1,onSelectMetadataField,selectedMetadataFieldId,isUserFieldEnabled=!1}=props,isBoundingBoxOrConfidenceScoreReviewEnabled=isBoundingBoxEnabled||isConfidenceScoreReviewEnabled,FormWrapper=MetadataInstanceFormCustomWrapper??MetadataInstanceFormCardWrapper,[isDeleteConfirmationModalOpen,setIsDeleteConfirmationModalOpen]=useState(!1),{isFetchingSuggestions,isLongLoading,getAiSuggestions,clearState,suggestions}=useAutofill(),{trackEvent}=useMetadataEditorAnalytics();useEffect(()=>()=>{clearState()},[clearState,selectedTemplateInstance?.id]);let isCustomMetadata=selectedTemplateInstance?.templateKey===TEMPLATE_CUSTOM_PROPERTIES,handleSubmit=async values=>{await onSubmit(values,createJSONPatch(values,selectedTemplateInstance))},handleCancel=isFormDirty=>{isFormDirty?setIsUnsavedChangesModalOpen(!0):onCancel()},handleDelete=()=>{setIsDeleteConfirmationModalOpen(!0)},initialValues={metadata:{...selectedTemplateInstance}},formRef=useRef(null),[portalElement,setPortalElement]=useState(null);useEffect(()=>{setPortalElement(customRef??formRef.current)},[customRef,selectedTemplateInstance?.templateKey,selectedTemplateInstance?.scope]);let content=useMemo(()=>{let isEmpty=selectedTemplateInstance?.fields.length===0;if(isCustomMetadata)return jsx(CustomInstance,{isLoading:isFetchingSuggestions});if(isEmpty)return jsx(MetadataEmptyState,{isBoxAiSuggestionsFeatureEnabled:isAiSuggestionsFeatureEnabled,level:`instance`});let showOverlay=!!(isFetchingSuggestions||errorCode);return jsxs(`div`,{className:clsx(metadata_instance_form_module_default.metadataInstanceFormContent,showOverlay&&metadata_instance_form_module_default.showOverlay,isBoundingBoxOrConfidenceScoreReviewEnabled&&metadata_instance_form_module_default.metadataInstanceFormContentReducedGap),children:[jsx(AutofillOverlay,{errorCode,isFetchingSuggestions,isLongLoading}),jsx(TemplateInstance,{disableForm:isFetchingSuggestions,isConfidenceScoreReviewEnabled,isBoundingBoxEnabled,isExternallyOwned:selectedTemplateInstance?.isExternallyOwned,isMultilevelTaxonomyFieldEnabled,isTaxonomyPickerEnabled,isUserFieldEnabled,createTaxonomyItemsService,onSelectMetadataField,selectedMetadataFieldId,portalElement:customRef??portalElement,shouldShowOnlyReviewFields,taxonomyOptionsFetcher})]})},[selectedTemplateInstance?.fields.length,selectedTemplateInstance?.isExternallyOwned,isCustomMetadata,isFetchingSuggestions,isLongLoading,customRef,portalElement,taxonomyOptionsFetcher,isAiSuggestionsFeatureEnabled,isConfidenceScoreReviewEnabled,isBoundingBoxEnabled,isMultilevelTaxonomyFieldEnabled,isTaxonomyPickerEnabled,createTaxonomyItemsService,errorCode,shouldShowOnlyReviewFields,onSelectMetadataField,selectedMetadataFieldId,isUserFieldEnabled]);return jsx(Formik,{initialValues,onSubmit:handleSubmit,children:({values,dirty})=>jsxs(Form,{children:[jsx(FormWrapper,{areAiSuggestionsAvailable,className:metadata_instance_form_module_default.metadataInstanceForm,formRef,formValues:values,getAiSuggestions,handleCancel,handleDelete,isAdvancedExtractAgentEnabled,isAiSuggestionsFeatureEnabled,isBetaLanguageEnabled,isConfidenceScoreReviewEnabled,isBoundingBoxEnabled,isDeleteButtonDisabled,isFetchingSuggestions,isFormDirty:dirty,isLargeFile,onToggleReviewFilter,selectedTemplateInstance,shouldShowOnlyReviewFields,suggestions,children:selectedTemplateInstance&&content}),onChange&&jsx(FormikObserver,{dirty,onChange,values}),jsx(UnsavedChangesModal,{onBackToEdit:()=>setIsUnsavedChangesModalOpen(!1),onDiscardChanges:onDiscardUnsavedChanges,open:isUnsavedChangesModalOpen,trackEvent}),jsx(DeleteConfirmationModal,{isCheckboxEnabled:isDeleteConfirmationModalCheckboxEnabled,onConfirm:()=>onDelete(selectedTemplateInstance),onDismiss:()=>setIsDeleteConfirmationModalOpen(!1),open:isDeleteConfirmationModalOpen,templateName:selectedTemplateInstance?.displayName})]})},`${selectedTemplateInstance?.scope}.${selectedTemplateInstance?.templateKey}`)};export{MetadataInstanceForm};
|
|
@@ -6,4 +6,5 @@ export declare const editorFieldTypes: {
|
|
|
6
6
|
multiSelect: import('react').ForwardRefExoticComponent<MetadataFieldProps & import('react').RefAttributes<HTMLInputElement>>;
|
|
7
7
|
string: import('react').ForwardRefExoticComponent<MetadataFieldProps & import('react').RefAttributes<HTMLInputElement>>;
|
|
8
8
|
taxonomy: (props: MetadataFieldProps) => import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
user: import('react').ForwardRefExoticComponent<MetadataFieldProps & import('react').RefAttributes<HTMLInputElement>>;
|
|
9
10
|
};
|
|
@@ -9,6 +9,7 @@ export type TemplateInstanceProps = {
|
|
|
9
9
|
isMultilevelTaxonomyFieldEnabled: boolean;
|
|
10
10
|
/** When true, taxonomy fields render the new `MetadataTaxonomyPicker` experience instead of the legacy comboboxes. */
|
|
11
11
|
isTaxonomyPickerEnabled?: boolean;
|
|
12
|
+
isUserFieldEnabled?: boolean;
|
|
12
13
|
/** Builds the per-field `TaxonomyItemsService` for the new picker experience. Required when `isTaxonomyPickerEnabled` is true. */
|
|
13
14
|
createTaxonomyItemsService?: CreateTaxonomyItemsService;
|
|
14
15
|
isConfidenceScoreReviewEnabled?: boolean;
|
|
@@ -15,6 +15,8 @@ export type MetadataInstanceFormProps = {
|
|
|
15
15
|
isMultilevelTaxonomyFieldEnabled: boolean;
|
|
16
16
|
/** When true, taxonomy fields render the new `MetadataTaxonomyPicker` experience instead of the legacy comboboxes. Requires `createTaxonomyItemsService`. */
|
|
17
17
|
isTaxonomyPickerEnabled?: boolean;
|
|
18
|
+
/** When true, renders user metadata fields. Default is false. */
|
|
19
|
+
isUserFieldEnabled?: boolean;
|
|
18
20
|
/** Builds the per-field `TaxonomyItemsService` for the new picker experience. Required when `isTaxonomyPickerEnabled` is true. */
|
|
19
21
|
createTaxonomyItemsService?: CreateTaxonomyItemsService;
|
|
20
22
|
isUnsavedChangesModalOpen: boolean;
|
|
@@ -8,6 +8,7 @@ declare const stringField: MetadataTemplateField;
|
|
|
8
8
|
declare const dateField: MetadataTemplateField;
|
|
9
9
|
declare const enumField: MetadataTemplateField;
|
|
10
10
|
declare const floatField: MetadataTemplateField;
|
|
11
|
+
declare const userField: MetadataTemplateField;
|
|
11
12
|
declare const multiSelectField: MetadataTemplateField;
|
|
12
13
|
declare const taxonomySingleSelectSingleLevelField: MetadataTemplateField;
|
|
13
14
|
declare const taxonomyMultiSelectSingleLevelField: MetadataTemplateField;
|
|
@@ -30,6 +31,10 @@ declare const nonHiddenFieldsTemplate: MetadataTemplate;
|
|
|
30
31
|
declare const nonHiddenFieldsTemplateWithUpdateMode: MetadataTemplate;
|
|
31
32
|
declare const nonHiddenFieldsWithValuesTemplate: MetadataTemplate;
|
|
32
33
|
declare const noFieldsTemplate: MetadataTemplate;
|
|
34
|
+
declare const userFieldTemplate: MetadataTemplate;
|
|
35
|
+
declare const userFieldWithValue: MetadataTemplateField;
|
|
36
|
+
declare const userFieldTemplateWithValue: MetadataTemplate;
|
|
37
|
+
declare const userFieldTemplateInstance: MetadataTemplateInstance;
|
|
33
38
|
declare const hiddenTemplate: MetadataTemplate;
|
|
34
39
|
declare const onlyRequiredPropsTemplateInstance: MetadataTemplateInstance;
|
|
35
40
|
declare const templates: MetadataTemplate[];
|
|
@@ -64,4 +69,4 @@ declare const firstTemplateInstanceFieldsWithSuggestions: MetadataTemplateField[
|
|
|
64
69
|
declare const secondTemplateInstance: MetadataTemplate;
|
|
65
70
|
declare const secondTemplateSuggestions: AutofillSuggestions;
|
|
66
71
|
declare const secondTemplateInstanceFieldsWithSuggestions: MetadataTemplateField[];
|
|
67
|
-
export { allFieldsSuggestions, allFieldsTemplate, allFieldsTemplateInstance, allFieldsTemplateInstanceAiSuggestions, allFieldsTemplateInstanceWithoutTaxonomies, allFieldsWithAiSuggestions, customTemplate, customTemplateInstance, customTemplateInstanceWithAllFieldsEmpty, customTemplateInstanceWithoutEditPermissions, customTemplateInstanceWithoutEmptyValues, dateField, dateSuggestionTemplateInstance, emptyCustomTemplateInstance, emptyTemplateInstance, enumField, fields, firstTemplateInstance, firstTemplateInstanceFieldsWithSuggestions, firstTemplateSuggestions, floatField, floatInstanceField, hiddenField, hiddenTemplate, hiddenTemplateInstance, longFieldNameEnumField, longFieldNameEnumFieldWithDescription, longFieldNameEnumFieldWithDescriptionAndValue, longFieldNameEnumFieldWithValue, longFieldNameStringField, longFieldNameStringFieldWithDescription, longFieldNameStringFieldWithDescriptionAndValue, longFieldNameStringFieldWithValue, longFieldNameTemplateInstance, longFieldNameTemplateInstanceWithAiSuggestions, multiSelectField, noFieldsTemplate, nonHiddenFieldsTemplate, nonHiddenFieldsTemplateWithUpdateMode, nonHiddenFieldsWithValuesTemplate, noValueField, onlyRequiredPropsTemplateInstance, secondTemplateInstance, secondTemplateInstanceFieldsWithSuggestions, secondTemplateSuggestions, shortTemplateInstance, stringField, taxonomyLevels, taxonomyMultiSelectMultiLevelField, taxonomyMultiSelectSingleLevelField, taxonomyMultiSelectSingleLevelFieldWithValue, taxonomySingleSelectMultiLevelField, taxonomySingleSelectSingleLevelField, taxonomySingleSelectSingleLevelFieldWithValue, templateInstancesList, templateInstanceWithAllFieldsEmpty, templateInstanceWithoutEditPermissions, templateInstanceWithoutEmptyValues, templateInstanceWithSomeFieldsEmpty, templateOptions, templates, };
|
|
72
|
+
export { allFieldsSuggestions, allFieldsTemplate, allFieldsTemplateInstance, allFieldsTemplateInstanceAiSuggestions, allFieldsTemplateInstanceWithoutTaxonomies, allFieldsWithAiSuggestions, customTemplate, customTemplateInstance, customTemplateInstanceWithAllFieldsEmpty, customTemplateInstanceWithoutEditPermissions, customTemplateInstanceWithoutEmptyValues, dateField, dateSuggestionTemplateInstance, emptyCustomTemplateInstance, emptyTemplateInstance, enumField, fields, firstTemplateInstance, firstTemplateInstanceFieldsWithSuggestions, firstTemplateSuggestions, floatField, floatInstanceField, hiddenField, hiddenTemplate, hiddenTemplateInstance, longFieldNameEnumField, longFieldNameEnumFieldWithDescription, longFieldNameEnumFieldWithDescriptionAndValue, longFieldNameEnumFieldWithValue, longFieldNameStringField, longFieldNameStringFieldWithDescription, longFieldNameStringFieldWithDescriptionAndValue, longFieldNameStringFieldWithValue, longFieldNameTemplateInstance, longFieldNameTemplateInstanceWithAiSuggestions, multiSelectField, noFieldsTemplate, nonHiddenFieldsTemplate, nonHiddenFieldsTemplateWithUpdateMode, nonHiddenFieldsWithValuesTemplate, noValueField, onlyRequiredPropsTemplateInstance, secondTemplateInstance, secondTemplateInstanceFieldsWithSuggestions, secondTemplateSuggestions, shortTemplateInstance, stringField, taxonomyLevels, taxonomyMultiSelectMultiLevelField, taxonomyMultiSelectSingleLevelField, taxonomyMultiSelectSingleLevelFieldWithValue, taxonomySingleSelectMultiLevelField, taxonomySingleSelectSingleLevelField, taxonomySingleSelectSingleLevelFieldWithValue, templateInstancesList, templateInstanceWithAllFieldsEmpty, templateInstanceWithoutEditPermissions, templateInstanceWithoutEmptyValues, templateInstanceWithSomeFieldsEmpty, templateOptions, templates, userField, userFieldTemplate, userFieldTemplateInstance, userFieldTemplateWithValue, userFieldWithValue, };
|
|
@@ -15,7 +15,13 @@ export type MetadataEmptyStateProps = {
|
|
|
15
15
|
level: 'manager' | 'file' | 'instance';
|
|
16
16
|
onShowEmptyValues?: () => void;
|
|
17
17
|
};
|
|
18
|
-
export type
|
|
18
|
+
export type MetadataUser = {
|
|
19
|
+
email: string;
|
|
20
|
+
id: number;
|
|
21
|
+
name: string;
|
|
22
|
+
value: string;
|
|
23
|
+
};
|
|
24
|
+
export type MetadataFormFieldValue = string | Array<string> | number | Array<BaseOptionType> | Array<MetadataUser>;
|
|
19
25
|
export type MetadataFields = Record<string, MetadataFieldValue>;
|
|
20
26
|
export interface MetadataTemplateFieldOption {
|
|
21
27
|
key: string;
|
|
@@ -34,7 +40,7 @@ export interface MetadataUpdateMode {
|
|
|
34
40
|
value?: MetadataFormFieldValue;
|
|
35
41
|
isOpened?: boolean;
|
|
36
42
|
}
|
|
37
|
-
export type MetadataTemplateFieldType = 'string' | 'date' | 'enum' | 'float' | 'multiSelect' | 'taxonomy';
|
|
43
|
+
export type MetadataTemplateFieldType = 'string' | 'date' | 'enum' | 'float' | 'multiSelect' | 'taxonomy' | 'user';
|
|
38
44
|
export type TaxonomyOptionsRules = {
|
|
39
45
|
multiSelect: boolean;
|
|
40
46
|
selectableLevels: number[];
|
|
@@ -109,7 +115,7 @@ export type MetadataTemplateOption = {
|
|
|
109
115
|
hidden: boolean;
|
|
110
116
|
scope: string;
|
|
111
117
|
};
|
|
112
|
-
export type MetadataFieldValue = string | number | Array<string> | null | BaseOptionType[];
|
|
118
|
+
export type MetadataFieldValue = string | number | Array<string> | null | BaseOptionType[] | MetadataUser[];
|
|
113
119
|
export type MetadataTemplateInstance = {
|
|
114
120
|
canEdit: boolean;
|
|
115
121
|
displayName?: string;
|
package/package.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@box/metadata-editor",
|
|
3
|
-
"version": "2.4.
|
|
3
|
+
"version": "2.4.1",
|
|
4
4
|
"peerDependencies": {
|
|
5
5
|
"@ariakit/react": "0.4.21",
|
|
6
|
-
"@box/blueprint-web": "^16.14.
|
|
7
|
-
"@box/blueprint-web-assets": "^5.6.
|
|
8
|
-
"@box/box-ai-agent-selector": "^2.2.
|
|
9
|
-
"@box/combobox-with-api": "^2.2.
|
|
10
|
-
"@box/metadata-taxonomy-picker": "^3.2.
|
|
11
|
-
"@box/metadata-template-browser": "^2.2.
|
|
6
|
+
"@box/blueprint-web": "^16.14.1",
|
|
7
|
+
"@box/blueprint-web-assets": "^5.6.1",
|
|
8
|
+
"@box/box-ai-agent-selector": "^2.2.1",
|
|
9
|
+
"@box/combobox-with-api": "^2.2.1",
|
|
10
|
+
"@box/metadata-taxonomy-picker": "^3.2.1",
|
|
11
|
+
"@box/metadata-template-browser": "^2.2.1",
|
|
12
12
|
"formik": "^2.0.3",
|
|
13
13
|
"lodash": "^4.17.15",
|
|
14
14
|
"react": "^17.0.0 || ^18.0.0",
|
|
@@ -18,11 +18,11 @@
|
|
|
18
18
|
"devDependencies": {
|
|
19
19
|
"@ariakit/react": "0.4.21",
|
|
20
20
|
"@box/babel-plugin-target-attributes": "2.2.0",
|
|
21
|
-
"@box/blueprint-web": "^16.14.
|
|
22
|
-
"@box/blueprint-web-assets": "^5.6.
|
|
23
|
-
"@box/box-ai-agent-selector": "^2.2.
|
|
24
|
-
"@box/metadata-taxonomy-picker": "^3.2.
|
|
25
|
-
"@box/storybook-utils": "^1.2.
|
|
21
|
+
"@box/blueprint-web": "^16.14.1",
|
|
22
|
+
"@box/blueprint-web-assets": "^5.6.1",
|
|
23
|
+
"@box/box-ai-agent-selector": "^2.2.1",
|
|
24
|
+
"@box/metadata-taxonomy-picker": "^3.2.1",
|
|
25
|
+
"@box/storybook-utils": "^1.2.1",
|
|
26
26
|
"@testing-library/react": "^15.0.6",
|
|
27
27
|
"react": "^18.3.0",
|
|
28
28
|
"react-dom": "^18.3.0",
|