@nextelco/common-ui 2.1.97 → 2.1.99
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/Escolha.d.ts +14 -2
- 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/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,24 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import ActionButton from "../../components/atoms/Button/variants/ActionButton.js";
|
|
3
|
+
import './NotFound.css';/* empty css */
|
|
4
|
+
import { faHome } from "@fortawesome/free-solid-svg-icons";
|
|
5
|
+
import { ActionButtonThemeStyled } from "../../styles/themes/ButtonThemes.js";
|
|
6
|
+
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
|
7
|
+
const NotFound = ({ handleHome }) => {
|
|
8
|
+
return /* @__PURE__ */ jsxs("div", { className: "cui-not-found", children: [
|
|
9
|
+
/* @__PURE__ */ jsx("h2", { children: "O que procuras não existe." }),
|
|
10
|
+
/* @__PURE__ */ jsx("div", { className: "cui-not-found-buttons", children: /* @__PURE__ */ jsx(
|
|
11
|
+
ActionButton,
|
|
12
|
+
{
|
|
13
|
+
icon: /* @__PURE__ */ jsx(FontAwesomeIcon, { icon: faHome }),
|
|
14
|
+
onClick: handleHome,
|
|
15
|
+
title: "Voltar à Página Principal",
|
|
16
|
+
theme: ActionButtonThemeStyled
|
|
17
|
+
}
|
|
18
|
+
) })
|
|
19
|
+
] });
|
|
20
|
+
};
|
|
21
|
+
export {
|
|
22
|
+
NotFound as default
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=NotFound.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NotFound.js","sources":["../../../../../src/legacy/pages/NotFound/NotFound.tsx"],"sourcesContent":["import React from 'react'\r\nimport ActionButton from '../../components/atoms/Button/variants/ActionButton'\r\n\r\nimport './NotFound.scss'\r\nimport { faHome } from '@fortawesome/free-solid-svg-icons'\r\nimport { ActionButtonThemeStyled } from '../../styles/themes/ButtonThemes'\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\r\n\r\ninterface NotFoundProps {\r\n handleHome: () => void\r\n}\r\n\r\n/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nconst NotFound: React.FC<NotFoundProps> = ({ handleHome }) => {\r\n return (\r\n <div className=\"cui-not-found\">\r\n <h2>O que procuras não existe.</h2>\r\n <div className=\"cui-not-found-buttons\">\r\n <ActionButton\r\n icon={<FontAwesomeIcon icon={faHome} />}\r\n onClick={handleHome}\r\n title=\"Voltar à Página Principal\"\r\n theme={ActionButtonThemeStyled}\r\n />\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport default NotFound\r\n"],"names":[],"mappings":";;;;;;AAaA,MAAM,WAAoC,CAAC,EAAE,iBAAiB;AAC5D,SACE,qBAAC,OAAA,EAAI,WAAU,iBACb,UAAA;AAAA,IAAA,oBAAC,QAAG,UAAA,6BAAA,CAA0B;AAAA,IAC9B,oBAAC,OAAA,EAAI,WAAU,yBACb,UAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAM,oBAAC,iBAAA,EAAgB,MAAM,OAAA,CAAQ;AAAA,QACrC,SAAS;AAAA,QACT,OAAM;AAAA,QACN,OAAO;AAAA,MAAA;AAAA,IAAA,EACT,CACF;AAAA,EAAA,GACF;AAEJ;"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { FontWeight } from "../../constants/FontWeight.js";
|
|
2
|
+
const ActionButtonThemeStyled = {
|
|
3
|
+
backgroundColor: "#F8F8F8",
|
|
4
|
+
fontColor: "#010060",
|
|
5
|
+
iconColor: "#010060",
|
|
6
|
+
size: "default",
|
|
7
|
+
fontWeight: FontWeight.MEDIUM
|
|
8
|
+
};
|
|
9
|
+
const IconButtonThemeStyled = {
|
|
10
|
+
backgroundColor: "#F8F8F8",
|
|
11
|
+
iconColor: "#010060",
|
|
12
|
+
size: "default"
|
|
13
|
+
};
|
|
14
|
+
const IconTextDarkThemeStyled = {
|
|
15
|
+
color: "#f8f8f8",
|
|
16
|
+
fontWeight: FontWeight.BOLD
|
|
17
|
+
};
|
|
18
|
+
const IconTextLightThemeStyled = {
|
|
19
|
+
color: "#010060",
|
|
20
|
+
fontWeight: FontWeight.BOLD
|
|
21
|
+
};
|
|
22
|
+
export {
|
|
23
|
+
ActionButtonThemeStyled,
|
|
24
|
+
IconButtonThemeStyled,
|
|
25
|
+
IconTextDarkThemeStyled,
|
|
26
|
+
IconTextLightThemeStyled
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=ButtonThemes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ButtonThemes.js","sources":["../../../../../src/legacy/styles/themes/ButtonThemes.tsx"],"sourcesContent":["import { FontWeight } from '../../constants/FontWeight'\r\nimport { IconTextTheme } from '../../exports/types'\r\nimport {\r\n ActionButtonTheme,\r\n IconButtonTheme,\r\n} from '../../types/themes/ButtonThemes'\r\n\r\nexport const ActionButtonThemeStyled: ActionButtonTheme = {\r\n backgroundColor: '#F8F8F8',\r\n fontColor: '#010060',\r\n iconColor: '#010060',\r\n size: 'default',\r\n fontWeight: FontWeight.MEDIUM,\r\n}\r\n\r\nexport const IconButtonThemeStyled: IconButtonTheme = {\r\n backgroundColor: '#F8F8F8',\r\n iconColor: '#010060',\r\n size: 'default',\r\n}\r\n\r\nexport const IconTextDarkThemeStyled: IconTextTheme = {\r\n color: '#f8f8f8',\r\n fontWeight: FontWeight.BOLD,\r\n}\r\n\r\nexport const IconTextLightThemeStyled: IconTextTheme = {\r\n color: '#010060',\r\n fontWeight: FontWeight.BOLD,\r\n}\r\n"],"names":[],"mappings":";AAOO,MAAM,0BAA6C;AAAA,EACxD,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,WAAW;AAAA,EACX,MAAM;AAAA,EACN,YAAY,WAAW;AACzB;AAEO,MAAM,wBAAyC;AAAA,EACpD,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,MAAM;AACR;AAEO,MAAM,0BAAyC;AAAA,EACpD,OAAO;AAAA,EACP,YAAY,WAAW;AACzB;AAEO,MAAM,2BAA0C;AAAA,EACrD,OAAO;AAAA,EACP,YAAY,WAAW;AACzB;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../../../src/legacy/styles/utils/utils.ts"],"sourcesContent":["/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nexport const getCSSVariable = (variable: string) => {\r\n return getComputedStyle(document.documentElement)\r\n .getPropertyValue(variable)\r\n .trim()\r\n}\r\n"],"names":[],"mappings":"AACO,MAAM,iBAAiB,CAAC,aAAqB;AAClD,SAAO,iBAAiB,SAAS,eAAe,EAC7C,iBAAiB,QAAQ,EACzB,KAAA;AACL;"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
function getAcronym(str) {
|
|
2
|
+
const words = str.split(" ");
|
|
3
|
+
const firstLetter = words[0] ? words[0].charAt(0).toUpperCase() : "";
|
|
4
|
+
const lastLetter = words.length > 1 ? words[words.length - 1].charAt(0).toUpperCase() : "";
|
|
5
|
+
const result = firstLetter + lastLetter;
|
|
6
|
+
return result;
|
|
7
|
+
}
|
|
8
|
+
function getFirstAndLastName(str) {
|
|
9
|
+
const words = str.split(" ");
|
|
10
|
+
let firstAndLast = "";
|
|
11
|
+
if (words.length > 0) {
|
|
12
|
+
firstAndLast += words[0];
|
|
13
|
+
if (words.length > 1) {
|
|
14
|
+
firstAndLast += " ";
|
|
15
|
+
firstAndLast += words[words.length - 1];
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return firstAndLast;
|
|
19
|
+
}
|
|
20
|
+
function normalize(string) {
|
|
21
|
+
return string.normalize("NFD").replace(/[\u0300-\u036f]/g, "").toLowerCase();
|
|
22
|
+
}
|
|
23
|
+
function partialMatchWithUsername(search, username) {
|
|
24
|
+
if (search === "") return true;
|
|
25
|
+
const names = normalize(username).split(" ");
|
|
26
|
+
const searchNames = normalize(search).split(" ");
|
|
27
|
+
const matchAllNames = searchNames.every((searchName) => names.some((n) => n.includes(searchName)));
|
|
28
|
+
return matchAllNames;
|
|
29
|
+
}
|
|
30
|
+
export {
|
|
31
|
+
getAcronym,
|
|
32
|
+
getFirstAndLastName,
|
|
33
|
+
partialMatchWithUsername
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=stringUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stringUtils.js","sources":["../../../../src/legacy/utils/stringUtils.ts"],"sourcesContent":["\r\n// Returns acronym from string\r\n/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nexport function getAcronym(str: string) {\r\n const words = str.split(' ')\r\n const firstLetter = words[0] ? words[0].charAt(0).toUpperCase() : ''\r\n const lastLetter = words.length > 1 ? words[words.length - 1].charAt(0).toUpperCase() : ''\r\n const result = firstLetter + lastLetter\r\n\r\n return result\r\n}\r\n\r\n/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nexport function getFirstAndLastName(str: string) {\r\n const words = str.split(' ')\r\n let firstAndLast = ''\r\n\r\n if (words.length > 0) {\r\n firstAndLast += words[0]\r\n if (words.length > 1) {\r\n firstAndLast += \" \"\r\n firstAndLast += words[words.length - 1]\r\n }\r\n }\r\n\r\n return firstAndLast\r\n}\r\n\r\nfunction normalize(string: string) {\r\n return string.normalize(\"NFD\").replace(/[\\u0300-\\u036f]/g, \"\").toLowerCase()\r\n}\r\n\r\n/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nexport function partialMatchWithUsername(search: string, username: string) {\r\n if (search === \"\") return true\r\n const names = normalize(username).split(\" \")\r\n const searchNames = normalize(search).split(\" \")\r\n\r\n const matchAllNames = searchNames.every(searchName => names.some(n => n.includes(searchName)))\r\n\r\n return matchAllNames\r\n}"],"names":[],"mappings":"AAGO,SAAS,WAAW,KAAa;AACpC,QAAM,QAAQ,IAAI,MAAM,GAAG;AAC3B,QAAM,cAAc,MAAM,CAAC,IAAI,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,YAAA,IAAgB;AAClE,QAAM,aAAa,MAAM,SAAS,IAAI,MAAM,MAAM,SAAS,CAAC,EAAE,OAAO,CAAC,EAAE,gBAAgB;AACxF,QAAM,SAAS,cAAc;AAE7B,SAAO;AACX;AAGO,SAAS,oBAAoB,KAAa;AAC7C,QAAM,QAAQ,IAAI,MAAM,GAAG;AAC3B,MAAI,eAAe;AAEnB,MAAI,MAAM,SAAS,GAAG;AAClB,oBAAgB,MAAM,CAAC;AACvB,QAAI,MAAM,SAAS,GAAG;AAClB,sBAAgB;AAChB,sBAAgB,MAAM,MAAM,SAAS,CAAC;AAAA,IAC1C;AAAA,EACJ;AAEA,SAAO;AACX;AAEA,SAAS,UAAU,QAAgB;AAC/B,SAAO,OAAO,UAAU,KAAK,EAAE,QAAQ,oBAAoB,EAAE,EAAE,YAAA;AACnE;AAGO,SAAS,yBAAyB,QAAgB,UAAkB;AACvE,MAAI,WAAW,GAAI,QAAO;AAC1B,QAAM,QAAQ,UAAU,QAAQ,EAAE,MAAM,GAAG;AAC3C,QAAM,cAAc,UAAU,MAAM,EAAE,MAAM,GAAG;AAE/C,QAAM,gBAAgB,YAAY,MAAM,CAAA,eAAc,MAAM,KAAK,CAAA,MAAK,EAAE,SAAS,UAAU,CAAC,CAAC;AAE7F,SAAO;AACX;"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { loadPdfjs } from "../../../primitives/documents/PdfPreview/pdfjs.js";
|
|
2
|
+
let wasmUrl = null;
|
|
3
|
+
let enginesPromise = null;
|
|
4
|
+
function configureQRScanner(options) {
|
|
5
|
+
wasmUrl = options.wasmUrl;
|
|
6
|
+
}
|
|
7
|
+
function loadEngines() {
|
|
8
|
+
if (!enginesPromise) {
|
|
9
|
+
enginesPromise = Promise.all([import("qr-scanner"), import("zxing-wasm/reader"), import("@zxing/library")]).then(([qrScanner, zxingWasm, zxingJs]) => {
|
|
10
|
+
if (wasmUrl) {
|
|
11
|
+
const url = wasmUrl;
|
|
12
|
+
zxingWasm.prepareZXingModule({ overrides: { locateFile: (path, prefix) => path.endsWith(".wasm") ? url : prefix + path } });
|
|
13
|
+
}
|
|
14
|
+
return { QrScanner: qrScanner.default, readBarcodes: zxingWasm.readBarcodes, zxingJs };
|
|
15
|
+
}).catch((e) => {
|
|
16
|
+
enginesPromise = null;
|
|
17
|
+
throw e;
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
return enginesPromise;
|
|
21
|
+
}
|
|
22
|
+
const UPSCALE_TARGET = 800;
|
|
23
|
+
const BINARIZERS = ["LocalAverage", "GlobalHistogram", "FixedThreshold"];
|
|
24
|
+
function loadImage(file) {
|
|
25
|
+
return new Promise((resolve, reject) => {
|
|
26
|
+
const img = new Image();
|
|
27
|
+
const url = URL.createObjectURL(file);
|
|
28
|
+
img.onload = () => {
|
|
29
|
+
URL.revokeObjectURL(url);
|
|
30
|
+
resolve(img);
|
|
31
|
+
};
|
|
32
|
+
img.onerror = () => {
|
|
33
|
+
URL.revokeObjectURL(url);
|
|
34
|
+
reject(new Error("Imagem ilegível"));
|
|
35
|
+
};
|
|
36
|
+
img.src = url;
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
async function drawVariant(file, contrast) {
|
|
40
|
+
const img = await loadImage(file);
|
|
41
|
+
const scale = Math.max(1, UPSCALE_TARGET / Math.min(img.naturalWidth, img.naturalHeight));
|
|
42
|
+
const canvas = document.createElement("canvas");
|
|
43
|
+
canvas.width = Math.round(img.naturalWidth * scale);
|
|
44
|
+
canvas.height = Math.round(img.naturalHeight * scale);
|
|
45
|
+
const ctx = canvas.getContext("2d", { willReadFrequently: true });
|
|
46
|
+
ctx.imageSmoothingEnabled = true;
|
|
47
|
+
ctx.imageSmoothingQuality = "high";
|
|
48
|
+
ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
|
|
49
|
+
if (contrast) {
|
|
50
|
+
const d = ctx.getImageData(0, 0, canvas.width, canvas.height);
|
|
51
|
+
const px = d.data;
|
|
52
|
+
for (let i = 0; i < px.length; i += 4) {
|
|
53
|
+
const g = 0.299 * px[i] + 0.587 * px[i + 1] + 0.114 * px[i + 2];
|
|
54
|
+
px[i] = px[i + 1] = px[i + 2] = Math.max(0, Math.min(255, 128 + contrast * (g - 128)));
|
|
55
|
+
}
|
|
56
|
+
ctx.putImageData(d, 0, 0);
|
|
57
|
+
}
|
|
58
|
+
return canvas;
|
|
59
|
+
}
|
|
60
|
+
const pixels = (canvas) => canvas.getContext("2d", { willReadFrequently: true }).getImageData(0, 0, canvas.width, canvas.height);
|
|
61
|
+
async function renderPdfFirstPage(file) {
|
|
62
|
+
const { getDocument } = await loadPdfjs();
|
|
63
|
+
const pdf = await getDocument({ data: new Uint8Array(await file.arrayBuffer()) }).promise;
|
|
64
|
+
try {
|
|
65
|
+
const page = await pdf.getPage(1);
|
|
66
|
+
const base = page.getViewport({ scale: 1 });
|
|
67
|
+
const viewport = page.getViewport({ scale: Math.min(4, Math.max(1, 2200 / Math.max(base.width, base.height))) });
|
|
68
|
+
const canvas = document.createElement("canvas");
|
|
69
|
+
canvas.width = Math.ceil(viewport.width);
|
|
70
|
+
canvas.height = Math.ceil(viewport.height);
|
|
71
|
+
const ctx = canvas.getContext("2d", { willReadFrequently: true });
|
|
72
|
+
ctx.fillStyle = "#fff";
|
|
73
|
+
ctx.fillRect(0, 0, canvas.width, canvas.height);
|
|
74
|
+
await page.render({ canvasContext: ctx, viewport }).promise;
|
|
75
|
+
return await new Promise((resolve, reject) => canvas.toBlob((b) => b ? resolve(b) : reject(new Error("toBlob falhou")), "image/png"));
|
|
76
|
+
} finally {
|
|
77
|
+
pdf.destroy();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
async function scanQRCodes(file, options = {}) {
|
|
81
|
+
const until = options.until ?? (() => true);
|
|
82
|
+
const { QrScanner, readBarcodes, zxingJs } = await loadEngines();
|
|
83
|
+
let source = file;
|
|
84
|
+
if (file.type === "application/pdf") {
|
|
85
|
+
try {
|
|
86
|
+
source = await renderPdfFirstPage(file);
|
|
87
|
+
} catch {
|
|
88
|
+
return [];
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
const codes = [];
|
|
92
|
+
const add = (text) => {
|
|
93
|
+
if (text && !codes.includes(text)) codes.push(text);
|
|
94
|
+
};
|
|
95
|
+
const done = () => codes.some(until);
|
|
96
|
+
const qrScanner = async (input) => {
|
|
97
|
+
try {
|
|
98
|
+
add((await QrScanner.scanImage(input, { returnDetailedScanResult: true })).data);
|
|
99
|
+
} catch {
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
const zxingWasm = async (input, all = false) => {
|
|
103
|
+
for (const binarizer of BINARIZERS) {
|
|
104
|
+
try {
|
|
105
|
+
const texts = (await readBarcodes(input, { formats: ["QRCode"], tryHarder: true, tryDenoise: true, binarizer })).filter((r) => r.isValid).map((r) => r.text);
|
|
106
|
+
texts.forEach(add);
|
|
107
|
+
if (texts.length && !all) return;
|
|
108
|
+
} catch {
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
const zxingJsDecode = (canvas) => {
|
|
113
|
+
try {
|
|
114
|
+
const { data, width, height } = pixels(canvas);
|
|
115
|
+
const bitmap = new zxingJs.BinaryBitmap(new zxingJs.HybridBinarizer(new zxingJs.RGBLuminanceSource(data, width, height)));
|
|
116
|
+
add(new zxingJs.MultiFormatReader().decode(bitmap).getText());
|
|
117
|
+
} catch {
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
let upscaled = null;
|
|
121
|
+
const collectRemaining = async () => {
|
|
122
|
+
await zxingWasm(source, true);
|
|
123
|
+
upscaled ??= await drawVariant(source).catch(() => null);
|
|
124
|
+
if (upscaled) await zxingWasm(pixels(upscaled), true);
|
|
125
|
+
return codes;
|
|
126
|
+
};
|
|
127
|
+
try {
|
|
128
|
+
await qrScanner(source);
|
|
129
|
+
if (done()) return collectRemaining();
|
|
130
|
+
await zxingWasm(source);
|
|
131
|
+
if (done()) return collectRemaining();
|
|
132
|
+
upscaled = await drawVariant(source);
|
|
133
|
+
await qrScanner(upscaled);
|
|
134
|
+
if (done()) return collectRemaining();
|
|
135
|
+
await zxingWasm(pixels(upscaled));
|
|
136
|
+
if (done()) return collectRemaining();
|
|
137
|
+
zxingJsDecode(upscaled);
|
|
138
|
+
if (done()) return collectRemaining();
|
|
139
|
+
for (const contrast of [2.5, 5]) {
|
|
140
|
+
const canvas = await drawVariant(source, contrast);
|
|
141
|
+
await qrScanner(canvas);
|
|
142
|
+
if (done()) return collectRemaining();
|
|
143
|
+
await zxingWasm(pixels(canvas));
|
|
144
|
+
if (done()) return collectRemaining();
|
|
145
|
+
zxingJsDecode(canvas);
|
|
146
|
+
if (done()) return collectRemaining();
|
|
147
|
+
}
|
|
148
|
+
} catch {
|
|
149
|
+
return codes;
|
|
150
|
+
}
|
|
151
|
+
return codes.length ? collectRemaining() : codes;
|
|
152
|
+
}
|
|
153
|
+
export {
|
|
154
|
+
configureQRScanner,
|
|
155
|
+
scanQRCodes
|
|
156
|
+
};
|
|
157
|
+
//# sourceMappingURL=scanQRCodes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanQRCodes.js","sources":["../../../../../../src/v1/capabilities/documents/QRScanning/scanQRCodes.ts"],"sourcesContent":["/**\r\n * Leitura de QR codes em imagens e PDFs, no browser.\r\n *\r\n * Só encontra os códigos e devolve o texto de cada um; o que fazer com eles\r\n * (ex: interpretar o QR de uma fatura) é da app.\r\n *\r\n * Adaptado de uma app interna. Os leitores\r\n * automáticos falham em imagens de baixa resolução (miniaturas arrastadas do\r\n * email ou do explorador), por isso tenta-se, por ordem do mais rápido ao mais\r\n * lento, três motores sobre quatro versões da imagem:\r\n * - motores: qr-scanner, zxing-wasm (3 estratégias de binarização) e\r\n * @zxing/library (o mais lento, último recurso);\r\n * - imagem: original, ampliada, e ampliada a cinzento com contraste ×2,5 e ×5.\r\n * Os PDFs são primeiro desenhados (1.ª página) e lidos como imagem.\r\n *\r\n * As bibliotecas (~1 MB, com o WebAssembly) só são carregadas na primeira leitura.\r\n */\r\nimport { loadPdfjs } from '../../../primitives/documents/PdfPreview/pdfjs'\r\n\r\nexport interface ScanQRCodesOptions {\r\n /**\r\n * Continuar a procurar até um código satisfazer esta condição (ex: ser o QR\r\n * de uma fatura). Um documento pode ter vários QR codes e o primeiro a ser\r\n * lido é arbitrário. Por omissão, pára no primeiro código encontrado.\r\n */\r\n until?: (code: string) => boolean\r\n}\r\n\r\nlet wasmUrl: string | null = null\r\nlet enginesPromise: Promise<Engines> | null = null\r\n\r\n/**\r\n * Indica onde está o `zxing_reader.wasm` servido pela app. Chamar uma vez no\r\n * arranque, antes da primeira leitura. Sem isto, o ficheiro é descarregado da\r\n * CDN jsDelivr (pode ser bloqueado por redes ou políticas de segurança).\r\n */\r\nexport function configureQRScanner(options: { wasmUrl: string }) {\r\n wasmUrl = options.wasmUrl\r\n}\r\n\r\ntype Engines = {\r\n QrScanner: typeof import('qr-scanner').default\r\n readBarcodes: typeof import('zxing-wasm/reader').readBarcodes\r\n zxingJs: typeof import('@zxing/library')\r\n}\r\n\r\nfunction loadEngines(): Promise<Engines> {\r\n if (!enginesPromise) {\r\n enginesPromise = Promise.all([import('qr-scanner'), import('zxing-wasm/reader'), import('@zxing/library')])\r\n .then(([qrScanner, zxingWasm, zxingJs]) => {\r\n if (wasmUrl) {\r\n const url = wasmUrl\r\n zxingWasm.prepareZXingModule({ overrides: { locateFile: (path: string, prefix: string) => (path.endsWith('.wasm') ? url : prefix + path) } })\r\n }\r\n return { QrScanner: qrScanner.default, readBarcodes: zxingWasm.readBarcodes, zxingJs }\r\n })\r\n .catch((e) => {\r\n enginesPromise = null\r\n throw e\r\n })\r\n }\r\n return enginesPromise\r\n}\r\n\r\n// Abaixo deste lado mais curto (px), a imagem é ampliada antes de ler.\r\nconst UPSCALE_TARGET = 800\r\nconst BINARIZERS = ['LocalAverage', 'GlobalHistogram', 'FixedThreshold'] as const\r\n\r\nfunction loadImage(file: Blob): Promise<HTMLImageElement> {\r\n return new Promise((resolve, reject) => {\r\n const img = new Image()\r\n const url = URL.createObjectURL(file)\r\n img.onload = () => {\r\n URL.revokeObjectURL(url)\r\n resolve(img)\r\n }\r\n img.onerror = () => {\r\n URL.revokeObjectURL(url)\r\n reject(new Error('Imagem ilegível'))\r\n }\r\n img.src = url\r\n })\r\n}\r\n\r\n/** Imagem ampliada; com `contrast`, também a cinzento com o contraste esticado à volta de 128. */\r\nasync function drawVariant(file: Blob, contrast?: number): Promise<HTMLCanvasElement> {\r\n const img = await loadImage(file)\r\n const scale = Math.max(1, UPSCALE_TARGET / Math.min(img.naturalWidth, img.naturalHeight))\r\n const canvas = document.createElement('canvas')\r\n canvas.width = Math.round(img.naturalWidth * scale)\r\n canvas.height = Math.round(img.naturalHeight * scale)\r\n const ctx = canvas.getContext('2d', { willReadFrequently: true })!\r\n ctx.imageSmoothingEnabled = true\r\n ctx.imageSmoothingQuality = 'high'\r\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height)\r\n if (contrast) {\r\n const d = ctx.getImageData(0, 0, canvas.width, canvas.height)\r\n const px = d.data\r\n for (let i = 0; i < px.length; i += 4) {\r\n const g = 0.299 * px[i] + 0.587 * px[i + 1] + 0.114 * px[i + 2]\r\n px[i] = px[i + 1] = px[i + 2] = Math.max(0, Math.min(255, 128 + contrast * (g - 128)))\r\n }\r\n ctx.putImageData(d, 0, 0)\r\n }\r\n return canvas\r\n}\r\n\r\nconst pixels = (canvas: HTMLCanvasElement) => canvas.getContext('2d', { willReadFrequently: true })!.getImageData(0, 0, canvas.width, canvas.height)\r\n\r\n/** 1.ª página do PDF como PNG, numa escala que mantém o QR legível (lado maior ≈ 2200 px). */\r\nasync function renderPdfFirstPage(file: File): Promise<Blob> {\r\n const { getDocument } = await loadPdfjs()\r\n const pdf = await getDocument({ data: new Uint8Array(await file.arrayBuffer()) }).promise\r\n try {\r\n const page = await pdf.getPage(1)\r\n const base = page.getViewport({ scale: 1 })\r\n const viewport = page.getViewport({ scale: Math.min(4, Math.max(1, 2200 / Math.max(base.width, base.height))) })\r\n const canvas = document.createElement('canvas')\r\n canvas.width = Math.ceil(viewport.width)\r\n canvas.height = Math.ceil(viewport.height)\r\n const ctx = canvas.getContext('2d', { willReadFrequently: true })!\r\n ctx.fillStyle = '#fff'\r\n ctx.fillRect(0, 0, canvas.width, canvas.height)\r\n await page.render({ canvasContext: ctx, viewport }).promise\r\n return await new Promise<Blob>((resolve, reject) => canvas.toBlob((b) => (b ? resolve(b) : reject(new Error('toBlob falhou'))), 'image/png'))\r\n } finally {\r\n pdf.destroy()\r\n }\r\n}\r\n\r\n/**\r\n * Lê os QR codes de uma imagem ou PDF (1.ª página).\r\n *\r\n * Devolve o texto de cada código encontrado, sem repetidos, pela ordem em que\r\n * foram lidos; vazio se não houver nenhum ou se o ficheiro não se puder ler.\r\n * Depois de encontrar o que procura, faz ainda uma passagem para recolher os\r\n * outros códigos da página (ex: QR do banco ao lado do QR fiscal).\r\n */\r\nexport async function scanQRCodes(file: File, options: ScanQRCodesOptions = {}): Promise<string[]> {\r\n const until = options.until ?? (() => true)\r\n const { QrScanner, readBarcodes, zxingJs } = await loadEngines()\r\n\r\n let source: Blob = file\r\n if (file.type === 'application/pdf') {\r\n try {\r\n source = await renderPdfFirstPage(file)\r\n } catch {\r\n return []\r\n }\r\n }\r\n\r\n const codes: string[] = []\r\n const add = (text: string | null | undefined) => {\r\n if (text && !codes.includes(text)) codes.push(text)\r\n }\r\n const done = () => codes.some(until)\r\n\r\n const qrScanner = async (input: Blob | HTMLCanvasElement) => {\r\n try {\r\n add((await QrScanner.scanImage(input, { returnDetailedScanResult: true })).data)\r\n } catch {\r\n /* nada encontrado */\r\n }\r\n }\r\n // O único motor que devolve todos os códigos da imagem. `all`: correr todas as\r\n // estratégias e juntar o que cada uma encontra (uma pode ver um código e falhar outro).\r\n const zxingWasm = async (input: Blob | ImageData, all = false) => {\r\n for (const binarizer of BINARIZERS) {\r\n try {\r\n const texts = (await readBarcodes(input, { formats: ['QRCode'], tryHarder: true, tryDenoise: true, binarizer }))\r\n .filter((r) => r.isValid)\r\n .map((r) => r.text)\r\n texts.forEach(add)\r\n if (texts.length && !all) return\r\n } catch {\r\n /* estratégia seguinte */\r\n }\r\n }\r\n }\r\n const zxingJsDecode = (canvas: HTMLCanvasElement) => {\r\n try {\r\n const { data, width, height } = pixels(canvas)\r\n const bitmap = new zxingJs.BinaryBitmap(new zxingJs.HybridBinarizer(new zxingJs.RGBLuminanceSource(data, width, height)))\r\n add(new zxingJs.MultiFormatReader().decode(bitmap).getText())\r\n } catch {\r\n /* nada encontrado */\r\n }\r\n }\r\n\r\n let upscaled: HTMLCanvasElement | null = null\r\n const collectRemaining = async () => {\r\n await zxingWasm(source, true)\r\n upscaled ??= await drawVariant(source).catch(() => null)\r\n if (upscaled) await zxingWasm(pixels(upscaled), true)\r\n return codes\r\n }\r\n\r\n try {\r\n // 1–2. Original: o mais rápido primeiro.\r\n await qrScanner(source)\r\n if (done()) return collectRemaining()\r\n await zxingWasm(source)\r\n if (done()) return collectRemaining()\r\n\r\n // 3. Ampliada (cores intactas): ajuda nas miniaturas.\r\n upscaled = await drawVariant(source)\r\n await qrScanner(upscaled)\r\n if (done()) return collectRemaining()\r\n await zxingWasm(pixels(upscaled))\r\n if (done()) return collectRemaining()\r\n zxingJsDecode(upscaled)\r\n if (done()) return collectRemaining()\r\n\r\n // 4. Ampliada a cinzento com contraste: para imagens difíceis.\r\n for (const contrast of [2.5, 5]) {\r\n const canvas = await drawVariant(source, contrast)\r\n await qrScanner(canvas)\r\n if (done()) return collectRemaining()\r\n await zxingWasm(pixels(canvas))\r\n if (done()) return collectRemaining()\r\n zxingJsDecode(canvas)\r\n if (done()) return collectRemaining()\r\n }\r\n } catch {\r\n // Imagem ilegível: devolve o que já tiver encontrado.\r\n return codes\r\n }\r\n\r\n return codes.length ? collectRemaining() : codes\r\n}\r\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import React, { useRef, useState, useEffect } from "react";
|
|
3
|
+
import PdfPreview from "../../../primitives/documents/PdfPreview/PdfPreview.js";
|
|
4
|
+
const EXT_TYPES = {
|
|
5
|
+
".pdf": ["application/pdf"],
|
|
6
|
+
".jpg": ["image/jpeg"],
|
|
7
|
+
".jpeg": ["image/jpeg"],
|
|
8
|
+
".png": ["image/png"],
|
|
9
|
+
".webp": ["image/webp"],
|
|
10
|
+
".gif": ["image/gif"],
|
|
11
|
+
".heic": ["image/heic"],
|
|
12
|
+
".svg": ["image/svg+xml"],
|
|
13
|
+
".doc": ["application/msword"],
|
|
14
|
+
".docx": ["application/vnd.openxmlformats-officedocument.wordprocessingml.document"],
|
|
15
|
+
".xls": ["application/vnd.ms-excel"],
|
|
16
|
+
".xlsx": ["application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"],
|
|
17
|
+
".csv": ["text/csv", "application/vnd.ms-excel"],
|
|
18
|
+
".txt": ["text/plain"],
|
|
19
|
+
".zip": ["application/zip", "application/x-zip-compressed"]
|
|
20
|
+
};
|
|
21
|
+
function acceptsType(type, accept) {
|
|
22
|
+
const rules = (accept ?? "").split(",").map((s) => s.trim().toLowerCase()).filter(Boolean);
|
|
23
|
+
if (rules.length === 0) return true;
|
|
24
|
+
const t = type.toLowerCase();
|
|
25
|
+
if (!t) return null;
|
|
26
|
+
let unknown = false;
|
|
27
|
+
for (const rule of rules) {
|
|
28
|
+
if (rule.startsWith(".")) {
|
|
29
|
+
const types = EXT_TYPES[rule];
|
|
30
|
+
if (!types) unknown = true;
|
|
31
|
+
else if (types.includes(t)) return true;
|
|
32
|
+
} else if (rule.endsWith("/*")) {
|
|
33
|
+
if (t.startsWith(rule.slice(0, -1))) return true;
|
|
34
|
+
} else if (t === rule) return true;
|
|
35
|
+
}
|
|
36
|
+
return unknown ? null : false;
|
|
37
|
+
}
|
|
38
|
+
function accepts(file, accept) {
|
|
39
|
+
if (!accept) return true;
|
|
40
|
+
const name = file.name.toLowerCase();
|
|
41
|
+
const type = file.type.toLowerCase();
|
|
42
|
+
const rules = accept.split(",").map((s) => s.trim().toLowerCase()).filter(Boolean);
|
|
43
|
+
if (rules.length === 0) return true;
|
|
44
|
+
return rules.some((rule) => {
|
|
45
|
+
if (rule.startsWith(".")) return name.endsWith(rule);
|
|
46
|
+
if (rule.endsWith("/*")) return type.startsWith(rule.slice(0, -1));
|
|
47
|
+
return type === rule;
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
function UploadIcon() {
|
|
51
|
+
return /* @__PURE__ */ jsxs("svg", { width: "36", height: "36", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.9", "aria-hidden": true, children: [
|
|
52
|
+
/* @__PURE__ */ jsx("path", { d: "M12 15V4M7.5 8.5L12 4l4.5 4.5", strokeLinecap: "round", strokeLinejoin: "round" }),
|
|
53
|
+
/* @__PURE__ */ jsx("path", { d: "M4.5 14v3.5a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V14", strokeLinecap: "round", strokeLinejoin: "round" })
|
|
54
|
+
] });
|
|
55
|
+
}
|
|
56
|
+
function DocumentIcon({ size }) {
|
|
57
|
+
return /* @__PURE__ */ jsxs("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.8", "aria-hidden": true, children: [
|
|
58
|
+
/* @__PURE__ */ jsx("path", { d: "M14 2H7a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7z", strokeLinecap: "round", strokeLinejoin: "round" }),
|
|
59
|
+
/* @__PURE__ */ jsx("path", { d: "M14 2v5h5", strokeLinecap: "round", strokeLinejoin: "round" })
|
|
60
|
+
] });
|
|
61
|
+
}
|
|
62
|
+
function ImageIcon() {
|
|
63
|
+
return /* @__PURE__ */ jsxs("svg", { width: "17", height: "17", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.8", "aria-hidden": true, children: [
|
|
64
|
+
/* @__PURE__ */ jsx("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2" }),
|
|
65
|
+
/* @__PURE__ */ jsx("circle", { cx: "8.5", cy: "8.5", r: "1.5" }),
|
|
66
|
+
/* @__PURE__ */ jsx("path", { d: "M21 15l-5-5L4 20", strokeLinecap: "round", strokeLinejoin: "round" })
|
|
67
|
+
] });
|
|
68
|
+
}
|
|
69
|
+
function FileTypeIcon({ label, size = 20 }) {
|
|
70
|
+
const id = React.useId();
|
|
71
|
+
return /* @__PURE__ */ jsxs("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.7", "aria-hidden": true, children: [
|
|
72
|
+
/* @__PURE__ */ jsxs("mask", { id: `${id}-doc`, stroke: "none", children: [
|
|
73
|
+
/* @__PURE__ */ jsx("rect", { width: "24", height: "24", fill: "#fff" }),
|
|
74
|
+
/* @__PURE__ */ jsx("rect", { x: "1", y: "11", width: "17", height: "9.5", rx: "2", fill: "#000" })
|
|
75
|
+
] }),
|
|
76
|
+
/* @__PURE__ */ jsxs("mask", { id: `${id}-label`, stroke: "none", children: [
|
|
77
|
+
/* @__PURE__ */ jsx("rect", { x: "2", y: "12", width: "15", height: "7.5", rx: "1.6", fill: "#fff" }),
|
|
78
|
+
/* @__PURE__ */ jsx("text", { x: "9.5", y: "17.9", textAnchor: "middle", fontFamily: "Arial, Helvetica, sans-serif", fontWeight: "700", fontSize: "6", fill: "#000", children: label })
|
|
79
|
+
] }),
|
|
80
|
+
/* @__PURE__ */ jsxs("g", { mask: `url(#${id}-doc)`, children: [
|
|
81
|
+
/* @__PURE__ */ jsx("path", { d: "M14 2H7a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7z", strokeLinejoin: "round" }),
|
|
82
|
+
/* @__PURE__ */ jsx("path", { d: "M14 2v5h5", strokeLinejoin: "round" })
|
|
83
|
+
] }),
|
|
84
|
+
/* @__PURE__ */ jsx("rect", { x: "2", y: "12", width: "15", height: "7.5", rx: "1.6", fill: "currentColor", stroke: "none", mask: `url(#${id}-label)` })
|
|
85
|
+
] });
|
|
86
|
+
}
|
|
87
|
+
const spreadsheetLabel = (file) => /.csv$/i.test(file.name) || file.type.toLowerCase() === "text/csv" ? "CSV" : "XLS";
|
|
88
|
+
const isPdf = (file) => file.type === "application/pdf";
|
|
89
|
+
const SPREADSHEET_TYPES = [
|
|
90
|
+
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
|
91
|
+
"application/vnd.ms-excel.sheet.macroenabled.12",
|
|
92
|
+
"application/vnd.ms-excel",
|
|
93
|
+
"text/csv"
|
|
94
|
+
];
|
|
95
|
+
const isSpreadsheet = (file) => /\.(xlsx|xlsm|xls|csv)$/i.test(file.name) || SPREADSHEET_TYPES.includes(file.type.toLowerCase());
|
|
96
|
+
function DefaultPreview({ file, url }) {
|
|
97
|
+
if (file.type.startsWith("image/")) {
|
|
98
|
+
return /* @__PURE__ */ jsx("img", { src: url, alt: file.name, className: "block max-h-full max-w-full object-contain p-3" });
|
|
99
|
+
}
|
|
100
|
+
if (isPdf(file)) {
|
|
101
|
+
return /* @__PURE__ */ jsx(PdfPreview, { file, label: file.name });
|
|
102
|
+
}
|
|
103
|
+
return /* @__PURE__ */ jsx("div", { className: "flex h-24 w-24 items-center justify-center rounded-3xl bg-primary text-primary-foreground shadow-tile", children: isSpreadsheet(file) ? /* @__PURE__ */ jsx(FileTypeIcon, { label: spreadsheetLabel(file), size: 42 }) : /* @__PURE__ */ jsx(DocumentIcon, { size: 42 }) });
|
|
104
|
+
}
|
|
105
|
+
function DocumentDropzone({
|
|
106
|
+
file,
|
|
107
|
+
onFileChange,
|
|
108
|
+
accept,
|
|
109
|
+
disabled = false,
|
|
110
|
+
labels,
|
|
111
|
+
renderPreview,
|
|
112
|
+
onQRCodes,
|
|
113
|
+
qrCodeWanted,
|
|
114
|
+
onReject,
|
|
115
|
+
className = ""
|
|
116
|
+
}) {
|
|
117
|
+
const input = useRef(null);
|
|
118
|
+
const [drag, setDrag] = useState("none");
|
|
119
|
+
const [url, setUrl] = useState("");
|
|
120
|
+
const [scanning, setScanning] = useState(false);
|
|
121
|
+
const [rejected, setRejected] = useState(false);
|
|
122
|
+
useEffect(() => {
|
|
123
|
+
if (!rejected) return;
|
|
124
|
+
const t = window.setTimeout(() => setRejected(false), 5e3);
|
|
125
|
+
return () => window.clearTimeout(t);
|
|
126
|
+
}, [rejected]);
|
|
127
|
+
const onQRCodesRef = useRef(onQRCodes);
|
|
128
|
+
const qrCodeWantedRef = useRef(qrCodeWanted);
|
|
129
|
+
onQRCodesRef.current = onQRCodes;
|
|
130
|
+
qrCodeWantedRef.current = qrCodeWanted;
|
|
131
|
+
const scanQR = Boolean(onQRCodes);
|
|
132
|
+
useEffect(() => {
|
|
133
|
+
if (!file || !scanQR) {
|
|
134
|
+
setScanning(false);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
let alive = true;
|
|
138
|
+
setScanning(true);
|
|
139
|
+
import("../../../capabilities/documents/QRScanning/scanQRCodes.js").then(({ scanQRCodes }) => scanQRCodes(file, { until: (code) => qrCodeWantedRef.current?.(code) ?? true })).catch(() => []).then((codes) => {
|
|
140
|
+
if (!alive) return;
|
|
141
|
+
setScanning(false);
|
|
142
|
+
onQRCodesRef.current?.(codes, file);
|
|
143
|
+
});
|
|
144
|
+
return () => {
|
|
145
|
+
alive = false;
|
|
146
|
+
};
|
|
147
|
+
}, [file, scanQR]);
|
|
148
|
+
useEffect(() => {
|
|
149
|
+
if (!file) {
|
|
150
|
+
setUrl("");
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
const created = URL.createObjectURL(file);
|
|
154
|
+
setUrl(created);
|
|
155
|
+
return () => URL.revokeObjectURL(created);
|
|
156
|
+
}, [file]);
|
|
157
|
+
const pick = () => {
|
|
158
|
+
if (!disabled) input.current?.click();
|
|
159
|
+
};
|
|
160
|
+
const receive = (list) => {
|
|
161
|
+
if (disabled || !list || list.length === 0) return;
|
|
162
|
+
const files = Array.from(list);
|
|
163
|
+
const first = files.find((f) => accepts(f, accept));
|
|
164
|
+
if (first) {
|
|
165
|
+
setRejected(false);
|
|
166
|
+
onFileChange(first);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
setRejected(true);
|
|
170
|
+
onReject?.(files);
|
|
171
|
+
};
|
|
172
|
+
const onKeyDown = (e) => {
|
|
173
|
+
if (e.key !== "Enter" && e.key !== " ") return;
|
|
174
|
+
e.preventDefault();
|
|
175
|
+
pick();
|
|
176
|
+
};
|
|
177
|
+
let frame = "border-2 border-dashed border-primary/30 bg-card shadow-card hover:border-primary hover:bg-muted hover:shadow-card-hover";
|
|
178
|
+
if (file) frame = "border border-border bg-card shadow-card";
|
|
179
|
+
if (drag === "ok") frame = "border-2 border-dashed border-primary bg-primary/5 shadow-card-active";
|
|
180
|
+
if (drag === "rejected") frame = "border-2 border-dashed border-destructive bg-destructive/5 shadow-card";
|
|
181
|
+
if (disabled) frame += " cursor-not-allowed opacity-60";
|
|
182
|
+
const sizeMb = file ? (file.size / 1024 / 1024).toFixed(2) : "";
|
|
183
|
+
const custom = file && url && renderPreview ? renderPreview(file, url) : null;
|
|
184
|
+
const preview = file && url ? custom ?? /* @__PURE__ */ jsx(DefaultPreview, { file, url }) : null;
|
|
185
|
+
return /* @__PURE__ */ jsxs(
|
|
186
|
+
"div",
|
|
187
|
+
{
|
|
188
|
+
onDragOver: (e) => {
|
|
189
|
+
e.preventDefault();
|
|
190
|
+
if (disabled) {
|
|
191
|
+
e.dataTransfer.dropEffect = "none";
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
const types = Array.from(e.dataTransfer.items ?? []).filter((item) => item.kind === "file").map((item) => item.type);
|
|
195
|
+
const verdict = types.length && types.every((t) => acceptsType(t, accept) === false) ? "rejected" : "ok";
|
|
196
|
+
e.dataTransfer.dropEffect = verdict === "rejected" ? "none" : "copy";
|
|
197
|
+
setDrag(verdict);
|
|
198
|
+
},
|
|
199
|
+
onDragLeave: (e) => {
|
|
200
|
+
if (e.currentTarget.contains(e.relatedTarget)) return;
|
|
201
|
+
if (drag === "rejected") setRejected(true);
|
|
202
|
+
setDrag("none");
|
|
203
|
+
},
|
|
204
|
+
onDrop: (e) => {
|
|
205
|
+
e.preventDefault();
|
|
206
|
+
setDrag("none");
|
|
207
|
+
receive(e.dataTransfer.files);
|
|
208
|
+
},
|
|
209
|
+
className: `group relative flex overflow-hidden rounded-2xl transition-[border-color,background-color,box-shadow] duration-200 ${frame} ${className}`,
|
|
210
|
+
children: [
|
|
211
|
+
!file && /* @__PURE__ */ jsxs(
|
|
212
|
+
"div",
|
|
213
|
+
{
|
|
214
|
+
role: "button",
|
|
215
|
+
tabIndex: disabled ? -1 : 0,
|
|
216
|
+
"aria-disabled": disabled,
|
|
217
|
+
onClick: pick,
|
|
218
|
+
onKeyDown,
|
|
219
|
+
className: "flex h-full w-full cursor-pointer flex-col items-center justify-center gap-[18px] px-6 py-7 text-center outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
220
|
+
children: [
|
|
221
|
+
/* @__PURE__ */ jsx("div", { className: "flex h-[78px] w-[78px] items-center justify-center rounded-[22px] bg-primary/5 text-primary transition-transform duration-200 group-hover:-translate-y-0.5", children: /* @__PURE__ */ jsx(UploadIcon, {}) }),
|
|
222
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
223
|
+
/* @__PURE__ */ jsx("div", { className: "mb-1.5 text-title font-semibold text-foreground", children: labels.title }),
|
|
224
|
+
labels.hint && /* @__PURE__ */ jsx("div", { className: "text-control text-muted-foreground", children: labels.hint })
|
|
225
|
+
] })
|
|
226
|
+
]
|
|
227
|
+
}
|
|
228
|
+
),
|
|
229
|
+
file && /* @__PURE__ */ jsxs("div", { className: "flex h-full min-h-0 w-full flex-col", children: [
|
|
230
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-none items-center gap-[11px] border-b border-border bg-card py-2.5 pr-3 pl-3.5", children: [
|
|
231
|
+
/* @__PURE__ */ jsx("span", { className: "flex h-[30px] w-[30px] flex-none items-center justify-center rounded-lg bg-primary/5 text-primary", children: isPdf(file) ? /* @__PURE__ */ jsx(FileTypeIcon, { label: "PDF" }) : isSpreadsheet(file) ? /* @__PURE__ */ jsx(FileTypeIcon, { label: spreadsheetLabel(file) }) : file.type.startsWith("image/") ? /* @__PURE__ */ jsx(ImageIcon, {}) : /* @__PURE__ */ jsx(DocumentIcon, { size: 17 }) }),
|
|
232
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1 text-left", children: [
|
|
233
|
+
/* @__PURE__ */ jsx("div", { className: "truncate text-control font-semibold text-primary", children: file.name }),
|
|
234
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-px flex items-center gap-1.5 text-caption text-muted-foreground", children: [
|
|
235
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
236
|
+
sizeMb,
|
|
237
|
+
" MB"
|
|
238
|
+
] }),
|
|
239
|
+
scanning && /* @__PURE__ */ jsxs("span", { role: "status", className: "inline-flex items-center gap-1.5", children: [
|
|
240
|
+
/* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "inline-block h-2.5 w-2.5 animate-spin rounded-full border-[1.5px] border-primary/20 border-t-primary" }),
|
|
241
|
+
labels.scanningQR
|
|
242
|
+
] })
|
|
243
|
+
] })
|
|
244
|
+
] }),
|
|
245
|
+
/* @__PURE__ */ jsxs(
|
|
246
|
+
"button",
|
|
247
|
+
{
|
|
248
|
+
type: "button",
|
|
249
|
+
disabled,
|
|
250
|
+
onClick: pick,
|
|
251
|
+
className: "inline-flex flex-none cursor-pointer items-center gap-1.5 rounded-lg border border-border bg-card px-[11px] py-1.5 text-caption font-bold tracking-[0.02em] text-primary transition-colors duration-150 hover:border-primary/30 hover:bg-primary/5 focus-visible:ring-2 focus-visible:ring-ring focus-visible:outline-none",
|
|
252
|
+
children: [
|
|
253
|
+
/* @__PURE__ */ jsxs("svg", { width: "13", height: "13", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.2", "aria-hidden": true, children: [
|
|
254
|
+
/* @__PURE__ */ jsx("path", { d: "M21 12a9 9 0 1 1-2.64-6.36", strokeLinecap: "round" }),
|
|
255
|
+
/* @__PURE__ */ jsx("path", { d: "M21 3v5h-5", strokeLinecap: "round", strokeLinejoin: "round" })
|
|
256
|
+
] }),
|
|
257
|
+
labels.change
|
|
258
|
+
]
|
|
259
|
+
}
|
|
260
|
+
),
|
|
261
|
+
/* @__PURE__ */ jsx(
|
|
262
|
+
"button",
|
|
263
|
+
{
|
|
264
|
+
type: "button",
|
|
265
|
+
title: labels.remove,
|
|
266
|
+
"aria-label": labels.remove,
|
|
267
|
+
disabled,
|
|
268
|
+
onClick: () => onFileChange(null),
|
|
269
|
+
className: "inline-flex h-8 w-8 flex-none cursor-pointer items-center justify-center rounded-lg border border-border bg-card p-0 text-muted-foreground transition-colors duration-150 hover:border-destructive/30 hover:bg-destructive/10 hover:text-destructive",
|
|
270
|
+
children: /* @__PURE__ */ jsx("svg", { width: "15", height: "15", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.9", "aria-hidden": true, children: /* @__PURE__ */ jsx("path", { d: "M4 7h16M9 7V5a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2M6 7l1 13a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1l1-13", strokeLinecap: "round", strokeLinejoin: "round" }) })
|
|
271
|
+
}
|
|
272
|
+
)
|
|
273
|
+
] }),
|
|
274
|
+
/* @__PURE__ */ jsx("div", { className: "flex min-h-0 flex-1 basis-0 items-center justify-center overflow-hidden bg-card", children: preview })
|
|
275
|
+
] }),
|
|
276
|
+
(rejected || drag === "rejected") && /* @__PURE__ */ jsx(
|
|
277
|
+
"div",
|
|
278
|
+
{
|
|
279
|
+
role: "alert",
|
|
280
|
+
className: "absolute inset-x-3 bottom-3 rounded-lg border border-destructive/30 bg-card px-3 py-2 text-center text-xs font-medium text-destructive shadow-popover",
|
|
281
|
+
children: labels.rejected
|
|
282
|
+
}
|
|
283
|
+
),
|
|
284
|
+
/* @__PURE__ */ jsx(
|
|
285
|
+
"input",
|
|
286
|
+
{
|
|
287
|
+
ref: input,
|
|
288
|
+
type: "file",
|
|
289
|
+
accept,
|
|
290
|
+
className: "hidden",
|
|
291
|
+
onChange: (e) => {
|
|
292
|
+
receive(e.target.files);
|
|
293
|
+
e.target.value = "";
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
)
|
|
297
|
+
]
|
|
298
|
+
}
|
|
299
|
+
);
|
|
300
|
+
}
|
|
301
|
+
export {
|
|
302
|
+
accepts,
|
|
303
|
+
acceptsType,
|
|
304
|
+
DocumentDropzone as default,
|
|
305
|
+
isSpreadsheet
|
|
306
|
+
};
|
|
307
|
+
//# sourceMappingURL=DocumentDropzone.js.map
|