@ynput/ayon-frontend-shared 0.3.15 → 0.3.17
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 +1 -1
- package/dist/DetailsPanel.es.js +28 -24
- package/dist/DetailsPanel.es.js.map +1 -1
- package/dist/Views.cjs.js +1 -1
- package/dist/Views.cjs.js.map +1 -1
- package/dist/Views.es.js +36 -41
- package/dist/Views.es.js.map +1 -1
- package/dist/_virtual/index.cjs.js +1 -1
- package/dist/_virtual/index.cjs2.js +1 -1
- package/dist/_virtual/index.cjs3.js +1 -1
- package/dist/_virtual/index.cjs4.js +1 -1
- package/dist/_virtual/index.cjs5.js +1 -1
- package/dist/_virtual/index.cjs6.js +1 -1
- package/dist/_virtual/index.cjs8.js +1 -1
- package/dist/_virtual/index.es.js +4 -5
- package/dist/_virtual/index.es2.js +6 -2
- package/dist/_virtual/index.es2.js.map +1 -1
- package/dist/_virtual/index.es3.js +2 -5
- package/dist/_virtual/index.es3.js.map +1 -1
- package/dist/_virtual/index.es4.js +5 -2
- package/dist/_virtual/index.es4.js.map +1 -1
- package/dist/_virtual/index.es5.js +2 -5
- package/dist/_virtual/index.es5.js.map +1 -1
- package/dist/_virtual/index.es6.js +5 -2
- package/dist/_virtual/index.es6.js.map +1 -1
- package/dist/_virtual/index.es7.js +2 -2
- package/dist/_virtual/index.es8.js +2 -5
- package/dist/_virtual/index.es8.js.map +1 -1
- package/dist/index.cjs.js +1 -1
- package/dist/index.es.js +15 -11
- package/dist/index.es.js.map +1 -1
- package/dist/node_modules/match-sorter/dist/match-sorter.esm.cjs.js +1 -1
- package/dist/node_modules/match-sorter/dist/match-sorter.esm.es.js +1 -1
- package/dist/node_modules/react-use-websocket/dist/index.cjs.js +1 -1
- package/dist/node_modules/react-use-websocket/dist/index.es.js +1 -1
- package/dist/node_modules/rehype-prism-plus/dist/index.es.cjs.js +1 -1
- package/dist/node_modules/rehype-prism-plus/dist/index.es.cjs.js.map +1 -1
- package/dist/node_modules/rehype-prism-plus/dist/index.es.es.js +1 -1
- package/dist/node_modules/remove-accents/index.cjs.js +1 -1
- package/dist/node_modules/remove-accents/index.es.js +1 -1
- package/dist/shared/node_modules/prop-types/index.cjs.js +1 -1
- package/dist/shared/node_modules/prop-types/index.es.js +1 -1
- package/dist/shared/node_modules/react-is/index.cjs.js +1 -1
- package/dist/shared/node_modules/react-is/index.es.js +1 -1
- package/dist/shared/node_modules/react-transition-group/esm/CSSTransition.cjs.js +1 -1
- package/dist/shared/node_modules/react-transition-group/esm/CSSTransition.es.js +1 -1
- package/dist/shared/node_modules/react-transition-group/esm/Transition.cjs.js +1 -1
- package/dist/shared/node_modules/react-transition-group/esm/Transition.es.js +1 -1
- package/dist/shared/node_modules/react-transition-group/esm/utils/PropTypes.cjs.js +1 -1
- package/dist/shared/node_modules/react-transition-group/esm/utils/PropTypes.es.js +1 -1
- package/dist/shared/src/api/generated/access.cjs.js.map +1 -1
- package/dist/shared/src/api/generated/access.es.js.map +1 -1
- package/dist/shared/src/api/generated/graphql.cjs.js +5 -3
- package/dist/shared/src/api/generated/graphql.cjs.js.map +1 -1
- package/dist/shared/src/api/generated/graphql.es.js +2 -0
- package/dist/shared/src/api/generated/graphql.es.js.map +1 -1
- package/dist/shared/src/api/generated/users.cjs.js.map +1 -1
- package/dist/shared/src/api/generated/users.es.js.map +1 -1
- package/dist/shared/src/components/AttributeEditor/AttributeEditor.cjs.js +1 -1
- package/dist/shared/src/components/AttributeEditor/AttributeEditor.cjs.js.map +1 -1
- package/dist/shared/src/components/AttributeEditor/AttributeEditor.es.js +99 -90
- package/dist/shared/src/components/AttributeEditor/AttributeEditor.es.js.map +1 -1
- package/dist/shared/src/components/DetailsDialog/DetailsDialog.cjs.js +13 -1
- package/dist/shared/src/components/DetailsDialog/DetailsDialog.cjs.js.map +1 -1
- package/dist/shared/src/components/DetailsDialog/DetailsDialog.es.js +72 -25
- package/dist/shared/src/components/DetailsDialog/DetailsDialog.es.js.map +1 -1
- package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploader.cjs.js +1 -1
- package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploader.cjs.js.map +1 -1
- package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploader.es.js +25 -21
- package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploader.es.js.map +1 -1
- package/dist/shared/src/components/LinksManager/AddNewLinks.cjs.js +1 -1
- package/dist/shared/src/components/LinksManager/AddNewLinks.cjs.js.map +1 -1
- package/dist/shared/src/components/LinksManager/AddNewLinks.es.js +14 -14
- package/dist/shared/src/components/LinksManager/AddNewLinks.es.js.map +1 -1
- package/dist/shared/src/components/LinksManager/CellEditingDialog.cjs.js +1 -1
- package/dist/shared/src/components/LinksManager/CellEditingDialog.cjs.js.map +1 -1
- package/dist/shared/src/components/LinksManager/CellEditingDialog.es.js +23 -23
- package/dist/shared/src/components/LinksManager/CellEditingDialog.es.js.map +1 -1
- package/dist/shared/src/components/LinksManager/LinkManagerItem.cjs.js +1 -1
- package/dist/shared/src/components/LinksManager/LinkManagerItem.cjs.js.map +1 -1
- package/dist/shared/src/components/LinksManager/LinkManagerItem.es.js +71 -36
- package/dist/shared/src/components/LinksManager/LinkManagerItem.es.js.map +1 -1
- package/dist/shared/src/components/LinksManager/LinksManager.cjs.js +1 -1
- package/dist/shared/src/components/LinksManager/LinksManager.cjs.js.map +1 -1
- package/dist/shared/src/components/LinksManager/LinksManager.es.js +120 -89
- package/dist/shared/src/components/LinksManager/LinksManager.es.js.map +1 -1
- package/dist/shared/src/components/LinksManager/LinksManager.styled.cjs.js +52 -12
- package/dist/shared/src/components/LinksManager/LinksManager.styled.cjs.js.map +1 -1
- package/dist/shared/src/components/LinksManager/LinksManager.styled.es.js +63 -21
- package/dist/shared/src/components/LinksManager/LinksManager.styled.es.js.map +1 -1
- package/dist/shared/src/components/LinksManager/hooks/useUpdateLinks.cjs.js +1 -1
- package/dist/shared/src/components/LinksManager/hooks/useUpdateLinks.cjs.js.map +1 -1
- package/dist/shared/src/components/LinksManager/hooks/useUpdateLinks.es.js +8 -4
- package/dist/shared/src/components/LinksManager/hooks/useUpdateLinks.es.js.map +1 -1
- package/dist/shared/src/components/LinksManager/utils/groupLinks.cjs.js +2 -0
- package/dist/shared/src/components/LinksManager/utils/groupLinks.cjs.js.map +1 -0
- package/dist/shared/src/components/LinksManager/utils/groupLinks.es.js +18 -0
- package/dist/shared/src/components/LinksManager/utils/groupLinks.es.js.map +1 -0
- package/dist/shared/src/components/Powerpack/PowerpackDialog.cjs.js +1 -1
- package/dist/shared/src/components/Powerpack/PowerpackDialog.cjs.js.map +1 -1
- package/dist/shared/src/components/Powerpack/PowerpackDialog.es.js +8 -4
- package/dist/shared/src/components/Powerpack/PowerpackDialog.es.js.map +1 -1
- package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.cjs.js +1 -1
- package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.cjs.js.map +1 -1
- package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.es.js +10 -6
- package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.es.js.map +1 -1
- package/dist/shared/src/components/ProjectTableSettings/TableSettingsFallback.cjs.js +1 -1
- package/dist/shared/src/components/ProjectTableSettings/TableSettingsFallback.cjs.js.map +1 -1
- package/dist/shared/src/components/ProjectTableSettings/TableSettingsFallback.es.js +8 -4
- package/dist/shared/src/components/ProjectTableSettings/TableSettingsFallback.es.js.map +1 -1
- package/dist/shared/src/components/RemotePage/ProjectPageRemote.cjs.js +1 -1
- package/dist/shared/src/components/RemotePage/ProjectPageRemote.cjs.js.map +1 -1
- package/dist/shared/src/components/RemotePage/ProjectPageRemote.es.js +8 -4
- package/dist/shared/src/components/RemotePage/ProjectPageRemote.es.js.map +1 -1
- package/dist/shared/src/components/RemotePage/RemotePageWrapper.cjs.js +1 -1
- package/dist/shared/src/components/RemotePage/RemotePageWrapper.cjs.js.map +1 -1
- package/dist/shared/src/components/RemotePage/RemotePageWrapper.es.js +8 -4
- package/dist/shared/src/components/RemotePage/RemotePageWrapper.es.js.map +1 -1
- package/dist/shared/src/components/RenameForm/RenameForm.cjs.js +1 -1
- package/dist/shared/src/components/RenameForm/RenameForm.cjs.js.map +1 -1
- package/dist/shared/src/components/RenameForm/RenameForm.es.js +9 -5
- package/dist/shared/src/components/RenameForm/RenameForm.es.js.map +1 -1
- package/dist/shared/src/components/ReviewablesList/ReviewablesList.cjs.js +1 -1
- package/dist/shared/src/components/ReviewablesList/ReviewablesList.cjs.js.map +1 -1
- package/dist/shared/src/components/ReviewablesList/ReviewablesList.es.js +139 -128
- package/dist/shared/src/components/ReviewablesList/ReviewablesList.es.js.map +1 -1
- package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.cjs.js +1 -1
- package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.cjs.js.map +1 -1
- package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.es.js +90 -81
- package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.es.js.map +1 -1
- package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.cjs.js +1 -1
- package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.cjs.js.map +1 -1
- package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.es.js +8 -4
- package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.es.js.map +1 -1
- package/dist/shared/src/components/ReviewablesSelector/ReviewablesSelector.cjs.js +1 -1
- package/dist/shared/src/components/ReviewablesSelector/ReviewablesSelector.cjs.js.map +1 -1
- package/dist/shared/src/components/ReviewablesSelector/ReviewablesSelector.es.js +9 -5
- package/dist/shared/src/components/ReviewablesSelector/ReviewablesSelector.es.js.map +1 -1
- package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.cjs.js +1 -1
- package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.cjs.js.map +1 -1
- package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.es.js +8 -4
- package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.es.js.map +1 -1
- package/dist/shared/src/components/VersionUploader/components/UploadVersionForm.cjs.js +1 -1
- package/dist/shared/src/components/VersionUploader/components/UploadVersionForm.cjs.js.map +1 -1
- package/dist/shared/src/components/VersionUploader/components/UploadVersionForm.es.js +8 -4
- package/dist/shared/src/components/VersionUploader/components/UploadVersionForm.es.js.map +1 -1
- package/dist/shared/src/containers/Actions/ActionConfigDialog.cjs.js +1 -1
- package/dist/shared/src/containers/Actions/ActionConfigDialog.cjs.js.map +1 -1
- package/dist/shared/src/containers/Actions/ActionConfigDialog.es.js +8 -4
- package/dist/shared/src/containers/Actions/ActionConfigDialog.es.js.map +1 -1
- package/dist/shared/src/containers/Actions/InteractiveActionDialog.cjs.js +1 -1
- package/dist/shared/src/containers/Actions/InteractiveActionDialog.cjs.js.map +1 -1
- package/dist/shared/src/containers/Actions/InteractiveActionDialog.es.js +8 -4
- package/dist/shared/src/containers/Actions/InteractiveActionDialog.es.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js +20 -16
- package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/components/DetailsPanelFiles/DetailsPanelFiles.cjs.js +1 -1
- package/dist/shared/src/containers/DetailsPanel/components/DetailsPanelFiles/DetailsPanelFiles.cjs.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/components/DetailsPanelFiles/DetailsPanelFiles.es.js +8 -4
- package/dist/shared/src/containers/DetailsPanel/components/DetailsPanelFiles/DetailsPanelFiles.es.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/components/DetailsPanelFloating/DetailsPanelFloating.cjs.js +1 -1
- package/dist/shared/src/containers/DetailsPanel/components/DetailsPanelFloating/DetailsPanelFloating.cjs.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/components/DetailsPanelFloating/DetailsPanelFloating.es.js +9 -5
- package/dist/shared/src/containers/DetailsPanel/components/DetailsPanelFloating/DetailsPanelFloating.es.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/components/DetailsPanelHeader/DetailsPanelHeader.cjs.js +1 -1
- package/dist/shared/src/containers/DetailsPanel/components/DetailsPanelHeader/DetailsPanelHeader.cjs.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/components/DetailsPanelHeader/DetailsPanelHeader.es.js +12 -8
- package/dist/shared/src/containers/DetailsPanel/components/DetailsPanelHeader/DetailsPanelHeader.es.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/components/TabHeaderAndFilters/TabHeaderAndFilters.styled.cjs.js +1 -1
- package/dist/shared/src/containers/DetailsPanel/components/TabHeaderAndFilters/TabHeaderAndFilters.styled.cjs.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/components/TabHeaderAndFilters/TabHeaderAndFilters.styled.es.js +22 -18
- package/dist/shared/src/containers/DetailsPanel/components/TabHeaderAndFilters/TabHeaderAndFilters.styled.es.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/containers/DetailsPanelSubtasks.cjs.js +1 -1
- package/dist/shared/src/containers/DetailsPanel/containers/DetailsPanelSubtasks.cjs.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/containers/DetailsPanelSubtasks.es.js +8 -4
- package/dist/shared/src/containers/DetailsPanel/containers/DetailsPanelSubtasks.es.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/containers/FeedContextWrapper.cjs.js +1 -1
- package/dist/shared/src/containers/DetailsPanel/containers/FeedContextWrapper.cjs.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/containers/FeedContextWrapper.es.js +8 -4
- package/dist/shared/src/containers/DetailsPanel/containers/FeedContextWrapper.es.js.map +1 -1
- package/dist/shared/src/containers/EntityPickerDialog/EntityPickerDialog.cjs.js +2 -2
- package/dist/shared/src/containers/EntityPickerDialog/EntityPickerDialog.cjs.js.map +1 -1
- package/dist/shared/src/containers/EntityPickerDialog/EntityPickerDialog.es.js +57 -45
- package/dist/shared/src/containers/EntityPickerDialog/EntityPickerDialog.es.js.map +1 -1
- package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTable.cjs.js +1 -1
- package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTable.cjs.js.map +1 -1
- package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTable.es.js +8 -4
- package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTable.es.js.map +1 -1
- package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTableHeader.cjs.js +1 -1
- package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTableHeader.cjs.js.map +1 -1
- package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTableHeader.es.js +8 -4
- package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTableHeader.es.js.map +1 -1
- package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTableSearch.cjs.js +1 -1
- package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTableSearch.cjs.js.map +1 -1
- package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTableSearch.es.js +8 -4
- package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTableSearch.es.js.map +1 -1
- package/dist/shared/src/containers/EntityPickerDialog/hooks/useGetEntityPickerData.cjs.js.map +1 -1
- package/dist/shared/src/containers/EntityPickerDialog/hooks/useGetEntityPickerData.es.js.map +1 -1
- package/dist/shared/src/containers/EntityPickerDialog/hooks/usePreserveChildSelectionByName.cjs.js +2 -0
- package/dist/shared/src/containers/EntityPickerDialog/hooks/usePreserveChildSelectionByName.cjs.js.map +1 -0
- package/dist/shared/src/containers/EntityPickerDialog/hooks/usePreserveChildSelectionByName.es.js +70 -0
- package/dist/shared/src/containers/EntityPickerDialog/hooks/usePreserveChildSelectionByName.es.js.map +1 -0
- package/dist/shared/src/containers/Feed/Feed.cjs.js +1 -1
- package/dist/shared/src/containers/Feed/Feed.cjs.js.map +1 -1
- package/dist/shared/src/containers/Feed/Feed.es.js +247 -151
- package/dist/shared/src/containers/Feed/Feed.es.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/ActivityCheckbox/ActivityCheckbox.cjs.js +1 -1
- package/dist/shared/src/containers/Feed/components/ActivityCheckbox/ActivityCheckbox.cjs.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/ActivityCheckbox/ActivityCheckbox.es.js +8 -4
- package/dist/shared/src/containers/Feed/components/ActivityCheckbox/ActivityCheckbox.es.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.cjs.js +1 -1
- package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.cjs.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.es.js +6 -2
- package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.es.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.styled.cjs.js +1 -0
- package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.styled.cjs.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.styled.es.js +1 -0
- package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.styled.es.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityCommentMenu.cjs.js +1 -1
- package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityCommentMenu.cjs.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityCommentMenu.es.js +9 -5
- package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityCommentMenu.es.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/CommentInput/CommentInput.cjs.js +1 -1
- package/dist/shared/src/containers/Feed/components/CommentInput/CommentInput.cjs.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/CommentInput/CommentInput.es.js +8 -4
- package/dist/shared/src/containers/Feed/components/CommentInput/CommentInput.es.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/FilesGrid/FilesGrid.styled.cjs.js +1 -1
- package/dist/shared/src/containers/Feed/components/FilesGrid/FilesGrid.styled.cjs.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/FilesGrid/FilesGrid.styled.es.js +3 -3
- package/dist/shared/src/containers/Feed/components/FilesGrid/FilesGrid.styled.es.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/Tooltips/EntityTooltip/EntityTooltip.cjs.js +1 -1
- package/dist/shared/src/containers/Feed/components/Tooltips/EntityTooltip/EntityTooltip.cjs.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/Tooltips/EntityTooltip/EntityTooltip.es.js +8 -4
- package/dist/shared/src/containers/Feed/components/Tooltips/EntityTooltip/EntityTooltip.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js +59 -55
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js +9 -5
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/components/ColumnDndProvider.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/components/ColumnDndProvider.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/components/ColumnDndProvider.es.js +8 -4
- package/dist/shared/src/containers/ProjectTreeTable/components/ColumnDndProvider.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/components/ColumnHeaderMenu.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/components/ColumnHeaderMenu.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/components/ColumnHeaderMenu.es.js +6 -2
- package/dist/shared/src/containers/ProjectTreeTable/components/ColumnHeaderMenu.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.es.js +8 -4
- package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/context/CellEditingProvider.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/context/CellEditingProvider.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/context/CellEditingProvider.es.js +8 -4
- package/dist/shared/src/containers/ProjectTreeTable/context/CellEditingProvider.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/context/SelectedRowsProvider.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/context/SelectedRowsProvider.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/context/SelectedRowsProvider.es.js +16 -16
- package/dist/shared/src/containers/ProjectTreeTable/context/SelectedRowsProvider.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/context/SelectionCellsProvider.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/context/SelectionCellsProvider.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/context/SelectionCellsProvider.es.js +6 -2
- package/dist/shared/src/containers/ProjectTreeTable/context/SelectionCellsProvider.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.es.js +9 -5
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.es.js +6 -2
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useCellContextMenu.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useCellContextMenu.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useCellContextMenu.es.js +8 -4
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useCellContextMenu.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useCheckSelectedCellsVisible.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useCheckSelectedCellsVisible.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useCheckSelectedCellsVisible.es.js +8 -4
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useCheckSelectedCellsVisible.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useColumnGroupBy.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useColumnGroupBy.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useColumnGroupBy.es.js +6 -2
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useColumnGroupBy.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetGroupedFields.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetGroupedFields.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetGroupedFields.es.js +6 -2
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetGroupedFields.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useGroupBySettings.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useGroupBySettings.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useGroupBySettings.es.js +6 -2
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useGroupBySettings.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useKeyboardNavigation.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useKeyboardNavigation.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useKeyboardNavigation.es.js +8 -4
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useKeyboardNavigation.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useMoveEntities.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useMoveEntities.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useMoveEntities.es.js +8 -4
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useMoveEntities.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/usePasteLinks.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/usePasteLinks.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/usePasteLinks.es.js +6 -2
- package/dist/shared/src/containers/ProjectTreeTable/hooks/usePasteLinks.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.es.js +6 -2
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useSortBySettings.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useSortBySettings.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useSortBySettings.es.js +6 -2
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useSortBySettings.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/utils/cellUtils.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/utils/cellUtils.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/utils/cellUtils.es.js +17 -13
- package/dist/shared/src/containers/ProjectTreeTable/utils/cellUtils.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.es.js +7 -3
- package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/LinksWidget.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/LinksWidget.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/LinksWidget.es.js +60 -48
- package/dist/shared/src/containers/ProjectTreeTable/widgets/LinksWidget.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/NameWidget.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/NameWidget.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/NameWidget.es.js +6 -2
- package/dist/shared/src/containers/ProjectTreeTable/widgets/NameWidget.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/SubtasksWidget.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/SubtasksWidget.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/SubtasksWidget.es.js +8 -4
- package/dist/shared/src/containers/ProjectTreeTable/widgets/SubtasksWidget.es.js.map +1 -1
- package/dist/shared/src/containers/RepresentationsList/RepresentationsList.cjs.js +1 -1
- package/dist/shared/src/containers/RepresentationsList/RepresentationsList.es.js +24 -24
- package/dist/shared/src/containers/SimpleTable/SimpleTable.cjs.js +1 -1
- package/dist/shared/src/containers/SimpleTable/SimpleTable.cjs.js.map +1 -1
- package/dist/shared/src/containers/SimpleTable/SimpleTable.es.js +8 -4
- package/dist/shared/src/containers/SimpleTable/SimpleTable.es.js.map +1 -1
- package/dist/shared/src/containers/Slicer/components/SlicerSearch.cjs.js +1 -1
- package/dist/shared/src/containers/Slicer/components/SlicerSearch.cjs.js.map +1 -1
- package/dist/shared/src/containers/Slicer/components/SlicerSearch.es.js +8 -4
- package/dist/shared/src/containers/Slicer/components/SlicerSearch.es.js.map +1 -1
- package/dist/shared/src/containers/Views/ViewsDialogContainer/ViewFormDialogFallback.cjs.js.map +1 -1
- package/dist/shared/src/containers/Views/ViewsDialogContainer/ViewFormDialogFallback.es.js.map +1 -1
- package/dist/shared/src/containers/Views/ViewsMenuContainer/BaseViewsTags.cjs.js +1 -1
- package/dist/shared/src/containers/Views/ViewsMenuContainer/BaseViewsTags.cjs.js.map +1 -1
- package/dist/shared/src/containers/Views/ViewsMenuContainer/BaseViewsTags.es.js +8 -4
- package/dist/shared/src/containers/Views/ViewsMenuContainer/BaseViewsTags.es.js.map +1 -1
- package/dist/shared/src/containers/Views/ViewsMenuContainer/ViewsMenuContainer.cjs.js +2 -2
- package/dist/shared/src/containers/Views/ViewsMenuContainer/ViewsMenuContainer.cjs.js.map +1 -1
- package/dist/shared/src/containers/Views/ViewsMenuContainer/ViewsMenuContainer.es.js +24 -23
- package/dist/shared/src/containers/Views/ViewsMenuContainer/ViewsMenuContainer.es.js.map +1 -1
- package/dist/shared/src/containers/Views/context/ViewsContext.cjs.js +1 -1
- package/dist/shared/src/containers/Views/context/ViewsContext.cjs.js.map +1 -1
- package/dist/shared/src/containers/Views/context/ViewsContext.es.js +83 -88
- package/dist/shared/src/containers/Views/context/ViewsContext.es.js.map +1 -1
- package/dist/shared/src/containers/Views/hooks/useBaseViewMutations.cjs.js +1 -1
- package/dist/shared/src/containers/Views/hooks/useBaseViewMutations.cjs.js.map +1 -1
- package/dist/shared/src/containers/Views/hooks/useBaseViewMutations.es.js +1 -1
- package/dist/shared/src/containers/Views/hooks/useBaseViewMutations.es.js.map +1 -1
- package/dist/shared/src/containers/Views/hooks/useBuildViewMenuItems.cjs.js +1 -1
- package/dist/shared/src/containers/Views/hooks/useBuildViewMenuItems.cjs.js.map +1 -1
- package/dist/shared/src/containers/Views/hooks/useBuildViewMenuItems.es.js +56 -53
- package/dist/shared/src/containers/Views/hooks/useBuildViewMenuItems.es.js.map +1 -1
- package/dist/shared/src/containers/Views/hooks/useSaveViewFromCurrent.cjs.js +1 -1
- package/dist/shared/src/containers/Views/hooks/useSaveViewFromCurrent.cjs.js.map +1 -1
- package/dist/shared/src/containers/Views/hooks/useSaveViewFromCurrent.es.js +23 -144
- package/dist/shared/src/containers/Views/hooks/useSaveViewFromCurrent.es.js.map +1 -1
- package/dist/shared/src/containers/Views/hooks/useViewSettingsChanged.cjs.js.map +1 -1
- package/dist/shared/src/containers/Views/hooks/useViewSettingsChanged.es.js.map +1 -1
- package/dist/shared/src/containers/Views/hooks/useViewsMutations.cjs.js.map +1 -1
- package/dist/shared/src/containers/Views/hooks/useViewsMutations.es.js.map +1 -1
- package/dist/shared/src/containers/Views/types.cjs.js +2 -0
- package/dist/shared/src/containers/Views/types.cjs.js.map +1 -0
- package/dist/shared/src/containers/Views/types.es.js +15 -0
- package/dist/shared/src/containers/Views/types.es.js.map +1 -0
- package/dist/shared/src/containers/Views/utils/getCustomViewsFallback.cjs.js.map +1 -1
- package/dist/shared/src/containers/Views/utils/getCustomViewsFallback.es.js.map +1 -1
- package/dist/shared/src/containers/Views/utils/isViewStudioScope.cjs.js +2 -0
- package/dist/shared/src/containers/Views/utils/isViewStudioScope.cjs.js.map +1 -0
- package/dist/shared/src/containers/Views/utils/isViewStudioScope.es.js +5 -0
- package/dist/shared/src/containers/Views/utils/isViewStudioScope.es.js.map +1 -0
- package/dist/shared/src/containers/Views/utils/portalUtils.cjs.js.map +1 -1
- package/dist/shared/src/containers/Views/utils/portalUtils.es.js.map +1 -1
- package/dist/shared/src/context/DetailsPanelContext.cjs.js +1 -1
- package/dist/shared/src/context/DetailsPanelContext.cjs.js.map +1 -1
- package/dist/shared/src/context/DetailsPanelContext.es.js +76 -77
- package/dist/shared/src/context/DetailsPanelContext.es.js.map +1 -1
- package/dist/shared/src/context/WebsocketContext.cjs.js +1 -1
- package/dist/shared/src/context/WebsocketContext.cjs.js.map +1 -1
- package/dist/shared/src/context/WebsocketContext.es.js +9 -5
- package/dist/shared/src/context/WebsocketContext.es.js.map +1 -1
- package/dist/types/api/generated/access.d.ts +6 -0
- package/dist/types/api/generated/graphql.d.ts +8 -4
- package/dist/types/api/generated/users.d.ts +6 -1
- package/dist/types/components/AttributeEditor/AttributeEditor.d.ts +1 -0
- package/dist/types/components/LinksManager/LinkManagerItem.d.ts +2 -0
- package/dist/types/components/LinksManager/LinksManager.styled.d.ts +6 -0
- package/dist/types/components/LinksManager/utils/groupLinks.d.ts +14 -0
- package/dist/types/components/ReviewablesList/ReviewablesUpload.d.ts +1 -0
- package/dist/types/containers/EntityPickerDialog/hooks/useGetEntityPickerData.d.ts +1 -1
- package/dist/types/containers/EntityPickerDialog/hooks/usePreserveChildSelectionByName.d.ts +11 -0
- package/dist/types/containers/ProjectTreeTable/types/table.d.ts +1 -0
- package/dist/types/containers/Views/ViewsDialogContainer/ViewFormDialogFallback.d.ts +2 -1
- package/dist/types/containers/Views/ViewsMenuContainer/ViewsMenuContainer.d.ts +2 -2
- package/dist/types/containers/Views/context/ViewsContext.d.ts +3 -2
- package/dist/types/containers/Views/hooks/useBaseViewMutations.d.ts +1 -1
- package/dist/types/containers/Views/hooks/useBuildViewMenuItems.d.ts +2 -3
- package/dist/types/containers/Views/hooks/useSaveViewFromCurrent.d.ts +2 -1
- package/dist/types/containers/Views/hooks/useViewSettingsChanged.d.ts +1 -1
- package/dist/types/containers/Views/index.d.ts +1 -7
- package/dist/types/containers/Views/types.d.ts +10 -0
- package/dist/types/containers/Views/utils/isViewStudioScope.d.ts +2 -0
- package/dist/types/containers/Views/utils/portalUtils.d.ts +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityPanelUploader.es.js","sources":["../../../../../src/components/EntityPanelUploader/EntityPanelUploader.tsx"],"sourcesContent":["import { ChangeEvent, useRef, useState } from 'react'\nimport clsx from 'clsx'\n\nimport { ThumbnailWrapper } from '@shared/containers'\nimport {\n useCreateVersionMutation,\n useUpdateEntitiesMutation,\n useCreateProductMutation,\n} from '@shared/api'\nimport * as Styled from './EntityPanelUploader.styled'\nimport { ThumbnailUploadProvider } from '../../context/ThumbnailUploaderContext'\nimport Dropzone, { DropzoneType } from './Dropzone'\nimport axios from 'axios'\nimport { toast } from 'react-toastify'\nimport { useReviewablesUpload } from '../ReviewablesList'\nimport { useDetailsPanelContext } from '@shared/context'\nimport EntityPanelUploaderDialog from './EntityPanelUploaderDialog'\nimport {\n sanitizeProductName,\n createProductHelper,\n createVersionHelper,\n getNextVersionNumber,\n handleUploadError,\n} from '@shared/util'\n\ntype Operation = {\n id: string\n projectName: string\n currentAssignees: any[]\n data: { updatedAt: string }\n}\nexport type EntityPanelUploaderProps = {\n entityType: string\n entities: any[]\n projectName: any\n children?: JSX.Element | JSX.Element[]\n onUploaded?: (operations: Operation[]) => void\n resetFileUploadState?: () => void\n onVersionCreated?: (versionId: string) => void\n}\n\ntype UploadType = 'thumbnail' | 'version'\nconst dropZones: (DropzoneType & { id: UploadType })[] = [\n { id: 'thumbnail', label: 'Upload thumbnail', icon: 'add_photo_alternate' },\n { id: 'version', label: 'Upload version', icon: 'layers' },\n]\n\nexport const EntityPanelUploader = ({\n children = [],\n entityType,\n entities = [],\n projectName,\n onUploaded,\n onVersionCreated,\n}: EntityPanelUploaderProps) => {\n const { dispatch } = useDetailsPanelContext()\n // Dragging and dropping state\n const [isDraggingFile, setIsDraggingFile] = useState(false)\n const [draggingZone, setDraggingZone] = useState<UploadType | null>(null)\n const dragCounterRef = useRef(0)\n\n // Uploading state\n const [uploadingType, setUploadingType] = useState<UploadType | null>(null)\n const [progress, setProgress] = useState(0)\n\n // Dialog state for product creation\n const [showProductDialog, setShowProductDialog] = useState(false)\n const [pendingFiles, setPendingFiles] = useState<FileList | null>(null)\n\n // Check if we have exactly one entity selected\n const singleEntity = entities.length === 1 ? entities[0] : null\n // extra all entity IDs for the single version entity\n const taskId: string | undefined = singleEntity?.task?.id\n const folderId: string | undefined = singleEntity?.folder?.id\n const productId: string | undefined = singleEntity?.product?.id\n const versionId: string | undefined = singleEntity?.id\n const canUploadVersions = Boolean(singleEntity && entityType !== 'representation')\n\n // Use the custom hook for reviewable upload logic (only when single version)\n const { handleFileUpload: uploadReviewableFiles } = useReviewablesUpload({\n projectName,\n versionId: versionId,\n taskId: taskId,\n folderId: folderId,\n productId: productId,\n dispatch,\n onUpload: () => {\n setUploadingType(null)\n setProgress(0)\n },\n onProgress: (progress) => {\n setProgress(progress)\n },\n })\n\n // Filter drop zones based on whether we can upload reviewables\n const availableDropZones = dropZones.filter((zone) => {\n if (zone.id === 'version') {\n return canUploadVersions\n }\n return true\n })\n\n const resetState = () => {\n setUploadingType(null)\n setIsDraggingFile(false)\n setDraggingZone(null)\n dragCounterRef.current = 0\n setProgress(0)\n setShowProductDialog(false)\n setPendingFiles(null)\n }\n\n // Handle dialog submission - create product and upload version\n const handleDialogSubmit = async (productName: string) => {\n if (!pendingFiles || !singleEntity) {\n setShowProductDialog(false)\n setPendingFiles(null)\n return\n }\n\n const sanitizedName = sanitizeProductName(productName)\n\n if (!sanitizedName.trim()) {\n toast.error(\n 'Product name must contain valid characters (letters, numbers, underscore, or hyphen)',\n )\n return\n }\n\n try {\n if (!folderId) {\n throw new Error('Folder ID is required to create a product')\n }\n setUploadingType('version')\n\n // Create the product\n const productRes = await createProductHelper(createProduct, projectName, {\n folderId: folderId,\n name: sanitizedName,\n productType: 'review', // default product type for uploaded files\n productBaseType: 'review',\n })\n\n // Close dialog and proceed with version upload\n setShowProductDialog(false)\n await uploadVersionWithProduct(pendingFiles, productRes.id)\n setPendingFiles(null)\n } catch (error: any) {\n handleUploadError(error, 'creating product')\n resetState()\n }\n }\n\n // Handle dialog cancellation\n const handleDialogCancel = () => {\n setShowProductDialog(false)\n setPendingFiles(null)\n resetState()\n }\n\n const [createVersion] = useCreateVersionMutation()\n const [createProduct] = useCreateProductMutation()\n // Handle version/reviewable file upload\n const handleVersionUpload = async (files: FileList) => {\n if (!canUploadVersions || !singleEntity) {\n toast.error('Please select exactly one version to upload reviewables')\n return resetState()\n }\n\n const productId = singleEntity.product?.id\n if (!productId) {\n // Show dialog to create product first\n setPendingFiles(files)\n setShowProductDialog(true)\n return\n }\n\n // If we have a productId, proceed with upload\n await uploadVersionWithProduct(files, productId)\n }\n\n // Helper function to handle the actual version upload\n const uploadVersionWithProduct = async (files: FileList, productId: string) => {\n try {\n const nextVersion = getNextVersionNumber(singleEntity!.product?.latestVersion)\n\n // create a new version\n const versionRes = await createVersionHelper(createVersion, projectName, {\n productId,\n taskId, // previous version could have a taskId or we are uploading on a task\n version: nextVersion,\n })\n\n await uploadReviewableFiles(files, versionRes.id)\n // The hook handles success callbacks, just reset our local state\n resetState()\n\n // update entity panel to focus the new version\n onVersionCreated?.(versionRes.id)\n } catch (error: any) {\n handleUploadError(error, 'uploading version')\n resetState()\n }\n }\n\n // once the file has been uploaded, we need to patch the entities with the new thumbnail\n const handleThumbnailFileUploaded = async (thumbnails: any[] = []) => {\n // always set isDragginle to false\n setIsDraggingFile(false)\n\n // check something was actually uploaded\n if (!entities.length) {\n return\n }\n\n // patching the updatedAt will force a refresh of the thumbnail url\n const newUpdatedAt = new Date().toISOString()\n\n let operations: Operation[] = []\n let versionPatches = []\n\n for (const entity of thumbnails) {\n const entityToPatch = entities.find((e) => e.id === entity.id)\n if (!entityToPatch) continue\n const thumbnailId = entity.thumbnailId\n const currentAssignees = entity.users || []\n\n operations.push({\n id: entityToPatch.id,\n projectName: entityToPatch.projectName,\n data: { updatedAt: newUpdatedAt },\n currentAssignees,\n })\n\n const versionPatch = {\n productId: entityToPatch.productId,\n versionUpdatedAt: newUpdatedAt,\n versionThumbnailId: thumbnailId,\n }\n\n versionPatches.push(versionPatch)\n }\n\n try {\n await updateEntities({ operations, entityType })\n onUploaded && onUploaded(operations)\n } catch (error) {\n console.error('Error uploading thumbnail:', error)\n }\n }\n\n const handleUploadThumbnail = async (file: File) => {\n if (!file) return resetState()\n\n try {\n // check file is an image\n if (!file.type.includes('image')) {\n throw new Error('File is not an image')\n }\n\n let promises = []\n for (const entity of entities) {\n const { id, entityType, projectName } = entity\n\n if (!projectName) throw new Error('Project name is required')\n\n const promise = axios.post(\n projectName && `/api/projects/${projectName}/${entityType}s/${id}/thumbnail`,\n file,\n {\n onUploadProgress: (e) => {\n setProgress(Math.round((100 * e.loaded) / (e.total || file.size)))\n },\n headers: {\n 'Content-Type': file.type,\n },\n },\n )\n\n promises.push(promise)\n }\n\n const res = await Promise.all(promises)\n\n const updatedEntities = res.map((res, i) => ({\n thumbnailId: res.data.id as string,\n id: entities[i].id,\n }))\n\n handleThumbnailFileUploaded(updatedEntities)\n resetState()\n } catch (error: any) {\n console.error(error)\n toast.error(error.message)\n resetState()\n }\n }\n\n const [updateEntities] = useUpdateEntitiesMutation()\n\n const handleDragEnter = (e: React.DragEvent) => {\n e.preventDefault()\n dragCounterRef.current++\n if (dragCounterRef.current === 1) {\n setIsDraggingFile(true)\n }\n }\n\n const handleDragLeave = (e: React.DragEvent) => {\n e.preventDefault()\n dragCounterRef.current--\n if (dragCounterRef.current === 0) {\n setIsDraggingFile(false)\n setDraggingZone(null)\n }\n }\n\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault()\n }\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault()\n dragCounterRef.current = 0\n setIsDraggingFile(false)\n setDraggingZone(null)\n\n if (!e.dataTransfer.files || e.dataTransfer.files.length === 0) {\n return\n }\n\n if (draggingZone === 'thumbnail') {\n setUploadingType('thumbnail')\n const file = e.dataTransfer.files[0]\n // try to upload the thumbnail\n handleUploadThumbnail(file)\n }\n\n if (draggingZone === 'version') {\n setUploadingType('version')\n const files = e.dataTransfer.files\n // try to upload the reviewables using the hook\n handleVersionUpload(files)\n }\n }\n\n // upload thumbnail from input (right click on thumbnail)\n const handleInputUpload = async (event: ChangeEvent<HTMLInputElement>, type: UploadType) => {\n const files = event.target.files\n if (!files || files.length === 0) {\n return\n }\n\n if (type === 'version') {\n setUploadingType('version')\n handleVersionUpload(files)\n }\n if (type === 'thumbnail') {\n setUploadingType('thumbnail')\n handleUploadThumbnail(files[0])\n }\n }\n\n const thumbnailInputRef = useRef<HTMLInputElement>(null)\n const versionsInputRef = useRef<HTMLInputElement>(null)\n\n return (\n <ThumbnailUploadProvider\n entities={entities}\n handleThumbnailUpload={handleThumbnailFileUploaded}\n thumbnailInputRef={thumbnailInputRef}\n versionsInputRef={canUploadVersions ? versionsInputRef : undefined}\n >\n <Styled.DragAndDropWrapper\n className={clsx({ dragging: isDraggingFile })}\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n <ThumbnailWrapper>\n <div>{children}</div>\n </ThumbnailWrapper>\n {isDraggingFile && (\n <Styled.DropZones>\n {availableDropZones.map((zone) => (\n <Dropzone\n key={zone.id}\n id={zone.id}\n label={zone.label}\n icon={zone.icon}\n isActive={draggingZone === zone.id}\n onDragOver={() => setDraggingZone(zone.id)}\n onDragLeave={() => setDraggingZone(null)}\n />\n ))}\n </Styled.DropZones>\n )}\n {(uploadingType === 'thumbnail' || uploadingType === 'version') && (\n <Styled.DropZones>\n <Styled.UploadingProgress>\n <Styled.Progress\n style={{\n right: `${100 - progress}%`,\n }}\n />\n <span className=\"label\">{`Uploading ${uploadingType}...`}</span>\n </Styled.UploadingProgress>\n <Styled.CancelButton icon={'close'} variant=\"text\" onClick={resetState} />\n </Styled.DropZones>\n )}\n <input\n type=\"file\"\n onChange={(e) => handleInputUpload(e, 'thumbnail')}\n ref={thumbnailInputRef}\n />\n <input\n type=\"file\"\n onChange={(e) => handleInputUpload(e, 'version')}\n ref={versionsInputRef}\n />\n </Styled.DragAndDropWrapper>\n\n {/* Product creation dialog */}\n <EntityPanelUploaderDialog\n isOpen={showProductDialog}\n files={pendingFiles}\n onSubmit={handleDialogSubmit}\n onCancel={handleDialogCancel}\n />\n </ThumbnailUploadProvider>\n )\n}\n"],"names":["dropZones","EntityPanelUploader","children","entityType","entities","projectName","onUploaded","onVersionCreated","dispatch","useDetailsPanelContext","isDraggingFile","setIsDraggingFile","useState","draggingZone","setDraggingZone","dragCounterRef","useRef","uploadingType","setUploadingType","progress","setProgress","showProductDialog","setShowProductDialog","pendingFiles","setPendingFiles","singleEntity","taskId","folderId","productId","versionId","canUploadVersions","uploadReviewableFiles","useReviewablesUpload","availableDropZones","zone","resetState","handleDialogSubmit","productName","sanitizedName","sanitizeProductName","toast","productRes","createProductHelper","createProduct","uploadVersionWithProduct","error","handleUploadError","handleDialogCancel","createVersion","useCreateVersionMutation","useCreateProductMutation","handleVersionUpload","files","nextVersion","getNextVersionNumber","versionRes","createVersionHelper","handleThumbnailFileUploaded","thumbnails","newUpdatedAt","operations","entity","entityToPatch","e","currentAssignees","updateEntities","handleUploadThumbnail","file","promises","id","promise","axios","updatedEntities","res","i","useUpdateEntitiesMutation","handleDragEnter","handleDragLeave","handleDragOver","handleDrop","handleInputUpload","event","type","thumbnailInputRef","versionsInputRef","jsxs","ThumbnailUploadProvider","Styled.DragAndDropWrapper","clsx","jsx","ThumbnailWrapper","Styled.DropZones","Dropzone","Styled.UploadingProgress","Styled.Progress","Styled.CancelButton","EntityPanelUploaderDialog"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"EntityPanelUploader.es.js","sources":["../../../../../src/components/EntityPanelUploader/EntityPanelUploader.tsx"],"sourcesContent":["import { ChangeEvent, useRef, useState } from 'react'\nimport clsx from 'clsx'\n\nimport { ThumbnailWrapper } from '@shared/containers'\nimport {\n useCreateVersionMutation,\n useUpdateEntitiesMutation,\n useCreateProductMutation,\n} from '@shared/api'\nimport * as Styled from './EntityPanelUploader.styled'\nimport { ThumbnailUploadProvider } from '../../context/ThumbnailUploaderContext'\nimport Dropzone, { DropzoneType } from './Dropzone'\nimport axios from 'axios'\nimport { toast } from 'react-toastify'\nimport { useReviewablesUpload } from '../ReviewablesList'\nimport { useDetailsPanelContext } from '@shared/context'\nimport EntityPanelUploaderDialog from './EntityPanelUploaderDialog'\nimport {\n sanitizeProductName,\n createProductHelper,\n createVersionHelper,\n getNextVersionNumber,\n handleUploadError,\n} from '@shared/util'\n\ntype Operation = {\n id: string\n projectName: string\n currentAssignees: any[]\n data: { updatedAt: string }\n}\nexport type EntityPanelUploaderProps = {\n entityType: string\n entities: any[]\n projectName: any\n children?: JSX.Element | JSX.Element[]\n onUploaded?: (operations: Operation[]) => void\n resetFileUploadState?: () => void\n onVersionCreated?: (versionId: string) => void\n}\n\ntype UploadType = 'thumbnail' | 'version'\nconst dropZones: (DropzoneType & { id: UploadType })[] = [\n { id: 'thumbnail', label: 'Upload thumbnail', icon: 'add_photo_alternate' },\n { id: 'version', label: 'Upload version', icon: 'layers' },\n]\n\nexport const EntityPanelUploader = ({\n children = [],\n entityType,\n entities = [],\n projectName,\n onUploaded,\n onVersionCreated,\n}: EntityPanelUploaderProps) => {\n const { dispatch } = useDetailsPanelContext()\n // Dragging and dropping state\n const [isDraggingFile, setIsDraggingFile] = useState(false)\n const [draggingZone, setDraggingZone] = useState<UploadType | null>(null)\n const dragCounterRef = useRef(0)\n\n // Uploading state\n const [uploadingType, setUploadingType] = useState<UploadType | null>(null)\n const [progress, setProgress] = useState(0)\n\n // Dialog state for product creation\n const [showProductDialog, setShowProductDialog] = useState(false)\n const [pendingFiles, setPendingFiles] = useState<FileList | null>(null)\n\n // Check if we have exactly one entity selected\n const singleEntity = entities.length === 1 ? entities[0] : null\n // extra all entity IDs for the single version entity\n const taskId: string | undefined = singleEntity?.task?.id\n const folderId: string | undefined = singleEntity?.folder?.id\n const productId: string | undefined = singleEntity?.product?.id\n const versionId: string | undefined = singleEntity?.id\n const canUploadVersions = Boolean(singleEntity && entityType !== 'representation')\n\n // Use the custom hook for reviewable upload logic (only when single version)\n const { handleFileUpload: uploadReviewableFiles } = useReviewablesUpload({\n projectName,\n versionId: versionId,\n taskId: taskId,\n folderId: folderId,\n productId: productId,\n dispatch,\n onUpload: () => {\n setUploadingType(null)\n setProgress(0)\n },\n onProgress: (progress) => {\n setProgress(progress)\n },\n })\n\n // Filter drop zones based on whether we can upload reviewables\n const availableDropZones = dropZones.filter((zone) => {\n if (zone.id === 'version') {\n return canUploadVersions\n }\n return true\n })\n\n const resetState = () => {\n setUploadingType(null)\n setIsDraggingFile(false)\n setDraggingZone(null)\n dragCounterRef.current = 0\n setProgress(0)\n setShowProductDialog(false)\n setPendingFiles(null)\n }\n\n // Handle dialog submission - create product and upload version\n const handleDialogSubmit = async (productName: string) => {\n if (!pendingFiles || !singleEntity) {\n setShowProductDialog(false)\n setPendingFiles(null)\n return\n }\n\n const sanitizedName = sanitizeProductName(productName)\n\n if (!sanitizedName.trim()) {\n toast.error(\n 'Product name must contain valid characters (letters, numbers, underscore, or hyphen)',\n )\n return\n }\n\n try {\n if (!folderId) {\n throw new Error('Folder ID is required to create a product')\n }\n setUploadingType('version')\n\n // Create the product\n const productRes = await createProductHelper(createProduct, projectName, {\n folderId: folderId,\n name: sanitizedName,\n productType: 'review', // default product type for uploaded files\n productBaseType: 'review',\n })\n\n // Close dialog and proceed with version upload\n setShowProductDialog(false)\n await uploadVersionWithProduct(pendingFiles, productRes.id)\n setPendingFiles(null)\n } catch (error: any) {\n handleUploadError(error, 'creating product')\n resetState()\n }\n }\n\n // Handle dialog cancellation\n const handleDialogCancel = () => {\n setShowProductDialog(false)\n setPendingFiles(null)\n resetState()\n }\n\n const [createVersion] = useCreateVersionMutation()\n const [createProduct] = useCreateProductMutation()\n // Handle version/reviewable file upload\n const handleVersionUpload = async (files: FileList) => {\n if (!canUploadVersions || !singleEntity) {\n toast.error('Please select exactly one version to upload reviewables')\n return resetState()\n }\n\n const productId = singleEntity.product?.id\n if (!productId) {\n // Show dialog to create product first\n setPendingFiles(files)\n setShowProductDialog(true)\n return\n }\n\n // If we have a productId, proceed with upload\n await uploadVersionWithProduct(files, productId)\n }\n\n // Helper function to handle the actual version upload\n const uploadVersionWithProduct = async (files: FileList, productId: string) => {\n try {\n const nextVersion = getNextVersionNumber(singleEntity!.product?.latestVersion)\n\n // create a new version\n const versionRes = await createVersionHelper(createVersion, projectName, {\n productId,\n taskId, // previous version could have a taskId or we are uploading on a task\n version: nextVersion,\n })\n\n await uploadReviewableFiles(files, versionRes.id)\n // The hook handles success callbacks, just reset our local state\n resetState()\n\n // update entity panel to focus the new version\n onVersionCreated?.(versionRes.id)\n } catch (error: any) {\n handleUploadError(error, 'uploading version')\n resetState()\n }\n }\n\n // once the file has been uploaded, we need to patch the entities with the new thumbnail\n const handleThumbnailFileUploaded = async (thumbnails: any[] = []) => {\n // always set isDragginle to false\n setIsDraggingFile(false)\n\n // check something was actually uploaded\n if (!entities.length) {\n return\n }\n\n // patching the updatedAt will force a refresh of the thumbnail url\n const newUpdatedAt = new Date().toISOString()\n\n let operations: Operation[] = []\n let versionPatches = []\n\n for (const entity of thumbnails) {\n const entityToPatch = entities.find((e) => e.id === entity.id)\n if (!entityToPatch) continue\n const thumbnailId = entity.thumbnailId\n const currentAssignees = entity.users || []\n\n operations.push({\n id: entityToPatch.id,\n projectName: entityToPatch.projectName,\n data: { updatedAt: newUpdatedAt },\n currentAssignees,\n })\n\n const versionPatch = {\n productId: entityToPatch.productId,\n versionUpdatedAt: newUpdatedAt,\n versionThumbnailId: thumbnailId,\n }\n\n versionPatches.push(versionPatch)\n }\n\n try {\n await updateEntities({ operations, entityType })\n onUploaded && onUploaded(operations)\n } catch (error) {\n console.error('Error uploading thumbnail:', error)\n }\n }\n\n const handleUploadThumbnail = async (file: File) => {\n if (!file) return resetState()\n\n try {\n // check file is an image\n if (!file.type.includes('image')) {\n throw new Error('File is not an image')\n }\n\n let promises = []\n for (const entity of entities) {\n const { id, entityType, projectName } = entity\n\n if (!projectName) throw new Error('Project name is required')\n\n const promise = axios.post(\n projectName && `/api/projects/${projectName}/${entityType}s/${id}/thumbnail`,\n file,\n {\n onUploadProgress: (e) => {\n setProgress(Math.round((100 * e.loaded) / (e.total || file.size)))\n },\n headers: {\n 'Content-Type': file.type,\n },\n },\n )\n\n promises.push(promise)\n }\n\n const res = await Promise.all(promises)\n\n const updatedEntities = res.map((res, i) => ({\n thumbnailId: res.data.id as string,\n id: entities[i].id,\n }))\n\n handleThumbnailFileUploaded(updatedEntities)\n resetState()\n } catch (error: any) {\n console.error(error)\n toast.error(error.message)\n resetState()\n }\n }\n\n const [updateEntities] = useUpdateEntitiesMutation()\n\n const handleDragEnter = (e: React.DragEvent) => {\n e.preventDefault()\n dragCounterRef.current++\n if (dragCounterRef.current === 1) {\n setIsDraggingFile(true)\n }\n }\n\n const handleDragLeave = (e: React.DragEvent) => {\n e.preventDefault()\n dragCounterRef.current--\n if (dragCounterRef.current === 0) {\n setIsDraggingFile(false)\n setDraggingZone(null)\n }\n }\n\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault()\n }\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault()\n dragCounterRef.current = 0\n setIsDraggingFile(false)\n setDraggingZone(null)\n\n if (!e.dataTransfer.files || e.dataTransfer.files.length === 0) {\n return\n }\n\n if (draggingZone === 'thumbnail') {\n setUploadingType('thumbnail')\n const file = e.dataTransfer.files[0]\n // try to upload the thumbnail\n handleUploadThumbnail(file)\n }\n\n if (draggingZone === 'version') {\n setUploadingType('version')\n const files = e.dataTransfer.files\n // try to upload the reviewables using the hook\n handleVersionUpload(files)\n }\n }\n\n // upload thumbnail from input (right click on thumbnail)\n const handleInputUpload = async (event: ChangeEvent<HTMLInputElement>, type: UploadType) => {\n const files = event.target.files\n if (!files || files.length === 0) {\n return\n }\n\n if (type === 'version') {\n setUploadingType('version')\n handleVersionUpload(files)\n }\n if (type === 'thumbnail') {\n setUploadingType('thumbnail')\n handleUploadThumbnail(files[0])\n }\n }\n\n const thumbnailInputRef = useRef<HTMLInputElement>(null)\n const versionsInputRef = useRef<HTMLInputElement>(null)\n\n return (\n <ThumbnailUploadProvider\n entities={entities}\n handleThumbnailUpload={handleThumbnailFileUploaded}\n thumbnailInputRef={thumbnailInputRef}\n versionsInputRef={canUploadVersions ? versionsInputRef : undefined}\n >\n <Styled.DragAndDropWrapper\n className={clsx({ dragging: isDraggingFile })}\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n <ThumbnailWrapper>\n <div>{children}</div>\n </ThumbnailWrapper>\n {isDraggingFile && (\n <Styled.DropZones>\n {availableDropZones.map((zone) => (\n <Dropzone\n key={zone.id}\n id={zone.id}\n label={zone.label}\n icon={zone.icon}\n isActive={draggingZone === zone.id}\n onDragOver={() => setDraggingZone(zone.id)}\n onDragLeave={() => setDraggingZone(null)}\n />\n ))}\n </Styled.DropZones>\n )}\n {(uploadingType === 'thumbnail' || uploadingType === 'version') && (\n <Styled.DropZones>\n <Styled.UploadingProgress>\n <Styled.Progress\n style={{\n right: `${100 - progress}%`,\n }}\n />\n <span className=\"label\">{`Uploading ${uploadingType}...`}</span>\n </Styled.UploadingProgress>\n <Styled.CancelButton icon={'close'} variant=\"text\" onClick={resetState} />\n </Styled.DropZones>\n )}\n <input\n type=\"file\"\n onChange={(e) => handleInputUpload(e, 'thumbnail')}\n ref={thumbnailInputRef}\n />\n <input\n type=\"file\"\n onChange={(e) => handleInputUpload(e, 'version')}\n ref={versionsInputRef}\n />\n </Styled.DragAndDropWrapper>\n\n {/* Product creation dialog */}\n <EntityPanelUploaderDialog\n isOpen={showProductDialog}\n files={pendingFiles}\n onSubmit={handleDialogSubmit}\n onCancel={handleDialogCancel}\n />\n </ThumbnailUploadProvider>\n )\n}\n"],"names":["dropZones","EntityPanelUploader","children","entityType","entities","projectName","onUploaded","onVersionCreated","dispatch","useDetailsPanelContext","isDraggingFile","setIsDraggingFile","useState","draggingZone","setDraggingZone","dragCounterRef","useRef","uploadingType","setUploadingType","progress","setProgress","showProductDialog","setShowProductDialog","pendingFiles","setPendingFiles","singleEntity","taskId","folderId","productId","versionId","canUploadVersions","uploadReviewableFiles","useReviewablesUpload","availableDropZones","zone","resetState","handleDialogSubmit","productName","sanitizedName","sanitizeProductName","toast","productRes","createProductHelper","createProduct","uploadVersionWithProduct","error","handleUploadError","handleDialogCancel","createVersion","useCreateVersionMutation","useCreateProductMutation","handleVersionUpload","files","nextVersion","getNextVersionNumber","versionRes","createVersionHelper","handleThumbnailFileUploaded","thumbnails","newUpdatedAt","operations","entity","entityToPatch","e","currentAssignees","updateEntities","handleUploadThumbnail","file","promises","id","promise","axios","updatedEntities","res","i","useUpdateEntitiesMutation","handleDragEnter","handleDragLeave","handleDragOver","handleDrop","handleInputUpload","event","type","thumbnailInputRef","versionsInputRef","jsxs","ThumbnailUploadProvider","Styled.DragAndDropWrapper","clsx","jsx","ThumbnailWrapper","Styled.DropZones","Dropzone","Styled.UploadingProgress","Styled.Progress","Styled.CancelButton","EntityPanelUploaderDialog"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";const e=require("../../../../_virtual/jsx-runtime.cjs.js"),n=require("react"),i=require("./LinksManager.styled.cjs.js"),L=require("@ynput/ayon-react-components");require("../../api/base/client.cjs.js");require("../../api/generated/graphql.cjs.js");require("../../api/generated/graphqlLinks.cjs.js");require("../../api/generated/access.cjs.js");require("../../api/generated/actions.cjs.js");require("../../api/generated/activityFeed.cjs.js");require("../../api/generated/addons.cjs.js");require("../../api/generated/anatomy.cjs.js");require("../../api/generated/attributes.cjs.js");require("../../api/generated/authentication.cjs.js");require("../../api/generated/bundles.cjs.js");require("../../api/generated/configuration.cjs.js");require("../../api/generated/desktop.cjs.js");require("../../api/generated/entityLists.cjs.js");require("../../api/generated/events.cjs.js");require("../../api/generated/files.cjs.js");require("../../api/generated/folders.cjs.js");require("../../api/generated/inbox.cjs.js");require("../../api/generated/links.cjs.js");require("../../api/generated/market.cjs.js");require("../../api/generated/onboarding.cjs.js");require("../../api/generated/operations.cjs.js");require("../../api/generated/products.cjs.js");require("../../api/generated/projectDashboard.cjs.js");require("../../api/generated/projects.cjs.js");require("../../api/generated/projectFolders.cjs.js");require("../../api/generated/reviewables.cjs.js");require("../../api/generated/services.cjs.js");require("../../api/generated/system.cjs.js");require("../../api/generated/tasks.cjs.js");require("../../api/generated/teams.cjs.js");require("../../api/generated/thumbnails.cjs.js");require("../../api/generated/uRIs.cjs.js");require("../../api/generated/users.cjs.js");require("../../api/generated/versions.cjs.js");require("../../api/generated/workfiles.cjs.js");require("../../api/generated/ynputCloud.cjs.js");require("../../api/generated/grouping.cjs.js");require("../../api/generated/views.cjs.js");require("../../api/queries/actions/getActions.cjs.js");require("../../api/queries/activities/getActivities.cjs.js");require("../../api/queries/activities/updateActivities.cjs.js");require("../../api/queries/activities/updateReaction.cjs.js");require("../../api/queries/activities/getMentions.cjs.js");require("../../api/queries/activities/getCategories.cjs.js");require("../../api/queries/addons/getAddons.cjs.js");require("../../api/queries/addons/updateAddons.cjs.js");require("../../api/queries/attributes/getAttributes.cjs.js");require("../../api/queries/attributes/updateAttributes.cjs.js");require("../../api/queries/authentication/getAuthentication.cjs.js");require("../../api/queries/cloud/cloud.cjs.js");require("../../api/queries/config/getConfig.cjs.js");require("../../api/queries/config/updateConfig.cjs.js");require("../../api/queries/entities/getEntity.cjs.js");require("../../api/queries/entities/getEntityPanel.cjs.js");require("../../api/queries/entities/updateEntity.cjs.js");require("../../api/queries/entityLists/getLists.cjs.js");require("../../api/queries/entityLists/updateLists.cjs.js");require("../../api/queries/entityLists/getListsAttributes.cjs.js");require("../../api/queries/entityLists/updateListsAttributes.cjs.js");require("../../api/queries/entityLists/listFolders.cjs.js");require("../../api/queries/folders/getFolders.cjs.js");require("../../api/queries/grouping/getGrouping.cjs.js");require("../../api/queries/links/updateLinks.cjs.js");const y=require("../../api/queries/links/getLinks.cjs.js");require("../../api/queries/links/getEntityLinks.cjs.js");require("../../api/queries/overview/getOverview.cjs.js");require("../../api/queries/overview/updateOverview.cjs.js");require("../../api/queries/versions/getVersionsProducts.cjs.js");require("../../api/queries/permissions/getPermissions.cjs.js");require("../../api/queries/products/createProduct.cjs.js");require("../../api/queries/project/getProject.cjs.js");require("../../api/queries/project/updateProject.cjs.js");require("../../api/queries/projectFolders/projectFolders.cjs.js");require("../../api/queries/review/getReview.cjs.js");require("../../api/queries/review/updateReview.cjs.js");require("../../api/queries/share/share.cjs.js");require("../../api/queries/system/getSystem.cjs.js");require("../../api/queries/tasks/getTasks.cjs.js");require("../../api/queries/tasks/updateTasks.cjs.js");require("../../api/queries/userDashboard/getUserDashboard.cjs.js");require("../../api/queries/users/getUsers.cjs.js");require("../../api/queries/users/updateUsers.cjs.js");require("../../api/queries/users/guests.cjs.js");require("../../api/queries/versions/updateVersions.cjs.js");require("../../api/queries/views/getViews.cjs.js");require("../../api/queries/views/updateViews.cjs.js");require("../../api/queries/watchers/getWatchers.cjs.js");require("../../api/queries/uris/getUris.cjs.js");const
|
|
1
|
+
"use strict";const e=require("../../../../_virtual/jsx-runtime.cjs.js"),n=require("react"),i=require("./LinksManager.styled.cjs.js"),L=require("@ynput/ayon-react-components");require("../../api/base/client.cjs.js");require("../../api/generated/graphql.cjs.js");require("../../api/generated/graphqlLinks.cjs.js");require("../../api/generated/access.cjs.js");require("../../api/generated/actions.cjs.js");require("../../api/generated/activityFeed.cjs.js");require("../../api/generated/addons.cjs.js");require("../../api/generated/anatomy.cjs.js");require("../../api/generated/attributes.cjs.js");require("../../api/generated/authentication.cjs.js");require("../../api/generated/bundles.cjs.js");require("../../api/generated/configuration.cjs.js");require("../../api/generated/desktop.cjs.js");require("../../api/generated/entityLists.cjs.js");require("../../api/generated/events.cjs.js");require("../../api/generated/files.cjs.js");require("../../api/generated/folders.cjs.js");require("../../api/generated/inbox.cjs.js");require("../../api/generated/links.cjs.js");require("../../api/generated/market.cjs.js");require("../../api/generated/onboarding.cjs.js");require("../../api/generated/operations.cjs.js");require("../../api/generated/products.cjs.js");require("../../api/generated/projectDashboard.cjs.js");require("../../api/generated/projects.cjs.js");require("../../api/generated/projectFolders.cjs.js");require("../../api/generated/reviewables.cjs.js");require("../../api/generated/services.cjs.js");require("../../api/generated/system.cjs.js");require("../../api/generated/tasks.cjs.js");require("../../api/generated/teams.cjs.js");require("../../api/generated/thumbnails.cjs.js");require("../../api/generated/uRIs.cjs.js");require("../../api/generated/users.cjs.js");require("../../api/generated/versions.cjs.js");require("../../api/generated/workfiles.cjs.js");require("../../api/generated/ynputCloud.cjs.js");require("../../api/generated/grouping.cjs.js");require("../../api/generated/views.cjs.js");require("../../api/queries/actions/getActions.cjs.js");require("../../api/queries/activities/getActivities.cjs.js");require("../../api/queries/activities/updateActivities.cjs.js");require("../../api/queries/activities/updateReaction.cjs.js");require("../../api/queries/activities/getMentions.cjs.js");require("../../api/queries/activities/getCategories.cjs.js");require("../../api/queries/addons/getAddons.cjs.js");require("../../api/queries/addons/updateAddons.cjs.js");require("../../api/queries/attributes/getAttributes.cjs.js");require("../../api/queries/attributes/updateAttributes.cjs.js");require("../../api/queries/authentication/getAuthentication.cjs.js");require("../../api/queries/cloud/cloud.cjs.js");require("../../api/queries/config/getConfig.cjs.js");require("../../api/queries/config/updateConfig.cjs.js");require("../../api/queries/entities/getEntity.cjs.js");require("../../api/queries/entities/getEntityPanel.cjs.js");require("../../api/queries/entities/updateEntity.cjs.js");require("../../api/queries/entityLists/getLists.cjs.js");require("../../api/queries/entityLists/updateLists.cjs.js");require("../../api/queries/entityLists/getListsAttributes.cjs.js");require("../../api/queries/entityLists/updateListsAttributes.cjs.js");require("../../api/queries/entityLists/listFolders.cjs.js");require("../../api/queries/folders/getFolders.cjs.js");require("../../api/queries/grouping/getGrouping.cjs.js");require("../../api/queries/links/updateLinks.cjs.js");const y=require("../../api/queries/links/getLinks.cjs.js");require("../../api/queries/links/getEntityLinks.cjs.js");require("../../api/queries/overview/getOverview.cjs.js");require("../../api/queries/overview/updateOverview.cjs.js");require("../../api/queries/versions/getVersionsProducts.cjs.js");require("../../api/queries/permissions/getPermissions.cjs.js");require("../../api/queries/products/createProduct.cjs.js");require("../../api/queries/project/getProject.cjs.js");require("../../api/queries/project/updateProject.cjs.js");require("../../api/queries/projectFolders/projectFolders.cjs.js");require("../../api/queries/review/getReview.cjs.js");require("../../api/queries/review/updateReview.cjs.js");require("../../api/queries/share/share.cjs.js");require("../../api/queries/system/getSystem.cjs.js");require("../../api/queries/tasks/getTasks.cjs.js");require("../../api/queries/tasks/updateTasks.cjs.js");require("../../api/queries/userDashboard/getUserDashboard.cjs.js");require("../../api/queries/users/getUsers.cjs.js");require("../../api/queries/users/updateUsers.cjs.js");require("../../api/queries/users/guests.cjs.js");require("../../api/queries/versions/updateVersions.cjs.js");require("../../api/queries/views/getViews.cjs.js");require("../../api/queries/views/updateViews.cjs.js");require("../../api/queries/watchers/getWatchers.cjs.js");require("../../api/queries/uris/getUris.cjs.js");const v=require("./hooks/useKeyboardNavigation.cjs.js"),A=require("./SearchingLoadingItems.cjs.js");require("../../context/RemoteModulesContext.cjs.js");require("../../context/DetailsPanelContext.cjs.js");require("../../context/SubtasksModulesContext.cjs.js");require("../../context/ThumbnailUploaderContext.cjs.js");require("../../context/SettingsPanelContext.cjs.js");require("../../context/pip/PiPProvider.cjs.js");require("react-dom");require("../../context/pip/PiPWrapper.cjs.js");require("../../context/AddonProjectContext.cjs.js");require("../../context/AddonContext.cjs.js");require("../../context/PowerpackContext.cjs.js");require("../../context/MoveEntityContext.cjs.js");require("../../context/MenuContext.cjs.js");require("../../context/WebsocketContext.cjs.js");require("../../context/GlobalContext.cjs.js");const w=require("../../context/ProjectContext.cjs.js");require("../../context/ProjectFoldersContext.cjs.js");require("../../context/UriContext.cjs.js");const B=require("../EntityIcon/EntityIcon.cjs.js"),F=({projectName:E,targetEntityType:o,onClose:g,onSearchTypeChange:f,onAdd:k})=>{const[s,p]=n.useState(""),c=n.useRef(null),a=w.useProjectContext();a?.folderTypes,a?.taskTypes,a?.productTypes;const{data:t,error:l,isLoading:j,hasNextPage:h,isFetchingNextPage:m,fetchNextPage:S}=y.useGetSearchedEntitiesLinksInfiniteQuery({projectName:E,entityType:o,search:s},{skip:!s}),d=n.useMemo(()=>t?.pages.flatMap(r=>r.entities)||[],[t]),R=r=>{k?.(r.id),p("")},I=()=>{g?.()},{containerRef:C,getItemProps:b}=v({entities:d,onSelect:R,onClose:I,isActive:!!(s&&d.length>0),hasNextPage:h,isFetchingNextPage:m,fetchNextPage:S});return n.useEffect(()=>{const r=setTimeout(()=>{c.current&&c.current.focus()},0);return()=>clearTimeout(r)},[t,s]),e.jsxRuntimeExports.jsxs(i.AddLinksContainer,{children:[e.jsxRuntimeExports.jsx(i.SubHeader,{children:"Add new link"}),e.jsxRuntimeExports.jsxs(i.SearchButtons,{children:[e.jsxRuntimeExports.jsxs(i.Search,{children:[e.jsxRuntimeExports.jsx(L.Icon,{icon:"search",className:"input-search"}),e.jsxRuntimeExports.jsx(i.SearchInput,{ref:c,value:s,onChange:r=>p(r.target.value),placeholder:`Search ${o}s...`,id:`search-${o}`,autoFocus:!0,autoComplete:"off"})]}),!s&&e.jsxRuntimeExports.jsx(i.PickerButton,{label:`Pick ${o}s`,icon:"table_rows",onClick:()=>f("picker")})]}),s&&t&&e.jsxRuntimeExports.jsxs(i.SearchItems,{ref:C,children:[t?.pages.map((r,N)=>r.entities.map((u,P)=>{const T=t.pages.slice(0,N).reduce((x,q)=>x+q.entities.length,0)+P;return e.jsxRuntimeExports.jsxs(i.SearchItem,{onClick:()=>R(u),tabIndex:0,...b(T),children:[e.jsxRuntimeExports.jsx(B.EntityIcon,{entity:u}),e.jsxRuntimeExports.jsxs("span",{className:"label",children:[u.parents?.map((x,q)=>e.jsxRuntimeExports.jsxs(n.Fragment,{children:[e.jsxRuntimeExports.jsx("span",{children:x},q+"-path"),e.jsxRuntimeExports.jsx("span",{children:"/"},q+"-separator")]},q)),e.jsxRuntimeExports.jsx("strong",{children:u.label||u.name})]}),e.jsxRuntimeExports.jsx("span",{className:"type",children:u.subType||u.entityType})]},u.id)})),(j||m||h)&&e.jsxRuntimeExports.jsx(A,{})]}),!j&&l&&e.jsxRuntimeExports.jsx(i.Error,{children:l.message})]})};module.exports=F;
|
|
2
2
|
//# sourceMappingURL=AddNewLinks.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AddNewLinks.cjs.js","sources":["../../../../../src/components/LinksManager/AddNewLinks.tsx"],"sourcesContent":["import { FC, useState, useMemo, useRef, useEffect, Fragment } from 'react'\nimport * as Styled from './LinksManager.styled'\nimport { Icon } from '@ynput/ayon-react-components'\nimport { useGetSearchedEntitiesLinksInfiniteQuery } from '@shared/api'\nimport useKeyboardNavigation from './hooks/useKeyboardNavigation'\nimport SearchingLoadingItems from './SearchingLoadingItems'\nimport { useProjectContext } from '@shared/context'\nimport { EntityIcon } from '@shared/components/EntityIcon/EntityIcon'\n\nexport type LinkSearchType = 'search' | 'picker' | null\n\ninterface AddNewLinksProps {\n targetEntityType: string\n projectName: string\n onClose?: () => void\n onSearchTypeChange: (type: LinkSearchType) => void // used to handle search type changes\n onAdd?: (targetEntityId: string, linkType?: string) => void\n}\n\nconst AddNewLinks: FC<AddNewLinksProps> = ({\n projectName,\n targetEntityType,\n onClose,\n onSearchTypeChange,\n onAdd,\n}) => {\n const [search, setSearch] = useState('')\n const searchInputRef = useRef<HTMLInputElement>(null)\n const project = useProjectContext()\n\n const anatomyForIcons = {\n folderTypes: project?.folderTypes || [],\n taskTypes: project?.taskTypes || [],\n productTypes: project?.productTypes || [],\n }\n\n const {\n data: searchData,\n error,\n isLoading,\n hasNextPage,\n isFetchingNextPage,\n fetchNextPage,\n } = useGetSearchedEntitiesLinksInfiniteQuery(\n {\n projectName,\n entityType: targetEntityType,\n search,\n },\n { skip: !search },\n )\n\n // Flatten all entities from all pages\n const entities = useMemo(() => {\n return searchData?.pages.flatMap((page) => page.entities) || []\n }, [searchData])\n\n const handleSelectEntity = (entity: any) => {\n
|
|
1
|
+
{"version":3,"file":"AddNewLinks.cjs.js","sources":["../../../../../src/components/LinksManager/AddNewLinks.tsx"],"sourcesContent":["import { FC, useState, useMemo, useRef, useEffect, Fragment } from 'react'\nimport * as Styled from './LinksManager.styled'\nimport { Icon } from '@ynput/ayon-react-components'\nimport { useGetSearchedEntitiesLinksInfiniteQuery } from '@shared/api'\nimport useKeyboardNavigation from './hooks/useKeyboardNavigation'\nimport SearchingLoadingItems from './SearchingLoadingItems'\nimport { useProjectContext } from '@shared/context'\nimport { EntityIcon } from '@shared/components/EntityIcon/EntityIcon'\n\nexport type LinkSearchType = 'search' | 'picker' | null\n\ninterface AddNewLinksProps {\n targetEntityType: string\n projectName: string\n onClose?: () => void\n onSearchTypeChange: (type: LinkSearchType) => void // used to handle search type changes\n onAdd?: (targetEntityId: string, linkType?: string) => void\n}\n\nconst AddNewLinks: FC<AddNewLinksProps> = ({\n projectName,\n targetEntityType,\n onClose,\n onSearchTypeChange,\n onAdd,\n}) => {\n const [search, setSearch] = useState('')\n const searchInputRef = useRef<HTMLInputElement>(null)\n const project = useProjectContext()\n\n const anatomyForIcons = {\n folderTypes: project?.folderTypes || [],\n taskTypes: project?.taskTypes || [],\n productTypes: project?.productTypes || [],\n }\n\n const {\n data: searchData,\n error,\n isLoading,\n hasNextPage,\n isFetchingNextPage,\n fetchNextPage,\n } = useGetSearchedEntitiesLinksInfiniteQuery(\n {\n projectName,\n entityType: targetEntityType,\n search,\n },\n { skip: !search },\n )\n\n // Flatten all entities from all pages\n const entities = useMemo(() => {\n return searchData?.pages.flatMap((page) => page.entities) || []\n }, [searchData])\n\n const handleSelectEntity = (entity: any) => {\n onAdd?.(entity.id)\n // Clear search after adding\n setSearch('')\n }\n\n const handleClose = () => {\n onClose?.()\n }\n\n const { containerRef, getItemProps } = useKeyboardNavigation({\n entities,\n onSelect: handleSelectEntity,\n onClose: handleClose,\n isActive: Boolean(search && entities.length > 0),\n hasNextPage,\n isFetchingNextPage,\n fetchNextPage,\n })\n\n // Force focus the search input on mount and when searchData or search changes\n useEffect(() => {\n // Use setTimeout to ensure focus after render\n const timeout = setTimeout(() => {\n if (searchInputRef.current) {\n searchInputRef.current.focus()\n }\n }, 0)\n return () => clearTimeout(timeout)\n }, [searchData, search])\n\n return (\n <Styled.AddLinksContainer>\n <Styled.SubHeader>Add new link</Styled.SubHeader>\n <Styled.SearchButtons>\n <Styled.Search>\n <Icon icon={'search'} className=\"input-search\" />\n <Styled.SearchInput\n ref={searchInputRef}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={`Search ${targetEntityType}s...`}\n id={`search-${targetEntityType}`}\n autoFocus\n autoComplete=\"off\"\n />\n </Styled.Search>\n\n {!search && (\n <Styled.PickerButton\n label={`Pick ${targetEntityType}s`}\n icon=\"table_rows\"\n onClick={() => onSearchTypeChange('picker')}\n />\n )}\n </Styled.SearchButtons>\n\n {search && searchData && (\n <Styled.SearchItems ref={containerRef}>\n {searchData?.pages.map((page, pageIndex) =>\n page.entities.map((entity, entityIndex) => {\n const flatIndex =\n searchData.pages\n .slice(0, pageIndex)\n .reduce((acc, p) => acc + p.entities.length, 0) + entityIndex\n return (\n <Styled.SearchItem\n key={entity.id}\n onClick={() => handleSelectEntity(entity)}\n tabIndex={0}\n {...getItemProps(flatIndex)}\n >\n <EntityIcon\n entity={entity}\n />\n <span className=\"label\">\n {entity.parents?.map((part, index) => (\n <Fragment key={index}>\n <span key={index + '-path'}>{part}</span>\n <span key={index + '-separator'}>/</span>\n </Fragment>\n ))}\n <strong>{entity.label || entity.name}</strong>\n </span>\n <span className=\"type\">{entity.subType || entity.entityType}</span>\n </Styled.SearchItem>\n )\n }),\n )}\n {(isLoading || isFetchingNextPage || hasNextPage) && <SearchingLoadingItems />}\n </Styled.SearchItems>\n )}\n {!isLoading && error && <Styled.Error>{error.message}</Styled.Error>}\n </Styled.AddLinksContainer>\n )\n}\n\nexport default AddNewLinks\n"],"names":["AddNewLinks","projectName","targetEntityType","onClose","onSearchTypeChange","onAdd","search","setSearch","useState","searchInputRef","useRef","project","useProjectContext","searchData","error","isLoading","hasNextPage","isFetchingNextPage","fetchNextPage","useGetSearchedEntitiesLinksInfiniteQuery","entities","useMemo","page","handleSelectEntity","entity","handleClose","containerRef","getItemProps","useKeyboardNavigation","useEffect","timeout","jsxs","Styled.AddLinksContainer","jsx","Styled.SubHeader","Styled.SearchButtons","Styled.Search","Icon","Styled.SearchInput","e","Styled.PickerButton","Styled.SearchItems","pageIndex","entityIndex","flatIndex","acc","p","Styled.SearchItem","EntityIcon","part","index","Fragment","SearchingLoadingItems","Styled.Error"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { j as r } from "../../../../_virtual/jsx-runtime.es.js";
|
|
2
|
-
import { useState as
|
|
3
|
-
import { AddLinksContainer as B, SubHeader as E, SearchButtons as F, Search as
|
|
2
|
+
import { useState as v, useRef as A, useMemo as R, useEffect as w, Fragment as y } from "react";
|
|
3
|
+
import { AddLinksContainer as B, SubHeader as E, SearchButtons as F, Search as $, SearchInput as M, PickerButton as D, SearchItems as G, SearchItem as H, Error as K } from "./LinksManager.styled.es.js";
|
|
4
4
|
import { Icon as Q } from "@ynput/ayon-react-components";
|
|
5
5
|
import "../../api/base/client.es.js";
|
|
6
6
|
import "../../api/generated/graphql.es.js";
|
|
@@ -119,13 +119,13 @@ const ro = ({
|
|
|
119
119
|
onSearchTypeChange: S,
|
|
120
120
|
onAdd: k
|
|
121
121
|
}) => {
|
|
122
|
-
const [i, c] =
|
|
122
|
+
const [i, c] = v(""), s = A(null), a = J();
|
|
123
123
|
a?.folderTypes, a?.taskTypes, a?.productTypes;
|
|
124
124
|
const {
|
|
125
125
|
data: p,
|
|
126
126
|
error: l,
|
|
127
|
-
isLoading:
|
|
128
|
-
hasNextPage:
|
|
127
|
+
isLoading: h,
|
|
128
|
+
hasNextPage: d,
|
|
129
129
|
isFetchingNextPage: u,
|
|
130
130
|
fetchNextPage: I
|
|
131
131
|
} = _(
|
|
@@ -136,7 +136,7 @@ const ro = ({
|
|
|
136
136
|
},
|
|
137
137
|
{ skip: !i }
|
|
138
138
|
), f = R(() => p?.pages.flatMap((t) => t.entities) || [], [p]), x = (t) => {
|
|
139
|
-
|
|
139
|
+
k?.(t.id), c("");
|
|
140
140
|
}, b = () => {
|
|
141
141
|
g?.();
|
|
142
142
|
}, { containerRef: C, getItemProps: N } = q({
|
|
@@ -144,11 +144,11 @@ const ro = ({
|
|
|
144
144
|
onSelect: x,
|
|
145
145
|
onClose: b,
|
|
146
146
|
isActive: !!(i && f.length > 0),
|
|
147
|
-
hasNextPage:
|
|
147
|
+
hasNextPage: d,
|
|
148
148
|
isFetchingNextPage: u,
|
|
149
149
|
fetchNextPage: I
|
|
150
150
|
});
|
|
151
|
-
return
|
|
151
|
+
return w(() => {
|
|
152
152
|
const t = setTimeout(() => {
|
|
153
153
|
s.current && s.current.focus();
|
|
154
154
|
}, 0);
|
|
@@ -156,7 +156,7 @@ const ro = ({
|
|
|
156
156
|
}, [p, i]), /* @__PURE__ */ r.jsxs(B, { children: [
|
|
157
157
|
/* @__PURE__ */ r.jsx(E, { children: "Add new link" }),
|
|
158
158
|
/* @__PURE__ */ r.jsxs(F, { children: [
|
|
159
|
-
/* @__PURE__ */ r.jsxs(
|
|
159
|
+
/* @__PURE__ */ r.jsxs($, { children: [
|
|
160
160
|
/* @__PURE__ */ r.jsx(Q, { icon: "search", className: "input-search" }),
|
|
161
161
|
/* @__PURE__ */ r.jsx(
|
|
162
162
|
M,
|
|
@@ -183,13 +183,13 @@ const ro = ({
|
|
|
183
183
|
i && p && /* @__PURE__ */ r.jsxs(G, { ref: C, children: [
|
|
184
184
|
p?.pages.map(
|
|
185
185
|
(t, T) => t.entities.map((o, P) => {
|
|
186
|
-
const
|
|
186
|
+
const L = p.pages.slice(0, T).reduce((n, m) => n + m.entities.length, 0) + P;
|
|
187
187
|
return /* @__PURE__ */ r.jsxs(
|
|
188
188
|
H,
|
|
189
189
|
{
|
|
190
190
|
onClick: () => x(o),
|
|
191
191
|
tabIndex: 0,
|
|
192
|
-
...N(
|
|
192
|
+
...N(L),
|
|
193
193
|
children: [
|
|
194
194
|
/* @__PURE__ */ r.jsx(
|
|
195
195
|
O,
|
|
@@ -198,7 +198,7 @@ const ro = ({
|
|
|
198
198
|
}
|
|
199
199
|
),
|
|
200
200
|
/* @__PURE__ */ r.jsxs("span", { className: "label", children: [
|
|
201
|
-
o.parents?.map((n, m) => /* @__PURE__ */ r.jsxs(
|
|
201
|
+
o.parents?.map((n, m) => /* @__PURE__ */ r.jsxs(y, { children: [
|
|
202
202
|
/* @__PURE__ */ r.jsx("span", { children: n }, m + "-path"),
|
|
203
203
|
/* @__PURE__ */ r.jsx("span", { children: "/" }, m + "-separator")
|
|
204
204
|
] }, m)),
|
|
@@ -211,9 +211,9 @@ const ro = ({
|
|
|
211
211
|
);
|
|
212
212
|
})
|
|
213
213
|
),
|
|
214
|
-
(
|
|
214
|
+
(h || u || d) && /* @__PURE__ */ r.jsx(z, {})
|
|
215
215
|
] }),
|
|
216
|
-
!
|
|
216
|
+
!h && l && /* @__PURE__ */ r.jsx(K, { children: l.message })
|
|
217
217
|
] });
|
|
218
218
|
};
|
|
219
219
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AddNewLinks.es.js","sources":["../../../../../src/components/LinksManager/AddNewLinks.tsx"],"sourcesContent":["import { FC, useState, useMemo, useRef, useEffect, Fragment } from 'react'\nimport * as Styled from './LinksManager.styled'\nimport { Icon } from '@ynput/ayon-react-components'\nimport { useGetSearchedEntitiesLinksInfiniteQuery } from '@shared/api'\nimport useKeyboardNavigation from './hooks/useKeyboardNavigation'\nimport SearchingLoadingItems from './SearchingLoadingItems'\nimport { useProjectContext } from '@shared/context'\nimport { EntityIcon } from '@shared/components/EntityIcon/EntityIcon'\n\nexport type LinkSearchType = 'search' | 'picker' | null\n\ninterface AddNewLinksProps {\n targetEntityType: string\n projectName: string\n onClose?: () => void\n onSearchTypeChange: (type: LinkSearchType) => void // used to handle search type changes\n onAdd?: (targetEntityId: string, linkType?: string) => void\n}\n\nconst AddNewLinks: FC<AddNewLinksProps> = ({\n projectName,\n targetEntityType,\n onClose,\n onSearchTypeChange,\n onAdd,\n}) => {\n const [search, setSearch] = useState('')\n const searchInputRef = useRef<HTMLInputElement>(null)\n const project = useProjectContext()\n\n const anatomyForIcons = {\n folderTypes: project?.folderTypes || [],\n taskTypes: project?.taskTypes || [],\n productTypes: project?.productTypes || [],\n }\n\n const {\n data: searchData,\n error,\n isLoading,\n hasNextPage,\n isFetchingNextPage,\n fetchNextPage,\n } = useGetSearchedEntitiesLinksInfiniteQuery(\n {\n projectName,\n entityType: targetEntityType,\n search,\n },\n { skip: !search },\n )\n\n // Flatten all entities from all pages\n const entities = useMemo(() => {\n return searchData?.pages.flatMap((page) => page.entities) || []\n }, [searchData])\n\n const handleSelectEntity = (entity: any) => {\n
|
|
1
|
+
{"version":3,"file":"AddNewLinks.es.js","sources":["../../../../../src/components/LinksManager/AddNewLinks.tsx"],"sourcesContent":["import { FC, useState, useMemo, useRef, useEffect, Fragment } from 'react'\nimport * as Styled from './LinksManager.styled'\nimport { Icon } from '@ynput/ayon-react-components'\nimport { useGetSearchedEntitiesLinksInfiniteQuery } from '@shared/api'\nimport useKeyboardNavigation from './hooks/useKeyboardNavigation'\nimport SearchingLoadingItems from './SearchingLoadingItems'\nimport { useProjectContext } from '@shared/context'\nimport { EntityIcon } from '@shared/components/EntityIcon/EntityIcon'\n\nexport type LinkSearchType = 'search' | 'picker' | null\n\ninterface AddNewLinksProps {\n targetEntityType: string\n projectName: string\n onClose?: () => void\n onSearchTypeChange: (type: LinkSearchType) => void // used to handle search type changes\n onAdd?: (targetEntityId: string, linkType?: string) => void\n}\n\nconst AddNewLinks: FC<AddNewLinksProps> = ({\n projectName,\n targetEntityType,\n onClose,\n onSearchTypeChange,\n onAdd,\n}) => {\n const [search, setSearch] = useState('')\n const searchInputRef = useRef<HTMLInputElement>(null)\n const project = useProjectContext()\n\n const anatomyForIcons = {\n folderTypes: project?.folderTypes || [],\n taskTypes: project?.taskTypes || [],\n productTypes: project?.productTypes || [],\n }\n\n const {\n data: searchData,\n error,\n isLoading,\n hasNextPage,\n isFetchingNextPage,\n fetchNextPage,\n } = useGetSearchedEntitiesLinksInfiniteQuery(\n {\n projectName,\n entityType: targetEntityType,\n search,\n },\n { skip: !search },\n )\n\n // Flatten all entities from all pages\n const entities = useMemo(() => {\n return searchData?.pages.flatMap((page) => page.entities) || []\n }, [searchData])\n\n const handleSelectEntity = (entity: any) => {\n onAdd?.(entity.id)\n // Clear search after adding\n setSearch('')\n }\n\n const handleClose = () => {\n onClose?.()\n }\n\n const { containerRef, getItemProps } = useKeyboardNavigation({\n entities,\n onSelect: handleSelectEntity,\n onClose: handleClose,\n isActive: Boolean(search && entities.length > 0),\n hasNextPage,\n isFetchingNextPage,\n fetchNextPage,\n })\n\n // Force focus the search input on mount and when searchData or search changes\n useEffect(() => {\n // Use setTimeout to ensure focus after render\n const timeout = setTimeout(() => {\n if (searchInputRef.current) {\n searchInputRef.current.focus()\n }\n }, 0)\n return () => clearTimeout(timeout)\n }, [searchData, search])\n\n return (\n <Styled.AddLinksContainer>\n <Styled.SubHeader>Add new link</Styled.SubHeader>\n <Styled.SearchButtons>\n <Styled.Search>\n <Icon icon={'search'} className=\"input-search\" />\n <Styled.SearchInput\n ref={searchInputRef}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={`Search ${targetEntityType}s...`}\n id={`search-${targetEntityType}`}\n autoFocus\n autoComplete=\"off\"\n />\n </Styled.Search>\n\n {!search && (\n <Styled.PickerButton\n label={`Pick ${targetEntityType}s`}\n icon=\"table_rows\"\n onClick={() => onSearchTypeChange('picker')}\n />\n )}\n </Styled.SearchButtons>\n\n {search && searchData && (\n <Styled.SearchItems ref={containerRef}>\n {searchData?.pages.map((page, pageIndex) =>\n page.entities.map((entity, entityIndex) => {\n const flatIndex =\n searchData.pages\n .slice(0, pageIndex)\n .reduce((acc, p) => acc + p.entities.length, 0) + entityIndex\n return (\n <Styled.SearchItem\n key={entity.id}\n onClick={() => handleSelectEntity(entity)}\n tabIndex={0}\n {...getItemProps(flatIndex)}\n >\n <EntityIcon\n entity={entity}\n />\n <span className=\"label\">\n {entity.parents?.map((part, index) => (\n <Fragment key={index}>\n <span key={index + '-path'}>{part}</span>\n <span key={index + '-separator'}>/</span>\n </Fragment>\n ))}\n <strong>{entity.label || entity.name}</strong>\n </span>\n <span className=\"type\">{entity.subType || entity.entityType}</span>\n </Styled.SearchItem>\n )\n }),\n )}\n {(isLoading || isFetchingNextPage || hasNextPage) && <SearchingLoadingItems />}\n </Styled.SearchItems>\n )}\n {!isLoading && error && <Styled.Error>{error.message}</Styled.Error>}\n </Styled.AddLinksContainer>\n )\n}\n\nexport default AddNewLinks\n"],"names":["AddNewLinks","projectName","targetEntityType","onClose","onSearchTypeChange","onAdd","search","setSearch","useState","searchInputRef","useRef","project","useProjectContext","searchData","error","isLoading","hasNextPage","isFetchingNextPage","fetchNextPage","useGetSearchedEntitiesLinksInfiniteQuery","entities","useMemo","page","handleSelectEntity","entity","handleClose","containerRef","getItemProps","useKeyboardNavigation","useEffect","timeout","jsxs","Styled.AddLinksContainer","jsx","Styled.SubHeader","Styled.SearchButtons","Styled.Search","Icon","Styled.SearchInput","e","Styled.PickerButton","Styled.SearchItems","pageIndex","entityIndex","flatIndex","acc","p","Styled.SearchItem","EntityIcon","part","index","Fragment","SearchingLoadingItems","Styled.Error"],"mappings":"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"}
|
|
@@ -4,5 +4,5 @@
|
|
|
4
4
|
overflow: hidden;
|
|
5
5
|
display: flex;
|
|
6
6
|
flex-direction: column;
|
|
7
|
-
`,I=({isEditing:d,anchorId:
|
|
7
|
+
`,I=({isEditing:d,anchorId:T,containerClassName:A="table-container",onClose:u,children:H})=>{const h=i.useRef(null),[c,v]=i.useState(null),[w,x]=i.useState(void 0),[b,y]=i.useState(void 0),o=document.getElementById(T),r=o?.closest(`.${A}`),E=()=>{if(!d)return;if(!o||!r){v({top:window.innerHeight/2,left:window.innerWidth/2,showAbove:!1}),x(void 0),y(void 0);return}const e=o.getBoundingClientRect(),n=r.getBoundingClientRect(),t=n.right,W=window.innerWidth-n.right,s=24,k=250,a=400,P=600,L=window.innerWidth,D=window.innerHeight,R=t-e.left;let l={},g=a;R<a?e.right-s>=a?l.right=Math.max(L-e.right,s+W):(l.left=s,g=L-2*s):(l.left=e.left,g=Math.max(a,R)),x(g);const f=D-e.bottom-s,S=e.top-s;let p,O=!1,m;f<k&&S>f?(O=!0,p=e.top-4,m=S-4):(p=e.bottom+4,m=f-4),y(Math.min(Math.max(200,m),P)),v({top:p,...l,showAbove:O})};i.useLayoutEffect(()=>{E()},[d,o]),i.useLayoutEffect(()=>{if(r){const e=new ResizeObserver(()=>{E()});return e.observe(r),()=>e.disconnect()}},[r,o]),i.useLayoutEffect(()=>{const e=n=>{const t=n.target;h.current&&!h.current.contains(t)&&o&&!o.contains(t)&&!t.closest(".entity-picker-dialog")&&!t.querySelector(".entity-picker-dialog")&&!t.closest("dialog")&&!t.closest(".dropdown")&&!t.closest(".p-dialog-mask")&&!t.closest(".p-datepicker")&&!t.closest("."+C)&&(document.activeElement instanceof HTMLElement&&document.activeElement.blur(),u?.())};return document.addEventListener("mousedown",e),()=>{document.removeEventListener("mousedown",e)}},[u,o]);const M=e=>{const n=e.target;n.tagName==="INPUT"||n.tagName==="TEXTAREA"||n.isContentEditable||e.key==="Escape"&&(e.stopPropagation(),u?.())};return d?q.createPortal(B.jsxRuntimeExports.jsx(j,{ref:h,style:{top:c?.top,left:c?.left,right:c?.right,...c?.showAbove&&{transform:"translateY(-100%)"},visibility:c?"visible":"hidden",maxWidth:w?`${w}px`:"none",maxHeight:b?`${b}px`:"none"},className:"links-widget-popup",onKeyDown:M,children:H}),document.body):null};exports.BLOCK_DIALOG_CLOSE_CLASS=C;exports.CellEditingDialog=I;
|
|
8
8
|
//# sourceMappingURL=CellEditingDialog.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CellEditingDialog.cjs.js","sources":["../../../../../src/components/LinksManager/CellEditingDialog.tsx"],"sourcesContent":["import { FC, useRef, useLayoutEffect, useState } from 'react'\nimport styled from 'styled-components'\nimport { createPortal } from 'react-dom'\n\nexport const BLOCK_DIALOG_CLOSE_CLASS = 'block-dialog-close'\n\nconst StyledPopUp = styled.div`\n position: fixed;\n z-index: 310;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n`\n\ntype Position = {\n top: number\n left?: number\n right?: number\n showAbove?: boolean\n}\n\nexport interface LinksManagerDialogProps {\n isEditing: boolean\n anchorId: string\n containerClassName?: string\n onClose?: () => void\n children?: React.ReactNode\n}\n\nexport const CellEditingDialog: FC<LinksManagerDialogProps> = ({\n isEditing,\n anchorId,\n containerClassName = 'table-container',\n onClose,\n children,\n}) => {\n const popupRef = useRef<HTMLDivElement>(null)\n\n const [position, setPosition] = useState<Position | null>(null)\n const [maxWidth, setMaxWidth] = useState<number | undefined>(undefined)\n const [maxHeight, setMaxHeight] = useState<number | undefined>(undefined)\n\n // get the cell element based on the cellId\n const anchorElement = document.getElementById(anchorId)\n const tableContainer = anchorElement?.closest(`.${containerClassName}`)\n\n const updatePosition = () => {\n if (!isEditing) return\n\n if (!anchorElement || !tableContainer) {\n // if the anchor element is not found, position in the center of the screen\n setPosition({\n top: window.innerHeight / 2,\n left: window.innerWidth / 2,\n showAbove: false,\n })\n setMaxWidth(undefined)\n setMaxHeight(undefined)\n return\n }\n\n const cellRect = anchorElement.getBoundingClientRect()\n\n const containerRect = tableContainer.getBoundingClientRect()\n const containerRight = containerRect.right\n const containerToRightOfScreen = window.innerWidth - containerRect.right\n\n const screenPadding = 24\n const minHeightThreshold = 250\n const minWidthThreshold = 400\n const maxMaxHeight = 600\n const screenWidth = window.innerWidth\n const screenHeight = window.innerHeight\n\n // Check if we have enough space to the right of the cell\n const spaceToRight = containerRight - cellRect.left\n let position: { left?: number; right?: number } = {}\n let dialogWidth = minWidthThreshold\n\n if (spaceToRight < minWidthThreshold) {\n // Not enough space to the right, anchor to the right side of the cell\n const spaceToLeft = cellRect.right - screenPadding\n if (spaceToLeft >= minWidthThreshold) {\n // Anchor to the right side of the cell\n position.right = Math.max(\n screenWidth - cellRect.right,\n screenPadding + containerToRightOfScreen,\n )\n } else {\n // Not enough space on either side, center and use available width\n position.left = screenPadding\n dialogWidth = screenWidth - 2 * screenPadding\n }\n } else {\n // Enough space to the right, position normally\n position.left = cellRect.left\n dialogWidth = Math.max(minWidthThreshold, spaceToRight)\n }\n\n setMaxWidth(dialogWidth)\n\n const spaceBelow = screenHeight - cellRect.bottom - screenPadding\n const spaceAbove = cellRect.top - screenPadding\n let top: number\n let showAbove = false\n let availableHeight: number\n\n if (spaceBelow < minHeightThreshold && spaceAbove > spaceBelow) {\n showAbove = true\n top = cellRect.top - 4\n availableHeight = spaceAbove - 4\n } else {\n top = cellRect.bottom + 4\n availableHeight = spaceBelow - 4\n }\n\n // Set max height to prevent dialog from going off screen\n setMaxHeight(Math.min(Math.max(200, availableHeight), maxMaxHeight)) // Minimum 200px height\n\n setPosition({\n top,\n ...position,\n showAbove,\n })\n }\n\n useLayoutEffect(() => {\n updatePosition()\n }, [isEditing, anchorElement])\n\n // watch for when the tableContainer width changes\n useLayoutEffect(() => {\n if (tableContainer) {\n const resizeObserver = new ResizeObserver(() => {\n updatePosition()\n })\n resizeObserver.observe(tableContainer)\n return () => resizeObserver.disconnect()\n }\n }, [tableContainer, anchorElement])\n\n // close the dialog when clicking outside of it\n useLayoutEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as HTMLElement\n\n if (\n popupRef.current &&\n !popupRef.current.contains(target) &&\n anchorElement &&\n !anchorElement.contains(target) &&\n // check we are not clicking inside the EntityPickerDialog\n !target.closest('.entity-picker-dialog') &&\n // check we are not clicking on the dialog backdrop\n !target.querySelector('.entity-picker-dialog') &&\n // check we are not clicking inside another dialog\n !target.closest('dialog') &&\n // check we are not clicking inside a dropdown\n !target.closest('.dropdown') &&\n !target.closest('.p-dialog-mask') &&\n !target.closest('.p-datepicker') &&\n !target.closest('.' + BLOCK_DIALOG_CLOSE_CLASS)\n ) {\n onClose?.()\n }\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [onClose, anchorElement])\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n // check we are not inside an input or textarea\n const target = e.target as HTMLElement\n if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable) {\n return\n }\n\n // close dialog on escape\n if (e.key === 'Escape') {\n e.stopPropagation()\n onClose?.()\n }\n }\n\n if (!isEditing) return null\n return createPortal(\n <StyledPopUp\n ref={popupRef}\n style={{\n top: position?.top,\n left: position?.left,\n right: position?.right,\n ...(position?.showAbove && { transform: 'translateY(-100%)' }),\n visibility: position ? 'visible' : 'hidden',\n maxWidth: maxWidth ? `${maxWidth}px` : 'none',\n maxHeight: maxHeight ? `${maxHeight}px` : 'none',\n }}\n className=\"links-widget-popup\"\n onKeyDown={handleKeyDown}\n >\n {children}\n </StyledPopUp>,\n document.body,\n )\n}\n"],"names":["BLOCK_DIALOG_CLOSE_CLASS","StyledPopUp","styled","CellEditingDialog","isEditing","anchorId","containerClassName","onClose","children","popupRef","useRef","position","setPosition","useState","maxWidth","setMaxWidth","maxHeight","setMaxHeight","anchorElement","tableContainer","updatePosition","cellRect","containerRect","containerRight","containerToRightOfScreen","screenPadding","minHeightThreshold","minWidthThreshold","maxMaxHeight","screenWidth","screenHeight","spaceToRight","dialogWidth","spaceBelow","spaceAbove","top","showAbove","availableHeight","useLayoutEffect","resizeObserver","handleClickOutside","event","target","handleKeyDown","createPortal","jsx"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CellEditingDialog.cjs.js","sources":["../../../../../src/components/LinksManager/CellEditingDialog.tsx"],"sourcesContent":["import { FC, useRef, useLayoutEffect, useState } from 'react'\nimport styled from 'styled-components'\nimport { createPortal } from 'react-dom'\n\nexport const BLOCK_DIALOG_CLOSE_CLASS = 'block-dialog-close'\n\nconst StyledPopUp = styled.div`\n position: fixed;\n z-index: 310;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n`\n\ntype Position = {\n top: number\n left?: number\n right?: number\n showAbove?: boolean\n}\n\nexport interface LinksManagerDialogProps {\n isEditing: boolean\n anchorId: string\n containerClassName?: string\n onClose?: () => void\n children?: React.ReactNode\n}\n\nexport const CellEditingDialog: FC<LinksManagerDialogProps> = ({\n isEditing,\n anchorId,\n containerClassName = 'table-container',\n onClose,\n children,\n}) => {\n const popupRef = useRef<HTMLDivElement>(null)\n\n const [position, setPosition] = useState<Position | null>(null)\n const [maxWidth, setMaxWidth] = useState<number | undefined>(undefined)\n const [maxHeight, setMaxHeight] = useState<number | undefined>(undefined)\n\n // get the cell element based on the cellId\n const anchorElement = document.getElementById(anchorId)\n const tableContainer = anchorElement?.closest(`.${containerClassName}`)\n\n const updatePosition = () => {\n if (!isEditing) return\n\n if (!anchorElement || !tableContainer) {\n // if the anchor element is not found, position in the center of the screen\n setPosition({\n top: window.innerHeight / 2,\n left: window.innerWidth / 2,\n showAbove: false,\n })\n setMaxWidth(undefined)\n setMaxHeight(undefined)\n return\n }\n\n const cellRect = anchorElement.getBoundingClientRect()\n\n const containerRect = tableContainer.getBoundingClientRect()\n const containerRight = containerRect.right\n const containerToRightOfScreen = window.innerWidth - containerRect.right\n\n const screenPadding = 24\n const minHeightThreshold = 250\n const minWidthThreshold = 400\n const maxMaxHeight = 600\n const screenWidth = window.innerWidth\n const screenHeight = window.innerHeight\n\n // Check if we have enough space to the right of the cell\n const spaceToRight = containerRight - cellRect.left\n let position: { left?: number; right?: number } = {}\n let dialogWidth = minWidthThreshold\n\n if (spaceToRight < minWidthThreshold) {\n // Not enough space to the right, anchor to the right side of the cell\n const spaceToLeft = cellRect.right - screenPadding\n if (spaceToLeft >= minWidthThreshold) {\n // Anchor to the right side of the cell\n position.right = Math.max(\n screenWidth - cellRect.right,\n screenPadding + containerToRightOfScreen,\n )\n } else {\n // Not enough space on either side, center and use available width\n position.left = screenPadding\n dialogWidth = screenWidth - 2 * screenPadding\n }\n } else {\n // Enough space to the right, position normally\n position.left = cellRect.left\n dialogWidth = Math.max(minWidthThreshold, spaceToRight)\n }\n\n setMaxWidth(dialogWidth)\n\n const spaceBelow = screenHeight - cellRect.bottom - screenPadding\n const spaceAbove = cellRect.top - screenPadding\n let top: number\n let showAbove = false\n let availableHeight: number\n\n if (spaceBelow < minHeightThreshold && spaceAbove > spaceBelow) {\n showAbove = true\n top = cellRect.top - 4\n availableHeight = spaceAbove - 4\n } else {\n top = cellRect.bottom + 4\n availableHeight = spaceBelow - 4\n }\n\n // Set max height to prevent dialog from going off screen\n setMaxHeight(Math.min(Math.max(200, availableHeight), maxMaxHeight)) // Minimum 200px height\n\n setPosition({\n top,\n ...position,\n showAbove,\n })\n }\n\n useLayoutEffect(() => {\n updatePosition()\n }, [isEditing, anchorElement])\n\n // watch for when the tableContainer width changes\n useLayoutEffect(() => {\n if (tableContainer) {\n const resizeObserver = new ResizeObserver(() => {\n updatePosition()\n })\n resizeObserver.observe(tableContainer)\n return () => resizeObserver.disconnect()\n }\n }, [tableContainer, anchorElement])\n\n // close the dialog when clicking outside of it\n useLayoutEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as HTMLElement\n\n if (\n popupRef.current &&\n !popupRef.current.contains(target) &&\n anchorElement &&\n !anchorElement.contains(target) &&\n // check we are not clicking inside the EntityPickerDialog\n !target.closest('.entity-picker-dialog') &&\n // check we are not clicking on the dialog backdrop\n !target.querySelector('.entity-picker-dialog') &&\n // check we are not clicking inside another dialog\n !target.closest('dialog') &&\n // check we are not clicking inside a dropdown\n !target.closest('.dropdown') &&\n !target.closest('.p-dialog-mask') &&\n !target.closest('.p-datepicker') &&\n !target.closest('.' + BLOCK_DIALOG_CLOSE_CLASS)\n ) {\n // Blur active element first so inputs can commit their values before unmount\n if (document.activeElement instanceof HTMLElement) {\n document.activeElement.blur()\n }\n onClose?.()\n }\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [onClose, anchorElement])\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n // check we are not inside an input or textarea\n const target = e.target as HTMLElement\n if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable) {\n return\n }\n\n // close dialog on escape\n if (e.key === 'Escape') {\n e.stopPropagation()\n onClose?.()\n }\n }\n\n if (!isEditing) return null\n return createPortal(\n <StyledPopUp\n ref={popupRef}\n style={{\n top: position?.top,\n left: position?.left,\n right: position?.right,\n ...(position?.showAbove && { transform: 'translateY(-100%)' }),\n visibility: position ? 'visible' : 'hidden',\n maxWidth: maxWidth ? `${maxWidth}px` : 'none',\n maxHeight: maxHeight ? `${maxHeight}px` : 'none',\n }}\n className=\"links-widget-popup\"\n onKeyDown={handleKeyDown}\n >\n {children}\n </StyledPopUp>,\n document.body,\n )\n}\n"],"names":["BLOCK_DIALOG_CLOSE_CLASS","StyledPopUp","styled","CellEditingDialog","isEditing","anchorId","containerClassName","onClose","children","popupRef","useRef","position","setPosition","useState","maxWidth","setMaxWidth","maxHeight","setMaxHeight","anchorElement","tableContainer","updatePosition","cellRect","containerRect","containerRight","containerToRightOfScreen","screenPadding","minHeightThreshold","minWidthThreshold","maxMaxHeight","screenWidth","screenHeight","spaceToRight","dialogWidth","spaceBelow","spaceAbove","top","showAbove","availableHeight","useLayoutEffect","resizeObserver","handleClickOutside","event","target","handleKeyDown","createPortal","jsx"],"mappings":"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"}
|
|
@@ -13,55 +13,55 @@ const I = "block-dialog-close", K = j.div`
|
|
|
13
13
|
anchorId: k,
|
|
14
14
|
containerClassName: A = "table-container",
|
|
15
15
|
onClose: d,
|
|
16
|
-
children:
|
|
16
|
+
children: M
|
|
17
17
|
}) => {
|
|
18
|
-
const h = N(null), [s,
|
|
18
|
+
const h = N(null), [s, v] = u(null), [x, b] = u(void 0), [y, E] = u(void 0), o = document.getElementById(k), c = o?.closest(`.${A}`), R = () => {
|
|
19
19
|
if (!l) return;
|
|
20
|
-
if (!o || !
|
|
21
|
-
|
|
20
|
+
if (!o || !c) {
|
|
21
|
+
v({
|
|
22
22
|
top: window.innerHeight / 2,
|
|
23
23
|
left: window.innerWidth / 2,
|
|
24
24
|
showAbove: !1
|
|
25
|
-
}), b(void 0),
|
|
25
|
+
}), b(void 0), E(void 0);
|
|
26
26
|
return;
|
|
27
27
|
}
|
|
28
|
-
const t = o.getBoundingClientRect(), n =
|
|
29
|
-
let a = {},
|
|
30
|
-
L <
|
|
28
|
+
const t = o.getBoundingClientRect(), n = c.getBoundingClientRect(), e = n.right, O = window.innerWidth - n.right, i = 24, P = 250, r = 400, S = 600, H = window.innerWidth, B = window.innerHeight, L = e - t.left;
|
|
29
|
+
let a = {}, m = r;
|
|
30
|
+
L < r ? t.right - i >= r ? a.right = Math.max(
|
|
31
31
|
H - t.right,
|
|
32
32
|
i + O
|
|
33
|
-
) : (a.left = i,
|
|
34
|
-
const
|
|
35
|
-
let
|
|
36
|
-
|
|
37
|
-
top:
|
|
33
|
+
) : (a.left = i, m = H - 2 * i) : (a.left = t.left, m = Math.max(r, L)), b(m);
|
|
34
|
+
const p = B - t.bottom - i, T = t.top - i;
|
|
35
|
+
let g, W = !1, f;
|
|
36
|
+
p < P && T > p ? (W = !0, g = t.top - 4, f = T - 4) : (g = t.bottom + 4, f = p - 4), E(Math.min(Math.max(200, f), S)), v({
|
|
37
|
+
top: g,
|
|
38
38
|
...a,
|
|
39
39
|
showAbove: W
|
|
40
40
|
});
|
|
41
41
|
};
|
|
42
42
|
w(() => {
|
|
43
|
-
|
|
43
|
+
R();
|
|
44
44
|
}, [l, o]), w(() => {
|
|
45
|
-
if (
|
|
45
|
+
if (c) {
|
|
46
46
|
const t = new ResizeObserver(() => {
|
|
47
|
-
|
|
47
|
+
R();
|
|
48
48
|
});
|
|
49
|
-
return t.observe(
|
|
49
|
+
return t.observe(c), () => t.disconnect();
|
|
50
50
|
}
|
|
51
|
-
}, [
|
|
51
|
+
}, [c, o]), w(() => {
|
|
52
52
|
const t = (n) => {
|
|
53
53
|
const e = n.target;
|
|
54
54
|
h.current && !h.current.contains(e) && o && !o.contains(e) && // check we are not clicking inside the EntityPickerDialog
|
|
55
55
|
!e.closest(".entity-picker-dialog") && // check we are not clicking on the dialog backdrop
|
|
56
56
|
!e.querySelector(".entity-picker-dialog") && // check we are not clicking inside another dialog
|
|
57
57
|
!e.closest("dialog") && // check we are not clicking inside a dropdown
|
|
58
|
-
!e.closest(".dropdown") && !e.closest(".p-dialog-mask") && !e.closest(".p-datepicker") && !e.closest("." + I) && d?.();
|
|
58
|
+
!e.closest(".dropdown") && !e.closest(".p-dialog-mask") && !e.closest(".p-datepicker") && !e.closest("." + I) && (document.activeElement instanceof HTMLElement && document.activeElement.blur(), d?.());
|
|
59
59
|
};
|
|
60
60
|
return document.addEventListener("mousedown", t), () => {
|
|
61
61
|
document.removeEventListener("mousedown", t);
|
|
62
62
|
};
|
|
63
63
|
}, [d, o]);
|
|
64
|
-
const
|
|
64
|
+
const C = (t) => {
|
|
65
65
|
const n = t.target;
|
|
66
66
|
n.tagName === "INPUT" || n.tagName === "TEXTAREA" || n.isContentEditable || t.key === "Escape" && (t.stopPropagation(), d?.());
|
|
67
67
|
};
|
|
@@ -76,12 +76,12 @@ const I = "block-dialog-close", K = j.div`
|
|
|
76
76
|
right: s?.right,
|
|
77
77
|
...s?.showAbove && { transform: "translateY(-100%)" },
|
|
78
78
|
visibility: s ? "visible" : "hidden",
|
|
79
|
-
maxWidth:
|
|
79
|
+
maxWidth: x ? `${x}px` : "none",
|
|
80
80
|
maxHeight: y ? `${y}px` : "none"
|
|
81
81
|
},
|
|
82
82
|
className: "links-widget-popup",
|
|
83
|
-
onKeyDown:
|
|
84
|
-
children:
|
|
83
|
+
onKeyDown: C,
|
|
84
|
+
children: M
|
|
85
85
|
}
|
|
86
86
|
),
|
|
87
87
|
document.body
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CellEditingDialog.es.js","sources":["../../../../../src/components/LinksManager/CellEditingDialog.tsx"],"sourcesContent":["import { FC, useRef, useLayoutEffect, useState } from 'react'\nimport styled from 'styled-components'\nimport { createPortal } from 'react-dom'\n\nexport const BLOCK_DIALOG_CLOSE_CLASS = 'block-dialog-close'\n\nconst StyledPopUp = styled.div`\n position: fixed;\n z-index: 310;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n`\n\ntype Position = {\n top: number\n left?: number\n right?: number\n showAbove?: boolean\n}\n\nexport interface LinksManagerDialogProps {\n isEditing: boolean\n anchorId: string\n containerClassName?: string\n onClose?: () => void\n children?: React.ReactNode\n}\n\nexport const CellEditingDialog: FC<LinksManagerDialogProps> = ({\n isEditing,\n anchorId,\n containerClassName = 'table-container',\n onClose,\n children,\n}) => {\n const popupRef = useRef<HTMLDivElement>(null)\n\n const [position, setPosition] = useState<Position | null>(null)\n const [maxWidth, setMaxWidth] = useState<number | undefined>(undefined)\n const [maxHeight, setMaxHeight] = useState<number | undefined>(undefined)\n\n // get the cell element based on the cellId\n const anchorElement = document.getElementById(anchorId)\n const tableContainer = anchorElement?.closest(`.${containerClassName}`)\n\n const updatePosition = () => {\n if (!isEditing) return\n\n if (!anchorElement || !tableContainer) {\n // if the anchor element is not found, position in the center of the screen\n setPosition({\n top: window.innerHeight / 2,\n left: window.innerWidth / 2,\n showAbove: false,\n })\n setMaxWidth(undefined)\n setMaxHeight(undefined)\n return\n }\n\n const cellRect = anchorElement.getBoundingClientRect()\n\n const containerRect = tableContainer.getBoundingClientRect()\n const containerRight = containerRect.right\n const containerToRightOfScreen = window.innerWidth - containerRect.right\n\n const screenPadding = 24\n const minHeightThreshold = 250\n const minWidthThreshold = 400\n const maxMaxHeight = 600\n const screenWidth = window.innerWidth\n const screenHeight = window.innerHeight\n\n // Check if we have enough space to the right of the cell\n const spaceToRight = containerRight - cellRect.left\n let position: { left?: number; right?: number } = {}\n let dialogWidth = minWidthThreshold\n\n if (spaceToRight < minWidthThreshold) {\n // Not enough space to the right, anchor to the right side of the cell\n const spaceToLeft = cellRect.right - screenPadding\n if (spaceToLeft >= minWidthThreshold) {\n // Anchor to the right side of the cell\n position.right = Math.max(\n screenWidth - cellRect.right,\n screenPadding + containerToRightOfScreen,\n )\n } else {\n // Not enough space on either side, center and use available width\n position.left = screenPadding\n dialogWidth = screenWidth - 2 * screenPadding\n }\n } else {\n // Enough space to the right, position normally\n position.left = cellRect.left\n dialogWidth = Math.max(minWidthThreshold, spaceToRight)\n }\n\n setMaxWidth(dialogWidth)\n\n const spaceBelow = screenHeight - cellRect.bottom - screenPadding\n const spaceAbove = cellRect.top - screenPadding\n let top: number\n let showAbove = false\n let availableHeight: number\n\n if (spaceBelow < minHeightThreshold && spaceAbove > spaceBelow) {\n showAbove = true\n top = cellRect.top - 4\n availableHeight = spaceAbove - 4\n } else {\n top = cellRect.bottom + 4\n availableHeight = spaceBelow - 4\n }\n\n // Set max height to prevent dialog from going off screen\n setMaxHeight(Math.min(Math.max(200, availableHeight), maxMaxHeight)) // Minimum 200px height\n\n setPosition({\n top,\n ...position,\n showAbove,\n })\n }\n\n useLayoutEffect(() => {\n updatePosition()\n }, [isEditing, anchorElement])\n\n // watch for when the tableContainer width changes\n useLayoutEffect(() => {\n if (tableContainer) {\n const resizeObserver = new ResizeObserver(() => {\n updatePosition()\n })\n resizeObserver.observe(tableContainer)\n return () => resizeObserver.disconnect()\n }\n }, [tableContainer, anchorElement])\n\n // close the dialog when clicking outside of it\n useLayoutEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as HTMLElement\n\n if (\n popupRef.current &&\n !popupRef.current.contains(target) &&\n anchorElement &&\n !anchorElement.contains(target) &&\n // check we are not clicking inside the EntityPickerDialog\n !target.closest('.entity-picker-dialog') &&\n // check we are not clicking on the dialog backdrop\n !target.querySelector('.entity-picker-dialog') &&\n // check we are not clicking inside another dialog\n !target.closest('dialog') &&\n // check we are not clicking inside a dropdown\n !target.closest('.dropdown') &&\n !target.closest('.p-dialog-mask') &&\n !target.closest('.p-datepicker') &&\n !target.closest('.' + BLOCK_DIALOG_CLOSE_CLASS)\n ) {\n onClose?.()\n }\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [onClose, anchorElement])\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n // check we are not inside an input or textarea\n const target = e.target as HTMLElement\n if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable) {\n return\n }\n\n // close dialog on escape\n if (e.key === 'Escape') {\n e.stopPropagation()\n onClose?.()\n }\n }\n\n if (!isEditing) return null\n return createPortal(\n <StyledPopUp\n ref={popupRef}\n style={{\n top: position?.top,\n left: position?.left,\n right: position?.right,\n ...(position?.showAbove && { transform: 'translateY(-100%)' }),\n visibility: position ? 'visible' : 'hidden',\n maxWidth: maxWidth ? `${maxWidth}px` : 'none',\n maxHeight: maxHeight ? `${maxHeight}px` : 'none',\n }}\n className=\"links-widget-popup\"\n onKeyDown={handleKeyDown}\n >\n {children}\n </StyledPopUp>,\n document.body,\n )\n}\n"],"names":["BLOCK_DIALOG_CLOSE_CLASS","StyledPopUp","styled","CellEditingDialog","isEditing","anchorId","containerClassName","onClose","children","popupRef","useRef","position","setPosition","useState","maxWidth","setMaxWidth","maxHeight","setMaxHeight","anchorElement","tableContainer","updatePosition","cellRect","containerRect","containerRight","containerToRightOfScreen","screenPadding","minHeightThreshold","minWidthThreshold","maxMaxHeight","screenWidth","screenHeight","spaceToRight","dialogWidth","spaceBelow","spaceAbove","top","showAbove","availableHeight","useLayoutEffect","resizeObserver","handleClickOutside","event","target","handleKeyDown","e","createPortal","jsx"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CellEditingDialog.es.js","sources":["../../../../../src/components/LinksManager/CellEditingDialog.tsx"],"sourcesContent":["import { FC, useRef, useLayoutEffect, useState } from 'react'\nimport styled from 'styled-components'\nimport { createPortal } from 'react-dom'\n\nexport const BLOCK_DIALOG_CLOSE_CLASS = 'block-dialog-close'\n\nconst StyledPopUp = styled.div`\n position: fixed;\n z-index: 310;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n`\n\ntype Position = {\n top: number\n left?: number\n right?: number\n showAbove?: boolean\n}\n\nexport interface LinksManagerDialogProps {\n isEditing: boolean\n anchorId: string\n containerClassName?: string\n onClose?: () => void\n children?: React.ReactNode\n}\n\nexport const CellEditingDialog: FC<LinksManagerDialogProps> = ({\n isEditing,\n anchorId,\n containerClassName = 'table-container',\n onClose,\n children,\n}) => {\n const popupRef = useRef<HTMLDivElement>(null)\n\n const [position, setPosition] = useState<Position | null>(null)\n const [maxWidth, setMaxWidth] = useState<number | undefined>(undefined)\n const [maxHeight, setMaxHeight] = useState<number | undefined>(undefined)\n\n // get the cell element based on the cellId\n const anchorElement = document.getElementById(anchorId)\n const tableContainer = anchorElement?.closest(`.${containerClassName}`)\n\n const updatePosition = () => {\n if (!isEditing) return\n\n if (!anchorElement || !tableContainer) {\n // if the anchor element is not found, position in the center of the screen\n setPosition({\n top: window.innerHeight / 2,\n left: window.innerWidth / 2,\n showAbove: false,\n })\n setMaxWidth(undefined)\n setMaxHeight(undefined)\n return\n }\n\n const cellRect = anchorElement.getBoundingClientRect()\n\n const containerRect = tableContainer.getBoundingClientRect()\n const containerRight = containerRect.right\n const containerToRightOfScreen = window.innerWidth - containerRect.right\n\n const screenPadding = 24\n const minHeightThreshold = 250\n const minWidthThreshold = 400\n const maxMaxHeight = 600\n const screenWidth = window.innerWidth\n const screenHeight = window.innerHeight\n\n // Check if we have enough space to the right of the cell\n const spaceToRight = containerRight - cellRect.left\n let position: { left?: number; right?: number } = {}\n let dialogWidth = minWidthThreshold\n\n if (spaceToRight < minWidthThreshold) {\n // Not enough space to the right, anchor to the right side of the cell\n const spaceToLeft = cellRect.right - screenPadding\n if (spaceToLeft >= minWidthThreshold) {\n // Anchor to the right side of the cell\n position.right = Math.max(\n screenWidth - cellRect.right,\n screenPadding + containerToRightOfScreen,\n )\n } else {\n // Not enough space on either side, center and use available width\n position.left = screenPadding\n dialogWidth = screenWidth - 2 * screenPadding\n }\n } else {\n // Enough space to the right, position normally\n position.left = cellRect.left\n dialogWidth = Math.max(minWidthThreshold, spaceToRight)\n }\n\n setMaxWidth(dialogWidth)\n\n const spaceBelow = screenHeight - cellRect.bottom - screenPadding\n const spaceAbove = cellRect.top - screenPadding\n let top: number\n let showAbove = false\n let availableHeight: number\n\n if (spaceBelow < minHeightThreshold && spaceAbove > spaceBelow) {\n showAbove = true\n top = cellRect.top - 4\n availableHeight = spaceAbove - 4\n } else {\n top = cellRect.bottom + 4\n availableHeight = spaceBelow - 4\n }\n\n // Set max height to prevent dialog from going off screen\n setMaxHeight(Math.min(Math.max(200, availableHeight), maxMaxHeight)) // Minimum 200px height\n\n setPosition({\n top,\n ...position,\n showAbove,\n })\n }\n\n useLayoutEffect(() => {\n updatePosition()\n }, [isEditing, anchorElement])\n\n // watch for when the tableContainer width changes\n useLayoutEffect(() => {\n if (tableContainer) {\n const resizeObserver = new ResizeObserver(() => {\n updatePosition()\n })\n resizeObserver.observe(tableContainer)\n return () => resizeObserver.disconnect()\n }\n }, [tableContainer, anchorElement])\n\n // close the dialog when clicking outside of it\n useLayoutEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as HTMLElement\n\n if (\n popupRef.current &&\n !popupRef.current.contains(target) &&\n anchorElement &&\n !anchorElement.contains(target) &&\n // check we are not clicking inside the EntityPickerDialog\n !target.closest('.entity-picker-dialog') &&\n // check we are not clicking on the dialog backdrop\n !target.querySelector('.entity-picker-dialog') &&\n // check we are not clicking inside another dialog\n !target.closest('dialog') &&\n // check we are not clicking inside a dropdown\n !target.closest('.dropdown') &&\n !target.closest('.p-dialog-mask') &&\n !target.closest('.p-datepicker') &&\n !target.closest('.' + BLOCK_DIALOG_CLOSE_CLASS)\n ) {\n // Blur active element first so inputs can commit their values before unmount\n if (document.activeElement instanceof HTMLElement) {\n document.activeElement.blur()\n }\n onClose?.()\n }\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [onClose, anchorElement])\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n // check we are not inside an input or textarea\n const target = e.target as HTMLElement\n if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable) {\n return\n }\n\n // close dialog on escape\n if (e.key === 'Escape') {\n e.stopPropagation()\n onClose?.()\n }\n }\n\n if (!isEditing) return null\n return createPortal(\n <StyledPopUp\n ref={popupRef}\n style={{\n top: position?.top,\n left: position?.left,\n right: position?.right,\n ...(position?.showAbove && { transform: 'translateY(-100%)' }),\n visibility: position ? 'visible' : 'hidden',\n maxWidth: maxWidth ? `${maxWidth}px` : 'none',\n maxHeight: maxHeight ? `${maxHeight}px` : 'none',\n }}\n className=\"links-widget-popup\"\n onKeyDown={handleKeyDown}\n >\n {children}\n </StyledPopUp>,\n document.body,\n )\n}\n"],"names":["BLOCK_DIALOG_CLOSE_CLASS","StyledPopUp","styled","CellEditingDialog","isEditing","anchorId","containerClassName","onClose","children","popupRef","useRef","position","setPosition","useState","maxWidth","setMaxWidth","maxHeight","setMaxHeight","anchorElement","tableContainer","updatePosition","cellRect","containerRect","containerRight","containerToRightOfScreen","screenPadding","minHeightThreshold","minWidthThreshold","maxMaxHeight","screenWidth","screenHeight","spaceToRight","dialogWidth","spaceBelow","spaceAbove","top","showAbove","availableHeight","useLayoutEffect","resizeObserver","handleClickOutside","event","target","handleKeyDown","e","createPortal","jsx"],"mappings":"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"}
|