@ynput/ayon-frontend-shared 0.2.18 → 0.2.19
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/DetailsPanel.cjs.js +6 -6
- package/dist/DetailsPanel.es.js +7 -7
- package/dist/DetailsPanel.es.js.map +1 -1
- package/dist/ProjectTreeTable.cjs.js +6 -0
- package/dist/ProjectTreeTable.cjs.js.map +1 -1
- package/dist/ProjectTreeTable.es.js +6 -0
- package/dist/ProjectTreeTable.es.js.map +1 -1
- package/dist/api.cjs.js +6 -0
- package/dist/api.cjs.js.map +1 -1
- package/dist/api.es.js +10 -4
- package/dist/index.cjs.js +6 -5
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.es.js +6 -5
- package/dist/index.es.js.map +1 -1
- package/dist/shared/src/api/generated/folders.cjs.js.map +1 -1
- package/dist/shared/src/api/generated/folders.es.js.map +1 -1
- package/dist/shared/src/api/generated/graphql.cjs.js +38 -0
- package/dist/shared/src/api/generated/graphql.cjs.js.map +1 -1
- package/dist/shared/src/api/generated/graphql.es.js +38 -0
- package/dist/shared/src/api/generated/graphql.es.js.map +1 -1
- package/dist/shared/src/api/queries/actions/getActions.cjs.js +9 -1
- package/dist/shared/src/api/queries/actions/getActions.cjs.js.map +1 -1
- package/dist/shared/src/api/queries/actions/getActions.es.js +9 -1
- package/dist/shared/src/api/queries/actions/getActions.es.js.map +1 -1
- package/dist/shared/src/api/queries/entities/getEntityPanel.cjs.js +2 -1
- package/dist/shared/src/api/queries/entities/getEntityPanel.cjs.js.map +1 -1
- package/dist/shared/src/api/queries/entities/getEntityPanel.es.js +2 -1
- package/dist/shared/src/api/queries/entities/getEntityPanel.es.js.map +1 -1
- package/dist/shared/src/api/queries/entities/transformDetailsPanelData.cjs.js +12 -8
- package/dist/shared/src/api/queries/entities/transformDetailsPanelData.cjs.js.map +1 -1
- package/dist/shared/src/api/queries/entities/transformDetailsPanelData.es.js +12 -8
- package/dist/shared/src/api/queries/entities/transformDetailsPanelData.es.js.map +1 -1
- package/dist/shared/src/api/queries/entityLists/getLists.cjs.js +67 -0
- package/dist/shared/src/api/queries/entityLists/getLists.cjs.js.map +1 -1
- package/dist/shared/src/api/queries/entityLists/getLists.es.js +68 -1
- package/dist/shared/src/api/queries/entityLists/getLists.es.js.map +1 -1
- package/dist/shared/src/api/queries/entityLists/updateLists.cjs.js +19 -3
- package/dist/shared/src/api/queries/entityLists/updateLists.cjs.js.map +1 -1
- package/dist/shared/src/api/queries/entityLists/updateLists.es.js +19 -3
- package/dist/shared/src/api/queries/entityLists/updateLists.es.js.map +1 -1
- package/dist/shared/src/api/queries/overview/updateOverview.cjs.js +13 -0
- package/dist/shared/src/api/queries/overview/updateOverview.cjs.js.map +1 -1
- package/dist/shared/src/api/queries/overview/updateOverview.es.js +13 -0
- package/dist/shared/src/api/queries/overview/updateOverview.es.js.map +1 -1
- package/dist/shared/src/api/queries/users/getUsers.cjs.js +2 -0
- package/dist/shared/src/api/queries/users/getUsers.cjs.js.map +1 -1
- package/dist/shared/src/api/queries/users/getUsers.es.js +2 -0
- package/dist/shared/src/api/queries/users/getUsers.es.js.map +1 -1
- package/dist/shared/src/api/queries/versions/updateVersions.cjs.js +3 -1
- package/dist/shared/src/api/queries/versions/updateVersions.cjs.js.map +1 -1
- package/dist/shared/src/api/queries/versions/updateVersions.es.js +3 -1
- package/dist/shared/src/api/queries/versions/updateVersions.es.js.map +1 -1
- package/dist/shared/src/components/DetailsPanelAttributes/DetailsPanelAttributes.cjs.js +5 -5
- package/dist/shared/src/components/DetailsPanelAttributes/DetailsPanelAttributes.cjs.js.map +1 -1
- package/dist/shared/src/components/DetailsPanelAttributes/DetailsPanelAttributes.es.js +5 -5
- package/dist/shared/src/components/DetailsPanelAttributes/DetailsPanelAttributes.es.js.map +1 -1
- package/dist/shared/src/components/DetailsPanelAttributes/DetailsPanelAttributesEditor.cjs.js +1 -1
- package/dist/shared/src/components/DetailsPanelAttributes/DetailsPanelAttributesEditor.cjs.js.map +1 -1
- package/dist/shared/src/components/DetailsPanelAttributes/DetailsPanelAttributesEditor.es.js +1 -1
- package/dist/shared/src/components/DetailsPanelAttributes/DetailsPanelAttributesEditor.es.js.map +1 -1
- package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.cjs.js +2 -2
- package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.cjs.js.map +1 -1
- package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.es.js +2 -2
- package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.es.js.map +1 -1
- package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploader.cjs.js +15 -14
- package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploader.cjs.js.map +1 -1
- package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploader.es.js +15 -14
- package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploader.es.js.map +1 -1
- package/dist/shared/src/components/PlayableIcon/PlayableIcon.cjs.js +43 -0
- package/dist/shared/src/components/PlayableIcon/PlayableIcon.cjs.js.map +1 -0
- package/dist/shared/src/components/PlayableIcon/PlayableIcon.es.js +43 -0
- package/dist/shared/src/components/PlayableIcon/PlayableIcon.es.js.map +1 -0
- package/dist/shared/src/components/Powerpack/PowerpackDialog.styled.cjs.js +1 -1
- package/dist/shared/src/components/Powerpack/PowerpackDialog.styled.cjs.js.map +1 -1
- package/dist/shared/src/components/Powerpack/PowerpackDialog.styled.es.js +1 -1
- package/dist/shared/src/components/Powerpack/PowerpackDialog.styled.es.js.map +1 -1
- package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.cjs.js +15 -15
- package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.es.js +15 -15
- package/dist/shared/src/components/ReviewablesList/ReviewablesList.cjs.js +6 -5
- package/dist/shared/src/components/ReviewablesList/ReviewablesList.cjs.js.map +1 -1
- package/dist/shared/src/components/ReviewablesList/ReviewablesList.es.js +6 -5
- package/dist/shared/src/components/ReviewablesList/ReviewablesList.es.js.map +1 -1
- package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.cjs.js +6 -5
- package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.cjs.js.map +1 -1
- package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.es.js +6 -5
- package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.es.js.map +1 -1
- package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.cjs.js +6 -5
- package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.cjs.js.map +1 -1
- package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.es.js +6 -5
- package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.es.js.map +1 -1
- package/dist/shared/src/components/SettingsPanel/SettingsPanelItemTemplate.cjs.js +2 -2
- package/dist/shared/src/components/SettingsPanel/SettingsPanelItemTemplate.cjs.js.map +1 -1
- package/dist/shared/src/components/SettingsPanel/SettingsPanelItemTemplate.es.js +2 -2
- package/dist/shared/src/components/SettingsPanel/SettingsPanelItemTemplate.es.js.map +1 -1
- package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.cjs.js +6 -5
- package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.cjs.js.map +1 -1
- package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.es.js +6 -5
- package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.es.js.map +1 -1
- package/dist/shared/src/components/VersionUploader/components/UploadVersionForm.cjs.js +6 -5
- package/dist/shared/src/components/VersionUploader/components/UploadVersionForm.cjs.js.map +1 -1
- package/dist/shared/src/components/VersionUploader/components/UploadVersionForm.es.js +6 -5
- package/dist/shared/src/components/VersionUploader/components/UploadVersionForm.es.js.map +1 -1
- package/dist/shared/src/containers/Actions/ActionConfigDialog.cjs.js +6 -5
- package/dist/shared/src/containers/Actions/ActionConfigDialog.cjs.js.map +1 -1
- package/dist/shared/src/containers/Actions/ActionConfigDialog.es.js +6 -5
- package/dist/shared/src/containers/Actions/ActionConfigDialog.es.js.map +1 -1
- package/dist/shared/src/containers/Actions/Actions.cjs.js +8 -2
- package/dist/shared/src/containers/Actions/Actions.cjs.js.map +1 -1
- package/dist/shared/src/containers/Actions/Actions.es.js +8 -2
- package/dist/shared/src/containers/Actions/Actions.es.js.map +1 -1
- package/dist/shared/src/containers/Actions/ActionsDropdown/ActionsDropdown.cjs.js +10 -3
- package/dist/shared/src/containers/Actions/ActionsDropdown/ActionsDropdown.cjs.js.map +1 -1
- package/dist/shared/src/containers/Actions/ActionsDropdown/ActionsDropdown.es.js +10 -3
- package/dist/shared/src/containers/Actions/ActionsDropdown/ActionsDropdown.es.js.map +1 -1
- package/dist/shared/src/containers/Actions/ActionsDropdown/ActionsDropdown.styled.cjs.js +14 -0
- package/dist/shared/src/containers/Actions/ActionsDropdown/ActionsDropdown.styled.cjs.js.map +1 -1
- package/dist/shared/src/containers/Actions/ActionsDropdown/ActionsDropdown.styled.es.js +14 -0
- package/dist/shared/src/containers/Actions/ActionsDropdown/ActionsDropdown.styled.es.js.map +1 -1
- package/dist/shared/src/containers/Actions/InteractiveActionDialog.cjs.js +6 -5
- package/dist/shared/src/containers/Actions/InteractiveActionDialog.cjs.js.map +1 -1
- package/dist/shared/src/containers/Actions/InteractiveActionDialog.es.js +6 -5
- package/dist/shared/src/containers/Actions/InteractiveActionDialog.es.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js +5 -5
- package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js +5 -5
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.cjs.js +6 -5
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.cjs.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.es.js +6 -5
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.es.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.cjs.js +6 -5
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.cjs.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.es.js +6 -5
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.es.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.cjs.js +6 -4
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.cjs.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.es.js +7 -5
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.es.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.styled.cjs.js +1 -31
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.styled.cjs.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.styled.es.js +1 -31
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.styled.es.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/ActivityReference/ActivityReference.styled.cjs.js +2 -2
- package/dist/shared/src/containers/Feed/components/ActivityReference/ActivityReference.styled.cjs.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/ActivityReference/ActivityReference.styled.es.js +2 -2
- package/dist/shared/src/containers/Feed/components/ActivityReference/ActivityReference.styled.es.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/FileUploadPreview/FileUploadPreview.styled.cjs.js +1 -1
- package/dist/shared/src/containers/Feed/components/FileUploadPreview/FileUploadPreview.styled.cjs.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/FileUploadPreview/FileUploadPreview.styled.es.js +1 -1
- package/dist/shared/src/containers/Feed/components/FileUploadPreview/FileUploadPreview.styled.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js +48 -4
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js +50 -6
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js +47 -11
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js +47 -11
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.cjs.js +5 -4
- package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.es.js +5 -4
- package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/components/HeaderActionButton.cjs.js +5 -3
- package/dist/shared/src/containers/ProjectTreeTable/components/HeaderActionButton.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/components/HeaderActionButton.es.js +5 -3
- package/dist/shared/src/containers/ProjectTreeTable/components/HeaderActionButton.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/context/CellEditingContext.cjs.js +106 -2
- package/dist/shared/src/containers/ProjectTreeTable/context/CellEditingContext.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/context/CellEditingContext.es.js +106 -2
- package/dist/shared/src/containers/ProjectTreeTable/context/CellEditingContext.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/context/ClipboardContext.cjs.js +14 -2
- package/dist/shared/src/containers/ProjectTreeTable/context/ClipboardContext.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/context/ClipboardContext.es.js +14 -2
- package/dist/shared/src/containers/ProjectTreeTable/context/ClipboardContext.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableContext.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableContext.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableProvider.cjs.js +15 -3
- package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableProvider.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableProvider.es.js +15 -3
- package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableProvider.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/context/SelectionCellsProvider.cjs.js +106 -0
- package/dist/shared/src/containers/ProjectTreeTable/context/SelectionCellsProvider.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/context/SelectionCellsProvider.es.js +106 -0
- package/dist/shared/src/containers/ProjectTreeTable/context/SelectionCellsProvider.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.cjs.js +4 -2
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.es.js +4 -2
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useCellContextMenu.cjs.js +26 -4
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useCellContextMenu.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useCellContextMenu.es.js +26 -4
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useCellContextMenu.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useCheckSelectedCellsVisible.cjs.js +135 -0
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useCheckSelectedCellsVisible.cjs.js.map +1 -0
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useCheckSelectedCellsVisible.es.js +135 -0
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useCheckSelectedCellsVisible.es.js.map +1 -0
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useDeleteEntities.cjs.js +8 -6
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useDeleteEntities.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useDeleteEntities.es.js +8 -6
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useDeleteEntities.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useFolderRelationships.cjs.js +1 -2
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useFolderRelationships.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useFolderRelationships.es.js +1 -2
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useFolderRelationships.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetGroupedFields.cjs.js +88 -0
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetGroupedFields.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetGroupedFields.es.js +88 -0
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetGroupedFields.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useHistory.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useHistory.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useHistory.es.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useHistory.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useKeyboardNavigation.cjs.js +35 -4
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useKeyboardNavigation.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useKeyboardNavigation.es.js +35 -4
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useKeyboardNavigation.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.cjs.js +88 -0
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.es.js +88 -0
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useUpdateTableData.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useUpdateTableData.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useUpdateTableData.es.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useUpdateTableData.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/utils/cellUtils.cjs.js +90 -0
- package/dist/shared/src/containers/ProjectTreeTable/utils/cellUtils.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/utils/cellUtils.es.js +90 -0
- package/dist/shared/src/containers/ProjectTreeTable/utils/cellUtils.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/utils/getEntityViewerIds.cjs.js +19 -0
- package/dist/shared/src/containers/ProjectTreeTable/utils/getEntityViewerIds.cjs.js.map +1 -0
- package/dist/shared/src/containers/ProjectTreeTable/utils/getEntityViewerIds.es.js +19 -0
- package/dist/shared/src/containers/ProjectTreeTable/utils/getEntityViewerIds.es.js.map +1 -0
- package/dist/shared/src/containers/ProjectTreeTable/utils/getTypeDefaultValue.cjs.js +26 -0
- package/dist/shared/src/containers/ProjectTreeTable/utils/getTypeDefaultValue.cjs.js.map +1 -0
- package/dist/shared/src/containers/ProjectTreeTable/utils/getTypeDefaultValue.es.js +26 -0
- package/dist/shared/src/containers/ProjectTreeTable/utils/getTypeDefaultValue.es.js.map +1 -0
- package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.cjs.js +9 -8
- package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.es.js +10 -9
- package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.cjs.js +8 -2
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.es.js +8 -2
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumCellValue.cjs.js +190 -0
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumCellValue.cjs.js.map +1 -0
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumCellValue.es.js +190 -0
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumCellValue.es.js.map +1 -0
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumWidget.cjs.js +4 -147
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumWidget.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumWidget.es.js +2 -145
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumWidget.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/ThumbnailWidget.cjs.js +12 -2
- package/dist/shared/src/containers/ProjectTreeTable/widgets/ThumbnailWidget.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/ThumbnailWidget.es.js +12 -2
- package/dist/shared/src/containers/ProjectTreeTable/widgets/ThumbnailWidget.es.js.map +1 -1
- package/dist/shared/src/containers/RepresentationsList/RepresentationsList.cjs.js +6 -5
- package/dist/shared/src/containers/RepresentationsList/RepresentationsList.cjs.js.map +1 -1
- package/dist/shared/src/containers/RepresentationsList/RepresentationsList.es.js +6 -5
- package/dist/shared/src/containers/RepresentationsList/RepresentationsList.es.js.map +1 -1
- package/dist/shared/src/context/DetailsPanelContext.cjs.js +5 -1
- package/dist/shared/src/context/DetailsPanelContext.cjs.js.map +1 -1
- package/dist/shared/src/context/DetailsPanelContext.es.js +5 -1
- package/dist/shared/src/context/DetailsPanelContext.es.js.map +1 -1
- package/dist/shared/src/util/confirmDelete.cjs.js +1 -0
- package/dist/shared/src/util/confirmDelete.cjs.js.map +1 -1
- package/dist/shared/src/util/confirmDelete.es.js +2 -0
- package/dist/shared/src/util/confirmDelete.es.js.map +1 -1
- package/dist/types/SimpleTable/SimpleTable.d.ts +1 -0
- package/dist/types/SimpleTable/SimpleTableRowTemplate.d.ts +1 -1
- package/dist/types/SimpleTable/context/SimpleTableContext.d.ts +5 -1
- package/dist/types/api/generated/folders.d.ts +1 -0
- package/dist/types/api/generated/graphql.d.ts +66 -5
- package/dist/types/api/queries/actions/getActions.d.ts +132 -1
- package/dist/types/api/queries/activities/getActivities.d.ts +6 -0
- package/dist/types/api/queries/activities/updateActivities.d.ts +12 -0
- package/dist/types/api/queries/entities/getEntity.d.ts +6 -0
- package/dist/types/api/queries/entities/getEntityPanel.d.ts +6 -0
- package/dist/types/api/queries/entities/transformDetailsPanelData.d.ts +1 -0
- package/dist/types/api/queries/entities/updateEntity.d.ts +6 -0
- package/dist/types/api/queries/entityLists/getLists.d.ts +1517 -2
- package/dist/types/api/queries/entityLists/types.d.ts +30 -1
- package/dist/types/api/queries/entityLists/updateLists.d.ts +166 -3
- package/dist/types/api/queries/overview/getOverview.d.ts +6 -0
- package/dist/types/api/queries/userDashboard/getUserDashboard.d.ts +6 -0
- package/dist/types/api/queries/users/getUsers.d.ts +6 -0
- package/dist/types/components/PlayableIcon/PlayableIcon.d.ts +4 -0
- package/dist/types/containers/Actions/Actions.d.ts +7 -1
- package/dist/types/containers/Actions/ActionsDropdown/ActionsDropdown.d.ts +5 -3
- package/dist/types/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.styled.d.ts +0 -1
- package/dist/types/containers/ProjectTreeTable/ProjectTreeTable.d.ts +6 -2
- package/dist/types/containers/ProjectTreeTable/context/ProjectTableContext.d.ts +4 -1
- package/dist/types/containers/ProjectTreeTable/context/ProjectTableProvider.d.ts +11 -2
- package/dist/types/containers/ProjectTreeTable/hooks/index.d.ts +1 -0
- package/dist/types/containers/ProjectTreeTable/hooks/useCellContextMenu.d.ts +1 -1
- package/dist/types/containers/ProjectTreeTable/hooks/useCheckSelectedCellsVisible.d.ts +9 -0
- package/dist/types/containers/ProjectTreeTable/hooks/useFolderRelationships.d.ts +2 -2
- package/dist/types/containers/ProjectTreeTable/hooks/useKeyboardNavigation.d.ts +3 -3
- package/dist/types/containers/ProjectTreeTable/hooks/useUpdateTableData.d.ts +1 -1
- package/dist/types/containers/ProjectTreeTable/types/table.d.ts +10 -1
- package/dist/types/containers/ProjectTreeTable/utils/getEntityViewerIds.d.ts +4 -0
- package/dist/types/containers/ProjectTreeTable/utils/getTypeDefaultValue.d.ts +2 -0
- package/dist/types/containers/ProjectTreeTable/utils/index.d.ts +2 -0
- package/dist/types/containers/ProjectTreeTable/widgets/CellWidget.d.ts +2 -1
- package/dist/types/containers/ProjectTreeTable/widgets/EnumCellValue.d.ts +20 -0
- package/dist/types/containers/ProjectTreeTable/widgets/EnumWidget.d.ts +1 -11
- package/dist/types/containers/ProjectTreeTable/widgets/ThumbnailWidget.d.ts +1 -0
- package/dist/types/context/DetailsPanelContext.d.ts +1 -0
- package/dist/types/util/confirmDelete.d.ts +2 -1
- package/dist/util.cjs.js +2 -0
- package/dist/util.cjs.js.map +1 -1
- package/dist/util.es.js +2 -0
- package/dist/util.es.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const React = require("react");
|
|
4
|
+
require("@ynput/ayon-react-components");
|
|
5
|
+
require("lodash");
|
|
6
|
+
require("react-toastify");
|
|
7
|
+
require("../../../util/pubsub.cjs.js");
|
|
8
|
+
const cellUtils = require("../utils/cellUtils.cjs.js");
|
|
9
|
+
require("../context/CellEditingContext.cjs.js");
|
|
10
|
+
require("../context/ClipboardContext.cjs.js");
|
|
11
|
+
require("../../../../../_virtual/jsx-runtime.cjs.js");
|
|
12
|
+
require("@tanstack/react-table");
|
|
13
|
+
require("../context/SelectionCellsContext.cjs.js");
|
|
14
|
+
require("../ProjectTreeTable.cjs.js");
|
|
15
|
+
require("../context/ColumnSettingsContext.cjs.js");
|
|
16
|
+
const ProjectTableContext = require("../context/ProjectTableContext.cjs.js");
|
|
17
|
+
require("../context/ProjectTableQueriesContext.cjs.js");
|
|
18
|
+
require("../context/SelectedRowsContext.cjs.js");
|
|
19
|
+
;/* empty css */
|
|
20
|
+
require("clsx");
|
|
21
|
+
require("../../ContextMenu/ContextMenuContext.cjs.js");
|
|
22
|
+
require("../../../api/base/client.cjs.js");
|
|
23
|
+
require("../../../api/generated/graphql.cjs.js");
|
|
24
|
+
require("../../../api/generated/access.cjs.js");
|
|
25
|
+
require("../../../api/generated/actions.cjs.js");
|
|
26
|
+
require("../../../api/generated/activityFeed.cjs.js");
|
|
27
|
+
require("../../../api/generated/addons.cjs.js");
|
|
28
|
+
require("../../../api/generated/anatomy.cjs.js");
|
|
29
|
+
require("../../../api/generated/attributes.cjs.js");
|
|
30
|
+
require("../../../api/generated/authentication.cjs.js");
|
|
31
|
+
require("../../../api/generated/bundles.cjs.js");
|
|
32
|
+
require("../../../api/generated/configuration.cjs.js");
|
|
33
|
+
require("../../../api/generated/desktop.cjs.js");
|
|
34
|
+
require("../../../api/generated/entityLists.cjs.js");
|
|
35
|
+
require("../../../api/generated/events.cjs.js");
|
|
36
|
+
require("../../../api/generated/files.cjs.js");
|
|
37
|
+
require("../../../api/generated/folders.cjs.js");
|
|
38
|
+
require("../../../api/generated/inbox.cjs.js");
|
|
39
|
+
require("../../../api/generated/links.cjs.js");
|
|
40
|
+
require("../../../api/generated/market.cjs.js");
|
|
41
|
+
require("../../../api/generated/onboarding.cjs.js");
|
|
42
|
+
require("../../../api/generated/operations.cjs.js");
|
|
43
|
+
require("../../../api/generated/products.cjs.js");
|
|
44
|
+
require("../../../api/generated/projectDashboard.cjs.js");
|
|
45
|
+
require("../../../api/generated/projects.cjs.js");
|
|
46
|
+
require("../../../api/generated/reviewables.cjs.js");
|
|
47
|
+
require("../../../api/generated/services.cjs.js");
|
|
48
|
+
require("../../../api/generated/system.cjs.js");
|
|
49
|
+
require("../../../api/generated/tasks.cjs.js");
|
|
50
|
+
require("../../../api/generated/teams.cjs.js");
|
|
51
|
+
require("../../../api/generated/thumbnails.cjs.js");
|
|
52
|
+
require("../../../api/generated/uRIs.cjs.js");
|
|
53
|
+
require("../../../api/generated/users.cjs.js");
|
|
54
|
+
require("../../../api/generated/versions.cjs.js");
|
|
55
|
+
require("../../../api/generated/workfiles.cjs.js");
|
|
56
|
+
require("../../../api/generated/ynputCloud.cjs.js");
|
|
57
|
+
require("../../../api/generated/grouping.cjs.js");
|
|
58
|
+
require("../../../api/queries/actions/getActions.cjs.js");
|
|
59
|
+
require("../../../api/queries/activities/getActivities.cjs.js");
|
|
60
|
+
require("../../../api/queries/activities/updateActivities.cjs.js");
|
|
61
|
+
require("../../../api/queries/activities/updateReaction.cjs.js");
|
|
62
|
+
require("../../../api/queries/activities/getMentions.cjs.js");
|
|
63
|
+
require("../../../api/queries/addons/getAddons.cjs.js");
|
|
64
|
+
require("../../../api/queries/addons/updateAddons.cjs.js");
|
|
65
|
+
require("../../../api/queries/attributes/getAttributes.cjs.js");
|
|
66
|
+
require("../../../api/queries/attributes/updateAttributes.cjs.js");
|
|
67
|
+
require("../../../api/queries/authentication/getAuthentication.cjs.js");
|
|
68
|
+
require("../../../api/queries/entities/getEntity.cjs.js");
|
|
69
|
+
require("../../../api/queries/entities/getEntityPanel.cjs.js");
|
|
70
|
+
require("../../../api/queries/entities/updateEntity.cjs.js");
|
|
71
|
+
require("../../../api/queries/entityLists/getLists.cjs.js");
|
|
72
|
+
require("../../../api/queries/entityLists/updateLists.cjs.js");
|
|
73
|
+
require("../../../api/queries/entityLists/getListsAttributes.cjs.js");
|
|
74
|
+
require("../../../api/queries/entityLists/updateListsAttributes.cjs.js");
|
|
75
|
+
require("../../../api/queries/folders/getFolders.cjs.js");
|
|
76
|
+
require("../../../api/queries/overview/getOverview.cjs.js");
|
|
77
|
+
require("../../../api/queries/overview/updateOverview.cjs.js");
|
|
78
|
+
require("../../../api/queries/project/getProject.cjs.js");
|
|
79
|
+
require("../../../api/queries/project/updateProject.cjs.js");
|
|
80
|
+
require("../../../api/queries/review/getReview.cjs.js");
|
|
81
|
+
require("../../../api/queries/review/updateReview.cjs.js");
|
|
82
|
+
require("../../../api/queries/system/getSystem.cjs.js");
|
|
83
|
+
require("../../../api/queries/userDashboard/getUserDashboard.cjs.js");
|
|
84
|
+
require("../../../api/queries/users/getUsers.cjs.js");
|
|
85
|
+
require("../../../api/queries/users/updateUsers.cjs.js");
|
|
86
|
+
require("../../../api/queries/watchers/getWatchers.cjs.js");
|
|
87
|
+
require("../../../api/queries/permissions/getPermissions.cjs.js");
|
|
88
|
+
require("../../../api/queries/grouping/getGrouping.cjs.js");
|
|
89
|
+
require("../../../api/queries/versions/updateVersions.cjs.js");
|
|
90
|
+
require("../../../api/queries/products/createProduct.cjs.js");
|
|
91
|
+
require("../../../context/RemoteModulesContext.cjs.js");
|
|
92
|
+
require("../../../../../_virtual/runtime.cjs.js");
|
|
93
|
+
require("../../../../../_virtual/semver.cjs.js");
|
|
94
|
+
require("../../../context/DetailsPanelContext.cjs.js");
|
|
95
|
+
require("../../../context/ThumbnailUploaderContext.cjs.js");
|
|
96
|
+
require("../../../context/SettingsPanelContext.cjs.js");
|
|
97
|
+
require("../../../context/pip/PiPProvider.cjs.js");
|
|
98
|
+
require("react-dom");
|
|
99
|
+
require("../../../context/pip/PiPWrapper.cjs.js");
|
|
100
|
+
require("../../../context/AddonProjectContext.cjs.js");
|
|
101
|
+
require("../../../context/AddonContext.cjs.js");
|
|
102
|
+
require("../../../context/PowerpackContext.cjs.js");
|
|
103
|
+
require("react-redux");
|
|
104
|
+
require("custom-protocol-check");
|
|
105
|
+
require("../components/GroupSettingsFallback.cjs.js");
|
|
106
|
+
require("../context/ProjectDataContext.cjs.js");
|
|
107
|
+
const useCheckSelectedCellsVisible = ({
|
|
108
|
+
selectedCells,
|
|
109
|
+
setSelectedCells,
|
|
110
|
+
focusedCellId,
|
|
111
|
+
setFocusedCellId
|
|
112
|
+
}) => {
|
|
113
|
+
const { getEntityById } = ProjectTableContext.useProjectTableContext();
|
|
114
|
+
React.useEffect(() => {
|
|
115
|
+
var _a;
|
|
116
|
+
const missingCells = /* @__PURE__ */ new Set();
|
|
117
|
+
for (const cellId of selectedCells) {
|
|
118
|
+
if (!getEntityById(((_a = cellUtils.parseCellId(cellId || "")) == null ? void 0 : _a.rowId) || "")) {
|
|
119
|
+
missingCells.add(cellId);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (missingCells.size > 0) {
|
|
123
|
+
const newSelection = new Set(selectedCells);
|
|
124
|
+
for (const cellId of missingCells) {
|
|
125
|
+
newSelection.delete(cellId);
|
|
126
|
+
}
|
|
127
|
+
setSelectedCells(newSelection);
|
|
128
|
+
if (missingCells.has(focusedCellId || "")) {
|
|
129
|
+
setFocusedCellId(null);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}, [getEntityById, selectedCells, focusedCellId, setSelectedCells, setFocusedCellId]);
|
|
133
|
+
};
|
|
134
|
+
exports.useCheckSelectedCellsVisible = useCheckSelectedCellsVisible;
|
|
135
|
+
//# sourceMappingURL=useCheckSelectedCellsVisible.cjs.js.map
|
package/dist/shared/src/containers/ProjectTreeTable/hooks/useCheckSelectedCellsVisible.cjs.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCheckSelectedCellsVisible.cjs.js","sources":["../../../../../../src/containers/ProjectTreeTable/hooks/useCheckSelectedCellsVisible.ts"],"sourcesContent":["// This hooks checks the current selection of cells is actually visible in the current viewport of the table\n// If they are not visible, they will be removed from the selection\n// This can happen when the user changes the slicer selection or filters (combined filters changes)\n\nimport { useEffect } from 'react'\nimport { CellId, parseCellId } from '../utils'\nimport { useProjectTableContext } from '../context'\n\ntype CheckSelectedCellsVisibleProps = {\n selectedCells: Set<CellId>\n setSelectedCells: (cells: Set<CellId>) => void\n focusedCellId: CellId | null\n setFocusedCellId: (cellId: CellId | null) => void\n}\n\nexport const useCheckSelectedCellsVisible = ({\n selectedCells,\n setSelectedCells,\n focusedCellId,\n setFocusedCellId,\n}: CheckSelectedCellsVisibleProps): void => {\n const { getEntityById } = useProjectTableContext()\n\n // checks that all of the selected cells are in the tableData\n // if they are not, they will be removed from the selection\n useEffect(() => {\n const missingCells = new Set<CellId>()\n for (const cellId of selectedCells) {\n // check if the cell rowId is in\n if (!getEntityById(parseCellId(cellId || '')?.rowId || '')) {\n missingCells.add(cellId)\n }\n }\n\n if (missingCells.size > 0) {\n // remove the missing cells from the selection\n const newSelection = new Set<CellId>(selectedCells)\n for (const cellId of missingCells) {\n newSelection.delete(cellId)\n }\n\n setSelectedCells(newSelection)\n\n // if the focused cell is one of the missing cells, clear it\n if (missingCells.has(focusedCellId || '')) {\n setFocusedCellId(null)\n }\n }\n }, [getEntityById, selectedCells, focusedCellId, setSelectedCells, setFocusedCellId])\n}\n"],"names":["useProjectTableContext","useEffect","parseCellId"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeO,MAAM,+BAA+B,CAAC;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA4C;AACpC,QAAA,EAAE,cAAc,IAAIA,2CAAuB;AAIjDC,QAAAA,UAAU,MAAM;;AACR,UAAA,mCAAmB,IAAY;AACrC,eAAW,UAAU,eAAe;AAE9B,UAAA,CAAC,gBAAcC,2BAAY,UAAU,EAAE,MAAxBA,mBAA2B,UAAS,EAAE,GAAG;AAC1D,qBAAa,IAAI,MAAM;AAAA,MAAA;AAAA,IACzB;AAGE,QAAA,aAAa,OAAO,GAAG;AAEnB,YAAA,eAAe,IAAI,IAAY,aAAa;AAClD,iBAAW,UAAU,cAAc;AACjC,qBAAa,OAAO,MAAM;AAAA,MAAA;AAG5B,uBAAiB,YAAY;AAG7B,UAAI,aAAa,IAAI,iBAAiB,EAAE,GAAG;AACzC,yBAAiB,IAAI;AAAA,MAAA;AAAA,IACvB;AAAA,EACF,GACC,CAAC,eAAe,eAAe,eAAe,kBAAkB,gBAAgB,CAAC;AACtF;;"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { useEffect } from "react";
|
|
2
|
+
import "@ynput/ayon-react-components";
|
|
3
|
+
import "lodash";
|
|
4
|
+
import "react-toastify";
|
|
5
|
+
import "../../../util/pubsub.es.js";
|
|
6
|
+
import { parseCellId } from "../utils/cellUtils.es.js";
|
|
7
|
+
import "../context/CellEditingContext.es.js";
|
|
8
|
+
import "../context/ClipboardContext.es.js";
|
|
9
|
+
import "../../../../../_virtual/jsx-runtime.es.js";
|
|
10
|
+
import "@tanstack/react-table";
|
|
11
|
+
import "../context/SelectionCellsContext.es.js";
|
|
12
|
+
import "../ProjectTreeTable.es.js";
|
|
13
|
+
import "../context/ColumnSettingsContext.es.js";
|
|
14
|
+
import { useProjectTableContext } from "../context/ProjectTableContext.es.js";
|
|
15
|
+
import "../context/ProjectTableQueriesContext.es.js";
|
|
16
|
+
import "../context/SelectedRowsContext.es.js";
|
|
17
|
+
/* empty css */
|
|
18
|
+
import "clsx";
|
|
19
|
+
import "../../ContextMenu/ContextMenuContext.es.js";
|
|
20
|
+
import "../../../api/base/client.es.js";
|
|
21
|
+
import "../../../api/generated/graphql.es.js";
|
|
22
|
+
import "../../../api/generated/access.es.js";
|
|
23
|
+
import "../../../api/generated/actions.es.js";
|
|
24
|
+
import "../../../api/generated/activityFeed.es.js";
|
|
25
|
+
import "../../../api/generated/addons.es.js";
|
|
26
|
+
import "../../../api/generated/anatomy.es.js";
|
|
27
|
+
import "../../../api/generated/attributes.es.js";
|
|
28
|
+
import "../../../api/generated/authentication.es.js";
|
|
29
|
+
import "../../../api/generated/bundles.es.js";
|
|
30
|
+
import "../../../api/generated/configuration.es.js";
|
|
31
|
+
import "../../../api/generated/desktop.es.js";
|
|
32
|
+
import "../../../api/generated/entityLists.es.js";
|
|
33
|
+
import "../../../api/generated/events.es.js";
|
|
34
|
+
import "../../../api/generated/files.es.js";
|
|
35
|
+
import "../../../api/generated/folders.es.js";
|
|
36
|
+
import "../../../api/generated/inbox.es.js";
|
|
37
|
+
import "../../../api/generated/links.es.js";
|
|
38
|
+
import "../../../api/generated/market.es.js";
|
|
39
|
+
import "../../../api/generated/onboarding.es.js";
|
|
40
|
+
import "../../../api/generated/operations.es.js";
|
|
41
|
+
import "../../../api/generated/products.es.js";
|
|
42
|
+
import "../../../api/generated/projectDashboard.es.js";
|
|
43
|
+
import "../../../api/generated/projects.es.js";
|
|
44
|
+
import "../../../api/generated/reviewables.es.js";
|
|
45
|
+
import "../../../api/generated/services.es.js";
|
|
46
|
+
import "../../../api/generated/system.es.js";
|
|
47
|
+
import "../../../api/generated/tasks.es.js";
|
|
48
|
+
import "../../../api/generated/teams.es.js";
|
|
49
|
+
import "../../../api/generated/thumbnails.es.js";
|
|
50
|
+
import "../../../api/generated/uRIs.es.js";
|
|
51
|
+
import "../../../api/generated/users.es.js";
|
|
52
|
+
import "../../../api/generated/versions.es.js";
|
|
53
|
+
import "../../../api/generated/workfiles.es.js";
|
|
54
|
+
import "../../../api/generated/ynputCloud.es.js";
|
|
55
|
+
import "../../../api/generated/grouping.es.js";
|
|
56
|
+
import "../../../api/queries/actions/getActions.es.js";
|
|
57
|
+
import "../../../api/queries/activities/getActivities.es.js";
|
|
58
|
+
import "../../../api/queries/activities/updateActivities.es.js";
|
|
59
|
+
import "../../../api/queries/activities/updateReaction.es.js";
|
|
60
|
+
import "../../../api/queries/activities/getMentions.es.js";
|
|
61
|
+
import "../../../api/queries/addons/getAddons.es.js";
|
|
62
|
+
import "../../../api/queries/addons/updateAddons.es.js";
|
|
63
|
+
import "../../../api/queries/attributes/getAttributes.es.js";
|
|
64
|
+
import "../../../api/queries/attributes/updateAttributes.es.js";
|
|
65
|
+
import "../../../api/queries/authentication/getAuthentication.es.js";
|
|
66
|
+
import "../../../api/queries/entities/getEntity.es.js";
|
|
67
|
+
import "../../../api/queries/entities/getEntityPanel.es.js";
|
|
68
|
+
import "../../../api/queries/entities/updateEntity.es.js";
|
|
69
|
+
import "../../../api/queries/entityLists/getLists.es.js";
|
|
70
|
+
import "../../../api/queries/entityLists/updateLists.es.js";
|
|
71
|
+
import "../../../api/queries/entityLists/getListsAttributes.es.js";
|
|
72
|
+
import "../../../api/queries/entityLists/updateListsAttributes.es.js";
|
|
73
|
+
import "../../../api/queries/folders/getFolders.es.js";
|
|
74
|
+
import "../../../api/queries/overview/getOverview.es.js";
|
|
75
|
+
import "../../../api/queries/overview/updateOverview.es.js";
|
|
76
|
+
import "../../../api/queries/project/getProject.es.js";
|
|
77
|
+
import "../../../api/queries/project/updateProject.es.js";
|
|
78
|
+
import "../../../api/queries/review/getReview.es.js";
|
|
79
|
+
import "../../../api/queries/review/updateReview.es.js";
|
|
80
|
+
import "../../../api/queries/system/getSystem.es.js";
|
|
81
|
+
import "../../../api/queries/userDashboard/getUserDashboard.es.js";
|
|
82
|
+
import "../../../api/queries/users/getUsers.es.js";
|
|
83
|
+
import "../../../api/queries/users/updateUsers.es.js";
|
|
84
|
+
import "../../../api/queries/watchers/getWatchers.es.js";
|
|
85
|
+
import "../../../api/queries/permissions/getPermissions.es.js";
|
|
86
|
+
import "../../../api/queries/grouping/getGrouping.es.js";
|
|
87
|
+
import "../../../api/queries/versions/updateVersions.es.js";
|
|
88
|
+
import "../../../api/queries/products/createProduct.es.js";
|
|
89
|
+
import "../../../context/RemoteModulesContext.es.js";
|
|
90
|
+
import "../../../../../_virtual/runtime.es.js";
|
|
91
|
+
import "../../../../../_virtual/semver.es.js";
|
|
92
|
+
import "../../../context/DetailsPanelContext.es.js";
|
|
93
|
+
import "../../../context/ThumbnailUploaderContext.es.js";
|
|
94
|
+
import "../../../context/SettingsPanelContext.es.js";
|
|
95
|
+
import "../../../context/pip/PiPProvider.es.js";
|
|
96
|
+
import "react-dom";
|
|
97
|
+
import "../../../context/pip/PiPWrapper.es.js";
|
|
98
|
+
import "../../../context/AddonProjectContext.es.js";
|
|
99
|
+
import "../../../context/AddonContext.es.js";
|
|
100
|
+
import "../../../context/PowerpackContext.es.js";
|
|
101
|
+
import "react-redux";
|
|
102
|
+
import "custom-protocol-check";
|
|
103
|
+
import "../components/GroupSettingsFallback.es.js";
|
|
104
|
+
import "../context/ProjectDataContext.es.js";
|
|
105
|
+
const useCheckSelectedCellsVisible = ({
|
|
106
|
+
selectedCells,
|
|
107
|
+
setSelectedCells,
|
|
108
|
+
focusedCellId,
|
|
109
|
+
setFocusedCellId
|
|
110
|
+
}) => {
|
|
111
|
+
const { getEntityById } = useProjectTableContext();
|
|
112
|
+
useEffect(() => {
|
|
113
|
+
var _a;
|
|
114
|
+
const missingCells = /* @__PURE__ */ new Set();
|
|
115
|
+
for (const cellId of selectedCells) {
|
|
116
|
+
if (!getEntityById(((_a = parseCellId(cellId || "")) == null ? void 0 : _a.rowId) || "")) {
|
|
117
|
+
missingCells.add(cellId);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (missingCells.size > 0) {
|
|
121
|
+
const newSelection = new Set(selectedCells);
|
|
122
|
+
for (const cellId of missingCells) {
|
|
123
|
+
newSelection.delete(cellId);
|
|
124
|
+
}
|
|
125
|
+
setSelectedCells(newSelection);
|
|
126
|
+
if (missingCells.has(focusedCellId || "")) {
|
|
127
|
+
setFocusedCellId(null);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}, [getEntityById, selectedCells, focusedCellId, setSelectedCells, setFocusedCellId]);
|
|
131
|
+
};
|
|
132
|
+
export {
|
|
133
|
+
useCheckSelectedCellsVisible
|
|
134
|
+
};
|
|
135
|
+
//# sourceMappingURL=useCheckSelectedCellsVisible.es.js.map
|
package/dist/shared/src/containers/ProjectTreeTable/hooks/useCheckSelectedCellsVisible.es.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCheckSelectedCellsVisible.es.js","sources":["../../../../../../src/containers/ProjectTreeTable/hooks/useCheckSelectedCellsVisible.ts"],"sourcesContent":["// This hooks checks the current selection of cells is actually visible in the current viewport of the table\n// If they are not visible, they will be removed from the selection\n// This can happen when the user changes the slicer selection or filters (combined filters changes)\n\nimport { useEffect } from 'react'\nimport { CellId, parseCellId } from '../utils'\nimport { useProjectTableContext } from '../context'\n\ntype CheckSelectedCellsVisibleProps = {\n selectedCells: Set<CellId>\n setSelectedCells: (cells: Set<CellId>) => void\n focusedCellId: CellId | null\n setFocusedCellId: (cellId: CellId | null) => void\n}\n\nexport const useCheckSelectedCellsVisible = ({\n selectedCells,\n setSelectedCells,\n focusedCellId,\n setFocusedCellId,\n}: CheckSelectedCellsVisibleProps): void => {\n const { getEntityById } = useProjectTableContext()\n\n // checks that all of the selected cells are in the tableData\n // if they are not, they will be removed from the selection\n useEffect(() => {\n const missingCells = new Set<CellId>()\n for (const cellId of selectedCells) {\n // check if the cell rowId is in\n if (!getEntityById(parseCellId(cellId || '')?.rowId || '')) {\n missingCells.add(cellId)\n }\n }\n\n if (missingCells.size > 0) {\n // remove the missing cells from the selection\n const newSelection = new Set<CellId>(selectedCells)\n for (const cellId of missingCells) {\n newSelection.delete(cellId)\n }\n\n setSelectedCells(newSelection)\n\n // if the focused cell is one of the missing cells, clear it\n if (missingCells.has(focusedCellId || '')) {\n setFocusedCellId(null)\n }\n }\n }, [getEntityById, selectedCells, focusedCellId, setSelectedCells, setFocusedCellId])\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeO,MAAM,+BAA+B,CAAC;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA4C;AACpC,QAAA,EAAE,cAAc,IAAI,uBAAuB;AAIjD,YAAU,MAAM;;AACR,UAAA,mCAAmB,IAAY;AACrC,eAAW,UAAU,eAAe;AAE9B,UAAA,CAAC,gBAAc,iBAAY,UAAU,EAAE,MAAxB,mBAA2B,UAAS,EAAE,GAAG;AAC1D,qBAAa,IAAI,MAAM;AAAA,MAAA;AAAA,IACzB;AAGE,QAAA,aAAa,OAAO,GAAG;AAEnB,YAAA,eAAe,IAAI,IAAY,aAAa;AAClD,iBAAW,UAAU,cAAc;AACjC,qBAAa,OAAO,MAAM;AAAA,MAAA;AAG5B,uBAAiB,YAAY;AAG7B,UAAI,aAAa,IAAI,iBAAiB,EAAE,GAAG;AACzC,yBAAiB,IAAI;AAAA,MAAA;AAAA,IACvB;AAAA,EACF,GACC,CAAC,eAAe,eAAe,eAAe,kBAAkB,gBAAgB,CAAC;AACtF;"}
|
|
@@ -63,12 +63,14 @@ const useDeleteEntities = ({ onSuccess }) => {
|
|
|
63
63
|
var _a;
|
|
64
64
|
const FOLDER_WITH_CHILDREN_CODE = "delete-folder-with-children";
|
|
65
65
|
if ((_a = error == null ? void 0 : error.errorCodes) == null ? void 0 : _a.includes(FOLDER_WITH_CHILDREN_CODE)) {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
}
|
|
66
|
+
const confirmForce = window.confirm(
|
|
67
|
+
`Are you really sure you want to delete ${entityLabel} and all of its dependencies? This cannot be undone. (NOT RECOMMENDED)`
|
|
68
|
+
);
|
|
69
|
+
if (confirmForce) {
|
|
70
|
+
deleteEntities(true);
|
|
71
|
+
} else {
|
|
72
|
+
console.log("User cancelled forced delete");
|
|
73
|
+
}
|
|
72
74
|
}
|
|
73
75
|
},
|
|
74
76
|
deleteLabel: "Delete forever"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDeleteEntities.cjs.js","sources":["../../../../../../src/containers/ProjectTreeTable/hooks/useDeleteEntities.ts"],"sourcesContent":["import { useCallback } from 'react'\nimport { useProjectTableQueriesContext } from '../context/ProjectTableQueriesContext'\n// TODO: confirmDelete uses prime react, so we should find a different solution\nimport { confirmDelete } from '../../../util'\nimport { useProjectTableContext } from '../context/ProjectTableContext'\nimport { toast } from 'react-toastify'\nimport { EntityMap } from '../types'\nimport { OperationWithRowId } from './useUpdateTableData'\n\ntype UseDeleteEntitiesProps = {\n onSuccess?: () => void\n}\n\nconst useDeleteEntities = ({ onSuccess }: UseDeleteEntitiesProps) => {\n const { updateEntities } = useProjectTableQueriesContext()\n\n const { getEntityById } = useProjectTableContext()\n\n const getValidEntity = (entityId: string): (EntityMap & { rowId: string }) | null => {\n const entity = getEntityById(entityId) as EntityMap & { rowId: string }\n return entity || null\n }\n\n const handleDeleteEntities = useCallback(\n async (entityIds: string[]) => {\n if (!entityIds || entityIds.length === 0) {\n toast.error('No entities selected')\n return\n }\n\n const fullEntities: (EntityMap & { rowId: string })[] = []\n const addedEntityIds = new Set<string>()\n\n for (const id of entityIds) {\n const entity = getValidEntity(id)\n if (entity && !addedEntityIds.has(entity.id)) {\n fullEntities.push(entity)\n addedEntityIds.add(entity.id)\n }\n }\n\n if (fullEntities.length === 0) {\n toast.error('No entities found')\n return\n }\n\n const deleteEntities = async (force = false) => {\n const operations: OperationWithRowId[] = []\n for (const e of fullEntities) {\n if (!e) continue\n operations.push({\n entityType: 'folderId' in e ? 'task' : 'folder',\n type: 'delete',\n entityId: e.id,\n rowId: e.rowId,\n force,\n })\n }\n try {\n await updateEntities?.({ operations })\n if (onSuccess) {\n onSuccess()\n }\n } catch (error: any) {\n const message = error?.error || 'Failed to delete entities'\n console.error(`Failed to delete entities:`, error)\n throw { message, ...error }\n }\n }\n\n const entityLabel =\n fullEntities.length === 1\n ? `\"${fullEntities[0].label || fullEntities[0].name}\"`\n : `${fullEntities.length} entities`\n\n confirmDelete({\n label: 'folders and tasks',\n message: `Are you sure you want to delete ${entityLabel}? This action cannot be undone.`,\n accept: deleteEntities,\n onError: (error: any) => {\n const FOLDER_WITH_CHILDREN_CODE = 'delete-folder-with-children'\n // check if the error is because of child tasks, products\n if (error?.errorCodes?.includes(FOLDER_WITH_CHILDREN_CODE)) {\n
|
|
1
|
+
{"version":3,"file":"useDeleteEntities.cjs.js","sources":["../../../../../../src/containers/ProjectTreeTable/hooks/useDeleteEntities.ts"],"sourcesContent":["import { useCallback } from 'react'\nimport { useProjectTableQueriesContext } from '../context/ProjectTableQueriesContext'\n// TODO: confirmDelete uses prime react, so we should find a different solution\nimport { confirmDelete } from '../../../util'\nimport { useProjectTableContext } from '../context/ProjectTableContext'\nimport { toast } from 'react-toastify'\nimport { EntityMap } from '../types'\nimport { OperationWithRowId } from './useUpdateTableData'\n\ntype UseDeleteEntitiesProps = {\n onSuccess?: () => void\n}\n\nconst useDeleteEntities = ({ onSuccess }: UseDeleteEntitiesProps) => {\n const { updateEntities } = useProjectTableQueriesContext()\n\n const { getEntityById } = useProjectTableContext()\n\n const getValidEntity = (entityId: string): (EntityMap & { rowId: string }) | null => {\n const entity = getEntityById(entityId) as EntityMap & { rowId: string }\n return entity || null\n }\n\n const handleDeleteEntities = useCallback(\n async (entityIds: string[]) => {\n if (!entityIds || entityIds.length === 0) {\n toast.error('No entities selected')\n return\n }\n\n const fullEntities: (EntityMap & { rowId: string })[] = []\n const addedEntityIds = new Set<string>()\n\n for (const id of entityIds) {\n const entity = getValidEntity(id)\n if (entity && !addedEntityIds.has(entity.id)) {\n fullEntities.push(entity)\n addedEntityIds.add(entity.id)\n }\n }\n\n if (fullEntities.length === 0) {\n toast.error('No entities found')\n return\n }\n\n const deleteEntities = async (force = false) => {\n const operations: OperationWithRowId[] = []\n for (const e of fullEntities) {\n if (!e) continue\n operations.push({\n entityType: 'folderId' in e ? 'task' : 'folder',\n type: 'delete',\n entityId: e.id,\n rowId: e.rowId,\n force,\n })\n }\n try {\n await updateEntities?.({ operations })\n if (onSuccess) {\n onSuccess()\n }\n } catch (error: any) {\n const message = error?.error || 'Failed to delete entities'\n console.error(`Failed to delete entities:`, error)\n throw { message, ...error }\n }\n }\n\n const entityLabel =\n fullEntities.length === 1\n ? `\"${fullEntities[0].label || fullEntities[0].name}\"`\n : `${fullEntities.length} entities`\n\n confirmDelete({\n label: 'folders and tasks',\n message: `Are you sure you want to delete ${entityLabel}? This action cannot be undone.`,\n accept: deleteEntities,\n onError: (error: any) => {\n const FOLDER_WITH_CHILDREN_CODE = 'delete-folder-with-children'\n // check if the error is because of child tasks, products\n if (error?.errorCodes?.includes(FOLDER_WITH_CHILDREN_CODE)) {\n const confirmForce = window.confirm(\n `Are you really sure you want to delete ${entityLabel} and all of its dependencies? This cannot be undone. (NOT RECOMMENDED)`,\n )\n if (confirmForce) {\n deleteEntities(true)\n } else {\n console.log('User cancelled forced delete')\n }\n }\n },\n deleteLabel: 'Delete forever',\n })\n },\n [getEntityById, updateEntities, onSuccess],\n )\n\n return handleDeleteEntities\n}\n\nexport default useDeleteEntities\n"],"names":["useProjectTableQueriesContext","useProjectTableContext","useCallback","toast","confirmDelete"],"mappings":";;;;;;;AAaA,MAAM,oBAAoB,CAAC,EAAE,gBAAwC;AAC7D,QAAA,EAAE,eAAe,IAAIA,yDAA8B;AAEnD,QAAA,EAAE,cAAc,IAAIC,2CAAuB;AAE3C,QAAA,iBAAiB,CAAC,aAA6D;AAC7E,UAAA,SAAS,cAAc,QAAQ;AACrC,WAAO,UAAU;AAAA,EACnB;AAEA,QAAM,uBAAuBC,MAAA;AAAA,IAC3B,OAAO,cAAwB;AAC7B,UAAI,CAAC,aAAa,UAAU,WAAW,GAAG;AACxCC,sBAAA,MAAM,MAAM,sBAAsB;AAClC;AAAA,MAAA;AAGF,YAAM,eAAkD,CAAC;AACnD,YAAA,qCAAqB,IAAY;AAEvC,iBAAW,MAAM,WAAW;AACpB,cAAA,SAAS,eAAe,EAAE;AAChC,YAAI,UAAU,CAAC,eAAe,IAAI,OAAO,EAAE,GAAG;AAC5C,uBAAa,KAAK,MAAM;AACT,yBAAA,IAAI,OAAO,EAAE;AAAA,QAAA;AAAA,MAC9B;AAGE,UAAA,aAAa,WAAW,GAAG;AAC7BA,sBAAA,MAAM,MAAM,mBAAmB;AAC/B;AAAA,MAAA;AAGI,YAAA,iBAAiB,OAAO,QAAQ,UAAU;AAC9C,cAAM,aAAmC,CAAC;AAC1C,mBAAW,KAAK,cAAc;AAC5B,cAAI,CAAC,EAAG;AACR,qBAAW,KAAK;AAAA,YACd,YAAY,cAAc,IAAI,SAAS;AAAA,YACvC,MAAM;AAAA,YACN,UAAU,EAAE;AAAA,YACZ,OAAO,EAAE;AAAA,YACT;AAAA,UAAA,CACD;AAAA,QAAA;AAEC,YAAA;AACI,iBAAA,iDAAiB,EAAE;AACzB,cAAI,WAAW;AACH,sBAAA;AAAA,UAAA;AAAA,iBAEL,OAAY;AACb,gBAAA,WAAU,+BAAO,UAAS;AACxB,kBAAA,MAAM,8BAA8B,KAAK;AAC3C,gBAAA,EAAE,SAAS,GAAG,MAAM;AAAA,QAAA;AAAA,MAE9B;AAEA,YAAM,cACJ,aAAa,WAAW,IACpB,IAAI,aAAa,CAAC,EAAE,SAAS,aAAa,CAAC,EAAE,IAAI,MACjD,GAAG,aAAa,MAAM;AAEdC,kCAAA;AAAA,QACZ,OAAO;AAAA,QACP,SAAS,mCAAmC,WAAW;AAAA,QACvD,QAAQ;AAAA,QACR,SAAS,CAAC,UAAe;;AACvB,gBAAM,4BAA4B;AAElC,eAAI,oCAAO,eAAP,mBAAmB,SAAS,4BAA4B;AAC1D,kBAAM,eAAe,OAAO;AAAA,cAC1B,0CAA0C,WAAW;AAAA,YACvD;AACA,gBAAI,cAAc;AAChB,6BAAe,IAAI;AAAA,YAAA,OACd;AACL,sBAAQ,IAAI,8BAA8B;AAAA,YAAA;AAAA,UAC5C;AAAA,QAEJ;AAAA,QACA,aAAa;AAAA,MAAA,CACd;AAAA,IACH;AAAA,IACA,CAAC,eAAe,gBAAgB,SAAS;AAAA,EAC3C;AAEO,SAAA;AACT;;"}
|
|
@@ -62,12 +62,14 @@ const useDeleteEntities = ({ onSuccess }) => {
|
|
|
62
62
|
var _a;
|
|
63
63
|
const FOLDER_WITH_CHILDREN_CODE = "delete-folder-with-children";
|
|
64
64
|
if ((_a = error == null ? void 0 : error.errorCodes) == null ? void 0 : _a.includes(FOLDER_WITH_CHILDREN_CODE)) {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
}
|
|
65
|
+
const confirmForce = window.confirm(
|
|
66
|
+
`Are you really sure you want to delete ${entityLabel} and all of its dependencies? This cannot be undone. (NOT RECOMMENDED)`
|
|
67
|
+
);
|
|
68
|
+
if (confirmForce) {
|
|
69
|
+
deleteEntities(true);
|
|
70
|
+
} else {
|
|
71
|
+
console.log("User cancelled forced delete");
|
|
72
|
+
}
|
|
71
73
|
}
|
|
72
74
|
},
|
|
73
75
|
deleteLabel: "Delete forever"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDeleteEntities.es.js","sources":["../../../../../../src/containers/ProjectTreeTable/hooks/useDeleteEntities.ts"],"sourcesContent":["import { useCallback } from 'react'\nimport { useProjectTableQueriesContext } from '../context/ProjectTableQueriesContext'\n// TODO: confirmDelete uses prime react, so we should find a different solution\nimport { confirmDelete } from '../../../util'\nimport { useProjectTableContext } from '../context/ProjectTableContext'\nimport { toast } from 'react-toastify'\nimport { EntityMap } from '../types'\nimport { OperationWithRowId } from './useUpdateTableData'\n\ntype UseDeleteEntitiesProps = {\n onSuccess?: () => void\n}\n\nconst useDeleteEntities = ({ onSuccess }: UseDeleteEntitiesProps) => {\n const { updateEntities } = useProjectTableQueriesContext()\n\n const { getEntityById } = useProjectTableContext()\n\n const getValidEntity = (entityId: string): (EntityMap & { rowId: string }) | null => {\n const entity = getEntityById(entityId) as EntityMap & { rowId: string }\n return entity || null\n }\n\n const handleDeleteEntities = useCallback(\n async (entityIds: string[]) => {\n if (!entityIds || entityIds.length === 0) {\n toast.error('No entities selected')\n return\n }\n\n const fullEntities: (EntityMap & { rowId: string })[] = []\n const addedEntityIds = new Set<string>()\n\n for (const id of entityIds) {\n const entity = getValidEntity(id)\n if (entity && !addedEntityIds.has(entity.id)) {\n fullEntities.push(entity)\n addedEntityIds.add(entity.id)\n }\n }\n\n if (fullEntities.length === 0) {\n toast.error('No entities found')\n return\n }\n\n const deleteEntities = async (force = false) => {\n const operations: OperationWithRowId[] = []\n for (const e of fullEntities) {\n if (!e) continue\n operations.push({\n entityType: 'folderId' in e ? 'task' : 'folder',\n type: 'delete',\n entityId: e.id,\n rowId: e.rowId,\n force,\n })\n }\n try {\n await updateEntities?.({ operations })\n if (onSuccess) {\n onSuccess()\n }\n } catch (error: any) {\n const message = error?.error || 'Failed to delete entities'\n console.error(`Failed to delete entities:`, error)\n throw { message, ...error }\n }\n }\n\n const entityLabel =\n fullEntities.length === 1\n ? `\"${fullEntities[0].label || fullEntities[0].name}\"`\n : `${fullEntities.length} entities`\n\n confirmDelete({\n label: 'folders and tasks',\n message: `Are you sure you want to delete ${entityLabel}? This action cannot be undone.`,\n accept: deleteEntities,\n onError: (error: any) => {\n const FOLDER_WITH_CHILDREN_CODE = 'delete-folder-with-children'\n // check if the error is because of child tasks, products\n if (error?.errorCodes?.includes(FOLDER_WITH_CHILDREN_CODE)) {\n
|
|
1
|
+
{"version":3,"file":"useDeleteEntities.es.js","sources":["../../../../../../src/containers/ProjectTreeTable/hooks/useDeleteEntities.ts"],"sourcesContent":["import { useCallback } from 'react'\nimport { useProjectTableQueriesContext } from '../context/ProjectTableQueriesContext'\n// TODO: confirmDelete uses prime react, so we should find a different solution\nimport { confirmDelete } from '../../../util'\nimport { useProjectTableContext } from '../context/ProjectTableContext'\nimport { toast } from 'react-toastify'\nimport { EntityMap } from '../types'\nimport { OperationWithRowId } from './useUpdateTableData'\n\ntype UseDeleteEntitiesProps = {\n onSuccess?: () => void\n}\n\nconst useDeleteEntities = ({ onSuccess }: UseDeleteEntitiesProps) => {\n const { updateEntities } = useProjectTableQueriesContext()\n\n const { getEntityById } = useProjectTableContext()\n\n const getValidEntity = (entityId: string): (EntityMap & { rowId: string }) | null => {\n const entity = getEntityById(entityId) as EntityMap & { rowId: string }\n return entity || null\n }\n\n const handleDeleteEntities = useCallback(\n async (entityIds: string[]) => {\n if (!entityIds || entityIds.length === 0) {\n toast.error('No entities selected')\n return\n }\n\n const fullEntities: (EntityMap & { rowId: string })[] = []\n const addedEntityIds = new Set<string>()\n\n for (const id of entityIds) {\n const entity = getValidEntity(id)\n if (entity && !addedEntityIds.has(entity.id)) {\n fullEntities.push(entity)\n addedEntityIds.add(entity.id)\n }\n }\n\n if (fullEntities.length === 0) {\n toast.error('No entities found')\n return\n }\n\n const deleteEntities = async (force = false) => {\n const operations: OperationWithRowId[] = []\n for (const e of fullEntities) {\n if (!e) continue\n operations.push({\n entityType: 'folderId' in e ? 'task' : 'folder',\n type: 'delete',\n entityId: e.id,\n rowId: e.rowId,\n force,\n })\n }\n try {\n await updateEntities?.({ operations })\n if (onSuccess) {\n onSuccess()\n }\n } catch (error: any) {\n const message = error?.error || 'Failed to delete entities'\n console.error(`Failed to delete entities:`, error)\n throw { message, ...error }\n }\n }\n\n const entityLabel =\n fullEntities.length === 1\n ? `\"${fullEntities[0].label || fullEntities[0].name}\"`\n : `${fullEntities.length} entities`\n\n confirmDelete({\n label: 'folders and tasks',\n message: `Are you sure you want to delete ${entityLabel}? This action cannot be undone.`,\n accept: deleteEntities,\n onError: (error: any) => {\n const FOLDER_WITH_CHILDREN_CODE = 'delete-folder-with-children'\n // check if the error is because of child tasks, products\n if (error?.errorCodes?.includes(FOLDER_WITH_CHILDREN_CODE)) {\n const confirmForce = window.confirm(\n `Are you really sure you want to delete ${entityLabel} and all of its dependencies? This cannot be undone. (NOT RECOMMENDED)`,\n )\n if (confirmForce) {\n deleteEntities(true)\n } else {\n console.log('User cancelled forced delete')\n }\n }\n },\n deleteLabel: 'Delete forever',\n })\n },\n [getEntityById, updateEntities, onSuccess],\n )\n\n return handleDeleteEntities\n}\n\nexport default useDeleteEntities\n"],"names":[],"mappings":";;;;;;AAaA,MAAM,oBAAoB,CAAC,EAAE,gBAAwC;AAC7D,QAAA,EAAE,eAAe,IAAI,8BAA8B;AAEnD,QAAA,EAAE,cAAc,IAAI,uBAAuB;AAE3C,QAAA,iBAAiB,CAAC,aAA6D;AAC7E,UAAA,SAAS,cAAc,QAAQ;AACrC,WAAO,UAAU;AAAA,EACnB;AAEA,QAAM,uBAAuB;AAAA,IAC3B,OAAO,cAAwB;AAC7B,UAAI,CAAC,aAAa,UAAU,WAAW,GAAG;AACxC,cAAM,MAAM,sBAAsB;AAClC;AAAA,MAAA;AAGF,YAAM,eAAkD,CAAC;AACnD,YAAA,qCAAqB,IAAY;AAEvC,iBAAW,MAAM,WAAW;AACpB,cAAA,SAAS,eAAe,EAAE;AAChC,YAAI,UAAU,CAAC,eAAe,IAAI,OAAO,EAAE,GAAG;AAC5C,uBAAa,KAAK,MAAM;AACT,yBAAA,IAAI,OAAO,EAAE;AAAA,QAAA;AAAA,MAC9B;AAGE,UAAA,aAAa,WAAW,GAAG;AAC7B,cAAM,MAAM,mBAAmB;AAC/B;AAAA,MAAA;AAGI,YAAA,iBAAiB,OAAO,QAAQ,UAAU;AAC9C,cAAM,aAAmC,CAAC;AAC1C,mBAAW,KAAK,cAAc;AAC5B,cAAI,CAAC,EAAG;AACR,qBAAW,KAAK;AAAA,YACd,YAAY,cAAc,IAAI,SAAS;AAAA,YACvC,MAAM;AAAA,YACN,UAAU,EAAE;AAAA,YACZ,OAAO,EAAE;AAAA,YACT;AAAA,UAAA,CACD;AAAA,QAAA;AAEC,YAAA;AACI,iBAAA,iDAAiB,EAAE;AACzB,cAAI,WAAW;AACH,sBAAA;AAAA,UAAA;AAAA,iBAEL,OAAY;AACb,gBAAA,WAAU,+BAAO,UAAS;AACxB,kBAAA,MAAM,8BAA8B,KAAK;AAC3C,gBAAA,EAAE,SAAS,GAAG,MAAM;AAAA,QAAA;AAAA,MAE9B;AAEA,YAAM,cACJ,aAAa,WAAW,IACpB,IAAI,aAAa,CAAC,EAAE,SAAS,aAAa,CAAC,EAAE,IAAI,MACjD,GAAG,aAAa,MAAM;AAEd,oBAAA;AAAA,QACZ,OAAO;AAAA,QACP,SAAS,mCAAmC,WAAW;AAAA,QACvD,QAAQ;AAAA,QACR,SAAS,CAAC,UAAe;;AACvB,gBAAM,4BAA4B;AAElC,eAAI,oCAAO,eAAP,mBAAmB,SAAS,4BAA4B;AAC1D,kBAAM,eAAe,OAAO;AAAA,cAC1B,0CAA0C,WAAW;AAAA,YACvD;AACA,gBAAI,cAAc;AAChB,6BAAe,IAAI;AAAA,YAAA,OACd;AACL,sBAAQ,IAAI,8BAA8B;AAAA,YAAA;AAAA,UAC5C;AAAA,QAEJ;AAAA,QACA,aAAa;AAAA,MAAA,CACd;AAAA,IACH;AAAA,IACA,CAAC,eAAe,gBAAgB,SAAS;AAAA,EAC3C;AAEO,SAAA;AACT;"}
|
|
@@ -85,8 +85,7 @@ function useFolderRelationships({
|
|
|
85
85
|
const pendingAttribs = new Set(attribNames);
|
|
86
86
|
let currentId = folderId;
|
|
87
87
|
while (pendingAttribs.size > 0) {
|
|
88
|
-
|
|
89
|
-
const folder = getEntityById(currentId);
|
|
88
|
+
const folder = getEntityById(currentId || "");
|
|
90
89
|
if (!folder || !currentId) {
|
|
91
90
|
for (const attribName of pendingAttribs) {
|
|
92
91
|
if (projectAttrib && attribName in projectAttrib) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFolderRelationships.cjs.js","sources":["../../../../../../src/containers/ProjectTreeTable/hooks/useFolderRelationships.ts"],"sourcesContent":["import { useCallback, useMemo } from 'react'\nimport {\n EditorTaskNode,\n EMapResult,\n EntitiesMap,\n FolderNodeMap,\n MatchingFolder,\n TaskNodeMap,\n} from '../types/table'\nimport { ProjectAttribModel2 } from '../types/project'\nimport { ProjectTableAttribute } from '../types'\nimport { getEntityDataById } from '../utils/cellUtils'\n\nexport interface InheritedDependent {\n entityId: string\n entityType: 'task' | 'folder'\n attrib: Record<string, any> // all attribs that are inherited from the parent and their new value\n}\nexport type GetInheritedDependents = (entities: InheritedDependent[]) => InheritedDependent[]\nexport type FindInheritedValueFromAncestors = (\n entityId: string,\n entityType: 'folder' | 'task',\n attribName: string,\n) => any\nexport type FindNonInheritedValues = (\n folderId: string,\n attribNames: string[],\n) => Record<string, any>\nexport type GetAncestorsOf = (id: string) => string[]\ninterface UseFolderRelationshipsProps {\n tasksMap?: TaskNodeMap\n entitiesMap?: EntitiesMap\n tasksByFolderMap?: Map<string, string[]>\n getEntityById: (id: string) => any\n projectAttrib: ProjectAttribModel2 | undefined\n attribFields: ProjectTableAttribute[] | undefined\n}\n\nexport default function useFolderRelationships({\n tasksMap,\n entitiesMap,\n tasksByFolderMap,\n getEntityById,\n projectAttrib,\n attribFields,\n}: UseFolderRelationshipsProps) {\n // Pre-compute folder-children relationships\n const folderChildrenMap = useMemo(() => {\n const map = new Map<string, string[]>()\n if (!entitiesMap) return map\n for (const folder of entitiesMap.values()) {\n // Skip if not a folder\n if (folder.entityType !== 'folder') continue\n const parentId = folder.parentId\n if (!parentId) continue\n\n if (!map.has(parentId)) {\n map.set(parentId, [])\n }\n map.get(parentId)!.push(folder.id)\n }\n return map\n }, [entitiesMap])\n\n const getChildrenEntities = useCallback(\n (id: string) => {\n const descendants: (MatchingFolder | EditorTaskNode)[] = []\n const queue: string[] = [id]\n const visited = new Set<string>()\n\n while (queue.length > 0) {\n const currentId = queue.shift()!\n\n if (visited.has(currentId)) continue\n visited.add(currentId)\n\n // Skip adding the root folder to descendants\n if (currentId !== id && entitiesMap) {\n const folder = getEntityDataById<'folder'>(currentId, entitiesMap)\n if (folder) descendants.push({ ...folder, entityType: 'folder' })\n }\n\n // Add tasks efficiently with a single lookup\n const taskIds = tasksByFolderMap?.get(currentId)\n if (taskIds?.length && entitiesMap) {\n for (const taskId of taskIds) {\n const task = getEntityDataById<'task'>(taskId, entitiesMap)\n if (task) descendants.push({ ...task, entityType: 'task' })\n }\n }\n\n // Add folder children to queue\n const childFolderIds = folderChildrenMap.get(currentId)\n if (childFolderIds?.length) {\n queue.push(...childFolderIds)\n }\n }\n\n return descendants\n },\n [entitiesMap, tasksByFolderMap, entitiesMap, folderChildrenMap],\n )\n\n // Helper function to get ancestors of a folder\n const getAncestorsOf: GetAncestorsOf = useCallback(\n (id) => {\n const ancestors: string[] = []\n let currentId = id\n\n while (true) {\n const entity = entitiesMap && getEntityDataById<'folder'>(currentId, entitiesMap)\n if (!entity || !entity.parentId) break\n\n ancestors.push(entity.parentId)\n currentId = entity.parentId\n }\n\n return ancestors\n },\n [entitiesMap],\n )\n\n // Helper function to get all folder ancestors of a task\n const getTaskAncestors = useCallback(\n (taskId: string): string[] => {\n const task = tasksMap?.get(taskId) as EMapResult<'task'>\n if (!task || !task.folderId) return []\n\n // Start with the direct parent folder\n const ancestors = [task.folderId]\n\n // Add all ancestors of the parent folder\n const folderAncestors = getAncestorsOf(task.folderId)\n ancestors.push(...folderAncestors)\n\n return ancestors\n },\n [tasksMap, getAncestorsOf],\n )\n\n // Helper function to find non-inherited values for multiple attributes from ancestors\n const findNonInheritedValues: FindNonInheritedValues = useCallback(\n (folderId, attribNames) => {\n if (!attribNames.length) return {}\n\n const result: Record<string, any> = {}\n const pendingAttribs = new Set(attribNames)\n\n // Start with the provided folder and traverse upward\n let currentId = folderId\n\n // Traverse up the folder hierarchy until we've found values for all attributes\n // or we've reached the root folder\n while (pendingAttribs.size > 0) {\n if (!currentId) break\n const folder = getEntityById(currentId)\n if (!folder || !currentId) {\n // use the project attrib\n for (const attribName of pendingAttribs) {\n if (projectAttrib && attribName in projectAttrib) {\n // @ts-ignore\n result[attribName] = projectAttrib[attribName]\n pendingAttribs.delete(attribName)\n }\n }\n\n // end search\n break\n }\n\n // Check if this folder has non-inherited values for any of our pending attributes\n for (const attribName of Array.from(pendingAttribs)) {\n if (\n folder.ownAttrib?.includes(attribName) &&\n folder.attrib &&\n attribName in folder.attrib\n ) {\n // Found a non-inherited value, add to result and remove from pending\n result[attribName] = folder.attrib[attribName]\n pendingAttribs.delete(attribName)\n }\n }\n\n // Move up to the parent folder\n currentId = folder.parentId\n }\n\n // For any attributes without non-inherited values found, set to null\n for (const attribName of pendingAttribs) {\n result[attribName] = null\n }\n\n return result\n },\n [getEntityById],\n )\n\n // Optimized implementation of getInheritedDependents\n const getInheritedDependents: GetInheritedDependents = useCallback(\n (entities) => {\n // console.time('getInheritedDependents') // 40ms - TODO improve this\n if (!entities.length) return []\n\n // Process all entities in one batch for efficiency\n const result: InheritedDependent[] = []\n\n // Track attributes that are owned (not inherited) to block inheritance\n const blockedInheritanceMap = new Map<string, Set<string>>()\n\n for (const entity of entities) {\n // check entity is folder\n if (entity.entityType !== 'folder') continue\n\n const attribEntries = Object.entries(entity.attrib)\n if (!attribEntries.length) continue\n\n const children = getChildrenEntities(entity.entityId)\n\n // filter out children that are in entities as they are already processed\n const filteredChildren = children.filter(\n (child) => !entities.find((e) => e.entityId === child.id),\n )\n\n if (!filteredChildren.length) continue\n\n for (const child of filteredChildren) {\n // Find which attributes would be inherited by this child\n const inheritedAttribs = attribEntries.filter(\n ([attribName]) =>\n !child.ownAttrib?.includes(attribName) &&\n attribFields?.find((a) => a.name === attribName)?.data?.inherit,\n )\n\n // Record attributes that child owns (has its own value for)\n const ownedAttribs = attribEntries.filter(([attribName]) =>\n child.ownAttrib?.includes(attribName),\n )\n\n // If the child has its own value for some attributes, block inheritance for its descendants\n if (ownedAttribs.length) {\n if (!blockedInheritanceMap.has(child.id)) {\n blockedInheritanceMap.set(child.id, new Set())\n }\n ownedAttribs.forEach(([attribName]) => {\n blockedInheritanceMap.get(child.id)!.add(attribName)\n })\n }\n\n // Filter out attributes blocked by ancestors\n const filteredInheritedAttribs = inheritedAttribs.filter(([attribName]) => {\n // Get ancestors based on entity type\n const ancestors =\n child.entityType === 'task' ? getTaskAncestors(child.id) : getAncestorsOf(child.id)\n\n // Check if any ancestor blocks this attribute\n for (const ancestor of ancestors) {\n if (\n blockedInheritanceMap.has(ancestor) &&\n blockedInheritanceMap.get(ancestor)!.has(attribName)\n ) {\n return false\n }\n }\n return true\n })\n\n if (filteredInheritedAttribs.length) {\n // Check if entity already exists in the result\n const existingEntityIndex = result.findIndex((item) => item.entityId === child.id)\n\n if (existingEntityIndex !== -1) {\n // Merge attributes with existing entry\n result[existingEntityIndex].attrib = {\n ...result[existingEntityIndex].attrib,\n ...Object.fromEntries(filteredInheritedAttribs),\n }\n } else {\n // Add new entity\n result.push({\n entityId: child.id,\n entityType: child.entityType || ('parentId' in child ? 'folder' : 'task'),\n attrib: Object.fromEntries(filteredInheritedAttribs),\n })\n }\n }\n }\n }\n\n // console.timeEnd('getInheritedDependents')\n\n return result\n },\n [getChildrenEntities, tasksMap, getTaskAncestors, getAncestorsOf],\n )\n\n // Helper function to find the inherited value for an attribute from ancestors\n const findInheritedValueFromAncestors = useCallback<FindInheritedValueFromAncestors>(\n (entityId, entityType, attribName) => {\n const entity = getEntityById(entityId)\n if (!entity) return null\n\n // For tasks, start with their parent folder\n let currentId = entityType === 'task' ? entity.folderId : entity.parentId\n\n // Traverse up the folder hierarchy\n while (currentId) {\n const ancestor = getEntityById(currentId)\n if (!ancestor) break\n\n // If the ancestor has its own value for this attribute, return it\n if (\n ancestor.ownAttrib?.includes(attribName) &&\n ancestor.attrib &&\n attribName in ancestor.attrib\n ) {\n return ancestor.attrib[attribName]\n }\n\n // Move up to the next parent\n currentId = ancestor.parentId\n }\n\n // If no ancestor has its own value, return null (will use the default)\n return null\n },\n [getEntityById],\n )\n\n return {\n folderChildrenMap,\n getChildrenEntities,\n getInheritedDependents,\n findInheritedValueFromAncestors,\n findNonInheritedValues,\n getAncestorsOf,\n }\n}\n"],"names":["useMemo","useCallback","getEntityDataById"],"mappings":";;;AAsCA,SAAwB,uBAAuB;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAgC;AAExB,QAAA,oBAAoBA,MAAAA,QAAQ,MAAM;AAChC,UAAA,0BAAU,IAAsB;AAClC,QAAA,CAAC,YAAoB,QAAA;AACd,eAAA,UAAU,YAAY,UAAU;AAErC,UAAA,OAAO,eAAe,SAAU;AACpC,YAAM,WAAW,OAAO;AACxB,UAAI,CAAC,SAAU;AAEf,UAAI,CAAC,IAAI,IAAI,QAAQ,GAAG;AAClB,YAAA,IAAI,UAAU,EAAE;AAAA,MAAA;AAEtB,UAAI,IAAI,QAAQ,EAAG,KAAK,OAAO,EAAE;AAAA,IAAA;AAE5B,WAAA;AAAA,EAAA,GACN,CAAC,WAAW,CAAC;AAEhB,QAAM,sBAAsBC,MAAA;AAAA,IAC1B,CAAC,OAAe;AACd,YAAM,cAAmD,CAAC;AACpD,YAAA,QAAkB,CAAC,EAAE;AACrB,YAAA,8BAAc,IAAY;AAEzB,aAAA,MAAM,SAAS,GAAG;AACjB,cAAA,YAAY,MAAM,MAAM;AAE1B,YAAA,QAAQ,IAAI,SAAS,EAAG;AAC5B,gBAAQ,IAAI,SAAS;AAGjB,YAAA,cAAc,MAAM,aAAa;AAC7B,gBAAA,SAASC,UAAAA,kBAA4B,WAAW,WAAW;AAC7D,cAAA,oBAAoB,KAAK,EAAE,GAAG,QAAQ,YAAY,UAAU;AAAA,QAAA;AAI5D,cAAA,UAAU,qDAAkB,IAAI;AAClC,aAAA,mCAAS,WAAU,aAAa;AAClC,qBAAW,UAAU,SAAS;AACtB,kBAAA,OAAOA,UAAAA,kBAA0B,QAAQ,WAAW;AACtD,gBAAA,kBAAkB,KAAK,EAAE,GAAG,MAAM,YAAY,QAAQ;AAAA,UAAA;AAAA,QAC5D;AAII,cAAA,iBAAiB,kBAAkB,IAAI,SAAS;AACtD,YAAI,iDAAgB,QAAQ;AACpB,gBAAA,KAAK,GAAG,cAAc;AAAA,QAAA;AAAA,MAC9B;AAGK,aAAA;AAAA,IACT;AAAA,IACA,CAAC,aAAa,kBAAkB,aAAa,iBAAiB;AAAA,EAChE;AAGA,QAAM,iBAAiCD,MAAA;AAAA,IACrC,CAAC,OAAO;AACN,YAAM,YAAsB,CAAC;AAC7B,UAAI,YAAY;AAEhB,aAAO,MAAM;AACX,cAAM,SAAS,eAAeC,4BAA4B,WAAW,WAAW;AAChF,YAAI,CAAC,UAAU,CAAC,OAAO,SAAU;AAEvB,kBAAA,KAAK,OAAO,QAAQ;AAC9B,oBAAY,OAAO;AAAA,MAAA;AAGd,aAAA;AAAA,IACT;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAGA,QAAM,mBAAmBD,MAAA;AAAA,IACvB,CAAC,WAA6B;AACtB,YAAA,OAAO,qCAAU,IAAI;AAC3B,UAAI,CAAC,QAAQ,CAAC,KAAK,iBAAiB,CAAC;AAG/B,YAAA,YAAY,CAAC,KAAK,QAAQ;AAG1B,YAAA,kBAAkB,eAAe,KAAK,QAAQ;AAC1C,gBAAA,KAAK,GAAG,eAAe;AAE1B,aAAA;AAAA,IACT;AAAA,IACA,CAAC,UAAU,cAAc;AAAA,EAC3B;AAGA,QAAM,yBAAiDA,MAAA;AAAA,IACrD,CAAC,UAAU,gBAAgB;;AACzB,UAAI,CAAC,YAAY,OAAQ,QAAO,CAAC;AAEjC,YAAM,SAA8B,CAAC;AAC/B,YAAA,iBAAiB,IAAI,IAAI,WAAW;AAG1C,UAAI,YAAY;AAIT,aAAA,eAAe,OAAO,GAAG;AAC9B,YAAI,CAAC,UAAW;AACV,cAAA,SAAS,cAAc,SAAS;AAClC,YAAA,CAAC,UAAU,CAAC,WAAW;AAEzB,qBAAW,cAAc,gBAAgB;AACnC,gBAAA,iBAAiB,cAAc,eAAe;AAEzC,qBAAA,UAAU,IAAI,cAAc,UAAU;AAC7C,6BAAe,OAAO,UAAU;AAAA,YAAA;AAAA,UAClC;AAIF;AAAA,QAAA;AAIF,mBAAW,cAAc,MAAM,KAAK,cAAc,GAAG;AAEjD,gBAAA,YAAO,cAAP,mBAAkB,SAAS,gBAC3B,OAAO,UACP,cAAc,OAAO,QACrB;AAEA,mBAAO,UAAU,IAAI,OAAO,OAAO,UAAU;AAC7C,2BAAe,OAAO,UAAU;AAAA,UAAA;AAAA,QAClC;AAIF,oBAAY,OAAO;AAAA,MAAA;AAIrB,iBAAW,cAAc,gBAAgB;AACvC,eAAO,UAAU,IAAI;AAAA,MAAA;AAGhB,aAAA;AAAA,IACT;AAAA,IACA,CAAC,aAAa;AAAA,EAChB;AAGA,QAAM,yBAAiDA,MAAA;AAAA,IACrD,CAAC,aAAa;AAEZ,UAAI,CAAC,SAAS,OAAQ,QAAO,CAAC;AAG9B,YAAM,SAA+B,CAAC;AAGhC,YAAA,4CAA4B,IAAyB;AAE3D,iBAAW,UAAU,UAAU;AAEzB,YAAA,OAAO,eAAe,SAAU;AAEpC,cAAM,gBAAgB,OAAO,QAAQ,OAAO,MAAM;AAC9C,YAAA,CAAC,cAAc,OAAQ;AAErB,cAAA,WAAW,oBAAoB,OAAO,QAAQ;AAGpD,cAAM,mBAAmB,SAAS;AAAA,UAChC,CAAC,UAAU,CAAC,SAAS,KAAK,CAAC,MAAM,EAAE,aAAa,MAAM,EAAE;AAAA,QAC1D;AAEI,YAAA,CAAC,iBAAiB,OAAQ;AAE9B,mBAAW,SAAS,kBAAkB;AAEpC,gBAAM,mBAAmB,cAAc;AAAA,YACrC,CAAC,CAAC,UAAU,MACV;;AAAA,wBAAC,WAAM,cAAN,mBAAiB,SAAS,kBAC3B,wDAAc,KAAK,CAAC,MAAM,EAAE,SAAS,gBAArC,mBAAkD,SAAlD,mBAAwD;AAAA;AAAA,UAC5D;AAGA,gBAAM,eAAe,cAAc;AAAA,YAAO,CAAC,CAAC,UAAU;;AACpD,iCAAM,cAAN,mBAAiB,SAAS;AAAA;AAAA,UAC5B;AAGA,cAAI,aAAa,QAAQ;AACvB,gBAAI,CAAC,sBAAsB,IAAI,MAAM,EAAE,GAAG;AACxC,oCAAsB,IAAI,MAAM,IAAI,oBAAI,KAAK;AAAA,YAAA;AAE/C,yBAAa,QAAQ,CAAC,CAAC,UAAU,MAAM;AACrC,oCAAsB,IAAI,MAAM,EAAE,EAAG,IAAI,UAAU;AAAA,YAAA,CACpD;AAAA,UAAA;AAIH,gBAAM,2BAA2B,iBAAiB,OAAO,CAAC,CAAC,UAAU,MAAM;AAEnE,kBAAA,YACJ,MAAM,eAAe,SAAS,iBAAiB,MAAM,EAAE,IAAI,eAAe,MAAM,EAAE;AAGpF,uBAAW,YAAY,WAAW;AAE9B,kBAAA,sBAAsB,IAAI,QAAQ,KAClC,sBAAsB,IAAI,QAAQ,EAAG,IAAI,UAAU,GACnD;AACO,uBAAA;AAAA,cAAA;AAAA,YACT;AAEK,mBAAA;AAAA,UAAA,CACR;AAED,cAAI,yBAAyB,QAAQ;AAE7B,kBAAA,sBAAsB,OAAO,UAAU,CAAC,SAAS,KAAK,aAAa,MAAM,EAAE;AAEjF,gBAAI,wBAAwB,IAAI;AAEvB,qBAAA,mBAAmB,EAAE,SAAS;AAAA,gBACnC,GAAG,OAAO,mBAAmB,EAAE;AAAA,gBAC/B,GAAG,OAAO,YAAY,wBAAwB;AAAA,cAChD;AAAA,YAAA,OACK;AAEL,qBAAO,KAAK;AAAA,gBACV,UAAU,MAAM;AAAA,gBAChB,YAAY,MAAM,eAAe,cAAc,QAAQ,WAAW;AAAA,gBAClE,QAAQ,OAAO,YAAY,wBAAwB;AAAA,cAAA,CACpD;AAAA,YAAA;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAKK,aAAA;AAAA,IACT;AAAA,IACA,CAAC,qBAAqB,UAAU,kBAAkB,cAAc;AAAA,EAClE;AAGA,QAAM,kCAAkCA,MAAA;AAAA,IACtC,CAAC,UAAU,YAAY,eAAe;;AAC9B,YAAA,SAAS,cAAc,QAAQ;AACjC,UAAA,CAAC,OAAe,QAAA;AAGpB,UAAI,YAAY,eAAe,SAAS,OAAO,WAAW,OAAO;AAGjE,aAAO,WAAW;AACV,cAAA,WAAW,cAAc,SAAS;AACxC,YAAI,CAAC,SAAU;AAIb,cAAA,cAAS,cAAT,mBAAoB,SAAS,gBAC7B,SAAS,UACT,cAAc,SAAS,QACvB;AACO,iBAAA,SAAS,OAAO,UAAU;AAAA,QAAA;AAInC,oBAAY,SAAS;AAAA,MAAA;AAIhB,aAAA;AAAA,IACT;AAAA,IACA,CAAC,aAAa;AAAA,EAChB;AAEO,SAAA;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;"}
|
|
1
|
+
{"version":3,"file":"useFolderRelationships.cjs.js","sources":["../../../../../../src/containers/ProjectTreeTable/hooks/useFolderRelationships.ts"],"sourcesContent":["import { useCallback, useMemo } from 'react'\nimport {\n EditorTaskNode,\n EMapResult,\n EntitiesMap,\n FolderNodeMap,\n MatchingFolder,\n TaskNodeMap,\n} from '../types/table'\nimport { ProjectAttribModel2 } from '../types/project'\nimport { ProjectTableAttribute } from '../types'\nimport { getEntityDataById } from '../utils/cellUtils'\n\nexport interface InheritedDependent {\n entityId: string\n entityType: 'task' | 'folder'\n attrib: Record<string, any> // all attribs that are inherited from the parent and their new value\n}\nexport type GetInheritedDependents = (entities: InheritedDependent[]) => InheritedDependent[]\nexport type FindInheritedValueFromAncestors = (\n entityId: string,\n entityType: 'folder' | 'task',\n attribName: string,\n) => any\nexport type FindNonInheritedValues = (\n folderId: string | undefined,\n attribNames: string[],\n) => Record<string, any>\nexport type GetAncestorsOf = (id: string) => string[]\ninterface UseFolderRelationshipsProps {\n tasksMap?: TaskNodeMap\n entitiesMap?: EntitiesMap\n tasksByFolderMap?: Map<string, string[]>\n getEntityById: (id: string, field?: string) => any\n projectAttrib: ProjectAttribModel2 | undefined\n attribFields: ProjectTableAttribute[] | undefined\n}\n\nexport default function useFolderRelationships({\n tasksMap,\n entitiesMap,\n tasksByFolderMap,\n getEntityById,\n projectAttrib,\n attribFields,\n}: UseFolderRelationshipsProps) {\n // Pre-compute folder-children relationships\n const folderChildrenMap = useMemo(() => {\n const map = new Map<string, string[]>()\n if (!entitiesMap) return map\n for (const folder of entitiesMap.values()) {\n // Skip if not a folder\n if (folder.entityType !== 'folder') continue\n const parentId = folder.parentId\n if (!parentId) continue\n\n if (!map.has(parentId)) {\n map.set(parentId, [])\n }\n map.get(parentId)!.push(folder.id)\n }\n return map\n }, [entitiesMap])\n\n const getChildrenEntities = useCallback(\n (id: string) => {\n const descendants: (MatchingFolder | EditorTaskNode)[] = []\n const queue: string[] = [id]\n const visited = new Set<string>()\n\n while (queue.length > 0) {\n const currentId = queue.shift()!\n\n if (visited.has(currentId)) continue\n visited.add(currentId)\n\n // Skip adding the root folder to descendants\n if (currentId !== id && entitiesMap) {\n const folder = getEntityDataById<'folder'>(currentId, entitiesMap)\n if (folder) descendants.push({ ...folder, entityType: 'folder' })\n }\n\n // Add tasks efficiently with a single lookup\n const taskIds = tasksByFolderMap?.get(currentId)\n if (taskIds?.length && entitiesMap) {\n for (const taskId of taskIds) {\n const task = getEntityDataById<'task'>(taskId, entitiesMap)\n if (task) descendants.push({ ...task, entityType: 'task' })\n }\n }\n\n // Add folder children to queue\n const childFolderIds = folderChildrenMap.get(currentId)\n if (childFolderIds?.length) {\n queue.push(...childFolderIds)\n }\n }\n\n return descendants\n },\n [entitiesMap, tasksByFolderMap, entitiesMap, folderChildrenMap],\n )\n\n // Helper function to get ancestors of a folder\n const getAncestorsOf: GetAncestorsOf = useCallback(\n (id) => {\n const ancestors: string[] = []\n let currentId = id\n\n while (true) {\n const entity = entitiesMap && getEntityDataById<'folder'>(currentId, entitiesMap)\n if (!entity || !entity.parentId) break\n\n ancestors.push(entity.parentId)\n currentId = entity.parentId\n }\n\n return ancestors\n },\n [entitiesMap],\n )\n\n // Helper function to get all folder ancestors of a task\n const getTaskAncestors = useCallback(\n (taskId: string): string[] => {\n const task = tasksMap?.get(taskId) as EMapResult<'task'>\n if (!task || !task.folderId) return []\n\n // Start with the direct parent folder\n const ancestors = [task.folderId]\n\n // Add all ancestors of the parent folder\n const folderAncestors = getAncestorsOf(task.folderId)\n ancestors.push(...folderAncestors)\n\n return ancestors\n },\n [tasksMap, getAncestorsOf],\n )\n\n // Helper function to find non-inherited values for multiple attributes from ancestors\n const findNonInheritedValues: FindNonInheritedValues = useCallback(\n (folderId, attribNames) => {\n if (!attribNames.length) return {}\n\n const result: Record<string, any> = {}\n const pendingAttribs = new Set(attribNames)\n\n // Start with the provided folder and traverse upward\n let currentId = folderId\n\n // Traverse up the folder hierarchy until we've found values for all attributes\n // or we've reached the root folder\n while (pendingAttribs.size > 0) {\n const folder = getEntityById(currentId || '')\n if (!folder || !currentId) {\n // use the project attrib\n for (const attribName of pendingAttribs) {\n if (projectAttrib && attribName in projectAttrib) {\n // @ts-ignore\n result[attribName] = projectAttrib[attribName]\n pendingAttribs.delete(attribName)\n }\n }\n\n // end search\n break\n }\n\n // Check if this folder has non-inherited values for any of our pending attributes\n for (const attribName of Array.from(pendingAttribs)) {\n if (\n folder.ownAttrib?.includes(attribName) &&\n folder.attrib &&\n attribName in folder.attrib\n ) {\n // Found a non-inherited value, add to result and remove from pending\n result[attribName] = folder.attrib[attribName]\n pendingAttribs.delete(attribName)\n }\n }\n\n // Move up to the parent folder\n currentId = folder.parentId\n }\n\n // For any attributes without non-inherited values found, set to null\n for (const attribName of pendingAttribs) {\n result[attribName] = null\n }\n\n return result\n },\n [getEntityById],\n )\n\n // Optimized implementation of getInheritedDependents\n const getInheritedDependents: GetInheritedDependents = useCallback(\n (entities) => {\n // console.time('getInheritedDependents') // 40ms - TODO improve this\n if (!entities.length) return []\n\n // Process all entities in one batch for efficiency\n const result: InheritedDependent[] = []\n\n // Track attributes that are owned (not inherited) to block inheritance\n const blockedInheritanceMap = new Map<string, Set<string>>()\n\n for (const entity of entities) {\n // check entity is folder\n if (entity.entityType !== 'folder') continue\n\n const attribEntries = Object.entries(entity.attrib)\n if (!attribEntries.length) continue\n\n const children = getChildrenEntities(entity.entityId)\n\n // filter out children that are in entities as they are already processed\n const filteredChildren = children.filter(\n (child) => !entities.find((e) => e.entityId === child.id),\n )\n\n if (!filteredChildren.length) continue\n\n for (const child of filteredChildren) {\n // Find which attributes would be inherited by this child\n const inheritedAttribs = attribEntries.filter(\n ([attribName]) =>\n !child.ownAttrib?.includes(attribName) &&\n attribFields?.find((a) => a.name === attribName)?.data?.inherit,\n )\n\n // Record attributes that child owns (has its own value for)\n const ownedAttribs = attribEntries.filter(([attribName]) =>\n child.ownAttrib?.includes(attribName),\n )\n\n // If the child has its own value for some attributes, block inheritance for its descendants\n if (ownedAttribs.length) {\n if (!blockedInheritanceMap.has(child.id)) {\n blockedInheritanceMap.set(child.id, new Set())\n }\n ownedAttribs.forEach(([attribName]) => {\n blockedInheritanceMap.get(child.id)!.add(attribName)\n })\n }\n\n // Filter out attributes blocked by ancestors\n const filteredInheritedAttribs = inheritedAttribs.filter(([attribName]) => {\n // Get ancestors based on entity type\n const ancestors =\n child.entityType === 'task' ? getTaskAncestors(child.id) : getAncestorsOf(child.id)\n\n // Check if any ancestor blocks this attribute\n for (const ancestor of ancestors) {\n if (\n blockedInheritanceMap.has(ancestor) &&\n blockedInheritanceMap.get(ancestor)!.has(attribName)\n ) {\n return false\n }\n }\n return true\n })\n\n if (filteredInheritedAttribs.length) {\n // Check if entity already exists in the result\n const existingEntityIndex = result.findIndex((item) => item.entityId === child.id)\n\n if (existingEntityIndex !== -1) {\n // Merge attributes with existing entry\n result[existingEntityIndex].attrib = {\n ...result[existingEntityIndex].attrib,\n ...Object.fromEntries(filteredInheritedAttribs),\n }\n } else {\n // Add new entity\n result.push({\n entityId: child.id,\n entityType: child.entityType || ('parentId' in child ? 'folder' : 'task'),\n attrib: Object.fromEntries(filteredInheritedAttribs),\n })\n }\n }\n }\n }\n\n // console.timeEnd('getInheritedDependents')\n\n return result\n },\n [getChildrenEntities, tasksMap, getTaskAncestors, getAncestorsOf],\n )\n\n // Helper function to find the inherited value for an attribute from ancestors\n const findInheritedValueFromAncestors = useCallback<FindInheritedValueFromAncestors>(\n (entityId, entityType, attribName) => {\n const entity = getEntityById(entityId)\n if (!entity) return null\n\n // For tasks, start with their parent folder\n let currentId = entityType === 'task' ? entity.folderId : entity.parentId\n\n // Traverse up the folder hierarchy\n while (currentId) {\n const ancestor = getEntityById(currentId)\n if (!ancestor) break\n\n // If the ancestor has its own value for this attribute, return it\n if (\n ancestor.ownAttrib?.includes(attribName) &&\n ancestor.attrib &&\n attribName in ancestor.attrib\n ) {\n return ancestor.attrib[attribName]\n }\n\n // Move up to the next parent\n currentId = ancestor.parentId\n }\n\n // If no ancestor has its own value, return null (will use the default)\n return null\n },\n [getEntityById],\n )\n\n return {\n folderChildrenMap,\n getChildrenEntities,\n getInheritedDependents,\n findInheritedValueFromAncestors,\n findNonInheritedValues,\n getAncestorsOf,\n }\n}\n"],"names":["useMemo","useCallback","getEntityDataById"],"mappings":"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"}
|
|
@@ -84,8 +84,7 @@ function useFolderRelationships({
|
|
|
84
84
|
const pendingAttribs = new Set(attribNames);
|
|
85
85
|
let currentId = folderId;
|
|
86
86
|
while (pendingAttribs.size > 0) {
|
|
87
|
-
|
|
88
|
-
const folder = getEntityById(currentId);
|
|
87
|
+
const folder = getEntityById(currentId || "");
|
|
89
88
|
if (!folder || !currentId) {
|
|
90
89
|
for (const attribName of pendingAttribs) {
|
|
91
90
|
if (projectAttrib && attribName in projectAttrib) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFolderRelationships.es.js","sources":["../../../../../../src/containers/ProjectTreeTable/hooks/useFolderRelationships.ts"],"sourcesContent":["import { useCallback, useMemo } from 'react'\nimport {\n EditorTaskNode,\n EMapResult,\n EntitiesMap,\n FolderNodeMap,\n MatchingFolder,\n TaskNodeMap,\n} from '../types/table'\nimport { ProjectAttribModel2 } from '../types/project'\nimport { ProjectTableAttribute } from '../types'\nimport { getEntityDataById } from '../utils/cellUtils'\n\nexport interface InheritedDependent {\n entityId: string\n entityType: 'task' | 'folder'\n attrib: Record<string, any> // all attribs that are inherited from the parent and their new value\n}\nexport type GetInheritedDependents = (entities: InheritedDependent[]) => InheritedDependent[]\nexport type FindInheritedValueFromAncestors = (\n entityId: string,\n entityType: 'folder' | 'task',\n attribName: string,\n) => any\nexport type FindNonInheritedValues = (\n folderId: string,\n attribNames: string[],\n) => Record<string, any>\nexport type GetAncestorsOf = (id: string) => string[]\ninterface UseFolderRelationshipsProps {\n tasksMap?: TaskNodeMap\n entitiesMap?: EntitiesMap\n tasksByFolderMap?: Map<string, string[]>\n getEntityById: (id: string) => any\n projectAttrib: ProjectAttribModel2 | undefined\n attribFields: ProjectTableAttribute[] | undefined\n}\n\nexport default function useFolderRelationships({\n tasksMap,\n entitiesMap,\n tasksByFolderMap,\n getEntityById,\n projectAttrib,\n attribFields,\n}: UseFolderRelationshipsProps) {\n // Pre-compute folder-children relationships\n const folderChildrenMap = useMemo(() => {\n const map = new Map<string, string[]>()\n if (!entitiesMap) return map\n for (const folder of entitiesMap.values()) {\n // Skip if not a folder\n if (folder.entityType !== 'folder') continue\n const parentId = folder.parentId\n if (!parentId) continue\n\n if (!map.has(parentId)) {\n map.set(parentId, [])\n }\n map.get(parentId)!.push(folder.id)\n }\n return map\n }, [entitiesMap])\n\n const getChildrenEntities = useCallback(\n (id: string) => {\n const descendants: (MatchingFolder | EditorTaskNode)[] = []\n const queue: string[] = [id]\n const visited = new Set<string>()\n\n while (queue.length > 0) {\n const currentId = queue.shift()!\n\n if (visited.has(currentId)) continue\n visited.add(currentId)\n\n // Skip adding the root folder to descendants\n if (currentId !== id && entitiesMap) {\n const folder = getEntityDataById<'folder'>(currentId, entitiesMap)\n if (folder) descendants.push({ ...folder, entityType: 'folder' })\n }\n\n // Add tasks efficiently with a single lookup\n const taskIds = tasksByFolderMap?.get(currentId)\n if (taskIds?.length && entitiesMap) {\n for (const taskId of taskIds) {\n const task = getEntityDataById<'task'>(taskId, entitiesMap)\n if (task) descendants.push({ ...task, entityType: 'task' })\n }\n }\n\n // Add folder children to queue\n const childFolderIds = folderChildrenMap.get(currentId)\n if (childFolderIds?.length) {\n queue.push(...childFolderIds)\n }\n }\n\n return descendants\n },\n [entitiesMap, tasksByFolderMap, entitiesMap, folderChildrenMap],\n )\n\n // Helper function to get ancestors of a folder\n const getAncestorsOf: GetAncestorsOf = useCallback(\n (id) => {\n const ancestors: string[] = []\n let currentId = id\n\n while (true) {\n const entity = entitiesMap && getEntityDataById<'folder'>(currentId, entitiesMap)\n if (!entity || !entity.parentId) break\n\n ancestors.push(entity.parentId)\n currentId = entity.parentId\n }\n\n return ancestors\n },\n [entitiesMap],\n )\n\n // Helper function to get all folder ancestors of a task\n const getTaskAncestors = useCallback(\n (taskId: string): string[] => {\n const task = tasksMap?.get(taskId) as EMapResult<'task'>\n if (!task || !task.folderId) return []\n\n // Start with the direct parent folder\n const ancestors = [task.folderId]\n\n // Add all ancestors of the parent folder\n const folderAncestors = getAncestorsOf(task.folderId)\n ancestors.push(...folderAncestors)\n\n return ancestors\n },\n [tasksMap, getAncestorsOf],\n )\n\n // Helper function to find non-inherited values for multiple attributes from ancestors\n const findNonInheritedValues: FindNonInheritedValues = useCallback(\n (folderId, attribNames) => {\n if (!attribNames.length) return {}\n\n const result: Record<string, any> = {}\n const pendingAttribs = new Set(attribNames)\n\n // Start with the provided folder and traverse upward\n let currentId = folderId\n\n // Traverse up the folder hierarchy until we've found values for all attributes\n // or we've reached the root folder\n while (pendingAttribs.size > 0) {\n if (!currentId) break\n const folder = getEntityById(currentId)\n if (!folder || !currentId) {\n // use the project attrib\n for (const attribName of pendingAttribs) {\n if (projectAttrib && attribName in projectAttrib) {\n // @ts-ignore\n result[attribName] = projectAttrib[attribName]\n pendingAttribs.delete(attribName)\n }\n }\n\n // end search\n break\n }\n\n // Check if this folder has non-inherited values for any of our pending attributes\n for (const attribName of Array.from(pendingAttribs)) {\n if (\n folder.ownAttrib?.includes(attribName) &&\n folder.attrib &&\n attribName in folder.attrib\n ) {\n // Found a non-inherited value, add to result and remove from pending\n result[attribName] = folder.attrib[attribName]\n pendingAttribs.delete(attribName)\n }\n }\n\n // Move up to the parent folder\n currentId = folder.parentId\n }\n\n // For any attributes without non-inherited values found, set to null\n for (const attribName of pendingAttribs) {\n result[attribName] = null\n }\n\n return result\n },\n [getEntityById],\n )\n\n // Optimized implementation of getInheritedDependents\n const getInheritedDependents: GetInheritedDependents = useCallback(\n (entities) => {\n // console.time('getInheritedDependents') // 40ms - TODO improve this\n if (!entities.length) return []\n\n // Process all entities in one batch for efficiency\n const result: InheritedDependent[] = []\n\n // Track attributes that are owned (not inherited) to block inheritance\n const blockedInheritanceMap = new Map<string, Set<string>>()\n\n for (const entity of entities) {\n // check entity is folder\n if (entity.entityType !== 'folder') continue\n\n const attribEntries = Object.entries(entity.attrib)\n if (!attribEntries.length) continue\n\n const children = getChildrenEntities(entity.entityId)\n\n // filter out children that are in entities as they are already processed\n const filteredChildren = children.filter(\n (child) => !entities.find((e) => e.entityId === child.id),\n )\n\n if (!filteredChildren.length) continue\n\n for (const child of filteredChildren) {\n // Find which attributes would be inherited by this child\n const inheritedAttribs = attribEntries.filter(\n ([attribName]) =>\n !child.ownAttrib?.includes(attribName) &&\n attribFields?.find((a) => a.name === attribName)?.data?.inherit,\n )\n\n // Record attributes that child owns (has its own value for)\n const ownedAttribs = attribEntries.filter(([attribName]) =>\n child.ownAttrib?.includes(attribName),\n )\n\n // If the child has its own value for some attributes, block inheritance for its descendants\n if (ownedAttribs.length) {\n if (!blockedInheritanceMap.has(child.id)) {\n blockedInheritanceMap.set(child.id, new Set())\n }\n ownedAttribs.forEach(([attribName]) => {\n blockedInheritanceMap.get(child.id)!.add(attribName)\n })\n }\n\n // Filter out attributes blocked by ancestors\n const filteredInheritedAttribs = inheritedAttribs.filter(([attribName]) => {\n // Get ancestors based on entity type\n const ancestors =\n child.entityType === 'task' ? getTaskAncestors(child.id) : getAncestorsOf(child.id)\n\n // Check if any ancestor blocks this attribute\n for (const ancestor of ancestors) {\n if (\n blockedInheritanceMap.has(ancestor) &&\n blockedInheritanceMap.get(ancestor)!.has(attribName)\n ) {\n return false\n }\n }\n return true\n })\n\n if (filteredInheritedAttribs.length) {\n // Check if entity already exists in the result\n const existingEntityIndex = result.findIndex((item) => item.entityId === child.id)\n\n if (existingEntityIndex !== -1) {\n // Merge attributes with existing entry\n result[existingEntityIndex].attrib = {\n ...result[existingEntityIndex].attrib,\n ...Object.fromEntries(filteredInheritedAttribs),\n }\n } else {\n // Add new entity\n result.push({\n entityId: child.id,\n entityType: child.entityType || ('parentId' in child ? 'folder' : 'task'),\n attrib: Object.fromEntries(filteredInheritedAttribs),\n })\n }\n }\n }\n }\n\n // console.timeEnd('getInheritedDependents')\n\n return result\n },\n [getChildrenEntities, tasksMap, getTaskAncestors, getAncestorsOf],\n )\n\n // Helper function to find the inherited value for an attribute from ancestors\n const findInheritedValueFromAncestors = useCallback<FindInheritedValueFromAncestors>(\n (entityId, entityType, attribName) => {\n const entity = getEntityById(entityId)\n if (!entity) return null\n\n // For tasks, start with their parent folder\n let currentId = entityType === 'task' ? entity.folderId : entity.parentId\n\n // Traverse up the folder hierarchy\n while (currentId) {\n const ancestor = getEntityById(currentId)\n if (!ancestor) break\n\n // If the ancestor has its own value for this attribute, return it\n if (\n ancestor.ownAttrib?.includes(attribName) &&\n ancestor.attrib &&\n attribName in ancestor.attrib\n ) {\n return ancestor.attrib[attribName]\n }\n\n // Move up to the next parent\n currentId = ancestor.parentId\n }\n\n // If no ancestor has its own value, return null (will use the default)\n return null\n },\n [getEntityById],\n )\n\n return {\n folderChildrenMap,\n getChildrenEntities,\n getInheritedDependents,\n findInheritedValueFromAncestors,\n findNonInheritedValues,\n getAncestorsOf,\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useFolderRelationships.es.js","sources":["../../../../../../src/containers/ProjectTreeTable/hooks/useFolderRelationships.ts"],"sourcesContent":["import { useCallback, useMemo } from 'react'\nimport {\n EditorTaskNode,\n EMapResult,\n EntitiesMap,\n FolderNodeMap,\n MatchingFolder,\n TaskNodeMap,\n} from '../types/table'\nimport { ProjectAttribModel2 } from '../types/project'\nimport { ProjectTableAttribute } from '../types'\nimport { getEntityDataById } from '../utils/cellUtils'\n\nexport interface InheritedDependent {\n entityId: string\n entityType: 'task' | 'folder'\n attrib: Record<string, any> // all attribs that are inherited from the parent and their new value\n}\nexport type GetInheritedDependents = (entities: InheritedDependent[]) => InheritedDependent[]\nexport type FindInheritedValueFromAncestors = (\n entityId: string,\n entityType: 'folder' | 'task',\n attribName: string,\n) => any\nexport type FindNonInheritedValues = (\n folderId: string | undefined,\n attribNames: string[],\n) => Record<string, any>\nexport type GetAncestorsOf = (id: string) => string[]\ninterface UseFolderRelationshipsProps {\n tasksMap?: TaskNodeMap\n entitiesMap?: EntitiesMap\n tasksByFolderMap?: Map<string, string[]>\n getEntityById: (id: string, field?: string) => any\n projectAttrib: ProjectAttribModel2 | undefined\n attribFields: ProjectTableAttribute[] | undefined\n}\n\nexport default function useFolderRelationships({\n tasksMap,\n entitiesMap,\n tasksByFolderMap,\n getEntityById,\n projectAttrib,\n attribFields,\n}: UseFolderRelationshipsProps) {\n // Pre-compute folder-children relationships\n const folderChildrenMap = useMemo(() => {\n const map = new Map<string, string[]>()\n if (!entitiesMap) return map\n for (const folder of entitiesMap.values()) {\n // Skip if not a folder\n if (folder.entityType !== 'folder') continue\n const parentId = folder.parentId\n if (!parentId) continue\n\n if (!map.has(parentId)) {\n map.set(parentId, [])\n }\n map.get(parentId)!.push(folder.id)\n }\n return map\n }, [entitiesMap])\n\n const getChildrenEntities = useCallback(\n (id: string) => {\n const descendants: (MatchingFolder | EditorTaskNode)[] = []\n const queue: string[] = [id]\n const visited = new Set<string>()\n\n while (queue.length > 0) {\n const currentId = queue.shift()!\n\n if (visited.has(currentId)) continue\n visited.add(currentId)\n\n // Skip adding the root folder to descendants\n if (currentId !== id && entitiesMap) {\n const folder = getEntityDataById<'folder'>(currentId, entitiesMap)\n if (folder) descendants.push({ ...folder, entityType: 'folder' })\n }\n\n // Add tasks efficiently with a single lookup\n const taskIds = tasksByFolderMap?.get(currentId)\n if (taskIds?.length && entitiesMap) {\n for (const taskId of taskIds) {\n const task = getEntityDataById<'task'>(taskId, entitiesMap)\n if (task) descendants.push({ ...task, entityType: 'task' })\n }\n }\n\n // Add folder children to queue\n const childFolderIds = folderChildrenMap.get(currentId)\n if (childFolderIds?.length) {\n queue.push(...childFolderIds)\n }\n }\n\n return descendants\n },\n [entitiesMap, tasksByFolderMap, entitiesMap, folderChildrenMap],\n )\n\n // Helper function to get ancestors of a folder\n const getAncestorsOf: GetAncestorsOf = useCallback(\n (id) => {\n const ancestors: string[] = []\n let currentId = id\n\n while (true) {\n const entity = entitiesMap && getEntityDataById<'folder'>(currentId, entitiesMap)\n if (!entity || !entity.parentId) break\n\n ancestors.push(entity.parentId)\n currentId = entity.parentId\n }\n\n return ancestors\n },\n [entitiesMap],\n )\n\n // Helper function to get all folder ancestors of a task\n const getTaskAncestors = useCallback(\n (taskId: string): string[] => {\n const task = tasksMap?.get(taskId) as EMapResult<'task'>\n if (!task || !task.folderId) return []\n\n // Start with the direct parent folder\n const ancestors = [task.folderId]\n\n // Add all ancestors of the parent folder\n const folderAncestors = getAncestorsOf(task.folderId)\n ancestors.push(...folderAncestors)\n\n return ancestors\n },\n [tasksMap, getAncestorsOf],\n )\n\n // Helper function to find non-inherited values for multiple attributes from ancestors\n const findNonInheritedValues: FindNonInheritedValues = useCallback(\n (folderId, attribNames) => {\n if (!attribNames.length) return {}\n\n const result: Record<string, any> = {}\n const pendingAttribs = new Set(attribNames)\n\n // Start with the provided folder and traverse upward\n let currentId = folderId\n\n // Traverse up the folder hierarchy until we've found values for all attributes\n // or we've reached the root folder\n while (pendingAttribs.size > 0) {\n const folder = getEntityById(currentId || '')\n if (!folder || !currentId) {\n // use the project attrib\n for (const attribName of pendingAttribs) {\n if (projectAttrib && attribName in projectAttrib) {\n // @ts-ignore\n result[attribName] = projectAttrib[attribName]\n pendingAttribs.delete(attribName)\n }\n }\n\n // end search\n break\n }\n\n // Check if this folder has non-inherited values for any of our pending attributes\n for (const attribName of Array.from(pendingAttribs)) {\n if (\n folder.ownAttrib?.includes(attribName) &&\n folder.attrib &&\n attribName in folder.attrib\n ) {\n // Found a non-inherited value, add to result and remove from pending\n result[attribName] = folder.attrib[attribName]\n pendingAttribs.delete(attribName)\n }\n }\n\n // Move up to the parent folder\n currentId = folder.parentId\n }\n\n // For any attributes without non-inherited values found, set to null\n for (const attribName of pendingAttribs) {\n result[attribName] = null\n }\n\n return result\n },\n [getEntityById],\n )\n\n // Optimized implementation of getInheritedDependents\n const getInheritedDependents: GetInheritedDependents = useCallback(\n (entities) => {\n // console.time('getInheritedDependents') // 40ms - TODO improve this\n if (!entities.length) return []\n\n // Process all entities in one batch for efficiency\n const result: InheritedDependent[] = []\n\n // Track attributes that are owned (not inherited) to block inheritance\n const blockedInheritanceMap = new Map<string, Set<string>>()\n\n for (const entity of entities) {\n // check entity is folder\n if (entity.entityType !== 'folder') continue\n\n const attribEntries = Object.entries(entity.attrib)\n if (!attribEntries.length) continue\n\n const children = getChildrenEntities(entity.entityId)\n\n // filter out children that are in entities as they are already processed\n const filteredChildren = children.filter(\n (child) => !entities.find((e) => e.entityId === child.id),\n )\n\n if (!filteredChildren.length) continue\n\n for (const child of filteredChildren) {\n // Find which attributes would be inherited by this child\n const inheritedAttribs = attribEntries.filter(\n ([attribName]) =>\n !child.ownAttrib?.includes(attribName) &&\n attribFields?.find((a) => a.name === attribName)?.data?.inherit,\n )\n\n // Record attributes that child owns (has its own value for)\n const ownedAttribs = attribEntries.filter(([attribName]) =>\n child.ownAttrib?.includes(attribName),\n )\n\n // If the child has its own value for some attributes, block inheritance for its descendants\n if (ownedAttribs.length) {\n if (!blockedInheritanceMap.has(child.id)) {\n blockedInheritanceMap.set(child.id, new Set())\n }\n ownedAttribs.forEach(([attribName]) => {\n blockedInheritanceMap.get(child.id)!.add(attribName)\n })\n }\n\n // Filter out attributes blocked by ancestors\n const filteredInheritedAttribs = inheritedAttribs.filter(([attribName]) => {\n // Get ancestors based on entity type\n const ancestors =\n child.entityType === 'task' ? getTaskAncestors(child.id) : getAncestorsOf(child.id)\n\n // Check if any ancestor blocks this attribute\n for (const ancestor of ancestors) {\n if (\n blockedInheritanceMap.has(ancestor) &&\n blockedInheritanceMap.get(ancestor)!.has(attribName)\n ) {\n return false\n }\n }\n return true\n })\n\n if (filteredInheritedAttribs.length) {\n // Check if entity already exists in the result\n const existingEntityIndex = result.findIndex((item) => item.entityId === child.id)\n\n if (existingEntityIndex !== -1) {\n // Merge attributes with existing entry\n result[existingEntityIndex].attrib = {\n ...result[existingEntityIndex].attrib,\n ...Object.fromEntries(filteredInheritedAttribs),\n }\n } else {\n // Add new entity\n result.push({\n entityId: child.id,\n entityType: child.entityType || ('parentId' in child ? 'folder' : 'task'),\n attrib: Object.fromEntries(filteredInheritedAttribs),\n })\n }\n }\n }\n }\n\n // console.timeEnd('getInheritedDependents')\n\n return result\n },\n [getChildrenEntities, tasksMap, getTaskAncestors, getAncestorsOf],\n )\n\n // Helper function to find the inherited value for an attribute from ancestors\n const findInheritedValueFromAncestors = useCallback<FindInheritedValueFromAncestors>(\n (entityId, entityType, attribName) => {\n const entity = getEntityById(entityId)\n if (!entity) return null\n\n // For tasks, start with their parent folder\n let currentId = entityType === 'task' ? entity.folderId : entity.parentId\n\n // Traverse up the folder hierarchy\n while (currentId) {\n const ancestor = getEntityById(currentId)\n if (!ancestor) break\n\n // If the ancestor has its own value for this attribute, return it\n if (\n ancestor.ownAttrib?.includes(attribName) &&\n ancestor.attrib &&\n attribName in ancestor.attrib\n ) {\n return ancestor.attrib[attribName]\n }\n\n // Move up to the next parent\n currentId = ancestor.parentId\n }\n\n // If no ancestor has its own value, return null (will use the default)\n return null\n },\n [getEntityById],\n )\n\n return {\n folderChildrenMap,\n getChildrenEntities,\n getInheritedDependents,\n findInheritedValueFromAncestors,\n findNonInheritedValues,\n getAncestorsOf,\n }\n}\n"],"names":[],"mappings":"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"}
|