dinocollab-core 2.1.1 → 2.1.3

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 (110) hide show
  1. package/dist/api-context/global-modal.js +1 -1
  2. package/dist/api-context/global-modal.js.map +1 -1
  3. package/dist/api-context/index.js +1 -1
  4. package/dist/components/copy-to-clipboard.js +1 -1
  5. package/dist/components/copy-to-clipboard.js.map +1 -1
  6. package/dist/components/index.js +1 -1
  7. package/dist/data-view/create.active-filters-panel.js +1 -1
  8. package/dist/data-view/create.active-filters-panel.js.map +1 -1
  9. package/dist/data-view/create.pagination-bar.js +1 -1
  10. package/dist/data-view/create.pagination-bar.js.map +1 -1
  11. package/dist/data-view/create.popper-panel.js +1 -1
  12. package/dist/data-view/create.popper-panel.js.map +1 -1
  13. package/dist/data-view/create.search-match.js +1 -1
  14. package/dist/data-view/create.search-match.js.map +1 -1
  15. package/dist/data-view/index.js +1 -1
  16. package/dist/data-view/ui.units.js +1 -1
  17. package/dist/data-view/ui.units.js.map +1 -1
  18. package/dist/form/create.form-base.js.map +1 -1
  19. package/dist/http-service/base/crud-service-base.js +1 -1
  20. package/dist/http-service/base/crud-service-base.js.map +1 -1
  21. package/dist/lab/attach-widget/helpers.js +2 -0
  22. package/dist/lab/attach-widget/helpers.js.map +1 -0
  23. package/dist/lab/attach-widget/modal.js +2 -0
  24. package/dist/lab/attach-widget/modal.js.map +1 -0
  25. package/dist/lab/attach-widget/styled.js +2 -0
  26. package/dist/lab/attach-widget/styled.js.map +1 -0
  27. package/dist/lab/attach-widget/widget.js +2 -0
  28. package/dist/lab/attach-widget/widget.js.map +1 -0
  29. package/dist/lab/index.js +2 -0
  30. package/dist/lab/index.js.map +1 -0
  31. package/dist/lab/input.social-links/configs.js +2 -0
  32. package/dist/lab/input.social-links/configs.js.map +1 -0
  33. package/dist/lab/input.social-links/create.js +2 -0
  34. package/dist/lab/input.social-links/create.js.map +1 -0
  35. package/dist/lab/input.social-links/types.js +2 -0
  36. package/dist/lab/input.social-links/types.js.map +1 -0
  37. package/dist/lab/input.social-links/unit.icons.js +2 -0
  38. package/dist/lab/input.social-links/unit.icons.js.map +1 -0
  39. package/dist/lab/input.social-links/units.js +2 -0
  40. package/dist/lab/input.social-links/units.js.map +1 -0
  41. package/dist/mfe-shared/index.js +2 -0
  42. package/dist/mfe-shared/index.js.map +1 -0
  43. package/dist/mfe-shared/navigation.js +2 -0
  44. package/dist/mfe-shared/navigation.js.map +1 -0
  45. package/dist/table/create.table.js +1 -1
  46. package/dist/table/create.table.js.map +1 -1
  47. package/dist/table/dino.js +1 -1
  48. package/dist/table/dino.js.map +1 -1
  49. package/dist/table/index.js +1 -1
  50. package/dist/table/ui.units.js +1 -1
  51. package/dist/table/ui.units.js.map +1 -1
  52. package/dist/table-grid/create.table-grid.js +1 -1
  53. package/dist/table-grid/create.table-grid.js.map +1 -1
  54. package/dist/table-grid/filter-bar/create.filter-panel.js +1 -1
  55. package/dist/table-grid/filter-bar/create.filter-panel.js.map +1 -1
  56. package/dist/types/api-context/global-modal.d.ts +1 -1
  57. package/dist/types/api-context/index.d.ts +0 -1
  58. package/dist/types/components/copy-to-clipboard.d.ts +1 -1
  59. package/dist/types/components/index.d.ts +0 -1
  60. package/dist/types/data-view/create.pagination-bar.d.ts +3 -1
  61. package/dist/types/lab/attach-widget/helpers.d.ts +13 -0
  62. package/dist/types/lab/attach-widget/index.d.ts +2 -0
  63. package/dist/types/lab/attach-widget/modal.d.ts +31 -0
  64. package/dist/types/lab/attach-widget/styled.d.ts +34 -0
  65. package/dist/types/lab/attach-widget/types.d.ts +24 -0
  66. package/dist/types/lab/attach-widget/widget.d.ts +29 -0
  67. package/dist/types/lab/index.d.ts +2 -0
  68. package/dist/types/lab/input.social-links/configs.d.ts +1 -0
  69. package/dist/types/lab/input.social-links/create.d.ts +50 -0
  70. package/dist/types/lab/input.social-links/index.d.ts +3 -0
  71. package/dist/types/lab/input.social-links/types.d.ts +27 -0
  72. package/dist/types/lab/input.social-links/unit.icons.d.ts +12 -0
  73. package/dist/types/lab/input.social-links/units.d.ts +9 -0
  74. package/dist/types/mfe-shared/index.d.ts +1 -0
  75. package/dist/types/mfe-shared/navigation.d.ts +35 -0
  76. package/dist/types/table/create.table.d.ts +1 -1
  77. package/dist/types/table/dino.d.ts +9 -3
  78. package/dist/types/table/index.d.ts +1 -1
  79. package/dist/types/table/ui.units.d.ts +9 -4
  80. package/package.json +17 -78
  81. package/dist/api-context.d.ts +0 -2
  82. package/dist/api-context.js +0 -2
  83. package/dist/api-context.mjs +0 -2
  84. package/dist/components.d.ts +0 -2
  85. package/dist/components.js +0 -2
  86. package/dist/components.mjs +0 -2
  87. package/dist/data-view.d.ts +0 -2
  88. package/dist/data-view.js +0 -2
  89. package/dist/data-view.mjs +0 -2
  90. package/dist/form.d.ts +0 -2
  91. package/dist/form.js +0 -2
  92. package/dist/form.mjs +0 -2
  93. package/dist/hooks.d.ts +0 -2
  94. package/dist/hooks.js +0 -2
  95. package/dist/hooks.mjs +0 -2
  96. package/dist/http-service.d.ts +0 -2
  97. package/dist/http-service.js +0 -2
  98. package/dist/http-service.mjs +0 -2
  99. package/dist/redux.d.ts +0 -2
  100. package/dist/redux.js +0 -2
  101. package/dist/redux.mjs +0 -2
  102. package/dist/table-grid.d.ts +0 -2
  103. package/dist/table-grid.js +0 -2
  104. package/dist/table-grid.mjs +0 -2
  105. package/dist/table.d.ts +0 -2
  106. package/dist/table.js +0 -2
  107. package/dist/table.mjs +0 -2
  108. package/dist/utils.d.ts +0 -2
  109. package/dist/utils.js +0 -2
  110. package/dist/utils.mjs +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"ui.units.js","sources":["../../src/data-view/ui.units.tsx"],"sourcesContent":["import React, { FC, ReactNode, useState } from 'react'\r\nimport { Box, Button, ButtonProps, Fade, IconButton, InputBaseProps, Typography } from '@mui/material'\r\nimport { FormControlLabel, FormGroup, Radio, RadioGroup, TextField, colors, styled } from '@mui/material'\r\nimport { ToggleButton, Tooltip, ToggleButtonGroup, Checkbox, IconButtonProps, InputAdornment, InputBase } from '@mui/material'\r\nimport CloseIcon from '@mui/icons-material/Close'\r\nimport ShuffleIcon from '@mui/icons-material/Shuffle'\r\nimport ClearAllIcon from '@mui/icons-material/ClearAll'\r\nimport FilterListIcon from '@mui/icons-material/FilterList'\r\nimport ArrowUpwardIcon from '@mui/icons-material/ArrowUpward'\r\nimport ArrowDownwardIcon from '@mui/icons-material/ArrowDownward'\r\nimport KeyboardReturnIcon from '@mui/icons-material/KeyboardReturn'\r\nimport KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'\r\nimport { mapDataViewContext } from './context'\r\nimport { IFilterLogic, IFilterDateLogic, IFilterDateRangeLogic, IFilterSelectDef, IValidationResult, IFilterDateDef, IFilterBasicDef } from './types'\r\nimport HelpTooltip from '../components/help-tooltip'\r\n\r\nexport const mapSortConfigs: Record<'asc' | 'desc', { title: string; icon: ReactNode }> = {\r\n asc: { title: 'Ascending', icon: <ArrowUpwardIcon fontSize='small' /> },\r\n desc: { title: 'Descending', icon: <ArrowDownwardIcon fontSize='small' /> }\r\n}\r\n\r\n//#region Toggle Components\r\nexport interface IFilterLogicToggleProps {\r\n value?: IFilterLogic\r\n onChange?: (event: React.MouseEvent<HTMLElement>, value: IFilterLogic) => void\r\n}\r\n\r\nexport const FilterLogicToggle: FC<IFilterLogicToggleProps> = (props) => {\r\n const handleChange = (event: React.MouseEvent<HTMLElement>, newValue: string | null) => {\r\n if (newValue && props.onChange) {\r\n props.onChange(event, newValue as IFilterLogic)\r\n }\r\n }\r\n\r\n return (\r\n <ToggleButtonGroupCustom size='small' value={props.value || 'and'} exclusive onChange={handleChange}>\r\n <ToggleButton size='small' value='and' aria-label='and logic'>\r\n AND\r\n </ToggleButton>\r\n <ToggleButton size='small' value='or' aria-label='or logic'>\r\n OR\r\n </ToggleButton>\r\n </ToggleButtonGroupCustom>\r\n )\r\n}\r\n\r\nexport interface IDateLogicToggleProps {\r\n value?: IFilterDateLogic\r\n onChange?: (event: React.MouseEvent<HTMLElement>, value: IFilterDateLogic) => void\r\n}\r\n\r\nexport const DateLogicToggle: FC<IDateLogicToggleProps> = (props) => {\r\n const handleChange = (event: React.MouseEvent<HTMLElement>, newValue: string | null) => {\r\n if (newValue && props.onChange) {\r\n props.onChange(event, newValue as IFilterDateLogic)\r\n }\r\n }\r\n\r\n return (\r\n <ToggleButtonGroupCustom size='small' value={props.value || 'before'} exclusive onChange={handleChange}>\r\n <ToggleButton size='small' value='before' aria-label='before date'>\r\n before\r\n </ToggleButton>\r\n <ToggleButton size='small' value='after' aria-label='after date'>\r\n after\r\n </ToggleButton>\r\n </ToggleButtonGroupCustom>\r\n )\r\n}\r\n\r\nexport interface IDateRangeLogicToggleProps {\r\n value?: IFilterDateRangeLogic\r\n onChange?: (event: React.MouseEvent<HTMLElement>, value: IFilterDateRangeLogic) => void\r\n}\r\n\r\nexport const DateRangeLogicToggle: FC<IDateRangeLogicToggleProps> = (props) => {\r\n const handleChange = (event: React.MouseEvent<HTMLElement>, newValue: string | null) => {\r\n if (newValue && props.onChange) {\r\n props.onChange(event, newValue as IFilterDateRangeLogic)\r\n }\r\n }\r\n\r\n return (\r\n <ToggleButtonGroupCustom size='small' value={props.value || 'between'} exclusive onChange={handleChange}>\r\n <ToggleButton size='small' value='between' aria-label='between dates'>\r\n between\r\n </ToggleButton>\r\n <ToggleButton size='small' value='not-between' aria-label='not between dates'>\r\n not between\r\n </ToggleButton>\r\n </ToggleButtonGroupCustom>\r\n )\r\n}\r\n\r\nconst ToggleButtonGroupCustom = styled(ToggleButtonGroup)({\r\n '& .MuiToggleButton-root': {\r\n color: '#fff',\r\n borderColor: 'rgba(255, 255, 255, 0.3)',\r\n fontSize: '0.65rem',\r\n fontWeight: 600,\r\n lineHeight: 1,\r\n minWidth: '40px',\r\n padding: '6px 8px',\r\n '&.Mui-selected': {\r\n backgroundColor: '#1976d2',\r\n color: '#fff',\r\n '&:hover': {\r\n backgroundColor: '#1565c0'\r\n }\r\n },\r\n '&:hover': {\r\n backgroundColor: 'rgba(255, 255, 255, 0.08)'\r\n }\r\n }\r\n})\r\n//#endregion\r\n\r\n//#region Notes\r\nexport interface IFilterNotesProps {\r\n title?: string\r\n items?: string[]\r\n disabledSize?: boolean\r\n renderContent?: () => ReactNode\r\n}\r\n\r\nconst HelpTooltipContent: FC<{ items: string[] }> = (props) => (\r\n <WrapList>\r\n {props.items.map((item, index) => (\r\n <Typography key={index} component='li' variant='body2'>\r\n {item}\r\n </Typography>\r\n ))}\r\n </WrapList>\r\n)\r\n\r\nexport const FilterNotes: FC<IFilterNotesProps> = (props) => (\r\n <WrapIcon className={props.disabledSize === true ? 'disabled-size' : ''}>\r\n <HelpTooltip small title={props.title ?? 'The search includes'}>\r\n {props.renderContent ? props.renderContent() : <HelpTooltipContent items={props.items ?? []} />}\r\n </HelpTooltip>\r\n </WrapIcon>\r\n)\r\n//#endregion\r\n\r\n//#region Input\r\nexport const FilterInput = React.forwardRef<HTMLInputElement, InputBaseProps>((props, ref) => {\r\n return <InputBase fullWidth autoComplete='off' size='small' {...props} inputRef={ref} />\r\n})\r\n\r\ninterface IFilterInputAdornmentProps {\r\n notes?: IFilterNotesProps\r\n keyword?: string\r\n onClear: IconButtonProps['onClick']\r\n onEnterSearch: ButtonProps['onClick']\r\n}\r\n\r\nexport const FilterInputAdornment: FC<IFilterInputAdornmentProps> = (props) => (\r\n <InputAdornment position='end'>\r\n {props.keyword && (\r\n <>\r\n <HelpButton size='small' color='primary' onClick={props.onEnterSearch} sx={{ display: { xs: 'none', md: 'flex' } }}>\r\n <Typography variant='caption'>\r\n Type and hit <b>Enter ⏎</b> to filter.\r\n </Typography>\r\n </HelpButton>\r\n <Tooltip title='Press Enter to filter' placement='bottom' arrow>\r\n <IconButton size='small' color='primary' sx={{ display: { xs: 'flex', md: 'none' } }} onClick={props.onEnterSearch}>\r\n <KeyboardReturnIcon fontSize='small' />\r\n </IconButton>\r\n </Tooltip>\r\n </>\r\n )}\r\n {props.keyword && (\r\n <Tooltip title='Press Esc to clear' placement='bottom' arrow>\r\n <IconButton size='small' sx={{ marginLeft: '8px', color: 'text.error', '&:hover': { color: 'error.main' } }} onClick={props.onClear}>\r\n <CloseIcon fontSize='small' />\r\n </IconButton>\r\n </Tooltip>\r\n )}\r\n {props.notes && <FilterNotes {...props.notes} />}\r\n </InputAdornment>\r\n)\r\n\r\nconst HelpButton = styled(Button)({\r\n padding: '4px 6px',\r\n textTransform: 'none',\r\n lineHeight: 1,\r\n '.MuiTypography-root': {\r\n fontWeight: 600,\r\n b: {\r\n fontWeight: 700,\r\n backgroundColor: colors.blue[100],\r\n borderRadius: '4px',\r\n padding: '2px 4px'\r\n }\r\n }\r\n})\r\n//#endregion\r\n\r\n//#region Button\r\nexport interface IButtonClearProps {\r\n visibled?: boolean\r\n onClick: IconButtonProps['onClick']\r\n}\r\n\r\nexport const ButtonClear: FC<IButtonClearProps> = (props) => (\r\n <WrapIcon>\r\n <Tooltip title='Remove filter'>\r\n <Fade in={props.visibled} unmountOnExit>\r\n <IconButton size='small' onClick={props.onClick}>\r\n <CloseIcon fontSize='small' />\r\n </IconButton>\r\n </Fade>\r\n </Tooltip>\r\n </WrapIcon>\r\n)\r\n\r\nexport const ClearAllButton = React.forwardRef<HTMLButtonElement, ButtonProps>(({ children, ...props }, ref) => (\r\n <ClearButtonStyled size='small' color='error' startIcon={<ClearAllIcon />} ref={ref} {...props}>\r\n {children || 'Clear all'}\r\n </ClearButtonStyled>\r\n))\r\n\r\nconst ClearButtonStyled = styled(Button)({ textTransform: 'none', fontWeight: 700 })\r\n\r\nexport const FilterButton = React.forwardRef<HTMLButtonElement, IconButtonProps>((props, ref) => (\r\n <IconButton ref={ref} size='small' sx={{ flex: '0 0 auto' }} {...props}>\r\n <FilterListIcon />\r\n </IconButton>\r\n))\r\n\r\nexport const SortIconButton = React.forwardRef<HTMLButtonElement, IconButtonProps>((props, ref) => (\r\n <IconButton ref={ref} size='small' sx={{ flex: '0 0 auto' }} {...props}>\r\n <ShuffleIcon />\r\n </IconButton>\r\n))\r\n\r\nexport const SortButton: FC<ButtonProps> = (props) => (\r\n <>\r\n {mapDataViewContext((context) => {\r\n const { filterState, filterBarConfigs: configs } = context\r\n const config: Partial<{ title: string; icon: ReactNode }> = filterState.sort ? mapSortConfigs[filterState.sort?.direction] : {}\r\n const fieldConfig = configs.fields?.[filterState.sort?.field as any]\r\n const text = fieldConfig?.label || filterState.sort?.field.toString() || configs.sortButton?.text\r\n return (\r\n <SortButtonStyled\r\n size='small'\r\n color='inherit'\r\n startIcon={config.icon || <ShuffleIcon fontSize='small' />}\r\n endIcon={configs.sortButton?.icon ?? <KeyboardArrowDownIcon fontSize='small' />}\r\n onClick={(e) => context.onPopperPanelChange(e.currentTarget, 'sortButton')}\r\n {...configs.sortButton?.wrapProps}\r\n {...props}\r\n >\r\n {text || 'Sort'}\r\n </SortButtonStyled>\r\n )\r\n })}\r\n </>\r\n)\r\n\r\nconst SortButtonStyled = styled(Button)({\r\n height: 'var(--filter-bar-height, 40px)',\r\n padding: '0 16px',\r\n backgroundColor: colors.grey[50],\r\n border: '1px solid var(--color-divider, rgba(145 158 171 / 20%))',\r\n textTransform: 'none',\r\n fontWeight: 600,\r\n ':hover': {\r\n backgroundColor: colors.grey[100]\r\n }\r\n})\r\n//#endregion\r\n\r\n//#region Panel Not Found\r\nexport const PanelNotFound: FC<{ area?: string }> = ({ area }) => (\r\n <Box sx={{ padding: '8px', textAlign: 'center', border: '1px solid #ddd', borderRadius: '4px' }}>\r\n <Typography variant='body2' sx={{ padding: '8px' }}>\r\n No panel available for area: {area}\r\n </Typography>\r\n </Box>\r\n)\r\n//#endregion\r\n\r\n//#region Form\r\ninterface IFormContentProps {\r\n label: string\r\n notes?: any\r\n children?: React.ReactNode\r\n afterTopBar?: React.ReactNode\r\n}\r\n\r\nconst FormContent: FC<IFormContentProps> = ({ label, notes, children, afterTopBar }) => (\r\n <FormContentWrapper>\r\n <Box className='top-bar'>\r\n <Typography variant='subtitle2'>{label}</Typography>\r\n {afterTopBar && <Box className='after-top-bar'>{afterTopBar}</Box>}\r\n {notes && <FilterNotes title={`The ${label} includes`} disabledSize {...notes} />}\r\n </Box>\r\n <Box className='content'>{children}</Box>\r\n </FormContentWrapper>\r\n)\r\n\r\nconst FormContentWrapper = styled(Box)({\r\n minWidth: '200px',\r\n borderRadius: '4px',\r\n overflow: 'hidden',\r\n '.top-bar': {\r\n display: 'flex',\r\n alignItems: 'center',\r\n background: colors.grey[900],\r\n padding: '8px',\r\n gap: '8px',\r\n '.MuiTypography-root': {\r\n color: colors.common.white,\r\n flex: 1\r\n }\r\n },\r\n '.after-top-bar': {\r\n marginLeft: '8px'\r\n },\r\n '.content': {\r\n padding: '8px'\r\n }\r\n})\r\n//#endregion\r\n\r\n//#region Menu - String Type\r\ninterface IMenuWithTypeBaseProps {\r\n name: string\r\n validationResult?: IValidationResult\r\n}\r\n\r\ninterface IMenuWithTypeStringProps extends IMenuWithTypeBaseProps {\r\n fieldConfig?: IFilterBasicDef\r\n}\r\n\r\nexport const MenuWithTypeString: FC<IMenuWithTypeStringProps> = (props) => {\r\n const label = props.fieldConfig?.label ?? props.name\r\n return (\r\n <FormContent label={label} notes={props.fieldConfig?.notes}>\r\n <TextField\r\n autoFocus\r\n name={props.name}\r\n size='small'\r\n fullWidth\r\n error={!!props.validationResult?.hasError}\r\n helperText={props.validationResult?.message}\r\n />\r\n </FormContent>\r\n )\r\n}\r\n//#endregion\r\n\r\n//#region Menu - Select Type\r\nexport interface IMenuWithTypeSelectProps extends IMenuWithTypeBaseProps {\r\n fieldConfig?: IFilterSelectDef\r\n onChange?: (event: React.ChangeEvent<HTMLInputElement>) => void\r\n}\r\n\r\nexport const MenuWithTypeSelect: FC<IMenuWithTypeSelectProps> = (props) => {\r\n const label = props.fieldConfig?.label ?? props.name\r\n return (\r\n <FormContent label={label} notes={props.fieldConfig?.notes}>\r\n <CustomRadioGroup name={props.name} className={props.validationResult?.hasError ? 'error' : ''} onChange={props.onChange}>\r\n {props.fieldConfig?.options.map((x, i) => (\r\n <FormControlLabel key={x.value.toString() + i} value={x.value} control={<Radio />} label={x.label ?? x.value} />\r\n ))}\r\n </CustomRadioGroup>\r\n </FormContent>\r\n )\r\n}\r\n\r\nconst CustomRadioGroup = styled(RadioGroup)({\r\n marginLeft: '-8px',\r\n marginRight: '-8px',\r\n '&.error .MuiRadio-root': {\r\n color: '#d32f2f'\r\n },\r\n '.MuiFormControlLabel-root': {\r\n margin: 0\r\n },\r\n '.MuiFormControlLabel-root:hover': {\r\n backgroundColor: 'rgba(25, 118, 210, 0.04)'\r\n }\r\n})\r\n//#endregion\r\n\r\n//#region Menu - Select Multi Type\r\nexport interface IMenuWithTypeSelectMultiProps extends IMenuWithTypeBaseProps {\r\n fieldConfig?: IFilterSelectDef\r\n onChange?: (event: React.SyntheticEvent, checked: boolean) => void\r\n}\r\n\r\nexport const MenuWithTypeSelectMulti: FC<IMenuWithTypeSelectMultiProps> = (props) => {\r\n const [filterLogic, setFilterLogic] = useState<IFilterLogic>('and')\r\n const label = props.fieldConfig?.label ?? props.name\r\n return (\r\n <FormContent\r\n label={label}\r\n notes={props.fieldConfig?.notes}\r\n afterTopBar={<FilterLogicToggle value={filterLogic} onChange={(_, value) => setFilterLogic(value)} />}\r\n >\r\n {/* Hidden input for logic value */}\r\n <input type='hidden' name='filterLogic' value={filterLogic} />\r\n <CustomFormGroup className={props.validationResult?.hasError ? 'error' : ''}>\r\n {props.fieldConfig?.options.map((x, i) => (\r\n <FormControlLabel\r\n key={x.value.toString() + i}\r\n value={x.value}\r\n control={<Checkbox name={props.name} />}\r\n label={x.label ?? x.value}\r\n onChange={props.onChange}\r\n />\r\n ))}\r\n </CustomFormGroup>\r\n </FormContent>\r\n )\r\n}\r\n\r\nconst CustomFormGroup = styled(FormGroup)({\r\n marginLeft: '-8px',\r\n marginRight: '-8px',\r\n '&.error .MuiCheckbox-root': {\r\n color: '#d32f2f'\r\n },\r\n '.MuiFormControlLabel-root': {\r\n margin: 0\r\n },\r\n '.MuiFormControlLabel-root:hover': {\r\n backgroundColor: 'rgba(25, 118, 210, 0.04)'\r\n }\r\n})\r\n//#endregion\r\n\r\nfunction convertDateToCustomFormat(dateString: string): string {\r\n if (!dateString || !/^\\d{4}-\\d{2}-\\d{2}$/.test(dateString)) return ''\r\n return `${dateString}T00:00:00.0000000`\r\n}\r\n//#region Menu - Date Type\r\nexport interface IMenuWithTypeDateProps extends IMenuWithTypeBaseProps {\r\n fieldConfig?: IFilterDateDef\r\n}\r\n\r\nexport const MenuWithTypeDate: FC<IMenuWithTypeDateProps> = (props) => {\r\n const [dateLogic, setDateLogic] = useState<IFilterDateLogic>('before')\r\n const [value, setValue] = useState<string>('')\r\n const label = props.fieldConfig?.label ?? props.name\r\n return (\r\n <FormContent\r\n label={label}\r\n notes={props.fieldConfig?.notes}\r\n afterTopBar={<DateLogicToggle value={dateLogic} onChange={(_, value) => setDateLogic(value)} />}\r\n >\r\n <Box className='content'>\r\n {/* Hidden input for logic value */}\r\n <input type='hidden' name='dateLogic' value={dateLogic} />\r\n <input hidden type='text' name={props.name} readOnly value={convertDateToCustomFormat(value)} />\r\n <TextField\r\n autoFocus\r\n fullWidth\r\n type='date'\r\n size='small'\r\n value={value}\r\n onChange={(event) => setValue(event.target.value)}\r\n error={!!props.validationResult?.hasError}\r\n helperText={props.validationResult?.message}\r\n inputProps={{ min: props.fieldConfig?.minDate, max: props.fieldConfig?.maxDate }}\r\n />\r\n </Box>\r\n </FormContent>\r\n )\r\n}\r\n//#endregion\r\n\r\n//#region Menu - Date Range Type\r\nexport interface IMenuWithTypeDateRangeProps extends IMenuWithTypeBaseProps {\r\n fieldConfig?: IFilterDateDef\r\n}\r\n\r\nexport const MenuWithTypeDateRange: FC<IMenuWithTypeDateRangeProps> = (props) => {\r\n const [dateRangeLogic, setDateRangeLogic] = useState<IFilterDateRangeLogic>('between')\r\n const label = props.fieldConfig?.label ?? props.name\r\n return (\r\n <FormContent\r\n label={label}\r\n notes={props.fieldConfig?.notes}\r\n afterTopBar={<DateRangeLogicToggle value={dateRangeLogic} onChange={(_, value) => setDateRangeLogic(value)} />}\r\n >\r\n {/* Hidden input for logic value */}\r\n <input type='hidden' name='dateRangeLogic' value={dateRangeLogic} />\r\n <DateRangeContainer>\r\n <TextField\r\n autoFocus\r\n fullWidth\r\n name={`${props.name}_start`}\r\n type='date'\r\n size='small'\r\n label='From'\r\n error={!!props.validationResult?.hasError}\r\n sx={{ marginBottom: 1 }}\r\n InputLabelProps={{ shrink: true }}\r\n inputProps={{ min: props.fieldConfig?.minDate, max: props.fieldConfig?.maxDate }}\r\n />\r\n <TextField\r\n fullWidth\r\n name={`${props.name}_end`}\r\n type='date'\r\n size='small'\r\n label='To'\r\n error={!!props.validationResult?.hasError}\r\n helperText={props.validationResult?.message}\r\n InputLabelProps={{ shrink: true }}\r\n inputProps={{ min: props.fieldConfig?.minDate, max: props.fieldConfig?.maxDate }}\r\n />\r\n </DateRangeContainer>\r\n </FormContent>\r\n )\r\n}\r\n\r\nconst DateRangeContainer = styled(Box)({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: '8px'\r\n})\r\n//#endregion\r\n\r\n//#region Styled\r\nconst WrapIcon = styled(Box)({\r\n display: 'inline-flex',\r\n flex: '0 0 auto',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n '&:not(.disabled-size)': {\r\n width: '40px',\r\n height: '40px'\r\n }\r\n})\r\n\r\nconst WrapList = styled('ul')({\r\n paddingLeft: '1.7rem',\r\n marginBottom: 0,\r\n li: {\r\n position: 'relative',\r\n textAlign: 'justify',\r\n '&::before': {\r\n content: '\"►\"',\r\n display: 'block',\r\n position: 'absolute',\r\n top: '50%',\r\n right: 'calc(100% + 6px)',\r\n transform: 'translateY(-50%)',\r\n fontSize: '0.9em'\r\n }\r\n }\r\n})\r\n//#endregion\r\n"],"names":["mapSortConfigs","asc","title","icon","_jsx","ArrowUpwardIcon","fontSize","desc","ArrowDownwardIcon","FilterLogicToggle","props","_jsxs","ToggleButtonGroupCustom","size","value","exclusive","onChange","event","newValue","children","ToggleButton","DateLogicToggle","DateRangeLogicToggle","styled","ToggleButtonGroup","color","borderColor","fontWeight","lineHeight","minWidth","padding","backgroundColor","HelpTooltipContent","WrapList","items","map","item","index","Typography","component","variant","FilterNotes","_props$title","_props$items","WrapIcon","className","disabledSize","HelpTooltip","small","renderContent","FilterInput","React","forwardRef","ref","InputBase","_objectSpread","fullWidth","autoComplete","inputRef","FilterInputAdornment","InputAdornment","position","keyword","_Fragment","HelpButton","onClick","onEnterSearch","sx","display","xs","md","Tooltip","placement","arrow","IconButton","KeyboardReturnIcon","marginLeft","onClear","CloseIcon","notes","Button","textTransform","b","colors","blue","borderRadius","ClearAllButton","_ref","_objectWithoutProperties","_excluded","ClearButtonStyled","startIcon","ClearAllIcon","FilterButton","flex","FilterListIcon","SortButton","mapDataViewContext","context","_filterState$sort","_configs$fields","_filterState$sort2","_filterState$sort3","_configs$sortButton","_configs$sortButton$i","_configs$sortButton2","_configs$sortButton3","filterState","configs","filterBarConfigs","config","sort","direction","fieldConfig","fields","field","text","label","toString","sortButton","SortButtonStyled","ShuffleIcon","endIcon","KeyboardArrowDownIcon","e","onPopperPanelChange","currentTarget","wrapProps","height","grey","border","PanelNotFound","_ref2","area","Box","textAlign","FormContent","_ref3","afterTopBar","FormContentWrapper","concat","overflow","alignItems","background","gap","common","white","MenuWithTypeString","_props$fieldConfig$la","_props$fieldConfig","_props$fieldConfig2","_props$validationResu","_props$validationResu2","name","TextField","autoFocus","error","validationResult","hasError","helperText","message","MenuWithTypeSelect","_props$fieldConfig$la2","_props$fieldConfig3","_props$fieldConfig4","_props$validationResu3","_props$fieldConfig5","CustomRadioGroup","options","x","i","_x$label","FormControlLabel","control","Radio","RadioGroup","marginRight","margin","MenuWithTypeSelectMulti","_props$fieldConfig$la3","_props$fieldConfig6","_props$fieldConfig7","_props$validationResu4","_props$fieldConfig8","_useState","useState","_useState2","_slicedToArray","filterLogic","setFilterLogic","_","type","CustomFormGroup","_x$label2","Checkbox","FormGroup","MenuWithTypeDate","_props$fieldConfig$la4","_props$fieldConfig9","_props$fieldConfig0","_props$validationResu5","_props$validationResu6","_props$fieldConfig1","_props$fieldConfig10","dateString","_useState3","_useState4","dateLogic","setDateLogic","_useState5","_useState6","setValue","hidden","readOnly","test","target","inputProps","min","minDate","max","maxDate","MenuWithTypeDateRange","_props$fieldConfig$la5","_props$fieldConfig11","_props$fieldConfig12","_props$validationResu7","_props$fieldConfig13","_props$fieldConfig14","_props$validationResu8","_props$validationResu9","_props$fieldConfig15","_props$fieldConfig16","_useState7","_useState8","dateRangeLogic","setDateRangeLogic","DateRangeContainer","marginBottom","InputLabelProps","shrink","flexDirection","justifyContent","width","paddingLeft","li","content","top","right","transform"],"mappings":"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"}
