@contentful/field-editor-shared 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/cjs/CharCounter.js +75 -0
  2. package/dist/cjs/CharValidation.js +60 -0
  3. package/dist/cjs/FieldConnector.js +167 -0
  4. package/dist/cjs/FieldConnector.test.js +81 -0
  5. package/dist/cjs/ModalDialogLauncher.js +132 -0
  6. package/dist/cjs/PredefinedValuesError.js +57 -0
  7. package/dist/cjs/index.js +155 -0
  8. package/dist/cjs/types.js +4 -0
  9. package/dist/cjs/typesEntity.js +31 -0
  10. package/dist/cjs/utils/constraints.js +63 -0
  11. package/dist/cjs/utils/entityHelpers.js +214 -0
  12. package/dist/cjs/utils/isValidImage.js +26 -0
  13. package/dist/cjs/utils/shortenStorageUnit.js +55 -0
  14. package/dist/esm/CharCounter.js +21 -0
  15. package/dist/esm/CharValidation.js +11 -0
  16. package/dist/esm/FieldConnector.js +113 -0
  17. package/dist/esm/FieldConnector.test.js +33 -0
  18. package/dist/esm/ModalDialogLauncher.js +67 -0
  19. package/dist/esm/PredefinedValuesError.js +8 -0
  20. package/dist/esm/index.js +14 -0
  21. package/dist/esm/types.js +1 -0
  22. package/dist/esm/typesEntity.js +1 -0
  23. package/dist/esm/utils/constraints.js +40 -0
  24. package/dist/esm/utils/entityHelpers.js +170 -0
  25. package/dist/esm/utils/isValidImage.js +16 -0
  26. package/dist/esm/utils/shortenStorageUnit.js +37 -0
  27. package/dist/types/CharCounter.d.ts +7 -0
  28. package/dist/{CharValidation.d.ts → types/CharValidation.d.ts} +7 -7
  29. package/dist/{FieldConnector.d.ts → types/FieldConnector.d.ts} +47 -48
  30. package/dist/types/FieldConnector.test.d.ts +1 -0
  31. package/dist/{ModalDialogLauncher.d.ts → types/ModalDialogLauncher.d.ts} +13 -13
  32. package/dist/types/PredefinedValuesError.d.ts +2 -0
  33. package/dist/{index.d.ts → types/index.d.ts} +15 -15
  34. package/dist/{types.d.ts → types/types.d.ts} +11 -11
  35. package/dist/{typesEntity.d.ts → types/typesEntity.d.ts} +9 -9
  36. package/dist/{utils → types/utils}/constraints.d.ts +3 -3
  37. package/dist/{utils → types/utils}/entityHelpers.d.ts +68 -68
  38. package/dist/{utils → types/utils}/isValidImage.d.ts +5 -5
  39. package/dist/{utils → types/utils}/shortenStorageUnit.d.ts +17 -17
  40. package/package.json +26 -11
  41. package/CHANGELOG.md +0 -196
  42. package/dist/CharCounter.d.ts +0 -7
  43. package/dist/PredefinedValuesError.d.ts +0 -2
  44. package/dist/field-editor-shared.cjs.development.js +0 -634
  45. package/dist/field-editor-shared.cjs.development.js.map +0 -1
  46. package/dist/field-editor-shared.cjs.production.min.js +0 -2
  47. package/dist/field-editor-shared.cjs.production.min.js.map +0 -1
  48. package/dist/field-editor-shared.esm.js +0 -619
  49. package/dist/field-editor-shared.esm.js.map +0 -1
  50. package/dist/index.js +0 -8
