@zydon/common 2.8.2 → 2.8.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/DynamicDataView/DynamicDataView.tsx","../../../src/components/DynamicDataView/components/FilterButton.tsx","../../../src/components/DynamicDataView/components/FiltersSection.tsx","../../../src/components/DynamicDataView/components/filters/FiltersContainer.tsx","../../../src/components/DynamicDataView/components/filters/FiltersContent.tsx","../../../src/components/DynamicDataView/utils/filter.ts","../../../src/components/DynamicDataView/components/filters/FiltersList.tsx","../../../src/components/DynamicDataView/components/filters/FilterRow.tsx","../../../src/components/DynamicDataView/constants/filter.ts","../../../src/components/DynamicDataView/components/filters/OperatorSelect.tsx","../../../src/components/DynamicDataView/components/filters/styles.ts","../../../src/components/DynamicDataView/components/SortModal/index.tsx","../../../src/components/DynamicDataView/components/SortModal/style.ts","../../../src/components/DynamicDataView/hooks/useColumnOrdering.ts","../../../src/components/DynamicDataView/hooks/useColumnVisibility.ts","../../../src/components/DynamicDataView/hooks/useDynamicColumns.ts","../../../src/components/DynamicDataView/constants/columnDefaults.ts","../../../src/components/DynamicDataView/utils/columnStrategies.ts","../../../src/components/DynamicDataView/hooks/useFilters.ts","../../../src/components/DynamicDataView/hooks/useFilterSortStorage.ts","../../../src/components/DynamicDataView/hooks/useSorting.ts","../../../src/components/DynamicDataView/utils/addActionsField.ts","../../../src/components/DynamicDataView/renderers/DateRenderer.tsx","../../../src/components/DynamicDataView/renderers/DateTimeRenderer.tsx","../../../src/components/DynamicDataView/renderers/EntityRenderer.tsx","../../../src/components/DynamicDataView/renderers/IconRenderer.tsx","../../../src/components/DynamicDataView/renderers/ImageRenderer.tsx","../../../src/components/DynamicDataView/renderers/style.ts","../../../src/components/DynamicDataView/renderers/NameRenderer.tsx","../../../src/components/DynamicDataView/renderers/NumberRenderer.tsx","../../../src/components/DynamicDataView/renderers/StatusRenderer.tsx","../../../src/components/DynamicDataView/renderers/TextRenderer.tsx","../../../src/components/DynamicDataView/utils/createCellRenderer.tsx","../../../src/components/DynamicDataView/utils/fields.ts"],"names":["memo","useCallback","useMemo","useState","isEqual","Badge","Button","IconButton","Stack","jsx","jsxs","FilterButton","showFilterButton","isMobile","hasActiveFilters","activeFiltersCount","sort","onFilterClick","onSortClick","Icon_default","ToolbarActionsDivider","FilterButton_default","Divider","Typography","getFilterableFields","fields","field","getDefaultCondition","type","available_filter_conditions","isValidCondition","condition","buildFilterFromConditions","conditions","validConditions","c","FormControl","InputLabel","MenuItem","Select","TextField","CONDITION_LABELS","OperatorSelect","value","onChange","totalConditions","isFirst","e","OperatorSelect_default","ellipsisStyle","FilterRow","onRemove","selectedField","f","availableConditions","isValueDisabled","handleFieldChange","fieldName","newField","defaultCondition","handleConditionChange","conditional","handleValueChange","handleOperatorChange","operator","cond","FilterRow_default","Fragment","FiltersList","filterableFields","onUpdateCondition","onRemoveCondition","handleUpdateCondition","updated","handleRemoveCondition","id","usedFieldNames","name","getAvailableFields","currentFieldName","index","FiltersList_default","Box","styled","Container","Header","theme","Content","Footer","FiltersContent","onClose","onAddCondition","onApply","onClear","onCancel","hasConditions","handleApply","handleClear","handleCancel","FiltersContent_default","FiltersContainer","props","ResponsivePopover_default","FiltersContainer_default","FiltersSection","isOpen","filterAnchorEl","FiltersSection_default","useEffect","Dialog","DialogActions","DialogContent","DialogTitle","StyledDialog","StyledDialogTitle","StyledDialogContent","StyledDialogActions","ApplyButton","LabelButton","SortModal","open","onSortChange","setSelectedField","selectedDirection","setSelectedDirection","sortableFields","selectedFieldObj","isNumberField","SortModal_default","useColumnOrdering","columns","preferredFieldOrder","columnsByFieldId","column","fieldsByName","actionFieldName","preferredWithoutActions","usedColumnFieldIds","ordered","pushColumnForField","getColumnFieldIdFromField","useColumnVisibility","defaultVisibleFieldNames","columnVisibilityStorageKey","onColumnVisibilityModelChange","hasStorageKey","storedVisibilityModel","setStoredVisibilityModel","useLocalStorage_default","initialState","visibilityModel","columnFieldId","visible","stored","handleColumnVisibilityModelChange","model","COLUMN_DEFAULTS","ACCESS_TYPES","CURRENCY_FIELD_NAMES","createImageColumn","renderCell","params","createIdColumn","createEntityColumn","createDefaultColumn","createActionsColumn","getColumnStrategy","metadata","useDynamicColumns","columnStrategies","columnsMap","useRef","parseInitialConditions","initialFilter","uuidv4","useFilters","setIsOpen","appliedConditions","setAppliedConditions","appliedFilter","setAppliedFilter","setConditions","snapshotRef","openDrawer","closeDrawer","addCondition","availableFields","currentOperator","firstField","newCondition","prev","updateCondition","changes","targetCondition","newOperator","removeCondition","clearAllFilters","applyFilters","filter","cancelChanges","getStoredValue","key","item","setStoredValue","useFilterStorage","storageKey","externalFilter","onFilterChange","filterKey","internalFilter","setInternalFilter","newFilter","useSortStorage","externalSort","sortKey","internalSort","setInternalSort","newSort","useSorting","sortModel","handleSortModelChange","firstItem","createActionsField","addActionsFieldToMetadata","DateRenderer","format","fDate","DateRenderer_default","DateTimeRenderer","fDateTime","DateTimeRenderer_default","Chip","EntityRenderer","entityValue","EntityRenderer_default","IconRenderer","trueIcon","falseIcon","color","width","IconRenderer_default","StatusLabel","isActive","ImageContainer","prop","size","noImage","clickable","ImageRenderer","imageResourceId","getImageUrl","alt","onClick","sx","hasImage","imageUrl","ImageRenderer_default","NameRenderer","displayName","copyMessage","CopyButton_default","NameRenderer_default","NumberRenderer","isCurrency","fCurrencyBRL","fNumber","NumberRenderer_default","StatusRenderer","active","activeLabel","inactiveLabel","StatusRenderer_default","sanitizeHtml","text","TextRenderer","showCopyButton","copyLabel","mask","stringValue","formattedValue","TextRenderer_default","getIsCurrency","createCellRenderer","context","onRowAction","CellRendererComponent","row","DynamicDataView","title","data","isLoading","isFetching","page","perPage","searchValue","onSearchChange","onSearch","onPaginationChange","onAdd","onRowDoubleClick","actions","moreActions","hideHeader","slots","mobileRender","containerHeight","showColumnButton","rows","total","preloadedMetadata","firstRow","effectiveMetadata","effectiveMetadataFields","orderedColumns","handleRowDoubleClick","rowId","useResponsive_default","setFilterAnchorEl","storedFilter","setStoredFilter","storedSort","setStoredSort","effectiveFilter","effectiveSort","handleApplyFilters","handleClearFilters","handleFilterButtonClick","event","handleCancelFilters","isSortModalOpen","setIsSortModalOpen","handleFiltersClose","DataView_default","DynamicDataView_default","buildVisibleFields","columnVisibilityModel","defaultVisibleFields","a","b","indexA","indexB"],"mappings":"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","sourcesContent":["import { memo, useCallback, useMemo, useState } from 'react';\nimport isEqual from 'react-fast-compare';\nimport { AccessType, DataType } from 'model/entity-metadata';\n\nimport useResponsive from 'hooks/useResponsive';\n\nimport DataView from '../DataView';\n\nimport FilterButton from './components/FilterButton';\nimport FiltersSection from './components/FiltersSection';\nimport SortModal from './components/SortModal';\nimport { useColumnOrdering } from './hooks/useColumnOrdering';\nimport { useColumnVisibility } from './hooks/useColumnVisibility';\nimport { useDynamicColumns } from './hooks/useDynamicColumns';\nimport { useFilters } from './hooks/useFilters';\nimport { useFilterStorage, useSortStorage } from './hooks/useFilterSortStorage';\nimport { useSorting } from './hooks/useSorting';\nimport { addActionsFieldToMetadata } from './utils/addActionsField';\nimport { createCellRenderer } from './utils/createCellRenderer';\nimport { DynamicDataViewProps, DynamicRowData } from './props';\n\nconst DynamicDataView = <T extends object = object>({\n title,\n metadata,\n data,\n isLoading,\n isFetching,\n page,\n perPage,\n searchValue,\n onSearchChange,\n onSearch,\n onPaginationChange,\n onAdd,\n onRowAction,\n onRowDoubleClick,\n actions,\n moreActions,\n hideHeader,\n slots,\n mobileRender,\n containerHeight = 600,\n showColumnButton = false,\n showFilterButton = false,\n filter,\n onFilterChange,\n sort,\n onSortChange,\n defaultVisibleFieldNames,\n preferredFieldOrder,\n columnStrategies,\n onColumnVisibilityModelChange,\n storageKey,\n}: DynamicDataViewProps<T>) => {\n const { items: rows = [], total = 0 } = data || {};\n\n // Criar metadata temporário baseado em data quando metadata não disponível\n const preloadedMetadata = useMemo(() => {\n if (metadata) return metadata;\n\n // Se não tem metadata mas tem dados, criar metadata baseado nas keys do primeiro item\n if (rows.length > 0) {\n const firstRow = rows[0];\n const fields = Object.keys(firstRow).map(key => ({\n name: key,\n type: DataType.TEXT,\n description: key,\n filter_field_name: null,\n metadata: null,\n access_type: AccessType.READ_ONLY,\n relation_field_name: null,\n available_filter_conditions: [],\n }));\n\n return {\n name: 'loading',\n description: 'Loading...',\n id_field_name: 'id',\n description_field_name: fields[0]?.name || 'id',\n access_type: AccessType.READ_ONLY,\n fields,\n };\n }\n\n return undefined;\n }, [metadata, rows]);\n\n const effectiveMetadata = useMemo(\n () =>\n preloadedMetadata && onRowAction\n ? addActionsFieldToMetadata(preloadedMetadata)\n : preloadedMetadata,\n [preloadedMetadata, onRowAction],\n );\n\n const effectiveMetadataFields = useMemo(\n () => effectiveMetadata?.fields || [],\n [effectiveMetadata],\n );\n\n const renderCell = useMemo(\n () =>\n createCellRenderer<T>({\n onRowAction,\n }),\n [onRowAction],\n );\n\n const columns = useDynamicColumns<T>({\n metadata: effectiveMetadata,\n renderCell,\n columnStrategies,\n });\n\n const { orderedColumns, columnsByFieldId } = useColumnOrdering({\n columns,\n fields: effectiveMetadata?.fields,\n preferredFieldOrder,\n });\n\n const { initialState, handleColumnVisibilityModelChange } =\n useColumnVisibility({\n fields: effectiveMetadata?.fields,\n columnsByFieldId,\n defaultVisibleFieldNames,\n columnVisibilityStorageKey: `${storageKey}:columns`,\n onColumnVisibilityModelChange,\n });\n\n const handleRowDoubleClick = useCallback(\n (params: { id: string | number; row: DynamicRowData<T> }) => {\n if (!onRowDoubleClick) return;\n\n const rowId = params.id?.toString() || '';\n onRowDoubleClick(rowId, params.row);\n },\n [onRowDoubleClick],\n );\n\n const isMobile = useResponsive('down', 'md');\n const [filterAnchorEl, setFilterAnchorEl] = useState<HTMLElement | null>(\n null,\n );\n\n const { filter: storedFilter, setFilter: setStoredFilter } = useFilterStorage(\n storageKey,\n filter,\n onFilterChange,\n );\n\n const { sort: storedSort, setSort: setStoredSort } = useSortStorage(\n storageKey,\n sort,\n onSortChange,\n );\n\n const effectiveFilter = filter ?? storedFilter;\n const effectiveSort = sort ?? storedSort;\n\n const { sortModel, handleSortModelChange } = useSorting({\n sort: effectiveSort,\n onSortChange: setStoredSort,\n });\n\n const {\n conditions,\n isOpen,\n openDrawer,\n closeDrawer,\n addCondition,\n updateCondition,\n removeCondition,\n clearAllFilters,\n applyFilters,\n cancelChanges,\n hasActiveFilters,\n activeFiltersCount,\n } = useFilters({\n fields: effectiveMetadataFields,\n initialFilter: effectiveFilter,\n });\n\n const handleApplyFilters = useCallback(() => {\n const newFilter = applyFilters();\n setStoredFilter(newFilter);\n }, [applyFilters, setStoredFilter]);\n\n const handleClearFilters = useCallback(() => {\n clearAllFilters();\n setStoredFilter(undefined);\n }, [clearAllFilters, setStoredFilter]);\n\n const handleFilterButtonClick = useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n if (isMobile) {\n openDrawer();\n } else {\n openDrawer();\n setFilterAnchorEl(event.currentTarget);\n }\n },\n [isMobile, openDrawer],\n );\n\n const handleCancelFilters = useCallback(() => {\n cancelChanges();\n setFilterAnchorEl(null);\n }, [cancelChanges]);\n\n const [isSortModalOpen, setIsSortModalOpen] = useState(false);\n\n const handleFiltersClose = useCallback(() => {\n setFilterAnchorEl(null);\n closeDrawer();\n }, [closeDrawer]);\n\n return (\n <>\n <DataView<T>\n title={title}\n columns={orderedColumns}\n rows={rows}\n mobileRender={mobileRender}\n rowCount={total}\n loading={isLoading || !metadata}\n fetching={isFetching}\n searchValue={searchValue}\n onSearch={onSearch}\n onSearchChange={onSearchChange}\n paginationModel={{\n page,\n pageSize: perPage,\n }}\n onPaginationChange={onPaginationChange}\n actions={actions}\n moreActions={moreActions}\n onAdd={onAdd}\n hideHeader={hideHeader}\n onRowDoubleClick={onRowDoubleClick ? handleRowDoubleClick : undefined}\n disableRowSelectionOnClick\n slots={slots}\n initialState={initialState}\n showColumnButton={showColumnButton}\n containerProps={{\n height: containerHeight,\n maxHeight: containerHeight,\n }}\n onColumnVisibilityModelChange={handleColumnVisibilityModelChange}\n filterButton={\n <FilterButton\n showFilterButton={showFilterButton}\n isMobile={isMobile}\n hasActiveFilters={hasActiveFilters}\n activeFiltersCount={activeFiltersCount}\n sort={effectiveSort}\n onFilterClick={handleFilterButtonClick}\n onSortClick={() => setIsSortModalOpen(true)}\n />\n }\n sortingMode=\"server\"\n sortModel={sortModel}\n onSortModelChange={handleSortModelChange}\n disableColumnFilter\n />\n {metadata && (\n <>\n <FiltersSection\n showFilterButton={showFilterButton}\n isOpen={isOpen}\n filterAnchorEl={filterAnchorEl}\n fields={effectiveMetadataFields}\n conditions={conditions}\n isMobile={isMobile}\n onClose={handleFiltersClose}\n onAddCondition={addCondition}\n onUpdateCondition={updateCondition}\n onRemoveCondition={removeCondition}\n onApply={handleApplyFilters}\n onClear={handleClearFilters}\n onCancel={handleCancelFilters}\n />\n\n <SortModal\n open={isSortModalOpen}\n onClose={() => setIsSortModalOpen(false)}\n fields={effectiveMetadataFields}\n sort={effectiveSort}\n onSortChange={setStoredSort}\n />\n </>\n )}\n </>\n );\n};\n\nexport default memo(DynamicDataView, isEqual) as typeof DynamicDataView;\nexport type { DynamicDataViewProps, DynamicRowData } from './props';\n","import { memo } from 'react';\nimport isEqual from 'react-fast-compare';\nimport Badge from '@mui/material/Badge';\nimport Button from '@mui/material/Button';\nimport IconButton from '@mui/material/IconButton';\nimport Stack from '@mui/material/Stack';\n\nimport { ToolbarActionsDivider } from 'components/DataView';\nimport Icon from 'components/Icon';\n\nimport { FilterButtonProps } from '../props';\n\nconst FilterButton = ({\n showFilterButton,\n isMobile,\n hasActiveFilters,\n activeFiltersCount,\n sort,\n onFilterClick,\n onSortClick,\n}: FilterButtonProps) => {\n if (!showFilterButton) return null;\n\n if (isMobile) {\n return (\n <Stack direction=\"row\" spacing={0.5}>\n <Badge\n badgeContent={activeFiltersCount}\n color=\"primary\"\n invisible={activeFiltersCount === 0}\n sx={{\n '& .MuiBadge-badge': {\n transform: 'scale(0.9) translate(10px, 9px)',\n opacity: activeFiltersCount === 0 ? 0 : 1,\n },\n }}\n >\n <IconButton\n color={hasActiveFilters ? 'primary' : 'default'}\n onClick={onFilterClick}\n size=\"small\"\n aria-label=\"Filtrar\"\n sx={{ overflow: 'visible' }}\n >\n <Icon icon=\"FILTER_VERTICAL\" />\n </IconButton>\n </Badge>\n\n <ToolbarActionsDivider\n sx={{ height: 16 }}\n orientation=\"vertical\"\n flexItem\n />\n\n <IconButton\n color={sort ? 'primary' : 'default'}\n onClick={onSortClick}\n size=\"small\"\n aria-label=\"Ordenar\"\n >\n <Icon\n icon={sort?.sortType === 'DESC' ? 'SORTING_DESC' : 'SORTING_ASC'}\n />\n </IconButton>\n </Stack>\n );\n }\n\n return (\n <Badge\n badgeContent={activeFiltersCount}\n color=\"primary\"\n invisible={activeFiltersCount === 0}\n sx={{\n '& .MuiBadge-badge': activeFiltersCount\n ? {\n transform: 'scale(0.9) translate(-3px, 7px)',\n position: 'relative',\n opacity: 1,\n transition: 'none',\n }\n : {\n transition: 'none',\n opacity: 0,\n },\n }}\n >\n <Button\n variant=\"text\"\n color={hasActiveFilters ? 'primary' : 'inherit'}\n startIcon={<Icon icon=\"FILTER_VERTICAL\" />}\n onClick={onFilterClick}\n size=\"small\"\n >\n Filtrar\n </Button>\n </Badge>\n );\n};\n\nexport default memo(FilterButton, isEqual);\n","import { memo } from 'react';\nimport isEqual from 'react-fast-compare';\n\nimport { FiltersSectionProps } from '../props';\n\nimport FiltersContainer from './filters/FiltersContainer';\n\nconst FiltersSection = ({\n showFilterButton,\n isOpen,\n filterAnchorEl,\n fields,\n conditions,\n isMobile,\n onClose,\n onAddCondition,\n onUpdateCondition,\n onRemoveCondition,\n onApply,\n onClear,\n onCancel,\n}: FiltersSectionProps) => {\n if (!showFilterButton) return null;\n\n return (\n <FiltersContainer\n open={isOpen || Boolean(filterAnchorEl)}\n anchorEl={filterAnchorEl}\n onClose={onClose}\n fields={fields}\n conditions={conditions}\n onAddCondition={onAddCondition}\n onUpdateCondition={onUpdateCondition}\n onRemoveCondition={onRemoveCondition}\n onApply={onApply}\n onClear={onClear}\n onCancel={onCancel}\n isMobileProp={isMobile}\n />\n );\n};\n\nexport default memo(FiltersSection, isEqual);\n","import { memo } from 'react';\nimport isEqual from 'react-fast-compare';\n\nimport ResponsivePopover from 'components/ResponsivePopover';\n\nimport FiltersContent from './FiltersContent';\nimport type { FiltersContainerProps } from './props';\n\nconst FiltersContainer = (props: FiltersContainerProps) => {\n return (\n <ResponsivePopover\n open={props.open}\n onClose={props.onClose}\n anchorEl={props.anchorEl}\n isMobile={props.isMobileProp}\n popoverProps={{\n slotProps: {\n paper: {\n sx: {\n width: 520,\n maxWidth: 'calc(100vw - 24px)',\n maxHeight: 600,\n mt: 1,\n },\n },\n },\n }}\n drawerProps={{\n anchor: 'right',\n PaperProps: {\n sx: {\n width: '100%',\n maxWidth: '100%',\n height: '100%',\n maxHeight: '100%',\n borderRadius: 0,\n },\n },\n }}\n >\n <FiltersContent {...props} />\n </ResponsivePopover>\n );\n};\n\nexport default memo(FiltersContainer, isEqual);\n","import { memo, useCallback } from 'react';\nimport isEqual from 'react-fast-compare';\nimport Button from '@mui/material/Button';\nimport Divider from '@mui/material/Divider';\nimport IconButton from '@mui/material/IconButton';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\n\nimport Icon from 'components/Icon';\n\nimport { getFilterableFields } from '../../utils/filter';\n\nimport FiltersList from './FiltersList';\nimport type { FiltersPopoverProps } from './props';\nimport { Container, Content, Footer, Header } from './styles';\n\nconst FiltersContent = ({\n onClose,\n fields,\n conditions,\n onAddCondition,\n onUpdateCondition,\n onRemoveCondition,\n onApply,\n onClear,\n onCancel,\n}: FiltersPopoverProps) => {\n const filterableFields = getFilterableFields(fields);\n const hasConditions = conditions.length > 0;\n\n const handleApply = useCallback(() => {\n onApply();\n onClose();\n }, [onApply, onClose]);\n\n const handleClear = useCallback(() => {\n onClear();\n onClose();\n }, [onClear, onClose]);\n\n const handleCancel = useCallback(() => {\n onCancel();\n }, [onCancel]);\n\n return (\n <Container>\n <Header>\n <Typography variant=\"overline\" fontWeight={600} color=\"text.secondary\">\n Defina as condições para filtrar\n </Typography>\n\n <IconButton\n onClick={onAddCondition}\n size=\"small\"\n aria-label=\"Adicionar filtro\"\n title=\"Adicionar filtro\"\n disabled={conditions.length >= filterableFields.length}\n >\n <Icon icon=\"SIMPLE_ADD\" />\n </IconButton>\n </Header>\n\n <Divider />\n\n <Content>\n <FiltersList\n filterableFields={filterableFields}\n conditions={conditions}\n onUpdateCondition={onUpdateCondition}\n onRemoveCondition={onRemoveCondition}\n />\n </Content>\n\n <Divider />\n\n <Footer>\n <Button variant=\"text\" color=\"inherit\" onClick={handleClear}>\n Limpar\n </Button>\n\n <Stack direction=\"row\" spacing={1}>\n <Button\n variant=\"outlined\"\n color=\"inherit\"\n onClick={handleCancel}\n startIcon={<Icon icon=\"CANCEL_CIRCLE\" />}\n >\n Cancelar\n </Button>\n <Button\n variant=\"contained\"\n onClick={handleApply}\n disabled={!hasConditions}\n startIcon={<Icon icon=\"SIMPLE_CHECK\" />}\n >\n Aplicar\n </Button>\n </Stack>\n </Footer>\n </Container>\n );\n};\n\nexport default memo(FiltersContent, isEqual);\n","import { Condition, DataType, Field } from 'model/entity-metadata';\nimport {\n Filter,\n FilterCondition,\n FilterOperator,\n FilterState,\n} from 'model/filter';\n\n/**\n * Campos filtráveis (campos com condições disponíveis)\n */\nexport const getFilterableFields = (fields: Field[]): Field[] => {\n return fields.filter(\n field =>\n field.available_filter_conditions &&\n field.available_filter_conditions.length > 0 &&\n field.name !== 'ACTIONS',\n );\n};\n\n/**\n * Converte FilterState para formato de API\n */\nexport const buildFilterFromState = (\n state: FilterState,\n): Filter | undefined => {\n const entries = Object.entries(state).filter(\n ([, value]) => value.value.length > 0,\n );\n if (entries.length === 0) return undefined;\n return {\n operator: FilterOperator.AND,\n groups: [\n {\n operator: FilterOperator.AND,\n conditionals: entries.map(([, filterValue]) => ({\n fieldName: filterValue.fieldName,\n conditional: filterValue.conditional,\n value: filterValue.value,\n })),\n },\n ],\n };\n};\n\n/**\n * Retorna o conditional padrão para um tipo de campo\n */\nexport const getDefaultCondition = (field: Field): Condition => {\n const { type, available_filter_conditions } = field;\n if (available_filter_conditions.length === 0) return Condition.EQUALS;\n if (\n type === DataType.TEXT &&\n available_filter_conditions.includes(Condition.LIKE)\n ) {\n return Condition.LIKE;\n }\n return available_filter_conditions[0];\n};\n\n/**\n * Verifica se uma condição é válida (tem valor ou não requer valor)\n */\nexport const isValidCondition = (condition: FilterCondition): boolean => {\n return (\n condition.value.length > 0 ||\n condition.conditional === Condition.IS_NULL ||\n condition.conditional === Condition.IS_NOT_NULL\n );\n};\n\n/**\n * Converte array de FilterCondition para Filter API\n */\nexport const buildFilterFromConditions = (\n conditions: FilterCondition[],\n): Filter | undefined => {\n if (conditions.length === 0) return undefined;\n\n const validConditions = conditions.filter(isValidCondition);\n if (validConditions.length === 0) return undefined;\n\n return {\n operator: FilterOperator.AND,\n groups: [\n {\n operator: validConditions[0]?.operator || FilterOperator.AND,\n conditionals: validConditions.map(c => ({\n fieldName: c.fieldName,\n conditional: c.conditional,\n value: c.value,\n })),\n },\n ],\n };\n};\n","import { memo, useCallback, useMemo } from 'react';\nimport isEqual from 'react-fast-compare';\nimport Typography from '@mui/material/Typography';\nimport type { FilterCondition } from 'model/filter';\n\nimport FilterRow from './FilterRow';\nimport type { FiltersListProps } from './props';\n\nconst FiltersList = ({\n filterableFields,\n conditions,\n onUpdateCondition,\n onRemoveCondition,\n}: FiltersListProps) => {\n const handleUpdateCondition = useCallback(\n (updated: FilterCondition) => {\n onUpdateCondition(updated.id, updated);\n },\n [onUpdateCondition],\n );\n\n const handleRemoveCondition = useCallback(\n (id: string) => () => {\n onRemoveCondition(id);\n },\n [onRemoveCondition],\n );\n\n const usedFieldNames = useMemo(\n () =>\n conditions.map(c => c.fieldName).filter((name): name is string => !!name),\n [conditions],\n );\n\n const getAvailableFields = useCallback(\n (currentFieldName: string | undefined) =>\n filterableFields.filter(\n field =>\n !usedFieldNames.includes(field.name) ||\n field.name === currentFieldName,\n ),\n [filterableFields, usedFieldNames],\n );\n\n if (filterableFields.length === 0) {\n return (\n <Typography variant=\"body2\" color=\"text.secondary\" textAlign=\"center\">\n Nenhum filtro disponível\n </Typography>\n );\n }\n\n if (conditions.length === 0) {\n return (\n <Typography variant=\"body2\" color=\"text.secondary\" textAlign=\"center\">\n Clique em{' '}\n <Typography\n component=\"strong\"\n variant=\"body2\"\n fontWeight={600}\n color=\"text.primary\"\n >\n &quot;+&quot;\n </Typography>{' '}\n para adicionar um filtro\n </Typography>\n );\n }\n\n return (\n <>\n {conditions.map((condition, index) => (\n <FilterRow\n key={condition.id}\n condition={condition}\n fields={getAvailableFields(condition.fieldName)}\n onChange={handleUpdateCondition}\n onRemove={handleRemoveCondition(condition.id)}\n showOperator={index > 0}\n totalConditions={conditions.length}\n isFirst={index === 0}\n />\n ))}\n </>\n );\n};\n\nexport default memo(FiltersList, isEqual);\n","import { memo, useCallback, useMemo } from 'react';\nimport isEqual from 'react-fast-compare';\nimport FormControl from '@mui/material/FormControl';\nimport IconButton from '@mui/material/IconButton';\nimport InputLabel from '@mui/material/InputLabel';\nimport MenuItem from '@mui/material/MenuItem';\nimport Select from '@mui/material/Select';\nimport Stack from '@mui/material/Stack';\nimport TextField from '@mui/material/TextField';\nimport { Condition } from 'model/entity-metadata';\n\nimport Icon from 'components/Icon';\n\nimport { CONDITION_LABELS } from '../../constants/filter';\n\nimport OperatorSelect from './OperatorSelect';\nimport type { FilterRowProps } from './props';\n\nconst ellipsisStyle = {\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n} as const;\n\nconst FilterRow = ({\n condition,\n fields,\n onChange,\n onRemove,\n totalConditions,\n isFirst,\n}: FilterRowProps) => {\n const selectedField = useMemo(\n () => fields.find(f => (f.filter_field_name ?? f.name) === condition.fieldName),\n [fields, condition.fieldName],\n );\n\n const availableConditions = useMemo(\n () => selectedField?.available_filter_conditions || [],\n [selectedField],\n );\n\n const isValueDisabled = useMemo(\n () =>\n !condition.fieldName ||\n condition.conditional === 'IS_NULL' ||\n condition.conditional === 'IS_NOT_NULL',\n [condition.fieldName, condition.conditional],\n );\n\n const handleFieldChange = useCallback(\n (fieldName: string) => {\n const newField = fields.find(f => (f.filter_field_name ?? f.name) === fieldName);\n if (!newField) return;\n\n const defaultCondition =\n newField.available_filter_conditions[0] || 'EQUALS';\n\n onChange({\n ...condition,\n fieldName,\n conditional: defaultCondition,\n value: [],\n });\n },\n [fields, condition, onChange],\n );\n\n const handleConditionChange = useCallback(\n (conditional: Condition) => {\n onChange({\n ...condition,\n conditional,\n });\n },\n [condition, onChange],\n );\n\n const handleValueChange = useCallback(\n (value: string) => {\n onChange({\n ...condition,\n value: value ? [value] : [],\n });\n },\n [condition, onChange],\n );\n\n const handleOperatorChange = useCallback(\n (operator: 'AND' | 'OR') => {\n onChange({\n ...condition,\n operator,\n });\n },\n [condition, onChange],\n );\n\n return (\n <Stack direction=\"row\" spacing={1} alignItems=\"center\">\n <IconButton\n onClick={onRemove}\n size=\"small\"\n aria-label=\"Remover filtro\"\n sx={{ flexShrink: 0 }}\n >\n <Icon icon=\"CLOSE_MARK_BUTTON\" width={18} />\n </IconButton>\n\n <OperatorSelect\n value={condition.operator}\n onChange={handleOperatorChange}\n totalConditions={totalConditions}\n isFirst={isFirst}\n />\n\n <FormControl size=\"small\" sx={{ minWidth: 150, flex: 1 }}>\n <InputLabel id={`field-label-${condition.id}`}>Coluna</InputLabel>\n <Select\n labelId={`field-label-${condition.id}`}\n label=\"Coluna\"\n value={condition.fieldName}\n onChange={e => handleFieldChange(e.target.value)}\n size=\"small\"\n sx={{\n '& .MuiSelect-select': ellipsisStyle,\n }}\n >\n {fields.map(field => (\n <MenuItem\n key={field.name}\n value={field.filter_field_name ?? field.name}\n sx={ellipsisStyle}\n title={field.description || field.name}\n >\n {field.description || field.name}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n\n <FormControl\n size=\"small\"\n sx={{ minWidth: 90 }}\n disabled={!condition.fieldName}\n >\n <InputLabel id={`condition-label-${condition.id}`}>Condição</InputLabel>\n <Select\n labelId={`condition-label-${condition.id}`}\n label=\"Condição\"\n value={condition.conditional}\n onChange={e => handleConditionChange(e.target.value as Condition)}\n size=\"small\"\n sx={{\n '& .MuiSelect-select': ellipsisStyle,\n }}\n >\n {availableConditions.map(cond => (\n <MenuItem key={cond} value={cond} sx={ellipsisStyle}>\n {CONDITION_LABELS[cond as Condition] || cond}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n\n {selectedField?.type === 'BOOLEAN' ? (\n <FormControl\n size=\"small\"\n sx={{ flex: 1, minWidth: 120 }}\n disabled={isValueDisabled}\n >\n <InputLabel id={`value-label-${condition.id}`}>Valor</InputLabel>\n <Select\n labelId={`value-label-${condition.id}`}\n label=\"Valor\"\n value={condition.value[0] || ''}\n onChange={e => handleValueChange(e.target.value)}\n size=\"small\"\n sx={{\n '& .MuiSelect-select': ellipsisStyle,\n }}\n >\n <MenuItem value=\"true\">Verdadeiro</MenuItem>\n <MenuItem value=\"false\">Falso</MenuItem>\n </Select>\n </FormControl>\n ) : (\n <TextField\n label=\"Filtro\"\n value={condition.value[0] || ''}\n onChange={e => handleValueChange(e.target.value)}\n size=\"small\"\n disabled={isValueDisabled}\n InputLabelProps={{ shrink: true }}\n sx={{ flex: 1, minWidth: 120 }}\n />\n )}\n </Stack>\n );\n};\n\nexport default memo(FilterRow, isEqual);\n","import { Condition } from 'model/entity-metadata';\n\nexport const CONDITION_LABELS: Record<Condition, string> = {\n [Condition.EQUALS]: 'Igual a',\n [Condition.NOT_EQUALS]: 'Diferente de',\n [Condition.LIKE]: 'Contém',\n [Condition.NOT_LIKE]: 'Não contém',\n [Condition.GREATER_THAN]: 'Maior que',\n [Condition.LESS_THAN]: 'Menor que',\n [Condition.GREATER_THAN_OR_EQUAL]: 'Maior ou igual a',\n [Condition.LESS_THAN_OR_EQUAL]: 'Menor ou igual a',\n [Condition.IN]: 'Em',\n [Condition.NOT_IN]: 'Não em',\n [Condition.IS_NULL]: 'É nulo',\n [Condition.IS_NOT_NULL]: 'Não é nulo',\n};\n","import { memo } from 'react';\nimport isEqual from 'react-fast-compare';\nimport MenuItem from '@mui/material/MenuItem';\nimport Select from '@mui/material/Select';\nimport Stack from '@mui/material/Stack';\n\nimport type { OperatorSelectProps } from './props';\n\nconst OperatorSelect = ({\n value,\n onChange,\n totalConditions,\n isFirst,\n}: OperatorSelectProps) => {\n if (totalConditions === 1) {\n return null;\n }\n\n if (isFirst) {\n return <Stack sx={{ width: 55, flexShrink: 0 }} />;\n }\n\n return (\n <Select\n value={value}\n onChange={e => onChange(e.target.value as 'AND' | 'OR')}\n size=\"small\"\n sx={{ width: 55, flexShrink: 0 }}\n >\n <MenuItem value=\"AND\">e</MenuItem>\n <MenuItem value=\"OR\">ou</MenuItem>\n </Select>\n );\n};\n\nexport default memo(OperatorSelect, isEqual);\n","import Box from '@mui/material/Box';\nimport { styled } from '@mui/material/styles';\n\n// Estilos baseados no Drawer/Popover para garantir consistência\nexport const Container = styled(Box)({\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n // No popover, a altura será controlada pelo max-height do container\n});\n\nexport const Header = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: theme.spacing(2, 3),\n}));\n\nexport const Content = styled(Box)(({ theme }) => ({\n flex: 1,\n overflowY: 'auto',\n padding: theme.spacing(3),\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(2),\n}));\n\nexport const Footer = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: theme.spacing(2),\n}));\n","import { memo, useCallback, useEffect, useMemo, useState } from 'react';\nimport Button from '@mui/material/Button';\nimport FormControl from '@mui/material/FormControl';\nimport InputLabel from '@mui/material/InputLabel';\nimport MenuItem from '@mui/material/MenuItem';\nimport Select from '@mui/material/Select';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport { SortType } from 'model/filter';\n\nimport Icon from 'components/Icon';\n\nimport { SortModalProps } from './props';\nimport {\n ApplyButton,\n LabelButton,\n StyledDialog,\n StyledDialogActions,\n StyledDialogContent,\n StyledDialogTitle,\n} from './style';\n\nconst SortModal = ({\n open,\n onClose,\n fields,\n sort,\n onSortChange,\n}: SortModalProps) => {\n const [selectedField, setSelectedField] = useState<string>(\n sort?.fieldName || '',\n );\n const [selectedDirection, setSelectedDirection] = useState<SortType>(\n sort?.sortType || SortType.ASC,\n );\n\n const sortableFields = useMemo(\n () =>\n fields.filter(\n field => field.name !== 'ACTIONS' && field.access_type !== 'WRITE_ONLY',\n ),\n [fields],\n );\n\n const selectedFieldObj = useMemo(\n () => fields.find(field => (field.filter_field_name ?? field.name) === selectedField),\n [fields, selectedField],\n );\n\n const isNumberField =\n selectedFieldObj?.type === 'DECIMAL' ||\n selectedFieldObj?.type === 'INTEGER';\n\n useEffect(() => {\n if (open) {\n setSelectedField(sort?.fieldName || '');\n setSelectedDirection(sort?.sortType || SortType.ASC);\n }\n }, [open, sort]);\n\n const handleApply = useCallback(() => {\n if (onSortChange) {\n if (!selectedField) {\n onSortChange(undefined);\n } else {\n onSortChange({\n fieldName: selectedField,\n sortType: selectedDirection,\n });\n }\n }\n onClose();\n }, [onSortChange, selectedField, selectedDirection, onClose]);\n\n const handleClear = useCallback(() => {\n if (!onSortChange) return;\n\n setSelectedField('');\n setSelectedDirection(SortType.ASC);\n\n onSortChange(undefined);\n onClose();\n }, [onSortChange, onClose]);\n\n return (\n <StyledDialog open={open} onClose={onClose} maxWidth=\"xs\" fullWidth>\n <StyledDialogTitle>\n <Typography variant=\"overline\" color=\"text.secondary\">\n Ordenar por\n </Typography>\n </StyledDialogTitle>\n <StyledDialogContent>\n <Stack spacing={2} pt={2}>\n <FormControl fullWidth size=\"small\">\n <InputLabel id=\"sort-field-label\">Campo</InputLabel>\n <Select\n labelId=\"sort-field-label\"\n value={selectedField}\n label=\"Campo\"\n onChange={e => setSelectedField(e.target.value)}\n >\n <MenuItem value=\"\">\n <em>Nenhum</em>\n </MenuItem>\n {sortableFields.map(field => (\n <MenuItem key={field.name} value={field.filter_field_name ?? field.name}>\n {field.description || field.name}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n <FormControl fullWidth size=\"small\" disabled={!selectedField}>\n <InputLabel id=\"sort-direction-label\">Direção</InputLabel>\n <Select\n labelId=\"sort-direction-label\"\n value={selectedDirection}\n label=\"Direção\"\n onChange={e => setSelectedDirection(e.target.value as SortType)}\n >\n <MenuItem value={SortType.ASC}>\n Crescente {isNumberField ? '(1-9)' : '(A-Z)'}\n </MenuItem>\n <MenuItem value={SortType.DESC}>\n Decrescente {isNumberField ? '(9-1)' : '(Z-A)'}\n </MenuItem>\n </Select>\n </FormControl>\n </Stack>\n </StyledDialogContent>\n <StyledDialogActions>\n <Stack flex={1} width=\"100%\" direction=\"row\">\n <Button color=\"inherit\" onClick={handleClear}>\n Limpar\n </Button>\n </Stack>\n <Button\n onClick={onClose}\n variant=\"outlined\"\n color=\"inherit\"\n sx={{ minWidth: 24 }}\n >\n <Icon icon=\"CANCEL_CIRCLE\" />\n <LabelButton>Cancelar</LabelButton>\n </Button>\n <ApplyButton onClick={handleApply} variant=\"contained\">\n <Icon icon=\"SIMPLE_CHECK\" />\n <LabelButton>Aplicar</LabelButton>\n </ApplyButton>\n </StyledDialogActions>\n </StyledDialog>\n );\n};\n\nSortModal.displayName = 'SortModal';\n\nexport default memo(SortModal);\n","import Button from '@mui/material/Button';\nimport Dialog from '@mui/material/Dialog';\nimport DialogActions from '@mui/material/DialogActions';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport { styled } from '@mui/material/styles';\nimport Typography from '@mui/material/Typography';\n\nexport const StyledDialog = styled(Dialog)(() => ({\n '& .MuiDialog-paper': { width: '100%' },\n}));\n\nexport const StyledDialogTitle = styled(DialogTitle)(({ theme }) => ({\n borderBottom: '1px solid',\n borderColor: theme.palette.divider,\n padding: theme.spacing(1.5, 2),\n}));\n\nexport const StyledDialogContent = styled(DialogContent)(({ theme }) => ({\n padding: theme.spacing(2),\n}));\n\nexport const StyledDialogActions = styled(DialogActions)(({ theme }) => ({\n borderTop: '1px solid',\n borderColor: theme.palette.divider,\n padding: theme.spacing(1.5, 2),\n}));\n\nexport const ApplyButton = styled(Button)(({ theme }) => ({\n minWidth: 24,\n [theme.breakpoints.down(330)]: {\n padding: theme.spacing(1),\n },\n}));\n\nexport const LabelButton = styled(Typography)(({ theme }) => ({\n fontWeight: '600',\n margin: theme.spacing(0, 1),\n [theme.breakpoints.down(330)]: {\n fontSize: 0,\n margin: 0,\n },\n}));\n","import { useMemo } from 'react';\nimport type { GridColDef } from '@mui/x-data-grid-premium';\n\nimport { UseColumnOrderingParams } from '../props';\n\nexport const useColumnOrdering = ({\n columns,\n fields,\n preferredFieldOrder,\n}: UseColumnOrderingParams) => {\n const columnsByFieldId = useMemo(\n () => new Map(columns.map(column => [column.field, column])),\n [columns],\n );\n\n const fieldsByName = useMemo(\n () => new Map(fields?.map(f => [f.name, f]) || []),\n [fields],\n );\n\n const orderedColumns = useMemo(() => {\n if (!preferredFieldOrder || preferredFieldOrder.length === 0 || !fields) {\n return columns;\n }\n\n const actionFieldName = 'ACTIONS';\n const preferredWithoutActions = preferredFieldOrder.filter(\n fieldName => fieldName !== actionFieldName,\n );\n\n const usedColumnFieldIds = new Set<string>();\n const ordered: GridColDef[] = [];\n\n const pushColumnForField = (fieldName: string) => {\n const field = fieldsByName.get(fieldName);\n if (!field) return;\n\n const column = columnsByFieldId.get(field.name);\n\n if (!column || usedColumnFieldIds.has(field.name)) return;\n\n ordered.push(column);\n usedColumnFieldIds.add(field.name);\n };\n\n preferredWithoutActions.forEach(fieldName => {\n pushColumnForField(fieldName);\n });\n\n fields.forEach(field => {\n if (field.name === actionFieldName) return;\n if (preferredWithoutActions.includes(field.name)) return;\n\n const column = columnsByFieldId.get(field.name);\n\n if (!column || usedColumnFieldIds.has(field.name)) return;\n\n ordered.push(column);\n usedColumnFieldIds.add(field.name);\n });\n\n pushColumnForField(actionFieldName);\n\n return ordered.length === 0 ? columns : ordered;\n }, [columns, columnsByFieldId, fieldsByName, preferredFieldOrder, fields]);\n\n return { orderedColumns, columnsByFieldId, fieldsByName };\n};\n","import { useCallback, useMemo } from 'react';\nimport type { GridColumnVisibilityModel } from '@mui/x-data-grid-premium';\nimport { Field } from 'model/entity-metadata';\n\nimport useLocalStorage from 'hooks/useLocalStorage';\n\nimport { UseColumnVisibilityParams } from '../props';\n\nfunction getColumnFieldIdFromField(field: Field): string {\n return field.name;\n}\n\nexport const useColumnVisibility = ({\n fields,\n columnsByFieldId,\n defaultVisibleFieldNames,\n columnVisibilityStorageKey,\n onColumnVisibilityModelChange,\n}: UseColumnVisibilityParams) => {\n const hasStorageKey = Boolean(columnVisibilityStorageKey);\n\n const [storedVisibilityModel, setStoredVisibilityModel] = useLocalStorage<\n GridColumnVisibilityModel | undefined\n >(columnVisibilityStorageKey || '__dynamic-data-view:columns__', undefined, {\n initializeWithValue: hasStorageKey,\n });\n\n const initialState = useMemo(() => {\n if (!fields) return undefined;\n\n const visibilityModel: GridColumnVisibilityModel = {};\n\n fields.forEach(field => {\n const columnFieldId = getColumnFieldIdFromField(field);\n if (!columnsByFieldId.has(columnFieldId)) return;\n\n let visible: boolean | undefined;\n\n if (hasStorageKey && storedVisibilityModel) {\n const stored = storedVisibilityModel[columnFieldId];\n if (typeof stored === 'boolean') {\n visible = stored;\n }\n }\n\n if (\n visible === undefined &&\n defaultVisibleFieldNames &&\n defaultVisibleFieldNames.length > 0\n ) {\n visible = defaultVisibleFieldNames.includes(field.name);\n }\n\n if (typeof visible === 'boolean') {\n visibilityModel[columnFieldId] = visible;\n }\n });\n\n if (Object.keys(visibilityModel).length === 0) return undefined;\n\n return {\n columns: {\n columnVisibilityModel: visibilityModel,\n },\n };\n }, [\n columnsByFieldId,\n defaultVisibleFieldNames,\n fields,\n hasStorageKey,\n storedVisibilityModel,\n ]);\n\n const handleColumnVisibilityModelChange = useCallback(\n (model: GridColumnVisibilityModel) => {\n if (hasStorageKey) {\n setStoredVisibilityModel(model);\n }\n\n if (onColumnVisibilityModelChange) {\n onColumnVisibilityModelChange(model);\n }\n },\n [hasStorageKey, onColumnVisibilityModelChange, setStoredVisibilityModel],\n );\n\n return {\n initialState,\n handleColumnVisibilityModelChange,\n };\n};\n","import { useMemo } from 'react';\nimport { GridColDef } from '@mui/x-data-grid-premium';\n\nimport { Columns } from 'types/datagrid';\n\nimport { ACCESS_TYPES } from '../constants/columnDefaults';\nimport { UseDynamicColumnsProps } from '../props';\nimport { getColumnStrategy } from '../utils/columnStrategies';\n\nexport const useDynamicColumns = <T extends object>({\n metadata,\n renderCell,\n columnStrategies,\n}: UseDynamicColumnsProps<T>): Columns => {\n return useMemo(() => {\n if (!metadata?.fields) return [];\n\n const columnsMap = new Map<string, GridColDef>();\n\n const visibleFields = metadata.fields.filter(field => {\n if (\n field.access_type === ACCESS_TYPES.READ_ONLY ||\n field.access_type === ACCESS_TYPES.READ_AND_WRITE\n ) {\n return true;\n }\n\n return (\n field.name === 'ACTIONS' ||\n field.name === metadata?.id_field_name ||\n field.name === 'NAME'\n );\n });\n\n visibleFields.forEach(field => {\n if (columnsMap.has(field.name)) {\n return;\n }\n\n const strategy =\n columnStrategies?.[field.name] ?? getColumnStrategy<T>(field, metadata);\n const column = strategy(field, renderCell, metadata);\n\n columnsMap.set(field.name, column);\n });\n\n return Array.from(columnsMap.values());\n }, [columnStrategies, metadata, renderCell]);\n};\n","export const COLUMN_DEFAULTS = {\n IMAGE_WIDTH: 90,\n MIN_WIDTH: 130,\n ENTITY_MIN_WIDTH: 100,\n ENTITY_FLEX: 0.5,\n ID_MIN_WIDTH: 200,\n ID_FLEX: 1,\n ACTIONS_WIDTH: 80,\n} as const;\n\nexport const ACCESS_TYPES = {\n READ_ONLY: 'READ_ONLY',\n READ_AND_WRITE: 'READ_AND_WRITE',\n} as const;\n\nexport const CURRENCY_FIELD_NAMES: readonly string[] = [\n 'price',\n 'base_price',\n 'minimum_value',\n 'maximum_value',\n 'minimum_installment_value',\n];\n","import { GridColDef, GridRenderCellParams } from '@mui/x-data-grid-premium';\nimport { Field } from 'model/entity-metadata';\n\nimport { COLUMN_DEFAULTS } from '../constants/columnDefaults';\nimport { CellRenderer, ColumnStrategy, DynamicRowData } from '../props';\n\nconst createImageColumn = <T extends object>(\n field: Field,\n renderCell: CellRenderer<T>,\n): GridColDef => ({\n field: field.name,\n headerName: field.description,\n sortable: false,\n width: COLUMN_DEFAULTS.IMAGE_WIDTH,\n resizable: false,\n headerAlign: 'center',\n align: 'center',\n renderCell: (params: GridRenderCellParams) =>\n renderCell(field, params.row as DynamicRowData<T>),\n});\n\nconst createIdColumn = <T extends object>(\n field: Field,\n renderCell: CellRenderer<T>,\n): GridColDef => ({\n field: field.name,\n headerName: field.description,\n minWidth: COLUMN_DEFAULTS.ID_MIN_WIDTH,\n flex: COLUMN_DEFAULTS.ID_FLEX,\n renderCell: (params: GridRenderCellParams) =>\n renderCell(field, params.row as DynamicRowData<T>),\n});\n\nconst createEntityColumn = <T extends object>(\n field: Field,\n renderCell: CellRenderer<T>,\n): GridColDef => ({\n field: field.name,\n headerName: field.description,\n minWidth: COLUMN_DEFAULTS.ENTITY_MIN_WIDTH,\n flex: COLUMN_DEFAULTS.ENTITY_FLEX,\n renderCell: (params: GridRenderCellParams) =>\n renderCell(field, params.row as DynamicRowData<T>),\n});\n\nconst createDefaultColumn = <T extends object>(\n field: Field,\n renderCell: CellRenderer<T>,\n): GridColDef => ({\n field: field.name,\n headerName: field.description,\n minWidth: COLUMN_DEFAULTS.MIN_WIDTH,\n renderCell: (params: GridRenderCellParams) =>\n renderCell(field, params.row as DynamicRowData<T>),\n});\n\nconst createActionsColumn = <T extends object>(\n field: Field,\n renderCell: CellRenderer<T>,\n): GridColDef => ({\n field: field.name,\n headerName: 'Ações',\n width: COLUMN_DEFAULTS.ACTIONS_WIDTH,\n sortable: false,\n resizable: false,\n disableReorder: true,\n headerAlign: 'center',\n disableColumnMenu: true,\n align: 'center',\n renderCell: (params: GridRenderCellParams) =>\n renderCell(field, params.row as DynamicRowData<T>),\n});\n\nexport const getColumnStrategy = <T extends object>(\n field: Field,\n metadata?: { id_field_name?: string },\n): ColumnStrategy<T> => {\n if (field.name === metadata?.id_field_name || field.name === 'name') {\n return createIdColumn;\n }\n\n if (field.name === 'ACTIONS') {\n return createActionsColumn;\n }\n\n if (field.type === 'FILE') {\n return createImageColumn;\n }\n\n if (field.type === 'ENTITY') {\n return createEntityColumn;\n }\n\n return createDefaultColumn;\n};\n","import { useCallback, useRef, useState } from 'react';\nimport type { Filter, FilterCondition } from 'model/filter';\n\nimport uuidv4 from 'utils/uuidv4';\n\nimport { UseFiltersProps, UseFiltersReturn } from '../props';\nimport {\n buildFilterFromConditions,\n getDefaultCondition,\n isValidCondition,\n} from '../utils/filter';\n\n// Converte filtro inicial em condições\nconst parseInitialConditions = (initialFilter?: Filter): FilterCondition[] => {\n if (!initialFilter?.groups?.[0]?.conditionals) return [];\n return initialFilter.groups[0].conditionals.map(cond => ({\n id: uuidv4(),\n operator: initialFilter.groups[0].operator,\n fieldName: cond.fieldName,\n conditional: cond.conditional,\n value: cond.value,\n }));\n};\n\n/**\n * Hook para gerenciar estado de filtros do DynamicDataView com condições dinâmicas\n *\n * - conditions: estado de edição (o que o usuário vê no popover)\n * - appliedConditions: estado aplicado (o que está efetivamente filtrando)\n * - hasActiveFilters/activeFiltersCount: calculados com base em appliedConditions\n */\nexport const useFilters = ({\n fields,\n initialFilter,\n}: UseFiltersProps): UseFiltersReturn => {\n const [isOpen, setIsOpen] = useState(false);\n\n // Estado aplicado (efetivamente filtrando)\n const [appliedConditions, setAppliedConditions] = useState<FilterCondition[]>(\n () => parseInitialConditions(initialFilter),\n );\n const [appliedFilter, setAppliedFilter] = useState<Filter | undefined>(\n initialFilter,\n );\n\n // Estado de edição (o que o usuário vê/edita no popover)\n const [conditions, setConditions] = useState<FilterCondition[]>(() =>\n parseInitialConditions(initialFilter),\n );\n\n // Referência para snapshot antes de abrir o popover\n const snapshotRef = useRef<FilterCondition[]>([]);\n\n const openDrawer = useCallback(() => {\n // Salva snapshot das condições atuais (aplicadas) ao abrir\n snapshotRef.current = appliedConditions.map(c => ({ ...c }));\n // Sincroniza edição com aplicado ao abrir\n setConditions(appliedConditions.map(c => ({ ...c })));\n setIsOpen(true);\n }, [appliedConditions]);\n\n const closeDrawer = () => setIsOpen(false);\n\n const addCondition = useCallback(() => {\n const filterableFields = fields.filter(\n f => f.available_filter_conditions?.length > 0,\n );\n if (filterableFields.length === 0) return;\n\n const usedFieldNames = conditions.map(c => c.fieldName);\n const availableFields = filterableFields.filter(\n f => !usedFieldNames.includes(f.filter_field_name ?? f.name),\n );\n if (availableFields.length === 0) return;\n\n const currentOperator =\n conditions.length > 0 ? conditions[0].operator : 'AND';\n const firstField = availableFields[0];\n const newCondition: FilterCondition = {\n id: uuidv4(),\n operator: currentOperator,\n fieldName: firstField.filter_field_name ?? firstField.name,\n conditional: getDefaultCondition(firstField),\n value: [],\n };\n\n setConditions(prev => [...prev, newCondition]);\n }, [fields, conditions]);\n\n const updateCondition = useCallback(\n (id: string, changes: Partial<FilterCondition>) => {\n setConditions(prev => {\n const targetCondition = prev.find(c => c.id === id);\n if (!targetCondition) return prev;\n\n if (changes.operator && changes.operator !== targetCondition.operator) {\n const newOperator = changes.operator;\n return prev.map(c => {\n if (c.id === id) {\n return { ...c, ...changes };\n }\n return { ...c, operator: newOperator };\n });\n }\n\n return prev.map(c => (c.id === id ? { ...c, ...changes } : c));\n });\n },\n [],\n );\n\n const removeCondition = useCallback((id: string) => {\n setConditions(prev => prev.filter(c => c.id !== id));\n }, []);\n\n const clearAllFilters = () => {\n setConditions([]);\n setAppliedConditions([]);\n setAppliedFilter(undefined);\n };\n\n const applyFilters = () => {\n const filter = buildFilterFromConditions(conditions);\n setAppliedConditions(conditions.map(c => ({ ...c })));\n setAppliedFilter(filter);\n setIsOpen(false);\n return filter;\n };\n\n const cancelChanges = () => {\n // Reverte para o snapshot salvo ao abrir\n setConditions(snapshotRef.current.map(c => ({ ...c })));\n setIsOpen(false);\n };\n\n // Calculado com base nos filtros APLICADOS (não em edição)\n const hasActiveFilters = appliedConditions.some(isValidCondition);\n const activeFiltersCount = appliedConditions.filter(isValidCondition).length;\n\n return {\n conditions,\n filter: appliedFilter,\n isOpen,\n hasActiveFilters,\n activeFiltersCount,\n openDrawer,\n closeDrawer,\n addCondition,\n updateCondition,\n removeCondition,\n clearAllFilters,\n applyFilters,\n cancelChanges,\n };\n};\n\nexport default useFilters;\n","import { useEffect, useState } from 'react';\nimport { Filter, Sort } from 'model/filter';\n\nconst getStoredValue = <T>(key: string): T | undefined => {\n try {\n const item = localStorage.getItem(key);\n return item ? JSON.parse(item) : undefined;\n } catch {\n return undefined;\n }\n};\n\nconst setStoredValue = <T>(key: string, value: T | undefined): void => {\n try {\n if (value === undefined) {\n localStorage.removeItem(key);\n } else {\n localStorage.setItem(key, JSON.stringify(value));\n }\n } catch {\n // Silently ignore localStorage errors\n }\n};\n\nexport const useFilterStorage = (\n storageKey: string,\n externalFilter?: Filter,\n onFilterChange?: (filter: Filter | undefined) => void,\n) => {\n const filterKey = `${storageKey}:filter`;\n\n const [internalFilter, setInternalFilter] = useState<Filter | undefined>(\n () => {\n return getStoredValue<Filter>(filterKey) || externalFilter;\n },\n );\n\n // Sync with external filter\n useEffect(() => {\n if (externalFilter !== undefined) {\n setInternalFilter(externalFilter);\n }\n }, [externalFilter]);\n\n const handleFilterChange = (newFilter: Filter | undefined) => {\n setInternalFilter(newFilter);\n setStoredValue(filterKey, newFilter);\n onFilterChange?.(newFilter);\n };\n\n return {\n filter: internalFilter,\n setFilter: handleFilterChange,\n };\n};\n\nexport const useSortStorage = (\n storageKey: string,\n externalSort?: Sort,\n onSortChange?: (sort: Sort | undefined) => void,\n) => {\n const sortKey = `${storageKey}:sort`;\n\n const [internalSort, setInternalSort] = useState<Sort | undefined>(() => {\n return getStoredValue<Sort>(sortKey) || externalSort;\n });\n\n // Sync with external sort\n useEffect(() => {\n if (externalSort !== undefined) {\n setInternalSort(externalSort);\n }\n }, [externalSort]);\n\n const handleSortChange = (newSort: Sort | undefined) => {\n setInternalSort(newSort);\n setStoredValue(sortKey, newSort);\n onSortChange?.(newSort);\n };\n\n return {\n sort: internalSort,\n setSort: handleSortChange,\n };\n};\n","import { useCallback, useMemo } from 'react';\nimport type { GridSortModel } from '@mui/x-data-grid-premium';\nimport { Sort, SortType } from 'model/filter';\n\nimport { UseSortingParams } from '../props';\n\nexport const useSorting = ({ sort, onSortChange }: UseSortingParams) => {\n const sortModel: GridSortModel = useMemo(() => {\n if (!sort) return [];\n return [\n {\n field: sort.fieldName,\n sort: sort.sortType.toLowerCase() as 'asc' | 'desc',\n },\n ];\n }, [sort]);\n\n const handleSortModelChange = useCallback(\n (model: GridSortModel) => {\n if (!onSortChange) return;\n\n const firstItem = model[0];\n if (!firstItem || !firstItem.sort) {\n onSortChange(undefined);\n return;\n }\n\n const newSort: Sort = {\n fieldName: firstItem.field,\n sortType: firstItem.sort.toUpperCase() as SortType,\n };\n onSortChange(newSort);\n },\n [onSortChange],\n );\n\n return {\n sortModel,\n handleSortModelChange,\n };\n};\n","import {\n AccessType,\n DataType,\n EntityMetadataResponse,\n Field,\n} from 'model/entity-metadata';\n\nexport const createActionsField = (): Field => ({\n name: 'ACTIONS',\n description: '',\n filter_field_name: null,\n type: DataType.TEXT,\n metadata: null,\n access_type: AccessType.READ_ONLY,\n relation_field_name: null,\n available_filter_conditions: [],\n});\n\nexport const addActionsFieldToMetadata = (\n metadata: EntityMetadataResponse,\n): EntityMetadataResponse => {\n const hasActionsField = metadata.fields.some(\n field => field.name === 'ACTIONS',\n );\n\n if (hasActionsField) {\n return metadata;\n }\n\n return {\n ...metadata,\n fields: [...metadata.fields, createActionsField()],\n };\n};\n","import { memo, ReactNode } from 'react';\n\nimport { DatePickerFormat, fDate } from 'utils/formatTime';\n\nexport interface DateRendererProps {\n value: unknown;\n format?: string;\n}\n\nconst DateRenderer = ({ value, format }: DateRendererProps): ReactNode => {\n if (value === null || value === undefined) return '-';\n\n return fDate(value as DatePickerFormat, format);\n};\n\nexport default memo(DateRenderer);\n","import { memo, ReactNode } from 'react';\n\nimport { DatePickerFormat, fDateTime } from 'utils/formatTime';\n\nexport interface DateTimeRendererProps {\n value: unknown;\n format?: string;\n}\n\nconst DateTimeRenderer = ({\n value,\n format,\n}: DateTimeRendererProps): ReactNode => {\n if (value === null || value === undefined) return '-';\n\n return fDateTime(value as DatePickerFormat, format);\n};\n\nexport default memo(DateTimeRenderer);\n","import { memo, ReactNode } from 'react';\nimport Chip from '@mui/material/Chip';\n\nimport { EntityRendererProps } from './props';\n\nconst EntityRenderer = ({ value, field }: EntityRendererProps): ReactNode => {\n if (!field.metadata || typeof value !== 'object' || value === null) {\n return value ? String(value) : '-';\n }\n\n const entityValue = (value as Record<string, unknown>)[\n field.metadata.description_field_name\n ];\n\n if (!entityValue) return null;\n\n return (\n <Chip\n label={String(entityValue)}\n variant=\"outlined\"\n size=\"small\"\n sx={{\n width: 'fit-content',\n color: 'text.secondary',\n borderColor: 'divider',\n borderRadius: 3,\n }}\n />\n );\n};\n\nexport default memo(EntityRenderer);\n","import { memo, ReactNode } from 'react';\n\nimport Icon, { IconEnum } from '../../Icon';\n\nimport { IconRendererProps } from './props';\n\nconst IconRenderer = ({\n value,\n trueIcon = IconEnum.STAR_02,\n falseIcon = IconEnum.STAR,\n color = 'primary.main',\n width = 18,\n}: IconRendererProps): ReactNode => {\n return (\n <Icon icon={value ? trueIcon : falseIcon} color={color} width={width} />\n );\n};\n\nexport default memo(IconRenderer);\n","import { memo, ReactNode } from 'react';\n\nimport Icon from 'components/Icon';\n\nimport { ImageRendererProps } from './props';\nimport { ImageContainer } from './style';\n\nconst ImageRenderer = ({\n imageResourceId,\n getImageUrl,\n size = 48,\n alt = 'Imagem',\n onClick,\n sx,\n}: ImageRendererProps): ReactNode => {\n const hasImage = !!imageResourceId;\n const imageUrl =\n hasImage && getImageUrl ? getImageUrl(imageResourceId) : undefined;\n const clickable = !!onClick;\n\n return (\n <ImageContainer\n size={size}\n noImage={!hasImage}\n clickable={clickable}\n onClick={onClick}\n sx={sx}\n >\n {imageUrl ? (\n <img src={imageUrl} alt={alt} />\n ) : (\n <Icon\n icon=\"SEARCH_IMAGE\"\n width={Math.round(size / 2)}\n color=\"text.disabled\"\n />\n )}\n </ImageContainer>\n );\n};\n\nexport default memo(ImageRenderer);\n","import Box from '@mui/material/Box';\nimport { styled } from '@mui/material/styles';\n\n// StatusRenderer styles\nexport interface StatusLabelProps {\n isActive: boolean;\n}\n\nexport const StatusLabel = styled('span')<StatusLabelProps>(\n ({ theme, isActive }) => ({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: theme.spacing(0.2, 1),\n borderRadius: theme.shape.borderRadius,\n fontSize: '0.75rem',\n fontWeight: 600,\n width: 'fit-content',\n height: 'auto',\n lineHeight: '1.25rem',\n whiteSpace: 'nowrap',\n margin: 'auto',\n backgroundColor: isActive\n ? theme.palette.success.lighter || '#00A76F29'\n : theme.palette.warning.lighter || '#FF563029',\n color: isActive\n ? theme.palette.success.darker || '#007867'\n : theme.palette.warning.darker || '#B71D18',\n }),\n);\n\n// ImageRenderer styles\nexport interface ImageContainerProps {\n size: number;\n noImage: boolean;\n clickable: boolean;\n}\n\nexport const ImageContainer = styled(Box, {\n shouldForwardProp: prop =>\n !['size', 'noImage', 'clickable'].includes(prop as string),\n})<ImageContainerProps>(({ theme, size, noImage, clickable }) => ({\n width: size,\n height: size,\n minWidth: size,\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n cursor: clickable ? 'pointer' : 'default',\n transition: 'opacity 0.2s ease-in-out',\n color: theme.palette.text.disabled,\n ...(noImage && {\n border: `1px dashed ${theme.palette.divider}`,\n backgroundColor: theme.palette.grey[100],\n }),\n ...(clickable && {\n '&:hover': {\n opacity: 0.8,\n },\n }),\n '& img': {\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n borderRadius: '50%',\n },\n [theme.breakpoints.down('sm')]: {\n justifyContent: 'flex-start',\n alignItems: 'flex-start',\n },\n}));\n","import { memo, ReactNode } from 'react';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\n\nimport CopyButton from 'components/CopyButton';\n\nimport { NameRendererProps } from './props';\n\nconst NameRenderer = ({\n id,\n displayName,\n copyMessage = 'ID copiado!',\n}: NameRendererProps): ReactNode => {\n return (\n <Stack height={1} justifyContent=\"center\">\n <Typography variant=\"subtitle2\" noWrap title={displayName}>\n {displayName}\n </Typography>\n <Stack direction=\"row\" gap={1} alignItems=\"center\">\n <Typography color=\"grey.600\" variant=\"body2\" noWrap>\n ID: {id}\n </Typography>\n <CopyButton toCopy={id} message={copyMessage} />\n </Stack>\n </Stack>\n );\n};\n\nexport default memo(NameRenderer);\n","import { memo, ReactNode } from 'react';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\n\nimport { fCurrencyBRL, fNumber } from 'utils/formatNumber';\n\nimport { NumberRendererProps } from './props';\n\nconst NumberRenderer = ({\n value,\n isCurrency = false,\n}: NumberRendererProps): ReactNode => {\n if (value === null || value === undefined) return '-';\n\n return (\n <Stack direction=\"row\" alignItems=\"center\" height=\"100%\">\n <Typography variant=\"body2\" noWrap width=\"fit-content\">\n {isCurrency ? fCurrencyBRL(Number(value)) : fNumber(Number(value))}\n </Typography>\n </Stack>\n );\n};\n\nexport default memo(NumberRenderer);\n","import { memo, ReactNode } from 'react';\n\nimport { StatusRendererProps } from './props';\nimport { StatusLabel } from './style';\n\nconst StatusRenderer = ({\n active,\n activeLabel = 'Ativo',\n inactiveLabel = 'Inativo',\n}: StatusRendererProps): ReactNode => {\n return (\n <StatusLabel isActive={active}>\n {active ? activeLabel : inactiveLabel}\n </StatusLabel>\n );\n};\n\nexport default memo(StatusRenderer);\n","import { memo, ReactNode } from 'react';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\n\nimport CopyButton from 'components/CopyButton';\n\nimport { TextRendererProps } from './props';\n\nconst sanitizeHtml = (text: string): string => {\n const withoutTags = text.replace(/<[^>]*>/g, '');\n return withoutTags\n .replace(/&nbsp;/g, ' ')\n .replace(/&amp;/g, '&')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\")\n .trim();\n};\n\nconst TextRenderer = ({\n value,\n showCopyButton = false,\n copyMessage = 'Copiado',\n copyLabel,\n mask,\n}: TextRendererProps): ReactNode => {\n if (!value) return '-';\n\n const stringValue = String(value);\n const formattedValue = mask ? mask(stringValue) : sanitizeHtml(stringValue);\n\n if (showCopyButton) {\n return (\n <Stack direction=\"row\" gap={1} alignItems=\"center\">\n <Typography variant=\"body2\" noWrap>\n {formattedValue}\n </Typography>\n <CopyButton\n toCopy={stringValue}\n message={copyMessage}\n label={copyLabel}\n />\n </Stack>\n );\n }\n\n return formattedValue;\n};\n\nexport default memo(TextRenderer);\n","import { ReactNode } from 'react';\nimport { Field } from 'model/entity-metadata';\n\nimport { CURRENCY_FIELD_NAMES } from '../constants/columnDefaults';\nimport { CellRenderer, DynamicRowData } from '../props';\nimport {\n DateRenderer,\n DateTimeRenderer,\n EntityRenderer,\n NumberRenderer,\n StatusRenderer,\n TextRenderer,\n} from '../renderers';\n\nfunction getIsCurrency(fieldName: string): boolean {\n return CURRENCY_FIELD_NAMES.includes(fieldName);\n}\n\nexport const createCellRenderer = <T extends object = object>(context: {\n onRowAction?: (rowId: string, row: DynamicRowData<T>) => ReactNode;\n}): CellRenderer<T> => {\n const { onRowAction } = context;\n\n const CellRendererComponent = (\n field: Field,\n row: DynamicRowData<T>,\n ): ReactNode => {\n const value = row[field.name];\n\n if (field.name === 'ACTIONS') {\n return onRowAction?.(row.id, row);\n }\n\n switch (field.type) {\n case 'BOOLEAN':\n return (\n <StatusRenderer\n active={Boolean(value)}\n activeLabel=\"Ativo\"\n inactiveLabel=\"Inativo\"\n />\n );\n\n case 'DATE':\n return <DateRenderer value={value} />;\n\n case 'DATETIME':\n return <DateTimeRenderer value={value} />;\n\n case 'DECIMAL':\n case 'INTEGER':\n return (\n <NumberRenderer\n value={value}\n isCurrency={getIsCurrency(field.name)}\n />\n );\n\n case 'FILE':\n case 'ENTITY':\n return <EntityRenderer value={value} field={field} />;\n case 'TEXT':\n default:\n return <TextRenderer value={value} />;\n }\n };\n\n CellRendererComponent.displayName = 'CellRendererComponent';\n return CellRendererComponent;\n};\n","import { GridColumnVisibilityModel } from '@mui/x-data-grid-premium';\nimport { EntityMetadataResponse } from 'model/entity-metadata';\n\ninterface BuildVisibleFieldsParams {\n metadata?: EntityMetadataResponse;\n columnVisibilityModel?: GridColumnVisibilityModel;\n defaultVisibleFields?: string[];\n}\n\nexport const buildVisibleFields = ({\n metadata,\n columnVisibilityModel,\n defaultVisibleFields,\n}: BuildVisibleFieldsParams): string[] | undefined => {\n if (!metadata?.fields) return undefined;\n\n const allFields = metadata.fields.map(f => f.name);\n\n const visible = allFields.filter(fieldName => {\n if (fieldName === 'ACTIONS') return false;\n\n if (columnVisibilityModel) {\n return columnVisibilityModel[fieldName] !== false;\n }\n\n return defaultVisibleFields?.includes(fieldName) ?? true;\n });\n\n if (!defaultVisibleFields) return visible;\n\n return visible.sort((a, b) => {\n const indexA = defaultVisibleFields.indexOf(a);\n const indexB = defaultVisibleFields.indexOf(b);\n\n return indexA - indexB || 0;\n });\n};\n"]}
1
+ {"version":3,"sources":["../../../src/components/DynamicDataView/DynamicDataView.tsx","../../../src/components/DynamicDataView/components/FilterButton.tsx","../../../src/components/DynamicDataView/components/FiltersSection.tsx","../../../src/components/DynamicDataView/components/filters/FiltersContainer.tsx","../../../src/components/DynamicDataView/components/filters/FiltersContent.tsx","../../../src/components/DynamicDataView/utils/filter.ts","../../../src/components/DynamicDataView/components/filters/FiltersList.tsx","../../../src/components/DynamicDataView/components/filters/FilterRow.tsx","../../../src/components/DynamicDataView/constants/filter.ts","../../../src/components/DynamicDataView/components/filters/OperatorSelect.tsx","../../../src/components/DynamicDataView/components/filters/styles.ts","../../../src/components/DynamicDataView/components/SortModal/index.tsx","../../../src/components/DynamicDataView/components/SortModal/style.ts","../../../src/components/DynamicDataView/hooks/useColumnOrdering.ts","../../../src/components/DynamicDataView/hooks/useColumnVisibility.ts","../../../src/components/DynamicDataView/hooks/useDynamicColumns.ts","../../../src/components/DynamicDataView/constants/columnDefaults.ts","../../../src/components/DynamicDataView/utils/columnStrategies.ts","../../../src/components/DynamicDataView/hooks/useFilters.ts","../../../src/components/DynamicDataView/hooks/useFilterSortStorage.ts","../../../src/components/DynamicDataView/hooks/useSorting.ts","../../../src/components/DynamicDataView/utils/addActionsField.ts","../../../src/components/DynamicDataView/renderers/DateRenderer.tsx","../../../src/components/DynamicDataView/renderers/DateTimeRenderer.tsx","../../../src/components/DynamicDataView/renderers/EntityRenderer.tsx","../../../src/components/DynamicDataView/renderers/IconRenderer.tsx","../../../src/components/DynamicDataView/renderers/ImageRenderer.tsx","../../../src/components/DynamicDataView/renderers/style.ts","../../../src/components/DynamicDataView/renderers/NameRenderer.tsx","../../../src/components/DynamicDataView/renderers/NumberRenderer.tsx","../../../src/components/DynamicDataView/renderers/StatusRenderer.tsx","../../../src/components/DynamicDataView/renderers/TextRenderer.tsx","../../../src/components/DynamicDataView/utils/createCellRenderer.tsx","../../../src/components/DynamicDataView/utils/fields.ts"],"names":["memo","useCallback","useMemo","useState","isEqual","Badge","Button","IconButton","Stack","jsx","jsxs","FilterButton","showFilterButton","isMobile","hasActiveFilters","activeFiltersCount","sort","onFilterClick","onSortClick","Icon_default","ToolbarActionsDivider","FilterButton_default","Divider","Typography","getFilterableFields","fields","field","getDefaultCondition","type","available_filter_conditions","isValidCondition","condition","buildFilterFromConditions","conditions","validConditions","c","FormControl","InputLabel","MenuItem","Select","TextField","CONDITION_LABELS","OperatorSelect","value","onChange","totalConditions","isFirst","e","OperatorSelect_default","ellipsisStyle","FilterRow","onRemove","selectedField","f","availableConditions","isValueDisabled","handleFieldChange","fieldName","newField","defaultCondition","handleConditionChange","conditional","handleValueChange","handleOperatorChange","operator","cond","FilterRow_default","Fragment","FiltersList","filterableFields","onUpdateCondition","onRemoveCondition","handleUpdateCondition","updated","handleRemoveCondition","id","usedFieldNames","name","getAvailableFields","currentFieldName","index","FiltersList_default","Box","styled","Container","Header","theme","Content","Footer","FiltersContent","onClose","onAddCondition","onApply","onClear","onCancel","hasConditions","handleApply","handleClear","handleCancel","FiltersContent_default","FiltersContainer","props","ResponsivePopover_default","FiltersContainer_default","FiltersSection","isOpen","filterAnchorEl","FiltersSection_default","useEffect","Dialog","DialogActions","DialogContent","DialogTitle","StyledDialog","StyledDialogTitle","StyledDialogContent","StyledDialogActions","ApplyButton","LabelButton","SortModal","open","onSortChange","setSelectedField","selectedDirection","setSelectedDirection","sortableFields","selectedFieldObj","isNumberField","SortModal_default","useColumnOrdering","columns","preferredFieldOrder","columnsByFieldId","column","fieldsByName","actionFieldName","preferredWithoutActions","usedColumnFieldIds","ordered","pushColumnForField","getColumnFieldIdFromField","useColumnVisibility","defaultVisibleFieldNames","columnVisibilityStorageKey","onColumnVisibilityModelChange","hasStorageKey","storedVisibilityModel","setStoredVisibilityModel","useLocalStorage_default","initialState","visibilityModel","columnFieldId","visible","stored","handleColumnVisibilityModelChange","model","COLUMN_DEFAULTS","ACCESS_TYPES","CURRENCY_FIELD_NAMES","createImageColumn","renderCell","params","createIdColumn","createEntityColumn","createDefaultColumn","createActionsColumn","getColumnStrategy","metadata","useDynamicColumns","columnStrategies","columnsMap","useRef","parseInitialConditions","initialFilter","uuidv4","useFilters","setIsOpen","appliedConditions","setAppliedConditions","appliedFilter","setAppliedFilter","setConditions","snapshotRef","openDrawer","closeDrawer","addCondition","availableFields","currentOperator","firstField","newCondition","prev","updateCondition","changes","targetCondition","newOperator","removeCondition","clearAllFilters","applyFilters","filter","cancelChanges","getStoredValue","key","item","setStoredValue","useFilterStorage","storageKey","externalFilter","onFilterChange","filterKey","internalFilter","setInternalFilter","newFilter","useSortStorage","externalSort","sortKey","internalSort","setInternalSort","newSort","useSorting","sortModel","handleSortModelChange","firstItem","createActionsField","addActionsFieldToMetadata","DateRenderer","format","fDate","DateRenderer_default","DateTimeRenderer","fDateTime","DateTimeRenderer_default","Chip","EntityRenderer","entityValue","EntityRenderer_default","IconRenderer","trueIcon","falseIcon","color","width","IconRenderer_default","StatusLabel","isActive","ImageContainer","prop","size","noImage","clickable","ImageRenderer","imageResourceId","getImageUrl","alt","onClick","sx","hasImage","imageUrl","ImageRenderer_default","NameRenderer","displayName","copyMessage","CopyButton_default","NameRenderer_default","NumberRenderer","isCurrency","fCurrencyBRL","fNumber","NumberRenderer_default","StatusRenderer","active","activeLabel","inactiveLabel","StatusRenderer_default","sanitizeHtml","text","TextRenderer","showCopyButton","copyLabel","mask","stringValue","formattedValue","TextRenderer_default","getIsCurrency","createCellRenderer","context","onRowAction","CellRendererComponent","row","DynamicDataView","title","data","isLoading","isFetching","page","perPage","searchValue","onSearchChange","onSearch","onPaginationChange","onAdd","onRowDoubleClick","actions","moreActions","hideHeader","slots","mobileRender","containerHeight","showColumnButton","rows","total","preloadedMetadata","firstRow","effectiveMetadata","effectiveMetadataFields","orderedColumns","handleRowDoubleClick","rowId","useResponsive_default","setFilterAnchorEl","storedFilter","setStoredFilter","storedSort","setStoredSort","effectiveFilter","effectiveSort","handleApplyFilters","handleClearFilters","handleFilterButtonClick","event","handleCancelFilters","isSortModalOpen","setIsSortModalOpen","handleFiltersClose","DataView_default","DynamicDataView_default","buildVisibleFields","columnVisibilityModel","defaultVisibleFields","a","b","indexA","indexB"],"mappings":"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","sourcesContent":["import { memo, useCallback, useMemo, useState } from 'react';\nimport isEqual from 'react-fast-compare';\nimport { AccessType, DataType } from 'model/entity-metadata';\n\nimport useResponsive from 'hooks/useResponsive';\n\nimport DataView from '../DataView';\n\nimport FilterButton from './components/FilterButton';\nimport FiltersSection from './components/FiltersSection';\nimport SortModal from './components/SortModal';\nimport { useColumnOrdering } from './hooks/useColumnOrdering';\nimport { useColumnVisibility } from './hooks/useColumnVisibility';\nimport { useDynamicColumns } from './hooks/useDynamicColumns';\nimport { useFilters } from './hooks/useFilters';\nimport { useFilterStorage, useSortStorage } from './hooks/useFilterSortStorage';\nimport { useSorting } from './hooks/useSorting';\nimport { addActionsFieldToMetadata } from './utils/addActionsField';\nimport { createCellRenderer } from './utils/createCellRenderer';\nimport { DynamicDataViewProps, DynamicRowData } from './props';\n\nconst DynamicDataView = <T extends object = object>({\n title,\n metadata,\n data,\n isLoading,\n isFetching,\n page,\n perPage,\n searchValue,\n onSearchChange,\n onSearch,\n onPaginationChange,\n onAdd,\n onRowAction,\n onRowDoubleClick,\n actions,\n moreActions,\n hideHeader,\n slots,\n mobileRender,\n containerHeight = 600,\n showColumnButton = false,\n showFilterButton = false,\n filter,\n onFilterChange,\n sort,\n onSortChange,\n defaultVisibleFieldNames,\n preferredFieldOrder,\n columnStrategies,\n onColumnVisibilityModelChange,\n storageKey,\n}: DynamicDataViewProps<T>) => {\n const { items: rows = [], total = 0 } = data || {};\n\n // Criar metadata temporário baseado em data quando metadata não disponível\n const preloadedMetadata = useMemo(() => {\n if (metadata) return metadata;\n\n // Se não tem metadata mas tem dados, criar metadata baseado nas keys do primeiro item\n if (rows.length > 0) {\n const firstRow = rows[0];\n const fields = Object.keys(firstRow).map(key => ({\n name: key,\n type: DataType.TEXT,\n description: key,\n filter_field_name: null,\n metadata: null,\n access_type: AccessType.READ_ONLY,\n relation_field_name: null,\n available_filter_conditions: [],\n }));\n\n return {\n name: 'loading',\n description: 'Loading...',\n id_field_name: 'id',\n description_field_name: fields[0]?.name || 'id',\n access_type: AccessType.READ_ONLY,\n fields,\n };\n }\n\n return undefined;\n }, [metadata, rows]);\n\n const effectiveMetadata = useMemo(\n () =>\n preloadedMetadata && onRowAction\n ? addActionsFieldToMetadata(preloadedMetadata)\n : preloadedMetadata,\n [preloadedMetadata, onRowAction],\n );\n\n const effectiveMetadataFields = useMemo(\n () => effectiveMetadata?.fields || [],\n [effectiveMetadata],\n );\n\n const renderCell = useMemo(\n () =>\n createCellRenderer<T>({\n onRowAction,\n }),\n [onRowAction],\n );\n\n const columns = useDynamicColumns<T>({\n metadata: effectiveMetadata,\n renderCell,\n columnStrategies,\n });\n\n const { orderedColumns, columnsByFieldId } = useColumnOrdering({\n columns,\n fields: effectiveMetadata?.fields,\n preferredFieldOrder,\n });\n\n const { initialState, handleColumnVisibilityModelChange } =\n useColumnVisibility({\n fields: effectiveMetadata?.fields,\n columnsByFieldId,\n defaultVisibleFieldNames,\n columnVisibilityStorageKey: `${storageKey}:columns`,\n onColumnVisibilityModelChange,\n });\n\n const handleRowDoubleClick = useCallback(\n (params: { id: string | number; row: DynamicRowData<T> }) => {\n if (!onRowDoubleClick) return;\n\n const rowId = params.id?.toString() || '';\n onRowDoubleClick(rowId, params.row);\n },\n [onRowDoubleClick],\n );\n\n const isMobile = useResponsive('down', 'md');\n const [filterAnchorEl, setFilterAnchorEl] = useState<HTMLElement | null>(\n null,\n );\n\n const { filter: storedFilter, setFilter: setStoredFilter } = useFilterStorage(\n storageKey,\n filter,\n onFilterChange,\n );\n\n const { sort: storedSort, setSort: setStoredSort } = useSortStorage(\n storageKey,\n sort,\n onSortChange,\n );\n\n const effectiveFilter = filter ?? storedFilter;\n const effectiveSort = sort ?? storedSort;\n\n const { sortModel, handleSortModelChange } = useSorting({\n sort: effectiveSort,\n onSortChange: setStoredSort,\n });\n\n const {\n conditions,\n isOpen,\n openDrawer,\n closeDrawer,\n addCondition,\n updateCondition,\n removeCondition,\n clearAllFilters,\n applyFilters,\n cancelChanges,\n hasActiveFilters,\n activeFiltersCount,\n } = useFilters({\n fields: effectiveMetadataFields,\n initialFilter: effectiveFilter,\n });\n\n const handleApplyFilters = useCallback(() => {\n const newFilter = applyFilters();\n setStoredFilter(newFilter);\n }, [applyFilters, setStoredFilter]);\n\n const handleClearFilters = useCallback(() => {\n clearAllFilters();\n setStoredFilter(undefined);\n }, [clearAllFilters, setStoredFilter]);\n\n const handleFilterButtonClick = useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n if (isMobile) {\n openDrawer();\n } else {\n openDrawer();\n setFilterAnchorEl(event.currentTarget);\n }\n },\n [isMobile, openDrawer],\n );\n\n const handleCancelFilters = useCallback(() => {\n cancelChanges();\n setFilterAnchorEl(null);\n }, [cancelChanges]);\n\n const [isSortModalOpen, setIsSortModalOpen] = useState(false);\n\n const handleFiltersClose = useCallback(() => {\n setFilterAnchorEl(null);\n closeDrawer();\n }, [closeDrawer]);\n\n return (\n <>\n <DataView<T>\n title={title}\n columns={orderedColumns}\n rows={rows}\n mobileRender={mobileRender}\n rowCount={total}\n loading={isLoading || !metadata}\n fetching={isFetching}\n searchValue={searchValue}\n onSearch={onSearch}\n onSearchChange={onSearchChange}\n paginationModel={{\n page,\n pageSize: perPage,\n }}\n onPaginationChange={onPaginationChange}\n actions={actions}\n moreActions={moreActions}\n onAdd={onAdd}\n hideHeader={hideHeader}\n onRowDoubleClick={onRowDoubleClick ? handleRowDoubleClick : undefined}\n disableRowSelectionOnClick\n slots={slots}\n initialState={initialState}\n showColumnButton={showColumnButton}\n containerProps={{\n height: containerHeight,\n maxHeight: containerHeight,\n }}\n onColumnVisibilityModelChange={handleColumnVisibilityModelChange}\n filterButton={\n <FilterButton\n showFilterButton={showFilterButton}\n isMobile={isMobile}\n hasActiveFilters={hasActiveFilters}\n activeFiltersCount={activeFiltersCount}\n sort={effectiveSort}\n onFilterClick={handleFilterButtonClick}\n onSortClick={() => setIsSortModalOpen(true)}\n />\n }\n sortingMode=\"server\"\n sortModel={sortModel}\n onSortModelChange={handleSortModelChange}\n disableColumnFilter\n />\n {metadata && (\n <>\n <FiltersSection\n showFilterButton={showFilterButton}\n isOpen={isOpen}\n filterAnchorEl={filterAnchorEl}\n fields={effectiveMetadataFields}\n conditions={conditions}\n isMobile={isMobile}\n onClose={handleFiltersClose}\n onAddCondition={addCondition}\n onUpdateCondition={updateCondition}\n onRemoveCondition={removeCondition}\n onApply={handleApplyFilters}\n onClear={handleClearFilters}\n onCancel={handleCancelFilters}\n />\n\n <SortModal\n open={isSortModalOpen}\n onClose={() => setIsSortModalOpen(false)}\n fields={effectiveMetadataFields}\n sort={effectiveSort}\n onSortChange={setStoredSort}\n />\n </>\n )}\n </>\n );\n};\n\nexport default memo(DynamicDataView, isEqual) as typeof DynamicDataView;\nexport type { DynamicDataViewProps, DynamicRowData } from './props';\n","import { memo } from 'react';\nimport isEqual from 'react-fast-compare';\nimport Badge from '@mui/material/Badge';\nimport Button from '@mui/material/Button';\nimport IconButton from '@mui/material/IconButton';\nimport Stack from '@mui/material/Stack';\n\nimport { ToolbarActionsDivider } from 'components/DataView';\nimport Icon from 'components/Icon';\n\nimport { FilterButtonProps } from '../props';\n\nconst FilterButton = ({\n showFilterButton,\n isMobile,\n hasActiveFilters,\n activeFiltersCount,\n sort,\n onFilterClick,\n onSortClick,\n}: FilterButtonProps) => {\n if (!showFilterButton) return null;\n\n if (isMobile) {\n return (\n <Stack direction=\"row\" spacing={0.5}>\n <Badge\n badgeContent={activeFiltersCount}\n color=\"primary\"\n invisible={activeFiltersCount === 0}\n sx={{\n '& .MuiBadge-badge': {\n transform: 'scale(0.9) translate(10px, 9px)',\n opacity: activeFiltersCount === 0 ? 0 : 1,\n },\n }}\n >\n <IconButton\n color={hasActiveFilters ? 'primary' : 'default'}\n onClick={onFilterClick}\n size=\"small\"\n aria-label=\"Filtrar\"\n sx={{ overflow: 'visible' }}\n >\n <Icon icon=\"FILTER_VERTICAL\" />\n </IconButton>\n </Badge>\n\n <ToolbarActionsDivider\n sx={{ height: 16 }}\n orientation=\"vertical\"\n flexItem\n />\n\n <IconButton\n color={sort ? 'primary' : 'default'}\n onClick={onSortClick}\n size=\"small\"\n aria-label=\"Ordenar\"\n >\n <Icon\n icon={sort?.sortType === 'DESC' ? 'SORTING_DESC' : 'SORTING_ASC'}\n />\n </IconButton>\n </Stack>\n );\n }\n\n return (\n <Badge\n badgeContent={activeFiltersCount}\n color=\"primary\"\n invisible={activeFiltersCount === 0}\n sx={{\n '& .MuiBadge-badge': activeFiltersCount\n ? {\n transform: 'scale(0.9) translate(-3px, 7px)',\n position: 'relative',\n opacity: 1,\n transition: 'none',\n }\n : {\n transition: 'none',\n opacity: 0,\n },\n }}\n >\n <Button\n variant=\"text\"\n color={hasActiveFilters ? 'primary' : 'inherit'}\n startIcon={<Icon icon=\"FILTER_VERTICAL\" />}\n onClick={onFilterClick}\n size=\"small\"\n >\n Filtrar\n </Button>\n </Badge>\n );\n};\n\nexport default memo(FilterButton, isEqual);\n","import { memo } from 'react';\nimport isEqual from 'react-fast-compare';\n\nimport { FiltersSectionProps } from '../props';\n\nimport FiltersContainer from './filters/FiltersContainer';\n\nconst FiltersSection = ({\n showFilterButton,\n isOpen,\n filterAnchorEl,\n fields,\n conditions,\n isMobile,\n onClose,\n onAddCondition,\n onUpdateCondition,\n onRemoveCondition,\n onApply,\n onClear,\n onCancel,\n}: FiltersSectionProps) => {\n if (!showFilterButton) return null;\n\n return (\n <FiltersContainer\n open={isOpen || Boolean(filterAnchorEl)}\n anchorEl={filterAnchorEl}\n onClose={onClose}\n fields={fields}\n conditions={conditions}\n onAddCondition={onAddCondition}\n onUpdateCondition={onUpdateCondition}\n onRemoveCondition={onRemoveCondition}\n onApply={onApply}\n onClear={onClear}\n onCancel={onCancel}\n isMobileProp={isMobile}\n />\n );\n};\n\nexport default memo(FiltersSection, isEqual);\n","import { memo } from 'react';\nimport isEqual from 'react-fast-compare';\n\nimport ResponsivePopover from 'components/ResponsivePopover';\n\nimport FiltersContent from './FiltersContent';\nimport type { FiltersContainerProps } from './props';\n\nconst FiltersContainer = (props: FiltersContainerProps) => {\n return (\n <ResponsivePopover\n open={props.open}\n onClose={props.onClose}\n anchorEl={props.anchorEl}\n isMobile={props.isMobileProp}\n popoverProps={{\n slotProps: {\n paper: {\n sx: {\n width: 520,\n maxWidth: 'calc(100vw - 24px)',\n maxHeight: 600,\n mt: 1,\n },\n },\n },\n }}\n drawerProps={{\n anchor: 'right',\n PaperProps: {\n sx: {\n width: '100%',\n maxWidth: '100%',\n height: '100%',\n maxHeight: '100%',\n borderRadius: 0,\n },\n },\n }}\n >\n <FiltersContent {...props} />\n </ResponsivePopover>\n );\n};\n\nexport default memo(FiltersContainer, isEqual);\n","import { memo, useCallback } from 'react';\nimport isEqual from 'react-fast-compare';\nimport Button from '@mui/material/Button';\nimport Divider from '@mui/material/Divider';\nimport IconButton from '@mui/material/IconButton';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\n\nimport Icon from 'components/Icon';\n\nimport { getFilterableFields } from '../../utils/filter';\n\nimport FiltersList from './FiltersList';\nimport type { FiltersPopoverProps } from './props';\nimport { Container, Content, Footer, Header } from './styles';\n\nconst FiltersContent = ({\n onClose,\n fields,\n conditions,\n onAddCondition,\n onUpdateCondition,\n onRemoveCondition,\n onApply,\n onClear,\n onCancel,\n}: FiltersPopoverProps) => {\n const filterableFields = getFilterableFields(fields);\n const hasConditions = conditions.length > 0;\n\n const handleApply = useCallback(() => {\n onApply();\n onClose();\n }, [onApply, onClose]);\n\n const handleClear = useCallback(() => {\n onClear();\n onClose();\n }, [onClear, onClose]);\n\n const handleCancel = useCallback(() => {\n onCancel();\n }, [onCancel]);\n\n return (\n <Container>\n <Header>\n <Typography variant=\"overline\" fontWeight={600} color=\"text.secondary\">\n Defina as condições para filtrar\n </Typography>\n\n <IconButton\n onClick={onAddCondition}\n size=\"small\"\n aria-label=\"Adicionar filtro\"\n title=\"Adicionar filtro\"\n disabled={conditions.length >= filterableFields.length}\n >\n <Icon icon=\"SIMPLE_ADD\" />\n </IconButton>\n </Header>\n\n <Divider />\n\n <Content>\n <FiltersList\n filterableFields={filterableFields}\n conditions={conditions}\n onUpdateCondition={onUpdateCondition}\n onRemoveCondition={onRemoveCondition}\n />\n </Content>\n\n <Divider />\n\n <Footer>\n <Button variant=\"text\" color=\"inherit\" onClick={handleClear}>\n Limpar\n </Button>\n\n <Stack direction=\"row\" spacing={1}>\n <Button\n variant=\"outlined\"\n color=\"inherit\"\n onClick={handleCancel}\n startIcon={<Icon icon=\"CANCEL_CIRCLE\" />}\n >\n Cancelar\n </Button>\n <Button\n variant=\"contained\"\n onClick={handleApply}\n disabled={!hasConditions}\n startIcon={<Icon icon=\"SIMPLE_CHECK\" />}\n >\n Aplicar\n </Button>\n </Stack>\n </Footer>\n </Container>\n );\n};\n\nexport default memo(FiltersContent, isEqual);\n","import { Condition, DataType, Field } from 'model/entity-metadata';\nimport {\n Filter,\n FilterCondition,\n FilterOperator,\n FilterState,\n} from 'model/filter';\n\n/**\n * Campos filtráveis (campos com condições disponíveis)\n */\nexport const getFilterableFields = (fields: Field[]): Field[] => {\n return fields.filter(\n field =>\n field.available_filter_conditions &&\n field.available_filter_conditions.length > 0 &&\n field.name !== 'ACTIONS',\n );\n};\n\n/**\n * Converte FilterState para formato de API\n */\nexport const buildFilterFromState = (\n state: FilterState,\n): Filter | undefined => {\n const entries = Object.entries(state).filter(\n ([, value]) => value.value.length > 0,\n );\n if (entries.length === 0) return undefined;\n return {\n operator: FilterOperator.AND,\n groups: [\n {\n operator: FilterOperator.AND,\n conditionals: entries.map(([, filterValue]) => ({\n fieldName: filterValue.fieldName,\n conditional: filterValue.conditional,\n value: filterValue.value,\n })),\n },\n ],\n };\n};\n\n/**\n * Retorna o conditional padrão para um tipo de campo\n */\nexport const getDefaultCondition = (field: Field): Condition => {\n const { type, available_filter_conditions } = field;\n if (available_filter_conditions.length === 0) return Condition.EQUALS;\n if (\n type === DataType.TEXT &&\n available_filter_conditions.includes(Condition.LIKE)\n ) {\n return Condition.LIKE;\n }\n return available_filter_conditions[0];\n};\n\n/**\n * Verifica se uma condição é válida (tem valor ou não requer valor)\n */\nexport const isValidCondition = (condition: FilterCondition): boolean => {\n return (\n condition.value.length > 0 ||\n condition.conditional === Condition.IS_NULL ||\n condition.conditional === Condition.IS_NOT_NULL\n );\n};\n\n/**\n * Converte array de FilterCondition para Filter API\n */\nexport const buildFilterFromConditions = (\n conditions: FilterCondition[],\n): Filter | undefined => {\n if (conditions.length === 0) return undefined;\n\n const validConditions = conditions.filter(isValidCondition);\n if (validConditions.length === 0) return undefined;\n\n return {\n operator: FilterOperator.AND,\n groups: [\n {\n operator: validConditions[0]?.operator || FilterOperator.AND,\n conditionals: validConditions.map(c => ({\n fieldName: c.fieldName,\n conditional: c.conditional,\n value: c.value,\n })),\n },\n ],\n };\n};\n","import { memo, useCallback, useMemo } from 'react';\nimport isEqual from 'react-fast-compare';\nimport Typography from '@mui/material/Typography';\nimport type { FilterCondition } from 'model/filter';\n\nimport FilterRow from './FilterRow';\nimport type { FiltersListProps } from './props';\n\nconst FiltersList = ({\n filterableFields,\n conditions,\n onUpdateCondition,\n onRemoveCondition,\n}: FiltersListProps) => {\n const handleUpdateCondition = useCallback(\n (updated: FilterCondition) => {\n onUpdateCondition(updated.id, updated);\n },\n [onUpdateCondition],\n );\n\n const handleRemoveCondition = useCallback(\n (id: string) => () => {\n onRemoveCondition(id);\n },\n [onRemoveCondition],\n );\n\n const usedFieldNames = useMemo(\n () =>\n conditions.map(c => c.fieldName).filter((name): name is string => !!name),\n [conditions],\n );\n\n const getAvailableFields = useCallback(\n (currentFieldName: string | undefined) =>\n filterableFields.filter(\n field =>\n !usedFieldNames.includes(field.name) ||\n field.name === currentFieldName,\n ),\n [filterableFields, usedFieldNames],\n );\n\n if (filterableFields.length === 0) {\n return (\n <Typography variant=\"body2\" color=\"text.secondary\" textAlign=\"center\">\n Nenhum filtro disponível\n </Typography>\n );\n }\n\n if (conditions.length === 0) {\n return (\n <Typography variant=\"body2\" color=\"text.secondary\" textAlign=\"center\">\n Clique em{' '}\n <Typography\n component=\"strong\"\n variant=\"body2\"\n fontWeight={600}\n color=\"text.primary\"\n >\n &quot;+&quot;\n </Typography>{' '}\n para adicionar um filtro\n </Typography>\n );\n }\n\n return (\n <>\n {conditions.map((condition, index) => (\n <FilterRow\n key={condition.id}\n condition={condition}\n fields={getAvailableFields(condition.fieldName)}\n onChange={handleUpdateCondition}\n onRemove={handleRemoveCondition(condition.id)}\n showOperator={index > 0}\n totalConditions={conditions.length}\n isFirst={index === 0}\n />\n ))}\n </>\n );\n};\n\nexport default memo(FiltersList, isEqual);\n","import { memo, useCallback, useMemo } from 'react';\nimport isEqual from 'react-fast-compare';\nimport FormControl from '@mui/material/FormControl';\nimport IconButton from '@mui/material/IconButton';\nimport InputLabel from '@mui/material/InputLabel';\nimport MenuItem from '@mui/material/MenuItem';\nimport Select from '@mui/material/Select';\nimport Stack from '@mui/material/Stack';\nimport TextField from '@mui/material/TextField';\nimport { Condition } from 'model/entity-metadata';\n\nimport Icon from 'components/Icon';\n\nimport { CONDITION_LABELS } from '../../constants/filter';\n\nimport OperatorSelect from './OperatorSelect';\nimport type { FilterRowProps } from './props';\n\nconst ellipsisStyle = {\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n} as const;\n\nconst FilterRow = ({\n condition,\n fields,\n onChange,\n onRemove,\n totalConditions,\n isFirst,\n}: FilterRowProps) => {\n const selectedField = useMemo(\n () =>\n fields.find(f => (f.filter_field_name ?? f.name) === condition.fieldName),\n [fields, condition.fieldName],\n );\n\n const availableConditions = useMemo(\n () => selectedField?.available_filter_conditions || [],\n [selectedField],\n );\n\n const isValueDisabled = useMemo(\n () =>\n !condition.fieldName ||\n condition.conditional === 'IS_NULL' ||\n condition.conditional === 'IS_NOT_NULL',\n [condition.fieldName, condition.conditional],\n );\n\n const handleFieldChange = useCallback(\n (fieldName: string) => {\n const newField = fields.find(\n f => (f.filter_field_name ?? f.name) === fieldName,\n );\n if (!newField) return;\n\n const defaultCondition =\n newField.available_filter_conditions[0] || 'EQUALS';\n\n onChange({\n ...condition,\n fieldName,\n conditional: defaultCondition,\n value: [],\n });\n },\n [fields, condition, onChange],\n );\n\n const handleConditionChange = useCallback(\n (conditional: Condition) => {\n onChange({\n ...condition,\n conditional,\n });\n },\n [condition, onChange],\n );\n\n const handleValueChange = useCallback(\n (value: string) => {\n onChange({\n ...condition,\n value: value ? [value] : [],\n });\n },\n [condition, onChange],\n );\n\n const handleOperatorChange = useCallback(\n (operator: 'AND' | 'OR') => {\n onChange({\n ...condition,\n operator,\n });\n },\n [condition, onChange],\n );\n\n return (\n <Stack direction=\"row\" spacing={1} alignItems=\"center\">\n <IconButton\n onClick={onRemove}\n size=\"small\"\n aria-label=\"Remover filtro\"\n sx={{ flexShrink: 0 }}\n >\n <Icon icon=\"CLOSE_MARK_BUTTON\" width={18} />\n </IconButton>\n\n <OperatorSelect\n value={condition.operator}\n onChange={handleOperatorChange}\n totalConditions={totalConditions}\n isFirst={isFirst}\n />\n\n <FormControl size=\"small\" sx={{ minWidth: 150, flex: 1 }}>\n <InputLabel id={`field-label-${condition.id}`}>Coluna</InputLabel>\n <Select\n labelId={`field-label-${condition.id}`}\n label=\"Coluna\"\n value={condition.fieldName}\n onChange={e => handleFieldChange(e.target.value)}\n size=\"small\"\n sx={{\n '& .MuiSelect-select': ellipsisStyle,\n }}\n >\n {fields.map(field => (\n <MenuItem\n key={field.name}\n value={field.filter_field_name ?? field.name}\n sx={ellipsisStyle}\n title={field.description || field.name}\n >\n {field.description || field.name}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n\n <FormControl\n size=\"small\"\n sx={{ minWidth: 90 }}\n disabled={!condition.fieldName}\n >\n <InputLabel id={`condition-label-${condition.id}`}>Condição</InputLabel>\n <Select\n labelId={`condition-label-${condition.id}`}\n label=\"Condição\"\n value={condition.conditional}\n onChange={e => handleConditionChange(e.target.value as Condition)}\n size=\"small\"\n sx={{\n '& .MuiSelect-select': ellipsisStyle,\n }}\n >\n {availableConditions.map(cond => (\n <MenuItem key={cond} value={cond} sx={ellipsisStyle}>\n {CONDITION_LABELS[cond as Condition] || cond}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n\n {selectedField?.type === 'BOOLEAN' ? (\n <FormControl\n size=\"small\"\n sx={{ flex: 1, minWidth: 120 }}\n disabled={isValueDisabled}\n >\n <InputLabel id={`value-label-${condition.id}`}>Valor</InputLabel>\n <Select\n labelId={`value-label-${condition.id}`}\n label=\"Valor\"\n value={condition.value[0] || ''}\n onChange={e => handleValueChange(e.target.value)}\n size=\"small\"\n sx={{\n '& .MuiSelect-select': ellipsisStyle,\n }}\n >\n <MenuItem value=\"true\">Verdadeiro</MenuItem>\n <MenuItem value=\"false\">Falso</MenuItem>\n </Select>\n </FormControl>\n ) : (\n <TextField\n label=\"Filtro\"\n value={condition.value[0] || ''}\n onChange={e => handleValueChange(e.target.value)}\n size=\"small\"\n disabled={isValueDisabled}\n InputLabelProps={{ shrink: true }}\n sx={{ flex: 1, minWidth: 120 }}\n />\n )}\n </Stack>\n );\n};\n\nexport default memo(FilterRow, isEqual);\n","import { Condition } from 'model/entity-metadata';\n\nexport const CONDITION_LABELS: Record<Condition, string> = {\n [Condition.EQUALS]: 'Igual a',\n [Condition.NOT_EQUALS]: 'Diferente de',\n [Condition.LIKE]: 'Contém',\n [Condition.NOT_LIKE]: 'Não contém',\n [Condition.GREATER_THAN]: 'Maior que',\n [Condition.LESS_THAN]: 'Menor que',\n [Condition.GREATER_THAN_OR_EQUAL]: 'Maior ou igual a',\n [Condition.LESS_THAN_OR_EQUAL]: 'Menor ou igual a',\n [Condition.IN]: 'Em',\n [Condition.NOT_IN]: 'Não em',\n [Condition.IS_NULL]: 'É nulo',\n [Condition.IS_NOT_NULL]: 'Não é nulo',\n};\n","import { memo } from 'react';\nimport isEqual from 'react-fast-compare';\nimport MenuItem from '@mui/material/MenuItem';\nimport Select from '@mui/material/Select';\nimport Stack from '@mui/material/Stack';\n\nimport type { OperatorSelectProps } from './props';\n\nconst OperatorSelect = ({\n value,\n onChange,\n totalConditions,\n isFirst,\n}: OperatorSelectProps) => {\n if (totalConditions === 1) {\n return null;\n }\n\n if (isFirst) {\n return <Stack sx={{ width: 55, flexShrink: 0 }} />;\n }\n\n return (\n <Select\n value={value}\n onChange={e => onChange(e.target.value as 'AND' | 'OR')}\n size=\"small\"\n sx={{ width: 55, flexShrink: 0 }}\n >\n <MenuItem value=\"AND\">e</MenuItem>\n <MenuItem value=\"OR\">ou</MenuItem>\n </Select>\n );\n};\n\nexport default memo(OperatorSelect, isEqual);\n","import Box from '@mui/material/Box';\nimport { styled } from '@mui/material/styles';\n\n// Estilos baseados no Drawer/Popover para garantir consistência\nexport const Container = styled(Box)({\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n // No popover, a altura será controlada pelo max-height do container\n});\n\nexport const Header = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: theme.spacing(2, 3),\n}));\n\nexport const Content = styled(Box)(({ theme }) => ({\n flex: 1,\n overflowY: 'auto',\n padding: theme.spacing(3),\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(2),\n}));\n\nexport const Footer = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: theme.spacing(2),\n}));\n","import { memo, useCallback, useEffect, useMemo, useState } from 'react';\nimport Button from '@mui/material/Button';\nimport FormControl from '@mui/material/FormControl';\nimport InputLabel from '@mui/material/InputLabel';\nimport MenuItem from '@mui/material/MenuItem';\nimport Select from '@mui/material/Select';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport { SortType } from 'model/filter';\n\nimport Icon from 'components/Icon';\n\nimport { SortModalProps } from './props';\nimport {\n ApplyButton,\n LabelButton,\n StyledDialog,\n StyledDialogActions,\n StyledDialogContent,\n StyledDialogTitle,\n} from './style';\n\nconst SortModal = ({\n open,\n onClose,\n fields,\n sort,\n onSortChange,\n}: SortModalProps) => {\n const [selectedField, setSelectedField] = useState<string>(\n sort?.fieldName || '',\n );\n const [selectedDirection, setSelectedDirection] = useState<SortType>(\n sort?.sortType || SortType.ASC,\n );\n\n const sortableFields = useMemo(\n () =>\n fields.filter(\n field => field.name !== 'ACTIONS' && field.access_type !== 'WRITE_ONLY',\n ),\n [fields],\n );\n\n const selectedFieldObj = useMemo(\n () =>\n fields.find(\n field => (field.filter_field_name ?? field.name) === selectedField,\n ),\n [fields, selectedField],\n );\n\n const isNumberField =\n selectedFieldObj?.type === 'DECIMAL' ||\n selectedFieldObj?.type === 'INTEGER';\n\n useEffect(() => {\n if (open) {\n setSelectedField(sort?.fieldName || '');\n setSelectedDirection(sort?.sortType || SortType.ASC);\n }\n }, [open, sort]);\n\n const handleApply = useCallback(() => {\n if (onSortChange) {\n if (!selectedField) {\n onSortChange(undefined);\n } else {\n onSortChange({\n fieldName: selectedField,\n sortType: selectedDirection,\n });\n }\n }\n onClose();\n }, [onSortChange, selectedField, selectedDirection, onClose]);\n\n const handleClear = useCallback(() => {\n if (!onSortChange) return;\n\n setSelectedField('');\n setSelectedDirection(SortType.ASC);\n\n onSortChange(undefined);\n onClose();\n }, [onSortChange, onClose]);\n\n return (\n <StyledDialog open={open} onClose={onClose} maxWidth=\"xs\" fullWidth>\n <StyledDialogTitle>\n <Typography variant=\"overline\" color=\"text.secondary\">\n Ordenar por\n </Typography>\n </StyledDialogTitle>\n <StyledDialogContent>\n <Stack spacing={2} pt={2}>\n <FormControl fullWidth size=\"small\">\n <InputLabel id=\"sort-field-label\">Campo</InputLabel>\n <Select\n labelId=\"sort-field-label\"\n value={selectedField}\n label=\"Campo\"\n onChange={e => setSelectedField(e.target.value)}\n >\n <MenuItem value=\"\">\n <em>Nenhum</em>\n </MenuItem>\n {sortableFields.map(field => (\n <MenuItem\n key={field.name}\n value={field.filter_field_name ?? field.name}\n >\n {field.description || field.name}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n <FormControl fullWidth size=\"small\" disabled={!selectedField}>\n <InputLabel id=\"sort-direction-label\">Direção</InputLabel>\n <Select\n labelId=\"sort-direction-label\"\n value={selectedDirection}\n label=\"Direção\"\n onChange={e => setSelectedDirection(e.target.value as SortType)}\n >\n <MenuItem value={SortType.ASC}>\n Crescente {isNumberField ? '(1-9)' : '(A-Z)'}\n </MenuItem>\n <MenuItem value={SortType.DESC}>\n Decrescente {isNumberField ? '(9-1)' : '(Z-A)'}\n </MenuItem>\n </Select>\n </FormControl>\n </Stack>\n </StyledDialogContent>\n <StyledDialogActions>\n <Stack flex={1} width=\"100%\" direction=\"row\">\n <Button color=\"inherit\" onClick={handleClear}>\n Limpar\n </Button>\n </Stack>\n <Button\n onClick={onClose}\n variant=\"outlined\"\n color=\"inherit\"\n sx={{ minWidth: 24 }}\n >\n <Icon icon=\"CANCEL_CIRCLE\" />\n <LabelButton>Cancelar</LabelButton>\n </Button>\n <ApplyButton onClick={handleApply} variant=\"contained\">\n <Icon icon=\"SIMPLE_CHECK\" />\n <LabelButton>Aplicar</LabelButton>\n </ApplyButton>\n </StyledDialogActions>\n </StyledDialog>\n );\n};\n\nSortModal.displayName = 'SortModal';\n\nexport default memo(SortModal);\n","import Button from '@mui/material/Button';\nimport Dialog from '@mui/material/Dialog';\nimport DialogActions from '@mui/material/DialogActions';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport { styled } from '@mui/material/styles';\nimport Typography from '@mui/material/Typography';\n\nexport const StyledDialog = styled(Dialog)(() => ({\n '& .MuiDialog-paper': { width: '100%' },\n}));\n\nexport const StyledDialogTitle = styled(DialogTitle)(({ theme }) => ({\n borderBottom: '1px solid',\n borderColor: theme.palette.divider,\n padding: theme.spacing(1.5, 2),\n}));\n\nexport const StyledDialogContent = styled(DialogContent)(({ theme }) => ({\n padding: theme.spacing(2),\n}));\n\nexport const StyledDialogActions = styled(DialogActions)(({ theme }) => ({\n borderTop: '1px solid',\n borderColor: theme.palette.divider,\n padding: theme.spacing(1.5, 2),\n}));\n\nexport const ApplyButton = styled(Button)(({ theme }) => ({\n minWidth: 24,\n [theme.breakpoints.down(330)]: {\n padding: theme.spacing(1),\n },\n}));\n\nexport const LabelButton = styled(Typography)(({ theme }) => ({\n fontWeight: '600',\n margin: theme.spacing(0, 1),\n [theme.breakpoints.down(330)]: {\n fontSize: 0,\n margin: 0,\n },\n}));\n","import { useMemo } from 'react';\nimport type { GridColDef } from '@mui/x-data-grid-premium';\n\nimport { UseColumnOrderingParams } from '../props';\n\nexport const useColumnOrdering = ({\n columns,\n fields,\n preferredFieldOrder,\n}: UseColumnOrderingParams) => {\n const columnsByFieldId = useMemo(\n () => new Map(columns.map(column => [column.field, column])),\n [columns],\n );\n\n const fieldsByName = useMemo(\n () => new Map(fields?.map(f => [f.name, f]) || []),\n [fields],\n );\n\n const orderedColumns = useMemo(() => {\n if (!preferredFieldOrder || preferredFieldOrder.length === 0 || !fields) {\n return columns;\n }\n\n const actionFieldName = 'ACTIONS';\n const preferredWithoutActions = preferredFieldOrder.filter(\n fieldName => fieldName !== actionFieldName,\n );\n\n const usedColumnFieldIds = new Set<string>();\n const ordered: GridColDef[] = [];\n\n const pushColumnForField = (fieldName: string) => {\n const field = fieldsByName.get(fieldName);\n if (!field) return;\n\n const column = columnsByFieldId.get(field.name);\n\n if (!column || usedColumnFieldIds.has(field.name)) return;\n\n ordered.push(column);\n usedColumnFieldIds.add(field.name);\n };\n\n preferredWithoutActions.forEach(fieldName => {\n pushColumnForField(fieldName);\n });\n\n fields.forEach(field => {\n if (field.name === actionFieldName) return;\n if (preferredWithoutActions.includes(field.name)) return;\n\n const column = columnsByFieldId.get(field.name);\n\n if (!column || usedColumnFieldIds.has(field.name)) return;\n\n ordered.push(column);\n usedColumnFieldIds.add(field.name);\n });\n\n pushColumnForField(actionFieldName);\n\n return ordered.length === 0 ? columns : ordered;\n }, [columns, columnsByFieldId, fieldsByName, preferredFieldOrder, fields]);\n\n return { orderedColumns, columnsByFieldId, fieldsByName };\n};\n","import { useCallback, useMemo } from 'react';\nimport type { GridColumnVisibilityModel } from '@mui/x-data-grid-premium';\nimport { Field } from 'model/entity-metadata';\n\nimport useLocalStorage from 'hooks/useLocalStorage';\n\nimport { UseColumnVisibilityParams } from '../props';\n\nfunction getColumnFieldIdFromField(field: Field): string {\n return field.name;\n}\n\nexport const useColumnVisibility = ({\n fields,\n columnsByFieldId,\n defaultVisibleFieldNames,\n columnVisibilityStorageKey,\n onColumnVisibilityModelChange,\n}: UseColumnVisibilityParams) => {\n const hasStorageKey = Boolean(columnVisibilityStorageKey);\n\n const [storedVisibilityModel, setStoredVisibilityModel] = useLocalStorage<\n GridColumnVisibilityModel | undefined\n >(columnVisibilityStorageKey || '__dynamic-data-view:columns__', undefined, {\n initializeWithValue: hasStorageKey,\n });\n\n const initialState = useMemo(() => {\n if (!fields) return undefined;\n\n const visibilityModel: GridColumnVisibilityModel = {};\n\n fields.forEach(field => {\n const columnFieldId = getColumnFieldIdFromField(field);\n if (!columnsByFieldId.has(columnFieldId)) return;\n\n let visible: boolean | undefined;\n\n if (hasStorageKey && storedVisibilityModel) {\n const stored = storedVisibilityModel[columnFieldId];\n if (typeof stored === 'boolean') {\n visible = stored;\n }\n }\n\n if (\n visible === undefined &&\n defaultVisibleFieldNames &&\n defaultVisibleFieldNames.length > 0\n ) {\n visible = defaultVisibleFieldNames.includes(field.name);\n }\n\n if (typeof visible === 'boolean') {\n visibilityModel[columnFieldId] = visible;\n }\n });\n\n if (Object.keys(visibilityModel).length === 0) return undefined;\n\n return {\n columns: {\n columnVisibilityModel: visibilityModel,\n },\n };\n }, [\n columnsByFieldId,\n defaultVisibleFieldNames,\n fields,\n hasStorageKey,\n storedVisibilityModel,\n ]);\n\n const handleColumnVisibilityModelChange = useCallback(\n (model: GridColumnVisibilityModel) => {\n if (hasStorageKey) {\n setStoredVisibilityModel(model);\n }\n\n if (onColumnVisibilityModelChange) {\n onColumnVisibilityModelChange(model);\n }\n },\n [hasStorageKey, onColumnVisibilityModelChange, setStoredVisibilityModel],\n );\n\n return {\n initialState,\n handleColumnVisibilityModelChange,\n };\n};\n","import { useMemo } from 'react';\nimport { GridColDef } from '@mui/x-data-grid-premium';\n\nimport { Columns } from 'types/datagrid';\n\nimport { ACCESS_TYPES } from '../constants/columnDefaults';\nimport { UseDynamicColumnsProps } from '../props';\nimport { getColumnStrategy } from '../utils/columnStrategies';\n\nexport const useDynamicColumns = <T extends object>({\n metadata,\n renderCell,\n columnStrategies,\n}: UseDynamicColumnsProps<T>): Columns => {\n return useMemo(() => {\n if (!metadata?.fields) return [];\n\n const columnsMap = new Map<string, GridColDef>();\n\n const visibleFields = metadata.fields.filter(field => {\n if (\n field.access_type === ACCESS_TYPES.READ_ONLY ||\n field.access_type === ACCESS_TYPES.READ_AND_WRITE\n ) {\n return true;\n }\n\n return (\n field.name === 'ACTIONS' ||\n field.name === metadata?.id_field_name ||\n field.name === 'NAME'\n );\n });\n\n visibleFields.forEach(field => {\n if (columnsMap.has(field.name)) {\n return;\n }\n\n const strategy =\n columnStrategies?.[field.name] ?? getColumnStrategy<T>(field, metadata);\n const column = strategy(field, renderCell, metadata);\n\n columnsMap.set(field.name, column);\n });\n\n return Array.from(columnsMap.values());\n }, [columnStrategies, metadata, renderCell]);\n};\n","export const COLUMN_DEFAULTS = {\n IMAGE_WIDTH: 90,\n MIN_WIDTH: 130,\n ENTITY_MIN_WIDTH: 100,\n ENTITY_FLEX: 0.5,\n ID_MIN_WIDTH: 200,\n ID_FLEX: 1,\n ACTIONS_WIDTH: 80,\n} as const;\n\nexport const ACCESS_TYPES = {\n READ_ONLY: 'READ_ONLY',\n READ_AND_WRITE: 'READ_AND_WRITE',\n} as const;\n\nexport const CURRENCY_FIELD_NAMES: readonly string[] = [\n 'price',\n 'base_price',\n 'minimum_value',\n 'maximum_value',\n 'minimum_installment_value',\n];\n","import { GridColDef, GridRenderCellParams } from '@mui/x-data-grid-premium';\nimport { Field } from 'model/entity-metadata';\n\nimport { COLUMN_DEFAULTS } from '../constants/columnDefaults';\nimport { CellRenderer, ColumnStrategy, DynamicRowData } from '../props';\n\nconst createImageColumn = <T extends object>(\n field: Field,\n renderCell: CellRenderer<T>,\n): GridColDef => ({\n field: field.name,\n headerName: field.description,\n sortable: false,\n width: COLUMN_DEFAULTS.IMAGE_WIDTH,\n resizable: false,\n headerAlign: 'center',\n align: 'center',\n renderCell: (params: GridRenderCellParams) =>\n renderCell(field, params.row as DynamicRowData<T>),\n});\n\nconst createIdColumn = <T extends object>(\n field: Field,\n renderCell: CellRenderer<T>,\n): GridColDef => ({\n field: field.name,\n headerName: field.description,\n minWidth: COLUMN_DEFAULTS.ID_MIN_WIDTH,\n flex: COLUMN_DEFAULTS.ID_FLEX,\n renderCell: (params: GridRenderCellParams) =>\n renderCell(field, params.row as DynamicRowData<T>),\n});\n\nconst createEntityColumn = <T extends object>(\n field: Field,\n renderCell: CellRenderer<T>,\n): GridColDef => ({\n field: field.name,\n headerName: field.description,\n minWidth: COLUMN_DEFAULTS.ENTITY_MIN_WIDTH,\n flex: COLUMN_DEFAULTS.ENTITY_FLEX,\n renderCell: (params: GridRenderCellParams) =>\n renderCell(field, params.row as DynamicRowData<T>),\n});\n\nconst createDefaultColumn = <T extends object>(\n field: Field,\n renderCell: CellRenderer<T>,\n): GridColDef => ({\n field: field.name,\n headerName: field.description,\n minWidth: COLUMN_DEFAULTS.MIN_WIDTH,\n renderCell: (params: GridRenderCellParams) =>\n renderCell(field, params.row as DynamicRowData<T>),\n});\n\nconst createActionsColumn = <T extends object>(\n field: Field,\n renderCell: CellRenderer<T>,\n): GridColDef => ({\n field: field.name,\n headerName: 'Ações',\n width: COLUMN_DEFAULTS.ACTIONS_WIDTH,\n sortable: false,\n resizable: false,\n disableReorder: true,\n headerAlign: 'center',\n disableColumnMenu: true,\n align: 'center',\n renderCell: (params: GridRenderCellParams) =>\n renderCell(field, params.row as DynamicRowData<T>),\n});\n\nexport const getColumnStrategy = <T extends object>(\n field: Field,\n metadata?: { id_field_name?: string },\n): ColumnStrategy<T> => {\n if (field.name === metadata?.id_field_name || field.name === 'name') {\n return createIdColumn;\n }\n\n if (field.name === 'ACTIONS') {\n return createActionsColumn;\n }\n\n if (field.type === 'FILE') {\n return createImageColumn;\n }\n\n if (field.type === 'ENTITY') {\n return createEntityColumn;\n }\n\n return createDefaultColumn;\n};\n","import { useCallback, useRef, useState } from 'react';\nimport type { Filter, FilterCondition } from 'model/filter';\n\nimport uuidv4 from 'utils/uuidv4';\n\nimport { UseFiltersProps, UseFiltersReturn } from '../props';\nimport {\n buildFilterFromConditions,\n getDefaultCondition,\n isValidCondition,\n} from '../utils/filter';\n\n// Converte filtro inicial em condições\nconst parseInitialConditions = (initialFilter?: Filter): FilterCondition[] => {\n if (!initialFilter?.groups?.[0]?.conditionals) return [];\n return initialFilter.groups[0].conditionals.map(cond => ({\n id: uuidv4(),\n operator: initialFilter.groups[0].operator,\n fieldName: cond.fieldName,\n conditional: cond.conditional,\n value: cond.value,\n }));\n};\n\n/**\n * Hook para gerenciar estado de filtros do DynamicDataView com condições dinâmicas\n *\n * - conditions: estado de edição (o que o usuário vê no popover)\n * - appliedConditions: estado aplicado (o que está efetivamente filtrando)\n * - hasActiveFilters/activeFiltersCount: calculados com base em appliedConditions\n */\nexport const useFilters = ({\n fields,\n initialFilter,\n}: UseFiltersProps): UseFiltersReturn => {\n const [isOpen, setIsOpen] = useState(false);\n\n // Estado aplicado (efetivamente filtrando)\n const [appliedConditions, setAppliedConditions] = useState<FilterCondition[]>(\n () => parseInitialConditions(initialFilter),\n );\n const [appliedFilter, setAppliedFilter] = useState<Filter | undefined>(\n initialFilter,\n );\n\n // Estado de edição (o que o usuário vê/edita no popover)\n const [conditions, setConditions] = useState<FilterCondition[]>(() =>\n parseInitialConditions(initialFilter),\n );\n\n // Referência para snapshot antes de abrir o popover\n const snapshotRef = useRef<FilterCondition[]>([]);\n\n const openDrawer = useCallback(() => {\n // Salva snapshot das condições atuais (aplicadas) ao abrir\n snapshotRef.current = appliedConditions.map(c => ({ ...c }));\n // Sincroniza edição com aplicado ao abrir\n setConditions(appliedConditions.map(c => ({ ...c })));\n setIsOpen(true);\n }, [appliedConditions]);\n\n const closeDrawer = () => setIsOpen(false);\n\n const addCondition = useCallback(() => {\n const filterableFields = fields.filter(\n f => f.available_filter_conditions?.length > 0,\n );\n if (filterableFields.length === 0) return;\n\n const usedFieldNames = conditions.map(c => c.fieldName);\n const availableFields = filterableFields.filter(\n f => !usedFieldNames.includes(f.filter_field_name ?? f.name),\n );\n if (availableFields.length === 0) return;\n\n const currentOperator =\n conditions.length > 0 ? conditions[0].operator : 'AND';\n const firstField = availableFields[0];\n const newCondition: FilterCondition = {\n id: uuidv4(),\n operator: currentOperator,\n fieldName: firstField.filter_field_name ?? firstField.name,\n conditional: getDefaultCondition(firstField),\n value: [],\n };\n\n setConditions(prev => [...prev, newCondition]);\n }, [fields, conditions]);\n\n const updateCondition = useCallback(\n (id: string, changes: Partial<FilterCondition>) => {\n setConditions(prev => {\n const targetCondition = prev.find(c => c.id === id);\n if (!targetCondition) return prev;\n\n if (changes.operator && changes.operator !== targetCondition.operator) {\n const newOperator = changes.operator;\n return prev.map(c => {\n if (c.id === id) {\n return { ...c, ...changes };\n }\n return { ...c, operator: newOperator };\n });\n }\n\n return prev.map(c => (c.id === id ? { ...c, ...changes } : c));\n });\n },\n [],\n );\n\n const removeCondition = useCallback((id: string) => {\n setConditions(prev => prev.filter(c => c.id !== id));\n }, []);\n\n const clearAllFilters = () => {\n setConditions([]);\n setAppliedConditions([]);\n setAppliedFilter(undefined);\n };\n\n const applyFilters = () => {\n const filter = buildFilterFromConditions(conditions);\n setAppliedConditions(conditions.map(c => ({ ...c })));\n setAppliedFilter(filter);\n setIsOpen(false);\n return filter;\n };\n\n const cancelChanges = () => {\n // Reverte para o snapshot salvo ao abrir\n setConditions(snapshotRef.current.map(c => ({ ...c })));\n setIsOpen(false);\n };\n\n // Calculado com base nos filtros APLICADOS (não em edição)\n const hasActiveFilters = appliedConditions.some(isValidCondition);\n const activeFiltersCount = appliedConditions.filter(isValidCondition).length;\n\n return {\n conditions,\n filter: appliedFilter,\n isOpen,\n hasActiveFilters,\n activeFiltersCount,\n openDrawer,\n closeDrawer,\n addCondition,\n updateCondition,\n removeCondition,\n clearAllFilters,\n applyFilters,\n cancelChanges,\n };\n};\n\nexport default useFilters;\n","import { useEffect, useState } from 'react';\nimport { Filter, Sort } from 'model/filter';\n\nconst getStoredValue = <T>(key: string): T | undefined => {\n try {\n const item = localStorage.getItem(key);\n return item ? JSON.parse(item) : undefined;\n } catch {\n return undefined;\n }\n};\n\nconst setStoredValue = <T>(key: string, value: T | undefined): void => {\n try {\n if (value === undefined) {\n localStorage.removeItem(key);\n } else {\n localStorage.setItem(key, JSON.stringify(value));\n }\n } catch {\n // Silently ignore localStorage errors\n }\n};\n\nexport const useFilterStorage = (\n storageKey: string,\n externalFilter?: Filter,\n onFilterChange?: (filter: Filter | undefined) => void,\n) => {\n const filterKey = `${storageKey}:filter`;\n\n const [internalFilter, setInternalFilter] = useState<Filter | undefined>(\n () => {\n return getStoredValue<Filter>(filterKey) || externalFilter;\n },\n );\n\n // Sync with external filter\n useEffect(() => {\n if (externalFilter !== undefined) {\n setInternalFilter(externalFilter);\n }\n }, [externalFilter]);\n\n const handleFilterChange = (newFilter: Filter | undefined) => {\n setInternalFilter(newFilter);\n setStoredValue(filterKey, newFilter);\n onFilterChange?.(newFilter);\n };\n\n return {\n filter: internalFilter,\n setFilter: handleFilterChange,\n };\n};\n\nexport const useSortStorage = (\n storageKey: string,\n externalSort?: Sort,\n onSortChange?: (sort: Sort | undefined) => void,\n) => {\n const sortKey = `${storageKey}:sort`;\n\n const [internalSort, setInternalSort] = useState<Sort | undefined>(() => {\n return getStoredValue<Sort>(sortKey) || externalSort;\n });\n\n // Sync with external sort\n useEffect(() => {\n if (externalSort !== undefined) {\n setInternalSort(externalSort);\n }\n }, [externalSort]);\n\n const handleSortChange = (newSort: Sort | undefined) => {\n setInternalSort(newSort);\n setStoredValue(sortKey, newSort);\n onSortChange?.(newSort);\n };\n\n return {\n sort: internalSort,\n setSort: handleSortChange,\n };\n};\n","import { useCallback, useMemo } from 'react';\nimport type { GridSortModel } from '@mui/x-data-grid-premium';\nimport { Sort, SortType } from 'model/filter';\n\nimport { UseSortingParams } from '../props';\n\nexport const useSorting = ({ sort, onSortChange }: UseSortingParams) => {\n const sortModel: GridSortModel = useMemo(() => {\n if (!sort) return [];\n return [\n {\n field: sort.fieldName,\n sort: sort.sortType.toLowerCase() as 'asc' | 'desc',\n },\n ];\n }, [sort]);\n\n const handleSortModelChange = useCallback(\n (model: GridSortModel) => {\n if (!onSortChange) return;\n\n const firstItem = model[0];\n if (!firstItem || !firstItem.sort) {\n onSortChange(undefined);\n return;\n }\n\n const newSort: Sort = {\n fieldName: firstItem.field,\n sortType: firstItem.sort.toUpperCase() as SortType,\n };\n onSortChange(newSort);\n },\n [onSortChange],\n );\n\n return {\n sortModel,\n handleSortModelChange,\n };\n};\n","import {\n AccessType,\n DataType,\n EntityMetadataResponse,\n Field,\n} from 'model/entity-metadata';\n\nexport const createActionsField = (): Field => ({\n name: 'ACTIONS',\n description: '',\n filter_field_name: null,\n type: DataType.TEXT,\n metadata: null,\n access_type: AccessType.READ_ONLY,\n relation_field_name: null,\n available_filter_conditions: [],\n});\n\nexport const addActionsFieldToMetadata = (\n metadata: EntityMetadataResponse,\n): EntityMetadataResponse => {\n const hasActionsField = metadata.fields.some(\n field => field.name === 'ACTIONS',\n );\n\n if (hasActionsField) {\n return metadata;\n }\n\n return {\n ...metadata,\n fields: [...metadata.fields, createActionsField()],\n };\n};\n","import { memo, ReactNode } from 'react';\n\nimport { DatePickerFormat, fDate } from 'utils/formatTime';\n\nexport interface DateRendererProps {\n value: unknown;\n format?: string;\n}\n\nconst DateRenderer = ({ value, format }: DateRendererProps): ReactNode => {\n if (value === null || value === undefined) return '-';\n\n return fDate(value as DatePickerFormat, format);\n};\n\nexport default memo(DateRenderer);\n","import { memo, ReactNode } from 'react';\n\nimport { DatePickerFormat, fDateTime } from 'utils/formatTime';\n\nexport interface DateTimeRendererProps {\n value: unknown;\n format?: string;\n}\n\nconst DateTimeRenderer = ({\n value,\n format,\n}: DateTimeRendererProps): ReactNode => {\n if (value === null || value === undefined) return '-';\n\n return fDateTime(value as DatePickerFormat, format);\n};\n\nexport default memo(DateTimeRenderer);\n","import { memo, ReactNode } from 'react';\nimport Chip from '@mui/material/Chip';\n\nimport { EntityRendererProps } from './props';\n\nconst EntityRenderer = ({ value, field }: EntityRendererProps): ReactNode => {\n if (!field.metadata || typeof value !== 'object' || value === null) {\n return value ? String(value) : '-';\n }\n\n const entityValue = (value as Record<string, unknown>)[\n field.metadata.description_field_name\n ];\n\n if (!entityValue) return null;\n\n return (\n <Chip\n label={String(entityValue)}\n variant=\"outlined\"\n size=\"small\"\n sx={{\n width: 'fit-content',\n color: 'text.secondary',\n borderColor: 'divider',\n borderRadius: 3,\n }}\n />\n );\n};\n\nexport default memo(EntityRenderer);\n","import { memo, ReactNode } from 'react';\n\nimport Icon, { IconEnum } from '../../Icon';\n\nimport { IconRendererProps } from './props';\n\nconst IconRenderer = ({\n value,\n trueIcon = IconEnum.STAR_02,\n falseIcon = IconEnum.STAR,\n color = 'primary.main',\n width = 18,\n}: IconRendererProps): ReactNode => {\n return (\n <Icon icon={value ? trueIcon : falseIcon} color={color} width={width} />\n );\n};\n\nexport default memo(IconRenderer);\n","import { memo, ReactNode } from 'react';\n\nimport Icon from 'components/Icon';\n\nimport { ImageRendererProps } from './props';\nimport { ImageContainer } from './style';\n\nconst ImageRenderer = ({\n imageResourceId,\n getImageUrl,\n size = 48,\n alt = 'Imagem',\n onClick,\n sx,\n}: ImageRendererProps): ReactNode => {\n const hasImage = !!imageResourceId;\n const imageUrl =\n hasImage && getImageUrl ? getImageUrl(imageResourceId) : undefined;\n const clickable = !!onClick;\n\n return (\n <ImageContainer\n size={size}\n noImage={!hasImage}\n clickable={clickable}\n onClick={onClick}\n sx={sx}\n >\n {imageUrl ? (\n <img src={imageUrl} alt={alt} />\n ) : (\n <Icon\n icon=\"SEARCH_IMAGE\"\n width={Math.round(size / 2)}\n color=\"text.disabled\"\n />\n )}\n </ImageContainer>\n );\n};\n\nexport default memo(ImageRenderer);\n","import Box from '@mui/material/Box';\nimport { styled } from '@mui/material/styles';\n\n// StatusRenderer styles\nexport interface StatusLabelProps {\n isActive: boolean;\n}\n\nexport const StatusLabel = styled('span')<StatusLabelProps>(\n ({ theme, isActive }) => ({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: theme.spacing(0.2, 1),\n borderRadius: theme.shape.borderRadius,\n fontSize: '0.75rem',\n fontWeight: 600,\n width: 'fit-content',\n height: 'auto',\n lineHeight: '1.25rem',\n whiteSpace: 'nowrap',\n margin: 'auto',\n backgroundColor: isActive\n ? theme.palette.success.lighter || '#00A76F29'\n : theme.palette.warning.lighter || '#FF563029',\n color: isActive\n ? theme.palette.success.darker || '#007867'\n : theme.palette.warning.darker || '#B71D18',\n }),\n);\n\n// ImageRenderer styles\nexport interface ImageContainerProps {\n size: number;\n noImage: boolean;\n clickable: boolean;\n}\n\nexport const ImageContainer = styled(Box, {\n shouldForwardProp: prop =>\n !['size', 'noImage', 'clickable'].includes(prop as string),\n})<ImageContainerProps>(({ theme, size, noImage, clickable }) => ({\n width: size,\n height: size,\n minWidth: size,\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n cursor: clickable ? 'pointer' : 'default',\n transition: 'opacity 0.2s ease-in-out',\n color: theme.palette.text.disabled,\n ...(noImage && {\n border: `1px dashed ${theme.palette.divider}`,\n backgroundColor: theme.palette.grey[100],\n }),\n ...(clickable && {\n '&:hover': {\n opacity: 0.8,\n },\n }),\n '& img': {\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n borderRadius: '50%',\n },\n [theme.breakpoints.down('sm')]: {\n justifyContent: 'flex-start',\n alignItems: 'flex-start',\n },\n}));\n","import { memo, ReactNode } from 'react';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\n\nimport CopyButton from 'components/CopyButton';\n\nimport { NameRendererProps } from './props';\n\nconst NameRenderer = ({\n id,\n displayName,\n copyMessage = 'ID copiado!',\n}: NameRendererProps): ReactNode => {\n return (\n <Stack height={1} justifyContent=\"center\">\n <Typography variant=\"subtitle2\" noWrap title={displayName}>\n {displayName}\n </Typography>\n <Stack direction=\"row\" gap={1} alignItems=\"center\">\n <Typography color=\"grey.600\" variant=\"body2\" noWrap>\n ID: {id}\n </Typography>\n <CopyButton toCopy={id} message={copyMessage} />\n </Stack>\n </Stack>\n );\n};\n\nexport default memo(NameRenderer);\n","import { memo, ReactNode } from 'react';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\n\nimport { fCurrencyBRL, fNumber } from 'utils/formatNumber';\n\nimport { NumberRendererProps } from './props';\n\nconst NumberRenderer = ({\n value,\n isCurrency = false,\n}: NumberRendererProps): ReactNode => {\n if (value === null || value === undefined) return '-';\n\n return (\n <Stack direction=\"row\" alignItems=\"center\" height=\"100%\">\n <Typography variant=\"body2\" noWrap width=\"fit-content\">\n {isCurrency ? fCurrencyBRL(Number(value)) : fNumber(Number(value))}\n </Typography>\n </Stack>\n );\n};\n\nexport default memo(NumberRenderer);\n","import { memo, ReactNode } from 'react';\n\nimport { StatusRendererProps } from './props';\nimport { StatusLabel } from './style';\n\nconst StatusRenderer = ({\n active,\n activeLabel = 'Ativo',\n inactiveLabel = 'Inativo',\n}: StatusRendererProps): ReactNode => {\n return (\n <StatusLabel isActive={active}>\n {active ? activeLabel : inactiveLabel}\n </StatusLabel>\n );\n};\n\nexport default memo(StatusRenderer);\n","import { memo, ReactNode } from 'react';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\n\nimport CopyButton from 'components/CopyButton';\n\nimport { TextRendererProps } from './props';\n\nconst sanitizeHtml = (text: string): string => {\n const withoutTags = text.replace(/<[^>]*>/g, '');\n return withoutTags\n .replace(/&nbsp;/g, ' ')\n .replace(/&amp;/g, '&')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\")\n .trim();\n};\n\nconst TextRenderer = ({\n value,\n showCopyButton = false,\n copyMessage = 'Copiado',\n copyLabel,\n mask,\n}: TextRendererProps): ReactNode => {\n if (!value) return '-';\n\n const stringValue = String(value);\n const formattedValue = mask ? mask(stringValue) : sanitizeHtml(stringValue);\n\n if (showCopyButton) {\n return (\n <Stack direction=\"row\" gap={1} alignItems=\"center\">\n <Typography variant=\"body2\" noWrap>\n {formattedValue}\n </Typography>\n <CopyButton\n toCopy={stringValue}\n message={copyMessage}\n label={copyLabel}\n />\n </Stack>\n );\n }\n\n return formattedValue;\n};\n\nexport default memo(TextRenderer);\n","import { ReactNode } from 'react';\nimport { Field } from 'model/entity-metadata';\n\nimport { CURRENCY_FIELD_NAMES } from '../constants/columnDefaults';\nimport { CellRenderer, DynamicRowData } from '../props';\nimport {\n DateRenderer,\n DateTimeRenderer,\n EntityRenderer,\n NumberRenderer,\n StatusRenderer,\n TextRenderer,\n} from '../renderers';\n\nfunction getIsCurrency(fieldName: string): boolean {\n return CURRENCY_FIELD_NAMES.includes(fieldName);\n}\n\nexport const createCellRenderer = <T extends object = object>(context: {\n onRowAction?: (rowId: string, row: DynamicRowData<T>) => ReactNode;\n}): CellRenderer<T> => {\n const { onRowAction } = context;\n\n const CellRendererComponent = (\n field: Field,\n row: DynamicRowData<T>,\n ): ReactNode => {\n const value = row[field.name];\n\n if (field.name === 'ACTIONS') {\n return onRowAction?.(row.id, row);\n }\n\n switch (field.type) {\n case 'BOOLEAN':\n return (\n <StatusRenderer\n active={Boolean(value)}\n activeLabel=\"Ativo\"\n inactiveLabel=\"Inativo\"\n />\n );\n\n case 'DATE':\n return <DateRenderer value={value} />;\n\n case 'DATETIME':\n return <DateTimeRenderer value={value} />;\n\n case 'DECIMAL':\n case 'INTEGER':\n return (\n <NumberRenderer\n value={value}\n isCurrency={getIsCurrency(field.name)}\n />\n );\n\n case 'FILE':\n case 'ENTITY':\n return <EntityRenderer value={value} field={field} />;\n case 'TEXT':\n default:\n return <TextRenderer value={value} />;\n }\n };\n\n CellRendererComponent.displayName = 'CellRendererComponent';\n return CellRendererComponent;\n};\n","import { GridColumnVisibilityModel } from '@mui/x-data-grid-premium';\nimport { EntityMetadataResponse } from 'model/entity-metadata';\n\ninterface BuildVisibleFieldsParams {\n metadata?: EntityMetadataResponse;\n columnVisibilityModel?: GridColumnVisibilityModel;\n defaultVisibleFields?: string[];\n}\n\nexport const buildVisibleFields = ({\n metadata,\n columnVisibilityModel,\n defaultVisibleFields,\n}: BuildVisibleFieldsParams): string[] | undefined => {\n if (!metadata?.fields) return undefined;\n\n const allFields = metadata.fields.map(f => f.name);\n\n const visible = allFields.filter(fieldName => {\n if (fieldName === 'ACTIONS') return false;\n\n if (columnVisibilityModel) {\n return columnVisibilityModel[fieldName] !== false;\n }\n\n return defaultVisibleFields?.includes(fieldName) ?? true;\n });\n\n if (!defaultVisibleFields) return visible;\n\n return visible.sort((a, b) => {\n const indexA = defaultVisibleFields.indexOf(a);\n const indexB = defaultVisibleFields.indexOf(b);\n\n return indexA - indexB || 0;\n });\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/FrameSkeleton/index.tsx","../../../src/components/FrameSkeleton/styles.ts"],"names":["IconButton","Stack","Typography","Button","styled","Sidebar","theme","SidebarContent","Nav","Content","TopBox","SectionLink","HeaderContent","Children","Section","SectionContent","Panel_default","SectionTitle","SectionSubtitle","jsx","jsxs","FrameSkeleton","title","subtitle","children","sections","headerLeftContent","headerRightContent","showLeftContent","onClickBack","useCollapseSidebarOnMount_default","Scrollbar_default","section","Icon_default","index","id","titleId","FrameSkeleton_default"],"mappings":"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","sourcesContent":["import IconButton from '@mui/material/IconButton';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\n\nimport Icon from 'components/Icon';\nimport Scrollbar from 'components/Scrollbar';\nimport useCollapseSidebarOnMount from 'hooks/useCollapseSidebarOnMount';\n\nimport { FrameSkeletonProps } from './props';\nimport {\n Children,\n Content,\n HeaderContent,\n Nav,\n Section,\n SectionContent,\n SectionLink,\n SectionSubtitle,\n SectionTitle,\n Sidebar,\n SidebarContent,\n TopBox,\n} from './styles';\n\nconst FrameSkeleton = ({\n title,\n subtitle,\n children,\n sections,\n headerLeftContent,\n headerRightContent,\n showLeftContent = true,\n onClickBack,\n}: FrameSkeletonProps) => {\n useCollapseSidebarOnMount(true);\n return (\n <Stack direction=\"row\" flex={1}>\n {showLeftContent && (\n <Sidebar id=\"frame-skeleton-left-box\">\n <SidebarContent>\n <Scrollbar fillContent aria-label=\"Acesso rápido\">\n <Stack gap={1.5}>\n <Typography\n variant=\"overline\"\n color=\"text.disabled\"\n fontWeight={700}\n pt={3}\n px={4}\n pb={0}\n >\n Acesso rápido\n </Typography>\n\n <Nav>\n {sections.map(section => (\n <SectionLink\n key={section.title}\n onClick={() => {\n if (section.ref.current)\n section.ref.current.scrollIntoView({\n block: 'center',\n behavior: 'smooth',\n });\n }}\n >\n {section.title}\n {section.isRequired && (\n <span className=\"required\" aria-label=\"Seção obrigatória\">*</span>\n )}\n </SectionLink>\n ))}\n </Nav>\n </Stack>\n </Scrollbar>\n </SidebarContent>\n </Sidebar>\n )}\n\n <Content className={showLeftContent ? 'with-left-box' : ''}>\n <TopBox>\n <IconButton\n color=\"inherit\"\n onClick={() => onClickBack()}\n data-testid=\"backToPreviousPage\"\n aria-label=\"Voltar\"\n >\n <Icon icon=\"CHEVRON_LEFT\" />\n </IconButton>\n\n <Stack overflow=\"hidden\">\n <Typography variant=\"subtitle1\" noWrap component=\"h1\">\n {title}\n </Typography>\n {subtitle && (\n <Typography\n variant=\"caption\"\n color=\"text.secondary\"\n noWrap\n component=\"div\"\n >\n {subtitle}\n </Typography>\n )}\n </Stack>\n\n <HeaderContent className=\"header-left-content\">\n {headerLeftContent}\n </HeaderContent>\n\n <HeaderContent justifyContent=\"flex-end\" color=\"text.secondary\">\n {headerRightContent}\n </HeaderContent>\n </TopBox>\n\n <Children>\n <Section>{children}</Section>\n\n {sections.map((section, index) => {\n const id = section.id || `section-${index}`;\n const titleId = `${id}-title`;\n return (\n <Section key={section.title || id} id={id} role=\"region\" aria-labelledby={titleId}>\n {section.title && (\n <SectionTitle\n component=\"h2\"\n id={titleId}\n ref={section.ref as React.RefObject<HTMLDivElement>}\n >\n {section.title}\n </SectionTitle>\n )}\n {section.subTitle && (\n <SectionSubtitle>{section.subTitle}</SectionSubtitle>\n )}\n\n <SectionContent {...section.sectionContentProps}>\n {section.child}\n </SectionContent>\n </Section>\n );\n })}\n </Children>\n </Content>\n </Stack>\n );\n};\n\nexport default FrameSkeleton;\n","import Button from '@mui/material/Button';\nimport Stack from '@mui/material/Stack';\nimport { styled } from '@mui/material/styles';\nimport Typography, { TypographyProps } from '@mui/material/Typography';\n\nimport Panel from 'components/Panel';\n\nexport const Sidebar = styled('aside')(({ theme }) => ({\n backgroundColor: theme.palette.background.paper,\n maxWidth: 300,\n flex: 1,\n borderRight: `1px solid ${theme.palette.divider}`,\n\n [theme.breakpoints.down('md')]: {\n display: 'none',\n },\n}));\n\nexport const SidebarContent = styled(Stack)({\n position: 'sticky',\n top: 'calc(var(--sticky-header-height, 64px))',\n height: 'calc(100vh - var(--sticky-header-height, 64px))',\n});\n\nexport const Nav = styled('nav')({\n display: 'flex',\n flexDirection: 'column',\n});\n\nexport const Content = styled('main')(({ theme }) => ({\n flex: 1,\n width: '100%',\n maxWidth: '100%',\n\n [theme.breakpoints.up('md')]: {\n '&.with-left-box': { maxWidth: 'calc(100% - 300px)' },\n },\n}));\n\nexport const TopBox = styled(Stack)(({ theme }) => ({\n position: 'sticky',\n top: 'var(--sticky-header-height, 64px)',\n flexDirection: 'row',\n alignItems: 'center',\n backgroundColor: theme.palette.background.paper,\n zIndex: theme.zIndex.appBar,\n width: '100%',\n padding: '12px 24px',\n height: 64,\n gap: 12,\n\n [theme.breakpoints.down('md')]: {\n padding: '14px 16px',\n gap: 6,\n },\n borderBottom: `1px solid ${theme.palette.divider}`,\n}));\n\nexport const SectionLink = styled(Button)(({ theme }) => ({\n height: 50,\n background: 'none',\n fontSize: 13,\n fontWeight: 400,\n justifyContent: 'flex-start',\n padding: theme.spacing(1, 4),\n color: theme.palette.text.secondary,\n borderRadius: 0,\n gap: 4,\n\n '&:hover': {\n backgroundColor: 'transparent',\n },\n\n '& .required': {\n color: theme.palette.error.main,\n },\n\n '&:before': {\n content: '\"\"',\n position: 'absolute',\n top: 0,\n left: theme.spacing(2),\n height: 0,\n width: `calc(100% - ${theme.spacing(4)})`,\n borderBottom: `1px dashed ${theme.palette.divider}`,\n },\n}));\n\nexport const HeaderContent = styled(Stack)(({ theme }) => ({\n flex: 1,\n flexDirection: 'row',\n alignItems: 'center',\n gap: 24,\n\n '&.header-left-content': {\n justifyContent: 'flex-start',\n marginLeft: 12,\n },\n\n [theme.breakpoints.down('md')]: {\n gap: 8,\n flex: 'initial',\n\n '& button, & a': {\n display: 'flex',\n textIndent: '-9999em',\n fontSize: 0,\n minWidth: 36,\n maxWidth: 36,\n height: 36,\n width: 36,\n overflow: 'hidden',\n\n '& .MuiButton-icon': {\n margin: 'auto',\n },\n },\n\n '&.header-left-content': {\n justifyContent: 'flex-end',\n marginLeft: 'auto',\n marginRight: -6,\n\n '& label': {\n marginRight: 0,\n },\n\n '& .MuiTypography-root': {\n display: 'none',\n },\n },\n },\n}));\n\nexport const Children = styled(Stack)(({ theme }) => ({\n flex: 1,\n width: '100%',\n padding: 24,\n gap: 24,\n alignItems: 'center',\n overflow: 'hidden',\n\n [theme.breakpoints.down('md')]: {\n padding: '24px 16px',\n },\n}));\n\nexport const Section = styled('section')(({ theme }) => ({\n alignItems: 'start',\n width: '100%',\n maxWidth: 900,\n\n [theme.breakpoints.down('md')]: {\n maxWidth: '100%',\n },\n}));\n\nexport const SectionContent = styled(Panel)(({ theme }) => ({\n width: '100%',\n borderRadius: 12,\n gap: 12,\n\n [theme.breakpoints.down('md')]: {\n padding: '24px 16px',\n },\n}));\n\nexport const SectionTitle = styled(Typography)<TypographyProps>(({ theme }) => ({\n color: theme.palette.text.primary,\n fontSize: 18,\n fontWeight: 900,\n fontFamily: theme.typography.fontFamily,\n margin: 0,\n lineHeight: 1.5,\n}));\n\nexport const SectionSubtitle = styled(Typography)(({ theme }) => ({\n color: theme.palette.text.secondary,\n fontSize: 14,\n fontWeight: 400,\n paddingBottom: 24,\n}));\n"]}
1
+ {"version":3,"sources":["../../../src/components/FrameSkeleton/index.tsx","../../../src/components/FrameSkeleton/styles.ts"],"names":["IconButton","Stack","Typography","Button","styled","Sidebar","theme","SidebarContent","Nav","Content","TopBox","SectionLink","HeaderContent","Children","Section","SectionContent","Panel_default","SectionTitle","SectionSubtitle","jsx","jsxs","FrameSkeleton","title","subtitle","children","sections","headerLeftContent","headerRightContent","showLeftContent","onClickBack","useCollapseSidebarOnMount_default","Scrollbar_default","section","Icon_default","index","id","titleId","FrameSkeleton_default"],"mappings":"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","sourcesContent":["import IconButton from '@mui/material/IconButton';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\n\nimport Icon from 'components/Icon';\nimport Scrollbar from 'components/Scrollbar';\nimport useCollapseSidebarOnMount from 'hooks/useCollapseSidebarOnMount';\n\nimport { FrameSkeletonProps } from './props';\nimport {\n Children,\n Content,\n HeaderContent,\n Nav,\n Section,\n SectionContent,\n SectionLink,\n SectionSubtitle,\n SectionTitle,\n Sidebar,\n SidebarContent,\n TopBox,\n} from './styles';\n\nconst FrameSkeleton = ({\n title,\n subtitle,\n children,\n sections,\n headerLeftContent,\n headerRightContent,\n showLeftContent = true,\n onClickBack,\n}: FrameSkeletonProps) => {\n useCollapseSidebarOnMount(true);\n return (\n <Stack direction=\"row\" flex={1}>\n {showLeftContent && (\n <Sidebar id=\"frame-skeleton-left-box\">\n <SidebarContent>\n <Scrollbar fillContent aria-label=\"Acesso rápido\">\n <Stack gap={1.5}>\n <Typography\n variant=\"overline\"\n color=\"text.disabled\"\n fontWeight={700}\n pt={3}\n px={4}\n pb={0}\n >\n Acesso rápido\n </Typography>\n\n <Nav>\n {sections.map(section => (\n <SectionLink\n key={section.title}\n onClick={() => {\n if (section.ref.current)\n section.ref.current.scrollIntoView({\n block: 'center',\n behavior: 'smooth',\n });\n }}\n >\n {section.title}\n {section.isRequired && (\n <span\n className=\"required\"\n aria-label=\"Seção obrigatória\"\n >\n *\n </span>\n )}\n </SectionLink>\n ))}\n </Nav>\n </Stack>\n </Scrollbar>\n </SidebarContent>\n </Sidebar>\n )}\n\n <Content className={showLeftContent ? 'with-left-box' : ''}>\n <TopBox>\n <IconButton\n color=\"inherit\"\n onClick={() => onClickBack()}\n data-testid=\"backToPreviousPage\"\n aria-label=\"Voltar\"\n >\n <Icon icon=\"CHEVRON_LEFT\" />\n </IconButton>\n\n <Stack overflow=\"hidden\">\n <Typography variant=\"subtitle1\" noWrap component=\"h1\">\n {title}\n </Typography>\n {subtitle && (\n <Typography\n variant=\"caption\"\n color=\"text.secondary\"\n noWrap\n component=\"div\"\n >\n {subtitle}\n </Typography>\n )}\n </Stack>\n\n <HeaderContent className=\"header-left-content\">\n {headerLeftContent}\n </HeaderContent>\n\n <HeaderContent justifyContent=\"flex-end\" color=\"text.secondary\">\n {headerRightContent}\n </HeaderContent>\n </TopBox>\n\n <Children>\n <Section>{children}</Section>\n\n {sections.map((section, index) => {\n const id = section.id || `section-${index}`;\n const titleId = `${id}-title`;\n return (\n <Section\n key={section.title || id}\n id={id}\n role=\"region\"\n aria-labelledby={titleId}\n >\n {section.title && (\n <SectionTitle\n component=\"h2\"\n id={titleId}\n ref={section.ref as React.RefObject<HTMLDivElement>}\n >\n {section.title}\n </SectionTitle>\n )}\n {section.subTitle && (\n <SectionSubtitle>{section.subTitle}</SectionSubtitle>\n )}\n\n <SectionContent {...section.sectionContentProps}>\n {section.child}\n </SectionContent>\n </Section>\n );\n })}\n </Children>\n </Content>\n </Stack>\n );\n};\n\nexport default FrameSkeleton;\n","import Button from '@mui/material/Button';\nimport Stack from '@mui/material/Stack';\nimport { styled } from '@mui/material/styles';\nimport Typography, { TypographyProps } from '@mui/material/Typography';\n\nimport Panel from 'components/Panel';\n\nexport const Sidebar = styled('aside')(({ theme }) => ({\n backgroundColor: theme.palette.background.paper,\n maxWidth: 300,\n flex: 1,\n borderRight: `1px solid ${theme.palette.divider}`,\n\n [theme.breakpoints.down('md')]: {\n display: 'none',\n },\n}));\n\nexport const SidebarContent = styled(Stack)({\n position: 'sticky',\n top: 'calc(var(--sticky-header-height, 64px))',\n height: 'calc(100vh - var(--sticky-header-height, 64px))',\n});\n\nexport const Nav = styled('nav')({\n display: 'flex',\n flexDirection: 'column',\n});\n\nexport const Content = styled('main')(({ theme }) => ({\n flex: 1,\n width: '100%',\n maxWidth: '100%',\n\n [theme.breakpoints.up('md')]: {\n '&.with-left-box': { maxWidth: 'calc(100% - 300px)' },\n },\n}));\n\nexport const TopBox = styled(Stack)(({ theme }) => ({\n position: 'sticky',\n top: 'var(--sticky-header-height, 64px)',\n flexDirection: 'row',\n alignItems: 'center',\n backgroundColor: theme.palette.background.paper,\n zIndex: theme.zIndex.appBar,\n width: '100%',\n padding: '12px 24px',\n height: 64,\n gap: 12,\n\n [theme.breakpoints.down('md')]: {\n padding: '14px 16px',\n gap: 6,\n },\n borderBottom: `1px solid ${theme.palette.divider}`,\n}));\n\nexport const SectionLink = styled(Button)(({ theme }) => ({\n height: 50,\n background: 'none',\n fontSize: 13,\n fontWeight: 400,\n justifyContent: 'flex-start',\n padding: theme.spacing(1, 4),\n color: theme.palette.text.secondary,\n borderRadius: 0,\n gap: 4,\n\n '&:hover': {\n backgroundColor: 'transparent',\n },\n\n '& .required': {\n color: theme.palette.error.main,\n },\n\n '&:before': {\n content: '\"\"',\n position: 'absolute',\n top: 0,\n left: theme.spacing(2),\n height: 0,\n width: `calc(100% - ${theme.spacing(4)})`,\n borderBottom: `1px dashed ${theme.palette.divider}`,\n },\n}));\n\nexport const HeaderContent = styled(Stack)(({ theme }) => ({\n flex: 1,\n flexDirection: 'row',\n alignItems: 'center',\n gap: 24,\n\n '&.header-left-content': {\n justifyContent: 'flex-start',\n marginLeft: 12,\n },\n\n [theme.breakpoints.down('md')]: {\n gap: 8,\n flex: 'initial',\n\n '& button, & a': {\n display: 'flex',\n textIndent: '-9999em',\n fontSize: 0,\n minWidth: 36,\n maxWidth: 36,\n height: 36,\n width: 36,\n overflow: 'hidden',\n\n '& .MuiButton-icon': {\n margin: 'auto',\n },\n },\n\n '&.header-left-content': {\n justifyContent: 'flex-end',\n marginLeft: 'auto',\n marginRight: -6,\n\n '& label': {\n marginRight: 0,\n },\n\n '& .MuiTypography-root': {\n display: 'none',\n },\n },\n },\n}));\n\nexport const Children = styled(Stack)(({ theme }) => ({\n flex: 1,\n width: '100%',\n padding: 24,\n gap: 24,\n alignItems: 'center',\n overflow: 'hidden',\n\n [theme.breakpoints.down('md')]: {\n padding: '24px 16px',\n },\n}));\n\nexport const Section = styled('section')(({ theme }) => ({\n alignItems: 'start',\n width: '100%',\n maxWidth: 900,\n\n [theme.breakpoints.down('md')]: {\n maxWidth: '100%',\n },\n}));\n\nexport const SectionContent = styled(Panel)(({ theme }) => ({\n width: '100%',\n borderRadius: 12,\n gap: 12,\n\n [theme.breakpoints.down('md')]: {\n padding: '24px 16px',\n },\n}));\n\nexport const SectionTitle = styled(Typography)<TypographyProps>(\n ({ theme }) => ({\n color: theme.palette.text.primary,\n fontSize: 18,\n fontWeight: 900,\n fontFamily: theme.typography.fontFamily,\n margin: 0,\n lineHeight: 1.5,\n }),\n);\n\nexport const SectionSubtitle = styled(Typography)(({ theme }) => ({\n color: theme.palette.text.secondary,\n fontSize: 14,\n fontWeight: 400,\n paddingBottom: 24,\n}));\n"]}
@@ -8,8 +8,8 @@ import r from '@mui/material/Typography';
8
8
  import { styled } from '@mui/material/styles';
9
9
  import { jsx, jsxs } from 'react/jsx-runtime';
10
10
 
11
- var k=styled(p)(({theme:a})=>({padding:24,borderRadius:8,height:"auto",maxWidth:800,backgroundColor:a.palette.background.default,border:`1px solid ${a.palette.grey[300]}`})),P=styled(o)(({theme:a})=>({minHeight:180,maxWidth:700,border:`4px dotted ${a.palette.grey[300]}`,borderRadius:8,backgroundColor:a.palette.background.paper,padding:24})),I=styled(p)(()=>({maxWidth:70,maxHeight:40,alignItems:"center","&, img":{flex:1,display:"flex",objectFit:"cover",borderRadius:8}})),S=styled(p)(({theme:a})=>({backgroundColor:a.palette.background.default,maxWidth:90,maxHeight:80,alignItems:"center","&, img":{flex:1,display:"flex",objectFit:"cover",borderRadius:8}})),v=styled(o)(({theme:a})=>({border:`4px dotted ${a.palette.grey[300]}`,borderRadius:8,backgroundColor:"#fff"})),B=styled(p)(({theme:a})=>({width:"100%",aspectRatio:16/9,overflow:"hidden",padding:2,borderBottom:`4px dotted ${a.palette.grey[300]}`}));var R=({titlePreview:a$2,logoImage:g,brandingName:L,url:m,title:x,description:h,keyWords:w,customTitles:y,productImage:b,child:C,previewLinkImage:u,hasPreviewLink:T})=>jsx(k,{children:jsxs(o,{gap:3,display:"flex",flex:1,children:[jsx(r,{variant:"overline",color:"text.disabled",children:a$2??"PR\xC9-VISUALIZA\xC7\xC3O"}),jsxs(P,{children:[jsxs(o,{direction:"row",pb:3,gap:.5,children:[jsx(p,{height:0,width:10,children:jsx(a,{icon:"CIRCLE",width:30,color:"error.main"})}),jsx(p,{height:0,width:10,children:jsx(a,{icon:"CIRCLE",width:30,color:"warning.main"})}),jsx(p,{height:0,width:10,children:jsx(a,{icon:"CIRCLE",width:30,color:"success.main"})})]}),jsxs(o,{flexDirection:"row",gap:2,justifyContent:"space-between",children:[jsxs(o,{gap:1,width:"100%",children:[jsxs(o,{direction:"row",gap:1.5,pb:.5,children:[g&&jsx(I,{children:jsx("img",{alt:"Logo",src:g})}),jsxs(o,{children:[jsx(r,{variant:"overline",color:"grey.600",pb:.5,children:L??"SUAEMPRESA"}),jsxs(o,{direction:"row",gap:2,children:[jsx(r,{variant:"caption",color:"grey.600",children:m??"https://www.exemplo.com"}),jsx(a,{icon:"MORE_OPTIONS_VERTICAL",width:15,color:"grey.500"})]})]})]}),jsx(a$1,{variant:"subtitle1",color:"#4E5BEC",overflow:"hidden",textOverflow:"ellipsis",line:5,children:x??"Suampresa | P\xE1scoa 2024: Ovos de chocolate? Que nada! Descontos em tecnologia!"}),jsx(a$1,{variant:"caption",color:"text.disabled",overflow:"hidden",textOverflow:"ellipsis",line:5,children:h??"A P\xE1scoa chegou e a Sua Empresa est\xE1 com ofertas chocantes em tecnologia! Descontos de at\xE9 50% em notebooks, smartphones, tablets e muito mais!"}),w&&jsx(o,{direction:"row",gap:1,alignItems:"center",children:w.map((s,d)=>jsxs(o,{direction:"row",gap:1,alignItems:"center",children:[jsx(r,{variant:"caption",color:"text.disabled",children:s}),d<w.length-1&&jsx(p,{width:4,height:16,children:jsx(a,{icon:"CIRCLE",color:"text.disabled",width:10})})]},`keyword-${d}`))}),y&&jsx(o,{pt:2,children:y.map((s,d)=>jsxs(o,{gap:1,children:[jsx(r,{variant:"subtitle1",color:"#4E5BEC",children:s.title}),jsx(a$1,{variant:"caption",color:"text.disabled",overflow:"hidden",textOverflow:"ellipsis",line:1,children:s.description??"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industrys stansince the 1500"})]},d))}),C]}),b&&jsx(S,{children:jsx("img",{alt:"ProductImage",src:b})})]})]}),T&&jsxs(o,{gap:3,display:"flex",flex:1,width:"100%",children:[jsx(r,{variant:"overline",color:"text.disabled",children:"pr\xE9-visualiza\xE7\xE3o link de compartilhamento".toUpperCase()}),jsxs(v,{children:[u&&jsx(B,{children:jsx("img",{alt:"PreviewLinkImage",src:u,style:{width:"100%",height:"100%",objectFit:"cover",borderRadius:8}})}),jsxs(o,{gap:.2,p:2,width:"100%",children:[jsx(r,{variant:"caption",children:x??"Suampresa | P\xE1scoa 2024: Ovos de chocolate? Que nada! Descontos em tecnologia!"}),jsx(r,{variant:"caption",color:"grey.600",children:h??"A P\xE1scoa chegou e a Sua Empresa est\xE1 com ofertas chocantes em tecnologia! Descontos de at\xE9 50% em notebooks, smartphones, tablets e muito mais!"}),jsx(r,{variant:"caption",color:"grey.500",children:m??"https://www.exemplo.com"})]})]}),jsx(v,{children:jsxs(o,{direction:"row",gap:1,alignItems:"center",children:[jsx(p,{width:100,height:95,bgcolor:"grey.100",p:.5,alignItems:"center",children:jsx("img",{alt:"Logo",src:g,style:{width:"100%",height:"100%",objectFit:"contain",borderRadius:8}})}),jsxs(o,{padding:1,gap:.2,width:"80%",children:[jsx(a$1,{variant:"caption",children:x??"Suampresa | P\xE1scoa 2024: Ovos de chocolate? Que nada! Descontos em tecnologia!"}),jsx(a$1,{variant:"caption",color:"grey.600",children:h??"A P\xE1scoa chegou e a Sua Empresa est\xE1 com ofertas chocantes em tecnologia! Descontos de at\xE9 50% em notebooks, smartphones, tablets e muito mais!"}),jsx(a$1,{variant:"caption",color:"grey.500",line:1,children:m??"https://www.exemplo.com"})]})]})})]})]})}),U=R;
11
+ var k=styled(p)(({theme:a})=>({padding:24,borderRadius:8,height:"auto",maxWidth:800,backgroundColor:a.palette.background.default,border:`1px solid ${a.palette.grey[300]}`})),P=styled(o)(({theme:a})=>({minHeight:180,maxWidth:700,border:`4px dotted ${a.palette.grey[300]}`,borderRadius:8,backgroundColor:a.palette.background.paper,padding:24})),B=styled(p)(()=>({maxWidth:70,maxHeight:40,alignItems:"center","&, img":{flex:1,display:"flex",objectFit:"cover",borderRadius:8}})),I=styled(p)(({theme:a})=>({backgroundColor:a.palette.background.default,maxWidth:90,maxHeight:80,alignItems:"center","&, img":{flex:1,display:"flex",objectFit:"cover",borderRadius:8}})),v=styled(o)(({theme:a})=>({border:`4px dotted ${a.palette.grey[300]}`,borderRadius:8,backgroundColor:"#fff"})),S=styled(p)(({theme:a})=>({width:"100%",aspectRatio:16/9,overflow:"hidden",padding:2,borderBottom:`4px dotted ${a.palette.grey[300]}`}));var E=({titlePreview:a$2,logoImage:g,brandingName:L,url:m,title:x,description:h,keyWords:w,customTitles:y,productImage:u,child:C,previewLinkImage:b,hasPreviewLink:T})=>jsx(k,{children:jsxs(o,{gap:3,display:"flex",flex:1,children:[jsx(r,{variant:"overline",color:"text.disabled",children:a$2??"Pr\xE9-visualiza\xE7\xE3o"}),jsxs(P,{children:[jsxs(o,{direction:"row",pb:3,gap:.5,children:[jsx(p,{height:0,width:10,children:jsx(a,{icon:"CIRCLE",width:30,color:"error.main"})}),jsx(p,{height:0,width:10,children:jsx(a,{icon:"CIRCLE",width:30,color:"warning.main"})}),jsx(p,{height:0,width:10,children:jsx(a,{icon:"CIRCLE",width:30,color:"success.main"})})]}),jsxs(o,{flexDirection:"row",gap:2,justifyContent:"space-between",children:[jsxs(o,{gap:1,width:"100%",children:[jsxs(o,{direction:"row",gap:1.5,pb:.5,children:[g&&jsx(B,{children:jsx("img",{alt:"Logo",src:g})}),jsxs(o,{children:[jsx(r,{variant:"overline",color:"grey.600",pb:.5,children:L??"SUAEMPRESA"}),jsxs(o,{direction:"row",gap:2,children:[jsx(r,{variant:"caption",color:"grey.600",children:m??"https://www.exemplo.com"}),jsx(a,{icon:"MORE_OPTIONS_VERTICAL",width:15,color:"grey.500"})]})]})]}),jsx(a$1,{variant:"subtitle1",color:"#4E5BEC",overflow:"hidden",textOverflow:"ellipsis",line:5,children:x??"Suampresa | P\xE1scoa 2024: Ovos de chocolate? Que nada! Descontos em tecnologia!"}),jsx(a$1,{variant:"caption",color:"text.disabled",overflow:"hidden",textOverflow:"ellipsis",line:5,children:h??"A P\xE1scoa chegou e a Sua Empresa est\xE1 com ofertas chocantes em tecnologia! Descontos de at\xE9 50% em notebooks, smartphones, tablets e muito mais!"}),w&&jsx(o,{direction:"row",gap:1,alignItems:"center",children:w.map((s,d)=>jsxs(o,{direction:"row",gap:1,alignItems:"center",children:[jsx(r,{variant:"caption",color:"text.disabled",children:s}),d<w.length-1&&jsx(p,{width:4,height:16,children:jsx(a,{icon:"CIRCLE",color:"text.disabled",width:10})})]},`keyword-${d}`))}),y&&jsx(o,{pt:2,children:y.map((s,d)=>jsxs(o,{gap:1,children:[jsx(r,{variant:"subtitle1",color:"#4E5BEC",children:s.title}),jsx(a$1,{variant:"caption",color:"text.disabled",overflow:"hidden",textOverflow:"ellipsis",line:1,children:s.description??"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industrys stansince the 1500"})]},d))}),C]}),u&&jsx(I,{children:jsx("img",{alt:"ProductImage",src:u})})]})]}),T&&jsxs(o,{gap:3,display:"flex",flex:1,width:"100%",children:[jsx(r,{variant:"overline",color:"text.disabled",children:"pr\xE9-visualiza\xE7\xE3o link de compartilhamento".toUpperCase()}),jsxs(v,{children:[b&&jsx(S,{children:jsx("img",{alt:"PreviewLinkImage",src:b,style:{width:"100%",height:"100%",objectFit:"cover",borderRadius:8}})}),jsxs(o,{gap:.2,p:2,width:"100%",children:[jsx(r,{variant:"caption",children:x??"Suampresa | P\xE1scoa 2024: Ovos de chocolate? Que nada! Descontos em tecnologia!"}),jsx(r,{variant:"caption",color:"grey.600",children:h??"A P\xE1scoa chegou e a Sua Empresa est\xE1 com ofertas chocantes em tecnologia! Descontos de at\xE9 50% em notebooks, smartphones, tablets e muito mais!"}),jsx(r,{variant:"caption",color:"grey.500",children:m??"https://www.exemplo.com"})]})]}),jsx(v,{children:jsxs(o,{direction:"row",gap:1,alignItems:"center",children:[jsx(p,{width:100,height:95,bgcolor:"grey.100",p:.5,alignItems:"center",children:jsx("img",{alt:"Logo",src:g,style:{width:"100%",height:"100%",objectFit:"contain",borderRadius:8}})}),jsxs(o,{padding:1,gap:.2,width:"80%",children:[jsx(a$1,{variant:"caption",children:x??"Suampresa | P\xE1scoa 2024: Ovos de chocolate? Que nada! Descontos em tecnologia!"}),jsx(a$1,{variant:"caption",color:"grey.600",children:h??"A P\xE1scoa chegou e a Sua Empresa est\xE1 com ofertas chocantes em tecnologia! Descontos de at\xE9 50% em notebooks, smartphones, tablets e muito mais!"}),jsx(a$1,{variant:"caption",color:"grey.500",line:1,children:m??"https://www.exemplo.com"})]})]})})]})]})}),z=E;
12
12
 
13
- export { U as default };
13
+ export { z as default };
14
14
  //# sourceMappingURL=out.js.map
15
15
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/SeoPreview/index.tsx","../../../src/components/SeoPreview/styles.ts"],"names":["Box","Stack","Typography","styled","PreviewBox","theme","InterBoxPreview","LogoImageBox","ProductImageBox","InterBoxPreviewLink","ImageBoxPreviewLink","jsx","jsxs","SeoPreview","titlePreview","logoImage","brandingName","url","title","description","keyWords","customTitles","productImage","child","previewLinkImage","hasPreviewLink","Icon_default","TextMaxLine_default","keyWord","index","customTitle","SeoPreview_default"],"mappings":"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","sourcesContent":["import Box from '@mui/material/Box';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\n\nimport Icon from '../Icon';\nimport TextMaxLine from '../TextMaxLine';\n\nimport { SeoPreviewProps } from './props';\nimport {\n ImageBoxPreviewLink,\n InterBoxPreview,\n InterBoxPreviewLink,\n LogoImageBox,\n PreviewBox,\n ProductImageBox,\n} from './styles';\n\nconst SeoPreview = ({\n titlePreview,\n logoImage,\n brandingName,\n url,\n title,\n description,\n keyWords,\n customTitles,\n productImage,\n child,\n previewLinkImage,\n hasPreviewLink,\n}: SeoPreviewProps) => {\n return (\n <PreviewBox>\n <Stack gap={3} display=\"flex\" flex={1}>\n <Typography variant=\"overline\" color=\"text.disabled\">\n {titlePreview ?? 'PRÉ-VISUALIZAÇÃO'}\n </Typography>\n\n <InterBoxPreview>\n <Stack direction=\"row\" pb={3} gap={0.5}>\n <Box height={0} width={10}>\n <Icon icon=\"CIRCLE\" width={30} color=\"error.main\" />\n </Box>\n <Box height={0} width={10}>\n <Icon icon=\"CIRCLE\" width={30} color=\"warning.main\" />\n </Box>\n <Box height={0} width={10}>\n <Icon icon=\"CIRCLE\" width={30} color=\"success.main\" />\n </Box>\n </Stack>\n\n <Stack flexDirection=\"row\" gap={2} justifyContent=\"space-between\">\n <Stack gap={1} width=\"100%\">\n <Stack direction=\"row\" gap={1.5} pb={0.5}>\n {logoImage && (\n <LogoImageBox>\n <img alt=\"Logo\" src={logoImage} />\n </LogoImageBox>\n )}\n <Stack>\n <Typography variant=\"overline\" color=\"grey.600\" pb={0.5}>\n {brandingName ?? 'SUAEMPRESA'}\n </Typography>\n\n <Stack direction=\"row\" gap={2}>\n <Typography variant=\"caption\" color=\"grey.600\">\n {url ?? 'https://www.exemplo.com'}\n </Typography>\n\n <Icon\n icon=\"MORE_OPTIONS_VERTICAL\"\n width={15}\n color={'grey.500'}\n />\n </Stack>\n </Stack>\n </Stack>\n\n <TextMaxLine\n variant=\"subtitle1\"\n color=\"#4E5BEC\"\n overflow=\"hidden\"\n textOverflow=\"ellipsis\"\n line={5}\n >\n {title ??\n 'Suampresa | Páscoa 2024: Ovos de chocolate? Que nada! Descontos em tecnologia!'}\n </TextMaxLine>\n\n <TextMaxLine\n variant=\"caption\"\n color=\"text.disabled\"\n overflow=\"hidden\"\n textOverflow=\"ellipsis\"\n line={5}\n >\n {description ??\n 'A Páscoa chegou e a Sua Empresa está com ofertas chocantes em tecnologia! Descontos de até 50% em notebooks, smartphones, tablets e muito mais!'}\n </TextMaxLine>\n\n {keyWords && (\n <Stack direction=\"row\" gap={1} alignItems=\"center\">\n {keyWords.map((keyWord, index) => (\n <Stack\n key={`keyword-${index}`}\n direction=\"row\"\n gap={1}\n alignItems=\"center\"\n >\n <Typography variant=\"caption\" color=\"text.disabled\">\n {keyWord}\n </Typography>\n\n {index < keyWords.length - 1 && (\n <Box width={4} height={16}>\n <Icon\n icon=\"CIRCLE\"\n color=\"text.disabled\"\n width={10}\n />\n </Box>\n )}\n </Stack>\n ))}\n </Stack>\n )}\n\n {customTitles && (\n <Stack pt={2}>\n {customTitles.map((customTitle, index) => (\n <Stack key={index} gap={1}>\n <Typography variant=\"subtitle1\" color=\"#4E5BEC\">\n {customTitle.title}\n </Typography>\n <TextMaxLine\n variant=\"caption\"\n color=\"text.disabled\"\n overflow=\"hidden\"\n textOverflow=\"ellipsis\"\n line={1}\n >\n {customTitle.description ??\n 'Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industrys stansince the 1500'}\n </TextMaxLine>\n </Stack>\n ))}\n </Stack>\n )}\n {child}\n </Stack>\n\n {productImage && (\n <ProductImageBox>\n <img alt=\"ProductImage\" src={productImage} />\n </ProductImageBox>\n )}\n </Stack>\n </InterBoxPreview>\n {hasPreviewLink && (\n <Stack gap={3} display=\"flex\" flex={1} width=\"100%\">\n <Typography variant=\"overline\" color=\"text.disabled\">\n {'pré-visualização link de compartilhamento'.toUpperCase()}\n </Typography>\n\n <InterBoxPreviewLink>\n {previewLinkImage && (\n <ImageBoxPreviewLink>\n <img\n alt=\"PreviewLinkImage\"\n src={previewLinkImage}\n style={{\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n borderRadius: 8,\n }}\n />\n </ImageBoxPreviewLink>\n )}\n\n <Stack gap={0.2} p={2} width=\"100%\">\n <Typography variant=\"caption\">\n {title ??\n 'Suampresa | Páscoa 2024: Ovos de chocolate? Que nada! Descontos em tecnologia!'}\n </Typography>\n\n <Typography variant=\"caption\" color={'grey.600'}>\n {description ??\n 'A Páscoa chegou e a Sua Empresa está com ofertas chocantes em tecnologia! Descontos de até 50% em notebooks, smartphones, tablets e muito mais!'}\n </Typography>\n\n <Typography variant=\"caption\" color={'grey.500'}>\n {url ?? 'https://www.exemplo.com'}\n </Typography>\n </Stack>\n </InterBoxPreviewLink>\n\n <InterBoxPreviewLink>\n <Stack direction=\"row\" gap={1} alignItems=\"center\">\n <Box\n width={100}\n height={95}\n bgcolor=\"grey.100\"\n p={0.5}\n alignItems=\"center\"\n >\n <img\n alt=\"Logo\"\n src={logoImage}\n style={{\n width: '100%',\n height: '100%',\n objectFit: 'contain',\n borderRadius: 8,\n }}\n />\n </Box>\n\n <Stack padding={1} gap={0.2} width=\"80%\">\n <TextMaxLine variant=\"caption\">\n {title ??\n 'Suampresa | Páscoa 2024: Ovos de chocolate? Que nada! Descontos em tecnologia!'}\n </TextMaxLine>\n\n <TextMaxLine variant=\"caption\" color={'grey.600'}>\n {description ??\n 'A Páscoa chegou e a Sua Empresa está com ofertas chocantes em tecnologia! Descontos de até 50% em notebooks, smartphones, tablets e muito mais!'}\n </TextMaxLine>\n\n <TextMaxLine variant=\"caption\" color={'grey.500'} line={1}>\n {url ?? 'https://www.exemplo.com'}\n </TextMaxLine>\n </Stack>\n </Stack>\n </InterBoxPreviewLink>\n </Stack>\n )}\n </Stack>\n </PreviewBox>\n );\n};\n\nexport default SeoPreview;\n","import Box from '@mui/material/Box';\nimport Stack from '@mui/material/Stack';\nimport { styled } from '@mui/material/styles';\n\nexport const PreviewBox = styled(Box)(({ theme }) => ({\n padding: 24,\n borderRadius: 8,\n height: 'auto',\n maxWidth: 800,\n backgroundColor: theme.palette.background.default,\n border: `1px solid ${theme.palette.grey[300]}`,\n}));\n\nexport const InterBoxPreview = styled(Stack)(({ theme }) => ({\n minHeight: 180,\n maxWidth: 700,\n border: `4px dotted ${theme.palette.grey[300]}`,\n borderRadius: 8,\n backgroundColor: theme.palette.background.paper,\n padding: 24,\n}));\n\nexport const LogoImageBox = styled(Box)(() => ({\n maxWidth: 70,\n maxHeight: 40,\n alignItems: 'center',\n\n '&, img': {\n flex: 1,\n display: 'flex',\n objectFit: 'cover',\n borderRadius: 8,\n },\n}));\n\nexport const ProductImageBox = styled(Box)(({ theme }) => ({\n backgroundColor: theme.palette.background.default,\n maxWidth: 90,\n maxHeight: 80,\n alignItems: 'center',\n\n '&, img': {\n flex: 1,\n display: 'flex',\n objectFit: 'cover',\n borderRadius: 8,\n },\n}));\n\nexport const InterBoxPreviewLink = styled(Stack)(({ theme }) => ({\n border: `4px dotted ${theme.palette.grey[300]}`,\n borderRadius: 8,\n backgroundColor: '#fff',\n}));\n\nexport const ImageBoxPreviewLink = styled(Box)(({ theme }) => ({\n width: '100%',\n aspectRatio: 16 / 9,\n overflow: 'hidden',\n padding: 2,\n borderBottom: `4px dotted ${theme.palette.grey[300]}`,\n}));\n"]}
1
+ {"version":3,"sources":["../../../src/components/SeoPreview/index.tsx","../../../src/components/SeoPreview/styles.ts"],"names":["Box","Stack","Typography","styled","PreviewBox","theme","InterBoxPreview","LogoImageBox","ProductImageBox","InterBoxPreviewLink","ImageBoxPreviewLink","jsx","jsxs","SeoPreview","titlePreview","logoImage","brandingName","url","title","description","keyWords","customTitles","productImage","child","previewLinkImage","hasPreviewLink","Icon_default","TextMaxLine_default","keyWord","index","customTitle","SeoPreview_default"],"mappings":"wJAAA,OAAOA,MAAS,oBAChB,OAAOC,MAAW,sBAClB,OAAOC,MAAgB,2BCFvB,OAAOF,MAAS,oBAChB,OAAOC,MAAW,sBAClB,OAAS,UAAAE,MAAc,uBAEhB,IAAMC,EAAaD,EAAOH,CAAG,EAAE,CAAC,CAAE,MAAAK,CAAM,KAAO,CACpD,QAAS,GACT,aAAc,EACd,OAAQ,OACR,SAAU,IACV,gBAAiBA,EAAM,QAAQ,WAAW,QAC1C,OAAQ,aAAaA,EAAM,QAAQ,KAAK,GAAG,GAC7C,EAAE,EAEWC,EAAkBH,EAAOF,CAAK,EAAE,CAAC,CAAE,MAAAI,CAAM,KAAO,CAC3D,UAAW,IACX,SAAU,IACV,OAAQ,cAAcA,EAAM,QAAQ,KAAK,GAAG,IAC5C,aAAc,EACd,gBAAiBA,EAAM,QAAQ,WAAW,MAC1C,QAAS,EACX,EAAE,EAEWE,EAAeJ,EAAOH,CAAG,EAAE,KAAO,CAC7C,SAAU,GACV,UAAW,GACX,WAAY,SAEZ,SAAU,CACR,KAAM,EACN,QAAS,OACT,UAAW,QACX,aAAc,CAChB,CACF,EAAE,EAEWQ,EAAkBL,EAAOH,CAAG,EAAE,CAAC,CAAE,MAAAK,CAAM,KAAO,CACzD,gBAAiBA,EAAM,QAAQ,WAAW,QAC1C,SAAU,GACV,UAAW,GACX,WAAY,SAEZ,SAAU,CACR,KAAM,EACN,QAAS,OACT,UAAW,QACX,aAAc,CAChB,CACF,EAAE,EAEWI,EAAsBN,EAAOF,CAAK,EAAE,CAAC,CAAE,MAAAI,CAAM,KAAO,CAC/D,OAAQ,cAAcA,EAAM,QAAQ,KAAK,GAAG,IAC5C,aAAc,EACd,gBAAiB,MACnB,EAAE,EAEWK,EAAsBP,EAAOH,CAAG,EAAE,CAAC,CAAE,MAAAK,CAAM,KAAO,CAC7D,MAAO,OACP,YAAa,GAAK,EAClB,SAAU,SACV,QAAS,EACT,aAAc,cAAcA,EAAM,QAAQ,KAAK,GAAG,GACpD,EAAE,ED3BM,cAAAM,EAKE,QAAAC,MALF,oBAjBR,IAAMC,EAAa,CAAC,CAClB,aAAAC,EACA,UAAAC,EACA,aAAAC,EACA,IAAAC,EACA,MAAAC,EACA,YAAAC,EACA,SAAAC,EACA,aAAAC,EACA,aAAAC,EACA,MAAAC,EACA,iBAAAC,EACA,eAAAC,CACF,IAEId,EAACP,EAAA,CACC,SAAAQ,EAACX,EAAA,CAAM,IAAK,EAAG,QAAQ,OAAO,KAAM,EAClC,UAAAU,EAACT,EAAA,CAAW,QAAQ,WAAW,MAAM,gBAClC,SAAAY,GAAgB,4BACnB,EAEAF,EAACN,EAAA,CACC,UAAAM,EAACX,EAAA,CAAM,UAAU,MAAM,GAAI,EAAG,IAAK,GACjC,UAAAU,EAACX,EAAA,CAAI,OAAQ,EAAG,MAAO,GACrB,SAAAW,EAACe,EAAA,CAAK,KAAK,SAAS,MAAO,GAAI,MAAM,aAAa,EACpD,EACAf,EAACX,EAAA,CAAI,OAAQ,EAAG,MAAO,GACrB,SAAAW,EAACe,EAAA,CAAK,KAAK,SAAS,MAAO,GAAI,MAAM,eAAe,EACtD,EACAf,EAACX,EAAA,CAAI,OAAQ,EAAG,MAAO,GACrB,SAAAW,EAACe,EAAA,CAAK,KAAK,SAAS,MAAO,GAAI,MAAM,eAAe,EACtD,GACF,EAEAd,EAACX,EAAA,CAAM,cAAc,MAAM,IAAK,EAAG,eAAe,gBAChD,UAAAW,EAACX,EAAA,CAAM,IAAK,EAAG,MAAM,OACnB,UAAAW,EAACX,EAAA,CAAM,UAAU,MAAM,IAAK,IAAK,GAAI,GAClC,UAAAc,GACCJ,EAACJ,EAAA,CACC,SAAAI,EAAC,OAAI,IAAI,OAAO,IAAKI,EAAW,EAClC,EAEFH,EAACX,EAAA,CACC,UAAAU,EAACT,EAAA,CAAW,QAAQ,WAAW,MAAM,WAAW,GAAI,GACjD,SAAAc,GAAgB,aACnB,EAEAJ,EAACX,EAAA,CAAM,UAAU,MAAM,IAAK,EAC1B,UAAAU,EAACT,EAAA,CAAW,QAAQ,UAAU,MAAM,WACjC,SAAAe,GAAO,0BACV,EAEAN,EAACe,EAAA,CACC,KAAK,wBACL,MAAO,GACP,MAAO,WACT,GACF,GACF,GACF,EAEAf,EAACgB,EAAA,CACC,QAAQ,YACR,MAAM,UACN,SAAS,SACT,aAAa,WACb,KAAM,EAEL,SAAAT,GACC,oFACJ,EAEAP,EAACgB,EAAA,CACC,QAAQ,UACR,MAAM,gBACN,SAAS,SACT,aAAa,WACb,KAAM,EAEL,SAAAR,GACC,2JACJ,EAECC,GACCT,EAACV,EAAA,CAAM,UAAU,MAAM,IAAK,EAAG,WAAW,SACvC,SAAAmB,EAAS,IAAI,CAACQ,EAASC,IACtBjB,EAACX,EAAA,CAEC,UAAU,MACV,IAAK,EACL,WAAW,SAEX,UAAAU,EAACT,EAAA,CAAW,QAAQ,UAAU,MAAM,gBACjC,SAAA0B,EACH,EAECC,EAAQT,EAAS,OAAS,GACzBT,EAACX,EAAA,CAAI,MAAO,EAAG,OAAQ,GACrB,SAAAW,EAACe,EAAA,CACC,KAAK,SACL,MAAM,gBACN,MAAO,GACT,EACF,IAhBG,WAAWG,GAkBlB,CACD,EACH,EAGDR,GACCV,EAACV,EAAA,CAAM,GAAI,EACR,SAAAoB,EAAa,IAAI,CAACS,EAAaD,IAC9BjB,EAACX,EAAA,CAAkB,IAAK,EACtB,UAAAU,EAACT,EAAA,CAAW,QAAQ,YAAY,MAAM,UACnC,SAAA4B,EAAY,MACf,EACAnB,EAACgB,EAAA,CACC,QAAQ,UACR,MAAM,gBACN,SAAS,SACT,aAAa,WACb,KAAM,EAEL,SAAAG,EAAY,aACX,mIACJ,IAbUD,CAcZ,CACD,EACH,EAEDN,GACH,EAECD,GACCX,EAACH,EAAA,CACC,SAAAG,EAAC,OAAI,IAAI,eAAe,IAAKW,EAAc,EAC7C,GAEJ,GACF,EACCG,GACCb,EAACX,EAAA,CAAM,IAAK,EAAG,QAAQ,OAAO,KAAM,EAAG,MAAM,OAC3C,UAAAU,EAACT,EAAA,CAAW,QAAQ,WAAW,MAAM,gBAClC,8DAA4C,YAAY,EAC3D,EAEAU,EAACH,EAAA,CACE,UAAAe,GACCb,EAACD,EAAA,CACC,SAAAC,EAAC,OACC,IAAI,mBACJ,IAAKa,EACL,MAAO,CACL,MAAO,OACP,OAAQ,OACR,UAAW,QACX,aAAc,CAChB,EACF,EACF,EAGFZ,EAACX,EAAA,CAAM,IAAK,GAAK,EAAG,EAAG,MAAM,OAC3B,UAAAU,EAACT,EAAA,CAAW,QAAQ,UACjB,SAAAgB,GACC,oFACJ,EAEAP,EAACT,EAAA,CAAW,QAAQ,UAAU,MAAO,WAClC,SAAAiB,GACC,2JACJ,EAEAR,EAACT,EAAA,CAAW,QAAQ,UAAU,MAAO,WAClC,SAAAe,GAAO,0BACV,GACF,GACF,EAEAN,EAACF,EAAA,CACC,SAAAG,EAACX,EAAA,CAAM,UAAU,MAAM,IAAK,EAAG,WAAW,SACxC,UAAAU,EAACX,EAAA,CACC,MAAO,IACP,OAAQ,GACR,QAAQ,WACR,EAAG,GACH,WAAW,SAEX,SAAAW,EAAC,OACC,IAAI,OACJ,IAAKI,EACL,MAAO,CACL,MAAO,OACP,OAAQ,OACR,UAAW,UACX,aAAc,CAChB,EACF,EACF,EAEAH,EAACX,EAAA,CAAM,QAAS,EAAG,IAAK,GAAK,MAAM,MACjC,UAAAU,EAACgB,EAAA,CAAY,QAAQ,UAClB,SAAAT,GACC,oFACJ,EAEAP,EAACgB,EAAA,CAAY,QAAQ,UAAU,MAAO,WACnC,SAAAR,GACC,2JACJ,EAEAR,EAACgB,EAAA,CAAY,QAAQ,UAAU,MAAO,WAAY,KAAM,EACrD,SAAAV,GAAO,0BACV,GACF,GACF,EACF,GACF,GAEJ,EACF,EAIGc,EAAQlB","sourcesContent":["import Box from '@mui/material/Box';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\n\nimport Icon from '../Icon';\nimport TextMaxLine from '../TextMaxLine';\n\nimport { SeoPreviewProps } from './props';\nimport {\n ImageBoxPreviewLink,\n InterBoxPreview,\n InterBoxPreviewLink,\n LogoImageBox,\n PreviewBox,\n ProductImageBox,\n} from './styles';\n\nconst SeoPreview = ({\n titlePreview,\n logoImage,\n brandingName,\n url,\n title,\n description,\n keyWords,\n customTitles,\n productImage,\n child,\n previewLinkImage,\n hasPreviewLink,\n}: SeoPreviewProps) => {\n return (\n <PreviewBox>\n <Stack gap={3} display=\"flex\" flex={1}>\n <Typography variant=\"overline\" color=\"text.disabled\">\n {titlePreview ?? 'Pré-visualização'}\n </Typography>\n\n <InterBoxPreview>\n <Stack direction=\"row\" pb={3} gap={0.5}>\n <Box height={0} width={10}>\n <Icon icon=\"CIRCLE\" width={30} color=\"error.main\" />\n </Box>\n <Box height={0} width={10}>\n <Icon icon=\"CIRCLE\" width={30} color=\"warning.main\" />\n </Box>\n <Box height={0} width={10}>\n <Icon icon=\"CIRCLE\" width={30} color=\"success.main\" />\n </Box>\n </Stack>\n\n <Stack flexDirection=\"row\" gap={2} justifyContent=\"space-between\">\n <Stack gap={1} width=\"100%\">\n <Stack direction=\"row\" gap={1.5} pb={0.5}>\n {logoImage && (\n <LogoImageBox>\n <img alt=\"Logo\" src={logoImage} />\n </LogoImageBox>\n )}\n <Stack>\n <Typography variant=\"overline\" color=\"grey.600\" pb={0.5}>\n {brandingName ?? 'SUAEMPRESA'}\n </Typography>\n\n <Stack direction=\"row\" gap={2}>\n <Typography variant=\"caption\" color=\"grey.600\">\n {url ?? 'https://www.exemplo.com'}\n </Typography>\n\n <Icon\n icon=\"MORE_OPTIONS_VERTICAL\"\n width={15}\n color={'grey.500'}\n />\n </Stack>\n </Stack>\n </Stack>\n\n <TextMaxLine\n variant=\"subtitle1\"\n color=\"#4E5BEC\"\n overflow=\"hidden\"\n textOverflow=\"ellipsis\"\n line={5}\n >\n {title ??\n 'Suampresa | Páscoa 2024: Ovos de chocolate? Que nada! Descontos em tecnologia!'}\n </TextMaxLine>\n\n <TextMaxLine\n variant=\"caption\"\n color=\"text.disabled\"\n overflow=\"hidden\"\n textOverflow=\"ellipsis\"\n line={5}\n >\n {description ??\n 'A Páscoa chegou e a Sua Empresa está com ofertas chocantes em tecnologia! Descontos de até 50% em notebooks, smartphones, tablets e muito mais!'}\n </TextMaxLine>\n\n {keyWords && (\n <Stack direction=\"row\" gap={1} alignItems=\"center\">\n {keyWords.map((keyWord, index) => (\n <Stack\n key={`keyword-${index}`}\n direction=\"row\"\n gap={1}\n alignItems=\"center\"\n >\n <Typography variant=\"caption\" color=\"text.disabled\">\n {keyWord}\n </Typography>\n\n {index < keyWords.length - 1 && (\n <Box width={4} height={16}>\n <Icon\n icon=\"CIRCLE\"\n color=\"text.disabled\"\n width={10}\n />\n </Box>\n )}\n </Stack>\n ))}\n </Stack>\n )}\n\n {customTitles && (\n <Stack pt={2}>\n {customTitles.map((customTitle, index) => (\n <Stack key={index} gap={1}>\n <Typography variant=\"subtitle1\" color=\"#4E5BEC\">\n {customTitle.title}\n </Typography>\n <TextMaxLine\n variant=\"caption\"\n color=\"text.disabled\"\n overflow=\"hidden\"\n textOverflow=\"ellipsis\"\n line={1}\n >\n {customTitle.description ??\n 'Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industrys stansince the 1500'}\n </TextMaxLine>\n </Stack>\n ))}\n </Stack>\n )}\n {child}\n </Stack>\n\n {productImage && (\n <ProductImageBox>\n <img alt=\"ProductImage\" src={productImage} />\n </ProductImageBox>\n )}\n </Stack>\n </InterBoxPreview>\n {hasPreviewLink && (\n <Stack gap={3} display=\"flex\" flex={1} width=\"100%\">\n <Typography variant=\"overline\" color=\"text.disabled\">\n {'pré-visualização link de compartilhamento'.toUpperCase()}\n </Typography>\n\n <InterBoxPreviewLink>\n {previewLinkImage && (\n <ImageBoxPreviewLink>\n <img\n alt=\"PreviewLinkImage\"\n src={previewLinkImage}\n style={{\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n borderRadius: 8,\n }}\n />\n </ImageBoxPreviewLink>\n )}\n\n <Stack gap={0.2} p={2} width=\"100%\">\n <Typography variant=\"caption\">\n {title ??\n 'Suampresa | Páscoa 2024: Ovos de chocolate? Que nada! Descontos em tecnologia!'}\n </Typography>\n\n <Typography variant=\"caption\" color={'grey.600'}>\n {description ??\n 'A Páscoa chegou e a Sua Empresa está com ofertas chocantes em tecnologia! Descontos de até 50% em notebooks, smartphones, tablets e muito mais!'}\n </Typography>\n\n <Typography variant=\"caption\" color={'grey.500'}>\n {url ?? 'https://www.exemplo.com'}\n </Typography>\n </Stack>\n </InterBoxPreviewLink>\n\n <InterBoxPreviewLink>\n <Stack direction=\"row\" gap={1} alignItems=\"center\">\n <Box\n width={100}\n height={95}\n bgcolor=\"grey.100\"\n p={0.5}\n alignItems=\"center\"\n >\n <img\n alt=\"Logo\"\n src={logoImage}\n style={{\n width: '100%',\n height: '100%',\n objectFit: 'contain',\n borderRadius: 8,\n }}\n />\n </Box>\n\n <Stack padding={1} gap={0.2} width=\"80%\">\n <TextMaxLine variant=\"caption\">\n {title ??\n 'Suampresa | Páscoa 2024: Ovos de chocolate? Que nada! Descontos em tecnologia!'}\n </TextMaxLine>\n\n <TextMaxLine variant=\"caption\" color={'grey.600'}>\n {description ??\n 'A Páscoa chegou e a Sua Empresa está com ofertas chocantes em tecnologia! Descontos de até 50% em notebooks, smartphones, tablets e muito mais!'}\n </TextMaxLine>\n\n <TextMaxLine variant=\"caption\" color={'grey.500'} line={1}>\n {url ?? 'https://www.exemplo.com'}\n </TextMaxLine>\n </Stack>\n </Stack>\n </InterBoxPreviewLink>\n </Stack>\n )}\n </Stack>\n </PreviewBox>\n );\n};\n\nexport default SeoPreview;\n","import Box from '@mui/material/Box';\nimport Stack from '@mui/material/Stack';\nimport { styled } from '@mui/material/styles';\n\nexport const PreviewBox = styled(Box)(({ theme }) => ({\n padding: 24,\n borderRadius: 8,\n height: 'auto',\n maxWidth: 800,\n backgroundColor: theme.palette.background.default,\n border: `1px solid ${theme.palette.grey[300]}`,\n}));\n\nexport const InterBoxPreview = styled(Stack)(({ theme }) => ({\n minHeight: 180,\n maxWidth: 700,\n border: `4px dotted ${theme.palette.grey[300]}`,\n borderRadius: 8,\n backgroundColor: theme.palette.background.paper,\n padding: 24,\n}));\n\nexport const LogoImageBox = styled(Box)(() => ({\n maxWidth: 70,\n maxHeight: 40,\n alignItems: 'center',\n\n '&, img': {\n flex: 1,\n display: 'flex',\n objectFit: 'cover',\n borderRadius: 8,\n },\n}));\n\nexport const ProductImageBox = styled(Box)(({ theme }) => ({\n backgroundColor: theme.palette.background.default,\n maxWidth: 90,\n maxHeight: 80,\n alignItems: 'center',\n\n '&, img': {\n flex: 1,\n display: 'flex',\n objectFit: 'cover',\n borderRadius: 8,\n },\n}));\n\nexport const InterBoxPreviewLink = styled(Stack)(({ theme }) => ({\n border: `4px dotted ${theme.palette.grey[300]}`,\n borderRadius: 8,\n backgroundColor: '#fff',\n}));\n\nexport const ImageBoxPreviewLink = styled(Box)(({ theme }) => ({\n width: '100%',\n aspectRatio: 16 / 9,\n overflow: 'hidden',\n padding: 2,\n borderBottom: `4px dotted ${theme.palette.grey[300]}`,\n}));\n"]}
@@ -5,8 +5,8 @@ import '../../chunk-TVKBRJHF.js';
5
5
  import { createContext, useState, useRef, useMemo, useEffect, useCallback, useContext } from 'react';
6
6
  import { jsx } from 'react/jsx-runtime';
7
7
 
8
- var Z=createContext(void 0),le=({children:p,originId:C,originType:V,bearerToken:G,vapidKey:H,serviceWorkerPath:k="/",serviceWorkerFile:x="service-worker.js",pollingInterval:W=1e3,apiAdapters:r,onMessageReceived:h,onError:o})=>{let[s,v]=useState(null),[A,R]=useState(0),[B,L]=useState(!1),[y,w]=useState(!1),[N,f]=useState(!1),[P,ee]=useState(!1),[m,te]=useState({subscriptions:[]}),[z,F]=useState(!1),[D]=useState(new Set),E=useRef(new Map),_=useMemo(()=>!s||z,[s,z]);useEffect(()=>{if(!y||!N||!s||!r.fetchMessages||m.subscriptions.length===0)return;let e=setInterval(async()=>{try{let a$1=((await r.fetchMessages(s))?.messages??[]).filter(i=>!(!i?.payload||D.has(i.id)));if(a$1.length===0)return;a$1.forEach(i=>{D.add(i.id),h?.(i.payload,i.topic);}),R(i=>i+a$1.length);try{(await Promise.allSettled(a$1.map(u=>r.updateMessageStatus(u.id,{status:"DELIVERED"})))).forEach(u=>{u.status==="rejected"&&a({type:"ERROR",environment:["development","homologation"],message:"Erro ao marcar mensagem como entregue:",data:u.reason});});}finally{new Set(a$1.map(g=>g.topic).filter(Boolean)).forEach(g=>{E.current.get(g)?.stopPollingOnFirstMessage&&E.current.delete(g);}),m.subscriptions.length>0||(w(!1),f(!1));}}catch(t){a({type:"ERROR",environment:["development","homologation"],message:"Erro ao buscar mensagens:",data:t});}},W);return ()=>clearInterval(e)},[y,N,s,W,r,h,D,m.subscriptions.length]);let b=useCallback(async(e,t)=>{try{let c=e?.toJSON().keys,a={origin_type:V,origin_id:C,...t&&e?{endpoint:e.endpoint,auth:c?.auth,p256dh:c?.p256dh}:{}},i=await r.registerClient(a);return v(i.id),L(!1),ee(t),t||f(!0),i.id}catch(c){return a({type:"ERROR",environment:["development","homologation"],message:"Erro ao registrar cliente:",data:c}),L(!0),o?.(c),null}},[r,C,V,o]);useEffect(()=>{let e=!0,t=null;async function c(){if(!("serviceWorker"in navigator)||!("PushManager"in window)){a({type:"WARN",environment:["development","homologation"],message:"Push notifications n\xE3o suportadas, criando cliente ativo com polling"});try{let a=await b(null,!1);e&&a&&(v(a),f(!0));}catch(a$1){a({type:"ERROR",environment:["development","homologation"],message:"Erro ao registrar cliente ativo:",data:a$1}),o?.(a$1);}return}try{let a$2=await Notification.requestPermission(),i=null,u=!1;if(a$2==="granted")try{let M=await navigator.serviceWorker.register(`${k}${x}`);if(!e||(await navigator.serviceWorker.ready,!e))return;i=await M.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:a$1(H)}),t=async I=>{let K=I.data?.payload,Q=I.data?.id;if(K&&(R(T=>T+1),h?.(K,I.data?.topic)),Q)try{await r.updateMessageStatus(Q,{status:"DELIVERED"});}catch(T){a({type:"ERROR",environment:["development","homologation"],message:"Erro ao atualizar status da mensagem:",data:T}),L(!0),o?.(T);}},navigator.serviceWorker.addEventListener("message",t),u=!0,a({type:"LOG",environment:["development","homologation"],message:"Permiss\xE3o concedida, criando cliente passivo (aguarda webpush)"});}catch(M){a({type:"WARN",environment:["development","homologation"],message:"Falha ao configurar push subscription, criando cliente ativo:",data:M}),u=!1;}else a({type:"WARN",environment:["development","homologation"],message:"Permiss\xE3o de notifica\xE7\xE3o negada, criando cliente ativo com polling"}),u=!1;let g=await b(i,u);e&&g&&(v(g),u||f(!0));}catch(a$1){a({type:"ERROR",environment:["development","homologation"],message:"Erro ao inicializar notifica\xE7\xF5es:",data:a$1}),o?.(a$1);try{let i=await b(null,!1);e&&i&&(v(i),f(!0));}catch(i){a({type:"ERROR",environment:["development","homologation"],message:"Erro ao criar cliente ativo como fallback:",data:i});}}}return G&&c(),()=>{e=!1,t&&"serviceWorker"in navigator&&navigator.serviceWorker.removeEventListener("message",t);}},[G,b,r,H,k,x,h,o]);let l=useCallback(async()=>{if(s){F(!0);try{let e=await r.listSubscriptions(s);te(e);}catch(e){a({type:"ERROR",environment:["development","homologation"],message:"Erro ao listar inscri\xE7\xF5es:",data:e}),o?.(e);}finally{F(!1);}}},[s,r,o]);useEffect(()=>{s&&l();},[s]);let $=useCallback(async(e,t)=>{if(!s){a({type:"WARN",environment:["development","homologation"],message:"Cliente n\xE3o registrado"});return}try{t&&E.current.set(e,t),await r.subscribeTopic(s,e),await l(),!P&&(!y||!N)&&(w(!0),f(!0));}catch(c){a({type:"ERROR",environment:["development","homologation"],message:"Erro ao inscrever no t\xF3pico:",data:c}),o?.(c);}},[s,r,l,o,y,N,P]),j=useCallback(async e=>{if(!s){a({type:"WARN",environment:["development","homologation"],message:"Cliente n\xE3o registrado"});return}try{E.current.delete(e),await r.unsubscribeTopic(s,e),await l();}catch(t){a({type:"ERROR",environment:["development","homologation"],message:"Erro ao desinscrever do t\xF3pico:",data:t}),o?.(t);}},[s,r,l,o]),q=useCallback(async e=>{if(!(!s||e.length===0))try{e.forEach(t=>{E.current.has(t)||E.current.set(t,{});}),await r.subscribeTopicsBatch(s,e),await l(),P||(w(!0),f(!0));}catch(t){a({type:"ERROR",environment:["development","homologation"],message:"Erro ao inscrever em t\xF3picos:",data:t}),o?.(t);}},[s,r,l,o,P]),J=useCallback(async e=>{if(!(!s||e.length===0))try{e.forEach(t=>E.current.delete(t)),await r.unsubscribeTopicsBatch(s,e),await l();}catch(t){a({type:"ERROR",environment:["development","homologation"],message:"Erro ao desinscrever de t\xF3picos:",data:t}),o?.(t);}},[s,r,l,o]),U=useCallback(()=>{R(0);},[]),se=useMemo(()=>({clientId:s,subscribedTopics:m,isLoading:_,newMessageCount:A,isRegisterError:B,subscribeToTopic:$,unsubscribeFromTopic:j,subscribeTopicsBatch:q,unsubscribeTopicsBatch:J,resetMessageCount:U}),[s,m,_,A,B,$,j,q,J,U]);return jsx(Z.Provider,{value:se,children:p})};function Oe(){let p=useContext(Z);if(!p)throw new Error("usePushNotifications precisa estar dentro de PushNotificationProvider");return p}
8
+ var te=createContext(void 0),fe=({children:y,originId:V,originType:G,bearerToken:H,vapidKey:k,serviceWorkerPath:x="/",serviceWorkerFile:W="service-worker.js",pollingInterval:A=1e3,apiAdapters:a$2,onMessageReceived:h,onError:o})=>{let[s,v]=useState(null),[B,m]=useState(!1),[z,L]=useState(!1),[N,se]=useState(!1),[F,w]=useState(0),[D]=useState(new Set),[p,ie]=useState({subscriptions:[]}),[_,$]=useState(!1),[P,I]=useState(!1),[b,f]=useState(!1),E=useRef(new Map),j=useMemo(()=>!s||_||B,[s,_,B]);useEffect(()=>{if(!P||!b||!s||!a$2.fetchMessages||p.subscriptions.length===0)return;let e=setInterval(async()=>{try{let r=((await a$2.fetchMessages(s))?.messages??[]).filter(i=>!(!i?.payload||D.has(i.id)));if(r.length===0)return;r.forEach(i=>{D.add(i.id),h?.(i.payload,i.topic);}),w(i=>i+r.length);try{(await Promise.allSettled(r.map(u=>a$2.updateMessageStatus(u.id,{status:"DELIVERED"})))).forEach(u=>{u.status==="rejected"&&a({type:"ERROR",environment:["development","homologation"],message:"Erro ao marcar mensagem como entregue:",data:u.reason});});}finally{new Set(r.map(g=>g.topic).filter(Boolean)).forEach(g=>{E.current.get(g)?.stopPollingOnFirstMessage&&E.current.delete(g);}),p.subscriptions.length>0||(I(!1),f(!1));}}catch(t){a({type:"ERROR",environment:["development","homologation"],message:"Erro ao buscar mensagens:",data:t});}},A);return ()=>clearInterval(e)},[a$2,s,h,P,A,D,b,p.subscriptions.length]);let M=useCallback(async(e,t)=>{m(!0);try{let c=e?.toJSON().keys,r={origin_type:G,origin_id:V,...t&&e?{endpoint:e.endpoint,auth:c?.auth,p256dh:c?.p256dh}:{}},i=await a$2.registerClient(r);return v(i.id),L(!1),se(t),t||f(!0),i.id}catch(c){return a({type:"ERROR",environment:["development","homologation"],message:"Erro ao registrar cliente:",data:c}),L(!0),o?.(c),null}finally{m(!1);}},[a$2,o,V,G]);useEffect(()=>{let e=!0,t=null;async function c(){if(m(!0),!("serviceWorker"in navigator)||!("PushManager"in window)){a({type:"WARN",environment:["development","homologation"],message:"Push notifications n\xE3o suportadas, criando cliente ativo com polling"});try{let r=await M(null,!1);e&&r&&(v(r),f(!0));}catch(r){a({type:"ERROR",environment:["development","homologation"],message:"Erro ao registrar cliente ativo:",data:r}),o?.(r);}finally{m(!1);}return}try{let r=await Notification.requestPermission(),i=null,u=!1;if(r==="granted")try{let T=await navigator.serviceWorker.register(`${x}${W}`);if(!e||(await navigator.serviceWorker.ready,!e))return;i=await T.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:a$1(k)}),t=async S=>{let X=S.data?.payload,Y=S.data?.id;if(X&&(w(R=>R+1),h?.(X,S.data?.topic)),Y)try{await a$2.updateMessageStatus(Y,{status:"DELIVERED"});}catch(R){a({type:"ERROR",environment:["development","homologation"],message:"Erro ao atualizar status da mensagem:",data:R}),L(!0),o?.(R);}},navigator.serviceWorker.addEventListener("message",t),u=!0,a({type:"LOG",environment:["development","homologation"],message:"Permiss\xE3o concedida, criando cliente passivo (aguarda webpush)"});}catch(T){a({type:"WARN",environment:["development","homologation"],message:"Falha ao configurar push subscription, criando cliente ativo:",data:T}),u=!1;}else a({type:"WARN",environment:["development","homologation"],message:"Permiss\xE3o de notifica\xE7\xE3o negada, criando cliente ativo com polling"}),u=!1;let g=await M(i,u);e&&g&&(v(g),u||f(!0));}catch(r){a({type:"ERROR",environment:["development","homologation"],message:"Erro ao inicializar notifica\xE7\xF5es:",data:r}),o?.(r);try{let i=await M(null,!1);e&&i&&(v(i),f(!0));}catch(i){a({type:"ERROR",environment:["development","homologation"],message:"Erro ao criar cliente ativo como fallback:",data:i});}}finally{m(!1);}}return H&&c(),()=>{e=!1,t&&"serviceWorker"in navigator&&navigator.serviceWorker.removeEventListener("message",t);}},[a$2,H,o,h,M,W,x,k]);let O=useCallback(async()=>{if(s){$(!0);try{let e=await a$2.listSubscriptions(s);ie(e);}catch(e){a({type:"ERROR",environment:["development","homologation"],message:"Erro ao listar inscri\xE7\xF5es:",data:e}),o?.(e);}finally{$(!1);}}},[a$2,s,o]);useEffect(()=>{s&&O();},[s]);let q=useCallback(async(e,t)=>{if(!s){a({type:"WARN",environment:["development","homologation"],message:"Cliente n\xE3o registrado"});return}try{t&&E.current.set(e,t),await a$2.subscribeTopic(s,e),await O(),!N&&(!P||!b)&&(I(!0),f(!0));}catch(c){a({type:"ERROR",environment:["development","homologation"],message:"Erro ao inscrever no t\xF3pico:",data:c}),o?.(c);}},[a$2,s,N,o,P,O,b]),J=useCallback(async e=>{if(!s){a({type:"WARN",environment:["development","homologation"],message:"Cliente n\xE3o registrado"});return}try{E.current.delete(e),await a$2.unsubscribeTopic(s,e),await O();}catch(t){a({type:"ERROR",environment:["development","homologation"],message:"Erro ao desinscrever do t\xF3pico:",data:t}),o?.(t);}},[a$2,s,o,O]),U=useCallback(async e=>{if(!(!s||e.length===0))try{e.forEach(t=>{E.current.has(t)||E.current.set(t,{});}),await a$2.subscribeTopicsBatch(s,e),await O(),N||(I(!0),f(!0));}catch(t){a({type:"ERROR",environment:["development","homologation"],message:"Erro ao inscrever em t\xF3picos:",data:t}),o?.(t);}},[a$2,s,N,o,O]),K=useCallback(async e=>{if(!(!s||e.length===0))try{e.forEach(t=>E.current.delete(t)),await a$2.unsubscribeTopicsBatch(s,e),await O();}catch(t){a({type:"ERROR",environment:["development","homologation"],message:"Erro ao desinscrever de t\xF3picos:",data:t}),o?.(t);}},[a$2,s,o,O]),Q=useCallback(()=>{w(0);},[]),ne=useMemo(()=>({clientId:s,subscribedTopics:p,isLoading:j,newMessageCount:F,isRegisterError:z,subscribeToTopic:q,unsubscribeFromTopic:J,subscribeTopicsBatch:U,unsubscribeTopicsBatch:K,resetMessageCount:Q}),[s,j,z,F,Q,p,q,U,J,K]);return jsx(te.Provider,{value:ne,children:y})};function Ee(){let y=useContext(te);if(!y)throw new Error("usePushNotifications precisa estar dentro de PushNotificationProvider");return y}
9
9
 