1
+ {"version":3,"file":"ui.units.js","sources":["../../src/data-view/ui.units.tsx"],"sourcesContent":["import React, { FC, ReactNode, useRef, useState } from 'react'\r\nimport { Box, Button, ButtonGroup, ButtonProps, Fade, IconButton, InputBaseProps, Typography } from '@mui/material'\r\nimport { FormControlLabel, FormGroup, Radio, RadioGroup, TextField, colors, styled } from '@mui/material'\r\nimport { ToggleButton, Tooltip, ToggleButtonGroup, Checkbox, IconButtonProps, InputAdornment, InputBase } from '@mui/material'\r\nimport CloseIcon from '@mui/icons-material/Close'\r\nimport ShuffleIcon from '@mui/icons-material/Shuffle'\r\nimport ClearAllIcon from '@mui/icons-material/ClearAll'\r\nimport FilterListIcon from '@mui/icons-material/FilterList'\r\nimport ArrowUpwardIcon from '@mui/icons-material/ArrowUpward'\r\nimport ArrowDownwardIcon from '@mui/icons-material/ArrowDownward'\r\nimport KeyboardReturnIcon from '@mui/icons-material/KeyboardReturn'\r\nimport KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'\r\nimport { mapDataViewContext } from './context'\r\nimport { IFilterLogic, IFilterDateLogic, IFilterDateRangeLogic, IFilterSelectDef, IValidationResult, IFilterDateDef, IFilterBasicDef } from './types'\r\nimport HelpTooltip from '../components/help-tooltip'\r\nimport { createFilterStore } from './filter-store'\r\n\r\nexport const mapSortConfigs: Record<'asc' | 'desc', { title: string; icon: ReactNode }> = {\r\n asc: { title: 'Ascending', icon: <ArrowUpwardIcon fontSize='small' /> },\r\n desc: { title: 'Descending', icon: <ArrowDownwardIcon fontSize='small' /> }\r\n}\r\n\r\n//#region Toggle Components\r\nexport interface IFilterLogicToggleProps {\r\n value?: IFilterLogic\r\n onChange?: (event: React.MouseEvent<HTMLElement>, value: IFilterLogic) => void\r\n}\r\n\r\nexport const FilterLogicToggle: FC<IFilterLogicToggleProps> = (props) => {\r\n const handleChange = (event: React.MouseEvent<HTMLElement>, newValue: string | null) => {\r\n if (newValue && props.onChange) {\r\n props.onChange(event, newValue as IFilterLogic)\r\n }\r\n }\r\n\r\n return (\r\n <ToggleButtonGroupCustom size='small' value={props.value || 'and'} exclusive onChange={handleChange}>\r\n <ToggleButton size='small' value='and' aria-label='and logic'>\r\n AND\r\n </ToggleButton>\r\n <ToggleButton size='small' value='or' aria-label='or logic'>\r\n OR\r\n </ToggleButton>\r\n </ToggleButtonGroupCustom>\r\n )\r\n}\r\n\r\nexport interface IDateLogicToggleProps {\r\n value?: IFilterDateLogic\r\n onChange?: (event: React.MouseEvent<HTMLElement>, value: IFilterDateLogic) => void\r\n}\r\n\r\nexport const DateLogicToggle: FC<IDateLogicToggleProps> = (props) => {\r\n const handleChange = (event: React.MouseEvent<HTMLElement>, newValue: string | null) => {\r\n if (newValue && props.onChange) {\r\n props.onChange(event, newValue as IFilterDateLogic)\r\n }\r\n }\r\n\r\n return (\r\n <ToggleButtonGroupCustom size='small' value={props.value || 'before'} exclusive onChange={handleChange}>\r\n <ToggleButton size='small' value='before' aria-label='before date'>\r\n before\r\n </ToggleButton>\r\n <ToggleButton size='small' value='after' aria-label='after date'>\r\n after\r\n </ToggleButton>\r\n </ToggleButtonGroupCustom>\r\n )\r\n}\r\n\r\nexport interface IDateRangeLogicToggleProps {\r\n value?: IFilterDateRangeLogic\r\n onChange?: (event: React.MouseEvent<HTMLElement>, value: IFilterDateRangeLogic) => void\r\n}\r\n\r\nexport const DateRangeLogicToggle: FC<IDateRangeLogicToggleProps> = (props) => {\r\n const handleChange = (event: React.MouseEvent<HTMLElement>, newValue: string | null) => {\r\n if (newValue && props.onChange) {\r\n props.onChange(event, newValue as IFilterDateRangeLogic)\r\n }\r\n }\r\n\r\n return (\r\n <ToggleButtonGroupCustom size='small' value={props.value || 'between'} exclusive onChange={handleChange}>\r\n <ToggleButton size='small' value='between' aria-label='between dates'>\r\n between\r\n </ToggleButton>\r\n <ToggleButton size='small' value='not-between' aria-label='not between dates'>\r\n not between\r\n </ToggleButton>\r\n </ToggleButtonGroupCustom>\r\n )\r\n}\r\n\r\nconst ToggleButtonGroupCustom = styled(ToggleButtonGroup)({\r\n '& .MuiToggleButton-root': {\r\n color: '#fff',\r\n borderColor: 'rgba(255, 255, 255, 0.3)',\r\n fontSize: '0.65rem',\r\n fontWeight: 600,\r\n lineHeight: 1,\r\n minWidth: '40px',\r\n padding: '6px 8px',\r\n '&.Mui-selected': {\r\n backgroundColor: '#1976d2',\r\n color: '#fff',\r\n '&:hover': {\r\n backgroundColor: '#1565c0'\r\n }\r\n },\r\n '&:hover': {\r\n backgroundColor: 'rgba(255, 255, 255, 0.08)'\r\n }\r\n }\r\n})\r\n//#endregion\r\n\r\n//#region Notes\r\nexport interface IFilterNotesProps {\r\n title?: string\r\n items?: string[]\r\n disabledSize?: boolean\r\n renderContent?: () => ReactNode\r\n}\r\n\r\nconst HelpTooltipContent: FC<{ items: string[] }> = (props) => (\r\n <WrapList>\r\n {props.items.map((item, index) => (\r\n <Typography key={index} component='li' variant='body2'>\r\n {item}\r\n </Typography>\r\n ))}\r\n </WrapList>\r\n)\r\n\r\nexport const FilterNotes: FC<IFilterNotesProps> = (props) => (\r\n <WrapIcon className={props.disabledSize === true ? 'disabled-size' : ''}>\r\n <HelpTooltip small title={props.title ?? 'The search includes'}>\r\n {props.renderContent ? props.renderContent() : <HelpTooltipContent items={props.items ?? []} />}\r\n </HelpTooltip>\r\n </WrapIcon>\r\n)\r\n//#endregion\r\n\r\n//#region Input\r\nexport const FilterInput = React.forwardRef<HTMLInputElement, InputBaseProps>((props, ref) => {\r\n return <InputBase fullWidth autoComplete='off' size='small' {...props} inputRef={ref} />\r\n})\r\n\r\ninterface IFilterInputAdornmentProps {\r\n notes?: IFilterNotesProps\r\n keyword?: string\r\n onClear: IconButtonProps['onClick']\r\n onEnterSearch: ButtonProps['onClick']\r\n}\r\n\r\nexport const FilterInputAdornment: FC<IFilterInputAdornmentProps> = (props) => (\r\n <InputAdornment position='end'>\r\n {props.keyword && (\r\n <>\r\n <HelpButton size='small' color='primary' onClick={props.onEnterSearch} sx={{ display: { xs: 'none', md: 'flex' } }}>\r\n <Typography variant='caption'>\r\n Type and hit <b>Enter ⏎</b> to filter.\r\n </Typography>\r\n </HelpButton>\r\n <Tooltip title='Press Enter to filter' placement='bottom' arrow>\r\n <IconButton size='small' color='primary' sx={{ display: { xs: 'flex', md: 'none' } }} onClick={props.onEnterSearch}>\r\n <KeyboardReturnIcon fontSize='small' />\r\n </IconButton>\r\n </Tooltip>\r\n </>\r\n )}\r\n {props.keyword && (\r\n <Tooltip title='Press Esc to clear' placement='bottom' arrow>\r\n <IconButton size='small' sx={{ marginLeft: '8px', color: 'text.error', '&:hover': { color: 'error.main' } }} onClick={props.onClear}>\r\n <CloseIcon fontSize='small' />\r\n </IconButton>\r\n </Tooltip>\r\n )}\r\n {props.notes && <FilterNotes {...props.notes} />}\r\n </InputAdornment>\r\n)\r\n\r\nconst HelpButton = styled(Button)({\r\n padding: '4px 6px',\r\n textTransform: 'none',\r\n lineHeight: 1,\r\n '.MuiTypography-root': {\r\n fontWeight: 600,\r\n b: {\r\n fontWeight: 700,\r\n backgroundColor: colors.blue[100],\r\n borderRadius: '4px',\r\n padding: '2px 4px'\r\n }\r\n }\r\n})\r\n//#endregion\r\n\r\n//#region Button\r\nexport interface IButtonClearProps {\r\n visibled?: boolean\r\n onClick: IconButtonProps['onClick']\r\n}\r\n\r\nexport const ButtonClear: FC<IButtonClearProps> = (props) => (\r\n <WrapIcon>\r\n <Tooltip title='Remove filter'>\r\n <Fade in={props.visibled} unmountOnExit>\r\n <IconButton size='small' onClick={props.onClick}>\r\n <CloseIcon fontSize='small' />\r\n </IconButton>\r\n </Fade>\r\n </Tooltip>\r\n </WrapIcon>\r\n)\r\n\r\nexport const ClearAllButton = React.forwardRef<HTMLButtonElement, ButtonProps>(({ children, ...props }, ref) => (\r\n <ClearButtonStyled size='small' color='error' startIcon={<ClearAllIcon />} ref={ref} {...props}>\r\n {children || 'Clear all'}\r\n </ClearButtonStyled>\r\n))\r\n\r\nconst ClearButtonStyled = styled(Button)({ textTransform: 'none', fontWeight: 700 })\r\n\r\nexport const FilterButton = React.forwardRef<HTMLButtonElement, IconButtonProps>((props, ref) => (\r\n <IconButton ref={ref} size='small' sx={{ flex: '0 0 auto' }} {...props}>\r\n <FilterListIcon />\r\n </IconButton>\r\n))\r\n\r\nexport const SortIconButton = React.forwardRef<HTMLButtonElement, IconButtonProps>((props, ref) => (\r\n <IconButton ref={ref} size='small' sx={{ flex: '0 0 auto' }} {...props}>\r\n <ShuffleIcon />\r\n </IconButton>\r\n))\r\n\r\n//TODO - Add a button to toggle the visibility of the filter bar\r\nexport const SortButton: FC<ButtonProps> = (props) => {\r\n const timeoutRef = useRef<NodeJS.Timeout | null>(null)\r\n const debounceDelay = 500\r\n return (\r\n <>\r\n {mapDataViewContext((context) => {\r\n const { filterState, filterBarConfigs: configs } = context\r\n const config: Partial<{ title: string; icon: ReactNode }> = filterState.sort ? mapSortConfigs[filterState.sort?.direction] : {}\r\n const fieldConfig = configs.fields?.[filterState.sort?.field as any]\r\n const text = fieldConfig?.label || filterState.sort?.field?.toString() || configs.sortButton?.text\r\n // Debounce logic to prevent rapid/continuous calls\r\n const handleSortButtonClick = () => {\r\n if (!filterState.sort?.field) return\r\n const currentDirection = filterState.sort?.direction\r\n const newDirection: 'asc' | 'desc' = currentDirection ? (currentDirection === 'asc' ? 'desc' : 'asc') : 'asc'\r\n const newSort = { field: filterState.sort.field, direction: newDirection }\r\n const store = createFilterStore(filterState).changeSort(newSort, { area: 'sortButton' })\r\n context.onFilterStateChange(store.build())\r\n }\r\n\r\n const handlePopperPanelChange = (e: React.MouseEvent<HTMLButtonElement>) => {\r\n e.stopPropagation()\r\n timeoutRef.current && clearTimeout(timeoutRef.current)\r\n timeoutRef.current = setTimeout(() => handleSortButtonClick(), debounceDelay)\r\n }\r\n\r\n if (text) {\r\n return (\r\n <ButtonGroup aria-label='Button Sort' size='small'>\r\n <SortButtonStyled\r\n size='small'\r\n color='inherit'\r\n startIcon={config.icon || <ShuffleIcon fontSize='small' />}\r\n onClick={handlePopperPanelChange}\r\n {...configs.sortButton?.wrapProps}\r\n {...props}\r\n >\r\n {text}\r\n </SortButtonStyled>\r\n <SortButtonStyled\r\n size='small'\r\n color='inherit'\r\n sx={{ p: 0 }}\r\n onClick={(e) => context.onPopperPanelChange(e.currentTarget, 'sortButton')}\r\n >\r\n <KeyboardArrowDownIcon fontSize='small' />\r\n </SortButtonStyled>\r\n </ButtonGroup>\r\n )\r\n }\r\n\r\n return (\r\n <SortButtonStyled\r\n size='small'\r\n color='inherit'\r\n startIcon={config.icon || <ShuffleIcon fontSize='small' />}\r\n endIcon={configs.sortButton?.icon ?? <KeyboardArrowDownIcon fontSize='small' />}\r\n onClick={(e) => context.onPopperPanelChange(e.currentTarget, 'sortButton')}\r\n {...configs.sortButton?.wrapProps}\r\n {...props}\r\n >\r\n {text || 'Sort'}\r\n </SortButtonStyled>\r\n )\r\n })}\r\n </>\r\n )\r\n}\r\n\r\nconst SortButtonStyled = styled(Button)({\r\n height: 'var(--filter-bar-height, 40px)',\r\n padding: '0 16px',\r\n backgroundColor: colors.grey[50],\r\n border: '1px solid var(--color-divider, rgba(145 158 171 / 20%))',\r\n textTransform: 'none',\r\n fontWeight: 600,\r\n ':hover': {\r\n backgroundColor: colors.grey[100]\r\n }\r\n})\r\n//#endregion\r\n\r\n//#region Panel Not Found\r\nexport const PanelNotFound: FC<{ area?: string }> = ({ area }) => (\r\n <Box sx={{ padding: '8px', textAlign: 'center', border: '1px solid #ddd', borderRadius: '4px' }}>\r\n <Typography variant='body2' sx={{ padding: '8px' }}>\r\n No panel available for area: {area}\r\n </Typography>\r\n </Box>\r\n)\r\n//#endregion\r\n\r\n//#region Form\r\ninterface IFormContentProps {\r\n label: string\r\n notes?: any\r\n children?: React.ReactNode\r\n afterTopBar?: React.ReactNode\r\n}\r\n\r\nconst FormContent: FC<IFormContentProps> = ({ label, notes, children, afterTopBar }) => (\r\n <FormContentWrapper>\r\n <Box className='top-bar'>\r\n <Typography variant='subtitle2'>{label}</Typography>\r\n {afterTopBar && <Box className='after-top-bar'>{afterTopBar}</Box>}\r\n {notes && <FilterNotes title={`The ${label} includes`} disabledSize {...notes} />}\r\n </Box>\r\n <Box className='content'>{children}</Box>\r\n </FormContentWrapper>\r\n)\r\n\r\nconst FormContentWrapper = styled(Box)({\r\n minWidth: '200px',\r\n borderRadius: '4px',\r\n overflow: 'hidden',\r\n '.top-bar': {\r\n display: 'flex',\r\n alignItems: 'center',\r\n background: colors.grey[900],\r\n padding: '8px',\r\n gap: '8px',\r\n '.MuiTypography-root': {\r\n color: colors.common.white,\r\n flex: 1\r\n }\r\n },\r\n '.after-top-bar': {\r\n marginLeft: '8px'\r\n },\r\n '.content': {\r\n padding: '8px'\r\n }\r\n})\r\n//#endregion\r\n\r\n//#region Menu - String Type\r\ninterface IMenuWithTypeBaseProps {\r\n name: string\r\n validationResult?: IValidationResult\r\n}\r\n\r\ninterface IMenuWithTypeStringProps extends IMenuWithTypeBaseProps {\r\n fieldConfig?: IFilterBasicDef\r\n}\r\n\r\nexport const MenuWithTypeString: FC<IMenuWithTypeStringProps> = (props) => {\r\n const label = props.fieldConfig?.label ?? props.name\r\n return (\r\n <FormContent label={label} notes={props.fieldConfig?.notes}>\r\n <TextField\r\n autoFocus\r\n name={props.name}\r\n size='small'\r\n fullWidth\r\n error={!!props.validationResult?.hasError}\r\n helperText={props.validationResult?.message}\r\n />\r\n </FormContent>\r\n )\r\n}\r\n//#endregion\r\n\r\n//#region Menu - Select Type\r\nexport interface IMenuWithTypeSelectProps extends IMenuWithTypeBaseProps {\r\n fieldConfig?: IFilterSelectDef\r\n onChange?: (event: React.ChangeEvent<HTMLInputElement>) => void\r\n}\r\n\r\nexport const MenuWithTypeSelect: FC<IMenuWithTypeSelectProps> = (props) => {\r\n const label = props.fieldConfig?.label ?? props.name\r\n return (\r\n <FormContent label={label} notes={props.fieldConfig?.notes}>\r\n <CustomRadioGroup name={props.name} className={props.validationResult?.hasError ? 'error' : ''} onChange={props.onChange}>\r\n {props.fieldConfig?.options.map((x, i) => (\r\n <FormControlLabel key={x.value.toString() + i} value={x.value} control={<Radio />} label={x.label ?? x.value} />\r\n ))}\r\n </CustomRadioGroup>\r\n </FormContent>\r\n )\r\n}\r\n\r\nconst CustomRadioGroup = styled(RadioGroup)({\r\n marginLeft: '-8px',\r\n marginRight: '-8px',\r\n '&.error .MuiRadio-root': {\r\n color: '#d32f2f'\r\n },\r\n '.MuiFormControlLabel-root': {\r\n margin: 0\r\n },\r\n '.MuiFormControlLabel-root:hover': {\r\n backgroundColor: 'rgba(25, 118, 210, 0.04)'\r\n }\r\n})\r\n//#endregion\r\n\r\n//#region Menu - Select Multi Type\r\nexport interface IMenuWithTypeSelectMultiProps extends IMenuWithTypeBaseProps {\r\n fieldConfig?: IFilterSelectDef\r\n onChange?: (event: React.SyntheticEvent, checked: boolean) => void\r\n}\r\n\r\nexport const MenuWithTypeSelectMulti: FC<IMenuWithTypeSelectMultiProps> = (props) => {\r\n const [filterLogic, setFilterLogic] = useState<IFilterLogic>('and')\r\n const label = props.fieldConfig?.label ?? props.name\r\n return (\r\n <FormContent\r\n label={label}\r\n notes={props.fieldConfig?.notes}\r\n afterTopBar={<FilterLogicToggle value={filterLogic} onChange={(_, value) => setFilterLogic(value)} />}\r\n >\r\n {/* Hidden input for logic value */}\r\n <input type='hidden' name='filterLogic' value={filterLogic} />\r\n <CustomFormGroup className={props.validationResult?.hasError ? 'error' : ''}>\r\n {props.fieldConfig?.options.map((x, i) => (\r\n <FormControlLabel\r\n key={x.value.toString() + i}\r\n value={x.value}\r\n control={<Checkbox name={props.name} />}\r\n label={x.label ?? x.value}\r\n onChange={props.onChange}\r\n />\r\n ))}\r\n </CustomFormGroup>\r\n </FormContent>\r\n )\r\n}\r\n\r\nconst CustomFormGroup = styled(FormGroup)({\r\n marginLeft: '-8px',\r\n marginRight: '-8px',\r\n '&.error .MuiCheckbox-root': {\r\n color: '#d32f2f'\r\n },\r\n '.MuiFormControlLabel-root': {\r\n margin: 0\r\n },\r\n '.MuiFormControlLabel-root:hover': {\r\n backgroundColor: 'rgba(25, 118, 210, 0.04)'\r\n }\r\n})\r\n//#endregion\r\n\r\nfunction convertDateToCustomFormat(dateString: string): string {\r\n if (!dateString || !/^\\d{4}-\\d{2}-\\d{2}$/.test(dateString)) return ''\r\n return `${dateString}T00:00:00.0000000`\r\n}\r\n//#region Menu - Date Type\r\nexport interface IMenuWithTypeDateProps extends IMenuWithTypeBaseProps {\r\n fieldConfig?: IFilterDateDef\r\n}\r\n\r\nexport const MenuWithTypeDate: FC<IMenuWithTypeDateProps> = (props) => {\r\n const [dateLogic, setDateLogic] = useState<IFilterDateLogic>('before')\r\n const [value, setValue] = useState<string>('')\r\n const label = props.fieldConfig?.label ?? props.name\r\n return (\r\n <FormContent\r\n label={label}\r\n notes={props.fieldConfig?.notes}\r\n afterTopBar={<DateLogicToggle value={dateLogic} onChange={(_, value) => setDateLogic(value)} />}\r\n >\r\n <Box className='content'>\r\n {/* Hidden input for logic value */}\r\n <input type='hidden' name='dateLogic' value={dateLogic} />\r\n <input hidden type='text' name={props.name} readOnly value={convertDateToCustomFormat(value)} />\r\n <TextField\r\n autoFocus\r\n fullWidth\r\n type='date'\r\n size='small'\r\n value={value}\r\n onChange={(event) => setValue(event.target.value)}\r\n error={!!props.validationResult?.hasError}\r\n helperText={props.validationResult?.message}\r\n inputProps={{ min: props.fieldConfig?.minDate, max: props.fieldConfig?.maxDate }}\r\n />\r\n </Box>\r\n </FormContent>\r\n )\r\n}\r\n//#endregion\r\n\r\n//#region Menu - Date Range Type\r\nexport interface IMenuWithTypeDateRangeProps extends IMenuWithTypeBaseProps {\r\n fieldConfig?: IFilterDateDef\r\n}\r\n\r\nexport const MenuWithTypeDateRange: FC<IMenuWithTypeDateRangeProps> = (props) => {\r\n const [dateRangeLogic, setDateRangeLogic] = useState<IFilterDateRangeLogic>('between')\r\n const label = props.fieldConfig?.label ?? props.name\r\n return (\r\n <FormContent\r\n label={label}\r\n notes={props.fieldConfig?.notes}\r\n afterTopBar={<DateRangeLogicToggle value={dateRangeLogic} onChange={(_, value) => setDateRangeLogic(value)} />}\r\n >\r\n {/* Hidden input for logic value */}\r\n <input type='hidden' name='dateRangeLogic' value={dateRangeLogic} />\r\n <DateRangeContainer>\r\n <TextField\r\n autoFocus\r\n fullWidth\r\n name={`${props.name}_start`}\r\n type='date'\r\n size='small'\r\n label='From'\r\n error={!!props.validationResult?.hasError}\r\n sx={{ marginBottom: 1 }}\r\n InputLabelProps={{ shrink: true }}\r\n inputProps={{ min: props.fieldConfig?.minDate, max: props.fieldConfig?.maxDate }}\r\n />\r\n <TextField\r\n fullWidth\r\n name={`${props.name}_end`}\r\n type='date'\r\n size='small'\r\n label='To'\r\n error={!!props.validationResult?.hasError}\r\n helperText={props.validationResult?.message}\r\n InputLabelProps={{ shrink: true }}\r\n inputProps={{ min: props.fieldConfig?.minDate, max: props.fieldConfig?.maxDate }}\r\n />\r\n </DateRangeContainer>\r\n </FormContent>\r\n )\r\n}\r\n\r\nconst DateRangeContainer = styled(Box)({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: '8px'\r\n})\r\n//#endregion\r\n\r\n//#region Styled\r\nconst WrapIcon = styled(Box)({\r\n display: 'inline-flex',\r\n flex: '0 0 auto',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n '&:not(.disabled-size)': {\r\n width: '40px',\r\n height: '40px'\r\n }\r\n})\r\n\r\nconst WrapList = styled('ul')({\r\n paddingLeft: '1.7rem',\r\n marginBottom: 0,\r\n li: {\r\n position: 'relative',\r\n textAlign: 'justify',\r\n '&::before': {\r\n content: '\"►\"',\r\n display: 'block',\r\n position: 'absolute',\r\n top: '50%',\r\n right: 'calc(100% + 6px)',\r\n transform: 'translateY(-50%)',\r\n fontSize: '0.9em'\r\n }\r\n }\r\n})\r\n//#endregion\r\n"],"names":["mapSortConfigs","asc","title","icon","_jsx","ArrowUpwardIcon","fontSize","desc","ArrowDownwardIcon","FilterLogicToggle","props","_jsxs","ToggleButtonGroupCustom","size","value","exclusive","onChange","event","newValue","children","ToggleButton","DateLogicToggle","DateRangeLogicToggle","styled","ToggleButtonGroup","color","borderColor","fontWeight","lineHeight","minWidth","padding","backgroundColor","HelpTooltipContent","WrapList","items","map","item","index","Typography","component","variant","FilterNotes","_props$title","_props$items","WrapIcon","className","disabledSize","HelpTooltip","small","renderContent","FilterInput","React","forwardRef","ref","InputBase","_objectSpread","fullWidth","autoComplete","inputRef","FilterInputAdornment","InputAdornment","position","keyword","_Fragment","HelpButton","onClick","onEnterSearch","sx","display","xs","md","Tooltip","placement","arrow","IconButton","KeyboardReturnIcon","marginLeft","onClear","CloseIcon","notes","Button","textTransform","b","colors","blue","borderRadius","ClearAllButton","_ref","_objectWithoutProperties","_excluded","ClearButtonStyled","startIcon","ClearAllIcon","FilterButton","flex","FilterListIcon","SortButton","timeoutRef","useRef","mapDataViewContext","context","_filterState$sort","_configs$fields","_filterState$sort2","_filterState$sort3","_configs$sortButton","_configs$sortButton$i","_configs$sortButton3","_configs$sortButton4","_configs$sortButton2","filterState","configs","filterBarConfigs","config","sort","direction","fieldConfig","fields","field","text","label","toString","sortButton","ButtonGroup","SortButtonStyled","ShuffleIcon","e","stopPropagation","current","clearTimeout","setTimeout","_filterState$sort4","_filterState$sort5","currentDirection","newDirection","newSort","store","createFilterStore","changeSort","area","onFilterStateChange","build","handleSortButtonClick","wrapProps","p","onPopperPanelChange","currentTarget","KeyboardArrowDownIcon","endIcon","height","grey","border","PanelNotFound","_ref2","Box","textAlign","FormContent","_ref3","afterTopBar","FormContentWrapper","concat","overflow","alignItems","background","gap","common","white","MenuWithTypeString","_props$fieldConfig$la","_props$fieldConfig","_props$fieldConfig2","_props$validationResu","_props$validationResu2","name","TextField","autoFocus","error","validationResult","hasError","helperText","message","MenuWithTypeSelect","_props$fieldConfig$la2","_props$fieldConfig3","_props$fieldConfig4","_props$validationResu3","_props$fieldConfig5","CustomRadioGroup","options","x","i","_x$label","FormControlLabel","control","Radio","RadioGroup","marginRight","margin","MenuWithTypeSelectMulti","_props$fieldConfig$la3","_props$fieldConfig6","_props$fieldConfig7","_props$validationResu4","_props$fieldConfig8","_useState","useState","_useState2","_slicedToArray","filterLogic","setFilterLogic","_","type","CustomFormGroup","_x$label2","Checkbox","FormGroup","MenuWithTypeDate","_props$fieldConfig$la4","_props$fieldConfig9","_props$fieldConfig0","_props$validationResu5","_props$validationResu6","_props$fieldConfig1","_props$fieldConfig10","dateString","_useState3","_useState4","dateLogic","setDateLogic","_useState5","_useState6","setValue","hidden","readOnly","test","target","inputProps","min","minDate","max","maxDate","MenuWithTypeDateRange","_props$fieldConfig$la5","_props$fieldConfig11","_props$fieldConfig12","_props$validationResu7","_props$fieldConfig13","_props$fieldConfig14","_props$validationResu8","_props$validationResu9","_props$fieldConfig15","_props$fieldConfig16","_useState7","_useState8","dateRangeLogic","setDateRangeLogic","DateRangeContainer","marginBottom","InputLabelProps","shrink","flexDirection","justifyContent","width","paddingLeft","li","content","top","right","transform"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"create.form-base.js","sources":["../../src/form/create.form-base.tsx"],"sourcesContent":["import React, { Component, ComponentType, PropsWithChildren, ReactNode } from 'react'\r\nimport { Box, BoxProps, SxProps, Theme } from '@mui/material'\r\nimport { IFormBaseContext, ISetModelStateFunc } from './types'\r\nimport { convertFormDataToJson, getErrorFromResponse, singleValidate, trimAllStrings, validateMerge } from './helpers'\r\nimport FormValidator, { IPartialError, SingleRuleValidate } from './validator'\r\n\r\nexport interface IFormBaseSlots {\r\n formProps?: Omit<BoxProps, 'ref' | 'onSubmit' | 'component'>\r\n}\r\n\r\nexport interface IFormBaseConfigs<T> {\r\n validate?: FormValidator<Partial<T>>\r\n dataTrimed?: boolean\r\n dataGetter?: (data: Partial<T>) => Partial<T>\r\n}\r\n\r\nexport interface IFormBaseParams<T> extends IFormBaseConfigs<T> {}\r\n\r\nexport interface IFormBaseProps<T> extends PropsWithChildren, IFormBaseConfigs<T> {\r\n onSubmit: (data: Partial<T>, e: React.FormEvent<HTMLFormElement>) => Promise<void>\r\n slots?: IFormBaseSlots\r\n}\r\n\r\nexport interface IFormBaseState<T> {\r\n modelState?: Partial<T>\r\n messageErrors: IPartialError<T>\r\n}\r\n\r\nexport interface IFormBaseResult<T> {\r\n Form: ComponentType<IFormBaseProps<T>>\r\n Validator?: FormValidator<Partial<T>>\r\n Context: React.Context<IFormBaseContext<T>>\r\n mapContext: (params: (context: IFormBaseContext<T>) => JSX.Element) => JSX.Element\r\n}\r\n\r\nconst CreateFormBase = function <T>(params?: IFormBaseParams<T>): IFormBaseResult<T> {\r\n const FormBaseContext = React.createContext<IFormBaseContext<T>>({\r\n setModelState: () => {},\r\n messageErrors: {},\r\n onBlur: () => {},\r\n setError: () => {},\r\n removeError: () => {},\r\n clearErrorAll: () => {}\r\n })\r\n\r\n class FormBase extends Component<IFormBaseProps<T>, IFormBaseState<T>> {\r\n refForm: HTMLFormElement | null = null\r\n constructor(props: IFormBaseProps<T>) {\r\n super(props)\r\n this.validate = this.getValidate()\r\n this.state = { messageErrors: {} }\r\n }\r\n\r\n render() {\r\n return (\r\n <Box component='form' ref={(ref: HTMLFormElement) => (this.refForm = ref)} onSubmit={this.onSubmit}>\r\n <FormBaseContext.Provider value={this.mapContext()}>{this.props.children}</FormBaseContext.Provider>\r\n </Box>\r\n )\r\n }\r\n\r\n private mapContext = (): IFormBaseContext<T> => {\r\n const { setError, removeError, setModelState, clearErrorAll, onBlur } = this\r\n const { modelState, messageErrors } = this.state\r\n return { modelState, messageErrors, setError, onBlur, clearErrorAll, setModelState, removeError }\r\n }\r\n\r\n setModelState: ISetModelStateFunc<T> = (state) => {\r\n const obj = Object.assign({}, this.state.modelState, state)\r\n this.setState({ modelState: obj })\r\n }\r\n\r\n getValidate = (): FormValidator<Partial<T>> => {\r\n const defaultValidate = new FormValidator<Partial<T>>({})\r\n return validateMerge(defaultValidate, params?.validate, this.props.validate)\r\n }\r\n\r\n setError = (keyName: keyof T, message: string) => {\r\n const error = { [keyName]: [{ rule: SingleRuleValidate.Custom, message }] }\r\n this.setState({ messageErrors: Object.assign({}, this.state.messageErrors, error) })\r\n }\r\n\r\n removeError = (keyName: keyof T) => {\r\n const newErrors = { ...this.state.messageErrors }\r\n if (newErrors[keyName]) delete newErrors[keyName]\r\n this.setState({ messageErrors: newErrors })\r\n }\r\n\r\n clearErrorAll = () => {\r\n this.setState({ messageErrors: {} })\r\n }\r\n\r\n private validate: FormValidator<Partial<T>>\r\n onSubmit: React.FormEventHandler<HTMLFormElement> = async (e) => {\r\n e.preventDefault()\r\n const formData = new FormData(e.currentTarget as HTMLFormElement)\r\n const raw = convertFormDataToJson<T>(formData)\r\n // TODO: validate raw data\r\n const trimmed = trimAllStrings(raw)\r\n this.setState({ modelState: trimmed })\r\n const messageErrors = this.validate.run(trimmed) as IPartialError<T>\r\n if (messageErrors) {\r\n this.setState({ messageErrors: messageErrors })\r\n if (Object.keys(messageErrors).length > 0) return\r\n }\r\n await this.props.onSubmit(trimmed, e).catch((error) => {\r\n const messageError = getErrorFromResponse(error, trimmed)\r\n this.setState({ messageErrors: { ...this.state.messageErrors, ...(messageError || {}) } })\r\n })\r\n }\r\n\r\n onBlur = (keyName: keyof T) => {\r\n if (!this.refForm) return\r\n const { messageErrors } = this.state\r\n const formData = new FormData(this.refForm)\r\n const raw = convertFormDataToJson(formData)\r\n const trimmed = trimAllStrings(raw)\r\n this.setState({ modelState: trimmed })\r\n const error = singleValidate<T, Partial<T>>(keyName, trimmed, messageErrors, this.validate) || {}\r\n this.setState({ messageErrors: error as IPartialError<T> })\r\n }\r\n }\r\n\r\n return {\r\n Form: FormBase,\r\n Validator: params?.validate,\r\n Context: FormBaseContext,\r\n mapContext: (params: (context: IFormBaseContext<T>) => ReactNode) => <FormBaseContext.Consumer>{params}</FormBaseContext.Consumer>\r\n }\r\n}\r\nexport default CreateFormBase\r\n"],"names":["CreateFormBase","params","FormBaseContext","React","createContext","setModelState","messageErrors","onBlur","setError","removeError","clearErrorAll","FormBase","props","_this","_classCallCheck","_callSuper","_defineProperty","_this2","_this$state","state","modelState","obj","Object","assign","setState","defaultValidate","FormValidator","validateMerge","validate","keyName","message","error","rule","SingleRuleValidate","Custom","newErrors","_objectSpread","_ref","_asyncToGenerator","_regenerator","m","_callee","e","formData","raw","trimmed","w","_context","n","preventDefault","FormData","currentTarget","convertFormDataToJson","trimAllStrings","run","keys","length","a","onSubmit","messageError","getErrorFromResponse","_x","apply","this","arguments","refForm","singleValidate","getValidate","_inherits","Component","_createClass","key","value","_this3","_jsx","Box","component","ref","children","Provider","mapContext","Form","Validator","Context","Consumer"],"mappings":"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"}
1
+ {"version":3,"file":"create.form-base.js","sources":["../../src/form/create.form-base.tsx"],"sourcesContent":["import React, { Component, ComponentType, PropsWithChildren, ReactNode } from 'react'\r\nimport { Box, BoxProps } from '@mui/material'\r\nimport { IFormBaseContext, ISetModelStateFunc } from './types'\r\nimport { convertFormDataToJson, getErrorFromResponse, singleValidate, trimAllStrings, validateMerge } from './helpers'\r\nimport FormValidator, { IPartialError, SingleRuleValidate } from './validator'\r\n\r\nexport interface IFormBaseSlots {\r\n formProps?: Omit<BoxProps, 'ref' | 'onSubmit' | 'component'>\r\n}\r\n\r\nexport interface IFormBaseConfigs<T> {\r\n validate?: FormValidator<Partial<T>>\r\n dataTrimed?: boolean\r\n dataGetter?: (data: Partial<T>) => Partial<T>\r\n}\r\n\r\nexport interface IFormBaseParams<T> extends IFormBaseConfigs<T> {}\r\n\r\nexport interface IFormBaseProps<T> extends PropsWithChildren, IFormBaseConfigs<T> {\r\n onSubmit: (data: Partial<T>, e: React.FormEvent<HTMLFormElement>) => Promise<void>\r\n slots?: IFormBaseSlots\r\n}\r\n\r\nexport interface IFormBaseState<T> {\r\n modelState?: Partial<T>\r\n messageErrors: IPartialError<T>\r\n}\r\n\r\nexport interface IFormBaseResult<T> {\r\n Form: ComponentType<IFormBaseProps<T>>\r\n Validator?: FormValidator<Partial<T>>\r\n Context: React.Context<IFormBaseContext<T>>\r\n mapContext: (params: (context: IFormBaseContext<T>) => JSX.Element) => JSX.Element\r\n}\r\n\r\nconst CreateFormBase = function <T>(params?: IFormBaseParams<T>): IFormBaseResult<T> {\r\n const FormBaseContext = React.createContext<IFormBaseContext<T>>({\r\n setModelState: () => {},\r\n messageErrors: {},\r\n onBlur: () => {},\r\n setError: () => {},\r\n removeError: () => {},\r\n clearErrorAll: () => {}\r\n })\r\n\r\n class FormBase extends Component<IFormBaseProps<T>, IFormBaseState<T>> {\r\n refForm: HTMLFormElement | null = null\r\n constructor(props: IFormBaseProps<T>) {\r\n super(props)\r\n this.validate = this.getValidate()\r\n this.state = { messageErrors: {} }\r\n }\r\n\r\n render() {\r\n return (\r\n <Box component='form' ref={(ref: HTMLFormElement) => (this.refForm = ref)} onSubmit={this.onSubmit}>\r\n <FormBaseContext.Provider value={this.mapContext()}>{this.props.children}</FormBaseContext.Provider>\r\n </Box>\r\n )\r\n }\r\n\r\n private mapContext = (): IFormBaseContext<T> => {\r\n const { setError, removeError, setModelState, clearErrorAll, onBlur } = this\r\n const { modelState, messageErrors } = this.state\r\n return { modelState, messageErrors, setError, onBlur, clearErrorAll, setModelState, removeError }\r\n }\r\n\r\n setModelState: ISetModelStateFunc<T> = (state) => {\r\n const obj = Object.assign({}, this.state.modelState, state)\r\n this.setState({ modelState: obj })\r\n }\r\n\r\n getValidate = (): FormValidator<Partial<T>> => {\r\n const defaultValidate = new FormValidator<Partial<T>>({})\r\n return validateMerge(defaultValidate, params?.validate, this.props.validate)\r\n }\r\n\r\n setError = (keyName: keyof T, message: string) => {\r\n const error = { [keyName]: [{ rule: SingleRuleValidate.Custom, message }] }\r\n this.setState({ messageErrors: Object.assign({}, this.state.messageErrors, error) })\r\n }\r\n\r\n removeError = (keyName: keyof T) => {\r\n const newErrors = { ...this.state.messageErrors }\r\n if (newErrors[keyName]) delete newErrors[keyName]\r\n this.setState({ messageErrors: newErrors })\r\n }\r\n\r\n clearErrorAll = () => {\r\n this.setState({ messageErrors: {} })\r\n }\r\n\r\n private validate: FormValidator<Partial<T>>\r\n onSubmit: React.FormEventHandler<HTMLFormElement> = async (e) => {\r\n e.preventDefault()\r\n const formData = new FormData(e.currentTarget as HTMLFormElement)\r\n const raw = convertFormDataToJson<T>(formData)\r\n // TODO: validate raw data\r\n const trimmed = trimAllStrings(raw)\r\n this.setState({ modelState: trimmed })\r\n const messageErrors = this.validate.run(trimmed) as IPartialError<T>\r\n if (messageErrors) {\r\n this.setState({ messageErrors: messageErrors })\r\n if (Object.keys(messageErrors).length > 0) return\r\n }\r\n await this.props.onSubmit(trimmed, e).catch((error) => {\r\n const messageError = getErrorFromResponse(error, trimmed)\r\n this.setState({ messageErrors: { ...this.state.messageErrors, ...(messageError || {}) } })\r\n })\r\n }\r\n\r\n onBlur = (keyName: keyof T) => {\r\n if (!this.refForm) return\r\n const { messageErrors } = this.state\r\n const formData = new FormData(this.refForm)\r\n const raw = convertFormDataToJson(formData)\r\n const trimmed = trimAllStrings(raw)\r\n this.setState({ modelState: trimmed })\r\n const error = singleValidate<T, Partial<T>>(keyName, trimmed, messageErrors, this.validate) || {}\r\n this.setState({ messageErrors: error as IPartialError<T> })\r\n }\r\n }\r\n\r\n return {\r\n Form: FormBase,\r\n Validator: params?.validate,\r\n Context: FormBaseContext,\r\n mapContext: (params: (context: IFormBaseContext<T>) => ReactNode) => <FormBaseContext.Consumer>{params}</FormBaseContext.Consumer>\r\n }\r\n}\r\nexport default CreateFormBase\r\n"],"names":["CreateFormBase","params","FormBaseContext","React","createContext","setModelState","messageErrors","onBlur","setError","removeError","clearErrorAll","FormBase","props","_this","_classCallCheck","_callSuper","_defineProperty","_this2","_this$state","state","modelState","obj","Object","assign","setState","defaultValidate","FormValidator","validateMerge","validate","keyName","message","error","rule","SingleRuleValidate","Custom","newErrors","_objectSpread","_ref","_asyncToGenerator","_regenerator","m","_callee","e","formData","raw","trimmed","w","_context","n","preventDefault","FormData","currentTarget","convertFormDataToJson","trimAllStrings","run","keys","length","a","onSubmit","messageError","getErrorFromResponse","_x","apply","this","arguments","refForm","singleValidate","getValidate","_inherits","Component","_createClass","key","value","_this3","_jsx","Box","component","ref","children","Provider","mapContext","Form","Validator","Context","Consumer"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{inherits as n,createClass as r,classCallCheck as t,callSuper as e,defineProperty as a,asyncToGenerator as s,regenerator as u}from"../../_virtual/_rollupPluginBabelHelpers.js";import{fetchDelay as o}from"./helpers.js";import{createHttpService as i}from"./gateway.js";import c from"./service-base.js";var l=function(){function l(n){var r;return t(this,l),r=e(this,l,[i("".concat(process.env.REACT_APP_ADMIN_API||window.location.origin).concat(n))]),a(r,"all",(function(n,t,e){var a;return o(s(u().m((function e(){var a;return u().w((function(e){for(;;)switch(e.n){case 0:return e.n=1,r.tryPushNotify(r.post,"All",n,{headers:{"Content-Type":"application/json"},signal:t});case 1:return a=e.v,e.a(2,a)}}),e)}))),null!==(a=null==e?void 0:e.delay)&&void 0!==a?a:500)})),a(r,"single",(function(n,t){return o(s(u().m((function e(){var a;return u().w((function(e){for(;;)switch(e.n){case 0:return e.n=1,r.tryGet("Get",{params:{Id:n},signal:t});case 1:return a=e.v,e.a(2,a)}}),e)}))),500)})),a(r,"create",(function(n,t,e){var a;return o(s(u().m((function e(){var a;return u().w((function(e){for(;;)switch(e.n){case 0:return e.n=1,r.pushNotify(r.post,"Create",n,{signal:t});case 1:return a=e.v,e.a(2,a)}}),e)}))),null!==(a=null==e?void 0:e.delay)&&void 0!==a?a:500)})),a(r,"update",(function(n,t,e){return o(s(u().m((function a(){var s;return u().w((function(a){for(;;)switch(a.n){case 0:return a.n=1,r.pushNotify(r.put,"Update",t,{signal:e,params:{Id:n}});case 1:return s=a.v,a.a(2,s)}}),a)}))),500)})),a(r,"updatePatch",(function(n,t,e){return o(s(u().m((function a(){var s;return u().w((function(a){for(;;)switch(a.n){case 0:return a.n=1,r.pushNotify(r.patch,"Update",t,{signal:e,params:{Id:n}});case 1:return s=a.v,a.a(2,s)}}),a)}))),500)})),a(r,"remove",(function(n,t){return o(s(u().m((function e(){var a;return u().w((function(e){for(;;)switch(e.n){case 0:return e.n=1,r.pushNotify(r.delete,"Delete",{params:{Id:n},signal:t});case 1:return a=e.v,e.a(2,a)}}),e)}))),500)})),r}return n(l,c),r(l)}();export{l as default};
1
+ import{inherits as n,createClass as r,classCallCheck as t,callSuper as e,defineProperty as a,asyncToGenerator as s,regenerator as u}from"../../_virtual/_rollupPluginBabelHelpers.js";import{fetchDelay as o}from"./helpers.js";import{createHttpService as i}from"./gateway.js";import c from"./service-base.js";var l=function(){function l(n){var r;return t(this,l),r=e(this,l,[i("".concat(process.env.REACT_APP_ADMIN_API||window.location.origin).concat(n))]),a(r,"all",(function(n,t,e){var a;return o(s(u().m((function e(){var a;return u().w((function(e){for(;;)switch(e.n){case 0:return e.n=1,r.tryPushNotify(r.post,"All",n,{headers:{"Content-Type":"application/json"},signal:t});case 1:return a=e.v,e.a(2,a)}}),e)}))),null!==(a=null==e?void 0:e.delay)&&void 0!==a?a:500)})),a(r,"single",(function(n,t){return o(s(u().m((function e(){var a;return u().w((function(e){for(;;)switch(e.n){case 0:return e.n=1,r.tryGet("Get",{params:{Id:n},signal:t});case 1:return a=e.v,e.a(2,a)}}),e)}))),500)})),a(r,"create",(function(n,t,e){var a;return o(s(u().m((function e(){var a;return u().w((function(e){for(;;)switch(e.n){case 0:return e.n=1,r.pushNotify(r.post,"Create",n,{signal:t});case 1:return a=e.v,e.a(2,a)}}),e)}))),null!==(a=null==e?void 0:e.delay)&&void 0!==a?a:500)})),a(r,"update",(function(n,t,e){return o(s(u().m((function a(){var s;return u().w((function(a){for(;;)switch(a.n){case 0:return a.n=1,r.pushNotify(r.put,"Update",t,{signal:e,params:{Id:n}});case 1:return s=a.v,a.a(2,s)}}),a)}))),500)})),a(r,"updatePatch",(function(n,t,e){return o(s(u().m((function a(){var s;return u().w((function(a){for(;;)switch(a.n){case 0:return a.n=1,r.pushNotify(r.patch,"Patch",t,{signal:e,params:{Id:n}});case 1:return s=a.v,a.a(2,s)}}),a)}))),500)})),a(r,"remove",(function(n,t){return o(s(u().m((function e(){var a;return u().w((function(e){for(;;)switch(e.n){case 0:return e.n=1,r.pushNotify(r.delete,"Delete",{params:{Id:n},signal:t});case 1:return a=e.v,e.a(2,a)}}),e)}))),500)})),r}return n(l,c),r(l)}();export{l as default};
2
2
  //# sourceMappingURL=crud-service-base.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"crud-service-base.js","sources":["../../../src/http-service/base/crud-service-base.ts"],"sourcesContent":["import { fetchDelay } from './helpers'\r\nimport { createHttpService } from './gateway'\r\nimport type { IFilterModelSwagger, IReponseAll } from './types'\r\nimport ServiceBase from './service-base'\r\n\r\n/**\r\n * Base class for HTTP CRUD services.\r\n *\r\n * @template T - Entity type.\r\n * @template K - Entity ID type.\r\n *\r\n * Provides common methods:\r\n * - all: Get list with filter and pagination\r\n * - single: Get detail by ID\r\n * - create: Add new entity\r\n * - update: Update entity by ID\r\n * - remove: Delete entity by ID\r\n *\r\n * Supports request cancellation and artificial delay.\r\n */\r\nclass CRUDServiceBase<T, K> extends ServiceBase {\r\n constructor(baseUri: string) {\r\n super(createHttpService(`${process.env.REACT_APP_ADMIN_API || window.location.origin}${baseUri}`))\r\n }\r\n /**\r\n * Fetches a list of entities with optional filters and pagination.\r\n *\r\n * @param filters - Filters and pagination options.\r\n * @param signal - Optional AbortSignal for request cancellation.\r\n * @param options - Optional delay configuration.\r\n * @returns A promise resolving to the response containing the list of entities.\r\n */\r\n all = (filters: Partial<IFilterModelSwagger<T>>, signal?: AbortSignal, options?: { delay?: number }) => {\r\n return fetchDelay(async () => {\r\n const data = await this.tryPushNotify(this.post<IReponseAll<T>>, 'All', filters, {\r\n headers: { 'Content-Type': 'application/json' },\r\n signal\r\n })\r\n return data\r\n }, options?.delay ?? 500)\r\n }\r\n /**\r\n * Fetches a single entity by its ID.\r\n *\r\n * @param id - The ID of the entity to fetch.\r\n * @param signal - Optional AbortSignal for request cancellation.\r\n * @returns A promise resolving to the entity data.\r\n */\r\n single = (id: K, signal?: AbortSignal) => {\r\n return fetchDelay(async () => {\r\n const data = await this.tryGet<T>('Get', { params: { Id: id }, signal })\r\n return data\r\n }, 500)\r\n }\r\n /**\r\n * Creates a new entity.\r\n *\r\n * @param model - The entity data to create.\r\n * @param signal - Optional AbortSignal for request cancellation.\r\n * @param options - Optional delay configuration.\r\n * @returns A promise resolving to the created entity data.\r\n */\r\n create = (model: Partial<T>, signal?: AbortSignal, options?: { delay?: number }) => {\r\n return fetchDelay(async () => {\r\n const data = await this.pushNotify(this.post<T>, 'Create', model, { signal })\r\n return data\r\n }, options?.delay ?? 500)\r\n }\r\n /**\r\n * Updates an existing entity by its ID.\r\n *\r\n * @param id - The ID of the entity to update.\r\n * @param model - The partial entity data to update.\r\n * @param signal - Optional AbortSignal for request cancellation.\r\n * @returns A promise resolving to the updated entity data.\r\n */\r\n update = (id: K, model: Partial<T>, signal?: AbortSignal) => {\r\n return fetchDelay(async () => {\r\n const data = await this.pushNotify(this.put<T>, 'Update', model, { signal, params: { Id: id } })\r\n return data\r\n }, 500)\r\n }\r\n /**\r\n * HTTP PATCH request with automatic authentication\r\n *\r\n * @param id - The ID of the entity to update.\r\n * @param model - The partial entity data to update.\r\n * @param signal - Optional AbortSignal for request cancellation.\r\n * @returns A promise resolving to the updated entity data.\r\n */\r\n updatePatch = (id: K, model: Partial<T>, signal?: AbortSignal) => {\r\n return fetchDelay(async () => {\r\n const data = await this.pushNotify(this.patch<T>, 'Update', model, { signal, params: { Id: id } })\r\n return data\r\n }, 500)\r\n }\r\n /**\r\n * Deletes an entity by its ID.\r\n *\r\n * @param id - The ID of the entity to delete.\r\n * @param signal - Optional AbortSignal for request cancellation.\r\n * @returns A promise resolving to the deletion response.\r\n */\r\n remove = (id: K, signal?: AbortSignal) => {\r\n return fetchDelay(async () => {\r\n const data = await this.pushNotify(this.delete<T>, 'Delete', { params: { Id: id }, signal })\r\n return data\r\n }, 500)\r\n }\r\n}\r\n\r\nexport default CRUDServiceBase\r\n"],"names":["CRUDServiceBase","baseUri","_this","_classCallCheck","_callSuper","this","createHttpService","concat","process","env","REACT_APP_ADMIN_API","window","location","origin","_defineProperty","filters","signal","options","_options$delay","fetchDelay","_asyncToGenerator","_regenerator","m","_callee","data","w","_context","n","tryPushNotify","post","headers","v","a","delay","id","_callee2","_context2","tryGet","params","Id","model","_options$delay2","_callee3","_context3","pushNotify","_callee4","_context4","put","_callee5","_context5","patch","_callee6","_context6","_inherits","ServiceBase","_createClass"],"mappings":"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"}
1
+ {"version":3,"file":"crud-service-base.js","sources":["../../../src/http-service/base/crud-service-base.ts"],"sourcesContent":["import { fetchDelay } from './helpers'\r\nimport { createHttpService } from './gateway'\r\nimport type { IFilterModelSwagger, IReponseAll } from './types'\r\nimport ServiceBase from './service-base'\r\n\r\n/**\r\n * Base class for HTTP CRUD services.\r\n *\r\n * @template T - Entity type.\r\n * @template K - Entity ID type.\r\n *\r\n * Provides common methods:\r\n * - all: Get list with filter and pagination\r\n * - single: Get detail by ID\r\n * - create: Add new entity\r\n * - update: Update entity by ID\r\n * - remove: Delete entity by ID\r\n *\r\n * Supports request cancellation and artificial delay.\r\n */\r\nclass CRUDServiceBase<T, K> extends ServiceBase {\r\n constructor(baseUri: string) {\r\n super(createHttpService(`${process.env.REACT_APP_ADMIN_API || window.location.origin}${baseUri}`))\r\n }\r\n /**\r\n * Fetches a list of entities with optional filters and pagination.\r\n *\r\n * @param filters - Filters and pagination options.\r\n * @param signal - Optional AbortSignal for request cancellation.\r\n * @param options - Optional delay configuration.\r\n * @returns A promise resolving to the response containing the list of entities.\r\n */\r\n all = (filters: Partial<IFilterModelSwagger<T>>, signal?: AbortSignal, options?: { delay?: number }) => {\r\n return fetchDelay(async () => {\r\n const data = await this.tryPushNotify(this.post<IReponseAll<T>>, 'All', filters, {\r\n headers: { 'Content-Type': 'application/json' },\r\n signal\r\n })\r\n return data\r\n }, options?.delay ?? 500)\r\n }\r\n /**\r\n * Fetches a single entity by its ID.\r\n *\r\n * @param id - The ID of the entity to fetch.\r\n * @param signal - Optional AbortSignal for request cancellation.\r\n * @returns A promise resolving to the entity data.\r\n */\r\n single = (id: K, signal?: AbortSignal) => {\r\n return fetchDelay(async () => {\r\n const data = await this.tryGet<T>('Get', { params: { Id: id }, signal })\r\n return data\r\n }, 500)\r\n }\r\n /**\r\n * Creates a new entity.\r\n *\r\n * @param model - The entity data to create.\r\n * @param signal - Optional AbortSignal for request cancellation.\r\n * @param options - Optional delay configuration.\r\n * @returns A promise resolving to the created entity data.\r\n */\r\n create = (model: Partial<T>, signal?: AbortSignal, options?: { delay?: number }) => {\r\n return fetchDelay(async () => {\r\n const data = await this.pushNotify(this.post<T>, 'Create', model, { signal })\r\n return data\r\n }, options?.delay ?? 500)\r\n }\r\n /**\r\n * Updates an existing entity by its ID.\r\n *\r\n * @param id - The ID of the entity to update.\r\n * @param model - The partial entity data to update.\r\n * @param signal - Optional AbortSignal for request cancellation.\r\n * @returns A promise resolving to the updated entity data.\r\n */\r\n update = (id: K, model: Partial<T>, signal?: AbortSignal) => {\r\n return fetchDelay(async () => {\r\n const data = await this.pushNotify(this.put<T>, 'Update', model, { signal, params: { Id: id } })\r\n return data\r\n }, 500)\r\n }\r\n /**\r\n * HTTP PATCH request with automatic authentication\r\n *\r\n * @param id - The ID of the entity to update.\r\n * @param model - The partial entity data to update.\r\n * @param signal - Optional AbortSignal for request cancellation.\r\n * @returns A promise resolving to the updated entity data.\r\n */\r\n updatePatch = (id: K, model: Partial<T>, signal?: AbortSignal) => {\r\n return fetchDelay(async () => {\r\n const data = await this.pushNotify(this.patch<T>, 'Patch', model, { signal, params: { Id: id } })\r\n return data\r\n }, 500)\r\n }\r\n /**\r\n * Deletes an entity by its ID.\r\n *\r\n * @param id - The ID of the entity to delete.\r\n * @param signal - Optional AbortSignal for request cancellation.\r\n * @returns A promise resolving to the deletion response.\r\n */\r\n remove = (id: K, signal?: AbortSignal) => {\r\n return fetchDelay(async () => {\r\n const data = await this.pushNotify(this.delete<T>, 'Delete', { params: { Id: id }, signal })\r\n return data\r\n }, 500)\r\n }\r\n}\r\n\r\nexport default CRUDServiceBase\r\n"],"names":["CRUDServiceBase","baseUri","_this","_classCallCheck","_callSuper","this","createHttpService","concat","process","env","REACT_APP_ADMIN_API","window","location","origin","_defineProperty","filters","signal","options","_options$delay","fetchDelay","_asyncToGenerator","_regenerator","m","_callee","data","w","_context","n","tryPushNotify","post","headers","v","a","delay","id","_callee2","_context2","tryGet","params","Id","model","_options$delay2","_callee3","_context3","pushNotify","_callee4","_context4","put","_callee5","_context5","patch","_callee6","_context6","_inherits","ServiceBase","_createClass"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{objectSpread2 as e,asyncToGenerator as r,regenerator as n,createForOfIteratorHelper as t}from"../../_virtual/_rollupPluginBabelHelpers.js";import{colors as a}from"@mui/material";var u=["image/jpeg","image/png","image/svg+xml"],o=["application/pdf"],i=[].concat(u,o),c=function(e){return i.some((function(r){return r===e}))},l=function(e){return u.some((function(r){return r===e}))},s=function(e){return o.some((function(r){return r===e}))},f={old:{color:a.grey[500],label:"Current",count:0},new:{color:a.green[500],label:"New",count:0},deleted:{color:a.red[500],label:"Delete",count:0}},p=function(e){return e.reduce((function(e,r){var n=r.status||"old";return e[n]=(e[n]||0)+1,e}),{old:0,new:0,deleted:0})},m=function(e){return e.normalize("NFD").replace(/[\u0300-\u036f]/g,"").replace(/[^a-zA-Z0-9\s]/g,"").replace(/\s+/g," ").trim().replace(/\s/g,"-").toLowerCase()+"-"+(new Date).getTime().toString(36)},g=function(r,n){return e({id:m(r.name),name:r.name,type:l(r.type)?"image":s(r.type)?"pdf":"unknown",thumbnail:s(r.type)?"/images/pdf-default.webp":URL.createObjectURL(r),file:r},n)},b=function(e,r){var n=p(e),t=p(r);return JSON.stringify(n)!==JSON.stringify(t)},d=function(){var a=r(n().m((function r(a,u){var o,i,c,l,s,f;return n().w((function(r){for(;;)switch(r.n){case 0:if(u){r.n=1;break}return r.a(2,a);case 1:o=[],i=t(a),r.p=2,i.s();case 3:if((c=i.n()).done){r.n=10;break}if("new"!==(l=c.value).status||!l.file){r.n=8;break}return r.p=4,r.n=5,u(l.file);case 5:(s=r.v)&&s.url&&o.push(e(e({},l),{},{url:s.url,thumbnail:s.thumbnail,status:"old"})),r.n=7;break;case 6:r.p=6,r.v;case 7:r.n=9;break;case 8:o.push(l);case 9:r.n=3;break;case 10:r.n=12;break;case 11:r.p=11,f=r.v,i.e(f);case 12:return r.p=12,i.f(),r.f(12);case 13:return r.a(2,o)}}),r,null,[[4,6],[2,11,12,13]])})));return function(e,r){return a.apply(this,arguments)}}();export{i as allowFileTypes,u as allowImageTypes,o as allowPdfTypes,b as checkEqualQuality,d as fetchUploadNewFiles,g as fileToAttachItem,p as getAttachQuality,l as isImageFile,s as isPdfFile,c as isValidFileType,f as mapItemConfigs,m as toEnglishSlug};
2
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sources":["../../../src/lab/attach-widget/helpers.ts"],"sourcesContent":["import { colors } from '@mui/material'\r\nimport { AttachUploadFunction, IAttachItem, IAttachItemConfigs, IAttachItemStatus } from './types'\r\n\r\nexport const allowImageTypes = ['image/jpeg', 'image/png', 'image/svg+xml']\r\n\r\nexport const allowPdfTypes = ['application/pdf']\r\n\r\nexport const allowFileTypes = [...allowImageTypes, ...allowPdfTypes]\r\n\r\nexport const isValidFileType = (value?: string) => allowFileTypes.some((e) => e === value)\r\n\r\nexport const isImageFile = (value?: string) => allowImageTypes.some((e) => e === value)\r\n\r\nexport const isPdfFile = (value?: string) => allowPdfTypes.some((e) => e === value)\r\n\r\nexport const mapItemConfigs: IAttachItemConfigs = {\r\n old: { color: colors.grey[500], label: 'Current', count: 0 },\r\n new: { color: colors.green[500], label: 'New', count: 0 },\r\n deleted: { color: colors.red[500], label: 'Delete', count: 0 }\r\n}\r\n\r\nexport const getAttachQuality = (items: IAttachItem[]) => {\r\n return items.reduce<Record<IAttachItemStatus, number>>(\r\n (acc, item) => {\r\n const status = item.status || 'old'\r\n acc[status] = (acc[status] || 0) + 1\r\n return acc\r\n },\r\n { old: 0, new: 0, deleted: 0 }\r\n )\r\n}\r\n\r\nexport const toEnglishSlug = (str: string): string => {\r\n const temp = str\r\n .normalize('NFD') // split Vietnamese accents\r\n .replace(/[\\u0300-\\u036f]/g, '') // remove accents\r\n .replace(/[^a-zA-Z0-9\\s]/g, '') // remove special characters\r\n .replace(/\\s+/g, ' ') // replace multiple spaces with a single space\r\n .trim() // remove leading/trailing spaces\r\n .replace(/\\s/g, '-') // replace spaces with hyphens\r\n .toLowerCase()\r\n return temp + '-' + new Date().getTime().toString(36) // append timestamp to ensure uniqueness\r\n}\r\n\r\nexport const fileToAttachItem = (file: File, options?: Partial<IAttachItem>): IAttachItem => ({\r\n id: toEnglishSlug(file.name),\r\n name: file.name,\r\n type: isImageFile(file.type) ? 'image' : isPdfFile(file.type) ? 'pdf' : 'unknown',\r\n thumbnail: isPdfFile(file.type) ? '/images/pdf-default.webp' : URL.createObjectURL(file),\r\n file,\r\n ...options\r\n})\r\n\r\nexport const checkEqualQuality = (items1: IAttachItem[], items2: IAttachItem[]): boolean => {\r\n const quality = getAttachQuality(items1)\r\n const qualityCache = getAttachQuality(items2)\r\n return JSON.stringify(quality) !== JSON.stringify(qualityCache)\r\n}\r\n\r\n// Upload new items and return updated items with url, skip items if upload fails or returns empty\r\nexport const fetchUploadNewFiles = async (items: IAttachItem[], fetchUpload?: AttachUploadFunction): Promise<IAttachItem[]> => {\r\n if (!fetchUpload) return items\r\n\r\n const updated: IAttachItem[] = []\r\n for (const item of items) {\r\n if (item.status === 'new' && item.file) {\r\n try {\r\n const result = await fetchUpload(item.file)\r\n if (result && result.url) {\r\n updated.push({ ...item, url: result.url, thumbnail: result.thumbnail, status: 'old' })\r\n }\r\n // If result is empty or no url, skip this item\r\n } catch {\r\n // If upload fails, skip this item\r\n }\r\n } else {\r\n updated.push(item)\r\n }\r\n }\r\n return updated\r\n}\r\n"],"names":["allowImageTypes","allowPdfTypes","allowFileTypes","concat","isValidFileType","value","some","e","isImageFile","isPdfFile","mapItemConfigs","old","color","colors","grey","label","count","new","green","deleted","red","getAttachQuality","items","reduce","acc","item","status","toEnglishSlug","str","normalize","replace","trim","toLowerCase","Date","getTime","toString","fileToAttachItem","file","options","_objectSpread","id","name","type","thumbnail","URL","createObjectURL","checkEqualQuality","items1","items2","quality","qualityCache","JSON","stringify","fetchUploadNewFiles","_ref","_asyncToGenerator","_regenerator","m","_callee","fetchUpload","updated","_iterator","_step","result","_t2","w","_context","n","a","_createForOfIteratorHelper","p","s","done","v","url","push","f","_x","_x2","apply","this","arguments"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{inherits as e,createClass as t,objectSpread2 as a,classCallCheck as r,callSuper as n,defineProperty as i,asyncToGenerator as o,regenerator as s,toConsumableArray as l}from"../../_virtual/_rollupPluginBabelHelpers.js";import{jsxs as c,jsx as d}from"react/jsx-runtime";import h,{Component as u}from"react";import{Typography as m,Stack as p,Tooltip as g,IconButton as f,Divider as v,Grid as C,CircularProgress as y}from"@mui/material";import D from"@mui/icons-material/Save";import S from"@mui/icons-material/Close";import b from"@mui/icons-material/Replay";import k from"@mui/icons-material/Square";import I from"@mui/icons-material/Remove";import w from"@mui/icons-material/AttachFile";import{attachModalClasses as N,AttachModalStyled as j}from"./styled.js";import{getAttachQuality as F,mapItemConfigs as L,checkEqualQuality as x,allowFileTypes as H,fetchUploadNewFiles as R,isValidFileType as A,fileToAttachItem as z}from"./helpers.js";var O=function(){function O(e){var t;return r(this,O),t=n(this,O,[e]),i(t,"onSaveHandler",o(s().m((function e(){var a;return s().w((function(e){for(;;)switch(e.n){case 0:if(t.props.onChange){e.n=1;break}return e.a(2);case 1:if(t.setState({isLoading:!0}),a=l(t.attachItems),!t.props.uploadFile){e.n=3;break}return e.n=2,R(a,t.props.uploadFile);case 2:a=e.v;case 3:t.setState({isLoading:!1}),t.props.onChange(a,{isSave:!0}),t.props.onClose&&t.props.onClose();case 4:return e.a(2)}}),e)})))),i(t,"onFileChangeHandler",(function(e){var a=e.filter((function(e){return A(e.type)}));if(!(a.length<1)){var r=a.map((function(e){return z(e,{status:"new"})})),n=[].concat(l(r),l(t.attachItems));t.setState({attachs:n})}})),i(t,"handleTriggerDeleteItemClick",(function(e){var r=t.attachItems.reduce((function(t,r){var n=a({},r);if(n.id===e.id){if("new"===n.status)return t;n.status="deleted"===n.status?"old":"deleted"}return t.push(n),t}),[]);t.setState({attachs:r})})),i(t,"fileInputRef",h.createRef()),i(t,"handleIconClick",(function(){var e;null===(e=t.fileInputRef.current)||void 0===e||e.click()})),i(t,"handleFileChange",(function(e){var a=e.target.files;a&&a.length>0&&t.onFileChangeHandler(Array.from(a))})),i(t,"dragCounter",0),i(t,"handleDragEnter",(function(){t.dragCounter++,t.setState({isDragging:!0})})),i(t,"handleDragLeave",(function(){t.dragCounter--,0===t.dragCounter&&t.setState({isDragging:!1})})),i(t,"handleDragOver",(function(e){e.preventDefault()})),i(t,"handleDrop",(function(e){if(e.preventDefault(),e.stopPropagation(),t.state.isDragging){t.setState({isDragging:!1});var a=Array.from(e.dataTransfer.files);a.length>0&&t.onFileChangeHandler(a)}})),t.state={attachs:l(e.value),isDragging:!1,isLoading:!1},t}return e(O,u),t(O,[{key:"attachItems",get:function(){return this.state.attachs}},{key:"attachItemConfigs",get:function(){var e=F(this.attachItems);return Object.keys(L).map((function(t){var r=a({},L[t]);return r.count=e[t],r}))}},{key:"render",value:function(){var e=this,t=this.state.isDragging,a=x(this.attachItems,this.props.value),r=[N.root];return t&&!this.state.isLoading&&r.push(N.dragging),this.state.isLoading&&r.push(N.loading),c(j,{className:r.join(" "),onDragEnter:this.handleDragEnter,onDragLeave:this.handleDragLeave,onDragOver:this.handleDragOver,onDrop:this.handleDrop,children:[c("div",{className:N.header,children:[c("div",{children:[d(m,{variant:"h6",noWrap:!0,children:"Attach File"}),d(m,{variant:"body2",noWrap:!0,color:"text.secondary",children:"Data will only be updated after you click the Save button"})]}),c(p,{direction:"row",spacing:1,children:[d("input",{ref:this.fileInputRef,type:"file",hidden:!0,multiple:!0,onChange:this.handleFileChange,accept:H.join(",")}),d(g,{title:"Add files",arrow:!0,children:d(f,{color:"primary",onClick:this.handleIconClick,children:d(w,{})})}),d(g,{title:a?"Save":"Unsaved changes",arrow:!0,children:d("span",{children:d(f,{color:"primary",onClick:this.onSaveHandler,disabled:!a,children:d(D,{})})})}),d(g,{title:"Close",arrow:!0,children:d(f,{color:"secondary",onClick:this.props.onClose,children:d(S,{})})})]})]}),d(v,{}),c("div",{className:N.content,children:[this.attachItems.length<1&&d(p,{className:N.emptyState,children:d(m,{variant:"body2",color:"text.secondary",children:"Drag and drop files here or click to browse"})}),d(C,{container:!0,spacing:1.5,children:this.attachItems.map((function(t,a){var r=[N.item];return"deleted"===t.status?r.push(N.itemDelete):"new"===t.status&&r.push(N.itemNew),d(C,{item:!0,xs:6,sm:4,md:3,lg:2,children:c("div",{className:r.join(" "),children:[c("div",{className:N.itemHeader,children:[d(m,{variant:"body1",noWrap:!0,children:t.name}),d(g,{title:"deleted"===t.status?"Restore":"Delete",arrow:!0,children:d(f,{size:"small",color:"deleted"===t.status?"primary":"secondary",onClick:function(){return e.handleTriggerDeleteItemClick(t)},children:"deleted"===t.status?d(b,{fontSize:"small"}):d(I,{fontSize:"small"})})})]}),d("div",{className:N.itemContent,children:d("img",{src:t.thumbnail||t.url,alt:t.name})})]})},t.id+a.toString())}))})]}),d(v,{}),d("div",{className:N.footer,children:this.attachItemConfigs.map((function(e){var t=e.count||0;return c(p,{direction:"row",gap:.5,alignItems:"center",children:[d(k,{fontSize:"small",sx:{color:e.color}}),c(m,{variant:"body2",children:[e.label," (",t,")s"]})]},e.label)}))}),d("div",{className:N.dragPanel,children:d("div",{children:d(m,{variant:"body2",color:"primary",sx:{fontWeight:600},children:"Drop files here to upload"})})}),d("div",{className:N.overlay,children:d(y,{size:36})})]})}}])}();export{O as default};
2
+ //# sourceMappingURL=modal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modal.js","sources":["../../../src/lab/attach-widget/modal.tsx"],"sourcesContent":["import React, { Component } from 'react'\r\nimport { CircularProgress, Divider, Grid, IconButton, Stack, Tooltip, Typography } from '@mui/material'\r\nimport SaveIcon from '@mui/icons-material/Save'\r\nimport CloseIcon from '@mui/icons-material/Close'\r\nimport ReplayIcon from '@mui/icons-material/Replay'\r\nimport SquareIcon from '@mui/icons-material/Square'\r\nimport RemoveIcon from '@mui/icons-material/Remove'\r\nimport AttachFileIcon from '@mui/icons-material/AttachFile'\r\nimport { attachModalClasses, AttachModalStyled } from './styled'\r\nimport { allowFileTypes, checkEqualQuality, fetchUploadNewFiles } from './helpers'\r\nimport { fileToAttachItem, getAttachQuality, isValidFileType, mapItemConfigs } from './helpers'\r\nimport { AttachChangeFunction, AttachUploadFunction, IAttachItem, IAttachItemConfig, IAttachItemStatus } from './types'\r\n\r\ninterface IAttachModalProps {\r\n value: IAttachItem[]\r\n onChange?: AttachChangeFunction\r\n uploadFile?: AttachUploadFunction\r\n onClose?: () => void\r\n}\r\n\r\ninterface IAttachModalState {\r\n attachs: IAttachItem[]\r\n isDragging: boolean\r\n isLoading: boolean\r\n}\r\n\r\nclass AttachModal extends Component<IAttachModalProps, IAttachModalState> {\r\n constructor(props: IAttachModalProps) {\r\n super(props)\r\n this.state = { attachs: [...props.value], isDragging: false, isLoading: false }\r\n }\r\n\r\n get attachItems() {\r\n return this.state.attachs\r\n }\r\n\r\n get attachItemConfigs(): IAttachItemConfig[] {\r\n const temp = getAttachQuality(this.attachItems)\r\n const list = Object.keys(mapItemConfigs) as IAttachItemStatus[]\r\n return list.map((key) => {\r\n const config = { ...mapItemConfigs[key] }\r\n config.count = temp[key]\r\n return config\r\n })\r\n }\r\n\r\n render() {\r\n const { isDragging } = this.state\r\n const isSave = checkEqualQuality(this.attachItems, this.props.value)\r\n const rootClasses = [attachModalClasses.root]\r\n if (isDragging && !this.state.isLoading) rootClasses.push(attachModalClasses.dragging)\r\n if (this.state.isLoading) rootClasses.push(attachModalClasses.loading)\r\n\r\n return (\r\n <AttachModalStyled\r\n className={rootClasses.join(' ')}\r\n onDragEnter={this.handleDragEnter}\r\n onDragLeave={this.handleDragLeave}\r\n onDragOver={this.handleDragOver}\r\n onDrop={this.handleDrop}\r\n >\r\n <div className={attachModalClasses.header}>\r\n <div>\r\n <Typography variant='h6' noWrap>\r\n Attach File\r\n </Typography>\r\n <Typography variant='body2' noWrap color='text.secondary'>\r\n Data will only be updated after you click the Save button\r\n </Typography>\r\n </div>\r\n <Stack direction='row' spacing={1}>\r\n <input ref={this.fileInputRef} type='file' hidden multiple onChange={this.handleFileChange} accept={allowFileTypes.join(',')} />\r\n <Tooltip title='Add files' arrow>\r\n <IconButton color='primary' onClick={this.handleIconClick}>\r\n <AttachFileIcon />\r\n </IconButton>\r\n </Tooltip>\r\n <Tooltip title={isSave ? 'Save' : 'Unsaved changes'} arrow>\r\n <span>\r\n <IconButton color='primary' onClick={this.onSaveHandler} disabled={!isSave}>\r\n <SaveIcon />\r\n </IconButton>\r\n </span>\r\n </Tooltip>\r\n <Tooltip title='Close' arrow>\r\n <IconButton color='secondary' onClick={this.props.onClose}>\r\n <CloseIcon />\r\n </IconButton>\r\n </Tooltip>\r\n </Stack>\r\n </div>\r\n <Divider />\r\n <div className={attachModalClasses.content}>\r\n {this.attachItems.length < 1 && (\r\n <Stack className={attachModalClasses.emptyState}>\r\n <Typography variant='body2' color='text.secondary'>\r\n Drag and drop files here or click to browse\r\n </Typography>\r\n </Stack>\r\n )}\r\n <Grid container spacing={1.5}>\r\n {this.attachItems.map((x, i) => {\r\n const itemClasses = [attachModalClasses.item]\r\n\r\n if (x.status === 'deleted') itemClasses.push(attachModalClasses.itemDelete)\r\n else if (x.status === 'new') itemClasses.push(attachModalClasses.itemNew)\r\n\r\n return (\r\n <Grid key={x.id + i.toString()} item xs={6} sm={4} md={3} lg={2}>\r\n <div className={itemClasses.join(' ')}>\r\n <div className={attachModalClasses.itemHeader}>\r\n <Typography variant='body1' noWrap>\r\n {x.name}\r\n </Typography>\r\n <Tooltip title={x.status === 'deleted' ? 'Restore' : 'Delete'} arrow>\r\n <IconButton\r\n size='small'\r\n color={x.status === 'deleted' ? 'primary' : 'secondary'}\r\n onClick={() => this.handleTriggerDeleteItemClick(x)}\r\n >\r\n {x.status === 'deleted' ? <ReplayIcon fontSize='small' /> : <RemoveIcon fontSize='small' />}\r\n </IconButton>\r\n </Tooltip>\r\n </div>\r\n <div className={attachModalClasses.itemContent}>\r\n <img src={x.thumbnail || x.url} alt={x.name} />\r\n </div>\r\n </div>\r\n </Grid>\r\n )\r\n })}\r\n </Grid>\r\n </div>\r\n <Divider />\r\n <div className={attachModalClasses.footer}>\r\n {this.attachItemConfigs.map((config) => {\r\n const count = config.count || 0\r\n return (\r\n <Stack key={config.label} direction='row' gap={0.5} alignItems='center'>\r\n <SquareIcon fontSize='small' sx={{ color: config.color }} />\r\n <Typography variant='body2'>\r\n {config.label} ({count})s\r\n </Typography>\r\n </Stack>\r\n )\r\n })}\r\n </div>\r\n <div className={attachModalClasses.dragPanel}>\r\n <div>\r\n <Typography variant='body2' color='primary' sx={{ fontWeight: 600 }}>\r\n Drop files here to upload\r\n </Typography>\r\n </div>\r\n </div>\r\n <div className={attachModalClasses.overlay}>\r\n <CircularProgress size={36} />\r\n </div>\r\n </AttachModalStyled>\r\n )\r\n }\r\n\r\n onSaveHandler = async () => {\r\n if (!this.props.onChange) return\r\n\r\n this.setState({ isLoading: true })\r\n let updatedItems = [...this.attachItems]\r\n\r\n if (this.props.uploadFile) {\r\n updatedItems = await fetchUploadNewFiles(updatedItems, this.props.uploadFile)\r\n }\r\n\r\n this.setState({ isLoading: false })\r\n this.props.onChange(updatedItems, { isSave: true })\r\n if (this.props.onClose) this.props.onClose()\r\n }\r\n\r\n onFileChangeHandler = (files: File[]) => {\r\n const validFiles = files.filter((f) => isValidFileType(f.type))\r\n if (validFiles.length < 1) return\r\n const items = validFiles.map((x) => fileToAttachItem(x, { status: 'new' }))\r\n const newItems = [...items, ...this.attachItems]\r\n this.setState({ attachs: newItems }) // Update state directly to avoid memory leaks\r\n }\r\n\r\n handleTriggerDeleteItemClick = (item: IAttachItem) => {\r\n const updatedItems = this.attachItems.reduce<IAttachItem[]>((a, b) => {\r\n const obj = { ...b }\r\n if (obj.id === item.id) {\r\n if (obj.status === 'new') return a // Do not delete new item, they are not saved yet\r\n obj.status = obj.status === 'deleted' ? 'old' : 'deleted'\r\n }\r\n a.push(obj)\r\n return a\r\n }, [])\r\n this.setState({ attachs: updatedItems }) // Update state directly to avoid memory leaks\r\n }\r\n\r\n fileInputRef = React.createRef<HTMLInputElement>()\r\n handleIconClick = () => {\r\n this.fileInputRef.current?.click()\r\n }\r\n\r\n handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const files = e.target.files\r\n if (files && files.length > 0) {\r\n this.onFileChangeHandler(Array.from(files))\r\n }\r\n }\r\n\r\n dragCounter = 0\r\n handleDragEnter = () => {\r\n this.dragCounter++\r\n this.setState({ isDragging: true })\r\n }\r\n\r\n handleDragLeave = () => {\r\n this.dragCounter--\r\n if (this.dragCounter === 0) {\r\n this.setState({ isDragging: false })\r\n }\r\n }\r\n\r\n handleDragOver = (e: React.DragEvent) => {\r\n e.preventDefault()\r\n }\r\n\r\n handleDrop = (e: React.DragEvent) => {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n if (!this.state.isDragging) return // If not dragging, do nothing\r\n this.setState({ isDragging: false })\r\n const files = Array.from(e.dataTransfer.files)\r\n if (files.length > 0) {\r\n this.onFileChangeHandler(files)\r\n }\r\n }\r\n}\r\nexport default AttachModal\r\n"],"names":["AttachModal","props","_this","_classCallCheck","_callSuper","_defineProperty","_asyncToGenerator","_regenerator","m","_callee","updatedItems","w","_context","n","onChange","a","setState","isLoading","_toConsumableArray","attachItems","uploadFile","fetchUploadNewFiles","v","isSave","onClose","files","validFiles","filter","f","isValidFileType","type","length","items","map","x","fileToAttachItem","status","newItems","concat","attachs","item","reduce","b","obj","_objectSpread","id","push","React","createRef","_this$fileInputRef$cu","fileInputRef","current","click","e","target","onFileChangeHandler","Array","from","dragCounter","isDragging","preventDefault","stopPropagation","state","dataTransfer","value","_inherits","Component","_createClass","key","get","this","temp","getAttachQuality","Object","keys","mapItemConfigs","config","count","_this2","checkEqualQuality","rootClasses","attachModalClasses","root","dragging","loading","_jsxs","AttachModalStyled","className","join","onDragEnter","handleDragEnter","onDragLeave","handleDragLeave","onDragOver","handleDragOver","onDrop","handleDrop","children","header","_jsx","Typography","variant","noWrap","color","Stack","direction","spacing","ref","hidden","multiple","handleFileChange","accept","allowFileTypes","Tooltip","title","arrow","IconButton","onClick","handleIconClick","AttachFileIcon","onSaveHandler","disabled","SaveIcon","CloseIcon","Divider","content","emptyState","Grid","container","i","itemClasses","itemDelete","itemNew","xs","sm","md","lg","itemHeader","name","size","handleTriggerDeleteItemClick","ReplayIcon","fontSize","RemoveIcon","itemContent","src","thumbnail","url","alt","toString","footer","attachItemConfigs","gap","alignItems","SquareIcon","sx","label","dragPanel","fontWeight","overlay","CircularProgress"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{defineProperty as t}from"../../_virtual/_rollupPluginBabelHelpers.js";import{styled as e,alpha as i,Box as o}from"@mui/material";import{mapItemConfigs as a}from"./helpers.js";var r={root:"AttachWidget-root",content:"AttachWidget-content",dragging:"AttachWidget-dragging",dragPanel:"AttachWidget-dragPanel",inputButton:"AttachWidget-inputButton",moreButton:"AttachWidget-moreButton",list:"AttachWidget-list",listItem:"AttachWidget-listItem",overlay:"AttachWidget-overlay",loading:"AttachWidget-loading"},n=function(t,e){return"".concat((null==e?void 0:e.prefix)||"",".").concat(r[t]).concat((null==e?void 0:e.suffix)||"")},d=e("div")((function(e){var o,a=e.theme;return t(t(t(t(t(t(t(t(t(t(o={},n("root",{prefix:"&"}),{position:"relative",width:"100%",height:"100%",backgroundColor:a.palette.common.white,borderRadius:a.shape.borderRadius}),n("content"),{width:"100%",height:"100%",display:"flex",alignItems:"center",justifyContent:"flex-start",padding:a.spacing(1)}),n("list"),{height:"100%",flex:1,display:"flex",alignItems:"center",gap:a.spacing(.75),overflow:"hidden",minWidth:0,position:"relative","&::after":{content:'""',height:"100%",width:"30px",position:"absolute",right:0,top:0,zIndex:1,background:"linear-gradient(to right, transparent, #ffffffb0, #ffffff)"}}),n("listItem"),{width:"var(--attach-widget-list-item-width, 42px)",padding:0,aspectRatio:"5 / 7",borderRadius:a.shape.borderRadius,border:"1px solid "+a.palette.divider,boxShadow:"rgba(99, 99, 99, 0.2) 0px 2px 8px 0px",img:{width:"100%",height:"100%",objectFit:"cover"}}),n("inputButton"),{width:"var(--attach-widget-list-item-width, 42px)",aspectRatio:"5 / 7",padding:0,cursor:"pointer",color:a.palette.primary.main,borderRadius:a.shape.borderRadius,border:"1px dashed "+a.palette.primary.main,marginRight:a.spacing(1),"&:hover":{color:a.palette.primary.dark}}),n("moreButton"),{opacity:.5,transition:"opacity 0.3s ease-in-out"}),n("dragPanel"),{position:"absolute",top:0,left:0,right:0,bottom:0,padding:a.spacing(.75),backgroundColor:a.palette.common.white,pointerEvents:"none",borderRadius:a.shape.borderRadius,display:"flex",opacity:0,zIndex:1,transition:"opacity 0.3s ease-in-out","& > div":{flex:1,display:"flex",alignItems:"center",justifyContent:"center",border:"2px dashed "+a.palette.primary.main,borderRadius:a.shape.borderRadius}}),n("overlay"),{position:"absolute",top:0,left:0,right:0,bottom:0,backgroundColor:i(a.palette.common.white,.5),zIndex:1,opacity:0,transition:"opacity 0.3s ease-in-out",visibility:"hidden",display:"flex",alignItems:"center",justifyContent:"center"}),n("loading",{prefix:"&"}),t({},n("overlay"),{opacity:1,visibility:"visible"})),n("dragging",{prefix:"&"}),t(t({},n("dragPanel"),{opacity:1}),n("content"),{pointerEvents:"none"})),t(o,n("root",{prefix:"&",suffix:":hover"}),t({},n("moreButton"),{opacity:1}))})),l={root:"AttachModal-root",header:"AttachModal-header",footer:"AttachModal-footer",loading:"AttachModal-loading",overlay:"AttachModal-overlay",dragging:"AttachModal-dragging",dragPanel:"AttachModal-dragPanel",content:"AttachModal-content",emptyState:"AttachModal-emptyState",closeButton:"AttachModal-closeButton",item:"AttachModal-item",itemHeader:"AttachModal-itemHeader",itemContent:"AttachModal-itemContent",itemNew:"AttachModal-itemNew",itemDelete:"AttachModal-itemDelete"},p=function(t,e){return"".concat((null==e?void 0:e.prefix)||"",".").concat(l[t]).concat((null==e?void 0:e.suffix)||"")},s=e(o)((function(e){var o,r,n,d,l=e.theme;return t(t(t(t(t(t(t(t(t(t(d={},p("root",{prefix:"&"}),{backgroundColor:l.palette.background.paper,borderRadius:l.shape.borderRadius,boxShadow:l.shadows[5],width:"calc(100vw - 48px)",maxHeight:"calc(100vh - 48px)",maxWidth:l.breakpoints.values.md,position:"relative",display:"flex",flexDirection:"column"}),p("header"),{display:"flex",justifyContent:"space-between",alignItems:"center",padding:l.spacing(1,2)}),p("footer"),{padding:l.spacing(1,2),display:"flex",alignItems:"center",gap:l.spacing(3)}),p("content"),{minHeight:"200px",padding:l.spacing(1),overflowY:"auto",height:"100%"}),p("emptyState"),{display:"flex",alignItems:"center",justifyContent:"center",height:"168px"}),p("itemContent"),{width:"100%",height:"100%",padding:0,borderRadius:l.shape.borderRadius,cursor:"pointer",backgroundColor:l.palette.background.paper,img:{width:"100%",height:"100%",objectFit:"cover"}}),p("itemHeader"),{marginTop:l.spacing(-.5),padding:l.spacing(.5,0),display:"flex",alignItems:"center",justifyContent:"space-between",".MuiTypography-root":{color:l.palette.common.white},".MuiIconButton-root":{backgroundColor:i(l.palette.common.white,.5),".MuiSvgIcon-root":{fontSize:"1rem"},"&:hover":{backgroundColor:l.palette.common.white}}}),p("item"),t(t({width:"var(--attach-modal-list-item-width, 100%)",aspectRatio:"5 / 7",display:"inline-block",position:"relative",backgroundColor:null===(o=a.old)||void 0===o?void 0:o.color,borderRadius:l.shape.borderRadius,padding:l.spacing(.5),boxShadow:"rgba(99, 99, 99, 0.2) 0px 2px 8px 0px"},p("itemNew",{prefix:"&"}),{backgroundColor:null===(r=a.new)||void 0===r?void 0:r.color}),p("itemDelete",{prefix:"&"}),{backgroundColor:null===(n=a.deleted)||void 0===n?void 0:n.color})),p("dragPanel"),{position:"absolute",borderRadius:l.shape.borderRadius,cursor:"pointer","& img":{width:"100%",height:"auto",borderRadius:4}}),p("dragPanel"),{position:"absolute",top:0,left:0,right:0,bottom:0,padding:l.spacing(.75),backgroundColor:l.palette.common.white,pointerEvents:"none",borderRadius:l.shape.borderRadius,display:"flex",opacity:0,zIndex:1,transition:"opacity 0.3s ease-in-out","& > div":{flex:1,display:"flex",alignItems:"center",justifyContent:"center",border:"2px dashed "+l.palette.primary.main,borderRadius:l.shape.borderRadius}}),t(t(t(d,p("dragging",{prefix:"&"}),t(t({},p("dragPanel"),{opacity:1}),p("content"),{pointerEvents:"none"})),p("overlay"),{position:"absolute",top:0,left:0,right:0,bottom:0,backgroundColor:i(l.palette.common.white,.5),zIndex:1,opacity:0,transition:"opacity 0.3s ease-in-out",visibility:"hidden",display:"flex",alignItems:"center",justifyContent:"center"}),p("loading",{prefix:"&"}),t({},p("overlay"),{opacity:1,visibility:"visible"}))}));export{s as AttachModalStyled,d as AttachWidgetStyled,l as attachModalClasses,r as attachWidgetClasses};
2
+ //# sourceMappingURL=styled.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styled.js","sources":["../../../src/lab/attach-widget/styled.tsx"],"sourcesContent":["import { alpha, Box, styled } from '@mui/material'\r\nimport { mapItemConfigs } from './helpers'\r\n\r\n//#region Attach Widget\r\nexport const attachWidgetClasses = {\r\n root: 'AttachWidget-root',\r\n content: 'AttachWidget-content',\r\n dragging: 'AttachWidget-dragging',\r\n dragPanel: 'AttachWidget-dragPanel',\r\n inputButton: 'AttachWidget-inputButton',\r\n moreButton: 'AttachWidget-moreButton',\r\n list: 'AttachWidget-list',\r\n listItem: 'AttachWidget-listItem',\r\n overlay: 'AttachWidget-overlay',\r\n loading: 'AttachWidget-loading'\r\n}\r\n\r\nconst getAttachWidgetClasses = (key: keyof typeof attachWidgetClasses, options?: { prefix?: string; suffix?: string }) => {\r\n return `${options?.prefix || ''}.${attachWidgetClasses[key]}${options?.suffix || ''}`\r\n}\r\n\r\nexport const AttachWidgetStyled = styled('div')(({ theme }) => ({\r\n [getAttachWidgetClasses('root', { prefix: '&' })]: {\r\n position: 'relative',\r\n width: '100%',\r\n height: '100%',\r\n backgroundColor: theme.palette.common.white,\r\n borderRadius: theme.shape.borderRadius\r\n },\r\n [getAttachWidgetClasses('content')]: {\r\n width: '100%',\r\n height: '100%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'flex-start',\r\n padding: theme.spacing(1)\r\n },\r\n [getAttachWidgetClasses('list')]: {\r\n height: '100%',\r\n flex: 1,\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: theme.spacing(0.75),\r\n overflow: 'hidden',\r\n minWidth: 0,\r\n position: 'relative',\r\n '&::after': {\r\n content: '\"\"',\r\n height: '100%',\r\n width: '30px',\r\n position: 'absolute',\r\n right: 0,\r\n top: 0,\r\n zIndex: 1,\r\n background: 'linear-gradient(to right, transparent, #ffffffb0, #ffffff)'\r\n }\r\n },\r\n [getAttachWidgetClasses('listItem')]: {\r\n width: 'var(--attach-widget-list-item-width, 42px)',\r\n padding: 0,\r\n aspectRatio: '5 / 7',\r\n borderRadius: theme.shape.borderRadius,\r\n border: '1px solid ' + theme.palette.divider,\r\n boxShadow: 'rgba(99, 99, 99, 0.2) 0px 2px 8px 0px',\r\n img: {\r\n width: '100%',\r\n height: '100%',\r\n objectFit: 'cover'\r\n }\r\n },\r\n [getAttachWidgetClasses('inputButton')]: {\r\n width: 'var(--attach-widget-list-item-width, 42px)',\r\n aspectRatio: '5 / 7',\r\n padding: 0,\r\n cursor: 'pointer',\r\n color: theme.palette.primary.main,\r\n borderRadius: theme.shape.borderRadius,\r\n border: '1px dashed ' + theme.palette.primary.main,\r\n marginRight: theme.spacing(1),\r\n '&:hover': {\r\n color: theme.palette.primary.dark\r\n }\r\n },\r\n [getAttachWidgetClasses('moreButton')]: {\r\n opacity: 0.5,\r\n transition: 'opacity 0.3s ease-in-out'\r\n },\r\n [getAttachWidgetClasses('dragPanel')]: {\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n bottom: 0,\r\n padding: theme.spacing(0.75),\r\n backgroundColor: theme.palette.common.white,\r\n pointerEvents: 'none',\r\n borderRadius: theme.shape.borderRadius,\r\n display: 'flex',\r\n opacity: 0,\r\n zIndex: 1,\r\n transition: 'opacity 0.3s ease-in-out',\r\n '& > div': {\r\n flex: 1,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n border: '2px dashed ' + theme.palette.primary.main,\r\n borderRadius: theme.shape.borderRadius\r\n }\r\n },\r\n [getAttachWidgetClasses('overlay')]: {\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n bottom: 0,\r\n backgroundColor: alpha(theme.palette.common.white, 0.5),\r\n zIndex: 1,\r\n opacity: 0,\r\n transition: 'opacity 0.3s ease-in-out',\r\n visibility: 'hidden',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center'\r\n },\r\n [getAttachWidgetClasses('loading', { prefix: '&' })]: {\r\n [getAttachWidgetClasses('overlay')]: {\r\n opacity: 1,\r\n visibility: 'visible'\r\n }\r\n },\r\n [getAttachWidgetClasses('dragging', { prefix: '&' })]: {\r\n [getAttachWidgetClasses('dragPanel')]: {\r\n opacity: 1\r\n },\r\n [getAttachWidgetClasses('content')]: {\r\n pointerEvents: 'none'\r\n }\r\n },\r\n [getAttachWidgetClasses('root', { prefix: '&', suffix: ':hover' })]: {\r\n [getAttachWidgetClasses('moreButton')]: {\r\n opacity: 1\r\n }\r\n }\r\n}))\r\n//#endregion\r\n\r\n//#region Attach Modal\r\nexport const attachModalClasses = {\r\n root: 'AttachModal-root',\r\n header: 'AttachModal-header',\r\n footer: 'AttachModal-footer',\r\n loading: 'AttachModal-loading',\r\n overlay: 'AttachModal-overlay',\r\n dragging: 'AttachModal-dragging',\r\n dragPanel: 'AttachModal-dragPanel',\r\n content: 'AttachModal-content',\r\n emptyState: 'AttachModal-emptyState',\r\n closeButton: 'AttachModal-closeButton',\r\n item: 'AttachModal-item',\r\n itemHeader: 'AttachModal-itemHeader',\r\n itemContent: 'AttachModal-itemContent',\r\n itemNew: 'AttachModal-itemNew',\r\n itemDelete: 'AttachModal-itemDelete'\r\n}\r\n\r\nconst getAttachModalClasses = (key: keyof typeof attachModalClasses, options?: { prefix?: string; suffix?: string }) => {\r\n return `${options?.prefix || ''}.${attachModalClasses[key]}${options?.suffix || ''}`\r\n}\r\n\r\nexport const AttachModalStyled = styled(Box)(({ theme }) => ({\r\n [getAttachModalClasses('root', { prefix: '&' })]: {\r\n backgroundColor: theme.palette.background.paper,\r\n borderRadius: theme.shape.borderRadius,\r\n boxShadow: theme.shadows[5],\r\n width: 'calc(100vw - 48px)',\r\n maxHeight: 'calc(100vh - 48px)',\r\n maxWidth: theme.breakpoints.values.md,\r\n position: 'relative',\r\n display: 'flex',\r\n flexDirection: 'column'\r\n },\r\n [getAttachModalClasses('header')]: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n padding: theme.spacing(1, 2)\r\n },\r\n [getAttachModalClasses('footer')]: {\r\n padding: theme.spacing(1, 2),\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: theme.spacing(3)\r\n },\r\n [getAttachModalClasses('content')]: {\r\n minHeight: '200px',\r\n padding: theme.spacing(1),\r\n overflowY: 'auto',\r\n height: '100%'\r\n },\r\n [getAttachModalClasses('emptyState')]: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n height: '168px'\r\n },\r\n [getAttachModalClasses('itemContent')]: {\r\n width: '100%',\r\n height: '100%',\r\n padding: 0,\r\n borderRadius: theme.shape.borderRadius,\r\n cursor: 'pointer',\r\n backgroundColor: theme.palette.background.paper,\r\n img: {\r\n width: '100%',\r\n height: '100%',\r\n objectFit: 'cover'\r\n }\r\n },\r\n [getAttachModalClasses('itemHeader')]: {\r\n marginTop: theme.spacing(-0.5),\r\n padding: theme.spacing(0.5, 0),\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n '.MuiTypography-root': {\r\n color: theme.palette.common.white\r\n },\r\n '.MuiIconButton-root': {\r\n backgroundColor: alpha(theme.palette.common.white, 0.5),\r\n '.MuiSvgIcon-root': {\r\n fontSize: '1rem'\r\n },\r\n '&:hover': {\r\n backgroundColor: theme.palette.common.white\r\n }\r\n }\r\n },\r\n [getAttachModalClasses('item')]: {\r\n width: 'var(--attach-modal-list-item-width, 100%)',\r\n aspectRatio: '5 / 7',\r\n display: 'inline-block',\r\n position: 'relative',\r\n backgroundColor: mapItemConfigs.old?.color,\r\n borderRadius: theme.shape.borderRadius,\r\n padding: theme.spacing(0.5),\r\n boxShadow: 'rgba(99, 99, 99, 0.2) 0px 2px 8px 0px',\r\n [getAttachModalClasses('itemNew', { prefix: '&' })]: {\r\n backgroundColor: mapItemConfigs.new?.color\r\n },\r\n [getAttachModalClasses('itemDelete', { prefix: '&' })]: {\r\n backgroundColor: mapItemConfigs.deleted?.color\r\n }\r\n },\r\n [getAttachModalClasses('dragPanel')]: {\r\n position: 'absolute',\r\n borderRadius: theme.shape.borderRadius,\r\n cursor: 'pointer',\r\n '& img': {\r\n width: '100%',\r\n height: 'auto',\r\n borderRadius: 4\r\n }\r\n },\r\n [getAttachModalClasses('dragPanel')]: {\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n bottom: 0,\r\n padding: theme.spacing(0.75),\r\n backgroundColor: theme.palette.common.white,\r\n pointerEvents: 'none',\r\n borderRadius: theme.shape.borderRadius,\r\n display: 'flex',\r\n opacity: 0,\r\n zIndex: 1,\r\n transition: 'opacity 0.3s ease-in-out',\r\n '& > div': {\r\n flex: 1,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n border: '2px dashed ' + theme.palette.primary.main,\r\n borderRadius: theme.shape.borderRadius\r\n }\r\n },\r\n [getAttachModalClasses('dragging', { prefix: '&' })]: {\r\n [getAttachModalClasses('dragPanel')]: {\r\n opacity: 1\r\n },\r\n [getAttachModalClasses('content')]: {\r\n pointerEvents: 'none'\r\n }\r\n },\r\n [getAttachModalClasses('overlay')]: {\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n bottom: 0,\r\n backgroundColor: alpha(theme.palette.common.white, 0.5),\r\n zIndex: 1,\r\n opacity: 0,\r\n transition: 'opacity 0.3s ease-in-out',\r\n visibility: 'hidden',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center'\r\n },\r\n [getAttachModalClasses('loading', { prefix: '&' })]: {\r\n [getAttachModalClasses('overlay')]: {\r\n opacity: 1,\r\n visibility: 'visible'\r\n }\r\n }\r\n}))\r\n//#endregion\r\n"],"names":["attachWidgetClasses","root","content","dragging","dragPanel","inputButton","moreButton","list","listItem","overlay","loading","getAttachWidgetClasses","key","options","concat","prefix","suffix","AttachWidgetStyled","styled","_ref","_ref2","theme","_defineProperty","position","width","height","backgroundColor","palette","common","white","borderRadius","shape","display","alignItems","justifyContent","padding","spacing","flex","gap","overflow","minWidth","right","top","zIndex","background","aspectRatio","border","divider","boxShadow","img","objectFit","cursor","color","primary","main","marginRight","dark","opacity","transition","left","bottom","pointerEvents","alpha","visibility","attachModalClasses","header","footer","emptyState","closeButton","item","itemHeader","itemContent","itemNew","itemDelete","getAttachModalClasses","AttachModalStyled","Box","_ref3","_mapItemConfigs$old","_mapItemConfigs$new","_mapItemConfigs$delet","_ref4","paper","shadows","maxHeight","maxWidth","breakpoints","values","md","flexDirection","minHeight","overflowY","marginTop","fontSize","mapItemConfigs","old","deleted"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{inherits as e,createClass as r,classCallCheck as n,callSuper as a,defineProperty as t,asyncToGenerator as i,regenerator as o,toConsumableArray as l}from"../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as s,jsxs as c}from"react/jsx-runtime";import{Component as u,createRef as d}from"react";import{IconButton as h,Typography as p,CircularProgress as g,Tooltip as f}from"@mui/material";import{GlobalModal as m,mapGlobalModalContext as v}from"../../api-context/global-modal.js";import C from"@mui/icons-material/AttachFile";import D from"@mui/icons-material/OpenInFull";import{attachWidgetClasses as y,AttachWidgetStyled as k}from"./styled.js";import{allowFileTypes as b,fileToAttachItem as I,fetchUploadNewFiles as F,isValidFileType as N}from"./helpers.js";import j from"./modal.js";var x=function(){function x(e){var r;return n(this,x),r=a(this,x,[e]),t(r,"onChangeHandler",function(){var e=i(o().m((function e(n){var a,t,i;return o().w((function(e){for(;;)switch(e.n){case 0:if(a=n.filter((function(e){return N(e.type)})),r.props.onChange&&!(a.length<1)){e.n=1;break}return e.a(2);case 1:if(r.setState({isLoading:!0}),t=a.map((function(e){return I(e,{status:"new"})})),i=[].concat(l(t),l(r.attachItems)),!r.props.uploadFile){e.n=3;break}return e.n=2,F(i,r.props.uploadFile);case 2:i=e.v;case 3:r.setState({isLoading:!1}),r.props.onChange(i,{isSave:!0});case 4:return e.a(2)}}),e)})));return function(r){return e.apply(this,arguments)}}()),t(r,"fileInputRef",d()),t(r,"handleIconClick",(function(){var e;null===(e=r.fileInputRef.current)||void 0===e||e.click()})),t(r,"handleFileChange",(function(e){var n=e.target.files;n&&n.length>0&&r.onChangeHandler(Array.from(n))})),t(r,"dragCounter",0),t(r,"handleDragEnter",(function(){r.dragCounter++,r.setState({isDragging:!0})})),t(r,"handleDragLeave",(function(){r.dragCounter--,0===r.dragCounter&&r.setState({isDragging:!1})})),t(r,"handleDragOver",(function(e){e.preventDefault()})),t(r,"handleDrop",(function(e){if(e.preventDefault(),e.stopPropagation(),r.state.isDragging){r.setState({isDragging:!1});var n=Array.from(e.dataTransfer.files);r.onChangeHandler(n)}})),r.state={isDragging:!1,isLoading:!1},r}return e(x,u),r(x,[{key:"attachItems",get:function(){return this.props.value}},{key:"render",value:function(){var e=this.state,r=e.isDragging,n=e.isLoading,a=[y.root];r&&!n&&a.push(y.dragging),n&&a.push(y.loading);var t=this.attachItems.slice(0,(this.props.maxDisplayFiles||5)+1);return s(m,{children:c(k,{className:a.join(" "),onDragEnter:this.handleDragEnter,onDragLeave:this.handleDragLeave,onDragOver:this.handleDragOver,onDrop:this.handleDrop,children:[c("div",{className:y.content,children:[s("input",{ref:this.fileInputRef,type:"file",hidden:!0,multiple:!0,onChange:this.handleFileChange,accept:b.join(",")}),s(h,{color:"primary",className:y.inputButton,onClick:this.handleIconClick,children:s(C,{})}),c("div",{className:y.list,children:[t.length<1&&s(p,{variant:"body2",color:"text.secondary",sx:{paddingRight:3},children:"No files, drag and drop here"}),t.map((function(e,r){return s(h,{component:"a",href:e.url,target:"_blank",className:y.listItem,children:s("img",{src:e.thumbnail||e.url,alt:e.name})},r)}))]}),this.renderMoreButton()]}),s("div",{className:y.dragPanel,children:s("div",{children:s(p,{variant:"body2",color:"primary",sx:{fontWeight:600},children:"Drop files here to upload"})})}),s("div",{className:y.overlay,children:s(g,{size:24})})]})})}},{key:"renderMoreButton",value:function(){var e=this;return v((function(r){var n=e.props,a=n.value,t=n.onChange;return s(f,{title:"More details",placement:"top",arrow:!0,children:s(h,{className:y.moreButton,onClick:function(){r.show({backdropActivated:!0,renderContent:function(){return s(j,{value:a,onChange:t,uploadFile:e.props.uploadFile,onClose:r.close})}})},children:s(D,{})})})}))}}])}();export{x as AttachWidget,x as default};
2
+ //# sourceMappingURL=widget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widget.js","sources":["../../../src/lab/attach-widget/widget.tsx"],"sourcesContent":["import { Component, createRef } from 'react'\r\nimport { CircularProgress, IconButton, Tooltip, Typography } from '@mui/material'\r\nimport type { ChangeEvent, DragEvent } from 'react'\r\nimport { GlobalModal, mapGlobalModalContext } from '../../api-context/global-modal'\r\nimport AttachFileIcon from '@mui/icons-material/AttachFile'\r\nimport OpenInFullIcon from '@mui/icons-material/OpenInFull'\r\nimport { attachWidgetClasses, AttachWidgetStyled } from './styled'\r\nimport { allowFileTypes, fetchUploadNewFiles, fileToAttachItem, isValidFileType } from './helpers'\r\nimport type { AttachChangeFunction, AttachUploadFunction, IAttachItem } from './types'\r\nimport AttachModal from './modal'\r\n\r\nexport interface IAttachWidgetProps {\r\n value: IAttachItem[]\r\n onChange?: AttachChangeFunction\r\n uploadFile?: AttachUploadFunction\r\n maxDisplayFiles?: number\r\n}\r\n\r\nexport interface IAttachWidgetState {\r\n isDragging: boolean\r\n isLoading: boolean\r\n}\r\n\r\nexport class AttachWidget extends Component<IAttachWidgetProps, IAttachWidgetState> {\r\n constructor(props: IAttachWidgetProps) {\r\n super(props)\r\n this.state = { isDragging: false, isLoading: false }\r\n }\r\n\r\n get attachItems() {\r\n return this.props.value\r\n }\r\n\r\n render() {\r\n const { isDragging, isLoading } = this.state\r\n const rootClasses = [attachWidgetClasses.root]\r\n if (isDragging && !isLoading) rootClasses.push(attachWidgetClasses.dragging)\r\n if (isLoading) rootClasses.push(attachWidgetClasses.loading)\r\n const list = this.attachItems.slice(0, (this.props.maxDisplayFiles || 5) + 1)\r\n return (\r\n <GlobalModal>\r\n <AttachWidgetStyled\r\n className={rootClasses.join(' ')}\r\n onDragEnter={this.handleDragEnter}\r\n onDragLeave={this.handleDragLeave}\r\n onDragOver={this.handleDragOver}\r\n onDrop={this.handleDrop}\r\n >\r\n <div className={attachWidgetClasses.content}>\r\n <input ref={this.fileInputRef} type='file' hidden multiple onChange={this.handleFileChange} accept={allowFileTypes.join(',')} />\r\n <IconButton color='primary' className={attachWidgetClasses.inputButton} onClick={this.handleIconClick}>\r\n <AttachFileIcon />\r\n </IconButton>\r\n <div className={attachWidgetClasses.list}>\r\n {list.length < 1 && (\r\n <Typography variant='body2' color='text.secondary' sx={{ paddingRight: 3 }}>\r\n No files, drag and drop here\r\n </Typography>\r\n )}\r\n {list.map((item, index) => (\r\n <IconButton key={index} component='a' href={item.url} target='_blank' className={attachWidgetClasses.listItem}>\r\n <img src={item.thumbnail || item.url} alt={item.name} />\r\n </IconButton>\r\n ))}\r\n </div>\r\n {this.renderMoreButton()}\r\n </div>\r\n <div className={attachWidgetClasses.dragPanel}>\r\n <div>\r\n <Typography variant='body2' color='primary' sx={{ fontWeight: 600 }}>\r\n Drop files here to upload\r\n </Typography>\r\n </div>\r\n </div>\r\n <div className={attachWidgetClasses.overlay}>\r\n <CircularProgress size={24} />\r\n </div>\r\n </AttachWidgetStyled>\r\n </GlobalModal>\r\n )\r\n }\r\n\r\n renderMoreButton() {\r\n return mapGlobalModalContext((context) => {\r\n const { value, onChange } = this.props\r\n const handleClick = () => {\r\n context.show({\r\n backdropActivated: true,\r\n renderContent: () => <AttachModal value={value} onChange={onChange} uploadFile={this.props.uploadFile} onClose={context.close} />\r\n })\r\n }\r\n return (\r\n <Tooltip title='More details' placement='top' arrow>\r\n <IconButton className={attachWidgetClasses.moreButton} onClick={handleClick}>\r\n <OpenInFullIcon />\r\n </IconButton>\r\n </Tooltip>\r\n )\r\n })\r\n }\r\n\r\n onChangeHandler = async (files: File[]) => {\r\n const validFiles = files.filter((f) => isValidFileType(f.type))\r\n if (!this.props.onChange || validFiles.length < 1) return\r\n this.setState({ isLoading: true })\r\n const items = validFiles.map((x) => fileToAttachItem(x, { status: 'new' }))\r\n let updatedItems = [...items, ...this.attachItems]\r\n\r\n if (this.props.uploadFile) {\r\n updatedItems = await fetchUploadNewFiles(updatedItems, this.props.uploadFile)\r\n }\r\n\r\n this.setState({ isLoading: false })\r\n this.props.onChange(updatedItems, { isSave: true })\r\n }\r\n\r\n fileInputRef = createRef<HTMLInputElement>()\r\n handleIconClick = () => {\r\n this.fileInputRef.current?.click()\r\n }\r\n\r\n handleFileChange = (e: ChangeEvent<HTMLInputElement>) => {\r\n const files = e.target.files\r\n if (files && files.length > 0) {\r\n this.onChangeHandler(Array.from(files))\r\n }\r\n }\r\n\r\n dragCounter = 0\r\n handleDragEnter = () => {\r\n this.dragCounter++\r\n this.setState({ isDragging: true })\r\n }\r\n\r\n handleDragLeave = () => {\r\n this.dragCounter--\r\n if (this.dragCounter === 0) {\r\n this.setState({ isDragging: false })\r\n }\r\n }\r\n\r\n handleDragOver = (e: DragEvent) => {\r\n e.preventDefault()\r\n }\r\n\r\n handleDrop = (e: DragEvent) => {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n if (!this.state.isDragging) return // If not dragging, do nothing\r\n this.setState({ isDragging: false })\r\n const files = Array.from(e.dataTransfer.files)\r\n this.onChangeHandler(files)\r\n }\r\n}\r\n\r\nexport default AttachWidget\r\n"],"names":["AttachWidget","props","_this","_classCallCheck","_callSuper","_defineProperty","_ref","_asyncToGenerator","_regenerator","m","_callee","files","validFiles","items","updatedItems","w","_context","n","filter","f","isValidFileType","type","onChange","length","a","setState","isLoading","map","x","fileToAttachItem","status","concat","_toConsumableArray","attachItems","uploadFile","fetchUploadNewFiles","v","isSave","_x","apply","this","arguments","createRef","_this$fileInputRef$cu","fileInputRef","current","click","e","target","onChangeHandler","Array","from","dragCounter","isDragging","preventDefault","stopPropagation","state","dataTransfer","_inherits","Component","_createClass","key","get","value","_this$state","rootClasses","attachWidgetClasses","root","push","dragging","loading","list","slice","maxDisplayFiles","_jsx","GlobalModal","children","_jsxs","AttachWidgetStyled","className","join","onDragEnter","handleDragEnter","onDragLeave","handleDragLeave","onDragOver","handleDragOver","onDrop","handleDrop","content","ref","hidden","multiple","handleFileChange","accept","allowFileTypes","IconButton","color","inputButton","onClick","handleIconClick","AttachFileIcon","Typography","variant","sx","paddingRight","item","index","component","href","url","listItem","src","thumbnail","alt","name","renderMoreButton","dragPanel","fontWeight","overlay","CircularProgress","size","_this2","mapGlobalModalContext","context","_this2$props","Tooltip","title","placement","arrow","moreButton","show","backdropActivated","renderContent","AttachModal","onClose","close","OpenInFullIcon"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export{AttachWidget}from"./attach-widget/widget.js";export{ESocialLinkType}from"./input.social-links/types.js";export{createInputSocialLinks,inputSocialLinksClasses}from"./input.social-links/create.js";export{AmazonMusicIcon,AmazonMusicVectorIcon,AppleMusicIcon,DeezerIcon,SoundCloudIcon,SpotifyIcon,TidalIcon,TiktokIcon,getSocialLinkConfig}from"./input.social-links/unit.icons.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ var r="1.0.0";export{r as structureVersion};
2
+ //# sourceMappingURL=configs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configs.js","sources":["../../../src/lab/input.social-links/configs.ts"],"sourcesContent":["export const structureVersion: string = '1.0.0'\r\n"],"names":["structureVersion"],"mappings":"AAAO,IAAMA,EAA2B"}
@@ -0,0 +1,2 @@
1
+ import{defineProperty as e,inherits as n,createClass as r,classCallCheck as t,callSuper as i,toConsumableArray as l}from"../../_virtual/_rollupPluginBabelHelpers.js";import{jsxs as o,jsx as a}from"react/jsx-runtime";import{Component as s}from"react";import{styled as c,Grid as u,textFieldClasses as p,colors as m,Box as d,FormControl as h,InputLabel as f,Select as k,MenuItem as g,Typography as v,TextField as y,InputAdornment as x,Tooltip as w,IconButton as L}from"@mui/material";import b from"@mui/icons-material/Add";import C from"@mui/icons-material/Remove";import I from"@mui/icons-material/OpenInNew";import{WrapIcon as R}from"./units.js";import{getSocialLinkConfig as S}from"./unit.icons.js";import{ESocialLinkType as T}from"./types.js";import{CopyToClipboard as j}from"../../components/copy-to-clipboard.js";import{tryParseObject as A,isValidURL as U}from"../../utils/helpers.js";import{getErrorMessage as D}from"../../form/helpers.js";import{structureVersion as N}from"./configs.js";var z={root:"inputSocialLinks-root",linkRows:"inputSocialLinks-linkRows",linkRow:"inputSocialLinks-linkRow",titleLinkRow:"inputSocialLinks-titleLinkRow",input:"inputSocialLinks-input"};function W(){return function(){function c(n){var r;return t(this,c),r=i(this,c,[n]),e(r,"getInputValue",(function(){var e=r.state.links;return JSON.stringify({StructureVersion:N,Items:e})})),e(r,"getDefaultLinks",(function(){var e=r.props,n=e.data,t=e.name,i=t?null==n?void 0:n[t]:"",l=A(i,{StructureVersion:N,Items:[]});return Array.isArray(null==l?void 0:l.Items)?l.Items:[]})),e(r,"handleInputChange",(function(e){r.setState({currentInput:e.target.value})})),e(r,"handleTypeChange",(function(e){r.setState({currentType:e.target.value})})),e(r,"handleAddLink",(function(){var e=r.state,n=e.currentInput,t=e.links,i=e.currentType,o=n.trim();if(o)if(t.some((function(e){return e.Url===o}))){var a=r.props,s=a.formContext,c=a.name;c&&(null==s||s.setError(c,"This link already exists"))}else if(U(o)){var u={Url:o,Type:i},p=[].concat(l(t),[u]);r.setState({links:p,currentInput:""},(function(){var e=r.props,n=e.formContext,t=e.name;t&&(null==n||n.removeError(t))}))}else{var m=r.props,d=m.formContext,h=m.name;h&&(null==d||d.setError(h,"Invalid URL"))}})),e(r,"handleDeleteLink",(function(e){var n=r.state.links.filter((function(n){return n.Url!==e.Url}));r.setState({links:n})})),r.state={links:r.getDefaultLinks(),currentInput:"",currentType:T.Website},r}return n(c,s),r(c,[{key:"render",value:function(){var e=this,n=this.state,r=n.links,t=n.currentInput,i=this.props,l=i.name,s=i.label,c=i.messageErrors,p=D(c,l);return o(E,{container:!0,spacing:2,className:z.root,children:[a("input",{type:"hidden",name:null==l?void 0:l.toString(),value:this.getInputValue()}),a(u,{item:!0,xs:3,children:o(h,{fullWidth:!0,children:[a(f,{id:"social-link-type-label",children:"Link Type"}),a(k,{labelId:"social-link-type-label",value:this.state.currentType,label:"Link Type",onChange:this.handleTypeChange,children:Object.values(T).map((function(e){var n,r,t=S(e),i=t.Icon;return a(g,{value:e,children:o(O,{children:[a(R,{size:24,sx:{bgcolor:t.primaryColor},children:a(i,{fontSize:"small",sx:{color:null!==(n=t.secondaryColor)&&void 0!==n?n:m.common.white}})}),a(v,{variant:"body2",noWrap:!0,children:null!==(r=t.label)&&void 0!==r?r:e})]})},e)}))})]})}),a(u,{item:!0,xs:9,children:a(y,{fullWidth:!0,className:z.input,label:s,error:!!p.error,helperText:p.message,value:t,onChange:this.handleInputChange,onKeyDown:function(n){"Enter"===n.key&&(n.preventDefault(),e.handleAddLink())},InputProps:{endAdornment:a(x,{position:"end",children:a(w,{title:"Add Link",arrow:!0,children:a(L,{size:"small",onClick:this.handleAddLink,children:a(b,{})})})})}})}),a(u,{item:!0,xs:12,children:a(d,{className:z.linkRows,children:r.map((function(n,r){var t,i=S(n.Type),l=i.Icon;return o("div",{className:z.linkRow,children:[a(R,{sx:{bgcolor:i.primaryColor},children:a(l,{sx:{color:null!==(t=i.secondaryColor)&&void 0!==t?t:m.common.white}})}),a(v,{variant:"body2",noWrap:!0,className:z.titleLinkRow,children:n.Url}),a(w,{title:"Open Link",arrow:!0,children:a(L,{size:"small",href:n.Url,target:"_blank",rel:"noopener noreferrer",children:a(I,{fontSize:"small"})})}),a(j,{value:n.Url}),a(w,{title:"Delete Link",arrow:!0,children:a(L,{size:"small",onClick:function(){return e.handleDeleteLink(n)},children:a(C,{})})})]},r)}))})})]})}}])}()}var E=c(u)((function(n){var r=n.theme;return e(e(e(e({},"& .".concat(z.linkRows),{overflowY:"auto",maxHeight:"calc(var(--isl-row-height, 40px) * 5)"}),"& .".concat(z.linkRow),{display:"flex",alignItems:"center",gap:"4px",padding:"0 12px",marginBottom:"8px",backgroundColor:m.grey[50],borderRadius:r.shape.borderRadius,height:"var(--isl-row-height, 40px)","&:hover":{backgroundColor:m.grey[100]}}),"& .".concat(z.titleLinkRow),{marginLeft:"6px",flex:1,minWidth:0,overflow:"hidden"}),"& .".concat(z.input," .").concat(p.root),{paddingRight:r.spacing(1)})})),O=c(d)({display:"flex",alignItems:"center",gap:"8px",".MuiTypography-root":{lineHeight:1,marginTop:"2px"}});export{W as createInputSocialLinks,W as default,z as inputSocialLinksClasses};
2
+ //# sourceMappingURL=create.js.map