dinocollab-core 2.2.40 → 2.2.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/src/data-surface/view-list/helpers.js +1 -1
  2. package/dist/src/data-surface/view-list/helpers.js.map +1 -1
  3. package/dist/src/data-surface/view-list/index.js +1 -1
  4. package/dist/src/data-surface/view-list/index.js.map +1 -1
  5. package/dist/src/data-surface/view-list/styled.js.map +1 -1
  6. package/dist/src/filter-bar/components/filter-summary.js +1 -1
  7. package/dist/src/filter-bar/components/filter-summary.js.map +1 -1
  8. package/dist/src/filter-bar/convert-to-graphql.js +1 -1
  9. package/dist/src/filter-bar/convert-to-graphql.js.map +1 -1
  10. package/dist/src/filter-bar/helpers.js.map +1 -1
  11. package/dist/src/filter-bar/hooks.js +1 -1
  12. package/dist/src/filter-bar/hooks.js.map +1 -1
  13. package/dist/src/filter-bar/index.create.js.map +1 -1
  14. package/dist/src/filter-bar/index.dino.js +1 -1
  15. package/dist/src/filter-bar/index.dino.js.map +1 -1
  16. package/dist/src/filter-bar/menu/create-form-field-boolean.js +2 -0
  17. package/dist/src/filter-bar/menu/create-form-field-boolean.js.map +1 -0
  18. package/dist/src/filter-bar/menu/create-form-field-datetime.js +1 -1
  19. package/dist/src/filter-bar/menu/create-form-field-datetime.js.map +1 -1
  20. package/dist/src/filter-bar/menu/create-form-field-number.js +1 -1
  21. package/dist/src/filter-bar/menu/create-form-field-number.js.map +1 -1
  22. package/dist/src/filter-bar/menu/create-form-field-select-multiple.js +1 -1
  23. package/dist/src/filter-bar/menu/create-form-field-select-multiple.js.map +1 -1
  24. package/dist/src/filter-bar/menu/create-form-field-select.js +1 -1
  25. package/dist/src/filter-bar/menu/create-form-field-select.js.map +1 -1
  26. package/dist/src/filter-bar/menu/create-form-field-string.js +1 -1
  27. package/dist/src/filter-bar/menu/create-form-field-string.js.map +1 -1
  28. package/dist/src/filter-bar/menu/create.js +1 -1
  29. package/dist/src/filter-bar/menu/create.js.map +1 -1
  30. package/dist/src/filter-bar/menu/ui.units.js.map +1 -1
  31. package/dist/src/form/helpers.js +1 -1
  32. package/dist/src/form/helpers.js.map +1 -1
  33. package/dist/src/http-service/graphql/request-param.js +1 -1
  34. package/dist/src/http-service/graphql/request-param.js.map +1 -1
  35. package/dist/src/utils/helpers.js +1 -1
  36. package/dist/src/utils/helpers.js.map +1 -1
  37. package/dist/types/filter-bar/convert-to-graphql.d.ts +2 -1
  38. package/dist/types/filter-bar/helpers.d.ts +8 -24
  39. package/dist/types/filter-bar/index.dino.d.ts +3 -0
  40. package/dist/types/filter-bar/menu/create-form-field-boolean.d.ts +55 -0
  41. package/dist/types/filter-bar/menu/types.d.ts +1 -1
  42. package/dist/types/http-service/graphql/request-param.d.ts +9 -3
  43. package/dist/types/utils/helpers.d.ts +30 -0
  44. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"create-form-field-select.js","sources":["../../../../src/filter-bar/menu/create-form-field-select.tsx"],"sourcesContent":["import { FC, ReactNode, useEffect, useMemo, useRef, useState } from 'react'\r\nimport { Box, Button, CircularProgress, FormControlLabel, Radio, RadioGroup, radioGroupClasses, styled, Typography } from '@mui/material'\r\nimport InfoIcon from '@mui/icons-material/Info'\r\nimport { getErrorMessage } from '../../form/helpers'\r\nimport { createChipViewers, TChipViewerGroup } from '../components/chip-viewer'\r\nimport { ButtonBack, ChipDark, FilterLogicToggle } from '../components/ui.units'\r\nimport { PopperBody, PopperContent, PopperFooter } from '../components/popper-custom'\r\nimport type { IPartialError } from '../../form/validator'\r\nimport type { TFieldModelValid, TFieldValid, TFieldValue, TLogic } from '../types'\r\nimport type { IFieldMenuConfig, IFilterMenuFormProps, TFetchStatus } from './types'\r\n\r\n/** Props for the `FormFieldSelect` component returned by `createFormFieldSelect`. Extends the base filter-menu form props. */\r\nexport interface IFormFieldSelectProps<T> extends IFilterMenuFormProps<T> {\r\n /** Callback function to handle errors */\r\n onError?: () => void\r\n /** Optional content to render at the top of the form */\r\n top?: ReactNode\r\n}\r\n\r\n/** A single option item rendered as a radio button inside the select filter menu. */\r\nexport interface IFieldSelectOption {\r\n value: TFieldValid\r\n label?: string\r\n}\r\n\r\n/** Parameters passed to `createFormFieldSelect` to configure the generated component. */\r\nexport interface IFormFieldSelectParam<T> {\r\n /** Optional configuration for the form field */\r\n config?: IFieldMenuConfig<T>\r\n /** List of options for the select field */\r\n options?: IFieldSelectOption[]\r\n /** Function to fetch options asynchronously based on user input */\r\n fetchOptions?: (signal?: AbortSignal) => Promise<IFieldSelectOption[]>\r\n /** Force a specific logic (and/or) for this field, overriding the default or user-selected logic */\r\n forceLogic?: TLogic\r\n /** Maximum number of values that can be selected for this field */\r\n maxValueCount?: number\r\n /** Optional content to render at the top of the form */\r\n top?: ReactNode\r\n}\r\n\r\n/**\r\n * Factory function that creates a `FormFieldSelect` filter-menu component.\r\n *\r\n * The generated component renders a radio-button list of options inside a\r\n * popper/menu panel. It supports:\r\n * - Single or multi-value selection (controlled by `config.singleValue`)\r\n * - OR / AND logic toggle when more than one value is selected\r\n * - Chip viewers showing the currently applied values\r\n * - Built-in validation via an optional `validator` prop\r\n * - A loading overlay that disables interaction while `isLoading` is true\r\n *\r\n * @param params - Static configuration (option list, optional field config override)\r\n * @returns A React FC ready to be used as a filter-menu field component\r\n */\r\nfunction createFormFieldSelect<T>(params: IFormFieldSelectParam<T>) {\r\n const ChipViewers = createChipViewers<T>()\r\n const { options } = params\r\n\r\n const FormFieldSelect: FC<IFormFieldSelectProps<T>> = (props) => {\r\n /** Merge `props.currentConfig` with `params.config` (if provided).\r\n * Fields from `params.config` override the corresponding keys in `props.currentConfig`.\r\n * Any keys not present in `params.config` are preserved from `props.currentConfig`.\r\n */\r\n const mergedConfig = useMemo(() => Object.assign({}, props.currentConfig, params?.config), [params?.config, props.currentConfig])\r\n\r\n const { value = { values: [], logic: mergedConfig?.defaultLogic ?? 'or' } } = props\r\n const [filterLogic, setFilterLogic] = useState<TLogic>(value.logic!)\r\n const effectiveLogic = params.forceLogic ?? filterLogic\r\n const [selectedValue, setSelectedValue] = useState<TFieldValid | null>(null)\r\n const [fetchedOptions, setFetchedOptions] = useState<IFieldSelectOption[]>([])\r\n const [fetchStatus, setFetchStatus] = useState<TFetchStatus>(params.fetchOptions ? 'loading' : 'loaded')\r\n const abortRef = useRef<AbortController | null>(null)\r\n\r\n const runFetch = () => {\r\n if (!params.fetchOptions) return\r\n abortRef.current?.abort()\r\n const controller = new AbortController()\r\n abortRef.current = controller\r\n setFetchStatus('loading')\r\n params\r\n .fetchOptions(controller.signal)\r\n .then((data) => {\r\n setFetchedOptions(data)\r\n setFetchStatus('loaded')\r\n })\r\n .catch((err) => {\r\n props.onError?.()\r\n if (err?.name !== 'AbortError') setFetchStatus('error')\r\n })\r\n }\r\n\r\n useEffect(() => {\r\n runFetch()\r\n return () => abortRef.current?.abort()\r\n }, [])\r\n\r\n const effectiveOptions = params.fetchOptions ? fetchedOptions : (options ?? [])\r\n const hasLogicChange = filterLogic !== value.logic\r\n const hasDataChange = selectedValue !== null\r\n const isApplyDisabled = !hasDataChange && !hasLogicChange\r\n\r\n const label = mergedConfig?.label ?? mergedConfig.field.toString()\r\n\r\n const [errorData, setErrorData] = useState<IPartialError<TFieldModelValid<T>>>({})\r\n const handleSubmit = (newValue: TFieldValue) => {\r\n props.onSubmit(mergedConfig.field, newValue, mergedConfig)\r\n }\r\n\r\n const handleSubmitForm = (event: React.FormEvent<HTMLFormElement>) => {\r\n event.preventDefault()\r\n\r\n if (!hasDataChange) {\r\n if (hasLogicChange) {\r\n handleSubmit({ values: value.values, logic: effectiveLogic })\r\n }\r\n return\r\n }\r\n\r\n if (isMaxReached) return\r\n\r\n const obj = { [mergedConfig.field]: selectedValue } as Partial<TFieldModelValid<T>>\r\n let errorData = props.validator?.run(obj) as IPartialError<TFieldModelValid<T>>\r\n\r\n setErrorData(errorData || {})\r\n\r\n if (!errorData || Object.keys(errorData).length === 0) {\r\n const newValue: TFieldValue = { values: [selectedValue!] as TFieldValid[], logic: effectiveLogic }\r\n handleSubmit(newValue)\r\n setSelectedValue(null)\r\n }\r\n }\r\n\r\n const errorResult = getErrorMessage(errorData, mergedConfig.field)\r\n const filterViewerValue = useMemo<TChipViewerGroup<T>>(() => {\r\n const items = Array.isArray(value.values) ? value.values : [value.values]\r\n return {\r\n field: mergedConfig.field,\r\n items: items.map((v) => ({ value: v, label: effectiveOptions.find((o) => o.value === v)?.label }))\r\n }\r\n }, [mergedConfig.field, value, effectiveOptions])\r\n\r\n const isMaxReached = params.maxValueCount != null && filterViewerValue.items.length >= params.maxValueCount\r\n\r\n const handleChangeLogic = (newLogic: TLogic) => {\r\n setFilterLogic(newLogic)\r\n }\r\n\r\n const handleClearAll = () => {\r\n props.onRemoveField?.(mergedConfig.field)\r\n if (params?.config?.closeAfterClear !== false) props.onClose()\r\n }\r\n\r\n const renderAfterTitle = () => {\r\n if (params.forceLogic) return null\r\n if (mergedConfig.singleValue) return <ChipDark sx={{ ml: 1.5 }} size='small' label='Last value only' />\r\n return <FilterLogicToggle sx={{ ml: 1 }} value={effectiveLogic} onChange={(_, nVal) => handleChangeLogic(nVal)} />\r\n }\r\n\r\n const getMaxReachedText = () => {\r\n if (!params.maxValueCount) return ''\r\n if (isMaxReached) {\r\n return `Maximum ${params.maxValueCount} value${params.maxValueCount > 1 ? 's' : ''} selected (limit reached)`\r\n } else {\r\n return `Up to ${params.maxValueCount} value${params.maxValueCount > 1 ? 's' : ''} can be selected`\r\n }\r\n }\r\n\r\n const renderTop = useMemo(() => {\r\n const topContent = params?.top || props.top\r\n if (topContent) return <Box sx={{ mb: 1 }}>{topContent}</Box>\r\n return null\r\n }, [params?.top, props.top])\r\n\r\n const rootClasses: string[] = []\r\n if (props.isLoading || fetchStatus === 'loading') rootClasses.push('disabled')\r\n\r\n return (\r\n <RootStyled className={rootClasses.join(' ')} noValidate onSubmit={handleSubmitForm}>\r\n <PopperContent\r\n title={`Filter by ${label}`}\r\n onClose={props.onClose}\r\n slots={{\r\n beforeTitle: <ButtonBack size='small' onClick={props.onBack} />,\r\n afterTitle: renderAfterTitle()\r\n }}\r\n >\r\n <PopperBody>\r\n {renderTop}\r\n {mergedConfig.description && (\r\n <Typography variant='caption' color='text.secondary' sx={{ mb: 1, display: 'block' }}>\r\n {mergedConfig.description}\r\n </Typography>\r\n )}\r\n {params.maxValueCount != null && (\r\n <Typography variant='caption' color={isMaxReached ? 'warning.main' : 'text.secondary'} sx={{ mb: 0.5, display: 'block' }}>\r\n {getMaxReachedText()}\r\n </Typography>\r\n )}\r\n <ChipViewers\r\n sx={{ mb: 1, borderBottom: 'none!important' }}\r\n label='Applied'\r\n placement='horizontal'\r\n enableMinimalesticView\r\n value={filterViewerValue}\r\n onRemove={props.onRemove}\r\n />\r\n {fetchStatus === 'loading' && (\r\n <Box sx={{ display: 'flex', justifyContent: 'center', mt: 2 }}>\r\n <CircularProgress size={20} />\r\n </Box>\r\n )}\r\n {fetchStatus === 'error' && (\r\n <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', mt: 2, mb: 3, gap: 1 }}>\r\n <InfoIcon color='error' fontSize='large' />\r\n <Typography variant='body2' color='error'>\r\n Failed to load options\r\n </Typography>\r\n <Button size='small' variant='outlined' color='error' onClick={runFetch}>\r\n Retry\r\n </Button>\r\n </Box>\r\n )}\r\n {effectiveOptions.length === 0 && fetchStatus === 'loaded' && (\r\n <Typography variant='body2' color='text.secondary' sx={{ mt: 2 }}>\r\n No options available\r\n </Typography>\r\n )}\r\n <RadioGroup\r\n sx={{ mx: -1 }}\r\n name={mergedConfig.field.toString()}\r\n value={selectedValue ?? ''}\r\n onChange={(e) => setSelectedValue(e.target.value as TFieldValid)}\r\n className={errorResult.error ? 'error' : ''}\r\n >\r\n {effectiveOptions.map((x, i) => {\r\n const isSelected = filterViewerValue.items.some((item) => item.value === x.value)\r\n const disabled = isSelected || isMaxReached\r\n return (\r\n <FormControlLabel\r\n disabled={disabled}\r\n key={x.value.toString() + i}\r\n value={x.value}\r\n control={<Radio size='small' />}\r\n label={<Typography variant='body2'>{x.label ?? x.value}</Typography>}\r\n />\r\n )\r\n })}\r\n </RadioGroup>\r\n {errorResult.error && (\r\n <Typography variant='caption' color='error' sx={{ mt: 0.5 }}>\r\n {errorResult.message}\r\n </Typography>\r\n )}\r\n </PopperBody>\r\n <PopperFooter>\r\n <Button size='small' color='error' variant='text' disabled={!value.values || value.values.length === 0} onClick={handleClearAll}>\r\n Clear All\r\n </Button>\r\n <Box sx={{ flex: 1 }} />\r\n <Button size='small' color='inherit' variant='text' onClick={props.onClose}>\r\n Cancel\r\n </Button>\r\n <Button size='small' type='submit' color='primary' variant='contained' disabled={isApplyDisabled}>\r\n Apply\r\n </Button>\r\n </PopperFooter>\r\n </PopperContent>\r\n </RootStyled>\r\n )\r\n }\r\n\r\n return FormFieldSelect\r\n}\r\n\r\nexport default createFormFieldSelect\r\n\r\nconst RootStyled = styled('form')({\r\n position: 'relative',\r\n '&::after': {\r\n content: '\"\"',\r\n display: 'block',\r\n position: 'absolute',\r\n inset: 0, // top: 0, left: 0, right: 0, bottom: 0\r\n backgroundColor: 'rgba(0, 0, 0, 0.12)',\r\n filter: 'blur(2px)',\r\n zIndex: -1,\r\n opacity: 0,\r\n transition: 'opacity 0.3s',\r\n visibility: 'hidden'\r\n },\r\n '&.disabled': {\r\n pointerEvents: 'none',\r\n '&::after': {\r\n zIndex: 1,\r\n opacity: 1,\r\n visibility: 'visible'\r\n }\r\n },\r\n [`.${radioGroupClasses.root}`]: {\r\n '&.error .MuiRadio-root': { color: '#d32f2f' },\r\n '.MuiFormControlLabel-root': { margin: 0 },\r\n '.MuiFormControlLabel-root:hover': { backgroundColor: 'rgba(25, 118, 210, 0.04)' }\r\n }\r\n})\r\n"],"names":["createFormFieldSelect","params","ChipViewers","createChipViewers","options","props","_mergedConfig$default","_params$forceLogic","_mergedConfig$label","mergedConfig","useMemo","Object","assign","currentConfig","config","_props$value","value","values","logic","defaultLogic","_useState","useState","_useState2","_slicedToArray","filterLogic","setFilterLogic","effectiveLogic","forceLogic","_useState3","_useState4","selectedValue","setSelectedValue","_useState5","_useState6","fetchedOptions","setFetchedOptions","_useState7","fetchOptions","_useState8","fetchStatus","setFetchStatus","abortRef","useRef","runFetch","_abortRef$current","current","abort","controller","AbortController","signal","then","data","err","_props$onError","onError","call","name","useEffect","_abortRef$current2","effectiveOptions","hasLogicChange","hasDataChange","isApplyDisabled","label","field","toString","_useState9","_useState0","errorData","setErrorData","handleSubmit","newValue","onSubmit","errorResult","getErrorMessage","filterViewerValue","items","Array","isArray","map","v","_effectiveOptions$fin","find","o","isMaxReached","maxValueCount","length","renderTop","topContent","top","_jsx","Box","sx","mb","children","rootClasses","isLoading","push","RootStyled","className","join","noValidate","event","_props$validator","preventDefault","obj","_defineProperty","validator","run","keys","_jsxs","PopperContent","title","concat","onClose","slots","beforeTitle","ButtonBack","size","onClick","onBack","afterTitle","singleValue","ChipDark","ml","FilterLogicToggle","onChange","_","nVal","PopperBody","description","Typography","variant","color","display","borderBottom","placement","enableMinimalesticView","onRemove","justifyContent","mt","CircularProgress","flexDirection","alignItems","gap","InfoIcon","fontSize","Button","RadioGroup","mx","e","target","error","x","i","_x$label","isSelected","some","item","FormControlLabel","disabled","control","Radio","message","PopperFooter","_props$onRemoveField","_params$config","onRemoveField","closeAfterClear","flex","type","styled","position","content","inset","backgroundColor","filter","zIndex","opacity","transition","visibility","pointerEvents","radioGroupClasses","root","margin"],"mappings":"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"}
