@ynput/ayon-frontend-shared 0.2.13 → 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/_virtual/index.cjs10.js +4 -4
- package/dist/_virtual/index.cjs4.js +4 -4
- package/dist/_virtual/index.cjs5.js +4 -4
- package/dist/_virtual/index.cjs6.js +2 -2
- package/dist/_virtual/index.cjs7.js +2 -2
- package/dist/_virtual/index.cjs8.js +4 -4
- package/dist/_virtual/index.cjs9.js +4 -4
- package/dist/_virtual/index.es10.js +4 -4
- package/dist/_virtual/index.es4.js +4 -4
- package/dist/_virtual/index.es5.js +4 -4
- package/dist/_virtual/index.es6.js +2 -2
- package/dist/_virtual/index.es7.js +2 -2
- package/dist/_virtual/index.es8.js +4 -4
- package/dist/_virtual/index.es9.js +4 -4
- 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/node_modules/match-sorter/dist/match-sorter.esm.cjs.js +1 -1
- package/dist/node_modules/match-sorter/dist/match-sorter.esm.es.js +1 -1
- package/dist/node_modules/parse-numeric-range/index.cjs.js +1 -1
- package/dist/node_modules/parse-numeric-range/index.es.js +1 -1
- package/dist/node_modules/rehype/node_modules/unified/lib/index.cjs.js +2 -2
- package/dist/node_modules/rehype/node_modules/unified/lib/index.es.js +2 -2
- package/dist/node_modules/rehype-parse/lib/index.cjs.js +1 -1
- package/dist/node_modules/rehype-parse/lib/index.es.js +1 -1
- package/dist/node_modules/rehype-prism-plus/dist/index.es.cjs.js +1 -1
- package/dist/node_modules/rehype-prism-plus/dist/index.es.es.js +1 -1
- package/dist/node_modules/remove-accents/index.cjs.js +1 -1
- package/dist/node_modules/remove-accents/index.es.js +1 -1
- package/dist/node_modules/vfile/lib/index.cjs.js +1 -1
- package/dist/node_modules/vfile/lib/index.es.js +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/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/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/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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system.cjs.js","sources":["../../../../../src/api/generated/system.ts"],"sourcesContent":["import { api } from '@shared/api/base'\nconst injectedRtkApi = api.injectEndpoints({\n endpoints: (build) => ({\n listFrontendModules: build.query<ListFrontendModulesApiResponse, ListFrontendModulesApiArg>({\n query: () => ({ url: `/api/frontendModules` }),\n }),\n getSites: build.query<GetSitesApiResponse, GetSitesApiArg>({\n query: (queryArg) => ({\n url: `/api/system/sites`,\n params: {\n platform: queryArg.platform,\n hostname: queryArg.hostname,\n },\n }),\n }),\n getSiteInfo: build.query<GetSiteInfoApiResponse, GetSiteInfoApiArg>({\n query: (queryArg) => ({\n url: `/api/info`,\n params: {\n full: queryArg.full,\n },\n }),\n }),\n getProductionMetrics: build.query<GetProductionMetricsApiResponse, GetProductionMetricsApiArg>({\n query: (queryArg) => ({\n url: `/api/metrics`,\n params: {\n system: queryArg.system,\n saturated: queryArg.saturated,\n },\n }),\n }),\n getSystemMetrics: build.query<GetSystemMetricsApiResponse, GetSystemMetricsApiArg>({\n query: () => ({ url: `/api/metrics/system` }),\n }),\n getListOfSecrets: build.query<GetListOfSecretsApiResponse, GetListOfSecretsApiArg>({\n query: () => ({ url: `/api/secrets` }),\n }),\n getSecret: build.query<GetSecretApiResponse, GetSecretApiArg>({\n query: (queryArg) => ({ url: `/api/secrets/${queryArg.secretName}` }),\n }),\n saveSecret: build.mutation<SaveSecretApiResponse, SaveSecretApiArg>({\n query: (queryArg) => ({\n url: `/api/secrets/${queryArg.secretName}`,\n method: 'PUT',\n body: queryArg.secret,\n }),\n }),\n deleteSecret: build.mutation<DeleteSecretApiResponse, DeleteSecretApiArg>({\n query: (queryArg) => ({ url: `/api/secrets/${queryArg.secretName}`, method: 'DELETE' }),\n }),\n requestServerRestart: build.mutation<\n RequestServerRestartApiResponse,\n RequestServerRestartApiArg\n >({\n query: () => ({ url: `/api/system/restart`, method: 'POST' }),\n }),\n getRestartRequired: build.query<GetRestartRequiredApiResponse, GetRestartRequiredApiArg>({\n query: () => ({ url: `/api/system/restartRequired` }),\n }),\n setRestartRequired: build.mutation<SetRestartRequiredApiResponse, SetRestartRequiredApiArg>({\n query: (queryArg) => ({\n url: `/api/system/restartRequired`,\n method: 'POST',\n body: queryArg.restartRequiredModel,\n }),\n }),\n }),\n overrideExisting: false,\n})\nexport { injectedRtkApi as api }\nexport type ListFrontendModulesApiResponse =\n /** status 200 Successful Response */ FrontendModuleListItem[]\nexport type ListFrontendModulesApiArg = void\nexport type GetSitesApiResponse = /** status 200 Successful Response */ SiteInfo[]\nexport type GetSitesApiArg = {\n platform?: 'windows' | 'linux' | 'darwin'\n hostname?: string\n}\nexport type GetSiteInfoApiResponse = /** status 200 Successful Response */ InfoResponseModel\nexport type GetSiteInfoApiArg = {\n /** Include frontend-related information */\n full?: boolean\n}\nexport type GetProductionMetricsApiResponse = /** status 200 Successful Response */ Metrics\nexport type GetProductionMetricsApiArg = {\n /** Collect system metrics */\n system?: boolean\n /** Collect saturated (more granular) metrics */\n saturated?: boolean\n}\nexport type GetSystemMetricsApiResponse = /** status 200 Successful Response */ any\nexport type GetSystemMetricsApiArg = void\nexport type GetListOfSecretsApiResponse = /** status 200 Successful Response */ Secret[]\nexport type GetListOfSecretsApiArg = void\nexport type GetSecretApiResponse = /** status 200 Successful Response */ Secret\nexport type GetSecretApiArg = {\n secretName: string\n}\nexport type SaveSecretApiResponse = unknown\nexport type SaveSecretApiArg = {\n secretName: string\n secret: Secret\n}\nexport type DeleteSecretApiResponse = unknown\nexport type DeleteSecretApiArg = {\n secretName: string\n}\nexport type RequestServerRestartApiResponse = unknown\nexport type RequestServerRestartApiArg = void\nexport type GetRestartRequiredApiResponse =\n /** status 200 Successful Response */ RestartRequiredModel\nexport type GetRestartRequiredApiArg = void\nexport type SetRestartRequiredApiResponse = /** status 200 Successful Response */ any\nexport type SetRestartRequiredApiArg = {\n restartRequiredModel: RestartRequiredModel\n}\nexport type FrontendModuleListItem = {\n addonName: string\n addonVersion: string\n modules: {\n [key: string]: string[]\n }\n}\nexport type SiteInfo = {\n id: string\n platform: 'windows' | 'linux' | 'darwin'\n hostname: string\n version: string\n users: string[]\n}\nexport type ValidationError = {\n loc: (string | number)[]\n msg: string\n type: string\n}\nexport type HttpValidationError = {\n detail?: ValidationError[]\n}\nexport type ReleaseInfo = {\n version: string\n buildDate: string\n buildTime: string\n frontendBranch: string\n backendBranch: string\n frontendCommit: string\n backendCommit: string\n}\nexport type UserAttribModel = {\n fullName?: string\n email?: string\n avatarUrl?: string\n developerMode?: boolean\n freelancer?: boolean\n}\nexport type UserModel = {\n /** Name is an unique id of the {entity_name} */\n name: string\n attrib?: UserAttribModel\n data?: Record<string, any>\n /** Whether the user is active */\n active?: boolean\n ownAttrib?: string[]\n /** Time of creation */\n createdAt?: string\n /** Time of last update */\n updatedAt?: string\n}\nexport type AttributeEnumItem = {\n value: string | number | number | boolean\n label: string\n icon?: string\n color?: string\n}\nexport type AttributeData = {\n /** Type of attribute value */\n type:\n | 'string'\n | 'integer'\n | 'float'\n | 'boolean'\n | 'datetime'\n | 'list_of_strings'\n | 'list_of_integers'\n | 'list_of_any'\n | 'list_of_submodels'\n | 'dict'\n /** Nice, human readable title of the attribute */\n title?: string\n description?: string\n /** Example value of the field. */\n example?: any\n /** Default value for the attribute. Do not set for list types. */\n default?: any\n gt?: number | number\n ge?: number | number\n lt?: number | number\n le?: number | number\n minLength?: number\n maxLength?: number\n /** Minimum number of items in list type. */\n minItems?: number\n /** Only for list types. Maximum number of items in the list. */\n maxItems?: number\n /** Only for string types. The value must match this regex. */\n regex?: string\n /** List of enum items used for displaying select widgets */\n enum?: AttributeEnumItem[]\n /** Inherit the attribute value from the parent entity. */\n inherit?: boolean\n}\nexport type AttributeModel = {\n name: string\n /** Default order */\n position: number\n /** List of entity types the attribute is available on */\n scope?: (\n | ('folder' | 'product' | 'version' | 'representation' | 'task' | 'workfile')\n | ('project' | 'user')\n )[]\n /** Is attribute builtin. Built-in attributes cannot be removed. */\n builtin?: boolean\n data: AttributeData\n}\nexport type SsoOption = {\n name: string\n title?: string\n icon?: string\n color?: string\n textColor?: string\n redirectKey?: string\n url: string\n args?: {\n [key: string]: string\n }\n callback: string\n}\nexport type InfoResponseModel = {\n /** Instance specific message to be displayed in the login page */\n motd?: string\n /** URL of the background image for the login page */\n loginPageBackground?: string\n /** URL of the brand logo for the login page */\n loginPageBrand?: string\n /** Information about the current release */\n releaseInfo?: ReleaseInfo\n /** Version of the Ayon API */\n version?: string\n /** Time (seconds) since the server was started */\n uptime?: number\n /** No admin user exists, display 'Create admin user' form */\n noAdminUser?: boolean\n onboarding?: boolean\n passwordRecoveryAvailable?: boolean\n user?: UserModel\n attributes?: AttributeModel[]\n sites?: SiteInfo[]\n ssoOptions?: SsoOption[]\n extras?: string\n}\nexport type SystemMetricsData = {\n cpuUsage?: number\n memoryUsage?: number\n swapUsage?: number\n uptimeSeconds?: number\n runtimeSeconds?: number\n dbSizeShared?: number\n dbSizeTotal?: number\n dbAvailableConnections?: number\n redisSizeTotal?: number\n storageUtilizationTotal?: number\n}\nexport type UserCounts = {\n total?: number\n active?: number\n admins?: number\n managers?: number\n services?: number\n licensesTotal?: number\n licensesUsed?: number\n}\nexport type ProjectCounts = {\n total?: number\n active?: number\n}\nexport type ProjectMetrics = {\n nickname: string\n folderCount?: number\n productCount?: number\n versionCount?: number\n representationCount?: number\n taskCount?: number\n workfileCount?: number\n rootCount?: number\n teamCount?: number\n /** Duration in days */\n duration?: number\n dbSize?: number\n storageUtilization?: number\n /** List of folder types in the project. Collected only in the 'saturated' mode. */\n folderTypes?: string[]\n /** List of task types in the project. Collected only in the 'saturated' mode. */\n taskTypes?: string[]\n /** List of statuses in the project. Collected only in the 'saturated' mode. */\n statuses?: string[]\n}\nexport type ProductionBundle = {\n addons?: {\n [key: string]: string\n }\n launcherVersion?: string\n}\nexport type SettingsOverrides = {\n addonName?: string\n addonVersion?: string\n /** List of paths to settings, which have a studio override */\n paths?: string[][]\n}\nexport type ServiceInfo = {\n addonName: string\n addonVersion: string\n serviceName: string\n}\nexport type TrafficStat = {\n date: string\n service: string\n ingress: number\n egress: number\n}\nexport type UserStat = {\n date: string\n users: {\n [key: string]: string\n }\n}\nexport type Metrics = {\n version?: string\n /** Information about the branch and commit of the current release */\n releaseInfo?: ReleaseInfo\n /** Time (seconds) since the server was (re)started */\n uptime?: number\n /** System metrics data\n Contains information about machine utilization,\n and database sizes.\n */\n system?: SystemMetricsData\n /** Number of total and active users, admins and managers */\n userCounts?: UserCounts\n /** Number of total and active projects */\n projectCounts?: ProjectCounts\n /** Project specific metrics\n \n Contain information about size and usage of each active project.\n */\n projects?: ProjectMetrics[]\n /** Average number of events per project\n \n This disregards projects with less than 300 events\n (such as testing projects).\n */\n averageProjectEventCount?: number\n /** Addons and their versions installed on the server\n \n We track what addons are installed on the server, and compare this to the\n addons which are actually used in the production bundle.\n */\n installedAddons?: any[][]\n /** Return the count of events per topic.\n \n This helps us with optimization of event clean-up,\n and other maintenance tasks.\n */\n eventTopics?: {\n [key: string]: number\n }\n /** Addons and their versions used in the production bundle\n \n We track what addons are used in the production bundle, as well as what\n launcher version is used. This is used to determine if the production\n bundle is up to date with the latest addons and launcher version,\n and if not, to notify the user that they should update in case of\n security issues or other important changes.\n */\n productionBundle?: ProductionBundle\n /** Studio settings overrides\n \n We track what settings are overridden in the studio settings.\n This helps us determine, which settins are used the most and which\n settings are not used at all. This is used to determine how we should\n organize the settings in the UI and how the settings could be improved.\n */\n studioSettingsOverrides?: SettingsOverrides[]\n /** List of active services */\n services?: ServiceInfo[]\n trafficStats?: TrafficStat[]\n userStats?: UserStat[]\n}\nexport type Secret = {\n name?: string\n value?: string\n}\nexport type RestartRequiredModel = {\n /** Whether the server requires a restart */\n required: boolean\n /** The reason for the restart */\n reason?: string\n}\n"],"names":["api"],"mappings":";;;AACM,MAAA,iBAAiBA,WAAI,gBAAgB;AAAA,EACzC,WAAW,CAAC,WAAW;AAAA,IACrB,qBAAqB,MAAM,MAAiE;AAAA,MAC1F,OAAO,OAAO,EAAE,KAAK,uBAAuB;AAAA,IAAA,CAC7C;AAAA,IACD,UAAU,MAAM,MAA2C;AAAA,MACzD,OAAO,CAAC,cAAc;AAAA,QACpB,KAAK;AAAA,QACL,QAAQ;AAAA,UACN,UAAU,SAAS;AAAA,UACnB,UAAU,SAAS;AAAA,QAAA;AAAA,MAEvB;AAAA,IAAA,CACD;AAAA,IACD,aAAa,MAAM,MAAiD;AAAA,MAClE,OAAO,CAAC,cAAc;AAAA,QACpB,KAAK;AAAA,QACL,QAAQ;AAAA,UACN,MAAM,SAAS;AAAA,QAAA;AAAA,MAEnB;AAAA,IAAA,CACD;AAAA,IACD,sBAAsB,MAAM,MAAmE;AAAA,MAC7F,OAAO,CAAC,cAAc;AAAA,QACpB,KAAK;AAAA,QACL,QAAQ;AAAA,UACN,QAAQ,SAAS;AAAA,UACjB,WAAW,SAAS;AAAA,QAAA;AAAA,MAExB;AAAA,IAAA,CACD;AAAA,IACD,kBAAkB,MAAM,MAA2D;AAAA,MACjF,OAAO,OAAO,EAAE,KAAK,sBAAsB;AAAA,IAAA,CAC5C;AAAA,IACD,kBAAkB,MAAM,MAA2D;AAAA,MACjF,OAAO,OAAO,EAAE,KAAK,eAAe;AAAA,IAAA,CACrC;AAAA,IACD,WAAW,MAAM,MAA6C;AAAA,MAC5D,OAAO,CAAC,cAAc,EAAE,KAAK,gBAAgB,SAAS,UAAU,GAAG;AAAA,IAAA,CACpE;AAAA,IACD,YAAY,MAAM,SAAkD;AAAA,MAClE,OAAO,CAAC,cAAc;AAAA,QACpB,KAAK,gBAAgB,SAAS,UAAU;AAAA,QACxC,QAAQ;AAAA,QACR,MAAM,SAAS;AAAA,MACjB;AAAA,IAAA,CACD;AAAA,IACD,cAAc,MAAM,SAAsD;AAAA,MACxE,OAAO,CAAC,cAAc,EAAE,KAAK,gBAAgB,SAAS,UAAU,IAAI,QAAQ,SAAS;AAAA,IAAA,CACtF;AAAA,IACD,sBAAsB,MAAM,SAG1B;AAAA,MACA,OAAO,OAAO,EAAE,KAAK,uBAAuB,QAAQ,OAAO;AAAA,IAAA,CAC5D;AAAA,IACD,oBAAoB,MAAM,MAA+D;AAAA,MACvF,OAAO,OAAO,EAAE,KAAK,8BAA8B;AAAA,IAAA,CACpD;AAAA,IACD,oBAAoB,MAAM,SAAkE;AAAA,MAC1F,OAAO,CAAC,cAAc;AAAA,QACpB,KAAK;AAAA,QACL,QAAQ;AAAA,QACR,MAAM,SAAS;AAAA,MACjB;AAAA,IACD,CAAA;AAAA,EAAA;AAAA,EAEH,kBAAkB;AACpB,CAAC;;"}
|
|
1
|
+
{"version":3,"file":"system.cjs.js","sources":["../../../../../src/api/generated/system.ts"],"sourcesContent":["import { api } from '@shared/api/base'\nconst injectedRtkApi = api.injectEndpoints({\n endpoints: (build) => ({\n listFrontendModules: build.query<ListFrontendModulesApiResponse, ListFrontendModulesApiArg>({\n query: () => ({ url: `/api/frontendModules` }),\n }),\n getSites: build.query<GetSitesApiResponse, GetSitesApiArg>({\n query: (queryArg) => ({\n url: `/api/system/sites`,\n params: {\n platform: queryArg.platform,\n hostname: queryArg.hostname,\n },\n }),\n }),\n getSiteInfo: build.query<GetSiteInfoApiResponse, GetSiteInfoApiArg>({\n query: (queryArg) => ({\n url: `/api/info`,\n params: {\n full: queryArg.full,\n },\n }),\n }),\n getProductionMetrics: build.query<GetProductionMetricsApiResponse, GetProductionMetricsApiArg>({\n query: (queryArg) => ({\n url: `/api/metrics`,\n params: {\n system: queryArg.system,\n saturated: queryArg.saturated,\n },\n }),\n }),\n getSystemMetrics: build.query<GetSystemMetricsApiResponse, GetSystemMetricsApiArg>({\n query: () => ({ url: `/api/metrics/system` }),\n }),\n getListOfSecrets: build.query<GetListOfSecretsApiResponse, GetListOfSecretsApiArg>({\n query: () => ({ url: `/api/secrets` }),\n }),\n getSecret: build.query<GetSecretApiResponse, GetSecretApiArg>({\n query: (queryArg) => ({ url: `/api/secrets/${queryArg.secretName}` }),\n }),\n saveSecret: build.mutation<SaveSecretApiResponse, SaveSecretApiArg>({\n query: (queryArg) => ({\n url: `/api/secrets/${queryArg.secretName}`,\n method: 'PUT',\n body: queryArg.secret,\n }),\n }),\n deleteSecret: build.mutation<DeleteSecretApiResponse, DeleteSecretApiArg>({\n query: (queryArg) => ({ url: `/api/secrets/${queryArg.secretName}`, method: 'DELETE' }),\n }),\n requestServerRestart: build.mutation<\n RequestServerRestartApiResponse,\n RequestServerRestartApiArg\n >({\n query: () => ({ url: `/api/system/restart`, method: 'POST' }),\n }),\n getRestartRequired: build.query<GetRestartRequiredApiResponse, GetRestartRequiredApiArg>({\n query: () => ({ url: `/api/system/restartRequired` }),\n }),\n setRestartRequired: build.mutation<SetRestartRequiredApiResponse, SetRestartRequiredApiArg>({\n query: (queryArg) => ({\n url: `/api/system/restartRequired`,\n method: 'POST',\n body: queryArg.restartRequiredModel,\n }),\n }),\n }),\n overrideExisting: false,\n})\nexport { injectedRtkApi as api }\nexport type ListFrontendModulesApiResponse =\n /** status 200 Successful Response */ FrontendModuleListItem[]\nexport type ListFrontendModulesApiArg = void\nexport type GetSitesApiResponse = /** status 200 Successful Response */ SiteInfo[]\nexport type GetSitesApiArg = {\n platform?: 'windows' | 'linux' | 'darwin'\n hostname?: string\n}\nexport type GetSiteInfoApiResponse = /** status 200 Successful Response */ InfoResponseModel\nexport type GetSiteInfoApiArg = {\n /** Include frontend-related information */\n full?: boolean\n}\nexport type GetProductionMetricsApiResponse = /** status 200 Successful Response */ Metrics\nexport type GetProductionMetricsApiArg = {\n /** Collect system metrics */\n system?: boolean\n /** Collect saturated (more granular) metrics */\n saturated?: boolean\n}\nexport type GetSystemMetricsApiResponse = /** status 200 Successful Response */ any\nexport type GetSystemMetricsApiArg = void\nexport type GetListOfSecretsApiResponse = /** status 200 Successful Response */ Secret[]\nexport type GetListOfSecretsApiArg = void\nexport type GetSecretApiResponse = /** status 200 Successful Response */ Secret\nexport type GetSecretApiArg = {\n secretName: string\n}\nexport type SaveSecretApiResponse = unknown\nexport type SaveSecretApiArg = {\n secretName: string\n secret: Secret\n}\nexport type DeleteSecretApiResponse = unknown\nexport type DeleteSecretApiArg = {\n secretName: string\n}\nexport type RequestServerRestartApiResponse = unknown\nexport type RequestServerRestartApiArg = void\nexport type GetRestartRequiredApiResponse =\n /** status 200 Successful Response */ RestartRequiredModel\nexport type GetRestartRequiredApiArg = void\nexport type SetRestartRequiredApiResponse = /** status 200 Successful Response */ any\nexport type SetRestartRequiredApiArg = {\n restartRequiredModel: RestartRequiredModel\n}\nexport type FrontendModuleListItem = {\n addonName: string\n addonVersion: string\n modules: {\n [key: string]: string[]\n }\n}\nexport type SiteInfo = {\n id: string\n platform: 'windows' | 'linux' | 'darwin'\n hostname: string\n version: string\n users: string[]\n}\nexport type ValidationError = {\n loc: (string | number)[]\n msg: string\n type: string\n}\nexport type HttpValidationError = {\n detail?: ValidationError[]\n}\nexport type ReleaseInfo = {\n version: string\n buildDate: string\n buildTime: string\n frontendBranch: string\n backendBranch: string\n frontendCommit: string\n backendCommit: string\n}\nexport type UserAttribModel = {\n fullName?: string\n email?: string\n avatarUrl?: string\n developerMode?: boolean\n freelancer?: boolean\n}\nexport type UserModel = {\n /** Name is an unique id of the {entity_name} */\n name: string\n attrib?: UserAttribModel\n data?: Record<string, any>\n /** Whether the user is active */\n active?: boolean\n ownAttrib?: string[]\n /** Time of creation */\n createdAt?: string\n /** Time of last update */\n updatedAt?: string\n}\nexport type AttributeEnumItem = {\n value: string | number | number | boolean\n label: string\n icon?: string\n color?: string\n}\nexport type AttributeData = {\n /** Type of attribute value */\n type:\n | 'string'\n | 'integer'\n | 'float'\n | 'boolean'\n | 'datetime'\n | 'list_of_strings'\n | 'list_of_integers'\n | 'list_of_any'\n | 'list_of_submodels'\n | 'dict'\n /** Nice, human readable title of the attribute */\n title?: string\n description?: string\n /** Example value of the field. */\n example?: any\n /** Default value for the attribute. Do not set for list types. */\n default?: any\n gt?: number | number\n ge?: number | number\n lt?: number | number\n le?: number | number\n minLength?: number\n maxLength?: number\n /** Minimum number of items in list type. */\n minItems?: number\n /** Only for list types. Maximum number of items in the list. */\n maxItems?: number\n /** Only for string types. The value must match this regex. */\n regex?: string\n /** List of enum items used for displaying select widgets */\n enum?: AttributeEnumItem[]\n /** Inherit the attribute value from the parent entity. */\n inherit?: boolean\n}\nexport type AttributeModel = {\n name: string\n /** Default order */\n position: number\n /** List of entity types the attribute is available on */\n scope?: (\n | ('folder' | 'product' | 'version' | 'representation' | 'task' | 'workfile')\n | ('project' | 'user')\n )[]\n /** Is attribute builtin. Built-in attributes cannot be removed. */\n builtin?: boolean\n data: AttributeData\n}\nexport type SsoOption = {\n name: string\n title?: string\n icon?: string\n color?: string\n textColor?: string\n redirectKey?: string\n url: string\n args?: {\n [key: string]: string\n }\n callback: string\n}\nexport type InfoResponseModel = {\n /** Instance specific message to be displayed in the login page */\n motd?: string\n /** URL of the background image for the login page */\n loginPageBackground?: string\n /** URL of the brand logo for the login page */\n loginPageBrand?: string\n /** Information about the current release */\n releaseInfo?: ReleaseInfo\n /** Version of the Ayon API */\n version?: string\n /** Time (seconds) since the server was started */\n uptime?: number\n /** No admin user exists, display 'Create admin user' form */\n noAdminUser?: boolean\n onboarding?: boolean\n passwordRecoveryAvailable?: boolean\n user?: UserModel\n attributes?: AttributeModel[]\n sites?: SiteInfo[]\n ssoOptions?: SsoOption[]\n disableChangelog?: boolean\n extras?: string\n}\nexport type SystemMetricsData = {\n cpuUsage?: number\n memoryUsage?: number\n swapUsage?: number\n uptimeSeconds?: number\n runtimeSeconds?: number\n dbSizeShared?: number\n dbSizeTotal?: number\n dbAvailableConnections?: number\n redisSizeTotal?: number\n storageUtilizationTotal?: number\n}\nexport type UserCounts = {\n total?: number\n active?: number\n admins?: number\n managers?: number\n services?: number\n licensesTotal?: number\n licensesUsed?: number\n}\nexport type ProjectCounts = {\n total?: number\n active?: number\n}\nexport type ProjectMetrics = {\n nickname: string\n folderCount?: number\n productCount?: number\n versionCount?: number\n representationCount?: number\n taskCount?: number\n workfileCount?: number\n rootCount?: number\n teamCount?: number\n /** Duration in days */\n duration?: number\n dbSize?: number\n storageUtilization?: number\n /** List of folder types in the project. Collected only in the 'saturated' mode. */\n folderTypes?: string[]\n /** List of task types in the project. Collected only in the 'saturated' mode. */\n taskTypes?: string[]\n /** List of statuses in the project. Collected only in the 'saturated' mode. */\n statuses?: string[]\n}\nexport type ProductionBundle = {\n addons?: {\n [key: string]: string\n }\n launcherVersion?: string\n}\nexport type SettingsOverrides = {\n addonName?: string\n addonVersion?: string\n /** List of paths to settings, which have a studio override */\n paths?: string[][]\n}\nexport type ServiceInfo = {\n addonName: string\n addonVersion: string\n serviceName: string\n}\nexport type TrafficStat = {\n date: string\n service: string\n ingress: number\n egress: number\n}\nexport type UserStat = {\n date: string\n users: {\n [key: string]: string\n }\n}\nexport type Metrics = {\n version?: string\n /** Information about the branch and commit of the current release */\n releaseInfo?: ReleaseInfo\n /** Time (seconds) since the server was (re)started */\n uptime?: number\n /** System metrics data\n Contains information about machine utilization,\n and database sizes.\n */\n system?: SystemMetricsData\n /** Number of total and active users, admins and managers */\n userCounts?: UserCounts\n /** Number of total and active projects */\n projectCounts?: ProjectCounts\n /** Project specific metrics\n \n Contain information about size and usage of each active project.\n */\n projects?: ProjectMetrics[]\n /** Average number of events per project\n \n This disregards projects with less than 300 events\n (such as testing projects).\n */\n averageProjectEventCount?: number\n /** Addons and their versions installed on the server\n \n We track what addons are installed on the server, and compare this to the\n addons which are actually used in the production bundle.\n */\n installedAddons?: any[][]\n /** Return the count of events per topic.\n \n This helps us with optimization of event clean-up,\n and other maintenance tasks.\n */\n eventTopics?: {\n [key: string]: number\n }\n /** Addons and their versions used in the production bundle\n \n We track what addons are used in the production bundle, as well as what\n launcher version is used. This is used to determine if the production\n bundle is up to date with the latest addons and launcher version,\n and if not, to notify the user that they should update in case of\n security issues or other important changes.\n */\n productionBundle?: ProductionBundle\n /** Studio settings overrides\n \n We track what settings are overridden in the studio settings.\n This helps us determine, which settins are used the most and which\n settings are not used at all. This is used to determine how we should\n organize the settings in the UI and how the settings could be improved.\n */\n studioSettingsOverrides?: SettingsOverrides[]\n /** List of active services */\n services?: ServiceInfo[]\n trafficStats?: TrafficStat[]\n userStats?: UserStat[]\n}\nexport type Secret = {\n name?: string\n value?: string\n}\nexport type RestartRequiredModel = {\n /** Whether the server requires a restart */\n required: boolean\n /** The reason for the restart */\n reason?: string\n}\n"],"names":["api"],"mappings":";;;AACM,MAAA,iBAAiBA,WAAI,gBAAgB;AAAA,EACzC,WAAW,CAAC,WAAW;AAAA,IACrB,qBAAqB,MAAM,MAAiE;AAAA,MAC1F,OAAO,OAAO,EAAE,KAAK,uBAAuB;AAAA,IAAA,CAC7C;AAAA,IACD,UAAU,MAAM,MAA2C;AAAA,MACzD,OAAO,CAAC,cAAc;AAAA,QACpB,KAAK;AAAA,QACL,QAAQ;AAAA,UACN,UAAU,SAAS;AAAA,UACnB,UAAU,SAAS;AAAA,QAAA;AAAA,MAEvB;AAAA,IAAA,CACD;AAAA,IACD,aAAa,MAAM,MAAiD;AAAA,MAClE,OAAO,CAAC,cAAc;AAAA,QACpB,KAAK;AAAA,QACL,QAAQ;AAAA,UACN,MAAM,SAAS;AAAA,QAAA;AAAA,MAEnB;AAAA,IAAA,CACD;AAAA,IACD,sBAAsB,MAAM,MAAmE;AAAA,MAC7F,OAAO,CAAC,cAAc;AAAA,QACpB,KAAK;AAAA,QACL,QAAQ;AAAA,UACN,QAAQ,SAAS;AAAA,UACjB,WAAW,SAAS;AAAA,QAAA;AAAA,MAExB;AAAA,IAAA,CACD;AAAA,IACD,kBAAkB,MAAM,MAA2D;AAAA,MACjF,OAAO,OAAO,EAAE,KAAK,sBAAsB;AAAA,IAAA,CAC5C;AAAA,IACD,kBAAkB,MAAM,MAA2D;AAAA,MACjF,OAAO,OAAO,EAAE,KAAK,eAAe;AAAA,IAAA,CACrC;AAAA,IACD,WAAW,MAAM,MAA6C;AAAA,MAC5D,OAAO,CAAC,cAAc,EAAE,KAAK,gBAAgB,SAAS,UAAU,GAAG;AAAA,IAAA,CACpE;AAAA,IACD,YAAY,MAAM,SAAkD;AAAA,MAClE,OAAO,CAAC,cAAc;AAAA,QACpB,KAAK,gBAAgB,SAAS,UAAU;AAAA,QACxC,QAAQ;AAAA,QACR,MAAM,SAAS;AAAA,MACjB;AAAA,IAAA,CACD;AAAA,IACD,cAAc,MAAM,SAAsD;AAAA,MACxE,OAAO,CAAC,cAAc,EAAE,KAAK,gBAAgB,SAAS,UAAU,IAAI,QAAQ,SAAS;AAAA,IAAA,CACtF;AAAA,IACD,sBAAsB,MAAM,SAG1B;AAAA,MACA,OAAO,OAAO,EAAE,KAAK,uBAAuB,QAAQ,OAAO;AAAA,IAAA,CAC5D;AAAA,IACD,oBAAoB,MAAM,MAA+D;AAAA,MACvF,OAAO,OAAO,EAAE,KAAK,8BAA8B;AAAA,IAAA,CACpD;AAAA,IACD,oBAAoB,MAAM,SAAkE;AAAA,MAC1F,OAAO,CAAC,cAAc;AAAA,QACpB,KAAK;AAAA,QACL,QAAQ;AAAA,QACR,MAAM,SAAS;AAAA,MACjB;AAAA,IACD,CAAA;AAAA,EAAA;AAAA,EAEH,kBAAkB;AACpB,CAAC;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system.es.js","sources":["../../../../../src/api/generated/system.ts"],"sourcesContent":["import { api } from '@shared/api/base'\nconst injectedRtkApi = api.injectEndpoints({\n endpoints: (build) => ({\n listFrontendModules: build.query<ListFrontendModulesApiResponse, ListFrontendModulesApiArg>({\n query: () => ({ url: `/api/frontendModules` }),\n }),\n getSites: build.query<GetSitesApiResponse, GetSitesApiArg>({\n query: (queryArg) => ({\n url: `/api/system/sites`,\n params: {\n platform: queryArg.platform,\n hostname: queryArg.hostname,\n },\n }),\n }),\n getSiteInfo: build.query<GetSiteInfoApiResponse, GetSiteInfoApiArg>({\n query: (queryArg) => ({\n url: `/api/info`,\n params: {\n full: queryArg.full,\n },\n }),\n }),\n getProductionMetrics: build.query<GetProductionMetricsApiResponse, GetProductionMetricsApiArg>({\n query: (queryArg) => ({\n url: `/api/metrics`,\n params: {\n system: queryArg.system,\n saturated: queryArg.saturated,\n },\n }),\n }),\n getSystemMetrics: build.query<GetSystemMetricsApiResponse, GetSystemMetricsApiArg>({\n query: () => ({ url: `/api/metrics/system` }),\n }),\n getListOfSecrets: build.query<GetListOfSecretsApiResponse, GetListOfSecretsApiArg>({\n query: () => ({ url: `/api/secrets` }),\n }),\n getSecret: build.query<GetSecretApiResponse, GetSecretApiArg>({\n query: (queryArg) => ({ url: `/api/secrets/${queryArg.secretName}` }),\n }),\n saveSecret: build.mutation<SaveSecretApiResponse, SaveSecretApiArg>({\n query: (queryArg) => ({\n url: `/api/secrets/${queryArg.secretName}`,\n method: 'PUT',\n body: queryArg.secret,\n }),\n }),\n deleteSecret: build.mutation<DeleteSecretApiResponse, DeleteSecretApiArg>({\n query: (queryArg) => ({ url: `/api/secrets/${queryArg.secretName}`, method: 'DELETE' }),\n }),\n requestServerRestart: build.mutation<\n RequestServerRestartApiResponse,\n RequestServerRestartApiArg\n >({\n query: () => ({ url: `/api/system/restart`, method: 'POST' }),\n }),\n getRestartRequired: build.query<GetRestartRequiredApiResponse, GetRestartRequiredApiArg>({\n query: () => ({ url: `/api/system/restartRequired` }),\n }),\n setRestartRequired: build.mutation<SetRestartRequiredApiResponse, SetRestartRequiredApiArg>({\n query: (queryArg) => ({\n url: `/api/system/restartRequired`,\n method: 'POST',\n body: queryArg.restartRequiredModel,\n }),\n }),\n }),\n overrideExisting: false,\n})\nexport { injectedRtkApi as api }\nexport type ListFrontendModulesApiResponse =\n /** status 200 Successful Response */ FrontendModuleListItem[]\nexport type ListFrontendModulesApiArg = void\nexport type GetSitesApiResponse = /** status 200 Successful Response */ SiteInfo[]\nexport type GetSitesApiArg = {\n platform?: 'windows' | 'linux' | 'darwin'\n hostname?: string\n}\nexport type GetSiteInfoApiResponse = /** status 200 Successful Response */ InfoResponseModel\nexport type GetSiteInfoApiArg = {\n /** Include frontend-related information */\n full?: boolean\n}\nexport type GetProductionMetricsApiResponse = /** status 200 Successful Response */ Metrics\nexport type GetProductionMetricsApiArg = {\n /** Collect system metrics */\n system?: boolean\n /** Collect saturated (more granular) metrics */\n saturated?: boolean\n}\nexport type GetSystemMetricsApiResponse = /** status 200 Successful Response */ any\nexport type GetSystemMetricsApiArg = void\nexport type GetListOfSecretsApiResponse = /** status 200 Successful Response */ Secret[]\nexport type GetListOfSecretsApiArg = void\nexport type GetSecretApiResponse = /** status 200 Successful Response */ Secret\nexport type GetSecretApiArg = {\n secretName: string\n}\nexport type SaveSecretApiResponse = unknown\nexport type SaveSecretApiArg = {\n secretName: string\n secret: Secret\n}\nexport type DeleteSecretApiResponse = unknown\nexport type DeleteSecretApiArg = {\n secretName: string\n}\nexport type RequestServerRestartApiResponse = unknown\nexport type RequestServerRestartApiArg = void\nexport type GetRestartRequiredApiResponse =\n /** status 200 Successful Response */ RestartRequiredModel\nexport type GetRestartRequiredApiArg = void\nexport type SetRestartRequiredApiResponse = /** status 200 Successful Response */ any\nexport type SetRestartRequiredApiArg = {\n restartRequiredModel: RestartRequiredModel\n}\nexport type FrontendModuleListItem = {\n addonName: string\n addonVersion: string\n modules: {\n [key: string]: string[]\n }\n}\nexport type SiteInfo = {\n id: string\n platform: 'windows' | 'linux' | 'darwin'\n hostname: string\n version: string\n users: string[]\n}\nexport type ValidationError = {\n loc: (string | number)[]\n msg: string\n type: string\n}\nexport type HttpValidationError = {\n detail?: ValidationError[]\n}\nexport type ReleaseInfo = {\n version: string\n buildDate: string\n buildTime: string\n frontendBranch: string\n backendBranch: string\n frontendCommit: string\n backendCommit: string\n}\nexport type UserAttribModel = {\n fullName?: string\n email?: string\n avatarUrl?: string\n developerMode?: boolean\n freelancer?: boolean\n}\nexport type UserModel = {\n /** Name is an unique id of the {entity_name} */\n name: string\n attrib?: UserAttribModel\n data?: Record<string, any>\n /** Whether the user is active */\n active?: boolean\n ownAttrib?: string[]\n /** Time of creation */\n createdAt?: string\n /** Time of last update */\n updatedAt?: string\n}\nexport type AttributeEnumItem = {\n value: string | number | number | boolean\n label: string\n icon?: string\n color?: string\n}\nexport type AttributeData = {\n /** Type of attribute value */\n type:\n | 'string'\n | 'integer'\n | 'float'\n | 'boolean'\n | 'datetime'\n | 'list_of_strings'\n | 'list_of_integers'\n | 'list_of_any'\n | 'list_of_submodels'\n | 'dict'\n /** Nice, human readable title of the attribute */\n title?: string\n description?: string\n /** Example value of the field. */\n example?: any\n /** Default value for the attribute. Do not set for list types. */\n default?: any\n gt?: number | number\n ge?: number | number\n lt?: number | number\n le?: number | number\n minLength?: number\n maxLength?: number\n /** Minimum number of items in list type. */\n minItems?: number\n /** Only for list types. Maximum number of items in the list. */\n maxItems?: number\n /** Only for string types. The value must match this regex. */\n regex?: string\n /** List of enum items used for displaying select widgets */\n enum?: AttributeEnumItem[]\n /** Inherit the attribute value from the parent entity. */\n inherit?: boolean\n}\nexport type AttributeModel = {\n name: string\n /** Default order */\n position: number\n /** List of entity types the attribute is available on */\n scope?: (\n | ('folder' | 'product' | 'version' | 'representation' | 'task' | 'workfile')\n | ('project' | 'user')\n )[]\n /** Is attribute builtin. Built-in attributes cannot be removed. */\n builtin?: boolean\n data: AttributeData\n}\nexport type SsoOption = {\n name: string\n title?: string\n icon?: string\n color?: string\n textColor?: string\n redirectKey?: string\n url: string\n args?: {\n [key: string]: string\n }\n callback: string\n}\nexport type InfoResponseModel = {\n /** Instance specific message to be displayed in the login page */\n motd?: string\n /** URL of the background image for the login page */\n loginPageBackground?: string\n /** URL of the brand logo for the login page */\n loginPageBrand?: string\n /** Information about the current release */\n releaseInfo?: ReleaseInfo\n /** Version of the Ayon API */\n version?: string\n /** Time (seconds) since the server was started */\n uptime?: number\n /** No admin user exists, display 'Create admin user' form */\n noAdminUser?: boolean\n onboarding?: boolean\n passwordRecoveryAvailable?: boolean\n user?: UserModel\n attributes?: AttributeModel[]\n sites?: SiteInfo[]\n ssoOptions?: SsoOption[]\n extras?: string\n}\nexport type SystemMetricsData = {\n cpuUsage?: number\n memoryUsage?: number\n swapUsage?: number\n uptimeSeconds?: number\n runtimeSeconds?: number\n dbSizeShared?: number\n dbSizeTotal?: number\n dbAvailableConnections?: number\n redisSizeTotal?: number\n storageUtilizationTotal?: number\n}\nexport type UserCounts = {\n total?: number\n active?: number\n admins?: number\n managers?: number\n services?: number\n licensesTotal?: number\n licensesUsed?: number\n}\nexport type ProjectCounts = {\n total?: number\n active?: number\n}\nexport type ProjectMetrics = {\n nickname: string\n folderCount?: number\n productCount?: number\n versionCount?: number\n representationCount?: number\n taskCount?: number\n workfileCount?: number\n rootCount?: number\n teamCount?: number\n /** Duration in days */\n duration?: number\n dbSize?: number\n storageUtilization?: number\n /** List of folder types in the project. Collected only in the 'saturated' mode. */\n folderTypes?: string[]\n /** List of task types in the project. Collected only in the 'saturated' mode. */\n taskTypes?: string[]\n /** List of statuses in the project. Collected only in the 'saturated' mode. */\n statuses?: string[]\n}\nexport type ProductionBundle = {\n addons?: {\n [key: string]: string\n }\n launcherVersion?: string\n}\nexport type SettingsOverrides = {\n addonName?: string\n addonVersion?: string\n /** List of paths to settings, which have a studio override */\n paths?: string[][]\n}\nexport type ServiceInfo = {\n addonName: string\n addonVersion: string\n serviceName: string\n}\nexport type TrafficStat = {\n date: string\n service: string\n ingress: number\n egress: number\n}\nexport type UserStat = {\n date: string\n users: {\n [key: string]: string\n }\n}\nexport type Metrics = {\n version?: string\n /** Information about the branch and commit of the current release */\n releaseInfo?: ReleaseInfo\n /** Time (seconds) since the server was (re)started */\n uptime?: number\n /** System metrics data\n Contains information about machine utilization,\n and database sizes.\n */\n system?: SystemMetricsData\n /** Number of total and active users, admins and managers */\n userCounts?: UserCounts\n /** Number of total and active projects */\n projectCounts?: ProjectCounts\n /** Project specific metrics\n \n Contain information about size and usage of each active project.\n */\n projects?: ProjectMetrics[]\n /** Average number of events per project\n \n This disregards projects with less than 300 events\n (such as testing projects).\n */\n averageProjectEventCount?: number\n /** Addons and their versions installed on the server\n \n We track what addons are installed on the server, and compare this to the\n addons which are actually used in the production bundle.\n */\n installedAddons?: any[][]\n /** Return the count of events per topic.\n \n This helps us with optimization of event clean-up,\n and other maintenance tasks.\n */\n eventTopics?: {\n [key: string]: number\n }\n /** Addons and their versions used in the production bundle\n \n We track what addons are used in the production bundle, as well as what\n launcher version is used. This is used to determine if the production\n bundle is up to date with the latest addons and launcher version,\n and if not, to notify the user that they should update in case of\n security issues or other important changes.\n */\n productionBundle?: ProductionBundle\n /** Studio settings overrides\n \n We track what settings are overridden in the studio settings.\n This helps us determine, which settins are used the most and which\n settings are not used at all. This is used to determine how we should\n organize the settings in the UI and how the settings could be improved.\n */\n studioSettingsOverrides?: SettingsOverrides[]\n /** List of active services */\n services?: ServiceInfo[]\n trafficStats?: TrafficStat[]\n userStats?: UserStat[]\n}\nexport type Secret = {\n name?: string\n value?: string\n}\nexport type RestartRequiredModel = {\n /** Whether the server requires a restart */\n required: boolean\n /** The reason for the restart */\n reason?: string\n}\n"],"names":[],"mappings":";AACM,MAAA,iBAAiB,IAAI,gBAAgB;AAAA,EACzC,WAAW,CAAC,WAAW;AAAA,IACrB,qBAAqB,MAAM,MAAiE;AAAA,MAC1F,OAAO,OAAO,EAAE,KAAK,uBAAuB;AAAA,IAAA,CAC7C;AAAA,IACD,UAAU,MAAM,MAA2C;AAAA,MACzD,OAAO,CAAC,cAAc;AAAA,QACpB,KAAK;AAAA,QACL,QAAQ;AAAA,UACN,UAAU,SAAS;AAAA,UACnB,UAAU,SAAS;AAAA,QAAA;AAAA,MAEvB;AAAA,IAAA,CACD;AAAA,IACD,aAAa,MAAM,MAAiD;AAAA,MAClE,OAAO,CAAC,cAAc;AAAA,QACpB,KAAK;AAAA,QACL,QAAQ;AAAA,UACN,MAAM,SAAS;AAAA,QAAA;AAAA,MAEnB;AAAA,IAAA,CACD;AAAA,IACD,sBAAsB,MAAM,MAAmE;AAAA,MAC7F,OAAO,CAAC,cAAc;AAAA,QACpB,KAAK;AAAA,QACL,QAAQ;AAAA,UACN,QAAQ,SAAS;AAAA,UACjB,WAAW,SAAS;AAAA,QAAA;AAAA,MAExB;AAAA,IAAA,CACD;AAAA,IACD,kBAAkB,MAAM,MAA2D;AAAA,MACjF,OAAO,OAAO,EAAE,KAAK,sBAAsB;AAAA,IAAA,CAC5C;AAAA,IACD,kBAAkB,MAAM,MAA2D;AAAA,MACjF,OAAO,OAAO,EAAE,KAAK,eAAe;AAAA,IAAA,CACrC;AAAA,IACD,WAAW,MAAM,MAA6C;AAAA,MAC5D,OAAO,CAAC,cAAc,EAAE,KAAK,gBAAgB,SAAS,UAAU,GAAG;AAAA,IAAA,CACpE;AAAA,IACD,YAAY,MAAM,SAAkD;AAAA,MAClE,OAAO,CAAC,cAAc;AAAA,QACpB,KAAK,gBAAgB,SAAS,UAAU;AAAA,QACxC,QAAQ;AAAA,QACR,MAAM,SAAS;AAAA,MACjB;AAAA,IAAA,CACD;AAAA,IACD,cAAc,MAAM,SAAsD;AAAA,MACxE,OAAO,CAAC,cAAc,EAAE,KAAK,gBAAgB,SAAS,UAAU,IAAI,QAAQ,SAAS;AAAA,IAAA,CACtF;AAAA,IACD,sBAAsB,MAAM,SAG1B;AAAA,MACA,OAAO,OAAO,EAAE,KAAK,uBAAuB,QAAQ,OAAO;AAAA,IAAA,CAC5D;AAAA,IACD,oBAAoB,MAAM,MAA+D;AAAA,MACvF,OAAO,OAAO,EAAE,KAAK,8BAA8B;AAAA,IAAA,CACpD;AAAA,IACD,oBAAoB,MAAM,SAAkE;AAAA,MAC1F,OAAO,CAAC,cAAc;AAAA,QACpB,KAAK;AAAA,QACL,QAAQ;AAAA,QACR,MAAM,SAAS;AAAA,MACjB;AAAA,IACD,CAAA;AAAA,EAAA;AAAA,EAEH,kBAAkB;AACpB,CAAC;"}
|
|
1
|
+
{"version":3,"file":"system.es.js","sources":["../../../../../src/api/generated/system.ts"],"sourcesContent":["import { api } from '@shared/api/base'\nconst injectedRtkApi = api.injectEndpoints({\n endpoints: (build) => ({\n listFrontendModules: build.query<ListFrontendModulesApiResponse, ListFrontendModulesApiArg>({\n query: () => ({ url: `/api/frontendModules` }),\n }),\n getSites: build.query<GetSitesApiResponse, GetSitesApiArg>({\n query: (queryArg) => ({\n url: `/api/system/sites`,\n params: {\n platform: queryArg.platform,\n hostname: queryArg.hostname,\n },\n }),\n }),\n getSiteInfo: build.query<GetSiteInfoApiResponse, GetSiteInfoApiArg>({\n query: (queryArg) => ({\n url: `/api/info`,\n params: {\n full: queryArg.full,\n },\n }),\n }),\n getProductionMetrics: build.query<GetProductionMetricsApiResponse, GetProductionMetricsApiArg>({\n query: (queryArg) => ({\n url: `/api/metrics`,\n params: {\n system: queryArg.system,\n saturated: queryArg.saturated,\n },\n }),\n }),\n getSystemMetrics: build.query<GetSystemMetricsApiResponse, GetSystemMetricsApiArg>({\n query: () => ({ url: `/api/metrics/system` }),\n }),\n getListOfSecrets: build.query<GetListOfSecretsApiResponse, GetListOfSecretsApiArg>({\n query: () => ({ url: `/api/secrets` }),\n }),\n getSecret: build.query<GetSecretApiResponse, GetSecretApiArg>({\n query: (queryArg) => ({ url: `/api/secrets/${queryArg.secretName}` }),\n }),\n saveSecret: build.mutation<SaveSecretApiResponse, SaveSecretApiArg>({\n query: (queryArg) => ({\n url: `/api/secrets/${queryArg.secretName}`,\n method: 'PUT',\n body: queryArg.secret,\n }),\n }),\n deleteSecret: build.mutation<DeleteSecretApiResponse, DeleteSecretApiArg>({\n query: (queryArg) => ({ url: `/api/secrets/${queryArg.secretName}`, method: 'DELETE' }),\n }),\n requestServerRestart: build.mutation<\n RequestServerRestartApiResponse,\n RequestServerRestartApiArg\n >({\n query: () => ({ url: `/api/system/restart`, method: 'POST' }),\n }),\n getRestartRequired: build.query<GetRestartRequiredApiResponse, GetRestartRequiredApiArg>({\n query: () => ({ url: `/api/system/restartRequired` }),\n }),\n setRestartRequired: build.mutation<SetRestartRequiredApiResponse, SetRestartRequiredApiArg>({\n query: (queryArg) => ({\n url: `/api/system/restartRequired`,\n method: 'POST',\n body: queryArg.restartRequiredModel,\n }),\n }),\n }),\n overrideExisting: false,\n})\nexport { injectedRtkApi as api }\nexport type ListFrontendModulesApiResponse =\n /** status 200 Successful Response */ FrontendModuleListItem[]\nexport type ListFrontendModulesApiArg = void\nexport type GetSitesApiResponse = /** status 200 Successful Response */ SiteInfo[]\nexport type GetSitesApiArg = {\n platform?: 'windows' | 'linux' | 'darwin'\n hostname?: string\n}\nexport type GetSiteInfoApiResponse = /** status 200 Successful Response */ InfoResponseModel\nexport type GetSiteInfoApiArg = {\n /** Include frontend-related information */\n full?: boolean\n}\nexport type GetProductionMetricsApiResponse = /** status 200 Successful Response */ Metrics\nexport type GetProductionMetricsApiArg = {\n /** Collect system metrics */\n system?: boolean\n /** Collect saturated (more granular) metrics */\n saturated?: boolean\n}\nexport type GetSystemMetricsApiResponse = /** status 200 Successful Response */ any\nexport type GetSystemMetricsApiArg = void\nexport type GetListOfSecretsApiResponse = /** status 200 Successful Response */ Secret[]\nexport type GetListOfSecretsApiArg = void\nexport type GetSecretApiResponse = /** status 200 Successful Response */ Secret\nexport type GetSecretApiArg = {\n secretName: string\n}\nexport type SaveSecretApiResponse = unknown\nexport type SaveSecretApiArg = {\n secretName: string\n secret: Secret\n}\nexport type DeleteSecretApiResponse = unknown\nexport type DeleteSecretApiArg = {\n secretName: string\n}\nexport type RequestServerRestartApiResponse = unknown\nexport type RequestServerRestartApiArg = void\nexport type GetRestartRequiredApiResponse =\n /** status 200 Successful Response */ RestartRequiredModel\nexport type GetRestartRequiredApiArg = void\nexport type SetRestartRequiredApiResponse = /** status 200 Successful Response */ any\nexport type SetRestartRequiredApiArg = {\n restartRequiredModel: RestartRequiredModel\n}\nexport type FrontendModuleListItem = {\n addonName: string\n addonVersion: string\n modules: {\n [key: string]: string[]\n }\n}\nexport type SiteInfo = {\n id: string\n platform: 'windows' | 'linux' | 'darwin'\n hostname: string\n version: string\n users: string[]\n}\nexport type ValidationError = {\n loc: (string | number)[]\n msg: string\n type: string\n}\nexport type HttpValidationError = {\n detail?: ValidationError[]\n}\nexport type ReleaseInfo = {\n version: string\n buildDate: string\n buildTime: string\n frontendBranch: string\n backendBranch: string\n frontendCommit: string\n backendCommit: string\n}\nexport type UserAttribModel = {\n fullName?: string\n email?: string\n avatarUrl?: string\n developerMode?: boolean\n freelancer?: boolean\n}\nexport type UserModel = {\n /** Name is an unique id of the {entity_name} */\n name: string\n attrib?: UserAttribModel\n data?: Record<string, any>\n /** Whether the user is active */\n active?: boolean\n ownAttrib?: string[]\n /** Time of creation */\n createdAt?: string\n /** Time of last update */\n updatedAt?: string\n}\nexport type AttributeEnumItem = {\n value: string | number | number | boolean\n label: string\n icon?: string\n color?: string\n}\nexport type AttributeData = {\n /** Type of attribute value */\n type:\n | 'string'\n | 'integer'\n | 'float'\n | 'boolean'\n | 'datetime'\n | 'list_of_strings'\n | 'list_of_integers'\n | 'list_of_any'\n | 'list_of_submodels'\n | 'dict'\n /** Nice, human readable title of the attribute */\n title?: string\n description?: string\n /** Example value of the field. */\n example?: any\n /** Default value for the attribute. Do not set for list types. */\n default?: any\n gt?: number | number\n ge?: number | number\n lt?: number | number\n le?: number | number\n minLength?: number\n maxLength?: number\n /** Minimum number of items in list type. */\n minItems?: number\n /** Only for list types. Maximum number of items in the list. */\n maxItems?: number\n /** Only for string types. The value must match this regex. */\n regex?: string\n /** List of enum items used for displaying select widgets */\n enum?: AttributeEnumItem[]\n /** Inherit the attribute value from the parent entity. */\n inherit?: boolean\n}\nexport type AttributeModel = {\n name: string\n /** Default order */\n position: number\n /** List of entity types the attribute is available on */\n scope?: (\n | ('folder' | 'product' | 'version' | 'representation' | 'task' | 'workfile')\n | ('project' | 'user')\n )[]\n /** Is attribute builtin. Built-in attributes cannot be removed. */\n builtin?: boolean\n data: AttributeData\n}\nexport type SsoOption = {\n name: string\n title?: string\n icon?: string\n color?: string\n textColor?: string\n redirectKey?: string\n url: string\n args?: {\n [key: string]: string\n }\n callback: string\n}\nexport type InfoResponseModel = {\n /** Instance specific message to be displayed in the login page */\n motd?: string\n /** URL of the background image for the login page */\n loginPageBackground?: string\n /** URL of the brand logo for the login page */\n loginPageBrand?: string\n /** Information about the current release */\n releaseInfo?: ReleaseInfo\n /** Version of the Ayon API */\n version?: string\n /** Time (seconds) since the server was started */\n uptime?: number\n /** No admin user exists, display 'Create admin user' form */\n noAdminUser?: boolean\n onboarding?: boolean\n passwordRecoveryAvailable?: boolean\n user?: UserModel\n attributes?: AttributeModel[]\n sites?: SiteInfo[]\n ssoOptions?: SsoOption[]\n disableChangelog?: boolean\n extras?: string\n}\nexport type SystemMetricsData = {\n cpuUsage?: number\n memoryUsage?: number\n swapUsage?: number\n uptimeSeconds?: number\n runtimeSeconds?: number\n dbSizeShared?: number\n dbSizeTotal?: number\n dbAvailableConnections?: number\n redisSizeTotal?: number\n storageUtilizationTotal?: number\n}\nexport type UserCounts = {\n total?: number\n active?: number\n admins?: number\n managers?: number\n services?: number\n licensesTotal?: number\n licensesUsed?: number\n}\nexport type ProjectCounts = {\n total?: number\n active?: number\n}\nexport type ProjectMetrics = {\n nickname: string\n folderCount?: number\n productCount?: number\n versionCount?: number\n representationCount?: number\n taskCount?: number\n workfileCount?: number\n rootCount?: number\n teamCount?: number\n /** Duration in days */\n duration?: number\n dbSize?: number\n storageUtilization?: number\n /** List of folder types in the project. Collected only in the 'saturated' mode. */\n folderTypes?: string[]\n /** List of task types in the project. Collected only in the 'saturated' mode. */\n taskTypes?: string[]\n /** List of statuses in the project. Collected only in the 'saturated' mode. */\n statuses?: string[]\n}\nexport type ProductionBundle = {\n addons?: {\n [key: string]: string\n }\n launcherVersion?: string\n}\nexport type SettingsOverrides = {\n addonName?: string\n addonVersion?: string\n /** List of paths to settings, which have a studio override */\n paths?: string[][]\n}\nexport type ServiceInfo = {\n addonName: string\n addonVersion: string\n serviceName: string\n}\nexport type TrafficStat = {\n date: string\n service: string\n ingress: number\n egress: number\n}\nexport type UserStat = {\n date: string\n users: {\n [key: string]: string\n }\n}\nexport type Metrics = {\n version?: string\n /** Information about the branch and commit of the current release */\n releaseInfo?: ReleaseInfo\n /** Time (seconds) since the server was (re)started */\n uptime?: number\n /** System metrics data\n Contains information about machine utilization,\n and database sizes.\n */\n system?: SystemMetricsData\n /** Number of total and active users, admins and managers */\n userCounts?: UserCounts\n /** Number of total and active projects */\n projectCounts?: ProjectCounts\n /** Project specific metrics\n \n Contain information about size and usage of each active project.\n */\n projects?: ProjectMetrics[]\n /** Average number of events per project\n \n This disregards projects with less than 300 events\n (such as testing projects).\n */\n averageProjectEventCount?: number\n /** Addons and their versions installed on the server\n \n We track what addons are installed on the server, and compare this to the\n addons which are actually used in the production bundle.\n */\n installedAddons?: any[][]\n /** Return the count of events per topic.\n \n This helps us with optimization of event clean-up,\n and other maintenance tasks.\n */\n eventTopics?: {\n [key: string]: number\n }\n /** Addons and their versions used in the production bundle\n \n We track what addons are used in the production bundle, as well as what\n launcher version is used. This is used to determine if the production\n bundle is up to date with the latest addons and launcher version,\n and if not, to notify the user that they should update in case of\n security issues or other important changes.\n */\n productionBundle?: ProductionBundle\n /** Studio settings overrides\n \n We track what settings are overridden in the studio settings.\n This helps us determine, which settins are used the most and which\n settings are not used at all. This is used to determine how we should\n organize the settings in the UI and how the settings could be improved.\n */\n studioSettingsOverrides?: SettingsOverrides[]\n /** List of active services */\n services?: ServiceInfo[]\n trafficStats?: TrafficStat[]\n userStats?: UserStat[]\n}\nexport type Secret = {\n name?: string\n value?: string\n}\nexport type RestartRequiredModel = {\n /** Whether the server requires a restart */\n required: boolean\n /** The reason for the restart */\n reason?: string\n}\n"],"names":[],"mappings":";AACM,MAAA,iBAAiB,IAAI,gBAAgB;AAAA,EACzC,WAAW,CAAC,WAAW;AAAA,IACrB,qBAAqB,MAAM,MAAiE;AAAA,MAC1F,OAAO,OAAO,EAAE,KAAK,uBAAuB;AAAA,IAAA,CAC7C;AAAA,IACD,UAAU,MAAM,MAA2C;AAAA,MACzD,OAAO,CAAC,cAAc;AAAA,QACpB,KAAK;AAAA,QACL,QAAQ;AAAA,UACN,UAAU,SAAS;AAAA,UACnB,UAAU,SAAS;AAAA,QAAA;AAAA,MAEvB;AAAA,IAAA,CACD;AAAA,IACD,aAAa,MAAM,MAAiD;AAAA,MAClE,OAAO,CAAC,cAAc;AAAA,QACpB,KAAK;AAAA,QACL,QAAQ;AAAA,UACN,MAAM,SAAS;AAAA,QAAA;AAAA,MAEnB;AAAA,IAAA,CACD;AAAA,IACD,sBAAsB,MAAM,MAAmE;AAAA,MAC7F,OAAO,CAAC,cAAc;AAAA,QACpB,KAAK;AAAA,QACL,QAAQ;AAAA,UACN,QAAQ,SAAS;AAAA,UACjB,WAAW,SAAS;AAAA,QAAA;AAAA,MAExB;AAAA,IAAA,CACD;AAAA,IACD,kBAAkB,MAAM,MAA2D;AAAA,MACjF,OAAO,OAAO,EAAE,KAAK,sBAAsB;AAAA,IAAA,CAC5C;AAAA,IACD,kBAAkB,MAAM,MAA2D;AAAA,MACjF,OAAO,OAAO,EAAE,KAAK,eAAe;AAAA,IAAA,CACrC;AAAA,IACD,WAAW,MAAM,MAA6C;AAAA,MAC5D,OAAO,CAAC,cAAc,EAAE,KAAK,gBAAgB,SAAS,UAAU,GAAG;AAAA,IAAA,CACpE;AAAA,IACD,YAAY,MAAM,SAAkD;AAAA,MAClE,OAAO,CAAC,cAAc;AAAA,QACpB,KAAK,gBAAgB,SAAS,UAAU;AAAA,QACxC,QAAQ;AAAA,QACR,MAAM,SAAS;AAAA,MACjB;AAAA,IAAA,CACD;AAAA,IACD,cAAc,MAAM,SAAsD;AAAA,MACxE,OAAO,CAAC,cAAc,EAAE,KAAK,gBAAgB,SAAS,UAAU,IAAI,QAAQ,SAAS;AAAA,IAAA,CACtF;AAAA,IACD,sBAAsB,MAAM,SAG1B;AAAA,MACA,OAAO,OAAO,EAAE,KAAK,uBAAuB,QAAQ,OAAO;AAAA,IAAA,CAC5D;AAAA,IACD,oBAAoB,MAAM,MAA+D;AAAA,MACvF,OAAO,OAAO,EAAE,KAAK,8BAA8B;AAAA,IAAA,CACpD;AAAA,IACD,oBAAoB,MAAM,SAAkE;AAAA,MAC1F,OAAO,CAAC,cAAc;AAAA,QACpB,KAAK;AAAA,QACL,QAAQ;AAAA,QACR,MAAM,SAAS;AAAA,MACjB;AAAA,IACD,CAAA;AAAA,EAAA;AAAA,EAEH,kBAAkB;AACpB,CAAC;"}
|
|
@@ -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 EntityThumbnailUploader = ({
|
|
175
176
|
children = [],
|
|
176
177
|
entityType,
|
package/dist/shared/src/components/EntityThumbnailUploader/EntityThumbnailUploader.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityThumbnailUploader.cjs.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":["useState","useUpdateEntitiesMutation","useRef","jsx","ThumbnailUploadProvider","jsxs","Styled.DragAndDropWrapper","ThumbnailWrapper","ThumbnailUploader"],"mappings":"
|
|
1
|
+
{"version":3,"file":"EntityThumbnailUploader.cjs.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":["useState","useUpdateEntitiesMutation","useRef","jsx","ThumbnailUploadProvider","jsxs","Styled.DragAndDropWrapper","ThumbnailWrapper","ThumbnailUploader"],"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,IAAIA,MAAAA,SAAS,KAAK;AAC1D,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,MAAAA,SAAS,KAAK;AAEtD,QAAA,CAAC,cAAc,IAAIC,uCAA0B;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,WAAWC,aAAyB,IAAI;AAG5C,SAAAC,2BAAA,kBAAA;AAAA,IAACC,yBAAA;AAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MAEA,UAAAC,2BAAA,kBAAA;AAAA,QAACC,+BAAO;AAAA,QAAP;AAAA,UACC,WAAW,KAAK,EAAE,WAAW;AAAA,UAC7B,aAAa,MAAM,kBAAkB,IAAI;AAAA,UAEzC,UAAA;AAAA,YAAAH,iDAACI,0BAAAA,kBACC,EAAA,UAAAJ,2BAAAA,kBAAAA,IAAC,OAAK,EAAA,SAAS,CAAA,GACjB;AAAA,YACAA,2BAAA,kBAAA;AAAA,cAACK,kBAAA;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;;"}
|
|
@@ -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 EntityThumbnailUploader = ({
|
|
173
174
|
children = [],
|
|
174
175
|
entityType,
|
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;;"}
|