@nextelco/common-ui 2.1.98 → 2.1.100
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 +222 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/legacy/assets/svgs/proef-footer-logo.svg.js +5 -0
- package/dist/esm/legacy/assets/svgs/proef-footer-logo.svg.js.map +1 -0
- package/dist/esm/legacy/components/atoms/Acronym/Acronym.css +43 -0
- package/dist/esm/legacy/components/atoms/Acronym/Acronym.js +31 -0
- package/dist/esm/legacy/components/atoms/Acronym/Acronym.js.map +1 -0
- package/dist/esm/legacy/components/atoms/BreadCrumb/BreadCrumb.css +36 -0
- package/dist/esm/legacy/components/atoms/BreadCrumb/BreadCrumb.js +57 -0
- package/dist/esm/legacy/components/atoms/BreadCrumb/BreadCrumb.js.map +1 -0
- package/dist/esm/legacy/components/atoms/Button/variants/ActionButton.css +218 -0
- package/dist/esm/legacy/components/atoms/Button/variants/ActionButton.js +50 -0
- package/dist/esm/legacy/components/atoms/Button/variants/ActionButton.js.map +1 -0
- package/dist/esm/legacy/components/atoms/Button/variants/FilterButton.css +56 -0
- package/dist/esm/legacy/components/atoms/Button/variants/FilterButton.js +34 -0
- package/dist/esm/legacy/components/atoms/Button/variants/FilterButton.js.map +1 -0
- package/dist/esm/legacy/components/atoms/Button/variants/IconButton.css +74 -0
- package/dist/esm/legacy/components/atoms/Button/variants/IconButton.js +29 -0
- package/dist/esm/legacy/components/atoms/Button/variants/IconButton.js.map +1 -0
- package/dist/esm/legacy/components/atoms/Button/variants/MainButton.css +99 -0
- package/dist/esm/legacy/components/atoms/Button/variants/MainButton.js +36 -0
- package/dist/esm/legacy/components/atoms/Button/variants/MainButton.js.map +1 -0
- package/dist/esm/legacy/components/atoms/Button/variants/TabButton.css +63 -0
- package/dist/esm/legacy/components/atoms/Button/variants/TabButton.js +21 -0
- package/dist/esm/legacy/components/atoms/Button/variants/TabButton.js.map +1 -0
- package/dist/esm/legacy/components/atoms/Field/Field.css +171 -0
- package/dist/esm/legacy/components/atoms/Field/Field.js +70 -0
- package/dist/esm/legacy/components/atoms/Field/Field.js.map +1 -0
- package/dist/esm/legacy/components/atoms/IconText/IconText.css +10 -0
- package/dist/esm/legacy/components/atoms/IconText/IconText.js +25 -0
- package/dist/esm/legacy/components/atoms/IconText/IconText.js.map +1 -0
- package/dist/esm/legacy/components/atoms/Icone/Icone.js +24 -0
- package/dist/esm/legacy/components/atoms/Icone/Icone.js.map +1 -0
- package/dist/esm/legacy/components/atoms/Input/Input.css +12 -0
- package/dist/esm/legacy/components/atoms/Input/Input.js +28 -0
- package/dist/esm/legacy/components/atoms/Input/Input.js.map +1 -0
- package/dist/esm/legacy/components/atoms/InputData/InputData.js +36 -0
- package/dist/esm/legacy/components/atoms/InputData/InputData.js.map +1 -0
- package/dist/esm/legacy/components/atoms/Label/Label.css +192 -0
- package/dist/esm/legacy/components/atoms/Label/Label.js +13 -0
- package/dist/esm/legacy/components/atoms/Label/Label.js.map +1 -0
- package/dist/esm/legacy/components/atoms/MultiTagPickerTag/MultiTagPickerTag.css +40 -0
- package/dist/esm/legacy/components/atoms/MultiTagPickerTag/MultiTagPickerTag.js +21 -0
- package/dist/esm/legacy/components/atoms/MultiTagPickerTag/MultiTagPickerTag.js.map +1 -0
- package/dist/esm/legacy/components/atoms/Select/Select.css +16 -0
- package/dist/esm/legacy/components/atoms/Select/Select.js +27 -0
- package/dist/esm/legacy/components/atoms/Select/Select.js.map +1 -0
- package/dist/esm/legacy/components/atoms/Stack/Stack.js +20 -0
- package/dist/esm/legacy/components/atoms/Stack/Stack.js.map +1 -0
- package/dist/esm/legacy/components/atoms/Switch/CustomSwitch.css +36 -0
- package/dist/esm/legacy/components/atoms/Switch/CustomSwitch.js +29 -0
- package/dist/esm/legacy/components/atoms/Switch/CustomSwitch.js.map +1 -0
- package/dist/esm/legacy/components/atoms/Tooltip/Tooltip.css +17 -0
- package/dist/esm/legacy/components/atoms/Tooltip/Tooltip.js +41 -0
- package/dist/esm/legacy/components/atoms/Tooltip/Tooltip.js.map +1 -0
- package/dist/esm/legacy/components/charts/Charts.js +259 -0
- package/dist/esm/legacy/components/charts/Charts.js.map +1 -0
- package/dist/esm/legacy/components/layout/AppLauncher/AppLauncher.js +100 -0
- package/dist/esm/legacy/components/layout/AppLauncher/AppLauncher.js.map +1 -0
- package/dist/esm/legacy/components/layout/Error/Error.css +20 -0
- package/dist/esm/legacy/components/layout/Error/Error.js +12 -0
- package/dist/esm/legacy/components/layout/Error/Error.js.map +1 -0
- package/dist/esm/legacy/components/layout/Footer/Footer.css +42 -0
- package/dist/esm/legacy/components/layout/Footer/Footer.js +23 -0
- package/dist/esm/legacy/components/layout/Footer/Footer.js.map +1 -0
- package/dist/esm/legacy/components/layout/Header/Header.css +66 -0
- package/dist/esm/legacy/components/layout/Header/Header.js +37 -0
- package/dist/esm/legacy/components/layout/Header/Header.js.map +1 -0
- package/dist/esm/legacy/components/layout/Layout/Layout.js +92 -0
- package/dist/esm/legacy/components/layout/Layout/Layout.js.map +1 -0
- package/dist/esm/legacy/components/layout/Sidebar/Sidebar.js +227 -0
- package/dist/esm/legacy/components/layout/Sidebar/Sidebar.js.map +1 -0
- package/dist/esm/legacy/components/layout/Spinner/Spinner.css +10 -0
- package/dist/esm/legacy/components/layout/Spinner/Spinner.js +19 -0
- package/dist/esm/legacy/components/layout/Spinner/Spinner.js.map +1 -0
- package/dist/esm/legacy/components/layout/TopBar/TopBar.js +34 -0
- package/dist/esm/legacy/components/layout/TopBar/TopBar.js.map +1 -0
- package/dist/esm/legacy/components/layout/TopNavLayout/TopNavLayout.js +82 -0
- package/dist/esm/legacy/components/layout/TopNavLayout/TopNavLayout.js.map +1 -0
- package/dist/esm/legacy/components/molecules/BarraValor/BarraValor.js +25 -0
- package/dist/esm/legacy/components/molecules/BarraValor/BarraValor.js.map +1 -0
- package/dist/esm/legacy/components/molecules/ColumnPicker/ColumnPicker.js +179 -0
- package/dist/esm/legacy/components/molecules/ColumnPicker/ColumnPicker.js.map +1 -0
- package/dist/esm/legacy/components/molecules/ConfirmModal/ConfirmModal.css +3 -0
- package/dist/esm/legacy/components/molecules/ConfirmModal/ConfirmModal.js +33 -0
- package/dist/esm/legacy/components/molecules/ConfirmModal/ConfirmModal.js.map +1 -0
- package/dist/esm/legacy/components/molecules/DataTable/DataTable.js +1145 -0
- package/dist/esm/legacy/components/molecules/DataTable/DataTable.js.map +1 -0
- package/dist/esm/legacy/components/molecules/FileDropzone/FileDropzone.js +68 -0
- package/dist/esm/legacy/components/molecules/FileDropzone/FileDropzone.js.map +1 -0
- package/dist/esm/legacy/components/molecules/LanguageSwitcher/LanguageSwitcher.js +96 -0
- package/dist/esm/legacy/components/molecules/LanguageSwitcher/LanguageSwitcher.js.map +1 -0
- package/dist/esm/legacy/components/molecules/Modal/Modal.css +54 -0
- package/dist/esm/legacy/components/molecules/Modal/Modal.js +64 -0
- package/dist/esm/legacy/components/molecules/Modal/Modal.js.map +1 -0
- package/dist/esm/legacy/components/molecules/MultiTagPicker/MultiTagPicker.css +97 -0
- package/dist/esm/legacy/components/molecules/MultiTagPicker/MultiTagPicker.js +113 -0
- package/dist/esm/legacy/components/molecules/MultiTagPicker/MultiTagPicker.js.map +1 -0
- package/dist/esm/legacy/components/molecules/PhotoAvatar/PhotoAvatar.js +107 -0
- package/dist/esm/legacy/components/molecules/PhotoAvatar/PhotoAvatar.js.map +1 -0
- package/dist/esm/legacy/components/molecules/Search/Search.css +18 -0
- package/dist/esm/legacy/components/molecules/Search/Search.js +30 -0
- package/dist/esm/legacy/components/molecules/Search/Search.js.map +1 -0
- package/dist/esm/legacy/components/molecules/SeletorPesquisa/SeletorPesquisa.js +116 -0
- package/dist/esm/legacy/components/molecules/SeletorPesquisa/SeletorPesquisa.js.map +1 -0
- package/dist/esm/legacy/components/molecules/Sidebar/Sidebar.css +69 -0
- package/dist/esm/legacy/components/molecules/Sidebar/Sidebar.js +62 -0
- package/dist/esm/legacy/components/molecules/Sidebar/Sidebar.js.map +1 -0
- package/dist/esm/legacy/components/molecules/UserAvatar/UserAvatar.js +105 -0
- package/dist/esm/legacy/components/molecules/UserAvatar/UserAvatar.js.map +1 -0
- package/dist/esm/legacy/components/organisms/GanttChart/GanttChart.js +162 -0
- package/dist/esm/legacy/components/organisms/GanttChart/GanttChart.js.map +1 -0
- package/dist/esm/legacy/components/organisms/Kanban/Kanban.js +88 -0
- package/dist/esm/legacy/components/organisms/Kanban/Kanban.js.map +1 -0
- package/dist/esm/legacy/components/organisms/LazyLoader/LazyLoader.js +87 -0
- package/dist/esm/legacy/components/organisms/LazyLoader/LazyLoader.js.map +1 -0
- package/dist/esm/legacy/components/organisms/MapaPontos/MapaPontos.js +427 -0
- package/dist/esm/legacy/components/organisms/MapaPontos/MapaPontos.js.map +1 -0
- package/dist/esm/legacy/components/organisms/PainelFiltros/PainelFiltros.js +206 -0
- package/dist/esm/legacy/components/organisms/PainelFiltros/PainelFiltros.js.map +1 -0
- package/dist/esm/legacy/components/organisms/PesquisaRapida/PesquisaRapida.js +147 -0
- package/dist/esm/legacy/components/organisms/PesquisaRapida/PesquisaRapida.js.map +1 -0
- package/dist/esm/legacy/components/organisms/Profile/Profile.css +26 -0
- package/dist/esm/legacy/components/organisms/Profile/Profile.js +26 -0
- package/dist/esm/legacy/components/organisms/Profile/Profile.js.map +1 -0
- package/dist/esm/legacy/components/organisms/RoleGuard/RoleGuard.js +68 -0
- package/dist/esm/legacy/components/organisms/RoleGuard/RoleGuard.js.map +1 -0
- package/dist/esm/legacy/components/organisms/Selector/Selector.css +87 -0
- package/dist/esm/legacy/components/organisms/Selector/Selector.js +181 -0
- package/dist/esm/legacy/components/organisms/Selector/Selector.js.map +1 -0
- package/dist/esm/legacy/components/organisms/StatusMatrix/StatusMatrix.js +115 -0
- package/dist/esm/legacy/components/organisms/StatusMatrix/StatusMatrix.js.map +1 -0
- package/dist/esm/legacy/components/ui/Avisos.js +86 -0
- package/dist/esm/legacy/components/ui/Avisos.js.map +1 -0
- package/dist/esm/legacy/components/ui/BarraAcoes.js +19 -0
- package/dist/esm/legacy/components/ui/BarraAcoes.js.map +1 -0
- package/dist/esm/legacy/components/ui/CabecalhoPagina.js +32 -0
- package/dist/esm/legacy/components/ui/CabecalhoPagina.js.map +1 -0
- package/dist/esm/legacy/components/ui/CaixaPesquisa.js +57 -0
- package/dist/esm/legacy/components/ui/CaixaPesquisa.js.map +1 -0
- package/dist/esm/legacy/components/ui/Confirmacao.js +52 -0
- package/dist/esm/legacy/components/ui/Confirmacao.js.map +1 -0
- package/dist/esm/legacy/components/ui/Escolha.js +157 -0
- package/dist/esm/legacy/components/ui/Escolha.js.map +1 -0
- package/dist/esm/legacy/components/ui/FaixaAviso.js +17 -0
- package/dist/esm/legacy/components/ui/FaixaAviso.js.map +1 -0
- package/dist/esm/legacy/components/ui/MenuAcoes.js +116 -0
- package/dist/esm/legacy/components/ui/MenuAcoes.js.map +1 -0
- package/dist/esm/legacy/components/ui/Passos.js +32 -0
- package/dist/esm/legacy/components/ui/Passos.js.map +1 -0
- package/dist/esm/legacy/components/ui/Separadores.js +52 -0
- package/dist/esm/legacy/components/ui/Separadores.js.map +1 -0
- package/dist/esm/legacy/components/ui/TextoAuto.js +33 -0
- package/dist/esm/legacy/components/ui/TextoAuto.js.map +1 -0
- package/dist/esm/legacy/components/ui/Ui.js +360 -0
- package/dist/esm/legacy/components/ui/Ui.js.map +1 -0
- package/dist/esm/legacy/components/ui/painelFlutuante.js +52 -0
- package/dist/esm/legacy/components/ui/painelFlutuante.js.map +1 -0
- package/dist/esm/legacy/constants/Colors.js +33 -0
- package/dist/esm/legacy/constants/Colors.js.map +1 -0
- package/dist/esm/legacy/constants/FontWeight.js +35 -0
- package/dist/esm/legacy/constants/FontWeight.js.map +1 -0
- package/dist/esm/legacy/contexts/apiContext.js +25 -0
- package/dist/esm/legacy/contexts/apiContext.js.map +1 -0
- package/dist/esm/legacy/contexts/authContext.js +85 -0
- package/dist/esm/legacy/contexts/authContext.js.map +1 -0
- package/dist/esm/legacy/contexts/socketContext.js +34 -0
- package/dist/esm/legacy/contexts/socketContext.js.map +1 -0
- package/dist/esm/legacy/hooks/useApi.js +62 -0
- package/dist/esm/legacy/hooks/useApi.js.map +1 -0
- package/dist/esm/legacy/hooks/useTheme.js +39 -0
- package/dist/esm/legacy/hooks/useTheme.js.map +1 -0
- package/dist/esm/legacy/pages/Error/ErrorPage.css +18 -0
- package/dist/esm/legacy/pages/Error/ErrorPage.js +50 -0
- package/dist/esm/legacy/pages/Error/ErrorPage.js.map +1 -0
- package/dist/esm/legacy/pages/Loading/Loading.css +46 -0
- package/dist/esm/legacy/pages/Loading/Loading.js +9 -0
- package/dist/esm/legacy/pages/Loading/Loading.js.map +1 -0
- package/dist/esm/legacy/pages/Login/LoginScreen.js +46 -0
- package/dist/esm/legacy/pages/Login/LoginScreen.js.map +1 -0
- package/dist/esm/legacy/pages/NotFound/NotFound.css +21 -0
- package/dist/esm/legacy/pages/NotFound/NotFound.js +24 -0
- package/dist/esm/legacy/pages/NotFound/NotFound.js.map +1 -0
- package/dist/esm/legacy/styles/themes/ButtonThemes.js +28 -0
- package/dist/esm/legacy/styles/themes/ButtonThemes.js.map +1 -0
- package/dist/esm/legacy/styles/utils/utils.js +7 -0
- package/dist/esm/legacy/styles/utils/utils.js.map +1 -0
- package/dist/esm/legacy/utils/stringUtils.js +35 -0
- package/dist/esm/legacy/utils/stringUtils.js.map +1 -0
- package/dist/esm/v1/capabilities/documents/QRScanning/scanQRCodes.js +157 -0
- package/dist/esm/v1/capabilities/documents/QRScanning/scanQRCodes.js.map +1 -0
- package/dist/esm/v1/components/documents/DocumentDropzone/DocumentDropzone.js +307 -0
- package/dist/esm/v1/components/documents/DocumentDropzone/DocumentDropzone.js.map +1 -0
- package/dist/esm/v1/components/forms/FormField/FormField.js +59 -0
- package/dist/esm/v1/components/forms/FormField/FormField.js.map +1 -0
- package/dist/esm/v1/components/forms/FormGrid/FormGrid.js +20 -0
- package/dist/esm/v1/components/forms/FormGrid/FormGrid.js.map +1 -0
- package/dist/esm/v1/components/overlays/Dialog/Dialog.js +87 -0
- package/dist/esm/v1/components/overlays/Dialog/Dialog.js.map +1 -0
- package/dist/esm/v1/foundations/icons/icons.js +76 -0
- package/dist/esm/v1/foundations/icons/icons.js.map +1 -0
- package/dist/esm/v1/primitives/buttons/Button/Button.js +27 -0
- package/dist/esm/v1/primitives/buttons/Button/Button.js.map +1 -0
- package/dist/esm/v1/primitives/documents/PdfPreview/PdfPreview.js +137 -0
- package/dist/esm/v1/primitives/documents/PdfPreview/PdfPreview.js.map +1 -0
- package/dist/esm/v1/primitives/documents/PdfPreview/pdfjs.js +26 -0
- package/dist/esm/v1/primitives/documents/PdfPreview/pdfjs.js.map +1 -0
- package/dist/esm/v1/primitives/forms/LookupInput/LookupInput.js +37 -0
- package/dist/esm/v1/primitives/forms/LookupInput/LookupInput.js.map +1 -0
- package/dist/esm/v1/primitives/forms/SelectInput/SelectInput.js +29 -0
- package/dist/esm/v1/primitives/forms/SelectInput/SelectInput.js.map +1 -0
- package/dist/esm/v1/primitives/forms/TextArea/TextArea.js +75 -0
- package/dist/esm/v1/primitives/forms/TextArea/TextArea.js.map +1 -0
- package/dist/esm/v1/primitives/forms/TextInput/TextInput.js +21 -0
- package/dist/esm/v1/primitives/forms/TextInput/TextInput.js.map +1 -0
- package/dist/esm/v1/primitives/forms/field.js +12 -0
- package/dist/esm/v1/primitives/forms/field.js.map +1 -0
- package/dist/style.css +1 -1
- package/dist/style.layered.css +1 -1
- package/dist/types/index.d.ts +14 -13
- package/dist/types/{components → legacy/components}/atoms/Acronym/Acronym.d.ts +1 -0
- package/dist/types/{components → legacy/components}/atoms/BreadCrumb/BreadCrumb.d.ts +1 -0
- package/dist/types/{components → legacy/components}/atoms/Button/variants/ActionButton.d.ts +1 -0
- package/dist/types/{components → legacy/components}/atoms/Button/variants/FilterButton.d.ts +1 -0
- package/dist/types/{components → legacy/components}/atoms/Button/variants/IconButton.d.ts +1 -0
- package/dist/types/{components → legacy/components}/atoms/Button/variants/MainButton.d.ts +1 -0
- package/dist/types/{components → legacy/components}/atoms/Button/variants/TabButton.d.ts +1 -0
- package/dist/types/{components → legacy/components}/atoms/Field/Field.d.ts +1 -0
- package/dist/types/{components → legacy/components}/atoms/IconText/IconText.d.ts +1 -0
- package/dist/types/{components → legacy/components}/atoms/Icone/Icone.d.ts +2 -0
- package/dist/types/{components → legacy/components}/atoms/Input/Input.d.ts +1 -0
- package/dist/types/{components → legacy/components}/atoms/InputData/InputData.d.ts +4 -0
- package/dist/types/{components → legacy/components}/atoms/Label/Label.d.ts +1 -0
- package/dist/types/{components → legacy/components}/atoms/Select/Select.d.ts +1 -0
- package/dist/types/{components → legacy/components}/atoms/Stack/Stack.d.ts +1 -0
- package/dist/types/{components → legacy/components}/atoms/Switch/CustomSwitch.d.ts +1 -0
- package/dist/types/{components → legacy/components}/atoms/Tooltip/Tooltip.d.ts +1 -0
- package/dist/types/{components → legacy/components}/charts/Charts.d.ts +29 -6
- package/dist/types/{components → legacy/components}/layout/AppLauncher/AppLauncher.d.ts +3 -0
- package/dist/types/{components → legacy/components}/layout/Error/Error.d.ts +1 -0
- package/dist/types/{components → legacy/components}/layout/Footer/Footer.d.ts +1 -0
- package/dist/types/{components → legacy/components}/layout/Header/Header.d.ts +1 -0
- package/dist/types/{components → legacy/components}/layout/Layout/Layout.d.ts +2 -0
- package/dist/types/{components → legacy/components}/layout/Sidebar/Sidebar.d.ts +5 -0
- package/dist/types/{components → legacy/components}/layout/Spinner/Spinner.d.ts +1 -0
- package/dist/types/{components → legacy/components}/layout/TopBar/TopBar.d.ts +2 -0
- package/dist/types/{components → legacy/components}/layout/TopNavLayout/TopNavLayout.d.ts +3 -0
- package/dist/types/{components → legacy/components}/molecules/BarraValor/BarraValor.d.ts +3 -0
- package/dist/types/{components → legacy/components}/molecules/ColumnPicker/ColumnPicker.d.ts +8 -1
- package/dist/types/{components → legacy/components}/molecules/ConfirmModal/ConfirmModal.d.ts +2 -0
- package/dist/types/{components → legacy/components}/molecules/DataTable/DataTable.d.ts +6 -0
- package/dist/types/{components → legacy/components}/molecules/FileDropzone/FileDropzone.d.ts +3 -0
- package/dist/types/{components → legacy/components}/molecules/LanguageSwitcher/LanguageSwitcher.d.ts +3 -0
- package/dist/types/{components → legacy/components}/molecules/Modal/Modal.d.ts +2 -0
- package/dist/types/{components → legacy/components}/molecules/MultiTagPicker/MultiTagPicker.d.ts +2 -0
- package/dist/types/{components → legacy/components}/molecules/PhotoAvatar/PhotoAvatar.d.ts +1 -0
- package/dist/types/{components → legacy/components}/molecules/SeletorPesquisa/SeletorPesquisa.d.ts +3 -0
- package/dist/types/{components → legacy/components}/molecules/Sidebar/Sidebar.d.ts +1 -0
- package/dist/types/{components → legacy/components}/molecules/UserAvatar/UserAvatar.d.ts +1 -0
- package/dist/types/{components → legacy/components}/organisms/GanttChart/GanttChart.d.ts +8 -1
- package/dist/types/{components → legacy/components}/organisms/Kanban/Kanban.d.ts +3 -0
- package/dist/types/{components → legacy/components}/organisms/LazyLoader/LazyLoader.d.ts +1 -0
- package/dist/types/{components → legacy/components}/organisms/MapaPontos/MapaPontos.d.ts +12 -2
- package/dist/types/{components → legacy/components}/organisms/PainelFiltros/PainelFiltros.d.ts +7 -0
- package/dist/types/{components → legacy/components}/organisms/PesquisaRapida/PesquisaRapida.d.ts +5 -0
- package/dist/types/{components → legacy/components}/organisms/Profile/Profile.d.ts +1 -0
- package/dist/types/{components → legacy/components}/organisms/RoleGuard/RoleGuard.d.ts +6 -1
- package/dist/types/{components → legacy/components}/organisms/Selector/Selector.d.ts +1 -0
- package/dist/types/{components → legacy/components}/organisms/StatusMatrix/StatusMatrix.d.ts +6 -0
- package/dist/types/{components → legacy/components}/ui/Avisos.d.ts +9 -1
- package/dist/types/{components → legacy/components}/ui/BarraAcoes.d.ts +2 -0
- package/dist/types/{components → legacy/components}/ui/CabecalhoPagina.d.ts +6 -1
- package/dist/types/{components → legacy/components}/ui/Confirmacao.d.ts +2 -0
- package/dist/types/{components → legacy/components}/ui/FaixaAviso.d.ts +3 -0
- package/dist/types/{components → legacy/components}/ui/Passos.d.ts +3 -0
- package/dist/types/{components → legacy/components}/ui/Separadores.d.ts +3 -0
- package/dist/types/{components → legacy/components}/ui/TextoAuto.d.ts +2 -0
- package/dist/types/{components → legacy/components}/ui/Ui.d.ts +41 -7
- package/dist/types/{constants → legacy/constants}/FontWeight.d.ts +1 -0
- package/dist/types/{contexts → legacy/contexts}/apiContext.d.ts +1 -0
- package/dist/types/{contexts → legacy/contexts}/authContext.d.ts +2 -0
- package/dist/types/{contexts → legacy/contexts}/socketContext.d.ts +2 -0
- package/dist/types/{exports → legacy/exports}/hooks.d.ts +1 -1
- package/dist/types/{exports → legacy/exports}/molecules.d.ts +2 -1
- package/dist/types/legacy/exports/types.d.ts +7 -0
- package/dist/types/{hooks → legacy/hooks}/useApi.d.ts +2 -0
- package/dist/types/{hooks → legacy/hooks}/useTheme.d.ts +2 -0
- package/dist/types/{pages → legacy/pages}/Error/ErrorPage.d.ts +1 -0
- package/dist/types/{pages → legacy/pages}/Loading/Loading.d.ts +1 -0
- package/dist/types/{pages → legacy/pages}/Login/LoginScreen.d.ts +2 -0
- package/dist/types/{pages → legacy/pages}/NotFound/NotFound.d.ts +1 -0
- package/dist/types/legacy/styles/utils/utils.d.ts +2 -0
- package/dist/types/{types → legacy/types}/Fetcher.d.ts +1 -0
- package/dist/types/{types → legacy/types}/LoggedUser.d.ts +1 -0
- package/dist/types/{types → legacy/types}/SidebarMenu.d.ts +2 -0
- package/dist/types/legacy/types/themes/AcronymThemes.d.ts +4 -0
- package/dist/types/{types → legacy/types}/themes/ButtonThemes.d.ts +3 -0
- package/dist/types/legacy/types/themes/CustomSwitchThemes.d.ts +4 -0
- package/dist/types/{types → legacy/types}/themes/IconTextThemes.d.ts +1 -0
- package/dist/types/legacy/utils/stringUtils.d.ts +6 -0
- package/dist/types/v1/capabilities/documents/QRScanning/scanQRCodes.d.ts +25 -0
- package/dist/types/v1/components/documents/DocumentDropzone/DocumentDropzone.d.ts +60 -0
- package/dist/types/v1/components/forms/FormField/FormField.d.ts +44 -0
- package/dist/types/v1/components/forms/FormGrid/FormGrid.d.ts +21 -0
- package/dist/types/v1/components/overlays/Dialog/Dialog.d.ts +55 -0
- package/dist/types/v1/foundations/icons/icons.d.ts +24 -0
- package/dist/types/v1/index.d.ts +25 -0
- package/dist/types/v1/primitives/buttons/Button/Button.d.ts +18 -0
- package/dist/types/v1/primitives/documents/PdfPreview/PdfPreview.d.ts +17 -0
- package/dist/types/v1/primitives/documents/PdfPreview/pdfjs.d.ts +11 -0
- package/dist/types/v1/primitives/forms/LookupInput/LookupInput.d.ts +25 -0
- package/dist/types/v1/primitives/forms/SelectInput/SelectInput.d.ts +19 -0
- package/dist/types/v1/primitives/forms/TextArea/TextArea.d.ts +37 -0
- package/dist/types/v1/primitives/forms/TextInput/TextInput.d.ts +16 -0
- package/dist/types/v1/primitives/forms/field.d.ts +20 -0
- package/package.json +38 -33
- package/dist/bundle.js +0 -2
- package/dist/bundle.js.LICENSE.txt +0 -80
- package/dist/types/components/atoms/Icone/Icone.test.d.ts +0 -1
- package/dist/types/components/layout/Sidebar/Sidebar.test.d.ts +0 -1
- package/dist/types/components/molecules/BarraValor/BarraValor.test.d.ts +0 -1
- package/dist/types/components/molecules/DataTable/DataTable.test.d.ts +0 -1
- package/dist/types/components/molecules/SeletorPesquisa/SeletorPesquisa.test.d.ts +0 -1
- package/dist/types/components/organisms/Kanban/Kanban.test.d.ts +0 -1
- package/dist/types/components/organisms/RoleGuard/RoleGuard.test.d.ts +0 -1
- package/dist/types/components/ui/CaixaPesquisa.test.d.ts +0 -1
- package/dist/types/components/ui/Escolha.test.d.ts +0 -1
- package/dist/types/components/ui/Paginas.test.d.ts +0 -1
- package/dist/types/exports/types.d.ts +0 -7
- package/dist/types/styles/utils/utils.d.ts +0 -1
- package/dist/types/test/setup.d.ts +0 -1
- package/dist/types/types/themes/AcronymThemes.d.ts +0 -3
- package/dist/types/types/themes/CustomSwitchThemes.d.ts +0 -3
- package/dist/types/utils/stringUtils.d.ts +0 -3
- /package/dist/types/{components → legacy/components}/atoms/MultiTagPickerTag/MultiTagPickerTag.d.ts +0 -0
- /package/dist/types/{components → legacy/components}/atoms/SearchSelect/SearchSelect.d.ts +0 -0
- /package/dist/types/{components → legacy/components}/molecules/Search/Search.d.ts +0 -0
- /package/dist/types/{components → legacy/components}/ui/CaixaPesquisa.d.ts +0 -0
- /package/dist/types/{components → legacy/components}/ui/Escolha.d.ts +0 -0
- /package/dist/types/{components → legacy/components}/ui/MenuAcoes.d.ts +0 -0
- /package/dist/types/{components → legacy/components}/ui/painelFlutuante.d.ts +0 -0
- /package/dist/types/{constants → legacy/constants}/Colors.d.ts +0 -0
- /package/dist/types/{exports → legacy/exports}/assets.d.ts +0 -0
- /package/dist/types/{exports → legacy/exports}/atoms.d.ts +0 -0
- /package/dist/types/{exports → legacy/exports}/charts.d.ts +0 -0
- /package/dist/types/{exports → legacy/exports}/constants.d.ts +0 -0
- /package/dist/types/{exports → legacy/exports}/contexts.d.ts +0 -0
- /package/dist/types/{exports → legacy/exports}/layout.d.ts +0 -0
- /package/dist/types/{exports → legacy/exports}/organisms.d.ts +0 -0
- /package/dist/types/{exports → legacy/exports}/pages.d.ts +0 -0
- /package/dist/types/{exports → legacy/exports}/styles.d.ts +0 -0
- /package/dist/types/{exports → legacy/exports}/ui.d.ts +0 -0
- /package/dist/types/{exports → legacy/exports}/utils.d.ts +0 -0
- /package/dist/types/{styles → legacy/styles}/themes/ButtonThemes.d.ts +0 -0
- /package/dist/types/{types → legacy/types}/SelectableElement.d.ts +0 -0
- /package/dist/types/{utils → legacy/utils}/keycloak.d.ts +0 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { jsxs, Fragment, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useRef, useEffect } from "react";
|
|
3
|
+
import IconButton from "../../atoms/Button/variants/IconButton.js";
|
|
4
|
+
import { faX } from "@fortawesome/free-solid-svg-icons";
|
|
5
|
+
import './Sidebar.css';/* empty css */
|
|
6
|
+
import { IconButtonThemeStyled } from "../../../styles/themes/ButtonThemes.js";
|
|
7
|
+
const Sidebar = ({
|
|
8
|
+
title,
|
|
9
|
+
isHome,
|
|
10
|
+
isOpen,
|
|
11
|
+
onClose,
|
|
12
|
+
children
|
|
13
|
+
}) => {
|
|
14
|
+
const sidebarRef = useRef(null);
|
|
15
|
+
const overlayRef = useRef(null);
|
|
16
|
+
useEffect(() => {
|
|
17
|
+
const handleEsc = (event) => {
|
|
18
|
+
if (event.key === "Escape" && isOpen) {
|
|
19
|
+
onClose();
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
document.addEventListener("keydown", handleEsc);
|
|
23
|
+
return () => document.removeEventListener("keydown", handleEsc);
|
|
24
|
+
}, [isOpen, onClose]);
|
|
25
|
+
useEffect(() => {
|
|
26
|
+
const handleClickOutside = (event) => {
|
|
27
|
+
if (isOpen && sidebarRef.current && overlayRef.current && !sidebarRef.current.contains(event.target) && overlayRef.current.contains(event.target)) {
|
|
28
|
+
onClose();
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
document.addEventListener("mousedown", handleClickOutside);
|
|
32
|
+
return () => document.removeEventListener("mousedown", handleClickOutside);
|
|
33
|
+
}, [isOpen, onClose]);
|
|
34
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
35
|
+
/* @__PURE__ */ jsxs(
|
|
36
|
+
"aside",
|
|
37
|
+
{
|
|
38
|
+
className: `cui-sidebar ${isOpen ? "cui-sidebar__open" : ""}`,
|
|
39
|
+
ref: sidebarRef,
|
|
40
|
+
children: [
|
|
41
|
+
/* @__PURE__ */ jsxs("div", { className: "cui-sidebar__header", children: [
|
|
42
|
+
/* @__PURE__ */ jsx("h2", { children: title }),
|
|
43
|
+
!isHome && /* @__PURE__ */ jsx("div", { className: "sidebar-close", onClick: onClose, children: /* @__PURE__ */ jsx(
|
|
44
|
+
IconButton,
|
|
45
|
+
{
|
|
46
|
+
onClick: onClose,
|
|
47
|
+
icon: faX,
|
|
48
|
+
theme: IconButtonThemeStyled
|
|
49
|
+
}
|
|
50
|
+
) })
|
|
51
|
+
] }),
|
|
52
|
+
/* @__PURE__ */ jsx("nav", { className: "navigation", children })
|
|
53
|
+
]
|
|
54
|
+
}
|
|
55
|
+
),
|
|
56
|
+
isOpen && !isHome && /* @__PURE__ */ jsx("div", { className: "cui-sidebar__overlay", ref: overlayRef })
|
|
57
|
+
] });
|
|
58
|
+
};
|
|
59
|
+
export {
|
|
60
|
+
Sidebar as default
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=Sidebar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Sidebar.js","sources":["../../../../../../src/legacy/components/molecules/Sidebar/Sidebar.tsx"],"sourcesContent":["import React, { ReactNode, useRef, useEffect } from 'react'\r\nimport IconButton from '../../atoms/Button/variants/IconButton'\r\nimport { faX } from '@fortawesome/free-solid-svg-icons'\r\nimport './Sidebar.scss'\r\nimport { IconButtonThemeStyled } from '../../../styles/themes/ButtonThemes'\r\n\r\ninterface SidebarProps {\r\n title: string\r\n isHome: boolean\r\n isOpen: boolean\r\n onClose: () => void\r\n children: ReactNode\r\n}\r\n\r\n/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nconst Sidebar: React.FC<SidebarProps> = ({\r\n title,\r\n isHome,\r\n isOpen,\r\n onClose,\r\n children,\r\n}) => {\r\n const sidebarRef = useRef<HTMLDivElement>(null)\r\n const overlayRef = useRef<HTMLDivElement>(null)\r\n\r\n useEffect(() => {\r\n const handleEsc = (event: KeyboardEvent) => {\r\n if (event.key === 'Escape' && isOpen) {\r\n onClose()\r\n }\r\n }\r\n\r\n document.addEventListener('keydown', handleEsc)\r\n return () => document.removeEventListener('keydown', handleEsc)\r\n }, [isOpen, onClose])\r\n\r\n useEffect(() => {\r\n const handleClickOutside = (event: MouseEvent) => {\r\n if (\r\n isOpen &&\r\n sidebarRef.current &&\r\n overlayRef.current &&\r\n !sidebarRef.current.contains(event.target as Node) &&\r\n overlayRef.current.contains(event.target as Node)\r\n ) {\r\n onClose()\r\n }\r\n }\r\n\r\n document.addEventListener('mousedown', handleClickOutside)\r\n return () => document.removeEventListener('mousedown', handleClickOutside)\r\n }, [isOpen, onClose])\r\n\r\n return (\r\n <>\r\n <aside\r\n className={`cui-sidebar ${isOpen ? 'cui-sidebar__open' : ''}`}\r\n ref={sidebarRef}\r\n >\r\n <div className={'cui-sidebar__header'}>\r\n <h2>{title}</h2>\r\n {!isHome && (\r\n <div className={'sidebar-close'} onClick={onClose}>\r\n <IconButton\r\n onClick={onClose}\r\n icon={faX}\r\n theme={IconButtonThemeStyled}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n <nav className={'navigation'}>{children}</nav>\r\n </aside>\r\n {isOpen && !isHome && (\r\n <div className=\"cui-sidebar__overlay\" ref={overlayRef}></div>\r\n )}\r\n </>\r\n )\r\n}\r\n\r\nexport default Sidebar\r\n"],"names":[],"mappings":";;;;;;AAeA,MAAM,UAAkC,CAAC;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,aAAa,OAAuB,IAAI;AAC9C,QAAM,aAAa,OAAuB,IAAI;AAE9C,YAAU,MAAM;AACd,UAAM,YAAY,CAAC,UAAyB;AAC1C,UAAI,MAAM,QAAQ,YAAY,QAAQ;AACpC,gBAAA;AAAA,MACF;AAAA,IACF;AAEA,aAAS,iBAAiB,WAAW,SAAS;AAC9C,WAAO,MAAM,SAAS,oBAAoB,WAAW,SAAS;AAAA,EAChE,GAAG,CAAC,QAAQ,OAAO,CAAC;AAEpB,YAAU,MAAM;AACd,UAAM,qBAAqB,CAAC,UAAsB;AAChD,UACE,UACA,WAAW,WACX,WAAW,WACX,CAAC,WAAW,QAAQ,SAAS,MAAM,MAAc,KACjD,WAAW,QAAQ,SAAS,MAAM,MAAc,GAChD;AACA,gBAAA;AAAA,MACF;AAAA,IACF;AAEA,aAAS,iBAAiB,aAAa,kBAAkB;AACzD,WAAO,MAAM,SAAS,oBAAoB,aAAa,kBAAkB;AAAA,EAC3E,GAAG,CAAC,QAAQ,OAAO,CAAC;AAEpB,SACE,qBAAA,UAAA,EACE,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW,eAAe,SAAS,sBAAsB,EAAE;AAAA,QAC3D,KAAK;AAAA,QAEL,UAAA;AAAA,UAAA,qBAAC,OAAA,EAAI,WAAW,uBACd,UAAA;AAAA,YAAA,oBAAC,QAAI,UAAA,MAAA,CAAM;AAAA,YACV,CAAC,UACA,oBAAC,SAAI,WAAW,iBAAiB,SAAS,SACxC,UAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,SAAS;AAAA,gBACT,MAAM;AAAA,gBACN,OAAO;AAAA,cAAA;AAAA,YAAA,EACT,CACF;AAAA,UAAA,GAEJ;AAAA,UACA,oBAAC,OAAA,EAAI,WAAW,cAAe,SAAA,CAAS;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAEzC,UAAU,CAAC,UACV,oBAAC,SAAI,WAAU,wBAAuB,KAAK,WAAA,CAAY;AAAA,EAAA,GAE3D;AAEJ;"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useRef, useState } from "react";
|
|
3
|
+
import { createPortal } from "react-dom";
|
|
4
|
+
function getInitials(fullName) {
|
|
5
|
+
if (!fullName) return "U";
|
|
6
|
+
const parts = fullName.trim().split(/\s+/).filter(Boolean);
|
|
7
|
+
if (parts.length === 0) return "U";
|
|
8
|
+
const first = parts[0]?.charAt(0) ?? "";
|
|
9
|
+
const last = (parts.length > 1 ? parts[parts.length - 1]?.charAt(0) : "") ?? "";
|
|
10
|
+
return (first + last).toUpperCase() || "U";
|
|
11
|
+
}
|
|
12
|
+
function UserAvatar({
|
|
13
|
+
name,
|
|
14
|
+
photo,
|
|
15
|
+
email,
|
|
16
|
+
company,
|
|
17
|
+
jobTitle,
|
|
18
|
+
department,
|
|
19
|
+
className = "",
|
|
20
|
+
showCard = false
|
|
21
|
+
}) {
|
|
22
|
+
const ref = useRef(null);
|
|
23
|
+
const [popupPos, setPopupPos] = useState(null);
|
|
24
|
+
const [imgError, setImgError] = useState(false);
|
|
25
|
+
const mediumPhoto = photo?.endsWith("/thumb") ? photo + "/medium" : photo;
|
|
26
|
+
const handleMouseEnter = () => {
|
|
27
|
+
if (!showCard || !ref.current) return;
|
|
28
|
+
const rect = ref.current.getBoundingClientRect();
|
|
29
|
+
const POPUP_W = 200;
|
|
30
|
+
const hasDetails = !!(email || company || jobTitle || department);
|
|
31
|
+
const POPUP_H = hasDetails ? 280 : 196;
|
|
32
|
+
const GAP = 10;
|
|
33
|
+
let left = rect.right + GAP;
|
|
34
|
+
let top = rect.top + rect.height / 2 - POPUP_H / 2;
|
|
35
|
+
if (left + POPUP_W > window.innerWidth - 8) left = rect.left - POPUP_W - GAP;
|
|
36
|
+
if (top + POPUP_H > window.innerHeight - 8) top = window.innerHeight - POPUP_H - 8;
|
|
37
|
+
if (top < 8) top = 8;
|
|
38
|
+
setPopupPos({ top, left });
|
|
39
|
+
};
|
|
40
|
+
const avatar = photo && !imgError ? /* @__PURE__ */ jsx(
|
|
41
|
+
"div",
|
|
42
|
+
{
|
|
43
|
+
ref,
|
|
44
|
+
className: `overflow-hidden shrink-0 cursor-pointer ${className}`,
|
|
45
|
+
onMouseEnter: handleMouseEnter,
|
|
46
|
+
onMouseLeave: () => setPopupPos(null),
|
|
47
|
+
children: /* @__PURE__ */ jsx(
|
|
48
|
+
"img",
|
|
49
|
+
{
|
|
50
|
+
src: photo,
|
|
51
|
+
alt: name || "",
|
|
52
|
+
className: "w-full h-full object-cover rounded-[inherit]",
|
|
53
|
+
onError: () => setImgError(true)
|
|
54
|
+
}
|
|
55
|
+
)
|
|
56
|
+
}
|
|
57
|
+
) : /* @__PURE__ */ jsx(
|
|
58
|
+
"div",
|
|
59
|
+
{
|
|
60
|
+
ref,
|
|
61
|
+
className: `flex items-center justify-center shrink-0 ${className}`,
|
|
62
|
+
onMouseEnter: handleMouseEnter,
|
|
63
|
+
onMouseLeave: () => setPopupPos(null),
|
|
64
|
+
children: getInitials(name || "")
|
|
65
|
+
}
|
|
66
|
+
);
|
|
67
|
+
const popup = popupPos && createPortal(
|
|
68
|
+
/* @__PURE__ */ jsxs(
|
|
69
|
+
"div",
|
|
70
|
+
{
|
|
71
|
+
style: { position: "fixed", top: popupPos.top, left: popupPos.left, zIndex: 9999, width: 200 },
|
|
72
|
+
className: "pointer-events-none rounded-2xl overflow-hidden shadow-2xl ring-4 ring-white dark:ring-slate-800 border border-slate-100 dark:border-slate-700 bg-white dark:bg-slate-900",
|
|
73
|
+
children: [
|
|
74
|
+
/* @__PURE__ */ jsx("div", { className: "w-48 h-48 rounded-xl overflow-hidden", children: mediumPhoto && !imgError ? /* @__PURE__ */ jsx(
|
|
75
|
+
"img",
|
|
76
|
+
{
|
|
77
|
+
src: mediumPhoto,
|
|
78
|
+
alt: name || "",
|
|
79
|
+
className: "w-full h-full object-cover",
|
|
80
|
+
onError: () => setImgError(true)
|
|
81
|
+
}
|
|
82
|
+
) : /* @__PURE__ */ jsx("div", { className: "w-full h-full flex items-center justify-center bg-gradient-to-br from-slate-200 to-slate-300 text-slate-600 font-black text-4xl", children: getInitials(name || "") }) }),
|
|
83
|
+
/* @__PURE__ */ jsxs("div", { className: "px-3 py-2.5 space-y-1", children: [
|
|
84
|
+
name && /* @__PURE__ */ jsx("p", { className: "text-[12px] font-black text-slate-800 dark:text-slate-100 tracking-tight leading-tight break-words", children: name }),
|
|
85
|
+
email && /* @__PURE__ */ jsx("p", { className: "text-[10px] text-slate-400 truncate", children: email }),
|
|
86
|
+
(company || department || jobTitle) && /* @__PURE__ */ jsxs("div", { className: "pt-1 mt-1 border-t border-slate-50 dark:border-slate-700 space-y-0.5", children: [
|
|
87
|
+
company && /* @__PURE__ */ jsx("p", { className: "text-[10px] font-semibold text-slate-600 dark:text-slate-300 truncate", children: company }),
|
|
88
|
+
department && /* @__PURE__ */ jsx("p", { className: "text-[10px] text-slate-500 dark:text-slate-400 truncate", children: department }),
|
|
89
|
+
jobTitle && /* @__PURE__ */ jsx("p", { className: "text-[10px] text-slate-400 truncate italic", children: jobTitle })
|
|
90
|
+
] })
|
|
91
|
+
] })
|
|
92
|
+
]
|
|
93
|
+
}
|
|
94
|
+
),
|
|
95
|
+
document.body
|
|
96
|
+
);
|
|
97
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
98
|
+
avatar,
|
|
99
|
+
popup
|
|
100
|
+
] });
|
|
101
|
+
}
|
|
102
|
+
export {
|
|
103
|
+
UserAvatar as default
|
|
104
|
+
};
|
|
105
|
+
//# sourceMappingURL=UserAvatar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UserAvatar.js","sources":["../../../../../../src/legacy/components/molecules/UserAvatar/UserAvatar.tsx"],"sourcesContent":["import React, { useRef, useState } from 'react'\r\nimport { createPortal } from 'react-dom'\r\n\r\n/** Iniciais a partir do nome completo (primeira + última). Fallback 'U'. */\r\nfunction getInitials(fullName?: string | null): string {\r\n if (!fullName) return 'U'\r\n const parts = fullName.trim().split(/\\s+/).filter(Boolean)\r\n if (parts.length === 0) return 'U'\r\n const first = parts[0]?.charAt(0) ?? ''\r\n const last = (parts.length > 1 ? parts[parts.length - 1]?.charAt(0) : '') ?? ''\r\n return (first + last).toUpperCase() || 'U'\r\n}\r\n\r\ninterface UserAvatarProps {\r\n name?: string | null\r\n photo?: string | null\r\n email?: string | null\r\n company?: string | null\r\n jobTitle?: string | null\r\n department?: string | null\r\n className?: string\r\n /** Mostra o cartão de detalhes em hover (foto ampliada + nome/email). Default: off. */\r\n showCard?: boolean\r\n}\r\n\r\n/**\r\n * Avatar de utilizador: mostra a foto (se disponível) ou as iniciais, com um\r\n * cartão de detalhes em hover (via portal). Usa classes Tailwind — a app\r\n * consumidora é responsável por gerar o CSS Tailwind.\r\n * @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy.\r\n */\r\nexport default function UserAvatar({\r\n name,\r\n photo,\r\n email,\r\n company,\r\n jobTitle,\r\n department,\r\n className = '',\r\n showCard = false,\r\n}: UserAvatarProps) {\r\n const ref = useRef<HTMLDivElement>(null)\r\n const [popupPos, setPopupPos] = useState<{ top: number; left: number } | null>(null)\r\n const [imgError, setImgError] = useState(false)\r\n\r\n const mediumPhoto = photo?.endsWith('/thumb') ? photo + '/medium' : photo\r\n\r\n const handleMouseEnter = () => {\r\n if (!showCard || !ref.current) return\r\n const rect = ref.current.getBoundingClientRect()\r\n const POPUP_W = 200\r\n const hasDetails = !!(email || company || jobTitle || department)\r\n const POPUP_H = hasDetails ? 280 : 196\r\n const GAP = 10\r\n let left = rect.right + GAP\r\n let top = rect.top + rect.height / 2 - POPUP_H / 2\r\n if (left + POPUP_W > window.innerWidth - 8) left = rect.left - POPUP_W - GAP\r\n if (top + POPUP_H > window.innerHeight - 8) top = window.innerHeight - POPUP_H - 8\r\n if (top < 8) top = 8\r\n setPopupPos({ top, left })\r\n }\r\n\r\n const avatar =\r\n photo && !imgError ? (\r\n <div\r\n ref={ref}\r\n className={`overflow-hidden shrink-0 cursor-pointer ${className}`}\r\n onMouseEnter={handleMouseEnter}\r\n onMouseLeave={() => setPopupPos(null)}\r\n >\r\n <img\r\n src={photo}\r\n alt={name || ''}\r\n className=\"w-full h-full object-cover rounded-[inherit]\"\r\n onError={() => setImgError(true)}\r\n />\r\n </div>\r\n ) : (\r\n <div\r\n ref={ref}\r\n className={`flex items-center justify-center shrink-0 ${className}`}\r\n onMouseEnter={handleMouseEnter}\r\n onMouseLeave={() => setPopupPos(null)}\r\n >\r\n {getInitials(name || '')}\r\n </div>\r\n )\r\n\r\n const popup =\r\n popupPos &&\r\n createPortal(\r\n <div\r\n style={{ position: 'fixed', top: popupPos.top, left: popupPos.left, zIndex: 9999, width: 200 }}\r\n className=\"pointer-events-none rounded-2xl overflow-hidden shadow-2xl ring-4 ring-white dark:ring-slate-800 border border-slate-100 dark:border-slate-700 bg-white dark:bg-slate-900\"\r\n >\r\n {/* Foto / iniciais */}\r\n <div className=\"w-48 h-48 rounded-xl overflow-hidden\">\r\n {mediumPhoto && !imgError ? (\r\n <img\r\n src={mediumPhoto}\r\n alt={name || ''}\r\n className=\"w-full h-full object-cover\"\r\n onError={() => setImgError(true)}\r\n />\r\n ) : (\r\n <div className=\"w-full h-full flex items-center justify-center bg-gradient-to-br from-slate-200 to-slate-300 text-slate-600 font-black text-4xl\">\r\n {getInitials(name || '')}\r\n </div>\r\n )}\r\n </div>\r\n {/* Barra de informação */}\r\n <div className=\"px-3 py-2.5 space-y-1\">\r\n {name && (\r\n <p className=\"text-[12px] font-black text-slate-800 dark:text-slate-100 tracking-tight leading-tight break-words\">\r\n {name}\r\n </p>\r\n )}\r\n {email && <p className=\"text-[10px] text-slate-400 truncate\">{email}</p>}\r\n {(company || department || jobTitle) && (\r\n <div className=\"pt-1 mt-1 border-t border-slate-50 dark:border-slate-700 space-y-0.5\">\r\n {company && (\r\n <p className=\"text-[10px] font-semibold text-slate-600 dark:text-slate-300 truncate\">{company}</p>\r\n )}\r\n {department && <p className=\"text-[10px] text-slate-500 dark:text-slate-400 truncate\">{department}</p>}\r\n {jobTitle && <p className=\"text-[10px] text-slate-400 truncate italic\">{jobTitle}</p>}\r\n </div>\r\n )}\r\n </div>\r\n </div>,\r\n document.body\r\n )\r\n\r\n return (\r\n <>\r\n {avatar}\r\n {popup}\r\n </>\r\n )\r\n}\r\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { jsx, Fragment, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useMemo, Fragment as Fragment$1 } from "react";
|
|
3
|
+
const DIA_MS = 864e5;
|
|
4
|
+
const MESES_PT = ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"];
|
|
5
|
+
const ACCENT = "var(--gantt-accent, #1868B0)";
|
|
6
|
+
const toIdx = (iso, t0) => Math.round((Date.parse(`${iso}T00:00:00Z`) - t0) / DIA_MS);
|
|
7
|
+
function GanttChart({
|
|
8
|
+
rows,
|
|
9
|
+
start,
|
|
10
|
+
end,
|
|
11
|
+
dayWidth = 14,
|
|
12
|
+
labelWidth = 300,
|
|
13
|
+
labelHeader = "",
|
|
14
|
+
legend,
|
|
15
|
+
expanded: expandedProp,
|
|
16
|
+
onExpandedChange,
|
|
17
|
+
renderTooltip,
|
|
18
|
+
monthNames = MESES_PT,
|
|
19
|
+
emptyText = "—",
|
|
20
|
+
className = ""
|
|
21
|
+
}) {
|
|
22
|
+
const [expandedLocal, setExpandedLocal] = useState(/* @__PURE__ */ new Set());
|
|
23
|
+
const expanded = expandedProp ?? expandedLocal;
|
|
24
|
+
const setExpanded = (s) => onExpandedChange ? onExpandedChange(s) : setExpandedLocal(s);
|
|
25
|
+
const [tip, setTip] = useState(null);
|
|
26
|
+
const t0 = Date.parse(`${start}T00:00:00Z`);
|
|
27
|
+
const nDias = Math.max(1, toIdx(end, t0) + 1);
|
|
28
|
+
const largura = nDias * dayWidth;
|
|
29
|
+
const dias = useMemo(
|
|
30
|
+
() => Array.from({ length: nDias }, (_, i) => {
|
|
31
|
+
const d = new Date(t0 + i * DIA_MS);
|
|
32
|
+
return { i, dia: d.getUTCDate(), mes: d.getUTCMonth(), ano: d.getUTCFullYear(), fds: d.getUTCDay() === 0 || d.getUTCDay() === 6 };
|
|
33
|
+
}),
|
|
34
|
+
[t0, nDias]
|
|
35
|
+
);
|
|
36
|
+
const toggle = (id) => {
|
|
37
|
+
const s = new Set(expanded);
|
|
38
|
+
if (s.has(id)) s.delete(id);
|
|
39
|
+
else s.add(id);
|
|
40
|
+
setExpanded(s);
|
|
41
|
+
};
|
|
42
|
+
const fundo = /* @__PURE__ */ jsx(Fragment, { children: dias.filter((d) => d.fds).map((d) => /* @__PURE__ */ jsx("div", { className: "absolute inset-y-0 bg-slate-100", style: { left: d.i * dayWidth, width: dayWidth } }, d.i)) });
|
|
43
|
+
const mostrarTip = (e, content) => {
|
|
44
|
+
if (!content) return;
|
|
45
|
+
setTip({ x: Math.min(e.clientX + 12, window.innerWidth - 340), y: e.clientY + 14, content });
|
|
46
|
+
};
|
|
47
|
+
const trilho = (blocos, marcas, alto) => /* @__PURE__ */ jsxs("div", { className: "relative shrink-0", style: { width: largura }, children: [
|
|
48
|
+
fundo,
|
|
49
|
+
blocos.map((b) => /* @__PURE__ */ jsx(
|
|
50
|
+
"div",
|
|
51
|
+
{
|
|
52
|
+
className: `absolute rounded-sm ${alto ? "top-[5px] bottom-[5px]" : "top-1 bottom-1"}`,
|
|
53
|
+
style: { left: b.i * dayWidth + 1, width: Math.max(dayWidth - 2, 2), background: b.color, opacity: b.opacity },
|
|
54
|
+
onMouseMove: (e) => mostrarTip(e, b.tip),
|
|
55
|
+
onMouseLeave: () => setTip(null)
|
|
56
|
+
},
|
|
57
|
+
`b${b.i}`
|
|
58
|
+
)),
|
|
59
|
+
marcas.map((m) => /* @__PURE__ */ jsx(
|
|
60
|
+
"div",
|
|
61
|
+
{
|
|
62
|
+
className: "absolute top-1/2 w-[9px] h-[9px] bg-slate-900 border-[1.5px] border-white",
|
|
63
|
+
style: { left: m.i * dayWidth + dayWidth / 2, transform: "translate(-50%,-50%) rotate(45deg)" },
|
|
64
|
+
onMouseMove: (e) => mostrarTip(e, m.tip),
|
|
65
|
+
onMouseLeave: () => setTip(null)
|
|
66
|
+
},
|
|
67
|
+
`m${m.i}`
|
|
68
|
+
))
|
|
69
|
+
] });
|
|
70
|
+
const linhas = [];
|
|
71
|
+
let secaoAtual;
|
|
72
|
+
for (const row of rows) {
|
|
73
|
+
if (row.section && row.section !== secaoAtual) {
|
|
74
|
+
secaoAtual = row.section;
|
|
75
|
+
linhas.push(
|
|
76
|
+
/* @__PURE__ */ jsxs("div", { className: "flex border-b border-slate-200 bg-slate-50", children: [
|
|
77
|
+
/* @__PURE__ */ jsx("div", { className: "sticky left-0 z-[2] shrink-0 bg-slate-50 px-2 py-1 text-[11px] font-bold uppercase tracking-wide text-slate-500 border-r border-slate-200", style: { width: labelWidth }, children: row.section }),
|
|
78
|
+
/* @__PURE__ */ jsx("div", { style: { width: largura } })
|
|
79
|
+
] }, `s-${row.section}-${row.id}`)
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
const filhos = row.children ?? [];
|
|
83
|
+
const aberto = expanded.has(row.id);
|
|
84
|
+
let blocos;
|
|
85
|
+
if (row.days) {
|
|
86
|
+
blocos = row.days.map((d) => ({ i: toIdx(d, t0), color: row.color ?? ACCENT, tip: renderTooltip?.({ row, day: d, kind: "day" }) }));
|
|
87
|
+
} else {
|
|
88
|
+
const cont = /* @__PURE__ */ new Map();
|
|
89
|
+
for (const f of filhos) for (const d of f.days ?? []) cont.set(d, (cont.get(d) ?? 0) + 1);
|
|
90
|
+
const max = Math.max(1, ...cont.values());
|
|
91
|
+
blocos = [...cont.entries()].map(([d, n]) => ({
|
|
92
|
+
i: toIdx(d, t0),
|
|
93
|
+
color: row.color ?? ACCENT,
|
|
94
|
+
opacity: 0.45 + 0.55 * n / max,
|
|
95
|
+
tip: renderTooltip?.({ row, day: d, kind: "day", count: n })
|
|
96
|
+
}));
|
|
97
|
+
}
|
|
98
|
+
const marcas = (row.markers ?? []).map((d) => ({ i: toIdx(d, t0), tip: renderTooltip?.({ row, day: d, kind: "marker" }) }));
|
|
99
|
+
linhas.push(
|
|
100
|
+
/* @__PURE__ */ jsxs("div", { className: "group flex min-h-[22px] border-b border-slate-200 hover:bg-blue-50/60", children: [
|
|
101
|
+
/* @__PURE__ */ jsxs(
|
|
102
|
+
"div",
|
|
103
|
+
{
|
|
104
|
+
className: `sticky left-0 z-[2] shrink-0 truncate border-r border-slate-200 bg-white px-2 py-[3px] group-hover:bg-blue-50 ${filhos.length ? "cursor-pointer font-semibold" : ""}`,
|
|
105
|
+
style: { width: labelWidth, color: row.labelColor },
|
|
106
|
+
onClick: filhos.length ? () => toggle(row.id) : void 0,
|
|
107
|
+
title: row.label,
|
|
108
|
+
children: [
|
|
109
|
+
filhos.length > 0 && /* @__PURE__ */ jsx("span", { className: "inline-block w-3.5 text-slate-400", children: aberto ? "▾" : "▸" }),
|
|
110
|
+
row.label,
|
|
111
|
+
row.sublabel && /* @__PURE__ */ jsx("span", { className: "ml-1 text-[11px] font-normal text-slate-400", children: row.sublabel }),
|
|
112
|
+
row.warning && /* @__PURE__ */ jsx("span", { className: "ml-1 text-orange-600", title: row.warning, children: "⚠" })
|
|
113
|
+
]
|
|
114
|
+
}
|
|
115
|
+
),
|
|
116
|
+
trilho(blocos, marcas, true)
|
|
117
|
+
] }, row.id)
|
|
118
|
+
);
|
|
119
|
+
if (aberto)
|
|
120
|
+
for (const f of filhos) {
|
|
121
|
+
const b = (f.days ?? []).map((d) => ({ i: toIdx(d, t0), color: f.color ?? ACCENT, tip: renderTooltip?.({ row: f, day: d, kind: "day", parent: row }) }));
|
|
122
|
+
const m = (f.markers ?? []).map((d) => ({ i: toIdx(d, t0), tip: renderTooltip?.({ row: f, day: d, kind: "marker", parent: row }) }));
|
|
123
|
+
linhas.push(
|
|
124
|
+
/* @__PURE__ */ jsxs("div", { className: "group flex min-h-[22px] border-b border-slate-200 hover:bg-blue-50/60", children: [
|
|
125
|
+
/* @__PURE__ */ jsxs("div", { className: "sticky left-0 z-[2] shrink-0 truncate border-r border-slate-200 bg-white py-[3px] pl-7 pr-2 text-slate-500 group-hover:bg-blue-50", style: { width: labelWidth, color: f.labelColor }, title: f.warning ? `${f.label} — ${f.warning}` : f.label, children: [
|
|
126
|
+
f.label,
|
|
127
|
+
f.sublabel && /* @__PURE__ */ jsx("span", { className: "ml-1 text-[11px] text-slate-400", children: f.sublabel }),
|
|
128
|
+
f.warning && /* @__PURE__ */ jsx("span", { className: "ml-1 text-orange-600", children: "⚠" })
|
|
129
|
+
] }),
|
|
130
|
+
trilho(b, m, false)
|
|
131
|
+
] }, `${row.id}::${f.id}`)
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return /* @__PURE__ */ jsxs("div", { className, children: [
|
|
136
|
+
legend && legend.length > 0 && /* @__PURE__ */ jsx("div", { className: "mb-2 flex flex-wrap gap-3 text-xs text-slate-500", children: legend.map((l) => /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1", children: [
|
|
137
|
+
/* @__PURE__ */ jsx("i", { className: "inline-block h-2.5 w-2.5 rounded-sm", style: { background: l.color, transform: l.kind === "marker" ? "rotate(45deg) scale(.85)" : void 0 } }),
|
|
138
|
+
l.label
|
|
139
|
+
] }, l.label)) }),
|
|
140
|
+
/* @__PURE__ */ jsx("div", { className: "max-h-[calc(100vh-220px)] overflow-auto rounded-lg border border-slate-200 bg-white text-[13px]", children: /* @__PURE__ */ jsxs("div", { className: "w-max min-w-full", children: [
|
|
141
|
+
/* @__PURE__ */ jsxs("div", { className: "sticky top-0 z-[3] flex border-b border-slate-200 bg-white", children: [
|
|
142
|
+
/* @__PURE__ */ jsx("div", { className: "sticky left-0 z-[4] shrink-0 border-r border-slate-200 bg-white px-2 py-2 font-semibold", style: { width: labelWidth }, children: labelHeader }),
|
|
143
|
+
/* @__PURE__ */ jsx("div", { className: "relative shrink-0 bg-white", style: { width: largura, height: 36 }, children: dias.map((d) => /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
144
|
+
(d.i === 0 || d.dia === 1) && /* @__PURE__ */ jsxs("div", { className: "absolute top-0 h-[18px] whitespace-nowrap border-l border-slate-200 pl-1 font-semibold", style: { left: d.i * dayWidth }, children: [
|
|
145
|
+
monthNames[d.mes],
|
|
146
|
+
" ",
|
|
147
|
+
d.ano
|
|
148
|
+
] }),
|
|
149
|
+
(dayWidth >= 14 || new Date(t0 + d.i * DIA_MS).getUTCDay() === 1) && /* @__PURE__ */ jsx("div", { className: "absolute top-[18px] h-4 text-[10px] text-slate-400", style: { left: d.i * dayWidth, width: dayWidth >= 14 ? dayWidth : dayWidth * 7, textAlign: dayWidth >= 14 ? "center" : "left" }, children: d.dia })
|
|
150
|
+
] }, d.i)) })
|
|
151
|
+
] }),
|
|
152
|
+
linhas.length ? linhas : /* @__PURE__ */ jsx("div", { className: "p-6 text-center text-sm text-slate-400", children: emptyText })
|
|
153
|
+
] }) }),
|
|
154
|
+
tip && /* @__PURE__ */ jsx("div", { className: "pointer-events-none fixed z-50 max-w-[340px] rounded-md bg-slate-900 px-2 py-1.5 text-xs text-white shadow-lg", style: { left: tip.x, top: tip.y }, children: tip.content })
|
|
155
|
+
] });
|
|
156
|
+
}
|
|
157
|
+
const ganttDiaIso = (start, offset) => new Date(Date.parse(`${start}T00:00:00Z`) + offset * DIA_MS).toISOString().slice(0, 10);
|
|
158
|
+
export {
|
|
159
|
+
GanttChart as default,
|
|
160
|
+
ganttDiaIso
|
|
161
|
+
};
|
|
162
|
+
//# sourceMappingURL=GanttChart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GanttChart.js","sources":["../../../../../../src/legacy/components/organisms/GanttChart/GanttChart.tsx"],"sourcesContent":["import React, { Fragment, useMemo, useState } from 'react'\r\n\r\n// ─── Tipos ──────────────────────────────────────────────────────────────────\r\n\r\n/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nexport interface GanttRow {\r\n id: string\r\n label: string\r\n /** Texto pequeno à direita do rótulo (ex: \"12 dias\"). */\r\n sublabel?: string\r\n /** Mostra ⚠ com este texto no title. */\r\n warning?: string\r\n /** Cor dos blocos (CSS). Nas linhas-pai sem cor usa-se a cor de destaque. */\r\n color?: string\r\n /** Cor do texto do rótulo (CSS) — ex.: verde para tarefas concluídas. */\r\n labelColor?: string\r\n /** Dias com atividade (ISO yyyy-mm-dd). Nas linhas-pai, se omitido, agrega os dias dos filhos. */\r\n days?: string[]\r\n /** Dias marcados com losango (ex: conclusão). */\r\n markers?: string[]\r\n /** Cabeçalho de secção mostrado antes da linha quando muda (ex: \"Ramal 1\"). */\r\n section?: string\r\n children?: GanttRow[]\r\n}\r\n\r\n/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nexport interface GanttLegendItem {\r\n label: string\r\n color: string\r\n kind?: 'block' | 'marker'\r\n}\r\n\r\n/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nexport interface GanttChartProps {\r\n rows: GanttRow[]\r\n /** Início e fim do eixo (ISO). */\r\n start: string\r\n end: string\r\n /** Largura de cada dia em px (zoom). Default 14. */\r\n dayWidth?: number\r\n labelWidth?: number\r\n /** Título da coluna de rótulos. */\r\n labelHeader?: string\r\n legend?: GanttLegendItem[]\r\n /** Linhas-pai abertas (controlado). Sem isto o componente gere o estado. */\r\n expanded?: Set<string>\r\n onExpandedChange?: (ids: Set<string>) => void\r\n /** Conteúdo do tooltip de um dia. `parent` = linha-pai (dia agregado). */\r\n renderTooltip?: (info: { row: GanttRow; day: string; kind: 'day' | 'marker'; count?: number; parent?: GanttRow }) => React.ReactNode\r\n /** Nomes dos meses (i18n). Default PT. */\r\n monthNames?: string[]\r\n emptyText?: string\r\n className?: string\r\n}\r\n\r\nconst DIA_MS = 86_400_000\r\nconst MESES_PT = ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez']\r\nconst ACCENT = 'var(--gantt-accent, #1868B0)'\r\n\r\nconst toIdx = (iso: string, t0: number) => Math.round((Date.parse(`${iso}T00:00:00Z`) - t0) / DIA_MS)\r\n\r\n// ─── Componente ─────────────────────────────────────────────────────────────\r\n\r\n/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nexport default function GanttChart({\r\n rows,\r\n start,\r\n end,\r\n dayWidth = 14,\r\n labelWidth = 300,\r\n labelHeader = '',\r\n legend,\r\n expanded: expandedProp,\r\n onExpandedChange,\r\n renderTooltip,\r\n monthNames = MESES_PT,\r\n emptyText = '—',\r\n className = '',\r\n}: GanttChartProps) {\r\n const [expandedLocal, setExpandedLocal] = useState<Set<string>>(new Set())\r\n const expanded = expandedProp ?? expandedLocal\r\n const setExpanded = (s: Set<string>) => (onExpandedChange ? onExpandedChange(s) : setExpandedLocal(s))\r\n const [tip, setTip] = useState<{ x: number; y: number; content: React.ReactNode } | null>(null)\r\n\r\n const t0 = Date.parse(`${start}T00:00:00Z`)\r\n const nDias = Math.max(1, toIdx(end, t0) + 1)\r\n const largura = nDias * dayWidth\r\n\r\n const dias = useMemo(\r\n () =>\r\n Array.from({ length: nDias }, (_, i) => {\r\n const d = new Date(t0 + i * DIA_MS)\r\n return { i, dia: d.getUTCDate(), mes: d.getUTCMonth(), ano: d.getUTCFullYear(), fds: d.getUTCDay() === 0 || d.getUTCDay() === 6 }\r\n }),\r\n [t0, nDias]\r\n )\r\n\r\n const toggle = (id: string) => {\r\n const s = new Set(expanded)\r\n if (s.has(id)) s.delete(id)\r\n else s.add(id)\r\n setExpanded(s)\r\n }\r\n\r\n const fundo = (\r\n <>\r\n {dias.filter((d) => d.fds).map((d) => (\r\n <div key={d.i} className=\"absolute inset-y-0 bg-slate-100\" style={{ left: d.i * dayWidth, width: dayWidth }} />\r\n ))}\r\n </>\r\n )\r\n\r\n const mostrarTip = (e: React.MouseEvent, content: React.ReactNode) => {\r\n if (!content) return\r\n setTip({ x: Math.min(e.clientX + 12, window.innerWidth - 340), y: e.clientY + 14, content })\r\n }\r\n\r\n const trilho = (blocos: { i: number; color: string; opacity?: number; tip?: React.ReactNode }[], marcas: { i: number; tip?: React.ReactNode }[], alto: boolean) => (\r\n <div className=\"relative shrink-0\" style={{ width: largura }}>\r\n {fundo}\r\n {blocos.map((b) => (\r\n <div\r\n key={`b${b.i}`}\r\n className={`absolute rounded-sm ${alto ? 'top-[5px] bottom-[5px]' : 'top-1 bottom-1'}`}\r\n style={{ left: b.i * dayWidth + 1, width: Math.max(dayWidth - 2, 2), background: b.color, opacity: b.opacity }}\r\n onMouseMove={(e) => mostrarTip(e, b.tip)}\r\n onMouseLeave={() => setTip(null)}\r\n />\r\n ))}\r\n {marcas.map((m) => (\r\n <div\r\n key={`m${m.i}`}\r\n className=\"absolute top-1/2 w-[9px] h-[9px] bg-slate-900 border-[1.5px] border-white\"\r\n style={{ left: m.i * dayWidth + dayWidth / 2, transform: 'translate(-50%,-50%) rotate(45deg)' }}\r\n onMouseMove={(e) => mostrarTip(e, m.tip)}\r\n onMouseLeave={() => setTip(null)}\r\n />\r\n ))}\r\n </div>\r\n )\r\n\r\n const linhas: React.ReactNode[] = []\r\n let secaoAtual: string | undefined\r\n for (const row of rows) {\r\n if (row.section && row.section !== secaoAtual) {\r\n secaoAtual = row.section\r\n linhas.push(\r\n <div key={`s-${row.section}-${row.id}`} className=\"flex border-b border-slate-200 bg-slate-50\">\r\n <div className=\"sticky left-0 z-[2] shrink-0 bg-slate-50 px-2 py-1 text-[11px] font-bold uppercase tracking-wide text-slate-500 border-r border-slate-200\" style={{ width: labelWidth }}>\r\n {row.section}\r\n </div>\r\n <div style={{ width: largura }} />\r\n </div>\r\n )\r\n }\r\n const filhos = row.children ?? []\r\n const aberto = expanded.has(row.id)\r\n let blocos: { i: number; color: string; opacity?: number; tip?: React.ReactNode }[]\r\n if (row.days) {\r\n blocos = row.days.map((d) => ({ i: toIdx(d, t0), color: row.color ?? ACCENT, tip: renderTooltip?.({ row, day: d, kind: 'day' }) }))\r\n } else {\r\n const cont = new Map<string, number>()\r\n for (const f of filhos) for (const d of f.days ?? []) cont.set(d, (cont.get(d) ?? 0) + 1)\r\n const max = Math.max(1, ...cont.values())\r\n blocos = [...cont.entries()].map(([d, n]) => ({\r\n i: toIdx(d, t0),\r\n color: row.color ?? ACCENT,\r\n opacity: 0.45 + (0.55 * n) / max,\r\n tip: renderTooltip?.({ row, day: d, kind: 'day', count: n }),\r\n }))\r\n }\r\n const marcas = (row.markers ?? []).map((d) => ({ i: toIdx(d, t0), tip: renderTooltip?.({ row, day: d, kind: 'marker' }) }))\r\n\r\n linhas.push(\r\n <div key={row.id} className=\"group flex min-h-[22px] border-b border-slate-200 hover:bg-blue-50/60\">\r\n <div\r\n className={`sticky left-0 z-[2] shrink-0 truncate border-r border-slate-200 bg-white px-2 py-[3px] group-hover:bg-blue-50 ${filhos.length ? 'cursor-pointer font-semibold' : ''}`}\r\n style={{ width: labelWidth, color: row.labelColor }}\r\n onClick={filhos.length ? () => toggle(row.id) : undefined}\r\n title={row.label}\r\n >\r\n {filhos.length > 0 && <span className=\"inline-block w-3.5 text-slate-400\">{aberto ? '▾' : '▸'}</span>}\r\n {row.label}\r\n {row.sublabel && <span className=\"ml-1 text-[11px] font-normal text-slate-400\">{row.sublabel}</span>}\r\n {row.warning && <span className=\"ml-1 text-orange-600\" title={row.warning}>⚠</span>}\r\n </div>\r\n {trilho(blocos, marcas, true)}\r\n </div>\r\n )\r\n\r\n if (aberto)\r\n for (const f of filhos) {\r\n const b = (f.days ?? []).map((d) => ({ i: toIdx(d, t0), color: f.color ?? ACCENT, tip: renderTooltip?.({ row: f, day: d, kind: 'day', parent: row }) }))\r\n const m = (f.markers ?? []).map((d) => ({ i: toIdx(d, t0), tip: renderTooltip?.({ row: f, day: d, kind: 'marker', parent: row }) }))\r\n linhas.push(\r\n <div key={`${row.id}::${f.id}`} className=\"group flex min-h-[22px] border-b border-slate-200 hover:bg-blue-50/60\">\r\n <div className=\"sticky left-0 z-[2] shrink-0 truncate border-r border-slate-200 bg-white py-[3px] pl-7 pr-2 text-slate-500 group-hover:bg-blue-50\" style={{ width: labelWidth, color: f.labelColor }} title={f.warning ? `${f.label} — ${f.warning}` : f.label}>\r\n {f.label}\r\n {f.sublabel && <span className=\"ml-1 text-[11px] text-slate-400\">{f.sublabel}</span>}\r\n {f.warning && <span className=\"ml-1 text-orange-600\">⚠</span>}\r\n </div>\r\n {trilho(b, m, false)}\r\n </div>\r\n )\r\n }\r\n }\r\n\r\n return (\r\n <div className={className}>\r\n {legend && legend.length > 0 && (\r\n <div className=\"mb-2 flex flex-wrap gap-3 text-xs text-slate-500\">\r\n {legend.map((l) => (\r\n <span key={l.label} className=\"inline-flex items-center gap-1\">\r\n <i className=\"inline-block h-2.5 w-2.5 rounded-sm\" style={{ background: l.color, transform: l.kind === 'marker' ? 'rotate(45deg) scale(.85)' : undefined }} />\r\n {l.label}\r\n </span>\r\n ))}\r\n </div>\r\n )}\r\n <div className=\"max-h-[calc(100vh-220px)] overflow-auto rounded-lg border border-slate-200 bg-white text-[13px]\">\r\n {/* w-max: o cabeçalho fixo cobre a largura toda do conteúdo (não só a parte visível) */}\r\n <div className=\"w-max min-w-full\">\r\n <div className=\"sticky top-0 z-[3] flex border-b border-slate-200 bg-white\">\r\n <div className=\"sticky left-0 z-[4] shrink-0 border-r border-slate-200 bg-white px-2 py-2 font-semibold\" style={{ width: labelWidth }}>\r\n {labelHeader}\r\n </div>\r\n <div className=\"relative shrink-0 bg-white\" style={{ width: largura, height: 36 }}>\r\n {dias.map((d) => (\r\n <Fragment key={d.i}>\r\n {(d.i === 0 || d.dia === 1) && (\r\n <div className=\"absolute top-0 h-[18px] whitespace-nowrap border-l border-slate-200 pl-1 font-semibold\" style={{ left: d.i * dayWidth }}>\r\n {monthNames[d.mes]} {d.ano}\r\n </div>\r\n )}\r\n {(dayWidth >= 14 || new Date(t0 + d.i * DIA_MS).getUTCDay() === 1) && (\r\n <div className=\"absolute top-[18px] h-4 text-[10px] text-slate-400\" style={{ left: d.i * dayWidth, width: dayWidth >= 14 ? dayWidth : dayWidth * 7, textAlign: dayWidth >= 14 ? 'center' : 'left' }}>\r\n {d.dia}\r\n </div>\r\n )}\r\n </Fragment>\r\n ))}\r\n </div>\r\n </div>\r\n {linhas.length ? linhas : <div className=\"p-6 text-center text-sm text-slate-400\">{emptyText}</div>}\r\n </div>\r\n </div>\r\n {tip && (\r\n <div className=\"pointer-events-none fixed z-50 max-w-[340px] rounded-md bg-slate-900 px-2 py-1.5 text-xs text-white shadow-lg\" style={{ left: tip.x, top: tip.y }}>\r\n {tip.content}\r\n </div>\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\n/**\r\n * Utilitário: ISO de um dia do eixo (para quem precisa de formatar tooltips).\r\n * @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy.\r\n */\r\nexport const ganttDiaIso = (start: string, offset: number) => new Date(Date.parse(`${start}T00:00:00Z`) + offset * DIA_MS).toISOString().slice(0, 10)\r\n"],"names":["Fragment"],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
function Kanban({
|
|
4
|
+
colunas,
|
|
5
|
+
itens,
|
|
6
|
+
colunaDoItem,
|
|
7
|
+
chaveDoItem,
|
|
8
|
+
cartao,
|
|
9
|
+
onAbrirItem,
|
|
10
|
+
onMover,
|
|
11
|
+
onAdicionar,
|
|
12
|
+
labels
|
|
13
|
+
}) {
|
|
14
|
+
const [aArrastar, setAArrastar] = useState(null);
|
|
15
|
+
const [colunaAlvo, setColunaAlvo] = useState(null);
|
|
16
|
+
const porColuna = /* @__PURE__ */ new Map();
|
|
17
|
+
for (const item of itens) {
|
|
18
|
+
const chave = colunaDoItem(item);
|
|
19
|
+
porColuna.set(chave, [...porColuna.get(chave) ?? [], item]);
|
|
20
|
+
}
|
|
21
|
+
return /* @__PURE__ */ jsx("div", { className: "cui-kanban flex gap-4 overflow-x-auto pb-4", children: colunas.map((coluna) => {
|
|
22
|
+
const cartoes = porColuna.get(coluna.id) ?? [];
|
|
23
|
+
const realcada = colunaAlvo === coluna.id;
|
|
24
|
+
return /* @__PURE__ */ jsxs(
|
|
25
|
+
"section",
|
|
26
|
+
{
|
|
27
|
+
className: `flex w-80 shrink-0 flex-col bg-white shadow-xl shadow-slate-200/50 transition-colors ${realcada ? "ring-2 ring-proef-turquoise" : ""}`,
|
|
28
|
+
onDragOver: onMover ? (e) => {
|
|
29
|
+
e.preventDefault();
|
|
30
|
+
setColunaAlvo(coluna.id);
|
|
31
|
+
} : void 0,
|
|
32
|
+
onDragLeave: onMover ? () => setColunaAlvo(null) : void 0,
|
|
33
|
+
onDrop: onMover ? (e) => {
|
|
34
|
+
e.preventDefault();
|
|
35
|
+
setColunaAlvo(null);
|
|
36
|
+
if (aArrastar) onMover(aArrastar, coluna.id);
|
|
37
|
+
setAArrastar(null);
|
|
38
|
+
} : void 0,
|
|
39
|
+
children: [
|
|
40
|
+
/* @__PURE__ */ jsxs("header", { className: "flex items-center justify-between gap-2 border-t-4 border-proef-navy px-4 py-3", children: [
|
|
41
|
+
/* @__PURE__ */ jsxs("span", { className: "flex min-w-0 items-center gap-2", children: [
|
|
42
|
+
coluna.cor && /* @__PURE__ */ jsx("span", { className: `h-2.5 w-2.5 shrink-0 rounded-full ${coluna.cor}` }),
|
|
43
|
+
/* @__PURE__ */ jsx("span", { className: "truncate text-sm font-black uppercase tracking-tight text-proef-navy", children: coluna.titulo }),
|
|
44
|
+
/* @__PURE__ */ jsx("span", { className: "shrink-0 bg-slate-100 px-1.5 text-xs font-bold leading-5 text-slate-500 rounded-full", children: cartoes.length })
|
|
45
|
+
] }),
|
|
46
|
+
/* @__PURE__ */ jsxs("span", { className: "flex shrink-0 items-center gap-2 text-xs text-slate-400", children: [
|
|
47
|
+
coluna.extra,
|
|
48
|
+
onAdicionar && /* @__PURE__ */ jsx(
|
|
49
|
+
"button",
|
|
50
|
+
{
|
|
51
|
+
type: "button",
|
|
52
|
+
"aria-label": labels?.adicionar ?? "+",
|
|
53
|
+
title: labels?.adicionar,
|
|
54
|
+
onClick: () => onAdicionar(coluna.id),
|
|
55
|
+
className: "px-1 text-base leading-none text-slate-400 hover:text-proef-navy",
|
|
56
|
+
children: "+"
|
|
57
|
+
}
|
|
58
|
+
)
|
|
59
|
+
] })
|
|
60
|
+
] }),
|
|
61
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2 p-3", children: [
|
|
62
|
+
cartoes.map((item) => {
|
|
63
|
+
const chave = chaveDoItem(item);
|
|
64
|
+
return /* @__PURE__ */ jsx(
|
|
65
|
+
"article",
|
|
66
|
+
{
|
|
67
|
+
draggable: !!onMover,
|
|
68
|
+
onDragStart: onMover ? () => setAArrastar(chave) : void 0,
|
|
69
|
+
onDragEnd: onMover ? () => setAArrastar(null) : void 0,
|
|
70
|
+
onClick: onAbrirItem ? () => onAbrirItem(item) : void 0,
|
|
71
|
+
className: `border border-slate-200 bg-white p-3 transition-shadow rounded-lg ${onAbrirItem ? "cursor-pointer hover:shadow-md" : ""} ${aArrastar === chave ? "opacity-50" : ""}`,
|
|
72
|
+
children: cartao(item)
|
|
73
|
+
},
|
|
74
|
+
chave
|
|
75
|
+
);
|
|
76
|
+
}),
|
|
77
|
+
cartoes.length === 0 && /* @__PURE__ */ jsx("p", { className: "py-4 text-center text-xs text-slate-300", children: labels?.semItens ?? "—" })
|
|
78
|
+
] })
|
|
79
|
+
]
|
|
80
|
+
},
|
|
81
|
+
coluna.id
|
|
82
|
+
);
|
|
83
|
+
}) });
|
|
84
|
+
}
|
|
85
|
+
export {
|
|
86
|
+
Kanban as default
|
|
87
|
+
};
|
|
88
|
+
//# sourceMappingURL=Kanban.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Kanban.js","sources":["../../../../../../src/legacy/components/organisms/Kanban/Kanban.tsx"],"sourcesContent":["import React, { useState, type ReactNode } from 'react'\r\n\r\n/**\r\n * Quadro em colunas, ao estilo do Planner/Jira.\r\n *\r\n * Não conhece domínio nenhum: recebe as colunas, os itens, a função que diz em\r\n * que coluna cai cada item e o que desenhar dentro do cartão. Foi extraído do\r\n * quadro do portal de Tickets, que estava preso aos tipos daquele projeto.\r\n *\r\n * Arrastar e largar é opcional: sem `onMover`, o quadro é só de leitura — é o\r\n * caso de quem mostra dados de um sistema externo que não pode escrever.\r\n * @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy.\r\n */\r\n\r\nexport interface KanbanColuna {\r\n id: string\r\n titulo: string\r\n /** Classe de cor do ponto do cabeçalho (ex: `bg-emerald-500`). */\r\n cor?: string\r\n /** Conteúdo extra no cabeçalho, à direita da contagem (ex: total de horas). */\r\n extra?: ReactNode\r\n}\r\n\r\n/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nexport interface KanbanProps<T> {\r\n colunas: KanbanColuna[]\r\n itens: T[]\r\n /** Em que coluna cai o item — devolve o `id` da coluna. */\r\n colunaDoItem: (item: T) => string\r\n chaveDoItem: (item: T) => string\r\n /** Conteúdo do cartão. O invólucro (moldura, arrastar, clique) é do Kanban. */\r\n cartao: (item: T) => ReactNode\r\n onAbrirItem?: (item: T) => void\r\n /**\r\n * Largar um cartão noutra coluna. Sem isto não há arrastar: um quadro de\r\n * leitura não deve sugerir que se pode mexer.\r\n */\r\n onMover?: (itemId: string, colunaId: string) => void\r\n /** Botão \"+\" no cabeçalho de cada coluna. */\r\n onAdicionar?: (colunaId: string) => void\r\n labels?: {\r\n semItens?: string\r\n adicionar?: string\r\n }\r\n}\r\n\r\n/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nexport default function Kanban<T>({\r\n colunas,\r\n itens,\r\n colunaDoItem,\r\n chaveDoItem,\r\n cartao,\r\n onAbrirItem,\r\n onMover,\r\n onAdicionar,\r\n labels,\r\n}: KanbanProps<T>) {\r\n const [aArrastar, setAArrastar] = useState<string | null>(null)\r\n const [colunaAlvo, setColunaAlvo] = useState<string | null>(null)\r\n\r\n const porColuna = new Map<string, T[]>()\r\n for (const item of itens) {\r\n const chave = colunaDoItem(item)\r\n porColuna.set(chave, [...(porColuna.get(chave) ?? []), item])\r\n }\r\n\r\n return (\r\n <div className=\"cui-kanban flex gap-4 overflow-x-auto pb-4\">\r\n {colunas.map((coluna) => {\r\n const cartoes = porColuna.get(coluna.id) ?? []\r\n const realcada = colunaAlvo === coluna.id\r\n\r\n return (\r\n <section\r\n key={coluna.id}\r\n className={`flex w-80 shrink-0 flex-col bg-white shadow-xl shadow-slate-200/50 transition-colors ${\r\n realcada ? 'ring-2 ring-proef-turquoise' : ''\r\n }`}\r\n onDragOver={\r\n onMover\r\n ? (e) => {\r\n e.preventDefault()\r\n setColunaAlvo(coluna.id)\r\n }\r\n : undefined\r\n }\r\n onDragLeave={onMover ? () => setColunaAlvo(null) : undefined}\r\n onDrop={\r\n onMover\r\n ? (e) => {\r\n e.preventDefault()\r\n setColunaAlvo(null)\r\n if (aArrastar) onMover(aArrastar, coluna.id)\r\n setAArrastar(null)\r\n }\r\n : undefined\r\n }\r\n >\r\n <header className=\"flex items-center justify-between gap-2 border-t-4 border-proef-navy px-4 py-3\">\r\n <span className=\"flex min-w-0 items-center gap-2\">\r\n {coluna.cor && (\r\n <span className={`h-2.5 w-2.5 shrink-0 rounded-full ${coluna.cor}`} />\r\n )}\r\n <span className=\"truncate text-sm font-black uppercase tracking-tight text-proef-navy\">\r\n {coluna.titulo}\r\n </span>\r\n <span className=\"shrink-0 bg-slate-100 px-1.5 text-xs font-bold leading-5 text-slate-500 rounded-full\">\r\n {cartoes.length}\r\n </span>\r\n </span>\r\n\r\n <span className=\"flex shrink-0 items-center gap-2 text-xs text-slate-400\">\r\n {coluna.extra}\r\n {onAdicionar && (\r\n <button\r\n type=\"button\"\r\n aria-label={labels?.adicionar ?? '+'}\r\n title={labels?.adicionar}\r\n onClick={() => onAdicionar(coluna.id)}\r\n className=\"px-1 text-base leading-none text-slate-400 hover:text-proef-navy\"\r\n >\r\n +\r\n </button>\r\n )}\r\n </span>\r\n </header>\r\n\r\n <div className=\"flex flex-col gap-2 p-3\">\r\n {cartoes.map((item) => {\r\n const chave = chaveDoItem(item)\r\n return (\r\n <article\r\n key={chave}\r\n draggable={!!onMover}\r\n onDragStart={onMover ? () => setAArrastar(chave) : undefined}\r\n onDragEnd={onMover ? () => setAArrastar(null) : undefined}\r\n onClick={onAbrirItem ? () => onAbrirItem(item) : undefined}\r\n className={`border border-slate-200 bg-white p-3 transition-shadow rounded-lg ${\r\n onAbrirItem ? 'cursor-pointer hover:shadow-md' : ''\r\n } ${aArrastar === chave ? 'opacity-50' : ''}`}\r\n >\r\n {cartao(item)}\r\n </article>\r\n )\r\n })}\r\n\r\n {cartoes.length === 0 && (\r\n <p className=\"py-4 text-center text-xs text-slate-300\">\r\n {labels?.semItens ?? '—'}\r\n </p>\r\n )}\r\n </div>\r\n </section>\r\n )\r\n })}\r\n </div>\r\n )\r\n}\r\n"],"names":[],"mappings":";;AA+CA,SAAwB,OAAU;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAmB;AACjB,QAAM,CAAC,WAAW,YAAY,IAAI,SAAwB,IAAI;AAC9D,QAAM,CAAC,YAAY,aAAa,IAAI,SAAwB,IAAI;AAEhE,QAAM,gCAAgB,IAAA;AACtB,aAAW,QAAQ,OAAO;AACxB,UAAM,QAAQ,aAAa,IAAI;AAC/B,cAAU,IAAI,OAAO,CAAC,GAAI,UAAU,IAAI,KAAK,KAAK,IAAK,IAAI,CAAC;AAAA,EAC9D;AAEA,6BACG,OAAA,EAAI,WAAU,8CACZ,UAAA,QAAQ,IAAI,CAAC,WAAW;AACvB,UAAM,UAAU,UAAU,IAAI,OAAO,EAAE,KAAK,CAAA;AAC5C,UAAM,WAAW,eAAe,OAAO;AAEvC,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,WAAW,wFACT,WAAW,gCAAgC,EAC7C;AAAA,QACA,YACE,UACI,CAAC,MAAM;AACL,YAAE,eAAA;AACF,wBAAc,OAAO,EAAE;AAAA,QACzB,IACA;AAAA,QAEN,aAAa,UAAU,MAAM,cAAc,IAAI,IAAI;AAAA,QACnD,QACE,UACI,CAAC,MAAM;AACL,YAAE,eAAA;AACF,wBAAc,IAAI;AAClB,cAAI,UAAW,SAAQ,WAAW,OAAO,EAAE;AAC3C,uBAAa,IAAI;AAAA,QACnB,IACA;AAAA,QAGN,UAAA;AAAA,UAAA,qBAAC,UAAA,EAAO,WAAU,kFAChB,UAAA;AAAA,YAAA,qBAAC,QAAA,EAAK,WAAU,mCACb,UAAA;AAAA,cAAA,OAAO,OACN,oBAAC,QAAA,EAAK,WAAW,qCAAqC,OAAO,GAAG,IAAI;AAAA,cAEtE,oBAAC,QAAA,EAAK,WAAU,wEACb,iBAAO,QACV;AAAA,cACA,oBAAC,QAAA,EAAK,WAAU,wFACb,kBAAQ,OAAA,CACX;AAAA,YAAA,GACF;AAAA,YAEA,qBAAC,QAAA,EAAK,WAAU,2DACb,UAAA;AAAA,cAAA,OAAO;AAAA,cACP,eACC;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,cAAY,QAAQ,aAAa;AAAA,kBACjC,OAAO,QAAQ;AAAA,kBACf,SAAS,MAAM,YAAY,OAAO,EAAE;AAAA,kBACpC,WAAU;AAAA,kBACX,UAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,YAED,EAAA,CAEJ;AAAA,UAAA,GACF;AAAA,UAEA,qBAAC,OAAA,EAAI,WAAU,2BACZ,UAAA;AAAA,YAAA,QAAQ,IAAI,CAAC,SAAS;AACrB,oBAAM,QAAQ,YAAY,IAAI;AAC9B,qBACE;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEC,WAAW,CAAC,CAAC;AAAA,kBACb,aAAa,UAAU,MAAM,aAAa,KAAK,IAAI;AAAA,kBACnD,WAAW,UAAU,MAAM,aAAa,IAAI,IAAI;AAAA,kBAChD,SAAS,cAAc,MAAM,YAAY,IAAI,IAAI;AAAA,kBACjD,WAAW,qEACT,cAAc,mCAAmC,EACnD,IAAI,cAAc,QAAQ,eAAe,EAAE;AAAA,kBAE1C,iBAAO,IAAI;AAAA,gBAAA;AAAA,gBATP;AAAA,cAAA;AAAA,YAYX,CAAC;AAAA,YAEA,QAAQ,WAAW,KAClB,oBAAC,OAAE,WAAU,2CACV,UAAA,QAAQ,YAAY,IAAA,CACvB;AAAA,UAAA,EAAA,CAEJ;AAAA,QAAA;AAAA,MAAA;AAAA,MA7EK,OAAO;AAAA,IAAA;AAAA,EAgFlB,CAAC,EAAA,CACH;AAEJ;"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useRef, useEffect } from "react";
|
|
3
|
+
import InfiniteScroll from "react-infinite-scroll-component";
|
|
4
|
+
import { useApi } from "../../../hooks/useApi.js";
|
|
5
|
+
import Spinner from "../../layout/Spinner/Spinner.js";
|
|
6
|
+
const LazyLoader = ({
|
|
7
|
+
endpoint,
|
|
8
|
+
params = {},
|
|
9
|
+
children,
|
|
10
|
+
scrollableTarget,
|
|
11
|
+
className = "",
|
|
12
|
+
height,
|
|
13
|
+
scrollThreshold = 0.8,
|
|
14
|
+
limit = 10
|
|
15
|
+
}) => {
|
|
16
|
+
const [items, setItems] = useState([]);
|
|
17
|
+
const [page, setPage] = useState(1);
|
|
18
|
+
const [hasMore, setHasMore] = useState(true);
|
|
19
|
+
const [resetKey, setResetKey] = useState(0);
|
|
20
|
+
const { request, loading, errors } = useApi();
|
|
21
|
+
const activeSession = useRef(0);
|
|
22
|
+
const abortControllerRef = useRef(null);
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
if (abortControllerRef.current) {
|
|
25
|
+
abortControllerRef.current.abort();
|
|
26
|
+
}
|
|
27
|
+
const newSession = resetKey + 1;
|
|
28
|
+
activeSession.current = newSession;
|
|
29
|
+
setResetKey(newSession);
|
|
30
|
+
setItems([]);
|
|
31
|
+
setPage(1);
|
|
32
|
+
setHasMore(true);
|
|
33
|
+
}, [endpoint, JSON.stringify(params)]);
|
|
34
|
+
const loadMoreItems = async () => {
|
|
35
|
+
if (!hasMore || loading) return;
|
|
36
|
+
const currentSession = activeSession.current;
|
|
37
|
+
const controller = new AbortController();
|
|
38
|
+
abortControllerRef.current = controller;
|
|
39
|
+
try {
|
|
40
|
+
const response = await request({
|
|
41
|
+
method: "get",
|
|
42
|
+
url: endpoint,
|
|
43
|
+
signal: controller.signal,
|
|
44
|
+
params: {
|
|
45
|
+
...params,
|
|
46
|
+
page,
|
|
47
|
+
limit
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
if (response && currentSession === activeSession.current) {
|
|
51
|
+
setItems((prev) => {
|
|
52
|
+
return [...prev, ...response];
|
|
53
|
+
});
|
|
54
|
+
setHasMore(response.length >= limit);
|
|
55
|
+
setPage((prev) => prev + 1);
|
|
56
|
+
}
|
|
57
|
+
} catch (error) {
|
|
58
|
+
if (error.name === "AbortError") {
|
|
59
|
+
console.log("Request aborted due to param change");
|
|
60
|
+
} else {
|
|
61
|
+
console.error("Load error", error);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
useEffect(() => {
|
|
66
|
+
loadMoreItems();
|
|
67
|
+
}, [resetKey]);
|
|
68
|
+
return /* @__PURE__ */ jsx(
|
|
69
|
+
InfiniteScroll,
|
|
70
|
+
{
|
|
71
|
+
dataLength: items.length,
|
|
72
|
+
next: loadMoreItems,
|
|
73
|
+
hasMore,
|
|
74
|
+
loader: /* @__PURE__ */ jsx(Spinner, {}),
|
|
75
|
+
scrollableTarget,
|
|
76
|
+
className,
|
|
77
|
+
style: { overflow: "hidden", height: "auto" },
|
|
78
|
+
height: scrollableTarget ? void 0 : height,
|
|
79
|
+
scrollThreshold,
|
|
80
|
+
children: children(items, loading, errors)
|
|
81
|
+
}
|
|
82
|
+
);
|
|
83
|
+
};
|
|
84
|
+
export {
|
|
85
|
+
LazyLoader
|
|
86
|
+
};
|
|
87
|
+
//# sourceMappingURL=LazyLoader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LazyLoader.js","sources":["../../../../../../src/legacy/components/organisms/LazyLoader/LazyLoader.tsx"],"sourcesContent":["import React, { ReactNode, useEffect, useRef, useState } from 'react'\r\nimport InfiniteScroll from 'react-infinite-scroll-component'\r\nimport { useApi } from '../../../hooks/useApi'\r\nimport Spinner from '../../layout/Spinner/Spinner'\r\n\r\ninterface LazyLoaderProps<T> {\r\n endpoint: string\r\n params?: Record<string, unknown>\r\n children: (items: T[], loading: boolean, error: ReactNode | null) => ReactNode\r\n scrollableTarget?: string\r\n className?: string\r\n height?: number | string\r\n scrollThreshold?: number | string\r\n limit?: number\r\n}\r\n\r\n/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nexport const LazyLoader = <T extends { id: string | number }>({\r\n endpoint,\r\n params = {},\r\n children,\r\n scrollableTarget,\r\n className = '',\r\n height,\r\n scrollThreshold = 0.8,\r\n limit = 10,\r\n}: LazyLoaderProps<T>) => {\r\n const [items, setItems] = useState<T[]>([])\r\n const [page, setPage] = useState(1)\r\n const [hasMore, setHasMore] = useState(true)\r\n const [resetKey, setResetKey] = useState(0)\r\n\r\n const { request, loading, errors } = useApi()\r\n const activeSession = useRef(0)\r\n const abortControllerRef = useRef<AbortController | null>(null)\r\n\r\n // Reset state when endpoint or params change\r\n useEffect(() => {\r\n // Abort any in-flight request\r\n if (abortControllerRef.current) {\r\n abortControllerRef.current.abort()\r\n }\r\n\r\n const newSession = resetKey + 1\r\n activeSession.current = newSession\r\n setResetKey(newSession)\r\n setItems([])\r\n setPage(1)\r\n setHasMore(true)\r\n }, [endpoint, JSON.stringify(params)])\r\n\r\n const loadMoreItems = async () => {\r\n if (!hasMore || loading) return\r\n\r\n const currentSession = activeSession.current\r\n const controller = new AbortController()\r\n abortControllerRef.current = controller\r\n\r\n try {\r\n const response = await request({\r\n method: 'get',\r\n url: endpoint,\r\n signal: controller.signal,\r\n params: {\r\n ...params,\r\n page,\r\n limit,\r\n },\r\n })\r\n\r\n if (response && currentSession === activeSession.current) {\r\n setItems((prev) => {\r\n return [...prev, ...response]\r\n })\r\n setHasMore(response.length >= limit)\r\n setPage((prev) => prev + 1)\r\n }\r\n } catch (error: any) {\r\n if (error.name === 'AbortError') {\r\n console.log('Request aborted due to param change')\r\n } else {\r\n console.error('Load error', error)\r\n }\r\n }\r\n }\r\n\r\n // Initial load when resetKey changes\r\n useEffect(() => {\r\n loadMoreItems()\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [resetKey])\r\n\r\n return (\r\n <InfiniteScroll\r\n dataLength={items.length}\r\n next={loadMoreItems}\r\n hasMore={hasMore}\r\n loader={<Spinner />}\r\n scrollableTarget={scrollableTarget}\r\n className={className}\r\n style={{ overflow: 'hidden', height: 'auto' }}\r\n height={scrollableTarget ? undefined : height}\r\n scrollThreshold={scrollThreshold}\r\n >\r\n {children(items, loading, errors)}\r\n </InfiniteScroll>\r\n )\r\n}\r\n"],"names":[],"mappings":";;;;;AAiBO,MAAM,aAAa,CAAoC;AAAA,EAC5D;AAAA,EACA,SAAS,CAAA;AAAA,EACT;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA,kBAAkB;AAAA,EAClB,QAAQ;AACV,MAA0B;AACxB,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAc,CAAA,CAAE;AAC1C,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,CAAC;AAClC,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,IAAI;AAC3C,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,CAAC;AAE1C,QAAM,EAAE,SAAS,SAAS,OAAA,IAAW,OAAA;AACrC,QAAM,gBAAgB,OAAO,CAAC;AAC9B,QAAM,qBAAqB,OAA+B,IAAI;AAG9D,YAAU,MAAM;AAEd,QAAI,mBAAmB,SAAS;AAC9B,yBAAmB,QAAQ,MAAA;AAAA,IAC7B;AAEA,UAAM,aAAa,WAAW;AAC9B,kBAAc,UAAU;AACxB,gBAAY,UAAU;AACtB,aAAS,CAAA,CAAE;AACX,YAAQ,CAAC;AACT,eAAW,IAAI;AAAA,EACjB,GAAG,CAAC,UAAU,KAAK,UAAU,MAAM,CAAC,CAAC;AAErC,QAAM,gBAAgB,YAAY;AAChC,QAAI,CAAC,WAAW,QAAS;AAEzB,UAAM,iBAAiB,cAAc;AACrC,UAAM,aAAa,IAAI,gBAAA;AACvB,uBAAmB,UAAU;AAE7B,QAAI;AACF,YAAM,WAAW,MAAM,QAAQ;AAAA,QAC7B,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,QAAQ,WAAW;AAAA,QACnB,QAAQ;AAAA,UACN,GAAG;AAAA,UACH;AAAA,UACA;AAAA,QAAA;AAAA,MACF,CACD;AAED,UAAI,YAAY,mBAAmB,cAAc,SAAS;AACxD,iBAAS,CAAC,SAAS;AACjB,iBAAO,CAAC,GAAG,MAAM,GAAG,QAAQ;AAAA,QAC9B,CAAC;AACD,mBAAW,SAAS,UAAU,KAAK;AACnC,gBAAQ,CAAC,SAAS,OAAO,CAAC;AAAA,MAC5B;AAAA,IACF,SAAS,OAAY;AACnB,UAAI,MAAM,SAAS,cAAc;AAC/B,gBAAQ,IAAI,qCAAqC;AAAA,MACnD,OAAO;AACL,gBAAQ,MAAM,cAAc,KAAK;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAGA,YAAU,MAAM;AACd,kBAAA;AAAA,EAEF,GAAG,CAAC,QAAQ,CAAC;AAEb,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,YAAY,MAAM;AAAA,MAClB,MAAM;AAAA,MACN;AAAA,MACA,4BAAS,SAAA,EAAQ;AAAA,MACjB;AAAA,MACA;AAAA,MACA,OAAO,EAAE,UAAU,UAAU,QAAQ,OAAA;AAAA,MACrC,QAAQ,mBAAmB,SAAY;AAAA,MACvC;AAAA,MAEC,UAAA,SAAS,OAAO,SAAS,MAAM;AAAA,IAAA;AAAA,EAAA;AAGtC;"}
|