1
+ {"version":3,"file":"create-form-field-select.js","sources":["../../../../src/filter-bar/menu/create-form-field-select.tsx"],"sourcesContent":["import { FC, ReactNode, useEffect, useMemo, useRef, useState } from 'react'\r\nimport { Box, Button, CircularProgress, FormControlLabel, Radio, RadioGroup, radioGroupClasses, styled, Typography } from '@mui/material'\r\nimport InfoIcon from '@mui/icons-material/Info'\r\nimport { getErrorMessage } from '../../form/helpers'\r\nimport { createChipViewers, TChipViewerGroup } from '../components/chip-viewer'\r\nimport { ButtonBack, ChipDark, FilterLogicToggle } from '../components/ui.units'\r\nimport { PopperBody, PopperContent, PopperFooter } from '../components/popper-custom'\r\nimport type { IPartialError } from '../../form/validator'\r\nimport type { TFieldModelValid, TFieldValid, TFieldValue, TLogic } from '../types'\r\nimport type { IFieldMenuConfig, IFilterMenuFormProps, TFetchStatus } from './types'\r\n\r\n/** Props for the `FormFieldSelect` component returned by `createFormFieldSelect`. Extends the base filter-menu form props. */\r\nexport interface IFormFieldSelectProps<T> extends IFilterMenuFormProps<T> {\r\n /** Callback function to handle errors */\r\n onError?: () => void\r\n /** Optional content to render at the top of the form */\r\n top?: ReactNode\r\n}\r\n\r\n/** A single option item rendered as a radio button inside the select filter menu. */\r\nexport interface IFieldSelectOption {\r\n value: TFieldValid\r\n label?: string\r\n}\r\n\r\n/** Parameters passed to `createFormFieldSelect` to configure the generated component. */\r\nexport interface IFormFieldSelectParam<T> {\r\n /** Optional configuration for the form field */\r\n config?: IFieldMenuConfig<T>\r\n /** List of options for the select field */\r\n options?: IFieldSelectOption[]\r\n /** Function to fetch options asynchronously based on user input */\r\n fetchOptions?: (signal?: AbortSignal) => Promise<IFieldSelectOption[]>\r\n /** Force a specific logic (and/or) for this field, overriding the default or user-selected logic */\r\n forceLogic?: TLogic\r\n /** Maximum number of values that can be selected for this field */\r\n maxValueCount?: number\r\n /** Optional content to render at the top of the form */\r\n top?: ReactNode\r\n}\r\n\r\n/**\r\n * Factory function that creates a `FormFieldSelect` filter-menu component.\r\n *\r\n * The generated component renders a radio-button list of options inside a\r\n * popper/menu panel. It supports:\r\n * - Single or multi-value selection (controlled by `config.singleValue`)\r\n * - OR / AND logic toggle when more than one value is selected\r\n * - Chip viewers showing the currently applied values\r\n * - Built-in validation via an optional `validator` prop\r\n * - A loading overlay that disables interaction while `isLoading` is true\r\n *\r\n * @param params - Static configuration (option list, optional field config override)\r\n * @returns A React FC ready to be used as a filter-menu field component\r\n */\r\nfunction createFormFieldSelect<T>(params: IFormFieldSelectParam<T>) {\r\n const ChipViewers = createChipViewers<T>()\r\n const { options } = params\r\n\r\n const FormFieldSelect: FC<IFormFieldSelectProps<T>> = (props) => {\r\n /** Merge `props.currentConfig` with `params.config` (if provided).\r\n * Fields from `params.config` override the corresponding keys in `props.currentConfig`.\r\n * Any keys not present in `params.config` are preserved from `props.currentConfig`.\r\n */\r\n const mergedConfig = useMemo(() => Object.assign({}, props.currentConfig, params?.config), [params?.config, props.currentConfig])\r\n\r\n const { value = { values: [], logic: mergedConfig?.defaultLogic ?? 'or' } } = props\r\n const [filterLogic, setFilterLogic] = useState<TLogic>(value.logic!)\r\n const effectiveLogic = params.forceLogic ?? filterLogic\r\n const [selectedValue, setSelectedValue] = useState<TFieldValid | null>(null)\r\n const [fetchedOptions, setFetchedOptions] = useState<IFieldSelectOption[]>([])\r\n const [fetchStatus, setFetchStatus] = useState<TFetchStatus>(params.fetchOptions ? 'loading' : 'loaded')\r\n const abortRef = useRef<AbortController | null>(null)\r\n\r\n const runFetch = () => {\r\n if (!params.fetchOptions) return\r\n abortRef.current?.abort()\r\n const controller = new AbortController()\r\n abortRef.current = controller\r\n setFetchStatus('loading')\r\n params\r\n .fetchOptions(controller.signal)\r\n .then((data) => {\r\n setFetchedOptions(data)\r\n setFetchStatus('loaded')\r\n })\r\n .catch((err) => {\r\n props.onError?.()\r\n if (err?.name !== 'AbortError') setFetchStatus('error')\r\n })\r\n }\r\n\r\n useEffect(() => {\r\n runFetch()\r\n return () => abortRef.current?.abort()\r\n }, [])\r\n\r\n const effectiveOptions = params.fetchOptions ? fetchedOptions : (options ?? [])\r\n const hasLogicChange = filterLogic !== value.logic\r\n const hasDataChange = selectedValue !== null\r\n const isApplyDisabled = !hasDataChange && !hasLogicChange\r\n\r\n const label = mergedConfig?.label ?? mergedConfig.field.toString()\r\n\r\n const [errorData, setErrorData] = useState<IPartialError<TFieldModelValid<T>>>({})\r\n const handleSubmit = (newValue: TFieldValue) => {\r\n props.onSubmit(mergedConfig.field, newValue, mergedConfig)\r\n }\r\n\r\n const handleSubmitForm = (event: React.FormEvent<HTMLFormElement>) => {\r\n event.preventDefault()\r\n\r\n if (!hasDataChange) {\r\n if (hasLogicChange) {\r\n handleSubmit({ values: value.values, logic: effectiveLogic })\r\n }\r\n return\r\n }\r\n\r\n if (isMaxReached) return\r\n\r\n const obj = { [mergedConfig.field]: selectedValue } as Partial<TFieldModelValid<T>>\r\n let errorData = props.validator?.run(obj) as IPartialError<TFieldModelValid<T>>\r\n\r\n setErrorData(errorData || {})\r\n\r\n if (!errorData || Object.keys(errorData).length === 0) {\r\n const newValue: TFieldValue = { values: [selectedValue!] as TFieldValid[], logic: effectiveLogic }\r\n handleSubmit(newValue)\r\n setSelectedValue(null)\r\n }\r\n }\r\n\r\n const errorResult = getErrorMessage(errorData, mergedConfig.field)\r\n const filterViewerValue = useMemo<TChipViewerGroup<T>>(() => {\r\n const items = Array.isArray(value.values) ? value.values : [value.values]\r\n return {\r\n field: mergedConfig.field,\r\n items: items.map((v) => ({ value: v, label: effectiveOptions.find((o) => o.value === v)?.label }))\r\n }\r\n }, [mergedConfig.field, value, effectiveOptions])\r\n\r\n const isMaxReached = params.maxValueCount != null && filterViewerValue.items.length >= params.maxValueCount\r\n\r\n const handleChangeLogic = (newLogic: TLogic) => {\r\n setFilterLogic(newLogic)\r\n }\r\n\r\n const handleClearAll = () => {\r\n props.onRemoveField?.(mergedConfig.field, mergedConfig)\r\n }\r\n\r\n const renderAfterTitle = () => {\r\n if (params.forceLogic) return null\r\n if (mergedConfig.singleValue) return <ChipDark sx={{ ml: 1.5 }} size='small' label='Last value only' />\r\n return <FilterLogicToggle sx={{ ml: 1 }} value={effectiveLogic} onChange={(_, nVal) => handleChangeLogic(nVal)} />\r\n }\r\n\r\n const getMaxReachedText = () => {\r\n if (!params.maxValueCount) return ''\r\n if (isMaxReached) {\r\n return `Maximum ${params.maxValueCount} value${params.maxValueCount > 1 ? 's' : ''} selected (limit reached)`\r\n } else {\r\n return `Up to ${params.maxValueCount} value${params.maxValueCount > 1 ? 's' : ''} can be selected`\r\n }\r\n }\r\n\r\n const renderTop = useMemo(() => {\r\n const topContent = params?.top || props.top\r\n if (topContent) return <Box sx={{ mb: 1 }}>{topContent}</Box>\r\n return null\r\n }, [params?.top, props.top])\r\n\r\n const rootClasses: string[] = []\r\n if (props.isLoading || fetchStatus === 'loading') rootClasses.push('disabled')\r\n\r\n return (\r\n <RootStyled className={rootClasses.join(' ')} noValidate onSubmit={handleSubmitForm}>\r\n <PopperContent\r\n title={`Filter by ${label}`}\r\n onClose={props.onClose}\r\n slots={{\r\n beforeTitle: <ButtonBack size='small' onClick={props.onBack} />,\r\n afterTitle: renderAfterTitle()\r\n }}\r\n >\r\n <PopperBody>\r\n {renderTop}\r\n {mergedConfig.description && (\r\n <Typography variant='caption' color='text.secondary' sx={{ mb: 1, display: 'block' }}>\r\n {mergedConfig.description}\r\n </Typography>\r\n )}\r\n {params.maxValueCount != null && (\r\n <Typography variant='caption' color={isMaxReached ? 'warning.main' : 'text.secondary'} sx={{ mb: 0.5, display: 'block' }}>\r\n {getMaxReachedText()}\r\n </Typography>\r\n )}\r\n <ChipViewers\r\n sx={{ mb: 1, borderBottom: 'none!important' }}\r\n label='Applied'\r\n placement='horizontal'\r\n enableMinimalesticView\r\n value={filterViewerValue}\r\n onRemove={props.onRemove}\r\n />\r\n {fetchStatus === 'loading' && (\r\n <Box sx={{ display: 'flex', justifyContent: 'center', mt: 2 }}>\r\n <CircularProgress size={20} />\r\n </Box>\r\n )}\r\n {fetchStatus === 'error' && (\r\n <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', mt: 2, mb: 3, gap: 1 }}>\r\n <InfoIcon color='error' fontSize='large' />\r\n <Typography variant='body2' color='error'>\r\n Failed to load options\r\n </Typography>\r\n <Button size='small' variant='outlined' color='error' onClick={runFetch}>\r\n Retry\r\n </Button>\r\n </Box>\r\n )}\r\n {effectiveOptions.length === 0 && fetchStatus === 'loaded' && (\r\n <Typography variant='body2' color='text.secondary' sx={{ mt: 2 }}>\r\n No options available\r\n </Typography>\r\n )}\r\n <RadioGroup\r\n sx={{ mx: -1 }}\r\n name={mergedConfig.field.toString()}\r\n value={selectedValue ?? ''}\r\n onChange={(e) => setSelectedValue(e.target.value as TFieldValid)}\r\n className={errorResult.error ? 'error' : ''}\r\n >\r\n {effectiveOptions.map((x, i) => {\r\n const isSelected = filterViewerValue.items.some((item) => item.value === x.value)\r\n const disabled = isSelected || isMaxReached\r\n return (\r\n <FormControlLabel\r\n disabled={disabled}\r\n key={x.value.toString() + i}\r\n value={x.value}\r\n control={<Radio size='small' />}\r\n label={<Typography variant='body2'>{x.label ?? x.value}</Typography>}\r\n />\r\n )\r\n })}\r\n </RadioGroup>\r\n {errorResult.error && (\r\n <Typography variant='caption' color='error' sx={{ mt: 0.5 }}>\r\n {errorResult.message}\r\n </Typography>\r\n )}\r\n </PopperBody>\r\n <PopperFooter>\r\n <Button size='small' color='error' variant='text' disabled={!value.values || value.values.length === 0} onClick={handleClearAll}>\r\n Clear All\r\n </Button>\r\n <Box sx={{ flex: 1 }} />\r\n <Button size='small' color='inherit' variant='text' onClick={props.onClose}>\r\n Cancel\r\n </Button>\r\n <Button size='small' type='submit' color='primary' variant='contained' disabled={isApplyDisabled}>\r\n Apply\r\n </Button>\r\n </PopperFooter>\r\n </PopperContent>\r\n </RootStyled>\r\n )\r\n }\r\n\r\n return FormFieldSelect\r\n}\r\n\r\nexport default createFormFieldSelect\r\n\r\nconst RootStyled = styled('form')({\r\n position: 'relative',\r\n '&::after': {\r\n content: '\"\"',\r\n display: 'block',\r\n position: 'absolute',\r\n inset: 0, // top: 0, left: 0, right: 0, bottom: 0\r\n backgroundColor: 'rgba(0, 0, 0, 0.12)',\r\n filter: 'blur(2px)',\r\n zIndex: -1,\r\n opacity: 0,\r\n transition: 'opacity 0.3s',\r\n visibility: 'hidden'\r\n },\r\n '&.disabled': {\r\n pointerEvents: 'none',\r\n '&::after': {\r\n zIndex: 1,\r\n opacity: 1,\r\n visibility: 'visible'\r\n }\r\n },\r\n [`.${radioGroupClasses.root}`]: {\r\n '&.error .MuiRadio-root': { color: '#d32f2f' },\r\n '.MuiFormControlLabel-root': { margin: 0 },\r\n '.MuiFormControlLabel-root:hover': { backgroundColor: 'rgba(25, 118, 210, 0.04)' }\r\n }\r\n})\r\n"],"names":["createFormFieldSelect","params","ChipViewers","createChipViewers","options","props","_mergedConfig$default","_params$forceLogic","_mergedConfig$label","mergedConfig","useMemo","Object","assign","currentConfig","config","_props$value","value","values","logic","defaultLogic","_useState","useState","_useState2","_slicedToArray","filterLogic","setFilterLogic","effectiveLogic","forceLogic","_useState3","_useState4","selectedValue","setSelectedValue","_useState5","_useState6","fetchedOptions","setFetchedOptions","_useState7","fetchOptions","_useState8","fetchStatus","setFetchStatus","abortRef","useRef","runFetch","_abortRef$current","current","abort","controller","AbortController","signal","then","data","err","_props$onError","onError","call","name","useEffect","_abortRef$current2","effectiveOptions","hasLogicChange","hasDataChange","isApplyDisabled","label","field","toString","_useState9","_useState0","errorData","setErrorData","handleSubmit","newValue","onSubmit","errorResult","getErrorMessage","filterViewerValue","items","Array","isArray","map","v","_effectiveOptions$fin","find","o","isMaxReached","maxValueCount","length","renderTop","topContent","top","_jsx","Box","sx","mb","children","rootClasses","isLoading","push","RootStyled","className","join","noValidate","event","_props$validator","preventDefault","obj","_defineProperty","validator","run","keys","_jsxs","PopperContent","title","concat","onClose","slots","beforeTitle","ButtonBack","size","onClick","onBack","afterTitle","singleValue","ChipDark","ml","FilterLogicToggle","onChange","_","nVal","PopperBody","description","Typography","variant","color","display","borderBottom","placement","enableMinimalesticView","onRemove","justifyContent","mt","CircularProgress","flexDirection","alignItems","gap","InfoIcon","fontSize","Button","RadioGroup","mx","e","target","error","x","i","_x$label","isSelected","some","item","FormControlLabel","disabled","control","Radio","message","PopperFooter","_props$onRemoveField","onRemoveField","flex","type","styled","position","content","inset","backgroundColor","filter","zIndex","opacity","transition","visibility","pointerEvents","radioGroupClasses","root","margin"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{slicedToArray as e}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as i,jsxs as l}from"react/jsx-runtime";import{useMemo as o,useState as r,createRef as n}from"react";import{styled as t,Box as a,Typography as s,TextField as u,Button as c}from"@mui/material";import{createChipViewers as d}from"../components/chip-viewer.js";import{getErrorMessage as m,convertFormDataToJson as v}from"../../form/helpers.js";import{ButtonBack as p,ChipDark as f,FilterLogicToggle as b}from"../components/ui.units.js";import{PopperContent as g,PopperBody as h,PopperFooter as y}from"../components/popper-custom.js";function x(t){var x=d();return function(d){var j,z,A=o(function(){return Object.assign({},d.currentConfig,null==t?void 0:t.config)},[null==t?void 0:t.config,d.currentConfig]),k=n(),T=d.value,B=void 0===T?{values:[],logic:null!==(j=null==A?void 0:A.defaultLogic)&&void 0!==j?j:"or"}:T,F=r(B.logic),R=e(F,2),S=R[0],w=R[1],I=r(""),L=e(I,2),V=L[0],D=L[1],E=null!==(z=null==A?void 0:A.label)&&void 0!==z?z:A.field.toString(),H=r({}),M=e(H,2),O=M[0],P=M[1],_=function(e){d.onSubmit(A.field,e,A)},N=S!==B.logic,W=!V.trim()&&!N,q=m(O,A.field),G=o(function(){var e=Array.isArray(B.values)?B.values:[B.values];return{field:A.field,items:e.map(function(e){return{value:e}})}},[A.field,B]),J=o(function(){var e=(null==t?void 0:t.top)||d.top;return e?i(a,{sx:{mb:1},children:e}):null},[null==t?void 0:t.top,d.top]),K=[];return d.isLoading&&K.push("disabled"),i(C,{className:K.join(" "),noValidate:!0,onSubmit:function(e){var i;if(e.preventDefault(),e.stopPropagation(),V.trim()){var l=new FormData(e.currentTarget),o=v(l),r=null===(i=d.validator)||void 0===i?void 0:i.run(o);if(P(r||{}),!r||0===Object.keys(r).length){var n=A.field,t=Array.isArray(o[n])?o[n]:[o[n]];_({values:t,logic:S}),k.current&&(k.current.blur(),k.current.value=""),D("")}}else N&&_({values:B.values,logic:S})},children:l(g,{title:"Filter by ".concat(E),onClose:d.onClose,slots:{beforeTitle:i(p,{size:"small",onClick:d.onBack}),afterTitle:A.singleValue?i(f,{sx:{ml:1.5},size:"small",label:"Last value only"}):i(b,{sx:{ml:1},value:S,onChange:function(e,i){w(i)}})},children:[l(h,{children:[J,A.description&&i(s,{variant:"caption",color:"text.secondary",sx:{display:"block",mb:1},children:A.description}),i(x,{sx:{mb:1,borderBottom:"none!important"},label:"Applied",placement:"horizontal",enableMinimalesticView:!0,value:G,onRemove:d.onRemove}),i(u,{inputRef:k,autoFocus:!0,name:A.field.toString(),size:"small",fullWidth:!0,placeholder:"Enter value",error:q.error,helperText:q.message,onChange:function(e){return D(e.target.value)},sx:{".MuiInputBase-root":{minHeight:"42px"}}})]}),l(y,{children:[i(c,{size:"small",color:"error",variant:"text",disabled:!B.values||0===B.values.length,onClick:function(){var e,i;null===(e=d.onRemoveField)||void 0===e||e.call(d,A.field),!1!==(null==t||null===(i=t.config)||void 0===i?void 0:i.closeAfterClear)&&d.onClose()},children:"Clear All"}),i(a,{sx:{flex:1}}),i(c,{size:"small",color:"inherit",variant:"text",onClick:d.onClose,children:"Cancel"}),i(c,{size:"small",type:"submit",color:"primary",variant:"contained",disabled:W,children:"Apply"})]})]})})}}var C=t("form")({position:"relative","&::after":{content:'""',display:"block",position:"absolute",inset:0,backgroundColor:"rgba(0, 0, 0, 0.2)",filter:"blur(2px)",zIndex:-1,opacity:0,transition:"opacity 0.3s",visibility:"hidden"},"&.disabled":{pointerEvents:"none","&::after":{zIndex:1,opacity:1,visibility:"visible"}}});export{x as default};
1
+ import{slicedToArray as e}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as i,jsxs as l}from"react/jsx-runtime";import{useMemo as o,useState as r,createRef as n}from"react";import{styled as t,Box as a,Typography as s,TextField as u,Button as c}from"@mui/material";import{createChipViewers as d}from"../components/chip-viewer.js";import{getErrorMessage as m,convertFormDataToJson as v}from"../../form/helpers.js";import{ButtonBack as p,ChipDark as f,FilterLogicToggle as b}from"../components/ui.units.js";import{PopperContent as g,PopperBody as h,PopperFooter as y}from"../components/popper-custom.js";function x(t){var x=d();return function(d){var j,z,k=o(function(){return Object.assign({},d.currentConfig,null==t?void 0:t.config)},[null==t?void 0:t.config,d.currentConfig]),A=n(),T=d.value,B=void 0===T?{values:[],logic:null!==(j=null==k?void 0:k.defaultLogic)&&void 0!==j?j:"or"}:T,F=r(B.logic),R=e(F,2),S=R[0],w=R[1],I=r(""),L=e(I,2),V=L[0],D=L[1],E=null!==(z=null==k?void 0:k.label)&&void 0!==z?z:k.field.toString(),H=r({}),M=e(H,2),O=M[0],P=M[1],_=function(e){d.onSubmit(k.field,e,k)},N=S!==B.logic,W=!V.trim()&&!N,q=m(O,k.field),G=o(function(){var e=Array.isArray(B.values)?B.values:[B.values];return{field:k.field,items:e.map(function(e){return{value:e}})}},[k.field,B]),J=o(function(){var e=(null==t?void 0:t.top)||d.top;return e?i(a,{sx:{mb:1},children:e}):null},[null==t?void 0:t.top,d.top]),K=[];return d.isLoading&&K.push("disabled"),i(C,{className:K.join(" "),noValidate:!0,onSubmit:function(e){var i;if(e.preventDefault(),e.stopPropagation(),V.trim()){var l=new FormData(e.currentTarget),o=v(l),r=null===(i=d.validator)||void 0===i?void 0:i.run(o);if(P(r||{}),!r||0===Object.keys(r).length){var n=k.field,t=Array.isArray(o[n])?o[n]:[o[n]];_({values:t,logic:S}),A.current&&(A.current.blur(),A.current.value=""),D("")}}else N&&_({values:B.values,logic:S})},children:l(g,{title:"Filter by ".concat(E),onClose:d.onClose,slots:{beforeTitle:i(p,{size:"small",onClick:d.onBack}),afterTitle:k.singleValue?i(f,{sx:{ml:1.5},size:"small",label:"Last value only"}):i(b,{sx:{ml:1},value:S,onChange:function(e,i){w(i)}})},children:[l(h,{children:[J,k.description&&i(s,{variant:"caption",color:"text.secondary",sx:{display:"block",mb:1},children:k.description}),i(x,{sx:{mb:1,borderBottom:"none!important"},label:"Applied",placement:"horizontal",enableMinimalesticView:!0,value:G,onRemove:d.onRemove}),i(u,{inputRef:A,autoFocus:!0,name:k.field.toString(),size:"small",fullWidth:!0,placeholder:"Enter value",error:q.error,helperText:q.message,onChange:function(e){return D(e.target.value)},sx:{".MuiInputBase-root":{minHeight:"42px"}}})]}),l(y,{children:[i(c,{size:"small",color:"error",variant:"text",disabled:!B.values||0===B.values.length,onClick:function(){var e;null===(e=d.onRemoveField)||void 0===e||e.call(d,k.field,k)},children:"Clear All"}),i(a,{sx:{flex:1}}),i(c,{size:"small",color:"inherit",variant:"text",onClick:d.onClose,children:"Cancel"}),i(c,{size:"small",type:"submit",color:"primary",variant:"contained",disabled:W,children:"Apply"})]})]})})}}var C=t("form")({position:"relative","&::after":{content:'""',display:"block",position:"absolute",inset:0,backgroundColor:"rgba(0, 0, 0, 0.2)",filter:"blur(2px)",zIndex:-1,opacity:0,transition:"opacity 0.3s",visibility:"hidden"},"&.disabled":{pointerEvents:"none","&::after":{zIndex:1,opacity:1,visibility:"visible"}}});export{x as default};
2
2
  //# sourceMappingURL=create-form-field-string.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-form-field-string.js","sources":["../../../../src/filter-bar/menu/create-form-field-string.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { createRef, useMemo, useState } from 'react'\r\nimport { Box, Button, styled, TextField, Typography } from '@mui/material'\r\nimport { createChipViewers } from '../components/chip-viewer'\r\nimport { convertFormDataToJson, getErrorMessage } from '../../form/helpers'\r\nimport { ButtonBack, ChipDark, FilterLogicToggle } from '../components/ui.units'\r\nimport { PopperBody, PopperContent, PopperFooter } from '../components/popper-custom'\r\n// types\r\nimport type { FC, ReactNode } from 'react'\r\nimport type { IPartialError } from '../../form/validator'\r\nimport type { TChipViewerGroup } from '../components/chip-viewer'\r\nimport type { IFieldMenuConfig, IFilterMenuFormProps } from './types'\r\nimport type { TFieldModelValid, TFieldValid, TFieldValue, TLogic } from '../types'\r\n\r\n/** Props for the `FormFieldString` component returned by `createFormFieldString`. Extends the base filter-menu form props. */\r\nexport interface IFormFieldStringProps<T> extends IFilterMenuFormProps<T> {\r\n top?: ReactNode\r\n}\r\n\r\n/** Parameters passed to `createFormFieldString` to configure the generated component. */\r\nexport interface IFormFieldStringParam<T> {\r\n /** Optional configuration for the form field */\r\n config?: IFieldMenuConfig<T>\r\n top?: ReactNode\r\n}\r\n\r\n/**\r\n * Factory function that creates a `FormFieldString` filter-menu component.\r\n *\r\n * The generated component renders a free-text input inside a popper/menu panel,\r\n * letting the user type arbitrary string values as filter criteria. It supports:\r\n * - OR / AND logic toggle when more than one value is applied\r\n * - Chip viewers showing the currently applied values\r\n * - Auto-focus and input reset after each successful submission\r\n * - Built-in validation via an optional `validator` prop\r\n * - A loading overlay that disables interaction while `isLoading` is true\r\n *\r\n * @param params - Static configuration (optional field config override)\r\n * @returns A React FC ready to be used as a free-text filter-menu field component\r\n */\r\nfunction createFormFieldString<T>(params?: IFormFieldStringParam<T>) {\r\n const ChipViewers = createChipViewers<T>()\r\n\r\n const FormFieldString: FC<IFormFieldStringProps<T>> = (props) => {\r\n /** Merge `props.currentConfig` with `params.config` (if provided).\r\n * Fields from `params.config` override the corresponding keys in `props.currentConfig`.\r\n * Any keys not present in `params.config` are preserved from `props.currentConfig`.\r\n */\r\n const mergedConfig = useMemo(() => Object.assign({}, props.currentConfig, params?.config), [params?.config, props.currentConfig])\r\n\r\n const refInput = createRef<HTMLInputElement>()\r\n const { value = { values: [], logic: mergedConfig?.defaultLogic ?? 'or' } } = props\r\n const [filterLogic, setFilterLogic] = useState<TLogic>(value.logic!)\r\n const [inputValue, setInputValue] = useState('')\r\n\r\n const label = mergedConfig?.label ?? mergedConfig.field.toString()\r\n\r\n const [errorData, setErrorData] = useState<IPartialError<TFieldModelValid<T>>>({})\r\n\r\n const handleSubmit = (newValue: TFieldValue) => {\r\n props.onSubmit(mergedConfig.field, newValue, mergedConfig)\r\n }\r\n\r\n const hasLogicChange = filterLogic !== value.logic\r\n const isApplyDisabled = !inputValue.trim() && !hasLogicChange\r\n\r\n const handleSubmitForm = (event: React.FormEvent<HTMLFormElement>) => {\r\n event.preventDefault()\r\n event.stopPropagation()\r\n\r\n if (!inputValue.trim()) {\r\n if (hasLogicChange) {\r\n handleSubmit({ values: value.values, logic: filterLogic })\r\n }\r\n return\r\n }\r\n\r\n const formData = new FormData(event.currentTarget)\r\n const obj = convertFormDataToJson<TFieldModelValid<T>>(formData)\r\n let errorData = props.validator?.run(obj) as IPartialError<TFieldModelValid<T>>\r\n\r\n setErrorData(errorData || {})\r\n\r\n if (!errorData || Object.keys(errorData).length === 0) {\r\n const { field } = mergedConfig\r\n const newValues = (Array.isArray(obj[field]) ? obj[field] : [obj[field]]) as TFieldValid[]\r\n const newValue: TFieldValue = { values: newValues, logic: filterLogic }\r\n handleSubmit(newValue)\r\n\r\n if (refInput.current) {\r\n refInput.current.blur()\r\n refInput.current.value = ''\r\n }\r\n setInputValue('')\r\n }\r\n }\r\n\r\n const error = getErrorMessage(errorData, mergedConfig.field)\r\n\r\n const filterViewerValue = useMemo<TChipViewerGroup<T>>(() => {\r\n const items = Array.isArray(value.values) ? value.values : [value.values]\r\n return { field: mergedConfig.field, items: items.map((v) => ({ value: v })) }\r\n }, [mergedConfig.field, value])\r\n\r\n const handleChangeLogic = (newLogic: TLogic) => {\r\n setFilterLogic(newLogic)\r\n }\r\n\r\n const handleClearAll = () => {\r\n props.onRemoveField?.(mergedConfig.field)\r\n if (params?.config?.closeAfterClear !== false) props.onClose()\r\n }\r\n\r\n const renderAfterTitle = () => {\r\n if (mergedConfig.singleValue) return <ChipDark sx={{ ml: 1.5 }} size='small' label='Last value only' />\r\n return <FilterLogicToggle sx={{ ml: 1 }} value={filterLogic} onChange={(_, nVal) => handleChangeLogic(nVal)} />\r\n }\r\n\r\n const renderTop = useMemo(() => {\r\n const topContent = params?.top || props.top\r\n if (topContent) return <Box sx={{ mb: 1 }}>{topContent}</Box>\r\n return null\r\n }, [params?.top, props.top])\r\n\r\n const rootClasses: string[] = []\r\n if (props.isLoading) rootClasses.push('disabled')\r\n\r\n return (\r\n <RootStyled className={rootClasses.join(' ')} noValidate onSubmit={handleSubmitForm}>\r\n <PopperContent\r\n title={`Filter by ${label}`}\r\n onClose={props.onClose}\r\n slots={{\r\n beforeTitle: <ButtonBack size='small' onClick={props.onBack} />,\r\n afterTitle: renderAfterTitle()\r\n }}\r\n >\r\n <PopperBody>\r\n {renderTop}\r\n {mergedConfig.description && (\r\n <Typography variant='caption' color='text.secondary' sx={{ display: 'block', mb: 1 }}>\r\n {mergedConfig.description}\r\n </Typography>\r\n )}\r\n <ChipViewers\r\n sx={{ mb: 1, borderBottom: 'none!important' }}\r\n label='Applied'\r\n placement='horizontal'\r\n enableMinimalesticView\r\n value={filterViewerValue}\r\n onRemove={props.onRemove}\r\n />\r\n <TextField\r\n inputRef={refInput}\r\n autoFocus\r\n name={mergedConfig.field.toString()}\r\n size='small'\r\n fullWidth\r\n placeholder='Enter value'\r\n error={error.error}\r\n helperText={error.message}\r\n onChange={(e) => setInputValue(e.target.value)}\r\n sx={{ '.MuiInputBase-root': { minHeight: '42px' } }}\r\n />\r\n </PopperBody>\r\n <PopperFooter>\r\n <Button size='small' color='error' variant='text' disabled={!value.values || value.values.length === 0} onClick={handleClearAll}>\r\n Clear All\r\n </Button>\r\n <Box sx={{ flex: 1 }} />\r\n <Button size='small' color='inherit' variant='text' onClick={props.onClose}>\r\n Cancel\r\n </Button>\r\n <Button size='small' type='submit' color='primary' variant='contained' disabled={isApplyDisabled}>\r\n Apply\r\n </Button>\r\n </PopperFooter>\r\n </PopperContent>\r\n </RootStyled>\r\n )\r\n }\r\n\r\n return FormFieldString\r\n}\r\n\r\nexport default createFormFieldString\r\n\r\nconst RootStyled = styled('form')({\r\n position: 'relative',\r\n '&::after': {\r\n content: '\"\"',\r\n display: 'block',\r\n position: 'absolute',\r\n inset: 0, // top: 0, left: 0, right: 0, bottom: 0\r\n backgroundColor: 'rgba(0, 0, 0, 0.2)',\r\n filter: 'blur(2px)',\r\n zIndex: -1,\r\n opacity: 0,\r\n transition: 'opacity 0.3s',\r\n visibility: 'hidden'\r\n },\r\n '&.disabled': {\r\n pointerEvents: 'none',\r\n '&::after': {\r\n zIndex: 1,\r\n opacity: 1,\r\n visibility: 'visible'\r\n }\r\n }\r\n})\r\n"],"names":["createFormFieldString","params","ChipViewers","createChipViewers","props","_mergedConfig$default","_mergedConfig$label","mergedConfig","useMemo","Object","assign","currentConfig","config","refInput","createRef","_props$value","value","values","logic","defaultLogic","_useState","useState","_useState2","_slicedToArray","filterLogic","setFilterLogic","_useState3","_useState4","inputValue","setInputValue","label","field","toString","_useState5","_useState6","errorData","setErrorData","handleSubmit","newValue","onSubmit","hasLogicChange","isApplyDisabled","trim","error","getErrorMessage","filterViewerValue","items","Array","isArray","map","v","renderTop","topContent","top","_jsx","Box","sx","mb","children","rootClasses","isLoading","push","RootStyled","className","join","noValidate","event","_props$validator","preventDefault","stopPropagation","formData","FormData","currentTarget","obj","convertFormDataToJson","validator","run","keys","length","newValues","current","blur","_jsxs","PopperContent","title","concat","onClose","slots","beforeTitle","ButtonBack","size","onClick","onBack","afterTitle","singleValue","ChipDark","ml","FilterLogicToggle","onChange","_","nVal","PopperBody","description","Typography","variant","color","display","borderBottom","placement","enableMinimalesticView","onRemove","TextField","inputRef","autoFocus","name","fullWidth","placeholder","helperText","message","e","target","minHeight","PopperFooter","Button","disabled","_props$onRemoveField","_params$config","onRemoveField","call","closeAfterClear","flex","type","styled","position","content","inset","backgroundColor","filter","zIndex","opacity","transition","visibility","pointerEvents"],"mappings":"0mBA0CA,SAASA,EAAyBC,GAChC,IAAMC,EAAcC,IA6IpB,OA3IsD,SAACC,GAAS,IAAAC,EAAAC,EAKxDC,EAAeC,EAAQ,WAAA,OAAMC,OAAOC,OAAO,GAAIN,EAAMO,cAAeV,eAAAA,EAAQW,OAAO,EAAE,CAACX,aAAAA,EAAAA,EAAQW,OAAQR,EAAMO,gBAE5GE,EAAWC,IACjBC,EAA8EX,EAAtEY,MAAAA,OAAQ,IAAHD,EAAG,CAAEE,OAAQ,GAAIC,MAAiC,QAA5Bb,EAAEE,aAAY,EAAZA,EAAcY,oBAAY,IAAAd,EAAAA,EAAI,MAAMU,EACzEK,EAAsCC,EAAiBL,EAAME,OAAOI,EAAAC,EAAAH,EAAA,GAA7DI,EAAWF,EAAA,GAAEG,EAAcH,EAAA,GAClCI,EAAoCL,EAAS,IAAGM,EAAAJ,EAAAG,EAAA,GAAzCE,EAAUD,EAAA,GAAEE,EAAaF,EAAA,GAE1BG,UAAKxB,EAAGC,aAAAA,EAAAA,EAAcuB,aAAK,IAAAxB,EAAAA,EAAIC,EAAawB,MAAMC,WAExDC,EAAkCZ,EAA6C,IAAGa,EAAAX,EAAAU,EAAA,GAA3EE,EAASD,EAAA,GAAEE,EAAYF,EAAA,GAExBG,EAAe,SAACC,GACpBlC,EAAMmC,SAAShC,EAAawB,MAAOO,EAAU/B,EAC9C,EAEKiC,EAAiBhB,IAAgBR,EAAME,MACvCuB,GAAmBb,EAAWc,SAAWF,EAiCzCG,EAAQC,EAAgBT,EAAW5B,EAAawB,OAEhDc,EAAoBrC,EAA6B,WACrD,IAAMsC,EAAQC,MAAMC,QAAQhC,EAAMC,QAAUD,EAAMC,OAAS,CAACD,EAAMC,QAClE,MAAO,CAAEc,MAAOxB,EAAawB,MAAOe,MAAOA,EAAMG,IAAI,SAACC,GAAC,MAAM,CAAElC,MAAOkC,EAAI,GAC3E,EAAE,CAAC3C,EAAawB,MAAOf,IAgBlBmC,EAAY3C,EAAQ,WACxB,IAAM4C,GAAanD,aAAAA,EAAAA,EAAQoD,MAAOjD,EAAMiD,IACxC,OAAID,EAAmBE,EAACC,EAAI,CAAAC,GAAI,CAAEC,GAAI,GAAMC,SAAAN,IACrC,IACR,EAAE,CAACnD,aAAAA,EAAAA,EAAQoD,IAAKjD,EAAMiD,MAEjBM,EAAwB,GAG9B,OAFIvD,EAAMwD,WAAWD,EAAYE,KAAK,YAGpCP,EAACQ,EAAU,CAACC,UAAWJ,EAAYK,KAAK,KAAMC,cAAW1B,SA9DlC,SAAC2B,GAA2C,IAAAC,EAInE,GAHAD,EAAME,iBACNF,EAAMG,kBAEDzC,EAAWc,OAAhB,CAOA,IAAM4B,EAAW,IAAIC,SAASL,EAAMM,eAC9BC,EAAMC,EAA2CJ,GACnDnC,EAA2BgC,QAAlBA,EAAG/D,EAAMuE,qBAASR,SAAfA,EAAiBS,IAAIH,GAIrC,GAFArC,EAAaD,GAAa,KAErBA,GAA+C,IAAlC1B,OAAOoE,KAAK1C,GAAW2C,OAAc,CACrD,IAAQ/C,EAAUxB,EAAVwB,MACFgD,EAAahC,MAAMC,QAAQyB,EAAI1C,IAAU0C,EAAI1C,GAAS,CAAC0C,EAAI1C,IAEjEM,EAD8B,CAAEpB,OAAQ8D,EAAW7D,MAAOM,IAGtDX,EAASmE,UACXnE,EAASmE,QAAQC,OACjBpE,EAASmE,QAAQhE,MAAQ,IAE3Ba,EAAc,GACf,CAnBA,MAJKW,GACFH,EAAa,CAAEpB,OAAQD,EAAMC,OAAQC,MAAOM,GAuBjD,EAiCoFkC,SACjFwB,EAACC,EAAa,CACZC,MAAKC,aAAAA,OAAevD,GACpBwD,QAASlF,EAAMkF,QACfC,MAAO,CACLC,YAAalC,EAACmC,EAAU,CAACC,KAAK,QAAQC,QAASvF,EAAMwF,SACrDC,WApBFtF,EAAauF,YAAoBxC,EAACyC,EAAQ,CAACvC,GAAI,CAAEwC,GAAI,KAAON,KAAK,QAAQ5D,MAAM,oBAC5EwB,EAAC2C,EAAkB,CAAAzC,GAAI,CAAEwC,GAAI,GAAKhF,MAAOQ,EAAa0E,SAAU,SAACC,EAAGC,GAV3E3E,EAUsG2E,EAAK,KAsBvG1C,SAAA,CAAAwB,EAACmB,EAAU,CAAA3C,SAAA,CACRP,EACA5C,EAAa+F,aACZhD,EAACiD,EAAU,CAACC,QAAQ,UAAUC,MAAM,iBAAiBjD,GAAI,CAAEkD,QAAS,QAASjD,GAAI,GAC9EC,SAAAnD,EAAa+F,cAGlBhD,EAACpD,EAAW,CACVsD,GAAI,CAAEC,GAAI,EAAGkD,aAAc,kBAC3B7E,MAAM,UACN8E,UAAU,aACVC,wBACA,EAAA7F,MAAO6B,EACPiE,SAAU1G,EAAM0G,WAElBxD,EAACyD,EACC,CAAAC,SAAUnG,EACVoG,WACA,EAAAC,KAAM3G,EAAawB,MAAMC,WACzB0D,KAAK,QACLyB,WACA,EAAAC,YAAY,cACZzE,MAAOA,EAAMA,MACb0E,WAAY1E,EAAM2E,QAClBpB,SAAU,SAACqB,GAAC,OAAK1F,EAAc0F,EAAEC,OAAOxG,MAAM,EAC9CwC,GAAI,CAAE,qBAAsB,CAAEiE,UAAW,cAG7CvC,EAACwC,EACC,CAAAhE,SAAA,CAAAJ,EAACqE,EAAM,CAACjC,KAAK,QAAQe,MAAM,QAAQD,QAAQ,OAAOoB,UAAW5G,EAAMC,QAAkC,IAAxBD,EAAMC,OAAO6D,OAAca,QA1DzF,WAAK,IAAAkC,EAAAC,UAC1BD,EAAAzH,EAAM2H,qBAAa,IAAAF,GAAnBA,EAAAG,KAAA5H,EAAsBG,EAAawB,QACK,KAApC9B,SAAc,QAAR6H,EAAN7H,EAAQW,cAARkH,IAAcA,OAAdA,EAAAA,EAAgBG,kBAA2B7H,EAAMkF,SACtD,EAuDsI5B,SAAA,cAG/HJ,EAACC,EAAI,CAAAC,GAAI,CAAE0E,KAAM,KACjB5E,EAACqE,EAAO,CAAAjC,KAAK,QAAQe,MAAM,UAAUD,QAAQ,OAAOb,QAASvF,EAAMkF,4BAGnEhC,EAACqE,EAAM,CAACjC,KAAK,QAAQyC,KAAK,SAAS1B,MAAM,UAAUD,QAAQ,YAAYoB,SAAUnF,EAAeiB,SAAA,iBAOzG,CAGH,CAIA,IAAMI,EAAasE,EAAO,OAAPA,CAAe,CAChCC,SAAU,WACV,WAAY,CACVC,QAAS,KACT5B,QAAS,QACT2B,SAAU,WACVE,MAAO,EACPC,gBAAiB,qBACjBC,OAAQ,YACRC,QAAU,EACVC,QAAS,EACTC,WAAY,eACZC,WAAY,UAEd,aAAc,CACZC,cAAe,OACf,WAAY,CACVJ,OAAQ,EACRC,QAAS,EACTE,WAAY"}
