@zydon/common 2.7.62 → 2.7.64
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/README.md +1 -0
- package/dist/{chunk-CU7PKEY2.js → chunk-4RNGASI4.js} +2 -2
- package/dist/{chunk-75G5RNV4.js → chunk-5LQLLZ5L.js} +2 -2
- package/dist/chunk-5NIMUEW5.js +25 -0
- package/dist/chunk-5NIMUEW5.js.map +1 -0
- package/dist/chunk-7MVZYOHX.js +13 -0
- package/dist/chunk-7MVZYOHX.js.map +1 -0
- package/dist/{chunk-WDKKCLZ6.js → chunk-CWCEG2DZ.js} +2 -2
- package/dist/{chunk-HLMZQG27.js → chunk-HWYA3EGC.js} +2 -2
- package/dist/chunk-HWYA3EGC.js.map +1 -0
- package/dist/{chunk-5AWUE6JG.js → chunk-JZ55NEMI.js} +2 -2
- package/dist/{chunk-EKIESGNJ.js → chunk-LEMPYV5U.js} +2 -2
- package/dist/{chunk-QGMJKW7H.js → chunk-LNXA53QR.js} +2 -2
- package/dist/{chunk-FBSNLBJM.js → chunk-LY3IB5VH.js} +2 -2
- package/dist/{chunk-DIWJKSWV.js → chunk-MP2LAJS5.js} +3 -3
- package/dist/{chunk-IC3H2DXY.js → chunk-N4DW7EIC.js} +2 -2
- package/dist/{chunk-CMZI4PHD.js → chunk-NQNNMRLC.js} +1 -1
- package/dist/{chunk-CMZI4PHD.js.map → chunk-NQNNMRLC.js.map} +1 -1
- package/dist/{chunk-DOVOMWT6.js → chunk-OTVEMGF2.js} +2 -2
- package/dist/chunk-POTVACYB.js +8 -0
- package/dist/chunk-POTVACYB.js.map +1 -0
- package/dist/chunk-QVU6HSYP.js +12 -0
- package/dist/chunk-QVU6HSYP.js.map +1 -0
- package/dist/chunk-QVUHCBI2.js +35 -0
- package/dist/chunk-QVUHCBI2.js.map +1 -0
- package/dist/{chunk-RANEJERP.js → chunk-R76WTFYC.js} +2 -2
- package/dist/chunk-RBTYTONM.js +13 -0
- package/dist/chunk-RBTYTONM.js.map +1 -0
- package/dist/{chunk-DPT3E7PD.js → chunk-RFRLNTFN.js} +2 -2
- package/dist/{chunk-LBYTNLD3.js → chunk-U7BH6DMJ.js} +2 -2
- package/dist/{chunk-5SIAWCDO.js → chunk-XZFBTUAG.js} +2 -2
- package/dist/{chunk-N7R22QVG.js → chunk-ZFRNMT3P.js} +2 -2
- package/dist/{chunk-YPQCLH3D.js → chunk-ZGSSTXUO.js} +2 -2
- package/dist/components/ActionButton/index.js +2 -2
- package/dist/components/Autocomplete/index.js +2 -2
- package/dist/components/Avatar/index.d.ts +1 -1
- package/dist/components/AvatarButton/index.js +3 -3
- package/dist/components/BuilderLayout/index.js +2 -2
- package/dist/components/BuilderSidebar/index.js +1 -1
- package/dist/components/BulkEditModal/index.d.ts +64 -0
- package/dist/components/BulkEditModal/index.js +28 -0
- package/dist/components/BulkEditModal/index.js.map +1 -0
- package/dist/components/CardBrand/index.js +1 -1
- package/dist/components/Common/index.js +3 -3
- package/dist/components/CopyButton/index.js +2 -2
- package/dist/components/DataGrid/index.js +2 -1
- package/dist/components/DataView/index.js +8 -6
- package/dist/components/DatePicker/index.d.ts +2 -1
- package/dist/components/DatePicker/index.js +3 -3
- package/dist/components/DatePicker/index.js.map +1 -1
- package/dist/components/DragButton/index.js +2 -2
- package/dist/components/DragContainer/index.js +2 -2
- package/dist/components/DragContainer/index.js.map +1 -1
- package/dist/components/Drawer/index.js +1 -1
- package/dist/components/DynamicDataView/index.d.ts +4 -2
- package/dist/components/DynamicDataView/index.js +20 -14
- package/dist/components/DynamicDataView/index.js.map +1 -1
- package/dist/components/EasyCropModal/index.js +3 -3
- package/dist/components/Error/index.js +1 -1
- package/dist/components/ExpandableGroup/index.js +7 -7
- package/dist/components/ExpandableGroup/index.js.map +1 -1
- package/dist/components/FieldMentions/index.js.map +1 -1
- package/dist/components/FileUpload/index.js +6 -8
- package/dist/components/FrameSkeleton/index.js +4 -4
- package/dist/components/HelpButton/index.js +2 -2
- package/dist/components/Icon/index.js +1 -1
- package/dist/components/IconButton/index.js +2 -2
- package/dist/components/ImageCropModal/index.js +14 -4
- package/dist/components/ImageCropModal/index.js.map +1 -1
- package/dist/components/Incrementer/index.js +2 -2
- package/dist/components/InfoCircle/index.js +1 -1
- package/dist/components/ListBundles/index.js +2 -2
- package/dist/components/MenuItem/index.js +1 -1
- package/dist/components/Modal/index.js +2 -2
- package/dist/components/MoreMenu/index.js +1 -1
- package/dist/components/PasswordRules/index.js +1 -1
- package/dist/components/PopoverSelect/index.js +1 -1
- package/dist/components/SearchInput/index.js +2 -2
- package/dist/components/SelectableCards/index.js +3 -3
- package/dist/components/SeoPreview/index.js +1 -1
- package/dist/components/StateDisplay/index.js +2 -2
- package/dist/components/Steps/index.js +1 -1
- package/dist/components/StyledTab/index.js +1 -1
- package/dist/components/SwapList/index.js +2 -2
- package/dist/components/ToggleTheme/index.js +2 -2
- package/dist/components/WebhookCard/index.js +2 -2
- package/dist/components/carousel/index.js +2 -2
- package/dist/components/form/Address/index.js +3 -3
- package/dist/components/form/Autocomplete/index.js +3 -3
- package/dist/components/form/Codes/index.d.ts +2 -1
- package/dist/components/form/Codes/index.js +4 -4
- package/dist/components/form/Codes/index.js.map +1 -1
- package/dist/components/form/FileUpload/index.js +6 -8
- package/dist/components/form/FileUpload/index.js.map +1 -1
- package/dist/components/form/Incrementer/index.js +2 -2
- package/dist/components/form/Password/index.js +1 -1
- package/dist/components/form/SelectableCards/index.js +3 -3
- package/dist/components/form/Webhook/index.js +12 -12
- package/dist/components/form/Webhook/index.js.map +1 -1
- package/dist/components/lightbox/index.js +1 -1
- package/dist/components/table/index.js +2 -2
- package/dist/contexts/PushNotifications/index.js +1 -1
- package/dist/hooks/useCollapseSidebarOnMount.js +3 -3
- package/dist/hooks/useEventCallback.d.ts +2 -3
- package/dist/hooks/useEventCallback.js +1 -1
- package/dist/hooks/useLocalStorage.js +2 -2
- package/dist/hooks/useSnackbar.d.ts +1 -1
- package/dist/hooks/useThemeToggle.js +2 -2
- package/dist/hooks/useUpload.js +6 -1
- package/dist/hooks/useUpload.js.map +1 -1
- package/dist/hooks/useUploadImage.js +7 -2
- package/dist/hooks/useUploadImage.js.map +1 -1
- package/dist/index.d.ts +3 -5
- package/dist/index.js +2 -6
- package/dist/index.js.map +1 -1
- package/dist/theme/core/index.d.ts +1 -1
- package/dist/theme/styles/index.d.ts +13 -13
- package/dist/theme/theme-provider.js +2 -2
- package/dist/utils/dnd.js +4 -4
- package/dist/utils/dnd.js.map +1 -1
- package/package.json +4 -1
- package/dist/chunk-33C6UWPV.js +0 -7
- package/dist/chunk-33C6UWPV.js.map +0 -1
- package/dist/chunk-DTIGB5NW.js +0 -10
- package/dist/chunk-DTIGB5NW.js.map +0 -1
- package/dist/chunk-G4J47YPR.js +0 -23
- package/dist/chunk-G4J47YPR.js.map +0 -1
- package/dist/chunk-HLMZQG27.js.map +0 -1
- package/dist/chunk-IMKYDHP2.js +0 -16
- package/dist/chunk-IMKYDHP2.js.map +0 -1
- package/dist/chunk-JBPWWO5D.js +0 -15
- package/dist/chunk-JBPWWO5D.js.map +0 -1
- package/dist/chunk-L4FRE2NC.js +0 -42
- package/dist/chunk-L4FRE2NC.js.map +0 -1
- package/dist/chunk-MQAMSYYK.js +0 -8
- package/dist/chunk-MQAMSYYK.js.map +0 -1
- package/dist/chunk-SA2BESEB.js +0 -17
- package/dist/chunk-SA2BESEB.js.map +0 -1
- package/dist/chunk-SBMEL2IJ.js +0 -9
- package/dist/chunk-SBMEL2IJ.js.map +0 -1
- package/dist/chunk-TNSABPJ2.js +0 -27
- package/dist/chunk-TNSABPJ2.js.map +0 -1
- package/dist/chunk-UZ4EKQYP.js +0 -36
- package/dist/chunk-UZ4EKQYP.js.map +0 -1
- package/dist/chunk-YCEQDXLR.js +0 -8
- package/dist/chunk-YCEQDXLR.js.map +0 -1
- package/dist/components/form/UploadAvatarWithCrop/index.d.ts +0 -21
- package/dist/components/form/UploadAvatarWithCrop/index.js +0 -22
- package/dist/components/form/UploadAvatarWithCrop/index.js.map +0 -1
- package/dist/components/form/UploadWithCrop/index.d.ts +0 -21
- package/dist/components/form/UploadWithCrop/index.js +0 -28
- package/dist/components/form/UploadWithCrop/index.js.map +0 -1
- package/dist/components/upload/index.d.ts +0 -70
- package/dist/components/upload/index.js +0 -30
- package/dist/components/upload/index.js.map +0 -1
- package/dist/{chunk-CU7PKEY2.js.map → chunk-4RNGASI4.js.map} +0 -0
- package/dist/{chunk-75G5RNV4.js.map → chunk-5LQLLZ5L.js.map} +0 -0
- package/dist/{chunk-WDKKCLZ6.js.map → chunk-CWCEG2DZ.js.map} +0 -0
- package/dist/{chunk-5AWUE6JG.js.map → chunk-JZ55NEMI.js.map} +0 -0
- package/dist/{chunk-EKIESGNJ.js.map → chunk-LEMPYV5U.js.map} +0 -0
- package/dist/{chunk-QGMJKW7H.js.map → chunk-LNXA53QR.js.map} +0 -0
- package/dist/{chunk-FBSNLBJM.js.map → chunk-LY3IB5VH.js.map} +0 -0
- package/dist/{chunk-DIWJKSWV.js.map → chunk-MP2LAJS5.js.map} +0 -0
- package/dist/{chunk-IC3H2DXY.js.map → chunk-N4DW7EIC.js.map} +0 -0
- package/dist/{chunk-DOVOMWT6.js.map → chunk-OTVEMGF2.js.map} +0 -0
- package/dist/{chunk-RANEJERP.js.map → chunk-R76WTFYC.js.map} +0 -0
- package/dist/{chunk-DPT3E7PD.js.map → chunk-RFRLNTFN.js.map} +0 -0
- package/dist/{chunk-LBYTNLD3.js.map → chunk-U7BH6DMJ.js.map} +0 -0
- package/dist/{chunk-5SIAWCDO.js.map → chunk-XZFBTUAG.js.map} +0 -0
- package/dist/{chunk-N7R22QVG.js.map → chunk-ZFRNMT3P.js.map} +0 -0
- package/dist/{chunk-YPQCLH3D.js.map → chunk-ZGSSTXUO.js.map} +0 -0
- package/dist/{index-c8f1e6e7.d.ts → index-5a5e5dc8.d.ts} +12 -12
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/DynamicDataView/DynamicDataView.tsx","../../../src/components/DynamicDataView/hooks/useDynamicColumns.ts","../../../src/components/DynamicDataView/constants/columnDefaults.ts","../../../src/components/DynamicDataView/utils/columnStrategies.ts","../../../src/components/DynamicDataView/utils/addActionsField.ts","../../../src/components/DynamicDataView/renderers/BooleanRenderer.tsx","../../../src/components/DynamicDataView/renderers/DateRenderer.tsx","../../../src/components/DynamicDataView/renderers/DateTimeRenderer.tsx","../../../src/components/DynamicDataView/renderers/EntityRenderer.tsx","../../../src/components/DynamicDataView/renderers/IconRenderer.tsx","../../../src/components/DynamicDataView/renderers/NameRenderer.tsx","../../../src/components/DynamicDataView/renderers/NumberRenderer.tsx","../../../src/components/DynamicDataView/renderers/TextRenderer.tsx","../../../src/components/DynamicDataView/utils/createCellRenderer.tsx"],"names":["memo","useCallback","useMemo","COLUMN_DEFAULTS","ACCESS_TYPES","CURRENCY_FIELD_NAMES","createImageColumn","field","renderCell","params","createIdColumn","createEntityColumn","createDefaultColumn","createActionsColumn","getColumnStrategy","metadata","useDynamicColumns","columnStrategies","columnsMap","column","createActionsField","addActionsFieldToMetadata","jsx","BooleanRenderer","value","trueLabel","falseLabel","Label_default","BooleanRenderer_default","DateRenderer","format","fDate","DateRenderer_default","DateTimeRenderer","fDateTime","DateTimeRenderer_default","Chip","EntityRenderer","entityValue","EntityRenderer_default","IconRenderer","trueIcon","falseIcon","color","width","Icon_default","IconRenderer_default","Stack","Typography","jsxs","NameRenderer","id","displayName","copyMessage","CopyButton_default","NameRenderer_default","NumberRenderer","isCurrency","fCurrencyBRL","fNumber","NumberRenderer_default","sanitizeHtml","text","TextRenderer","showCopyButton","stringValue","sanitizedValue","TextRenderer_default","getIsCurrency","fieldName","createCellRenderer","context","onRowAction","CellRendererComponent","row","getColumnFieldIdFromField","DynamicDataView","title","data","isLoading","isFetching","page","perPage","searchValue","onSearchChange","onSearch","onPaginationChange","onAdd","onRowDoubleClick","actions","moreActions","hideHeader","slots","mobileRender","containerHeight","showColumnButton","defaultVisibleFieldNames","preferredFieldOrder","rows","total","effectiveMetadata","columns","columnsByFieldId","orderedColumns","actionFieldName","preferredWithoutActions","usedColumnFieldIds","ordered","pushColumnForField","fieldItem","columnFieldId","initialState","visibilityModel","handleRowDoubleClick","rowId","DataView_default","DynamicDataView_default"],"mappings":"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","sourcesContent":["import { memo, useCallback, useMemo } from 'react';\nimport { GridColumnVisibilityModel } from '@mui/x-data-grid-premium';\n\nimport { Field } from 'types/entityMetadata';\n\nimport DataView from '../DataView';\n\nimport { useDynamicColumns } from './hooks/useDynamicColumns';\nimport { addActionsFieldToMetadata } from './utils/addActionsField';\nimport { createCellRenderer } from './utils/createCellRenderer';\nimport { DynamicDataViewProps, DynamicRowData } from './props';\n\nfunction getColumnFieldIdFromField(field: Field): string {\n return field.name;\n}\n\nconst DynamicDataView = <T extends object = object>({\n title,\n metadata,\n data,\n isLoading,\n isFetching,\n page,\n perPage,\n searchValue,\n onSearchChange,\n onSearch,\n onPaginationChange,\n onAdd,\n onRowAction,\n onRowDoubleClick,\n actions,\n moreActions,\n hideHeader,\n slots,\n mobileRender,\n containerHeight = 600,\n showColumnButton = false,\n defaultVisibleFieldNames,\n preferredFieldOrder,\n columnStrategies,\n}: DynamicDataViewProps<T>) => {\n const { items: rows = [], total = 0 } = data || {};\n\n const effectiveMetadata = useMemo(\n () => (onRowAction ? addActionsFieldToMetadata(metadata) : metadata),\n [metadata, onRowAction],\n );\n\n const renderCell = useMemo(\n () =>\n createCellRenderer<T>({\n onRowAction,\n }),\n [onRowAction],\n );\n\n const columns = useDynamicColumns<T>({\n metadata: effectiveMetadata,\n renderCell,\n columnStrategies,\n });\n\n const columnsByFieldId = useMemo(\n () => new Map(columns.map(column => [column.field, column])),\n [columns],\n );\n\n const orderedColumns = useMemo(() => {\n if (\n !preferredFieldOrder ||\n preferredFieldOrder.length === 0 ||\n !effectiveMetadata?.fields\n ) {\n return columns;\n }\n\n const actionFieldName = 'ACTIONS';\n const preferredWithoutActions = preferredFieldOrder.filter(\n fieldName => fieldName !== actionFieldName,\n );\n\n const usedColumnFieldIds = new Set<string>();\n const ordered: Array<(typeof columns)[number]> = [];\n\n const pushColumnForField = (fieldName: string) => {\n const field = effectiveMetadata.fields.find(\n fieldItem => fieldItem.name === fieldName,\n );\n\n if (!field) {\n return;\n }\n\n const columnFieldId = getColumnFieldIdFromField(field);\n const column = columnsByFieldId.get(columnFieldId);\n\n if (!column || usedColumnFieldIds.has(columnFieldId)) {\n return;\n }\n\n ordered.push(column);\n usedColumnFieldIds.add(columnFieldId);\n };\n\n preferredWithoutActions.forEach(fieldName => {\n pushColumnForField(fieldName);\n });\n\n effectiveMetadata.fields.forEach(field => {\n if (field.name === actionFieldName) {\n return;\n }\n\n if (preferredWithoutActions.includes(field.name)) {\n return;\n }\n\n const columnFieldId = getColumnFieldIdFromField(field);\n const column = columnsByFieldId.get(columnFieldId);\n\n if (!column || usedColumnFieldIds.has(columnFieldId)) {\n return;\n }\n\n ordered.push(column);\n usedColumnFieldIds.add(columnFieldId);\n });\n\n pushColumnForField(actionFieldName);\n\n if (ordered.length === 0) {\n return columns;\n }\n\n return ordered;\n }, [columns, columnsByFieldId, effectiveMetadata, preferredFieldOrder]);\n\n const initialState = useMemo(() => {\n if (\n !defaultVisibleFieldNames ||\n defaultVisibleFieldNames.length === 0 ||\n !effectiveMetadata?.fields\n ) {\n return undefined;\n }\n\n const visibilityModel: GridColumnVisibilityModel = {};\n\n effectiveMetadata.fields.forEach(field => {\n const columnFieldId = getColumnFieldIdFromField(field);\n\n if (!columnsByFieldId.has(columnFieldId)) {\n return;\n }\n\n visibilityModel[columnFieldId] = defaultVisibleFieldNames.includes(\n field.name,\n );\n });\n\n return {\n columns: {\n columnVisibilityModel: visibilityModel,\n },\n };\n }, [columnsByFieldId, defaultVisibleFieldNames, effectiveMetadata]);\n\n const handleRowDoubleClick = useCallback(\n (params: { id: string | number; row: DynamicRowData<T> }) => {\n if (!onRowDoubleClick) return;\n\n const rowId = params.id?.toString() || '';\n onRowDoubleClick(rowId, params.row);\n },\n [onRowDoubleClick],\n );\n\n return (\n <DataView\n title={title}\n columns={orderedColumns}\n rows={rows}\n mobileRender={mobileRender || (() => null)}\n rowCount={total}\n loading={isLoading}\n fetching={isFetching}\n searchValue={searchValue}\n onSearch={onSearch}\n onSearchChange={onSearchChange}\n paginationModel={{\n page,\n pageSize: perPage,\n }}\n onPaginationChange={onPaginationChange}\n actions={actions}\n moreActions={moreActions}\n onAdd={onAdd}\n hideHeader={hideHeader}\n onRowDoubleClick={onRowDoubleClick ? handleRowDoubleClick : undefined}\n disableRowSelectionOnClick\n slots={slots}\n initialState={initialState}\n showColumnButton={showColumnButton}\n containerProps={{\n height: containerHeight,\n maxHeight: containerHeight,\n }}\n />\n );\n};\n\nexport default memo(DynamicDataView) as typeof DynamicDataView;\nexport type {\n DynamicDataViewProps,\n DynamicRowData,\n MobileRenderFunction,\n} from './props';\n","import { useMemo } from 'react';\nimport { GridColDef } from '@mui/x-data-grid-premium';\n\nimport { Columns } from 'types/datagrid';\nimport { EntityMetadataResponse } from 'types/entityMetadata';\n\nimport { ACCESS_TYPES } from '../constants/columnDefaults';\nimport { CellRenderer } from '../types/cellRenderer';\nimport { ColumnStrategy, getColumnStrategy } from '../utils/columnStrategies';\n\ninterface UseDynamicColumnsProps<T> {\n metadata?: EntityMetadataResponse;\n renderCell: CellRenderer<T>;\n columnStrategies?: {\n [fieldName: string]: ColumnStrategy<T>;\n };\n}\n\nexport const useDynamicColumns = <T extends object>({\n metadata,\n renderCell,\n columnStrategies,\n}: UseDynamicColumnsProps<T>): Columns => {\n return useMemo(() => {\n if (!metadata?.fields) return [];\n\n const columnsMap = new Map<string, GridColDef>();\n\n const visibleFields = metadata.fields.filter(field => {\n if (\n field.access_type === ACCESS_TYPES.READ_ONLY ||\n field.access_type === ACCESS_TYPES.READ_AND_WRITE\n ) {\n return true;\n }\n\n return (\n field.name === 'ACTIONS' ||\n field.name === metadata?.id_field_name ||\n field.name === 'NAME'\n );\n });\n\n visibleFields.forEach(field => {\n if (columnsMap.has(field.name)) {\n return;\n }\n\n const strategy =\n columnStrategies?.[field.name] ?? getColumnStrategy<T>(field, metadata);\n const column = strategy(field, renderCell, metadata);\n\n columnsMap.set(field.name, column);\n });\n\n return Array.from(columnsMap.values());\n }, [columnStrategies, metadata, renderCell]);\n};\n","export const COLUMN_DEFAULTS = {\n IMAGE_WIDTH: 90,\n MIN_WIDTH: 130,\n ID_MIN_WIDTH: 200,\n ENTITY_MIN_WIDTH: 160,\n HIGHLIGHT_MAX_WIDTH: 80,\n ACTIONS_WIDTH: 80,\n ID_FLEX: 2,\n ENTITY_FLEX: 1,\n} as const;\n\nexport const ACCESS_TYPES = {\n READ_ONLY: 'READ_ONLY',\n READ_AND_WRITE: 'READ_AND_WRITE',\n} as const;\n\nexport const CURRENCY_FIELD_NAMES: readonly string[] = [\n 'price',\n 'base_price',\n 'minimum_value',\n 'maximum_value',\n 'minimum_installment_value',\n];\n","import { GridColDef, GridRenderCellParams } from '@mui/x-data-grid-premium';\n\nimport { Field } from 'types/entityMetadata';\n\nimport { COLUMN_DEFAULTS } from '../constants/columnDefaults';\nimport { CellRenderer, DynamicRowData } from '../types/cellRenderer';\n\nexport type ColumnStrategy<T = object> = (\n field: Field,\n renderCell: CellRenderer<T>,\n metadata?: { id_field_name?: string },\n) => GridColDef;\n\nconst createImageColumn = <T extends object>(\n field: Field,\n renderCell: CellRenderer<T>,\n): GridColDef => ({\n field: field.name,\n headerName: field.description,\n sortable: false,\n width: COLUMN_DEFAULTS.IMAGE_WIDTH,\n resizable: false,\n renderCell: (params: GridRenderCellParams) =>\n renderCell(field, params.row as DynamicRowData<T>),\n});\n\nconst createIdColumn = <T extends object>(\n field: Field,\n renderCell: CellRenderer<T>,\n): GridColDef => ({\n field: field.name,\n headerName: field.description,\n minWidth: COLUMN_DEFAULTS.ID_MIN_WIDTH,\n flex: COLUMN_DEFAULTS.ID_FLEX,\n renderCell: (params: GridRenderCellParams) =>\n renderCell(field, params.row as DynamicRowData<T>),\n});\n\nconst createEntityColumn = <T extends object>(\n field: Field,\n renderCell: CellRenderer<T>,\n): GridColDef => ({\n field: field.name,\n headerName: field.description,\n minWidth: COLUMN_DEFAULTS.ENTITY_MIN_WIDTH,\n flex: COLUMN_DEFAULTS.ENTITY_FLEX,\n renderCell: (params: GridRenderCellParams) =>\n renderCell(field, params.row as DynamicRowData<T>),\n});\n\nconst createDefaultColumn = <T extends object>(\n field: Field,\n renderCell: CellRenderer<T>,\n): GridColDef => ({\n field: field.name,\n headerName: field.description,\n minWidth: COLUMN_DEFAULTS.MIN_WIDTH,\n renderCell: (params: GridRenderCellParams) =>\n renderCell(field, params.row as DynamicRowData<T>),\n});\n\nconst createActionsColumn = <T extends object>(\n field: Field,\n renderCell: CellRenderer<T>,\n): GridColDef => ({\n field: field.name,\n headerName: 'Ações',\n width: COLUMN_DEFAULTS.ACTIONS_WIDTH,\n sortable: false,\n resizable: false,\n disableReorder: true,\n headerAlign: 'center',\n disableColumnMenu: true,\n align: 'center',\n renderCell: (params: GridRenderCellParams) =>\n renderCell(field, params.row as DynamicRowData<T>),\n});\n\nexport const getColumnStrategy = <T extends object>(\n field: Field,\n metadata?: { id_field_name?: string },\n): ColumnStrategy<T> => {\n if (field.name === metadata?.id_field_name || field.name === 'name') {\n return createIdColumn;\n }\n\n if (field.name === 'ACTIONS') {\n return createActionsColumn;\n }\n\n if (field.type === 'FILE') {\n return createImageColumn;\n }\n\n if (field.type === 'ENTITY') {\n return createEntityColumn;\n }\n\n return createDefaultColumn;\n};\n","import { EntityMetadataResponse, Field } from 'types/entityMetadata';\n\nexport const createActionsField = (): Field => ({\n name: 'ACTIONS',\n description: '',\n filter_field_name: null,\n type: 'TEXT',\n metadata: null,\n access_type: 'READ_ONLY',\n relation_field_name: null,\n available_filter_conditions: [],\n});\n\nexport const addActionsFieldToMetadata = (\n metadata: EntityMetadataResponse,\n): EntityMetadataResponse => {\n const hasActionsField = metadata.fields.some(\n field => field.name === 'ACTIONS',\n );\n\n if (hasActionsField) {\n return metadata;\n }\n\n return {\n ...metadata,\n fields: [...metadata.fields, createActionsField()],\n };\n};\n","import { memo, ReactNode } from 'react';\n\nimport Label from '../../Label';\n\nimport { BooleanRendererProps } from './props';\n\nconst BooleanRenderer = ({\n value,\n trueLabel = 'Ativo',\n falseLabel = 'Inativo',\n}: BooleanRendererProps): ReactNode => {\n return (\n <Label color={value ? 'success' : 'warning'}>\n {value ? trueLabel : falseLabel}\n </Label>\n );\n};\n\nexport default memo(BooleanRenderer);\n","import { memo, ReactNode } from 'react';\n\nimport { DatePickerFormat, fDate } from 'utils/formatTime';\n\nexport interface DateRendererProps {\n value: unknown;\n format?: string;\n}\n\nconst DateRenderer = ({ value, format }: DateRendererProps): ReactNode => {\n if (value === null || value === undefined) return '-';\n\n return fDate(value as DatePickerFormat, format);\n};\n\nexport default memo(DateRenderer);\n","import { memo, ReactNode } from 'react';\n\nimport { DatePickerFormat, fDateTime } from 'utils/formatTime';\n\nexport interface DateTimeRendererProps {\n value: unknown;\n format?: string;\n}\n\nconst DateTimeRenderer = ({\n value,\n format,\n}: DateTimeRendererProps): ReactNode => {\n if (value === null || value === undefined) return '-';\n\n return fDateTime(value as DatePickerFormat, format);\n};\n\nexport default memo(DateTimeRenderer);\n","import { memo, ReactNode } from 'react';\nimport Chip from '@mui/material/Chip';\n\nimport { EntityRendererProps } from './props';\n\nconst EntityRenderer = ({ value, field }: EntityRendererProps): ReactNode => {\n if (!field.metadata || typeof value !== 'object' || value === null) {\n return value ? String(value) : '-';\n }\n\n const entityValue = (value as Record<string, unknown>)[\n field.metadata.description_field_name\n ];\n\n if (!entityValue) return null;\n\n return (\n <Chip\n label={String(entityValue)}\n variant=\"outlined\"\n size=\"small\"\n sx={{\n width: 'fit-content',\n color: 'text.secondary',\n borderColor: 'divider',\n px: 1.5,\n }}\n />\n );\n};\n\nexport default memo(EntityRenderer);\n","import { memo, ReactNode } from 'react';\n\nimport Icon, { IconEnum } from '../../Icon';\n\nimport { IconRendererProps } from './props';\n\nconst IconRenderer = ({\n value,\n trueIcon = IconEnum.STAR_02,\n falseIcon = IconEnum.STAR,\n color = 'primary.main',\n width = 18,\n}: IconRendererProps): ReactNode => {\n return (\n <Icon icon={value ? trueIcon : falseIcon} color={color} width={width} />\n );\n};\n\nexport default memo(IconRenderer);\n","import { memo, ReactNode } from 'react';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\n\nimport CopyButton from 'components/CopyButton';\n\nimport { NameRendererProps } from './props';\n\nconst NameRenderer = ({\n id,\n displayName,\n copyMessage = 'ID copiado!',\n}: NameRendererProps): ReactNode => {\n return (\n <Stack height={1} justifyContent=\"center\">\n <Typography variant=\"subtitle2\" noWrap title={displayName}>\n {displayName}\n </Typography>\n <Stack direction=\"row\" gap={1} alignItems=\"center\">\n <Typography color=\"grey.600\" variant=\"body2\" noWrap>\n ID: {id}\n </Typography>\n <CopyButton toCopy={id} message={copyMessage} />\n </Stack>\n </Stack>\n );\n};\n\nexport default memo(NameRenderer);\n","import { memo, ReactNode } from 'react';\nimport Typography from '@mui/material/Typography';\n\nimport { fCurrencyBRL, fNumber } from 'utils/formatNumber';\n\nimport { NumberRendererProps } from './props';\n\nconst NumberRenderer = ({\n value,\n isCurrency = false,\n}: NumberRendererProps): ReactNode => {\n if (value === null || value === undefined) return '-';\n\n if (isCurrency) {\n return (\n <Typography variant=\"body2\" noWrap width=\"fit-content\">\n {fCurrencyBRL(Number(value))}\n </Typography>\n );\n }\n\n return (\n <Typography variant=\"body2\" noWrap width=\"fit-content\">\n {fNumber(Number(value))}\n </Typography>\n );\n};\n\nexport default memo(NumberRenderer);\n","import { memo, ReactNode } from 'react';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\n\nimport CopyButton from 'components/CopyButton';\n\nimport { TextRendererProps } from './props';\n\nconst sanitizeHtml = (text: string): string => {\n const withoutTags = text.replace(/<[^>]*>/g, '');\n return withoutTags\n .replace(/ /g, ' ')\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .trim();\n};\n\nconst TextRenderer = ({\n value,\n showCopyButton = false,\n copyMessage = 'Copiado',\n}: TextRendererProps): ReactNode => {\n if (!value) return '-';\n\n const stringValue = String(value);\n const sanitizedValue = sanitizeHtml(stringValue);\n\n if (showCopyButton) {\n return (\n <Stack direction=\"row\" gap={1} alignItems=\"center\">\n <Typography variant=\"body2\" noWrap>\n {sanitizedValue}\n </Typography>\n <CopyButton toCopy={sanitizedValue} message={copyMessage} />\n </Stack>\n );\n }\n\n return sanitizedValue;\n};\n\nexport default memo(TextRenderer);\n","import { ReactNode } from 'react';\n\nimport { Field } from 'types/entityMetadata';\n\nimport { CURRENCY_FIELD_NAMES } from '../constants/columnDefaults';\nimport { CellRenderer, DynamicRowData } from '../props';\nimport {\n BooleanRenderer,\n DateRenderer,\n DateTimeRenderer,\n EntityRenderer,\n NumberRenderer,\n TextRenderer,\n} from '../renderers';\n\nfunction getIsCurrency(fieldName: string): boolean {\n return CURRENCY_FIELD_NAMES.includes(fieldName);\n}\n\nexport const createCellRenderer = <T extends object = object>(context: {\n onRowAction?: (rowId: string, row: DynamicRowData<T>) => ReactNode;\n}): CellRenderer<T> => {\n const { onRowAction } = context;\n\n const CellRendererComponent = (\n field: Field,\n row: DynamicRowData<T>,\n ): ReactNode => {\n const value = row[field.name];\n\n if (field.name === 'ACTIONS') {\n return onRowAction?.(row.id, row);\n }\n\n switch (field.type) {\n case 'BOOLEAN':\n return <BooleanRenderer value={value} />;\n\n case 'DATE':\n return <DateRenderer value={value} />;\n\n case 'DATETIME':\n return <DateTimeRenderer value={value} />;\n\n case 'DECIMAL':\n case 'INTEGER':\n return (\n <NumberRenderer\n value={value}\n isCurrency={getIsCurrency(field.name)}\n />\n );\n\n case 'FILE':\n case 'ENTITY':\n return <EntityRenderer value={value} field={field} />;\n case 'TEXT':\n default:\n return <TextRenderer value={value} />;\n }\n };\n\n CellRendererComponent.displayName = 'CellRendererComponent';\n return CellRendererComponent;\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/DynamicDataView/DynamicDataView.tsx","../../../src/components/DynamicDataView/hooks/useDynamicColumns.ts","../../../src/components/DynamicDataView/constants/columnDefaults.ts","../../../src/components/DynamicDataView/utils/columnStrategies.ts","../../../src/components/DynamicDataView/utils/addActionsField.ts","../../../src/components/DynamicDataView/renderers/BooleanRenderer.tsx","../../../src/components/DynamicDataView/renderers/DateRenderer.tsx","../../../src/components/DynamicDataView/renderers/DateTimeRenderer.tsx","../../../src/components/DynamicDataView/renderers/EntityRenderer.tsx","../../../src/components/DynamicDataView/renderers/IconRenderer.tsx","../../../src/components/DynamicDataView/renderers/NameRenderer.tsx","../../../src/components/DynamicDataView/renderers/NumberRenderer.tsx","../../../src/components/DynamicDataView/renderers/TextRenderer.tsx","../../../src/components/DynamicDataView/utils/createCellRenderer.tsx"],"names":["memo","useCallback","useMemo","COLUMN_DEFAULTS","ACCESS_TYPES","CURRENCY_FIELD_NAMES","createImageColumn","field","renderCell","params","createIdColumn","createEntityColumn","createDefaultColumn","createActionsColumn","getColumnStrategy","metadata","useDynamicColumns","columnStrategies","columnsMap","column","createActionsField","addActionsFieldToMetadata","jsx","BooleanRenderer","value","trueLabel","falseLabel","Label_default","BooleanRenderer_default","DateRenderer","format","fDate","DateRenderer_default","DateTimeRenderer","fDateTime","DateTimeRenderer_default","Chip","EntityRenderer","entityValue","EntityRenderer_default","IconRenderer","trueIcon","falseIcon","color","width","Icon_default","IconRenderer_default","Stack","Typography","jsxs","NameRenderer","id","displayName","copyMessage","CopyButton_default","NameRenderer_default","NumberRenderer","isCurrency","fCurrencyBRL","fNumber","NumberRenderer_default","sanitizeHtml","text","TextRenderer","showCopyButton","stringValue","sanitizedValue","TextRenderer_default","getIsCurrency","fieldName","createCellRenderer","context","onRowAction","CellRendererComponent","row","getColumnFieldIdFromField","DynamicDataView","title","data","isLoading","isFetching","page","perPage","searchValue","onSearchChange","onSearch","onPaginationChange","onAdd","onRowDoubleClick","actions","moreActions","hideHeader","slots","mobileRender","containerHeight","showColumnButton","defaultVisibleFieldNames","preferredFieldOrder","onColumnVisibilityModelChange","columnVisibilityStorageKey","rows","total","effectiveMetadata","columns","columnsByFieldId","hasStorageKey","storedVisibilityModel","setStoredVisibilityModel","useLocalStorage_default","orderedColumns","actionFieldName","preferredWithoutActions","usedColumnFieldIds","ordered","pushColumnForField","fieldItem","columnFieldId","initialState","visibilityModel","visible","stored","handleColumnVisibilityModelChange","model","handleRowDoubleClick","rowId","DataView_default","DynamicDataView_default"],"mappings":"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","sourcesContent":["import { memo, useCallback, useMemo } from 'react';\nimport { GridColumnVisibilityModel } from '@mui/x-data-grid-premium';\n\nimport useLocalStorage from 'hooks/useLocalStorage';\nimport { Field } from 'types/entityMetadata';\n\nimport DataView from '../DataView';\n\nimport { useDynamicColumns } from './hooks/useDynamicColumns';\nimport { addActionsFieldToMetadata } from './utils/addActionsField';\nimport { createCellRenderer } from './utils/createCellRenderer';\nimport { DynamicDataViewProps, DynamicRowData } from './props';\n\nfunction getColumnFieldIdFromField(field: Field): string {\n return field.name;\n}\n\nconst DynamicDataView = <T extends object = object>({\n title,\n metadata,\n data,\n isLoading,\n isFetching,\n page,\n perPage,\n searchValue,\n onSearchChange,\n onSearch,\n onPaginationChange,\n onAdd,\n onRowAction,\n onRowDoubleClick,\n actions,\n moreActions,\n hideHeader,\n slots,\n mobileRender,\n containerHeight = 600,\n showColumnButton = false,\n defaultVisibleFieldNames,\n preferredFieldOrder,\n columnStrategies,\n onColumnVisibilityModelChange,\n columnVisibilityStorageKey,\n}: DynamicDataViewProps<T>) => {\n const { items: rows = [], total = 0 } = data || {};\n\n const effectiveMetadata = useMemo(\n () => (onRowAction ? addActionsFieldToMetadata(metadata) : metadata),\n [metadata, onRowAction],\n );\n\n const renderCell = useMemo(\n () =>\n createCellRenderer<T>({\n onRowAction,\n }),\n [onRowAction],\n );\n\n const columns = useDynamicColumns<T>({\n metadata: effectiveMetadata,\n renderCell,\n columnStrategies,\n });\n\n const columnsByFieldId = useMemo(\n () => new Map(columns.map(column => [column.field, column])),\n [columns],\n );\n\n const hasStorageKey = Boolean(columnVisibilityStorageKey);\n\n const [storedVisibilityModel, setStoredVisibilityModel] = useLocalStorage<\n GridColumnVisibilityModel | undefined\n >(columnVisibilityStorageKey || '__dynamic-data-view:columns__', undefined, {\n initializeWithValue: hasStorageKey,\n });\n\n const orderedColumns = useMemo(() => {\n if (\n !preferredFieldOrder ||\n preferredFieldOrder.length === 0 ||\n !effectiveMetadata?.fields\n ) {\n return columns;\n }\n\n const actionFieldName = 'ACTIONS';\n const preferredWithoutActions = preferredFieldOrder.filter(\n fieldName => fieldName !== actionFieldName,\n );\n\n const usedColumnFieldIds = new Set<string>();\n const ordered: Array<(typeof columns)[number]> = [];\n\n const pushColumnForField = (fieldName: string) => {\n const field = effectiveMetadata.fields.find(\n fieldItem => fieldItem.name === fieldName,\n );\n\n if (!field) {\n return;\n }\n\n const columnFieldId = getColumnFieldIdFromField(field);\n const column = columnsByFieldId.get(columnFieldId);\n\n if (!column || usedColumnFieldIds.has(columnFieldId)) {\n return;\n }\n\n ordered.push(column);\n usedColumnFieldIds.add(columnFieldId);\n };\n\n preferredWithoutActions.forEach(fieldName => {\n pushColumnForField(fieldName);\n });\n\n effectiveMetadata.fields.forEach(field => {\n if (field.name === actionFieldName) {\n return;\n }\n\n if (preferredWithoutActions.includes(field.name)) {\n return;\n }\n\n const columnFieldId = getColumnFieldIdFromField(field);\n const column = columnsByFieldId.get(columnFieldId);\n\n if (!column || usedColumnFieldIds.has(columnFieldId)) {\n return;\n }\n\n ordered.push(column);\n usedColumnFieldIds.add(columnFieldId);\n });\n\n pushColumnForField(actionFieldName);\n\n if (ordered.length === 0) {\n return columns;\n }\n\n return ordered;\n }, [columns, columnsByFieldId, effectiveMetadata, preferredFieldOrder]);\n\n const initialState = useMemo(() => {\n if (!effectiveMetadata?.fields) {\n return undefined;\n }\n\n const visibilityModel: GridColumnVisibilityModel = {};\n\n effectiveMetadata.fields.forEach(field => {\n const columnFieldId = getColumnFieldIdFromField(field);\n\n if (!columnsByFieldId.has(columnFieldId)) {\n return;\n }\n\n let visible: boolean | undefined;\n\n if (hasStorageKey && storedVisibilityModel) {\n const stored = storedVisibilityModel[columnFieldId];\n if (typeof stored === 'boolean') {\n visible = stored;\n }\n }\n\n if (\n visible === undefined &&\n defaultVisibleFieldNames &&\n defaultVisibleFieldNames.length > 0\n ) {\n visible = defaultVisibleFieldNames.includes(field.name);\n }\n\n if (typeof visible === 'boolean') {\n visibilityModel[columnFieldId] = visible;\n }\n });\n\n if (Object.keys(visibilityModel).length === 0) {\n return undefined;\n }\n\n return {\n columns: {\n columnVisibilityModel: visibilityModel,\n },\n };\n }, [\n columnsByFieldId,\n defaultVisibleFieldNames,\n effectiveMetadata,\n hasStorageKey,\n storedVisibilityModel,\n ]);\n\n const handleColumnVisibilityModelChange = useCallback(\n (model: GridColumnVisibilityModel) => {\n if (hasStorageKey) {\n setStoredVisibilityModel(model);\n }\n\n if (onColumnVisibilityModelChange) {\n onColumnVisibilityModelChange(model);\n }\n },\n [hasStorageKey, onColumnVisibilityModelChange, setStoredVisibilityModel],\n );\n\n const handleRowDoubleClick = useCallback(\n (params: { id: string | number; row: DynamicRowData<T> }) => {\n if (!onRowDoubleClick) return;\n\n const rowId = params.id?.toString() || '';\n onRowDoubleClick(rowId, params.row);\n },\n [onRowDoubleClick],\n );\n\n return (\n <DataView\n title={title}\n columns={orderedColumns}\n rows={rows}\n mobileRender={mobileRender || (() => null)}\n rowCount={total}\n loading={isLoading}\n fetching={isFetching}\n searchValue={searchValue}\n onSearch={onSearch}\n onSearchChange={onSearchChange}\n paginationModel={{\n page,\n pageSize: perPage,\n }}\n onPaginationChange={onPaginationChange}\n actions={actions}\n moreActions={moreActions}\n onAdd={onAdd}\n hideHeader={hideHeader}\n onRowDoubleClick={onRowDoubleClick ? handleRowDoubleClick : undefined}\n disableRowSelectionOnClick\n slots={slots}\n initialState={initialState}\n showColumnButton={showColumnButton}\n containerProps={{\n height: containerHeight,\n maxHeight: containerHeight,\n }}\n onColumnVisibilityModelChange={handleColumnVisibilityModelChange}\n />\n );\n};\n\nexport default memo(DynamicDataView) as typeof DynamicDataView;\nexport type {\n DynamicDataViewProps,\n DynamicRowData,\n MobileRenderFunction,\n} from './props';\n","import { useMemo } from 'react';\nimport { GridColDef } from '@mui/x-data-grid-premium';\n\nimport { Columns } from 'types/datagrid';\nimport { EntityMetadataResponse } from 'types/entityMetadata';\n\nimport { ACCESS_TYPES } from '../constants/columnDefaults';\nimport { CellRenderer } from '../types/cellRenderer';\nimport { ColumnStrategy, getColumnStrategy } from '../utils/columnStrategies';\n\ninterface UseDynamicColumnsProps<T> {\n metadata?: EntityMetadataResponse;\n renderCell: CellRenderer<T>;\n columnStrategies?: {\n [fieldName: string]: ColumnStrategy<T>;\n };\n}\n\nexport const useDynamicColumns = <T extends object>({\n metadata,\n renderCell,\n columnStrategies,\n}: UseDynamicColumnsProps<T>): Columns => {\n return useMemo(() => {\n if (!metadata?.fields) return [];\n\n const columnsMap = new Map<string, GridColDef>();\n\n const visibleFields = metadata.fields.filter(field => {\n if (\n field.access_type === ACCESS_TYPES.READ_ONLY ||\n field.access_type === ACCESS_TYPES.READ_AND_WRITE\n ) {\n return true;\n }\n\n return (\n field.name === 'ACTIONS' ||\n field.name === metadata?.id_field_name ||\n field.name === 'NAME'\n );\n });\n\n visibleFields.forEach(field => {\n if (columnsMap.has(field.name)) {\n return;\n }\n\n const strategy =\n columnStrategies?.[field.name] ?? getColumnStrategy<T>(field, metadata);\n const column = strategy(field, renderCell, metadata);\n\n columnsMap.set(field.name, column);\n });\n\n return Array.from(columnsMap.values());\n }, [columnStrategies, metadata, renderCell]);\n};\n","export const COLUMN_DEFAULTS = {\n IMAGE_WIDTH: 90,\n MIN_WIDTH: 130,\n ENTITY_MIN_WIDTH: 100,\n ENTITY_FLEX: 0.5,\n ID_MIN_WIDTH: 200,\n ID_FLEX: 1,\n ACTIONS_WIDTH: 80,\n} as const;\n\nexport const ACCESS_TYPES = {\n READ_ONLY: 'READ_ONLY',\n READ_AND_WRITE: 'READ_AND_WRITE',\n} as const;\n\nexport const CURRENCY_FIELD_NAMES: readonly string[] = [\n 'price',\n 'base_price',\n 'minimum_value',\n 'maximum_value',\n 'minimum_installment_value',\n];\n","import { GridColDef, GridRenderCellParams } from '@mui/x-data-grid-premium';\n\nimport { Field } from 'types/entityMetadata';\n\nimport { COLUMN_DEFAULTS } from '../constants/columnDefaults';\nimport { CellRenderer, DynamicRowData } from '../types/cellRenderer';\n\nexport type ColumnStrategy<T = object> = (\n field: Field,\n renderCell: CellRenderer<T>,\n metadata?: { id_field_name?: string },\n) => GridColDef;\n\nconst createImageColumn = <T extends object>(\n field: Field,\n renderCell: CellRenderer<T>,\n): GridColDef => ({\n field: field.name,\n headerName: field.description,\n sortable: false,\n width: COLUMN_DEFAULTS.IMAGE_WIDTH,\n resizable: false,\n renderCell: (params: GridRenderCellParams) =>\n renderCell(field, params.row as DynamicRowData<T>),\n});\n\nconst createIdColumn = <T extends object>(\n field: Field,\n renderCell: CellRenderer<T>,\n): GridColDef => ({\n field: field.name,\n headerName: field.description,\n minWidth: COLUMN_DEFAULTS.ID_MIN_WIDTH,\n flex: COLUMN_DEFAULTS.ID_FLEX,\n renderCell: (params: GridRenderCellParams) =>\n renderCell(field, params.row as DynamicRowData<T>),\n});\n\nconst createEntityColumn = <T extends object>(\n field: Field,\n renderCell: CellRenderer<T>,\n): GridColDef => ({\n field: field.name,\n headerName: field.description,\n minWidth: COLUMN_DEFAULTS.ENTITY_MIN_WIDTH,\n flex: COLUMN_DEFAULTS.ENTITY_FLEX,\n renderCell: (params: GridRenderCellParams) =>\n renderCell(field, params.row as DynamicRowData<T>),\n});\n\nconst createDefaultColumn = <T extends object>(\n field: Field,\n renderCell: CellRenderer<T>,\n): GridColDef => ({\n field: field.name,\n headerName: field.description,\n minWidth: COLUMN_DEFAULTS.MIN_WIDTH,\n renderCell: (params: GridRenderCellParams) =>\n renderCell(field, params.row as DynamicRowData<T>),\n});\n\nconst createActionsColumn = <T extends object>(\n field: Field,\n renderCell: CellRenderer<T>,\n): GridColDef => ({\n field: field.name,\n headerName: 'Ações',\n width: COLUMN_DEFAULTS.ACTIONS_WIDTH,\n sortable: false,\n resizable: false,\n disableReorder: true,\n headerAlign: 'center',\n disableColumnMenu: true,\n align: 'center',\n renderCell: (params: GridRenderCellParams) =>\n renderCell(field, params.row as DynamicRowData<T>),\n});\n\nexport const getColumnStrategy = <T extends object>(\n field: Field,\n metadata?: { id_field_name?: string },\n): ColumnStrategy<T> => {\n if (field.name === metadata?.id_field_name || field.name === 'name') {\n return createIdColumn;\n }\n\n if (field.name === 'ACTIONS') {\n return createActionsColumn;\n }\n\n if (field.type === 'FILE') {\n return createImageColumn;\n }\n\n if (field.type === 'ENTITY') {\n return createEntityColumn;\n }\n\n return createDefaultColumn;\n};\n","import { EntityMetadataResponse, Field } from 'types/entityMetadata';\n\nexport const createActionsField = (): Field => ({\n name: 'ACTIONS',\n description: '',\n filter_field_name: null,\n type: 'TEXT',\n metadata: null,\n access_type: 'READ_ONLY',\n relation_field_name: null,\n available_filter_conditions: [],\n});\n\nexport const addActionsFieldToMetadata = (\n metadata: EntityMetadataResponse,\n): EntityMetadataResponse => {\n const hasActionsField = metadata.fields.some(\n field => field.name === 'ACTIONS',\n );\n\n if (hasActionsField) {\n return metadata;\n }\n\n return {\n ...metadata,\n fields: [...metadata.fields, createActionsField()],\n };\n};\n","import { memo, ReactNode } from 'react';\n\nimport Label from '../../Label';\n\nimport { BooleanRendererProps } from './props';\n\nconst BooleanRenderer = ({\n value,\n trueLabel = 'Ativo',\n falseLabel = 'Inativo',\n}: BooleanRendererProps): ReactNode => {\n return (\n <Label color={value ? 'success' : 'warning'}>\n {value ? trueLabel : falseLabel}\n </Label>\n );\n};\n\nexport default memo(BooleanRenderer);\n","import { memo, ReactNode } from 'react';\n\nimport { DatePickerFormat, fDate } from 'utils/formatTime';\n\nexport interface DateRendererProps {\n value: unknown;\n format?: string;\n}\n\nconst DateRenderer = ({ value, format }: DateRendererProps): ReactNode => {\n if (value === null || value === undefined) return '-';\n\n return fDate(value as DatePickerFormat, format);\n};\n\nexport default memo(DateRenderer);\n","import { memo, ReactNode } from 'react';\n\nimport { DatePickerFormat, fDateTime } from 'utils/formatTime';\n\nexport interface DateTimeRendererProps {\n value: unknown;\n format?: string;\n}\n\nconst DateTimeRenderer = ({\n value,\n format,\n}: DateTimeRendererProps): ReactNode => {\n if (value === null || value === undefined) return '-';\n\n return fDateTime(value as DatePickerFormat, format);\n};\n\nexport default memo(DateTimeRenderer);\n","import { memo, ReactNode } from 'react';\nimport Chip from '@mui/material/Chip';\n\nimport { EntityRendererProps } from './props';\n\nconst EntityRenderer = ({ value, field }: EntityRendererProps): ReactNode => {\n if (!field.metadata || typeof value !== 'object' || value === null) {\n return value ? String(value) : '-';\n }\n\n const entityValue = (value as Record<string, unknown>)[\n field.metadata.description_field_name\n ];\n\n if (!entityValue) return null;\n\n return (\n <Chip\n label={String(entityValue)}\n variant=\"outlined\"\n size=\"small\"\n sx={{\n width: 'fit-content',\n color: 'text.secondary',\n borderColor: 'divider',\n borderRadius: 3,\n }}\n />\n );\n};\n\nexport default memo(EntityRenderer);\n","import { memo, ReactNode } from 'react';\n\nimport Icon, { IconEnum } from '../../Icon';\n\nimport { IconRendererProps } from './props';\n\nconst IconRenderer = ({\n value,\n trueIcon = IconEnum.STAR_02,\n falseIcon = IconEnum.STAR,\n color = 'primary.main',\n width = 18,\n}: IconRendererProps): ReactNode => {\n return (\n <Icon icon={value ? trueIcon : falseIcon} color={color} width={width} />\n );\n};\n\nexport default memo(IconRenderer);\n","import { memo, ReactNode } from 'react';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\n\nimport CopyButton from 'components/CopyButton';\n\nimport { NameRendererProps } from './props';\n\nconst NameRenderer = ({\n id,\n displayName,\n copyMessage = 'ID copiado!',\n}: NameRendererProps): ReactNode => {\n return (\n <Stack height={1} justifyContent=\"center\">\n <Typography variant=\"subtitle2\" noWrap title={displayName}>\n {displayName}\n </Typography>\n <Stack direction=\"row\" gap={1} alignItems=\"center\">\n <Typography color=\"grey.600\" variant=\"body2\" noWrap>\n ID: {id}\n </Typography>\n <CopyButton toCopy={id} message={copyMessage} />\n </Stack>\n </Stack>\n );\n};\n\nexport default memo(NameRenderer);\n","import { memo, ReactNode } from 'react';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\n\nimport { fCurrencyBRL, fNumber } from 'utils/formatNumber';\n\nimport { NumberRendererProps } from './props';\n\nconst NumberRenderer = ({\n value,\n isCurrency = false,\n}: NumberRendererProps): ReactNode => {\n if (value === null || value === undefined) return '-';\n\n return (\n <Stack direction=\"row\" alignItems=\"center\" height=\"100%\">\n <Typography variant=\"body2\" noWrap width=\"fit-content\">\n {isCurrency ? fCurrencyBRL(Number(value)) : fNumber(Number(value))}\n </Typography>\n </Stack>\n );\n};\n\nexport default memo(NumberRenderer);\n","import { memo, ReactNode } from 'react';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\n\nimport CopyButton from 'components/CopyButton';\n\nimport { TextRendererProps } from './props';\n\nconst sanitizeHtml = (text: string): string => {\n const withoutTags = text.replace(/<[^>]*>/g, '');\n return withoutTags\n .replace(/ /g, ' ')\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .trim();\n};\n\nconst TextRenderer = ({\n value,\n showCopyButton = false,\n copyMessage = 'Copiado',\n}: TextRendererProps): ReactNode => {\n if (!value) return '-';\n\n const stringValue = String(value);\n const sanitizedValue = sanitizeHtml(stringValue);\n\n if (showCopyButton) {\n return (\n <Stack direction=\"row\" gap={1} alignItems=\"center\">\n <Typography variant=\"body2\" noWrap>\n {sanitizedValue}\n </Typography>\n <CopyButton toCopy={sanitizedValue} message={copyMessage} />\n </Stack>\n );\n }\n\n return sanitizedValue;\n};\n\nexport default memo(TextRenderer);\n","import { ReactNode } from 'react';\n\nimport { Field } from 'types/entityMetadata';\n\nimport { CURRENCY_FIELD_NAMES } from '../constants/columnDefaults';\nimport { CellRenderer, DynamicRowData } from '../props';\nimport {\n BooleanRenderer,\n DateRenderer,\n DateTimeRenderer,\n EntityRenderer,\n NumberRenderer,\n TextRenderer,\n} from '../renderers';\n\nfunction getIsCurrency(fieldName: string): boolean {\n return CURRENCY_FIELD_NAMES.includes(fieldName);\n}\n\nexport const createCellRenderer = <T extends object = object>(context: {\n onRowAction?: (rowId: string, row: DynamicRowData<T>) => ReactNode;\n}): CellRenderer<T> => {\n const { onRowAction } = context;\n\n const CellRendererComponent = (\n field: Field,\n row: DynamicRowData<T>,\n ): ReactNode => {\n const value = row[field.name];\n\n if (field.name === 'ACTIONS') {\n return onRowAction?.(row.id, row);\n }\n\n switch (field.type) {\n case 'BOOLEAN':\n return <BooleanRenderer value={value} />;\n\n case 'DATE':\n return <DateRenderer value={value} />;\n\n case 'DATETIME':\n return <DateTimeRenderer value={value} />;\n\n case 'DECIMAL':\n case 'INTEGER':\n return (\n <NumberRenderer\n value={value}\n isCurrency={getIsCurrency(field.name)}\n />\n );\n\n case 'FILE':\n case 'ENTITY':\n return <EntityRenderer value={value} field={field} />;\n case 'TEXT':\n default:\n return <TextRenderer value={value} />;\n }\n };\n\n CellRendererComponent.displayName = 'CellRendererComponent';\n return CellRendererComponent;\n};\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export { a as default } from '../../chunk-
|
|
2
|
-
import '../../chunk-
|
|
1
|
+
export { a as default } from '../../chunk-ZFRNMT3P.js';
|
|
2
|
+
import '../../chunk-RFRLNTFN.js';
|
|
3
3
|
import '../../chunk-KGLU4CR2.js';
|
|
4
|
-
import '../../chunk-
|
|
4
|
+
import '../../chunk-NQNNMRLC.js';
|
|
5
5
|
import '../../chunk-CIGSMWKF.js';
|
|
6
6
|
import '../../chunk-RPO7AI5K.js';
|
|
7
7
|
//# sourceMappingURL=out.js.map
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { a as a$1 } from '../../chunk-
|
|
1
|
+
import { a as a$1 } from '../../chunk-NQNNMRLC.js';
|
|
2
2
|
import '../../chunk-CIGSMWKF.js';
|
|
3
3
|
import { a } from '../../chunk-E3R7W7GK.js';
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import
|
|
4
|
+
import m from '@mui/material/IconButton';
|
|
5
|
+
import i from '@mui/material/Stack';
|
|
6
|
+
import s from '@mui/material/Typography';
|
|
7
|
+
import T from '@mui/material/Collapse';
|
|
8
8
|
import { styled, alpha } from '@mui/material/styles';
|
|
9
9
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
10
10
|
|
|
11
|
-
var
|
|
11
|
+
var l=styled(i)(({theme:r})=>({border:`1px solid ${r.palette.divider}`,borderRadius:8,alignItems:"center",overflow:"hidden"})),d=styled(i)(({theme:r})=>({backgroundColor:alpha(r.palette.grey[500],.1),padding:8,width:"100%",justifyContent:"space-between",alignItems:"center",gap:12,"& .MuiInputBase-root":{backgroundColor:r.palette.background.paper}})),c=styled(T)({width:"100%",padding:"12px 16px"});var G=({description:r,name:g,children:C,header:f,onDelete:x})=>{let[t,E]=a(!0);return jsxs(l,{children:[jsxs(d,{direction:"row",children:[jsxs(i,{direction:"row",alignItems:"center",gap:1.5,flex:1,children:[jsx(m,{edge:"end",onClick:E,children:jsx(a$1,{icon:t?"CHEVRON_UP":"CHEVRON_RIGHT","data-testid":t?"CHEVRON_UP":"CHEVRON_RIGHT"})}),jsx(s,{variant:"overline",color:"text.primary",children:g}),jsx(s,{variant:"overline",color:"text.secondary",children:r}),jsx(i,{flex:1,children:f})]}),jsx(m,{color:"error",onClick:x,children:jsx(a$1,{icon:"DELETE_MARK_BUTTON_02"})})]}),jsx(c,{in:t,timeout:"auto",unmountOnExit:!0,children:C})]})},P=G;
|
|
12
12
|
|
|
13
|
-
export {
|
|
13
|
+
export { P as default };
|
|
14
14
|
//# sourceMappingURL=out.js.map
|
|
15
15
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/ExpandableGroup/index.tsx","../../../src/components/ExpandableGroup/styles.ts"],"names":["IconButton","Stack","Typography","Collapse","alpha","styled","Container","theme","GroupTop","
|
|
1
|
+
{"version":3,"sources":["../../../src/components/ExpandableGroup/index.tsx","../../../src/components/ExpandableGroup/styles.ts"],"names":["IconButton","Stack","Typography","Collapse","alpha","styled","Container","theme","GroupTop","CollapseGroup","jsx","jsxs","ExpandableGroup","description","name","children","header","onDelete","expanded","toggleExpanded","useToggle_default","Icon_default","ExpandableGroup_default"],"mappings":"mHACA,OAAOA,MAAgB,2BACvB,OAAOC,MAAW,sBAClB,OAAOC,MAAgB,2BCHvB,OAAOC,MAAc,yBACrB,OAAOF,MAAW,sBAClB,OAAS,SAAAG,EAAO,UAAAC,MAAc,uBAEvB,IAAMC,EAAYD,EAAOJ,CAAK,EAAE,CAAC,CAAE,MAAAM,CAAM,KAAO,CACrD,OAAQ,aAAaA,EAAM,QAAQ,UACnC,aAAc,EACd,WAAY,SACZ,SAAU,QACZ,EAAE,EAEWC,EAAWH,EAAOJ,CAAK,EAAE,CAAC,CAAE,MAAAM,CAAM,KAAO,CACpD,gBAAiBH,EAAMG,EAAM,QAAQ,KAAK,GAAG,EAAG,EAAG,EACnD,QAAS,EACT,MAAO,OACP,eAAgB,gBAChB,WAAY,SACZ,IAAK,GAEL,uBAAwB,CACtB,gBAAiBA,EAAM,QAAQ,WAAW,KAC5C,CACF,EAAE,EAEWE,EAAgBJ,EAAOF,CAAQ,EAAE,CAC5C,MAAO,OACP,QAAS,WACX,CAAC,EDHO,OAEI,OAAAO,EAFJ,QAAAC,MAAA,oBAZR,IAAMC,EAAkB,CAAC,CACvB,YAAAC,EACA,KAAAC,EACA,SAAAC,EACA,OAAAC,EACA,SAAAC,CACF,IAA+C,CAC7C,GAAM,CAACC,EAAUC,CAAc,EAAIC,EAAU,EAAI,EAEjD,OACET,EAACL,EAAA,CACC,UAAAK,EAACH,EAAA,CAAS,UAAU,MAClB,UAAAG,EAACV,EAAA,CAAM,UAAU,MAAM,WAAW,SAAS,IAAK,IAAK,KAAM,EACzD,UAAAS,EAACV,EAAA,CAAW,KAAK,MAAM,QAASmB,EAC9B,SAAAT,EAACW,EAAA,CACC,KAAMH,EAAW,aAAe,gBAChC,cAAaA,EAAW,aAAe,gBACzC,EACF,EAEAR,EAACR,EAAA,CAAW,QAAQ,WAAW,MAAM,eAClC,SAAAY,EACH,EAEAJ,EAACR,EAAA,CAAW,QAAQ,WAAW,MAAM,iBAClC,SAAAW,EACH,EAEAH,EAACT,EAAA,CAAM,KAAM,EAAI,SAAAe,EAAO,GAC1B,EACAN,EAACV,EAAA,CAAW,MAAM,QAAQ,QAASiB,EACjC,SAAAP,EAACW,EAAA,CAAK,KAAK,wBAAwB,EACrC,GACF,EAEAX,EAACD,EAAA,CAAc,GAAIS,EAAU,QAAQ,OAAO,cAAa,GACtD,SAAAH,EACH,GACF,CAEJ,EAEOO,EAAQV","sourcesContent":["import { PropsWithChildren } from 'react';\nimport IconButton from '@mui/material/IconButton';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\n\nimport useToggle from 'hooks/useToggle';\n\nimport Icon from '../Icon';\n\nimport { ExpandableGroupProps } from './props';\nimport { CollapseGroup, Container, GroupTop } from './styles';\n\nconst ExpandableGroup = ({\n description,\n name,\n children,\n header,\n onDelete,\n}: PropsWithChildren<ExpandableGroupProps>) => {\n const [expanded, toggleExpanded] = useToggle(true);\n\n return (\n <Container>\n <GroupTop direction=\"row\">\n <Stack direction=\"row\" alignItems=\"center\" gap={1.5} flex={1}>\n <IconButton edge=\"end\" onClick={toggleExpanded}>\n <Icon\n icon={expanded ? 'CHEVRON_UP' : 'CHEVRON_RIGHT'}\n data-testid={expanded ? 'CHEVRON_UP' : 'CHEVRON_RIGHT'}\n />\n </IconButton>\n\n <Typography variant=\"overline\" color=\"text.primary\">\n {name}\n </Typography>\n\n <Typography variant=\"overline\" color=\"text.secondary\">\n {description}\n </Typography>\n\n <Stack flex={1}>{header}</Stack>\n </Stack>\n <IconButton color=\"error\" onClick={onDelete}>\n <Icon icon=\"DELETE_MARK_BUTTON_02\" />\n </IconButton>\n </GroupTop>\n\n <CollapseGroup in={expanded} timeout=\"auto\" unmountOnExit>\n {children}\n </CollapseGroup>\n </Container>\n );\n};\n\nexport default ExpandableGroup;\n","import Collapse from '@mui/material/Collapse';\nimport Stack from '@mui/material/Stack';\nimport { alpha, styled } from '@mui/material/styles';\n\nexport const Container = styled(Stack)(({ theme }) => ({\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: 8,\n alignItems: 'center',\n overflow: 'hidden',\n}));\n\nexport const GroupTop = styled(Stack)(({ theme }) => ({\n backgroundColor: alpha(theme.palette.grey[500], 0.1),\n padding: 8,\n width: '100%',\n justifyContent: 'space-between',\n alignItems: 'center',\n gap: 12,\n\n '& .MuiInputBase-root': {\n backgroundColor: theme.palette.background.paper,\n },\n}));\n\nexport const CollapseGroup = styled(Collapse)({\n width: '100%',\n padding: '12px 16px',\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/FieldMentions/index.tsx","../../../src/components/FieldMentions/Highlighter/index.tsx","../../../src/components/FieldMentions/Mention/index.tsx","../../../src/components/FieldMentions/utils.ts","../../../src/components/FieldMentions/SuggestionOverlay/index.tsx","../../../src/components/FieldMentions/SuggestionOverlay/Suggestion/index.tsx"],"names":["useEffect","useRef","useState","TextField","Box","Portal","jsx","Mention","display","color","backgroundColor","Mention_default","invariant","isNumber","val","combineRegExps","regExps","serializedRegexParser","regex","regexString","regexFlags","countPlaceholders","markup","count","findIndexOfCapturingGroup","parameterName","indexDisplay","indexId","iterateMentionsMarkup","value","dataSources","markupProcessor","plainTextProcessor","multiline","ds","verifyCapturingGroups","DefaultMarkupTemplate","markupToRegex","accOffset","captureGroupOffsets","result","match","start","currentPlainTextIndex","offset","o","mentionChildIndex","displayTransform","idPos","displayPos","id","DefaultDisplayTransform","substr","getPlainText","_match","_index","_plainTextIndex","_id","plainText","numberOfGroups","numberOfPlaceholders","escapedMarkup","escapeRegex","charAfterDisplay","charAfterId","str","applyChangeToValue","plainTextValue","selectionStartBefore","selectionEndBefore","selectionEndAfter","oldPlainTextValue","lengthDelta","insert","spliceStart","spliceEnd","mappedSpliceStart","mapPlainTextIndex","mappedSpliceEnd","controlSpliceStart","controlSpliceEnd","willRemoveMention","newValue","spliceString","controlPlainTextValue","indexInPlainText","inMarkupCorrection","index","mentionPlainTextIndex","substrPlainTextIndex","end","findStartOfMentionInPlainText","_markup","getMentions","mentions","plainTextIndex","childIndex","countSuggestions","suggestions","acc","results","getEndOfLastMention","lastMention","makeTriggerRegex","trigger","allowSpaceInQuery","escapedTriggerChar","getDataProvider","data","ignoreAccents","query","i","getSubstringIndex","normalizeString","removeAccents","formattedStr","diacritics_default","letterDiacritics","makeMentionsMarkup","jsxs","getHighlighterRect","input","rec","computedStyle","Highlighter","props","highlighterRef","cursorRef","selectionEnd","selectionStart","components","dataSourceIndex","dataSource","text","indexInPlaintext","theme","splitIndex","startText","endText","rect","Highlighter_default","useCallback","useMemo","CircularProgress","List","Paper","Popper","Stack","ListItemButton","Suggestion","renderSuggestion","suggestion","focused","onClick","onMouseEnter","Suggestion_default","Fragment","SuggestionsOverlay","onSelect","onMouseDown","ulElement","setSuggestions","focusIndex","setFocusIndex","scrollFocusedIntoView","setScrollFocusedIntoView","loading","setLoading","current","scrollTop","top","bottom","topContainer","queryDataSource","source","sourceIndex","querySequenceStart","querySequenceEnd","fullText","dataProvider","s","err","dataSourcesRef","currentDataSources","positionInValue","substringStartIndex","substring","DefaultTrigger","clearSuggestions","handleSelect","queryInfo","handleMouseEnter","renderedSuggestions","accResults","KeyboardListener","SuggestionOverlay_default","shiftFocus","delta","suggestionsCount","selectFocused","handleKeyDown","ev","FieldMentions","stateValue","setStateValue","inputRef","setInputRef","suggestionsMouseDown","setSelectionStart","setSelectionEnd","handleInputRef","ref","externalInputRef","onScroll","others","finalValue","handleBlur","handleSuggestionsMouseDown","addMention","appendSpaceOnAdd","onAdd","displayValue","newCaretPosition","newPlainTextValue","handleChange","selectionStartAfter","startOfMention","inputProps","FieldMentions_default"],"mappings":"wGACA,OAA2B,aAAAA,GAAW,UAAAC,EAAQ,YAAAC,MAAgB,QAE9D,OAAOC,OAAmC,0BCF1C,OAAOC,MAAS,oBAChB,OAAOC,OAAY,uBCFnB,OAAOD,OAAS,oBAMZ,cAAAE,OAAA,oBAFJ,IAAMC,GAAU,CAAC,CAAE,QAAAC,EAAS,MAAAC,EAAO,gBAAAC,CAAgB,IAE/CJ,GAACF,GAAA,CACC,UAAU,OACV,GAAI,CACF,MAAOK,GAAS,UAChB,QAASC,CACX,EAEC,SAAAF,EACH,EAIGG,GAAQJ,GCjBf,OAAOK,MAAe,YAkBf,SAASC,EAASC,EAAyB,CAChD,OAAO,OAAOA,GAAQ,QACxB,CAEA,SAASC,GAAeC,EAA2B,CACjD,IAAMC,EAAwB,mBAC9B,OAAO,IAAI,OACTD,EACG,IAAIE,GAAS,CACZ,GAAM,CAAC,CAAEC,EAAaC,CAAU,EAC9BH,EAAsB,KAAKC,EAAM,SAAS,CAAC,GAAK,CAAC,EAEnD,OAAAN,EACE,CAACQ,EACD,2CAA2CD,KAAeC,WAAoBD,IAChF,EAEO,IAAIA,IACb,CAAC,EACA,KAAK,GAAG,EACX,GACF,CACF,CAEA,SAASE,GAAkBC,EAAwB,CACjD,IAAIC,EAAQ,EACZ,OAAID,EAAO,QAAQ,QAAe,GAAK,GAAGC,IACtCD,EAAO,QAAQ,aAAoB,GAAK,GAAGC,IACxCA,CACT,CAEA,SAASC,GACPF,EACAG,EACQ,CACRb,EACEa,IAAkB,MAAQA,IAAkB,UAC5C,sDAAsDA,IACxD,EAEA,IAAMC,EAAeJ,EAAO,QAAQ,aAAoB,EAClDK,EAAUL,EAAO,QAAQ,QAAe,EAO9C,OALAV,EACEc,GAAgB,GAAKC,GAAW,EAChC,eAAeL,gFACjB,EAEII,GAAgB,GAAKC,GAAW,EAC1BF,IAAkB,MAAQE,GAAWD,GAC1CD,IAAkB,WAAaC,GAAgBC,EAC9C,EACA,EAGC,CACT,CAEO,SAASC,EACdC,EACAC,EACAC,EASAC,EAKAC,EACA,CACA,IAAMf,EAAQH,GACZe,EAAY,IAAII,GACdA,EAAG,MACCC,GAAsBD,EAAG,MAAOA,EAAG,QAAUE,CAAqB,EAClEC,GAAcH,EAAG,QAAUE,CAAqB,CACtD,CACF,EAEIE,EAAY,EACVC,EAAsBT,EAAY,IAAI,CAAC,CAAE,OAAAR,CAAO,IAAM,CAC1D,IAAMkB,EAASF,EACf,OAAAA,GAAajB,GAAkBC,GAAUc,CAAqB,EAAI,EAC3DI,CACT,CAAC,EAEGC,EACAC,EAAQ,EACRC,EAAwB,EAE5B,MAAQF,EAAQvB,EAAM,KAAKW,CAAK,KAAO,MAAM,CAC3C,IAAMe,EAASL,EAAoB,KAAKM,GAAK,CAAC,CAACJ,IAAQI,CAAC,CAAC,EACzD,GAAID,IAAW,OACb,SAGF,IAAME,EAAoBP,EAAoB,QAAQK,CAAM,EACtD,CAAE,OAAAtB,EAAQ,iBAAAyB,CAAiB,EAAIjB,EAAYgB,CAAiB,EAC5DE,EACJJ,EAASpB,GAA0BF,GAAUc,EAAuB,IAAI,EACpEa,EACJL,EACApB,GAA0BF,GAAUc,EAAuB,SAAS,EAEhEc,EAAKT,EAAMO,CAAK,EAChBxC,EAAUuC,EACZA,EAAiBG,EAAIT,EAAMQ,CAAU,CAAC,EACtCE,EAAwBD,EAAIT,EAAMQ,CAAU,EAAGhB,CAAS,EAEtDmB,EAASvB,EAAM,UAAUa,EAAOD,EAAM,KAAK,EACjDT,IAAqBoB,EAAQV,EAAOC,CAAqB,EACzDA,GAAyBS,EAAO,OAEhCrB,EACEU,EAAM,CAAC,EACPA,EAAM,MACNE,EACAO,EACA1C,EACAsC,EACAJ,CACF,EACAC,GAAyBnC,EAAQ,OACjCkC,EAAQxB,EAAM,UAGZwB,EAAQb,EAAM,QAChBG,IAAqBH,EAAM,UAAUa,CAAK,EAAGA,EAAOC,CAAqB,CAE7E,CAEO,SAASU,EACdxB,EACAC,EACAG,EACQ,CACR,IAAIO,EAAS,GACb,OAAAZ,EACEC,EACAC,EACA,CAACwB,EAAQC,EAAQC,EAAiBC,EAAKjD,IAAY,CACjDgC,GAAUhC,CACZ,EACAkD,GAAa,CACXlB,GAAUkB,CACZ,EACAzB,CACF,EACOO,CACT,CAEA,IAAML,GAAwB,CAACjB,EAAeI,IAAmB,CAC/D,IAAMqC,GACH,IAAI,OAAOzC,EAAM,SAAS,EAAI,GAAG,EAAE,KAAK,EAAE,GAAG,QAAU,GAAK,EACzD0C,EAAuBvC,GAAkBC,CAAM,EAErD,OAAAV,EACE+C,IAAmBC,EACnB,wCAAwC1C,EAAM,SAAS,MAAMyC,+DAA4ErC,OAAYsC,IACvJ,EAEO1C,CACT,EAEMmB,GAAiBf,GAAmB,CACxC,IAAMuC,EAAgBC,EAAYxC,CAAM,EAElCyC,EACJzC,EAAOA,EAAO,QAAQ,aAAoB,EAAI,EAA2B,EACrE0C,EACJ1C,EAAOA,EAAO,QAAQ,QAAe,EAAI,CAAsB,EAEjE,OAAO,IAAI,OACTuC,EACG,QACC,cACA,MAAMC,EAAYC,GAAoB,EAAE,OAC1C,EACC,QAAQ,SAAiB,MAAMD,EAAYE,GAAe,EAAE,OAAO,CACxE,CACF,EAEMF,EAAeG,GACnBA,EAAI,QAAQ,2BAA4B,MAAM,EAEzC,SAASC,GACdrC,EACAsC,EACAC,EACAC,EACAC,EACAxC,EACAG,EACA,CACA,IAAMsC,EAAoBlB,EAAaxB,EAAOC,EAAaG,CAAS,EAE9DuC,EAAcD,EAAkB,OAASJ,EAAe,OAC1DC,IAAyB,OAC3BA,EAAuBE,EAAoBE,GAGzCH,IAAuB,OACzBA,EAAqBD,GAIrBA,IAAyBC,GACzBA,IAAuBC,GACvBC,EAAkB,SAAWJ,EAAe,SAE5CC,EAAuBA,EAAuB,GAGhD,IAAIK,EAASN,EAAe,MAAMC,EAAsBE,CAAiB,EAErEI,EAAc,KAAK,IAAIN,EAAsBE,CAAiB,EAE9DK,EAAYN,EACZD,IAAyBE,IAC3BK,EAAY,KAAK,IACfN,EACAD,EAAuBI,CACzB,GAGF,IAAII,EAAoBC,EACtBhD,EACAC,EACA4C,EACA,OACF,EACII,EAAkBD,EAAkBhD,EAAOC,EAAa6C,EAAW,KAAK,EAEtEI,EAAqBF,EACzBhD,EACAC,EACA4C,EACA,MACF,EACMM,EAAmBH,EACvBhD,EACAC,EACA6C,EACA,MACF,EACMM,EACJF,IAAuB,MAAQC,IAAqB,KAElDE,EAAWC,EACbtD,EACA+C,GAAqB,EACrBE,GAAmB,EACnBL,CACF,EAEA,GAAI,CAACQ,EAAmB,CACtB,IAAMG,EAAwB/B,EAC5B6B,EACApD,EACAG,CACF,EACA,GAAImD,IAA0BjB,EAAgB,CAE5C,IADAO,EAAc,EACPP,EAAeO,CAAW,IAAMU,EAAsBV,CAAW,GACtEA,IAEFD,EAASN,EAAe,MAAMO,EAAaJ,CAAiB,EAE5DK,EAAYJ,EAAkB,YAC5BJ,EAAe,UAAUG,CAAiB,CAC5C,EAEAM,EAAoBC,EAClBhD,EACAC,EACA4C,EACA,OACF,EACAI,EAAkBD,EAAkBhD,EAAOC,EAAa6C,EAAW,KAAK,EACxEO,EAAWC,EACTtD,EACA+C,GAAqB,EACrBE,GAAmB,EACnBL,CACF,GAIJ,OAAOS,CACT,CAEO,SAASL,EACdhD,EACAC,EACAuD,EACAC,EAA+C,QACpB,CAC3B,GAAI,OAAOD,GAAqB,SAC9B,OAAOA,EAGT,IAAI7C,EAgCJ,OAAAZ,EACEC,EACAC,EApBsB,CACtBR,EACAiE,EACAC,EACA/B,EACAjD,IACG,CACCgC,IAAW,QAEXgD,EAAwBhF,EAAQ,OAAS6E,IACvCC,IAAuB,OACzB9C,EAAS,KAETA,EAAS+C,GAASD,IAAuB,MAAQhE,EAAO,OAAS,GAGvE,EA5B2B,CACzB8B,EACAmC,EACAE,IACG,CACCjD,IAAW,QAEXiD,EAAuBrC,EAAO,QAAUiC,IAC1C7C,EAAS+C,EAAQF,EAAmBI,EAExC,CAyBA,EAEOjD,IAAW,OAAYX,EAAM,OAASW,CAC/C,CAEO,SAAS2C,EACdlB,EACAvB,EACAgD,EACAjB,EACQ,CACR,OAAOR,EAAI,UAAU,EAAGvB,CAAK,EAAI+B,EAASR,EAAI,UAAUyB,CAAG,CAC7D,CAEO,SAASC,GACd9D,EACAC,EACAuD,EACoB,CACpB,IAAI7C,EAiBJ,OAAAZ,EAAsBC,EAAOC,EAfL,CACtB8D,EACArC,EACAiC,EACA/B,EACAjD,IACG,CAEDgF,GAAyBH,GACzBG,EAAwBhF,EAAQ,OAAS6E,IAEzC7C,EAASgD,EAEb,CAEyD,EAClDhD,CACT,CAEO,SAASqD,EACdhE,EACAC,EACe,CACf,IAAMgE,EAA0B,CAAC,EACjC,OAAAlE,EACEC,EACAC,EACA,CAACwB,EAAQiC,EAAOQ,EAAgB7C,EAAI1C,EAASwF,IAAe,CAC1DF,EAAS,KAAK,CACZ,GAAA5C,EACA,QAAA1C,EACA,gBAAiBwF,EACjB,MAAAT,EACA,eAAAQ,CACF,CAAC,CACH,CACF,EACOD,CACT,CAEO,SAASG,GACdC,EACA,CACA,OAAO,OAAO,OAAOA,CAAW,EAAE,OAChC,CAACC,EAAK,CAAE,QAAAC,CAAQ,IAAMD,EAAMC,EAAQ,OACpC,CACF,CACF,CAEO,SAASC,GACdxE,EACAC,EACA,CACA,IAAMgE,EAAWD,EAAYhE,EAAOC,CAAW,EACzCwE,EAAcR,EAASA,EAAS,OAAS,CAAC,EAChD,OAAOQ,EACHA,EAAY,eAAiBA,EAAY,QAAQ,OACjD,CACN,CAEO,SAASC,GACdC,EACAC,EACA,CACA,GAAID,aAAmB,OACrB,OAAOA,EACF,CACL,IAAME,EAAqB5C,EAAY0C,CAAO,EAE9C,OAAO,IAAI,OACT,aAAaE,OAAwBD,EAAoB,GAAK,QAAQC,QACxE,EAEJ,CAEO,SAASC,GACdC,EACAC,EACiD,CACjD,OAAID,aAAgB,MACX,eAAgBE,EAAe,CACpC,IAAMV,EAAU,CAAC,EACjB,QAASW,EAAI,EAAG,EAAIH,EAAK,OAAQG,EAAI,EAAG,EAAEA,EAAG,CAC3C,IAAMvG,EAAUoG,EAAKG,CAAC,EAAE,SAAWH,EAAKG,CAAC,EAAE,GACvCC,GAAkBxG,EAASsG,EAAOD,CAAa,GAAK,GACtDT,EAAQ,KAAKQ,EAAKG,CAAC,CAAC,EAGxB,OAAOX,CACT,EAEKQ,CACT,CAEA,IAAMI,GAAoB,CACxB/C,EACAb,EACAyD,IAEKA,EAIEI,GAAgBhD,CAAG,EAAE,QAAQgD,GAAgB7D,CAAM,CAAC,EAHlDa,EAAI,YAAY,EAAE,QAAQb,EAAO,YAAY,CAAC,EAMnD8D,GAAiBjD,GAAgB,CACrC,IAAIkD,EAAelD,EAEnB,OAAAmD,GAAkB,QAAQC,GAAoB,CAC5CF,EAAeA,EAAa,QAC1BE,EAAiB,QACjBA,EAAiB,IACnB,CACF,CAAC,EAEMF,CACT,EAEMF,GAAmBhD,GAAgBiD,GAAcjD,CAAG,EAAE,YAAY,EAE3DqD,GAAqB,CAChChG,EACA4B,EACA1C,IAEOc,EACJ,QAAQ,SAAiB4B,CAAE,EAC3B,QAAQ,cAAsB1C,GAAW0C,CAAE,EFnc1C,cAAA5C,EAsFA,QAAAiH,OAtFA,oBAlDN,SAASC,GACPC,EACA,CACA,IAAMC,EAAM,CAAE,EAAG,EAAG,EAAG,EAAG,MAAO,EAAG,OAAQ,CAAE,EAC9C,GAAI,CAACD,EACH,OAAOC,EAGT,IAAMC,EAAgB,iBAAiBF,CAAK,EAC5C,OAAAC,EAAI,MAAQD,EAAM,YAClBC,EAAI,OAAS,WAAWC,EAAc,WAAW,EACjDD,EAAI,OAAS,WAAWC,EAAc,YAAY,EAClDD,EAAI,OAASD,EAAM,aACnBC,EAAI,QAAU,WAAWC,EAAc,UAAU,EACjDD,EAAI,QAAU,WAAWC,EAAc,aAAa,EAEpDD,EAAI,EAAID,EAAM,WACdC,EAAI,GAAK,WAAWC,EAAc,WAAW,EAC7CD,EAAI,GAAK,WAAWC,EAAc,UAAU,EAC5CD,EAAI,EAAID,EAAM,UACdC,EAAI,GAAK,WAAWC,EAAc,UAAU,EAC5CD,EAAI,GAAK,WAAWC,EAAc,SAAS,EAEpCD,CACT,CAEA,IAAME,GACJC,GACc,CACd,GAAM,CACJ,eAAAC,EACA,UAAAC,EACA,aAAAC,EACA,eAAAC,EACA,MAAApG,EACA,YAAAC,EACA,UAAAG,CACF,EAAI4F,EACEK,EAA4B,CAAC,EAsFnCtG,EACEC,EACAC,EAtFoB,CACpB8D,EACAL,EACA/B,EACAN,EACA1C,EACA2H,IACG,CACH,IAAMC,EAAatG,EAAYqG,CAAe,EAC9CD,EAAW,KACT5H,EAACK,GAAA,CAEC,QAASH,EACT,MAAO4H,GAAY,MACnB,gBAAiBA,GAAY,iBAHxB,GAAGlF,KAAMqC,GAIhB,CACF,CACF,EAEwB,CACtB8C,EACA9C,EACA+C,IACG,CAWH,GAVKrG,IACHoG,EAAOA,EAAK,WAAW;AAAA,EAAM,EAAE,GAS7B,EALFJ,GACAA,IAAmBD,GACnBC,GAAkBK,GAClBL,GAAkBK,EAAmBD,EAAK,QAG1CH,EAAW,KACT5H,EAACF,EAAA,CAEC,UAAU,OACV,GAAI,CAAE,MAAOmI,GAASA,EAAM,QAAQ,KAAK,OAAQ,EAEhD,SAAAF,GAJI,GAAG9C,KAAS+C,GAKnB,CACF,MACK,CACL,IAAME,EAAaP,EAAiBK,EAC9BG,EAAYJ,EAAK,UAAU,EAAGG,CAAU,EACxCE,EAAUL,EAAK,UAAUG,CAAU,EAErCC,GACFP,EAAW,KACT5H,EAACF,EAAA,CAEC,UAAU,OACV,GAAI,CAAE,MAAOmI,GAASA,EAAM,QAAQ,KAAK,OAAQ,EAEhD,SAAAE,GAJI,GAAGlD,KAAS+C,aAKnB,CACF,EAGFJ,EAAW,KACT5H,EAACF,EAAA,CAEC,IAAK2H,EACL,UAAU,OACV,WAAW,UAHP,QAIL,CACH,EAEIW,GACFR,EAAW,KACT5H,EAACF,EAAA,CAEC,UAAU,OACV,GAAI,CAAE,MAAOmI,GAASA,EAAM,QAAQ,KAAK,OAAQ,EAEhD,SAAAG,GAJI,GAAGnD,KAAS+C,cAKnB,CACF,EAGN,EAOErG,CACF,EAEA,IAAM0G,EAAOnB,GAAmBK,EAAM,QAAQ,EAE9C,OACEvH,EAACD,GAAA,CAAO,UAAW,IAAMwH,EAAM,UAAU,eAAiB,KACxD,SAAAN,GAACnH,EAAA,CACC,IAAK0H,EACL,GAAI,CACF,SAAU,WACV,IAAK,GAAGa,EAAK,MACb,KAAM,GAAGA,EAAK,MACd,MAAO,GAAGA,EAAK,UACf,OAAQ,GAAGA,EAAK,WAChB,WAAY1G,EAAY,WAAa,MACrC,SAAU,SACV,mBAAoB,OACpB,OAAQ,EACR,cAAe,MACjB,EAEC,UAAAiG,EACD5H,EAACF,EAAA,CAAI,UAAU,OAAO,WAAW,SAC9B,aACH,GACF,EACF,CAEJ,EAEOwI,GAAQhB,GGzKf,OAEE,eAAAiB,EACA,aAAA7I,EACA,WAAA8I,GACA,UAAA7I,GACA,YAAAC,MACK,QACP,OAAO6I,OAAsB,iCAC7B,OAAOC,OAAU,qBACjB,OAAOC,OAAW,sBAClB,OAAOC,OAAY,uBACnB,OAAOC,OAAW,sBCblB,OAAOC,OAAoB,+BAqBvB,cAAA9I,OAAA,oBAZJ,IAAM+I,GACJxB,GACc,CACd,GAAM,CAAE,iBAAAyB,EAAkB,WAAAC,EAAY,QAAAC,EAAS,QAAAC,EAAS,aAAAC,CAAa,EACnE7B,EAEF,GAAIyB,EACF,OAAOA,EAAiBzB,CAAK,EAG/B,IAAMrH,EAAU2C,EAAwBoG,EAAW,GAAIA,EAAW,OAAO,EACzE,OACEjJ,GAAC8I,GAAA,CACC,KAAK,SACL,gBAAeI,EACf,SAAUA,EACV,QAASC,EACT,aAAcC,EAEb,SAAAlJ,EACH,CAEJ,EAEOmJ,GAAQN,GDkKL,OAyBN,YAAAO,GAzBM,OAAAtJ,EAyBN,QAAAiH,OAzBM,oBA9JH,IAAMsC,GACXhC,GACG,CACH,GAAM,CACJ,MAAAhG,EACA,YAAAC,EACA,eAAAmG,EACA,aAAAD,EACA,UAAAD,EACA,SAAA+B,EACA,YAAAC,CACF,EAAIlC,EACEmC,EAAY/J,GAAyB,IAAI,EACzC,CAACiG,EAAa+D,CAAc,EAAI/J,EAA4B,CAAC,CAAC,EAC9D,CAACgK,EAAYC,CAAa,EAAIjK,EAAS,CAAC,EACxC,CAACkK,EAAuBC,CAAwB,EAAInK,EAAS,EAAK,EAClE,CAACoK,EAASC,CAAU,EAAIrK,EAAS,EAAK,EAE5CF,EAAU,IAAM,CACd,IAAMwK,EAAUR,EAAU,QAC1B,GAAI,CAACI,GAAyB,CAACI,GAAWA,EAAQ,SAAS,SAAW,EACpE,OAGF,IAAMC,EAAYD,EAAQ,UAEtB,CAAE,IAAAE,EAAK,OAAAC,CAAO,EAAIH,EAAQ,SAASN,CAAU,EAAE,sBAAsB,EACnE,CAAE,IAAKU,CAAa,EAAIJ,EAAQ,sBAAsB,EAC5DE,EAAMA,EAAME,EAAeH,EAC3BE,EAASA,EAASC,EAAeH,EAE7BC,EAAMD,EACRD,EAAQ,UAAYE,EACXC,EAASH,EAAQ,aAAeC,IACzCD,EAAQ,UAAYG,EAASH,EAAQ,cAGvCH,EAAyB,EAAK,CAChC,EAAG,CAACD,EAAuBJ,EAAWE,EAAYG,CAAwB,CAAC,EAE3E,IAAMQ,EAAkBhC,EACtB,MACEiC,EACAhE,EACAiE,EACAC,EACAC,EACAC,IACG,CACH,GAAI,CACF,IAAMC,EAAexE,GAAgBmE,EAAO,KAAMA,EAAO,aAAa,EACtEP,EAAW,EAAI,EACf,IAAMnE,EAAU,MAAM+E,EAAarE,CAAK,EACxCmD,EAAemB,IACN,CACL,GAAGA,EACH,CAACL,CAAW,EAAG,CACb,UAAW,CACT,WAAYA,EACZ,MAAAjE,EACA,mBAAAkE,EACA,iBAAAC,EACA,eAAgBC,CAClB,EACA,QAAA9E,CACF,CACF,EACD,CACH,OAASiF,EAAP,CACA,QAAQ,MAAMA,CAAG,CACnB,QAAE,CACAd,EAAW,EAAK,CAClB,CACF,EACA,CAAC,CACH,EAEMe,EAAiBrL,GAAO6B,CAAW,EACzC9B,EAAU,IAAM,CACdsL,EAAe,QAAUxJ,CAC3B,EAAG,CAACA,CAAW,CAAC,EAEhB9B,EAAU,IAAM,CAGd,GAFAiK,EAAe,CAAC,CAAC,EAEb,CAAChC,GAAkBA,IAAmBD,EACxC,OAGF,IAAMuD,EAAqBD,EAAe,QACpC5H,EAAYL,EAAaxB,EAAO0J,CAAkB,EAElDC,EAAkB3G,EACtBnB,EACA6H,EACAtD,EACA,MACF,EACA,GAAI,CAACuD,EACH,OAGF,IAAMC,EAAsBpF,GAC1B3C,EAAU,UAAU,EAAG8H,CAAe,EACtCD,CACF,EACMG,EAAYhI,EAAU,UAAU+H,EAAqBxD,CAAc,EAEzEsD,EAAmB,QAAQ,CAACT,EAAQC,IAAgB,CAClD,GAAI,CAACD,EACH,OAGF,IAAM5J,EAAQqF,GACZuE,EAAO,SAAWa,GAClBb,EAAO,iBACT,EACMrI,EAAQiJ,EAAU,MAAMxK,CAAK,EACnC,GAAIuB,EAAO,CACT,IAAMuI,EACJS,EAAsBC,EAAU,QAAQjJ,EAAM,CAAC,EAAGA,EAAM,KAAK,EAC/DoI,EACEC,EACArI,EAAM,CAAC,EACPsI,EACAC,EACAA,EAAqBvI,EAAM,CAAC,EAAE,OAC9BiB,CACF,EAEJ,CAAC,CACH,EAAG,CAACuE,EAAgBD,EAAcnG,EAAOgJ,CAAe,CAAC,EAEzD,IAAMe,EAAmB/C,EAAY,IAAM,CACzCoB,EAAe,CAAC,CAAC,EACjBE,EAAc,CAAC,CACjB,EAAG,CAACF,EAAgBE,CAAa,CAAC,EAE5B0B,EAAehD,EACnB,CAACrG,EAA2BsJ,IAAmB,CAC7ChC,EAAStH,EAAQsJ,CAAS,EAC1BF,EAAiB,CACnB,EACA,CAAC9B,EAAU8B,CAAgB,CAC7B,EAEMG,EAAmBlD,EACtBqB,GAAuB,CACtBC,EAAcD,CAAU,CAC1B,EACA,CAACC,CAAa,CAChB,EAEM6B,EAAsBlD,GAAQ,IAC3B,OAAO,OAAO5C,CAAW,EAAE,OAChC,CAAC+F,EAAY,CAAE,QAAA7F,EAAS,UAAA0F,CAAU,IAAM,CACtC,GAAGG,EACH,GAAG7F,EAAQ,IAAI,CAAC5D,EAA2B+C,IACzCjF,EAACqJ,GAAA,CAEC,GAAInH,EAAO,GACX,MAAOsJ,EAAU,MACjB,MAAOvG,EACP,WAAY/C,EACZ,QAAS+C,IAAU2E,EACnB,QAAS,IAAM2B,EAAarJ,EAAQsJ,CAAS,EAC7C,aAAc,IAAMC,EAAiBxG,CAAK,GAPrC/C,EAAO,EAQd,CACD,CACH,EACA,CAAC,CACH,EACC,CAAC0D,EAAa2F,EAAcE,EAAkB7B,CAAU,CAAC,EAM5D,OAJIjC,IAAmB,MAAQA,IAAmBD,GAI9C,CAACsC,GAAW0B,EAAoB,SAAW,EACtC,KAIPzE,GAAAqC,GAAA,CACE,UAAAtJ,EAAC4L,GAAA,CACC,YAAahG,EACb,iBAAkB0F,EAClB,SAAUC,EACV,WAAY3B,EACZ,cAAeC,EACf,yBAA0BE,EAC1B,QAASC,EACX,EACAhK,EAAC4I,GAAA,CACC,UAAU,eACT,GAAGrB,EAAM,WAAW,OACrB,GAAI,CAAE,OAAQ,EAAG,GAAGA,EAAM,WAAW,QAAQ,EAAG,EAChD,KAAM,GACN,SAAUE,EAAU,QAEpB,SAAAzH,EAAC2I,GAAA,CAAM,UAAW,EAAG,YAAac,EAChC,SAAAzJ,EAAC0I,GAAA,CACC,IAAKgB,EACL,GAAI,CAAE,MAAO,QAAS,UAAW,OAAQ,SAAU,MAAO,EAEzD,SAAAgC,EAAoB,OAAS,EAC1BA,EACA1B,GACEhK,EAAC6I,GAAA,CACC,eAAe,SACf,WAAW,SACX,OAAO,OAEP,SAAA7I,EAACyI,GAAA,EAAiB,EACpB,EAER,EACF,EACF,GACF,CAEJ,EAEOoD,GAAQtC,GAUf,IAAMqC,GACJrE,GACc,CACd,GAAM,CACJ,YAAA3B,EACA,iBAAA0F,EACA,WAAA1B,EACA,cAAAC,EACA,yBAAAE,EACA,SAAAP,EACA,QAAAQ,CACF,EAAIzC,EAEJ,OAAA7H,EAAU,IAAM,CACd,IAAMoM,EAAcC,GAAkB,CACpC,GAAI/B,EAAS,OAEb,IAAMgC,EAAmBrG,GAAiBC,CAAW,EACrDiE,GAAemC,EAAmBpC,EAAamC,GAASC,CAAgB,EACxEjC,EAAyB,EAAI,CAC/B,EAEMkC,EAAgB,IAAM,CAC1B,GAAIjC,EAAS,OAEb,GAAM,CACJ,OAAA9H,EACA,UAAAsJ,CACF,EACE,OAAO,OAAO5F,CAAW,EAAE,OACzB,CAACC,EAAuB,CAAE,QAAAC,EAAS,UAAA0F,CAAU,IAAsB,CACjE,GAAG3F,EACH,GAAGC,EAAQ,IAAK5D,IAA+B,CAC7C,OAAAA,EACA,UAAAsJ,CACF,EAAE,CACJ,EACA,CAAC,CACH,EAAE5B,CAAU,EACdJ,EAAStH,EAAQsJ,CAAS,CAC5B,EAEMU,EAAiBC,GAAsB,CAC3C,OAAQA,EAAG,IAAK,CACd,IAAK,SAAY,CACfb,EAAiB,EACjB,KACF,CACA,IAAK,YAAU,CACbQ,EAAW,CAAE,EACb,KACF,CACA,IAAK,UAAQ,CACXA,EAAW,EAAE,EACb,KACF,CAEA,IAAK,QACL,IAAK,MAAS,CACZG,EAAc,EACd,KACF,CACA,QACE,MAEJ,CAEAE,EAAG,eAAe,EAClBA,EAAG,gBAAgB,CACrB,EAEA,gBAAS,iBAAiB,UAAWD,CAAa,EAC3C,IAAM,SAAS,oBAAoB,UAAWA,CAAa,CACpE,EAAG,CACDtG,EACA0F,EACA1B,EACAC,EACAL,EACAO,EACAC,CACF,CAAC,EAEM,IACT,EJpHI,mBAAAV,GACE,OAAAtJ,EADF,QAAAiH,OAAA,oBApNJ,IAAMmF,GACJ7E,GACc,CACd,GAAM,CAAC8E,EAAYC,CAAa,EAAI1M,EAClC2H,EAAM,cAAgB,EACxB,EAEM,CAACgF,EAAUC,CAAW,EAAI5M,EAE9B,IAAI,EACA4H,EAAiB7H,EAAuB,IAAI,EAC5C8H,EAAY9H,EAAwB,IAAI,EACxC8M,EAAuB9M,EAAO,EAAK,EAEnC,CAACgI,EAAgB+E,CAAiB,EAAI9M,EAAwB,IAAI,EAClE,CAAC8H,EAAciF,CAAe,EAAI/M,EAAwB,IAAI,EAE9DgN,EACJC,GACG,CACHL,EAAYK,CAAG,EAEXC,IACE,OAAOA,GAAqB,WAC9BA,EAAiBD,CAAG,EAEpBC,GACA,YAAaA,GACb,OAAOA,GAAqB,aAG1BA,EAGA,QAAUD,GAGlB,EAEAnN,GAAU,IAAM,CACd,IAAMyH,EAAQoF,EACRQ,EAAW,IAAM,CACjB,CAACvF,EAAe,SAAW,CAACL,IAGhCK,EAAe,QAAQ,WAAaL,EAAM,WAC1CK,EAAe,QAAQ,UAAYL,EAAM,UAC3C,EAEA,OAAAA,GAAO,iBAAiB,SAAU4F,CAAQ,EACnC,IAAM5F,GAAO,oBAAoB,SAAU4F,CAAQ,CAC5D,EAAG,CAACR,EAAU/E,CAAc,CAAC,EAE7B9H,GAAU,IAAM,CACd,IAAMyH,EAAQoF,EAEZ,CAACpF,GACAA,EAAM,iBAAmBQ,GACxBR,EAAM,eAAiBO,GAI3BP,EAAM,kBAAkBQ,EAAgBD,CAAY,CACtD,EAAG,CAACC,EAAgBD,EAAc6E,CAAQ,CAAC,EAE3C,GAAM,CAAE,MAAAhL,EAAO,YAAAC,EAAa,SAAUsL,EAAkB,GAAGE,CAAO,EAAIzF,EAChE0F,EAAa1L,IAAU,OAAYA,EAAQ8K,EAE3Ca,EAAa,IAAM,CAClBT,EAAqB,UACxBC,EAAkB,IAAI,EACtBC,EAAgB,IAAI,GAEtBF,EAAqB,QAAU,EACjC,EAEMU,EAA6B,IAAM,CACvCV,EAAqB,QAAU,EACjC,EAEMW,EAAa,CACjBnE,EACA,CACE,WAAAvD,EACA,mBAAAgF,EACA,iBAAAC,EACA,eAAA9G,CACF,IACG,CACH,IAAMiE,EAAatG,EAAYkE,CAAU,EAEnC,CAAE,OAAA1E,EAAQ,iBAAAyB,EAAkB,iBAAA4K,EAAkB,MAAAC,EAAM,EAAIxF,EAExD1F,EAAQmC,EACZ0I,EACAzL,EACAkJ,EACA,OACF,EACA,GAAI,CAACnK,EAAS6B,CAAK,EACjB,OAGF,IAAMgD,GAAMhD,EAAQuI,EAAmBD,EAEnCvG,GAAS6C,GACXhG,GAAUc,EACVmH,EAAW,GACXA,EAAW,OACb,EACIsE,GAAgB9K,GAAoBI,GACtCoG,EAAW,GACXA,EAAW,OACb,EAEIoE,IACFlJ,IAAU,IACVoJ,GAAgB,KAGlB,IAAMC,GAAmB9C,EAAqB6C,EAAa,OAC3Db,EAAkBc,EAAgB,EAClCb,EAAgBa,EAAgB,EAEhC,IAAM5I,GAAWC,EAAaoI,EAAY7K,EAAOgD,GAAKjB,EAAM,EACtDqB,GAAWD,EAAYX,GAAUpD,CAAW,EAC5CiM,GAAoB5I,EACxBhB,EACA6G,EACAC,EACA4C,CACF,GAEiBhG,EAAM,UAAY+E,GAC1B1H,GAAU6I,GAAmBjI,EAAQ,EAC9C8H,KAAQrE,EAAY7G,EAAOgD,EAAG,CAChC,EAEMsI,EAAgBvB,GAA4C,CAChE,IAAIsB,EAAoBtB,EAAG,OAAO,MAE9BrI,EAAuB6D,EACtBpH,EAASuD,CAAoB,IAChCA,EAAuBqI,EAAG,OAAO,gBAGnC,IAAIpI,EAAqB2D,EACpBnH,EAASwD,CAAkB,IAC9BA,EAAqBoI,EAAG,OAAO,cAGjC,IAAMvH,EAAWhB,GACfqJ,EACAQ,EACA3J,EACAC,EACAoI,EAAG,OAAO,cAAgB,EAC1B3K,EACA+F,EAAM,SACR,EAEAkG,EAAoB1K,EAAa6B,EAAUpD,CAAW,EAEtD,IAAImM,EAAsBxB,EAAG,OAAO,eAChCnI,EAAoBmI,EAAG,OAAO,aAE5ByB,EAAiBvI,GACrB4H,EACAzL,EACA2K,EAAG,OAAO,gBAAkB,CAC9B,EACA,GACEyB,IAAmB,QACnB5J,IAAsB,MACtBA,EAAoB4J,EACpB,CACA,IAAMtH,EAAQ6F,EAAG,YAAoB,KACrCwB,EAAsBC,GAAkBtH,EAAOA,EAAK,OAAS,GAC7DtC,EAAoB2J,EAGtBjB,EAAkBiB,CAAmB,EACrChB,EAAgB3I,CAAiB,EAEjC,IAAMwB,EAAWD,EAAYX,EAAUpD,CAAW,GAEjC+F,EAAM,UAAY+E,GAC1B1H,EAAU6I,EAAmBjI,CAAQ,CAChD,EAEM+F,EAAgBY,GAA4C,CAChEO,EAAkBP,EAAG,OAAO,cAAc,EAC1CQ,EAAgBR,EAAG,OAAO,YAAY,EACtC5E,EAAM,WAAW4E,CAAE,CACrB,EAEM0B,EAA6B,CACjC,GAAGb,EACH,MAAOjK,EAAakK,EAAYzL,EAAa+F,EAAM,SAAS,EAC5D,SAAUmG,EACV,SAAUnC,EACV,OAAQ2B,EACR,WAAY,CACV,GAAI,CACF,mBAAoB,OACpB,MAAO,cACP,WAAajF,GAAiBA,EAAM,QAAQ,KAAK,OACnD,CACF,CACF,EAEA,OACEhB,GAAAqC,GAAA,CACE,UAAAtJ,EAACsI,GAAA,CACC,eAAgBd,EAChB,UAAWC,EACX,eAAgBE,EAChB,aAAcD,EACd,MAAOuF,EACP,YAAazL,EACb,SAAU+K,EACV,UAAWsB,EAAW,UACxB,EACA7N,EAACH,GAAA,CAAU,SAAU+M,EAAiB,GAAGiB,EAAY,EACrD7N,EAAC6L,GAAA,CACC,MAAOoB,EACP,YAAazL,EACb,eAAgBmG,EAChB,aAAcD,EACd,UAAWD,EACX,QAAS,GACT,SAAU2F,EACV,YAAaD,EACb,UAAW5F,EAAM,WAAW,mBAC9B,GACF,CAEJ,EAEOuG,GAAQ1B","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport React, { ReactNode, useEffect, useRef, useState } from 'react';\nimport { Theme } from '@mui/material/styles';\nimport TextField, { TextFieldProps } from '@mui/material/TextField';\n\nimport {\n BaseSuggestionData,\n DefaultDisplayTransform,\n DefaultMarkupTemplate,\n SuggestionData,\n SuggestionsQueryInfo,\n} from 'types/fieldMentions';\n\nimport Highlighter from './Highlighter';\nimport { FieldMentionsBaseProps, FieldMentionsProps } from './props';\nimport SuggestionsOverlay from './SuggestionOverlay';\nimport {\n applyChangeToValue,\n findStartOfMentionInPlainText,\n getMentions,\n getPlainText,\n isNumber,\n makeMentionsMarkup,\n mapPlainTextIndex,\n spliceString,\n} from './utils';\n\nconst FieldMentions = <T extends BaseSuggestionData>(\n props: FieldMentionsProps<T>,\n): ReactNode => {\n const [stateValue, setStateValue] = useState<string>(\n props.defaultValue || '',\n );\n\n const [inputRef, setInputRef] = useState<\n HTMLInputElement | HTMLTextAreaElement | null\n >(null);\n const highlighterRef = useRef<HTMLDivElement>(null);\n const cursorRef = useRef<HTMLSpanElement>(null);\n const suggestionsMouseDown = useRef(false);\n\n const [selectionStart, setSelectionStart] = useState<number | null>(null);\n const [selectionEnd, setSelectionEnd] = useState<number | null>(null);\n\n const handleInputRef = (\n ref: HTMLInputElement | HTMLTextAreaElement | null,\n ) => {\n setInputRef(ref);\n\n if (externalInputRef) {\n if (typeof externalInputRef === 'function') {\n externalInputRef(ref);\n } else if (\n externalInputRef &&\n 'current' in externalInputRef &&\n typeof externalInputRef !== 'function'\n ) {\n (\n externalInputRef as React.MutableRefObject<\n HTMLInputElement | HTMLTextAreaElement | null\n >\n ).current = ref;\n }\n }\n };\n\n useEffect(() => {\n const input = inputRef;\n const onScroll = () => {\n if (!highlighterRef.current || !input) {\n return;\n }\n highlighterRef.current.scrollLeft = input.scrollLeft;\n highlighterRef.current.scrollTop = input.scrollTop;\n };\n\n input?.addEventListener('scroll', onScroll);\n return () => input?.removeEventListener('scroll', onScroll);\n }, [inputRef, highlighterRef]);\n\n useEffect(() => {\n const input = inputRef;\n if (\n !input ||\n (input.selectionStart === selectionStart &&\n input.selectionEnd === selectionEnd)\n ) {\n return;\n }\n input.setSelectionRange(selectionStart, selectionEnd);\n }, [selectionStart, selectionEnd, inputRef]);\n\n const { value, dataSources, inputRef: externalInputRef, ...others } = props;\n const finalValue = value !== undefined ? value : stateValue;\n\n const handleBlur = () => {\n if (!suggestionsMouseDown.current) {\n setSelectionStart(null);\n setSelectionEnd(null);\n }\n suggestionsMouseDown.current = false;\n };\n\n const handleSuggestionsMouseDown = () => {\n suggestionsMouseDown.current = true;\n };\n\n const addMention = (\n suggestion: SuggestionData<T>,\n {\n childIndex,\n querySequenceStart,\n querySequenceEnd,\n plainTextValue,\n }: SuggestionsQueryInfo,\n ) => {\n const dataSource = dataSources[childIndex];\n\n const { markup, displayTransform, appendSpaceOnAdd, onAdd } = dataSource;\n\n const start = mapPlainTextIndex(\n finalValue,\n dataSources,\n querySequenceStart,\n 'START',\n );\n if (!isNumber(start)) {\n return;\n }\n\n const end = start + querySequenceEnd - querySequenceStart;\n\n let insert = makeMentionsMarkup(\n markup || DefaultMarkupTemplate,\n suggestion.id,\n suggestion.display,\n );\n let displayValue = (displayTransform || DefaultDisplayTransform)(\n suggestion.id,\n suggestion.display,\n );\n\n if (appendSpaceOnAdd) {\n insert += ' ';\n displayValue += ' ';\n }\n\n const newCaretPosition = querySequenceStart + displayValue.length;\n setSelectionStart(newCaretPosition);\n setSelectionEnd(newCaretPosition);\n\n const newValue = spliceString(finalValue, start, end, insert);\n const mentions = getMentions(newValue, dataSources);\n const newPlainTextValue = spliceString(\n plainTextValue,\n querySequenceStart,\n querySequenceEnd,\n displayValue,\n );\n\n const onChange = props.onChange || setStateValue;\n onChange(newValue, newPlainTextValue, mentions);\n onAdd?.(suggestion, start, end);\n };\n\n const handleChange = (ev: React.ChangeEvent<HTMLInputElement>) => {\n let newPlainTextValue = ev.target.value;\n\n let selectionStartBefore = selectionStart;\n if (!isNumber(selectionStartBefore)) {\n selectionStartBefore = ev.target.selectionStart;\n }\n\n let selectionEndBefore = selectionEnd;\n if (!isNumber(selectionEndBefore)) {\n selectionEndBefore = ev.target.selectionEnd;\n }\n\n const newValue = applyChangeToValue(\n finalValue,\n newPlainTextValue,\n selectionStartBefore,\n selectionEndBefore,\n ev.target.selectionEnd || 0,\n dataSources,\n props.multiline,\n );\n\n newPlainTextValue = getPlainText(newValue, dataSources);\n\n let selectionStartAfter = ev.target.selectionStart;\n let selectionEndAfter = ev.target.selectionEnd;\n\n const startOfMention = findStartOfMentionInPlainText(\n finalValue,\n dataSources,\n ev.target.selectionStart || 0,\n );\n if (\n startOfMention !== undefined &&\n selectionEndAfter !== null &&\n selectionEndAfter > startOfMention\n ) {\n const data = (ev.nativeEvent as any).data;\n selectionStartAfter = startOfMention + (data ? data.length : 0);\n selectionEndAfter = selectionStartAfter;\n }\n\n setSelectionStart(selectionStartAfter);\n setSelectionEnd(selectionEndAfter);\n\n const mentions = getMentions(newValue, dataSources);\n\n const onChange = props.onChange || setStateValue;\n onChange(newValue, newPlainTextValue, mentions);\n };\n\n const handleSelect = (ev: React.ChangeEvent<HTMLInputElement>) => {\n setSelectionStart(ev.target.selectionStart);\n setSelectionEnd(ev.target.selectionEnd);\n props.onSelect?.(ev);\n };\n\n const inputProps: TextFieldProps = {\n ...others,\n value: getPlainText(finalValue, dataSources, props.multiline),\n onChange: handleChange,\n onSelect: handleSelect,\n onBlur: handleBlur,\n InputProps: {\n sx: {\n overscrollBehavior: 'none',\n color: 'transparent',\n caretColor: (theme: Theme) => theme.palette.text.primary,\n },\n },\n };\n\n return (\n <>\n <Highlighter\n highlighterRef={highlighterRef}\n cursorRef={cursorRef}\n selectionStart={selectionStart}\n selectionEnd={selectionEnd}\n value={finalValue}\n dataSources={dataSources}\n inputRef={inputRef}\n multiline={inputProps.multiline}\n />\n <TextField inputRef={handleInputRef} {...inputProps} />\n <SuggestionsOverlay\n value={finalValue}\n dataSources={dataSources}\n selectionStart={selectionStart}\n selectionEnd={selectionEnd}\n cursorRef={cursorRef}\n loading={false}\n onSelect={addMention}\n onMouseDown={handleSuggestionsMouseDown}\n slotProps={props.slotProps?.suggestionsOverlay}\n />\n </>\n );\n};\n\nexport default FieldMentions;\nexport type { FieldMentionsBaseProps, FieldMentionsProps };\n","import { type JSX, ReactNode } from 'react';\nimport Box from '@mui/material/Box';\nimport Portal from '@mui/material/Portal';\n\nimport { BaseSuggestionData } from 'types/fieldMentions';\n\nimport Mention from '../Mention';\nimport { iterateMentionsMarkup } from '../utils';\n\nimport { HighlighterProps } from './props';\n\nfunction getHighlighterRect(\n input?: HTMLInputElement | HTMLTextAreaElement | null,\n) {\n const rec = { x: 0, y: 0, width: 0, height: 0 };\n if (!input) {\n return rec;\n }\n\n const computedStyle = getComputedStyle(input);\n rec.width = input.clientWidth;\n rec.width -= parseFloat(computedStyle.paddingLeft);\n rec.width -= parseFloat(computedStyle.paddingRight);\n rec.height = input.clientHeight;\n rec.height -= parseFloat(computedStyle.paddingTop);\n rec.height -= parseFloat(computedStyle.paddingBottom);\n\n rec.x = input.offsetLeft;\n rec.x += parseFloat(computedStyle.paddingLeft);\n rec.x += parseFloat(computedStyle.borderLeft);\n rec.y = input.offsetTop;\n rec.y += parseFloat(computedStyle.paddingTop);\n rec.y += parseFloat(computedStyle.borderTop);\n\n return rec;\n}\n\nconst Highlighter = <T extends BaseSuggestionData>(\n props: HighlighterProps<T>,\n): ReactNode => {\n const {\n highlighterRef,\n cursorRef,\n selectionEnd,\n selectionStart,\n value,\n dataSources,\n multiline,\n } = props;\n const components: JSX.Element[] = [];\n\n const handleMention = (\n _markup: string,\n index: number,\n _plainTextIndex: number,\n id: string,\n display: string,\n dataSourceIndex: number,\n ) => {\n const dataSource = dataSources[dataSourceIndex];\n components.push(\n <Mention\n key={`${id}-${index}`}\n display={display}\n color={dataSource?.color}\n backgroundColor={dataSource?.backgroundColor}\n />,\n );\n };\n\n const handlePlainText = (\n text: string,\n index: number,\n indexInPlaintext: number,\n ) => {\n if (!multiline) {\n text = text.replaceAll('\\n', '');\n }\n\n const renderCursor =\n selectionStart &&\n selectionStart === selectionEnd &&\n selectionStart >= indexInPlaintext &&\n selectionStart <= indexInPlaintext + text.length;\n\n if (!renderCursor) {\n components.push(\n <Box\n key={`${index}-${indexInPlaintext}`}\n component=\"span\"\n sx={{ color: theme => theme.palette.text.primary }}\n >\n {text}\n </Box>,\n );\n } else {\n const splitIndex = selectionStart - indexInPlaintext;\n const startText = text.substring(0, splitIndex);\n const endText = text.substring(splitIndex);\n\n if (startText) {\n components.push(\n <Box\n key={`${index}-${indexInPlaintext}-precursor`}\n component=\"span\"\n sx={{ color: theme => theme.palette.text.primary }}\n >\n {startText}\n </Box>,\n );\n }\n\n components.push(\n <Box\n key=\"cursor\"\n ref={cursorRef}\n component=\"span\"\n visibility=\"hidden\"\n ></Box>,\n );\n\n if (endText) {\n components.push(\n <Box\n key={`${index}-${indexInPlaintext}-postcursor`}\n component=\"span\"\n sx={{ color: theme => theme.palette.text.primary }}\n >\n {endText}\n </Box>,\n );\n }\n }\n };\n\n iterateMentionsMarkup(\n value,\n dataSources,\n handleMention,\n handlePlainText,\n multiline,\n );\n\n const rect = getHighlighterRect(props.inputRef);\n\n return (\n <Portal container={() => props.inputRef?.parentElement || null}>\n <Box\n ref={highlighterRef}\n sx={{\n position: 'absolute',\n top: `${rect.y}px`,\n left: `${rect.x}px`,\n width: `${rect.width}px`,\n height: `${rect.height}px`,\n whiteSpace: multiline ? 'pre-wrap' : 'pre',\n overflow: 'hidden',\n overscrollBehavior: 'none',\n zIndex: 1,\n pointerEvents: 'none',\n }}\n >\n {components}\n <Box component=\"span\" visibility=\"hidden\">\n {' '}\n </Box>\n </Box>\n </Portal>\n );\n};\n\nexport default Highlighter;\n","import Box from '@mui/material/Box';\n\nimport { MentionProps } from './props';\n\nconst Mention = ({ display, color, backgroundColor }: MentionProps) => {\n return (\n <Box\n component=\"span\"\n sx={{\n color: color || 'inherit',\n bgcolor: backgroundColor,\n }}\n >\n {display}\n </Box>\n );\n};\n\nexport default Mention;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport invariant from 'invariant';\n\nimport {\n BaseSuggestionData,\n DefaultDisplayTransform,\n DefaultMarkupTemplate,\n MentionData,\n SuggestionData,\n SuggestionDataSource,\n SuggestionsMap,\n} from 'types/fieldMentions';\nimport lettersDiacritics from 'utils/diacritics';\n\nenum Placeholders {\n id = '__id__',\n display = '__display__',\n}\n\nexport function isNumber(val: any): val is number {\n return typeof val === 'number';\n}\n\nfunction combineRegExps(regExps: RegExp[]): RegExp {\n const serializedRegexParser = /^\\/(.+)\\/(\\w+)?$/;\n return new RegExp(\n regExps\n .map(regex => {\n const [, regexString, regexFlags] =\n serializedRegexParser.exec(regex.toString()) || [];\n\n invariant(\n !regexFlags,\n `RegExp flags are not supported. Change /${regexString}/${regexFlags} into /${regexString}/`,\n );\n\n return `(${regexString})`;\n })\n .join('|'),\n 'g',\n );\n}\n\nfunction countPlaceholders(markup: string): number {\n let count = 0;\n if (markup.indexOf(Placeholders.id) >= 0) count++;\n if (markup.indexOf(Placeholders.display) >= 0) count++;\n return count;\n}\n\nfunction findIndexOfCapturingGroup(\n markup: string,\n parameterName: 'id' | 'display',\n): number {\n invariant(\n parameterName === 'id' || parameterName === 'display',\n `Second arg must be either \"id\" or \"display\", got: \"${parameterName}\"`,\n );\n\n const indexDisplay = markup.indexOf(Placeholders.display);\n const indexId = markup.indexOf(Placeholders.id);\n\n invariant(\n indexDisplay >= 0 || indexId >= 0,\n `The markup '${markup}' does not contain at least one of the placeholders '__id__' or '__display__'`,\n );\n\n if (indexDisplay >= 0 && indexId >= 0) {\n return (parameterName === 'id' && indexId <= indexDisplay) ||\n (parameterName === 'display' && indexDisplay <= indexId)\n ? 0\n : 1;\n }\n\n return 0;\n}\n\nexport function iterateMentionsMarkup<T extends BaseSuggestionData>(\n value: string,\n dataSources: SuggestionDataSource<T>[],\n markupProcessor: (\n match: string,\n matchIndex: number,\n plainTextIndex: number,\n id: string,\n display: string,\n mentionIndex: number,\n start: number,\n ) => void,\n plainTextProcessor?: (\n value: string,\n start: number,\n currentIndex: number,\n ) => void,\n multiline?: boolean,\n) {\n const regex = combineRegExps(\n dataSources.map(ds =>\n ds.regex\n ? verifyCapturingGroups(ds.regex, ds.markup || DefaultMarkupTemplate)\n : markupToRegex(ds.markup || DefaultMarkupTemplate),\n ),\n );\n\n let accOffset = 2;\n const captureGroupOffsets = dataSources.map(({ markup }) => {\n const result = accOffset;\n accOffset += countPlaceholders(markup || DefaultMarkupTemplate) + 1;\n return result;\n });\n\n let match: RegExpExecArray | null;\n let start = 0;\n let currentPlainTextIndex = 0;\n\n while ((match = regex.exec(value)) !== null) {\n const offset = captureGroupOffsets.find(o => !!match?.[o]);\n if (offset === undefined) {\n continue;\n }\n\n const mentionChildIndex = captureGroupOffsets.indexOf(offset);\n const { markup, displayTransform } = dataSources[mentionChildIndex];\n const idPos =\n offset + findIndexOfCapturingGroup(markup || DefaultMarkupTemplate, 'id');\n const displayPos =\n offset +\n findIndexOfCapturingGroup(markup || DefaultMarkupTemplate, 'display');\n\n const id = match[idPos];\n const display = displayTransform\n ? displayTransform(id, match[displayPos])\n : DefaultDisplayTransform(id, match[displayPos], multiline);\n\n const substr = value.substring(start, match.index);\n plainTextProcessor?.(substr, start, currentPlainTextIndex);\n currentPlainTextIndex += substr.length;\n\n markupProcessor(\n match[0],\n match.index,\n currentPlainTextIndex,\n id,\n display,\n mentionChildIndex,\n start,\n );\n currentPlainTextIndex += display.length;\n start = regex.lastIndex;\n }\n\n if (start < value.length) {\n plainTextProcessor?.(value.substring(start), start, currentPlainTextIndex);\n }\n}\n\nexport function getPlainText<T extends BaseSuggestionData>(\n value: string,\n dataSources: SuggestionDataSource<T>[],\n multiline?: boolean,\n): string {\n let result = '';\n iterateMentionsMarkup(\n value,\n dataSources,\n (_match, _index, _plainTextIndex, _id, display) => {\n result += display;\n },\n plainText => {\n result += plainText;\n },\n multiline,\n );\n return result;\n}\n\nconst verifyCapturingGroups = (regex: RegExp, markup: string) => {\n const numberOfGroups =\n (new RegExp(regex.toString() + '|').exec('')?.length || 0) - 1;\n const numberOfPlaceholders = countPlaceholders(markup);\n\n invariant(\n numberOfGroups === numberOfPlaceholders,\n `Number of capturing groups in RegExp ${regex.toString()} (${numberOfGroups}) does not match the number of placeholders in the markup '${markup}' (${numberOfPlaceholders})`,\n );\n\n return regex;\n};\n\nconst markupToRegex = (markup: string) => {\n const escapedMarkup = escapeRegex(markup);\n\n const charAfterDisplay =\n markup[markup.indexOf(Placeholders.display) + Placeholders.display.length];\n const charAfterId =\n markup[markup.indexOf(Placeholders.id) + Placeholders.id.length];\n\n return new RegExp(\n escapedMarkup\n .replace(\n Placeholders.display,\n `([^${escapeRegex(charAfterDisplay || '')}]+?)`,\n )\n .replace(Placeholders.id, `([^${escapeRegex(charAfterId || '')}]+?)`),\n );\n};\n\nconst escapeRegex = (str: string) =>\n str.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n\nexport function applyChangeToValue<T extends BaseSuggestionData>(\n value: string,\n plainTextValue: string,\n selectionStartBefore: number | null,\n selectionEndBefore: number | null,\n selectionEndAfter: number,\n dataSources: SuggestionDataSource<T>[],\n multiline?: boolean,\n) {\n const oldPlainTextValue = getPlainText(value, dataSources, multiline);\n\n const lengthDelta = oldPlainTextValue.length - plainTextValue.length;\n if (selectionStartBefore === null) {\n selectionStartBefore = selectionEndAfter + lengthDelta;\n }\n\n if (selectionEndBefore === null) {\n selectionEndBefore = selectionStartBefore;\n }\n\n if (\n selectionStartBefore === selectionEndBefore &&\n selectionEndBefore === selectionEndAfter &&\n oldPlainTextValue.length === plainTextValue.length\n ) {\n selectionStartBefore = selectionStartBefore - 1;\n }\n\n let insert = plainTextValue.slice(selectionStartBefore, selectionEndAfter);\n\n let spliceStart = Math.min(selectionStartBefore, selectionEndAfter);\n\n let spliceEnd = selectionEndBefore;\n if (selectionStartBefore === selectionEndAfter) {\n spliceEnd = Math.max(\n selectionEndBefore,\n selectionStartBefore + lengthDelta,\n );\n }\n\n let mappedSpliceStart = mapPlainTextIndex(\n value,\n dataSources,\n spliceStart,\n 'START',\n );\n let mappedSpliceEnd = mapPlainTextIndex(value, dataSources, spliceEnd, 'END');\n\n const controlSpliceStart = mapPlainTextIndex(\n value,\n dataSources,\n spliceStart,\n 'NULL',\n );\n const controlSpliceEnd = mapPlainTextIndex(\n value,\n dataSources,\n spliceEnd,\n 'NULL',\n );\n const willRemoveMention =\n controlSpliceStart === null || controlSpliceEnd === null;\n\n let newValue = spliceString(\n value,\n mappedSpliceStart || 0,\n mappedSpliceEnd || 0,\n insert,\n );\n\n if (!willRemoveMention) {\n const controlPlainTextValue = getPlainText(\n newValue,\n dataSources,\n multiline,\n );\n if (controlPlainTextValue !== plainTextValue) {\n spliceStart = 0;\n while (plainTextValue[spliceStart] === controlPlainTextValue[spliceStart])\n spliceStart++;\n\n insert = plainTextValue.slice(spliceStart, selectionEndAfter);\n\n spliceEnd = oldPlainTextValue.lastIndexOf(\n plainTextValue.substring(selectionEndAfter),\n );\n\n mappedSpliceStart = mapPlainTextIndex(\n value,\n dataSources,\n spliceStart,\n 'START',\n );\n mappedSpliceEnd = mapPlainTextIndex(value, dataSources, spliceEnd, 'END');\n newValue = spliceString(\n value,\n mappedSpliceStart || 0,\n mappedSpliceEnd || 0,\n insert,\n );\n }\n }\n\n return newValue;\n}\n\nexport function mapPlainTextIndex<T extends BaseSuggestionData>(\n value: string,\n dataSources: SuggestionDataSource<T>[],\n indexInPlainText: number,\n inMarkupCorrection: 'START' | 'END' | 'NULL' = 'START',\n): number | null | undefined {\n if (typeof indexInPlainText !== 'number') {\n return indexInPlainText;\n }\n\n let result: number | undefined | null = undefined;\n\n const plainTextProcessor = (\n substr: string,\n index: number,\n substrPlainTextIndex: number,\n ) => {\n if (result !== undefined) return;\n\n if (substrPlainTextIndex + substr.length >= indexInPlainText) {\n result = index + indexInPlainText - substrPlainTextIndex;\n }\n };\n\n const markupProcessor = (\n markup: string,\n index: number,\n mentionPlainTextIndex: number,\n _id: string,\n display: string,\n ) => {\n if (result !== undefined) return;\n\n if (mentionPlainTextIndex + display.length > indexInPlainText) {\n if (inMarkupCorrection === 'NULL') {\n result = null;\n } else {\n result = index + (inMarkupCorrection === 'END' ? markup.length : 0);\n }\n }\n };\n\n iterateMentionsMarkup(\n value,\n dataSources,\n markupProcessor,\n plainTextProcessor,\n );\n\n return result === undefined ? value.length : result;\n}\n\nexport function spliceString(\n str: string,\n start: number,\n end: number,\n insert: string,\n): string {\n return str.substring(0, start) + insert + str.substring(end);\n}\n\nexport function findStartOfMentionInPlainText<T extends BaseSuggestionData>(\n value: string,\n dataSources: SuggestionDataSource<T>[],\n indexInPlainText: number,\n): number | undefined {\n let result: number | undefined = undefined;\n\n const markupProcessor = (\n _markup: string,\n _index: number,\n mentionPlainTextIndex: number,\n _id: string,\n display: string,\n ) => {\n if (\n mentionPlainTextIndex <= indexInPlainText &&\n mentionPlainTextIndex + display.length > indexInPlainText\n ) {\n result = mentionPlainTextIndex;\n }\n };\n\n iterateMentionsMarkup(value, dataSources, markupProcessor);\n return result;\n}\n\nexport function getMentions<T extends BaseSuggestionData>(\n value: string,\n dataSources: SuggestionDataSource<T>[],\n): MentionData[] {\n const mentions: MentionData[] = [];\n iterateMentionsMarkup(\n value,\n dataSources,\n (_match, index, plainTextIndex, id, display, childIndex) => {\n mentions.push({\n id,\n display,\n dataSourceIndex: childIndex,\n index,\n plainTextIndex,\n });\n },\n );\n return mentions;\n}\n\nexport function countSuggestions<T extends BaseSuggestionData>(\n suggestions: SuggestionsMap<T>,\n) {\n return Object.values(suggestions).reduce(\n (acc, { results }) => acc + results.length,\n 0,\n );\n}\n\nexport function getEndOfLastMention<T extends BaseSuggestionData>(\n value: string,\n dataSources: SuggestionDataSource<T>[],\n) {\n const mentions = getMentions(value, dataSources);\n const lastMention = mentions[mentions.length - 1];\n return lastMention\n ? lastMention.plainTextIndex + lastMention.display.length\n : 0;\n}\n\nexport function makeTriggerRegex(\n trigger: string | RegExp,\n allowSpaceInQuery?: boolean,\n) {\n if (trigger instanceof RegExp) {\n return trigger;\n } else {\n const escapedTriggerChar = escapeRegex(trigger);\n\n return new RegExp(\n `(?:^|\\\\s)(${escapedTriggerChar}([^${allowSpaceInQuery ? '' : '\\\\s'}${escapedTriggerChar}]*))$`,\n );\n }\n}\n\nexport function getDataProvider<T extends BaseSuggestionData>(\n data: SuggestionData<T>[] | ((query: string) => Promise<SuggestionData<T>[]>),\n ignoreAccents?: boolean,\n): (query: string) => Promise<SuggestionData<T>[]> {\n if (data instanceof Array) {\n return async function (query: string) {\n const results = [];\n for (let i = 0, l = data.length; i < l; ++i) {\n const display = data[i].display || data[i].id;\n if (getSubstringIndex(display, query, ignoreAccents) >= 0) {\n results.push(data[i]);\n }\n }\n return results;\n };\n }\n return data;\n}\n\nconst getSubstringIndex = (\n str: string,\n substr: string,\n ignoreAccents?: boolean,\n) => {\n if (!ignoreAccents) {\n return str.toLowerCase().indexOf(substr.toLowerCase());\n }\n\n return normalizeString(str).indexOf(normalizeString(substr));\n};\n\nconst removeAccents = (str: string) => {\n let formattedStr = str;\n\n lettersDiacritics.forEach(letterDiacritics => {\n formattedStr = formattedStr.replace(\n letterDiacritics.letters,\n letterDiacritics.base,\n );\n });\n\n return formattedStr;\n};\n\nconst normalizeString = (str: string) => removeAccents(str).toLowerCase();\n\nexport const makeMentionsMarkup = (\n markup: string,\n id: string,\n display?: string,\n) => {\n return markup\n .replace(Placeholders.id, id)\n .replace(Placeholders.display, display || id);\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable no-console */\nimport {\n ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport CircularProgress from '@mui/material/CircularProgress';\nimport List from '@mui/material/List';\nimport Paper from '@mui/material/Paper';\nimport Popper from '@mui/material/Popper';\nimport Stack from '@mui/material/Stack';\n\nimport {\n BaseSuggestionData,\n DefaultTrigger,\n SuggestionData,\n SuggestionDataSource,\n Suggestions,\n SuggestionsMap,\n SuggestionsQueryInfo,\n} from 'types/fieldMentions';\n\nimport {\n countSuggestions,\n getDataProvider,\n getEndOfLastMention,\n getPlainText,\n makeTriggerRegex,\n mapPlainTextIndex,\n} from '../utils';\n\nimport { KeyboardListenerProps, SuggestionsOverlayProps } from './props';\nimport Suggestion from './Suggestion';\n\nexport const SuggestionsOverlay = <T extends BaseSuggestionData>(\n props: SuggestionsOverlayProps<T>,\n) => {\n const {\n value,\n dataSources,\n selectionStart,\n selectionEnd,\n cursorRef,\n onSelect,\n onMouseDown,\n } = props;\n const ulElement = useRef<HTMLUListElement>(null);\n const [suggestions, setSuggestions] = useState<SuggestionsMap<T>>({});\n const [focusIndex, setFocusIndex] = useState(0);\n const [scrollFocusedIntoView, setScrollFocusedIntoView] = useState(false);\n const [loading, setLoading] = useState(false);\n\n useEffect(() => {\n const current = ulElement.current;\n if (!scrollFocusedIntoView || !current || current.children.length === 0) {\n return;\n }\n\n const scrollTop = current.scrollTop;\n\n let { top, bottom } = current.children[focusIndex].getBoundingClientRect();\n const { top: topContainer } = current.getBoundingClientRect();\n top = top - topContainer + scrollTop;\n bottom = bottom - topContainer + scrollTop;\n\n if (top < scrollTop) {\n current.scrollTop = top;\n } else if (bottom > current.offsetHeight + scrollTop) {\n current.scrollTop = bottom - current.offsetHeight;\n }\n\n setScrollFocusedIntoView(false);\n }, [scrollFocusedIntoView, ulElement, focusIndex, setScrollFocusedIntoView]);\n\n const queryDataSource = useCallback(\n async (\n source: SuggestionDataSource<T>,\n query: string,\n sourceIndex: number,\n querySequenceStart: number,\n querySequenceEnd: number,\n fullText: string,\n ) => {\n try {\n const dataProvider = getDataProvider(source.data, source.ignoreAccents);\n setLoading(true);\n const results = await dataProvider(query);\n setSuggestions(s => {\n return {\n ...s,\n [sourceIndex]: {\n queryInfo: {\n childIndex: sourceIndex,\n query,\n querySequenceStart,\n querySequenceEnd,\n plainTextValue: fullText,\n },\n results,\n },\n };\n });\n } catch (err) {\n console.error(err);\n } finally {\n setLoading(false);\n }\n },\n [],\n );\n\n const dataSourcesRef = useRef(dataSources);\n useEffect(() => {\n dataSourcesRef.current = dataSources;\n }, [dataSources]);\n\n useEffect(() => {\n setSuggestions({});\n\n if (!selectionStart || selectionStart !== selectionEnd) {\n return;\n }\n\n const currentDataSources = dataSourcesRef.current;\n const plainText = getPlainText(value, currentDataSources);\n\n const positionInValue = mapPlainTextIndex(\n plainText,\n currentDataSources,\n selectionStart,\n 'NULL',\n );\n if (!positionInValue) {\n return;\n }\n\n const substringStartIndex = getEndOfLastMention(\n plainText.substring(0, positionInValue),\n currentDataSources,\n );\n const substring = plainText.substring(substringStartIndex, selectionStart);\n\n currentDataSources.forEach((source, sourceIndex) => {\n if (!source) {\n return;\n }\n\n const regex = makeTriggerRegex(\n source.trigger || DefaultTrigger,\n source.allowSpaceInQuery,\n );\n const match = substring.match(regex);\n if (match) {\n const querySequenceStart =\n substringStartIndex + substring.indexOf(match[1], match.index);\n queryDataSource(\n source,\n match[2],\n sourceIndex,\n querySequenceStart,\n querySequenceStart + match[1].length,\n plainText,\n );\n }\n });\n }, [selectionStart, selectionEnd, value, queryDataSource]);\n\n const clearSuggestions = useCallback(() => {\n setSuggestions({});\n setFocusIndex(0);\n }, [setSuggestions, setFocusIndex]);\n\n const handleSelect = useCallback(\n (result: SuggestionData<T>, queryInfo: any) => {\n onSelect(result, queryInfo);\n clearSuggestions();\n },\n [onSelect, clearSuggestions],\n );\n\n const handleMouseEnter = useCallback(\n (focusIndex: number) => {\n setFocusIndex(focusIndex);\n },\n [setFocusIndex],\n );\n\n const renderedSuggestions = useMemo(() => {\n return Object.values(suggestions).reduce(\n (accResults, { results, queryInfo }) => [\n ...accResults,\n ...results.map((result: SuggestionData<T>, index: number) => (\n <Suggestion\n key={result.id}\n id={result.id}\n query={queryInfo.query}\n index={index}\n suggestion={result}\n focused={index === focusIndex}\n onClick={() => handleSelect(result, queryInfo)}\n onMouseEnter={() => handleMouseEnter(index)}\n />\n )),\n ],\n [],\n );\n }, [suggestions, handleSelect, handleMouseEnter, focusIndex]);\n\n if (selectionStart === null || selectionStart !== selectionEnd) {\n return null;\n }\n\n if (!loading && renderedSuggestions.length === 0) {\n return null;\n }\n\n return (\n <>\n <KeyboardListener\n suggestions={suggestions}\n clearSuggestions={clearSuggestions}\n onSelect={handleSelect}\n focusIndex={focusIndex}\n setFocusIndex={setFocusIndex}\n setScrollFocusedIntoView={setScrollFocusedIntoView}\n loading={loading}\n />\n <Popper\n placement=\"bottom-start\"\n {...props.slotProps?.popper}\n sx={{ zIndex: 2, ...props.slotProps?.popper?.sx }}\n open={true}\n anchorEl={cursorRef.current}\n >\n <Paper elevation={8} onMouseDown={onMouseDown}>\n <List\n ref={ulElement}\n sx={{ width: '300px', maxHeight: '40vh', overflow: 'auto' }}\n >\n {renderedSuggestions.length > 0\n ? renderedSuggestions\n : loading && (\n <Stack\n justifyContent=\"center\"\n alignItems=\"center\"\n height=\"40vh\"\n >\n <CircularProgress />\n </Stack>\n )}\n </List>\n </Paper>\n </Popper>\n </>\n );\n};\n\nexport default SuggestionsOverlay;\n\nenum Key {\n Tab = 'Tab',\n Return = 'Enter',\n Escape = 'Escape',\n Up = 'ArrowUp',\n Down = 'ArrowDown',\n}\n\nconst KeyboardListener = <T extends BaseSuggestionData>(\n props: KeyboardListenerProps<T>,\n): ReactNode => {\n const {\n suggestions,\n clearSuggestions,\n focusIndex,\n setFocusIndex,\n setScrollFocusedIntoView,\n onSelect,\n loading,\n } = props;\n\n useEffect(() => {\n const shiftFocus = (delta: number) => {\n if (loading) return;\n\n const suggestionsCount = countSuggestions(suggestions);\n setFocusIndex((suggestionsCount + focusIndex + delta) % suggestionsCount);\n setScrollFocusedIntoView(true);\n };\n\n const selectFocused = () => {\n if (loading) return;\n\n const {\n result,\n queryInfo,\n }: { result: SuggestionData<T>; queryInfo: SuggestionsQueryInfo } =\n Object.values(suggestions).reduce(\n (acc: Suggestions<T>[], { results, queryInfo }: Suggestions<T>) => [\n ...acc,\n ...results.map((result: SuggestionData<T>) => ({\n result,\n queryInfo,\n })),\n ],\n [],\n )[focusIndex];\n onSelect(result, queryInfo);\n };\n\n const handleKeyDown = (ev: KeyboardEvent) => {\n switch (ev.key) {\n case Key.Escape: {\n clearSuggestions();\n break;\n }\n case Key.Down: {\n shiftFocus(+1);\n break;\n }\n case Key.Up: {\n shiftFocus(-1);\n break;\n }\n\n case Key.Return:\n case Key.Tab: {\n selectFocused();\n break;\n }\n default: {\n return;\n }\n }\n\n ev.preventDefault();\n ev.stopPropagation();\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [\n suggestions,\n clearSuggestions,\n focusIndex,\n setFocusIndex,\n onSelect,\n setScrollFocusedIntoView,\n loading,\n ]);\n\n return null;\n};\n","import { ReactNode } from 'react';\nimport ListItemButton from '@mui/material/ListItemButton';\n\nimport {\n BaseSuggestionData,\n DefaultDisplayTransform,\n} from 'types/fieldMentions';\n\nimport { SuggestionProps } from './props';\n\nconst Suggestion = <T extends BaseSuggestionData>(\n props: SuggestionProps<T>,\n): ReactNode => {\n const { renderSuggestion, suggestion, focused, onClick, onMouseEnter } =\n props;\n\n if (renderSuggestion) {\n return renderSuggestion(props);\n }\n\n const display = DefaultDisplayTransform(suggestion.id, suggestion.display);\n return (\n <ListItemButton\n role=\"option\"\n aria-selected={focused}\n selected={focused}\n onClick={onClick}\n onMouseEnter={onMouseEnter}\n >\n {display}\n </ListItemButton>\n );\n};\n\nexport default Suggestion;\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/FieldMentions/index.tsx","../../../src/components/FieldMentions/Highlighter/index.tsx","../../../src/components/FieldMentions/Mention/index.tsx","../../../src/components/FieldMentions/utils.ts","../../../src/components/FieldMentions/SuggestionOverlay/index.tsx","../../../src/components/FieldMentions/SuggestionOverlay/Suggestion/index.tsx"],"names":["useEffect","useRef","useState","TextField","Box","Portal","jsx","Mention","display","color","backgroundColor","Mention_default","invariant","isNumber","val","combineRegExps","regExps","serializedRegexParser","regex","regexString","regexFlags","countPlaceholders","markup","count","findIndexOfCapturingGroup","parameterName","indexDisplay","indexId","iterateMentionsMarkup","value","dataSources","markupProcessor","plainTextProcessor","multiline","ds","verifyCapturingGroups","DefaultMarkupTemplate","markupToRegex","accOffset","captureGroupOffsets","result","match","start","currentPlainTextIndex","offset","o","mentionChildIndex","displayTransform","idPos","displayPos","id","DefaultDisplayTransform","substr","getPlainText","_match","_index","_plainTextIndex","_id","plainText","numberOfGroups","numberOfPlaceholders","escapedMarkup","escapeRegex","charAfterDisplay","charAfterId","str","applyChangeToValue","plainTextValue","selectionStartBefore","selectionEndBefore","selectionEndAfter","oldPlainTextValue","lengthDelta","insert","spliceStart","spliceEnd","mappedSpliceStart","mapPlainTextIndex","mappedSpliceEnd","controlSpliceStart","controlSpliceEnd","willRemoveMention","newValue","spliceString","controlPlainTextValue","indexInPlainText","inMarkupCorrection","index","mentionPlainTextIndex","substrPlainTextIndex","end","findStartOfMentionInPlainText","_markup","getMentions","mentions","plainTextIndex","childIndex","countSuggestions","suggestions","acc","results","getEndOfLastMention","lastMention","makeTriggerRegex","trigger","allowSpaceInQuery","escapedTriggerChar","getDataProvider","data","ignoreAccents","query","i","getSubstringIndex","normalizeString","removeAccents","formattedStr","diacritics_default","letterDiacritics","makeMentionsMarkup","jsxs","getHighlighterRect","input","rec","computedStyle","Highlighter","props","highlighterRef","cursorRef","selectionEnd","selectionStart","components","dataSourceIndex","dataSource","text","indexInPlaintext","theme","splitIndex","startText","endText","rect","Highlighter_default","useCallback","useMemo","CircularProgress","List","Paper","Popper","Stack","ListItemButton","Suggestion","renderSuggestion","suggestion","focused","onClick","onMouseEnter","Suggestion_default","Fragment","SuggestionsOverlay","onSelect","onMouseDown","ulElement","setSuggestions","focusIndex","setFocusIndex","scrollFocusedIntoView","setScrollFocusedIntoView","loading","setLoading","current","scrollTop","top","bottom","topContainer","queryDataSource","source","sourceIndex","querySequenceStart","querySequenceEnd","fullText","dataProvider","s","err","dataSourcesRef","currentDataSources","positionInValue","substringStartIndex","substring","DefaultTrigger","clearSuggestions","handleSelect","queryInfo","handleMouseEnter","renderedSuggestions","accResults","KeyboardListener","SuggestionOverlay_default","shiftFocus","delta","suggestionsCount","selectFocused","handleKeyDown","ev","FieldMentions","stateValue","setStateValue","inputRef","setInputRef","suggestionsMouseDown","setSelectionStart","setSelectionEnd","handleInputRef","ref","externalInputRef","onScroll","others","finalValue","handleBlur","handleSuggestionsMouseDown","addMention","appendSpaceOnAdd","onAdd","displayValue","newCaretPosition","newPlainTextValue","handleChange","selectionStartAfter","startOfMention","inputProps","FieldMentions_default"],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport React, { ReactNode, useEffect, useRef, useState } from 'react';\nimport { Theme } from '@mui/material/styles';\nimport TextField, { TextFieldProps } from '@mui/material/TextField';\n\nimport {\n BaseSuggestionData,\n DefaultDisplayTransform,\n DefaultMarkupTemplate,\n SuggestionData,\n SuggestionsQueryInfo,\n} from 'types/fieldMentions';\n\nimport Highlighter from './Highlighter';\nimport { FieldMentionsBaseProps, FieldMentionsProps } from './props';\nimport SuggestionsOverlay from './SuggestionOverlay';\nimport {\n applyChangeToValue,\n findStartOfMentionInPlainText,\n getMentions,\n getPlainText,\n isNumber,\n makeMentionsMarkup,\n mapPlainTextIndex,\n spliceString,\n} from './utils';\n\nconst FieldMentions = <T extends BaseSuggestionData>(\n props: FieldMentionsProps<T>,\n): ReactNode => {\n const [stateValue, setStateValue] = useState<string>(\n props.defaultValue || '',\n );\n\n const [inputRef, setInputRef] = useState<\n HTMLInputElement | HTMLTextAreaElement | null\n >(null);\n const highlighterRef = useRef<HTMLDivElement>(null);\n const cursorRef = useRef<HTMLSpanElement>(null);\n const suggestionsMouseDown = useRef(false);\n\n const [selectionStart, setSelectionStart] = useState<number | null>(null);\n const [selectionEnd, setSelectionEnd] = useState<number | null>(null);\n\n const handleInputRef = (\n ref: HTMLInputElement | HTMLTextAreaElement | null,\n ) => {\n setInputRef(ref);\n\n if (externalInputRef) {\n if (typeof externalInputRef === 'function') {\n externalInputRef(ref);\n } else if (\n externalInputRef &&\n 'current' in externalInputRef &&\n typeof externalInputRef !== 'function'\n ) {\n (\n externalInputRef as React.MutableRefObject<\n HTMLInputElement | HTMLTextAreaElement | null\n >\n ).current = ref;\n }\n }\n };\n\n useEffect(() => {\n const input = inputRef;\n const onScroll = () => {\n if (!highlighterRef.current || !input) {\n return;\n }\n highlighterRef.current.scrollLeft = input.scrollLeft;\n highlighterRef.current.scrollTop = input.scrollTop;\n };\n\n input?.addEventListener('scroll', onScroll);\n return () => input?.removeEventListener('scroll', onScroll);\n }, [inputRef, highlighterRef]);\n\n useEffect(() => {\n const input = inputRef;\n if (\n !input ||\n (input.selectionStart === selectionStart &&\n input.selectionEnd === selectionEnd)\n ) {\n return;\n }\n input.setSelectionRange(selectionStart, selectionEnd);\n }, [selectionStart, selectionEnd, inputRef]);\n\n const { value, dataSources, inputRef: externalInputRef, ...others } = props;\n const finalValue = value !== undefined ? value : stateValue;\n\n const handleBlur = () => {\n if (!suggestionsMouseDown.current) {\n setSelectionStart(null);\n setSelectionEnd(null);\n }\n suggestionsMouseDown.current = false;\n };\n\n const handleSuggestionsMouseDown = () => {\n suggestionsMouseDown.current = true;\n };\n\n const addMention = (\n suggestion: SuggestionData<T>,\n {\n childIndex,\n querySequenceStart,\n querySequenceEnd,\n plainTextValue,\n }: SuggestionsQueryInfo,\n ) => {\n const dataSource = dataSources[childIndex];\n\n const { markup, displayTransform, appendSpaceOnAdd, onAdd } = dataSource;\n\n const start = mapPlainTextIndex(\n finalValue,\n dataSources,\n querySequenceStart,\n 'START',\n );\n if (!isNumber(start)) {\n return;\n }\n\n const end = start + querySequenceEnd - querySequenceStart;\n\n let insert = makeMentionsMarkup(\n markup || DefaultMarkupTemplate,\n suggestion.id,\n suggestion.display,\n );\n let displayValue = (displayTransform || DefaultDisplayTransform)(\n suggestion.id,\n suggestion.display,\n );\n\n if (appendSpaceOnAdd) {\n insert += ' ';\n displayValue += ' ';\n }\n\n const newCaretPosition = querySequenceStart + displayValue.length;\n setSelectionStart(newCaretPosition);\n setSelectionEnd(newCaretPosition);\n\n const newValue = spliceString(finalValue, start, end, insert);\n const mentions = getMentions(newValue, dataSources);\n const newPlainTextValue = spliceString(\n plainTextValue,\n querySequenceStart,\n querySequenceEnd,\n displayValue,\n );\n\n const onChange = props.onChange || setStateValue;\n onChange(newValue, newPlainTextValue, mentions);\n onAdd?.(suggestion, start, end);\n };\n\n const handleChange = (ev: React.ChangeEvent<HTMLInputElement>) => {\n let newPlainTextValue = ev.target.value;\n\n let selectionStartBefore = selectionStart;\n if (!isNumber(selectionStartBefore)) {\n selectionStartBefore = ev.target.selectionStart;\n }\n\n let selectionEndBefore = selectionEnd;\n if (!isNumber(selectionEndBefore)) {\n selectionEndBefore = ev.target.selectionEnd;\n }\n\n const newValue = applyChangeToValue(\n finalValue,\n newPlainTextValue,\n selectionStartBefore,\n selectionEndBefore,\n ev.target.selectionEnd || 0,\n dataSources,\n props.multiline,\n );\n\n newPlainTextValue = getPlainText(newValue, dataSources);\n\n let selectionStartAfter = ev.target.selectionStart;\n let selectionEndAfter = ev.target.selectionEnd;\n\n const startOfMention = findStartOfMentionInPlainText(\n finalValue,\n dataSources,\n ev.target.selectionStart || 0,\n );\n if (\n startOfMention !== undefined &&\n selectionEndAfter !== null &&\n selectionEndAfter > startOfMention\n ) {\n const data = (ev.nativeEvent as any).data;\n selectionStartAfter = startOfMention + (data ? data.length : 0);\n selectionEndAfter = selectionStartAfter;\n }\n\n setSelectionStart(selectionStartAfter);\n setSelectionEnd(selectionEndAfter);\n\n const mentions = getMentions(newValue, dataSources);\n\n const onChange = props.onChange || setStateValue;\n onChange(newValue, newPlainTextValue, mentions);\n };\n\n const handleSelect = (ev: React.ChangeEvent<HTMLInputElement>) => {\n setSelectionStart(ev.target.selectionStart);\n setSelectionEnd(ev.target.selectionEnd);\n props.onSelect?.(ev);\n };\n\n const inputProps: TextFieldProps = {\n ...others,\n value: getPlainText(finalValue, dataSources, props.multiline),\n onChange: handleChange,\n onSelect: handleSelect,\n onBlur: handleBlur,\n InputProps: {\n sx: {\n overscrollBehavior: 'none',\n color: 'transparent',\n caretColor: (theme: Theme) => theme.palette.text.primary,\n },\n },\n };\n\n return (\n <>\n <Highlighter\n highlighterRef={highlighterRef}\n cursorRef={cursorRef}\n selectionStart={selectionStart}\n selectionEnd={selectionEnd}\n value={finalValue}\n dataSources={dataSources}\n inputRef={inputRef}\n multiline={inputProps.multiline}\n />\n <TextField inputRef={handleInputRef} {...inputProps} />\n <SuggestionsOverlay\n value={finalValue}\n dataSources={dataSources}\n selectionStart={selectionStart}\n selectionEnd={selectionEnd}\n cursorRef={cursorRef}\n loading={false}\n onSelect={addMention}\n onMouseDown={handleSuggestionsMouseDown}\n slotProps={props.slotProps?.suggestionsOverlay}\n />\n </>\n );\n};\n\nexport default FieldMentions;\nexport type { FieldMentionsBaseProps, FieldMentionsProps };\n","import { type JSX, ReactNode } from 'react';\nimport Box from '@mui/material/Box';\nimport Portal from '@mui/material/Portal';\n\nimport { BaseSuggestionData } from 'types/fieldMentions';\n\nimport Mention from '../Mention';\nimport { iterateMentionsMarkup } from '../utils';\n\nimport { HighlighterProps } from './props';\n\nfunction getHighlighterRect(\n input?: HTMLInputElement | HTMLTextAreaElement | null,\n) {\n const rec = { x: 0, y: 0, width: 0, height: 0 };\n if (!input) {\n return rec;\n }\n\n const computedStyle = getComputedStyle(input);\n rec.width = input.clientWidth;\n rec.width -= parseFloat(computedStyle.paddingLeft);\n rec.width -= parseFloat(computedStyle.paddingRight);\n rec.height = input.clientHeight;\n rec.height -= parseFloat(computedStyle.paddingTop);\n rec.height -= parseFloat(computedStyle.paddingBottom);\n\n rec.x = input.offsetLeft;\n rec.x += parseFloat(computedStyle.paddingLeft);\n rec.x += parseFloat(computedStyle.borderLeft);\n rec.y = input.offsetTop;\n rec.y += parseFloat(computedStyle.paddingTop);\n rec.y += parseFloat(computedStyle.borderTop);\n\n return rec;\n}\n\nconst Highlighter = <T extends BaseSuggestionData>(\n props: HighlighterProps<T>,\n): ReactNode => {\n const {\n highlighterRef,\n cursorRef,\n selectionEnd,\n selectionStart,\n value,\n dataSources,\n multiline,\n } = props;\n const components: JSX.Element[] = [];\n\n const handleMention = (\n _markup: string,\n index: number,\n _plainTextIndex: number,\n id: string,\n display: string,\n dataSourceIndex: number,\n ) => {\n const dataSource = dataSources[dataSourceIndex];\n components.push(\n <Mention\n key={`${id}-${index}`}\n display={display}\n color={dataSource?.color}\n backgroundColor={dataSource?.backgroundColor}\n />,\n );\n };\n\n const handlePlainText = (\n text: string,\n index: number,\n indexInPlaintext: number,\n ) => {\n if (!multiline) {\n text = text.replaceAll('\\n', '');\n }\n\n const renderCursor =\n selectionStart &&\n selectionStart === selectionEnd &&\n selectionStart >= indexInPlaintext &&\n selectionStart <= indexInPlaintext + text.length;\n\n if (!renderCursor) {\n components.push(\n <Box\n key={`${index}-${indexInPlaintext}`}\n component=\"span\"\n sx={{ color: theme => theme.palette.text.primary }}\n >\n {text}\n </Box>,\n );\n } else {\n const splitIndex = selectionStart - indexInPlaintext;\n const startText = text.substring(0, splitIndex);\n const endText = text.substring(splitIndex);\n\n if (startText) {\n components.push(\n <Box\n key={`${index}-${indexInPlaintext}-precursor`}\n component=\"span\"\n sx={{ color: theme => theme.palette.text.primary }}\n >\n {startText}\n </Box>,\n );\n }\n\n components.push(\n <Box\n key=\"cursor\"\n ref={cursorRef}\n component=\"span\"\n visibility=\"hidden\"\n ></Box>,\n );\n\n if (endText) {\n components.push(\n <Box\n key={`${index}-${indexInPlaintext}-postcursor`}\n component=\"span\"\n sx={{ color: theme => theme.palette.text.primary }}\n >\n {endText}\n </Box>,\n );\n }\n }\n };\n\n iterateMentionsMarkup(\n value,\n dataSources,\n handleMention,\n handlePlainText,\n multiline,\n );\n\n const rect = getHighlighterRect(props.inputRef);\n\n return (\n <Portal container={() => props.inputRef?.parentElement || null}>\n <Box\n ref={highlighterRef}\n sx={{\n position: 'absolute',\n top: `${rect.y}px`,\n left: `${rect.x}px`,\n width: `${rect.width}px`,\n height: `${rect.height}px`,\n whiteSpace: multiline ? 'pre-wrap' : 'pre',\n overflow: 'hidden',\n overscrollBehavior: 'none',\n zIndex: 1,\n pointerEvents: 'none',\n }}\n >\n {components}\n <Box component=\"span\" visibility=\"hidden\">\n {' '}\n </Box>\n </Box>\n </Portal>\n );\n};\n\nexport default Highlighter;\n","import Box from '@mui/material/Box';\n\nimport { MentionProps } from './props';\n\nconst Mention = ({ display, color, backgroundColor }: MentionProps) => {\n return (\n <Box\n component=\"span\"\n sx={{\n color: color || 'inherit',\n bgcolor: backgroundColor,\n }}\n >\n {display}\n </Box>\n );\n};\n\nexport default Mention;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport invariant from 'invariant';\n\nimport {\n BaseSuggestionData,\n DefaultDisplayTransform,\n DefaultMarkupTemplate,\n MentionData,\n SuggestionData,\n SuggestionDataSource,\n SuggestionsMap,\n} from 'types/fieldMentions';\nimport lettersDiacritics from 'utils/diacritics';\n\nenum Placeholders {\n id = '__id__',\n display = '__display__',\n}\n\nexport function isNumber(val: any): val is number {\n return typeof val === 'number';\n}\n\nfunction combineRegExps(regExps: RegExp[]): RegExp {\n const serializedRegexParser = /^\\/(.+)\\/(\\w+)?$/;\n return new RegExp(\n regExps\n .map(regex => {\n const [, regexString, regexFlags] =\n serializedRegexParser.exec(regex.toString()) || [];\n\n invariant(\n !regexFlags,\n `RegExp flags are not supported. Change /${regexString}/${regexFlags} into /${regexString}/`,\n );\n\n return `(${regexString})`;\n })\n .join('|'),\n 'g',\n );\n}\n\nfunction countPlaceholders(markup: string): number {\n let count = 0;\n if (markup.indexOf(Placeholders.id) >= 0) count++;\n if (markup.indexOf(Placeholders.display) >= 0) count++;\n return count;\n}\n\nfunction findIndexOfCapturingGroup(\n markup: string,\n parameterName: 'id' | 'display',\n): number {\n invariant(\n parameterName === 'id' || parameterName === 'display',\n `Second arg must be either \"id\" or \"display\", got: \"${parameterName}\"`,\n );\n\n const indexDisplay = markup.indexOf(Placeholders.display);\n const indexId = markup.indexOf(Placeholders.id);\n\n invariant(\n indexDisplay >= 0 || indexId >= 0,\n `The markup '${markup}' does not contain at least one of the placeholders '__id__' or '__display__'`,\n );\n\n if (indexDisplay >= 0 && indexId >= 0) {\n return (parameterName === 'id' && indexId <= indexDisplay) ||\n (parameterName === 'display' && indexDisplay <= indexId)\n ? 0\n : 1;\n }\n\n return 0;\n}\n\nexport function iterateMentionsMarkup<T extends BaseSuggestionData>(\n value: string,\n dataSources: SuggestionDataSource<T>[],\n markupProcessor: (\n match: string,\n matchIndex: number,\n plainTextIndex: number,\n id: string,\n display: string,\n mentionIndex: number,\n start: number,\n ) => void,\n plainTextProcessor?: (\n value: string,\n start: number,\n currentIndex: number,\n ) => void,\n multiline?: boolean,\n) {\n const regex = combineRegExps(\n dataSources.map(ds =>\n ds.regex\n ? verifyCapturingGroups(ds.regex, ds.markup || DefaultMarkupTemplate)\n : markupToRegex(ds.markup || DefaultMarkupTemplate),\n ),\n );\n\n let accOffset = 2;\n const captureGroupOffsets = dataSources.map(({ markup }) => {\n const result = accOffset;\n accOffset += countPlaceholders(markup || DefaultMarkupTemplate) + 1;\n return result;\n });\n\n let match: RegExpExecArray | null;\n let start = 0;\n let currentPlainTextIndex = 0;\n\n while ((match = regex.exec(value)) !== null) {\n const offset = captureGroupOffsets.find(o => !!match?.[o]);\n if (offset === undefined) {\n continue;\n }\n\n const mentionChildIndex = captureGroupOffsets.indexOf(offset);\n const { markup, displayTransform } = dataSources[mentionChildIndex];\n const idPos =\n offset + findIndexOfCapturingGroup(markup || DefaultMarkupTemplate, 'id');\n const displayPos =\n offset +\n findIndexOfCapturingGroup(markup || DefaultMarkupTemplate, 'display');\n\n const id = match[idPos];\n const display = displayTransform\n ? displayTransform(id, match[displayPos])\n : DefaultDisplayTransform(id, match[displayPos], multiline);\n\n const substr = value.substring(start, match.index);\n plainTextProcessor?.(substr, start, currentPlainTextIndex);\n currentPlainTextIndex += substr.length;\n\n markupProcessor(\n match[0],\n match.index,\n currentPlainTextIndex,\n id,\n display,\n mentionChildIndex,\n start,\n );\n currentPlainTextIndex += display.length;\n start = regex.lastIndex;\n }\n\n if (start < value.length) {\n plainTextProcessor?.(value.substring(start), start, currentPlainTextIndex);\n }\n}\n\nexport function getPlainText<T extends BaseSuggestionData>(\n value: string,\n dataSources: SuggestionDataSource<T>[],\n multiline?: boolean,\n): string {\n let result = '';\n iterateMentionsMarkup(\n value,\n dataSources,\n (_match, _index, _plainTextIndex, _id, display) => {\n result += display;\n },\n plainText => {\n result += plainText;\n },\n multiline,\n );\n return result;\n}\n\nconst verifyCapturingGroups = (regex: RegExp, markup: string) => {\n const numberOfGroups =\n (new RegExp(regex.toString() + '|').exec('')?.length || 0) - 1;\n const numberOfPlaceholders = countPlaceholders(markup);\n\n invariant(\n numberOfGroups === numberOfPlaceholders,\n `Number of capturing groups in RegExp ${regex.toString()} (${numberOfGroups}) does not match the number of placeholders in the markup '${markup}' (${numberOfPlaceholders})`,\n );\n\n return regex;\n};\n\nconst markupToRegex = (markup: string) => {\n const escapedMarkup = escapeRegex(markup);\n\n const charAfterDisplay =\n markup[markup.indexOf(Placeholders.display) + Placeholders.display.length];\n const charAfterId =\n markup[markup.indexOf(Placeholders.id) + Placeholders.id.length];\n\n return new RegExp(\n escapedMarkup\n .replace(\n Placeholders.display,\n `([^${escapeRegex(charAfterDisplay || '')}]+?)`,\n )\n .replace(Placeholders.id, `([^${escapeRegex(charAfterId || '')}]+?)`),\n );\n};\n\nconst escapeRegex = (str: string) =>\n str.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n\nexport function applyChangeToValue<T extends BaseSuggestionData>(\n value: string,\n plainTextValue: string,\n selectionStartBefore: number | null,\n selectionEndBefore: number | null,\n selectionEndAfter: number,\n dataSources: SuggestionDataSource<T>[],\n multiline?: boolean,\n) {\n const oldPlainTextValue = getPlainText(value, dataSources, multiline);\n\n const lengthDelta = oldPlainTextValue.length - plainTextValue.length;\n if (selectionStartBefore === null) {\n selectionStartBefore = selectionEndAfter + lengthDelta;\n }\n\n if (selectionEndBefore === null) {\n selectionEndBefore = selectionStartBefore;\n }\n\n if (\n selectionStartBefore === selectionEndBefore &&\n selectionEndBefore === selectionEndAfter &&\n oldPlainTextValue.length === plainTextValue.length\n ) {\n selectionStartBefore = selectionStartBefore - 1;\n }\n\n let insert = plainTextValue.slice(selectionStartBefore, selectionEndAfter);\n\n let spliceStart = Math.min(selectionStartBefore, selectionEndAfter);\n\n let spliceEnd = selectionEndBefore;\n if (selectionStartBefore === selectionEndAfter) {\n spliceEnd = Math.max(\n selectionEndBefore,\n selectionStartBefore + lengthDelta,\n );\n }\n\n let mappedSpliceStart = mapPlainTextIndex(\n value,\n dataSources,\n spliceStart,\n 'START',\n );\n let mappedSpliceEnd = mapPlainTextIndex(value, dataSources, spliceEnd, 'END');\n\n const controlSpliceStart = mapPlainTextIndex(\n value,\n dataSources,\n spliceStart,\n 'NULL',\n );\n const controlSpliceEnd = mapPlainTextIndex(\n value,\n dataSources,\n spliceEnd,\n 'NULL',\n );\n const willRemoveMention =\n controlSpliceStart === null || controlSpliceEnd === null;\n\n let newValue = spliceString(\n value,\n mappedSpliceStart || 0,\n mappedSpliceEnd || 0,\n insert,\n );\n\n if (!willRemoveMention) {\n const controlPlainTextValue = getPlainText(\n newValue,\n dataSources,\n multiline,\n );\n if (controlPlainTextValue !== plainTextValue) {\n spliceStart = 0;\n while (plainTextValue[spliceStart] === controlPlainTextValue[spliceStart])\n spliceStart++;\n\n insert = plainTextValue.slice(spliceStart, selectionEndAfter);\n\n spliceEnd = oldPlainTextValue.lastIndexOf(\n plainTextValue.substring(selectionEndAfter),\n );\n\n mappedSpliceStart = mapPlainTextIndex(\n value,\n dataSources,\n spliceStart,\n 'START',\n );\n mappedSpliceEnd = mapPlainTextIndex(value, dataSources, spliceEnd, 'END');\n newValue = spliceString(\n value,\n mappedSpliceStart || 0,\n mappedSpliceEnd || 0,\n insert,\n );\n }\n }\n\n return newValue;\n}\n\nexport function mapPlainTextIndex<T extends BaseSuggestionData>(\n value: string,\n dataSources: SuggestionDataSource<T>[],\n indexInPlainText: number,\n inMarkupCorrection: 'START' | 'END' | 'NULL' = 'START',\n): number | null | undefined {\n if (typeof indexInPlainText !== 'number') {\n return indexInPlainText;\n }\n\n let result: number | undefined | null = undefined;\n\n const plainTextProcessor = (\n substr: string,\n index: number,\n substrPlainTextIndex: number,\n ) => {\n if (result !== undefined) return;\n\n if (substrPlainTextIndex + substr.length >= indexInPlainText) {\n result = index + indexInPlainText - substrPlainTextIndex;\n }\n };\n\n const markupProcessor = (\n markup: string,\n index: number,\n mentionPlainTextIndex: number,\n _id: string,\n display: string,\n ) => {\n if (result !== undefined) return;\n\n if (mentionPlainTextIndex + display.length > indexInPlainText) {\n if (inMarkupCorrection === 'NULL') {\n result = null;\n } else {\n result = index + (inMarkupCorrection === 'END' ? markup.length : 0);\n }\n }\n };\n\n iterateMentionsMarkup(\n value,\n dataSources,\n markupProcessor,\n plainTextProcessor,\n );\n\n return result === undefined ? value.length : result;\n}\n\nexport function spliceString(\n str: string,\n start: number,\n end: number,\n insert: string,\n): string {\n return str.substring(0, start) + insert + str.substring(end);\n}\n\nexport function findStartOfMentionInPlainText<T extends BaseSuggestionData>(\n value: string,\n dataSources: SuggestionDataSource<T>[],\n indexInPlainText: number,\n): number | undefined {\n let result: number | undefined = undefined;\n\n const markupProcessor = (\n _markup: string,\n _index: number,\n mentionPlainTextIndex: number,\n _id: string,\n display: string,\n ) => {\n if (\n mentionPlainTextIndex <= indexInPlainText &&\n mentionPlainTextIndex + display.length > indexInPlainText\n ) {\n result = mentionPlainTextIndex;\n }\n };\n\n iterateMentionsMarkup(value, dataSources, markupProcessor);\n return result;\n}\n\nexport function getMentions<T extends BaseSuggestionData>(\n value: string,\n dataSources: SuggestionDataSource<T>[],\n): MentionData[] {\n const mentions: MentionData[] = [];\n iterateMentionsMarkup(\n value,\n dataSources,\n (_match, index, plainTextIndex, id, display, childIndex) => {\n mentions.push({\n id,\n display,\n dataSourceIndex: childIndex,\n index,\n plainTextIndex,\n });\n },\n );\n return mentions;\n}\n\nexport function countSuggestions<T extends BaseSuggestionData>(\n suggestions: SuggestionsMap<T>,\n) {\n return Object.values(suggestions).reduce(\n (acc, { results }) => acc + results.length,\n 0,\n );\n}\n\nexport function getEndOfLastMention<T extends BaseSuggestionData>(\n value: string,\n dataSources: SuggestionDataSource<T>[],\n) {\n const mentions = getMentions(value, dataSources);\n const lastMention = mentions[mentions.length - 1];\n return lastMention\n ? lastMention.plainTextIndex + lastMention.display.length\n : 0;\n}\n\nexport function makeTriggerRegex(\n trigger: string | RegExp,\n allowSpaceInQuery?: boolean,\n) {\n if (trigger instanceof RegExp) {\n return trigger;\n } else {\n const escapedTriggerChar = escapeRegex(trigger);\n\n return new RegExp(\n `(?:^|\\\\s)(${escapedTriggerChar}([^${allowSpaceInQuery ? '' : '\\\\s'}${escapedTriggerChar}]*))$`,\n );\n }\n}\n\nexport function getDataProvider<T extends BaseSuggestionData>(\n data: SuggestionData<T>[] | ((query: string) => Promise<SuggestionData<T>[]>),\n ignoreAccents?: boolean,\n): (query: string) => Promise<SuggestionData<T>[]> {\n if (data instanceof Array) {\n return async function (query: string) {\n const results = [];\n for (let i = 0, l = data.length; i < l; ++i) {\n const display = data[i].display || data[i].id;\n if (getSubstringIndex(display, query, ignoreAccents) >= 0) {\n results.push(data[i]);\n }\n }\n return results;\n };\n }\n return data;\n}\n\nconst getSubstringIndex = (\n str: string,\n substr: string,\n ignoreAccents?: boolean,\n) => {\n if (!ignoreAccents) {\n return str.toLowerCase().indexOf(substr.toLowerCase());\n }\n\n return normalizeString(str).indexOf(normalizeString(substr));\n};\n\nconst removeAccents = (str: string) => {\n let formattedStr = str;\n\n lettersDiacritics.forEach(letterDiacritics => {\n formattedStr = formattedStr.replace(\n letterDiacritics.letters,\n letterDiacritics.base,\n );\n });\n\n return formattedStr;\n};\n\nconst normalizeString = (str: string) => removeAccents(str).toLowerCase();\n\nexport const makeMentionsMarkup = (\n markup: string,\n id: string,\n display?: string,\n) => {\n return markup\n .replace(Placeholders.id, id)\n .replace(Placeholders.display, display || id);\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable no-console */\nimport {\n ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport CircularProgress from '@mui/material/CircularProgress';\nimport List from '@mui/material/List';\nimport Paper from '@mui/material/Paper';\nimport Popper from '@mui/material/Popper';\nimport Stack from '@mui/material/Stack';\n\nimport {\n BaseSuggestionData,\n DefaultTrigger,\n SuggestionData,\n SuggestionDataSource,\n Suggestions,\n SuggestionsMap,\n SuggestionsQueryInfo,\n} from 'types/fieldMentions';\n\nimport {\n countSuggestions,\n getDataProvider,\n getEndOfLastMention,\n getPlainText,\n makeTriggerRegex,\n mapPlainTextIndex,\n} from '../utils';\n\nimport { KeyboardListenerProps, SuggestionsOverlayProps } from './props';\nimport Suggestion from './Suggestion';\n\nconst SuggestionsOverlay = <T extends BaseSuggestionData>(\n props: SuggestionsOverlayProps<T>,\n) => {\n const {\n value,\n dataSources,\n selectionStart,\n selectionEnd,\n cursorRef,\n onSelect,\n onMouseDown,\n } = props;\n const ulElement = useRef<HTMLUListElement>(null);\n const [suggestions, setSuggestions] = useState<SuggestionsMap<T>>({});\n const [focusIndex, setFocusIndex] = useState(0);\n const [scrollFocusedIntoView, setScrollFocusedIntoView] = useState(false);\n const [loading, setLoading] = useState(false);\n\n useEffect(() => {\n const current = ulElement.current;\n if (!scrollFocusedIntoView || !current || current.children.length === 0) {\n return;\n }\n\n const scrollTop = current.scrollTop;\n\n let { top, bottom } = current.children[focusIndex].getBoundingClientRect();\n const { top: topContainer } = current.getBoundingClientRect();\n top = top - topContainer + scrollTop;\n bottom = bottom - topContainer + scrollTop;\n\n if (top < scrollTop) {\n current.scrollTop = top;\n } else if (bottom > current.offsetHeight + scrollTop) {\n current.scrollTop = bottom - current.offsetHeight;\n }\n\n setScrollFocusedIntoView(false);\n }, [scrollFocusedIntoView, ulElement, focusIndex, setScrollFocusedIntoView]);\n\n const queryDataSource = useCallback(\n async (\n source: SuggestionDataSource<T>,\n query: string,\n sourceIndex: number,\n querySequenceStart: number,\n querySequenceEnd: number,\n fullText: string,\n ) => {\n try {\n const dataProvider = getDataProvider(source.data, source.ignoreAccents);\n setLoading(true);\n const results = await dataProvider(query);\n setSuggestions(s => {\n return {\n ...s,\n [sourceIndex]: {\n queryInfo: {\n childIndex: sourceIndex,\n query,\n querySequenceStart,\n querySequenceEnd,\n plainTextValue: fullText,\n },\n results,\n },\n };\n });\n } catch (err) {\n console.error(err);\n } finally {\n setLoading(false);\n }\n },\n [],\n );\n\n const dataSourcesRef = useRef(dataSources);\n useEffect(() => {\n dataSourcesRef.current = dataSources;\n }, [dataSources]);\n\n useEffect(() => {\n setSuggestions({});\n\n if (!selectionStart || selectionStart !== selectionEnd) {\n return;\n }\n\n const currentDataSources = dataSourcesRef.current;\n const plainText = getPlainText(value, currentDataSources);\n\n const positionInValue = mapPlainTextIndex(\n plainText,\n currentDataSources,\n selectionStart,\n 'NULL',\n );\n if (!positionInValue) {\n return;\n }\n\n const substringStartIndex = getEndOfLastMention(\n plainText.substring(0, positionInValue),\n currentDataSources,\n );\n const substring = plainText.substring(substringStartIndex, selectionStart);\n\n currentDataSources.forEach((source, sourceIndex) => {\n if (!source) {\n return;\n }\n\n const regex = makeTriggerRegex(\n source.trigger || DefaultTrigger,\n source.allowSpaceInQuery,\n );\n const match = substring.match(regex);\n if (match) {\n const querySequenceStart =\n substringStartIndex + substring.indexOf(match[1], match.index);\n queryDataSource(\n source,\n match[2],\n sourceIndex,\n querySequenceStart,\n querySequenceStart + match[1].length,\n plainText,\n );\n }\n });\n }, [selectionStart, selectionEnd, value, queryDataSource]);\n\n const clearSuggestions = useCallback(() => {\n setSuggestions({});\n setFocusIndex(0);\n }, [setSuggestions, setFocusIndex]);\n\n const handleSelect = useCallback(\n (result: SuggestionData<T>, queryInfo: any) => {\n onSelect(result, queryInfo);\n clearSuggestions();\n },\n [onSelect, clearSuggestions],\n );\n\n const handleMouseEnter = useCallback(\n (focusIndex: number) => {\n setFocusIndex(focusIndex);\n },\n [setFocusIndex],\n );\n\n const renderedSuggestions = useMemo(() => {\n return Object.values(suggestions).reduce(\n (accResults, { results, queryInfo }) => [\n ...accResults,\n ...results.map((result: SuggestionData<T>, index: number) => (\n <Suggestion\n key={result.id}\n id={result.id}\n query={queryInfo.query}\n index={index}\n suggestion={result}\n focused={index === focusIndex}\n onClick={() => handleSelect(result, queryInfo)}\n onMouseEnter={() => handleMouseEnter(index)}\n />\n )),\n ],\n [],\n );\n }, [suggestions, handleSelect, handleMouseEnter, focusIndex]);\n\n if (selectionStart === null || selectionStart !== selectionEnd) {\n return null;\n }\n\n if (!loading && renderedSuggestions.length === 0) {\n return null;\n }\n\n return (\n <>\n <KeyboardListener\n suggestions={suggestions}\n clearSuggestions={clearSuggestions}\n onSelect={handleSelect}\n focusIndex={focusIndex}\n setFocusIndex={setFocusIndex}\n setScrollFocusedIntoView={setScrollFocusedIntoView}\n loading={loading}\n />\n <Popper\n placement=\"bottom-start\"\n {...props.slotProps?.popper}\n sx={{ zIndex: 2, ...props.slotProps?.popper?.sx }}\n open={true}\n anchorEl={cursorRef.current}\n >\n <Paper elevation={8} onMouseDown={onMouseDown}>\n <List\n ref={ulElement}\n sx={{ width: '300px', maxHeight: '40vh', overflow: 'auto' }}\n >\n {renderedSuggestions.length > 0\n ? renderedSuggestions\n : loading && (\n <Stack\n justifyContent=\"center\"\n alignItems=\"center\"\n height=\"40vh\"\n >\n <CircularProgress />\n </Stack>\n )}\n </List>\n </Paper>\n </Popper>\n </>\n );\n};\n\nexport default SuggestionsOverlay;\n\nenum Key {\n Tab = 'Tab',\n Return = 'Enter',\n Escape = 'Escape',\n Up = 'ArrowUp',\n Down = 'ArrowDown',\n}\n\nconst KeyboardListener = <T extends BaseSuggestionData>(\n props: KeyboardListenerProps<T>,\n): ReactNode => {\n const {\n suggestions,\n clearSuggestions,\n focusIndex,\n setFocusIndex,\n setScrollFocusedIntoView,\n onSelect,\n loading,\n } = props;\n\n useEffect(() => {\n const shiftFocus = (delta: number) => {\n if (loading) return;\n\n const suggestionsCount = countSuggestions(suggestions);\n setFocusIndex((suggestionsCount + focusIndex + delta) % suggestionsCount);\n setScrollFocusedIntoView(true);\n };\n\n const selectFocused = () => {\n if (loading) return;\n\n const {\n result,\n queryInfo,\n }: { result: SuggestionData<T>; queryInfo: SuggestionsQueryInfo } =\n Object.values(suggestions).reduce(\n (acc: Suggestions<T>[], { results, queryInfo }: Suggestions<T>) => [\n ...acc,\n ...results.map((result: SuggestionData<T>) => ({\n result,\n queryInfo,\n })),\n ],\n [],\n )[focusIndex];\n onSelect(result, queryInfo);\n };\n\n const handleKeyDown = (ev: KeyboardEvent) => {\n switch (ev.key) {\n case Key.Escape: {\n clearSuggestions();\n break;\n }\n case Key.Down: {\n shiftFocus(+1);\n break;\n }\n case Key.Up: {\n shiftFocus(-1);\n break;\n }\n\n case Key.Return:\n case Key.Tab: {\n selectFocused();\n break;\n }\n default: {\n return;\n }\n }\n\n ev.preventDefault();\n ev.stopPropagation();\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [\n suggestions,\n clearSuggestions,\n focusIndex,\n setFocusIndex,\n onSelect,\n setScrollFocusedIntoView,\n loading,\n ]);\n\n return null;\n};\n","import { ReactNode } from 'react';\nimport ListItemButton from '@mui/material/ListItemButton';\n\nimport {\n BaseSuggestionData,\n DefaultDisplayTransform,\n} from 'types/fieldMentions';\n\nimport { SuggestionProps } from './props';\n\nconst Suggestion = <T extends BaseSuggestionData>(\n props: SuggestionProps<T>,\n): ReactNode => {\n const { renderSuggestion, suggestion, focused, onClick, onMouseEnter } =\n props;\n\n if (renderSuggestion) {\n return renderSuggestion(props);\n }\n\n const display = DefaultDisplayTransform(suggestion.id, suggestion.display);\n return (\n <ListItemButton\n role=\"option\"\n aria-selected={focused}\n selected={focused}\n onClick={onClick}\n onMouseEnter={onMouseEnter}\n >\n {display}\n </ListItemButton>\n );\n};\n\nexport default Suggestion;\n"]}
|
|
@@ -1,15 +1,13 @@
|
|
|
1
|
-
export { p as ContentType, q as FileContentType, i as FileThumbnail, a as HelperText, b as MultiFilePreview, s as MultipleFileUpload, t as MultipleImageUpload, c as SingleFilePreview, u as SingleFileUpload, v as SingleImageUpload, w as UploadAvatar, x as UploadSimpleBox, l as compressImageWithoutCrop, k as convertToWebP, n as encodeFilenameForHeader, d as fileFormat, g as fileNameByUrl, e as fileThumb, h as fileThumbnailClasses, f as fileTypeByUrl, m as getFileNameFromContentDisposition, j as isImageFile, o as useDropzoneUploader, r as useFileUploadService } from '../../chunk-
|
|
2
|
-
import '../../chunk-
|
|
3
|
-
import '../../chunk-
|
|
4
|
-
import '../../chunk-DPT3E7PD.js';
|
|
1
|
+
export { p as ContentType, q as FileContentType, i as FileThumbnail, a as HelperText, b as MultiFilePreview, s as MultipleFileUpload, t as MultipleImageUpload, c as SingleFilePreview, u as SingleFileUpload, v as SingleImageUpload, w as UploadAvatar, x as UploadSimpleBox, l as compressImageWithoutCrop, k as convertToWebP, n as encodeFilenameForHeader, d as fileFormat, g as fileNameByUrl, e as fileThumb, h as fileThumbnailClasses, f as fileTypeByUrl, m as getFileNameFromContentDisposition, j as isImageFile, o as useDropzoneUploader, r as useFileUploadService } from '../../chunk-QVUHCBI2.js';
|
|
2
|
+
import '../../chunk-ZFRNMT3P.js';
|
|
3
|
+
import '../../chunk-RFRLNTFN.js';
|
|
5
4
|
import '../../chunk-KGLU4CR2.js';
|
|
6
|
-
import '../../chunk-
|
|
5
|
+
import '../../chunk-LNXA53QR.js';
|
|
7
6
|
import '../../chunk-OF6623HG.js';
|
|
8
|
-
import '../../chunk-
|
|
9
|
-
import '../../chunk-33C6UWPV.js';
|
|
7
|
+
import '../../chunk-N4DW7EIC.js';
|
|
10
8
|
import '../../chunk-45OMMG7D.js';
|
|
11
9
|
import '../../chunk-6U5LS7MP.js';
|
|
12
|
-
import '../../chunk-
|
|
10
|
+
import '../../chunk-NQNNMRLC.js';
|
|
13
11
|
import '../../chunk-CIGSMWKF.js';
|
|
14
12
|
import '../../chunk-VITOOMKK.js';
|
|
15
13
|
import '../../chunk-RPO7AI5K.js';
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { a } from '../../chunk-UVPQR2Q2.js';
|
|
2
|
-
import { a as a$3 } from '../../chunk-
|
|
2
|
+
import { a as a$3 } from '../../chunk-NQNNMRLC.js';
|
|
3
3
|
import '../../chunk-CIGSMWKF.js';
|
|
4
4
|
import { a as a$2 } from '../../chunk-XWUVJ22J.js';
|
|
5
|
-
import { a as a$1 } from '../../chunk-
|
|
5
|
+
import { a as a$1 } from '../../chunk-5LQLLZ5L.js';
|
|
6
6
|
import '../../chunk-XNKYJHNL.js';
|
|
7
|
-
import '../../chunk-
|
|
8
|
-
import '../../chunk-
|
|
7
|
+
import '../../chunk-HWYA3EGC.js';
|
|
8
|
+
import '../../chunk-POTVACYB.js';
|
|
9
9
|
import '../../chunk-L5URMM57.js';
|
|
10
10
|
import '../../chunk-ET3WPQIO.js';
|
|
11
11
|
import O from '@mui/material/IconButton';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { a as default } from '../../chunk-
|
|
2
|
-
import '../../chunk-
|
|
1
|
+
export { a as default } from '../../chunk-U7BH6DMJ.js';
|
|
2
|
+
import '../../chunk-NQNNMRLC.js';
|
|
3
3
|
import '../../chunk-CIGSMWKF.js';
|
|
4
4
|
//# sourceMappingURL=out.js.map
|
|
5
5
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { a as default } from '../../chunk-
|
|
2
|
-
import '../../chunk-
|
|
1
|
+
export { a as default } from '../../chunk-LNXA53QR.js';
|
|
2
|
+
import '../../chunk-NQNNMRLC.js';
|
|
3
3
|
import '../../chunk-CIGSMWKF.js';
|
|
4
4
|
//# sourceMappingURL=out.js.map
|
|
5
5
|
//# sourceMappingURL=index.js.map
|