box-ui-elements 23.5.0-beta.2 → 23.5.0-beta.4
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/explorer.css +1 -1
- package/dist/explorer.js +1 -1
- package/dist/picker.js +1 -1
- package/dist/preview.css +1 -1
- package/dist/preview.js +1 -1
- package/dist/sidebar.css +1 -1
- package/dist/sidebar.js +1 -1
- package/es/elements/common/sub-header/SubHeader.js +3 -0
- package/es/elements/common/sub-header/SubHeader.js.map +1 -1
- package/es/elements/common/sub-header/SubHeaderLeftV2.js +3 -23
- package/es/elements/common/sub-header/SubHeaderLeftV2.js.map +1 -1
- package/es/elements/common/sub-header/SubHeaderRight.js +6 -2
- package/es/elements/common/sub-header/SubHeaderRight.js.map +1 -1
- package/es/elements/content-explorer/ContentExplorer.js +44 -5
- package/es/elements/content-explorer/ContentExplorer.js.map +1 -1
- package/es/elements/content-explorer/ContentExplorer.scss +12 -0
- package/es/elements/content-explorer/MetadataSidePanel.js +92 -0
- package/es/elements/content-explorer/MetadataSidePanel.js.map +1 -0
- package/es/elements/content-explorer/MetadataSidePanel.scss +12 -0
- package/es/elements/content-explorer/stories/tests/MetadataView-visual.stories.js +30 -0
- package/es/elements/content-explorer/stories/tests/MetadataView-visual.stories.js.map +1 -1
- package/es/elements/content-explorer/utils.js +67 -0
- package/es/elements/content-explorer/utils.js.map +1 -0
- package/es/features/metadata-instance-editor/CascadePolicy.js +3 -3
- package/es/features/metadata-instance-editor/CascadePolicy.js.flow +2 -3
- package/es/features/metadata-instance-editor/CascadePolicy.js.map +1 -1
- package/es/features/metadata-instance-editor/Instance.js +0 -2
- package/es/features/metadata-instance-editor/Instance.js.flow +0 -5
- package/es/features/metadata-instance-editor/Instance.js.map +1 -1
- package/es/features/metadata-instance-editor/Instances.js +0 -2
- package/es/features/metadata-instance-editor/Instances.js.flow +0 -3
- package/es/features/metadata-instance-editor/Instances.js.map +1 -1
- package/es/features/metadata-instance-editor/MetadataInstanceEditor.js +0 -2
- package/es/features/metadata-instance-editor/MetadataInstanceEditor.js.flow +0 -3
- package/es/features/metadata-instance-editor/MetadataInstanceEditor.js.map +1 -1
- package/es/features/metadata-instance-editor/stories/tests/CascadePolicy-visual.stories.js +0 -1
- package/es/features/metadata-instance-editor/stories/tests/CascadePolicy-visual.stories.js.flow +0 -1
- package/es/features/metadata-instance-editor/stories/tests/CascadePolicy-visual.stories.js.map +1 -1
- package/es/src/elements/common/sub-header/SubHeader.d.ts +2 -1
- package/es/src/elements/common/sub-header/SubHeaderLeftV2.d.ts +1 -1
- package/es/src/elements/common/sub-header/SubHeaderRight.d.ts +4 -1
- package/es/src/elements/content-explorer/ContentExplorer.d.ts +15 -0
- package/es/src/elements/content-explorer/MetadataSidePanel.d.ts +13 -0
- package/es/src/elements/content-explorer/__tests__/MetadataSidePanel.test.d.ts +1 -0
- package/es/src/elements/content-explorer/stories/tests/MetadataView-visual.stories.d.ts +1 -0
- package/es/src/elements/content-explorer/utils.d.ts +22 -0
- package/package.json +3 -3
- package/src/elements/common/sub-header/SubHeader.tsx +4 -0
- package/src/elements/common/sub-header/SubHeaderLeftV2.tsx +3 -22
- package/src/elements/common/sub-header/SubHeaderRight.tsx +8 -2
- package/src/elements/content-explorer/ContentExplorer.scss +12 -0
- package/src/elements/content-explorer/ContentExplorer.tsx +120 -71
- package/src/elements/content-explorer/MetadataSidePanel.scss +12 -0
- package/src/elements/content-explorer/MetadataSidePanel.tsx +126 -0
- package/src/elements/content-explorer/__tests__/ContentExplorer.test.tsx +80 -16
- package/src/elements/content-explorer/__tests__/MetadataSidePanel.test.tsx +127 -0
- package/src/elements/content-explorer/stories/tests/MetadataView-visual.stories.tsx +26 -0
- package/src/elements/content-explorer/utils.ts +58 -0
- package/src/features/metadata-instance-editor/CascadePolicy.js +2 -3
- package/src/features/metadata-instance-editor/Instance.js +0 -5
- package/src/features/metadata-instance-editor/Instances.js +0 -3
- package/src/features/metadata-instance-editor/MetadataInstanceEditor.js +0 -3
- package/src/features/metadata-instance-editor/__tests__/CascadePolicy.test.js +0 -9
- package/src/features/metadata-instance-editor/__tests__/Instance.test.js +0 -28
- package/src/features/metadata-instance-editor/__tests__/Instances.test.js +7 -9
- package/src/features/metadata-instance-editor/__tests__/MetadataInstanceEditor.test.js +1 -48
- package/src/features/metadata-instance-editor/__tests__/__snapshots__/Instance.test.js.snap +0 -1
- package/src/features/metadata-instance-editor/__tests__/__snapshots__/Instances.test.js.snap +0 -2
- package/src/features/metadata-instance-editor/__tests__/__snapshots__/MetadataInstanceEditor.test.js.snap +0 -1
- package/src/features/metadata-instance-editor/stories/tests/CascadePolicy-visual.stories.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Instance.js","names":["React","injectIntl","FormattedMessage","classNames","isEqual","cloneDeep","noop","Collapsible","Form","LoadingIndicatorWrapper","PlainButton","Tooltip","IconMetadataColored","IconAlertCircle","IconEdit","bdlWatermelonRed","scrollIntoView","CascadePolicy","TemplatedInstance","CustomInstance","MetadataInstanceConfirmDialog","Footer","messages","FIELD_TYPE_FLOAT","FIELD_TYPE_INTEGER","CASCADE_POLICY_TYPE_AI_EXTRACT","TEMPLATE_CUSTOM_PROPERTIES","ENHANCED_AGENT_CONFIGURATION","ENHANCED_AGENT_ID","JSON_PATCH_OP_REMOVE","JSON_PATCH_OP_ADD","JSON_PATCH_OP_REPLACE","JSON_PATCH_OP_TEST","isValidValue","isHidden","RESIN_TAG_TARGET","createFieldKeyToTypeMap","fields","reduce","prev","key","type","getValue","data","value","parseFloat","parseInt","Instance","PureComponent","constructor","props","_defineProperty","id","onModification","setState","getState","shouldConfirmRemove","isEditing","onRemove","isBusy","cascadePolicy","originalData","isDirty","isCascadingPolicyApplicable","onSave","cascadePolicyConfiguration","currentData","errors","isAIFolderExtractionEnabled","isCascadingEnabled","isCascadingOverwritten","state","Object","keys","length","createJSONPatch","canEdit","undefined","isEnabled","overwrite","isValid","finalErrors","_objectSpread","finalData","createElement","invalidInput","setDirty","shouldShowCascadeOptions","agent","isFile","template","message","isProperties","templateKey","_extends","values","metadataName","displayName","hasDataChanged","hasCascadingChanged","isCascadingEnabledThroughProps","isAIFolderExtractionEnabledThroughProps","createRef","prevState","intl","editClassName","metadataLabelEditText","formatMessage","metadataEditTooltip","position","text","className","onClick","toggleIsEditing","fieldKeyToTypeMap","componentDidUpdate","hasError","prevHasError","prevIsDirty","currentElement","collapsibleRef","current","block","behavior","getTitle","customTitle","color","getConfirmationMessage","renderDeleteMessage","cascadePolicyType","ops","forEach","originalValue","path","prototype","hasOwnProperty","call","push","op","render","canUseAIFolderExtraction","canUseAIFolderExtractionAgentSelector","isOpen","animationDuration","isExistingCascadePolicy","ref","buttonProps","hasStickyHeader","headerActionItems","renderEditButton","isBordered","title","isLoading","confirmationMessage","onCancel","onConfirmCancel","onConfirm","onValidSubmit","isCustomMetadata","onAIAgentSelect","onAIFolderExtractionToggle","onCascadeModeChange","onCascadeToggle","onFieldChange","onFieldRemove","isDisabled","onConfirmRemove","showSave","InstanceBase"],"sources":["../../../src/features/metadata-instance-editor/Instance.js"],"sourcesContent":["// @flow\nimport * as React from 'react';\nimport { injectIntl, FormattedMessage } from 'react-intl';\nimport classNames from 'classnames';\nimport isEqual from 'lodash/isEqual';\nimport cloneDeep from 'lodash/cloneDeep';\nimport noop from 'lodash/noop';\n\nimport type { AgentType } from '@box/box-ai-agent-selector';\nimport Collapsible from '../../components/collapsible/Collapsible';\nimport Form from '../../components/form-elements/form/Form';\nimport LoadingIndicatorWrapper from '../../components/loading-indicator/LoadingIndicatorWrapper';\nimport PlainButton from '../../components/plain-button/PlainButton';\nimport Tooltip from '../../components/tooltip';\nimport IconMetadataColored from '../../icons/general/IconMetadataColored';\nimport IconAlertCircle from '../../icons/general/IconAlertCircle';\nimport IconEdit from '../../icons/general/IconEdit';\nimport { bdlWatermelonRed } from '../../styles/variables';\nimport { scrollIntoView } from '../../utils/dom';\n\nimport CascadePolicy from './CascadePolicy';\nimport TemplatedInstance from './TemplatedInstance';\nimport CustomInstance from './CustomInstance';\nimport MetadataInstanceConfirmDialog from './MetadataInstanceConfirmDialog';\nimport Footer from './Footer';\nimport messages from './messages';\nimport { FIELD_TYPE_FLOAT, FIELD_TYPE_INTEGER } from '../metadata-instance-fields/constants';\nimport {\n CASCADE_POLICY_TYPE_AI_EXTRACT,\n TEMPLATE_CUSTOM_PROPERTIES,\n ENHANCED_AGENT_CONFIGURATION,\n ENHANCED_AGENT_ID,\n} from './constants';\nimport {\n JSON_PATCH_OP_REMOVE,\n JSON_PATCH_OP_ADD,\n JSON_PATCH_OP_REPLACE,\n JSON_PATCH_OP_TEST,\n} from '../../common/constants';\nimport { isValidValue } from '../metadata-instance-fields/validateMetadataField';\nimport { isHidden } from './metadataUtil';\nimport { RESIN_TAG_TARGET } from '../../common/variables';\nimport type {\n MetadataFields,\n MetadataTemplate,\n MetadataCascadePolicy,\n MetadataCascadePolicyConfiguration,\n MetadataCascadingPolicyData,\n MetadataTemplateField,\n MetadataFieldValue,\n} from '../../common/types/metadata';\nimport type { JSONPatchOperations } from '../../common/types/api';\nimport './Instance.scss';\n\ntype Props = {\n canEdit: boolean,\n canUseAIFolderExtraction?: boolean,\n canUseAIFolderExtractionAgentSelector?: boolean,\n cascadePolicy?: MetadataCascadePolicy, // eslint-disable-line\n data: MetadataFields,\n hasError: boolean,\n id: string,\n intl: Object,\n isCascadingPolicyApplicable?: boolean,\n isDirty: boolean,\n isOpen: boolean,\n onModification?: (id: string, isDirty: boolean, type?: string) => void,\n onRemove?: (id: string) => void,\n onSave?: (\n id: string,\n data: JSONPatchOperations,\n cascadingPolicy?: MetadataCascadingPolicyData,\n rawData: Object,\n ) => void,\n template: MetadataTemplate,\n};\n\ntype State = {\n cascadePolicyConfiguration: MetadataCascadePolicyConfiguration | null,\n data: Object,\n errors: { [string]: React.Node },\n isAIFolderExtractionEnabled: boolean,\n isBusy: boolean,\n isCascadingEnabled: boolean,\n isCascadingOverwritten: boolean,\n isEditing: boolean,\n shouldConfirmRemove: boolean,\n shouldShowCascadeOptions: boolean,\n};\n\nconst createFieldKeyToTypeMap = (fields?: Array<MetadataTemplateField> = []) =>\n fields.reduce((prev, { key, type }) => {\n prev[key] = type;\n return prev;\n }, {});\n\nconst getValue = (data: Object, key: string, type: string) => {\n const value = data[key];\n\n switch (type) {\n case FIELD_TYPE_FLOAT:\n return parseFloat(value);\n\n case FIELD_TYPE_INTEGER:\n return parseInt(value, 10);\n\n default:\n return value;\n }\n};\n\nclass Instance extends React.PureComponent<Props, State> {\n static defaultProps = {\n data: {},\n isDirty: false,\n };\n\n constructor(props: Props) {\n super(props);\n this.state = this.getState(props);\n this.fieldKeyToTypeMap = createFieldKeyToTypeMap(props.template.fields);\n }\n\n componentDidUpdate({ hasError: prevHasError, isDirty: prevIsDirty }: Props, prevState: State): void {\n const currentElement = this.collapsibleRef.current;\n const { hasError, isDirty }: Props = this.props;\n const { isEditing }: State = prevState;\n\n if (currentElement && this.state.shouldConfirmRemove) {\n scrollIntoView(currentElement, {\n block: 'start',\n behavior: 'smooth',\n });\n }\n\n if (hasError && hasError !== prevHasError) {\n // If hasError is true, which means an error occurred while\n // doing a network operation and hence hide the busy indicator\n // Saving also disables isEditing, so need to enable that back.\n // isDirty remains as it was before.\n this.setState({ isBusy: false, isEditing: true });\n } else if (prevIsDirty && !isDirty) {\n // If the form was dirty and now its not dirty\n // we know a successful save may have happened.\n // We don't modify isEditing here because we maintain the\n // prior state for that. If we came here from a save\n // success then save already disabled isEditing.\n if (isEditing) {\n // We are still editing so don't reset it\n this.setState({ isBusy: false });\n } else {\n // For a successfull save we reset cascading overwrite radio\n this.setState({ isBusy: false, isCascadingOverwritten: false });\n }\n }\n }\n\n /**\n * Undo any changes made\n *\n * @return {void}\n */\n onCancel = (): void => {\n const { id, onModification }: Props = this.props;\n this.setState(this.getState(this.props));\n\n // Callback to parent to tell that something is dirty\n if (onModification) {\n onModification(id, false);\n }\n };\n\n /**\n * Allows a user to confirm metadata instance removal\n *\n * @return {void}\n */\n onConfirmRemove = (): void => {\n this.setState({ shouldConfirmRemove: true });\n };\n\n /**\n * Cancel the remove instance attempt\n *\n * @return {void}\n */\n onConfirmCancel = (): void => {\n this.setState({ shouldConfirmRemove: false });\n };\n\n /**\n * Removes an instance\n *\n * @return {void}\n */\n onRemove = (): void => {\n if (!this.isEditing()) {\n return;\n }\n\n const { id, onRemove }: Props = this.props;\n if (onRemove) {\n onRemove(id);\n this.setState({ isBusy: true });\n }\n };\n\n /**\n * Saves instance data\n *\n * @return {void}\n */\n onSave = (): void => {\n const {\n cascadePolicy,\n data: originalData,\n id,\n isDirty,\n isCascadingPolicyApplicable,\n onSave,\n }: Props = this.props;\n const {\n cascadePolicyConfiguration,\n data: currentData,\n errors,\n isAIFolderExtractionEnabled,\n isCascadingEnabled,\n isCascadingOverwritten,\n }: State = this.state;\n\n if (!this.isEditing() || !isDirty || !onSave || Object.keys(errors).length) {\n return;\n }\n\n this.setState({\n isBusy: true,\n isEditing: false,\n // reset state if cascading policy is removed\n isAIFolderExtractionEnabled: isCascadingEnabled ? isAIFolderExtractionEnabled : false,\n });\n\n onSave(\n id,\n this.createJSONPatch(currentData, originalData),\n isCascadingPolicyApplicable\n ? {\n canEdit: cascadePolicy ? cascadePolicy.canEdit : false,\n id: cascadePolicy ? cascadePolicy.id : undefined,\n isEnabled: isCascadingEnabled,\n overwrite: isCascadingOverwritten,\n isAIFolderExtractionEnabled,\n cascadePolicyConfiguration,\n }\n : undefined,\n cloneDeep(currentData),\n );\n };\n\n /**\n * Updates a key value in the instance data\n *\n * @param {string} key - key to update\n * @param {FieldValue} value - value to update\n * @param {string} type - type of field\n * @return {void}\n */\n onFieldChange = (key: string, value: MetadataFieldValue, type: string): void => {\n const { data, errors }: State = this.state;\n\n // Don't do anything if data is the same or not in edit mode\n if (!this.isEditing() || isEqual(data[key], value)) {\n return;\n }\n\n const isValid = isValidValue(type, value);\n const finalErrors = { ...errors };\n const finalData = cloneDeep(data);\n finalData[key] = value;\n\n if (isValid) {\n delete finalErrors[key];\n } else {\n finalErrors[key] = <FormattedMessage {...messages.invalidInput} />;\n }\n\n this.setState({ data: finalData, errors: finalErrors }, () => {\n this.setDirty(type);\n });\n };\n\n /**\n * Removes a key from instance data\n *\n * @param {string} key - key to remove\n * @return {void}\n */\n onFieldRemove = (key: string): void => {\n if (!this.isEditing()) {\n return;\n }\n\n const { data, errors }: State = this.state;\n const finalData = cloneDeep(data);\n const finalErrors = { ...errors };\n delete finalData[key];\n delete finalErrors[key];\n this.setState({ data: finalData, errors: finalErrors }, this.setDirty);\n };\n\n /**\n * Toggle cascading policy\n *\n * @param {boolean} value - true when turned on\n * @return {void}\n */\n onCascadeToggle = (value: boolean) => {\n const { isCascadingPolicyApplicable }: Props = this.props;\n if (!isCascadingPolicyApplicable) {\n return;\n }\n\n this.setState(\n {\n isCascadingEnabled: value,\n shouldShowCascadeOptions: value,\n },\n this.setDirty,\n );\n };\n\n /**\n * Changes the cascade mode.\n * isCascadingOverwritten is slways false to start off.\n *\n * @param {boolean} value - true when overwrite policy is chosen\n * @return {void}\n */\n onCascadeModeChange = (value: boolean): void => {\n const { isCascadingPolicyApplicable }: Props = this.props;\n if (!isCascadingPolicyApplicable) {\n return;\n }\n\n this.setState(\n {\n isCascadingOverwritten: value,\n },\n this.setDirty,\n );\n };\n\n onAIFolderExtractionToggle = (value: boolean) => {\n this.setState({ isAIFolderExtractionEnabled: value }, this.setDirty);\n };\n\n /**\n * Handles the selection of an AI agent\n * @param {AgentType | null} agent - The selected agent\n */\n onAIAgentSelect = (agent: AgentType | null): void => {\n // '2' is the id for the enhanced agent\n if (agent && agent.id === ENHANCED_AGENT_ID) {\n this.setState({\n cascadePolicyConfiguration: {\n agent: ENHANCED_AGENT_CONFIGURATION,\n },\n });\n } else {\n this.setState({ cascadePolicyConfiguration: null });\n }\n };\n\n /**\n * Returns the state from props\n *\n * @return {Object} - react state\n */\n getState(props: Props): State {\n const isCascadingEnabled = this.isCascadingEnabledThroughProps(props);\n\n return {\n cascadePolicyConfiguration: null,\n data: cloneDeep(props.data),\n errors: {},\n isAIFolderExtractionEnabled: this.isAIFolderExtractionEnabledThroughProps(props),\n isBusy: false,\n isCascadingEnabled,\n isCascadingOverwritten: false,\n isEditing: false,\n shouldConfirmRemove: false,\n shouldShowCascadeOptions: isCascadingEnabled,\n };\n }\n\n /**\n * Returns the card title with possible error mark\n *\n * @return {Object} - react title element\n */\n getTitle(): React.Node {\n const { cascadePolicy = {}, hasError, isCascadingPolicyApplicable, template }: Props = this.props;\n const isProperties = template.templateKey === TEMPLATE_CUSTOM_PROPERTIES;\n\n const type = isCascadingPolicyApplicable && cascadePolicy.id ? 'cascade' : 'default';\n\n return (\n <span className=\"metadata-instance-editor-instance-title\">\n <IconMetadataColored type={type} />\n <span\n className={classNames('metadata-instance-editor-instance-title-text', {\n 'metadata-instance-editor-instance-has-error': hasError,\n })}\n >\n {isProperties ? <FormattedMessage {...messages.customTitle} /> : template.displayName}\n </span>\n {hasError && <IconAlertCircle color={bdlWatermelonRed} />}\n </span>\n );\n }\n\n /**\n * Render the correct delete message to show based on custom metadata and file/folder metadata\n */\n renderDeleteMessage = (isFile: boolean, template: Object) => {\n let message;\n const isProperties = template.templateKey === TEMPLATE_CUSTOM_PROPERTIES;\n\n if (isProperties) {\n message = isFile ? 'fileMetadataRemoveCustomTemplateConfirm' : 'folderMetadataRemoveCustomTemplateConfirm';\n } else {\n message = isFile ? 'fileMetadataRemoveTemplateConfirm' : 'folderMetadataRemoveTemplateConfirm';\n }\n\n return (\n <FormattedMessage\n {...messages[message]}\n values={{\n metadataName: template.displayName,\n }}\n />\n );\n };\n\n /**\n * Get the delete confirmation message base on the template key\n */\n getConfirmationMessage(): React.Node {\n const { template, isCascadingPolicyApplicable }: Props = this.props;\n const isFile = !isCascadingPolicyApplicable;\n return this.renderDeleteMessage(isFile, template);\n }\n\n /**\n * Evaluates if the metadata was changed or cascading policy\n * altered or enabled.\n *\n * @return {void}\n */\n setDirty = (type?: string): void => {\n const { id, isCascadingPolicyApplicable, onModification }: Props = this.props;\n const { data, isCascadingEnabled, isCascadingOverwritten, isAIFolderExtractionEnabled } = this.state;\n const hasDataChanged = !isEqual(data, this.props.data);\n let hasCascadingChanged = false;\n\n if (isCascadingPolicyApplicable) {\n // isCascadingOverwritten always starts out as false, so true signifies a change\n hasCascadingChanged =\n isCascadingOverwritten ||\n isCascadingEnabled !== this.isCascadingEnabledThroughProps(this.props) ||\n isAIFolderExtractionEnabled !== this.isAIFolderExtractionEnabledThroughProps(this.props);\n }\n\n // Callback to parent to tell that something is dirty\n if (onModification) {\n onModification(id, hasDataChanged || hasCascadingChanged, type);\n }\n };\n\n collapsibleRef: {\n current: null | HTMLDivElement,\n } = React.createRef();\n\n fieldKeyToTypeMap: Object;\n\n /**\n * Determines if cascading policy is enabled through props based on\n * whether it has an id or not.\n *\n * @param {Object} props - component props\n * @return {boolean} true if cascading policy is enabled\n */\n isCascadingEnabledThroughProps(props: Props) {\n if (props.cascadePolicy) {\n return !!props.cascadePolicy.id;\n }\n return false;\n }\n\n /**\n * Determines if ai extraction is enabled based on\n * if cascade policy type is ai_extract\n *\n * @param {Object} props - component props\n * @return {boolean} true if ai extraction is enabled\n */\n isAIFolderExtractionEnabledThroughProps({ cascadePolicy }: Props) {\n return cascadePolicy?.cascadePolicyType === CASCADE_POLICY_TYPE_AI_EXTRACT;\n }\n\n /**\n * Toggles the edit mode\n *\n * @private\n * @return {void}\n */\n toggleIsEditing = (): void => {\n this.setState(prevState => ({\n isEditing: !prevState.isEditing,\n }));\n };\n\n /**\n * Creates JSON Patch operations from the passed in\n * data while comparing it to the original data from props.\n *\n * Only diffs at the root level and primitives.\n *\n * @param {*} currentData - the latest changes by the user\n * @param {*} originalData - the original values\n * @return {Array} - JSON patch operations\n */\n createJSONPatch(currentData: Object, originalData: Object): JSONPatchOperations {\n const ops = [];\n const data = cloneDeep(currentData); // clone the data for mutation\n\n // Iterate over the original data and find keys that have changed.\n // Also remove them from the data object to only leave new keys.\n Object.keys(originalData).forEach(key => {\n const type = this.fieldKeyToTypeMap[key];\n const originalValue = getValue(originalData, key, type);\n const path = `/${key}`;\n\n if (Object.prototype.hasOwnProperty.call(data, key)) {\n const value = getValue(data, key, type);\n\n // Only register changed data\n if (!isEqual(value, originalValue)) {\n // Add a test OP for each replaces\n ops.push({\n op: JSON_PATCH_OP_TEST,\n path,\n value: originalValue,\n });\n ops.push({\n op: JSON_PATCH_OP_REPLACE,\n path,\n value,\n });\n }\n } else {\n // Key was removed\n // Add a test OP for removes\n ops.push({\n op: JSON_PATCH_OP_TEST,\n path,\n value: originalValue,\n });\n ops.push({ op: JSON_PATCH_OP_REMOVE, path });\n }\n delete data[key];\n });\n\n // Iterate over the remaining keys that are new.\n Object.keys(data).forEach(key => {\n const type = this.fieldKeyToTypeMap[key];\n const value = getValue(data, key, type);\n\n ops.push({\n op: JSON_PATCH_OP_ADD,\n path: `/${key}`,\n value,\n });\n });\n\n return ops;\n }\n\n /**\n * Utility function to determine if instance is editable\n *\n * @return {boolean} true if editable\n */\n canEdit(): boolean {\n const { canEdit, onModification, onRemove, onSave }: Props = this.props;\n return (\n canEdit &&\n typeof onRemove === 'function' &&\n typeof onSave === 'function' &&\n typeof onModification === 'function'\n );\n }\n\n /**\n * Utility function to determine if instance is in edit mode\n *\n * @return {boolean} true if editing\n */\n isEditing(): boolean {\n const { isEditing }: State = this.state;\n return this.canEdit() && isEditing;\n }\n\n renderEditButton = () => {\n const { intl, isDirty }: Props = this.props;\n const { isBusy }: State = this.state;\n const canEdit = this.canEdit();\n const isEditing = this.isEditing();\n const editClassName = classNames('metadata-instance-editor-instance-edit', {\n 'metadata-instance-editor-instance-is-editing': isEditing,\n });\n\n if (canEdit && !isDirty && !isBusy) {\n const metadataLabelEditText = intl.formatMessage(messages.metadataEditTooltip);\n return (\n <Tooltip position=\"top-left\" text={metadataLabelEditText}>\n <PlainButton\n aria-label={metadataLabelEditText}\n aria-pressed={isEditing}\n className={editClassName}\n data-resin-target=\"metadata-instanceedit\"\n onClick={this.toggleIsEditing}\n type=\"button\"\n >\n <IconEdit />\n </PlainButton>\n </Tooltip>\n );\n }\n return null;\n };\n\n render() {\n const {\n canUseAIFolderExtraction = false,\n canUseAIFolderExtractionAgentSelector = false,\n cascadePolicy = {},\n isDirty,\n isCascadingPolicyApplicable,\n isOpen,\n template,\n }: Props = this.props;\n const { fields = [] } = template;\n const {\n data,\n errors,\n isBusy,\n isAIFolderExtractionEnabled,\n isCascadingEnabled,\n shouldConfirmRemove,\n shouldShowCascadeOptions,\n isCascadingOverwritten,\n }: State = this.state;\n const isProperties = template.templateKey === TEMPLATE_CUSTOM_PROPERTIES;\n const isEditing = this.isEditing();\n\n if (!template || isHidden(template)) {\n return null;\n }\n\n // Animate short and tall cards at consistent speeds.\n const animationDuration = (fields.length + 1) * 50;\n\n const isExistingCascadePolicy = this.isCascadingEnabledThroughProps(this.props);\n\n return (\n <div ref={this.collapsibleRef}>\n <Collapsible\n animationDuration={animationDuration}\n buttonProps={{\n [RESIN_TAG_TARGET]: 'metadata-card',\n }}\n hasStickyHeader\n headerActionItems={this.renderEditButton()}\n isBordered\n isOpen={isOpen}\n title={this.getTitle()}\n >\n {shouldConfirmRemove && (\n <LoadingIndicatorWrapper isLoading={isBusy}>\n <MetadataInstanceConfirmDialog\n confirmationMessage={this.getConfirmationMessage()}\n onCancel={this.onConfirmCancel}\n onConfirm={this.onRemove}\n />\n </LoadingIndicatorWrapper>\n )}\n {!shouldConfirmRemove && (\n <LoadingIndicatorWrapper isLoading={isBusy}>\n <Form onValidSubmit={isDirty ? this.onSave : noop}>\n <div className=\"metadata-instance-editor-instance\">\n {isCascadingPolicyApplicable && (\n <CascadePolicy\n cascadePolicyConfiguration={cascadePolicy?.cascadePolicyConfiguration}\n canEdit={isEditing && !!cascadePolicy.canEdit}\n canUseAIFolderExtraction={canUseAIFolderExtraction}\n canUseAIFolderExtractionAgentSelector={\n canUseAIFolderExtractionAgentSelector\n }\n isAIFolderExtractionEnabled={isAIFolderExtractionEnabled}\n isCascadingEnabled={isCascadingEnabled}\n isCascadingOverwritten={isCascadingOverwritten}\n isCustomMetadata={isProperties}\n isExistingCascadePolicy={isExistingCascadePolicy}\n onAIAgentSelect={this.onAIAgentSelect}\n onAIFolderExtractionToggle={this.onAIFolderExtractionToggle}\n onCascadeModeChange={this.onCascadeModeChange}\n onCascadeToggle={this.onCascadeToggle}\n shouldShowCascadeOptions={shouldShowCascadeOptions}\n />\n )}\n {isProperties ? (\n <CustomInstance\n canEdit={isEditing}\n data={data}\n onFieldChange={this.onFieldChange}\n onFieldRemove={this.onFieldRemove}\n />\n ) : (\n <TemplatedInstance\n canEdit={isEditing}\n data={data}\n errors={errors}\n isDisabled={isAIFolderExtractionEnabled}\n onFieldChange={this.onFieldChange}\n onFieldRemove={this.onFieldRemove}\n template={template}\n />\n )}\n </div>\n {isEditing && (\n <Footer\n onCancel={this.onCancel}\n onRemove={this.onConfirmRemove}\n showSave={isDirty}\n />\n )}\n </Form>\n </LoadingIndicatorWrapper>\n )}\n </Collapsible>\n </div>\n );\n }\n}\n\nexport { Instance as InstanceBase };\nexport default injectIntl(Instance);\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"Instance.js","names":["React","injectIntl","FormattedMessage","classNames","isEqual","cloneDeep","noop","Collapsible","Form","LoadingIndicatorWrapper","PlainButton","Tooltip","IconMetadataColored","IconAlertCircle","IconEdit","bdlWatermelonRed","scrollIntoView","CascadePolicy","TemplatedInstance","CustomInstance","MetadataInstanceConfirmDialog","Footer","messages","FIELD_TYPE_FLOAT","FIELD_TYPE_INTEGER","CASCADE_POLICY_TYPE_AI_EXTRACT","TEMPLATE_CUSTOM_PROPERTIES","ENHANCED_AGENT_CONFIGURATION","ENHANCED_AGENT_ID","JSON_PATCH_OP_REMOVE","JSON_PATCH_OP_ADD","JSON_PATCH_OP_REPLACE","JSON_PATCH_OP_TEST","isValidValue","isHidden","RESIN_TAG_TARGET","createFieldKeyToTypeMap","fields","reduce","prev","key","type","getValue","data","value","parseFloat","parseInt","Instance","PureComponent","constructor","props","_defineProperty","id","onModification","setState","getState","shouldConfirmRemove","isEditing","onRemove","isBusy","cascadePolicy","originalData","isDirty","isCascadingPolicyApplicable","onSave","cascadePolicyConfiguration","currentData","errors","isAIFolderExtractionEnabled","isCascadingEnabled","isCascadingOverwritten","state","Object","keys","length","createJSONPatch","canEdit","undefined","isEnabled","overwrite","isValid","finalErrors","_objectSpread","finalData","createElement","invalidInput","setDirty","shouldShowCascadeOptions","agent","isFile","template","message","isProperties","templateKey","_extends","values","metadataName","displayName","hasDataChanged","hasCascadingChanged","isCascadingEnabledThroughProps","isAIFolderExtractionEnabledThroughProps","createRef","prevState","intl","editClassName","metadataLabelEditText","formatMessage","metadataEditTooltip","position","text","className","onClick","toggleIsEditing","fieldKeyToTypeMap","componentDidUpdate","hasError","prevHasError","prevIsDirty","currentElement","collapsibleRef","current","block","behavior","getTitle","customTitle","color","getConfirmationMessage","renderDeleteMessage","cascadePolicyType","ops","forEach","originalValue","path","prototype","hasOwnProperty","call","push","op","render","canUseAIFolderExtraction","isOpen","animationDuration","isExistingCascadePolicy","ref","buttonProps","hasStickyHeader","headerActionItems","renderEditButton","isBordered","title","isLoading","confirmationMessage","onCancel","onConfirmCancel","onConfirm","onValidSubmit","isCustomMetadata","onAIAgentSelect","onAIFolderExtractionToggle","onCascadeModeChange","onCascadeToggle","onFieldChange","onFieldRemove","isDisabled","onConfirmRemove","showSave","InstanceBase"],"sources":["../../../src/features/metadata-instance-editor/Instance.js"],"sourcesContent":["// @flow\nimport * as React from 'react';\nimport { injectIntl, FormattedMessage } from 'react-intl';\nimport classNames from 'classnames';\nimport isEqual from 'lodash/isEqual';\nimport cloneDeep from 'lodash/cloneDeep';\nimport noop from 'lodash/noop';\n\nimport type { AgentType } from '@box/box-ai-agent-selector';\nimport Collapsible from '../../components/collapsible/Collapsible';\nimport Form from '../../components/form-elements/form/Form';\nimport LoadingIndicatorWrapper from '../../components/loading-indicator/LoadingIndicatorWrapper';\nimport PlainButton from '../../components/plain-button/PlainButton';\nimport Tooltip from '../../components/tooltip';\nimport IconMetadataColored from '../../icons/general/IconMetadataColored';\nimport IconAlertCircle from '../../icons/general/IconAlertCircle';\nimport IconEdit from '../../icons/general/IconEdit';\nimport { bdlWatermelonRed } from '../../styles/variables';\nimport { scrollIntoView } from '../../utils/dom';\n\nimport CascadePolicy from './CascadePolicy';\nimport TemplatedInstance from './TemplatedInstance';\nimport CustomInstance from './CustomInstance';\nimport MetadataInstanceConfirmDialog from './MetadataInstanceConfirmDialog';\nimport Footer from './Footer';\nimport messages from './messages';\nimport { FIELD_TYPE_FLOAT, FIELD_TYPE_INTEGER } from '../metadata-instance-fields/constants';\nimport {\n CASCADE_POLICY_TYPE_AI_EXTRACT,\n TEMPLATE_CUSTOM_PROPERTIES,\n ENHANCED_AGENT_CONFIGURATION,\n ENHANCED_AGENT_ID,\n} from './constants';\nimport {\n JSON_PATCH_OP_REMOVE,\n JSON_PATCH_OP_ADD,\n JSON_PATCH_OP_REPLACE,\n JSON_PATCH_OP_TEST,\n} from '../../common/constants';\nimport { isValidValue } from '../metadata-instance-fields/validateMetadataField';\nimport { isHidden } from './metadataUtil';\nimport { RESIN_TAG_TARGET } from '../../common/variables';\nimport type {\n MetadataFields,\n MetadataTemplate,\n MetadataCascadePolicy,\n MetadataCascadePolicyConfiguration,\n MetadataCascadingPolicyData,\n MetadataTemplateField,\n MetadataFieldValue,\n} from '../../common/types/metadata';\nimport type { JSONPatchOperations } from '../../common/types/api';\nimport './Instance.scss';\n\ntype Props = {\n canEdit: boolean,\n canUseAIFolderExtraction?: boolean,\n cascadePolicy?: MetadataCascadePolicy, // eslint-disable-line\n data: MetadataFields,\n hasError: boolean,\n id: string,\n intl: Object,\n isCascadingPolicyApplicable?: boolean,\n isDirty: boolean,\n isOpen: boolean,\n onModification?: (id: string, isDirty: boolean, type?: string) => void,\n onRemove?: (id: string) => void,\n onSave?: (\n id: string,\n data: JSONPatchOperations,\n cascadingPolicy?: MetadataCascadingPolicyData,\n rawData: Object,\n ) => void,\n template: MetadataTemplate,\n};\n\ntype State = {\n cascadePolicyConfiguration: MetadataCascadePolicyConfiguration | null,\n data: Object,\n errors: { [string]: React.Node },\n isAIFolderExtractionEnabled: boolean,\n isBusy: boolean,\n isCascadingEnabled: boolean,\n isCascadingOverwritten: boolean,\n isEditing: boolean,\n shouldConfirmRemove: boolean,\n shouldShowCascadeOptions: boolean,\n};\n\nconst createFieldKeyToTypeMap = (fields?: Array<MetadataTemplateField> = []) =>\n fields.reduce((prev, { key, type }) => {\n prev[key] = type;\n return prev;\n }, {});\n\nconst getValue = (data: Object, key: string, type: string) => {\n const value = data[key];\n\n switch (type) {\n case FIELD_TYPE_FLOAT:\n return parseFloat(value);\n\n case FIELD_TYPE_INTEGER:\n return parseInt(value, 10);\n\n default:\n return value;\n }\n};\n\nclass Instance extends React.PureComponent<Props, State> {\n static defaultProps = {\n data: {},\n isDirty: false,\n };\n\n constructor(props: Props) {\n super(props);\n this.state = this.getState(props);\n this.fieldKeyToTypeMap = createFieldKeyToTypeMap(props.template.fields);\n }\n\n componentDidUpdate({ hasError: prevHasError, isDirty: prevIsDirty }: Props, prevState: State): void {\n const currentElement = this.collapsibleRef.current;\n const { hasError, isDirty }: Props = this.props;\n const { isEditing }: State = prevState;\n\n if (currentElement && this.state.shouldConfirmRemove) {\n scrollIntoView(currentElement, {\n block: 'start',\n behavior: 'smooth',\n });\n }\n\n if (hasError && hasError !== prevHasError) {\n // If hasError is true, which means an error occurred while\n // doing a network operation and hence hide the busy indicator\n // Saving also disables isEditing, so need to enable that back.\n // isDirty remains as it was before.\n this.setState({ isBusy: false, isEditing: true });\n } else if (prevIsDirty && !isDirty) {\n // If the form was dirty and now its not dirty\n // we know a successful save may have happened.\n // We don't modify isEditing here because we maintain the\n // prior state for that. If we came here from a save\n // success then save already disabled isEditing.\n if (isEditing) {\n // We are still editing so don't reset it\n this.setState({ isBusy: false });\n } else {\n // For a successfull save we reset cascading overwrite radio\n this.setState({ isBusy: false, isCascadingOverwritten: false });\n }\n }\n }\n\n /**\n * Undo any changes made\n *\n * @return {void}\n */\n onCancel = (): void => {\n const { id, onModification }: Props = this.props;\n this.setState(this.getState(this.props));\n\n // Callback to parent to tell that something is dirty\n if (onModification) {\n onModification(id, false);\n }\n };\n\n /**\n * Allows a user to confirm metadata instance removal\n *\n * @return {void}\n */\n onConfirmRemove = (): void => {\n this.setState({ shouldConfirmRemove: true });\n };\n\n /**\n * Cancel the remove instance attempt\n *\n * @return {void}\n */\n onConfirmCancel = (): void => {\n this.setState({ shouldConfirmRemove: false });\n };\n\n /**\n * Removes an instance\n *\n * @return {void}\n */\n onRemove = (): void => {\n if (!this.isEditing()) {\n return;\n }\n\n const { id, onRemove }: Props = this.props;\n if (onRemove) {\n onRemove(id);\n this.setState({ isBusy: true });\n }\n };\n\n /**\n * Saves instance data\n *\n * @return {void}\n */\n onSave = (): void => {\n const {\n cascadePolicy,\n data: originalData,\n id,\n isDirty,\n isCascadingPolicyApplicable,\n onSave,\n }: Props = this.props;\n const {\n cascadePolicyConfiguration,\n data: currentData,\n errors,\n isAIFolderExtractionEnabled,\n isCascadingEnabled,\n isCascadingOverwritten,\n }: State = this.state;\n\n if (!this.isEditing() || !isDirty || !onSave || Object.keys(errors).length) {\n return;\n }\n\n this.setState({\n isBusy: true,\n isEditing: false,\n // reset state if cascading policy is removed\n isAIFolderExtractionEnabled: isCascadingEnabled ? isAIFolderExtractionEnabled : false,\n });\n\n onSave(\n id,\n this.createJSONPatch(currentData, originalData),\n isCascadingPolicyApplicable\n ? {\n canEdit: cascadePolicy ? cascadePolicy.canEdit : false,\n id: cascadePolicy ? cascadePolicy.id : undefined,\n isEnabled: isCascadingEnabled,\n overwrite: isCascadingOverwritten,\n isAIFolderExtractionEnabled,\n cascadePolicyConfiguration,\n }\n : undefined,\n cloneDeep(currentData),\n );\n };\n\n /**\n * Updates a key value in the instance data\n *\n * @param {string} key - key to update\n * @param {FieldValue} value - value to update\n * @param {string} type - type of field\n * @return {void}\n */\n onFieldChange = (key: string, value: MetadataFieldValue, type: string): void => {\n const { data, errors }: State = this.state;\n\n // Don't do anything if data is the same or not in edit mode\n if (!this.isEditing() || isEqual(data[key], value)) {\n return;\n }\n\n const isValid = isValidValue(type, value);\n const finalErrors = { ...errors };\n const finalData = cloneDeep(data);\n finalData[key] = value;\n\n if (isValid) {\n delete finalErrors[key];\n } else {\n finalErrors[key] = <FormattedMessage {...messages.invalidInput} />;\n }\n\n this.setState({ data: finalData, errors: finalErrors }, () => {\n this.setDirty(type);\n });\n };\n\n /**\n * Removes a key from instance data\n *\n * @param {string} key - key to remove\n * @return {void}\n */\n onFieldRemove = (key: string): void => {\n if (!this.isEditing()) {\n return;\n }\n\n const { data, errors }: State = this.state;\n const finalData = cloneDeep(data);\n const finalErrors = { ...errors };\n delete finalData[key];\n delete finalErrors[key];\n this.setState({ data: finalData, errors: finalErrors }, this.setDirty);\n };\n\n /**\n * Toggle cascading policy\n *\n * @param {boolean} value - true when turned on\n * @return {void}\n */\n onCascadeToggle = (value: boolean) => {\n const { isCascadingPolicyApplicable }: Props = this.props;\n if (!isCascadingPolicyApplicable) {\n return;\n }\n\n this.setState(\n {\n isCascadingEnabled: value,\n shouldShowCascadeOptions: value,\n },\n this.setDirty,\n );\n };\n\n /**\n * Changes the cascade mode.\n * isCascadingOverwritten is slways false to start off.\n *\n * @param {boolean} value - true when overwrite policy is chosen\n * @return {void}\n */\n onCascadeModeChange = (value: boolean): void => {\n const { isCascadingPolicyApplicable }: Props = this.props;\n if (!isCascadingPolicyApplicable) {\n return;\n }\n\n this.setState(\n {\n isCascadingOverwritten: value,\n },\n this.setDirty,\n );\n };\n\n onAIFolderExtractionToggle = (value: boolean) => {\n this.setState({ isAIFolderExtractionEnabled: value }, this.setDirty);\n };\n\n /**\n * Handles the selection of an AI agent\n * @param {AgentType | null} agent - The selected agent\n */\n onAIAgentSelect = (agent: AgentType | null): void => {\n // '2' is the id for the enhanced agent\n if (agent && agent.id === ENHANCED_AGENT_ID) {\n this.setState({\n cascadePolicyConfiguration: {\n agent: ENHANCED_AGENT_CONFIGURATION,\n },\n });\n } else {\n this.setState({ cascadePolicyConfiguration: null });\n }\n };\n\n /**\n * Returns the state from props\n *\n * @return {Object} - react state\n */\n getState(props: Props): State {\n const isCascadingEnabled = this.isCascadingEnabledThroughProps(props);\n\n return {\n cascadePolicyConfiguration: null,\n data: cloneDeep(props.data),\n errors: {},\n isAIFolderExtractionEnabled: this.isAIFolderExtractionEnabledThroughProps(props),\n isBusy: false,\n isCascadingEnabled,\n isCascadingOverwritten: false,\n isEditing: false,\n shouldConfirmRemove: false,\n shouldShowCascadeOptions: isCascadingEnabled,\n };\n }\n\n /**\n * Returns the card title with possible error mark\n *\n * @return {Object} - react title element\n */\n getTitle(): React.Node {\n const { cascadePolicy = {}, hasError, isCascadingPolicyApplicable, template }: Props = this.props;\n const isProperties = template.templateKey === TEMPLATE_CUSTOM_PROPERTIES;\n\n const type = isCascadingPolicyApplicable && cascadePolicy.id ? 'cascade' : 'default';\n\n return (\n <span className=\"metadata-instance-editor-instance-title\">\n <IconMetadataColored type={type} />\n <span\n className={classNames('metadata-instance-editor-instance-title-text', {\n 'metadata-instance-editor-instance-has-error': hasError,\n })}\n >\n {isProperties ? <FormattedMessage {...messages.customTitle} /> : template.displayName}\n </span>\n {hasError && <IconAlertCircle color={bdlWatermelonRed} />}\n </span>\n );\n }\n\n /**\n * Render the correct delete message to show based on custom metadata and file/folder metadata\n */\n renderDeleteMessage = (isFile: boolean, template: Object) => {\n let message;\n const isProperties = template.templateKey === TEMPLATE_CUSTOM_PROPERTIES;\n\n if (isProperties) {\n message = isFile ? 'fileMetadataRemoveCustomTemplateConfirm' : 'folderMetadataRemoveCustomTemplateConfirm';\n } else {\n message = isFile ? 'fileMetadataRemoveTemplateConfirm' : 'folderMetadataRemoveTemplateConfirm';\n }\n\n return (\n <FormattedMessage\n {...messages[message]}\n values={{\n metadataName: template.displayName,\n }}\n />\n );\n };\n\n /**\n * Get the delete confirmation message base on the template key\n */\n getConfirmationMessage(): React.Node {\n const { template, isCascadingPolicyApplicable }: Props = this.props;\n const isFile = !isCascadingPolicyApplicable;\n return this.renderDeleteMessage(isFile, template);\n }\n\n /**\n * Evaluates if the metadata was changed or cascading policy\n * altered or enabled.\n *\n * @return {void}\n */\n setDirty = (type?: string): void => {\n const { id, isCascadingPolicyApplicable, onModification }: Props = this.props;\n const { data, isCascadingEnabled, isCascadingOverwritten, isAIFolderExtractionEnabled } = this.state;\n const hasDataChanged = !isEqual(data, this.props.data);\n let hasCascadingChanged = false;\n\n if (isCascadingPolicyApplicable) {\n // isCascadingOverwritten always starts out as false, so true signifies a change\n hasCascadingChanged =\n isCascadingOverwritten ||\n isCascadingEnabled !== this.isCascadingEnabledThroughProps(this.props) ||\n isAIFolderExtractionEnabled !== this.isAIFolderExtractionEnabledThroughProps(this.props);\n }\n\n // Callback to parent to tell that something is dirty\n if (onModification) {\n onModification(id, hasDataChanged || hasCascadingChanged, type);\n }\n };\n\n collapsibleRef: {\n current: null | HTMLDivElement,\n } = React.createRef();\n\n fieldKeyToTypeMap: Object;\n\n /**\n * Determines if cascading policy is enabled through props based on\n * whether it has an id or not.\n *\n * @param {Object} props - component props\n * @return {boolean} true if cascading policy is enabled\n */\n isCascadingEnabledThroughProps(props: Props) {\n if (props.cascadePolicy) {\n return !!props.cascadePolicy.id;\n }\n return false;\n }\n\n /**\n * Determines if ai extraction is enabled based on\n * if cascade policy type is ai_extract\n *\n * @param {Object} props - component props\n * @return {boolean} true if ai extraction is enabled\n */\n isAIFolderExtractionEnabledThroughProps({ cascadePolicy }: Props) {\n return cascadePolicy?.cascadePolicyType === CASCADE_POLICY_TYPE_AI_EXTRACT;\n }\n\n /**\n * Toggles the edit mode\n *\n * @private\n * @return {void}\n */\n toggleIsEditing = (): void => {\n this.setState(prevState => ({\n isEditing: !prevState.isEditing,\n }));\n };\n\n /**\n * Creates JSON Patch operations from the passed in\n * data while comparing it to the original data from props.\n *\n * Only diffs at the root level and primitives.\n *\n * @param {*} currentData - the latest changes by the user\n * @param {*} originalData - the original values\n * @return {Array} - JSON patch operations\n */\n createJSONPatch(currentData: Object, originalData: Object): JSONPatchOperations {\n const ops = [];\n const data = cloneDeep(currentData); // clone the data for mutation\n\n // Iterate over the original data and find keys that have changed.\n // Also remove them from the data object to only leave new keys.\n Object.keys(originalData).forEach(key => {\n const type = this.fieldKeyToTypeMap[key];\n const originalValue = getValue(originalData, key, type);\n const path = `/${key}`;\n\n if (Object.prototype.hasOwnProperty.call(data, key)) {\n const value = getValue(data, key, type);\n\n // Only register changed data\n if (!isEqual(value, originalValue)) {\n // Add a test OP for each replaces\n ops.push({\n op: JSON_PATCH_OP_TEST,\n path,\n value: originalValue,\n });\n ops.push({\n op: JSON_PATCH_OP_REPLACE,\n path,\n value,\n });\n }\n } else {\n // Key was removed\n // Add a test OP for removes\n ops.push({\n op: JSON_PATCH_OP_TEST,\n path,\n value: originalValue,\n });\n ops.push({ op: JSON_PATCH_OP_REMOVE, path });\n }\n delete data[key];\n });\n\n // Iterate over the remaining keys that are new.\n Object.keys(data).forEach(key => {\n const type = this.fieldKeyToTypeMap[key];\n const value = getValue(data, key, type);\n\n ops.push({\n op: JSON_PATCH_OP_ADD,\n path: `/${key}`,\n value,\n });\n });\n\n return ops;\n }\n\n /**\n * Utility function to determine if instance is editable\n *\n * @return {boolean} true if editable\n */\n canEdit(): boolean {\n const { canEdit, onModification, onRemove, onSave }: Props = this.props;\n return (\n canEdit &&\n typeof onRemove === 'function' &&\n typeof onSave === 'function' &&\n typeof onModification === 'function'\n );\n }\n\n /**\n * Utility function to determine if instance is in edit mode\n *\n * @return {boolean} true if editing\n */\n isEditing(): boolean {\n const { isEditing }: State = this.state;\n return this.canEdit() && isEditing;\n }\n\n renderEditButton = () => {\n const { intl, isDirty }: Props = this.props;\n const { isBusy }: State = this.state;\n const canEdit = this.canEdit();\n const isEditing = this.isEditing();\n const editClassName = classNames('metadata-instance-editor-instance-edit', {\n 'metadata-instance-editor-instance-is-editing': isEditing,\n });\n\n if (canEdit && !isDirty && !isBusy) {\n const metadataLabelEditText = intl.formatMessage(messages.metadataEditTooltip);\n return (\n <Tooltip position=\"top-left\" text={metadataLabelEditText}>\n <PlainButton\n aria-label={metadataLabelEditText}\n aria-pressed={isEditing}\n className={editClassName}\n data-resin-target=\"metadata-instanceedit\"\n onClick={this.toggleIsEditing}\n type=\"button\"\n >\n <IconEdit />\n </PlainButton>\n </Tooltip>\n );\n }\n return null;\n };\n\n render() {\n const {\n canUseAIFolderExtraction = false,\n cascadePolicy = {},\n isDirty,\n isCascadingPolicyApplicable,\n isOpen,\n template,\n }: Props = this.props;\n const { fields = [] } = template;\n const {\n data,\n errors,\n isBusy,\n isAIFolderExtractionEnabled,\n isCascadingEnabled,\n shouldConfirmRemove,\n shouldShowCascadeOptions,\n isCascadingOverwritten,\n }: State = this.state;\n const isProperties = template.templateKey === TEMPLATE_CUSTOM_PROPERTIES;\n const isEditing = this.isEditing();\n\n if (!template || isHidden(template)) {\n return null;\n }\n\n // Animate short and tall cards at consistent speeds.\n const animationDuration = (fields.length + 1) * 50;\n\n const isExistingCascadePolicy = this.isCascadingEnabledThroughProps(this.props);\n\n return (\n <div ref={this.collapsibleRef}>\n <Collapsible\n animationDuration={animationDuration}\n buttonProps={{\n [RESIN_TAG_TARGET]: 'metadata-card',\n }}\n hasStickyHeader\n headerActionItems={this.renderEditButton()}\n isBordered\n isOpen={isOpen}\n title={this.getTitle()}\n >\n {shouldConfirmRemove && (\n <LoadingIndicatorWrapper isLoading={isBusy}>\n <MetadataInstanceConfirmDialog\n confirmationMessage={this.getConfirmationMessage()}\n onCancel={this.onConfirmCancel}\n onConfirm={this.onRemove}\n />\n </LoadingIndicatorWrapper>\n )}\n {!shouldConfirmRemove && (\n <LoadingIndicatorWrapper isLoading={isBusy}>\n <Form onValidSubmit={isDirty ? this.onSave : noop}>\n <div className=\"metadata-instance-editor-instance\">\n {isCascadingPolicyApplicable && (\n <CascadePolicy\n cascadePolicyConfiguration={cascadePolicy?.cascadePolicyConfiguration}\n canEdit={isEditing && !!cascadePolicy.canEdit}\n canUseAIFolderExtraction={canUseAIFolderExtraction}\n isAIFolderExtractionEnabled={isAIFolderExtractionEnabled}\n isCascadingEnabled={isCascadingEnabled}\n isCascadingOverwritten={isCascadingOverwritten}\n isCustomMetadata={isProperties}\n isExistingCascadePolicy={isExistingCascadePolicy}\n onAIAgentSelect={this.onAIAgentSelect}\n onAIFolderExtractionToggle={this.onAIFolderExtractionToggle}\n onCascadeModeChange={this.onCascadeModeChange}\n onCascadeToggle={this.onCascadeToggle}\n shouldShowCascadeOptions={shouldShowCascadeOptions}\n />\n )}\n {isProperties ? (\n <CustomInstance\n canEdit={isEditing}\n data={data}\n onFieldChange={this.onFieldChange}\n onFieldRemove={this.onFieldRemove}\n />\n ) : (\n <TemplatedInstance\n canEdit={isEditing}\n data={data}\n errors={errors}\n isDisabled={isAIFolderExtractionEnabled}\n onFieldChange={this.onFieldChange}\n onFieldRemove={this.onFieldRemove}\n template={template}\n />\n )}\n </div>\n {isEditing && (\n <Footer\n onCancel={this.onCancel}\n onRemove={this.onConfirmRemove}\n showSave={isDirty}\n />\n )}\n </Form>\n </LoadingIndicatorWrapper>\n )}\n </Collapsible>\n </div>\n );\n }\n}\n\nexport { Instance as InstanceBase };\nexport default injectIntl(Instance);\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -2,7 +2,6 @@ import * as React from 'react';
|
|
|
2
2
|
import Instance from './Instance';
|
|
3
3
|
const Instances = ({
|
|
4
4
|
canUseAIFolderExtraction = false,
|
|
5
|
-
canUseAIFolderExtractionAgentSelector = false,
|
|
6
5
|
isCascadingPolicyApplicable = false,
|
|
7
6
|
editors = [],
|
|
8
7
|
onModification,
|
|
@@ -22,7 +21,6 @@ const Instances = ({
|
|
|
22
21
|
return /*#__PURE__*/React.createElement(Instance, {
|
|
23
22
|
canEdit: instance.canEdit,
|
|
24
23
|
canUseAIFolderExtraction: canUseAIFolderExtraction,
|
|
25
|
-
canUseAIFolderExtractionAgentSelector: canUseAIFolderExtractionAgentSelector,
|
|
26
24
|
cascadePolicy: instance.cascadePolicy,
|
|
27
25
|
data: instance.data,
|
|
28
26
|
hasError: hasError,
|
|
@@ -7,7 +7,6 @@ import type { JSONPatchOperations } from '../../common/types/api';
|
|
|
7
7
|
|
|
8
8
|
type Props = {
|
|
9
9
|
canUseAIFolderExtraction?: boolean,
|
|
10
|
-
canUseAIFolderExtractionAgentSelector?: boolean,
|
|
11
10
|
editors?: Array<MetadataEditor>,
|
|
12
11
|
isCascadingPolicyApplicable?: boolean,
|
|
13
12
|
onModification?: (id: string, isDirty: boolean) => void,
|
|
@@ -23,7 +22,6 @@ type Props = {
|
|
|
23
22
|
|
|
24
23
|
const Instances = ({
|
|
25
24
|
canUseAIFolderExtraction = false,
|
|
26
|
-
canUseAIFolderExtractionAgentSelector = false,
|
|
27
25
|
isCascadingPolicyApplicable = false,
|
|
28
26
|
editors = [],
|
|
29
27
|
onModification,
|
|
@@ -39,7 +37,6 @@ const Instances = ({
|
|
|
39
37
|
<Instance
|
|
40
38
|
canEdit={instance.canEdit}
|
|
41
39
|
canUseAIFolderExtraction={canUseAIFolderExtraction}
|
|
42
|
-
canUseAIFolderExtractionAgentSelector={canUseAIFolderExtractionAgentSelector}
|
|
43
40
|
cascadePolicy={instance.cascadePolicy}
|
|
44
41
|
data={instance.data}
|
|
45
42
|
hasError={hasError}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Instances.js","names":["React","Instance","Instances","canUseAIFolderExtraction","
|
|
1
|
+
{"version":3,"file":"Instances.js","names":["React","Instance","Instances","canUseAIFolderExtraction","isCascadingPolicyApplicable","editors","onModification","onRemove","onSave","selectedTemplateKey","map","isDirty","instance","hasError","template","templateKey","isOpen","length","createElement","canEdit","cascadePolicy","data","id","key"],"sources":["../../../src/features/metadata-instance-editor/Instances.js"],"sourcesContent":["// @flow\nimport * as React from 'react';\n\nimport Instance from './Instance';\nimport type { MetadataEditor, MetadataCascadingPolicyData } from '../../common/types/metadata';\nimport type { JSONPatchOperations } from '../../common/types/api';\n\ntype Props = {\n canUseAIFolderExtraction?: boolean,\n editors?: Array<MetadataEditor>,\n isCascadingPolicyApplicable?: boolean,\n onModification?: (id: string, isDirty: boolean) => void,\n onRemove?: (id: string) => void,\n onSave?: (\n id: string,\n data: JSONPatchOperations,\n cascadingPolicy?: MetadataCascadingPolicyData,\n rawData: Object,\n ) => void,\n selectedTemplateKey?: string,\n};\n\nconst Instances = ({\n canUseAIFolderExtraction = false,\n isCascadingPolicyApplicable = false,\n editors = [],\n onModification,\n onRemove,\n onSave,\n selectedTemplateKey,\n}: Props) =>\n editors.map<React.Element<typeof Instance>>(\n ({ isDirty = false, instance, hasError = false, template }: MetadataEditor) => {\n const { templateKey } = template;\n const isOpen = editors.length === 1 || templateKey === selectedTemplateKey;\n return (\n <Instance\n canEdit={instance.canEdit}\n canUseAIFolderExtraction={canUseAIFolderExtraction}\n cascadePolicy={instance.cascadePolicy}\n data={instance.data}\n hasError={hasError}\n id={instance.id}\n isCascadingPolicyApplicable={isCascadingPolicyApplicable}\n isDirty={isDirty}\n isOpen={isOpen}\n key={`${instance.id}-${templateKey}`}\n onModification={onModification}\n onSave={onSave}\n onRemove={onRemove}\n template={template}\n />\n );\n },\n );\n\nexport default Instances;\n"],"mappings":"AACA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAE9B,OAAOC,QAAQ,MAAM,YAAY;AAmBjC,MAAMC,SAAS,GAAGA,CAAC;EACfC,wBAAwB,GAAG,KAAK;EAChCC,2BAA2B,GAAG,KAAK;EACnCC,OAAO,GAAG,EAAE;EACZC,cAAc;EACdC,QAAQ;EACRC,MAAM;EACNC;AACG,CAAC,KACJJ,OAAO,CAACK,GAAG,CACP,CAAC;EAAEC,OAAO,GAAG,KAAK;EAAEC,QAAQ;EAAEC,QAAQ,GAAG,KAAK;EAAEC;AAAyB,CAAC,KAAK;EAC3E,MAAM;IAAEC;EAAY,CAAC,GAAGD,QAAQ;EAChC,MAAME,MAAM,GAAGX,OAAO,CAACY,MAAM,KAAK,CAAC,IAAIF,WAAW,KAAKN,mBAAmB;EAC1E,oBACIT,KAAA,CAAAkB,aAAA,CAACjB,QAAQ;IACLkB,OAAO,EAAEP,QAAQ,CAACO,OAAQ;IAC1BhB,wBAAwB,EAAEA,wBAAyB;IACnDiB,aAAa,EAAER,QAAQ,CAACQ,aAAc;IACtCC,IAAI,EAAET,QAAQ,CAACS,IAAK;IACpBR,QAAQ,EAAEA,QAAS;IACnBS,EAAE,EAAEV,QAAQ,CAACU,EAAG;IAChBlB,2BAA2B,EAAEA,2BAA4B;IACzDO,OAAO,EAAEA,OAAQ;IACjBK,MAAM,EAAEA,MAAO;IACfO,GAAG,EAAE,GAAGX,QAAQ,CAACU,EAAE,IAAIP,WAAW,EAAG;IACrCT,cAAc,EAAEA,cAAe;IAC/BE,MAAM,EAAEA,MAAO;IACfD,QAAQ,EAAEA,QAAS;IACnBO,QAAQ,EAAEA;EAAS,CACtB,CAAC;AAEV,CACJ,CAAC;AAEL,eAAeZ,SAAS","ignoreList":[]}
|
|
@@ -9,7 +9,6 @@ const MetadataInstanceEditor = ({
|
|
|
9
9
|
blurExceptionClassNames,
|
|
10
10
|
canAdd,
|
|
11
11
|
canUseAIFolderExtraction = false,
|
|
12
|
-
canUseAIFolderExtractionAgentSelector = false,
|
|
13
12
|
isCascadingPolicyApplicable = false,
|
|
14
13
|
isDropdownBusy,
|
|
15
14
|
editors = [],
|
|
@@ -37,7 +36,6 @@ const MetadataInstanceEditor = ({
|
|
|
37
36
|
canAdd: canAdd
|
|
38
37
|
}) : /*#__PURE__*/React.createElement(ScrollWrapper, null, /*#__PURE__*/React.createElement(Instances, {
|
|
39
38
|
canUseAIFolderExtraction: canUseAIFolderExtraction,
|
|
40
|
-
canUseAIFolderExtractionAgentSelector: canUseAIFolderExtractionAgentSelector,
|
|
41
39
|
editors: editors,
|
|
42
40
|
isCascadingPolicyApplicable: isCascadingPolicyApplicable,
|
|
43
41
|
onModification: onModification,
|
|
@@ -15,7 +15,6 @@ type Props = {
|
|
|
15
15
|
blurExceptionClassNames?: Array<string>,
|
|
16
16
|
canAdd: boolean,
|
|
17
17
|
canUseAIFolderExtraction?: boolean,
|
|
18
|
-
canUseAIFolderExtractionAgentSelector?: boolean,
|
|
19
18
|
editors?: Array<MetadataEditor>,
|
|
20
19
|
isCascadingPolicyApplicable?: boolean,
|
|
21
20
|
isDropdownBusy?: boolean,
|
|
@@ -38,7 +37,6 @@ const MetadataInstanceEditor = ({
|
|
|
38
37
|
blurExceptionClassNames,
|
|
39
38
|
canAdd,
|
|
40
39
|
canUseAIFolderExtraction = false,
|
|
41
|
-
canUseAIFolderExtractionAgentSelector = false,
|
|
42
40
|
isCascadingPolicyApplicable = false,
|
|
43
41
|
isDropdownBusy,
|
|
44
42
|
editors = [],
|
|
@@ -66,7 +64,6 @@ const MetadataInstanceEditor = ({
|
|
|
66
64
|
<ScrollWrapper>
|
|
67
65
|
<Instances
|
|
68
66
|
canUseAIFolderExtraction={canUseAIFolderExtraction}
|
|
69
|
-
canUseAIFolderExtractionAgentSelector={canUseAIFolderExtractionAgentSelector}
|
|
70
67
|
editors={editors}
|
|
71
68
|
isCascadingPolicyApplicable={isCascadingPolicyApplicable}
|
|
72
69
|
onModification={onModification}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MetadataInstanceEditor.js","names":["React","ScrollWrapper","Header","Instances","EmptyContent","MetadataInstanceEditorContext","MetadataInstanceEditor","blurExceptionClassNames","canAdd","canUseAIFolderExtraction","
|
|
1
|
+
{"version":3,"file":"MetadataInstanceEditor.js","names":["React","ScrollWrapper","Header","Instances","EmptyContent","MetadataInstanceEditorContext","MetadataInstanceEditor","blurExceptionClassNames","canAdd","canUseAIFolderExtraction","isCascadingPolicyApplicable","isDropdownBusy","editors","onModification","onRemove","onAdd","onSave","selectedTemplateKey","templates","title","createElement","Provider","value","className","length"],"sources":["../../../src/features/metadata-instance-editor/MetadataInstanceEditor.js"],"sourcesContent":["// @flow\nimport * as React from 'react';\n\nimport ScrollWrapper from '../../components/scroll-wrapper';\n\nimport Header from './Header';\nimport Instances from './Instances';\nimport EmptyContent from './EmptyContent';\nimport type { MetadataEditor, MetadataTemplate, MetadataCascadingPolicyData } from '../../common/types/metadata';\nimport type { JSONPatchOperations } from '../../common/types/api';\nimport MetadataInstanceEditorContext from './MetadataInstanceEditorContext';\nimport './MetadataInstanceEditor.scss';\n\ntype Props = {\n blurExceptionClassNames?: Array<string>,\n canAdd: boolean,\n canUseAIFolderExtraction?: boolean,\n editors?: Array<MetadataEditor>,\n isCascadingPolicyApplicable?: boolean,\n isDropdownBusy?: boolean,\n onAdd?: (template: MetadataTemplate) => void,\n onModification?: (id: string, isDirty: boolean) => void,\n onRemove?: (id: string) => void,\n onSave?: (\n id: string,\n data: JSONPatchOperations,\n cascadingPolicy?: MetadataCascadingPolicyData,\n rawData: Object,\n ) => void,\n selectedTemplateKey?: string,\n templateFilters?: Array<string> | string,\n templates: Array<MetadataTemplate>,\n title?: React.Node,\n};\n\nconst MetadataInstanceEditor = ({\n blurExceptionClassNames,\n canAdd,\n canUseAIFolderExtraction = false,\n isCascadingPolicyApplicable = false,\n isDropdownBusy,\n editors = [],\n onModification,\n onRemove,\n onAdd,\n onSave,\n selectedTemplateKey,\n templates,\n title,\n}: Props) => (\n <MetadataInstanceEditorContext.Provider value={{ blurExceptionClassNames }}>\n <div className=\"metadata-instance-editor\">\n <Header\n canAdd={canAdd}\n editors={editors}\n isDropdownBusy={isDropdownBusy}\n onAdd={onAdd}\n templates={templates}\n title={title}\n />\n {editors.length === 0 ? (\n <EmptyContent canAdd={canAdd} />\n ) : (\n <ScrollWrapper>\n <Instances\n canUseAIFolderExtraction={canUseAIFolderExtraction}\n editors={editors}\n isCascadingPolicyApplicable={isCascadingPolicyApplicable}\n onModification={onModification}\n onRemove={onRemove}\n onSave={onSave}\n selectedTemplateKey={selectedTemplateKey}\n />\n </ScrollWrapper>\n )}\n </div>\n </MetadataInstanceEditorContext.Provider>\n);\n\nexport default MetadataInstanceEditor;\n"],"mappings":"AACA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAE9B,OAAOC,aAAa,MAAM,iCAAiC;AAE3D,OAAOC,MAAM,MAAM,UAAU;AAC7B,OAAOC,SAAS,MAAM,aAAa;AACnC,OAAOC,YAAY,MAAM,gBAAgB;AAGzC,OAAOC,6BAA6B,MAAM,iCAAiC;AAC3E,OAAO,+BAA+B;AAwBtC,MAAMC,sBAAsB,GAAGA,CAAC;EAC5BC,uBAAuB;EACvBC,MAAM;EACNC,wBAAwB,GAAG,KAAK;EAChCC,2BAA2B,GAAG,KAAK;EACnCC,cAAc;EACdC,OAAO,GAAG,EAAE;EACZC,cAAc;EACdC,QAAQ;EACRC,KAAK;EACLC,MAAM;EACNC,mBAAmB;EACnBC,SAAS;EACTC;AACG,CAAC,kBACJnB,KAAA,CAAAoB,aAAA,CAACf,6BAA6B,CAACgB,QAAQ;EAACC,KAAK,EAAE;IAAEf;EAAwB;AAAE,gBACvEP,KAAA,CAAAoB,aAAA;EAAKG,SAAS,EAAC;AAA0B,gBACrCvB,KAAA,CAAAoB,aAAA,CAAClB,MAAM;EACHM,MAAM,EAAEA,MAAO;EACfI,OAAO,EAAEA,OAAQ;EACjBD,cAAc,EAAEA,cAAe;EAC/BI,KAAK,EAAEA,KAAM;EACbG,SAAS,EAAEA,SAAU;EACrBC,KAAK,EAAEA;AAAM,CAChB,CAAC,EACDP,OAAO,CAACY,MAAM,KAAK,CAAC,gBACjBxB,KAAA,CAAAoB,aAAA,CAAChB,YAAY;EAACI,MAAM,EAAEA;AAAO,CAAE,CAAC,gBAEhCR,KAAA,CAAAoB,aAAA,CAACnB,aAAa,qBACVD,KAAA,CAAAoB,aAAA,CAACjB,SAAS;EACNM,wBAAwB,EAAEA,wBAAyB;EACnDG,OAAO,EAAEA,OAAQ;EACjBF,2BAA2B,EAAEA,2BAA4B;EACzDG,cAAc,EAAEA,cAAe;EAC/BC,QAAQ,EAAEA,QAAS;EACnBE,MAAM,EAAEA,MAAO;EACfC,mBAAmB,EAAEA;AAAoB,CAC5C,CACU,CAElB,CAC+B,CAC3C;AAED,eAAeX,sBAAsB","ignoreList":[]}
|
|
@@ -5,7 +5,6 @@ import CascadePolicy from '../../CascadePolicy';
|
|
|
5
5
|
const baseProps = {
|
|
6
6
|
canEdit: true,
|
|
7
7
|
canUseAIFolderExtraction: true,
|
|
8
|
-
canUseAIFolderExtractionAgentSelector: true,
|
|
9
8
|
isAIFolderExtractionEnabled: false,
|
|
10
9
|
isCascadingEnabled: true,
|
|
11
10
|
isCascadingOverwritten: false,
|
package/es/features/metadata-instance-editor/stories/tests/CascadePolicy-visual.stories.js.flow
CHANGED
|
@@ -5,7 +5,6 @@ import CascadePolicy from '../../CascadePolicy';
|
|
|
5
5
|
const baseProps = {
|
|
6
6
|
canEdit: true,
|
|
7
7
|
canUseAIFolderExtraction: true,
|
|
8
|
-
canUseAIFolderExtractionAgentSelector: true,
|
|
9
8
|
isAIFolderExtractionEnabled: false,
|
|
10
9
|
isCascadingEnabled: true,
|
|
11
10
|
isCascadingOverwritten: false,
|
package/es/features/metadata-instance-editor/stories/tests/CascadePolicy-visual.stories.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CascadePolicy-visual.stories.js","names":["React","TooltipProvider","CascadePolicy","baseProps","canEdit","canUseAIFolderExtraction","
|
|
1
|
+
{"version":3,"file":"CascadePolicy-visual.stories.js","names":["React","TooltipProvider","CascadePolicy","baseProps","canEdit","canUseAIFolderExtraction","isAIFolderExtractionEnabled","isCascadingEnabled","isCascadingOverwritten","isCustomMetadata","onAIFolderExtractionToggle","onCascadeModeChange","onCascadeToggle","shouldShowCascadeOptions","Template","props","createElement","_extends","EnabledCascadePolicyOptionsFieldsOnly","isExistingCascadePolicy","storyName","DisabledCascadePolicyOptionsFieldsOnly","title","component"],"sources":["../../../../../src/features/metadata-instance-editor/stories/tests/CascadePolicy-visual.stories.js"],"sourcesContent":["import * as React from 'react';\nimport { TooltipProvider } from '@box/blueprint-web';\nimport CascadePolicy from '../../CascadePolicy';\n\nconst baseProps = {\n canEdit: true,\n canUseAIFolderExtraction: true,\n isAIFolderExtractionEnabled: false,\n isCascadingEnabled: true,\n isCascadingOverwritten: false,\n isCustomMetadata: false,\n onAIFolderExtractionToggle: () => {},\n onCascadeModeChange: () => {},\n onCascadeToggle: () => {},\n shouldShowCascadeOptions: true,\n};\n\nconst Template = props => (\n <TooltipProvider>\n <CascadePolicy {...baseProps} {...props} />\n </TooltipProvider>\n);\n\nconst EnabledCascadePolicyOptionsFieldsOnly = () => <Template isExistingCascadePolicy={false} />;\nEnabledCascadePolicyOptionsFieldsOnly.storyName = 'Enabled Cascade Policy Options';\n\nconst DisabledCascadePolicyOptionsFieldsOnly = () => <Template isExistingCascadePolicy={true} />;\nDisabledCascadePolicyOptionsFieldsOnly.storyName = 'Disabled Cascade Policy Options';\n\nexport { EnabledCascadePolicyOptionsFieldsOnly, DisabledCascadePolicyOptionsFieldsOnly };\n\nexport default {\n title: 'Features/Metadata Instance Editor/CascadePolicy/Visual',\n component: CascadePolicy,\n};\n"],"mappings":";AAAA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAC9B,SAASC,eAAe,QAAQ,oBAAoB;AACpD,OAAOC,aAAa,MAAM,qBAAqB;AAE/C,MAAMC,SAAS,GAAG;EACdC,OAAO,EAAE,IAAI;EACbC,wBAAwB,EAAE,IAAI;EAC9BC,2BAA2B,EAAE,KAAK;EAClCC,kBAAkB,EAAE,IAAI;EACxBC,sBAAsB,EAAE,KAAK;EAC7BC,gBAAgB,EAAE,KAAK;EACvBC,0BAA0B,EAAEA,CAAA,KAAM,CAAC,CAAC;EACpCC,mBAAmB,EAAEA,CAAA,KAAM,CAAC,CAAC;EAC7BC,eAAe,EAAEA,CAAA,KAAM,CAAC,CAAC;EACzBC,wBAAwB,EAAE;AAC9B,CAAC;AAED,MAAMC,QAAQ,GAAGC,KAAK,iBAClBf,KAAA,CAAAgB,aAAA,CAACf,eAAe,qBACZD,KAAA,CAAAgB,aAAA,CAACd,aAAa,EAAAe,QAAA,KAAKd,SAAS,EAAMY,KAAK,CAAG,CAC7B,CACpB;AAED,MAAMG,qCAAqC,GAAGA,CAAA,kBAAMlB,KAAA,CAAAgB,aAAA,CAACF,QAAQ;EAACK,uBAAuB,EAAE;AAAM,CAAE,CAAC;AAChGD,qCAAqC,CAACE,SAAS,GAAG,gCAAgC;AAElF,MAAMC,sCAAsC,GAAGA,CAAA,kBAAMrB,KAAA,CAAAgB,aAAA,CAACF,QAAQ;EAACK,uBAAuB,EAAE;AAAK,CAAE,CAAC;AAChGE,sCAAsC,CAACD,SAAS,GAAG,iCAAiC;AAEpF,SAASF,qCAAqC,EAAEG,sCAAsC;AAEtF,eAAe;EACXC,KAAK,EAAE,wDAAwD;EAC/DC,SAAS,EAAErB;AACf,CAAC","ignoreList":[]}
|
|
@@ -17,6 +17,7 @@ export interface SubHeaderProps {
|
|
|
17
17
|
onGridViewSliderChange?: (newSliderValue: number) => void;
|
|
18
18
|
onItemClick: (id: string | null, triggerNavigationEvent: boolean | null) => void;
|
|
19
19
|
onSortChange: (sortBy: string, sortDirection: string) => void;
|
|
20
|
+
onMetadataSidePanelToggle?: () => void;
|
|
20
21
|
onUpload: () => void;
|
|
21
22
|
onViewModeChange?: (viewMode: ViewMode) => void;
|
|
22
23
|
portalElement?: HTMLElement;
|
|
@@ -27,5 +28,5 @@ export interface SubHeaderProps {
|
|
|
27
28
|
view: View;
|
|
28
29
|
viewMode?: ViewMode;
|
|
29
30
|
}
|
|
30
|
-
declare const SubHeader: ({ canCreateNewFolder, canUpload, currentCollection, gridColumnCount, gridMaxColumns, gridMinColumns, maxGridColumnCountForWidth, onGridViewSliderChange, isSmall, onClearSelectedItemIds, onCreate, onItemClick, onSortChange, onUpload, onViewModeChange, portalElement, rootId, rootName, selectedItemIds, title, view, viewMode, }: SubHeaderProps) => React.JSX.Element;
|
|
31
|
+
declare const SubHeader: ({ canCreateNewFolder, canUpload, currentCollection, gridColumnCount, gridMaxColumns, gridMinColumns, maxGridColumnCountForWidth, onGridViewSliderChange, isSmall, onClearSelectedItemIds, onCreate, onItemClick, onSortChange, onMetadataSidePanelToggle, onUpload, onViewModeChange, portalElement, rootId, rootName, selectedItemIds, title, view, viewMode, }: SubHeaderProps) => React.JSX.Element;
|
|
31
32
|
export default SubHeader;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
+
import type { Selection } from 'react-aria-components';
|
|
2
3
|
import type { ViewMode } from '../flowTypes';
|
|
3
4
|
import type { SortBy, SortDirection, View, Collection } from '../../../common/types/core';
|
|
4
5
|
import './SubHeaderRight.scss';
|
|
@@ -13,11 +14,13 @@ export interface SubHeaderRightProps {
|
|
|
13
14
|
onCreate: () => void;
|
|
14
15
|
onGridViewSliderChange: (newSliderValue: number) => void;
|
|
15
16
|
onSortChange: (sortBy: SortBy, sortDirection: SortDirection) => void;
|
|
17
|
+
onMetadataSidePanelToggle?: () => void;
|
|
16
18
|
onUpload: () => void;
|
|
17
19
|
onViewModeChange?: (viewMode: ViewMode) => void;
|
|
18
20
|
portalElement?: HTMLElement;
|
|
21
|
+
selectedItemIds?: Selection;
|
|
19
22
|
view: View;
|
|
20
23
|
viewMode: ViewMode;
|
|
21
24
|
}
|
|
22
|
-
declare const SubHeaderRight: ({ canCreateNewFolder, canUpload, currentCollection, gridColumnCount, gridMaxColumns, gridMinColumns, maxGridColumnCountForWidth, onCreate, onGridViewSliderChange, onSortChange, onUpload, onViewModeChange, portalElement, view, viewMode, }: SubHeaderRightProps) => React.JSX.Element;
|
|
25
|
+
declare const SubHeaderRight: ({ canCreateNewFolder, canUpload, currentCollection, gridColumnCount, gridMaxColumns, gridMinColumns, maxGridColumnCountForWidth, onCreate, onGridViewSliderChange, onSortChange, onMetadataSidePanelToggle, onUpload, onViewModeChange, portalElement, selectedItemIds, view, viewMode, }: SubHeaderRightProps) => React.JSX.Element;
|
|
23
26
|
export default SubHeaderRight;
|
|
@@ -86,6 +86,7 @@ type State = {
|
|
|
86
86
|
isCreateFolderModalOpen: boolean;
|
|
87
87
|
isDeleteModalOpen: boolean;
|
|
88
88
|
isLoading: boolean;
|
|
89
|
+
isMetadataSidePanelOpen: boolean;
|
|
89
90
|
isPreviewModalOpen: boolean;
|
|
90
91
|
isRenameModalOpen: boolean;
|
|
91
92
|
isShareModalOpen: boolean;
|
|
@@ -546,6 +547,20 @@ declare class ContentExplorer extends Component<ContentExplorerProps, State> {
|
|
|
546
547
|
updateMetadata: (item: BoxItem, field: string, oldValue?: MetadataFieldValue | null, newValue?: MetadataFieldValue | null) => void;
|
|
547
548
|
updateMetadataSuccessCallback: (item: BoxItem, field: string, newValue?: MetadataFieldValue | null) => void;
|
|
548
549
|
clearSelectedItemIds: () => void;
|
|
550
|
+
/**
|
|
551
|
+
* Toggle metadata side panel visibility
|
|
552
|
+
*
|
|
553
|
+
* @private
|
|
554
|
+
* @return {void}
|
|
555
|
+
*/
|
|
556
|
+
onMetadataSidePanelToggle: () => void;
|
|
557
|
+
/**
|
|
558
|
+
* Close metadata side panel
|
|
559
|
+
*
|
|
560
|
+
* @private
|
|
561
|
+
* @return {void}
|
|
562
|
+
*/
|
|
563
|
+
closeMetadataSidePanel: () => void;
|
|
549
564
|
/**
|
|
550
565
|
* Renders the file picker
|
|
551
566
|
*
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { Selection } from 'react-aria-components';
|
|
3
|
+
import type { Collection } from '../../common/types/core';
|
|
4
|
+
import type { MetadataTemplate } from '../../common/types/metadata';
|
|
5
|
+
import './MetadataSidePanel.scss';
|
|
6
|
+
export interface MetadataSidePanelProps {
|
|
7
|
+
currentCollection: Collection;
|
|
8
|
+
onClose: () => void;
|
|
9
|
+
metadataTemplate: MetadataTemplate;
|
|
10
|
+
selectedItemIds: Selection;
|
|
11
|
+
}
|
|
12
|
+
declare const MetadataSidePanel: ({ currentCollection, onClose, selectedItemIds, metadataTemplate, }: MetadataSidePanelProps) => React.JSX.Element;
|
|
13
|
+
export default MetadataSidePanel;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -5,5 +5,6 @@ export declare const metadataView: Story;
|
|
|
5
5
|
export declare const metadataViewV2: Story;
|
|
6
6
|
export declare const metadataViewV2WithCustomActions: Story;
|
|
7
7
|
export declare const metadataViewV2WithInitialFilterValues: Story;
|
|
8
|
+
export declare const sidePanelOpenWithSingleItemSelected: Story;
|
|
8
9
|
declare const meta: Meta<typeof ContentExplorer>;
|
|
9
10
|
export default meta;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { MetadataTemplate } from '@box/metadata-editor';
|
|
2
|
+
import type { Selection } from 'react-aria-components';
|
|
3
|
+
import type { BoxItem, Collection } from '../../common/types/core';
|
|
4
|
+
export declare function useSelectedItemText(currentCollection: Collection, selectedItemIds: Selection): string;
|
|
5
|
+
export declare function getTemplateInstance(metadataTemplate: MetadataTemplate, selectedItems: BoxItem[]): {
|
|
6
|
+
canEdit: boolean;
|
|
7
|
+
displayName: string;
|
|
8
|
+
hidden: boolean;
|
|
9
|
+
id: string;
|
|
10
|
+
fields: {
|
|
11
|
+
displayName: string;
|
|
12
|
+
hidden: boolean;
|
|
13
|
+
id: string;
|
|
14
|
+
key: string;
|
|
15
|
+
options: import("@box/metadata-editor").MetadataTemplateFieldOption[];
|
|
16
|
+
type: import("@box/metadata-editor").MetadataTemplateFieldType;
|
|
17
|
+
value: any;
|
|
18
|
+
}[];
|
|
19
|
+
scope: string;
|
|
20
|
+
templateKey: string;
|
|
21
|
+
type: string;
|
|
22
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "box-ui-elements",
|
|
3
|
-
"version": "23.5.0-beta.
|
|
3
|
+
"version": "23.5.0-beta.4",
|
|
4
4
|
"description": "Box UI Elements",
|
|
5
5
|
"author": "Box (https://www.box.com/)",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE",
|
|
@@ -130,7 +130,7 @@
|
|
|
130
130
|
"@babel/types": "^7.24.7",
|
|
131
131
|
"@box/blueprint-web": "12.43.0",
|
|
132
132
|
"@box/blueprint-web-assets": "4.61.5",
|
|
133
|
-
"@box/box-ai-agent-selector": "^0.
|
|
133
|
+
"@box/box-ai-agent-selector": "^0.53.0",
|
|
134
134
|
"@box/box-ai-content-answers": "^0.124.1",
|
|
135
135
|
"@box/box-item-type-selector": "^0.63.12",
|
|
136
136
|
"@box/cldr-data": "^34.2.0",
|
|
@@ -299,7 +299,7 @@
|
|
|
299
299
|
"peerDependencies": {
|
|
300
300
|
"@box/blueprint-web": "12.43.0",
|
|
301
301
|
"@box/blueprint-web-assets": "4.61.5",
|
|
302
|
-
"@box/box-ai-agent-selector": "^0.
|
|
302
|
+
"@box/box-ai-agent-selector": "^0.53.0",
|
|
303
303
|
"@box/box-ai-content-answers": "^0.124.1",
|
|
304
304
|
"@box/box-item-type-selector": "^0.63.12",
|
|
305
305
|
"@box/cldr-data": ">=34.2.0",
|
|
@@ -28,6 +28,7 @@ export interface SubHeaderProps {
|
|
|
28
28
|
onGridViewSliderChange?: (newSliderValue: number) => void;
|
|
29
29
|
onItemClick: (id: string | null, triggerNavigationEvent: boolean | null) => void;
|
|
30
30
|
onSortChange: (sortBy: string, sortDirection: string) => void;
|
|
31
|
+
onMetadataSidePanelToggle?: () => void;
|
|
31
32
|
onUpload: () => void;
|
|
32
33
|
onViewModeChange?: (viewMode: ViewMode) => void;
|
|
33
34
|
portalElement?: HTMLElement;
|
|
@@ -53,6 +54,7 @@ const SubHeader = ({
|
|
|
53
54
|
onCreate,
|
|
54
55
|
onItemClick,
|
|
55
56
|
onSortChange,
|
|
57
|
+
onMetadataSidePanelToggle,
|
|
56
58
|
onUpload,
|
|
57
59
|
onViewModeChange,
|
|
58
60
|
portalElement,
|
|
@@ -109,9 +111,11 @@ const SubHeader = ({
|
|
|
109
111
|
onCreate={onCreate}
|
|
110
112
|
onGridViewSliderChange={onGridViewSliderChange}
|
|
111
113
|
onSortChange={onSortChange}
|
|
114
|
+
onMetadataSidePanelToggle={onMetadataSidePanelToggle}
|
|
112
115
|
onUpload={onUpload}
|
|
113
116
|
onViewModeChange={onViewModeChange}
|
|
114
117
|
portalElement={portalElement}
|
|
118
|
+
selectedItemIds={selectedItemIds}
|
|
115
119
|
view={view}
|
|
116
120
|
viewMode={viewMode}
|
|
117
121
|
/>
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as React from 'react';
|
|
2
2
|
import { useIntl } from 'react-intl';
|
|
3
3
|
import { XMark } from '@box/blueprint-web-assets/icons/Fill/index';
|
|
4
4
|
import { IconButton, PageHeader, Text } from '@box/blueprint-web';
|
|
5
5
|
import type { Selection } from 'react-aria-components';
|
|
6
|
+
import { useSelectedItemText } from '../../content-explorer/utils';
|
|
6
7
|
import type { Collection } from '../../../common/types/core';
|
|
7
8
|
import messages from '../messages';
|
|
8
9
|
|
|
@@ -20,27 +21,7 @@ const SubHeaderLeftV2 = (props: SubHeaderLeftV2Props) => {
|
|
|
20
21
|
const { currentCollection, onClearSelectedItemIds, rootName, selectedItemIds, title } = props;
|
|
21
22
|
const { formatMessage } = useIntl();
|
|
22
23
|
|
|
23
|
-
|
|
24
|
-
const selectedItemText: string = useMemo(() => {
|
|
25
|
-
const selectedCount = selectedItemIds === 'all' ? currentCollection.items.length : selectedItemIds.size;
|
|
26
|
-
|
|
27
|
-
if (selectedCount === 0) {
|
|
28
|
-
return '';
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// Case 1: Single selected item - show item name
|
|
32
|
-
if (selectedCount === 1) {
|
|
33
|
-
const selectedKey =
|
|
34
|
-
selectedItemIds === 'all' ? currentCollection.items[0].id : selectedItemIds.values().next().value;
|
|
35
|
-
const selectedItem = currentCollection.items.find(item => item.id === selectedKey);
|
|
36
|
-
return selectedItem?.name ?? '';
|
|
37
|
-
}
|
|
38
|
-
// Case 2: Multiple selected items - show count
|
|
39
|
-
if (selectedCount > 1) {
|
|
40
|
-
return formatMessage(messages.numFilesSelected, { numSelected: selectedCount });
|
|
41
|
-
}
|
|
42
|
-
return '';
|
|
43
|
-
}, [currentCollection.items, formatMessage, selectedItemIds]);
|
|
24
|
+
const selectedItemText = useSelectedItemText(currentCollection, selectedItemIds);
|
|
44
25
|
|
|
45
26
|
// Case 1 and 2: selected item text with X button
|
|
46
27
|
if (selectedItemText) {
|