1
+ {"version":3,"file":"create-form-field-string.js","sources":["../../../../src/filter-bar/menu/create-form-field-string.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { createRef, useMemo, useState } from 'react'\r\nimport { Box, Button, styled, TextField, Typography } from '@mui/material'\r\nimport { createChipViewers } from '../components/chip-viewer'\r\nimport { convertFormDataToJson, getErrorMessage } from '../../form/helpers'\r\nimport { ButtonBack, ChipDark, FilterLogicToggle } from '../components/ui.units'\r\nimport { PopperBody, PopperContent, PopperFooter } from '../components/popper-custom'\r\n// types\r\nimport type { FC, ReactNode } from 'react'\r\nimport type { IPartialError } from '../../form/validator'\r\nimport type { TChipViewerGroup } from '../components/chip-viewer'\r\nimport type { IFieldMenuConfig, IFilterMenuFormProps } from './types'\r\nimport type { TFieldModelValid, TFieldValid, TFieldValue, TLogic } from '../types'\r\n\r\n/** Props for the `FormFieldString` component returned by `createFormFieldString`. Extends the base filter-menu form props. */\r\nexport interface IFormFieldStringProps<T> extends IFilterMenuFormProps<T> {\r\n top?: ReactNode\r\n}\r\n\r\n/** Parameters passed to `createFormFieldString` to configure the generated component. */\r\nexport interface IFormFieldStringParam<T> {\r\n /** Optional configuration for the form field */\r\n config?: IFieldMenuConfig<T>\r\n top?: ReactNode\r\n}\r\n\r\n/**\r\n * Factory function that creates a `FormFieldString` filter-menu component.\r\n *\r\n * The generated component renders a free-text input inside a popper/menu panel,\r\n * letting the user type arbitrary string values as filter criteria. It supports:\r\n * - OR / AND logic toggle when more than one value is applied\r\n * - Chip viewers showing the currently applied values\r\n * - Auto-focus and input reset after each successful submission\r\n * - Built-in validation via an optional `validator` prop\r\n * - A loading overlay that disables interaction while `isLoading` is true\r\n *\r\n * @param params - Static configuration (optional field config override)\r\n * @returns A React FC ready to be used as a free-text filter-menu field component\r\n */\r\nfunction createFormFieldString<T>(params?: IFormFieldStringParam<T>) {\r\n const ChipViewers = createChipViewers<T>()\r\n\r\n const FormFieldString: FC<IFormFieldStringProps<T>> = (props) => {\r\n /** Merge `props.currentConfig` with `params.config` (if provided).\r\n * Fields from `params.config` override the corresponding keys in `props.currentConfig`.\r\n * Any keys not present in `params.config` are preserved from `props.currentConfig`.\r\n */\r\n const mergedConfig = useMemo(() => Object.assign({}, props.currentConfig, params?.config), [params?.config, props.currentConfig])\r\n\r\n const refInput = createRef<HTMLInputElement>()\r\n const { value = { values: [], logic: mergedConfig?.defaultLogic ?? 'or' } } = props\r\n const [filterLogic, setFilterLogic] = useState<TLogic>(value.logic!)\r\n const [inputValue, setInputValue] = useState('')\r\n\r\n const label = mergedConfig?.label ?? mergedConfig.field.toString()\r\n\r\n const [errorData, setErrorData] = useState<IPartialError<TFieldModelValid<T>>>({})\r\n\r\n const handleSubmit = (newValue: TFieldValue) => {\r\n props.onSubmit(mergedConfig.field, newValue, mergedConfig)\r\n }\r\n\r\n const hasLogicChange = filterLogic !== value.logic\r\n const isApplyDisabled = !inputValue.trim() && !hasLogicChange\r\n\r\n const handleSubmitForm = (event: React.FormEvent<HTMLFormElement>) => {\r\n event.preventDefault()\r\n event.stopPropagation()\r\n\r\n if (!inputValue.trim()) {\r\n if (hasLogicChange) {\r\n handleSubmit({ values: value.values, logic: filterLogic })\r\n }\r\n return\r\n }\r\n\r\n const formData = new FormData(event.currentTarget)\r\n const obj = convertFormDataToJson<TFieldModelValid<T>>(formData)\r\n let errorData = props.validator?.run(obj) as IPartialError<TFieldModelValid<T>>\r\n\r\n setErrorData(errorData || {})\r\n\r\n if (!errorData || Object.keys(errorData).length === 0) {\r\n const { field } = mergedConfig\r\n const newValues = (Array.isArray(obj[field]) ? obj[field] : [obj[field]]) as TFieldValid[]\r\n const newValue: TFieldValue = { values: newValues, logic: filterLogic }\r\n handleSubmit(newValue)\r\n\r\n if (refInput.current) {\r\n refInput.current.blur()\r\n refInput.current.value = ''\r\n }\r\n setInputValue('')\r\n }\r\n }\r\n\r\n const error = getErrorMessage(errorData, mergedConfig.field)\r\n\r\n const filterViewerValue = useMemo<TChipViewerGroup<T>>(() => {\r\n const items = Array.isArray(value.values) ? value.values : [value.values]\r\n return { field: mergedConfig.field, items: items.map((v) => ({ value: v })) }\r\n }, [mergedConfig.field, value])\r\n\r\n const handleChangeLogic = (newLogic: TLogic) => {\r\n setFilterLogic(newLogic)\r\n }\r\n\r\n const handleClearAll = () => {\r\n props.onRemoveField?.(mergedConfig.field, mergedConfig)\r\n }\r\n\r\n const renderAfterTitle = () => {\r\n if (mergedConfig.singleValue) return <ChipDark sx={{ ml: 1.5 }} size='small' label='Last value only' />\r\n return <FilterLogicToggle sx={{ ml: 1 }} value={filterLogic} onChange={(_, nVal) => handleChangeLogic(nVal)} />\r\n }\r\n\r\n const renderTop = useMemo(() => {\r\n const topContent = params?.top || props.top\r\n if (topContent) return <Box sx={{ mb: 1 }}>{topContent}</Box>\r\n return null\r\n }, [params?.top, props.top])\r\n\r\n const rootClasses: string[] = []\r\n if (props.isLoading) rootClasses.push('disabled')\r\n\r\n return (\r\n <RootStyled className={rootClasses.join(' ')} noValidate onSubmit={handleSubmitForm}>\r\n <PopperContent\r\n title={`Filter by ${label}`}\r\n onClose={props.onClose}\r\n slots={{\r\n beforeTitle: <ButtonBack size='small' onClick={props.onBack} />,\r\n afterTitle: renderAfterTitle()\r\n }}\r\n >\r\n <PopperBody>\r\n {renderTop}\r\n {mergedConfig.description && (\r\n <Typography variant='caption' color='text.secondary' sx={{ display: 'block', mb: 1 }}>\r\n {mergedConfig.description}\r\n </Typography>\r\n )}\r\n <ChipViewers\r\n sx={{ mb: 1, borderBottom: 'none!important' }}\r\n label='Applied'\r\n placement='horizontal'\r\n enableMinimalesticView\r\n value={filterViewerValue}\r\n onRemove={props.onRemove}\r\n />\r\n <TextField\r\n inputRef={refInput}\r\n autoFocus\r\n name={mergedConfig.field.toString()}\r\n size='small'\r\n fullWidth\r\n placeholder='Enter value'\r\n error={error.error}\r\n helperText={error.message}\r\n onChange={(e) => setInputValue(e.target.value)}\r\n sx={{ '.MuiInputBase-root': { minHeight: '42px' } }}\r\n />\r\n </PopperBody>\r\n <PopperFooter>\r\n <Button size='small' color='error' variant='text' disabled={!value.values || value.values.length === 0} onClick={handleClearAll}>\r\n Clear All\r\n </Button>\r\n <Box sx={{ flex: 1 }} />\r\n <Button size='small' color='inherit' variant='text' onClick={props.onClose}>\r\n Cancel\r\n </Button>\r\n <Button size='small' type='submit' color='primary' variant='contained' disabled={isApplyDisabled}>\r\n Apply\r\n </Button>\r\n </PopperFooter>\r\n </PopperContent>\r\n </RootStyled>\r\n )\r\n }\r\n\r\n return FormFieldString\r\n}\r\n\r\nexport default createFormFieldString\r\n\r\nconst RootStyled = styled('form')({\r\n position: 'relative',\r\n '&::after': {\r\n content: '\"\"',\r\n display: 'block',\r\n position: 'absolute',\r\n inset: 0, // top: 0, left: 0, right: 0, bottom: 0\r\n backgroundColor: 'rgba(0, 0, 0, 0.2)',\r\n filter: 'blur(2px)',\r\n zIndex: -1,\r\n opacity: 0,\r\n transition: 'opacity 0.3s',\r\n visibility: 'hidden'\r\n },\r\n '&.disabled': {\r\n pointerEvents: 'none',\r\n '&::after': {\r\n zIndex: 1,\r\n opacity: 1,\r\n visibility: 'visible'\r\n }\r\n }\r\n})\r\n"],"names":["createFormFieldString","params","ChipViewers","createChipViewers","props","_mergedConfig$default","_mergedConfig$label","mergedConfig","useMemo","Object","assign","currentConfig","config","refInput","createRef","_props$value","value","values","logic","defaultLogic","_useState","useState","_useState2","_slicedToArray","filterLogic","setFilterLogic","_useState3","_useState4","inputValue","setInputValue","label","field","toString","_useState5","_useState6","errorData","setErrorData","handleSubmit","newValue","onSubmit","hasLogicChange","isApplyDisabled","trim","error","getErrorMessage","filterViewerValue","items","Array","isArray","map","v","renderTop","topContent","top","_jsx","Box","sx","mb","children","rootClasses","isLoading","push","RootStyled","className","join","noValidate","event","_props$validator","preventDefault","stopPropagation","formData","FormData","currentTarget","obj","convertFormDataToJson","validator","run","keys","length","newValues","current","blur","_jsxs","PopperContent","title","concat","onClose","slots","beforeTitle","ButtonBack","size","onClick","onBack","afterTitle","singleValue","ChipDark","ml","FilterLogicToggle","onChange","_","nVal","PopperBody","description","Typography","variant","color","display","borderBottom","placement","enableMinimalesticView","onRemove","TextField","inputRef","autoFocus","name","fullWidth","placeholder","helperText","message","e","target","minHeight","PopperFooter","Button","disabled","_props$onRemoveField","onRemoveField","call","flex","type","styled","position","content","inset","backgroundColor","filter","zIndex","opacity","transition","visibility","pointerEvents"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{defineProperty as e,objectWithoutProperties as n,objectSpread2 as r,slicedToArray as t,asyncToGenerator as o,regenerator as i}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as l,jsxs as a}from"react/jsx-runtime";import{useState as u,useContext as c,useMemo as s,createRef as d}from"react";import{styled as m,Box as f,MenuList as p,Tooltip as v,IconButton as h,Badge as b,MenuItem as g,Typography as y,Button as j}from"@mui/material";import F from"@mui/icons-material/FilterList";import k from"@mui/material/ClickAwayListener";import{KeySpecial as C}from"../types.js";import{useFilterActions as x}from"../hooks.js";import{FilterBarContext as S}from"../index.context.js";import{FilterMenuNoField as I}from"../components/ui.units.js";import{mapSpecialLabel as P,mapSpecialTexts as q}from"../helpers.js";import{SingleRuleValidate as w,FormValidator as A}from"../../form/validator.js";import{PopperCustom as R,PopperContent as T,PopperBody as B,PopperFooter as O}from"../components/popper-custom.js";import M from"./create-form-field-string.js";var D=["fields","validation","enableQuickSearch"];var L=function(e){var n=q.qsTooltip;return e?"function"==typeof e?e(n):e:n};function N(m){var f=V,p=function(e){var t=e.fields,o=e.validation,i=e.enableQuickSearch,l=void 0===i||i,a=n(e,D),u=C.quickSearch,c=r({},t);if(l){var s=c[u],d={field:u,label:null!=s&&s.label?s.label:P[u],singleValue:!0,description:L(e.quickSearchHint)},m=Object.assign({},c[u],d);c[u]=m}else delete c[u];var f=Object.keys(c),p=f.reduce(function(e,n){var t=c[n];return t?(e[n]=r(r({},t),{},{field:n}),e):e},{}),v=r({},o);return f.forEach(function(e){var n,r,t,o=v[e],i=null!==(n=null!==(r=null==o?void 0:o.label)&&void 0!==r?r:null===(t=c[e])||void 0===t?void 0:t.label)&&void 0!==n?n:e.toString();o?o.Rules.some(function(e){return e.rule===w.Required})||(o.label=i,o.Rules.push({rule:w.Required})):v[e]={Rules:[{rule:w.Required}],label:i}}),r(r({},a),{},{fields:p,validation:v,enableQuickSearch:l})}(m),q=function(n){return Object.keys(n.fields).reduce(function(r,t){var o,i=t,l=null===(o=n.validation)||void 0===o?void 0:o[i];return l&&(r[i]=new A(e({},i,l))),r},{})}(p),N=function(e){var n=e.fields;return Object.keys(n).reduce(function(e,r){var t,o=r,i=n[o];return i&&(e[o]=null!==(t=i.FormComponent)&&void 0!==t?t:M()),e},{})}(p),z=m.quickSearchHint;return function(e){var n=d(),P=u(null),w=t(P,2),A=w[0],M=w[1],D=Boolean(A),V=c(S),E=x(V),G=u(null),_=t(G,2),W=_[0],J=_[1],K=s(function(){var n=m.popperProps,r=m.rootProps;return Object.assign({},{popperProps:n,rootProps:r},e.slots)},[m,e.slots]),U=function(){M(null),setTimeout(function(){J(null)},300)},X=function(){E.clearAllFilters(),U()},Y=function(){var e=o(i().m(function e(n,r,t){return i().w(function(e){for(;;)switch(e.n){case 0:if(r){e.n=1;break}return e.a(2);case 1:null!=t&&t.singleValue||null!=t&&t.replaceValue?E.replaceFilter(n,r,{logic:r.logic}):E.upsertManyFilter(n,r,{logic:r.logic}),!1!==(null==m?void 0:m.closeAfterSubmit)&&!1!==(null==t?void 0:t.closeAfterSubmit)&&U();case 2:return e.a(2)}},e)}));return function(n,r,t){return e.apply(this,arguments)}}(),Z=s(function(){var e=Object.values(p.fields);return Array.from(e)},[p.fields]),$=E.getTotalCount(),ee="".concat($," Filter").concat(1!==$?"s":"");return l(k,{onClickAway:U,children:a(H,r(r({className:f.root},K.rootProps),{},{children:[l(v,{title:ee,arrow:!0,placement:"top",children:l(h,{size:"small",ref:n,onClick:function(){J(null),M(n.current)},children:l(b,{badgeContent:$,color:"primary",invisible:0===$,children:l(F,{fontSize:"small"})})})}),l(R,r(r({open:D,anchorEl:A,placement:"bottom",transition:!0,disablePortal:!0},K.popperProps),{},{children:function(){if(0===Z.length)return l(I,{onClose:U});var e=W?p.fields[W]:void 0;if(W&&e){var n,t=N[W];if(!t)return null;var o=r({},e);null!=o&&o.FormComponent&&delete o.FormComponent;var i=null===(n=V.filterState.storeFilter)||void 0===n?void 0:n[W];return l(t,{currentConfig:o,value:i,isLoading:V.isLoading,onRemove:E.removeFilterByFieldValue,validator:q[W],onSubmit:Y,onClose:U,onRemoveField:function(e){return E.removeFilter(e)},onBack:function(){return J(null)}})}return a(T,{title:"Filter by",onClose:U,children:[l(B,{disableGutter:!0,children:l(Q,{className:f.menu,children:Z.map(function(e){var n,r,t=e.field.toString();if(!t)return null;var o=E.getFieldInfo(e.field),i=null!==(n=null==o?void 0:o.values.join(", "))&&void 0!==n?n:"",u=o?o.values.length:0,c=u>0?" (".concat(u,")"):"",s=null!==(r=e.label)&&void 0!==r?r:t.toString(),d=u>0?"Filter by ".concat(s,": ").concat(i):void 0;if(e.field===C.quickSearch)d=L(z);else if(e.tooltip){var m,p="function"==typeof e.tooltip?e.tooltip(null==o?void 0:o.values):e.tooltip;d=(null!==(m=null==o?void 0:o.values.length)&&void 0!==m?m:0)>0?p:void 0}return l(g,{className:f.menuItem,sx:{justifyContent:"flex-start"},onClick:function(){return n=e.field,void J(n);var n},children:l(v,{title:d,placement:"right",arrow:!0,children:a("div",{className:f.menuItemInner,children:[e.before||null,l(y,{variant:"body2",sx:{flex:1},children:s}),l(y,{variant:"caption",sx:{ml:1,color:"text.secondary"},children:c}),e.after||null]})})},t)})})}),l(O,{children:l(j,{color:"error",disabled:0===$,onClick:X,children:"Clear All"})})]})}()}))]}))})}}var V={root:"DinoFilterMenu-root",menu:"DinoFilterMenu-menu",menuItem:"DinoFilterMenu-menuItem",menuItemInner:"DinoFilterMenu-menuItemInner"},H=m(f)(e({},"&.".concat(V.root),{display:"inline-flex",justifyContent:"center",alignItems:"center",flex:"0 0 auto"})),Q=m(p)(e(e({},".".concat(V.menuItem),{paddingTop:0,paddingBottom:0}),".".concat(V.menuItemInner),{display:"flex",justifyContent:"flex-start",alignItems:"center",width:"100%",gap:"4px",paddingTop:"6px",paddingBottom:"6px"}));export{N as createFilterMenu,V as filterMenuClasses};
1
+ import{defineProperty as e,objectWithoutProperties as n,objectSpread2 as r,slicedToArray as t,asyncToGenerator as o,regenerator as l}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as i,jsxs as a}from"react/jsx-runtime";import{useState as u,useContext as c,useMemo as s,createRef as d}from"react";import{styled as f,Box as m,MenuList as p,Tooltip as v,IconButton as h,Badge as b,MenuItem as g,Typography as y,Button as j}from"@mui/material";import C from"@mui/icons-material/FilterList";import F from"@mui/material/ClickAwayListener";import{KeySpecial as k}from"../types.js";import{useFilterActions as x}from"../hooks.js";import{FilterBarContext as S}from"../index.context.js";import{FilterMenuNoField as I}from"../components/ui.units.js";import{mapSpecialLabel as A,mapSpecialTexts as P}from"../helpers.js";import{SingleRuleValidate as q,FormValidator as w}from"../../form/validator.js";import{PopperCustom as R,PopperContent as T,PopperBody as B,PopperFooter as O}from"../components/popper-custom.js";import M from"./create-form-field-string.js";var D=["fields","validation","enableQuickSearch"];var L=function(e){var n=P.qsTooltip;return e?"function"==typeof e?e(n):e:n};function N(f){var m=V,p=function(e){var t=e.fields,o=e.validation,l=e.enableQuickSearch,i=void 0===l||l,a=n(e,D),u=k.quickSearch,c=r({},t);if(i){var s=c[u],d={field:u,label:null!=s&&s.label?s.label:A[u],singleValue:!0,description:L(e.quickSearchHint)},f=Object.assign({},c[u],d);c[u]=f}else delete c[u];var m=Object.keys(c),p=m.reduce(function(e,n){var t=c[n];return t?(e[n]=r(r({},t),{},{field:n}),e):e},{}),v=r({},o);return m.forEach(function(e){var n,r,t,o=v[e],l=null!==(n=null!==(r=null==o?void 0:o.label)&&void 0!==r?r:null===(t=c[e])||void 0===t?void 0:t.label)&&void 0!==n?n:e.toString();o?o.Rules.some(function(e){return e.rule===q.Required})||(o.label=l,o.Rules.push({rule:q.Required})):v[e]={Rules:[{rule:q.Required}],label:l}}),r(r({},a),{},{fields:p,validation:v,enableQuickSearch:i})}(f),P=function(n){return Object.keys(n.fields).reduce(function(r,t){var o,l=t,i=null===(o=n.validation)||void 0===o?void 0:o[l];return i&&(r[l]=new w(e({},l,i))),r},{})}(p),N=function(e){var n=e.fields;return Object.keys(n).reduce(function(e,r){var t,o=r,l=n[o];return l&&(e[o]=null!==(t=l.FormComponent)&&void 0!==t?t:M()),e},{})}(p),z=f.quickSearchHint;return function(e){var n=d(),A=u(null),q=t(A,2),w=q[0],M=q[1],D=Boolean(w),V=c(S),E=x(V),G=u(null),_=t(G,2),W=_[0],J=_[1],K=s(function(){var n=f.popperProps,r=f.rootProps;return Object.assign({},{popperProps:n,rootProps:r},e.slots)},[f,e.slots]),U=function(){M(null),setTimeout(function(){J(null)},300)},X=function(){E.clearAllFilters(),!1!==(null==f?void 0:f.closeAfterSubmit)&&U()},Y=function(e,n){E.removeFilter(e),!1!==(null==f?void 0:f.closeAfterClear)&&!1!==(null==n?void 0:n.closeAfterClear)&&U()},Z=function(){var e=o(l().m(function e(n,r,t){return l().w(function(e){for(;;)switch(e.n){case 0:if(r){e.n=1;break}return e.a(2);case 1:null!=t&&t.singleValue||null!=t&&t.replaceValue?E.replaceFilter(n,r,{logic:r.logic}):E.upsertManyFilter(n,r,{logic:r.logic}),!1!==(null==f?void 0:f.closeAfterSubmit)&&!1!==(null==t?void 0:t.closeAfterSubmit)&&U();case 2:return e.a(2)}},e)}));return function(n,r,t){return e.apply(this,arguments)}}(),$=s(function(){var e=Object.values(p.fields);return Array.from(e)},[p.fields]),ee=E.getTotalCount(),ne="".concat(ee," Filter").concat(1!==ee?"s":"");return i(F,{onClickAway:U,children:a(H,r(r({className:m.root},K.rootProps),{},{children:[i(v,{title:ne,arrow:!0,placement:"top",children:i(h,{size:"small",ref:n,onClick:function(){J(null),M(n.current)},children:i(b,{badgeContent:ee,color:"primary",invisible:0===ee,children:i(C,{fontSize:"small"})})})}),i(R,r(r({open:D,anchorEl:w,placement:"bottom",transition:!0,disablePortal:!0},K.popperProps),{},{children:function(){if(0===$.length)return i(I,{onClose:U});var e=W?p.fields[W]:void 0;if(W&&e){var n,t=N[W];if(!t)return null;var o=r({},e);null!=o&&o.FormComponent&&delete o.FormComponent;var l=null===(n=V.filterState.storeFilter)||void 0===n?void 0:n[W];return i(t,{currentConfig:o,value:l,isLoading:V.isLoading,onRemove:E.removeFilterByFieldValue,validator:P[W],onSubmit:Z,onClose:U,onRemoveField:Y,onBack:function(){return J(null)}})}return a(T,{title:"Filter by",onClose:U,children:[i(B,{disableGutter:!0,children:i(Q,{className:m.menu,children:$.map(function(e){var n,r,t=e.field.toString();if(!t)return null;var o=E.getFieldInfo(e.field),l=null!==(n=null==o?void 0:o.values.join(", "))&&void 0!==n?n:"",u=o?o.values.length:0,c=u>0?" (".concat(u,")"):"",s=null!==(r=e.label)&&void 0!==r?r:t.toString(),d=u>0?"Filter by ".concat(s,": ").concat(l):void 0;if(e.field===k.quickSearch)d=L(z);else if(e.tooltip){var f,p="function"==typeof e.tooltip?e.tooltip(null==o?void 0:o.values):e.tooltip;d=(null!==(f=null==o?void 0:o.values.length)&&void 0!==f?f:0)>0?p:void 0}return i(g,{className:m.menuItem,sx:{justifyContent:"flex-start"},onClick:function(){return n=e.field,void J(n);var n},children:i(v,{title:d,placement:"right",arrow:!0,children:a("div",{className:m.menuItemInner,children:[e.before||null,i(y,{variant:"body2",sx:{flex:1},children:s}),i(y,{variant:"caption",sx:{ml:1,color:"text.secondary"},children:c}),e.after||null]})})},t)})})}),i(O,{children:i(j,{color:"error",disabled:0===ee,onClick:X,children:"Clear All"})})]})}()}))]}))})}}var V={root:"DinoFilterMenu-root",menu:"DinoFilterMenu-menu",menuItem:"DinoFilterMenu-menuItem",menuItemInner:"DinoFilterMenu-menuItemInner"},H=f(m)(e({},"&.".concat(V.root),{display:"inline-flex",justifyContent:"center",alignItems:"center",flex:"0 0 auto"})),Q=f(p)(e(e({},".".concat(V.menuItem),{paddingTop:0,paddingBottom:0}),".".concat(V.menuItemInner),{display:"flex",justifyContent:"flex-start",alignItems:"center",width:"100%",gap:"4px",paddingTop:"6px",paddingBottom:"6px"}));export{N as createFilterMenu,V as filterMenuClasses};
2
2
  //# sourceMappingURL=create.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"create.js","sources":["../../../../src/filter-bar/menu/create.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { createRef, useContext, useMemo, useState } from 'react'\r\nimport { Badge, Box, Button, IconButton, MenuItem, MenuList, styled, Tooltip, Typography } from '@mui/material'\r\nimport FilterListIcon from '@mui/icons-material/FilterList'\r\nimport ClickAwayListener from '@mui/material/ClickAwayListener'\r\nimport { KeySpecial } from '../types'\r\nimport { useFilterActions } from '../hooks'\r\nimport { FilterBarContext } from '../index.context'\r\nimport { FilterMenuNoField } from '../components/ui.units'\r\nimport { mapSpecialLabel, mapSpecialTexts } from '../helpers'\r\nimport { FormValidator, SingleRuleValidate } from '../../form/validator'\r\nimport { PopperBody, PopperContent, PopperCustom, PopperFooter } from '../components/popper-custom'\r\nimport createFormFieldString from './create-form-field-string'\r\n// types\r\nimport type { FC } from 'react'\r\nimport type { IFilterBarContext } from '../index.context'\r\nimport type { TFieldModelValid, TFieldType, TFieldValue } from '../types'\r\nimport type { IConfigValue, IFormValidatorConfig } from '../../form/validator'\r\nimport type { IFilterMenuConfigInternal, TFieldMenuConfigsInternal } from './types'\r\nimport type { IFilterMenuProps, IFilterMenuSlots, TFieldMenuConfigs } from './types'\r\nimport type { IFieldMenuConfig, IFilterMenuConfig, IFilterMenuFormProps } from './types'\r\n\r\n// #region utils\r\n/**\r\n * Builds a map of `FormValidator` instances keyed by field name.\r\n * Each validator is constructed from the validation rules defined in `config.validation`.\r\n * Fields with no validation config are skipped.\r\n *\r\n * @internal\r\n */\r\nfunction generateValidatorMap<T>(config: IFilterMenuConfig<T>) {\r\n const keys = Object.keys(config.fields) as TFieldType<T>[]\r\n const validateMaps = keys.reduce(\r\n (acc, key) => {\r\n const fieldKey = key as TFieldType<T>\r\n const fieldConfig = config.validation?.[fieldKey]\r\n if (fieldConfig) {\r\n acc[fieldKey] = new FormValidator({ [fieldKey]: fieldConfig } as IFormValidatorConfig<Partial<TFieldModelValid<T>>>)\r\n }\r\n return acc\r\n },\r\n {} as Record<TFieldType<T>, FormValidator<Partial<TFieldModelValid<T>>>>\r\n )\r\n return validateMaps\r\n}\r\n\r\n/**\r\n * Builds a map of form input components keyed by field name.\r\n * If a field defines a custom `FormComponent`, that is used; otherwise falls back to\r\n * the default `createFormFieldString()` free-text component.\r\n *\r\n * @internal\r\n */\r\nfunction generateFormInputMap<T>(config: IFilterMenuConfig<T>) {\r\n const { fields } = config\r\n const keys = Object.keys(fields) as TFieldType<T>[]\r\n const formInputMaps = keys.reduce(\r\n (acc, key) => {\r\n const fieldKey = key as TFieldType<T>\r\n const fieldConfig = fields[fieldKey] as IFieldMenuConfig<T>\r\n if (fieldConfig) {\r\n acc[fieldKey] = fieldConfig.FormComponent ?? createFormFieldString()\r\n }\r\n return acc\r\n },\r\n {} as Record<TFieldType<T>, React.ComponentType<IFilterMenuFormProps<T>>>\r\n )\r\n return formInputMaps\r\n}\r\n\r\nconst getQuickSearchTooltip = (currentHint?: string | ((currentHint: string) => string)) => {\r\n const defaultHint = mapSpecialTexts.qsTooltip\r\n if (!currentHint) return defaultHint\r\n return typeof currentHint === 'function' ? currentHint(defaultHint) : currentHint\r\n}\r\n/**\r\n * Normalises a raw `IFilterMenuConfig` into the internal format used by the menu:\r\n * - Injects the quick-search pseudo-field when `enableQuickSearch` is `true` (default)\r\n * - Stamps each field entry with its own `field` key\r\n * - Ensures every field has at least a `Required` validation rule\r\n *\r\n * @internal\r\n */\r\nfunction generateConfigs<T>(config: IFilterMenuConfig<T>): IFilterMenuConfigInternal<T> {\r\n const { fields, validation, enableQuickSearch = true, ...rest } = config\r\n const qsKey = KeySpecial.quickSearch\r\n\r\n // Merge quick search field if enabled\r\n const mergedFields: TFieldMenuConfigs<T> = { ...fields }\r\n if (enableQuickSearch) {\r\n const item = mergedFields[qsKey]\r\n const label = item?.label ? item.label : mapSpecialLabel[qsKey]\r\n const qsTooltip = getQuickSearchTooltip(config.quickSearchHint)\r\n const quiclkSearchConfig: IFieldMenuConfig<T> = { field: qsKey, label, singleValue: true, description: qsTooltip }\r\n const temp = Object.assign({}, mergedFields[qsKey], quiclkSearchConfig)\r\n mergedFields[qsKey] = temp\r\n } else {\r\n delete mergedFields[qsKey]\r\n }\r\n\r\n const keys = Object.keys(mergedFields) as TFieldType<T>[]\r\n const finalFields = keys.reduce<TFieldMenuConfigsInternal<T>>((acc, key) => {\r\n const fieldConfig = mergedFields[key]\r\n if (!fieldConfig) return acc\r\n acc[key] = { ...fieldConfig, field: key }\r\n return acc\r\n }, {} as TFieldMenuConfigsInternal<T>)\r\n\r\n // Merge validation config with default required rule\r\n const mergedValidation: IFormValidatorConfig<Partial<TFieldModelValid<T>>> = { ...validation }\r\n keys.forEach((key) => {\r\n const item: IConfigValue<Partial<TFieldModelValid<T>>> | undefined = mergedValidation[key]\r\n const label = item?.label ?? mergedFields[key]?.label ?? key.toString()\r\n if (!item) {\r\n mergedValidation[key] = { Rules: [{ rule: SingleRuleValidate.Required }], label }\r\n } else if (!item.Rules.some((r) => r.rule === SingleRuleValidate.Required)) {\r\n item.label = label\r\n item.Rules.push({ rule: SingleRuleValidate.Required })\r\n }\r\n })\r\n\r\n return { ...rest, fields: finalFields, validation: mergedValidation, enableQuickSearch }\r\n}\r\n// #endregion\r\n\r\n// #region main\r\n/**\r\n * Factory function that creates a `FilterMenu` component from a static field configuration.\r\n *\r\n * The generated component renders a badge icon button that opens a popper panel with:\r\n * - A **field list** view — lists all configured filter fields with applied-value counts\r\n * - A **field form** view — renders the appropriate input component for the selected field\r\n * - A **quick-search** field (opt-out via `enableQuickSearch: false`)\r\n * - OR / AND logic toggle support per field\r\n * - \"Clear All\" action to reset all active filters at once\r\n *\r\n * All state (open/close, selected field) is local; filter values are read/written through\r\n * `FilterBarContext` via `useFilterActions`.\r\n *\r\n * @param config - Static filter-menu configuration (fields, validation, slots, etc.)\r\n * @returns A React FC ready to be dropped anywhere inside a `FilterBarProvider`\r\n */\r\nexport function createFilterMenu<T>(config: IFilterMenuConfig<T>) {\r\n const classes = filterMenuClasses\r\n const mergedConfigs = generateConfigs(config)\r\n const validateMaps = generateValidatorMap(mergedConfigs)\r\n const formInputMaps = generateFormInputMap(mergedConfigs)\r\n const quickSearchHint = config.quickSearchHint\r\n\r\n // Component\r\n const FilterMenu: FC<IFilterMenuProps<T>> = (props) => {\r\n const refButton = createRef<HTMLButtonElement>()\r\n\r\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null)\r\n const isOpen = Boolean(anchorEl)\r\n\r\n const context = useContext(FilterBarContext) as IFilterBarContext<T>\r\n const filterActions = useFilterActions<T>(context)\r\n\r\n const [fieldSelected, setFieldSelected] = useState<TFieldType<T> | null>(null)\r\n\r\n const mergedSlots = useMemo<IFilterMenuSlots>(() => {\r\n const { popperProps, rootProps } = config\r\n return Object.assign({}, { popperProps, rootProps }, props.slots)\r\n }, [config, props.slots])\r\n\r\n const handleClose = () => {\r\n setAnchorEl(null)\r\n setTimeout(() => {\r\n setFieldSelected(null)\r\n }, 300)\r\n }\r\n\r\n const handleOpen = () => {\r\n setFieldSelected(null)\r\n setAnchorEl(refButton.current)\r\n }\r\n\r\n const handleMenuItemClick = (field: TFieldType<T>) => {\r\n setFieldSelected(field)\r\n }\r\n\r\n const handleClearAll = () => {\r\n filterActions.clearAllFilters()\r\n handleClose()\r\n }\r\n\r\n const handleSubmit = async (key: TFieldType<T>, value?: TFieldValue, fieldConfig?: IFieldMenuConfig<T>) => {\r\n if (!value) return\r\n if (fieldConfig?.singleValue || fieldConfig?.replaceValue) {\r\n filterActions.replaceFilter(key, value, { logic: value.logic })\r\n } else {\r\n filterActions.upsertManyFilter(key, value, { logic: value.logic })\r\n }\r\n if (config?.closeAfterSubmit !== false && fieldConfig?.closeAfterSubmit !== false) {\r\n handleClose()\r\n }\r\n }\r\n\r\n const data = useMemo(() => {\r\n const keys = Object.values(mergedConfigs.fields)\r\n return Array.from(keys) as IFieldMenuConfig<T>[]\r\n }, [mergedConfigs.fields])\r\n\r\n const renderContent = () => {\r\n if (data.length === 0) {\r\n return <FilterMenuNoField onClose={handleClose} />\r\n }\r\n const currentConfig = fieldSelected ? mergedConfigs.fields[fieldSelected] : undefined\r\n\r\n if (fieldSelected && currentConfig) {\r\n const FormComponent = formInputMaps[fieldSelected] as React.ComponentType<IFilterMenuFormProps<T>>\r\n if (!FormComponent) return null\r\n\r\n const config: IFieldMenuConfig<T> = { ...currentConfig }\r\n // Remove FormComponent from config before passing to form, as it's not needed there and can cause unnecessary re-renders\r\n if (config?.FormComponent) delete config.FormComponent\r\n\r\n const value = context.filterState.storeFilter?.[fieldSelected]\r\n return (\r\n <FormComponent\r\n currentConfig={config}\r\n value={value}\r\n isLoading={context.isLoading}\r\n onRemove={filterActions.removeFilterByFieldValue}\r\n validator={validateMaps[fieldSelected]}\r\n onSubmit={handleSubmit}\r\n onClose={handleClose}\r\n onRemoveField={(f) => filterActions.removeFilter(f)}\r\n onBack={() => setFieldSelected(null)}\r\n />\r\n )\r\n }\r\n\r\n return (\r\n <PopperContent title='Filter by' onClose={handleClose}>\r\n <PopperBody disableGutter>\r\n <MenuListCustom className={classes.menu}>\r\n {data.map((item) => {\r\n const key = item.field.toString()\r\n if (!key) return null\r\n const info = filterActions.getFieldInfo(item.field)\r\n const note = info?.values.join(', ') ?? ''\r\n const fieldCount = info ? info.values.length : 0\r\n const suffix = fieldCount > 0 ? ` (${fieldCount})` : ''\r\n const label = item.label ?? key.toString()\r\n let tooltipTitle = fieldCount > 0 ? `Filter by ${label}: ${note}` : undefined\r\n if (item.field === KeySpecial.quickSearch) {\r\n tooltipTitle = getQuickSearchTooltip(quickSearchHint)\r\n } else if (item.tooltip) {\r\n const tooltip = typeof item.tooltip === 'function' ? item.tooltip(info?.values) : item.tooltip\r\n tooltipTitle = (info?.values.length ?? 0) > 0 ? tooltip : undefined\r\n }\r\n return (\r\n <MenuItem\r\n key={key}\r\n className={classes.menuItem}\r\n sx={{ justifyContent: 'flex-start' }}\r\n onClick={() => handleMenuItemClick(item.field)}\r\n >\r\n <Tooltip title={tooltipTitle} placement='right' arrow>\r\n <div className={classes.menuItemInner}>\r\n {item.before || null}\r\n <Typography variant='body2' sx={{ flex: 1 }}>\r\n {label}\r\n </Typography>\r\n <Typography variant='caption' sx={{ ml: 1, color: 'text.secondary' }}>\r\n {suffix}\r\n </Typography>\r\n {item.after || null}\r\n </div>\r\n </Tooltip>\r\n </MenuItem>\r\n )\r\n })}\r\n </MenuListCustom>\r\n </PopperBody>\r\n <PopperFooter>\r\n <Button color='error' disabled={filterCount === 0} onClick={handleClearAll}>\r\n Clear All\r\n </Button>\r\n </PopperFooter>\r\n </PopperContent>\r\n )\r\n }\r\n\r\n const filterCount = filterActions.getTotalCount()\r\n const iconTitle = `${filterCount} Filter${filterCount !== 1 ? 's' : ''}`\r\n return (\r\n <ClickAwayListener onClickAway={handleClose}>\r\n <FilterInputStyled className={classes.root} {...mergedSlots.rootProps}>\r\n <Tooltip title={iconTitle} arrow placement='top'>\r\n <IconButton size='small' ref={refButton} onClick={handleOpen}>\r\n <Badge badgeContent={filterCount} color='primary' invisible={filterCount === 0}>\r\n <FilterListIcon fontSize='small' />\r\n </Badge>\r\n </IconButton>\r\n </Tooltip>\r\n <PopperCustom open={isOpen} anchorEl={anchorEl} placement='bottom' transition disablePortal {...mergedSlots.popperProps}>\r\n {renderContent()}\r\n </PopperCustom>\r\n </FilterInputStyled>\r\n </ClickAwayListener>\r\n )\r\n }\r\n return FilterMenu\r\n}\r\n// #endregion\r\n\r\n// #region styles\r\n/** CSS class names used by the `FilterMenu` component for external style overrides. */\r\nexport const filterMenuClasses = {\r\n root: 'DinoFilterMenu-root',\r\n input: 'DinoFilterMenu-input',\r\n beforeInput: 'DinoFilterMenu-beforeInput',\r\n menu: 'DinoFilterMenu-menu',\r\n menuItem: 'DinoFilterMenu-menuItem',\r\n menuItemInner: 'DinoFilterMenu-menuItemInner'\r\n}\r\n\r\nconst FilterInputStyled = styled(Box)({\r\n [`&.${filterMenuClasses.root}`]: {\r\n display: 'inline-flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n flex: '0 0 auto'\r\n }\r\n})\r\n\r\nconst MenuListCustom = styled(MenuList)({\r\n [`.${filterMenuClasses.menuItem}`]: { paddingTop: 0, paddingBottom: 0 },\r\n [`.${filterMenuClasses.menuItemInner}`]: {\r\n display: 'flex',\r\n justifyContent: 'flex-start',\r\n alignItems: 'center',\r\n width: '100%',\r\n gap: '4px',\r\n paddingTop: '6px',\r\n paddingBottom: '6px'\r\n }\r\n})\r\n// #endregion\r\n"],"names":["getQuickSearchTooltip","currentHint","defaultHint","mapSpecialTexts","qsTooltip","createFilterMenu","config","classes","filterMenuClasses","mergedConfigs","fields","validation","_config$enableQuickSe","enableQuickSearch","rest","_objectWithoutProperties","_excluded","qsKey","KeySpecial","quickSearch","mergedFields","_objectSpread","item","quiclkSearchConfig","field","label","mapSpecialLabel","singleValue","description","quickSearchHint","temp","Object","assign","keys","finalFields","reduce","acc","key","fieldConfig","mergedValidation","forEach","_ref","_item$label","_mergedFields$key","toString","Rules","some","r","rule","SingleRuleValidate","Required","push","generateConfigs","validateMaps","_config$validation","fieldKey","FormValidator","_defineProperty","generateValidatorMap","formInputMaps","_fieldConfig$FormComp","FormComponent","createFormFieldString","generateFormInputMap","props","refButton","createRef","_useState","useState","_useState2","_slicedToArray","anchorEl","setAnchorEl","isOpen","Boolean","context","useContext","FilterBarContext","filterActions","useFilterActions","_useState3","_useState4","fieldSelected","setFieldSelected","mergedSlots","useMemo","popperProps","rootProps","slots","handleClose","setTimeout","handleClearAll","clearAllFilters","handleSubmit","_ref2","_asyncToGenerator","_regenerator","m","_callee","value","w","_context","n","a","replaceValue","replaceFilter","logic","upsertManyFilter","closeAfterSubmit","_x","_x2","_x3","apply","this","arguments","data","values","Array","from","filterCount","getTotalCount","iconTitle","concat","_jsx","ClickAwayListener","onClickAway","children","_jsxs","FilterInputStyled","className","root","Tooltip","title","arrow","placement","IconButton","size","ref","onClick","current","Badge","badgeContent","color","invisible","FilterListIcon","fontSize","PopperCustom","open","transition","disablePortal","length","FilterMenuNoField","onClose","currentConfig","undefined","_context$filterState$","filterState","storeFilter","isLoading","onRemove","removeFilterByFieldValue","validator","onSubmit","onRemoveField","f","removeFilter","onBack","PopperContent","PopperBody","disableGutter","MenuListCustom","menu","map","_info$values$join","_item$label2","info","getFieldInfo","note","join","fieldCount","suffix","tooltipTitle","tooltip","_info$values$length","MenuItem","menuItem","sx","justifyContent","menuItemInner","before","Typography","variant","flex","ml","after","PopperFooter","Button","disabled","renderContent","styled","Box","display","alignItems","MenuList","paddingTop","paddingBottom","width","gap"],"mappings":"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"}
