@nextelco/common-ui 2.1.106 → 2.1.107
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/index.js +201 -145
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/legacy/components/atoms/InputData/InputData.js +2 -13
- package/dist/esm/legacy/components/atoms/InputData/InputData.js.map +1 -1
- package/dist/esm/legacy/components/charts/Charts.js +147 -57
- package/dist/esm/legacy/components/charts/Charts.js.map +1 -1
- package/dist/esm/legacy/components/layout/Layout/Layout.js +21 -82
- package/dist/esm/legacy/components/layout/Layout/Layout.js.map +1 -1
- package/dist/esm/legacy/components/layout/Sidebar/Sidebar.js +29 -218
- package/dist/esm/legacy/components/layout/Sidebar/Sidebar.js.map +1 -1
- package/dist/esm/legacy/components/molecules/ColumnPicker/ColumnPicker.js +77 -10
- package/dist/esm/legacy/components/molecules/ColumnPicker/ColumnPicker.js.map +1 -1
- package/dist/esm/legacy/components/molecules/DataTable/DataTable.js +445 -337
- package/dist/esm/legacy/components/molecules/DataTable/DataTable.js.map +1 -1
- package/dist/esm/legacy/components/molecules/UserAvatar/UserAvatar.js +15 -97
- package/dist/esm/legacy/components/molecules/UserAvatar/UserAvatar.js.map +1 -1
- package/dist/esm/legacy/components/organisms/MapaPontos/MapaPontos.js +3 -3
- package/dist/esm/legacy/components/organisms/MapaPontos/MapaPontos.js.map +1 -1
- package/dist/esm/legacy/components/organisms/PainelFiltros/PainelFiltros.js +15 -3
- package/dist/esm/legacy/components/organisms/PainelFiltros/PainelFiltros.js.map +1 -1
- package/dist/esm/legacy/components/organisms/Selector/Selector.js +4 -4
- package/dist/esm/legacy/components/organisms/Selector/Selector.js.map +1 -1
- package/dist/esm/legacy/components/ui/Avisos.js +23 -76
- package/dist/esm/legacy/components/ui/Avisos.js.map +1 -1
- package/dist/esm/legacy/components/ui/CabecalhoPagina.js +14 -27
- package/dist/esm/legacy/components/ui/CabecalhoPagina.js.map +1 -1
- package/dist/esm/legacy/components/ui/CaixaPesquisa.js +3 -51
- package/dist/esm/legacy/components/ui/CaixaPesquisa.js.map +1 -1
- package/dist/esm/legacy/components/ui/Confirmacao.js +13 -31
- package/dist/esm/legacy/components/ui/Confirmacao.js.map +1 -1
- package/dist/esm/legacy/components/ui/Escolha.js +21 -137
- package/dist/esm/legacy/components/ui/Escolha.js.map +1 -1
- package/dist/esm/legacy/components/ui/FaixaAviso.js +13 -11
- package/dist/esm/legacy/components/ui/FaixaAviso.js.map +1 -1
- package/dist/esm/legacy/components/ui/Separadores.js +11 -46
- package/dist/esm/legacy/components/ui/Separadores.js.map +1 -1
- package/dist/esm/legacy/components/ui/Ui.js +18 -115
- package/dist/esm/legacy/components/ui/Ui.js.map +1 -1
- package/dist/esm/legacy/components/ui/painelFlutuante.js +5 -44
- package/dist/esm/legacy/components/ui/painelFlutuante.js.map +1 -1
- package/dist/esm/v1/capabilities/overlay/useFloatingPanel.js +52 -0
- package/dist/esm/v1/capabilities/overlay/useFloatingPanel.js.map +1 -0
- package/dist/esm/v1/capabilities/theme/useIsDark.js +15 -0
- package/dist/esm/v1/capabilities/theme/useIsDark.js.map +1 -0
- package/dist/esm/v1/capabilities/theme/useTheme.js +66 -0
- package/dist/esm/v1/capabilities/theme/useTheme.js.map +1 -0
- package/dist/esm/v1/components/data/Pagination/Pagination.js +66 -0
- package/dist/esm/v1/components/data/Pagination/Pagination.js.map +1 -0
- package/dist/esm/v1/components/feedback/Toast/Toast.js +105 -0
- package/dist/esm/v1/components/feedback/Toast/Toast.js.map +1 -0
- package/dist/esm/v1/components/layout/AppShell/AppShell.js +89 -0
- package/dist/esm/v1/components/layout/AppShell/AppShell.js.map +1 -0
- package/dist/esm/v1/components/layout/Page/Page.js +16 -0
- package/dist/esm/v1/components/layout/Page/Page.js.map +1 -0
- package/dist/esm/v1/components/layout/PageHeader/PageHeader.js +26 -0
- package/dist/esm/v1/components/layout/PageHeader/PageHeader.js.map +1 -0
- package/dist/esm/v1/components/layout/SideNav/SideNav.js +277 -0
- package/dist/esm/v1/components/layout/SideNav/SideNav.js.map +1 -0
- package/dist/esm/v1/components/layout/navTrail.js +19 -0
- package/dist/esm/v1/components/layout/navTrail.js.map +1 -0
- package/dist/esm/v1/components/overlays/ConfirmDialog/ConfirmDialog.js +95 -0
- package/dist/esm/v1/components/overlays/ConfirmDialog/ConfirmDialog.js.map +1 -0
- package/dist/esm/v1/components/overlays/Dialog/Dialog.js.map +1 -1
- package/dist/esm/v1/components/overlays/Tooltip/Tooltip.js +98 -0
- package/dist/esm/v1/components/overlays/Tooltip/Tooltip.js.map +1 -0
- package/dist/esm/v1/components/overlays/Tooltip/TooltipLayer.js +84 -0
- package/dist/esm/v1/components/overlays/Tooltip/TooltipLayer.js.map +1 -0
- package/dist/esm/v1/components/overlays/Tooltip/TooltipPanel.js +33 -0
- package/dist/esm/v1/components/overlays/Tooltip/TooltipPanel.js.map +1 -0
- package/dist/esm/v1/components/overlays/topLayer.js +28 -0
- package/dist/esm/v1/components/overlays/topLayer.js.map +1 -0
- package/dist/esm/v1/foundations/icons/icons.js +61 -2
- package/dist/esm/v1/foundations/icons/icons.js.map +1 -1
- package/dist/esm/v1/primitives/buttons/Button/Button.js +18 -4
- package/dist/esm/v1/primitives/buttons/Button/Button.js.map +1 -1
- package/dist/esm/v1/primitives/buttons/SegmentedControl/SegmentedControl.js +65 -0
- package/dist/esm/v1/primitives/buttons/SegmentedControl/SegmentedControl.js.map +1 -0
- package/dist/esm/v1/primitives/buttons/SegmentedControl/segmentedStyles.js +10 -0
- package/dist/esm/v1/primitives/buttons/SegmentedControl/segmentedStyles.js.map +1 -0
- package/dist/esm/v1/primitives/display/Avatar/Avatar.js +120 -0
- package/dist/esm/v1/primitives/display/Avatar/Avatar.js.map +1 -0
- package/dist/esm/v1/primitives/display/Badge/Badge.js +23 -0
- package/dist/esm/v1/primitives/display/Badge/Badge.js.map +1 -0
- package/dist/esm/v1/primitives/display/Card/Card.js +22 -0
- package/dist/esm/v1/primitives/display/Card/Card.js.map +1 -0
- package/dist/esm/v1/primitives/display/FilterChips/FilterChips.js +45 -0
- package/dist/esm/v1/primitives/display/FilterChips/FilterChips.js.map +1 -0
- package/dist/esm/v1/primitives/display/Kpi/Kpi.js +103 -0
- package/dist/esm/v1/primitives/display/Kpi/Kpi.js.map +1 -0
- package/dist/esm/v1/primitives/display/Notice/Notice.js +71 -0
- package/dist/esm/v1/primitives/display/Notice/Notice.js.map +1 -0
- package/dist/esm/v1/primitives/display/Person/Person.js +14 -0
- package/dist/esm/v1/primitives/display/Person/Person.js.map +1 -0
- package/dist/esm/v1/primitives/forms/Checkbox/Checkbox.js +1 -1
- package/dist/esm/v1/primitives/forms/Checkbox/Checkbox.js.map +1 -1
- package/dist/esm/v1/primitives/forms/DateInput/DateInput.js +150 -0
- package/dist/esm/v1/primitives/forms/DateInput/DateInput.js.map +1 -0
- package/dist/esm/v1/primitives/forms/SearchInput/SearchInput.js +43 -0
- package/dist/esm/v1/primitives/forms/SearchInput/SearchInput.js.map +1 -0
- package/dist/esm/v1/primitives/forms/SelectInput/SelectInput.js +190 -12
- package/dist/esm/v1/primitives/forms/SelectInput/SelectInput.js.map +1 -1
- package/dist/esm/v1/primitives/forms/field.js +4 -2
- package/dist/esm/v1/primitives/forms/field.js.map +1 -1
- package/dist/esm/v1/primitives/navigation/Tabs/Tabs.js +96 -0
- package/dist/esm/v1/primitives/navigation/Tabs/Tabs.js.map +1 -0
- package/dist/style.components.css +1 -1
- package/dist/style.css +1 -1
- package/dist/style.layered.css +1 -1
- package/dist/tailwind.css +24 -0
- package/dist/theme-boot.js +1 -0
- package/dist/theme.css +10 -3
- package/dist/tokens.css +119 -0
- package/dist/types/legacy/components/atoms/InputData/InputData.d.ts +4 -1
- package/dist/types/legacy/components/charts/Charts.d.ts +58 -5
- package/dist/types/legacy/components/layout/Layout/Layout.d.ts +7 -20
- package/dist/types/legacy/components/layout/Sidebar/Sidebar.d.ts +13 -26
- package/dist/types/legacy/components/molecules/ColumnPicker/ColumnPicker.d.ts +56 -3
- package/dist/types/legacy/components/molecules/DataTable/DataTable.d.ts +72 -7
- package/dist/types/legacy/components/molecules/UserAvatar/UserAvatar.d.ts +4 -5
- package/dist/types/legacy/components/ui/Avisos.d.ts +6 -16
- package/dist/types/legacy/components/ui/CabecalhoPagina.d.ts +6 -20
- package/dist/types/legacy/components/ui/CaixaPesquisa.d.ts +2 -4
- package/dist/types/legacy/components/ui/Confirmacao.d.ts +3 -10
- package/dist/types/legacy/components/ui/Escolha.d.ts +5 -15
- package/dist/types/legacy/components/ui/FaixaAviso.d.ts +2 -6
- package/dist/types/legacy/components/ui/Separadores.d.ts +3 -10
- package/dist/types/legacy/components/ui/Ui.d.ts +12 -54
- package/dist/types/legacy/components/ui/painelFlutuante.d.ts +6 -10
- package/dist/types/legacy/exports/atoms.d.ts +1 -1
- package/dist/types/legacy/exports/charts.d.ts +2 -2
- package/dist/types/legacy/exports/hooks.d.ts +2 -2
- package/dist/types/legacy/exports/molecules.d.ts +2 -2
- package/dist/types/v1/capabilities/overlay/useFloatingPanel.d.ts +20 -0
- package/dist/types/v1/capabilities/theme/useIsDark.d.ts +10 -0
- package/dist/types/v1/capabilities/theme/useTheme.d.ts +29 -0
- package/dist/types/v1/components/data/Pagination/Pagination.d.ts +33 -0
- package/dist/types/v1/components/feedback/Toast/Toast.d.ts +51 -0
- package/dist/types/v1/components/layout/AppShell/AppShell.d.ts +35 -0
- package/dist/types/v1/components/layout/Page/Page.d.ts +23 -0
- package/dist/types/v1/components/layout/PageHeader/PageHeader.d.ts +35 -0
- package/dist/types/v1/components/layout/SideNav/SideNav.d.ts +92 -0
- package/dist/types/v1/components/layout/navTrail.d.ts +15 -0
- package/dist/types/v1/components/overlays/ConfirmDialog/ConfirmDialog.d.ts +59 -0
- package/dist/types/v1/components/overlays/Dialog/Dialog.d.ts +3 -2
- package/dist/types/v1/components/overlays/Tooltip/Tooltip.d.ts +34 -0
- package/dist/types/v1/components/overlays/Tooltip/TooltipLayer.d.ts +18 -0
- package/dist/types/v1/components/overlays/Tooltip/TooltipPanel.d.ts +23 -0
- package/dist/types/v1/components/overlays/topLayer.d.ts +23 -0
- package/dist/types/v1/foundations/icons/icons.d.ts +20 -0
- package/dist/types/v1/index.d.ts +43 -1
- package/dist/types/v1/primitives/buttons/Button/Button.d.ts +20 -5
- package/dist/types/v1/primitives/buttons/SegmentedControl/SegmentedControl.d.ts +28 -0
- package/dist/types/v1/primitives/buttons/SegmentedControl/segmentedStyles.d.ts +16 -0
- package/dist/types/v1/primitives/display/Avatar/Avatar.d.ts +30 -0
- package/dist/types/v1/primitives/display/Badge/Badge.d.ts +25 -0
- package/dist/types/v1/primitives/display/Card/Card.d.ts +22 -0
- package/dist/types/v1/primitives/display/FilterChips/FilterChips.d.ts +33 -0
- package/dist/types/v1/primitives/display/Kpi/Kpi.d.ts +68 -0
- package/dist/types/v1/primitives/display/Notice/Notice.d.ts +29 -0
- package/dist/types/v1/primitives/display/Person/Person.d.ts +15 -0
- package/dist/types/v1/primitives/forms/DateInput/DateInput.d.ts +43 -0
- package/dist/types/v1/primitives/forms/SearchInput/SearchInput.d.ts +23 -0
- package/dist/types/v1/primitives/forms/SelectInput/SelectInput.d.ts +60 -12
- package/dist/types/v1/primitives/forms/field.d.ts +2 -0
- package/dist/types/v1/primitives/navigation/Tabs/Tabs.d.ts +58 -0
- package/package.json +3 -3
- package/dist/esm/legacy/components/atoms/Tooltip/Tooltip.css +0 -17
- package/dist/esm/legacy/components/atoms/Tooltip/Tooltip.js +0 -41
- package/dist/esm/legacy/components/atoms/Tooltip/Tooltip.js.map +0 -1
- package/dist/esm/legacy/components/molecules/Search/Search.css +0 -18
- package/dist/esm/legacy/components/molecules/Search/Search.js +0 -30
- package/dist/esm/legacy/components/molecules/Search/Search.js.map +0 -1
- package/dist/esm/legacy/hooks/useTheme.js +0 -39
- package/dist/esm/legacy/hooks/useTheme.js.map +0 -1
- package/dist/types/legacy/components/atoms/Tooltip/Tooltip.d.ts +0 -13
- package/dist/types/legacy/components/molecules/Search/Search.d.ts +0 -7
- package/dist/types/legacy/hooks/useTheme.d.ts +0 -17
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Selector.js","sources":["../../../../../../src/legacy/components/organisms/Selector/Selector.tsx"],"sourcesContent":["import React, { ReactNode, useEffect, useId, useState } from 'react'\r\nimport {\r\n faMinus,\r\n faPlus,\r\n faQuestion,\r\n faSave,\r\n} from '@fortawesome/free-solid-svg-icons'\r\nimport { IconProp } from '@fortawesome/fontawesome-svg-core'\r\nimport { ActionButton, IconText, IconButton } from '../../../exports/atoms'\r\nimport {\r\n ActionButtonThemeStyled,\r\n IconButtonThemeStyled,\r\n IconTextDarkThemeStyled,\r\n IconTextLightThemeStyled,\r\n} from '../../../styles/themes/ButtonThemes'\r\n\r\nimport Modal from '../../molecules/Modal/Modal'\r\nimport Search from '../../molecules/Search/Search'\r\nimport { Fetcher } from '../../../types/Fetcher'\r\nimport { LazyLoader } from '../LazyLoader/LazyLoader'\r\nimport './Selector.scss'\r\nimport { SelectableElement } from '../../../types/SelectableElement'\r\nimport Spinner from '../../layout/Spinner/Spinner'\r\nimport TooltipWrapper from '../../atoms/Tooltip/Tooltip'\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\r\n\r\ntype SelectorProps<T extends SelectableElement> = {\r\n title: string\r\n onClose: () => void\r\n onConfirm: (selected: T[]) => void\r\n onDisabled?: (disabled: T) => ReactNode\r\n initiallySelected: T[]\r\n blocked?: string[]\r\n single?: boolean\r\n icon: IconProp\r\n fetcher: Fetcher\r\n working?: boolean\r\n}\r\n\r\n/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nexport const Selector = <T extends SelectableElement>({\r\n title,\r\n icon,\r\n onClose,\r\n onConfirm,\r\n initiallySelected,\r\n blocked = [],\r\n fetcher,\r\n single = false,\r\n working = false,\r\n onDisabled,\r\n}: SelectorProps<T>) => {\r\n const scrollContainerId = useId()\r\n const [selectedElements, setSelectedElements] =\r\n useState<T[]>(initiallySelected)\r\n\r\n const [filter, setFilter] = useState({\r\n term: {\r\n type: 'text',\r\n active: false,\r\n text: '',\r\n },\r\n })\r\n\r\n useEffect(() => {\r\n setSelectedElements(initiallySelected)\r\n }, [initiallySelected])\r\n\r\n const handleSearch = (text: string) => {\r\n setFilter({\r\n term: {\r\n type: 'text',\r\n active: text != '' ? true : false,\r\n text: text,\r\n },\r\n })\r\n }\r\n\r\n const toggleElementSelection = (element: T) => {\r\n const isSelected = selectedElements.some((se) => se.id === element.id)\r\n\r\n if (isSelected) {\r\n setSelectedElements(selectedElements.filter((se) => se.id !== element.id))\r\n } else {\r\n if (single) {\r\n setSelectedElements([element])\r\n } else {\r\n setSelectedElements([...selectedElements, element])\r\n }\r\n }\r\n }\r\n\r\n const renderElement = (element: T) => {\r\n const isSelected = selectedElements.some((se) => se.id === element.id)\r\n const isBlocked = blocked.includes(element.id)\r\n const isDisabled = element.disabled || false\r\n\r\n return (\r\n <li\r\n key={element.id}\r\n className={`cui-selector__elements-list-item ${\r\n isSelected\r\n ? 'cui-selector__elements-list-item-selected'\r\n : 'cui-selector__elements-list-item-not-selected'\r\n } ${isBlocked ? 'cui-selector__elements-list-item-blocked' : ''}`}\r\n onClick={\r\n !isBlocked && !isDisabled\r\n ? () => toggleElementSelection(element)\r\n : undefined\r\n }\r\n >\r\n <span className={'cui-selector__elements-list-item-description'}>\r\n <IconText\r\n icon={icon}\r\n text={element.name}\r\n theme={\r\n isSelected ? IconTextDarkThemeStyled : IconTextLightThemeStyled\r\n }\r\n />\r\n </span>\r\n <span className={'cui-selector__elements-list-item-option'}>\r\n {element.code && <label>{element.code}</label>}\r\n {!isBlocked && !isDisabled ? (\r\n <IconButton\r\n onClick={() => {\r\n toggleElementSelection(element)\r\n }}\r\n icon={isSelected ? faMinus : faPlus}\r\n theme={IconButtonThemeStyled}\r\n />\r\n ) : (\r\n <TooltipWrapper\r\n interactive={true}\r\n tip={\r\n onDisabled ? (\r\n onDisabled(element)\r\n ) : isBlocked ? (\r\n <div>Bloqueado...</div>\r\n ) : (\r\n <div>Sem dados....</div>\r\n )\r\n }\r\n >\r\n <IconButton\r\n onClick={() => {}}\r\n icon={faQuestion}\r\n theme={IconButtonThemeStyled}\r\n disabled={true}\r\n />\r\n </TooltipWrapper>\r\n )}\r\n </span>\r\n </li>\r\n )\r\n }\r\n\r\n const renderSelectedElements = () => {\r\n if (selectedElements.length === 0) {\r\n return (\r\n <p className=\"cui-selector__selected-empty\">\r\n Sem elementos selecionados...\r\n </p>\r\n )\r\n }\r\n\r\n return (\r\n <ul className=\"cui-selector__selected-list\">\r\n {selectedElements.map((element) => {\r\n const isBlocked = blocked.includes(element.id)\r\n\r\n if (isBlocked) return null\r\n\r\n return (\r\n <li key={element.id} className=\"cui-selector__selected-list-item\">\r\n <span className={'cui-selector__selected-list-info'}>\r\n <IconText\r\n icon={icon}\r\n theme={IconTextDarkThemeStyled}\r\n text={element.name}\r\n />\r\n </span>\r\n <span className={'cui-selector__selected-list-option'}>\r\n <IconButton\r\n icon={faMinus}\r\n onClick={() =>\r\n setSelectedElements(\r\n selectedElements.filter((e) => e.id !== element.id)\r\n )\r\n }\r\n theme={IconButtonThemeStyled}\r\n />\r\n </span>\r\n </li>\r\n )\r\n })}\r\n </ul>\r\n )\r\n }\r\n\r\n const handleConfirm = () => {\r\n onConfirm(selectedElements)\r\n }\r\n\r\n return (\r\n <Modal title={title} onClose={onClose}>\r\n <div className=\"cui-selector\">\r\n <div className=\"cui-selector__search\">\r\n <Search handleSearch={handleSearch} />\r\n </div>\r\n\r\n <div className=\"cui-selector__selected\">{renderSelectedElements()}</div>\r\n\r\n <div id={scrollContainerId} className=\"cui-selector__elements\">\r\n <LazyLoader<T>\r\n endpoint={fetcher.endpoint}\r\n params={{\r\n filters: {\r\n ...fetcher.params,\r\n ...(filter.term.active && {\r\n term: {\r\n type: filter.term.type,\r\n text: filter.term.text,\r\n },\r\n }),\r\n },\r\n }}\r\n limit={15}\r\n scrollableTarget={scrollContainerId}\r\n >\r\n {(items, loading, error) => (\r\n <ul className=\"cui-selector__elements-list\">\r\n {items.length > 0 ? (\r\n items.map((element) => renderElement(element))\r\n ) : (\r\n <li className=\"cui-selector__elements-empty\">\r\n No elements found\r\n </li>\r\n )}\r\n </ul>\r\n )}\r\n </LazyLoader>\r\n </div>\r\n\r\n <div className=\"cui-selector__confirmation\">\r\n {!working ? (\r\n <ActionButton\r\n title=\"Confirmar\"\r\n icon={<FontAwesomeIcon icon={faSave} />}\r\n onClick={handleConfirm}\r\n theme={ActionButtonThemeStyled}\r\n />\r\n ) : (\r\n <Spinner />\r\n )}\r\n </div>\r\n </div>\r\n </Modal>\r\n )\r\n}\r\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Selector.js","sources":["../../../../../../src/legacy/components/organisms/Selector/Selector.tsx"],"sourcesContent":["import React, { ReactNode, useEffect, useId, useState } from 'react'\r\nimport {\r\n faMinus,\r\n faPlus,\r\n faQuestion,\r\n faSave,\r\n} from '@fortawesome/free-solid-svg-icons'\r\nimport { IconProp } from '@fortawesome/fontawesome-svg-core'\r\nimport { ActionButton, IconText, IconButton } from '../../../exports/atoms'\r\nimport {\r\n ActionButtonThemeStyled,\r\n IconButtonThemeStyled,\r\n IconTextDarkThemeStyled,\r\n IconTextLightThemeStyled,\r\n} from '../../../styles/themes/ButtonThemes'\r\n\r\nimport Modal from '../../molecules/Modal/Modal'\r\nimport SearchInput from '../../../../v1/primitives/forms/SearchInput/SearchInput'\r\nimport { Fetcher } from '../../../types/Fetcher'\r\nimport { LazyLoader } from '../LazyLoader/LazyLoader'\r\nimport './Selector.scss'\r\nimport { SelectableElement } from '../../../types/SelectableElement'\r\nimport Spinner from '../../layout/Spinner/Spinner'\r\nimport TooltipWrapper from '../../../../v1/components/overlays/Tooltip/Tooltip'\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\r\n\r\ntype SelectorProps<T extends SelectableElement> = {\r\n title: string\r\n onClose: () => void\r\n onConfirm: (selected: T[]) => void\r\n onDisabled?: (disabled: T) => ReactNode\r\n initiallySelected: T[]\r\n blocked?: string[]\r\n single?: boolean\r\n icon: IconProp\r\n fetcher: Fetcher\r\n working?: boolean\r\n}\r\n\r\n/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nexport const Selector = <T extends SelectableElement>({\r\n title,\r\n icon,\r\n onClose,\r\n onConfirm,\r\n initiallySelected,\r\n blocked = [],\r\n fetcher,\r\n single = false,\r\n working = false,\r\n onDisabled,\r\n}: SelectorProps<T>) => {\r\n const scrollContainerId = useId()\r\n const [selectedElements, setSelectedElements] =\r\n useState<T[]>(initiallySelected)\r\n\r\n const [filter, setFilter] = useState({\r\n term: {\r\n type: 'text',\r\n active: false,\r\n text: '',\r\n },\r\n })\r\n\r\n useEffect(() => {\r\n setSelectedElements(initiallySelected)\r\n }, [initiallySelected])\r\n\r\n const handleSearch = (text: string) => {\r\n setFilter({\r\n term: {\r\n type: 'text',\r\n active: text != '' ? true : false,\r\n text: text,\r\n },\r\n })\r\n }\r\n\r\n const toggleElementSelection = (element: T) => {\r\n const isSelected = selectedElements.some((se) => se.id === element.id)\r\n\r\n if (isSelected) {\r\n setSelectedElements(selectedElements.filter((se) => se.id !== element.id))\r\n } else {\r\n if (single) {\r\n setSelectedElements([element])\r\n } else {\r\n setSelectedElements([...selectedElements, element])\r\n }\r\n }\r\n }\r\n\r\n const renderElement = (element: T) => {\r\n const isSelected = selectedElements.some((se) => se.id === element.id)\r\n const isBlocked = blocked.includes(element.id)\r\n const isDisabled = element.disabled || false\r\n\r\n return (\r\n <li\r\n key={element.id}\r\n className={`cui-selector__elements-list-item ${\r\n isSelected\r\n ? 'cui-selector__elements-list-item-selected'\r\n : 'cui-selector__elements-list-item-not-selected'\r\n } ${isBlocked ? 'cui-selector__elements-list-item-blocked' : ''}`}\r\n onClick={\r\n !isBlocked && !isDisabled\r\n ? () => toggleElementSelection(element)\r\n : undefined\r\n }\r\n >\r\n <span className={'cui-selector__elements-list-item-description'}>\r\n <IconText\r\n icon={icon}\r\n text={element.name}\r\n theme={\r\n isSelected ? IconTextDarkThemeStyled : IconTextLightThemeStyled\r\n }\r\n />\r\n </span>\r\n <span className={'cui-selector__elements-list-item-option'}>\r\n {element.code && <label>{element.code}</label>}\r\n {!isBlocked && !isDisabled ? (\r\n <IconButton\r\n onClick={() => {\r\n toggleElementSelection(element)\r\n }}\r\n icon={isSelected ? faMinus : faPlus}\r\n theme={IconButtonThemeStyled}\r\n />\r\n ) : (\r\n <TooltipWrapper\r\n interactive={true}\r\n tip={\r\n onDisabled ? (\r\n onDisabled(element)\r\n ) : isBlocked ? (\r\n <div>Bloqueado...</div>\r\n ) : (\r\n <div>Sem dados....</div>\r\n )\r\n }\r\n >\r\n <IconButton\r\n onClick={() => {}}\r\n icon={faQuestion}\r\n theme={IconButtonThemeStyled}\r\n disabled={true}\r\n />\r\n </TooltipWrapper>\r\n )}\r\n </span>\r\n </li>\r\n )\r\n }\r\n\r\n const renderSelectedElements = () => {\r\n if (selectedElements.length === 0) {\r\n return (\r\n <p className=\"cui-selector__selected-empty\">\r\n Sem elementos selecionados...\r\n </p>\r\n )\r\n }\r\n\r\n return (\r\n <ul className=\"cui-selector__selected-list\">\r\n {selectedElements.map((element) => {\r\n const isBlocked = blocked.includes(element.id)\r\n\r\n if (isBlocked) return null\r\n\r\n return (\r\n <li key={element.id} className=\"cui-selector__selected-list-item\">\r\n <span className={'cui-selector__selected-list-info'}>\r\n <IconText\r\n icon={icon}\r\n theme={IconTextDarkThemeStyled}\r\n text={element.name}\r\n />\r\n </span>\r\n <span className={'cui-selector__selected-list-option'}>\r\n <IconButton\r\n icon={faMinus}\r\n onClick={() =>\r\n setSelectedElements(\r\n selectedElements.filter((e) => e.id !== element.id)\r\n )\r\n }\r\n theme={IconButtonThemeStyled}\r\n />\r\n </span>\r\n </li>\r\n )\r\n })}\r\n </ul>\r\n )\r\n }\r\n\r\n const handleConfirm = () => {\r\n onConfirm(selectedElements)\r\n }\r\n\r\n return (\r\n <Modal title={title} onClose={onClose}>\r\n <div className=\"cui-selector\">\r\n <div className=\"cui-selector__search\">\r\n <SearchInput value={filter.term.text} onChange={handleSearch} className=\"w-full\" />\r\n </div>\r\n\r\n <div className=\"cui-selector__selected\">{renderSelectedElements()}</div>\r\n\r\n <div id={scrollContainerId} className=\"cui-selector__elements\">\r\n <LazyLoader<T>\r\n endpoint={fetcher.endpoint}\r\n params={{\r\n filters: {\r\n ...fetcher.params,\r\n ...(filter.term.active && {\r\n term: {\r\n type: filter.term.type,\r\n text: filter.term.text,\r\n },\r\n }),\r\n },\r\n }}\r\n limit={15}\r\n scrollableTarget={scrollContainerId}\r\n >\r\n {(items, loading, error) => (\r\n <ul className=\"cui-selector__elements-list\">\r\n {items.length > 0 ? (\r\n items.map((element) => renderElement(element))\r\n ) : (\r\n <li className=\"cui-selector__elements-empty\">\r\n No elements found\r\n </li>\r\n )}\r\n </ul>\r\n )}\r\n </LazyLoader>\r\n </div>\r\n\r\n <div className=\"cui-selector__confirmation\">\r\n {!working ? (\r\n <ActionButton\r\n title=\"Confirmar\"\r\n icon={<FontAwesomeIcon icon={faSave} />}\r\n onClick={handleConfirm}\r\n theme={ActionButtonThemeStyled}\r\n />\r\n ) : (\r\n <Spinner />\r\n )}\r\n </div>\r\n </div>\r\n </Modal>\r\n )\r\n}\r\n"],"names":["TooltipWrapper"],"mappings":"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"}
|
|
@@ -1,83 +1,30 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
const
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo } from "react";
|
|
3
|
+
import ToastProvider, { useToast } from "../../../v1/components/feedback/Toast/Toast.js";
|
|
4
|
+
const opcoesV1 = (o = {}) => ({
|
|
5
|
+
duration: o.duracao,
|
|
6
|
+
action: o.acao && { label: o.acao.rotulo, onClick: o.acao.onClick }
|
|
7
|
+
});
|
|
5
8
|
function AvisosProvider({ children, rotuloFechar = "Fechar aviso", maximo = 4 }) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
(tipo, mensagem, opcoes = {}) => {
|
|
17
|
-
const id = ++seq.current;
|
|
18
|
-
setAvisos((l) => [...l, { id, tipo, mensagem, ...opcoes }].slice(-maximo));
|
|
19
|
-
const duracao = opcoes.duracao ?? DURACAO[tipo];
|
|
20
|
-
if (duracao > 0) temporizadores.current.set(id, setTimeout(() => fechar(id), duracao));
|
|
21
|
-
return id;
|
|
22
|
-
},
|
|
23
|
-
[fechar, maximo]
|
|
24
|
-
);
|
|
25
|
-
useEffect(() => {
|
|
26
|
-
const mapa = temporizadores.current;
|
|
27
|
-
return () => mapa.forEach((t) => clearTimeout(t));
|
|
28
|
-
}, []);
|
|
29
|
-
const api = useMemo(
|
|
9
|
+
return /* @__PURE__ */ jsx(ToastProvider, { closeLabel: rotuloFechar, max: maximo, children });
|
|
10
|
+
}
|
|
11
|
+
function useAvisos() {
|
|
12
|
+
let toast;
|
|
13
|
+
try {
|
|
14
|
+
toast = useToast();
|
|
15
|
+
} catch {
|
|
16
|
+
throw new Error("useAvisos tem de ser usado dentro de um <AvisosProvider>.");
|
|
17
|
+
}
|
|
18
|
+
return useMemo(
|
|
30
19
|
() => ({
|
|
31
|
-
sucesso: (m, o) =>
|
|
32
|
-
erro: (m, o) =>
|
|
33
|
-
aviso: (m, o) =>
|
|
34
|
-
info: (m, o) =>
|
|
35
|
-
fechar
|
|
20
|
+
sucesso: (m, o) => toast.success(m, opcoesV1(o)),
|
|
21
|
+
erro: (m, o) => toast.error(m, opcoesV1(o)),
|
|
22
|
+
aviso: (m, o) => toast.warning(m, opcoesV1(o)),
|
|
23
|
+
info: (m, o) => toast.info(m, opcoesV1(o)),
|
|
24
|
+
fechar: toast.dismiss
|
|
36
25
|
}),
|
|
37
|
-
[
|
|
26
|
+
[toast]
|
|
38
27
|
);
|
|
39
|
-
const estilos = {
|
|
40
|
-
sucesso: ["border-ok/30", "bg-ok-bg text-ok", "✓"],
|
|
41
|
-
erro: ["border-incumprido/30", "bg-incumprido-bg text-incumprido", "!"],
|
|
42
|
-
aviso: ["border-risco/30", "bg-risco-bg text-risco", "!"],
|
|
43
|
-
info: ["border-sky-200", "bg-sky-50 text-sky-700", "i"]
|
|
44
|
-
};
|
|
45
|
-
return /* @__PURE__ */ jsxs(Contexto.Provider, { value: api, children: [
|
|
46
|
-
children,
|
|
47
|
-
/* @__PURE__ */ jsx("div", { "aria-live": "polite", className: "pointer-events-none fixed bottom-4 right-4 z-[70] flex w-[min(420px,calc(100vw-2rem))] flex-col gap-2", children: avisos.map((a) => {
|
|
48
|
-
const [borda, icone, simbolo] = estilos[a.tipo];
|
|
49
|
-
return /* @__PURE__ */ jsxs(
|
|
50
|
-
"div",
|
|
51
|
-
{
|
|
52
|
-
role: a.tipo === "erro" ? "alert" : "status",
|
|
53
|
-
className: `pointer-events-auto flex items-center gap-3 rounded-xl border ${borda} bg-white px-3.5 py-3 shadow-lg dark:bg-slate-900`,
|
|
54
|
-
children: [
|
|
55
|
-
/* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: `flex h-6 w-6 shrink-0 items-center justify-center rounded-full text-xs font-black ${icone}`, children: simbolo }),
|
|
56
|
-
/* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 text-sm font-semibold text-slate-800 dark:text-slate-100", children: a.mensagem }),
|
|
57
|
-
a.acao && /* @__PURE__ */ jsx(
|
|
58
|
-
"button",
|
|
59
|
-
{
|
|
60
|
-
type: "button",
|
|
61
|
-
onClick: () => {
|
|
62
|
-
a.acao.onClick();
|
|
63
|
-
fechar(a.id);
|
|
64
|
-
},
|
|
65
|
-
className: "shrink-0 text-xs font-bold text-proef-blue hover:text-proef-navy",
|
|
66
|
-
children: a.acao.rotulo
|
|
67
|
-
}
|
|
68
|
-
),
|
|
69
|
-
/* @__PURE__ */ jsx("button", { type: "button", onClick: () => fechar(a.id), "aria-label": rotuloFechar, className: "shrink-0 text-slate-400 hover:text-slate-700", children: "×" })
|
|
70
|
-
]
|
|
71
|
-
},
|
|
72
|
-
a.id
|
|
73
|
-
);
|
|
74
|
-
}) })
|
|
75
|
-
] });
|
|
76
|
-
}
|
|
77
|
-
function useAvisos() {
|
|
78
|
-
const api = useContext(Contexto);
|
|
79
|
-
if (!api) throw new Error("useAvisos tem de ser usado dentro de um <AvisosProvider>.");
|
|
80
|
-
return api;
|
|
81
28
|
}
|
|
82
29
|
export {
|
|
83
30
|
AvisosProvider,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Avisos.js","sources":["../../../../../src/legacy/components/ui/Avisos.tsx"],"sourcesContent":["import React, {
|
|
1
|
+
{"version":3,"file":"Avisos.js","sources":["../../../../../src/legacy/components/ui/Avisos.tsx"],"sourcesContent":["import React, { useMemo, type ReactNode } from 'react'\r\nimport ToastProvider, { useToast, type ToastOptions } from '../../../v1/components/feedback/Toast/Toast'\r\n\r\n/*\r\n * Migrado para o V1: os avisos são o `ToastProvider` / `useToast` do V1. Este\r\n * ficheiro só traduz a API antiga (em português) para a nova, para as apps que\r\n * ainda a usam continuarem a funcionar sem mudanças.\r\n */\r\n\r\n/** @deprecated Legacy — usar `useToast` do V1. */\r\nexport type TipoAviso = 'sucesso' | 'erro' | 'aviso' | 'info'\r\n\r\n/** @deprecated Legacy — usar `ToastOptions` do V1. */\r\nexport interface OpcoesAviso {\r\n /** Botão no aviso (ex: \"Tentar de novo\", \"Desfazer\"). */\r\n acao?: { rotulo: string; onClick: () => void }\r\n /** Milissegundos até fechar sozinho. 0 = só fecha à mão. */\r\n duracao?: number\r\n}\r\n\r\n/** @deprecated Legacy — usar `ToastApi` do V1. */\r\nexport interface AvisosApi {\r\n sucesso: (mensagem: ReactNode, opcoes?: OpcoesAviso) => number\r\n erro: (mensagem: ReactNode, opcoes?: OpcoesAviso) => number\r\n aviso: (mensagem: ReactNode, opcoes?: OpcoesAviso) => number\r\n info: (mensagem: ReactNode, opcoes?: OpcoesAviso) => number\r\n fechar: (id: number) => void\r\n}\r\n\r\n/** @deprecated Legacy — usar `ToastProviderProps` do V1. */\r\nexport interface AvisosProviderProps {\r\n children: ReactNode\r\n /** Rótulo do botão de fechar (leitores de ecrã). */\r\n rotuloFechar?: string\r\n /** Máximo de avisos visíveis ao mesmo tempo; os mais antigos saem. */\r\n maximo?: number\r\n}\r\n\r\nconst opcoesV1 = (o: OpcoesAviso = {}): ToastOptions => ({\r\n duration: o.duracao,\r\n action: o.acao && { label: o.acao.rotulo, onClick: o.acao.onClick },\r\n})\r\n\r\n/** @deprecated Legacy — usar `ToastProvider` do V1. */\r\nexport function AvisosProvider({ children, rotuloFechar = 'Fechar aviso', maximo = 4 }: AvisosProviderProps) {\r\n return (\r\n <ToastProvider closeLabel={rotuloFechar} max={maximo}>\r\n {children}\r\n </ToastProvider>\r\n )\r\n}\r\n\r\n/** @deprecated Legacy — usar `useToast` do V1. */\r\nexport function useAvisos(): AvisosApi {\r\n let toast: ReturnType<typeof useToast>\r\n try {\r\n toast = useToast()\r\n } catch {\r\n // A mensagem de sempre, com o nome que estas apps conhecem.\r\n throw new Error('useAvisos tem de ser usado dentro de um <AvisosProvider>.')\r\n }\r\n return useMemo<AvisosApi>(\r\n () => ({\r\n sucesso: (m, o) => toast.success(m, opcoesV1(o)),\r\n erro: (m, o) => toast.error(m, opcoesV1(o)),\r\n aviso: (m, o) => toast.warning(m, opcoesV1(o)),\r\n info: (m, o) => toast.info(m, opcoesV1(o)),\r\n fechar: toast.dismiss,\r\n }),\r\n [toast],\r\n )\r\n}\r\n"],"names":[],"mappings":";;;AAsCA,MAAM,WAAW,CAAC,IAAiB,QAAsB;AAAA,EACvD,UAAU,EAAE;AAAA,EACZ,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,QAAQ,SAAS,EAAE,KAAK,QAAA;AAC5D;AAGO,SAAS,eAAe,EAAE,UAAU,eAAe,gBAAgB,SAAS,KAA0B;AAC3G,6BACG,eAAA,EAAc,YAAY,cAAc,KAAK,QAC3C,UACH;AAEJ;AAGO,SAAS,YAAuB;AACrC,MAAI;AACJ,MAAI;AACF,YAAQ,SAAA;AAAA,EACV,QAAQ;AAEN,UAAM,IAAI,MAAM,2DAA2D;AAAA,EAC7E;AACA,SAAO;AAAA,IACL,OAAO;AAAA,MACL,SAAS,CAAC,GAAG,MAAM,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC;AAAA,MAC/C,MAAM,CAAC,GAAG,MAAM,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;AAAA,MAC1C,OAAO,CAAC,GAAG,MAAM,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC;AAAA,MAC7C,MAAM,CAAC,GAAG,MAAM,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC;AAAA,MACzC,QAAQ,MAAM;AAAA,IAAA;AAAA,IAEhB,CAAC,KAAK;AAAA,EAAA;AAEV;"}
|
|
@@ -1,30 +1,17 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
!ultimo && /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "text-slate-300 dark:text-slate-600", children: "›" })
|
|
16
|
-
] }, i);
|
|
17
|
-
}) }) }),
|
|
18
|
-
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4 lg:flex-row lg:items-end lg:justify-between", children: [
|
|
19
|
-
/* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
|
|
20
|
-
/* @__PURE__ */ jsx("h1", { className: "m-0 text-2xl md:text-4xl font-black uppercase tracking-tighter text-proef-navy dark:text-slate-100", children: titulo }),
|
|
21
|
-
/* @__PURE__ */ jsx("div", { className: "mt-1 h-1 w-12 bg-proef-turquoise" }),
|
|
22
|
-
descricao && /* @__PURE__ */ jsx("p", { className: "mt-3 text-sm font-medium text-slate-500 dark:text-slate-400", children: descricao }),
|
|
23
|
-
extra && /* @__PURE__ */ jsx("div", { className: "mt-2 flex flex-wrap items-center gap-2", children: extra })
|
|
24
|
-
] }),
|
|
25
|
-
acoes && /* @__PURE__ */ jsx("div", { className: "flex flex-wrap items-center gap-2 shrink-0", children: acoes })
|
|
26
|
-
] })
|
|
27
|
-
] });
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import PageHeader from "../../../v1/components/layout/PageHeader/PageHeader.js";
|
|
3
|
+
function CabecalhoPagina({ titulo, descricao, caminho, acoes, extra, rotuloCaminho = "Caminho" }) {
|
|
4
|
+
return /* @__PURE__ */ jsx(
|
|
5
|
+
PageHeader,
|
|
6
|
+
{
|
|
7
|
+
title: titulo,
|
|
8
|
+
description: descricao,
|
|
9
|
+
breadcrumb: caminho?.map((n) => ({ label: n.rotulo, href: n.href, onClick: n.onClick })),
|
|
10
|
+
actions: acoes,
|
|
11
|
+
extra,
|
|
12
|
+
breadcrumbLabel: rotuloCaminho
|
|
13
|
+
}
|
|
14
|
+
);
|
|
28
15
|
}
|
|
29
16
|
export {
|
|
30
17
|
CabecalhoPagina as default
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CabecalhoPagina.js","sources":["../../../../../src/legacy/components/ui/CabecalhoPagina.tsx"],"sourcesContent":["import React, { type ReactNode } from 'react'\r\n\r\n
|
|
1
|
+
{"version":3,"file":"CabecalhoPagina.js","sources":["../../../../../src/legacy/components/ui/CabecalhoPagina.tsx"],"sourcesContent":["import React, { type ReactNode } from 'react'\r\nimport PageHeader from '../../../v1/components/layout/PageHeader/PageHeader'\r\n\r\n/*\r\n * Migrado para o V1: o cabeçalho é o `PageHeader` do V1 (ou o `Page`, que o\r\n * inclui). Este ficheiro só traduz a API antiga (em português) para a nova,\r\n * para as apps que ainda a usam continuarem a funcionar sem mudanças.\r\n */\r\n\r\n/** @deprecated Legacy — usar `BreadcrumbItem` do V1. */\r\nexport interface NivelCaminho {\r\n rotulo: ReactNode\r\n /** Ligação normal. Para o router da app, usar `onClick` (ex: `() => navigate('/x')`). */\r\n href?: string\r\n onClick?: () => void\r\n}\r\n\r\n/** @deprecated Legacy — usar `PageHeaderProps` do V1. */\r\nexport interface CabecalhoPaginaProps {\r\n titulo: ReactNode\r\n descricao?: ReactNode\r\n /** Caminho até à página (área › lista › registo). O último nível é a página atual. */\r\n caminho?: NivelCaminho[]\r\n /** Botões da página (ex: \"Novo\", \"Editar\"). */\r\n acoes?: ReactNode\r\n /** Linha extra por baixo da descrição (etiquetas de estado, responsável…). */\r\n extra?: ReactNode\r\n /** Rótulo acessível da navegação do caminho. */\r\n rotuloCaminho?: string\r\n}\r\n\r\n/** @deprecated Legacy — usar `PageHeader` (ou `Page`) do V1. */\r\nexport default function CabecalhoPagina({ titulo, descricao, caminho, acoes, extra, rotuloCaminho = 'Caminho' }: CabecalhoPaginaProps) {\r\n return (\r\n <PageHeader\r\n title={titulo}\r\n description={descricao}\r\n breadcrumb={caminho?.map((n) => ({ label: n.rotulo, href: n.href, onClick: n.onClick }))}\r\n actions={acoes}\r\n extra={extra}\r\n breadcrumbLabel={rotuloCaminho}\r\n />\r\n )\r\n}\r\n"],"names":[],"mappings":";;AAgCA,SAAwB,gBAAgB,EAAE,QAAQ,WAAW,SAAS,OAAO,OAAO,gBAAgB,aAAmC;AACrI,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,MACP,aAAa;AAAA,MACb,YAAY,SAAS,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,MAAM,EAAE,MAAM,SAAS,EAAE,UAAU;AAAA,MACvF,SAAS;AAAA,MACT;AAAA,MACA,iBAAiB;AAAA,IAAA;AAAA,EAAA;AAGvB;"}
|
|
@@ -1,55 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import SearchInput from "../../../v1/primitives/forms/SearchInput/SearchInput.js";
|
|
2
3
|
function CaixaPesquisa({ valor, onMudar, placeholder = "Pesquisar…", rotulo, className = "w-56", autoFocus }) {
|
|
3
|
-
return /* @__PURE__ */
|
|
4
|
-
/* @__PURE__ */ jsxs(
|
|
5
|
-
"svg",
|
|
6
|
-
{
|
|
7
|
-
xmlns: "http://www.w3.org/2000/svg",
|
|
8
|
-
width: "14",
|
|
9
|
-
height: "14",
|
|
10
|
-
viewBox: "0 0 24 24",
|
|
11
|
-
fill: "none",
|
|
12
|
-
stroke: "currentColor",
|
|
13
|
-
strokeWidth: "2",
|
|
14
|
-
strokeLinecap: "round",
|
|
15
|
-
strokeLinejoin: "round",
|
|
16
|
-
className: "pointer-events-none absolute left-2.5 top-1/2 -translate-y-1/2 text-slate-400",
|
|
17
|
-
"aria-hidden": true,
|
|
18
|
-
children: [
|
|
19
|
-
/* @__PURE__ */ jsx("circle", { cx: "11", cy: "11", r: "8" }),
|
|
20
|
-
/* @__PURE__ */ jsx("path", { d: "m21 21-4.3-4.3" })
|
|
21
|
-
]
|
|
22
|
-
}
|
|
23
|
-
),
|
|
24
|
-
/* @__PURE__ */ jsx(
|
|
25
|
-
"input",
|
|
26
|
-
{
|
|
27
|
-
type: "search",
|
|
28
|
-
value: valor,
|
|
29
|
-
onChange: (e) => onMudar(e.target.value),
|
|
30
|
-
onKeyDown: (e) => {
|
|
31
|
-
if (e.key === "Escape" && valor) {
|
|
32
|
-
e.stopPropagation();
|
|
33
|
-
onMudar("");
|
|
34
|
-
}
|
|
35
|
-
},
|
|
36
|
-
placeholder,
|
|
37
|
-
"aria-label": rotulo ?? placeholder,
|
|
38
|
-
autoFocus,
|
|
39
|
-
className: "h-8 w-full rounded-lg border border-slate-300 dark:border-slate-600 bg-white dark:bg-slate-900 pl-8 pr-7 text-sm text-slate-800 dark:text-slate-100 placeholder:text-slate-400 outline-none focus:border-proef-blue focus:ring-1 focus:ring-proef-blue dark:focus:border-proef-turquoise dark:focus:ring-proef-turquoise [&::-webkit-search-cancel-button]:hidden"
|
|
40
|
-
}
|
|
41
|
-
),
|
|
42
|
-
valor && /* @__PURE__ */ jsx(
|
|
43
|
-
"button",
|
|
44
|
-
{
|
|
45
|
-
type: "button",
|
|
46
|
-
onClick: () => onMudar(""),
|
|
47
|
-
"aria-label": "Limpar pesquisa",
|
|
48
|
-
className: "appearance-none cursor-pointer bg-transparent border-0 absolute right-1.5 top-1/2 -translate-y-1/2 px-1 text-base leading-none text-slate-400 hover:text-slate-700 dark:hover:text-slate-200",
|
|
49
|
-
children: "×"
|
|
50
|
-
}
|
|
51
|
-
)
|
|
52
|
-
] });
|
|
4
|
+
return /* @__PURE__ */ jsx(SearchInput, { value: valor, onChange: onMudar, placeholder, label: rotulo, className, autoFocus });
|
|
53
5
|
}
|
|
54
6
|
export {
|
|
55
7
|
CaixaPesquisa as default
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CaixaPesquisa.js","sources":["../../../../../src/legacy/components/ui/CaixaPesquisa.tsx"],"sourcesContent":["import React from 'react'\r\n\r\nexport interface CaixaPesquisaProps {\r\n valor: string\r\n onMudar: (valor: string) => void\r\n placeholder?: string\r\n /** Nome acessível (leitores de ecrã). Por omissão, o placeholder. */\r\n rotulo?: string\r\n /** Largura (classes tailwind). Por omissão w-56. */\r\n className?: string\r\n autoFocus?: boolean\r\n}\r\n\r\n
|
|
1
|
+
{"version":3,"file":"CaixaPesquisa.js","sources":["../../../../../src/legacy/components/ui/CaixaPesquisa.tsx"],"sourcesContent":["import React from 'react'\r\nimport SearchInput from '../../../v1/primitives/forms/SearchInput/SearchInput'\r\n\r\n/*\r\n * Migrado para o V1: a caixa de pesquisa é o `SearchInput` do V1 (mesmo\r\n * aspeto e comportamento). Este ficheiro só traduz a API antiga.\r\n */\r\n\r\n/** @deprecated Legacy — usar `SearchInputProps` do V1. */\r\nexport interface CaixaPesquisaProps {\r\n valor: string\r\n onMudar: (valor: string) => void\r\n placeholder?: string\r\n /** Nome acessível (leitores de ecrã). Por omissão, o placeholder. */\r\n rotulo?: string\r\n /** Largura (classes tailwind). Por omissão w-56. */\r\n className?: string\r\n autoFocus?: boolean\r\n}\r\n\r\n/** @deprecated Legacy — usar `SearchInput` do V1. */\r\nexport default function CaixaPesquisa({ valor, onMudar, placeholder = 'Pesquisar…', rotulo, className = 'w-56', autoFocus }: CaixaPesquisaProps) {\r\n return <SearchInput value={valor} onChange={onMudar} placeholder={placeholder} label={rotulo} className={className} autoFocus={autoFocus} />\r\n}\r\n"],"names":[],"mappings":";;AAqBA,SAAwB,cAAc,EAAE,OAAO,SAAS,cAAc,cAAc,QAAQ,YAAY,QAAQ,aAAiC;AAC/I,SAAO,oBAAC,aAAA,EAAY,OAAO,OAAO,UAAU,SAAS,aAA0B,OAAO,QAAQ,WAAsB,UAAA,CAAsB;AAC5I;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { jsx
|
|
2
|
-
import
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import ConfirmDialog from "../../../v1/components/overlays/ConfirmDialog/ConfirmDialog.js";
|
|
3
3
|
function Confirmacao({
|
|
4
4
|
aberto,
|
|
5
5
|
titulo,
|
|
@@ -12,37 +12,19 @@ function Confirmacao({
|
|
|
12
12
|
aConfirmar = false,
|
|
13
13
|
acaoSecundaria
|
|
14
14
|
}) {
|
|
15
|
-
const idTitulo = useId();
|
|
16
|
-
const refCancelar = useRef(null);
|
|
17
|
-
const refConfirmar = useRef(null);
|
|
18
|
-
useEffect(() => {
|
|
19
|
-
if (!aberto) return;
|
|
20
|
-
(variante === "perigo" ? refCancelar : refConfirmar).current?.focus();
|
|
21
|
-
const esc = (e) => {
|
|
22
|
-
if (e.key === "Escape" && !aConfirmar) onCancelar();
|
|
23
|
-
};
|
|
24
|
-
window.addEventListener("keydown", esc);
|
|
25
|
-
return () => window.removeEventListener("keydown", esc);
|
|
26
|
-
}, [aberto, variante, aConfirmar, onCancelar]);
|
|
27
|
-
if (!aberto) return null;
|
|
28
|
-
const btn = "rounded-md px-4 py-2.5 text-[11px] font-black uppercase tracking-widest disabled:opacity-50 disabled:cursor-not-allowed";
|
|
29
|
-
const principal = variante === "perigo" ? "bg-incumprido text-white border border-incumprido hover:opacity-90" : "bg-proef-navy text-white border border-proef-navy hover:bg-proef-blue";
|
|
30
15
|
return /* @__PURE__ */ jsx(
|
|
31
|
-
|
|
16
|
+
ConfirmDialog,
|
|
32
17
|
{
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
/* @__PURE__ */ jsx("button", { ref: refConfirmar, type: "button", onClick: onConfirmar, disabled: aConfirmar, "aria-busy": aConfirmar, className: `${btn} ${principal}`, children: textoConfirmar })
|
|
44
|
-
] })
|
|
45
|
-
] })
|
|
18
|
+
open: aberto,
|
|
19
|
+
title: titulo,
|
|
20
|
+
message: children,
|
|
21
|
+
tone: variante === "perigo" ? "danger" : "default",
|
|
22
|
+
confirmLabel: textoConfirmar,
|
|
23
|
+
cancelLabel: textoCancelar,
|
|
24
|
+
loading: aConfirmar,
|
|
25
|
+
secondaryAction: acaoSecundaria && { label: acaoSecundaria.rotulo, onClick: acaoSecundaria.onClick },
|
|
26
|
+
onConfirm: onConfirmar,
|
|
27
|
+
onCancel: onCancelar
|
|
46
28
|
}
|
|
47
29
|
);
|
|
48
30
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Confirmacao.js","sources":["../../../../../src/legacy/components/ui/Confirmacao.tsx"],"sourcesContent":["import React, {
|
|
1
|
+
{"version":3,"file":"Confirmacao.js","sources":["../../../../../src/legacy/components/ui/Confirmacao.tsx"],"sourcesContent":["import React, { type ReactNode } from 'react'\r\nimport ConfirmDialog from '../../../v1/components/overlays/ConfirmDialog/ConfirmDialog'\r\n\r\n/*\r\n * Migrado para o V1: a confirmação é o `ConfirmDialog` do V1 (ou `useConfirm`).\r\n * Este ficheiro só traduz a API antiga (em português) para a nova, para as\r\n * apps que ainda a usam continuarem a funcionar sem mudanças.\r\n */\r\n\r\n/** @deprecated Legacy — usar `ConfirmDialog` ou `useConfirm` do V1. */\r\nexport interface ConfirmacaoProps {\r\n aberto: boolean\r\n titulo: ReactNode\r\n /** Explicação: o que vai acontecer, a que registo, se é reversível. */\r\n children?: ReactNode\r\n onConfirmar: () => void\r\n onCancelar: () => void\r\n /** Texto do botão — o verbo da ação (\"Eliminar\", \"Submeter\"), não \"OK\". */\r\n textoConfirmar?: string\r\n textoCancelar?: string\r\n /** `perigo` pinta a ação a vermelho e põe o foco em Cancelar. */\r\n variante?: 'normal' | 'perigo'\r\n /** A ação está a correr: botões desativados. */\r\n aConfirmar?: boolean\r\n /** Uma segunda saída (ex: \"Desativar\" em vez de eliminar, \"Eliminar só o contrato\"). */\r\n acaoSecundaria?: { rotulo: string; onClick: () => void }\r\n}\r\n\r\n/** @deprecated Legacy — usar `ConfirmDialog` ou `useConfirm` do V1. */\r\nexport default function Confirmacao({\r\n aberto,\r\n titulo,\r\n children,\r\n onConfirmar,\r\n onCancelar,\r\n textoConfirmar = 'Confirmar',\r\n textoCancelar = 'Cancelar',\r\n variante = 'normal',\r\n aConfirmar = false,\r\n acaoSecundaria,\r\n}: ConfirmacaoProps) {\r\n return (\r\n <ConfirmDialog\r\n open={aberto}\r\n title={titulo}\r\n message={children}\r\n tone={variante === 'perigo' ? 'danger' : 'default'}\r\n confirmLabel={textoConfirmar}\r\n cancelLabel={textoCancelar}\r\n loading={aConfirmar}\r\n secondaryAction={acaoSecundaria && { label: acaoSecundaria.rotulo, onClick: acaoSecundaria.onClick }}\r\n onConfirm={onConfirmar}\r\n onCancel={onCancelar}\r\n />\r\n )\r\n}\r\n"],"names":[],"mappings":";;AA6BA,SAAwB,YAAY;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,aAAa;AAAA,EACb;AACF,GAAqB;AACnB,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAM;AAAA,MACN,OAAO;AAAA,MACP,SAAS;AAAA,MACT,MAAM,aAAa,WAAW,WAAW;AAAA,MACzC,cAAc;AAAA,MACd,aAAa;AAAA,MACb,SAAS;AAAA,MACT,iBAAiB,kBAAkB,EAAE,OAAO,eAAe,QAAQ,SAAS,eAAe,QAAA;AAAA,MAC3F,WAAW;AAAA,MACX,UAAU;AAAA,IAAA;AAAA,EAAA;AAGhB;"}
|