@@ -1 +0,0 @@
1
- {"version":3,"file":"field-editor-shared.cjs.development.js","sources":["../src/FieldConnector.ts","../src/PredefinedValuesError.tsx","../src/CharCounter.tsx","../src/CharValidation.tsx","../src/ModalDialogLauncher.tsx","../src/utils/entityHelpers.ts","../src/utils/constraints.ts","../src/utils/isValidImage.ts","../src/utils/shortenStorageUnit.ts"],"sourcesContent":["import React from 'react';\n\nimport { FieldAPI, ValidationError } from '@contentful/app-sdk';\nimport isEqual from 'lodash/isEqual';\nimport throttle from 'lodash/throttle';\n\ntype Nullable = null | undefined;\n\nexport interface FieldConnectorChildProps<ValueType> {\n isLocalValueChange: boolean;\n externalReset: number;\n lastRemoteValue: ValueType | Nullable;\n value: ValueType | Nullable;\n disabled: boolean;\n errors: ValidationError[];\n setValue: (value: ValueType | Nullable) => Promise<unknown>;\n}\n\ninterface FieldConnectorState<ValueType> {\n isLocalValueChange: boolean;\n externalReset: number;\n lastRemoteValue: ValueType | Nullable;\n value: ValueType | Nullable;\n disabled: boolean;\n errors: ValidationError[];\n}\n\ninterface FieldConnectorProps<ValueType> {\n field: FieldAPI;\n isInitiallyDisabled: boolean;\n isDisabled?: boolean;\n children: (state: FieldConnectorChildProps<ValueType>) => React.ReactNode;\n isEmptyValue: (value: ValueType | null) => boolean;\n isEqualValues: (value1: ValueType | Nullable, value2: ValueType | Nullable) => boolean;\n throttle: number;\n}\n\nexport class FieldConnector<ValueType> extends React.Component<\n FieldConnectorProps<ValueType>,\n FieldConnectorState<ValueType>\n> {\n static defaultProps = {\n children: () => {\n return null;\n },\n // eslint-disable-next-line -- TODO: describe this disable\n isEmptyValue: (value: any | Nullable) => {\n return value === null || value === '';\n },\n // eslint-disable-next-line -- TODO: describe this disable\n isEqualValues: (value1: any | Nullable, value2: any | Nullable) => {\n return isEqual(value1, value2);\n },\n throttle: 300,\n };\n\n constructor(props: FieldConnectorProps<ValueType>) {\n super(props);\n const initialValue = props.field.getValue();\n this.state = {\n isLocalValueChange: false,\n externalReset: 0,\n value: initialValue,\n lastRemoteValue: initialValue,\n disabled: props.isInitiallyDisabled ?? false,\n errors: [],\n };\n }\n\n unsubscribeErrors: Function | null = null;\n unsubscribeDisabled: Function | null = null;\n unsubscribeValue: Function | null = null;\n\n setValue = async (value: ValueType | Nullable) => {\n if (this.props.isEmptyValue(value ?? null)) {\n this.setState({ value: undefined });\n } else {\n this.setState({ value });\n }\n\n await this.triggerSetValueCallbacks(value);\n };\n\n triggerSetValueCallbacks = throttle(\n (value: ValueType | Nullable) => {\n return new Promise((resolve, reject) => {\n if (this.props.isEmptyValue(value ?? null)) {\n this.props.field.removeValue().then(resolve).catch(reject);\n } else {\n this.props.field.setValue(value).then(resolve).catch(reject);\n }\n });\n },\n this.props.throttle,\n {\n leading: this.props.throttle === 0,\n }\n );\n\n componentDidMount() {\n const { field } = this.props;\n this.unsubscribeErrors = field.onSchemaErrorsChanged((errors: ValidationError[]) => {\n this.setState({\n errors: errors || [],\n });\n });\n this.unsubscribeDisabled = field.onIsDisabledChanged((disabled: boolean) => {\n this.setState({\n disabled,\n });\n });\n this.unsubscribeValue = field.onValueChanged((value: ValueType | Nullable) => {\n this.setState((currentState) => {\n const isLocalValueChange = this.props.isEqualValues(value, currentState.value);\n const lastRemoteValue = isLocalValueChange ? currentState.lastRemoteValue : value;\n const externalReset = currentState.externalReset + (isLocalValueChange ? 0 : 1);\n return {\n value,\n lastRemoteValue,\n isLocalValueChange,\n externalReset,\n };\n });\n });\n }\n\n componentWillUnmount() {\n if (typeof this.unsubscribeErrors === 'function') {\n this.unsubscribeErrors();\n }\n if (typeof this.unsubscribeDisabled === 'function') {\n this.unsubscribeDisabled();\n }\n if (typeof this.unsubscribeValue === 'function') {\n this.unsubscribeValue();\n }\n }\n\n render() {\n return this.props.children({\n ...this.state,\n setValue: this.setValue,\n disabled: this.props.isDisabled || this.state.disabled,\n });\n }\n}\n","import React from 'react';\n\nimport { Note } from '@contentful/f36-note';\n\nexport function PredefinedValuesError() {\n return (\n <Note variant=\"warning\" testId=\"predefined-values-warning\">\n The widget failed to initialize. You can fix the problem by providing predefined values under\n the validations tab in the field settings.\n </Note>\n );\n}\n","import React from 'react';\n\nimport tokens from '@contentful/f36-tokens';\nimport { css, cx } from 'emotion';\n\ninterface CharCounterProps {\n value?: string;\n checkConstraint: (n: number) => boolean;\n}\n\nconst styles = {\n invalid: css({\n color: tokens.red600,\n }),\n};\n\nexport function CharCounter(props: CharCounterProps) {\n let count = 0;\n if (props.value) {\n count = props.value.length;\n }\n const valid = count === 0 || props.checkConstraint(count);\n return (\n <span\n data-status-code={valid ? null : 'invalid-size'}\n className={cx({\n [styles.invalid]: !valid,\n })}>\n {count} characters\n </span>\n );\n}\n","import React from 'react';\n\nimport { ValidationType } from './types';\n\ninterface CharValidationProps {\n constraints: ValidationType;\n}\n\nexport function CharValidation(props: CharValidationProps) {\n const { constraints } = props;\n\n if (constraints.type === 'max') {\n return <span>Maximum {constraints.max} characters</span>;\n } else if (constraints.type === 'min') {\n return <span>Requires at least {constraints.min} characters</span>;\n } else {\n return (\n <span>\n Requires between {constraints.min} and {constraints.max} characters\n </span>\n );\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-use-before-define */\n\nimport React from 'react';\nimport ReactDOM from 'react-dom';\n\nimport { OpenCustomWidgetOptions } from '@contentful/app-sdk';\nimport { Modal, ModalHeader } from '@contentful/f36-components';\nimport isNumber from 'lodash/isNumber';\n\nexport function open(componentRenderer: (params: { onClose: Function; isShown: boolean }) => any) {\n let rootDom: any = null;\n\n const getRoot = () => {\n if (rootDom === null) {\n rootDom = document.createElement('div');\n rootDom.setAttribute('id', 'field-editor-modal-root');\n document.body.appendChild(rootDom);\n }\n return rootDom;\n };\n\n return new Promise((resolve) => {\n let currentConfig = { onClose, isShown: true };\n\n function render({ onClose, isShown }: { onClose: Function; isShown: boolean }) {\n ReactDOM.render(componentRenderer({ onClose, isShown }), getRoot());\n }\n\n function onClose(...args: any[]) {\n currentConfig = {\n ...currentConfig,\n isShown: false,\n };\n render(currentConfig);\n // eslint-disable-next-line -- TODO: describe this disable @typescript-eslint/ban-ts-comment\n // @ts-ignore\n resolve(...args);\n getRoot().remove();\n }\n\n render(currentConfig);\n });\n}\n\nexport function openDialog<T>(\n options: OpenCustomWidgetOptions,\n Component: React.SFC<{ onClose: (result: T) => void }>\n) {\n const key = Date.now();\n const size = isNumber(options.width) ? `${options.width}px` : options.width;\n return open(({ isShown, onClose }) => {\n const onCloseHandler = () => onClose();\n return (\n <Modal\n key={key}\n shouldCloseOnOverlayClick={options.shouldCloseOnOverlayClick || false}\n shouldCloseOnEscapePress={options.shouldCloseOnEscapePress || false}\n allowHeightOverflow={options.allowHeightOverflow || false}\n position={options.position || 'center'}\n isShown={isShown}\n onClose={onCloseHandler}\n size={size || '700px'}>\n {() => (\n <>\n {options.title && (\n <ModalHeader testId=\"dialog-title\" title={options.title} onClose={onCloseHandler} />\n )}\n <div style={{ minHeight: options.minHeight || 'auto' }}>\n <Component onClose={onClose as any} />\n </div>\n </>\n )}\n </Modal>\n );\n });\n}\n\nexport default {\n openDialog,\n};\n","import get from 'lodash/get';\nimport isObject from 'lodash/isObject';\nimport isString from 'lodash/isString';\n\nimport { Asset, ContentType, ContentTypeField, Entry, File } from '../typesEntity';\n\nfunction titleOrDefault(title: string | undefined, defaultTitle: string): string {\n if (!isString(title)) {\n return defaultTitle;\n }\n if (title) {\n const trimmedTitle = title.trim();\n if (trimmedTitle.length === 0) {\n return defaultTitle;\n }\n return trimmedTitle;\n }\n return defaultTitle;\n}\n\nexport function getFieldValue({\n /**\n * Expects an entity fetched with a flag Skip-Transformation: true\n */\n entity,\n fieldId,\n localeCode,\n defaultLocaleCode,\n}: {\n entity: {\n fields: { [key: string]: { [valueKey: string]: string | undefined } };\n };\n fieldId: string;\n localeCode: string;\n defaultLocaleCode: string;\n}): string | undefined {\n const values = get(entity, ['fields', fieldId]);\n if (!isObject(values)) {\n return;\n }\n\n const firstLocaleCode = Object.keys(values)[0];\n\n return values[localeCode] || values[defaultLocaleCode] || values[firstLocaleCode];\n}\n\nexport function getAssetTitle({\n asset,\n localeCode,\n defaultLocaleCode,\n defaultTitle,\n}: {\n asset: Asset;\n localeCode: string;\n defaultLocaleCode: string;\n defaultTitle: string;\n}) {\n const title = getFieldValue({\n entity: { fields: { title: asset.fields?.title } },\n fieldId: 'title',\n localeCode,\n defaultLocaleCode,\n });\n return titleOrDefault(title, defaultTitle);\n}\n\n/**\n * Returns true if field is an Asset\n *\n * @param field\n * @returns {boolean}\n */\nexport const isAssetField = (field: ContentTypeField): boolean =>\n field.type === 'Link' && field.linkType === 'Asset';\n\n/**\n * Returns true if field is a Title\n */\nexport function isDisplayField({\n field,\n contentType,\n}: {\n field: ContentTypeField;\n contentType: ContentType;\n}): boolean {\n return field.id === contentType.displayField;\n}\n\n/**\n * Returns true if field is a short Description\n */\nexport function isDescriptionField({\n field,\n contentType,\n}: {\n field: ContentTypeField;\n contentType: ContentType;\n}) {\n const isTextField = (field: ContentTypeField) => ['Symbol', 'Text'].includes(field.type);\n const isMaybeSlugField = (field: ContentTypeField) => /\\bslug\\b/.test(field.name);\n return isTextField(field) && !isDisplayField({ field, contentType }) && !isMaybeSlugField(field);\n}\n\nexport function getEntityDescription({\n entity,\n contentType,\n localeCode,\n defaultLocaleCode,\n}: {\n entity: Entry;\n contentType?: ContentType;\n localeCode: string;\n defaultLocaleCode: string;\n}): string {\n if (!contentType) {\n return '';\n }\n\n const descriptionField = contentType.fields.find((field) =>\n isDescriptionField({ field, contentType })\n );\n\n if (!descriptionField) {\n return '';\n }\n\n return (\n getFieldValue({ entity, fieldId: descriptionField.id, localeCode, defaultLocaleCode }) || ''\n );\n}\n\nexport function getEntryTitle({\n entry,\n contentType,\n localeCode,\n defaultLocaleCode,\n defaultTitle,\n}: {\n entry: Entry;\n contentType?: ContentType;\n localeCode: string;\n defaultLocaleCode: string;\n defaultTitle: string;\n}) {\n let title;\n\n if (!contentType) {\n return defaultTitle;\n }\n\n const displayField = contentType.displayField;\n if (!displayField) {\n return defaultTitle;\n }\n\n const displayFieldInfo = contentType.fields.find((field) => field.id === displayField);\n\n if (!displayFieldInfo) {\n return defaultTitle;\n }\n\n // when localization for a field is \"turned off\",\n // we don't clean up the \"old\" localized data, so it is still in the response.\n // Therefore, we're checking if displayField is localizable.\n if (displayFieldInfo.localized) {\n title = getFieldValue({\n entity: entry,\n fieldId: displayField,\n localeCode,\n defaultLocaleCode,\n });\n if (!title) {\n // Older content types may return id/apiName, but some entry lookup paths do not fetch raw data\n // In order to still return a title in this case, look for displayField as apiName in content type,\n // ...but still look for displayField as a field in the entry\n title = getFieldValue({\n entity: entry,\n fieldId: displayFieldInfo.id,\n localeCode,\n defaultLocaleCode,\n });\n }\n } else {\n title = getFieldValue({\n entity: entry,\n fieldId: displayField,\n defaultLocaleCode,\n localeCode: '',\n });\n if (!title) {\n title = getFieldValue({\n entity: entry,\n fieldId: displayFieldInfo.id,\n defaultLocaleCode,\n localeCode: '',\n });\n }\n }\n\n return titleOrDefault(title, defaultTitle);\n}\n\nexport function getEntryStatus(sys: Entry['sys']) {\n if (!sys || (sys.type !== 'Entry' && sys.type !== 'Asset')) {\n throw new TypeError('Invalid entity metadata object');\n }\n if (sys.deletedVersion) {\n return 'deleted';\n } else if (sys.archivedVersion) {\n return 'archived';\n } else if (sys.publishedVersion) {\n if (sys.version > sys.publishedVersion + 1) {\n return 'changed';\n } else {\n return 'published';\n }\n } else {\n return 'draft';\n }\n}\n\n/**\n * Gets a promise resolving with a localized asset image field representing a\n * given entities file. The promise may resolve with null.\n */\nexport const getEntryImage = async (\n {\n entry,\n contentType,\n localeCode,\n }: {\n entry: Entry;\n contentType?: ContentType;\n localeCode: string;\n defaultLocaleCode: string;\n },\n getAsset: (assetId: string) => Promise<unknown>\n): Promise<null | File> => {\n if (!contentType) {\n return null;\n }\n\n const assetLink = contentType.fields.find(isAssetField);\n\n if (!assetLink) {\n return null;\n }\n\n const assetId = get(entry.fields, [assetLink.id, localeCode, 'sys', 'id']);\n\n if (!assetId) {\n return null;\n }\n\n try {\n const asset = await getAsset(assetId);\n const file = get(asset, ['fields', 'file', localeCode]);\n const isImage = Boolean(get(file, ['details', 'image'], false));\n return isImage ? file : null;\n } catch (e) {\n return null;\n }\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/**\n * This module parses field validations as a constraint and checks\n * values against that constraint.\n */\n\nimport isNumber from 'lodash/isNumber';\n\nimport { ValidationType } from '../types';\n\nexport function fromFieldValidations(\n validations: Record<string, any>[] = [],\n fieldType: 'Symbol' | 'Text'\n): ValidationType {\n const sizeValidation = validations.find((v) => 'size' in v);\n const size = (sizeValidation && sizeValidation.size) || {};\n const min = size.min;\n const max = size.max;\n\n if (isNumber(min) && isNumber(max)) {\n return {\n type: 'min-max',\n min,\n max,\n };\n } else if (isNumber(min)) {\n return {\n type: 'min',\n min,\n };\n } else if (isNumber(max)) {\n return {\n type: 'max',\n max,\n };\n } else {\n return {\n type: 'max',\n max: fieldType === 'Symbol' ? 256 : 50000,\n };\n }\n}\n\nexport function makeChecker(constraint: ValidationType) {\n return function checkConstraint(length: number) {\n if (constraint.type === 'max') {\n return length <= constraint.max;\n } else if (constraint.type === 'min') {\n return length >= constraint.min;\n } else {\n return length >= constraint.min && length <= constraint.max;\n }\n };\n}\n","import { File } from '../typesEntity';\n\n/**\n * Checks whether the passed content type matches one of our valid MIME types\n */\nexport function isValidImage(file: File) {\n const validMimeTypes = [\n 'image/avif',\n 'image/bmp',\n 'image/x-windows-bmp',\n 'image/gif',\n 'image/webp',\n // This is not a valid MIME type but we supported it in the past.\n 'image/jpg',\n 'image/jpeg',\n 'image/pjpeg',\n 'image/x-jps',\n 'image/png',\n 'image/svg+xml',\n ];\n\n return validMimeTypes.includes(file.contentType);\n}\n","/**\n * Transforms a number into a localized string (en-US)\n * toLocaleString(1000); // \"1,000\"\n * @param {Number} number\n */\nexport function toLocaleString(number: number) {\n return number.toLocaleString('en-US');\n}\n\nfunction formatFloat(value: number, localize: boolean) {\n return localize\n ? toLocaleString(value)\n : value\n .toFixed(2)\n // remove floating point if not necessary\n .replace(/\\.(0)*$|0*$/, '');\n}\n\ntype UnitOfMeasure = 'PB' | 'TB' | 'GB' | 'MB' | 'KB' | 'B';\n\n/**\n * Make a storage unit number more readable by making them smaller\n * shortenStorageUnit(1000, 'GB'); // \"1 TB\"\n * shortenStorageUnit(0.001, 'TB'); // \"1 GB\"\n * @param value\n * @param uom Unit of measure\n * @returns\n */\nexport function shortenStorageUnit(value: number, uom: UnitOfMeasure) {\n if (value <= 0) {\n return '0 B';\n }\n\n const units: UnitOfMeasure[] = ['PB', 'TB', 'GB', 'MB', 'KB', 'B'];\n\n const getBigger = (unit: UnitOfMeasure): UnitOfMeasure => units[units.indexOf(unit) - 1];\n const getSmaller = (unit: UnitOfMeasure) => units[units.indexOf(unit) + 1];\n const isBiggestUnit = (unit: UnitOfMeasure) => units.indexOf(unit) === 0;\n const isSmallestUnit = (unit: UnitOfMeasure) => units.indexOf(unit) === units.length - 1;\n\n const reduce = (number: number, unit: UnitOfMeasure): { number: number; unit: UnitOfMeasure } => {\n if (number < 0.99 && !isSmallestUnit(unit)) {\n return reduce(number * 1000, getSmaller(unit));\n } else if (number >= 1000 && !isBiggestUnit(unit)) {\n return reduce(number / 1000, getBigger(unit));\n } else {\n return { number, unit };\n }\n };\n\n const { number, unit } = reduce(value, uom);\n\n return `${formatFloat(number, false)} ${unit}`;\n}\n"],"names":["FieldConnector","React","Component","constructor","props","unsubscribeErrors","unsubscribeDisabled","unsubscribeValue","setValue","value","isEmptyValue","setState","undefined","triggerSetValueCallbacks","throttle","Promise","resolve","reject","field","removeValue","then","catch","leading","initialValue","getValue","state","isLocalValueChange","externalReset","lastRemoteValue","disabled","isInitiallyDisabled","errors","componentDidMount","onSchemaErrorsChanged","onIsDisabledChanged","onValueChanged","currentState","isEqualValues","componentWillUnmount","render","children","isDisabled","defaultProps","value1","value2","isEqual","PredefinedValuesError","Note","variant","testId","styles","invalid","css","color","tokens","red600","CharCounter","count","length","valid","checkConstraint","className","cx","CharValidation","constraints","type","max","min","open","componentRenderer","rootDom","getRoot","document","createElement","setAttribute","body","appendChild","currentConfig","onClose","isShown","ReactDOM","args","remove","openDialog","options","key","Date","now","size","isNumber","width","onCloseHandler","Modal","shouldCloseOnOverlayClick","shouldCloseOnEscapePress","allowHeightOverflow","position","title","ModalHeader","style","minHeight","titleOrDefault","defaultTitle","isString","trimmedTitle","trim","getFieldValue","entity","fieldId","localeCode","defaultLocaleCode","values","get","isObject","firstLocaleCode","Object","keys","getAssetTitle","asset","fields","isAssetField","linkType","isDisplayField","contentType","id","displayField","isDescriptionField","isTextField","includes","isMaybeSlugField","test","name","getEntityDescription","descriptionField","find","getEntryTitle","entry","displayFieldInfo","localized","getEntryStatus","sys","TypeError","deletedVersion","archivedVersion","publishedVersion","version","getEntryImage","getAsset","assetLink","assetId","file","isImage","Boolean","e","fromFieldValidations","validations","fieldType","sizeValidation","v","makeChecker","constraint","isValidImage","validMimeTypes","toLocaleString","number","formatFloat","localize","toFixed","replace","shortenStorageUnit","uom","units","getBigger","unit","indexOf","getSmaller","isBiggestUnit","isSmallestUnit","reduce"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- "use strict";function e(e){return e&&"object"==typeof e&&"default"in e?e.default:e}Object.defineProperty(exports,"__esModule",{value:!0});var t=e(require("react")),n=e(require("lodash/isEqual")),i=e(require("lodash/throttle")),l=require("@contentful/f36-note"),s=e(require("@contentful/f36-tokens")),o=require("emotion"),r=e(require("react-dom")),a=require("@contentful/f36-components"),u=e(require("lodash/isNumber")),d=e(require("lodash/get")),c=e(require("lodash/isObject")),f=e(require("lodash/isString"));class p extends t.Component{constructor(e){super(e),this.unsubscribeErrors=null,this.unsubscribeDisabled=null,this.unsubscribeValue=null,this.setValue=async e=>{this.props.isEmptyValue(e??null)?this.setState({value:void 0}):this.setState({value:e}),await this.triggerSetValueCallbacks(e)},this.triggerSetValueCallbacks=i(e=>new Promise((t,n)=>{this.props.isEmptyValue(e??null)?this.props.field.removeValue().then(t).catch(n):this.props.field.setValue(e).then(t).catch(n)}),this.props.throttle,{leading:0===this.props.throttle});const t=e.field.getValue();this.state={isLocalValueChange:!1,externalReset:0,value:t,lastRemoteValue:t,disabled:e.isInitiallyDisabled??!1,errors:[]}}componentDidMount(){const{field:e}=this.props;this.unsubscribeErrors=e.onSchemaErrorsChanged(e=>{this.setState({errors:e||[]})}),this.unsubscribeDisabled=e.onIsDisabledChanged(e=>{this.setState({disabled:e})}),this.unsubscribeValue=e.onValueChanged(e=>{this.setState(t=>{const n=this.props.isEqualValues(e,t.value);return{value:e,lastRemoteValue:n?t.lastRemoteValue:e,isLocalValueChange:n,externalReset:t.externalReset+(n?0:1)}})})}componentWillUnmount(){"function"==typeof this.unsubscribeErrors&&this.unsubscribeErrors(),"function"==typeof this.unsubscribeDisabled&&this.unsubscribeDisabled(),"function"==typeof this.unsubscribeValue&&this.unsubscribeValue()}render(){return this.props.children({...this.state,setValue:this.setValue,disabled:this.props.isDisabled||this.state.disabled})}}p.defaultProps={children:()=>null,isEmptyValue:e=>null===e||""===e,isEqualValues:(e,t)=>n(e,t),throttle:300};const h=o.css({color:s.red600});function m(e){let t=null;const n=()=>(null===t&&(t=document.createElement("div"),t.setAttribute("id","field-editor-modal-root"),document.body.appendChild(t)),t);return new Promise(t=>{let i={onClose:function(...e){i={...i,isShown:!1},l(i),t(...e),n().remove()},isShown:!0};function l({onClose:t,isShown:i}){r.render(e({onClose:t,isShown:i}),n())}l(i)})}function y(e,n){const i=Date.now(),l=u(e.width)?e.width+"px":e.width;return m(({isShown:s,onClose:o})=>{const r=()=>o();return t.createElement(a.Modal,{key:i,shouldCloseOnOverlayClick:e.shouldCloseOnOverlayClick||!1,shouldCloseOnEscapePress:e.shouldCloseOnEscapePress||!1,allowHeightOverflow:e.allowHeightOverflow||!1,position:e.position||"center",isShown:s,onClose:r,size:l||"700px"},()=>t.createElement(t.Fragment,null,e.title&&t.createElement(a.ModalHeader,{testId:"dialog-title",title:e.title,onClose:r}),t.createElement("div",{style:{minHeight:e.minHeight||"auto"}},t.createElement(n,{onClose:o}))))})}var b={__proto__:null,open:m,openDialog:y,default:{openDialog:y}};function g(e,t){if(!f(e))return t;if(e){const n=e.trim();return 0===n.length?t:n}return t}function C({entity:e,fieldId:t,localeCode:n,defaultLocaleCode:i}){const l=d(e,["fields",t]);if(!c(l))return;const s=Object.keys(l)[0];return l[n]||l[i]||l[s]}const x=e=>"Link"===e.type&&"Asset"===e.linkType;function v({field:e,contentType:t}){return e.id===t.displayField}function V({field:e,contentType:t}){return(e=>["Symbol","Text"].includes(e.type))(e)&&!v({field:e,contentType:t})&&!(e=>/\bslug\b/.test(e.name))(e)}var E={__proto__:null,getFieldValue:C,getAssetTitle:function({asset:e,localeCode:t,defaultLocaleCode:n,defaultTitle:i}){var l;return g(C({entity:{fields:{title:null==(l=e.fields)?void 0:l.title}},fieldId:"title",localeCode:t,defaultLocaleCode:n}),i)},isAssetField:x,isDisplayField:v,isDescriptionField:V,getEntityDescription:function({entity:e,contentType:t,localeCode:n,defaultLocaleCode:i}){if(!t)return"";const l=t.fields.find(e=>V({field:e,contentType:t}));return l&&C({entity:e,fieldId:l.id,localeCode:n,defaultLocaleCode:i})||""},getEntryTitle:function({entry:e,contentType:t,localeCode:n,defaultLocaleCode:i,defaultTitle:l}){let s;if(!t)return l;const o=t.displayField;if(!o)return l;const r=t.fields.find(e=>e.id===o);return r?(r.localized?(s=C({entity:e,fieldId:o,localeCode:n,defaultLocaleCode:i}),s||(s=C({entity:e,fieldId:r.id,localeCode:n,defaultLocaleCode:i}))):(s=C({entity:e,fieldId:o,defaultLocaleCode:i,localeCode:""}),s||(s=C({entity:e,fieldId:r.id,defaultLocaleCode:i,localeCode:""}))),g(s,l)):l},getEntryStatus:function(e){if(!e||"Entry"!==e.type&&"Asset"!==e.type)throw new TypeError("Invalid entity metadata object");return e.deletedVersion?"deleted":e.archivedVersion?"archived":e.publishedVersion?e.version>e.publishedVersion+1?"changed":"published":"draft"},getEntryImage:async({entry:e,contentType:t,localeCode:n},i)=>{if(!t)return null;const l=t.fields.find(x);if(!l)return null;const s=d(e.fields,[l.id,n,"sys","id"]);if(!s)return null;try{const e=await i(s),t=d(e,["fields","file",n]);return Boolean(d(t,["details","image"],!1))?t:null}catch(e){return null}}},w={__proto__:null,fromFieldValidations:function(e=[],t){const n=e.find(e=>"size"in e),i=n&&n.size||{},l=i.min,s=i.max;return u(l)&&u(s)?{type:"min-max",min:l,max:s}:u(l)?{type:"min",min:l}:u(s)?{type:"max",max:s}:{type:"max",max:"Symbol"===t?256:5e4}},makeChecker:function(e){return function(t){return"max"===e.type?t<=e.max:"min"===e.type?t>=e.min:t>=e.min&&t<=e.max}}};exports.CharCounter=function(e){let n=0;e.value&&(n=e.value.length);const i=0===n||e.checkConstraint(n);return t.createElement("span",{"data-status-code":i?null:"invalid-size",className:o.cx({[h]:!i})},n," characters")},exports.CharValidation=function(e){const{constraints:n}=e;return"max"===n.type?t.createElement("span",null,"Maximum ",n.max," characters"):"min"===n.type?t.createElement("span",null,"Requires at least ",n.min," characters"):t.createElement("span",null,"Requires between ",n.min," and ",n.max," characters")},exports.ConstraintsUtils=w,exports.FieldConnector=p,exports.ModalDialogLauncher=b,exports.PredefinedValuesError=function(){return t.createElement(l.Note,{variant:"warning",testId:"predefined-values-warning"},"The widget failed to initialize. You can fix the problem by providing predefined values under the validations tab in the field settings.")},exports.entityHelpers=E,exports.isValidImage=function(e){return["image/avif","image/bmp","image/x-windows-bmp","image/gif","image/webp","image/jpg","image/jpeg","image/pjpeg","image/x-jps","image/png","image/svg+xml"].includes(e.contentType)},exports.shortenStorageUnit=function(e,t){if(e<=0)return"0 B";const n=["PB","TB","GB","MB","KB","B"],i=(e,t)=>e<.99&&!(e=>n.indexOf(e)===n.length-1)(t)?i(1e3*e,(e=>n[n.indexOf(e)+1])(t)):e>=1e3&&!(e=>0===n.indexOf(e))(t)?i(e/1e3,(e=>n[n.indexOf(e)-1])(t)):{number:e,unit:t},{number:l,unit:s}=i(e,t);return`${function(e,t){return e.toFixed(2).replace(/\.(0)*$|0*$/,"")}(l)} ${s}`},exports.toLocaleString=function(e){return e.toLocaleString("en-US")};
2
- //# sourceMappingURL=field-editor-shared.cjs.production.min.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"field-editor-shared.cjs.production.min.js","sources":["../src/FieldConnector.ts","../src/CharCounter.tsx","../src/ModalDialogLauncher.tsx","../src/utils/entityHelpers.ts","../src/utils/constraints.ts","../src/CharValidation.tsx","../src/PredefinedValuesError.tsx","../src/utils/isValidImage.ts","../src/utils/shortenStorageUnit.ts"],"sourcesContent":["import React from 'react';\n\nimport { FieldAPI, ValidationError } from '@contentful/app-sdk';\nimport isEqual from 'lodash/isEqual';\nimport throttle from 'lodash/throttle';\n\ntype Nullable = null | undefined;\n\nexport interface FieldConnectorChildProps<ValueType> {\n isLocalValueChange: boolean;\n externalReset: number;\n lastRemoteValue: ValueType | Nullable;\n value: ValueType | Nullable;\n disabled: boolean;\n errors: ValidationError[];\n setValue: (value: ValueType | Nullable) => Promise<unknown>;\n}\n\ninterface FieldConnectorState<ValueType> {\n isLocalValueChange: boolean;\n externalReset: number;\n lastRemoteValue: ValueType | Nullable;\n value: ValueType | Nullable;\n disabled: boolean;\n errors: ValidationError[];\n}\n\ninterface FieldConnectorProps<ValueType> {\n field: FieldAPI;\n isInitiallyDisabled: boolean;\n isDisabled?: boolean;\n children: (state: FieldConnectorChildProps<ValueType>) => React.ReactNode;\n isEmptyValue: (value: ValueType | null) => boolean;\n isEqualValues: (value1: ValueType | Nullable, value2: ValueType | Nullable) => boolean;\n throttle: number;\n}\n\nexport class FieldConnector<ValueType> extends React.Component<\n FieldConnectorProps<ValueType>,\n FieldConnectorState<ValueType>\n> {\n static defaultProps = {\n children: () => {\n return null;\n },\n // eslint-disable-next-line -- TODO: describe this disable\n isEmptyValue: (value: any | Nullable) => {\n return value === null || value === '';\n },\n // eslint-disable-next-line -- TODO: describe this disable\n isEqualValues: (value1: any | Nullable, value2: any | Nullable) => {\n return isEqual(value1, value2);\n },\n throttle: 300,\n };\n\n constructor(props: FieldConnectorProps<ValueType>) {\n super(props);\n const initialValue = props.field.getValue();\n this.state = {\n isLocalValueChange: false,\n externalReset: 0,\n value: initialValue,\n lastRemoteValue: initialValue,\n disabled: props.isInitiallyDisabled ?? false,\n errors: [],\n };\n }\n\n unsubscribeErrors: Function | null = null;\n unsubscribeDisabled: Function | null = null;\n unsubscribeValue: Function | null = null;\n\n setValue = async (value: ValueType | Nullable) => {\n if (this.props.isEmptyValue(value ?? null)) {\n this.setState({ value: undefined });\n } else {\n this.setState({ value });\n }\n\n await this.triggerSetValueCallbacks(value);\n };\n\n triggerSetValueCallbacks = throttle(\n (value: ValueType | Nullable) => {\n return new Promise((resolve, reject) => {\n if (this.props.isEmptyValue(value ?? null)) {\n this.props.field.removeValue().then(resolve).catch(reject);\n } else {\n this.props.field.setValue(value).then(resolve).catch(reject);\n }\n });\n },\n this.props.throttle,\n {\n leading: this.props.throttle === 0,\n }\n );\n\n componentDidMount() {\n const { field } = this.props;\n this.unsubscribeErrors = field.onSchemaErrorsChanged((errors: ValidationError[]) => {\n this.setState({\n errors: errors || [],\n });\n });\n this.unsubscribeDisabled = field.onIsDisabledChanged((disabled: boolean) => {\n this.setState({\n disabled,\n });\n });\n this.unsubscribeValue = field.onValueChanged((value: ValueType | Nullable) => {\n this.setState((currentState) => {\n const isLocalValueChange = this.props.isEqualValues(value, currentState.value);\n const lastRemoteValue = isLocalValueChange ? currentState.lastRemoteValue : value;\n const externalReset = currentState.externalReset + (isLocalValueChange ? 0 : 1);\n return {\n value,\n lastRemoteValue,\n isLocalValueChange,\n externalReset,\n };\n });\n });\n }\n\n componentWillUnmount() {\n if (typeof this.unsubscribeErrors === 'function') {\n this.unsubscribeErrors();\n }\n if (typeof this.unsubscribeDisabled === 'function') {\n this.unsubscribeDisabled();\n }\n if (typeof this.unsubscribeValue === 'function') {\n this.unsubscribeValue();\n }\n }\n\n render() {\n return this.props.children({\n ...this.state,\n setValue: this.setValue,\n disabled: this.props.isDisabled || this.state.disabled,\n });\n }\n}\n","import React from 'react';\n\nimport tokens from '@contentful/f36-tokens';\nimport { css, cx } from 'emotion';\n\ninterface CharCounterProps {\n value?: string;\n checkConstraint: (n: number) => boolean;\n}\n\nconst styles = {\n invalid: css({\n color: tokens.red600,\n }),\n};\n\nexport function CharCounter(props: CharCounterProps) {\n let count = 0;\n if (props.value) {\n count = props.value.length;\n }\n const valid = count === 0 || props.checkConstraint(count);\n return (\n <span\n data-status-code={valid ? null : 'invalid-size'}\n className={cx({\n [styles.invalid]: !valid,\n })}>\n {count} characters\n </span>\n );\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-use-before-define */\n\nimport React from 'react';\nimport ReactDOM from 'react-dom';\n\nimport { OpenCustomWidgetOptions } from '@contentful/app-sdk';\nimport { Modal, ModalHeader } from '@contentful/f36-components';\nimport isNumber from 'lodash/isNumber';\n\nexport function open(componentRenderer: (params: { onClose: Function; isShown: boolean }) => any) {\n let rootDom: any = null;\n\n const getRoot = () => {\n if (rootDom === null) {\n rootDom = document.createElement('div');\n rootDom.setAttribute('id', 'field-editor-modal-root');\n document.body.appendChild(rootDom);\n }\n return rootDom;\n };\n\n return new Promise((resolve) => {\n let currentConfig = { onClose, isShown: true };\n\n function render({ onClose, isShown }: { onClose: Function; isShown: boolean }) {\n ReactDOM.render(componentRenderer({ onClose, isShown }), getRoot());\n }\n\n function onClose(...args: any[]) {\n currentConfig = {\n ...currentConfig,\n isShown: false,\n };\n render(currentConfig);\n // eslint-disable-next-line -- TODO: describe this disable @typescript-eslint/ban-ts-comment\n // @ts-ignore\n resolve(...args);\n getRoot().remove();\n }\n\n render(currentConfig);\n });\n}\n\nexport function openDialog<T>(\n options: OpenCustomWidgetOptions,\n Component: React.SFC<{ onClose: (result: T) => void }>\n) {\n const key = Date.now();\n const size = isNumber(options.width) ? `${options.width}px` : options.width;\n return open(({ isShown, onClose }) => {\n const onCloseHandler = () => onClose();\n return (\n <Modal\n key={key}\n shouldCloseOnOverlayClick={options.shouldCloseOnOverlayClick || false}\n shouldCloseOnEscapePress={options.shouldCloseOnEscapePress || false}\n allowHeightOverflow={options.allowHeightOverflow || false}\n position={options.position || 'center'}\n isShown={isShown}\n onClose={onCloseHandler}\n size={size || '700px'}>\n {() => (\n <>\n {options.title && (\n <ModalHeader testId=\"dialog-title\" title={options.title} onClose={onCloseHandler} />\n )}\n <div style={{ minHeight: options.minHeight || 'auto' }}>\n <Component onClose={onClose as any} />\n </div>\n </>\n )}\n </Modal>\n );\n });\n}\n\nexport default {\n openDialog,\n};\n","import get from 'lodash/get';\nimport isObject from 'lodash/isObject';\nimport isString from 'lodash/isString';\n\nimport { Asset, ContentType, ContentTypeField, Entry, File } from '../typesEntity';\n\nfunction titleOrDefault(title: string | undefined, defaultTitle: string): string {\n if (!isString(title)) {\n return defaultTitle;\n }\n if (title) {\n const trimmedTitle = title.trim();\n if (trimmedTitle.length === 0) {\n return defaultTitle;\n }\n return trimmedTitle;\n }\n return defaultTitle;\n}\n\nexport function getFieldValue({\n /**\n * Expects an entity fetched with a flag Skip-Transformation: true\n */\n entity,\n fieldId,\n localeCode,\n defaultLocaleCode,\n}: {\n entity: {\n fields: { [key: string]: { [valueKey: string]: string | undefined } };\n };\n fieldId: string;\n localeCode: string;\n defaultLocaleCode: string;\n}): string | undefined {\n const values = get(entity, ['fields', fieldId]);\n if (!isObject(values)) {\n return;\n }\n\n const firstLocaleCode = Object.keys(values)[0];\n\n return values[localeCode] || values[defaultLocaleCode] || values[firstLocaleCode];\n}\n\nexport function getAssetTitle({\n asset,\n localeCode,\n defaultLocaleCode,\n defaultTitle,\n}: {\n asset: Asset;\n localeCode: string;\n defaultLocaleCode: string;\n defaultTitle: string;\n}) {\n const title = getFieldValue({\n entity: { fields: { title: asset.fields?.title } },\n fieldId: 'title',\n localeCode,\n defaultLocaleCode,\n });\n return titleOrDefault(title, defaultTitle);\n}\n\n/**\n * Returns true if field is an Asset\n *\n * @param field\n * @returns {boolean}\n */\nexport const isAssetField = (field: ContentTypeField): boolean =>\n field.type === 'Link' && field.linkType === 'Asset';\n\n/**\n * Returns true if field is a Title\n */\nexport function isDisplayField({\n field,\n contentType,\n}: {\n field: ContentTypeField;\n contentType: ContentType;\n}): boolean {\n return field.id === contentType.displayField;\n}\n\n/**\n * Returns true if field is a short Description\n */\nexport function isDescriptionField({\n field,\n contentType,\n}: {\n field: ContentTypeField;\n contentType: ContentType;\n}) {\n const isTextField = (field: ContentTypeField) => ['Symbol', 'Text'].includes(field.type);\n const isMaybeSlugField = (field: ContentTypeField) => /\\bslug\\b/.test(field.name);\n return isTextField(field) && !isDisplayField({ field, contentType }) && !isMaybeSlugField(field);\n}\n\nexport function getEntityDescription({\n entity,\n contentType,\n localeCode,\n defaultLocaleCode,\n}: {\n entity: Entry;\n contentType?: ContentType;\n localeCode: string;\n defaultLocaleCode: string;\n}): string {\n if (!contentType) {\n return '';\n }\n\n const descriptionField = contentType.fields.find((field) =>\n isDescriptionField({ field, contentType })\n );\n\n if (!descriptionField) {\n return '';\n }\n\n return (\n getFieldValue({ entity, fieldId: descriptionField.id, localeCode, defaultLocaleCode }) || ''\n );\n}\n\nexport function getEntryTitle({\n entry,\n contentType,\n localeCode,\n defaultLocaleCode,\n defaultTitle,\n}: {\n entry: Entry;\n contentType?: ContentType;\n localeCode: string;\n defaultLocaleCode: string;\n defaultTitle: string;\n}) {\n let title;\n\n if (!contentType) {\n return defaultTitle;\n }\n\n const displayField = contentType.displayField;\n if (!displayField) {\n return defaultTitle;\n }\n\n const displayFieldInfo = contentType.fields.find((field) => field.id === displayField);\n\n if (!displayFieldInfo) {\n return defaultTitle;\n }\n\n // when localization for a field is \"turned off\",\n // we don't clean up the \"old\" localized data, so it is still in the response.\n // Therefore, we're checking if displayField is localizable.\n if (displayFieldInfo.localized) {\n title = getFieldValue({\n entity: entry,\n fieldId: displayField,\n localeCode,\n defaultLocaleCode,\n });\n if (!title) {\n // Older content types may return id/apiName, but some entry lookup paths do not fetch raw data\n // In order to still return a title in this case, look for displayField as apiName in content type,\n // ...but still look for displayField as a field in the entry\n title = getFieldValue({\n entity: entry,\n fieldId: displayFieldInfo.id,\n localeCode,\n defaultLocaleCode,\n });\n }\n } else {\n title = getFieldValue({\n entity: entry,\n fieldId: displayField,\n defaultLocaleCode,\n localeCode: '',\n });\n if (!title) {\n title = getFieldValue({\n entity: entry,\n fieldId: displayFieldInfo.id,\n defaultLocaleCode,\n localeCode: '',\n });\n }\n }\n\n return titleOrDefault(title, defaultTitle);\n}\n\nexport function getEntryStatus(sys: Entry['sys']) {\n if (!sys || (sys.type !== 'Entry' && sys.type !== 'Asset')) {\n throw new TypeError('Invalid entity metadata object');\n }\n if (sys.deletedVersion) {\n return 'deleted';\n } else if (sys.archivedVersion) {\n return 'archived';\n } else if (sys.publishedVersion) {\n if (sys.version > sys.publishedVersion + 1) {\n return 'changed';\n } else {\n return 'published';\n }\n } else {\n return 'draft';\n }\n}\n\n/**\n * Gets a promise resolving with a localized asset image field representing a\n * given entities file. The promise may resolve with null.\n */\nexport const getEntryImage = async (\n {\n entry,\n contentType,\n localeCode,\n }: {\n entry: Entry;\n contentType?: ContentType;\n localeCode: string;\n defaultLocaleCode: string;\n },\n getAsset: (assetId: string) => Promise<unknown>\n): Promise<null | File> => {\n if (!contentType) {\n return null;\n }\n\n const assetLink = contentType.fields.find(isAssetField);\n\n if (!assetLink) {\n return null;\n }\n\n const assetId = get(entry.fields, [assetLink.id, localeCode, 'sys', 'id']);\n\n if (!assetId) {\n return null;\n }\n\n try {\n const asset = await getAsset(assetId);\n const file = get(asset, ['fields', 'file', localeCode]);\n const isImage = Boolean(get(file, ['details', 'image'], false));\n return isImage ? file : null;\n } catch (e) {\n return null;\n }\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/**\n * This module parses field validations as a constraint and checks\n * values against that constraint.\n */\n\nimport isNumber from 'lodash/isNumber';\n\nimport { ValidationType } from '../types';\n\nexport function fromFieldValidations(\n validations: Record<string, any>[] = [],\n fieldType: 'Symbol' | 'Text'\n): ValidationType {\n const sizeValidation = validations.find((v) => 'size' in v);\n const size = (sizeValidation && sizeValidation.size) || {};\n const min = size.min;\n const max = size.max;\n\n if (isNumber(min) && isNumber(max)) {\n return {\n type: 'min-max',\n min,\n max,\n };\n } else if (isNumber(min)) {\n return {\n type: 'min',\n min,\n };\n } else if (isNumber(max)) {\n return {\n type: 'max',\n max,\n };\n } else {\n return {\n type: 'max',\n max: fieldType === 'Symbol' ? 256 : 50000,\n };\n }\n}\n\nexport function makeChecker(constraint: ValidationType) {\n return function checkConstraint(length: number) {\n if (constraint.type === 'max') {\n return length <= constraint.max;\n } else if (constraint.type === 'min') {\n return length >= constraint.min;\n } else {\n return length >= constraint.min && length <= constraint.max;\n }\n };\n}\n","import React from 'react';\n\nimport { ValidationType } from './types';\n\ninterface CharValidationProps {\n constraints: ValidationType;\n}\n\nexport function CharValidation(props: CharValidationProps) {\n const { constraints } = props;\n\n if (constraints.type === 'max') {\n return <span>Maximum {constraints.max} characters</span>;\n } else if (constraints.type === 'min') {\n return <span>Requires at least {constraints.min} characters</span>;\n } else {\n return (\n <span>\n Requires between {constraints.min} and {constraints.max} characters\n </span>\n );\n }\n}\n","import React from 'react';\n\nimport { Note } from '@contentful/f36-note';\n\nexport function PredefinedValuesError() {\n return (\n <Note variant=\"warning\" testId=\"predefined-values-warning\">\n The widget failed to initialize. You can fix the problem by providing predefined values under\n the validations tab in the field settings.\n </Note>\n );\n}\n","import { File } from '../typesEntity';\n\n/**\n * Checks whether the passed content type matches one of our valid MIME types\n */\nexport function isValidImage(file: File) {\n const validMimeTypes = [\n 'image/avif',\n 'image/bmp',\n 'image/x-windows-bmp',\n 'image/gif',\n 'image/webp',\n // This is not a valid MIME type but we supported it in the past.\n 'image/jpg',\n 'image/jpeg',\n 'image/pjpeg',\n 'image/x-jps',\n 'image/png',\n 'image/svg+xml',\n ];\n\n return validMimeTypes.includes(file.contentType);\n}\n","/**\n * Transforms a number into a localized string (en-US)\n * toLocaleString(1000); // \"1,000\"\n * @param {Number} number\n */\nexport function toLocaleString(number: number) {\n return number.toLocaleString('en-US');\n}\n\nfunction formatFloat(value: number, localize: boolean) {\n return localize\n ? toLocaleString(value)\n : value\n .toFixed(2)\n // remove floating point if not necessary\n .replace(/\\.(0)*$|0*$/, '');\n}\n\ntype UnitOfMeasure = 'PB' | 'TB' | 'GB' | 'MB' | 'KB' | 'B';\n\n/**\n * Make a storage unit number more readable by making them smaller\n * shortenStorageUnit(1000, 'GB'); // \"1 TB\"\n * shortenStorageUnit(0.001, 'TB'); // \"1 GB\"\n * @param value\n * @param uom Unit of measure\n * @returns\n */\nexport function shortenStorageUnit(value: number, uom: UnitOfMeasure) {\n if (value <= 0) {\n return '0 B';\n }\n\n const units: UnitOfMeasure[] = ['PB', 'TB', 'GB', 'MB', 'KB', 'B'];\n\n const getBigger = (unit: UnitOfMeasure): UnitOfMeasure => units[units.indexOf(unit) - 1];\n const getSmaller = (unit: UnitOfMeasure) => units[units.indexOf(unit) + 1];\n const isBiggestUnit = (unit: UnitOfMeasure) => units.indexOf(unit) === 0;\n const isSmallestUnit = (unit: UnitOfMeasure) => units.indexOf(unit) === units.length - 1;\n\n const reduce = (number: number, unit: UnitOfMeasure): { number: number; unit: UnitOfMeasure } => {\n if (number < 0.99 && !isSmallestUnit(unit)) {\n return reduce(number * 1000, getSmaller(unit));\n } else if (number >= 1000 && !isBiggestUnit(unit)) {\n return reduce(number / 1000, getBigger(unit));\n } else {\n return { number, unit };\n }\n };\n\n const { number, unit } = reduce(value, uom);\n\n return `${formatFloat(number, false)} ${unit}`;\n}\n"],"names":["FieldConnector","React","Component","constructor","props","unsubscribeErrors","unsubscribeDisabled","unsubscribeValue","setValue","async","this","isEmptyValue","value","setState","undefined","triggerSetValueCallbacks","throttle","Promise","resolve","reject","field","removeValue","then","catch","leading","initialValue","getValue","state","isLocalValueChange","externalReset","lastRemoteValue","disabled","isInitiallyDisabled","errors","componentDidMount","onSchemaErrorsChanged","onIsDisabledChanged","onValueChanged","currentState","isEqualValues","componentWillUnmount","render","children","isDisabled","defaultProps","value1","value2","isEqual","styles","css","color","tokens","red600","open","componentRenderer","rootDom","getRoot","document","createElement","setAttribute","body","appendChild","currentConfig","onClose","args","isShown","remove","ReactDOM","openDialog","options","key","Date","now","size","isNumber","width","onCloseHandler","Modal","shouldCloseOnOverlayClick","shouldCloseOnEscapePress","allowHeightOverflow","position","title","ModalHeader","testId","style","minHeight","titleOrDefault","defaultTitle","isString","trimmedTitle","trim","length","getFieldValue","entity","fieldId","localeCode","defaultLocaleCode","values","get","isObject","firstLocaleCode","Object","keys","isAssetField","type","linkType","isDisplayField","contentType","id","displayField","isDescriptionField","includes","isTextField","test","name","isMaybeSlugField","asset","fields","_asset$fields","descriptionField","find","entry","displayFieldInfo","localized","sys","TypeError","deletedVersion","archivedVersion","publishedVersion","version","getAsset","assetLink","assetId","file","Boolean","e","validations","fieldType","sizeValidation","v","min","max","constraint","count","valid","checkConstraint","className","cx","constraints","Note","variant","uom","units","reduce","number","unit","indexOf","isSmallestUnit","getSmaller","isBiggestUnit","getBigger","localize","toFixed","replace","formatFloat","toLocaleString"],"mappings":"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"}