@ynput/ayon-frontend-shared 0.3.0 → 0.3.2
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/_virtual/index.cjs4.js +1 -1
- package/dist/_virtual/index.cjs5.js +1 -1
- package/dist/_virtual/index.es4.js +2 -5
- package/dist/_virtual/index.es4.js.map +1 -1
- package/dist/_virtual/index.es5.js +5 -2
- package/dist/_virtual/index.es5.js.map +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/node_modules/web-namespaces/index.cjs.js +1 -1
- package/dist/node_modules/web-namespaces/index.cjs.js.map +1 -1
- package/dist/node_modules/web-namespaces/index.es.js +3 -8
- package/dist/node_modules/web-namespaces/index.es.js.map +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/graphql.cjs.js +12 -8
- package/dist/shared/src/api/generated/graphql.cjs.js.map +1 -1
- package/dist/shared/src/api/generated/graphql.es.js +11 -7
- package/dist/shared/src/api/generated/graphql.es.js.map +1 -1
- package/dist/shared/src/api/generated/graphqlLinks.cjs.js.map +1 -1
- package/dist/shared/src/api/generated/graphqlLinks.es.js.map +1 -1
- package/dist/shared/src/api/queries/overview/getOverview.cjs.js +1 -1
- package/dist/shared/src/api/queries/overview/getOverview.cjs.js.map +1 -1
- package/dist/shared/src/api/queries/overview/getOverview.es.js +95 -95
- package/dist/shared/src/api/queries/overview/getOverview.es.js.map +1 -1
- package/dist/shared/src/components/ProjectTableSettings/ColumnsSettings.cjs.js +2 -2
- package/dist/shared/src/components/ProjectTableSettings/ColumnsSettings.cjs.js.map +1 -1
- package/dist/shared/src/components/ProjectTableSettings/ColumnsSettings.es.js +66 -61
- package/dist/shared/src/components/ProjectTableSettings/ColumnsSettings.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 +14 -11
- package/dist/shared/src/components/RemotePage/RemotePageWrapper.es.js.map +1 -1
- package/dist/shared/src/components/SearchFilter/useBuildFilterOptions.cjs.js +1 -1
- package/dist/shared/src/components/SearchFilter/useBuildFilterOptions.cjs.js.map +1 -1
- package/dist/shared/src/components/SearchFilter/useBuildFilterOptions.es.js +42 -41
- package/dist/shared/src/components/SearchFilter/useBuildFilterOptions.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 +23 -23
- package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js.map +1 -1
- package/dist/shared/src/containers/Feed/hooks/useTransformActivities.cjs.js +1 -1
- package/dist/shared/src/containers/Feed/hooks/useTransformActivities.cjs.js.map +1 -1
- package/dist/shared/src/containers/Feed/hooks/useTransformActivities.es.js +6 -6
- package/dist/shared/src/containers/Feed/hooks/useTransformActivities.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 +65 -64
- 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 +16 -16
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/context/ClipboardContext.cjs.js +3 -3
- package/dist/shared/src/containers/ProjectTreeTable/context/ClipboardContext.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/context/ClipboardContext.es.js +142 -146
- package/dist/shared/src/containers/ProjectTreeTable/context/ClipboardContext.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 +24 -24
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.es.js +141 -132
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.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 +35 -28
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/TextWidget.cjs.js +2 -2
- package/dist/shared/src/containers/ProjectTreeTable/widgets/TextWidget.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/TextWidget.es.js +10 -10
- package/dist/shared/src/containers/Views/hooks/pages/useOverviewViewSettings.cjs.js.map +1 -1
- package/dist/shared/src/containers/Views/hooks/pages/useOverviewViewSettings.es.js.map +1 -1
- package/dist/shared/src/context/AddonContext.cjs.js.map +1 -1
- package/dist/shared/src/context/AddonContext.es.js.map +1 -1
- package/dist/shared/src/context/ProjectFoldersContext.cjs.js +1 -1
- package/dist/shared/src/context/ProjectFoldersContext.cjs.js.map +1 -1
- package/dist/shared/src/context/ProjectFoldersContext.es.js +62 -49
- package/dist/shared/src/context/ProjectFoldersContext.es.js.map +1 -1
- package/dist/shared/src/hooks/useLoadModules.cjs.js +1 -1
- package/dist/shared/src/hooks/useLoadModules.cjs.js.map +1 -1
- package/dist/shared/src/hooks/useLoadModules.es.js +86 -80
- package/dist/shared/src/hooks/useLoadModules.es.js.map +1 -1
- package/dist/types/api/generated/graphql.d.ts +2 -1
- package/dist/types/api/generated/graphqlLinks.d.ts +1 -0
- package/dist/types/api/queries/overview/getOverview.d.ts +1 -0
- package/dist/types/components/RemotePage/RemotePageWrapper.d.ts +1 -0
- package/dist/types/components/SearchFilter/useBuildFilterOptions.d.ts +1 -0
- package/dist/types/containers/ProjectTreeTable/hooks/useFetchOverviewData.d.ts +2 -1
- package/dist/types/containers/ProjectTreeTable/hooks/useQueryFilters.d.ts +4 -1
- package/dist/types/context/AddonContext.d.ts +1 -0
- package/dist/types/context/ProjectFoldersContext.d.ts +1 -0
- package/package.json +2 -1
- package/dist/node_modules/@ungap/structured-clone/esm/deserialize.cjs.js +0 -2
- package/dist/node_modules/@ungap/structured-clone/esm/deserialize.cjs.js.map +0 -1
- package/dist/node_modules/@ungap/structured-clone/esm/deserialize.es.js +0 -63
- package/dist/node_modules/@ungap/structured-clone/esm/deserialize.es.js.map +0 -1
- package/dist/node_modules/@ungap/structured-clone/esm/index.cjs.js +0 -2
- package/dist/node_modules/@ungap/structured-clone/esm/index.cjs.js.map +0 -1
- package/dist/node_modules/@ungap/structured-clone/esm/index.es.js +0 -12
- package/dist/node_modules/@ungap/structured-clone/esm/index.es.js.map +0 -1
- package/dist/node_modules/@ungap/structured-clone/esm/serialize.cjs.js +0 -2
- package/dist/node_modules/@ungap/structured-clone/esm/serialize.cjs.js.map +0 -1
- package/dist/node_modules/@ungap/structured-clone/esm/serialize.es.js +0 -107
- package/dist/node_modules/@ungap/structured-clone/esm/serialize.es.js.map +0 -1
- package/dist/node_modules/@ungap/structured-clone/esm/types.cjs.js +0 -2
- package/dist/node_modules/@ungap/structured-clone/esm/types.cjs.js.map +0 -1
- package/dist/node_modules/@ungap/structured-clone/esm/types.es.js +0 -14
- package/dist/node_modules/@ungap/structured-clone/esm/types.es.js.map +0 -1
- package/dist/node_modules/devlop/lib/default.cjs.js +0 -2
- package/dist/node_modules/devlop/lib/default.cjs.js.map +0 -1
- package/dist/node_modules/devlop/lib/default.es.js +0 -6
- package/dist/node_modules/devlop/lib/default.es.js.map +0 -1
- package/dist/node_modules/entities/dist/esm/decode-codepoint.cjs.js +0 -2
- package/dist/node_modules/entities/dist/esm/decode-codepoint.cjs.js.map +0 -1
- package/dist/node_modules/entities/dist/esm/decode-codepoint.es.js +0 -39
- package/dist/node_modules/entities/dist/esm/decode-codepoint.es.js.map +0 -1
- package/dist/node_modules/entities/dist/esm/decode.cjs.js +0 -2
- package/dist/node_modules/entities/dist/esm/decode.cjs.js.map +0 -1
- package/dist/node_modules/entities/dist/esm/decode.es.js +0 -246
- package/dist/node_modules/entities/dist/esm/decode.es.js.map +0 -1
- package/dist/node_modules/entities/dist/esm/generated/decode-data-html.cjs.js +0 -2
- package/dist/node_modules/entities/dist/esm/generated/decode-data-html.cjs.js.map +0 -1
- package/dist/node_modules/entities/dist/esm/generated/decode-data-html.es.js +0 -8
- package/dist/node_modules/entities/dist/esm/generated/decode-data-html.es.js.map +0 -1
- package/dist/node_modules/hast-util-raw/lib/index.cjs.js +0 -2
- package/dist/node_modules/hast-util-raw/lib/index.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-raw/lib/index.es.js +0 -218
- package/dist/node_modules/hast-util-raw/lib/index.es.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/hast-util-from-parse5/lib/index.cjs.js +0 -2
- package/dist/node_modules/hast-util-raw/node_modules/hast-util-from-parse5/lib/index.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/hast-util-from-parse5/lib/index.es.js +0 -146
- package/dist/node_modules/hast-util-raw/node_modules/hast-util-from-parse5/lib/index.es.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/hast-util-parse-selector/lib/index.cjs.js +0 -2
- package/dist/node_modules/hast-util-raw/node_modules/hast-util-parse-selector/lib/index.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/hast-util-parse-selector/lib/index.es.js +0 -21
- package/dist/node_modules/hast-util-raw/node_modules/hast-util-parse-selector/lib/index.es.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/hastscript/lib/create-h.cjs.js +0 -2
- package/dist/node_modules/hast-util-raw/node_modules/hastscript/lib/create-h.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/hastscript/lib/create-h.es.js +0 -113
- package/dist/node_modules/hast-util-raw/node_modules/hastscript/lib/create-h.es.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/hastscript/lib/index.cjs.js +0 -2
- package/dist/node_modules/hast-util-raw/node_modules/hastscript/lib/index.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/hastscript/lib/index.es.js +0 -9
- package/dist/node_modules/hast-util-raw/node_modules/hastscript/lib/index.es.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/hastscript/lib/svg-case-sensitive-tag-names.cjs.js +0 -2
- package/dist/node_modules/hast-util-raw/node_modules/hastscript/lib/svg-case-sensitive-tag-names.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/hastscript/lib/svg-case-sensitive-tag-names.es.js +0 -45
- package/dist/node_modules/hast-util-raw/node_modules/hastscript/lib/svg-case-sensitive-tag-names.es.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/html-void-elements/index.cjs.js +0 -2
- package/dist/node_modules/hast-util-raw/node_modules/html-void-elements/index.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/html-void-elements/index.es.js +0 -26
- package/dist/node_modules/hast-util-raw/node_modules/html-void-elements/index.es.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/doctype.cjs.js +0 -2
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/doctype.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/doctype.es.js +0 -99
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/doctype.es.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/error-codes.cjs.js +0 -2
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/error-codes.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/error-codes.es.js +0 -8
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/error-codes.es.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/foreign-content.cjs.js +0 -2
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/foreign-content.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/foreign-content.es.js +0 -211
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/foreign-content.es.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/html.cjs.js +0 -2
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/html.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/html.es.js +0 -251
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/html.es.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/token.cjs.js +0 -2
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/token.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/token.es.js +0 -15
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/token.es.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/unicode.cjs.js +0 -2
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/unicode.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/unicode.es.js +0 -74
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/common/unicode.es.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/parser/formatting-element-list.cjs.js +0 -2
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/parser/formatting-element-list.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/parser/formatting-element-list.es.js +0 -85
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/parser/formatting-element-list.es.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/parser/index.cjs.js +0 -2
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/parser/index.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/parser/index.es.js +0 -2272
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/parser/index.es.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/parser/open-element-stack.cjs.js +0 -2
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/parser/open-element-stack.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/parser/open-element-stack.es.js +0 -241
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/parser/open-element-stack.es.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/serializer/index.cjs.js +0 -2
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/serializer/index.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/serializer/index.es.js +0 -3
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/serializer/index.es.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/tokenizer/index.cjs.js +0 -2
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/tokenizer/index.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/tokenizer/index.es.js +0 -1941
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/tokenizer/index.es.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/tokenizer/preprocessor.cjs.js +0 -2
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/tokenizer/preprocessor.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/tokenizer/preprocessor.es.js +0 -89
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/tokenizer/preprocessor.es.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/tree-adapters/default.cjs.js +0 -2
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/tree-adapters/default.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/tree-adapters/default.es.js +0 -163
- package/dist/node_modules/hast-util-raw/node_modules/parse5/dist/tree-adapters/default.es.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/property-information/index.cjs.js +0 -2
- package/dist/node_modules/hast-util-raw/node_modules/property-information/index.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/property-information/index.es.js +0 -13
- package/dist/node_modules/hast-util-raw/node_modules/property-information/index.es.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/aria.cjs.js +0 -2
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/aria.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/aria.es.js +0 -62
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/aria.es.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/find.cjs.js +0 -2
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/find.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/find.es.js +0 -34
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/find.es.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/html.cjs.js +0 -2
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/html.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/html.es.js +0 -369
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/html.es.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/normalize.cjs.js +0 -2
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/normalize.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/normalize.es.js +0 -7
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/normalize.es.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/svg.cjs.js +0 -2
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/svg.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/svg.es.js +0 -567
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/svg.es.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/case-insensitive-transform.cjs.js +0 -2
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/case-insensitive-transform.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/case-insensitive-transform.es.js +0 -8
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/case-insensitive-transform.es.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/case-sensitive-transform.cjs.js +0 -2
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/case-sensitive-transform.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/case-sensitive-transform.es.js +0 -7
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/case-sensitive-transform.es.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/create.cjs.js +0 -2
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/create.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/create.es.js +0 -20
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/create.es.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/defined-info.cjs.js +0 -2
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/defined-info.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/defined-info.es.js +0 -37
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/defined-info.es.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/info.cjs.js +0 -2
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/info.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/info.es.js +0 -29
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/info.es.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/merge.cjs.js +0 -2
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/merge.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/merge.es.js +0 -11
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/merge.es.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/schema.cjs.js +0 -2
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/schema.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/schema.es.js +0 -22
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/schema.es.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/types.cjs.js +0 -2
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/types.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/types.es.js +0 -15
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/util/types.es.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/xlink.cjs.js +0 -2
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/xlink.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/xlink.es.js +0 -20
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/xlink.es.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/xml.cjs.js +0 -2
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/xml.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/xml.es.js +0 -12
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/xml.es.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/xmlns.cjs.js +0 -2
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/xmlns.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/xmlns.es.js +0 -12
- package/dist/node_modules/hast-util-raw/node_modules/property-information/lib/xmlns.es.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/vfile-location/lib/index.cjs.js +0 -3
- package/dist/node_modules/hast-util-raw/node_modules/vfile-location/lib/index.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-raw/node_modules/vfile-location/lib/index.es.js +0 -43
- package/dist/node_modules/hast-util-raw/node_modules/vfile-location/lib/index.es.js.map +0 -1
- package/dist/node_modules/hast-util-to-parse5/lib/index.cjs.js +0 -2
- package/dist/node_modules/hast-util-to-parse5/lib/index.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-to-parse5/lib/index.es.js +0 -119
- package/dist/node_modules/hast-util-to-parse5/lib/index.es.js.map +0 -1
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/index.cjs.js +0 -2
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/index.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/index.es.js +0 -13
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/index.es.js.map +0 -1
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/aria.cjs.js +0 -2
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/aria.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/aria.es.js +0 -62
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/aria.es.js.map +0 -1
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/find.cjs.js +0 -2
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/find.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/find.es.js +0 -34
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/find.es.js.map +0 -1
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/html.cjs.js +0 -2
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/html.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/html.es.js +0 -369
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/html.es.js.map +0 -1
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/normalize.cjs.js +0 -2
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/normalize.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/normalize.es.js +0 -7
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/normalize.es.js.map +0 -1
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/svg.cjs.js +0 -2
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/svg.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/svg.es.js +0 -567
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/svg.es.js.map +0 -1
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/case-insensitive-transform.cjs.js +0 -2
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/case-insensitive-transform.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/case-insensitive-transform.es.js +0 -8
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/case-insensitive-transform.es.js.map +0 -1
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/case-sensitive-transform.cjs.js +0 -2
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/case-sensitive-transform.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/case-sensitive-transform.es.js +0 -7
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/case-sensitive-transform.es.js.map +0 -1
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/create.cjs.js +0 -2
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/create.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/create.es.js +0 -20
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/create.es.js.map +0 -1
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/defined-info.cjs.js +0 -2
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/defined-info.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/defined-info.es.js +0 -37
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/defined-info.es.js.map +0 -1
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/info.cjs.js +0 -2
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/info.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/info.es.js +0 -29
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/info.es.js.map +0 -1
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/merge.cjs.js +0 -2
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/merge.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/merge.es.js +0 -11
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/merge.es.js.map +0 -1
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/schema.cjs.js +0 -2
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/schema.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/schema.es.js +0 -22
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/schema.es.js.map +0 -1
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/types.cjs.js +0 -2
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/types.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/types.es.js +0 -15
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/util/types.es.js.map +0 -1
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/xlink.cjs.js +0 -2
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/xlink.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/xlink.es.js +0 -20
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/xlink.es.js.map +0 -1
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/xml.cjs.js +0 -2
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/xml.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/xml.es.js +0 -12
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/xml.es.js.map +0 -1
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/xmlns.cjs.js +0 -2
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/xmlns.cjs.js.map +0 -1
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/xmlns.es.js +0 -12
- package/dist/node_modules/hast-util-to-parse5/node_modules/property-information/lib/xmlns.es.js.map +0 -1
- package/dist/node_modules/rehype-raw/lib/index.cjs.js +0 -2
- package/dist/node_modules/rehype-raw/lib/index.cjs.js.map +0 -1
- package/dist/node_modules/rehype-raw/lib/index.es.js +0 -13
- package/dist/node_modules/rehype-raw/lib/index.es.js.map +0 -1
- package/dist/node_modules/unist-util-is/lib/index.cjs.js +0 -2
- package/dist/node_modules/unist-util-is/lib/index.cjs.js.map +0 -1
- package/dist/node_modules/unist-util-is/lib/index.es.js +0 -92
- package/dist/node_modules/unist-util-is/lib/index.es.js.map +0 -1
- package/dist/node_modules/unist-util-position/lib/index.cjs.js +0 -2
- package/dist/node_modules/unist-util-position/lib/index.cjs.js.map +0 -1
- package/dist/node_modules/unist-util-position/lib/index.es.js +0 -18
- package/dist/node_modules/unist-util-position/lib/index.es.js.map +0 -1
- package/dist/node_modules/unist-util-visit/lib/index.cjs.js +0 -2
- package/dist/node_modules/unist-util-visit/lib/index.cjs.js.map +0 -1
- package/dist/node_modules/unist-util-visit/lib/index.es.js +0 -17
- package/dist/node_modules/unist-util-visit/lib/index.es.js.map +0 -1
- package/dist/node_modules/unist-util-visit-parents/lib/color.cjs.js +0 -2
- package/dist/node_modules/unist-util-visit-parents/lib/color.cjs.js.map +0 -1
- package/dist/node_modules/unist-util-visit-parents/lib/color.es.js +0 -7
- package/dist/node_modules/unist-util-visit-parents/lib/color.es.js.map +0 -1
- package/dist/node_modules/unist-util-visit-parents/lib/index.cjs.js +0 -2
- package/dist/node_modules/unist-util-visit-parents/lib/index.cjs.js.map +0 -1
- package/dist/node_modules/unist-util-visit-parents/lib/index.es.js +0 -57
- package/dist/node_modules/unist-util-visit-parents/lib/index.es.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClipboardContext.es.js","sources":["../../../../../../src/containers/ProjectTreeTable/context/ClipboardContext.tsx"],"sourcesContent":["import React, { createContext, useContext, useCallback, useMemo, useEffect } from 'react'\n\n// Contexts\nimport { ROW_SELECTION_COLUMN_ID, useSelectionCellsContext } from './SelectionCellsContext'\nimport { useCellEditing } from './CellEditingContext'\n\n// Utils\nimport {\n getCellValue,\n getEntityDataById,\n getLinkEntityIdsByColumnId,\n parseCellId,\n} from '../utils/cellUtils'\n\n// Types\nimport { EntityUpdate } from '../hooks/useUpdateTableData'\nimport usePasteLinks, { LinkUpdate } from '../hooks/usePasteLinks'\n\n// Import from the new modular files\nimport {\n getEntityPath,\n parseClipboardText,\n clipboardError,\n processFieldValue,\n} from './clipboard/clipboardUtils'\nimport { validateClipboardData } from './clipboard/clipboardValidation'\nimport { ClipboardContextType, ClipboardProviderProps } from './clipboard/clipboardTypes'\nimport { useProjectTableContext } from './ProjectTableContext'\nimport { validateEntityId } from '@shared/util'\n\nconst ClipboardContext = createContext<ClipboardContextType | undefined>(undefined)\n\nexport const ClipboardProvider: React.FC<ClipboardProviderProps> = ({\n children,\n entitiesMap,\n columnEnums,\n columnReadOnly,\n visibleColumns,\n}) => {\n // Get selection information from SelectionContext\n const { selectedCells, gridMap, focusedCellId } = useSelectionCellsContext()\n const { updateEntities } = useCellEditing()\n const { pasteTableLinks } = usePasteLinks()\n const { getEntityById, attribFields } = useProjectTableContext()\n\n const getSelectionData = useCallback(\n async (selected: string[], config?: { headers?: boolean; fullRow?: boolean }) => {\n const { headers, fullRow } = config || {}\n try {\n // Get visible columns in display order, excluding row selection\n const visibleColumnIds = visibleColumns\n .map((col) => col.id)\n .filter((id) => id !== ROW_SELECTION_COLUMN_ID)\n\n // Organize selected cells by row, filtering to only visible columns\n const cellsByRow = new Map<string, Set<string>>()\n\n // Parse all selected cells and organize by rowId and colId\n selected.forEach((cellId) => {\n const position = parseCellId(cellId)\n if (!position) return\n\n const { rowId, colId } = position\n if (colId === ROW_SELECTION_COLUMN_ID || !visibleColumnIds.includes(colId)) return\n\n if (!cellsByRow.has(rowId)) {\n cellsByRow.set(rowId, new Set())\n }\n\n cellsByRow.get(rowId)?.add(colId)\n })\n\n if (fullRow) {\n const selectedRows = selected\n .filter(\n (cellId) =>\n parseCellId(cellId)?.rowId &&\n parseCellId(cellId)?.colId === ROW_SELECTION_COLUMN_ID,\n )\n .map((cellId) => parseCellId(cellId)?.rowId) as string[]\n\n // select the whole row\n // For rows with selection cells, add all available columns\n selectedRows.forEach((rowId) => {\n // add the rowId if it doesn't exist\n if (!cellsByRow.has(rowId)) {\n cellsByRow.set(rowId, new Set())\n }\n const allColumns = Array.from(gridMap.colIdToIndex.keys())\n allColumns.forEach((colId) => {\n cellsByRow.get(rowId)?.add(colId)\n })\n })\n }\n\n // Get sorted row IDs based on their index in the grid\n const sortedRows = Array.from(cellsByRow.keys()).sort((a, b) => {\n const indexA = gridMap.rowIdToIndex.get(a) ?? Infinity\n const indexB = gridMap.rowIdToIndex.get(b) ?? Infinity\n return indexA - indexB\n })\n\n // Build clipboard text\n let clipboardText = ''\n\n // Get the first row to determine columns\n const firstRowId = sortedRows[0]\n if (!firstRowId) return ''\n\n // Get all column IDs for the first row, sorted by their index in the grid\n const colIds = Array.from(cellsByRow.get(firstRowId) || []).sort((a, b) => {\n const indexA = gridMap.colIdToIndex.get(a) ?? Infinity\n const indexB = gridMap.colIdToIndex.get(b) ?? Infinity\n return indexA - indexB\n })\n\n // Include headers if requested\n if (headers && colIds.length > 0) {\n const headerValues: string[] = []\n\n for (const colId of colIds) {\n // Use colId as the column name since we don't have direct access to column names\n const columnName = colId\n headerValues.push(`${columnName.replace(/\"/g, '\"\"')}`)\n }\n\n clipboardText += headerValues.join('\\t') + '\\n'\n }\n\n for (const rowId of sortedRows) {\n // Get the entity for this row\n const entity = getEntityById(rowId)\n\n if (!entity) {\n console.warn(`Entity not found for rowId: ${rowId}`)\n continue\n }\n\n // Get all column IDs for this row, sorted by their index in the grid\n const colIds = Array.from(cellsByRow.get(rowId) || []).sort((a, b) => {\n const indexA = gridMap.colIdToIndex.get(a) ?? Infinity\n const indexB = gridMap.colIdToIndex.get(b) ?? Infinity\n return indexA - indexB\n })\n\n // Filter out the row selection column from the copied data\n const filteredColIds = colIds.filter((colId) => colId !== ROW_SELECTION_COLUMN_ID)\n\n const rowValues: string[] = []\n\n // For each column in this row\n for (const colId of filteredColIds) {\n // Determine the value based on the column ID\n let cellValue = ''\n\n // special handling of link cells\n if (colId.startsWith('link_')) {\n // @ts-expect-error - only complaining about missing __typename\n cellValue = getLinkEntityIdsByColumnId(entity.links, colId)\n } else {\n // @ts-ignore\n let foundValue = getCellValue(entity, colId)\n\n if (!foundValue) {\n // we should look for the default value set out in attribFields\n const field = attribFields.find((f) => f.name === colId.replace('attrib_', ''))\n if (field && field.data.type === 'boolean') {\n foundValue = false // default boolean value\n } else if (field && field.data.type.includes('list_of')) {\n foundValue = [] // default list value\n }\n }\n\n // convert to string if foundValue is not undefined or null use empty string otherwise\n cellValue = foundValue !== undefined && foundValue !== null ? String(foundValue) : ''\n\n // Special handling for name field - include full path\n if (colId === 'name') {\n cellValue = getEntityPath(entity.entityId || entity.id, entitiesMap)\n }\n\n if (colId === 'subType') {\n // get folderType or taskType\n if ('folderType' in entity) {\n cellValue = entity.folderType || ''\n }\n if ('taskType' in entity) {\n cellValue = entity.taskType || ''\n }\n }\n }\n\n // Escape double quotes in the cell value and wrap in quotes\n rowValues.push(`${cellValue.replace(/\"/g, '\"\"')}`)\n }\n\n // Add row to clipboard text\n clipboardText += rowValues.join('\\t') + '\\n'\n }\n\n return clipboardText\n } catch (error) {\n console.error('Failed to copy to clipboard:', error)\n }\n },\n [selectedCells, focusedCellId, gridMap, entitiesMap, getEntityById, visibleColumns],\n )\n\n const doesClipboardContainId = async () => {\n // check if the clipboard contains a valid ID\n const clipboardText = await getClipboardString()\n if (!clipboardText) return false\n const parsedData = parseClipboardText(clipboardText)\n if (parsedData.length === 0) return false\n return parsedData.every((row) => {\n return row.values.every((value) => value.split(',').every((v) => validateEntityId(v)))\n })\n }\n\n const copyToClipboard: ClipboardContextType['copyToClipboard'] = useCallback(\n async (selected, fullRow) => {\n selected = selected || Array.from(selectedCells)\n if (!selected.length) return\n const clipboardText = await getSelectionData(selected, { fullRow })\n if (!clipboardText) {\n return\n }\n if (!navigator.clipboard) {\n clipboardError('Clipboard API not supported in this browser.')\n return\n }\n if (!window.isSecureContext) {\n clipboardError('Clipboard operations require a secure HTTPS context.')\n return\n }\n try {\n await navigator.clipboard.writeText(clipboardText)\n } catch (error: any) {\n clipboardError(`Failed to copy to clipboard: ${error.message}`)\n }\n },\n [selectedCells, entitiesMap, gridMap],\n )\n\n const exportCSV: ClipboardContextType['exportCSV'] = useCallback(\n async (selected, projectName, fullRow) => {\n selected = selected || Array.from(selectedCells)\n if (!selected.length) return\n\n try {\n // Get clipboard text with headers included for CSV export\n const clipboardText = await getSelectionData(selected, { headers: true, fullRow })\n if (!clipboardText) return\n\n // create a csv file and download it\n const blob = new Blob([clipboardText], { type: 'text/csv' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n const selectedCount = selected.length\n a.download = `${projectName}-export-${selectedCount}_cells-${new Date()\n .toISOString()\n .slice(0, 10)}.csv`\n a.click()\n URL.revokeObjectURL(url)\n } catch (error) {\n console.error('Failed to copy to clipboard:', error)\n }\n },\n [selectedCells, entitiesMap, gridMap, getSelectionData],\n )\n\n const getClipboardString = async (): Promise<string | void> => {\n if (!navigator.clipboard) {\n clipboardError('Clipboard API not supported in this browser.')\n return\n }\n if (!window.isSecureContext) {\n clipboardError('Clipboard operations require a secure HTTPS context.')\n return\n }\n let clipboardText: string\n try {\n clipboardText = await navigator.clipboard.readText()\n return clipboardText\n } catch (error: any) {\n clipboardError(`Failed to read from clipboard: ${error.message}`)\n return\n }\n }\n\n const pasteFromClipboard: ClipboardContextType['pasteFromClipboard'] = useCallback(\n async (selected, config) => {\n const { method = 'replace' } = config || {}\n if (!selected.length) return\n\n const clipboardText = await getClipboardString()\n if (!clipboardText) return\n\n // Parse the clipboard text\n const parsedData = parseClipboardText(clipboardText)\n if (!parsedData.length) return\n\n // Determine if we have a single value in the clipboard (one row, one column)\n const isSingleCellValue = parsedData.length === 1 && parsedData[0].values.length === 1\n\n // Get visible columns in display order, excluding row selection\n const visibleColumnIds = visibleColumns\n .map((col) => col.id)\n .filter((id) => id !== ROW_SELECTION_COLUMN_ID)\n\n // Helper function to map clipboard values to visible columns\n const mapClipboardToVisibleColumns = (\n clipboardRow: any,\n visibleColumnIds: string[],\n clipboardHeaders?: string[],\n ) => {\n const mappedValues: Record<string, string> = {}\n\n if (clipboardHeaders && clipboardHeaders.length > 0) {\n // Map by header names when available\n clipboardHeaders.forEach((header: string, index: number) => {\n const matchingColId = visibleColumnIds.find(\n (colId) =>\n colId === header ||\n colId.replace('attrib_', '') === header ||\n colId === `attrib_${header}` ||\n colId.toLowerCase() === header.toLowerCase(),\n )\n\n if (matchingColId && index < clipboardRow.values.length) {\n mappedValues[matchingColId] = clipboardRow.values[index]\n }\n })\n } else {\n // Fallback: map by position, but only to visible columns\n visibleColumnIds.forEach((colId, index) => {\n if (index < clipboardRow.values.length) {\n mappedValues[colId] = clipboardRow.values[index]\n }\n })\n }\n\n return mappedValues\n }\n\n // Extract headers if they exist (assuming first row might be headers from external source)\n // You might need to detect this differently based on your clipboard format\n const clipboardHeaders = parsedData[0]?.colIds || undefined\n\n // Organize selected cells by row, filtering to only visible columns\n const cellsByRow = new Map<string, Set<string>>()\n\n Array.from(selected).forEach((cellId) => {\n const position = parseCellId(cellId)\n if (!position) return\n\n const { rowId, colId } = position\n if (colId === ROW_SELECTION_COLUMN_ID || !visibleColumnIds.includes(colId)) return\n\n if (!cellsByRow.has(rowId)) {\n cellsByRow.set(rowId, new Set())\n }\n cellsByRow.get(rowId)?.add(colId)\n })\n\n // Get sorted row IDs and column IDs\n const sortedRows = Array.from(cellsByRow.keys()).sort((a, b) => {\n const indexA = gridMap.rowIdToIndex.get(a) ?? Infinity\n const indexB = gridMap.rowIdToIndex.get(b) ?? Infinity\n return indexA - indexB\n })\n\n const firstRow = sortedRows[0]\n const selectedColIds = Array.from(cellsByRow.get(firstRow) || []).sort((a, b) => {\n const indexA = gridMap.colIdToIndex.get(a) ?? Infinity\n const indexB = gridMap.colIdToIndex.get(b) ?? Infinity\n return indexA - indexB\n })\n\n // First pass: validate all values\n for (let rowIndex = 0; rowIndex < sortedRows.length; rowIndex++) {\n const rowId = sortedRows[rowIndex]\n const isFolder = getEntityDataById<'folder'>(rowId, entitiesMap)?.entityType === 'folder'\n\n const pasteRowIndex = rowIndex % parsedData.length\n const clipboardRow = parsedData[pasteRowIndex]\n\n // Map clipboard data to visible columns\n const mappedValues = isSingleCellValue\n ? { [selectedColIds[0]]: parsedData[0].values[0] }\n : mapClipboardToVisibleColumns(clipboardRow, selectedColIds, clipboardHeaders)\n\n // Validate each mapped value\n for (const colId of selectedColIds) {\n const pasteValue = mappedValues[colId] || ''\n\n const isValid = validateClipboardData({\n colId,\n isFolder,\n pasteValue,\n parsedData,\n columnEnums,\n columnReadOnly,\n rowIndex,\n colIndex: selectedColIds.indexOf(colId),\n isSingleCellValue,\n attribFields,\n })\n\n if (!isValid) return\n }\n }\n\n // Create a map to consolidate updates for the same entity\n const entitiesToUpdateMap = new Map<\n string,\n {\n rowId: string\n id: string\n type: string\n fields: Record<string, any>\n attrib: Record<string, any>\n links: Record<string, string[]>\n }\n >()\n\n // For each column, prepare updates\n for (let colIndex = 0; colIndex < selectedColIds.length; colIndex++) {\n const colId = selectedColIds[colIndex]\n\n // Skip special handling for 'name' which we don't want to paste\n if (colId === 'name') continue\n\n // Check if this is an attribute field by examining the first entity\n let isAttrib = false,\n isLink = false\n // Check if the field potentially contains array values\n let fieldValueType: 'string' | 'number' | 'boolean' | 'array' = 'string'\n\n if (sortedRows.length > 0) {\n const firstRowId = sortedRows[0]\n const entity = getEntityById(firstRowId)\n if (entity) {\n isAttrib = colId.startsWith('attrib_')\n isLink = colId.startsWith('link_')\n\n // Determine field type based on type or attrib type\n if (colId === 'status' || colId === 'subType') {\n // status and subType are strings\n fieldValueType = 'string'\n // special case to avoid treating subType as attrib (not sure if this is needed)\n isAttrib = false\n } else if (colId === 'tags' || colId === 'assignees') {\n // tags and assignees are always arrays\n fieldValueType = 'array'\n } else if (isAttrib) {\n // find type based on attribFields\n const fieldName = colId.replace('attrib_', '')\n const attribField = attribFields.find((f) => f.name === fieldName)\n if (attribField) {\n const dataType = attribField.data.type\n switch (dataType) {\n case 'boolean':\n fieldValueType = 'boolean'\n break\n case 'float':\n case 'integer':\n fieldValueType = 'number'\n break\n case 'list_of_strings':\n case 'list_of_any':\n case 'list_of_integers':\n case 'list_of_submodels':\n fieldValueType = 'array'\n break\n default:\n // everything else is string\n fieldValueType = 'string'\n }\n }\n } else if (isLink) {\n // links are always arrays\n fieldValueType = 'array'\n }\n }\n }\n\n // Process each row individually\n for (let rowIndex = 0; rowIndex < sortedRows.length; rowIndex++) {\n const rowId = sortedRows[rowIndex]\n const entityType = getEntityDataById(rowId, entitiesMap)?.entityType\n const isFolder = entityType === 'folder'\n\n // Get the appropriate value from the clipboard data\n let pasteValue\n if (isSingleCellValue) {\n pasteValue = parsedData[0].values[0]\n } else {\n const pasteRowIndex = rowIndex % parsedData.length\n // Map visible column index to clipboard data index\n // When clipboard contains hidden columns, we need to skip over values\n // that correspond to hidden columns when pasting to visible columns\n const clipboardRow = parsedData[pasteRowIndex]\n\n // If clipboard has more values than visible columns being pasted to,\n // it likely contains hidden column data. We need to reconstruct the original\n // column order that was copied by finding which columns would have been included.\n if (clipboardRow.values.length > selectedColIds.length) {\n // The clipboard data was created from consecutive columns in grid order.\n // We need to find which consecutive columns would result in this clipboard data.\n // Start from the first visible column and extend the range to match clipboard length.\n const firstVisibleColIndex = gridMap.colIdToIndex.get(selectedColIds[0]) ?? 0\n\n // Get all columns sorted by grid position\n const allGridColumns = Array.from(gridMap.colIdToIndex.keys())\n .filter((id) => id !== ROW_SELECTION_COLUMN_ID)\n .sort((a, b) => {\n const indexA = gridMap.colIdToIndex.get(a) ?? Infinity\n const indexB = gridMap.colIdToIndex.get(b) ?? Infinity\n return indexA - indexB\n })\n\n // Find the starting position in the grid columns array\n const startGridPos = allGridColumns.findIndex(\n (id) => gridMap.colIdToIndex.get(id) === firstVisibleColIndex,\n )\n\n // The original copied columns are the consecutive ones starting from this position\n const originalCopiedColumns = allGridColumns.slice(\n startGridPos,\n startGridPos + clipboardRow.values.length,\n )\n\n // Find this column's position in the original copied columns\n const clipboardColIndex = originalCopiedColumns.indexOf(colId)\n pasteValue =\n clipboardRow.values[clipboardColIndex] ||\n clipboardRow.values[clipboardColIndex % clipboardRow.values.length]\n // Pasting value from hidden columns detection\n } else {\n // Normal case: map clipboard column index using modulo\n const pasteColIndex = colIndex % clipboardRow.values.length\n pasteValue = clipboardRow.values[pasteColIndex]\n // Pasting value normally\n }\n }\n\n let fieldToUpdate = colId.split('_').pop() || colId\n\n // Special handling for subType (convert to folderType or taskType)\n if (colId === 'subType') {\n fieldToUpdate = isFolder ? 'folderType' : 'taskType'\n isAttrib = false\n\n // Skip empty values for enum fields\n if (!pasteValue) continue\n }\n\n // Process the value based on its type\n const processedValue = processFieldValue(pasteValue, fieldValueType)\n\n // Get or create entity entry in the map\n const entityKey = `${rowId}-${entityType}`\n if (!entitiesToUpdateMap.has(entityKey) && entityType) {\n entitiesToUpdateMap.set(entityKey, {\n rowId,\n id: rowId,\n type: entityType,\n fields: {},\n attrib: {},\n links: {},\n })\n }\n\n const entityData = entitiesToUpdateMap.get(entityKey)!\n\n // Add the field to the appropriate place\n if (isLink) {\n const [_link, linkType, inType, outType, direction] = colId.split('_')\n // final-task|folder|task\n entityData.links[`${linkType}|${inType}|${outType}_${direction}`] = processedValue\n } else if (isAttrib) {\n entityData.attrib[fieldToUpdate] = processedValue\n } else {\n entityData.fields[fieldToUpdate] = processedValue\n }\n }\n }\n\n // Convert the consolidated map to EntityUpdate array and LinkUpdate array\n const allEntityUpdates: EntityUpdate[] = []\n const linkUpdatesMap = new Map<string, LinkUpdate>()\n\n entitiesToUpdateMap.forEach((entity) => {\n // For regular fields, create one update per field\n Object.entries(entity.fields).forEach(([field, value]) => {\n allEntityUpdates.push({\n rowId: entity.rowId,\n id: entity.id,\n type: entity.type,\n field,\n value,\n })\n })\n\n // For attributes, create one update per attribute\n Object.entries(entity.attrib).forEach(([field, value]) => {\n allEntityUpdates.push({\n rowId: entity.rowId,\n id: entity.id,\n type: entity.type,\n field,\n value,\n isAttrib: true,\n })\n })\n\n // For links, create LinkUpdate objects\n Object.entries(entity.links).forEach(([linkKey, targetEntityIds]) => {\n // Parse the linkKey: \"linkType|inType|outType_direction\"\n const [linkTypePart, direction] = linkKey.split('_')\n const linkTypeParts = linkTypePart.split('|')\n\n if (linkTypeParts.length >= 3) {\n const linkTypeName = linkTypeParts[0]\n const inType = linkTypeParts[1]\n const outType = linkTypeParts[2]\n\n // Reconstruct the full linkType in the required format: name|input_type|output_type\n const linkType = `${linkTypeName}|${inType}|${outType}`\n\n // Determine target entity type based on direction\n const targetEntityType = direction === 'out' ? outType : inType\n\n // Create a unique key for this link operation\n const linkUpdateKey = `${entity.id}-${linkType}-${direction}`\n\n linkUpdatesMap.set(linkUpdateKey, {\n rowId: entity.rowId,\n sourceEntityId: entity.id,\n sourceEntityType: entity.type,\n linkType,\n direction: direction as 'in' | 'out',\n targetEntityType,\n operation: method,\n targetEntityIds: Array.isArray(targetEntityIds) ? targetEntityIds : [],\n })\n }\n })\n })\n\n const allLinkUpdates = Array.from(linkUpdatesMap.values())\n\n // Make separate calls to update entities and links\n const updatePromises: Promise<void>[] = []\n\n if (allEntityUpdates.length > 0) {\n updatePromises.push(updateEntities(allEntityUpdates))\n }\n\n if (allLinkUpdates.length > 0) {\n updatePromises.push(pasteTableLinks(allLinkUpdates))\n }\n\n if (updatePromises.length > 0) {\n try {\n await Promise.all(updatePromises)\n } catch (error: any) {\n console.error('Error updating entities:', error)\n clipboardError(`Paste failed: ${error || error?.message || 'Unknown error'}`)\n }\n }\n },\n [\n selectedCells,\n gridMap,\n entitiesMap,\n updateEntities,\n pasteTableLinks,\n columnEnums,\n getEntityById,\n visibleColumns,\n attribFields,\n ],\n )\n\n // Set up keyboard event listeners\n useEffect(() => {\n const handleKeyDown = async (e: KeyboardEvent) => {\n // Copy functionality (Ctrl+C or Command+C)\n if ((e.ctrlKey || e.metaKey) && e.key === 'c') {\n\n const activeEl = document.activeElement as HTMLElement | null\n\n // Check if the active element is part of the table (td, th, table elements)\n const isTableFocused =\n activeEl?.closest('table') !== null ||\n activeEl?.closest('.table-container') !== null ||\n activeEl?.tagName === 'TD' ||\n activeEl?.tagName === 'TH'\n\n if (isTableFocused && selectedCells.size > 0) {\n copyToClipboard()\n }\n }\n\n // Paste functionality (Ctrl+V or Command+V)\n if ((e.ctrlKey || e.metaKey) && e.key === 'v') {\n // don't execute paste if focus is inside an input, textarea, or content‐editable element\n const activeEl = document.activeElement as HTMLElement | null\n\n if (\n activeEl &&\n (activeEl.tagName === 'INPUT' ||\n activeEl.tagName === 'TEXTAREA' ||\n activeEl.isContentEditable)\n ) {\n // focus is inside an input, textarea, or content-editable element\n const allEntityIds = await doesClipboardContainId()\n // we might still want to paste if the clipboard contains valid entity IDs\n if (allEntityIds) {\n // prevent pasting into input fields and handle as paste on the cell\n e.preventDefault()\n } else {\n // skip pasting\n return\n }\n }\n pasteFromClipboard(Array.from(selectedCells), {\n method: e.shiftKey ? 'merge' : 'replace', // Use shift key to determine paste method\n })\n }\n }\n\n window.addEventListener('keydown', handleKeyDown)\n return () => {\n window.removeEventListener('keydown', handleKeyDown)\n }\n }, [copyToClipboard, pasteFromClipboard])\n\n const value = useMemo(\n () => ({\n copyToClipboard,\n pasteFromClipboard,\n exportCSV,\n }),\n [copyToClipboard, pasteFromClipboard],\n )\n\n return <ClipboardContext.Provider value={value}>{children}</ClipboardContext.Provider>\n}\n\nexport const useClipboard = (): ClipboardContextType => {\n const context = useContext(ClipboardContext)\n if (context === undefined) {\n throw new Error('useClipboard must be used within a ClipboardProvider')\n }\n return context\n}\n"],"names":["ClipboardContext","createContext","ClipboardProvider","children","entitiesMap","columnEnums","columnReadOnly","visibleColumns","selectedCells","gridMap","focusedCellId","useSelectionCellsContext","updateEntities","useCellEditing","pasteTableLinks","usePasteLinks","getEntityById","attribFields","useProjectTableContext","getSelectionData","useCallback","selected","config","headers","fullRow","visibleColumnIds","col","id","ROW_SELECTION_COLUMN_ID","cellsByRow","cellId","position","parseCellId","rowId","colId","sortedRows","a","b","indexA","indexB","clipboardText","firstRowId","colIds","headerValues","columnName","entity","filteredColIds","rowValues","cellValue","getLinkEntityIdsByColumnId","foundValue","getCellValue","field","f","getEntityPath","error","doesClipboardContainId","getClipboardString","parsedData","parseClipboardText","row","value","v","validateEntityId","copyToClipboard","clipboardError","exportCSV","projectName","blob","url","selectedCount","pasteFromClipboard","method","isSingleCellValue","mapClipboardToVisibleColumns","clipboardRow","clipboardHeaders","mappedValues","header","index","matchingColId","firstRow","selectedColIds","rowIndex","isFolder","getEntityDataById","pasteRowIndex","pasteValue","validateClipboardData","entitiesToUpdateMap","colIndex","isAttrib","isLink","fieldValueType","fieldName","attribField","entityType","firstVisibleColIndex","allGridColumns","startGridPos","clipboardColIndex","pasteColIndex","fieldToUpdate","processedValue","processFieldValue","entityKey","entityData","_link","linkType","inType","outType","direction","allEntityUpdates","linkUpdatesMap","linkKey","targetEntityIds","linkTypePart","linkTypeParts","linkTypeName","targetEntityType","linkUpdateKey","allLinkUpdates","updatePromises","useEffect","handleKeyDown","e","activeEl","useMemo","jsx","useClipboard","context","useContext"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ClipboardContext.es.js","sources":["../../../../../../src/containers/ProjectTreeTable/context/ClipboardContext.tsx"],"sourcesContent":["import React, { createContext, useContext, useCallback, useMemo, useEffect } from 'react'\n\n// Contexts\nimport { ROW_SELECTION_COLUMN_ID, useSelectionCellsContext } from './SelectionCellsContext'\nimport { useCellEditing } from './CellEditingContext'\n\n// Utils\nimport {\n getCellValue,\n getEntityDataById,\n getLinkEntityIdsByColumnId,\n parseCellId,\n} from '../utils/cellUtils'\n\n// Types\nimport { EntityUpdate } from '../hooks/useUpdateTableData'\nimport usePasteLinks, { LinkUpdate } from '../hooks/usePasteLinks'\n\n// Import from the new modular files\nimport {\n getEntityPath,\n parseClipboardText,\n clipboardError,\n processFieldValue,\n} from './clipboard/clipboardUtils'\nimport { validateClipboardData } from './clipboard/clipboardValidation'\nimport { ClipboardContextType, ClipboardProviderProps } from './clipboard/clipboardTypes'\nimport { useProjectTableContext } from './ProjectTableContext'\nimport { validateEntityId } from '@shared/util'\n\nconst ClipboardContext = createContext<ClipboardContextType | undefined>(undefined)\n\nexport const ClipboardProvider: React.FC<ClipboardProviderProps> = ({\n children,\n entitiesMap,\n columnEnums,\n columnReadOnly,\n visibleColumns,\n}) => {\n // Get selection information from SelectionContext\n const { selectedCells, gridMap, focusedCellId } = useSelectionCellsContext()\n const { updateEntities } = useCellEditing()\n const { pasteTableLinks } = usePasteLinks()\n const { getEntityById, attribFields } = useProjectTableContext()\n\n const getSelectionData = useCallback(\n async (selected: string[], config?: { headers?: boolean; fullRow?: boolean }) => {\n const { headers, fullRow } = config || {}\n try {\n // Get visible columns in display order, excluding row selection\n const visibleColumnIds = visibleColumns\n .map((col) => col.id)\n .filter((id) => id !== ROW_SELECTION_COLUMN_ID)\n\n // Organize selected cells by row, filtering to only visible columns\n const cellsByRow = new Map<string, Set<string>>()\n\n // Parse all selected cells and organize by rowId and colId\n selected.forEach((cellId) => {\n const position = parseCellId(cellId)\n if (!position) return\n\n const { rowId, colId } = position\n if (colId === ROW_SELECTION_COLUMN_ID || !visibleColumnIds.includes(colId)) return\n\n if (!cellsByRow.has(rowId)) {\n cellsByRow.set(rowId, new Set())\n }\n\n cellsByRow.get(rowId)?.add(colId)\n })\n\n if (fullRow) {\n const selectedRows = selected\n .filter(\n (cellId) =>\n parseCellId(cellId)?.rowId &&\n parseCellId(cellId)?.colId === ROW_SELECTION_COLUMN_ID,\n )\n .map((cellId) => parseCellId(cellId)?.rowId) as string[]\n\n // select the whole row\n // For rows with selection cells, add all available columns\n selectedRows.forEach((rowId) => {\n // add the rowId if it doesn't exist\n if (!cellsByRow.has(rowId)) {\n cellsByRow.set(rowId, new Set())\n }\n const allColumns = Array.from(gridMap.colIdToIndex.keys())\n allColumns.forEach((colId) => {\n cellsByRow.get(rowId)?.add(colId)\n })\n })\n }\n\n // Get sorted row IDs based on their index in the grid\n const sortedRows = Array.from(cellsByRow.keys()).sort((a, b) => {\n const indexA = gridMap.rowIdToIndex.get(a) ?? Infinity\n const indexB = gridMap.rowIdToIndex.get(b) ?? Infinity\n return indexA - indexB\n })\n\n // Build clipboard text\n let clipboardText = ''\n\n // Get the first row to determine columns\n const firstRowId = sortedRows[0]\n if (!firstRowId) return ''\n\n // Get all column IDs for the first row, sorted by their index in the grid\n const colIds = Array.from(cellsByRow.get(firstRowId) || []).sort((a, b) => {\n const indexA = gridMap.colIdToIndex.get(a) ?? Infinity\n const indexB = gridMap.colIdToIndex.get(b) ?? Infinity\n return indexA - indexB\n })\n\n // Include headers if requested\n if (headers && colIds.length > 0) {\n const headerValues: string[] = []\n\n for (const colId of colIds) {\n // Use colId as the column name since we don't have direct access to column names\n const columnName = colId\n headerValues.push(`${columnName.replace(/\"/g, '\"\"')}`)\n }\n\n clipboardText += headerValues.join('\\t') + '\\n'\n }\n\n for (const rowId of sortedRows) {\n // Get the entity for this row\n const entity = getEntityById(rowId)\n\n if (!entity) {\n console.warn(`Entity not found for rowId: ${rowId}`)\n continue\n }\n\n // Get all column IDs for this row, sorted by their index in the grid\n const colIds = Array.from(cellsByRow.get(rowId) || []).sort((a, b) => {\n const indexA = gridMap.colIdToIndex.get(a) ?? Infinity\n const indexB = gridMap.colIdToIndex.get(b) ?? Infinity\n return indexA - indexB\n })\n\n // Filter out the row selection column from the copied data\n const filteredColIds = colIds.filter((colId) => colId !== ROW_SELECTION_COLUMN_ID)\n\n const rowValues: string[] = []\n\n // For each column in this row\n for (const colId of filteredColIds) {\n // Determine the value based on the column ID\n let cellValue = ''\n\n // special handling of link cells\n if (colId.startsWith('link_')) {\n // @ts-expect-error - only complaining about missing __typename\n cellValue = getLinkEntityIdsByColumnId(entity.links, colId)\n } else {\n // @ts-ignore\n let foundValue = getCellValue(entity, colId)\n\n if (!foundValue) {\n // we should look for the default value set out in attribFields\n const field = attribFields.find((f) => f.name === colId.replace('attrib_', ''))\n if (field && field.data.type === 'boolean') {\n foundValue = false // default boolean value\n } else if (field && field.data.type.includes('list_of')) {\n foundValue = [] // default list value\n }\n }\n\n // convert to string if foundValue is not undefined or null use empty string otherwise\n cellValue = foundValue !== undefined && foundValue !== null ? String(foundValue) : ''\n\n // Special handling for name field - include full path\n if (colId === 'name') {\n cellValue = getEntityPath(entity.entityId || entity.id, entitiesMap)\n }\n\n if (colId === 'subType') {\n // get folderType or taskType\n if ('folderType' in entity) {\n cellValue = entity.folderType || ''\n }\n if ('taskType' in entity) {\n cellValue = entity.taskType || ''\n }\n }\n }\n\n // Escape double quotes in the cell value and wrap in quotes\n rowValues.push(`${cellValue.replace(/\"/g, '\"\"')}`)\n }\n\n // Add row to clipboard text\n clipboardText += rowValues.join('\\t') + '\\n'\n }\n\n return clipboardText\n } catch (error) {\n console.error('Failed to copy to clipboard:', error)\n }\n },\n [selectedCells, focusedCellId, gridMap, entitiesMap, getEntityById, visibleColumns],\n )\n\n const doesClipboardContainId = async () => {\n // check if the clipboard contains a valid ID\n const clipboardText = await getClipboardString()\n if (!clipboardText) return false\n const parsedData = parseClipboardText(clipboardText)\n if (parsedData.length === 0) return false\n return parsedData.every((row) => {\n return row.values.every((value) => value.split(',').every((v) => validateEntityId(v)))\n })\n }\n\n const copyToClipboard: ClipboardContextType['copyToClipboard'] = useCallback(\n async (selected, fullRow) => {\n selected = selected || Array.from(selectedCells)\n if (!selected.length) return\n const clipboardText = await getSelectionData(selected, { fullRow })\n if (!clipboardText) {\n return\n }\n if (!navigator.clipboard) {\n clipboardError('Clipboard API not supported in this browser.')\n return\n }\n if (!window.isSecureContext) {\n clipboardError('Clipboard operations require a secure HTTPS context.')\n return\n }\n try {\n await navigator.clipboard.writeText(clipboardText)\n } catch (error: any) {\n clipboardError(`Failed to copy to clipboard: ${error.message}`)\n }\n },\n [selectedCells, entitiesMap, gridMap],\n )\n\n const exportCSV: ClipboardContextType['exportCSV'] = useCallback(\n async (selected, projectName, fullRow) => {\n selected = selected || Array.from(selectedCells)\n if (!selected.length) return\n\n try {\n // Get clipboard text with headers included for CSV export\n const clipboardText = await getSelectionData(selected, { headers: true, fullRow })\n if (!clipboardText) return\n\n // create a csv file and download it\n const blob = new Blob([clipboardText], { type: 'text/csv' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n const selectedCount = selected.length\n a.download = `${projectName}-export-${selectedCount}_cells-${new Date()\n .toISOString()\n .slice(0, 10)}.csv`\n a.click()\n URL.revokeObjectURL(url)\n } catch (error) {\n console.error('Failed to copy to clipboard:', error)\n }\n },\n [selectedCells, entitiesMap, gridMap, getSelectionData],\n )\n\n const getClipboardString = async (): Promise<string | void> => {\n if (!navigator.clipboard) {\n clipboardError('Clipboard API not supported in this browser.')\n return\n }\n if (!window.isSecureContext) {\n clipboardError('Clipboard operations require a secure HTTPS context.')\n return\n }\n let clipboardText: string\n try {\n clipboardText = await navigator.clipboard.readText()\n return clipboardText\n } catch (error: any) {\n clipboardError(`Failed to read from clipboard: ${error.message}`)\n return\n }\n }\n\n const pasteFromClipboard: ClipboardContextType['pasteFromClipboard'] = useCallback(\n async (selected, config) => {\n const { method = 'replace' } = config || {}\n if (!selected.length) return\n\n const clipboardText = await getClipboardString()\n if (!clipboardText) return\n\n // Parse the clipboard text\n const parsedData = parseClipboardText(clipboardText)\n if (!parsedData.length) return\n\n // Determine if we have a single value in the clipboard (one row, one column)\n const isSingleCellValue = parsedData.length === 1 && parsedData[0].values.length === 1\n\n // Get visible columns in display order, excluding row selection\n const visibleColumnIds = visibleColumns\n .map((col) => col.id)\n .filter((id) => id !== ROW_SELECTION_COLUMN_ID)\n\n // Helper function to map clipboard values to visible columns\n const mapClipboardToVisibleColumns = (\n clipboardRow: any,\n visibleColumnIds: string[],\n clipboardHeaders?: string[],\n ) => {\n const mappedValues: Record<string, string> = {}\n\n if (clipboardHeaders && clipboardHeaders.length > 0) {\n // Map by header names when available\n clipboardHeaders.forEach((header: string, index: number) => {\n const matchingColId = visibleColumnIds.find(\n (colId) =>\n colId === header ||\n colId.replace('attrib_', '') === header ||\n colId === `attrib_${header}` ||\n colId.toLowerCase() === header.toLowerCase(),\n )\n\n if (matchingColId && index < clipboardRow.values.length) {\n mappedValues[matchingColId] = clipboardRow.values[index]\n }\n })\n } else {\n // Fallback: map by position, but only to visible columns\n visibleColumnIds.forEach((colId, index) => {\n if (index < clipboardRow.values.length) {\n mappedValues[colId] = clipboardRow.values[index]\n }\n })\n }\n\n return mappedValues\n }\n\n // Extract headers if they exist (assuming first row might be headers from external source)\n // You might need to detect this differently based on your clipboard format\n const clipboardHeaders = parsedData[0]?.colIds || undefined\n\n // Organize selected cells by row, filtering to only visible columns\n const cellsByRow = new Map<string, Set<string>>()\n\n Array.from(selected).forEach((cellId) => {\n const position = parseCellId(cellId)\n if (!position) return\n\n const { rowId, colId } = position\n if (colId === ROW_SELECTION_COLUMN_ID || !visibleColumnIds.includes(colId)) return\n\n if (!cellsByRow.has(rowId)) {\n cellsByRow.set(rowId, new Set())\n }\n cellsByRow.get(rowId)?.add(colId)\n })\n\n // Get sorted row IDs and column IDs\n const sortedRows = Array.from(cellsByRow.keys()).sort((a, b) => {\n const indexA = gridMap.rowIdToIndex.get(a) ?? Infinity\n const indexB = gridMap.rowIdToIndex.get(b) ?? Infinity\n return indexA - indexB\n })\n\n const firstRow = sortedRows[0]\n const selectedColIds = Array.from(cellsByRow.get(firstRow) || []).sort((a, b) => {\n const indexA = gridMap.colIdToIndex.get(a) ?? Infinity\n const indexB = gridMap.colIdToIndex.get(b) ?? Infinity\n return indexA - indexB\n })\n\n // First pass: validate all values\n for (let rowIndex = 0; rowIndex < sortedRows.length; rowIndex++) {\n const rowId = sortedRows[rowIndex]\n const isFolder = getEntityDataById<'folder'>(rowId, entitiesMap)?.entityType === 'folder'\n\n const pasteRowIndex = rowIndex % parsedData.length\n const clipboardRow = parsedData[pasteRowIndex]\n\n // Map clipboard data to visible columns\n const mappedValues = isSingleCellValue\n ? { [selectedColIds[0]]: parsedData[0].values[0] }\n : mapClipboardToVisibleColumns(clipboardRow, selectedColIds, clipboardHeaders)\n\n // Validate each mapped value\n for (const colId of selectedColIds) {\n const pasteValue = mappedValues[colId] || ''\n\n const isValid = validateClipboardData({\n colId,\n isFolder,\n pasteValue,\n parsedData,\n columnEnums,\n columnReadOnly,\n rowIndex,\n colIndex: selectedColIds.indexOf(colId),\n isSingleCellValue,\n attribFields,\n })\n\n if (!isValid) return\n }\n }\n\n // Create a map to consolidate updates for the same entity\n const entitiesToUpdateMap = new Map<\n string,\n {\n rowId: string\n id: string\n type: string\n fields: Record<string, any>\n attrib: Record<string, any>\n links: Record<string, string[]>\n }\n >()\n\n // For each column, prepare updates\n for (let colIndex = 0; colIndex < selectedColIds.length; colIndex++) {\n const colId = selectedColIds[colIndex]\n\n // Skip special handling for 'name' which we don't want to paste\n if (colId === 'name') continue\n\n // Check if this is an attribute field by examining the first entity\n let isAttrib = false,\n isLink = false\n // Check if the field potentially contains array values\n let fieldValueType: 'string' | 'number' | 'boolean' | 'array' = 'string'\n\n if (sortedRows.length > 0) {\n const firstRowId = sortedRows[0]\n const entity = getEntityById(firstRowId)\n if (entity) {\n isAttrib = colId.startsWith('attrib_')\n isLink = colId.startsWith('link_')\n\n // Determine field type based on type or attrib type\n if (colId === 'status' || colId === 'subType') {\n // status and subType are strings\n fieldValueType = 'string'\n // special case to avoid treating subType as attrib (not sure if this is needed)\n isAttrib = false\n } else if (colId === 'tags' || colId === 'assignees') {\n // tags and assignees are always arrays\n fieldValueType = 'array'\n } else if (isAttrib) {\n // find type based on attribFields\n const fieldName = colId.replace('attrib_', '')\n const attribField = attribFields.find((f) => f.name === fieldName)\n if (attribField) {\n const dataType = attribField.data.type\n switch (dataType) {\n case 'boolean':\n fieldValueType = 'boolean'\n break\n case 'float':\n case 'integer':\n fieldValueType = 'number'\n break\n case 'list_of_strings':\n case 'list_of_any':\n case 'list_of_integers':\n case 'list_of_submodels':\n fieldValueType = 'array'\n break\n default:\n // everything else is string\n fieldValueType = 'string'\n }\n }\n } else if (isLink) {\n // links are always arrays\n fieldValueType = 'array'\n }\n }\n }\n\n // Process each row individually\n for (let rowIndex = 0; rowIndex < sortedRows.length; rowIndex++) {\n const rowId = sortedRows[rowIndex]\n const entityType = getEntityDataById(rowId, entitiesMap)?.entityType\n const isFolder = entityType === 'folder'\n\n // Get the appropriate value from the clipboard data\n let pasteValue\n if (isSingleCellValue) {\n pasteValue = parsedData[0].values[0]\n } else {\n const pasteRowIndex = rowIndex % parsedData.length\n // Map visible column index to clipboard data index\n // When clipboard contains hidden columns, we need to skip over values\n // that correspond to hidden columns when pasting to visible columns\n const clipboardRow = parsedData[pasteRowIndex]\n\n // If clipboard has more values than visible columns being pasted to,\n // it likely contains hidden column data. We need to reconstruct the original\n // column order that was copied by finding which columns would have been included.\n if (clipboardRow.values.length > selectedColIds.length) {\n // The clipboard data was created from consecutive columns in grid order.\n // We need to find which consecutive columns would result in this clipboard data.\n // Start from the first visible column and extend the range to match clipboard length.\n const firstVisibleColIndex = gridMap.colIdToIndex.get(selectedColIds[0]) ?? 0\n\n // Get all columns sorted by grid position\n const allGridColumns = Array.from(gridMap.colIdToIndex.keys())\n .filter((id) => id !== ROW_SELECTION_COLUMN_ID)\n .sort((a, b) => {\n const indexA = gridMap.colIdToIndex.get(a) ?? Infinity\n const indexB = gridMap.colIdToIndex.get(b) ?? Infinity\n return indexA - indexB\n })\n\n // Find the starting position in the grid columns array\n const startGridPos = allGridColumns.findIndex(\n (id) => gridMap.colIdToIndex.get(id) === firstVisibleColIndex,\n )\n\n // The original copied columns are the consecutive ones starting from this position\n const originalCopiedColumns = allGridColumns.slice(\n startGridPos,\n startGridPos + clipboardRow.values.length,\n )\n\n // Find this column's position in the original copied columns\n const clipboardColIndex = originalCopiedColumns.indexOf(colId)\n pasteValue =\n clipboardRow.values[clipboardColIndex] ||\n clipboardRow.values[clipboardColIndex % clipboardRow.values.length]\n // Pasting value from hidden columns detection\n } else {\n // Normal case: map clipboard column index using modulo\n const pasteColIndex = colIndex % clipboardRow.values.length\n pasteValue = clipboardRow.values[pasteColIndex]\n // Pasting value normally\n }\n }\n\n let fieldToUpdate = colId.split('_').pop() || colId\n\n // Special handling for subType (convert to folderType or taskType)\n if (colId === 'subType') {\n fieldToUpdate = isFolder ? 'folderType' : 'taskType'\n isAttrib = false\n\n // Skip empty values for enum fields\n if (!pasteValue) continue\n }\n\n // Process the value based on its type\n const processedValue = processFieldValue(pasteValue, fieldValueType)\n\n // Get or create entity entry in the map\n const entityKey = `${rowId}-${entityType}`\n if (!entitiesToUpdateMap.has(entityKey) && entityType) {\n entitiesToUpdateMap.set(entityKey, {\n rowId,\n id: rowId,\n type: entityType,\n fields: {},\n attrib: {},\n links: {},\n })\n }\n\n const entityData = entitiesToUpdateMap.get(entityKey)!\n\n // Add the field to the appropriate place\n if (isLink) {\n const [_link, linkType, inType, outType, direction] = colId.split('_')\n // final-task|folder|task\n entityData.links[`${linkType}|${inType}|${outType}_${direction}`] = processedValue\n } else if (isAttrib) {\n entityData.attrib[fieldToUpdate] = processedValue\n } else {\n entityData.fields[fieldToUpdate] = processedValue\n }\n }\n }\n\n // Convert the consolidated map to EntityUpdate array and LinkUpdate array\n const allEntityUpdates: EntityUpdate[] = []\n const linkUpdatesMap = new Map<string, LinkUpdate>()\n\n entitiesToUpdateMap.forEach((entity) => {\n // For regular fields, create one update per field\n Object.entries(entity.fields).forEach(([field, value]) => {\n allEntityUpdates.push({\n rowId: entity.rowId,\n id: entity.id,\n type: entity.type,\n field,\n value,\n })\n })\n\n // For attributes, create one update per attribute\n Object.entries(entity.attrib).forEach(([field, value]) => {\n allEntityUpdates.push({\n rowId: entity.rowId,\n id: entity.id,\n type: entity.type,\n field,\n value,\n isAttrib: true,\n })\n })\n\n // For links, create LinkUpdate objects\n Object.entries(entity.links).forEach(([linkKey, targetEntityIds]) => {\n // Parse the linkKey: \"linkType|inType|outType_direction\"\n const [linkTypePart, direction] = linkKey.split('_')\n const linkTypeParts = linkTypePart.split('|')\n\n if (linkTypeParts.length >= 3) {\n const linkTypeName = linkTypeParts[0]\n const inType = linkTypeParts[1]\n const outType = linkTypeParts[2]\n\n // Reconstruct the full linkType in the required format: name|input_type|output_type\n const linkType = `${linkTypeName}|${inType}|${outType}`\n\n // Determine target entity type based on direction\n const targetEntityType = direction === 'out' ? outType : inType\n\n // Create a unique key for this link operation\n const linkUpdateKey = `${entity.id}-${linkType}-${direction}`\n\n linkUpdatesMap.set(linkUpdateKey, {\n rowId: entity.rowId,\n sourceEntityId: entity.id,\n sourceEntityType: entity.type,\n linkType,\n direction: direction as 'in' | 'out',\n targetEntityType,\n operation: method,\n targetEntityIds: Array.isArray(targetEntityIds) ? targetEntityIds : [],\n })\n }\n })\n })\n\n const allLinkUpdates = Array.from(linkUpdatesMap.values())\n\n // Make separate calls to update entities and links\n const updatePromises: Promise<void>[] = []\n\n if (allEntityUpdates.length > 0) {\n updatePromises.push(updateEntities(allEntityUpdates))\n }\n\n if (allLinkUpdates.length > 0) {\n updatePromises.push(pasteTableLinks(allLinkUpdates))\n }\n\n if (updatePromises.length > 0) {\n try {\n await Promise.all(updatePromises)\n } catch (error: any) {\n console.error('Error updating entities:', error)\n clipboardError(`Paste failed: ${error || error?.message || 'Unknown error'}`)\n }\n }\n },\n [\n selectedCells,\n gridMap,\n entitiesMap,\n updateEntities,\n pasteTableLinks,\n columnEnums,\n getEntityById,\n visibleColumns,\n attribFields,\n ],\n )\n\n // Set up keyboard event listeners\n useEffect(() => {\n const handleKeyDown = async (e: KeyboardEvent) => {\n // Copy functionality (Ctrl+C or Command+C)\n if ((e.ctrlKey || e.metaKey) && e.key === 'c') {\n copyToClipboard()\n }\n\n // Paste functionality (Ctrl+V or Command+V)\n if ((e.ctrlKey || e.metaKey) && e.key === 'v') {\n // don't execute paste if focus is inside an input, textarea, or content‐editable element\n const activeEl = document.activeElement as HTMLElement | null\n\n if (\n activeEl &&\n (activeEl.tagName === 'INPUT' ||\n activeEl.tagName === 'TEXTAREA' ||\n activeEl.isContentEditable)\n ) {\n // focus is inside an input, textarea, or content-editable element\n const allEntityIds = await doesClipboardContainId()\n // we might still want to paste if the clipboard contains valid entity IDs\n if (allEntityIds) {\n // prevent pasting into input fields and handle as paste on the cell\n e.preventDefault()\n } else {\n // skip pasting\n return\n }\n }\n pasteFromClipboard(Array.from(selectedCells), {\n method: e.shiftKey ? 'merge' : 'replace', // Use shift key to determine paste method\n })\n }\n }\n\n window.addEventListener('keydown', handleKeyDown)\n return () => {\n window.removeEventListener('keydown', handleKeyDown)\n }\n }, [copyToClipboard, pasteFromClipboard])\n\n const value = useMemo(\n () => ({\n copyToClipboard,\n pasteFromClipboard,\n exportCSV,\n }),\n [copyToClipboard, pasteFromClipboard],\n )\n\n return <ClipboardContext.Provider value={value}>{children}</ClipboardContext.Provider>\n}\n\nexport const useClipboard = (): ClipboardContextType => {\n const context = useContext(ClipboardContext)\n if (context === undefined) {\n throw new Error('useClipboard must be used within a ClipboardProvider')\n }\n return context\n}\n"],"names":["ClipboardContext","createContext","ClipboardProvider","children","entitiesMap","columnEnums","columnReadOnly","visibleColumns","selectedCells","gridMap","focusedCellId","useSelectionCellsContext","updateEntities","useCellEditing","pasteTableLinks","usePasteLinks","getEntityById","attribFields","useProjectTableContext","getSelectionData","useCallback","selected","config","headers","fullRow","visibleColumnIds","col","id","ROW_SELECTION_COLUMN_ID","cellsByRow","cellId","position","parseCellId","rowId","colId","sortedRows","a","b","indexA","indexB","clipboardText","firstRowId","colIds","headerValues","columnName","entity","filteredColIds","rowValues","cellValue","getLinkEntityIdsByColumnId","foundValue","getCellValue","field","f","getEntityPath","error","doesClipboardContainId","getClipboardString","parsedData","parseClipboardText","row","value","v","validateEntityId","copyToClipboard","clipboardError","exportCSV","projectName","blob","url","selectedCount","pasteFromClipboard","method","isSingleCellValue","mapClipboardToVisibleColumns","clipboardRow","clipboardHeaders","mappedValues","header","index","matchingColId","firstRow","selectedColIds","rowIndex","isFolder","getEntityDataById","pasteRowIndex","pasteValue","validateClipboardData","entitiesToUpdateMap","colIndex","isAttrib","isLink","fieldValueType","fieldName","attribField","entityType","firstVisibleColIndex","allGridColumns","startGridPos","clipboardColIndex","pasteColIndex","fieldToUpdate","processedValue","processFieldValue","entityKey","entityData","_link","linkType","inType","outType","direction","allEntityUpdates","linkUpdatesMap","linkKey","targetEntityIds","linkTypePart","linkTypeParts","linkTypeName","targetEntityType","linkUpdateKey","allLinkUpdates","updatePromises","useEffect","handleKeyDown","e","activeEl","useMemo","jsx","useClipboard","context","useContext"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const h=require("./useGetEntityTypeData.cjs.js"),E=require("react");require("@ynput/ayon-react-components");require("short-uuid");require("react-toastify");require("lodash");require("uuid");require("../../../util/pubsub.cjs.js");require("../context/CellEditingContext.cjs.js");require("../../../../../_virtual/jsx-runtime.cjs.js");require("../context/SelectionCellsContext.cjs.js");require("../context/ProjectTableQueriesContext.cjs.js");require("../context/ProjectTableContext.cjs.js");require("../../../context/RemoteModulesContext.cjs.js");require("../../../context/DetailsPanelContext.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 P=require("../../../context/ProjectContext.cjs.js");require("../../../context/ProjectFoldersContext.cjs.js");require("../../../context/UriContext.cjs.js");require("../context/ClipboardContext.cjs.js");require("@tanstack/react-table");require("@tanstack/react-virtual");require("clsx");require("../widgets/CollapsedWidget.cjs.js");require("../widgets/DateWidget.cjs.js");require("../widgets/EnumWidget.cjs.js");require("../widgets/TextWidget.cjs.js");require("../widgets/BooleanWidget.cjs.js");require("../widgets/CellWidget.cjs.js");require("../widgets/EntityNameWidget.cjs.js");require("../widgets/GroupHeaderWidget.cjs.js");require("../widgets/ThumbnailWidget.cjs.js");require("../../../components/AddonLoadingScreen/AddonLoadingScreen.cjs.js");require("../../../../../node_modules/match-sorter/dist/match-sorter.esm.cjs.js");require("../../../components/AccessSearchInput/AccessSearchInput.styled.cjs.js");require("../../../components/AccessUser/AccessUser.cjs.js");require("../../../components/AttributeEditor/components/MinMaxField.cjs.js");require("@dnd-kit/core");require("@dnd-kit/sortable");require("../../../components/EnumEditor/EnumEditor.styled.cjs.js");require("../../../components/Badge/Badge.cjs.js");require("../../../components/Chips/Chips.cjs.js");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/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");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/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/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");require("../../../components/DetailsPanelAttributes/DetailsPanelAttributesEditor.cjs.js");require("../../../components/DetailsPanelDetails/DetailsPanelDetails.cjs.js");require("../../../components/DetailsPanelDetails/DetailsSection.cjs.js");require("../../../components/DetailsPanelDetails/FieldLabel.cjs.js");require("../../../components/EarlyPreview/EarlyPreview.cjs.js");require("../../../components/EmptyPlaceholder/EmptyPlaceholder.cjs.js");require("../../../components/EmptyPlaceholder/EmptyPlaceholderFlex.styled.cjs.js");require("../../ContextMenu/ContextMenuContext.cjs.js");;/* empty css */require("../../Feed/context/FeedContext.cjs.js");require("../../Feed/components/Tooltips/UserTooltip/UserTooltip.styled.cjs.js");require("../../Feed/components/Tooltips/EntityTooltip/EntityTooltip.styled.cjs.js");require("../../Feed/components/FileUploadPreview/FileUploadPreview.styled.cjs.js");require("../../Feed/components/FileUploadPreview/Mimes/TextMime.cjs.js");require("react-markdown");require("remark-emoji");require("remark-gfm");require("remark-directive");require("remark-directive-rehype");require("../../Feed/components/CommentInput/CommentInput.cjs.js");require("../../Feed/components/ReactionContainer/Reactions.styled.cjs.js");require("../../Feed/components/FilesGrid/FilesGrid.styled.cjs.js");require("../../Feed/components/FileUploadCard/FileUploadCard.styled.cjs.js");require("../../Feed/components/CommentInput/quillToMarkdown.cjs.js");require("../../Feed/components/ActivityComment/ActivityComment.styled.cjs.js");require("../../Feed/components/ActivityCheckbox/ActivityCheckbox.styled.cjs.js");require("../../Feed/components/ActivityReference/ActivityReference.styled.cjs.js");require("react-router-dom");require("../../Feed/components/ActivityStatus/ActivityStatus.cjs.js");require("../../Feed/components/ActivityHeader/ActivityHeader.styled.cjs.js");require("../../Feed/components/ActivityDate.cjs.js");require("../../Feed/components/ActivityCategorySelect/CategoryTag.cjs.js");require("../../Feed/components/ActivityStatusChange/ActivityStatusChange.styled.cjs.js");require("../../Feed/components/ActivityAssigneeChange/ActivityAssigneeChange.styled.cjs.js");require("../../Feed/components/ActivityVersions/ActivityVersions.styled.cjs.js");require("../../Feed/components/ActivityGroup/ActivityGroup.styled.cjs.js");require("../../Feed/Feed.styled.cjs.js");require("date-fns");require("../../Feed/components/ActivityCategorySelect/ActivityCategorySelect.cjs.js");require("../../Feed/components/ActivityCategorySelect/CategoryDropdownItem.cjs.js");require("../context/ProjectDataContext.cjs.js");require("../../../../../_virtual/runtime.cjs.js");require("../../../../../_virtual/semver.cjs.js");require("react-redux");require("custom-protocol-check");require("../components/GroupSettingsFallback.cjs.js");require("../components/HeaderActionButton.cjs.js");require("../components/RowSelectionHeader.cjs.js");require("../components/SelectionCell.cjs.js");require("../components/ColumnHeaderMenu.cjs.js");require("../../SimpleTable/SimpleTable.styled.cjs.js");require("@tanstack/match-sorter-utils");require("../../SimpleTable/context/SimpleTableContext.cjs.js");require("../../SimpleTable/SimpleTableRowTemplate.cjs.js");require("../../Slicer/hooks/useTableDataBySlice.cjs.js");require("../../Slicer/components/SlicerSearch.cjs.js");require("../../Slicer/context/SlicerContext.cjs.js");require("../../DetailsPanel/DetailsPanel.styled.cjs.js");require("../../DetailsPanel/FeedFilters/FeedFilters.styled.cjs.js");require("../../DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.styled.cjs.js");require("../../../components/PlayableIcon/PlayableIcon.cjs.js");require("../../DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.cjs.js");require("../../DetailsPanel/DetailsPanelSlideOut/DetailsPanelSlideOut.styled.cjs.js");require("../../DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.styled.cjs.js");require("../../Actions/Actions.styled.cjs.js");require("../../Actions/ActionsDropdown/ActionsDropdown.cjs.js");require("../../Actions/ActionIcon.cjs.js");require("../../Views/context/ViewsContext.cjs.js");require("../../Views/Views.styled.cjs.js");require("../../Views/ViewsMenuContainer/ViewsMenuContainer.cjs.js");require("../../Views/ViewsMenu/ViewsMenu.cjs.js");require("../../../components/EntityPanelUploader/EntityPanelUploader.styled.cjs.js");require("axios");require("../../../components/ReviewablesList/ReviewablesList.styled.cjs.js");require("../../../components/ReviewablesList/ReviewablesUpload.styled.cjs.js");require("../../../components/EntityPath/EntityPath.styled.cjs.js");require("../../../components/EntityPath/SegmentProvider.cjs.js");require("../../../components/FeaturedVersionOrder/FeaturedVersionOrder.cjs.js");require("../../../components/Feedback/FeedbackContext.cjs.js");require("../../../components/Feedback/SupportBubble.cjs.js");require("../../../components/FileThumbnail/FileThumbnail.cjs.js");require("../../../components/LegacyBadge/LegacyBadge.cjs.js");require("../../../components/LinksManager/LinksManager.styled.cjs.js");require("../../EntityPickerDialog/EntityPickerDialog.cjs.js");require("../../../components/Powerpack/PowerpackButton.cjs.js");require("../../../components/Powerpack/PricingLink.cjs.js");require("../../../components/Powerpack/PowerpackDialog.styled.cjs.js");require("../../../components/Powerpack/CTAButton.cjs.js");require("../../../components/Powerpack/RequiredAddonVersion.cjs.js");require("../../../components/ProjectTableSettings/ProjectTableSettings.cjs.js");require("../../../components/SizeSlider/SizeSlider.cjs.js");require("../../../components/ReviewableCard/ReviewableCard.cjs.js");require("../../../components/ReviewableProgressCard/ReviewableProgressCard.styled.cjs.js");require("../../../components/SearchFilter/filterDates.cjs.js");require("../../../components/SettingsPanel/SettingsPanel.cjs.js");require("../../../components/SettingsPanel/SettingsPanelItemTemplate.cjs.js");require("../../../components/ShareOptionIcon/ShareOptionIcon.cjs.js");require("../../../components/SimpleFormDialog/SimpleFormDialog.cjs.js");require("../../../components/SortingSetting/SortingSetting.styled.cjs.js");require("../../../components/StyledLink/StyledLink.cjs.js");require("../../../components/TableGridSwitch/TableGridSwitch.cjs.js");require("../../../components/Thumbnail/Thumbnail.styled.cjs.js");require("../../../components/Thumbnail/StackedThumbnails.cjs.js");require("../../../components/ThumbnailSimple/ThumbnailSimple.cjs.js");require("../../../components/VersionUploader/components/UploadVersionDialog.cjs.js");require("../../../components/VersionUploader/context/VersionUploadContext.cjs.js");require("../../../components/Watchers/Watchers.cjs.js");require("../../../components/Menu/Menu.styled.cjs.js");require("../../../components/Menu/MenuItem.cjs.js");require("../../../components/LinksManager/CellEditingDialog.cjs.js");require("../context/DetailsPanelEntityContext.cjs.js");require("../context/SelectedRowsContext.cjs.js");require("../widgets/EmptyWidget.cjs.js");require("../widgets/ErrorWidget.cjs.js");require("../ProjectTreeTable.styled.cjs.js");require("../widgets/LoadMoreWidget.cjs.js");require("../context/ColumnSettingsContext.cjs.js");const O=require("../utils/linksToTableData.cjs.js"),A="next-page",b="_ungrouped",v="__",_=e=>e?Array.isArray(e)?e.map(q=>q.toString()):[e.toString()]:[],U=(e,q,s)=>{if(!s)return{value:q,label:q};const u=s.find(t=>t.value===q);return u?{value:u.value,label:u.label||u.value,color:u.color,icon:u.icon,count:u.count,img:e==="assignees"?`/api/users/${u.value}/avatar`:void 0}:{value:q,label:q}},c="_GROUP_",D=e=>`${c}${e}`,x=e=>e.startsWith(c)?e.slice(c.length):null,S=e=>e.startsWith(c),N=(e,q,s=[])=>{const u=e.id.replace("attrib.","");return u==="status"?q?.statuses?.map(t=>t.name)||[]:u==="taskType"?q?.taskTypes?.map(t=>t.name)||[]:u==="folderType"?q?.folderTypes?.map(t=>t.name)||[]:e.id.startsWith("attrib.")?s.find(t=>t.name===u)?.data.enum?.map(t=>t.value.toString())||[]:[]},W=(e,q,s,u,t)=>{const d=t(s,e.taskType);return{id:e.id+v+q,entityId:e.id,entityType:s,parentId:e.folderId,name:e.name||"",label:e.label||e.name||"",icon:d?.icon||null,color:d?.color||null,status:e.status,assignees:e.assignees,tags:e.tags,img:null,subRows:[],subType:e.taskType||null,attrib:e.attrib,ownAttrib:e.ownAttrib,parents:e.parents||[],updatedAt:e.updatedAt,links:O.linksToTableData(e.links,s,{folderTypes:u?.folderTypes||[],productTypes:Object.values(u.productTypes)||[],taskTypes:u?.taskTypes||[]})}},C=({entities:e,entityType:q,groups:s=[],attribFields:u,showEmpty:t,groupRowFunc:d})=>{const g=P.useProjectContext(),m=h.useGetEntityTypeData({projectInfo:g}),f=E.useCallback((l,n)=>{const p=d?d(l):W(l,n,q,g,m);return{...p,id:l.id+v+n,subRows:p.subRows||[]}},[d,m,q,g]);return l=>{const n=new Map;for(const o of s){const i=o.value?.toString(),a=D(i),r=U(l.id,i,s);n.set(i,{id:a,name:i,entityType:"group",subRows:[],label:r.label,group:r,links:{}})}const p=c+"."+b,I=()=>{let o=n.get(p);return o||(o={id:p,name:"Ungrouped",entityType:"group",subRows:[],label:"Ungrouped",group:{value:p,label:"Ungrouped"},links:{}},n.set(p,o)),o};for(const[o,i]of e){if(i.entityType!==q)continue;let a=[];if(l.id.startsWith("attrib.")){const r=l.id.split(".")[1];a=_(i.attrib?.[r])}else a=_(i[l.id]);a.length===0&&I().subRows?.push(f(i,b));for(const r of a){const y=n.get(r);y?y.subRows?.push(f(i,r)):I().subRows?.push(f(i,b))}if("groups"in i&&Array.isArray(i.groups)){for(const r of i.groups)if(r.hasNextPage&&n.has(r.value)){const R=n.get(r.value);R&&R.subRows?.push({id:`${r.value}-next-page`,name:"Load more tasks...",entityType:A,subRows:[],label:`Next page for ${r.value}`,group:{value:r.value,label:r.value},links:{}})}}}const G=Array.from(n.values()),T=N(l,g,u);G.sort((o,i)=>{if(o.group?.value===p)return 1;if(i.group?.value===p)return-1;if(T.length){const a=T.indexOf(o.group?.value||""),r=T.indexOf(i.group?.value||"");return a!==-1&&r!==-1?a-r:a!==-1?-1:r!==-1?1:o.group?.label?.localeCompare(i.group?.label||"")||0}else return o.group?.label?.localeCompare(i.group?.label||"")||0});const w=G.filter(o=>o.subRows&&o.subRows.length>0);return t?G:w}};exports.GROUP_BY_ID=c;exports.NEXT_PAGE_ID=A;exports.ROW_ID_SEPARATOR=v;exports.UNGROUPED_VALUE=b;exports.buildGroupId=D;exports.default=C;exports.isGroupId=S;exports.parseGroupId=x;
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const h=require("./useGetEntityTypeData.cjs.js"),E=require("react");require("@ynput/ayon-react-components");require("short-uuid");require("react-toastify");require("lodash");require("uuid");require("../../../util/pubsub.cjs.js");require("../context/CellEditingContext.cjs.js");require("../../../../../_virtual/jsx-runtime.cjs.js");require("../context/SelectionCellsContext.cjs.js");require("../context/ProjectTableQueriesContext.cjs.js");require("../context/ProjectTableContext.cjs.js");require("../../../context/RemoteModulesContext.cjs.js");require("../../../context/DetailsPanelContext.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 P=require("../../../context/ProjectContext.cjs.js");require("../../../context/ProjectFoldersContext.cjs.js");require("../../../context/UriContext.cjs.js");require("../context/ClipboardContext.cjs.js");require("@tanstack/react-table");require("@tanstack/react-virtual");require("clsx");require("../widgets/CollapsedWidget.cjs.js");require("../widgets/DateWidget.cjs.js");require("../widgets/EnumWidget.cjs.js");require("../widgets/TextWidget.cjs.js");require("../widgets/BooleanWidget.cjs.js");require("../widgets/CellWidget.cjs.js");require("../widgets/EntityNameWidget.cjs.js");require("../widgets/GroupHeaderWidget.cjs.js");require("../widgets/ThumbnailWidget.cjs.js");require("../../../components/AddonLoadingScreen/AddonLoadingScreen.cjs.js");require("../../../../../node_modules/match-sorter/dist/match-sorter.esm.cjs.js");require("../../../components/AccessSearchInput/AccessSearchInput.styled.cjs.js");require("../../../components/AccessUser/AccessUser.cjs.js");require("../../../components/AttributeEditor/components/MinMaxField.cjs.js");require("@dnd-kit/core");require("@dnd-kit/sortable");require("../../../components/EnumEditor/EnumEditor.styled.cjs.js");require("../../../components/Badge/Badge.cjs.js");require("../../../components/Chips/Chips.cjs.js");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/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");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/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/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");require("../../../components/DetailsPanelAttributes/DetailsPanelAttributesEditor.cjs.js");require("../../../components/DetailsPanelDetails/DetailsPanelDetails.cjs.js");require("../../../components/DetailsPanelDetails/DetailsSection.cjs.js");require("../../../components/DetailsPanelDetails/FieldLabel.cjs.js");require("../../../components/EarlyPreview/EarlyPreview.cjs.js");require("../../../components/EmptyPlaceholder/EmptyPlaceholder.cjs.js");require("../../../components/EmptyPlaceholder/EmptyPlaceholderFlex.styled.cjs.js");require("../../ContextMenu/ContextMenuContext.cjs.js");;/* empty css */require("../../Feed/context/FeedContext.cjs.js");require("../../Feed/components/Tooltips/UserTooltip/UserTooltip.styled.cjs.js");require("../../Feed/components/Tooltips/EntityTooltip/EntityTooltip.styled.cjs.js");require("../../Feed/components/FileUploadPreview/FileUploadPreview.styled.cjs.js");require("../../Feed/components/FileUploadPreview/Mimes/TextMime.cjs.js");require("react-markdown");require("remark-emoji");require("remark-gfm");require("remark-directive");require("remark-directive-rehype");require("../../Feed/components/CommentInput/CommentInput.cjs.js");require("../../Feed/components/ReactionContainer/Reactions.styled.cjs.js");require("../../Feed/components/FilesGrid/FilesGrid.styled.cjs.js");require("../../Feed/components/FileUploadCard/FileUploadCard.styled.cjs.js");require("../../Feed/components/CommentInput/quillToMarkdown.cjs.js");require("../../Feed/components/ActivityComment/ActivityComment.styled.cjs.js");require("../../Feed/components/ActivityCheckbox/ActivityCheckbox.styled.cjs.js");require("../../Feed/components/ActivityReference/ActivityReference.styled.cjs.js");require("react-router-dom");require("../../Feed/components/ActivityStatus/ActivityStatus.cjs.js");require("../../Feed/components/ActivityHeader/ActivityHeader.styled.cjs.js");require("../../Feed/components/ActivityDate.cjs.js");require("../../Feed/components/ActivityCategorySelect/CategoryTag.cjs.js");require("../../Feed/components/ActivityStatusChange/ActivityStatusChange.styled.cjs.js");require("../../Feed/components/ActivityAssigneeChange/ActivityAssigneeChange.styled.cjs.js");require("../../Feed/components/ActivityVersions/ActivityVersions.styled.cjs.js");require("../../Feed/components/ActivityGroup/ActivityGroup.styled.cjs.js");require("../../Feed/Feed.styled.cjs.js");require("date-fns");require("../../Feed/components/ActivityCategorySelect/ActivityCategorySelect.cjs.js");require("../../Feed/components/ActivityCategorySelect/CategoryDropdownItem.cjs.js");require("../context/ProjectDataContext.cjs.js");require("../../../../../_virtual/runtime.cjs.js");require("../../../../../_virtual/semver.cjs.js");require("react-redux");require("custom-protocol-check");require("../components/GroupSettingsFallback.cjs.js");require("../components/HeaderActionButton.cjs.js");require("../components/RowSelectionHeader.cjs.js");require("../components/SelectionCell.cjs.js");require("../components/ColumnHeaderMenu.cjs.js");require("../../SimpleTable/SimpleTable.styled.cjs.js");require("@tanstack/match-sorter-utils");require("../../SimpleTable/context/SimpleTableContext.cjs.js");require("../../SimpleTable/SimpleTableRowTemplate.cjs.js");require("../../Slicer/hooks/useTableDataBySlice.cjs.js");require("../../Slicer/components/SlicerSearch.cjs.js");require("../../Slicer/context/SlicerContext.cjs.js");require("../../DetailsPanel/DetailsPanel.styled.cjs.js");require("../../DetailsPanel/FeedFilters/FeedFilters.styled.cjs.js");require("../../DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.styled.cjs.js");require("../../../components/PlayableIcon/PlayableIcon.cjs.js");require("../../DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.cjs.js");require("../../DetailsPanel/DetailsPanelSlideOut/DetailsPanelSlideOut.styled.cjs.js");require("../../DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.styled.cjs.js");require("../../Actions/Actions.styled.cjs.js");require("../../Actions/ActionsDropdown/ActionsDropdown.cjs.js");require("../../Actions/ActionIcon.cjs.js");require("../../Views/context/ViewsContext.cjs.js");require("../../Views/Views.styled.cjs.js");require("../../Views/ViewsMenuContainer/ViewsMenuContainer.cjs.js");require("../../Views/ViewsMenu/ViewsMenu.cjs.js");require("../../../components/EntityPanelUploader/EntityPanelUploader.styled.cjs.js");require("axios");require("../../../components/ReviewablesList/ReviewablesList.styled.cjs.js");require("../../../components/ReviewablesList/ReviewablesUpload.styled.cjs.js");require("../../../components/EntityPath/EntityPath.styled.cjs.js");require("../../../components/EntityPath/SegmentProvider.cjs.js");require("../../../components/FeaturedVersionOrder/FeaturedVersionOrder.cjs.js");require("../../../components/Feedback/FeedbackContext.cjs.js");require("../../../components/Feedback/SupportBubble.cjs.js");require("../../../components/FileThumbnail/FileThumbnail.cjs.js");require("../../../components/LegacyBadge/LegacyBadge.cjs.js");require("../../../components/LinksManager/LinksManager.styled.cjs.js");require("../../EntityPickerDialog/EntityPickerDialog.cjs.js");require("../../../components/Powerpack/PowerpackButton.cjs.js");require("../../../components/Powerpack/PricingLink.cjs.js");require("../../../components/Powerpack/PowerpackDialog.styled.cjs.js");require("../../../components/Powerpack/CTAButton.cjs.js");require("../../../components/Powerpack/RequiredAddonVersion.cjs.js");require("../../../components/ProjectTableSettings/ProjectTableSettings.cjs.js");require("../../../components/SizeSlider/SizeSlider.cjs.js");require("../../../components/ReviewableCard/ReviewableCard.cjs.js");require("../../../components/ReviewableProgressCard/ReviewableProgressCard.styled.cjs.js");require("../../../components/SearchFilter/filterDates.cjs.js");require("../../../components/SettingsPanel/SettingsPanel.cjs.js");require("../../../components/SettingsPanel/SettingsPanelItemTemplate.cjs.js");require("../../../components/ShareOptionIcon/ShareOptionIcon.cjs.js");require("../../../components/SimpleFormDialog/SimpleFormDialog.cjs.js");require("../../../components/SortingSetting/SortingSetting.styled.cjs.js");require("../../../components/StyledLink/StyledLink.cjs.js");require("../../../components/TableGridSwitch/TableGridSwitch.cjs.js");require("../../../components/Thumbnail/Thumbnail.styled.cjs.js");require("../../../components/Thumbnail/StackedThumbnails.cjs.js");require("../../../components/ThumbnailSimple/ThumbnailSimple.cjs.js");require("../../../components/VersionUploader/components/UploadVersionDialog.cjs.js");require("../../../components/VersionUploader/context/VersionUploadContext.cjs.js");require("../../../components/Watchers/Watchers.cjs.js");require("../../../components/Menu/Menu.styled.cjs.js");require("../../../components/Menu/MenuItem.cjs.js");require("../../../components/LinksManager/CellEditingDialog.cjs.js");require("../context/DetailsPanelEntityContext.cjs.js");require("../context/SelectedRowsContext.cjs.js");require("../widgets/EmptyWidget.cjs.js");require("../widgets/ErrorWidget.cjs.js");require("../ProjectTreeTable.styled.cjs.js");require("../widgets/LoadMoreWidget.cjs.js");require("../context/ColumnSettingsContext.cjs.js");const O=require("../utils/linksToTableData.cjs.js"),A="next-page",b="_ungrouped",R="__",_=e=>e?Array.isArray(e)?e.map(q=>q.toString()):[e.toString()]:[],U=(e,q,n)=>{if(!n)return{value:q,label:q};const u=n.find(t=>t.value===q);return u?{value:u.value,label:u.label||u.value,color:u.color,icon:u.icon,count:u.count,img:e==="assignees"?`/api/users/${u.value}/avatar`:void 0}:{value:q,label:q}},c="_GROUP_",D=e=>`${c}${e}`,x=e=>e.startsWith(c)?e.slice(c.length):null,S=e=>e.startsWith(c),N=(e,q,n=[])=>{const u=e.id.replace("attrib.","");return u==="status"?q?.statuses?.map(t=>t.name)||[]:u==="taskType"?q?.taskTypes?.map(t=>t.name)||[]:u==="folderType"?q?.folderTypes?.map(t=>t.name)||[]:e.id.startsWith("attrib.")?n.find(t=>t.name===u)?.data.enum?.map(t=>t.value.toString())||[]:[]},W=(e,q,n,u,t)=>{const d=t(n,e.taskType);return{id:e.id+R+q,entityId:e.id,entityType:n,parentId:e.folderId,name:e.name||"",label:e.label||e.name||"",icon:d?.icon||null,color:d?.color||null,status:e.status,assignees:e.assignees,tags:e.tags,img:null,subRows:[],subType:e.taskType||null,attrib:e.attrib,ownAttrib:e.ownAttrib,parents:e.parents||[],updatedAt:e.updatedAt,links:O.linksToTableData(e.links,n,{folderTypes:u?.folderTypes||[],productTypes:Object.values(u.productTypes)||[],taskTypes:u?.taskTypes||[]})}},C=({entities:e,entityType:q,groups:n=[],attribFields:u,showEmpty:t,groupRowFunc:d})=>{const g=P.useProjectContext(),m=h.useGetEntityTypeData({projectInfo:g}),f=E.useCallback((l,s)=>{const p=d?d(l):W(l,s,q,g,m);return{...p,id:l.id+R+s,subRows:p.subRows||[]}},[d,m,q,g]);return l=>{const s=new Map;for(const o of n){const i=o.value?.toString(),a=D(i),r=U(l.id,i,n);s.set(i,{id:a,name:i,entityType:"group",subRows:[],label:r.label,group:r,links:{}})}const p=c+"."+b,I=()=>{let o=s.get(p);return o||(o={id:p,name:"Ungrouped",entityType:"group",subRows:[],label:"Ungrouped",group:{value:p,label:"Ungrouped"},links:{}},s.set(p,o)),o};for(const[o,i]of e){if(i.entityType!==q)continue;let a=[];if(l.id.startsWith("attrib.")){const r=l.id.split(".")[1];a=_(i.attrib?.[r])}else a=_(i[l.id]);a.length===0&&I().subRows?.push(f(i,b));for(const r of a){const y=s.get(r);y?y.subRows?.push(f(i,r)):I().subRows?.push(f(i,b))}if("groups"in i&&Array.isArray(i.groups)){for(const r of i.groups)if(r.hasNextPage&&s.has(r.value)){const v=s.get(r.value);v&&v.subRows?.push({id:`${r.value}-next-page`,name:"Load more tasks...",entityType:A,subRows:[],label:`Next page for ${r.value}`,group:{value:r.value,label:r.value},links:{}})}}}const G=Array.from(s.values()),T=N(l,g,u);G.sort((o,i)=>{if(o.group?.value===p)return 1;if(i.group?.value===p)return-1;if(T.length){const a=T.indexOf(o.group?.value||""),r=T.indexOf(i.group?.value||"");return a!==-1&&r!==-1?a-r:a!==-1?-1:r!==-1?1:o.group?.label?.localeCompare(i.group?.label||"")||0}else return o.group?.label?.localeCompare(i.group?.label||"")||0});const w=G.filter(o=>o.group?.count&&o.group.count>0);return t?G:w}};exports.GROUP_BY_ID=c;exports.NEXT_PAGE_ID=A;exports.ROW_ID_SEPARATOR=R;exports.UNGROUPED_VALUE=b;exports.buildGroupId=D;exports.default=C;exports.isGroupId=S;exports.parseGroupId=x;
|
|
2
2
|
//# sourceMappingURL=useBuildGroupByTableData.cjs.js.map
|
package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBuildGroupByTableData.cjs.js","sources":["../../../../../../src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.ts"],"sourcesContent":["// based on the groupBy field we take a flat list of items and group them\n// each group is a root node with subItems as the grouped items\n// any leftover items that do not match the groupBy field are added as a separate group (\"Ungrouped\")\n\nimport { EntityGroup } from '@shared/api'\nimport { TableGroupBy } from '../context'\nimport { EditorTaskNode, EntitiesMap, EntityMap, ProjectTableAttribute, TableRow } from '../types'\nimport { useGetEntityTypeData } from './useGetEntityTypeData'\nimport { useCallback } from 'react'\nimport { linksToTableData } from '../utils'\nimport { ProjectModelWithProducts, useProjectContext } from '@shared/context'\nexport type GroupByEntityType = 'task' | 'folder' | 'version' | 'product'\n\nexport type GroupData = {\n value: string\n label: string\n color?: string\n icon?: string\n img?: string\n count?: number\n}\n\nexport const NEXT_PAGE_ID = 'next-page'\nexport const UNGROUPED_VALUE = '_ungrouped'\nexport const ROW_ID_SEPARATOR = '__'\n\nconst valueToStringArray = (value?: any): string[] =>\n value ? (Array.isArray(value) ? value.map((v) => v.toString()) : [value.toString()]) : []\n\n// get group label, color and icon\nconst getGroupData = (groupById: string, groupValue: string, groups?: EntityGroup[]): GroupData => {\n if (!groups)\n return {\n value: groupValue,\n label: groupValue,\n }\n\n const group = groups.find((g) => g.value === groupValue)\n if (!group) {\n return {\n value: groupValue,\n label: groupValue,\n }\n } else {\n return {\n value: group.value,\n label: group.label || group.value,\n color: group.color,\n icon: group.icon,\n count: group.count,\n img: groupById === 'assignees' ? `/api/users/${group.value}/avatar` : undefined,\n }\n }\n}\n\nexport const GROUP_BY_ID = '_GROUP_'\nexport const buildGroupId = (value: string) => `${GROUP_BY_ID}${value}`\nexport const parseGroupId = (groupId: string): string | null => {\n if (!groupId.startsWith(GROUP_BY_ID)) return null\n return groupId.slice(GROUP_BY_ID.length) // +1 for the underscore\n}\nexport const isGroupId = (id: string): boolean => id.startsWith(GROUP_BY_ID)\n\ntype BuildGroupByTableProps = {\n entities: EntitiesMap\n entityType: string\n groups?: EntityGroup[]\n attribFields: ProjectTableAttribute[]\n showEmpty?: boolean\n groupRowFunc?: (node: any) => TableRow\n}\n\n// get sorting ids based on the groupBy field\nconst getSortingIds = (\n groupBy: TableGroupBy,\n project?: ProjectModelWithProducts,\n attribFields: ProjectTableAttribute[] = [],\n): string[] => {\n const attributeId = groupBy.id.replace('attrib.', '')\n\n // for status, taskType, folderType use project data order\n if (attributeId === 'status') {\n return project?.statuses?.map((s) => s.name) || []\n } else if (attributeId === 'taskType') {\n return project?.taskTypes?.map((t) => t.name) || []\n } else if (attributeId === 'folderType') {\n return project?.folderTypes?.map((f) => f.name) || []\n } else if (groupBy.id.startsWith('attrib.')) {\n // for other enum attributes, use the enum values order\n return (\n attribFields\n .find((field) => field.name === attributeId)\n ?.data.enum?.map((e) => e.value.toString()) || []\n )\n } else return []\n}\n\nconst defaultEntityToGroupRow = (\n task: EditorTaskNode,\n group: string | undefined,\n entityType: string,\n project: ProjectModelWithProducts,\n getEntityTypeData: ReturnType<typeof useGetEntityTypeData>,\n): TableRow & { subRows: TableRow[] } => {\n const typeData = getEntityTypeData(entityType, task.taskType)\n return {\n id: task.id + ROW_ID_SEPARATOR + group, // unique id for the task in the folder\n entityId: task.id,\n entityType: entityType,\n parentId: task.folderId,\n name: task.name || '',\n label: task.label || task.name || '',\n icon: typeData?.icon || null,\n color: typeData?.color || null,\n status: task.status,\n assignees: task.assignees,\n tags: task.tags,\n img: null,\n subRows: [],\n subType: task.taskType || null,\n attrib: task.attrib,\n ownAttrib: task.ownAttrib,\n parents: task.parents || [],\n updatedAt: task.updatedAt,\n links: linksToTableData(task.links, entityType, {\n folderTypes: project?.folderTypes || [],\n productTypes: Object.values(project.productTypes) || [],\n taskTypes: project?.taskTypes || [],\n }),\n }\n}\n\nconst useBuildGroupByTableData = ({\n entities,\n entityType,\n groups = [],\n attribFields,\n showEmpty,\n groupRowFunc, // for versions etc\n}: BuildGroupByTableProps) => {\n const project = useProjectContext()\n const getEntityTypeData = useGetEntityTypeData({ projectInfo: project })\n\n const entityToGroupRow = useCallback(\n (task: EditorTaskNode, group?: string): TableRow & { subRows: TableRow[] } => {\n // Use provided groupRowFunc or fall back to default\n const baseRow = groupRowFunc\n ? groupRowFunc(task)\n : defaultEntityToGroupRow(task, group, entityType, project, getEntityTypeData)\n\n // Ensure group-specific fields are set\n return {\n ...baseRow,\n id: task.id + ROW_ID_SEPARATOR + group, // unique id for the task in the group\n subRows: baseRow.subRows || [],\n }\n },\n [groupRowFunc, getEntityTypeData, entityType, project],\n )\n\n const buildGroupByTableData = (groupBy: TableGroupBy): TableRow[] => {\n const groupsMap = new Map<string, TableRow>()\n\n for (const group of groups) {\n const groupValue = group.value?.toString() as string\n const groupId = buildGroupId(groupValue)\n const groupData = getGroupData(groupBy.id, groupValue, groups)\n groupsMap.set(groupValue, {\n id: groupId,\n name: groupValue,\n entityType: 'group',\n subRows: [],\n label: groupData.label,\n group: groupData,\n links: {},\n })\n }\n\n const ungroupedId = GROUP_BY_ID + '.' + UNGROUPED_VALUE // unique id for ungrouped group\n // gets the \"Ungrouped\" group, creating it if it doesn't exist\n const getUnGroupedGroup = () => {\n let ungroupedGroup = groupsMap.get(ungroupedId)\n if (!ungroupedGroup) {\n ungroupedGroup = {\n id: ungroupedId,\n name: 'Ungrouped',\n entityType: 'group',\n subRows: [],\n label: 'Ungrouped',\n group: { value: ungroupedId, label: 'Ungrouped' },\n links: {},\n }\n // create ungrouped group if it doesn't exist\n groupsMap.set(ungroupedId, ungroupedGroup)\n }\n return ungroupedGroup\n }\n\n for (const [id, entity] of entities) {\n // if the entity is not of the specified type, skip it\n if (entity.entityType !== entityType) continue\n // add entities to specific group\n let groupValues: string[] = []\n if (groupBy.id.startsWith('attrib.')) {\n // for attribute based grouping, get the value of the attribute\n const attributeId = groupBy.id.split('.')[1]\n groupValues = valueToStringArray(entity.attrib?.[attributeId])\n } else {\n groupValues = valueToStringArray(entity[groupBy.id as keyof EntityMap])\n }\n\n // if there are no values, add to \"Ungrouped\" group\n if (groupValues.length === 0) {\n const ungroupedGroup = getUnGroupedGroup()\n ungroupedGroup.subRows?.push(entityToGroupRow(entity as EditorTaskNode, UNGROUPED_VALUE))\n }\n // for each group value, find it's group and add the entity to it\n // if we can't find the group, add it to \"Ungrouped\"\n for (const groupValue of groupValues) {\n const groupRow = groupsMap.get(groupValue)\n if (groupRow) {\n groupRow.subRows?.push(entityToGroupRow(entity as EditorTaskNode, groupValue))\n } else {\n const ungroupedGroup = getUnGroupedGroup()\n ungroupedGroup.subRows?.push(entityToGroupRow(entity as EditorTaskNode, UNGROUPED_VALUE))\n }\n }\n\n // for groups metadata on entity, check if there is a next page\n if ('groups' in entity && Array.isArray(entity.groups)) {\n for (const group of entity.groups) {\n const hasNextPageGroup = group.hasNextPage\n if (hasNextPageGroup && groupsMap.has(group.value)) {\n // add a next page row to the group\n const groupRow = groupsMap.get(group.value)\n if (groupRow) {\n groupRow.subRows?.push({\n id: `${group.value}-next-page`,\n name: `Load more tasks...`,\n entityType: NEXT_PAGE_ID,\n subRows: [],\n label: `Next page for ${group.value}`,\n group: { value: group.value, label: group.value },\n links: {},\n })\n }\n }\n }\n }\n }\n\n const groupsList = Array.from(groupsMap.values())\n\n const attribSortingIds = getSortingIds(groupBy, project, attribFields)\n\n // sort the groups by their label\n // if the group is an attribute with enum values, sort by the enum values\n groupsList.sort((a, b) => {\n if (a.group?.value === ungroupedId) return 1 // \"Ungrouped\" should be last\n if (b.group?.value === ungroupedId) return -1 // \"Ungrouped\" should be last\n if (attribSortingIds.length) {\n // sort by index of the enum value\n const indexA = attribSortingIds.indexOf(a.group?.value || '')\n const indexB = attribSortingIds.indexOf(b.group?.value || '')\n if (indexA !== -1 && indexB !== -1) {\n return indexA - indexB\n }\n if (indexA !== -1) return -1 // a is in the enum, b is not\n if (indexB !== -1) return 1 // b is in the enum, a is not\n // if both are not in the enum, sort by label\n return a.group?.label?.localeCompare(b.group?.label || '') || 0\n } else {\n // for other groupings, sort by the group label\n return a.group?.label?.localeCompare(b.group?.label || '') || 0\n }\n })\n\n // filter out empty groups\n const nonEmptyGroups = groupsList.filter((group) => group.subRows && group.subRows.length > 0)\n\n return showEmpty ? groupsList : nonEmptyGroups\n }\n\n return buildGroupByTableData\n}\n\nexport default useBuildGroupByTableData\n"],"names":["NEXT_PAGE_ID","UNGROUPED_VALUE","ROW_ID_SEPARATOR","valueToStringArray","value","v","getGroupData","groupById","groupValue","groups","group","g","GROUP_BY_ID","buildGroupId","parseGroupId","groupId","isGroupId","id","getSortingIds","groupBy","project","attribFields","attributeId","s","f","field","e","defaultEntityToGroupRow","task","entityType","getEntityTypeData","typeData","linksToTableData","useBuildGroupByTableData","entities","showEmpty","groupRowFunc","useProjectContext","useGetEntityTypeData","entityToGroupRow","useCallback","baseRow","groupsMap","groupData","ungroupedId","getUnGroupedGroup","ungroupedGroup","entity","groupValues","groupRow","groupsList","attribSortingIds","a","b","indexA","indexB","nonEmptyGroups"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useBuildGroupByTableData.cjs.js","sources":["../../../../../../src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.ts"],"sourcesContent":["// based on the groupBy field we take a flat list of items and group them\n// each group is a root node with subItems as the grouped items\n// any leftover items that do not match the groupBy field are added as a separate group (\"Ungrouped\")\n\nimport { EntityGroup } from '@shared/api'\nimport { TableGroupBy } from '../context'\nimport { EditorTaskNode, EntitiesMap, EntityMap, ProjectTableAttribute, TableRow } from '../types'\nimport { useGetEntityTypeData } from './useGetEntityTypeData'\nimport { useCallback } from 'react'\nimport { linksToTableData } from '../utils'\nimport { ProjectModelWithProducts, useProjectContext } from '@shared/context'\nexport type GroupByEntityType = 'task' | 'folder' | 'version' | 'product'\n\nexport type GroupData = {\n value: string\n label: string\n color?: string\n icon?: string\n img?: string\n count?: number\n}\n\nexport const NEXT_PAGE_ID = 'next-page'\nexport const UNGROUPED_VALUE = '_ungrouped'\nexport const ROW_ID_SEPARATOR = '__'\n\nconst valueToStringArray = (value?: any): string[] =>\n value ? (Array.isArray(value) ? value.map((v) => v.toString()) : [value.toString()]) : []\n\n// get group label, color and icon\nconst getGroupData = (groupById: string, groupValue: string, groups?: EntityGroup[]): GroupData => {\n if (!groups)\n return {\n value: groupValue,\n label: groupValue,\n }\n\n const group = groups.find((g) => g.value === groupValue)\n if (!group) {\n return {\n value: groupValue,\n label: groupValue,\n }\n } else {\n return {\n value: group.value,\n label: group.label || group.value,\n color: group.color,\n icon: group.icon,\n count: group.count,\n img: groupById === 'assignees' ? `/api/users/${group.value}/avatar` : undefined,\n }\n }\n}\n\nexport const GROUP_BY_ID = '_GROUP_'\nexport const buildGroupId = (value: string) => `${GROUP_BY_ID}${value}`\nexport const parseGroupId = (groupId: string): string | null => {\n if (!groupId.startsWith(GROUP_BY_ID)) return null\n return groupId.slice(GROUP_BY_ID.length) // +1 for the underscore\n}\nexport const isGroupId = (id: string): boolean => id.startsWith(GROUP_BY_ID)\n\ntype BuildGroupByTableProps = {\n entities: EntitiesMap\n entityType: string\n groups?: EntityGroup[]\n attribFields: ProjectTableAttribute[]\n showEmpty?: boolean\n groupRowFunc?: (node: any) => TableRow\n}\n\n// get sorting ids based on the groupBy field\nconst getSortingIds = (\n groupBy: TableGroupBy,\n project?: ProjectModelWithProducts,\n attribFields: ProjectTableAttribute[] = [],\n): string[] => {\n const attributeId = groupBy.id.replace('attrib.', '')\n\n // for status, taskType, folderType use project data order\n if (attributeId === 'status') {\n return project?.statuses?.map((s) => s.name) || []\n } else if (attributeId === 'taskType') {\n return project?.taskTypes?.map((t) => t.name) || []\n } else if (attributeId === 'folderType') {\n return project?.folderTypes?.map((f) => f.name) || []\n } else if (groupBy.id.startsWith('attrib.')) {\n // for other enum attributes, use the enum values order\n return (\n attribFields\n .find((field) => field.name === attributeId)\n ?.data.enum?.map((e) => e.value.toString()) || []\n )\n } else return []\n}\n\nconst defaultEntityToGroupRow = (\n task: EditorTaskNode,\n group: string | undefined,\n entityType: string,\n project: ProjectModelWithProducts,\n getEntityTypeData: ReturnType<typeof useGetEntityTypeData>,\n): TableRow & { subRows: TableRow[] } => {\n const typeData = getEntityTypeData(entityType, task.taskType)\n return {\n id: task.id + ROW_ID_SEPARATOR + group, // unique id for the task in the folder\n entityId: task.id,\n entityType: entityType,\n parentId: task.folderId,\n name: task.name || '',\n label: task.label || task.name || '',\n icon: typeData?.icon || null,\n color: typeData?.color || null,\n status: task.status,\n assignees: task.assignees,\n tags: task.tags,\n img: null,\n subRows: [],\n subType: task.taskType || null,\n attrib: task.attrib,\n ownAttrib: task.ownAttrib,\n parents: task.parents || [],\n updatedAt: task.updatedAt,\n links: linksToTableData(task.links, entityType, {\n folderTypes: project?.folderTypes || [],\n productTypes: Object.values(project.productTypes) || [],\n taskTypes: project?.taskTypes || [],\n }),\n }\n}\n\nconst useBuildGroupByTableData = ({\n entities,\n entityType,\n groups = [],\n attribFields,\n showEmpty,\n groupRowFunc, // for versions etc\n}: BuildGroupByTableProps) => {\n const project = useProjectContext()\n const getEntityTypeData = useGetEntityTypeData({ projectInfo: project })\n\n const entityToGroupRow = useCallback(\n (task: EditorTaskNode, group?: string): TableRow & { subRows: TableRow[] } => {\n // Use provided groupRowFunc or fall back to default\n const baseRow = groupRowFunc\n ? groupRowFunc(task)\n : defaultEntityToGroupRow(task, group, entityType, project, getEntityTypeData)\n\n // Ensure group-specific fields are set\n return {\n ...baseRow,\n id: task.id + ROW_ID_SEPARATOR + group, // unique id for the task in the group\n subRows: baseRow.subRows || [],\n }\n },\n [groupRowFunc, getEntityTypeData, entityType, project],\n )\n\n const buildGroupByTableData = (groupBy: TableGroupBy): TableRow[] => {\n const groupsMap = new Map<string, TableRow>()\n\n for (const group of groups) {\n const groupValue = group.value?.toString() as string\n const groupId = buildGroupId(groupValue)\n const groupData = getGroupData(groupBy.id, groupValue, groups)\n groupsMap.set(groupValue, {\n id: groupId,\n name: groupValue,\n entityType: 'group',\n subRows: [],\n label: groupData.label,\n group: groupData,\n links: {},\n })\n }\n\n const ungroupedId = GROUP_BY_ID + '.' + UNGROUPED_VALUE // unique id for ungrouped group\n // gets the \"Ungrouped\" group, creating it if it doesn't exist\n const getUnGroupedGroup = () => {\n let ungroupedGroup = groupsMap.get(ungroupedId)\n if (!ungroupedGroup) {\n ungroupedGroup = {\n id: ungroupedId,\n name: 'Ungrouped',\n entityType: 'group',\n subRows: [],\n label: 'Ungrouped',\n group: { value: ungroupedId, label: 'Ungrouped' },\n links: {},\n }\n // create ungrouped group if it doesn't exist\n groupsMap.set(ungroupedId, ungroupedGroup)\n }\n return ungroupedGroup\n }\n\n for (const [id, entity] of entities) {\n // if the entity is not of the specified type, skip it\n if (entity.entityType !== entityType) continue\n // add entities to specific group\n let groupValues: string[] = []\n if (groupBy.id.startsWith('attrib.')) {\n // for attribute based grouping, get the value of the attribute\n const attributeId = groupBy.id.split('.')[1]\n groupValues = valueToStringArray(entity.attrib?.[attributeId])\n } else {\n groupValues = valueToStringArray(entity[groupBy.id as keyof EntityMap])\n }\n\n // if there are no values, add to \"Ungrouped\" group\n if (groupValues.length === 0) {\n const ungroupedGroup = getUnGroupedGroup()\n ungroupedGroup.subRows?.push(entityToGroupRow(entity as EditorTaskNode, UNGROUPED_VALUE))\n }\n // for each group value, find it's group and add the entity to it\n // if we can't find the group, add it to \"Ungrouped\"\n for (const groupValue of groupValues) {\n const groupRow = groupsMap.get(groupValue)\n if (groupRow) {\n groupRow.subRows?.push(entityToGroupRow(entity as EditorTaskNode, groupValue))\n } else {\n const ungroupedGroup = getUnGroupedGroup()\n ungroupedGroup.subRows?.push(entityToGroupRow(entity as EditorTaskNode, UNGROUPED_VALUE))\n }\n }\n\n // for groups metadata on entity, check if there is a next page\n if ('groups' in entity && Array.isArray(entity.groups)) {\n for (const group of entity.groups) {\n const hasNextPageGroup = group.hasNextPage\n if (hasNextPageGroup && groupsMap.has(group.value)) {\n // add a next page row to the group\n const groupRow = groupsMap.get(group.value)\n if (groupRow) {\n groupRow.subRows?.push({\n id: `${group.value}-next-page`,\n name: `Load more tasks...`,\n entityType: NEXT_PAGE_ID,\n subRows: [],\n label: `Next page for ${group.value}`,\n group: { value: group.value, label: group.value },\n links: {},\n })\n }\n }\n }\n }\n }\n\n const groupsList = Array.from(groupsMap.values())\n\n const attribSortingIds = getSortingIds(groupBy, project, attribFields)\n\n // sort the groups by their label\n // if the group is an attribute with enum values, sort by the enum values\n groupsList.sort((a, b) => {\n if (a.group?.value === ungroupedId) return 1 // \"Ungrouped\" should be last\n if (b.group?.value === ungroupedId) return -1 // \"Ungrouped\" should be last\n if (attribSortingIds.length) {\n // sort by index of the enum value\n const indexA = attribSortingIds.indexOf(a.group?.value || '')\n const indexB = attribSortingIds.indexOf(b.group?.value || '')\n if (indexA !== -1 && indexB !== -1) {\n return indexA - indexB\n }\n if (indexA !== -1) return -1 // a is in the enum, b is not\n if (indexB !== -1) return 1 // b is in the enum, a is not\n // if both are not in the enum, sort by label\n return a.group?.label?.localeCompare(b.group?.label || '') || 0\n } else {\n // for other groupings, sort by the group label\n return a.group?.label?.localeCompare(b.group?.label || '') || 0\n }\n })\n\n // filter out empty groups\n const nonEmptyGroups = groupsList.filter((group) => group.group?.count && group.group.count > 0)\n\n return showEmpty ? groupsList : nonEmptyGroups\n }\n\n return buildGroupByTableData\n}\n\nexport default useBuildGroupByTableData\n"],"names":["NEXT_PAGE_ID","UNGROUPED_VALUE","ROW_ID_SEPARATOR","valueToStringArray","value","v","getGroupData","groupById","groupValue","groups","group","g","GROUP_BY_ID","buildGroupId","parseGroupId","groupId","isGroupId","id","getSortingIds","groupBy","project","attribFields","attributeId","s","f","field","e","defaultEntityToGroupRow","task","entityType","getEntityTypeData","typeData","linksToTableData","useBuildGroupByTableData","entities","showEmpty","groupRowFunc","useProjectContext","useGetEntityTypeData","entityToGroupRow","useCallback","baseRow","groupsMap","groupData","ungroupedId","getUnGroupedGroup","ungroupedGroup","entity","groupValues","groupRow","groupsList","attribSortingIds","a","b","indexA","indexB","nonEmptyGroups"],"mappings":"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"}
|
|
@@ -254,13 +254,13 @@ import "../ProjectTreeTable.styled.es.js";
|
|
|
254
254
|
import "../widgets/LoadMoreWidget.es.js";
|
|
255
255
|
import "../context/ColumnSettingsContext.es.js";
|
|
256
256
|
import { linksToTableData as E } from "../utils/linksToTableData.es.js";
|
|
257
|
-
const P = "next-page", v = "_ungrouped", A = "__", h = (t) => t ? Array.isArray(t) ? t.map((p) => p.toString()) : [t.toString()] : [], U = (t, p,
|
|
258
|
-
if (!
|
|
257
|
+
const P = "next-page", v = "_ungrouped", A = "__", h = (t) => t ? Array.isArray(t) ? t.map((p) => p.toString()) : [t.toString()] : [], U = (t, p, n) => {
|
|
258
|
+
if (!n)
|
|
259
259
|
return {
|
|
260
260
|
value: p,
|
|
261
261
|
label: p
|
|
262
262
|
};
|
|
263
|
-
const r =
|
|
263
|
+
const r = n.find((m) => m.value === p);
|
|
264
264
|
return r ? {
|
|
265
265
|
value: r.value,
|
|
266
266
|
label: r.label || r.value,
|
|
@@ -272,16 +272,16 @@ const P = "next-page", v = "_ungrouped", A = "__", h = (t) => t ? Array.isArray(
|
|
|
272
272
|
value: p,
|
|
273
273
|
label: p
|
|
274
274
|
};
|
|
275
|
-
}, c = "_GROUP_", O = (t) => `${c}${t}`, hp = (t) => t.startsWith(c) ? t.slice(c.length) : null, Ap = (t) => t.startsWith(c), S = (t, p,
|
|
275
|
+
}, c = "_GROUP_", O = (t) => `${c}${t}`, hp = (t) => t.startsWith(c) ? t.slice(c.length) : null, Ap = (t) => t.startsWith(c), S = (t, p, n = []) => {
|
|
276
276
|
const r = t.id.replace("attrib.", "");
|
|
277
|
-
return r === "status" ? p?.statuses?.map((m) => m.name) || [] : r === "taskType" ? p?.taskTypes?.map((m) => m.name) || [] : r === "folderType" ? p?.folderTypes?.map((m) => m.name) || [] : t.id.startsWith("attrib.") ?
|
|
278
|
-
}, N = (t, p,
|
|
279
|
-
const d = m(
|
|
277
|
+
return r === "status" ? p?.statuses?.map((m) => m.name) || [] : r === "taskType" ? p?.taskTypes?.map((m) => m.name) || [] : r === "folderType" ? p?.folderTypes?.map((m) => m.name) || [] : t.id.startsWith("attrib.") ? n.find((m) => m.name === r)?.data.enum?.map((m) => m.value.toString()) || [] : [];
|
|
278
|
+
}, N = (t, p, n, r, m) => {
|
|
279
|
+
const d = m(n, t.taskType);
|
|
280
280
|
return {
|
|
281
281
|
id: t.id + A + p,
|
|
282
282
|
// unique id for the task in the folder
|
|
283
283
|
entityId: t.id,
|
|
284
|
-
entityType:
|
|
284
|
+
entityType: n,
|
|
285
285
|
parentId: t.folderId,
|
|
286
286
|
name: t.name || "",
|
|
287
287
|
label: t.label || t.name || "",
|
|
@@ -297,7 +297,7 @@ const P = "next-page", v = "_ungrouped", A = "__", h = (t) => t ? Array.isArray(
|
|
|
297
297
|
ownAttrib: t.ownAttrib,
|
|
298
298
|
parents: t.parents || [],
|
|
299
299
|
updatedAt: t.updatedAt,
|
|
300
|
-
links: E(t.links,
|
|
300
|
+
links: E(t.links, n, {
|
|
301
301
|
folderTypes: r?.folderTypes || [],
|
|
302
302
|
productTypes: Object.values(r.productTypes) || [],
|
|
303
303
|
taskTypes: r?.taskTypes || []
|
|
@@ -306,18 +306,18 @@ const P = "next-page", v = "_ungrouped", A = "__", h = (t) => t ? Array.isArray(
|
|
|
306
306
|
}, Ip = ({
|
|
307
307
|
entities: t,
|
|
308
308
|
entityType: p,
|
|
309
|
-
groups:
|
|
309
|
+
groups: n = [],
|
|
310
310
|
attribFields: r,
|
|
311
311
|
showEmpty: m,
|
|
312
312
|
groupRowFunc: d
|
|
313
313
|
// for versions etc
|
|
314
314
|
}) => {
|
|
315
315
|
const g = _(), R = D({ projectInfo: g }), f = x(
|
|
316
|
-
(a,
|
|
317
|
-
const l = d ? d(a) : N(a,
|
|
316
|
+
(a, s) => {
|
|
317
|
+
const l = d ? d(a) : N(a, s, p, g, R);
|
|
318
318
|
return {
|
|
319
319
|
...l,
|
|
320
|
-
id: a.id + A +
|
|
320
|
+
id: a.id + A + s,
|
|
321
321
|
// unique id for the task in the group
|
|
322
322
|
subRows: l.subRows || []
|
|
323
323
|
};
|
|
@@ -325,10 +325,10 @@ const P = "next-page", v = "_ungrouped", A = "__", h = (t) => t ? Array.isArray(
|
|
|
325
325
|
[d, R, p, g]
|
|
326
326
|
);
|
|
327
327
|
return (a) => {
|
|
328
|
-
const
|
|
329
|
-
for (const e of
|
|
330
|
-
const i = e.value?.toString(), u = O(i), o = U(a.id, i,
|
|
331
|
-
|
|
328
|
+
const s = /* @__PURE__ */ new Map();
|
|
329
|
+
for (const e of n) {
|
|
330
|
+
const i = e.value?.toString(), u = O(i), o = U(a.id, i, n);
|
|
331
|
+
s.set(i, {
|
|
332
332
|
id: u,
|
|
333
333
|
name: i,
|
|
334
334
|
entityType: "group",
|
|
@@ -339,7 +339,7 @@ const P = "next-page", v = "_ungrouped", A = "__", h = (t) => t ? Array.isArray(
|
|
|
339
339
|
});
|
|
340
340
|
}
|
|
341
341
|
const l = c + "." + v, w = () => {
|
|
342
|
-
let e =
|
|
342
|
+
let e = s.get(l);
|
|
343
343
|
return e || (e = {
|
|
344
344
|
id: l,
|
|
345
345
|
name: "Ungrouped",
|
|
@@ -348,7 +348,7 @@ const P = "next-page", v = "_ungrouped", A = "__", h = (t) => t ? Array.isArray(
|
|
|
348
348
|
label: "Ungrouped",
|
|
349
349
|
group: { value: l, label: "Ungrouped" },
|
|
350
350
|
links: {}
|
|
351
|
-
},
|
|
351
|
+
}, s.set(l, e)), e;
|
|
352
352
|
};
|
|
353
353
|
for (const [e, i] of t) {
|
|
354
354
|
if (i.entityType !== p) continue;
|
|
@@ -360,13 +360,13 @@ const P = "next-page", v = "_ungrouped", A = "__", h = (t) => t ? Array.isArray(
|
|
|
360
360
|
u = h(i[a.id]);
|
|
361
361
|
u.length === 0 && w().subRows?.push(f(i, v));
|
|
362
362
|
for (const o of u) {
|
|
363
|
-
const T =
|
|
363
|
+
const T = s.get(o);
|
|
364
364
|
T ? T.subRows?.push(f(i, o)) : w().subRows?.push(f(i, v));
|
|
365
365
|
}
|
|
366
366
|
if ("groups" in i && Array.isArray(i.groups)) {
|
|
367
367
|
for (const o of i.groups)
|
|
368
|
-
if (o.hasNextPage &&
|
|
369
|
-
const G =
|
|
368
|
+
if (o.hasNextPage && s.has(o.value)) {
|
|
369
|
+
const G = s.get(o.value);
|
|
370
370
|
G && G.subRows?.push({
|
|
371
371
|
id: `${o.value}-next-page`,
|
|
372
372
|
name: "Load more tasks...",
|
|
@@ -379,7 +379,7 @@ const P = "next-page", v = "_ungrouped", A = "__", h = (t) => t ? Array.isArray(
|
|
|
379
379
|
}
|
|
380
380
|
}
|
|
381
381
|
}
|
|
382
|
-
const b = Array.from(
|
|
382
|
+
const b = Array.from(s.values()), y = S(a, g, r);
|
|
383
383
|
b.sort((e, i) => {
|
|
384
384
|
if (e.group?.value === l) return 1;
|
|
385
385
|
if (i.group?.value === l) return -1;
|
|
@@ -389,7 +389,7 @@ const P = "next-page", v = "_ungrouped", A = "__", h = (t) => t ? Array.isArray(
|
|
|
389
389
|
} else
|
|
390
390
|
return e.group?.label?.localeCompare(i.group?.label || "") || 0;
|
|
391
391
|
});
|
|
392
|
-
const I = b.filter((e) => e.
|
|
392
|
+
const I = b.filter((e) => e.group?.count && e.group.count > 0);
|
|
393
393
|
return m ? b : I;
|
|
394
394
|
};
|
|
395
395
|
};
|