10
- export { le as PushNotificationProvider, Oe as usePushNotifications };
10
+ export { fe as PushNotificationProvider, Ee as usePushNotifications };
11
11
  //# sourceMappingURL=out.js.map
12
12
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/contexts/PushNotifications/index.tsx"],"names":["createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","jsx","PushNotificationContext","PushNotificationProvider","children","originId","originType","bearerToken","vapidKey","serviceWorkerPath","serviceWorkerFile","pollingInterval","apiAdapters","onMessageReceived","onError","clientId","setClientId","newMessageCount","setNewMessageCount","isRegisterError","setIsRegisterError","pollingEnabled","setPollingEnabled","shouldPoll","setShouldPoll","isPassiveClient","setIsPassiveClient","subscribedTopics","setSubscribedTopics","isLoadingSubscriptions","setIsLoadingSubscriptions","processedMessageIds","topicOptionsRef","isLoading","interval","deliverables","m","prev","consoleLog","topic","error","performClientRegistration","subscription","isPassive","keys","payload","response","mounted","messageHandler","initSwAndRegister","id","err","permission","registration","urlBase64ToUint8Array","e","message","deliveredId","fallbackErr","refetchSubscriptions","data","subscribeToTopic","options","unsubscribeFromTopic","subscribeTopicsBatch","topics","unsubscribeTopicsBatch","resetMessageCount","value","usePushNotifications","context"],"mappings":"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","sourcesContent":["import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { ConsoleType, Environment } from 'types/consoleLog';\nimport {\n type ClientRegistrationPayload,\n MessageStatus,\n type PushNotificationContextData,\n type PushNotificationProviderProps,\n type SubscriptionsData,\n type TopicSubscriptionOptions,\n} from 'types/pushNotifications';\nimport { consoleLog } from 'utils/consoleLog';\nimport { urlBase64ToUint8Array } from 'utils/urlBase64ToUint8Array';\n\nconst PushNotificationContext = createContext<\n PushNotificationContextData | undefined\n>(undefined);\n\nexport const PushNotificationProvider = <TMessage = unknown,>({\n children,\n originId,\n originType,\n bearerToken,\n vapidKey,\n serviceWorkerPath = '/',\n serviceWorkerFile = 'service-worker.js',\n pollingInterval = 1000,\n apiAdapters,\n onMessageReceived,\n onError,\n}: PushNotificationProviderProps<TMessage>) => {\n const [clientId, setClientId] = useState<string | null>(null);\n const [newMessageCount, setNewMessageCount] = useState<number>(0);\n const [isRegisterError, setIsRegisterError] = useState<boolean>(false);\n const [pollingEnabled, setPollingEnabled] = useState<boolean>(false);\n const [shouldPoll, setShouldPoll] = useState<boolean>(false);\n const [isPassiveClient, setIsPassiveClient] = useState<boolean>(false);\n const [subscribedTopics, setSubscribedTopics] = useState<SubscriptionsData>({\n subscriptions: [],\n });\n const [isLoadingSubscriptions, setIsLoadingSubscriptions] =\n useState<boolean>(false);\n const [processedMessageIds] = useState<Set<string>>(new Set());\n const topicOptionsRef = useRef<Map<string, TopicSubscriptionOptions>>(\n new Map(),\n );\n\n const isLoading = useMemo(\n () => !clientId || isLoadingSubscriptions,\n [clientId, isLoadingSubscriptions],\n );\n\n useEffect(() => {\n if (\n !pollingEnabled ||\n !shouldPoll ||\n !clientId ||\n !apiAdapters.fetchMessages ||\n subscribedTopics.subscriptions.length === 0\n )\n return;\n\n const interval = setInterval(async () => {\n try {\n const result = await apiAdapters.fetchMessages!(clientId);\n const messages = result?.messages ?? [];\n const deliverables = messages.filter(m => {\n if (!m?.payload) return false;\n if (processedMessageIds.has(m.id)) return false;\n return true;\n });\n\n if (deliverables.length === 0) return;\n\n deliverables.forEach(m => {\n processedMessageIds.add(m.id);\n onMessageReceived?.(m.payload, m.topic);\n });\n setNewMessageCount(prev => prev + deliverables.length);\n\n try {\n const updates = await Promise.allSettled(\n deliverables.map(m =>\n apiAdapters.updateMessageStatus(m.id, {\n status: MessageStatus.DELIVERED,\n }),\n ),\n );\n updates.forEach(u => {\n if (u.status === 'rejected') {\n consoleLog({\n type: ConsoleType.ERROR,\n environment: [\n Environment.DEVELOPMENT,\n Environment.HOMOLOGATION,\n ],\n message: 'Erro ao marcar mensagem como entregue:',\n data: u.reason,\n });\n }\n });\n } finally {\n const topicsProcessed = new Set(\n deliverables.map(m => m.topic).filter(Boolean) as string[],\n );\n topicsProcessed.forEach(topic => {\n const topicOptions = topicOptionsRef.current.get(topic);\n if (topicOptions?.stopPollingOnFirstMessage) {\n topicOptionsRef.current.delete(topic);\n }\n });\n const hasSubscriptions = subscribedTopics.subscriptions.length > 0;\n if (!hasSubscriptions) {\n setPollingEnabled(false);\n setShouldPoll(false);\n }\n }\n } catch (error) {\n consoleLog({\n type: ConsoleType.ERROR,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message: 'Erro ao buscar mensagens:',\n data: error,\n });\n }\n }, pollingInterval);\n\n return () => clearInterval(interval);\n }, [\n pollingEnabled,\n shouldPoll,\n clientId,\n pollingInterval,\n apiAdapters,\n onMessageReceived,\n processedMessageIds,\n subscribedTopics.subscriptions.length,\n ]);\n\n const performClientRegistration = useCallback(\n async (subscription: PushSubscription | null, isPassive: boolean) => {\n try {\n const keys = subscription?.toJSON().keys;\n const payload: ClientRegistrationPayload = {\n origin_type: originType,\n origin_id: originId,\n ...(isPassive && subscription\n ? {\n endpoint: subscription.endpoint,\n auth: keys?.auth,\n p256dh: keys?.p256dh,\n }\n : {}),\n };\n\n const response = await apiAdapters.registerClient(payload);\n setClientId(response.id);\n setIsRegisterError(false);\n setIsPassiveClient(isPassive);\n\n if (!isPassive) {\n setShouldPoll(true);\n }\n\n return response.id;\n } catch (error) {\n consoleLog({\n type: ConsoleType.ERROR,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message: 'Erro ao registrar cliente:',\n data: error,\n });\n setIsRegisterError(true);\n onError?.(error as Error);\n return null;\n }\n },\n [apiAdapters, originId, originType, onError],\n );\n\n useEffect(() => {\n let mounted = true;\n let messageHandler: ((e: MessageEvent) => void) | null = null;\n\n async function initSwAndRegister() {\n if (!('serviceWorker' in navigator) || !('PushManager' in window)) {\n consoleLog({\n type: ConsoleType.WARN,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message:\n 'Push notifications não suportadas, criando cliente ativo com polling',\n });\n\n try {\n const id = await performClientRegistration(null, false);\n if (mounted && id) {\n setClientId(id);\n setShouldPoll(true);\n }\n } catch (err) {\n consoleLog({\n type: ConsoleType.ERROR,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message: 'Erro ao registrar cliente ativo:',\n data: err,\n });\n onError?.(err as Error);\n }\n return;\n }\n\n try {\n const permission = await Notification.requestPermission();\n\n let subscription: PushSubscription | null = null;\n let isPassiveClient = false;\n\n if (permission === 'granted') {\n try {\n const registration = await navigator.serviceWorker.register(\n `${serviceWorkerPath}${serviceWorkerFile}`,\n );\n\n if (!mounted) return;\n\n await navigator.serviceWorker.ready;\n\n if (!mounted) return;\n\n subscription = await registration.pushManager.subscribe({\n userVisibleOnly: true,\n applicationServerKey: urlBase64ToUint8Array(\n vapidKey,\n ) as BufferSource,\n });\n\n messageHandler = async (e: MessageEvent) => {\n const message = e.data?.payload;\n const deliveredId = e.data?.id;\n\n if (message) {\n setNewMessageCount(prev => prev + 1);\n onMessageReceived?.(message, e.data?.topic);\n }\n\n if (deliveredId) {\n try {\n await apiAdapters.updateMessageStatus(deliveredId, {\n status: MessageStatus.DELIVERED,\n });\n } catch (err) {\n consoleLog({\n type: ConsoleType.ERROR,\n environment: [\n Environment.DEVELOPMENT,\n Environment.HOMOLOGATION,\n ],\n message: 'Erro ao atualizar status da mensagem:',\n data: err,\n });\n setIsRegisterError(true);\n onError?.(err as Error);\n }\n }\n };\n\n navigator.serviceWorker.addEventListener('message', messageHandler);\n\n isPassiveClient = true;\n consoleLog({\n type: ConsoleType.LOG,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message:\n 'Permissão concedida, criando cliente passivo (aguarda webpush)',\n });\n } catch (err) {\n consoleLog({\n type: ConsoleType.WARN,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message:\n 'Falha ao configurar push subscription, criando cliente ativo:',\n data: err,\n });\n isPassiveClient = false;\n }\n } else {\n consoleLog({\n type: ConsoleType.WARN,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message:\n 'Permissão de notificação negada, criando cliente ativo com polling',\n });\n isPassiveClient = false;\n }\n\n const id = await performClientRegistration(\n subscription,\n isPassiveClient,\n );\n if (mounted && id) {\n setClientId(id);\n\n if (!isPassiveClient) {\n setShouldPoll(true);\n }\n }\n } catch (err) {\n consoleLog({\n type: ConsoleType.ERROR,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message: 'Erro ao inicializar notificações:',\n data: err,\n });\n onError?.(err as Error);\n\n try {\n const id = await performClientRegistration(null, false);\n if (mounted && id) {\n setClientId(id);\n setShouldPoll(true);\n }\n } catch (fallbackErr) {\n consoleLog({\n type: ConsoleType.ERROR,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message: 'Erro ao criar cliente ativo como fallback:',\n data: fallbackErr,\n });\n }\n }\n }\n\n if (bearerToken) {\n void initSwAndRegister();\n }\n\n return () => {\n mounted = false;\n if (messageHandler && 'serviceWorker' in navigator) {\n navigator.serviceWorker.removeEventListener('message', messageHandler);\n }\n };\n }, [\n bearerToken,\n performClientRegistration,\n apiAdapters,\n vapidKey,\n serviceWorkerPath,\n serviceWorkerFile,\n onMessageReceived,\n onError,\n ]);\n\n const refetchSubscriptions = useCallback(async () => {\n if (!clientId) return;\n\n setIsLoadingSubscriptions(true);\n try {\n const data = await apiAdapters.listSubscriptions(clientId);\n setSubscribedTopics(data);\n } catch (error) {\n consoleLog({\n type: ConsoleType.ERROR,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message: 'Erro ao listar inscrições:',\n data: error,\n });\n onError?.(error as Error);\n } finally {\n setIsLoadingSubscriptions(false);\n }\n }, [clientId, apiAdapters, onError]);\n\n useEffect(() => {\n if (clientId) {\n void refetchSubscriptions();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [clientId]);\n\n const subscribeToTopic = useCallback(\n async (topic: string, options?: TopicSubscriptionOptions) => {\n if (!clientId) {\n consoleLog({\n type: ConsoleType.WARN,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message: 'Cliente não registrado',\n });\n return;\n }\n\n try {\n if (options) {\n topicOptionsRef.current.set(topic, options);\n }\n\n await apiAdapters.subscribeTopic(clientId, topic);\n await refetchSubscriptions();\n\n if (!isPassiveClient && (!pollingEnabled || !shouldPoll)) {\n setPollingEnabled(true);\n setShouldPoll(true);\n }\n } catch (error) {\n consoleLog({\n type: ConsoleType.ERROR,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message: 'Erro ao inscrever no tópico:',\n data: error,\n });\n onError?.(error as Error);\n }\n },\n [\n clientId,\n apiAdapters,\n refetchSubscriptions,\n onError,\n pollingEnabled,\n shouldPoll,\n isPassiveClient,\n ],\n );\n\n const unsubscribeFromTopic = useCallback(\n async (topic: string) => {\n if (!clientId) {\n consoleLog({\n type: ConsoleType.WARN,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message: 'Cliente não registrado',\n });\n return;\n }\n\n try {\n topicOptionsRef.current.delete(topic);\n\n await apiAdapters.unsubscribeTopic(clientId, topic);\n await refetchSubscriptions();\n } catch (error) {\n consoleLog({\n type: ConsoleType.ERROR,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message: 'Erro ao desinscrever do tópico:',\n data: error,\n });\n onError?.(error as Error);\n }\n },\n [clientId, apiAdapters, refetchSubscriptions, onError],\n );\n\n const subscribeTopicsBatch = useCallback(\n async (topics: string[]): Promise<void> => {\n if (!clientId || topics.length === 0) return;\n\n try {\n topics.forEach(topic => {\n if (!topicOptionsRef.current.has(topic)) {\n topicOptionsRef.current.set(topic, {});\n }\n });\n\n await apiAdapters.subscribeTopicsBatch(clientId, topics);\n await refetchSubscriptions();\n\n if (!isPassiveClient) {\n setPollingEnabled(true);\n setShouldPoll(true);\n }\n } catch (err) {\n consoleLog({\n type: ConsoleType.ERROR,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message: 'Erro ao inscrever em tópicos:',\n data: err,\n });\n onError?.(err as Error);\n }\n },\n [clientId, apiAdapters, refetchSubscriptions, onError, isPassiveClient],\n );\n\n const unsubscribeTopicsBatch = useCallback(\n async (topics: string[]): Promise<void> => {\n if (!clientId || topics.length === 0) return;\n\n try {\n topics.forEach(topic => topicOptionsRef.current.delete(topic));\n\n await apiAdapters.unsubscribeTopicsBatch(clientId, topics);\n await refetchSubscriptions();\n } catch (err) {\n consoleLog({\n type: ConsoleType.ERROR,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message: 'Erro ao desinscrever de tópicos:',\n data: err,\n });\n onError?.(err as Error);\n }\n },\n [clientId, apiAdapters, refetchSubscriptions, onError],\n );\n\n const resetMessageCount = useCallback(() => {\n setNewMessageCount(0);\n }, []);\n\n const value: PushNotificationContextData = useMemo(\n () => ({\n clientId,\n subscribedTopics,\n isLoading,\n newMessageCount,\n isRegisterError,\n subscribeToTopic,\n unsubscribeFromTopic,\n subscribeTopicsBatch,\n unsubscribeTopicsBatch,\n resetMessageCount,\n }),\n [\n clientId,\n subscribedTopics,\n isLoading,\n newMessageCount,\n isRegisterError,\n subscribeToTopic,\n unsubscribeFromTopic,\n subscribeTopicsBatch,\n unsubscribeTopicsBatch,\n resetMessageCount,\n ],\n );\n\n return (\n <PushNotificationContext.Provider value={value}>\n {children}\n </PushNotificationContext.Provider>\n );\n};\n\nexport function usePushNotifications(): PushNotificationContextData {\n const context = useContext(PushNotificationContext);\n\n if (!context) {\n throw new Error(\n 'usePushNotifications precisa estar dentro de PushNotificationProvider',\n );\n }\n\n return context;\n}\n"]}
1
+ {"version":3,"sources":["../../../src/contexts/PushNotifications/index.tsx"],"names":["createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","jsx","PushNotificationContext","PushNotificationProvider","children","originId","originType","bearerToken","vapidKey","serviceWorkerPath","serviceWorkerFile","pollingInterval","apiAdapters","onMessageReceived","onError","clientId","setClientId","isRegistering","setIsRegistering","isRegisterError","setIsRegisterError","isPassiveClient","setIsPassiveClient","newMessageCount","setNewMessageCount","processedMessageIds","subscribedTopics","setSubscribedTopics","isLoadingSubscriptions","setIsLoadingSubscriptions","pollingEnabled","setPollingEnabled","shouldPoll","setShouldPoll","topicOptionsRef","isLoading","interval","deliverables","m","prev","consoleLog","topic","error","performClientRegistration","subscription","isPassive","keys","payload","response","mounted","messageHandler","initSwAndRegister","id","err","permission","registration","urlBase64ToUint8Array","e","message","deliveredId","fallbackErr","refetchSubscriptions","data","subscribeToTopic","options","unsubscribeFromTopic","subscribeTopicsBatch","topics","unsubscribeTopicsBatch","resetMessageCount","value","usePushNotifications","context"],"mappings":"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","sourcesContent":["import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { ConsoleType, Environment } from 'types/consoleLog';\nimport {\n type ClientRegistrationPayload,\n MessageStatus,\n type PushNotificationContextData,\n type PushNotificationProviderProps,\n type SubscriptionsData,\n type TopicSubscriptionOptions,\n} from 'types/pushNotifications';\nimport { consoleLog } from 'utils/consoleLog';\nimport { urlBase64ToUint8Array } from 'utils/urlBase64ToUint8Array';\n\nconst PushNotificationContext = createContext<\n PushNotificationContextData | undefined\n>(undefined);\n\nexport const PushNotificationProvider = <TMessage = unknown,>({\n children,\n originId,\n originType,\n bearerToken,\n vapidKey,\n serviceWorkerPath = '/',\n serviceWorkerFile = 'service-worker.js',\n pollingInterval = 1000,\n apiAdapters,\n onMessageReceived,\n onError,\n}: PushNotificationProviderProps<TMessage>) => {\n const [clientId, setClientId] = useState<string | null>(null);\n const [isRegistering, setIsRegistering] = useState<boolean>(false);\n const [isRegisterError, setIsRegisterError] = useState<boolean>(false);\n const [isPassiveClient, setIsPassiveClient] = useState<boolean>(false);\n const [newMessageCount, setNewMessageCount] = useState<number>(0);\n const [processedMessageIds] = useState<Set<string>>(new Set());\n\n const [subscribedTopics, setSubscribedTopics] = useState<SubscriptionsData>({\n subscriptions: [],\n });\n const [isLoadingSubscriptions, setIsLoadingSubscriptions] =\n useState<boolean>(false);\n\n const [pollingEnabled, setPollingEnabled] = useState<boolean>(false);\n const [shouldPoll, setShouldPoll] = useState<boolean>(false);\n\n const topicOptionsRef = useRef<Map<string, TopicSubscriptionOptions>>(\n new Map(),\n );\n\n const isLoading = useMemo(\n () => !clientId || isLoadingSubscriptions || isRegistering,\n [clientId, isLoadingSubscriptions, isRegistering],\n );\n\n useEffect(() => {\n if (\n !pollingEnabled ||\n !shouldPoll ||\n !clientId ||\n !apiAdapters.fetchMessages ||\n subscribedTopics.subscriptions.length === 0\n )\n return;\n\n const interval = setInterval(async () => {\n try {\n const result = await apiAdapters.fetchMessages!(clientId);\n const messages = result?.messages ?? [];\n\n const deliverables = messages.filter(m => {\n if (!m?.payload) return false;\n if (processedMessageIds.has(m.id)) return false;\n\n return true;\n });\n\n if (deliverables.length === 0) return;\n\n deliverables.forEach(m => {\n processedMessageIds.add(m.id);\n onMessageReceived?.(m.payload, m.topic);\n });\n\n setNewMessageCount(prev => prev + deliverables.length);\n\n try {\n const updates = await Promise.allSettled(\n deliverables.map(m =>\n apiAdapters.updateMessageStatus(m.id, {\n status: MessageStatus.DELIVERED,\n }),\n ),\n );\n\n updates.forEach(u => {\n if (u.status === 'rejected') {\n consoleLog({\n type: ConsoleType.ERROR,\n environment: [\n Environment.DEVELOPMENT,\n Environment.HOMOLOGATION,\n ],\n message: 'Erro ao marcar mensagem como entregue:',\n data: u.reason,\n });\n }\n });\n } finally {\n const topicsProcessed = new Set(\n deliverables.map(m => m.topic).filter(Boolean) as string[],\n );\n\n topicsProcessed.forEach(topic => {\n const topicOptions = topicOptionsRef.current.get(topic);\n\n if (topicOptions?.stopPollingOnFirstMessage) {\n topicOptionsRef.current.delete(topic);\n }\n });\n\n const hasSubscriptions = subscribedTopics.subscriptions.length > 0;\n\n if (!hasSubscriptions) {\n setPollingEnabled(false);\n setShouldPoll(false);\n }\n }\n } catch (error) {\n consoleLog({\n type: ConsoleType.ERROR,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message: 'Erro ao buscar mensagens:',\n data: error,\n });\n }\n }, pollingInterval);\n\n return () => clearInterval(interval);\n }, [\n apiAdapters,\n clientId,\n onMessageReceived,\n pollingEnabled,\n pollingInterval,\n processedMessageIds,\n shouldPoll,\n subscribedTopics.subscriptions.length,\n ]);\n\n const performClientRegistration = useCallback(\n async (subscription: PushSubscription | null, isPassive: boolean) => {\n setIsRegistering(true);\n\n try {\n const keys = subscription?.toJSON().keys;\n const payload: ClientRegistrationPayload = {\n origin_type: originType,\n origin_id: originId,\n ...(isPassive && subscription\n ? {\n endpoint: subscription.endpoint,\n auth: keys?.auth,\n p256dh: keys?.p256dh,\n }\n : {}),\n };\n\n const response = await apiAdapters.registerClient(payload);\n\n setClientId(response.id);\n setIsRegisterError(false);\n setIsPassiveClient(isPassive);\n\n if (!isPassive) {\n setShouldPoll(true);\n }\n\n return response.id;\n } catch (error) {\n consoleLog({\n type: ConsoleType.ERROR,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message: 'Erro ao registrar cliente:',\n data: error,\n });\n\n setIsRegisterError(true);\n onError?.(error as Error);\n\n return null;\n } finally {\n setIsRegistering(false);\n }\n },\n [apiAdapters, onError, originId, originType],\n );\n\n useEffect(() => {\n let mounted = true;\n let messageHandler: ((e: MessageEvent) => void) | null = null;\n\n async function initSwAndRegister() {\n setIsRegistering(true);\n\n if (!('serviceWorker' in navigator) || !('PushManager' in window)) {\n consoleLog({\n type: ConsoleType.WARN,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message:\n 'Push notifications não suportadas, criando cliente ativo com polling',\n });\n\n try {\n const id = await performClientRegistration(null, false);\n if (mounted && id) {\n setClientId(id);\n setShouldPoll(true);\n }\n } catch (err) {\n consoleLog({\n type: ConsoleType.ERROR,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message: 'Erro ao registrar cliente ativo:',\n data: err,\n });\n onError?.(err as Error);\n } finally {\n setIsRegistering(false);\n }\n return;\n }\n\n try {\n const permission = await Notification.requestPermission();\n\n let subscription: PushSubscription | null = null;\n let isPassiveClient = false;\n\n if (permission === 'granted') {\n try {\n const registration = await navigator.serviceWorker.register(\n `${serviceWorkerPath}${serviceWorkerFile}`,\n );\n\n if (!mounted) return;\n\n await navigator.serviceWorker.ready;\n\n if (!mounted) return;\n\n subscription = await registration.pushManager.subscribe({\n userVisibleOnly: true,\n applicationServerKey: urlBase64ToUint8Array(\n vapidKey,\n ) as BufferSource,\n });\n\n messageHandler = async (e: MessageEvent) => {\n const message = e.data?.payload;\n const deliveredId = e.data?.id;\n\n if (message) {\n setNewMessageCount(prev => prev + 1);\n onMessageReceived?.(message, e.data?.topic);\n }\n\n if (deliveredId) {\n try {\n await apiAdapters.updateMessageStatus(deliveredId, {\n status: MessageStatus.DELIVERED,\n });\n } catch (err) {\n consoleLog({\n type: ConsoleType.ERROR,\n environment: [\n Environment.DEVELOPMENT,\n Environment.HOMOLOGATION,\n ],\n message: 'Erro ao atualizar status da mensagem:',\n data: err,\n });\n setIsRegisterError(true);\n onError?.(err as Error);\n }\n }\n };\n\n navigator.serviceWorker.addEventListener('message', messageHandler);\n\n isPassiveClient = true;\n consoleLog({\n type: ConsoleType.LOG,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message:\n 'Permissão concedida, criando cliente passivo (aguarda webpush)',\n });\n } catch (err) {\n consoleLog({\n type: ConsoleType.WARN,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message:\n 'Falha ao configurar push subscription, criando cliente ativo:',\n data: err,\n });\n isPassiveClient = false;\n }\n } else {\n consoleLog({\n type: ConsoleType.WARN,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message:\n 'Permissão de notificação negada, criando cliente ativo com polling',\n });\n isPassiveClient = false;\n }\n\n const id = await performClientRegistration(\n subscription,\n isPassiveClient,\n );\n if (mounted && id) {\n setClientId(id);\n\n if (!isPassiveClient) {\n setShouldPoll(true);\n }\n }\n } catch (err) {\n consoleLog({\n type: ConsoleType.ERROR,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message: 'Erro ao inicializar notificações:',\n data: err,\n });\n onError?.(err as Error);\n\n try {\n const id = await performClientRegistration(null, false);\n if (mounted && id) {\n setClientId(id);\n setShouldPoll(true);\n }\n } catch (fallbackErr) {\n consoleLog({\n type: ConsoleType.ERROR,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message: 'Erro ao criar cliente ativo como fallback:',\n data: fallbackErr,\n });\n }\n } finally {\n setIsRegistering(false);\n }\n }\n\n if (bearerToken) {\n void initSwAndRegister();\n }\n\n return () => {\n mounted = false;\n if (messageHandler && 'serviceWorker' in navigator) {\n navigator.serviceWorker.removeEventListener('message', messageHandler);\n }\n };\n }, [\n apiAdapters,\n bearerToken,\n onError,\n onMessageReceived,\n performClientRegistration,\n serviceWorkerFile,\n serviceWorkerPath,\n vapidKey,\n ]);\n\n const refetchSubscriptions = useCallback(async () => {\n if (!clientId) return;\n\n setIsLoadingSubscriptions(true);\n\n try {\n const data = await apiAdapters.listSubscriptions(clientId);\n\n setSubscribedTopics(data);\n } catch (error) {\n consoleLog({\n type: ConsoleType.ERROR,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message: 'Erro ao listar inscrições:',\n data: error,\n });\n\n onError?.(error as Error);\n } finally {\n setIsLoadingSubscriptions(false);\n }\n }, [apiAdapters, clientId, onError]);\n\n useEffect(() => {\n if (clientId) {\n void refetchSubscriptions();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [clientId]);\n\n const subscribeToTopic = useCallback(\n async (topic: string, options?: TopicSubscriptionOptions) => {\n if (!clientId) {\n consoleLog({\n type: ConsoleType.WARN,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message: 'Cliente não registrado',\n });\n\n return;\n }\n\n try {\n if (options) {\n topicOptionsRef.current.set(topic, options);\n }\n\n await apiAdapters.subscribeTopic(clientId, topic);\n await refetchSubscriptions();\n\n if (!isPassiveClient && (!pollingEnabled || !shouldPoll)) {\n setPollingEnabled(true);\n setShouldPoll(true);\n }\n } catch (error) {\n consoleLog({\n type: ConsoleType.ERROR,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message: 'Erro ao inscrever no tópico:',\n data: error,\n });\n\n onError?.(error as Error);\n }\n },\n [\n apiAdapters,\n clientId,\n isPassiveClient,\n onError,\n pollingEnabled,\n refetchSubscriptions,\n shouldPoll,\n ],\n );\n\n const unsubscribeFromTopic = useCallback(\n async (topic: string) => {\n if (!clientId) {\n consoleLog({\n type: ConsoleType.WARN,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message: 'Cliente não registrado',\n });\n\n return;\n }\n\n try {\n topicOptionsRef.current.delete(topic);\n\n await apiAdapters.unsubscribeTopic(clientId, topic);\n await refetchSubscriptions();\n } catch (error) {\n consoleLog({\n type: ConsoleType.ERROR,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message: 'Erro ao desinscrever do tópico:',\n data: error,\n });\n\n onError?.(error as Error);\n }\n },\n [apiAdapters, clientId, onError, refetchSubscriptions],\n );\n\n const subscribeTopicsBatch = useCallback(\n async (topics: string[]): Promise<void> => {\n if (!clientId || topics.length === 0) return;\n\n try {\n topics.forEach(topic => {\n if (!topicOptionsRef.current.has(topic)) {\n topicOptionsRef.current.set(topic, {});\n }\n });\n\n await apiAdapters.subscribeTopicsBatch(clientId, topics);\n await refetchSubscriptions();\n\n if (!isPassiveClient) {\n setPollingEnabled(true);\n setShouldPoll(true);\n }\n } catch (err) {\n consoleLog({\n type: ConsoleType.ERROR,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message: 'Erro ao inscrever em tópicos:',\n data: err,\n });\n\n onError?.(err as Error);\n }\n },\n [apiAdapters, clientId, isPassiveClient, onError, refetchSubscriptions],\n );\n\n const unsubscribeTopicsBatch = useCallback(\n async (topics: string[]): Promise<void> => {\n if (!clientId || topics.length === 0) return;\n\n try {\n topics.forEach(topic => topicOptionsRef.current.delete(topic));\n\n await apiAdapters.unsubscribeTopicsBatch(clientId, topics);\n await refetchSubscriptions();\n } catch (err) {\n consoleLog({\n type: ConsoleType.ERROR,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message: 'Erro ao desinscrever de tópicos:',\n data: err,\n });\n\n onError?.(err as Error);\n }\n },\n [apiAdapters, clientId, onError, refetchSubscriptions],\n );\n\n const resetMessageCount = useCallback(() => {\n setNewMessageCount(0);\n }, []);\n\n const value: PushNotificationContextData = useMemo(\n () => ({\n clientId,\n subscribedTopics,\n isLoading,\n newMessageCount,\n isRegisterError,\n subscribeToTopic,\n unsubscribeFromTopic,\n subscribeTopicsBatch,\n unsubscribeTopicsBatch,\n resetMessageCount,\n }),\n [\n clientId,\n isLoading,\n isRegisterError,\n newMessageCount,\n resetMessageCount,\n subscribedTopics,\n subscribeToTopic,\n subscribeTopicsBatch,\n unsubscribeFromTopic,\n unsubscribeTopicsBatch,\n ],\n );\n\n return (\n <PushNotificationContext.Provider value={value}>\n {children}\n </PushNotificationContext.Provider>\n );\n};\n\nexport function usePushNotifications(): PushNotificationContextData {\n const context = useContext(PushNotificationContext);\n\n if (!context) {\n throw new Error(\n 'usePushNotifications precisa estar dentro de PushNotificationProvider',\n );\n }\n\n return context;\n}\n"]}
@@ -1,3 +1,3 @@
1
- declare const useIsVisible: <T extends Element>(threshold?: number, rootMargin?: string) => [(node: T | null) => void, boolean];
1
+ declare function useIsVisible<T extends Element>(threshold?: number, rootMargin?: string, keepAlive?: boolean): [React.RefObject<T>, boolean];
2
2
 
3
3
  export { useIsVisible as default };
@@ -1,7 +1,7 @@
1
- import { useState, useRef, useCallback, useEffect } from 'react';
1
+ import { useRef, useState, useEffect } from 'react';
2
2
 
3
- var v=(n=0,s)=>{let[c,i]=useState(!1),e=useRef(null),l=useCallback(t=>{if(e.current?.disconnect(),e.current=null,!t||typeof IntersectionObserver>"u")return;let r=new IntersectionObserver(([u])=>{i(u.isIntersecting);},{threshold:n,rootMargin:s});r.observe(t),e.current=r;},[s,n]);return useEffect(()=>()=>e.current?.disconnect(),[]),[l,c]},a=v;
3
+ function d(t=0,s="50px",r=!1){let c=useRef(null),[l,f]=useState(!1),e=useRef(null);return useEffect(()=>{let i=c.current;if(!i||typeof IntersectionObserver>"u")return;e.current?.disconnect();let n=new IntersectionObserver(([u])=>{f(u.isIntersecting),r&&u.isIntersecting&&(n.disconnect(),e.current=null);},{threshold:t,rootMargin:s});return n.observe(i),e.current=n,()=>{e.current?.disconnect(),e.current=null;}},[t,s,r]),[c,l]}var m=d;
4
4
 
5
- export { a as default };
5
+ export { m as default };
6
6
  //# sourceMappingURL=out.js.map
7
7
  //# sourceMappingURL=useIsVisible.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hooks/useIsVisible.ts"],"names":["useCallback","useEffect","useRef","useState","useIsVisible","threshold","rootMargin","isVisible","setIsVisible","observerRef","ref","node","io","entry","useIsVisible_default"],"mappings":"AAAA,OAAS,eAAAA,EAAa,aAAAC,EAAW,UAAAC,EAAQ,YAAAC,MAAgB,QAEzD,IAAMC,EAAe,CACnBC,EAAY,EACZC,IACwC,CACxC,GAAM,CAACC,EAAWC,CAAY,EAAIL,EAAS,EAAK,EAC1CM,EAAcP,EAAoC,IAAI,EAEtDQ,EAAMV,EACTW,GAAmB,CAGlB,GAFAF,EAAY,SAAS,WAAW,EAChCA,EAAY,QAAU,KAClB,CAACE,GAAQ,OAAO,qBAAyB,IAAa,OAE1D,IAAMC,EAAK,IAAI,qBACb,CAAC,CAACC,CAAK,IAAM,CACXL,EAAaK,EAAM,cAAc,CACnC,EACA,CAAE,UAAAR,EAAW,WAAAC,CAAW,CAC1B,EAEAM,EAAG,QAAQD,CAAI,EACfF,EAAY,QAAUG,CACxB,EACA,CAACN,EAAYD,CAAS,CACxB,EAEA,OAAAJ,EAAU,IAAM,IAAMQ,EAAY,SAAS,WAAW,EAAG,CAAC,CAAC,EAEpD,CAACC,EAAKH,CAAS,CACxB,EAEOO,EAAQV","sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\n\nconst useIsVisible = <T extends Element>(\n threshold = 0,\n rootMargin?: string,\n): [(node: T | null) => void, boolean] => {\n const [isVisible, setIsVisible] = useState(false);\n const observerRef = useRef<IntersectionObserver | null>(null);\n\n const ref = useCallback(\n (node: T | null) => {\n observerRef.current?.disconnect();\n observerRef.current = null;\n if (!node || typeof IntersectionObserver === 'undefined') return;\n\n const io = new IntersectionObserver(\n ([entry]) => {\n setIsVisible(entry.isIntersecting);\n },\n { threshold, rootMargin },\n );\n\n io.observe(node);\n observerRef.current = io;\n },\n [rootMargin, threshold],\n );\n\n useEffect(() => () => observerRef.current?.disconnect(), []);\n\n return [ref, isVisible];\n};\n\nexport default useIsVisible;\n"]}
1
+ {"version":3,"sources":["../../src/hooks/useIsVisible.ts"],"names":["useEffect","useRef","useState","useIsVisible","threshold","rootMargin","keepAlive","ref","isVisible","setIsVisible","observerRef","element","io","entry","useIsVisible_default"],"mappings":"AAAA,OAAS,aAAAA,EAAW,UAAAC,EAAQ,YAAAC,MAAgB,QAyB5C,SAASC,EACPC,EAAY,EACZC,EAAa,OACbC,EAAY,GACmB,CAC/B,IAAMC,EAAMN,EAAU,IAAI,EACpB,CAACO,EAAWC,CAAY,EAAIP,EAAS,EAAK,EAC1CQ,EAAcT,EAAoC,IAAI,EAE5D,OAAAD,EAAU,IAAM,CACd,IAAMW,EAAUJ,EAAI,QACpB,GAAI,CAACI,GAAW,OAAO,qBAAyB,IAAa,OAE7DD,EAAY,SAAS,WAAW,EAEhC,IAAME,EAAK,IAAI,qBACb,CAAC,CAACC,CAAK,IAAM,CACXJ,EAAaI,EAAM,cAAc,EAC7BP,GAAaO,EAAM,iBACrBD,EAAG,WAAW,EACdF,EAAY,QAAU,KAE1B,EACA,CAAE,UAAAN,EAAW,WAAAC,CAAW,CAC1B,EAEA,OAAAO,EAAG,QAAQD,CAAO,EAClBD,EAAY,QAAUE,EAEf,IAAM,CACXF,EAAY,SAAS,WAAW,EAChCA,EAAY,QAAU,IACxB,CACF,EAAG,CAACN,EAAWC,EAAYC,CAAS,CAAC,EAE9B,CAACC,EAAKC,CAAS,CACxB,CAEA,IAAOM,EAAQX","sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\n/**\n * Hook para detectar quando um elemento está visível na viewport usando Intersection Observer\n *\n * @template T - Tipo do elemento HTML a ser observado\n * @param {number} [threshold=0] - Porcentagem do elemento que deve estar visível (0-1)\n * @param {string} [rootMargin='50px'] - Margem ao redor da viewport para pré-carregamento\n * @param {boolean} [keepAlive=false] - Se true, mantém isVisible=true após primeira visualização e desconecta observer\n * @returns {[React.RefObject<T>, boolean]} Array com [ref para anexar ao elemento, estado de visibilidade]\n *\n * @example\n * // Lazy load básico\n * const [ref, isVisible] = useIsVisible<HTMLDivElement>();\n * <div ref={ref}>{isVisible && <HeavyComponent />}</div>\n *\n * @example\n * // Com keepAlive para carregar uma vez e manter\n * const [ref, isVisible] = useIsVisible<HTMLDivElement>(0, '50px', true);\n * <div ref={ref}>{isVisible && <HeavyComponent />}</div>\n *\n * @example\n * // Threshold customizado (50% visível)\n * const [ref, isVisible] = useIsVisible<HTMLDivElement>(0.5, '100px');\n */\nfunction useIsVisible<T extends Element>(\n threshold = 0,\n rootMargin = '50px',\n keepAlive = false,\n): [React.RefObject<T>, boolean] {\n const ref = useRef<T>(null);\n const [isVisible, setIsVisible] = useState(false);\n const observerRef = useRef<IntersectionObserver | null>(null);\n\n useEffect(() => {\n const element = ref.current;\n if (!element || typeof IntersectionObserver === 'undefined') return;\n\n observerRef.current?.disconnect();\n\n const io = new IntersectionObserver(\n ([entry]) => {\n setIsVisible(entry.isIntersecting);\n if (keepAlive && entry.isIntersecting) {\n io.disconnect();\n observerRef.current = null;\n }\n },\n { threshold, rootMargin },\n );\n\n io.observe(element);\n observerRef.current = io;\n\n return () => {\n observerRef.current?.disconnect();\n observerRef.current = null;\n };\n }, [threshold, rootMargin, keepAlive]);\n\n return [ref, isVisible];\n}\n\nexport default useIsVisible;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zydon/common",
3
- "version": "2.8.2",
3
+ "version": "2.8.4",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "module": "./dist/index.js",