@ynput/ayon-frontend-shared 0.2.12 → 0.2.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/DetailsPanel.cjs.js +1 -0
- package/dist/DetailsPanel.cjs.js.map +1 -1
- package/dist/DetailsPanel.es.js +1 -0
- package/dist/DetailsPanel.es.js.map +1 -1
- package/dist/Slicer.cjs.js +2 -0
- package/dist/Slicer.cjs.js.map +1 -1
- package/dist/Slicer.es.js +3 -1
- package/dist/Slicer.es.js.map +1 -1
- package/dist/components.cjs.js +6 -0
- package/dist/components.cjs.js.map +1 -1
- package/dist/components.es.js +7 -1
- package/dist/components.es.js.map +1 -1
- package/dist/index.cjs.js +1 -0
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.es.js +1 -0
- package/dist/index.es.js.map +1 -1
- package/dist/shared/src/api/generated/actions.cjs.js.map +1 -1
- package/dist/shared/src/api/generated/actions.es.js.map +1 -1
- package/dist/shared/src/api/generated/system.cjs.js.map +1 -1
- package/dist/shared/src/api/generated/system.es.js.map +1 -1
- package/dist/shared/src/api/queries/users/updateUsers.cjs.js +4 -9
- package/dist/shared/src/api/queries/users/updateUsers.cjs.js.map +1 -1
- package/dist/shared/src/api/queries/users/updateUsers.es.js +4 -9
- package/dist/shared/src/api/queries/users/updateUsers.es.js.map +1 -1
- package/dist/shared/src/components/EntityThumbnailUploader/EntityThumbnailUploader.cjs.js +1 -0
- package/dist/shared/src/components/EntityThumbnailUploader/EntityThumbnailUploader.cjs.js.map +1 -1
- package/dist/shared/src/components/EntityThumbnailUploader/EntityThumbnailUploader.es.js +1 -0
- package/dist/shared/src/components/EntityThumbnailUploader/EntityThumbnailUploader.es.js.map +1 -1
- package/dist/shared/src/components/ReviewablesList/ReviewablesList.cjs.js +1 -0
- package/dist/shared/src/components/ReviewablesList/ReviewablesList.cjs.js.map +1 -1
- package/dist/shared/src/components/ReviewablesList/ReviewablesList.es.js +1 -0
- package/dist/shared/src/components/ReviewablesList/ReviewablesList.es.js.map +1 -1
- package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.cjs.js +1 -0
- package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.cjs.js.map +1 -1
- package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.es.js +1 -0
- package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.es.js.map +1 -1
- package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.cjs.js +1 -0
- package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.cjs.js.map +1 -1
- package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.es.js +1 -0
- package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.es.js.map +1 -1
- package/dist/shared/src/components/SearchFilter/filterDates.cjs.js +167 -0
- package/dist/shared/src/components/SearchFilter/filterDates.cjs.js.map +1 -0
- package/dist/shared/src/components/SearchFilter/filterDates.es.js +167 -0
- package/dist/shared/src/components/SearchFilter/filterDates.es.js.map +1 -0
- package/dist/shared/src/components/SearchFilter/useBuildFilterOptions.cjs.js +548 -0
- package/dist/shared/src/components/SearchFilter/useBuildFilterOptions.cjs.js.map +1 -0
- package/dist/shared/src/components/SearchFilter/useBuildFilterOptions.es.js +548 -0
- package/dist/shared/src/components/SearchFilter/useBuildFilterOptions.es.js.map +1 -0
- package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.cjs.js +19 -3
- package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.cjs.js.map +1 -1
- package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.es.js +20 -4
- package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.es.js.map +1 -1
- package/dist/shared/src/containers/Actions/ActionConfigDialog.cjs.js +1 -0
- package/dist/shared/src/containers/Actions/ActionConfigDialog.cjs.js.map +1 -1
- package/dist/shared/src/containers/Actions/ActionConfigDialog.es.js +1 -0
- package/dist/shared/src/containers/Actions/ActionConfigDialog.es.js.map +1 -1
- package/dist/shared/src/containers/Actions/Actions.cjs.js +1 -0
- package/dist/shared/src/containers/Actions/Actions.cjs.js.map +1 -1
- package/dist/shared/src/containers/Actions/Actions.es.js +1 -0
- package/dist/shared/src/containers/Actions/Actions.es.js.map +1 -1
- package/dist/shared/src/containers/Actions/InteractiveActionDialog.cjs.js +1 -0
- package/dist/shared/src/containers/Actions/InteractiveActionDialog.cjs.js.map +1 -1
- package/dist/shared/src/containers/Actions/InteractiveActionDialog.es.js +1 -0
- package/dist/shared/src/containers/Actions/InteractiveActionDialog.es.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js +1 -0
- package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js +1 -0
- package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.cjs.js +1 -0
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.cjs.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.es.js +1 -0
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.es.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.cjs.js +1 -0
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.cjs.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.es.js +1 -0
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.es.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.cjs.js +1 -0
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.cjs.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.es.js +1 -0
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.es.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.cjs.js +1 -1
- package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.cjs.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.es.js +1 -1
- package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.es.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/CommentInput/hooks/useAnnotationsSync.cjs.js +4 -1
- package/dist/shared/src/containers/Feed/components/CommentInput/hooks/useAnnotationsSync.cjs.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/CommentInput/hooks/useAnnotationsSync.es.js +4 -1
- package/dist/shared/src/containers/Feed/components/CommentInput/hooks/useAnnotationsSync.es.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/CommentInput/hooks/useAnnotationsUpload.cjs.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/CommentInput/hooks/useAnnotationsUpload.es.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/FileUploadCard/FileUploadCard.cjs.js +21 -11
- package/dist/shared/src/containers/Feed/components/FileUploadCard/FileUploadCard.cjs.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/FileUploadCard/FileUploadCard.es.js +21 -11
- package/dist/shared/src/containers/Feed/components/FileUploadCard/FileUploadCard.es.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/FileUploadCard/FileUploadCard.styled.cjs.js +6 -0
- package/dist/shared/src/containers/Feed/components/FileUploadCard/FileUploadCard.styled.cjs.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/FileUploadCard/FileUploadCard.styled.es.js +6 -0
- package/dist/shared/src/containers/Feed/components/FileUploadCard/FileUploadCard.styled.es.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/FilesGrid/FilesGrid.cjs.js +3 -3
- package/dist/shared/src/containers/Feed/components/FilesGrid/FilesGrid.cjs.js.map +1 -1
- package/dist/shared/src/containers/Feed/components/FilesGrid/FilesGrid.es.js +3 -3
- package/dist/shared/src/containers/Feed/components/FilesGrid/FilesGrid.es.js.map +1 -1
- package/dist/shared/src/containers/Feed/helpers/mergeAnnotationAttachments.cjs.js +2 -1
- package/dist/shared/src/containers/Feed/helpers/mergeAnnotationAttachments.cjs.js.map +1 -1
- package/dist/shared/src/containers/Feed/helpers/mergeAnnotationAttachments.es.js +2 -1
- package/dist/shared/src/containers/Feed/helpers/mergeAnnotationAttachments.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 +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.cjs.js +2 -0
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.es.js +2 -0
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.es.js.map +1 -1
- package/dist/shared/src/containers/RepresentationsList/RepresentationsList.cjs.js +1 -0
- package/dist/shared/src/containers/RepresentationsList/RepresentationsList.cjs.js.map +1 -1
- package/dist/shared/src/containers/RepresentationsList/RepresentationsList.es.js +1 -0
- package/dist/shared/src/containers/RepresentationsList/RepresentationsList.es.js.map +1 -1
- package/dist/shared/src/containers/Slicer/useFiltersWithHierarchy.cjs.js +37 -0
- package/dist/shared/src/containers/Slicer/useFiltersWithHierarchy.cjs.js.map +1 -0
- package/dist/shared/src/containers/Slicer/useFiltersWithHierarchy.es.js +37 -0
- package/dist/shared/src/containers/Slicer/useFiltersWithHierarchy.es.js.map +1 -0
- package/dist/types/api/generated/actions.d.ts +1 -1
- package/dist/types/api/generated/system.d.ts +1 -0
- package/dist/types/api/queries/users/updateUsers.d.ts +1492 -0
- package/dist/types/components/SearchFilter/filterDates.d.ts +56 -0
- package/dist/types/components/SearchFilter/index.d.ts +2 -0
- package/dist/types/components/SearchFilter/useBuildFilterOptions.d.ts +30 -0
- package/dist/types/components/index.d.ts +1 -0
- package/dist/types/containers/Feed/components/CommentInput/hooks/useAnnotationsSync.d.ts +1 -1
- package/dist/types/containers/Feed/components/CommentInput/hooks/useAnnotationsUpload.d.ts +1 -1
- package/dist/types/containers/Feed/components/FileUploadCard/FileUploadCard.d.ts +4 -3
- package/dist/types/containers/Slicer/index.d.ts +1 -0
- package/dist/types/containers/Slicer/useFiltersWithHierarchy.d.ts +10 -0
- package/package.json +1 -1
package/dist/shared/src/components/EntityThumbnailUploader/EntityThumbnailUploader.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityThumbnailUploader.es.js","sources":["../../../../../src/components/EntityThumbnailUploader/EntityThumbnailUploader.tsx"],"sourcesContent":["import { useRef, useState } from 'react'\nimport clsx from 'clsx'\n\nimport { ThumbnailUploader } from '@shared/components'\nimport { ThumbnailWrapper } from '@shared/containers'\nimport { useUpdateEntitiesMutation } from '@shared/api'\nimport * as Styled from './EntityThumbnailUploader.styled'\nimport { ThumbnailUploadProvider } from '../../context/ThumbnailUploaderContext'\n\ntype Operation = {\n id: string\n projectName: string\n currentAssignees: any[]\n data: { updatedAt: string }\n}\nexport type EntityThumbnailUploaderProps = {\n entityType: string\n entities: any[]\n isCompact?: boolean\n projectName: any\n children?: JSX.Element | JSX.Element[]\n onUploaded?: (operations: Operation[]) => void\n resetFileUploadState?: () => void\n}\n\nexport const EntityThumbnailUploader = ({\n children = [],\n entityType,\n entities = [],\n isCompact = false,\n onUploaded,\n}: EntityThumbnailUploaderProps) => {\n const [isDraggingFile, setIsDraggingFile] = useState(false)\n const [isUploadingFile, setIsUploadingFile] = useState(false)\n\n const [updateEntities] = useUpdateEntitiesMutation()\n\n const handleThumbnailUpload = async (thumbnails: any[] = []) => {\n // always set isDraggingFile to false\n setIsDraggingFile(false)\n setIsUploadingFile(false)\n\n // check something was actually uploaded\n if (!entities.length) {\n return\n }\n\n // patching the updatedAt will force a refresh of the thumbnail url\n const newUpdatedAt = new Date().toISOString()\n\n let operations: Operation[] = []\n let versionPatches = []\n\n for (const entity of thumbnails) {\n const entityToPatch = entities.find((e) => e.id === entity.id)\n if (!entityToPatch) continue\n const thumbnailId = entity.thumbnailId\n const currentAssignees = entity.users || []\n\n operations.push({\n id: entityToPatch.id,\n projectName: entityToPatch.projectName,\n data: { updatedAt: newUpdatedAt },\n currentAssignees,\n })\n\n const versionPatch = {\n productId: entityToPatch.productId,\n versionUpdatedAt: newUpdatedAt,\n versionThumbnailId: thumbnailId,\n }\n\n versionPatches.push(versionPatch)\n }\n\n try {\n await updateEntities({ operations, entityType })\n onUploaded && onUploaded(operations)\n } catch (error) {\n console.error('Error uploading thumbnail:', error)\n }\n }\n\n const inputRef = useRef<HTMLInputElement>(null)\n\n return (\n <ThumbnailUploadProvider\n entities={entities}\n handleThumbnailUpload={handleThumbnailUpload}\n inputRef={inputRef}\n >\n <Styled.DragAndDropWrapper\n className={clsx({ isCompact })}\n onDragEnter={() => setIsDraggingFile(true)}\n >\n <ThumbnailWrapper>\n <div>{children}</div>\n </ThumbnailWrapper>\n <ThumbnailUploader\n entities={entities}\n inputRef={inputRef}\n className={clsx('thumbnail-uploader', { hidden: !isDraggingFile && !isUploadingFile })}\n onUploadInProgress={() => setIsUploadingFile(true)}\n onFinish={handleThumbnailUpload}\n onDragLeave={() => setIsDraggingFile(false)}\n onDragOver={(e) => e.preventDefault()}\n />\n </Styled.DragAndDropWrapper>\n </ThumbnailUploadProvider>\n )\n}\n"],"names":["jsx","jsxs","Styled.DragAndDropWrapper"],"mappings":"
|
|
1
|
+
{"version":3,"file":"EntityThumbnailUploader.es.js","sources":["../../../../../src/components/EntityThumbnailUploader/EntityThumbnailUploader.tsx"],"sourcesContent":["import { useRef, useState } from 'react'\nimport clsx from 'clsx'\n\nimport { ThumbnailUploader } from '@shared/components'\nimport { ThumbnailWrapper } from '@shared/containers'\nimport { useUpdateEntitiesMutation } from '@shared/api'\nimport * as Styled from './EntityThumbnailUploader.styled'\nimport { ThumbnailUploadProvider } from '../../context/ThumbnailUploaderContext'\n\ntype Operation = {\n id: string\n projectName: string\n currentAssignees: any[]\n data: { updatedAt: string }\n}\nexport type EntityThumbnailUploaderProps = {\n entityType: string\n entities: any[]\n isCompact?: boolean\n projectName: any\n children?: JSX.Element | JSX.Element[]\n onUploaded?: (operations: Operation[]) => void\n resetFileUploadState?: () => void\n}\n\nexport const EntityThumbnailUploader = ({\n children = [],\n entityType,\n entities = [],\n isCompact = false,\n onUploaded,\n}: EntityThumbnailUploaderProps) => {\n const [isDraggingFile, setIsDraggingFile] = useState(false)\n const [isUploadingFile, setIsUploadingFile] = useState(false)\n\n const [updateEntities] = useUpdateEntitiesMutation()\n\n const handleThumbnailUpload = async (thumbnails: any[] = []) => {\n // always set isDraggingFile to false\n setIsDraggingFile(false)\n setIsUploadingFile(false)\n\n // check something was actually uploaded\n if (!entities.length) {\n return\n }\n\n // patching the updatedAt will force a refresh of the thumbnail url\n const newUpdatedAt = new Date().toISOString()\n\n let operations: Operation[] = []\n let versionPatches = []\n\n for (const entity of thumbnails) {\n const entityToPatch = entities.find((e) => e.id === entity.id)\n if (!entityToPatch) continue\n const thumbnailId = entity.thumbnailId\n const currentAssignees = entity.users || []\n\n operations.push({\n id: entityToPatch.id,\n projectName: entityToPatch.projectName,\n data: { updatedAt: newUpdatedAt },\n currentAssignees,\n })\n\n const versionPatch = {\n productId: entityToPatch.productId,\n versionUpdatedAt: newUpdatedAt,\n versionThumbnailId: thumbnailId,\n }\n\n versionPatches.push(versionPatch)\n }\n\n try {\n await updateEntities({ operations, entityType })\n onUploaded && onUploaded(operations)\n } catch (error) {\n console.error('Error uploading thumbnail:', error)\n }\n }\n\n const inputRef = useRef<HTMLInputElement>(null)\n\n return (\n <ThumbnailUploadProvider\n entities={entities}\n handleThumbnailUpload={handleThumbnailUpload}\n inputRef={inputRef}\n >\n <Styled.DragAndDropWrapper\n className={clsx({ isCompact })}\n onDragEnter={() => setIsDraggingFile(true)}\n >\n <ThumbnailWrapper>\n <div>{children}</div>\n </ThumbnailWrapper>\n <ThumbnailUploader\n entities={entities}\n inputRef={inputRef}\n className={clsx('thumbnail-uploader', { hidden: !isDraggingFile && !isUploadingFile })}\n onUploadInProgress={() => setIsUploadingFile(true)}\n onFinish={handleThumbnailUpload}\n onDragLeave={() => setIsDraggingFile(false)}\n onDragOver={(e) => e.preventDefault()}\n />\n </Styled.DragAndDropWrapper>\n </ThumbnailUploadProvider>\n )\n}\n"],"names":["jsx","jsxs","Styled.DragAndDropWrapper"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyBO,MAAM,0BAA0B,CAAC;AAAA,EACtC,WAAW,CAAC;AAAA,EACZ;AAAA,EACA,WAAW,CAAC;AAAA,EACZ,YAAY;AAAA,EACZ;AACF,MAAoC;AAClC,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAS,KAAK;AAC1D,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAS,KAAK;AAEtD,QAAA,CAAC,cAAc,IAAI,0BAA0B;AAEnD,QAAM,wBAAwB,OAAO,aAAoB,OAAO;AAE9D,sBAAkB,KAAK;AACvB,uBAAmB,KAAK;AAGpB,QAAA,CAAC,SAAS,QAAQ;AACpB;AAAA,IAAA;AAIF,UAAM,gBAAe,oBAAI,KAAK,GAAE,YAAY;AAE5C,QAAI,aAA0B,CAAC;AAG/B,eAAW,UAAU,YAAY;AACzB,YAAA,gBAAgB,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO,EAAE;AAC7D,UAAI,CAAC,cAAe;AACA,aAAO;AACrB,YAAA,mBAAmB,OAAO,SAAS,CAAC;AAE1C,iBAAW,KAAK;AAAA,QACd,IAAI,cAAc;AAAA,QAClB,aAAa,cAAc;AAAA,QAC3B,MAAM,EAAE,WAAW,aAAa;AAAA,QAChC;AAAA,MAAA,CACD;AAEoB,OAAA;AAAA,QACnB,WAAW,cAAc;AAAA,MAG3B;AAAA,IAEgC;AAG9B,QAAA;AACF,YAAM,eAAe,EAAE,YAAY,YAAY;AAC/C,oBAAc,WAAW,UAAU;AAAA,aAC5B,OAAO;AACN,cAAA,MAAM,8BAA8B,KAAK;AAAA,IAAA;AAAA,EAErD;AAEM,QAAA,WAAW,OAAyB,IAAI;AAG5C,SAAAA,kCAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MAEA,UAAAC,kCAAA;AAAA,QAACC;AAAAA,QAAA;AAAA,UACC,WAAW,KAAK,EAAE,WAAW;AAAA,UAC7B,aAAa,MAAM,kBAAkB,IAAI;AAAA,UAEzC,UAAA;AAAA,YAAAF,sCAAC,kBACC,EAAA,UAAAA,kCAAAA,IAAC,OAAK,EAAA,SAAS,CAAA,GACjB;AAAA,YACAA,kCAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC;AAAA,gBACA;AAAA,gBACA,WAAW,KAAK,sBAAsB,EAAE,QAAQ,CAAC,kBAAkB,CAAC,iBAAiB;AAAA,gBACrF,oBAAoB,MAAM,mBAAmB,IAAI;AAAA,gBACjD,UAAU;AAAA,gBACV,aAAa,MAAM,kBAAkB,KAAK;AAAA,gBAC1C,YAAY,CAAC,MAAM,EAAE,eAAe;AAAA,cAAA;AAAA,YAAA;AAAA,UACtC;AAAA,QAAA;AAAA,MAAA;AAAA,IACF;AAAA,EACF;AAEJ;"}
|
|
@@ -175,6 +175,7 @@ require("../SettingsPanel/SettingsPanel.cjs.js");
|
|
|
175
175
|
require("../SettingsPanel/SettingsPanelItemTemplate.cjs.js");
|
|
176
176
|
require("../AttributeEditor/components/MinMaxField.cjs.js");
|
|
177
177
|
require("../EnumEditor/EnumEditor.styled.cjs.js");
|
|
178
|
+
require("../SearchFilter/filterDates.cjs.js");
|
|
178
179
|
const ReviewablesList = ({
|
|
179
180
|
projectName,
|
|
180
181
|
versionId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReviewablesList.cjs.js","sources":["../../../../../src/components/ReviewablesList/ReviewablesList.tsx"],"sourcesContent":["import { FC, MouseEvent, useState } from 'react'\n// queries\nimport { useGetReviewablesForVersionQuery, useHasTranscoderQuery } from '@shared/api'\nimport { useDeleteReviewableMutation, useSortVersionReviewablesMutation } from '@shared/api'\n\n// DND\nimport {\n DndContext,\n closestCenter,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n UniqueIdentifier,\n DragEndEvent,\n DragOverlay,\n DragStartEvent,\n} from '@dnd-kit/core'\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n verticalListSortingStrategy,\n} from '@dnd-kit/sortable'\n\n// components\nimport { ReviewableCard, ReviewableProgressCard } from '@shared/components'\nimport SortableReviewableCard from './SortableReviewableCard'\nimport * as Styled from './ReviewablesList.styled'\nimport { toast } from 'react-toastify'\n\n// utils\nimport { getGroupedReviewables } from './getGroupedReviewables'\nimport { useCreateContextMenu } from '@shared/containers/ContextMenu'\nimport { confirmDelete } from '@shared/util'\nimport EditReviewableDialog from './EditReviewableDialog'\nimport ReviewableUpload from './ReviewablesUpload'\nimport { useDetailsPanelContext } from '@shared/context'\n\ninterface ReviewablesListProps {\n projectName: string\n versionId: string\n productId: string\n isLoadingVersion: boolean\n scope: string\n}\n\nconst ReviewablesList: FC<ReviewablesListProps> = ({\n projectName,\n versionId,\n productId,\n isLoadingVersion,\n scope,\n}) => {\n const { onOpenViewer, user, viewer } = useDetailsPanelContext()\n // returns all reviewables for a product\n const {\n data: versionReviewables,\n isFetching: isFetchingReviewables,\n currentData,\n } = useGetReviewablesForVersionQuery(\n { projectName, versionId: versionId },\n { skip: !versionId || !projectName },\n )\n\n // do we have the premium transcoder?\n const { data: hasTranscoder } = useHasTranscoderQuery(undefined)\n\n // are we currently looking at review? (is it selected in the viewer)\n const reviewableIds = viewer?.reviewableIds || []\n const userName = user.name\n const currentIsUser = user.data?.isUser\n\n // either null or the reviewable id we are editing\n const [editActivityId, setEditActivityId] = useState<null | string>(null)\n\n // dragging activeId\n const [activeId, setActiveId] = useState<null | string>(null)\n\n const sensors = useSensors(\n useSensor(PointerSensor),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n }),\n )\n\n const reviewables = versionReviewables?.reviewables || []\n const draggingReview = reviewables.find((reviewable) => reviewable.fileId === activeId)\n\n const currentVersionId = currentData?.id\n const queryingNewVersion = versionId !== currentVersionId\n\n const isLoading = (isFetchingReviewables && queryingNewVersion) || isLoadingVersion\n\n const handleReviewableClick = (event: MouseEvent<HTMLDivElement>) => {\n // check are not dragging\n if (activeId) return console.log('Dragging, cannot open review')\n\n // get the reviewable id\n const id = event.currentTarget.id\n if (!id || !productId) return console.error('No reviewable id or product id')\n\n const reviewable = reviewables.find((reviewable) => reviewable.fileId === id)\n console.debug(reviewable)\n console.debug(reviewable?.mediaInfo)\n\n // open the reviewable dialog\n onOpenViewer?.({\n projectName: projectName,\n productId: productId,\n versionIds: [versionId],\n reviewableIds: [id],\n })\n }\n\n const { optimized, unoptimized, incompatible, processing, queued } = getGroupedReviewables(\n reviewables,\n hasTranscoder,\n )\n\n const sortableReviewables = [...optimized, ...unoptimized]\n\n function handleDragStart(event: DragStartEvent) {\n const { active } = event\n\n setActiveId(active.id as string)\n }\n\n const [sortVersionReviewables] = useSortVersionReviewablesMutation()\n\n const handleDragEnd = async (event: DragEndEvent) => {\n const { active, over } = event\n\n if (over?.id && active.id !== over.id) {\n console.log('update review position')\n\n const oldIndex = sortableReviewables.findIndex(\n (reviewable) => reviewable.fileId === active.id,\n )\n const newIndex = sortableReviewables.findIndex((reviewable) => reviewable.fileId === over.id)\n\n // resort the reviewables\n const newReviewables = arrayMove(sortableReviewables, oldIndex, newIndex)\n\n const newOrder = newReviewables.map((reviewable) => reviewable.activityId)\n\n try {\n // update the reviewables\n sortVersionReviewables({\n projectName,\n versionId,\n sortReviewablesRequest: { sort: newOrder },\n }).unwrap()\n } catch (error) {\n toast.error('Error sorting reviewables')\n }\n }\n setActiveId(null)\n }\n\n const overlayModifiers = []\n // hack to make the dnd overlay pos work inside dialog\n if (scope === 'review') {\n overlayModifiers.push((args: any) => ({\n ...args.transform,\n x: args.transform.x - 32,\n y: args.transform.y - 32,\n }))\n }\n\n let incompatibleMessage = ''\n if (!hasTranscoder) {\n incompatibleMessage = `The conversion transcoder is only supported on [**Ynput Cloud**](https://ynput.cloud/subscribe/ayon). Please subscribe or [contact support](https://ynput.io/services/) for more information.`\n } else {\n incompatibleMessage = 'The file is not supported by the transcoder'\n }\n\n const handleDownloadFile = (fileId: string, fileName: string = '') => {\n let url = `/api/projects/${projectName}/files/${fileId}`\n\n // if (codec) url += `.${codec}`\n\n // Create an invisible anchor element\n const a = document.createElement('a')\n a.href = url\n a.download = fileName\n document.body.appendChild(a)\n\n // Trigger a click event on the anchor element\n a.click()\n\n // Remove the anchor element from the document\n document.body.removeChild(a)\n }\n\n const [deleteReviewable] = useDeleteReviewableMutation()\n\n const handleDelete = async (activityId: string, label: string) => {\n // @ts-ignore\n confirmDelete({\n header: 'Delete ' + label,\n message: 'Are you sure you want to delete this reviewable?',\n accept: async () => {\n try {\n await deleteReviewable({ activityId, projectName }).unwrap()\n } catch (error) {\n toast.error('Failed to delete reviewable')\n }\n },\n })\n }\n\n // create the ref and model\n const [ctxMenuShow] = useCreateContextMenu()\n\n const handleContextMenu = (event: MouseEvent<HTMLDivElement>) => {\n // get the reviewable by id\n const id = event.currentTarget.id\n\n if (!id) return\n\n const reviewable = reviewables.find((reviewable) => reviewable.fileId === id)\n\n if (!reviewable) return\n\n const originalFileId = reviewable.createdFrom || reviewable.fileId\n const originalReviewable = reviewables.find(\n (reviewable) => reviewable.fileId === originalFileId,\n )\n\n const items: {\n label: string\n icon: string\n onClick?: () => void\n disabled?: boolean\n danger?: boolean\n }[] = [\n {\n label: 'Download original',\n icon: 'download',\n onClick: () => handleDownloadFile(originalFileId, originalReviewable?.filename),\n disabled: !originalReviewable,\n },\n ]\n\n if (userName === reviewable.author.name || !currentIsUser) {\n items.push({\n label: 'Delete',\n icon: 'delete',\n onClick: () => handleDelete(reviewable.activityId, reviewable.label || reviewable.filename),\n danger: true,\n })\n }\n\n // add author\n items.push({\n label: `Author: ${reviewable.author.fullName || reviewable.author.name}`,\n icon: 'person',\n disabled: true,\n })\n\n ctxMenuShow(event, items)\n }\n\n return (\n <>\n <ReviewableUpload projectName={projectName} versionId={versionId} productId={productId}>\n {isLoading ? (\n Array.from({ length: 3 }).map((_, index) => (\n <Styled.LoadingCard key={index} className=\"loading\" />\n ))\n ) : (\n <>\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n onDragCancel={() => setActiveId(null)}\n >\n <SortableContext\n items={reviewables.map(({ fileId }) => fileId as UniqueIdentifier)}\n strategy={verticalListSortingStrategy}\n >\n {sortableReviewables.map((reviewable) => (\n <SortableReviewableCard\n key={reviewable.fileId}\n projectName={projectName}\n onClick={handleReviewableClick}\n isSelected={reviewableIds.includes(reviewable.fileId)}\n isDragging={!!activeId}\n onContextMenu={handleContextMenu}\n onEdit={(e) => {\n e.stopPropagation()\n setEditActivityId(reviewable.activityId)\n }}\n {...reviewable}\n />\n ))}\n </SortableContext>\n\n {/* drag overlay */}\n <DragOverlay modifiers={overlayModifiers}>\n {draggingReview ? (\n <ReviewableCard\n {...draggingReview}\n projectName={projectName}\n isDragOverlay\n isDragging\n isSelected={reviewableIds.includes(draggingReview.fileId)}\n />\n ) : null}\n </DragOverlay>\n </DndContext>\n {processing.map((reviewable) => (\n <ReviewableProgressCard\n key={reviewable.fileId}\n name={reviewable.filename}\n type={'processing'}\n progress={reviewable.processing?.progress}\n fileId={reviewable.fileId}\n />\n ))}\n\n {queued.map((reviewable) => (\n <ReviewableProgressCard\n key={reviewable.fileId}\n name={reviewable.filename}\n type={'queued'}\n fileId={reviewable.fileId}\n />\n ))}\n\n {incompatible.map((reviewable) => (\n <ReviewableProgressCard\n key={reviewable.fileId}\n name={reviewable.filename}\n type={'unsupported'}\n tooltip={incompatibleMessage}\n src={`/api/projects/${projectName}/files/${reviewable.fileId}/thumbnail`}\n onContextMenu={handleContextMenu}\n fileId={reviewable.fileId}\n />\n ))}\n </>\n )}\n </ReviewableUpload>\n\n {editActivityId && (\n <EditReviewableDialog\n isOpen\n onClose={() => setEditActivityId(null)}\n label={\n reviewables.find((reviewable) => reviewable.activityId === editActivityId)?.label || ''\n }\n projectName={projectName}\n versionId={versionId}\n activityId={editActivityId}\n />\n )}\n </>\n )\n}\n\nexport default ReviewablesList\n"],"names":["useDetailsPanelContext","useGetReviewablesForVersionQuery","useHasTranscoderQuery","useState","useSensors","useSensor","PointerSensor","KeyboardSensor","sortableKeyboardCoordinates","reviewable","getGroupedReviewables","useSortVersionReviewablesMutation","arrayMove","toast","useDeleteReviewableMutation","confirmDelete","useCreateContextMenu","jsxs","Fragment","jsx","ReviewableUpload","Styled.LoadingCard","DndContext","closestCenter","SortableContext","verticalListSortingStrategy","DragOverlay","ReviewableCard","ReviewableProgressCard","_a"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ReviewablesList.cjs.js","sources":["../../../../../src/components/ReviewablesList/ReviewablesList.tsx"],"sourcesContent":["import { FC, MouseEvent, useState } from 'react'\n// queries\nimport { useGetReviewablesForVersionQuery, useHasTranscoderQuery } from '@shared/api'\nimport { useDeleteReviewableMutation, useSortVersionReviewablesMutation } from '@shared/api'\n\n// DND\nimport {\n DndContext,\n closestCenter,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n UniqueIdentifier,\n DragEndEvent,\n DragOverlay,\n DragStartEvent,\n} from '@dnd-kit/core'\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n verticalListSortingStrategy,\n} from '@dnd-kit/sortable'\n\n// components\nimport { ReviewableCard, ReviewableProgressCard } from '@shared/components'\nimport SortableReviewableCard from './SortableReviewableCard'\nimport * as Styled from './ReviewablesList.styled'\nimport { toast } from 'react-toastify'\n\n// utils\nimport { getGroupedReviewables } from './getGroupedReviewables'\nimport { useCreateContextMenu } from '@shared/containers/ContextMenu'\nimport { confirmDelete } from '@shared/util'\nimport EditReviewableDialog from './EditReviewableDialog'\nimport ReviewableUpload from './ReviewablesUpload'\nimport { useDetailsPanelContext } from '@shared/context'\n\ninterface ReviewablesListProps {\n projectName: string\n versionId: string\n productId: string\n isLoadingVersion: boolean\n scope: string\n}\n\nconst ReviewablesList: FC<ReviewablesListProps> = ({\n projectName,\n versionId,\n productId,\n isLoadingVersion,\n scope,\n}) => {\n const { onOpenViewer, user, viewer } = useDetailsPanelContext()\n // returns all reviewables for a product\n const {\n data: versionReviewables,\n isFetching: isFetchingReviewables,\n currentData,\n } = useGetReviewablesForVersionQuery(\n { projectName, versionId: versionId },\n { skip: !versionId || !projectName },\n )\n\n // do we have the premium transcoder?\n const { data: hasTranscoder } = useHasTranscoderQuery(undefined)\n\n // are we currently looking at review? (is it selected in the viewer)\n const reviewableIds = viewer?.reviewableIds || []\n const userName = user.name\n const currentIsUser = user.data?.isUser\n\n // either null or the reviewable id we are editing\n const [editActivityId, setEditActivityId] = useState<null | string>(null)\n\n // dragging activeId\n const [activeId, setActiveId] = useState<null | string>(null)\n\n const sensors = useSensors(\n useSensor(PointerSensor),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n }),\n )\n\n const reviewables = versionReviewables?.reviewables || []\n const draggingReview = reviewables.find((reviewable) => reviewable.fileId === activeId)\n\n const currentVersionId = currentData?.id\n const queryingNewVersion = versionId !== currentVersionId\n\n const isLoading = (isFetchingReviewables && queryingNewVersion) || isLoadingVersion\n\n const handleReviewableClick = (event: MouseEvent<HTMLDivElement>) => {\n // check are not dragging\n if (activeId) return console.log('Dragging, cannot open review')\n\n // get the reviewable id\n const id = event.currentTarget.id\n if (!id || !productId) return console.error('No reviewable id or product id')\n\n const reviewable = reviewables.find((reviewable) => reviewable.fileId === id)\n console.debug(reviewable)\n console.debug(reviewable?.mediaInfo)\n\n // open the reviewable dialog\n onOpenViewer?.({\n projectName: projectName,\n productId: productId,\n versionIds: [versionId],\n reviewableIds: [id],\n })\n }\n\n const { optimized, unoptimized, incompatible, processing, queued } = getGroupedReviewables(\n reviewables,\n hasTranscoder,\n )\n\n const sortableReviewables = [...optimized, ...unoptimized]\n\n function handleDragStart(event: DragStartEvent) {\n const { active } = event\n\n setActiveId(active.id as string)\n }\n\n const [sortVersionReviewables] = useSortVersionReviewablesMutation()\n\n const handleDragEnd = async (event: DragEndEvent) => {\n const { active, over } = event\n\n if (over?.id && active.id !== over.id) {\n console.log('update review position')\n\n const oldIndex = sortableReviewables.findIndex(\n (reviewable) => reviewable.fileId === active.id,\n )\n const newIndex = sortableReviewables.findIndex((reviewable) => reviewable.fileId === over.id)\n\n // resort the reviewables\n const newReviewables = arrayMove(sortableReviewables, oldIndex, newIndex)\n\n const newOrder = newReviewables.map((reviewable) => reviewable.activityId)\n\n try {\n // update the reviewables\n sortVersionReviewables({\n projectName,\n versionId,\n sortReviewablesRequest: { sort: newOrder },\n }).unwrap()\n } catch (error) {\n toast.error('Error sorting reviewables')\n }\n }\n setActiveId(null)\n }\n\n const overlayModifiers = []\n // hack to make the dnd overlay pos work inside dialog\n if (scope === 'review') {\n overlayModifiers.push((args: any) => ({\n ...args.transform,\n x: args.transform.x - 32,\n y: args.transform.y - 32,\n }))\n }\n\n let incompatibleMessage = ''\n if (!hasTranscoder) {\n incompatibleMessage = `The conversion transcoder is only supported on [**Ynput Cloud**](https://ynput.cloud/subscribe/ayon). Please subscribe or [contact support](https://ynput.io/services/) for more information.`\n } else {\n incompatibleMessage = 'The file is not supported by the transcoder'\n }\n\n const handleDownloadFile = (fileId: string, fileName: string = '') => {\n let url = `/api/projects/${projectName}/files/${fileId}`\n\n // if (codec) url += `.${codec}`\n\n // Create an invisible anchor element\n const a = document.createElement('a')\n a.href = url\n a.download = fileName\n document.body.appendChild(a)\n\n // Trigger a click event on the anchor element\n a.click()\n\n // Remove the anchor element from the document\n document.body.removeChild(a)\n }\n\n const [deleteReviewable] = useDeleteReviewableMutation()\n\n const handleDelete = async (activityId: string, label: string) => {\n // @ts-ignore\n confirmDelete({\n header: 'Delete ' + label,\n message: 'Are you sure you want to delete this reviewable?',\n accept: async () => {\n try {\n await deleteReviewable({ activityId, projectName }).unwrap()\n } catch (error) {\n toast.error('Failed to delete reviewable')\n }\n },\n })\n }\n\n // create the ref and model\n const [ctxMenuShow] = useCreateContextMenu()\n\n const handleContextMenu = (event: MouseEvent<HTMLDivElement>) => {\n // get the reviewable by id\n const id = event.currentTarget.id\n\n if (!id) return\n\n const reviewable = reviewables.find((reviewable) => reviewable.fileId === id)\n\n if (!reviewable) return\n\n const originalFileId = reviewable.createdFrom || reviewable.fileId\n const originalReviewable = reviewables.find(\n (reviewable) => reviewable.fileId === originalFileId,\n )\n\n const items: {\n label: string\n icon: string\n onClick?: () => void\n disabled?: boolean\n danger?: boolean\n }[] = [\n {\n label: 'Download original',\n icon: 'download',\n onClick: () => handleDownloadFile(originalFileId, originalReviewable?.filename),\n disabled: !originalReviewable,\n },\n ]\n\n if (userName === reviewable.author.name || !currentIsUser) {\n items.push({\n label: 'Delete',\n icon: 'delete',\n onClick: () => handleDelete(reviewable.activityId, reviewable.label || reviewable.filename),\n danger: true,\n })\n }\n\n // add author\n items.push({\n label: `Author: ${reviewable.author.fullName || reviewable.author.name}`,\n icon: 'person',\n disabled: true,\n })\n\n ctxMenuShow(event, items)\n }\n\n return (\n <>\n <ReviewableUpload projectName={projectName} versionId={versionId} productId={productId}>\n {isLoading ? (\n Array.from({ length: 3 }).map((_, index) => (\n <Styled.LoadingCard key={index} className=\"loading\" />\n ))\n ) : (\n <>\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n onDragCancel={() => setActiveId(null)}\n >\n <SortableContext\n items={reviewables.map(({ fileId }) => fileId as UniqueIdentifier)}\n strategy={verticalListSortingStrategy}\n >\n {sortableReviewables.map((reviewable) => (\n <SortableReviewableCard\n key={reviewable.fileId}\n projectName={projectName}\n onClick={handleReviewableClick}\n isSelected={reviewableIds.includes(reviewable.fileId)}\n isDragging={!!activeId}\n onContextMenu={handleContextMenu}\n onEdit={(e) => {\n e.stopPropagation()\n setEditActivityId(reviewable.activityId)\n }}\n {...reviewable}\n />\n ))}\n </SortableContext>\n\n {/* drag overlay */}\n <DragOverlay modifiers={overlayModifiers}>\n {draggingReview ? (\n <ReviewableCard\n {...draggingReview}\n projectName={projectName}\n isDragOverlay\n isDragging\n isSelected={reviewableIds.includes(draggingReview.fileId)}\n />\n ) : null}\n </DragOverlay>\n </DndContext>\n {processing.map((reviewable) => (\n <ReviewableProgressCard\n key={reviewable.fileId}\n name={reviewable.filename}\n type={'processing'}\n progress={reviewable.processing?.progress}\n fileId={reviewable.fileId}\n />\n ))}\n\n {queued.map((reviewable) => (\n <ReviewableProgressCard\n key={reviewable.fileId}\n name={reviewable.filename}\n type={'queued'}\n fileId={reviewable.fileId}\n />\n ))}\n\n {incompatible.map((reviewable) => (\n <ReviewableProgressCard\n key={reviewable.fileId}\n name={reviewable.filename}\n type={'unsupported'}\n tooltip={incompatibleMessage}\n src={`/api/projects/${projectName}/files/${reviewable.fileId}/thumbnail`}\n onContextMenu={handleContextMenu}\n fileId={reviewable.fileId}\n />\n ))}\n </>\n )}\n </ReviewableUpload>\n\n {editActivityId && (\n <EditReviewableDialog\n isOpen\n onClose={() => setEditActivityId(null)}\n label={\n reviewables.find((reviewable) => reviewable.activityId === editActivityId)?.label || ''\n }\n projectName={projectName}\n versionId={versionId}\n activityId={editActivityId}\n />\n )}\n </>\n )\n}\n\nexport default ReviewablesList\n"],"names":["useDetailsPanelContext","useGetReviewablesForVersionQuery","useHasTranscoderQuery","useState","useSensors","useSensor","PointerSensor","KeyboardSensor","sortableKeyboardCoordinates","reviewable","getGroupedReviewables","useSortVersionReviewablesMutation","arrayMove","toast","useDeleteReviewableMutation","confirmDelete","useCreateContextMenu","jsxs","Fragment","jsx","ReviewableUpload","Styled.LoadingCard","DndContext","closestCenter","SortableContext","verticalListSortingStrategy","DragOverlay","ReviewableCard","ReviewableProgressCard","_a"],"mappings":"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"}
|
|
@@ -174,6 +174,7 @@ import "../SettingsPanel/SettingsPanel.es.js";
|
|
|
174
174
|
import "../SettingsPanel/SettingsPanelItemTemplate.es.js";
|
|
175
175
|
import "../AttributeEditor/components/MinMaxField.es.js";
|
|
176
176
|
import "../EnumEditor/EnumEditor.styled.es.js";
|
|
177
|
+
import "../SearchFilter/filterDates.es.js";
|
|
177
178
|
const ReviewablesList = ({
|
|
178
179
|
projectName,
|
|
179
180
|
versionId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReviewablesList.es.js","sources":["../../../../../src/components/ReviewablesList/ReviewablesList.tsx"],"sourcesContent":["import { FC, MouseEvent, useState } from 'react'\n// queries\nimport { useGetReviewablesForVersionQuery, useHasTranscoderQuery } from '@shared/api'\nimport { useDeleteReviewableMutation, useSortVersionReviewablesMutation } from '@shared/api'\n\n// DND\nimport {\n DndContext,\n closestCenter,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n UniqueIdentifier,\n DragEndEvent,\n DragOverlay,\n DragStartEvent,\n} from '@dnd-kit/core'\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n verticalListSortingStrategy,\n} from '@dnd-kit/sortable'\n\n// components\nimport { ReviewableCard, ReviewableProgressCard } from '@shared/components'\nimport SortableReviewableCard from './SortableReviewableCard'\nimport * as Styled from './ReviewablesList.styled'\nimport { toast } from 'react-toastify'\n\n// utils\nimport { getGroupedReviewables } from './getGroupedReviewables'\nimport { useCreateContextMenu } from '@shared/containers/ContextMenu'\nimport { confirmDelete } from '@shared/util'\nimport EditReviewableDialog from './EditReviewableDialog'\nimport ReviewableUpload from './ReviewablesUpload'\nimport { useDetailsPanelContext } from '@shared/context'\n\ninterface ReviewablesListProps {\n projectName: string\n versionId: string\n productId: string\n isLoadingVersion: boolean\n scope: string\n}\n\nconst ReviewablesList: FC<ReviewablesListProps> = ({\n projectName,\n versionId,\n productId,\n isLoadingVersion,\n scope,\n}) => {\n const { onOpenViewer, user, viewer } = useDetailsPanelContext()\n // returns all reviewables for a product\n const {\n data: versionReviewables,\n isFetching: isFetchingReviewables,\n currentData,\n } = useGetReviewablesForVersionQuery(\n { projectName, versionId: versionId },\n { skip: !versionId || !projectName },\n )\n\n // do we have the premium transcoder?\n const { data: hasTranscoder } = useHasTranscoderQuery(undefined)\n\n // are we currently looking at review? (is it selected in the viewer)\n const reviewableIds = viewer?.reviewableIds || []\n const userName = user.name\n const currentIsUser = user.data?.isUser\n\n // either null or the reviewable id we are editing\n const [editActivityId, setEditActivityId] = useState<null | string>(null)\n\n // dragging activeId\n const [activeId, setActiveId] = useState<null | string>(null)\n\n const sensors = useSensors(\n useSensor(PointerSensor),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n }),\n )\n\n const reviewables = versionReviewables?.reviewables || []\n const draggingReview = reviewables.find((reviewable) => reviewable.fileId === activeId)\n\n const currentVersionId = currentData?.id\n const queryingNewVersion = versionId !== currentVersionId\n\n const isLoading = (isFetchingReviewables && queryingNewVersion) || isLoadingVersion\n\n const handleReviewableClick = (event: MouseEvent<HTMLDivElement>) => {\n // check are not dragging\n if (activeId) return console.log('Dragging, cannot open review')\n\n // get the reviewable id\n const id = event.currentTarget.id\n if (!id || !productId) return console.error('No reviewable id or product id')\n\n const reviewable = reviewables.find((reviewable) => reviewable.fileId === id)\n console.debug(reviewable)\n console.debug(reviewable?.mediaInfo)\n\n // open the reviewable dialog\n onOpenViewer?.({\n projectName: projectName,\n productId: productId,\n versionIds: [versionId],\n reviewableIds: [id],\n })\n }\n\n const { optimized, unoptimized, incompatible, processing, queued } = getGroupedReviewables(\n reviewables,\n hasTranscoder,\n )\n\n const sortableReviewables = [...optimized, ...unoptimized]\n\n function handleDragStart(event: DragStartEvent) {\n const { active } = event\n\n setActiveId(active.id as string)\n }\n\n const [sortVersionReviewables] = useSortVersionReviewablesMutation()\n\n const handleDragEnd = async (event: DragEndEvent) => {\n const { active, over } = event\n\n if (over?.id && active.id !== over.id) {\n console.log('update review position')\n\n const oldIndex = sortableReviewables.findIndex(\n (reviewable) => reviewable.fileId === active.id,\n )\n const newIndex = sortableReviewables.findIndex((reviewable) => reviewable.fileId === over.id)\n\n // resort the reviewables\n const newReviewables = arrayMove(sortableReviewables, oldIndex, newIndex)\n\n const newOrder = newReviewables.map((reviewable) => reviewable.activityId)\n\n try {\n // update the reviewables\n sortVersionReviewables({\n projectName,\n versionId,\n sortReviewablesRequest: { sort: newOrder },\n }).unwrap()\n } catch (error) {\n toast.error('Error sorting reviewables')\n }\n }\n setActiveId(null)\n }\n\n const overlayModifiers = []\n // hack to make the dnd overlay pos work inside dialog\n if (scope === 'review') {\n overlayModifiers.push((args: any) => ({\n ...args.transform,\n x: args.transform.x - 32,\n y: args.transform.y - 32,\n }))\n }\n\n let incompatibleMessage = ''\n if (!hasTranscoder) {\n incompatibleMessage = `The conversion transcoder is only supported on [**Ynput Cloud**](https://ynput.cloud/subscribe/ayon). Please subscribe or [contact support](https://ynput.io/services/) for more information.`\n } else {\n incompatibleMessage = 'The file is not supported by the transcoder'\n }\n\n const handleDownloadFile = (fileId: string, fileName: string = '') => {\n let url = `/api/projects/${projectName}/files/${fileId}`\n\n // if (codec) url += `.${codec}`\n\n // Create an invisible anchor element\n const a = document.createElement('a')\n a.href = url\n a.download = fileName\n document.body.appendChild(a)\n\n // Trigger a click event on the anchor element\n a.click()\n\n // Remove the anchor element from the document\n document.body.removeChild(a)\n }\n\n const [deleteReviewable] = useDeleteReviewableMutation()\n\n const handleDelete = async (activityId: string, label: string) => {\n // @ts-ignore\n confirmDelete({\n header: 'Delete ' + label,\n message: 'Are you sure you want to delete this reviewable?',\n accept: async () => {\n try {\n await deleteReviewable({ activityId, projectName }).unwrap()\n } catch (error) {\n toast.error('Failed to delete reviewable')\n }\n },\n })\n }\n\n // create the ref and model\n const [ctxMenuShow] = useCreateContextMenu()\n\n const handleContextMenu = (event: MouseEvent<HTMLDivElement>) => {\n // get the reviewable by id\n const id = event.currentTarget.id\n\n if (!id) return\n\n const reviewable = reviewables.find((reviewable) => reviewable.fileId === id)\n\n if (!reviewable) return\n\n const originalFileId = reviewable.createdFrom || reviewable.fileId\n const originalReviewable = reviewables.find(\n (reviewable) => reviewable.fileId === originalFileId,\n )\n\n const items: {\n label: string\n icon: string\n onClick?: () => void\n disabled?: boolean\n danger?: boolean\n }[] = [\n {\n label: 'Download original',\n icon: 'download',\n onClick: () => handleDownloadFile(originalFileId, originalReviewable?.filename),\n disabled: !originalReviewable,\n },\n ]\n\n if (userName === reviewable.author.name || !currentIsUser) {\n items.push({\n label: 'Delete',\n icon: 'delete',\n onClick: () => handleDelete(reviewable.activityId, reviewable.label || reviewable.filename),\n danger: true,\n })\n }\n\n // add author\n items.push({\n label: `Author: ${reviewable.author.fullName || reviewable.author.name}`,\n icon: 'person',\n disabled: true,\n })\n\n ctxMenuShow(event, items)\n }\n\n return (\n <>\n <ReviewableUpload projectName={projectName} versionId={versionId} productId={productId}>\n {isLoading ? (\n Array.from({ length: 3 }).map((_, index) => (\n <Styled.LoadingCard key={index} className=\"loading\" />\n ))\n ) : (\n <>\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n onDragCancel={() => setActiveId(null)}\n >\n <SortableContext\n items={reviewables.map(({ fileId }) => fileId as UniqueIdentifier)}\n strategy={verticalListSortingStrategy}\n >\n {sortableReviewables.map((reviewable) => (\n <SortableReviewableCard\n key={reviewable.fileId}\n projectName={projectName}\n onClick={handleReviewableClick}\n isSelected={reviewableIds.includes(reviewable.fileId)}\n isDragging={!!activeId}\n onContextMenu={handleContextMenu}\n onEdit={(e) => {\n e.stopPropagation()\n setEditActivityId(reviewable.activityId)\n }}\n {...reviewable}\n />\n ))}\n </SortableContext>\n\n {/* drag overlay */}\n <DragOverlay modifiers={overlayModifiers}>\n {draggingReview ? (\n <ReviewableCard\n {...draggingReview}\n projectName={projectName}\n isDragOverlay\n isDragging\n isSelected={reviewableIds.includes(draggingReview.fileId)}\n />\n ) : null}\n </DragOverlay>\n </DndContext>\n {processing.map((reviewable) => (\n <ReviewableProgressCard\n key={reviewable.fileId}\n name={reviewable.filename}\n type={'processing'}\n progress={reviewable.processing?.progress}\n fileId={reviewable.fileId}\n />\n ))}\n\n {queued.map((reviewable) => (\n <ReviewableProgressCard\n key={reviewable.fileId}\n name={reviewable.filename}\n type={'queued'}\n fileId={reviewable.fileId}\n />\n ))}\n\n {incompatible.map((reviewable) => (\n <ReviewableProgressCard\n key={reviewable.fileId}\n name={reviewable.filename}\n type={'unsupported'}\n tooltip={incompatibleMessage}\n src={`/api/projects/${projectName}/files/${reviewable.fileId}/thumbnail`}\n onContextMenu={handleContextMenu}\n fileId={reviewable.fileId}\n />\n ))}\n </>\n )}\n </ReviewableUpload>\n\n {editActivityId && (\n <EditReviewableDialog\n isOpen\n onClose={() => setEditActivityId(null)}\n label={\n reviewables.find((reviewable) => reviewable.activityId === editActivityId)?.label || ''\n }\n projectName={projectName}\n versionId={versionId}\n activityId={editActivityId}\n />\n )}\n </>\n )\n}\n\nexport default ReviewablesList\n"],"names":["reviewable","jsxs","Fragment","jsx","Styled.LoadingCard","_a"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ReviewablesList.es.js","sources":["../../../../../src/components/ReviewablesList/ReviewablesList.tsx"],"sourcesContent":["import { FC, MouseEvent, useState } from 'react'\n// queries\nimport { useGetReviewablesForVersionQuery, useHasTranscoderQuery } from '@shared/api'\nimport { useDeleteReviewableMutation, useSortVersionReviewablesMutation } from '@shared/api'\n\n// DND\nimport {\n DndContext,\n closestCenter,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n UniqueIdentifier,\n DragEndEvent,\n DragOverlay,\n DragStartEvent,\n} from '@dnd-kit/core'\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n verticalListSortingStrategy,\n} from '@dnd-kit/sortable'\n\n// components\nimport { ReviewableCard, ReviewableProgressCard } from '@shared/components'\nimport SortableReviewableCard from './SortableReviewableCard'\nimport * as Styled from './ReviewablesList.styled'\nimport { toast } from 'react-toastify'\n\n// utils\nimport { getGroupedReviewables } from './getGroupedReviewables'\nimport { useCreateContextMenu } from '@shared/containers/ContextMenu'\nimport { confirmDelete } from '@shared/util'\nimport EditReviewableDialog from './EditReviewableDialog'\nimport ReviewableUpload from './ReviewablesUpload'\nimport { useDetailsPanelContext } from '@shared/context'\n\ninterface ReviewablesListProps {\n projectName: string\n versionId: string\n productId: string\n isLoadingVersion: boolean\n scope: string\n}\n\nconst ReviewablesList: FC<ReviewablesListProps> = ({\n projectName,\n versionId,\n productId,\n isLoadingVersion,\n scope,\n}) => {\n const { onOpenViewer, user, viewer } = useDetailsPanelContext()\n // returns all reviewables for a product\n const {\n data: versionReviewables,\n isFetching: isFetchingReviewables,\n currentData,\n } = useGetReviewablesForVersionQuery(\n { projectName, versionId: versionId },\n { skip: !versionId || !projectName },\n )\n\n // do we have the premium transcoder?\n const { data: hasTranscoder } = useHasTranscoderQuery(undefined)\n\n // are we currently looking at review? (is it selected in the viewer)\n const reviewableIds = viewer?.reviewableIds || []\n const userName = user.name\n const currentIsUser = user.data?.isUser\n\n // either null or the reviewable id we are editing\n const [editActivityId, setEditActivityId] = useState<null | string>(null)\n\n // dragging activeId\n const [activeId, setActiveId] = useState<null | string>(null)\n\n const sensors = useSensors(\n useSensor(PointerSensor),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n }),\n )\n\n const reviewables = versionReviewables?.reviewables || []\n const draggingReview = reviewables.find((reviewable) => reviewable.fileId === activeId)\n\n const currentVersionId = currentData?.id\n const queryingNewVersion = versionId !== currentVersionId\n\n const isLoading = (isFetchingReviewables && queryingNewVersion) || isLoadingVersion\n\n const handleReviewableClick = (event: MouseEvent<HTMLDivElement>) => {\n // check are not dragging\n if (activeId) return console.log('Dragging, cannot open review')\n\n // get the reviewable id\n const id = event.currentTarget.id\n if (!id || !productId) return console.error('No reviewable id or product id')\n\n const reviewable = reviewables.find((reviewable) => reviewable.fileId === id)\n console.debug(reviewable)\n console.debug(reviewable?.mediaInfo)\n\n // open the reviewable dialog\n onOpenViewer?.({\n projectName: projectName,\n productId: productId,\n versionIds: [versionId],\n reviewableIds: [id],\n })\n }\n\n const { optimized, unoptimized, incompatible, processing, queued } = getGroupedReviewables(\n reviewables,\n hasTranscoder,\n )\n\n const sortableReviewables = [...optimized, ...unoptimized]\n\n function handleDragStart(event: DragStartEvent) {\n const { active } = event\n\n setActiveId(active.id as string)\n }\n\n const [sortVersionReviewables] = useSortVersionReviewablesMutation()\n\n const handleDragEnd = async (event: DragEndEvent) => {\n const { active, over } = event\n\n if (over?.id && active.id !== over.id) {\n console.log('update review position')\n\n const oldIndex = sortableReviewables.findIndex(\n (reviewable) => reviewable.fileId === active.id,\n )\n const newIndex = sortableReviewables.findIndex((reviewable) => reviewable.fileId === over.id)\n\n // resort the reviewables\n const newReviewables = arrayMove(sortableReviewables, oldIndex, newIndex)\n\n const newOrder = newReviewables.map((reviewable) => reviewable.activityId)\n\n try {\n // update the reviewables\n sortVersionReviewables({\n projectName,\n versionId,\n sortReviewablesRequest: { sort: newOrder },\n }).unwrap()\n } catch (error) {\n toast.error('Error sorting reviewables')\n }\n }\n setActiveId(null)\n }\n\n const overlayModifiers = []\n // hack to make the dnd overlay pos work inside dialog\n if (scope === 'review') {\n overlayModifiers.push((args: any) => ({\n ...args.transform,\n x: args.transform.x - 32,\n y: args.transform.y - 32,\n }))\n }\n\n let incompatibleMessage = ''\n if (!hasTranscoder) {\n incompatibleMessage = `The conversion transcoder is only supported on [**Ynput Cloud**](https://ynput.cloud/subscribe/ayon). Please subscribe or [contact support](https://ynput.io/services/) for more information.`\n } else {\n incompatibleMessage = 'The file is not supported by the transcoder'\n }\n\n const handleDownloadFile = (fileId: string, fileName: string = '') => {\n let url = `/api/projects/${projectName}/files/${fileId}`\n\n // if (codec) url += `.${codec}`\n\n // Create an invisible anchor element\n const a = document.createElement('a')\n a.href = url\n a.download = fileName\n document.body.appendChild(a)\n\n // Trigger a click event on the anchor element\n a.click()\n\n // Remove the anchor element from the document\n document.body.removeChild(a)\n }\n\n const [deleteReviewable] = useDeleteReviewableMutation()\n\n const handleDelete = async (activityId: string, label: string) => {\n // @ts-ignore\n confirmDelete({\n header: 'Delete ' + label,\n message: 'Are you sure you want to delete this reviewable?',\n accept: async () => {\n try {\n await deleteReviewable({ activityId, projectName }).unwrap()\n } catch (error) {\n toast.error('Failed to delete reviewable')\n }\n },\n })\n }\n\n // create the ref and model\n const [ctxMenuShow] = useCreateContextMenu()\n\n const handleContextMenu = (event: MouseEvent<HTMLDivElement>) => {\n // get the reviewable by id\n const id = event.currentTarget.id\n\n if (!id) return\n\n const reviewable = reviewables.find((reviewable) => reviewable.fileId === id)\n\n if (!reviewable) return\n\n const originalFileId = reviewable.createdFrom || reviewable.fileId\n const originalReviewable = reviewables.find(\n (reviewable) => reviewable.fileId === originalFileId,\n )\n\n const items: {\n label: string\n icon: string\n onClick?: () => void\n disabled?: boolean\n danger?: boolean\n }[] = [\n {\n label: 'Download original',\n icon: 'download',\n onClick: () => handleDownloadFile(originalFileId, originalReviewable?.filename),\n disabled: !originalReviewable,\n },\n ]\n\n if (userName === reviewable.author.name || !currentIsUser) {\n items.push({\n label: 'Delete',\n icon: 'delete',\n onClick: () => handleDelete(reviewable.activityId, reviewable.label || reviewable.filename),\n danger: true,\n })\n }\n\n // add author\n items.push({\n label: `Author: ${reviewable.author.fullName || reviewable.author.name}`,\n icon: 'person',\n disabled: true,\n })\n\n ctxMenuShow(event, items)\n }\n\n return (\n <>\n <ReviewableUpload projectName={projectName} versionId={versionId} productId={productId}>\n {isLoading ? (\n Array.from({ length: 3 }).map((_, index) => (\n <Styled.LoadingCard key={index} className=\"loading\" />\n ))\n ) : (\n <>\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n onDragCancel={() => setActiveId(null)}\n >\n <SortableContext\n items={reviewables.map(({ fileId }) => fileId as UniqueIdentifier)}\n strategy={verticalListSortingStrategy}\n >\n {sortableReviewables.map((reviewable) => (\n <SortableReviewableCard\n key={reviewable.fileId}\n projectName={projectName}\n onClick={handleReviewableClick}\n isSelected={reviewableIds.includes(reviewable.fileId)}\n isDragging={!!activeId}\n onContextMenu={handleContextMenu}\n onEdit={(e) => {\n e.stopPropagation()\n setEditActivityId(reviewable.activityId)\n }}\n {...reviewable}\n />\n ))}\n </SortableContext>\n\n {/* drag overlay */}\n <DragOverlay modifiers={overlayModifiers}>\n {draggingReview ? (\n <ReviewableCard\n {...draggingReview}\n projectName={projectName}\n isDragOverlay\n isDragging\n isSelected={reviewableIds.includes(draggingReview.fileId)}\n />\n ) : null}\n </DragOverlay>\n </DndContext>\n {processing.map((reviewable) => (\n <ReviewableProgressCard\n key={reviewable.fileId}\n name={reviewable.filename}\n type={'processing'}\n progress={reviewable.processing?.progress}\n fileId={reviewable.fileId}\n />\n ))}\n\n {queued.map((reviewable) => (\n <ReviewableProgressCard\n key={reviewable.fileId}\n name={reviewable.filename}\n type={'queued'}\n fileId={reviewable.fileId}\n />\n ))}\n\n {incompatible.map((reviewable) => (\n <ReviewableProgressCard\n key={reviewable.fileId}\n name={reviewable.filename}\n type={'unsupported'}\n tooltip={incompatibleMessage}\n src={`/api/projects/${projectName}/files/${reviewable.fileId}/thumbnail`}\n onContextMenu={handleContextMenu}\n fileId={reviewable.fileId}\n />\n ))}\n </>\n )}\n </ReviewableUpload>\n\n {editActivityId && (\n <EditReviewableDialog\n isOpen\n onClose={() => setEditActivityId(null)}\n label={\n reviewables.find((reviewable) => reviewable.activityId === editActivityId)?.label || ''\n }\n projectName={projectName}\n versionId={versionId}\n activityId={editActivityId}\n />\n )}\n </>\n )\n}\n\nexport default ReviewablesList\n"],"names":["reviewable","jsxs","Fragment","jsx","Styled.LoadingCard","_a"],"mappings":"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"}
|
|
@@ -171,6 +171,7 @@ require("../SettingsPanel/SettingsPanel.cjs.js");
|
|
|
171
171
|
require("../SettingsPanel/SettingsPanelItemTemplate.cjs.js");
|
|
172
172
|
require("../AttributeEditor/components/MinMaxField.cjs.js");
|
|
173
173
|
require("../EnumEditor/EnumEditor.styled.cjs.js");
|
|
174
|
+
require("../SearchFilter/filterDates.cjs.js");
|
|
174
175
|
const ReviewableUpload = ({
|
|
175
176
|
projectName,
|
|
176
177
|
versionId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReviewablesUpload.cjs.js","sources":["../../../../../src/components/ReviewablesList/ReviewablesUpload.tsx"],"sourcesContent":["import axios, { AxiosProgressEvent, AxiosResponse } from 'axios'\nimport { toast } from 'react-toastify'\nimport { FC, useState, DragEvent, ChangeEvent } from 'react'\nimport clsx from 'clsx'\n\nimport { Icon } from '@ynput/ayon-react-components'\n\nimport api, { reviewablesQueries } from '@shared/api'\nimport type { UploadReviewableApiResponse } from '@shared/api'\n\n// components\nimport { ReviewableProgress, ReviewableProgressCard } from '@shared/components'\nimport * as Styled from './ReviewablesUpload.styled'\nimport { useDetailsPanelContext } from '@shared/context'\n\nexport interface ReviewableUploadProps {\n projectName: string | null\n versionId: string\n productId: string | null\n variant?: 'normal' | 'large'\n onUpload?: () => void\n children?: any\n}\n\nexport const ReviewableUpload: FC<ReviewableUploadProps> = ({\n projectName,\n versionId,\n productId,\n onUpload,\n children,\n variant = 'normal',\n}) => {\n const { viewer, dispatch } = useDetailsPanelContext()\n\n const taskId = viewer?.taskId\n const folderId = viewer?.folderId\n\n // are we dragging a file over?\n const [isDraggingFile, setIsDraggingFile] = useState(false)\n\n const [uploading, setUploads] = useState<{ [key: string]: ReviewableProgress[] }>({})\n\n const handleRemoveUpload = (name: string) => {\n setUploads((uploads) => ({\n ...uploads,\n [versionId]: uploads[versionId]?.filter((upload) => upload.name !== name) || [],\n }))\n }\n\n const handleFileUpload = async (files: FileList) => {\n const uploadingFiles = Array.from(files).map((file) => ({\n name: file.name,\n size: file.size,\n progress: 0,\n }))\n\n const newUploadsForVersion = [...(uploading[versionId] || []), ...uploadingFiles]\n\n setUploads({ ...uploading, [versionId]: newUploadsForVersion })\n\n const successHandler = (file: File) => (response: AxiosResponse) => {\n // Handle successful upload\n console.log(`Upload successful for ${file.name}`)\n // patch the new data into the reviewables cache\n const data = response.data as UploadReviewableApiResponse\n\n if (!projectName) return\n\n dispatch(\n // @ts-ignore\n reviewablesQueries.util.updateQueryData(\n 'getReviewablesForVersion',\n { projectName, versionId },\n (draft) => {\n if (!draft.reviewables) {\n draft.reviewables = []\n }\n // @ts-ignore\n draft.reviewables.push(data)\n },\n ),\n )\n\n // also invalidate the viewer cache\n productId && dispatch(api.util.invalidateTags([{ type: 'viewer', id: productId }]))\n dispatch(api.util.invalidateTags([{ type: 'viewer', id: versionId }]))\n dispatch(api.util.invalidateTags([{ type: 'viewer', id: folderId }]))\n dispatch(api.util.invalidateTags([{ type: 'viewer', id: taskId }]))\n // remove the file from the list\n handleRemoveUpload(file.name)\n }\n\n const errorHandler = (file: File) => (error: any) => {\n console.error(`Upload failed for ${file.name}: ${error}`)\n toast.error(`Failed to upload file: ${file.name}`)\n // add error to the file\n setUploads((uploads) => {\n // current uploads for versionId\n const currentUploads = uploads[versionId] || []\n const updatedUploads = currentUploads.map((upload) => {\n if (upload.name !== file.name) return upload\n return {\n ...upload,\n error: error.response.data.detail || error.message,\n }\n })\n\n // update state\n return {\n ...uploads,\n [versionId]: updatedUploads,\n }\n })\n }\n\n const progressHandler = (file: File) => {\n return (progressEvent: AxiosProgressEvent) =>\n setUploads((uploads) => {\n // current uploads for versionId\n const currentUploads = uploads[versionId] || []\n const updatedUploads = currentUploads.map((upload) => {\n if (upload.name !== file.name) return upload\n return {\n ...upload,\n progress: progressEvent.total\n ? Math.round((progressEvent.loaded / progressEvent.total) * 100)\n : 0,\n }\n })\n\n // update state\n return {\n ...uploads,\n [versionId]: updatedUploads,\n }\n })\n }\n\n try {\n // upload the files\n for (const file of files) {\n const autoLabel = file.name.split('.').slice(0, -1).join('.')\n\n const url = `/api/projects/${projectName}/versions/${versionId}/reviewables?label=${autoLabel}`\n const headers = { 'content-type': file.type, 'x-file-name': file.name }\n axios\n .post(url, file, { headers, onUploadProgress: progressHandler(file) })\n .then(successHandler(file))\n .catch(errorHandler(file))\n }\n // Callback after successful uploads\n onUpload && onUpload()\n } catch (error) {\n // something went wrong with everything, EEEEK!\n console.error(error)\n toast.error('Failed to upload file/s')\n }\n }\n\n const handleInputChange = (event: ChangeEvent<HTMLInputElement>) => {\n const files = event.target.files\n\n if (files) {\n handleFileUpload(files)\n }\n }\n\n // when the user drops a file\n const handleFileDrop = (event: DragEvent<HTMLDivElement>) => {\n event.preventDefault()\n setIsDraggingFile(false)\n\n const files = event.dataTransfer.files\n\n if (files) {\n handleFileUpload(files)\n }\n }\n const variantStyles =\n variant === 'large' ? { minWidth: '360px', maxWidth: '480px', alignSelf: 'center' } : {}\n\n return (\n <>\n {!isDraggingFile && (\n <Styled.ReviewablesList\n onDragEnter={() => setIsDraggingFile(true)}\n className={clsx(variant)}\n >\n <>\n {children}\n {/* uploading items */}\n {uploading[versionId]?.map((file) => (\n <ReviewableProgressCard\n key={file.name}\n {...file}\n type={'upload'}\n onRemove={() => handleRemoveUpload(file.name)}\n />\n ))}\n\n {/* upload button */}\n <Styled.Upload id=\"upload\" className={clsx('upload', variant)} style={variantStyles}>\n <span>Drop or click to upload</span>\n <input type=\"file\" multiple onChange={handleInputChange} />\n </Styled.Upload>\n </>\n </Styled.ReviewablesList>\n )}\n\n {isDraggingFile && (\n <Styled.Dropzone\n onDragOver={(e) => e.preventDefault()}\n onDragLeave={() => setIsDraggingFile(false)}\n onDrop={handleFileDrop}\n >\n <Icon icon=\"upload\" />\n <span>Upload reviewable</span>\n </Styled.Dropzone>\n )}\n </>\n )\n}\n\nexport default ReviewableUpload\n"],"names":["useDetailsPanelContext","useState","_a","reviewablesQueries","api","toast","jsxs","Fragment","jsx","Styled.ReviewablesList","ReviewableProgressCard","Styled.Upload","Styled.Dropzone","Icon"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ReviewablesUpload.cjs.js","sources":["../../../../../src/components/ReviewablesList/ReviewablesUpload.tsx"],"sourcesContent":["import axios, { AxiosProgressEvent, AxiosResponse } from 'axios'\nimport { toast } from 'react-toastify'\nimport { FC, useState, DragEvent, ChangeEvent } from 'react'\nimport clsx from 'clsx'\n\nimport { Icon } from '@ynput/ayon-react-components'\n\nimport api, { reviewablesQueries } from '@shared/api'\nimport type { UploadReviewableApiResponse } from '@shared/api'\n\n// components\nimport { ReviewableProgress, ReviewableProgressCard } from '@shared/components'\nimport * as Styled from './ReviewablesUpload.styled'\nimport { useDetailsPanelContext } from '@shared/context'\n\nexport interface ReviewableUploadProps {\n projectName: string | null\n versionId: string\n productId: string | null\n variant?: 'normal' | 'large'\n onUpload?: () => void\n children?: any\n}\n\nexport const ReviewableUpload: FC<ReviewableUploadProps> = ({\n projectName,\n versionId,\n productId,\n onUpload,\n children,\n variant = 'normal',\n}) => {\n const { viewer, dispatch } = useDetailsPanelContext()\n\n const taskId = viewer?.taskId\n const folderId = viewer?.folderId\n\n // are we dragging a file over?\n const [isDraggingFile, setIsDraggingFile] = useState(false)\n\n const [uploading, setUploads] = useState<{ [key: string]: ReviewableProgress[] }>({})\n\n const handleRemoveUpload = (name: string) => {\n setUploads((uploads) => ({\n ...uploads,\n [versionId]: uploads[versionId]?.filter((upload) => upload.name !== name) || [],\n }))\n }\n\n const handleFileUpload = async (files: FileList) => {\n const uploadingFiles = Array.from(files).map((file) => ({\n name: file.name,\n size: file.size,\n progress: 0,\n }))\n\n const newUploadsForVersion = [...(uploading[versionId] || []), ...uploadingFiles]\n\n setUploads({ ...uploading, [versionId]: newUploadsForVersion })\n\n const successHandler = (file: File) => (response: AxiosResponse) => {\n // Handle successful upload\n console.log(`Upload successful for ${file.name}`)\n // patch the new data into the reviewables cache\n const data = response.data as UploadReviewableApiResponse\n\n if (!projectName) return\n\n dispatch(\n // @ts-ignore\n reviewablesQueries.util.updateQueryData(\n 'getReviewablesForVersion',\n { projectName, versionId },\n (draft) => {\n if (!draft.reviewables) {\n draft.reviewables = []\n }\n // @ts-ignore\n draft.reviewables.push(data)\n },\n ),\n )\n\n // also invalidate the viewer cache\n productId && dispatch(api.util.invalidateTags([{ type: 'viewer', id: productId }]))\n dispatch(api.util.invalidateTags([{ type: 'viewer', id: versionId }]))\n dispatch(api.util.invalidateTags([{ type: 'viewer', id: folderId }]))\n dispatch(api.util.invalidateTags([{ type: 'viewer', id: taskId }]))\n // remove the file from the list\n handleRemoveUpload(file.name)\n }\n\n const errorHandler = (file: File) => (error: any) => {\n console.error(`Upload failed for ${file.name}: ${error}`)\n toast.error(`Failed to upload file: ${file.name}`)\n // add error to the file\n setUploads((uploads) => {\n // current uploads for versionId\n const currentUploads = uploads[versionId] || []\n const updatedUploads = currentUploads.map((upload) => {\n if (upload.name !== file.name) return upload\n return {\n ...upload,\n error: error.response.data.detail || error.message,\n }\n })\n\n // update state\n return {\n ...uploads,\n [versionId]: updatedUploads,\n }\n })\n }\n\n const progressHandler = (file: File) => {\n return (progressEvent: AxiosProgressEvent) =>\n setUploads((uploads) => {\n // current uploads for versionId\n const currentUploads = uploads[versionId] || []\n const updatedUploads = currentUploads.map((upload) => {\n if (upload.name !== file.name) return upload\n return {\n ...upload,\n progress: progressEvent.total\n ? Math.round((progressEvent.loaded / progressEvent.total) * 100)\n : 0,\n }\n })\n\n // update state\n return {\n ...uploads,\n [versionId]: updatedUploads,\n }\n })\n }\n\n try {\n // upload the files\n for (const file of files) {\n const autoLabel = file.name.split('.').slice(0, -1).join('.')\n\n const url = `/api/projects/${projectName}/versions/${versionId}/reviewables?label=${autoLabel}`\n const headers = { 'content-type': file.type, 'x-file-name': file.name }\n axios\n .post(url, file, { headers, onUploadProgress: progressHandler(file) })\n .then(successHandler(file))\n .catch(errorHandler(file))\n }\n // Callback after successful uploads\n onUpload && onUpload()\n } catch (error) {\n // something went wrong with everything, EEEEK!\n console.error(error)\n toast.error('Failed to upload file/s')\n }\n }\n\n const handleInputChange = (event: ChangeEvent<HTMLInputElement>) => {\n const files = event.target.files\n\n if (files) {\n handleFileUpload(files)\n }\n }\n\n // when the user drops a file\n const handleFileDrop = (event: DragEvent<HTMLDivElement>) => {\n event.preventDefault()\n setIsDraggingFile(false)\n\n const files = event.dataTransfer.files\n\n if (files) {\n handleFileUpload(files)\n }\n }\n const variantStyles =\n variant === 'large' ? { minWidth: '360px', maxWidth: '480px', alignSelf: 'center' } : {}\n\n return (\n <>\n {!isDraggingFile && (\n <Styled.ReviewablesList\n onDragEnter={() => setIsDraggingFile(true)}\n className={clsx(variant)}\n >\n <>\n {children}\n {/* uploading items */}\n {uploading[versionId]?.map((file) => (\n <ReviewableProgressCard\n key={file.name}\n {...file}\n type={'upload'}\n onRemove={() => handleRemoveUpload(file.name)}\n />\n ))}\n\n {/* upload button */}\n <Styled.Upload id=\"upload\" className={clsx('upload', variant)} style={variantStyles}>\n <span>Drop or click to upload</span>\n <input type=\"file\" multiple onChange={handleInputChange} />\n </Styled.Upload>\n </>\n </Styled.ReviewablesList>\n )}\n\n {isDraggingFile && (\n <Styled.Dropzone\n onDragOver={(e) => e.preventDefault()}\n onDragLeave={() => setIsDraggingFile(false)}\n onDrop={handleFileDrop}\n >\n <Icon icon=\"upload\" />\n <span>Upload reviewable</span>\n </Styled.Dropzone>\n )}\n </>\n )\n}\n\nexport default ReviewableUpload\n"],"names":["useDetailsPanelContext","useState","_a","reviewablesQueries","api","toast","jsxs","Fragment","jsx","Styled.ReviewablesList","ReviewableProgressCard","Styled.Upload","Styled.Dropzone","Icon"],"mappings":"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"}
|
|
@@ -169,6 +169,7 @@ import "../SettingsPanel/SettingsPanel.es.js";
|
|
|
169
169
|
import "../SettingsPanel/SettingsPanelItemTemplate.es.js";
|
|
170
170
|
import "../AttributeEditor/components/MinMaxField.es.js";
|
|
171
171
|
import "../EnumEditor/EnumEditor.styled.es.js";
|
|
172
|
+
import "../SearchFilter/filterDates.es.js";
|
|
172
173
|
const ReviewableUpload = ({
|
|
173
174
|
projectName,
|
|
174
175
|
versionId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReviewablesUpload.es.js","sources":["../../../../../src/components/ReviewablesList/ReviewablesUpload.tsx"],"sourcesContent":["import axios, { AxiosProgressEvent, AxiosResponse } from 'axios'\nimport { toast } from 'react-toastify'\nimport { FC, useState, DragEvent, ChangeEvent } from 'react'\nimport clsx from 'clsx'\n\nimport { Icon } from '@ynput/ayon-react-components'\n\nimport api, { reviewablesQueries } from '@shared/api'\nimport type { UploadReviewableApiResponse } from '@shared/api'\n\n// components\nimport { ReviewableProgress, ReviewableProgressCard } from '@shared/components'\nimport * as Styled from './ReviewablesUpload.styled'\nimport { useDetailsPanelContext } from '@shared/context'\n\nexport interface ReviewableUploadProps {\n projectName: string | null\n versionId: string\n productId: string | null\n variant?: 'normal' | 'large'\n onUpload?: () => void\n children?: any\n}\n\nexport const ReviewableUpload: FC<ReviewableUploadProps> = ({\n projectName,\n versionId,\n productId,\n onUpload,\n children,\n variant = 'normal',\n}) => {\n const { viewer, dispatch } = useDetailsPanelContext()\n\n const taskId = viewer?.taskId\n const folderId = viewer?.folderId\n\n // are we dragging a file over?\n const [isDraggingFile, setIsDraggingFile] = useState(false)\n\n const [uploading, setUploads] = useState<{ [key: string]: ReviewableProgress[] }>({})\n\n const handleRemoveUpload = (name: string) => {\n setUploads((uploads) => ({\n ...uploads,\n [versionId]: uploads[versionId]?.filter((upload) => upload.name !== name) || [],\n }))\n }\n\n const handleFileUpload = async (files: FileList) => {\n const uploadingFiles = Array.from(files).map((file) => ({\n name: file.name,\n size: file.size,\n progress: 0,\n }))\n\n const newUploadsForVersion = [...(uploading[versionId] || []), ...uploadingFiles]\n\n setUploads({ ...uploading, [versionId]: newUploadsForVersion })\n\n const successHandler = (file: File) => (response: AxiosResponse) => {\n // Handle successful upload\n console.log(`Upload successful for ${file.name}`)\n // patch the new data into the reviewables cache\n const data = response.data as UploadReviewableApiResponse\n\n if (!projectName) return\n\n dispatch(\n // @ts-ignore\n reviewablesQueries.util.updateQueryData(\n 'getReviewablesForVersion',\n { projectName, versionId },\n (draft) => {\n if (!draft.reviewables) {\n draft.reviewables = []\n }\n // @ts-ignore\n draft.reviewables.push(data)\n },\n ),\n )\n\n // also invalidate the viewer cache\n productId && dispatch(api.util.invalidateTags([{ type: 'viewer', id: productId }]))\n dispatch(api.util.invalidateTags([{ type: 'viewer', id: versionId }]))\n dispatch(api.util.invalidateTags([{ type: 'viewer', id: folderId }]))\n dispatch(api.util.invalidateTags([{ type: 'viewer', id: taskId }]))\n // remove the file from the list\n handleRemoveUpload(file.name)\n }\n\n const errorHandler = (file: File) => (error: any) => {\n console.error(`Upload failed for ${file.name}: ${error}`)\n toast.error(`Failed to upload file: ${file.name}`)\n // add error to the file\n setUploads((uploads) => {\n // current uploads for versionId\n const currentUploads = uploads[versionId] || []\n const updatedUploads = currentUploads.map((upload) => {\n if (upload.name !== file.name) return upload\n return {\n ...upload,\n error: error.response.data.detail || error.message,\n }\n })\n\n // update state\n return {\n ...uploads,\n [versionId]: updatedUploads,\n }\n })\n }\n\n const progressHandler = (file: File) => {\n return (progressEvent: AxiosProgressEvent) =>\n setUploads((uploads) => {\n // current uploads for versionId\n const currentUploads = uploads[versionId] || []\n const updatedUploads = currentUploads.map((upload) => {\n if (upload.name !== file.name) return upload\n return {\n ...upload,\n progress: progressEvent.total\n ? Math.round((progressEvent.loaded / progressEvent.total) * 100)\n : 0,\n }\n })\n\n // update state\n return {\n ...uploads,\n [versionId]: updatedUploads,\n }\n })\n }\n\n try {\n // upload the files\n for (const file of files) {\n const autoLabel = file.name.split('.').slice(0, -1).join('.')\n\n const url = `/api/projects/${projectName}/versions/${versionId}/reviewables?label=${autoLabel}`\n const headers = { 'content-type': file.type, 'x-file-name': file.name }\n axios\n .post(url, file, { headers, onUploadProgress: progressHandler(file) })\n .then(successHandler(file))\n .catch(errorHandler(file))\n }\n // Callback after successful uploads\n onUpload && onUpload()\n } catch (error) {\n // something went wrong with everything, EEEEK!\n console.error(error)\n toast.error('Failed to upload file/s')\n }\n }\n\n const handleInputChange = (event: ChangeEvent<HTMLInputElement>) => {\n const files = event.target.files\n\n if (files) {\n handleFileUpload(files)\n }\n }\n\n // when the user drops a file\n const handleFileDrop = (event: DragEvent<HTMLDivElement>) => {\n event.preventDefault()\n setIsDraggingFile(false)\n\n const files = event.dataTransfer.files\n\n if (files) {\n handleFileUpload(files)\n }\n }\n const variantStyles =\n variant === 'large' ? { minWidth: '360px', maxWidth: '480px', alignSelf: 'center' } : {}\n\n return (\n <>\n {!isDraggingFile && (\n <Styled.ReviewablesList\n onDragEnter={() => setIsDraggingFile(true)}\n className={clsx(variant)}\n >\n <>\n {children}\n {/* uploading items */}\n {uploading[versionId]?.map((file) => (\n <ReviewableProgressCard\n key={file.name}\n {...file}\n type={'upload'}\n onRemove={() => handleRemoveUpload(file.name)}\n />\n ))}\n\n {/* upload button */}\n <Styled.Upload id=\"upload\" className={clsx('upload', variant)} style={variantStyles}>\n <span>Drop or click to upload</span>\n <input type=\"file\" multiple onChange={handleInputChange} />\n </Styled.Upload>\n </>\n </Styled.ReviewablesList>\n )}\n\n {isDraggingFile && (\n <Styled.Dropzone\n onDragOver={(e) => e.preventDefault()}\n onDragLeave={() => setIsDraggingFile(false)}\n onDrop={handleFileDrop}\n >\n <Icon icon=\"upload\" />\n <span>Upload reviewable</span>\n </Styled.Dropzone>\n )}\n </>\n )\n}\n\nexport default ReviewableUpload\n"],"names":["_a","reviewablesQueries","jsxs","Fragment","jsx","Styled.ReviewablesList","Styled.Upload","Styled.Dropzone"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ReviewablesUpload.es.js","sources":["../../../../../src/components/ReviewablesList/ReviewablesUpload.tsx"],"sourcesContent":["import axios, { AxiosProgressEvent, AxiosResponse } from 'axios'\nimport { toast } from 'react-toastify'\nimport { FC, useState, DragEvent, ChangeEvent } from 'react'\nimport clsx from 'clsx'\n\nimport { Icon } from '@ynput/ayon-react-components'\n\nimport api, { reviewablesQueries } from '@shared/api'\nimport type { UploadReviewableApiResponse } from '@shared/api'\n\n// components\nimport { ReviewableProgress, ReviewableProgressCard } from '@shared/components'\nimport * as Styled from './ReviewablesUpload.styled'\nimport { useDetailsPanelContext } from '@shared/context'\n\nexport interface ReviewableUploadProps {\n projectName: string | null\n versionId: string\n productId: string | null\n variant?: 'normal' | 'large'\n onUpload?: () => void\n children?: any\n}\n\nexport const ReviewableUpload: FC<ReviewableUploadProps> = ({\n projectName,\n versionId,\n productId,\n onUpload,\n children,\n variant = 'normal',\n}) => {\n const { viewer, dispatch } = useDetailsPanelContext()\n\n const taskId = viewer?.taskId\n const folderId = viewer?.folderId\n\n // are we dragging a file over?\n const [isDraggingFile, setIsDraggingFile] = useState(false)\n\n const [uploading, setUploads] = useState<{ [key: string]: ReviewableProgress[] }>({})\n\n const handleRemoveUpload = (name: string) => {\n setUploads((uploads) => ({\n ...uploads,\n [versionId]: uploads[versionId]?.filter((upload) => upload.name !== name) || [],\n }))\n }\n\n const handleFileUpload = async (files: FileList) => {\n const uploadingFiles = Array.from(files).map((file) => ({\n name: file.name,\n size: file.size,\n progress: 0,\n }))\n\n const newUploadsForVersion = [...(uploading[versionId] || []), ...uploadingFiles]\n\n setUploads({ ...uploading, [versionId]: newUploadsForVersion })\n\n const successHandler = (file: File) => (response: AxiosResponse) => {\n // Handle successful upload\n console.log(`Upload successful for ${file.name}`)\n // patch the new data into the reviewables cache\n const data = response.data as UploadReviewableApiResponse\n\n if (!projectName) return\n\n dispatch(\n // @ts-ignore\n reviewablesQueries.util.updateQueryData(\n 'getReviewablesForVersion',\n { projectName, versionId },\n (draft) => {\n if (!draft.reviewables) {\n draft.reviewables = []\n }\n // @ts-ignore\n draft.reviewables.push(data)\n },\n ),\n )\n\n // also invalidate the viewer cache\n productId && dispatch(api.util.invalidateTags([{ type: 'viewer', id: productId }]))\n dispatch(api.util.invalidateTags([{ type: 'viewer', id: versionId }]))\n dispatch(api.util.invalidateTags([{ type: 'viewer', id: folderId }]))\n dispatch(api.util.invalidateTags([{ type: 'viewer', id: taskId }]))\n // remove the file from the list\n handleRemoveUpload(file.name)\n }\n\n const errorHandler = (file: File) => (error: any) => {\n console.error(`Upload failed for ${file.name}: ${error}`)\n toast.error(`Failed to upload file: ${file.name}`)\n // add error to the file\n setUploads((uploads) => {\n // current uploads for versionId\n const currentUploads = uploads[versionId] || []\n const updatedUploads = currentUploads.map((upload) => {\n if (upload.name !== file.name) return upload\n return {\n ...upload,\n error: error.response.data.detail || error.message,\n }\n })\n\n // update state\n return {\n ...uploads,\n [versionId]: updatedUploads,\n }\n })\n }\n\n const progressHandler = (file: File) => {\n return (progressEvent: AxiosProgressEvent) =>\n setUploads((uploads) => {\n // current uploads for versionId\n const currentUploads = uploads[versionId] || []\n const updatedUploads = currentUploads.map((upload) => {\n if (upload.name !== file.name) return upload\n return {\n ...upload,\n progress: progressEvent.total\n ? Math.round((progressEvent.loaded / progressEvent.total) * 100)\n : 0,\n }\n })\n\n // update state\n return {\n ...uploads,\n [versionId]: updatedUploads,\n }\n })\n }\n\n try {\n // upload the files\n for (const file of files) {\n const autoLabel = file.name.split('.').slice(0, -1).join('.')\n\n const url = `/api/projects/${projectName}/versions/${versionId}/reviewables?label=${autoLabel}`\n const headers = { 'content-type': file.type, 'x-file-name': file.name }\n axios\n .post(url, file, { headers, onUploadProgress: progressHandler(file) })\n .then(successHandler(file))\n .catch(errorHandler(file))\n }\n // Callback after successful uploads\n onUpload && onUpload()\n } catch (error) {\n // something went wrong with everything, EEEEK!\n console.error(error)\n toast.error('Failed to upload file/s')\n }\n }\n\n const handleInputChange = (event: ChangeEvent<HTMLInputElement>) => {\n const files = event.target.files\n\n if (files) {\n handleFileUpload(files)\n }\n }\n\n // when the user drops a file\n const handleFileDrop = (event: DragEvent<HTMLDivElement>) => {\n event.preventDefault()\n setIsDraggingFile(false)\n\n const files = event.dataTransfer.files\n\n if (files) {\n handleFileUpload(files)\n }\n }\n const variantStyles =\n variant === 'large' ? { minWidth: '360px', maxWidth: '480px', alignSelf: 'center' } : {}\n\n return (\n <>\n {!isDraggingFile && (\n <Styled.ReviewablesList\n onDragEnter={() => setIsDraggingFile(true)}\n className={clsx(variant)}\n >\n <>\n {children}\n {/* uploading items */}\n {uploading[versionId]?.map((file) => (\n <ReviewableProgressCard\n key={file.name}\n {...file}\n type={'upload'}\n onRemove={() => handleRemoveUpload(file.name)}\n />\n ))}\n\n {/* upload button */}\n <Styled.Upload id=\"upload\" className={clsx('upload', variant)} style={variantStyles}>\n <span>Drop or click to upload</span>\n <input type=\"file\" multiple onChange={handleInputChange} />\n </Styled.Upload>\n </>\n </Styled.ReviewablesList>\n )}\n\n {isDraggingFile && (\n <Styled.Dropzone\n onDragOver={(e) => e.preventDefault()}\n onDragLeave={() => setIsDraggingFile(false)}\n onDrop={handleFileDrop}\n >\n <Icon icon=\"upload\" />\n <span>Upload reviewable</span>\n </Styled.Dropzone>\n )}\n </>\n )\n}\n\nexport default ReviewableUpload\n"],"names":["_a","reviewablesQueries","jsxs","Fragment","jsx","Styled.ReviewablesList","Styled.Upload","Styled.Dropzone"],"mappings":"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"}
|
|
@@ -171,6 +171,7 @@ require("../SettingsPanel/SettingsPanel.cjs.js");
|
|
|
171
171
|
require("../SettingsPanel/SettingsPanelItemTemplate.cjs.js");
|
|
172
172
|
require("../AttributeEditor/components/MinMaxField.cjs.js");
|
|
173
173
|
require("../EnumEditor/EnumEditor.styled.cjs.js");
|
|
174
|
+
require("../SearchFilter/filterDates.cjs.js");
|
|
174
175
|
const SortableReviewableCard = ({ ...props }) => {
|
|
175
176
|
const { attributes, listeners, setNodeRef, transform, transition, isDragging } = sortable.useSortable({
|
|
176
177
|
id: props.fileId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SortableReviewableCard.cjs.js","sources":["../../../../../src/components/ReviewablesList/SortableReviewableCard.tsx"],"sourcesContent":["import { FC } from 'react'\nimport { useSortable } from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport { ReviewableCardProps, ReviewableCard } from '@shared/components'\n\ntype SortableReviewableCardProps = ReviewableCardProps\n\nconst SortableReviewableCard: FC<SortableReviewableCardProps> = ({ ...props }) => {\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({\n id: props.fileId,\n animateLayoutChanges: () => false,\n })\n\n const style = {\n transform: CSS.Transform.toString(transform),\n transition,\n }\n\n return (\n <div ref={setNodeRef} style={style}>\n <ReviewableCard\n isDropPlaceholder={isDragging}\n dragProps={{ ...attributes, ...listeners }}\n disabled={props.sortingDisabled}\n {...props}\n />\n </div>\n )\n}\n\nexport default SortableReviewableCard\n"],"names":["useSortable","CSS","jsx","ReviewableCard"],"mappings":"
|
|
1
|
+
{"version":3,"file":"SortableReviewableCard.cjs.js","sources":["../../../../../src/components/ReviewablesList/SortableReviewableCard.tsx"],"sourcesContent":["import { FC } from 'react'\nimport { useSortable } from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport { ReviewableCardProps, ReviewableCard } from '@shared/components'\n\ntype SortableReviewableCardProps = ReviewableCardProps\n\nconst SortableReviewableCard: FC<SortableReviewableCardProps> = ({ ...props }) => {\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({\n id: props.fileId,\n animateLayoutChanges: () => false,\n })\n\n const style = {\n transform: CSS.Transform.toString(transform),\n transition,\n }\n\n return (\n <div ref={setNodeRef} style={style}>\n <ReviewableCard\n isDropPlaceholder={isDragging}\n dragProps={{ ...attributes, ...listeners }}\n disabled={props.sortingDisabled}\n {...props}\n />\n </div>\n )\n}\n\nexport default SortableReviewableCard\n"],"names":["useSortable","CSS","jsx","ReviewableCard"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,MAAM,yBAA0D,CAAC,EAAE,GAAG,YAAY;AAC1E,QAAA,EAAE,YAAY,WAAW,YAAY,WAAW,YAAY,eAAeA,qBAAY;AAAA,IAC3F,IAAI,MAAM;AAAA,IACV,sBAAsB,MAAM;AAAA,EAAA,CAC7B;AAED,QAAM,QAAQ;AAAA,IACZ,WAAWC,cAAA,IAAI,UAAU,SAAS,SAAS;AAAA,IAC3C;AAAA,EACF;AAEA,SACGC,2BAAAA,kBAAAA,IAAA,OAAA,EAAI,KAAK,YAAY,OACpB,UAAAA,2BAAA,kBAAA;AAAA,IAACC,eAAA;AAAA,IAAA;AAAA,MACC,mBAAmB;AAAA,MACnB,WAAW,EAAE,GAAG,YAAY,GAAG,UAAU;AAAA,MACzC,UAAU,MAAM;AAAA,MACf,GAAG;AAAA,IAAA;AAAA,EAAA,GAER;AAEJ;;"}
|
|
@@ -170,6 +170,7 @@ import "../SettingsPanel/SettingsPanel.es.js";
|
|
|
170
170
|
import "../SettingsPanel/SettingsPanelItemTemplate.es.js";
|
|
171
171
|
import "../AttributeEditor/components/MinMaxField.es.js";
|
|
172
172
|
import "../EnumEditor/EnumEditor.styled.es.js";
|
|
173
|
+
import "../SearchFilter/filterDates.es.js";
|
|
173
174
|
const SortableReviewableCard = ({ ...props }) => {
|
|
174
175
|
const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({
|
|
175
176
|
id: props.fileId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SortableReviewableCard.es.js","sources":["../../../../../src/components/ReviewablesList/SortableReviewableCard.tsx"],"sourcesContent":["import { FC } from 'react'\nimport { useSortable } from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport { ReviewableCardProps, ReviewableCard } from '@shared/components'\n\ntype SortableReviewableCardProps = ReviewableCardProps\n\nconst SortableReviewableCard: FC<SortableReviewableCardProps> = ({ ...props }) => {\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({\n id: props.fileId,\n animateLayoutChanges: () => false,\n })\n\n const style = {\n transform: CSS.Transform.toString(transform),\n transition,\n }\n\n return (\n <div ref={setNodeRef} style={style}>\n <ReviewableCard\n isDropPlaceholder={isDragging}\n dragProps={{ ...attributes, ...listeners }}\n disabled={props.sortingDisabled}\n {...props}\n />\n </div>\n )\n}\n\nexport default SortableReviewableCard\n"],"names":["jsx"],"mappings":"
|
|
1
|
+
{"version":3,"file":"SortableReviewableCard.es.js","sources":["../../../../../src/components/ReviewablesList/SortableReviewableCard.tsx"],"sourcesContent":["import { FC } from 'react'\nimport { useSortable } from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport { ReviewableCardProps, ReviewableCard } from '@shared/components'\n\ntype SortableReviewableCardProps = ReviewableCardProps\n\nconst SortableReviewableCard: FC<SortableReviewableCardProps> = ({ ...props }) => {\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({\n id: props.fileId,\n animateLayoutChanges: () => false,\n })\n\n const style = {\n transform: CSS.Transform.toString(transform),\n transition,\n }\n\n return (\n <div ref={setNodeRef} style={style}>\n <ReviewableCard\n isDropPlaceholder={isDragging}\n dragProps={{ ...attributes, ...listeners }}\n disabled={props.sortingDisabled}\n {...props}\n />\n </div>\n )\n}\n\nexport default SortableReviewableCard\n"],"names":["jsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,MAAM,yBAA0D,CAAC,EAAE,GAAG,YAAY;AAC1E,QAAA,EAAE,YAAY,WAAW,YAAY,WAAW,YAAY,eAAe,YAAY;AAAA,IAC3F,IAAI,MAAM;AAAA,IACV,sBAAsB,MAAM;AAAA,EAAA,CAC7B;AAED,QAAM,QAAQ;AAAA,IACZ,WAAW,IAAI,UAAU,SAAS,SAAS;AAAA,IAC3C;AAAA,EACF;AAEA,SACGA,kCAAAA,IAAA,OAAA,EAAI,KAAK,YAAY,OACpB,UAAAA,kCAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,mBAAmB;AAAA,MACnB,WAAW,EAAE,GAAG,YAAY,GAAG,UAAU;AAAA,MACzC,UAAU,MAAM;AAAA,MACf,GAAG;AAAA,IAAA;AAAA,EAAA,GAER;AAEJ;"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const dateFns = require("date-fns");
|
|
4
|
+
const NO_DATE = "no-date";
|
|
5
|
+
const createDateRange = (startDate, endDate, startLabel, endLabel) => {
|
|
6
|
+
return [
|
|
7
|
+
{ label: startLabel, id: startDate.toISOString() },
|
|
8
|
+
{ label: endLabel, id: endDate.toISOString() }
|
|
9
|
+
];
|
|
10
|
+
};
|
|
11
|
+
const filterDateFunctions = {
|
|
12
|
+
today: () => {
|
|
13
|
+
const now = /* @__PURE__ */ new Date();
|
|
14
|
+
return createDateRange(dateFns.startOfDay(now), dateFns.endOfDay(now), "Start of day", "End of day");
|
|
15
|
+
},
|
|
16
|
+
yesterday: () => {
|
|
17
|
+
const yesterday = dateFns.subDays(/* @__PURE__ */ new Date(), 1);
|
|
18
|
+
return createDateRange(
|
|
19
|
+
dateFns.startOfDay(yesterday),
|
|
20
|
+
dateFns.endOfDay(yesterday),
|
|
21
|
+
"Start of yesterday",
|
|
22
|
+
"End of yesterday"
|
|
23
|
+
);
|
|
24
|
+
},
|
|
25
|
+
["after-now"]: () => {
|
|
26
|
+
const now = /* @__PURE__ */ new Date();
|
|
27
|
+
return [
|
|
28
|
+
{ label: "After today", id: dateFns.setHours(now, 24).toISOString() },
|
|
29
|
+
{ id: NO_DATE, label: NO_DATE }
|
|
30
|
+
];
|
|
31
|
+
},
|
|
32
|
+
["before-now"]: () => {
|
|
33
|
+
const now = /* @__PURE__ */ new Date();
|
|
34
|
+
return [
|
|
35
|
+
{ id: NO_DATE, label: NO_DATE },
|
|
36
|
+
{ label: "Before today", id: dateFns.setHours(now, 0).toISOString() }
|
|
37
|
+
];
|
|
38
|
+
},
|
|
39
|
+
["this-week"]: () => {
|
|
40
|
+
const now = /* @__PURE__ */ new Date();
|
|
41
|
+
return createDateRange(
|
|
42
|
+
dateFns.startOfWeek(now, { weekStartsOn: 0 }),
|
|
43
|
+
dateFns.endOfWeek(now, { weekStartsOn: 0 }),
|
|
44
|
+
"Start of week",
|
|
45
|
+
"End of week"
|
|
46
|
+
);
|
|
47
|
+
},
|
|
48
|
+
["next-week"]: () => {
|
|
49
|
+
const nextWeek = dateFns.addWeeks(/* @__PURE__ */ new Date(), 1);
|
|
50
|
+
return createDateRange(
|
|
51
|
+
dateFns.startOfWeek(nextWeek, { weekStartsOn: 0 }),
|
|
52
|
+
dateFns.endOfWeek(nextWeek, { weekStartsOn: 0 }),
|
|
53
|
+
"Start of next week",
|
|
54
|
+
"End of next week"
|
|
55
|
+
);
|
|
56
|
+
},
|
|
57
|
+
["last-week"]: () => {
|
|
58
|
+
const lastWeek = dateFns.subWeeks(/* @__PURE__ */ new Date(), 1);
|
|
59
|
+
return createDateRange(
|
|
60
|
+
dateFns.startOfWeek(lastWeek, { weekStartsOn: 0 }),
|
|
61
|
+
dateFns.endOfWeek(lastWeek, { weekStartsOn: 0 }),
|
|
62
|
+
"Start of last week",
|
|
63
|
+
"End of last week"
|
|
64
|
+
);
|
|
65
|
+
},
|
|
66
|
+
["this-month"]: () => {
|
|
67
|
+
const now = /* @__PURE__ */ new Date();
|
|
68
|
+
return createDateRange(dateFns.startOfMonth(now), dateFns.endOfMonth(now), "Start of month", "End of month");
|
|
69
|
+
},
|
|
70
|
+
["next-month"]: () => {
|
|
71
|
+
const nextMonth = dateFns.addMonths(/* @__PURE__ */ new Date(), 1);
|
|
72
|
+
return createDateRange(
|
|
73
|
+
dateFns.startOfMonth(nextMonth),
|
|
74
|
+
dateFns.endOfMonth(nextMonth),
|
|
75
|
+
"Start of next month",
|
|
76
|
+
"End of next month"
|
|
77
|
+
);
|
|
78
|
+
},
|
|
79
|
+
["last-month"]: () => {
|
|
80
|
+
const lastMonth = dateFns.subMonths(/* @__PURE__ */ new Date(), 1);
|
|
81
|
+
return createDateRange(
|
|
82
|
+
dateFns.startOfMonth(lastMonth),
|
|
83
|
+
dateFns.endOfMonth(lastMonth),
|
|
84
|
+
"Start of last month",
|
|
85
|
+
"End of last month"
|
|
86
|
+
);
|
|
87
|
+
},
|
|
88
|
+
["this-year"]: () => {
|
|
89
|
+
const now = /* @__PURE__ */ new Date();
|
|
90
|
+
return createDateRange(dateFns.startOfYear(now), dateFns.endOfYear(now), "Start of year", "End of year");
|
|
91
|
+
},
|
|
92
|
+
["last-year"]: () => {
|
|
93
|
+
const lastYear = dateFns.subYears(/* @__PURE__ */ new Date(), 1);
|
|
94
|
+
return createDateRange(
|
|
95
|
+
dateFns.startOfYear(lastYear),
|
|
96
|
+
dateFns.endOfYear(lastYear),
|
|
97
|
+
"Start of last year",
|
|
98
|
+
"End of last year"
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
const dateOptions = [
|
|
103
|
+
{
|
|
104
|
+
id: "today",
|
|
105
|
+
label: "Today",
|
|
106
|
+
values: filterDateFunctions.today(),
|
|
107
|
+
icon: "today"
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
id: "yesterday",
|
|
111
|
+
label: "Yesterday",
|
|
112
|
+
values: filterDateFunctions.yesterday(),
|
|
113
|
+
icon: "date_range"
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
id: "after-now",
|
|
117
|
+
label: "After today",
|
|
118
|
+
values: filterDateFunctions["after-now"](),
|
|
119
|
+
icon: "event_upcoming"
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
id: "before-now",
|
|
123
|
+
label: "Before today",
|
|
124
|
+
values: filterDateFunctions["before-now"](),
|
|
125
|
+
icon: "event_busy"
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
id: "this-week",
|
|
129
|
+
label: "This week",
|
|
130
|
+
values: filterDateFunctions["this-week"](),
|
|
131
|
+
icon: "date_range"
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
id: "last-week",
|
|
135
|
+
label: "Last week",
|
|
136
|
+
values: filterDateFunctions["last-week"](),
|
|
137
|
+
icon: "date_range"
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
id: "this-month",
|
|
141
|
+
label: "This month",
|
|
142
|
+
values: filterDateFunctions["this-month"](),
|
|
143
|
+
icon: "calendar_month"
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
id: "last-month",
|
|
147
|
+
label: "Last month",
|
|
148
|
+
values: filterDateFunctions["last-month"](),
|
|
149
|
+
icon: "calendar_month"
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
id: "this-year",
|
|
153
|
+
label: "This year",
|
|
154
|
+
values: filterDateFunctions["this-year"](),
|
|
155
|
+
icon: "calendar_month"
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
id: "last-year",
|
|
159
|
+
label: "Last year",
|
|
160
|
+
values: filterDateFunctions["last-year"](),
|
|
161
|
+
icon: "calendar_month"
|
|
162
|
+
}
|
|
163
|
+
];
|
|
164
|
+
exports.NO_DATE = NO_DATE;
|
|
165
|
+
exports.dateOptions = dateOptions;
|
|
166
|
+
exports.filterDateFunctions = filterDateFunctions;
|
|
167
|
+
//# sourceMappingURL=filterDates.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filterDates.cjs.js","sources":["../../../../../src/components/SearchFilter/filterDates.ts"],"sourcesContent":["import { Option } from '@ynput/ayon-react-components'\nimport {\n startOfDay,\n endOfDay,\n subDays,\n startOfWeek,\n endOfWeek,\n addWeeks,\n subWeeks,\n startOfMonth,\n endOfMonth,\n addMonths,\n subMonths,\n startOfYear,\n endOfYear,\n subYears,\n setHours,\n} from 'date-fns'\n\nexport const NO_DATE = 'no-date'\n\n// Helper function to create date range arrays\nconst createDateRange = (startDate: Date, endDate: Date, startLabel: string, endLabel: string) => {\n return [\n { label: startLabel, id: startDate.toISOString() },\n { label: endLabel, id: endDate.toISOString() },\n ]\n}\n\n// first value is gte and second is lte\nexport const filterDateFunctions = {\n today: () => {\n const now = new Date()\n return createDateRange(startOfDay(now), endOfDay(now), 'Start of day', 'End of day')\n },\n yesterday: () => {\n const yesterday = subDays(new Date(), 1)\n return createDateRange(\n startOfDay(yesterday),\n endOfDay(yesterday),\n 'Start of yesterday',\n 'End of yesterday',\n )\n },\n ['after-now']: () => {\n const now = new Date()\n return [\n { label: 'After today', id: setHours(now, 24).toISOString() },\n { id: NO_DATE, label: NO_DATE },\n ]\n },\n ['before-now']: () => {\n const now = new Date()\n return [\n { id: NO_DATE, label: NO_DATE },\n { label: 'Before today', id: setHours(now, 0).toISOString() },\n ]\n },\n ['this-week']: () => {\n const now = new Date()\n return createDateRange(\n startOfWeek(now, { weekStartsOn: 0 }),\n endOfWeek(now, { weekStartsOn: 0 }),\n 'Start of week',\n 'End of week',\n )\n },\n ['next-week']: () => {\n const nextWeek = addWeeks(new Date(), 1)\n return createDateRange(\n startOfWeek(nextWeek, { weekStartsOn: 0 }),\n endOfWeek(nextWeek, { weekStartsOn: 0 }),\n 'Start of next week',\n 'End of next week',\n )\n },\n ['last-week']: () => {\n const lastWeek = subWeeks(new Date(), 1)\n return createDateRange(\n startOfWeek(lastWeek, { weekStartsOn: 0 }),\n endOfWeek(lastWeek, { weekStartsOn: 0 }),\n 'Start of last week',\n 'End of last week',\n )\n },\n ['this-month']: () => {\n const now = new Date()\n return createDateRange(startOfMonth(now), endOfMonth(now), 'Start of month', 'End of month')\n },\n ['next-month']: () => {\n const nextMonth = addMonths(new Date(), 1)\n return createDateRange(\n startOfMonth(nextMonth),\n endOfMonth(nextMonth),\n 'Start of next month',\n 'End of next month',\n )\n },\n ['last-month']: () => {\n const lastMonth = subMonths(new Date(), 1)\n return createDateRange(\n startOfMonth(lastMonth),\n endOfMonth(lastMonth),\n 'Start of last month',\n 'End of last month',\n )\n },\n ['this-year']: () => {\n const now = new Date()\n return createDateRange(startOfYear(now), endOfYear(now), 'Start of year', 'End of year')\n },\n ['last-year']: () => {\n const lastYear = subYears(new Date(), 1)\n return createDateRange(\n startOfYear(lastYear),\n endOfYear(lastYear),\n 'Start of last year',\n 'End of last year',\n )\n },\n}\n\nexport type DateOptionType = keyof typeof filterDateFunctions\n\nexport const dateOptions: (Option & { id: DateOptionType })[] = [\n {\n id: 'today',\n label: 'Today',\n values: filterDateFunctions.today(),\n icon: 'today',\n },\n {\n id: 'yesterday',\n label: 'Yesterday',\n values: filterDateFunctions.yesterday(),\n icon: 'date_range',\n },\n {\n id: 'after-now',\n label: 'After today',\n values: filterDateFunctions['after-now'](),\n icon: 'event_upcoming',\n },\n {\n id: 'before-now',\n label: 'Before today',\n values: filterDateFunctions['before-now'](),\n icon: 'event_busy',\n },\n {\n id: 'this-week',\n label: 'This week',\n values: filterDateFunctions['this-week'](),\n icon: 'date_range',\n },\n {\n id: 'last-week',\n label: 'Last week',\n values: filterDateFunctions['last-week'](),\n icon: 'date_range',\n },\n {\n id: 'this-month',\n label: 'This month',\n values: filterDateFunctions['this-month'](),\n icon: 'calendar_month',\n },\n {\n id: 'last-month',\n label: 'Last month',\n values: filterDateFunctions['last-month'](),\n icon: 'calendar_month',\n },\n {\n id: 'this-year',\n label: 'This year',\n values: filterDateFunctions['this-year'](),\n icon: 'calendar_month',\n },\n {\n id: 'last-year',\n label: 'Last year',\n values: filterDateFunctions['last-year'](),\n icon: 'calendar_month',\n },\n]\n"],"names":["startOfDay","endOfDay","subDays","setHours","startOfWeek","endOfWeek","addWeeks","subWeeks","startOfMonth","endOfMonth","addMonths","subMonths","startOfYear","endOfYear","subYears"],"mappings":"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"}
|