1
+ {"version":3,"file":"create.js","sources":["../../../../src/filter-bar/menu/create.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { createRef, useContext, useMemo, useState } from 'react'\r\nimport { Badge, Box, Button, IconButton, MenuItem, MenuList, styled, Tooltip, Typography } from '@mui/material'\r\nimport FilterListIcon from '@mui/icons-material/FilterList'\r\nimport ClickAwayListener from '@mui/material/ClickAwayListener'\r\nimport { KeySpecial } from '../types'\r\nimport { useFilterActions } from '../hooks'\r\nimport { FilterBarContext } from '../index.context'\r\nimport { FilterMenuNoField } from '../components/ui.units'\r\nimport { mapSpecialLabel, mapSpecialTexts } from '../helpers'\r\nimport { FormValidator, SingleRuleValidate } from '../../form/validator'\r\nimport { PopperBody, PopperContent, PopperCustom, PopperFooter } from '../components/popper-custom'\r\nimport createFormFieldString from './create-form-field-string'\r\n// types\r\nimport type { FC } from 'react'\r\nimport type { IFilterBarContext } from '../index.context'\r\nimport type { TFieldModelValid, TFieldType, TFieldValue } from '../types'\r\nimport type { IConfigValue, IFormValidatorConfig } from '../../form/validator'\r\nimport type { IFilterMenuConfigInternal, TFieldMenuConfigsInternal } from './types'\r\nimport type { IFilterMenuProps, IFilterMenuSlots, TFieldMenuConfigs } from './types'\r\nimport type { IFieldMenuConfig, IFilterMenuConfig, IFilterMenuFormProps } from './types'\r\n\r\n// #region utils\r\n/**\r\n * Builds a map of `FormValidator` instances keyed by field name.\r\n * Each validator is constructed from the validation rules defined in `config.validation`.\r\n * Fields with no validation config are skipped.\r\n *\r\n * @internal\r\n */\r\nfunction generateValidatorMap<T>(config: IFilterMenuConfig<T>) {\r\n const keys = Object.keys(config.fields) as TFieldType<T>[]\r\n const validateMaps = keys.reduce(\r\n (acc, key) => {\r\n const fieldKey = key as TFieldType<T>\r\n const fieldConfig = config.validation?.[fieldKey]\r\n if (fieldConfig) {\r\n acc[fieldKey] = new FormValidator({ [fieldKey]: fieldConfig } as IFormValidatorConfig<Partial<TFieldModelValid<T>>>)\r\n }\r\n return acc\r\n },\r\n {} as Record<TFieldType<T>, FormValidator<Partial<TFieldModelValid<T>>>>\r\n )\r\n return validateMaps\r\n}\r\n\r\n/**\r\n * Builds a map of form input components keyed by field name.\r\n * If a field defines a custom `FormComponent`, that is used; otherwise falls back to\r\n * the default `createFormFieldString()` free-text component.\r\n *\r\n * @internal\r\n */\r\nfunction generateFormInputMap<T>(config: IFilterMenuConfig<T>) {\r\n const { fields } = config\r\n const keys = Object.keys(fields) as TFieldType<T>[]\r\n const formInputMaps = keys.reduce(\r\n (acc, key) => {\r\n const fieldKey = key as TFieldType<T>\r\n const fieldConfig = fields[fieldKey] as IFieldMenuConfig<T>\r\n if (fieldConfig) {\r\n acc[fieldKey] = fieldConfig.FormComponent ?? createFormFieldString()\r\n }\r\n return acc\r\n },\r\n {} as Record<TFieldType<T>, React.ComponentType<IFilterMenuFormProps<T>>>\r\n )\r\n return formInputMaps\r\n}\r\n\r\nconst getQuickSearchTooltip = (currentHint?: string | ((currentHint: string) => string)) => {\r\n const defaultHint = mapSpecialTexts.qsTooltip\r\n if (!currentHint) return defaultHint\r\n return typeof currentHint === 'function' ? currentHint(defaultHint) : currentHint\r\n}\r\n/**\r\n * Normalises a raw `IFilterMenuConfig` into the internal format used by the menu:\r\n * - Injects the quick-search pseudo-field when `enableQuickSearch` is `true` (default)\r\n * - Stamps each field entry with its own `field` key\r\n * - Ensures every field has at least a `Required` validation rule\r\n *\r\n * @internal\r\n */\r\nfunction generateConfigs<T>(config: IFilterMenuConfig<T>): IFilterMenuConfigInternal<T> {\r\n const { fields, validation, enableQuickSearch = true, ...rest } = config\r\n const qsKey = KeySpecial.quickSearch\r\n\r\n // Merge quick search field if enabled\r\n const mergedFields: TFieldMenuConfigs<T> = { ...fields }\r\n if (enableQuickSearch) {\r\n const item = mergedFields[qsKey]\r\n const label = item?.label ? item.label : mapSpecialLabel[qsKey]\r\n const qsTooltip = getQuickSearchTooltip(config.quickSearchHint)\r\n const quiclkSearchConfig: IFieldMenuConfig<T> = { field: qsKey, label, singleValue: true, description: qsTooltip }\r\n const temp = Object.assign({}, mergedFields[qsKey], quiclkSearchConfig)\r\n mergedFields[qsKey] = temp\r\n } else {\r\n delete mergedFields[qsKey]\r\n }\r\n\r\n const keys = Object.keys(mergedFields) as TFieldType<T>[]\r\n const finalFields = keys.reduce<TFieldMenuConfigsInternal<T>>((acc, key) => {\r\n const fieldConfig = mergedFields[key]\r\n if (!fieldConfig) return acc\r\n acc[key] = { ...fieldConfig, field: key }\r\n return acc\r\n }, {} as TFieldMenuConfigsInternal<T>)\r\n\r\n // Merge validation config with default required rule\r\n const mergedValidation: IFormValidatorConfig<Partial<TFieldModelValid<T>>> = { ...validation }\r\n keys.forEach((key) => {\r\n const item: IConfigValue<Partial<TFieldModelValid<T>>> | undefined = mergedValidation[key]\r\n const label = item?.label ?? mergedFields[key]?.label ?? key.toString()\r\n if (!item) {\r\n mergedValidation[key] = { Rules: [{ rule: SingleRuleValidate.Required }], label }\r\n } else if (!item.Rules.some((r) => r.rule === SingleRuleValidate.Required)) {\r\n item.label = label\r\n item.Rules.push({ rule: SingleRuleValidate.Required })\r\n }\r\n })\r\n\r\n return { ...rest, fields: finalFields, validation: mergedValidation, enableQuickSearch }\r\n}\r\n// #endregion\r\n\r\n// #region main\r\n/**\r\n * Factory function that creates a `FilterMenu` component from a static field configuration.\r\n *\r\n * The generated component renders a badge icon button that opens a popper panel with:\r\n * - A **field list** view — lists all configured filter fields with applied-value counts\r\n * - A **field form** view — renders the appropriate input component for the selected field\r\n * - A **quick-search** field (opt-out via `enableQuickSearch: false`)\r\n * - OR / AND logic toggle support per field\r\n * - \"Clear All\" action to reset all active filters at once\r\n *\r\n * All state (open/close, selected field) is local; filter values are read/written through\r\n * `FilterBarContext` via `useFilterActions`.\r\n *\r\n * @param config - Static filter-menu configuration (fields, validation, slots, etc.)\r\n * @returns A React FC ready to be dropped anywhere inside a `FilterBarProvider`\r\n */\r\nexport function createFilterMenu<T>(config: IFilterMenuConfig<T>) {\r\n const classes = filterMenuClasses\r\n const mergedConfigs = generateConfigs(config)\r\n const validateMaps = generateValidatorMap(mergedConfigs)\r\n const formInputMaps = generateFormInputMap(mergedConfigs)\r\n const quickSearchHint = config.quickSearchHint\r\n\r\n // Component\r\n const FilterMenu: FC<IFilterMenuProps<T>> = (props) => {\r\n const refButton = createRef<HTMLButtonElement>()\r\n\r\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null)\r\n const isOpen = Boolean(anchorEl)\r\n\r\n const context = useContext(FilterBarContext) as IFilterBarContext<T>\r\n const filterActions = useFilterActions<T>(context)\r\n\r\n const [fieldSelected, setFieldSelected] = useState<TFieldType<T> | null>(null)\r\n\r\n const mergedSlots = useMemo<IFilterMenuSlots>(() => {\r\n const { popperProps, rootProps } = config\r\n return Object.assign({}, { popperProps, rootProps }, props.slots)\r\n }, [config, props.slots])\r\n\r\n const handleClose = () => {\r\n setAnchorEl(null)\r\n setTimeout(() => {\r\n setFieldSelected(null)\r\n }, 300)\r\n }\r\n\r\n const handleOpen = () => {\r\n setFieldSelected(null)\r\n setAnchorEl(refButton.current)\r\n }\r\n\r\n const handleMenuItemClick = (field: TFieldType<T>) => {\r\n setFieldSelected(field)\r\n }\r\n\r\n const handleClearAll = () => {\r\n filterActions.clearAllFilters()\r\n if (config?.closeAfterSubmit !== false) {\r\n handleClose()\r\n }\r\n }\r\n\r\n const handleRemoveField = (field: TFieldType<T>, fieldConfig?: IFieldMenuConfig<T>) => {\r\n filterActions.removeFilter(field)\r\n if (config?.closeAfterClear !== false && fieldConfig?.closeAfterClear !== false) {\r\n handleClose()\r\n }\r\n }\r\n\r\n const handleSubmit = async (key: TFieldType<T>, value?: TFieldValue, fieldConfig?: IFieldMenuConfig<T>) => {\r\n if (!value) return\r\n if (fieldConfig?.singleValue || fieldConfig?.replaceValue) {\r\n filterActions.replaceFilter(key, value, { logic: value.logic })\r\n } else {\r\n filterActions.upsertManyFilter(key, value, { logic: value.logic })\r\n }\r\n if (config?.closeAfterSubmit !== false && fieldConfig?.closeAfterSubmit !== false) {\r\n handleClose()\r\n }\r\n }\r\n\r\n const data = useMemo(() => {\r\n const keys = Object.values(mergedConfigs.fields)\r\n return Array.from(keys) as IFieldMenuConfig<T>[]\r\n }, [mergedConfigs.fields])\r\n\r\n const renderContent = () => {\r\n if (data.length === 0) {\r\n return <FilterMenuNoField onClose={handleClose} />\r\n }\r\n const currentConfig = fieldSelected ? mergedConfigs.fields[fieldSelected] : undefined\r\n\r\n if (fieldSelected && currentConfig) {\r\n const FormComponent = formInputMaps[fieldSelected] as React.ComponentType<IFilterMenuFormProps<T>>\r\n if (!FormComponent) return null\r\n\r\n const config: IFieldMenuConfig<T> = { ...currentConfig }\r\n // Remove FormComponent from config before passing to form, as it's not needed there and can cause unnecessary re-renders\r\n if (config?.FormComponent) delete config.FormComponent\r\n\r\n const value = context.filterState.storeFilter?.[fieldSelected]\r\n return (\r\n <FormComponent\r\n currentConfig={config}\r\n value={value}\r\n isLoading={context.isLoading}\r\n onRemove={filterActions.removeFilterByFieldValue}\r\n validator={validateMaps[fieldSelected]}\r\n onSubmit={handleSubmit}\r\n onClose={handleClose}\r\n onRemoveField={handleRemoveField}\r\n onBack={() => setFieldSelected(null)}\r\n />\r\n )\r\n }\r\n\r\n return (\r\n <PopperContent title='Filter by' onClose={handleClose}>\r\n <PopperBody disableGutter>\r\n <MenuListCustom className={classes.menu}>\r\n {data.map((item) => {\r\n const key = item.field.toString()\r\n if (!key) return null\r\n const info = filterActions.getFieldInfo(item.field)\r\n const note = info?.values.join(', ') ?? ''\r\n const fieldCount = info ? info.values.length : 0\r\n const suffix = fieldCount > 0 ? ` (${fieldCount})` : ''\r\n const label = item.label ?? key.toString()\r\n let tooltipTitle = fieldCount > 0 ? `Filter by ${label}: ${note}` : undefined\r\n if (item.field === KeySpecial.quickSearch) {\r\n tooltipTitle = getQuickSearchTooltip(quickSearchHint)\r\n } else if (item.tooltip) {\r\n const tooltip = typeof item.tooltip === 'function' ? item.tooltip(info?.values) : item.tooltip\r\n tooltipTitle = (info?.values.length ?? 0) > 0 ? tooltip : undefined\r\n }\r\n return (\r\n <MenuItem\r\n key={key}\r\n className={classes.menuItem}\r\n sx={{ justifyContent: 'flex-start' }}\r\n onClick={() => handleMenuItemClick(item.field)}\r\n >\r\n <Tooltip title={tooltipTitle} placement='right' arrow>\r\n <div className={classes.menuItemInner}>\r\n {item.before || null}\r\n <Typography variant='body2' sx={{ flex: 1 }}>\r\n {label}\r\n </Typography>\r\n <Typography variant='caption' sx={{ ml: 1, color: 'text.secondary' }}>\r\n {suffix}\r\n </Typography>\r\n {item.after || null}\r\n </div>\r\n </Tooltip>\r\n </MenuItem>\r\n )\r\n })}\r\n </MenuListCustom>\r\n </PopperBody>\r\n <PopperFooter>\r\n <Button color='error' disabled={filterCount === 0} onClick={handleClearAll}>\r\n Clear All\r\n </Button>\r\n </PopperFooter>\r\n </PopperContent>\r\n )\r\n }\r\n\r\n const filterCount = filterActions.getTotalCount()\r\n const iconTitle = `${filterCount} Filter${filterCount !== 1 ? 's' : ''}`\r\n return (\r\n <ClickAwayListener onClickAway={handleClose}>\r\n <FilterInputStyled className={classes.root} {...mergedSlots.rootProps}>\r\n <Tooltip title={iconTitle} arrow placement='top'>\r\n <IconButton size='small' ref={refButton} onClick={handleOpen}>\r\n <Badge badgeContent={filterCount} color='primary' invisible={filterCount === 0}>\r\n <FilterListIcon fontSize='small' />\r\n </Badge>\r\n </IconButton>\r\n </Tooltip>\r\n <PopperCustom open={isOpen} anchorEl={anchorEl} placement='bottom' transition disablePortal {...mergedSlots.popperProps}>\r\n {renderContent()}\r\n </PopperCustom>\r\n </FilterInputStyled>\r\n </ClickAwayListener>\r\n )\r\n }\r\n return FilterMenu\r\n}\r\n// #endregion\r\n\r\n// #region styles\r\n/** CSS class names used by the `FilterMenu` component for external style overrides. */\r\nexport const filterMenuClasses = {\r\n root: 'DinoFilterMenu-root',\r\n input: 'DinoFilterMenu-input',\r\n beforeInput: 'DinoFilterMenu-beforeInput',\r\n menu: 'DinoFilterMenu-menu',\r\n menuItem: 'DinoFilterMenu-menuItem',\r\n menuItemInner: 'DinoFilterMenu-menuItemInner'\r\n}\r\n\r\nconst FilterInputStyled = styled(Box)({\r\n [`&.${filterMenuClasses.root}`]: {\r\n display: 'inline-flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n flex: '0 0 auto'\r\n }\r\n})\r\n\r\nconst MenuListCustom = styled(MenuList)({\r\n [`.${filterMenuClasses.menuItem}`]: { paddingTop: 0, paddingBottom: 0 },\r\n [`.${filterMenuClasses.menuItemInner}`]: {\r\n display: 'flex',\r\n justifyContent: 'flex-start',\r\n alignItems: 'center',\r\n width: '100%',\r\n gap: '4px',\r\n paddingTop: '6px',\r\n paddingBottom: '6px'\r\n }\r\n})\r\n// #endregion\r\n"],"names":["getQuickSearchTooltip","currentHint","defaultHint","mapSpecialTexts","qsTooltip","createFilterMenu","config","classes","filterMenuClasses","mergedConfigs","fields","validation","_config$enableQuickSe","enableQuickSearch","rest","_objectWithoutProperties","_excluded","qsKey","KeySpecial","quickSearch","mergedFields","_objectSpread","item","quiclkSearchConfig","field","label","mapSpecialLabel","singleValue","description","quickSearchHint","temp","Object","assign","keys","finalFields","reduce","acc","key","fieldConfig","mergedValidation","forEach","_ref","_item$label","_mergedFields$key","toString","Rules","some","r","rule","SingleRuleValidate","Required","push","generateConfigs","validateMaps","_config$validation","fieldKey","FormValidator","_defineProperty","generateValidatorMap","formInputMaps","_fieldConfig$FormComp","FormComponent","createFormFieldString","generateFormInputMap","props","refButton","createRef","_useState","useState","_useState2","_slicedToArray","anchorEl","setAnchorEl","isOpen","Boolean","context","useContext","FilterBarContext","filterActions","useFilterActions","_useState3","_useState4","fieldSelected","setFieldSelected","mergedSlots","useMemo","popperProps","rootProps","slots","handleClose","setTimeout","handleClearAll","clearAllFilters","closeAfterSubmit","handleRemoveField","removeFilter","closeAfterClear","handleSubmit","_ref2","_asyncToGenerator","_regenerator","m","_callee","value","w","_context","n","a","replaceValue","replaceFilter","logic","upsertManyFilter","_x","_x2","_x3","apply","this","arguments","data","values","Array","from","filterCount","getTotalCount","iconTitle","concat","_jsx","ClickAwayListener","onClickAway","children","_jsxs","FilterInputStyled","className","root","Tooltip","title","arrow","placement","IconButton","size","ref","onClick","current","Badge","badgeContent","color","invisible","FilterListIcon","fontSize","PopperCustom","open","transition","disablePortal","length","FilterMenuNoField","onClose","currentConfig","undefined","_context$filterState$","filterState","storeFilter","isLoading","onRemove","removeFilterByFieldValue","validator","onSubmit","onRemoveField","onBack","PopperContent","PopperBody","disableGutter","MenuListCustom","menu","map","_info$values$join","_item$label2","info","getFieldInfo","note","join","fieldCount","suffix","tooltipTitle","tooltip","_info$values$length","MenuItem","menuItem","sx","justifyContent","menuItemInner","before","Typography","variant","flex","ml","after","PopperFooter","Button","disabled","renderContent","styled","Box","display","alignItems","MenuList","paddingTop","paddingBottom","width","gap"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ui.units.js","sources":["../../../../src/filter-bar/menu/ui.units.tsx"],"sourcesContent":["import { FC } from 'react'\r\nimport { alpha, Button, IconButton, Stack, styled, Typography } from '@mui/material'\r\nimport InfoIcon from '@mui/icons-material/Info'\r\nimport RefreshIcon from '@mui/icons-material/Refresh'\r\n\r\ninterface IErrorPannelProps {\r\n onRetry?: () => void\r\n}\r\n\r\nexport const ErrorPannel: FC<IErrorPannelProps> = ({ onRetry }) => (\r\n <ErrorPannelStyled>\r\n <InfoIcon color='error' fontSize='small' />\r\n <Typography color='error' variant='subtitle1' component='p' sx={{ flex: 1 }}>\r\n Failed to load options.\r\n </Typography>\r\n {/* <IconButton color='error' size='small' onClick={onRetry}>\r\n <RefreshIcon color='error' fontSize='small' />\r\n </IconButton> */}\r\n <Button variant='text' color='primary' size='small' onClick={onRetry}>\r\n Retry\r\n </Button>\r\n </ErrorPannelStyled>\r\n)\r\n\r\nconst ErrorPannelStyled = styled(Stack)(({ theme }) => ({\r\n alignItems: 'center',\r\n flexDirection: 'row',\r\n gap: theme.spacing(1),\r\n padding: theme.spacing(1),\r\n backgroundColor: alpha(theme.palette.error.light, 0.1),\r\n borderRadius: theme.shape.borderRadius\r\n}))\r\n"],"names":["ErrorPannel","_ref","onRetry","_jsxs","ErrorPannelStyled","_jsx","InfoIcon","color","fontSize","Typography","variant","component","sx","flex","children","Button","size","onClick","styled","Stack","_ref2","theme","alignItems","flexDirection","gap","spacing","padding","backgroundColor","alpha","palette","error","light","borderRadius","shape"],"mappings":"uLASaA,EAAqC,SAA1BC,GAAA,IAA6BC,EAAOD,EAAPC,QAAO,OAC1DC,EAACC,aACCC,EAACC,EAAS,CAAAC,MAAM,QAAQC,SAAS,UACjCH,EAACI,EAAW,CAAAF,MAAM,QAAQG,QAAQ,YAAYC,UAAU,IAAIC,GAAI,CAAEC,KAAM,GAAGC,SAAA,4BAM3ET,EAACU,EAAO,CAAAL,QAAQ,OAAOH,MAAM,UAAUS,KAAK,QAAQC,QAASf,EAEpDY,SAAA,YACS,EAGhBV,EAAoBc,EAAOC,EAAPD,CAAc,SAAAE,GAAA,IAAGC,EAAKD,EAALC,MAAK,MAAQ,CACtDC,WAAY,SACZC,cAAe,MACfC,IAAKH,EAAMI,QAAQ,GACnBC,QAASL,EAAMI,QAAQ,GACvBE,gBAAiBC,EAAMP,EAAMQ,QAAQC,MAAMC,MAAO,IAClDC,aAAcX,EAAMY,MAAMD,aAC3B"}
1
+ {"version":3,"file":"ui.units.js","sources":["../../../../src/filter-bar/menu/ui.units.tsx"],"sourcesContent":["import { FC } from 'react'\r\nimport { alpha, Button, Stack, styled, Typography } from '@mui/material'\r\nimport InfoIcon from '@mui/icons-material/Info'\r\n\r\ninterface IErrorPannelProps {\r\n onRetry?: () => void\r\n}\r\n\r\nexport const ErrorPannel: FC<IErrorPannelProps> = ({ onRetry }) => (\r\n <ErrorPannelStyled>\r\n <InfoIcon color='error' fontSize='small' />\r\n <Typography color='error' variant='subtitle1' component='p' sx={{ flex: 1 }}>\r\n Failed to load options.\r\n </Typography>\r\n <Button variant='text' color='primary' size='small' onClick={onRetry}>\r\n Retry\r\n </Button>\r\n </ErrorPannelStyled>\r\n)\r\n\r\nconst ErrorPannelStyled = styled(Stack)(({ theme }) => ({\r\n alignItems: 'center',\r\n flexDirection: 'row',\r\n gap: theme.spacing(1),\r\n padding: theme.spacing(1),\r\n backgroundColor: alpha(theme.palette.error.light, 0.1),\r\n borderRadius: theme.shape.borderRadius\r\n}))\r\n"],"names":["ErrorPannel","_ref","onRetry","_jsxs","ErrorPannelStyled","_jsx","InfoIcon","color","fontSize","Typography","variant","component","sx","flex","children","Button","size","onClick","styled","Stack","_ref2","theme","alignItems","flexDirection","gap","spacing","padding","backgroundColor","alpha","palette","error","light","borderRadius","shape"],"mappings":"uLAQaA,EAAqC,SAA1BC,GAAA,IAA6BC,EAAOD,EAAPC,QAAO,OAC1DC,EAACC,aACCC,EAACC,EAAS,CAAAC,MAAM,QAAQC,SAAS,UACjCH,EAACI,EAAW,CAAAF,MAAM,QAAQG,QAAQ,YAAYC,UAAU,IAAIC,GAAI,CAAEC,KAAM,GAAGC,SAAA,4BAG3ET,EAACU,EAAO,CAAAL,QAAQ,OAAOH,MAAM,UAAUS,KAAK,QAAQC,QAASf,EAEpDY,SAAA,YACS,EAGhBV,EAAoBc,EAAOC,EAAPD,CAAc,SAAAE,GAAA,IAAGC,EAAKD,EAALC,MAAK,MAAQ,CACtDC,WAAY,SACZC,cAAe,MACfC,IAAKH,EAAMI,QAAQ,GACnBC,QAASL,EAAMI,QAAQ,GACvBE,gBAAiBC,EAAMP,EAAMQ,QAAQC,MAAMC,MAAO,IAClDC,aAAcX,EAAMY,MAAMD,aAC3B"}
@@ -1,2 +1,2 @@
1
- import{toConsumableArray as r,typeof as n,objectSpread2 as e,createForOfIteratorHelper as t}from"../../_virtual/_rollupPluginBabelHelpers.js";import{FormValidator as i}from"./validator.js";var o=function(r){for(var n=arguments.length,e=new Array(n>1?n-1:0),t=1;t<n;t++)e[t-1]=arguments[t];return e.length<1?r:e.filter(function(r){return r}).reduce(function(r,n){return r=Object.assign(r,n)},r)},a=function(e){for(var t=arguments.length,i=new Array(t>1?t-1:0),u=1;u<t;u++)i[u-1]=arguments[u];if((i=i.filter(function(r){return!!r})).length<1)return e;for(var f=[e].concat(r(i)).filter(function(r){return r}),c=f.reduce(function(e,t){if(!t)return e;var i=Object.keys(t).filter(function(r){return"object"===n(t[r])&&!Array.isArray(t[r])});return e.push.apply(e,r(i)),e},[]),l=o.apply(void 0,[e].concat(r(f.slice(1)))),s=l,v=f.slice(1).filter(function(r){return!!r}),p=function(){var n=c[y];s[n]=a.apply(void 0,[{},s[n]].concat(r(v.map(function(r){return r[n]}))))},y=0;y<c.length;y++)p();return l},u=function(r,n){return r&&r[n]?e(e({},r[n][0]),{},{error:!0}):{error:!1,message:""}},f=function(r){var n=Array.from(r).reduce(function(r,n){return r[n[0]]?Array.isArray(r[n[0]])?r[n[0]].push(n[1]):r[n[0]]=[r[n[0]],n[1]]:r[n[0]]=n[1],r},{});return Object.keys(n).forEach(function(r){var e=n[r];"string"!=typeof e||"true"!==e.toString().toLocaleLowerCase()&&"false"!==e.toString().toLocaleLowerCase()||(n[r]="true"===e.toString().toLocaleLowerCase())}),n},c=function(r){if("string"==typeof r)return r.startsWith("#")&&/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/.test(r)?r:r.trim();if(Array.isArray(r))return r.map(function(r){return c(r)});if(r instanceof File)return r;if(r instanceof FileList)return r;if(r instanceof Date)return r;if("number"==typeof r||"boolean"==typeof r||null==r)return r;if(r instanceof HTMLElement)return r;if("function"==typeof r)return r;if(r&&"object"===n(r)){var e={};return Object.keys(r).forEach(function(n){e[n]=c(r[n])}),e}return r},l=function(r,n,e,t){var i=t.run(n);if(i){var o=e||{},a=Object.keys(n).filter(function(r){return!!n[r]}).filter(function(r){return n[r]instanceof File&&!!n[r].size});return a.push(r),a.forEach(function(r){i[r]?o[r]=i[r]:delete o[r]}),o}return null},s=function(r,n){var e,t=null===(e=r.response)||void 0===e?void 0:e.data,i=(null==t?void 0:t.errors)||t;if(i){var o=Object.keys(n),a={};return o.forEach(function(r){var n=i[r];Array.isArray(n)&&n.length>0&&(a[r]=[{message:n[0]}])}),a}},v=function(r){var n,e=null===(n=r.response)||void 0===n?void 0:n.data,t=(null==e?void 0:e.errors)||e;if(t&&t[""]){var i=t[""];if(Array.isArray(i))return i.filter(function(r){return r&&"string"==typeof r&&""!==r.trim()})}return[]},p=function(){for(var n=arguments.length,e=new Array(n),t=0;t<n;t++)e[t]=arguments[t];for(var o=e.map(function(r){return null==r?void 0:r.configs}).filter(function(r){return!!r}),u=Object.assign.apply(Object,[{}].concat(r(o))),f=function(){var n=Object.keys(u)[c];u[n]=a.apply(void 0,[{}].concat(r(o.map(function(r){return r?r[n]:{Rules:[]}})))),u[n].Rules=o.map(function(r){return r?r[n]:{Rules:[]}}).reduce(function(n,e){var t;return n.push.apply(n,r(null!==(t=null==e?void 0:e.Rules)&&void 0!==t?t:[])),n},[])},c=0;c<Object.keys(u).length;c++)f();return new i(u)},y=function(r,n){if(0===r.length)return{valid:!1,message:"File is empty or cannot be parsed"};var e=Object.keys(r[0]),i=n.filter(function(r){return!e.includes(r)});if(i.length>0)return{valid:!1,message:"Missing required columns: ".concat(i.join(", "))};for(var o=0;o<r.length;o++){var a,u=r[o],f=t(n);try{for(f.s();!(a=f.n()).done;){var c=a.value,l=u[c];if("string"!=typeof l||""===l.trim())return{valid:!1,message:'Invalid or missing value for "'.concat(c.toString(),'" at row ').concat(o+2)}}}catch(r){f.e(r)}finally{f.f()}}return{valid:!0}};export{f as convertFormDataToJson,v as getErrorCommonFromResponse,s as getErrorFromResponse,u as getErrorMessage,l as singleValidate,c as trimAllStrings,y as validateCsvModel,p as validateMerge};
1
+ import{toConsumableArray as r,typeof as e,objectSpread2 as n,createForOfIteratorHelper as t}from"../../_virtual/_rollupPluginBabelHelpers.js";import{FormValidator as i}from"./validator.js";var o=function(r){for(var n=arguments.length,i=new Array(n>1?n-1:0),a=1;a<n;a++)i[a-1]=arguments[a];var u=i.filter(function(r){return!!r});if(u.length<1)return r;var f,l=Object.assign({},r),s=t(u);try{for(s.s();!(f=s.n()).done;)for(var c=f.value,v=0,y=Object.keys(c);v<y.length;v++){var p=y[v],g=c[p],d=l[p];null===g||"object"!==e(g)||Array.isArray(g)||null===d||"object"!==e(d)||Array.isArray(d)?l[p]=g:l[p]=o(d,g)}}catch(r){s.e(r)}finally{s.f()}return l},a=function(r,e){return r&&r[e]?n(n({},r[e][0]),{},{error:!0}):{error:!1,message:""}},u=function(r){var e=Array.from(r).reduce(function(r,e){return r[e[0]]?Array.isArray(r[e[0]])?r[e[0]].push(e[1]):r[e[0]]=[r[e[0]],e[1]]:r[e[0]]=e[1],r},{});return Object.keys(e).forEach(function(r){var n=e[r];"string"!=typeof n||"true"!==n.toString().toLocaleLowerCase()&&"false"!==n.toString().toLocaleLowerCase()||(e[r]="true"===n.toString().toLocaleLowerCase())}),e},f=function(r){if("string"==typeof r)return r.startsWith("#")&&/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/.test(r)?r:r.trim();if(Array.isArray(r))return r.map(function(r){return f(r)});if(r instanceof File)return r;if(r instanceof FileList)return r;if(r instanceof Date)return r;if("number"==typeof r||"boolean"==typeof r||null==r)return r;if(r instanceof HTMLElement)return r;if("function"==typeof r)return r;if(r&&"object"===e(r)){var n={};return Object.keys(r).forEach(function(e){n[e]=f(r[e])}),n}return r},l=function(r,e,n,t){var i=t.run(e);if(i){var o=n||{},a=Object.keys(e).filter(function(r){return!!e[r]}).filter(function(r){return e[r]instanceof File&&!!e[r].size});return a.push(r),a.forEach(function(r){i[r]?o[r]=i[r]:delete o[r]}),o}return null},s=function(r,e){var n,t=null===(n=r.response)||void 0===n?void 0:n.data,i=(null==t?void 0:t.errors)||t;if(i){var o=Object.keys(e),a={};return o.forEach(function(r){var e=i[r];Array.isArray(e)&&e.length>0&&(a[r]=[{message:e[0]}])}),a}},c=function(r){var e,n=null===(e=r.response)||void 0===e?void 0:e.data,t=(null==n?void 0:n.errors)||n;if(t&&t[""]){var i=t[""];if(Array.isArray(i))return i.filter(function(r){return r&&"string"==typeof r&&""!==r.trim()})}return[]},v=function(){for(var e=arguments.length,n=new Array(e),t=0;t<e;t++)n[t]=arguments[t];for(var a=n.map(function(r){return null==r?void 0:r.configs}).filter(function(r){return!!r}),u=Object.assign.apply(Object,[{}].concat(r(a))),f=function(){var e=Object.keys(u)[l];u[e]=o.apply(void 0,[{}].concat(r(a.map(function(r){return r?r[e]:{Rules:[]}})))),u[e].Rules=a.map(function(r){return r?r[e]:{Rules:[]}}).reduce(function(e,n){var t;return e.push.apply(e,r(null!==(t=null==n?void 0:n.Rules)&&void 0!==t?t:[])),e},[])},l=0;l<Object.keys(u).length;l++)f();return new i(u)},y=function(r,e){if(0===r.length)return{valid:!1,message:"File is empty or cannot be parsed"};var n=Object.keys(r[0]),i=e.filter(function(r){return!n.includes(r)});if(i.length>0)return{valid:!1,message:"Missing required columns: ".concat(i.join(", "))};for(var o=0;o<r.length;o++){var a,u=r[o],f=t(e);try{for(f.s();!(a=f.n()).done;){var l=a.value,s=u[l];if("string"!=typeof s||""===s.trim())return{valid:!1,message:'Invalid or missing value for "'.concat(l.toString(),'" at row ').concat(o+2)}}}catch(r){f.e(r)}finally{f.f()}}return{valid:!0}};export{u as convertFormDataToJson,c as getErrorCommonFromResponse,s as getErrorFromResponse,a as getErrorMessage,l as singleValidate,f as trimAllStrings,y as validateCsvModel,v as validateMerge};
2
2
  //# sourceMappingURL=helpers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sources":["../../../src/form/helpers.ts"],"sourcesContent":["import { AxiosError } from 'axios'\r\nimport FormValidator, { IModelError, IRuleOption, IPartialError } from './validator'\r\n\r\ntype IAnyObject = { [key: string]: any }\r\nconst objectAssign = <T extends IAnyObject>(model: T, ...sources: (Partial<T> | undefined)[]) => {\r\n if (sources.length < 1) {\r\n return model\r\n }\r\n const temps = sources.filter((x) => x) as T[]\r\n return temps.reduce((a, b) => {\r\n a = Object.assign(a, b)\r\n return a\r\n }, model)\r\n}\r\n\r\nconst deepMerge = <T extends IAnyObject>(model: T, ...sources: (Partial<T> | undefined)[]) => {\r\n sources = sources.filter((x) => !!x)\r\n if (sources.length < 1) {\r\n return model\r\n }\r\n const temps = [model, ...sources].filter((x) => x)\r\n const fieldObjects = temps.reduce<string[]>((a, b) => {\r\n if (!b) return a\r\n const fields = Object.keys(b).filter((x) => typeof b[x] === 'object' && !Array.isArray(b[x]))\r\n a.push(...fields)\r\n return a\r\n }, [])\r\n\r\n const target = objectAssign<T>(model, ...temps.slice(1))\r\n const temp = target as any\r\n const temp2 = temps.slice(1).filter((x) => !!x) as Partial<T>[]\r\n for (let index = 0; index < fieldObjects.length; index++) {\r\n const element = fieldObjects[index]\r\n temp[element] = deepMerge({}, temp[element], ...temp2.map((x) => x[element]))\r\n }\r\n return target\r\n}\r\n\r\nexport const getErrorMessage = function <TModel>(MessageErrors: IPartialError<TModel> | undefined, key?: keyof TModel): IModelError {\r\n return MessageErrors && (MessageErrors as any)[key] ? { ...(MessageErrors as any)[key][0], error: true } : { error: false, message: '' }\r\n}\r\n\r\ntype IModelBase = {\r\n [key: string]: any\r\n}\r\n\r\nexport const convertFormDataToJson = function <TModel>(form: FormData): Partial<TModel> {\r\n const data = Array.from(form as any).reduce<Partial<TModel>>((a: unknown | any, b: any) => {\r\n if (!a[b[0]]) {\r\n a[b[0]] = b[1]\r\n } else if (Array.isArray(a[b[0]])) {\r\n a[b[0]].push(b[1])\r\n } else {\r\n a[b[0]] = [a[b[0]], b[1]]\r\n }\r\n return a\r\n }, {} as any) as any\r\n\r\n Object.keys(data).forEach((key) => {\r\n const value = data[key]\r\n if (typeof value === 'string' && (value.toString().toLocaleLowerCase() === 'true' || value.toString().toLocaleLowerCase() === 'false')) {\r\n data[key] = value.toString().toLocaleLowerCase() === 'true'\r\n }\r\n })\r\n return data\r\n}\r\n\r\nexport const trimAllStrings = <T>(obj: T): Partial<T> => {\r\n if (typeof obj === 'string') {\r\n // Don't trim color values (hex colors start with #)\r\n if (obj.startsWith('#') && /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/.test(obj)) {\r\n return obj as any\r\n }\r\n return obj.trim() as any\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n return obj.map((item) => trimAllStrings(item)) as any\r\n }\r\n\r\n // Skip File objects to preserve file data\r\n if (obj instanceof File) {\r\n return obj as any\r\n }\r\n\r\n // Skip FileList objects (multiple file inputs)\r\n if (obj instanceof FileList) {\r\n return obj as any\r\n }\r\n\r\n // Skip Date objects to preserve date data\r\n if (obj instanceof Date) {\r\n return obj as any\r\n }\r\n\r\n // Skip numeric values, booleans, null, undefined\r\n if (typeof obj === 'number' || typeof obj === 'boolean' || obj === null || obj === undefined) {\r\n return obj as any\r\n }\r\n\r\n // Skip DOM elements\r\n if (obj instanceof HTMLElement) {\r\n return obj as any\r\n }\r\n\r\n // Skip functions\r\n if (typeof obj === 'function') {\r\n return obj as any\r\n }\r\n\r\n if (obj && typeof obj === 'object') {\r\n const result: any = {}\r\n Object.keys(obj).forEach((key) => {\r\n result[key] = trimAllStrings((obj as any)[key])\r\n })\r\n return result\r\n }\r\n return obj\r\n}\r\n\r\nexport const singleValidate = function <TModel, TPartial = TModel>(\r\n key: keyof TModel,\r\n modelState: TPartial,\r\n MessageErrors: IPartialError<TModel>,\r\n Validator: FormValidator<TPartial>\r\n) {\r\n const messageErrors = Validator.run(modelState) as { [key: string]: any }\r\n if (messageErrors) {\r\n let errors = (MessageErrors || {}) as { [key: string]: any }\r\n const keys = Object.keys(modelState as any)\r\n .filter((key) => !!(modelState as any)[key])\r\n .filter((key) => ((modelState as any)[key] instanceof File ? !!((modelState as any)[key] as File).size : false))\r\n keys.push(key as string)\r\n keys.forEach((key) => {\r\n if (messageErrors[key]) {\r\n errors[key] = messageErrors[key]\r\n } else {\r\n delete errors[key]\r\n }\r\n })\r\n return errors\r\n }\r\n return null\r\n}\r\n\r\nexport const getErrorFromResponse = function <TModel>(error: AxiosError, modelRender: TModel) {\r\n const data = error.response?.data as any\r\n const finalData = data?.errors || data\r\n if (finalData) {\r\n const keys = Object.keys(modelRender as any)\r\n const MessageErrors: IPartialError<TModel> | undefined = {}\r\n keys.forEach((key) => {\r\n const messages = finalData[key]\r\n if (Array.isArray(messages) && messages.length > 0) {\r\n ;(MessageErrors as any)[key] = [{ message: messages[0] }]\r\n }\r\n })\r\n return MessageErrors\r\n }\r\n}\r\n\r\nexport const getErrorCommonFromResponse = function <TModel>(error: AxiosError): string[] {\r\n const data = error.response?.data as any\r\n const finalData = data?.errors || data\r\n if (finalData && finalData['']) {\r\n const messages = finalData['']\r\n if (Array.isArray(messages)) {\r\n return messages.filter((msg) => msg && typeof msg === 'string' && msg.trim() !== '')\r\n }\r\n }\r\n return []\r\n}\r\n\r\nexport const clearFieldEmpty = <TModel>(model: Extract<TModel, IModelBase>) => {\r\n Object.keys(model).forEach((key: keyof Extract<TModel, IModelBase>) => {\r\n if (!model[key]) delete model[key]\r\n })\r\n}\r\n\r\nexport const validateMerge = <TModel>(...validateor: (FormValidator<TModel> | undefined)[]): FormValidator<TModel> => {\r\n const configs = validateor.map((x) => x?.configs).filter((x) => !!x)\r\n\r\n let temp: any = Object.assign({}, ...configs)\r\n\r\n for (let index = 0; index < Object.keys(temp).length; index++) {\r\n const key = Object.keys(temp)[index]\r\n //merge configs\r\n temp[key] = deepMerge({}, ...configs.map((x) => (x ? x[key] : { Rules: [] })))\r\n //merge rules\r\n temp[key].Rules = configs\r\n .map((x) => (x ? x[key] : { Rules: [] }))\r\n .reduce<IRuleOption<TModel>[]>((a, b) => {\r\n a.push(...(b?.Rules ?? []))\r\n return a\r\n }, [])\r\n }\r\n return new FormValidator(temp)\r\n}\r\n\r\n/**\r\n * Interface representing the result of a CSV validation.\r\n */\r\nexport interface IValidateCsv {\r\n /** Indicates whether the CSV data is valid */\r\n valid: boolean\r\n /** Optional message providing error details if validation fails */\r\n message?: string\r\n}\r\n\r\n/**\r\n * Validates a parsed CSV data array against a list of required column keys.\r\n *\r\n * @param data - An array of objects representing rows parsed from a CSV file.\r\n * @param requiredKeys - An array of keys that must exist in the CSV headers and each row.\r\n * @returns An object indicating whether the data is valid and an optional error message.\r\n */\r\nexport const validateCsvModel = <T extends Record<string, any>>(data: T[], requiredKeys: (keyof T)[]): IValidateCsv => {\r\n // If the data is empty, consider the file invalid\r\n if (data.length === 0) {\r\n return { valid: false, message: 'File is empty or cannot be parsed' }\r\n }\r\n\r\n // Extract headers from the first row\r\n const headers = Object.keys(data[0])\r\n\r\n // Check for missing required columns\r\n const missing = requiredKeys.filter((key) => !headers.includes(key as string))\r\n if (missing.length > 0) {\r\n return { valid: false, message: `Missing required columns: ${missing.join(', ')}` }\r\n }\r\n\r\n // Validate that each required column in each row has a non-empty string value\r\n for (let i = 0; i < data.length; i++) {\r\n const row = data[i]\r\n for (const key of requiredKeys) {\r\n const value = row[key as string]\r\n if (typeof value !== 'string' || value.trim() === '') {\r\n return {\r\n valid: false,\r\n message: `Invalid or missing value for \"${key.toString()}\" at row ${i + 2}` // +2 accounts for header and 0-based index\r\n }\r\n }\r\n }\r\n }\r\n\r\n // All validations passed\r\n return { valid: true }\r\n}\r\n"],"names":["objectAssign","model","_len","arguments","length","sources","Array","_key","filter","x","reduce","a","b","Object","assign","deepMerge","_len2","_key2","temps","concat","_toConsumableArray","fieldObjects","fields","keys","_typeof","isArray","push","apply","target","slice","temp","temp2","_loop","element","index","map","getErrorMessage","MessageErrors","key","_objectSpread","error","message","convertFormDataToJson","form","data","from","forEach","value","toString","toLocaleLowerCase","trimAllStrings","obj","startsWith","test","trim","item","File","FileList","Date","HTMLElement","result","singleValidate","modelState","Validator","messageErrors","run","errors","size","getErrorFromResponse","modelRender","_error$response","response","finalData","messages","getErrorCommonFromResponse","_error$response2","msg","validateMerge","_len3","validateor","_key3","configs","_loop2","Rules","_b$Rules","FormValidator","validateCsvModel","requiredKeys","valid","headers","missing","includes","join","i","_step","row","_iterator","_createForOfIteratorHelper","s","n","done","err","e","f"],"mappings":"6LAIA,IAAMA,EAAe,SAAuBC,GAAoD,IAAAC,IAAAA,EAAAC,UAAAC,OAAvCC,MAAmCC,MAAAJ,EAAAA,EAAAA,OAAAK,EAAA,EAAAA,EAAAL,EAAAK,IAAnCF,EAAmCE,EAAAJ,GAAAA,UAAAI,GAC1F,OAAIF,EAAQD,OAAS,EACZH,EAEKI,EAAQG,OAAO,SAACC,GAAC,OAAKA,IACvBC,OAAO,SAACC,EAAGC,GAEtB,OADAD,EAAIE,OAAOC,OAAOH,EAAGC,EAEtB,EAAEX,EACL,EAEMc,EAAY,SAAuBd,GAAoD,IAAAe,IAAAA,EAAAb,UAAAC,OAAvCC,MAAmCC,MAAAU,EAAAA,EAAAA,OAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAnCZ,EAAmCY,EAAAd,GAAAA,UAAAc,GAEvF,IADAZ,EAAUA,EAAQG,OAAO,SAACC,GAAC,QAAOA,KACtBL,OAAS,EACnB,OAAOH,EAaT,IAXA,IAAMiB,EAAQ,CAACjB,GAAKkB,OAAAC,EAAKf,IAASG,OAAO,SAACC,GAAC,OAAKA,IAC1CY,EAAeH,EAAMR,OAAiB,SAACC,EAAGC,GAC9C,IAAKA,EAAG,OAAOD,EACf,IAAMW,EAAST,OAAOU,KAAKX,GAAGJ,OAAO,SAACC,GAAC,MAAqB,WAAhBe,EAAOZ,EAAEH,MAAoBH,MAAMmB,QAAQb,EAAEH,MAEzF,OADAE,EAAEe,KAAIC,MAANhB,EAACS,EAASE,IACHX,CACR,EAAE,IAEGiB,EAAS5B,EAAY2B,WAAA,EAAA,CAAI1B,GAAKkB,OAAAC,EAAKF,EAAMW,MAAM,MAC/CC,EAAOF,EACPG,EAAQb,EAAMW,MAAM,GAAGrB,OAAO,SAACC,GAAC,QAAOA,IAAkBuB,EAAAA,WAE7D,IAAMC,EAAUZ,EAAaa,GAC7BJ,EAAKG,GAAWlB,EAASY,WAAA,EAAA,CAAC,GAAIG,EAAKG,IAAQd,OAAAC,EAAKW,EAAMI,IAAI,SAAC1B,GAAC,OAAKA,EAAEwB,EAAQ,KAC5E,EAHQC,EAAQ,EAAGA,EAAQb,EAAajB,OAAQ8B,IAAOF,IAIxD,OAAOJ,CACT,EAEaQ,EAAkB,SAAkBC,EAAkDC,GACjG,OAAOD,GAAkBA,EAAsBC,GAAIC,EAAAA,KAASF,EAAsBC,GAAK,IAAE,CAAA,EAAA,CAAEE,OAAO,IAAS,CAAEA,OAAO,EAAOC,QAAS,GACtI,EAMaC,EAAwB,SAAkBC,GACrD,IAAMC,EAAOtC,MAAMuC,KAAKF,GAAajC,OAAwB,SAACC,EAAkBC,GAQ9E,OAPKD,EAAEC,EAAE,IAEEN,MAAMmB,QAAQd,EAAEC,EAAE,KAC3BD,EAAEC,EAAE,IAAIc,KAAKd,EAAE,IAEfD,EAAEC,EAAE,IAAM,CAACD,EAAEC,EAAE,IAAKA,EAAE,IAJtBD,EAAEC,EAAE,IAAMA,EAAE,GAMPD,CACR,EAAE,IAQH,OANAE,OAAOU,KAAKqB,GAAME,QAAQ,SAACR,GACzB,IAAMS,EAAQH,EAAKN,GACE,iBAAVS,GAAgE,SAAzCA,EAAMC,WAAWC,qBAA2E,UAAzCF,EAAMC,WAAWC,sBACpGL,EAAKN,GAAgD,SAAzCS,EAAMC,WAAWC,oBAEjC,GACOL,CACT,EAEaM,EAAiB,SAAIC,GAChC,GAAmB,iBAARA,EAET,OAAIA,EAAIC,WAAW,MAAQ,qCAAqCC,KAAKF,GAC5DA,EAEFA,EAAIG,OAGb,GAAIhD,MAAMmB,QAAQ0B,GAChB,OAAOA,EAAIhB,IAAI,SAACoB,GAAI,OAAKL,EAAeK,KAI1C,GAAIJ,aAAeK,KACjB,OAAOL,EAIT,GAAIA,aAAeM,SACjB,OAAON,EAIT,GAAIA,aAAeO,KACjB,OAAOP,EAIT,GAAmB,iBAARA,GAAmC,kBAARA,GAAlC,MAAuDA,EACzD,OAAOA,EAIT,GAAIA,aAAeQ,YACjB,OAAOR,EAIT,GAAmB,mBAARA,EACT,OAAOA,EAGT,GAAIA,GAAsB,WAAf3B,EAAO2B,GAAkB,CAClC,IAAMS,EAAc,CAAE,EAItB,OAHA/C,OAAOU,KAAK4B,GAAKL,QAAQ,SAACR,GACxBsB,EAAOtB,GAAOY,EAAgBC,EAAYb,GAC5C,GACOsB,CACR,CACD,OAAOT,CACT,EAEaU,EAAiB,SAC5BvB,EACAwB,EACAzB,EACA0B,GAEA,IAAMC,EAAgBD,EAAUE,IAAIH,GACpC,GAAIE,EAAe,CACjB,IAAIE,EAAU7B,GAAiB,CAA6B,EACtDd,EAAOV,OAAOU,KAAKuC,GACtBtD,OAAO,SAAC8B,GAAG,QAAQwB,EAAmBxB,EAAI,GAC1C9B,OAAO,SAAC8B,GAAG,OAAOwB,EAAmBxB,aAAgBkB,QAAWM,EAAmBxB,GAAc6B,IAAY,GAShH,OARA5C,EAAKG,KAAKY,GACVf,EAAKuB,QAAQ,SAACR,GACR0B,EAAc1B,GAChB4B,EAAO5B,GAAO0B,EAAc1B,UAErB4B,EAAO5B,EAElB,GACO4B,CACR,CACD,OAAO,IACT,EAEaE,EAAuB,SAAkB5B,EAAmB6B,GAAmB,IAAAC,EACpF1B,EAAqB,QAAjB0B,EAAG9B,EAAM+B,gBAAQ,IAAAD,OAAA,EAAdA,EAAgB1B,KACvB4B,GAAY5B,aAAI,EAAJA,EAAMsB,SAAUtB,EAClC,GAAI4B,EAAW,CACb,IAAMjD,EAAOV,OAAOU,KAAK8C,GACnBhC,EAAmD,CAAE,EAO3D,OANAd,EAAKuB,QAAQ,SAACR,GACZ,IAAMmC,EAAWD,EAAUlC,GACvBhC,MAAMmB,QAAQgD,IAAaA,EAASrE,OAAS,IAC7CiC,EAAsBC,GAAO,CAAC,CAAEG,QAASgC,EAAS,KAExD,GACOpC,CACR,CACH,EAEaqC,EAA6B,SAAkBlC,GAAiB,IAAAmC,EACrE/B,EAAqB,QAAjB+B,EAAGnC,EAAM+B,gBAAQ,IAAAI,OAAA,EAAdA,EAAgB/B,KACvB4B,GAAY5B,aAAI,EAAJA,EAAMsB,SAAUtB,EAClC,GAAI4B,GAAaA,EAAU,IAAK,CAC9B,IAAMC,EAAWD,EAAU,IAC3B,GAAIlE,MAAMmB,QAAQgD,GAChB,OAAOA,EAASjE,OAAO,SAACoE,GAAG,OAAKA,GAAsB,iBAARA,GAAmC,KAAfA,EAAItB,QAEzE,CACD,MAAO,EACT,EAQauB,EAAgB,WAAwF,IAAA,IAAAC,EAAA3E,UAAAC,OAA5E2E,EAAiDzE,IAAAA,MAAAwE,GAAAE,EAAA,EAAAA,EAAAF,EAAAE,IAAjDD,EAAiDC,GAAA7E,UAAA6E,GAKxF,IAJA,IAAMC,EAAUF,EAAW5C,IAAI,SAAC1B,GAAC,OAAKA,aAAAA,EAAAA,EAAGwE,OAAO,GAAEzE,OAAO,SAACC,GAAC,QAAOA,IAE9DqB,EAAYjB,OAAOC,OAAMa,MAAbd,OAAc,CAAA,CAAE,GAAAM,OAAAC,EAAK6D,KAAQC,EAAAA,WAG3C,IAAM5C,EAAMzB,OAAOU,KAAKO,GAAMI,GAE9BJ,EAAKQ,GAAOvB,EAASY,cAAC,IAAER,OAAAC,EAAK6D,EAAQ9C,IAAI,SAAC1B,GAAC,OAAMA,EAAIA,EAAE6B,GAAO,CAAE6C,MAAO,GAAK,MAE5ErD,EAAKQ,GAAK6C,MAAQF,EACf9C,IAAI,SAAC1B,GAAC,OAAMA,EAAIA,EAAE6B,GAAO,CAAE6C,MAAO,GAAK,GACvCzE,OAA8B,SAACC,EAAGC,GAAK,IAAAwE,EAEtC,OADAzE,EAAEe,KAAIC,MAANhB,EAACS,EAAkB,QAAlBgE,EAAUxE,aAAC,EAADA,EAAGuE,aAAK,IAAAC,EAAAA,EAAI,KAChBzE,CACR,EAAE,GACN,EAXQuB,EAAQ,EAAGA,EAAQrB,OAAOU,KAAKO,GAAM1B,OAAQ8B,IAAOgD,IAY7D,OAAO,IAAIG,EAAcvD,EAC3B,EAmBawD,EAAmB,SAAgC1C,EAAW2C,GAEzE,GAAoB,IAAhB3C,EAAKxC,OACP,MAAO,CAAEoF,OAAO,EAAO/C,QAAS,qCAIlC,IAAMgD,EAAU5E,OAAOU,KAAKqB,EAAK,IAG3B8C,EAAUH,EAAa/E,OAAO,SAAC8B,GAAG,OAAMmD,EAAQE,SAASrD,KAC/D,GAAIoD,EAAQtF,OAAS,EACnB,MAAO,CAAEoF,OAAO,EAAO/C,QAAO,6BAAAtB,OAA+BuE,EAAQE,KAAK,QAI5E,IAAK,IAAIC,EAAI,EAAGA,EAAIjD,EAAKxC,OAAQyF,IAAK,CACpC,IAC8BC,EADxBC,EAAMnD,EAAKiD,GAAEG,EAAAC,EACDV,GAAY,IAA9B,IAAAS,EAAAE,MAAAJ,EAAAE,EAAAG,KAAAC,MAAgC,CAAA,IAArB9D,EAAGwD,EAAA/C,MACNA,EAAQgD,EAAIzD,GAClB,GAAqB,iBAAVS,GAAuC,KAAjBA,EAAMO,OACrC,MAAO,CACLkC,OAAO,EACP/C,QAAOtB,iCAAAA,OAAmCmB,EAAIU,WAAU,aAAA7B,OAAY0E,EAAI,GAG7E,CAAA,CAAA,MAAAQ,GAAAL,EAAAM,EAAAD,EAAA,CAAA,QAAAL,EAAAO,GAAA,CACF,CAGD,MAAO,CAAEf,OAAO,EAClB"}
1
+ {"version":3,"file":"helpers.js","sources":["../../../src/form/helpers.ts"],"sourcesContent":["import { AxiosError } from 'axios'\r\nimport FormValidator, { IModelError, IRuleOption, IPartialError } from './validator'\r\n\r\ntype IAnyObject = { [key: string]: any }\r\n\r\n/**\r\n * deepMerge: merge objects deeply, later sources always override earlier values for the same key.\r\n *\r\n * @example\r\n * // Primitive override — source wins\r\n * deepMerge({ a: 1, b: true }, { b: false })\r\n * // → { a: 1, b: false }\r\n *\r\n * // null override — null wins over nested object\r\n * deepMerge({ a: { x: 1, y: 2 } }, { a: null })\r\n * // → { a: null }\r\n *\r\n * // undefined override — undefined wins\r\n * deepMerge({ a: 'hello' }, { a: undefined })\r\n * // → { a: undefined }\r\n *\r\n * // Nested deep merge — both sides are plain objects → recurse\r\n * deepMerge({ a: { x: 1, y: 2 } }, { a: { x: 10, z: 3 } })\r\n * // → { a: { x: 10, y: 2, z: 3 } }\r\n *\r\n * // Multiple sources — last source wins on conflict\r\n * deepMerge({ a: 1 }, { a: 2 }, { a: 3 })\r\n * // → { a: 3 }\r\n */\r\nconst deepMerge = <T extends IAnyObject>(model: T, ...sources: (Partial<T> | undefined)[]): T => {\r\n const validSources = sources.filter((x): x is Partial<T> => !!x)\r\n if (validSources.length < 1) {\r\n return model\r\n }\r\n\r\n const target = Object.assign({}, model) as T\r\n\r\n for (const source of validSources) {\r\n for (const key of Object.keys(source)) {\r\n const srcVal = (source as any)[key]\r\n const tgtVal = (target as any)[key]\r\n if (\r\n srcVal !== null &&\r\n typeof srcVal === 'object' &&\r\n !Array.isArray(srcVal) &&\r\n tgtVal !== null &&\r\n typeof tgtVal === 'object' &&\r\n !Array.isArray(tgtVal)\r\n ) {\r\n // Both are plain objects → deep merge recursively\r\n ;(target as any)[key] = deepMerge(tgtVal, srcVal)\r\n } else {\r\n // Source value always wins (null, false, undefined, array, primitive)\r\n ;(target as any)[key] = srcVal\r\n }\r\n }\r\n }\r\n\r\n return target\r\n}\r\n\r\nexport const getErrorMessage = function <TModel>(MessageErrors: IPartialError<TModel> | undefined, key?: keyof TModel): IModelError {\r\n return MessageErrors && (MessageErrors as any)[key] ? { ...(MessageErrors as any)[key][0], error: true } : { error: false, message: '' }\r\n}\r\n\r\ntype IModelBase = {\r\n [key: string]: any\r\n}\r\n\r\nexport const convertFormDataToJson = function <TModel>(form: FormData): Partial<TModel> {\r\n const data = Array.from(form as any).reduce<Partial<TModel>>((a: unknown | any, b: any) => {\r\n if (!a[b[0]]) {\r\n a[b[0]] = b[1]\r\n } else if (Array.isArray(a[b[0]])) {\r\n a[b[0]].push(b[1])\r\n } else {\r\n a[b[0]] = [a[b[0]], b[1]]\r\n }\r\n return a\r\n }, {} as any) as any\r\n\r\n Object.keys(data).forEach((key) => {\r\n const value = data[key]\r\n if (typeof value === 'string' && (value.toString().toLocaleLowerCase() === 'true' || value.toString().toLocaleLowerCase() === 'false')) {\r\n data[key] = value.toString().toLocaleLowerCase() === 'true'\r\n }\r\n })\r\n return data\r\n}\r\n\r\nexport const trimAllStrings = <T>(obj: T): Partial<T> => {\r\n if (typeof obj === 'string') {\r\n // Don't trim color values (hex colors start with #)\r\n if (obj.startsWith('#') && /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/.test(obj)) {\r\n return obj as any\r\n }\r\n return obj.trim() as any\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n return obj.map((item) => trimAllStrings(item)) as any\r\n }\r\n\r\n // Skip File objects to preserve file data\r\n if (obj instanceof File) {\r\n return obj as any\r\n }\r\n\r\n // Skip FileList objects (multiple file inputs)\r\n if (obj instanceof FileList) {\r\n return obj as any\r\n }\r\n\r\n // Skip Date objects to preserve date data\r\n if (obj instanceof Date) {\r\n return obj as any\r\n }\r\n\r\n // Skip numeric values, booleans, null, undefined\r\n if (typeof obj === 'number' || typeof obj === 'boolean' || obj === null || obj === undefined) {\r\n return obj as any\r\n }\r\n\r\n // Skip DOM elements\r\n if (obj instanceof HTMLElement) {\r\n return obj as any\r\n }\r\n\r\n // Skip functions\r\n if (typeof obj === 'function') {\r\n return obj as any\r\n }\r\n\r\n if (obj && typeof obj === 'object') {\r\n const result: any = {}\r\n Object.keys(obj).forEach((key) => {\r\n result[key] = trimAllStrings((obj as any)[key])\r\n })\r\n return result\r\n }\r\n return obj\r\n}\r\n\r\nexport const singleValidate = function <TModel, TPartial = TModel>(\r\n key: keyof TModel,\r\n modelState: TPartial,\r\n MessageErrors: IPartialError<TModel>,\r\n Validator: FormValidator<TPartial>\r\n) {\r\n const messageErrors = Validator.run(modelState) as { [key: string]: any }\r\n if (messageErrors) {\r\n let errors = (MessageErrors || {}) as { [key: string]: any }\r\n const keys = Object.keys(modelState as any)\r\n .filter((key) => !!(modelState as any)[key])\r\n .filter((key) => ((modelState as any)[key] instanceof File ? !!((modelState as any)[key] as File).size : false))\r\n keys.push(key as string)\r\n keys.forEach((key) => {\r\n if (messageErrors[key]) {\r\n errors[key] = messageErrors[key]\r\n } else {\r\n delete errors[key]\r\n }\r\n })\r\n return errors\r\n }\r\n return null\r\n}\r\n\r\nexport const getErrorFromResponse = function <TModel>(error: AxiosError, modelRender: TModel) {\r\n const data = error.response?.data as any\r\n const finalData = data?.errors || data\r\n if (finalData) {\r\n const keys = Object.keys(modelRender as any)\r\n const MessageErrors: IPartialError<TModel> | undefined = {}\r\n keys.forEach((key) => {\r\n const messages = finalData[key]\r\n if (Array.isArray(messages) && messages.length > 0) {\r\n ;(MessageErrors as any)[key] = [{ message: messages[0] }]\r\n }\r\n })\r\n return MessageErrors\r\n }\r\n}\r\n\r\nexport const getErrorCommonFromResponse = function <TModel>(error: AxiosError): string[] {\r\n const data = error.response?.data as any\r\n const finalData = data?.errors || data\r\n if (finalData && finalData['']) {\r\n const messages = finalData['']\r\n if (Array.isArray(messages)) {\r\n return messages.filter((msg) => msg && typeof msg === 'string' && msg.trim() !== '')\r\n }\r\n }\r\n return []\r\n}\r\n\r\nexport const clearFieldEmpty = <TModel>(model: Extract<TModel, IModelBase>) => {\r\n Object.keys(model).forEach((key: keyof Extract<TModel, IModelBase>) => {\r\n if (!model[key]) delete model[key]\r\n })\r\n}\r\n\r\nexport const validateMerge = <TModel>(...validateor: (FormValidator<TModel> | undefined)[]): FormValidator<TModel> => {\r\n const configs = validateor.map((x) => x?.configs).filter((x) => !!x)\r\n\r\n let temp: any = Object.assign({}, ...configs)\r\n\r\n for (let index = 0; index < Object.keys(temp).length; index++) {\r\n const key = Object.keys(temp)[index]\r\n //merge configs\r\n temp[key] = deepMerge({}, ...configs.map((x) => (x ? x[key] : { Rules: [] })))\r\n //merge rules\r\n temp[key].Rules = configs\r\n .map((x) => (x ? x[key] : { Rules: [] }))\r\n .reduce<IRuleOption<TModel>[]>((a, b) => {\r\n a.push(...(b?.Rules ?? []))\r\n return a\r\n }, [])\r\n }\r\n return new FormValidator(temp)\r\n}\r\n\r\n/**\r\n * Interface representing the result of a CSV validation.\r\n */\r\nexport interface IValidateCsv {\r\n /** Indicates whether the CSV data is valid */\r\n valid: boolean\r\n /** Optional message providing error details if validation fails */\r\n message?: string\r\n}\r\n\r\n/**\r\n * Validates a parsed CSV data array against a list of required column keys.\r\n *\r\n * @param data - An array of objects representing rows parsed from a CSV file.\r\n * @param requiredKeys - An array of keys that must exist in the CSV headers and each row.\r\n * @returns An object indicating whether the data is valid and an optional error message.\r\n */\r\nexport const validateCsvModel = <T extends Record<string, any>>(data: T[], requiredKeys: (keyof T)[]): IValidateCsv => {\r\n // If the data is empty, consider the file invalid\r\n if (data.length === 0) {\r\n return { valid: false, message: 'File is empty or cannot be parsed' }\r\n }\r\n\r\n // Extract headers from the first row\r\n const headers = Object.keys(data[0])\r\n\r\n // Check for missing required columns\r\n const missing = requiredKeys.filter((key) => !headers.includes(key as string))\r\n if (missing.length > 0) {\r\n return { valid: false, message: `Missing required columns: ${missing.join(', ')}` }\r\n }\r\n\r\n // Validate that each required column in each row has a non-empty string value\r\n for (let i = 0; i < data.length; i++) {\r\n const row = data[i]\r\n for (const key of requiredKeys) {\r\n const value = row[key as string]\r\n if (typeof value !== 'string' || value.trim() === '') {\r\n return {\r\n valid: false,\r\n message: `Invalid or missing value for \"${key.toString()}\" at row ${i + 2}` // +2 accounts for header and 0-based index\r\n }\r\n }\r\n }\r\n }\r\n\r\n // All validations passed\r\n return { valid: true }\r\n}\r\n"],"names":["deepMerge","model","_len","arguments","length","sources","Array","_key","validSources","filter","x","_step","target","Object","assign","_iterator","_createForOfIteratorHelper","s","n","done","source","value","_i","_Object$keys","keys","key","srcVal","tgtVal","_typeof","isArray","err","e","f","getErrorMessage","MessageErrors","_objectSpread","error","message","convertFormDataToJson","form","data","from","reduce","a","b","push","forEach","toString","toLocaleLowerCase","trimAllStrings","obj","startsWith","test","trim","map","item","File","FileList","Date","HTMLElement","result","singleValidate","modelState","Validator","messageErrors","run","errors","size","getErrorFromResponse","modelRender","_error$response","response","finalData","messages","getErrorCommonFromResponse","_error$response2","msg","validateMerge","_len2","validateor","_key2","configs","temp","apply","concat","_toConsumableArray","_loop","index","Rules","_b$Rules","FormValidator","validateCsvModel","requiredKeys","valid","headers","missing","includes","join","i","_step2","row","_iterator2"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{createClass as t,classCallCheck as e,defineProperty as n,objectSpread2 as i}from"../../../_virtual/_rollupPluginBabelHelpers.js";var r=function(){return t(function t(r){var o=this;e(this,t),n(this,"mergeOptions",function(){for(var t=arguments.length,e=new Array(t),n=0;n<t;n++)e[n]=arguments[n];return e.reduce(function(t,e){return Object.assign(t,null!=e?e:{})},{})}),n(this,"ignoreEmpty",function(t,e){var n=o.mergeOptions(o._option,e);return!t&&!0===(null==n?void 0:n.ignoreEmpty)}),n(this,"_filter",[]),n(this,"_filterBase",function(t,e,n,i){var r=o._filter.length?" "+("And"===(null==i?void 0:i.logic)?"&&":"||")+" ":"";return o._filter.push("".concat(r).concat(t).concat(e).concat(n)),o}),n(this,"filter",function(t,e,n){return"string"==typeof e&&o.ignoreEmpty(e,n)?o:o._filterBase(t,"==","string"==typeof e?'"'.concat(e,'"'):e.toString(),n)}),n(this,"filterEqual",function(t,e,n){return o.ignoreEmpty(e,n)?o:o._filterBase(t,"==",'"'.concat(e,'"'),n)}),n(this,"filterNotEquals",function(t,e,n){return"string"==typeof e&&o.ignoreEmpty(e,n)?o:o._filterBase(t,"!=","string"==typeof e?'"'.concat(e,'"'):e.toString(),n)}),n(this,"filterEnum",function(t,e,n){return"string"==typeof e&&o.ignoreEmpty(e,n)?o:o._filterBase(t,"==","string"==typeof e?e:e.toString(),n)}),n(this,"filterStartsWith",function(t,e,n){return o.ignoreEmpty(e,n)?o:o._filterBase(t,'.startsWith("'+e+'")',"",n)}),n(this,"filterContains",function(t,e,n){return o.ignoreEmpty(e,n)?o:o._filterBase(t,'.Contains("'+e+'")',"",n)}),n(this,"filterLast",function(t,e,n){return o.ignoreEmpty(e,n)?o:o._filterBase(t,'.endsWith("'+e+'")',"",n)}),n(this,"filterNumber",function(t,e,n,i){return o.ignoreEmpty(n,i)?o:o._filterBase(t," ".concat(e," ")+n,"",i)}),n(this,"filterGreater",function(t,e,n){return o.ignoreEmpty(e,n)?o:o._filterBase(t," > '"+e+"'","",n)}),n(this,"filterGreaterEqual",function(t,e,n){return o.ignoreEmpty(e,n)?o:o._filterBase(t," >= '"+e+"'","",n)}),n(this,"filterLess",function(t,e,n){return o.ignoreEmpty(e,n)?o:o._filterBase(t," < '"+e+"'","",n)}),n(this,"filterLessEqual",function(t,e,n){return o.ignoreEmpty(e,n)?o:o._filterBase(t," <= '"+e+"'","",n)}),n(this,"filterCustom",function(t,e){var n=o._filter.length?" "+("And"===(null==e?void 0:e.logic)?"&&":"||")+" ":"";return o._filter.push("".concat(n).concat(t)),o}),n(this,"scope",function(e,n){var i=e(new t(o._option));if(i.buildFilter()){var r=o._filter.length?" "+("And"===(null==n?void 0:n.logic)?"&&":"||")+" ":"";o._filter.push("".concat(r,"(").concat(i.buildFilter(),")"))}return o.mergeExtendData(i.extendData),o}),n(this,"seed",function(t,e){return o.seedStore={field:t,key:e},o}),n(this,"skip",function(t){return o._skip=t,o}),n(this,"take",function(t){return o._take=t,o}),n(this,"sortStore",[]),n(this,"sortBase",function(t,e,n){var i={};return i[t]=e,o.sortStore.some(function(t){return Object.keys(t)[0]===Object.keys(i)[0]})||o.sortStore.push(i),o}),n(this,"sort",function(t,e){return o.sortBase(t,null!=e&&e.direction?e.direction:"ASC"),o}),n(this,"noTotal",function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return o._noTotal=t,o}),n(this,"buildFilter",function(){return o._filter.join("")}),n(this,"buildPage",function(){var t={};return o._skip&&(t.skip=o._skip),o._take&&(t.take=o._take),t}),n(this,"buildRandomWithSeedKey",function(){var t,e,n,i,r,s;return null===(t=o.seedStore)||void 0===t||!t.field||null!==(e=o.seedStore)&&void 0!==e&&e.key||console.warn("RandomWithSeedKey missing seedKey."),null===(n=o.seedStore)||void 0===n||!n.key||null!==(i=o.seedStore)&&void 0!==i&&i.field||console.warn("RandomWithSeedKey missing seedField."),null!==(r=o.seedStore)&&void 0!==r&&r.key||null!==(s=o.seedStore)&&void 0!==s&&s.field?o.seedStore:{}}),n(this,"_extendData",{}),n(this,"mergeExtendData",function(t){for(var e in t)o._extendData[e]=t[e]}),n(this,"extendResult",function(t,e){return o._extendData||(o._extendData={}),o._extendData[t]=e,o}),n(this,"build",function(){var t=i({},o.buildPage());if(o._extendData)for(var e in o._extendData)t[e]=o._extendData[e];o.sortStore.length>0&&(t.sort=o.sortStore);var n=o.buildFilter();n&&(t.filter=n),o._noTotal&&(t.noTotal=o._noTotal);var r=o.buildRandomWithSeedKey();return r.key&&r.field&&(t.seedField=r.field.toString(),t.seedKey=r.key),t}),this._option=r},[{key:"extendData",get:function(){return this._extendData}}])}(),o=function(t){return new r(t)};export{r as RequestParam,o as createRequestBuilder};
1
+ import{createClass as t,classCallCheck as e,defineProperty as n,objectSpread2 as i}from"../../../_virtual/_rollupPluginBabelHelpers.js";var r=function(){return t(function t(r){var o=this;e(this,t),n(this,"mergeOptions",function(){for(var t=arguments.length,e=new Array(t),n=0;n<t;n++)e[n]=arguments[n];return e.reduce(function(t,e){return Object.assign(t,null!=e?e:{})},{})}),n(this,"ignoreEmpty",function(t,e){var n=o.mergeOptions(o._option,e);return!t&&!0===(null==n?void 0:n.ignoreEmpty)}),n(this,"_filter",[]),n(this,"_filterBase",function(t,e,n,i){var r=o._filter.length?" "+("And"===(null==i?void 0:i.logic)?"&&":"||")+" ":"";return o._filter.push("".concat(r).concat(t).concat(e).concat(n)),o}),n(this,"filter",function(t,e,n){return"string"==typeof e&&o.ignoreEmpty(e,n)?o:o._filterBase(t,"==","string"==typeof e?null!=n&&n.noQuote?e:'"'.concat(e,'"'):e.toString(),n)}),n(this,"filterEqual",function(t,e,n){return o.ignoreEmpty(e,n)?o:o._filterBase(t,"==",null!=n&&n.noQuote?e:'"'.concat(e,'"'),n)}),n(this,"filterNotEquals",function(t,e,n){if("string"==typeof e&&o.ignoreEmpty(e,n))return o;var i="string"==typeof e?null!=n&&n.noQuote?e:'"'.concat(e,'"'):e.toString();return o._filterBase(t,"!=",i,n)}),n(this,"filterEnum",function(t,e,n){return"string"==typeof e&&o.ignoreEmpty(e,n)?o:o._filterBase(t,"==","string"==typeof e?e:e.toString(),n)}),n(this,"filterStartsWith",function(t,e,n){return o.ignoreEmpty(e,n)?o:o._filterBase(t,'.startsWith("'+e+'")',"",n)}),n(this,"filterContains",function(t,e,n){return o.ignoreEmpty(e,n)?o:o._filterBase(t,'.Contains("'+e+'")',"",n)}),n(this,"filterLast",function(t,e,n){return o.ignoreEmpty(e,n)?o:o._filterBase(t,'.endsWith("'+e+'")',"",n)}),n(this,"filterNumber",function(t,e,n,i){return o.ignoreEmpty(n,i)?o:o._filterBase(t," ".concat(e," ")+n,"",i)}),n(this,"filterGreater",function(t,e,n){return o.ignoreEmpty(e,n)?o:o._filterBase(t," > '"+e+"'","",n)}),n(this,"filterGreaterEqual",function(t,e,n){return o.ignoreEmpty(e,n)?o:o._filterBase(t," >= '"+e+"'","",n)}),n(this,"filterLess",function(t,e,n){return o.ignoreEmpty(e,n)?o:o._filterBase(t," < '"+e+"'","",n)}),n(this,"filterLessEqual",function(t,e,n){return o.ignoreEmpty(e,n)?o:o._filterBase(t," <= '"+e+"'","",n)}),n(this,"filterCustom",function(t,e){var n=o._filter.length?" "+("And"===(null==e?void 0:e.logic)?"&&":"||")+" ":"";return o._filter.push("".concat(n).concat(t)),o}),n(this,"scope",function(e,n){var i=e(new t(o._option));if(i.buildFilter()){var r=o._filter.length?" "+("And"===(null==n?void 0:n.logic)?"&&":"||")+" ":"";o._filter.push("".concat(r,"(").concat(i.buildFilter(),")"))}return o.mergeExtendData(i.extendData),o}),n(this,"seed",function(t,e){return o.seedStore={field:t,key:e},o}),n(this,"skip",function(t){return o._skip=t,o}),n(this,"take",function(t){return o._take=t,o}),n(this,"sortStore",[]),n(this,"sortBase",function(t,e,n){var i={};return i[t]=e,o.sortStore.some(function(t){return Object.keys(t)[0]===Object.keys(i)[0]})||o.sortStore.push(i),o}),n(this,"sort",function(t,e){return o.sortBase(t,null!=e&&e.direction?e.direction:"ASC"),o}),n(this,"noTotal",function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return o._noTotal=t,o}),n(this,"buildFilter",function(){return o._filter.join("")}),n(this,"buildPage",function(){var t={};return o._skip&&(t.skip=o._skip),o._take&&(t.take=o._take),t}),n(this,"buildRandomWithSeedKey",function(){var t,e,n,i,r,s;return null===(t=o.seedStore)||void 0===t||!t.field||null!==(e=o.seedStore)&&void 0!==e&&e.key||console.warn("RandomWithSeedKey missing seedKey."),null===(n=o.seedStore)||void 0===n||!n.key||null!==(i=o.seedStore)&&void 0!==i&&i.field||console.warn("RandomWithSeedKey missing seedField."),null!==(r=o.seedStore)&&void 0!==r&&r.key||null!==(s=o.seedStore)&&void 0!==s&&s.field?o.seedStore:{}}),n(this,"_extendData",{}),n(this,"mergeExtendData",function(t){for(var e in t)o._extendData[e]=t[e]}),n(this,"extendResult",function(t,e){return o._extendData||(o._extendData={}),o._extendData[t]=e,o}),n(this,"build",function(){var t=i({},o.buildPage());if(o._extendData)for(var e in o._extendData)t[e]=o._extendData[e];o.sortStore.length>0&&(t.sort=o.sortStore);var n=o.buildFilter();n&&(t.filter=n),o._noTotal&&(t.noTotal=o._noTotal);var r=o.buildRandomWithSeedKey();return r.key&&r.field&&(t.seedField=r.field.toString(),t.seedKey=r.key),t}),this._option=r},[{key:"extendData",get:function(){return this._extendData}}])}(),o=function(t){return new r(t)};export{r as RequestParam,o as createRequestBuilder};
2
2
  //# sourceMappingURL=request-param.js.map