@ynput/ayon-frontend-shared 0.3.23 → 0.3.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_virtual/index.cjs6.js +1 -1
- package/dist/_virtual/index.cjs8.js +1 -1
- package/dist/_virtual/index.es6.js +2 -2
- package/dist/_virtual/index.es8.js +2 -2
- package/dist/api.cjs.js +1 -1
- package/dist/api.es.js +178 -176
- 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/remove-accents/index.cjs.js +1 -1
- package/dist/node_modules/remove-accents/index.es.js +1 -1
- package/dist/shared/node_modules/@module-federation/error-codes/dist/index.cjs.js +1 -1
- package/dist/shared/node_modules/@module-federation/error-codes/dist/index.es.js +1 -1
- package/dist/shared/node_modules/@module-federation/runtime-core/dist/index.cjs.js +1 -1
- package/dist/shared/node_modules/@module-federation/runtime-core/dist/index.es.js +1 -1
- package/dist/shared/node_modules/react-is/index.cjs.js +1 -1
- package/dist/shared/node_modules/react-is/index.es.js +1 -1
- package/dist/shared/src/api/base/client.cjs.js +1 -1
- package/dist/shared/src/api/base/client.cjs.js.map +1 -1
- package/dist/shared/src/api/base/client.es.js +4 -3
- package/dist/shared/src/api/base/client.es.js.map +1 -1
- package/dist/shared/src/api/generated/projects.cjs.js +1 -1
- package/dist/shared/src/api/generated/projects.cjs.js.map +1 -1
- package/dist/shared/src/api/generated/projects.es.js +32 -41
- package/dist/shared/src/api/generated/projects.es.js.map +1 -1
- package/dist/shared/src/api/queries/project/getProject.cjs.js +1 -1
- package/dist/shared/src/api/queries/project/getProject.cjs.js.map +1 -1
- package/dist/shared/src/api/queries/project/getProject.es.js +29 -15
- package/dist/shared/src/api/queries/project/getProject.es.js.map +1 -1
- package/dist/shared/src/api/queries/project/updateProject.cjs.js +1 -1
- package/dist/shared/src/api/queries/project/updateProject.cjs.js.map +1 -1
- package/dist/shared/src/api/queries/project/updateProject.es.js +19 -14
- package/dist/shared/src/api/queries/project/updateProject.es.js.map +1 -1
- package/dist/shared/src/components/ReviewablesSelector/Card.cjs.js +1 -1
- package/dist/shared/src/components/ReviewablesSelector/Card.cjs.js.map +1 -1
- package/dist/shared/src/components/ReviewablesSelector/Card.es.js +21 -21
- package/dist/shared/src/components/ReviewablesSelector/Card.es.js.map +1 -1
- package/dist/shared/src/components/ReviewablesSelector/ReviewablesSelector.cjs.js.map +1 -1
- package/dist/shared/src/components/ReviewablesSelector/ReviewablesSelector.es.js.map +1 -1
- package/dist/types/api/generated/projects.d.ts +41 -23
- package/dist/types/api/queries/project/getProject.d.ts +188 -1
- package/dist/types/api/queries/project/updateProject.d.ts +171 -11
- package/dist/types/components/ReviewablesSelector/Card.d.ts +1 -1
- package/dist/types/components/ReviewablesSelector/ReviewablesSelector.d.ts +1 -1
- package/dist/types/containers/Slicer/hooks/useProjectAnatomySlices.d.ts +2 -0
- package/package.json +1 -1
|
@@ -267,38 +267,38 @@ import "../VersionUploader/context/VersionUploadContext.es.js";
|
|
|
267
267
|
import "../Watchers/Watchers.es.js";
|
|
268
268
|
import "../Menu/Menu.styled.es.js";
|
|
269
269
|
import "../Menu/MenuItem.es.js";
|
|
270
|
-
import { ReviewableCard as
|
|
270
|
+
import { ReviewableCard as C, Tag as b } from "./ReviewablesSelector.styled.es.js";
|
|
271
271
|
function hm({
|
|
272
|
-
fileId:
|
|
273
|
-
label:
|
|
274
|
-
selected:
|
|
275
|
-
projectName:
|
|
276
|
-
onKeyDown:
|
|
277
|
-
onMouseOver:
|
|
278
|
-
onChange:
|
|
279
|
-
tag:
|
|
280
|
-
contextMenuItems:
|
|
272
|
+
fileId: o,
|
|
273
|
+
label: p,
|
|
274
|
+
selected: e,
|
|
275
|
+
projectName: a,
|
|
276
|
+
onKeyDown: n,
|
|
277
|
+
onMouseOver: s,
|
|
278
|
+
onChange: u,
|
|
279
|
+
tag: i,
|
|
280
|
+
contextMenuItems: m,
|
|
281
281
|
selectionVariant: c = "primary"
|
|
282
282
|
}) {
|
|
283
283
|
const [l] = f();
|
|
284
284
|
return /* @__PURE__ */ t.jsxs(
|
|
285
|
-
|
|
285
|
+
C,
|
|
286
286
|
{
|
|
287
|
-
id: "preview-" +
|
|
288
|
-
onClick: () =>
|
|
289
|
-
className: x("reviewable-card", { selected:
|
|
290
|
-
onMouseOver: (
|
|
291
|
-
onKeyDown:
|
|
292
|
-
onContextMenu: (
|
|
293
|
-
|
|
287
|
+
id: "preview-" + o,
|
|
288
|
+
onClick: (r) => u?.(o, r.metaKey || r.ctrlKey),
|
|
289
|
+
className: x("reviewable-card", { selected: e }, c),
|
|
290
|
+
onMouseOver: (r) => s(r, { label: p }),
|
|
291
|
+
onKeyDown: n,
|
|
292
|
+
onContextMenu: (r) => {
|
|
293
|
+
m && (r.preventDefault(), l(r, m));
|
|
294
294
|
},
|
|
295
295
|
tabIndex: 0,
|
|
296
296
|
children: [
|
|
297
|
-
/* @__PURE__ */ t.jsx(j, { src: `/api/projects/${
|
|
298
|
-
|
|
297
|
+
/* @__PURE__ */ t.jsx(j, { src: `/api/projects/${a}/files/${o}/thumbnail` }),
|
|
298
|
+
i && /* @__PURE__ */ t.jsx(b, { children: i })
|
|
299
299
|
]
|
|
300
300
|
},
|
|
301
|
-
|
|
301
|
+
o
|
|
302
302
|
);
|
|
303
303
|
}
|
|
304
304
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Card.es.js","sources":["../../../../../src/components/ReviewablesSelector/Card.tsx"],"sourcesContent":["import clsx from 'clsx'\nimport { FileThumbnail } from '@shared/components'\nimport { ReviewableModel } from '@shared/api'\nimport { ContextMenuItemType, useCreateContextMenu } from '@shared/containers'\nimport * as Styled from './ReviewablesSelector.styled'\nimport { KeyboardEvent, MouseEvent } from 'react'\n\nexport type ReviewableCard = Pick<ReviewableModel, 'fileId' | 'label'> & {\n tag?: JSX.Element,\n contextMenuItems?: ContextMenuItemType[],\n selectionVariant?: 'primary' | 'tertiary',\n}\n\nexport type ReviewableCardProps = ReviewableCard & {\n projectName: string | null,\n selected: boolean,\n onChange?: (fileId: string) => void,\n onKeyDown: (event: KeyboardEvent<HTMLDivElement>) => void,\n onMouseOver: (event: MouseEvent<HTMLDivElement>, { label }: { label?: string }) => void,\n}\n\nexport default function Card({\n fileId,\n label,\n selected,\n projectName,\n onKeyDown,\n onMouseOver,\n onChange,\n tag,\n contextMenuItems,\n selectionVariant = 'primary',\n}: ReviewableCardProps) {\n const [contextMenuShow] = useCreateContextMenu()\n\n return (\n <Styled.ReviewableCard\n key={fileId}\n id={'preview-' + fileId}\n onClick={() => onChange
|
|
1
|
+
{"version":3,"file":"Card.es.js","sources":["../../../../../src/components/ReviewablesSelector/Card.tsx"],"sourcesContent":["import clsx from 'clsx'\nimport { FileThumbnail } from '@shared/components'\nimport { ReviewableModel } from '@shared/api'\nimport { ContextMenuItemType, useCreateContextMenu } from '@shared/containers'\nimport * as Styled from './ReviewablesSelector.styled'\nimport { KeyboardEvent, MouseEvent } from 'react'\n\nexport type ReviewableCard = Pick<ReviewableModel, 'fileId' | 'label'> & {\n tag?: JSX.Element,\n contextMenuItems?: ContextMenuItemType[],\n selectionVariant?: 'primary' | 'tertiary',\n}\n\nexport type ReviewableCardProps = ReviewableCard & {\n projectName: string | null,\n selected: boolean,\n onChange?: (fileId: string, modifier?: boolean) => void,\n onKeyDown: (event: KeyboardEvent<HTMLDivElement>) => void,\n onMouseOver: (event: MouseEvent<HTMLDivElement>, { label }: { label?: string }) => void,\n}\n\nexport default function Card({\n fileId,\n label,\n selected,\n projectName,\n onKeyDown,\n onMouseOver,\n onChange,\n tag,\n contextMenuItems,\n selectionVariant = 'primary',\n}: ReviewableCardProps) {\n const [contextMenuShow] = useCreateContextMenu()\n\n return (\n <Styled.ReviewableCard\n key={fileId}\n id={'preview-' + fileId}\n onClick={(event) => onChange?.(fileId, event.metaKey || event.ctrlKey)}\n className={clsx('reviewable-card', { selected }, selectionVariant)}\n onMouseOver={(e) => onMouseOver(e, { label })}\n onKeyDown={onKeyDown}\n onContextMenu={(event) => {\n if (!contextMenuItems) return\n\n event.preventDefault()\n contextMenuShow(event, contextMenuItems)\n }}\n tabIndex={0}\n >\n <FileThumbnail src={`/api/projects/${projectName}/files/${fileId}/thumbnail`} />\n {\n tag && <Styled.Tag>{tag}</Styled.Tag>\n }\n </Styled.ReviewableCard>\n )\n}\n"],"names":["Card","fileId","label","selected","projectName","onKeyDown","onMouseOver","onChange","tag","contextMenuItems","selectionVariant","contextMenuShow","useCreateContextMenu","jsxs","Styled.ReviewableCard","event","clsx","e","jsx","FileThumbnail","Styled.Tag"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBA,SAAwBA,GAAK;AAAA,EAC3B,QAAAC;AAAA,EACA,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,aAAAC;AAAA,EACA,WAAAC;AAAA,EACA,aAAAC;AAAA,EACA,UAAAC;AAAA,EACA,KAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,kBAAAC,IAAmB;AACrB,GAAwB;AACtB,QAAM,CAACC,CAAe,IAAIC,EAAA;AAE1B,SACEC,gBAAAA,EAAAA;AAAAA,IAACC;AAAAA,IAAA;AAAA,MAEC,IAAI,aAAab;AAAA,MACjB,SAAS,CAACc,MAAUR,IAAWN,GAAQc,EAAM,WAAWA,EAAM,OAAO;AAAA,MACrE,WAAWC,EAAK,mBAAmB,EAAE,UAAAb,EAAA,GAAYO,CAAgB;AAAA,MACjE,aAAa,CAACO,MAAMX,EAAYW,GAAG,EAAE,OAAAf,GAAO;AAAA,MAC5C,WAAAG;AAAA,MACA,eAAe,CAACU,MAAU;AACxB,QAAKN,MAELM,EAAM,eAAA,GACNJ,EAAgBI,GAAON,CAAgB;AAAA,MACzC;AAAA,MACA,UAAU;AAAA,MAEV,UAAA;AAAA,QAAAS,gBAAAA,MAACC,KAAc,KAAK,iBAAiBf,CAAW,UAAUH,CAAM,cAAc;AAAA,QAE5EO,KAAOU,gBAAAA,EAAAA,IAACE,GAAA,EAAY,UAAAZ,EAAA,CAAI;AAAA,MAAA;AAAA,IAAA;AAAA,IAhBrBP;AAAA,EAAA;AAoBX;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReviewablesSelector.cjs.js","sources":["../../../../../src/components/ReviewablesSelector/ReviewablesSelector.tsx"],"sourcesContent":["import { FC, useEffect, useRef, useState } from 'react'\nimport * as Styled from './ReviewablesSelector.styled'\nimport { isHTMLElement } from '@shared/util'\nimport ScrollBar from 'react-perfect-scrollbar'\nimport Card, { ReviewableCard, ReviewableCardProps } from './Card'\n\ninterface ReviewablesSelectorProps {\n reviewables: ReviewableCard[]\n selected: string[]\n projectName: string | null\n onChange?: (fileId: string) => void\n onUpload?: () => void\n}\n\nconst ReviewablesSelector: FC<ReviewablesSelectorProps> = ({\n reviewables = [],\n selected = [],\n projectName,\n onChange,\n onUpload,\n}) => {\n const scrollRef = useRef<ScrollBar>(null)\n const scrollContainerRef = useRef<HTMLElement | null>(null)\n const [labelTooltip, setLabelTooltip] = useState<null | string>(null)\n const [labelTooltipYPos, setLabelTooltipYPos] = useState<null | number>(null)\n\n const getScrollTop = (): number => {\n return scrollContainerRef.current?.scrollTop || 0\n }\n\n const scrollReviewableIntoView = (fileId: string) => {\n const container = scrollContainerRef.current\n const el = document.getElementById('preview-' + fileId)\n if (!container || !el) return\n\n const containerRect = container.getBoundingClientRect()\n const itemRect = el.getBoundingClientRect()\n\n if (itemRect.top < containerRect.top) {\n container.scrollTop -= containerRect.top - itemRect.top\n } else if (itemRect.bottom > containerRect.bottom) {\n container.scrollTop += itemRect.bottom - containerRect.bottom\n }\n\n // keep the custom scrollbar thumb in sync with manual scrollTop updates\n // @ts-ignore\n scrollRef.current?.updateScroll?.()\n }\n\n // add keyboard support\n // use up and down arrow keys to navigate through the reviewables\n // if at top and press up, go to bottom, if at bottom and press down, go to top\n useEffect(() => {\n if (reviewables.length === 1) return\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (['w', 's', 'ArrowUp', 'ArrowDown'].includes(e.key)) {\n // Check if e.target is an HTMLElement before accessing tagName or isContentEditable\n if (isHTMLElement(e.target)) {\n if (e.target.tagName === 'INPUT' || e.target.tagName === 'TEXTAREA') return\n if (e.target.isContentEditable) return\n }\n\n const currentIndex = reviewables.findIndex(({ fileId }) => selected.includes(fileId))\n const nextIndex = e.key === 'w' || e.key === 'ArrowUp' ? currentIndex - 1 : currentIndex + 1\n const nextReviewable =\n reviewables[nextIndex < 0 ? reviewables.length - 1 : nextIndex % reviewables.length]\n const nextFileId = nextReviewable.fileId\n\n onChange && onChange(nextFileId)\n requestAnimationFrame(() => scrollReviewableIntoView(nextFileId))\n // also set new label for the tooltip\n setLabelTooltip(nextReviewable.label ?? null)\n // set label tooltip position\n const el = document.getElementById('preview-' + nextFileId)\n\n if (el) {\n const top = el.offsetTop + el.offsetHeight / 2 - getScrollTop()\n setLabelTooltipYPos(top)\n }\n }\n }\n\n window.addEventListener('keydown', handleKeyDown)\n\n return () => {\n window.removeEventListener('keydown', handleKeyDown)\n }\n }, [selected, reviewables, onChange])\n\n // keep track of when NOT hovering over the reviewable cards\n useEffect(() => {\n const handleMouseMove = (event: MouseEvent) => {\n // check if the mouse is over a reviewable card\n const closest = (event.target as HTMLElement).closest('.reviewables')\n if (!closest) {\n setLabelTooltip(null)\n }\n }\n\n window.addEventListener('mousemove', handleMouseMove)\n\n return () => {\n window.removeEventListener('mousemove', handleMouseMove)\n }\n }, [])\n\n const handleMouseOver = (\n event: React.MouseEvent<HTMLDivElement>,\n { label }: Pick<ReviewableCardProps, 'label'>,\n ) => {\n // check event is coming from a reviewable card\n const closest = (event.target as HTMLElement).closest('.reviewable-card') as HTMLElement\n if (!closest) return\n setLabelTooltip(label ?? null)\n // set label tooltip position\n const top = closest.offsetTop + closest.offsetHeight / 2 - getScrollTop()\n setLabelTooltipYPos(top)\n }\n\n // select with enter or space key when focused on a reviewable card\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Enter' || event.key === ' ') {\n const closest = (event.target as HTMLElement).closest('.reviewable-card') as HTMLElement\n if (!closest) return\n const fileId = closest.id.replace('preview-', '')\n onChange && onChange(fileId)\n }\n }\n\n // if no reviewables, return null\n if (!reviewables.length) return <div />\n\n return (\n <Styled.ReviewablesSelector>\n <Styled.Scrollable\n className=\"reviewables\"\n ref={scrollRef}\n containerRef={(ref) => {\n scrollContainerRef.current = ref\n }}\n >\n {reviewables.map(({ fileId, label, tag, selectionVariant, contextMenuItems }) => (\n <Card\n projectName={projectName}\n fileId={fileId}\n label={label}\n selected={selected.includes(fileId)}\n selectionVariant={selectionVariant}\n tag={tag}\n contextMenuItems={contextMenuItems}\n onChange={onChange}\n onKeyDown={handleKeyDown}\n onMouseOver={handleMouseOver}\n />\n ))}\n {!!onUpload && (\n <Styled.AddButton\n icon=\"add\"\n onClick={onUpload}\n onMouseEnter={() => setLabelTooltip(null)}\n />\n )}\n </Styled.Scrollable>\n {labelTooltip && labelTooltipYPos && (\n <Styled.Label style={{ top: labelTooltipYPos }}>{labelTooltip}</Styled.Label>\n )}\n </Styled.ReviewablesSelector>\n )\n}\n\nexport default ReviewablesSelector\n"],"names":["ReviewablesSelector","reviewables","selected","projectName","onChange","onUpload","scrollRef","useRef","scrollContainerRef","labelTooltip","setLabelTooltip","useState","labelTooltipYPos","setLabelTooltipYPos","getScrollTop","scrollReviewableIntoView","fileId","container","el","containerRect","itemRect","useEffect","handleKeyDown","isHTMLElement","currentIndex","nextIndex","nextReviewable","nextFileId","top","handleMouseMove","event","handleMouseOver","label","closest","jsxs","Styled.ReviewablesSelector","Styled.Scrollable","ref","tag","selectionVariant","contextMenuItems","jsx","Card","Styled.AddButton","Styled.Label"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ReviewablesSelector.cjs.js","sources":["../../../../../src/components/ReviewablesSelector/ReviewablesSelector.tsx"],"sourcesContent":["import { FC, useEffect, useRef, useState } from 'react'\nimport * as Styled from './ReviewablesSelector.styled'\nimport { isHTMLElement } from '@shared/util'\nimport ScrollBar from 'react-perfect-scrollbar'\nimport Card, { ReviewableCard, ReviewableCardProps } from './Card'\n\ninterface ReviewablesSelectorProps {\n reviewables: ReviewableCard[]\n selected: string[]\n projectName: string | null\n onChange?: (fileId: string, modifier?: boolean) => void\n onUpload?: () => void\n}\n\nconst ReviewablesSelector: FC<ReviewablesSelectorProps> = ({\n reviewables = [],\n selected = [],\n projectName,\n onChange,\n onUpload,\n}) => {\n const scrollRef = useRef<ScrollBar>(null)\n const scrollContainerRef = useRef<HTMLElement | null>(null)\n const [labelTooltip, setLabelTooltip] = useState<null | string>(null)\n const [labelTooltipYPos, setLabelTooltipYPos] = useState<null | number>(null)\n\n const getScrollTop = (): number => {\n return scrollContainerRef.current?.scrollTop || 0\n }\n\n const scrollReviewableIntoView = (fileId: string) => {\n const container = scrollContainerRef.current\n const el = document.getElementById('preview-' + fileId)\n if (!container || !el) return\n\n const containerRect = container.getBoundingClientRect()\n const itemRect = el.getBoundingClientRect()\n\n if (itemRect.top < containerRect.top) {\n container.scrollTop -= containerRect.top - itemRect.top\n } else if (itemRect.bottom > containerRect.bottom) {\n container.scrollTop += itemRect.bottom - containerRect.bottom\n }\n\n // keep the custom scrollbar thumb in sync with manual scrollTop updates\n // @ts-ignore\n scrollRef.current?.updateScroll?.()\n }\n\n // add keyboard support\n // use up and down arrow keys to navigate through the reviewables\n // if at top and press up, go to bottom, if at bottom and press down, go to top\n useEffect(() => {\n if (reviewables.length === 1) return\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (['w', 's', 'ArrowUp', 'ArrowDown'].includes(e.key)) {\n // Check if e.target is an HTMLElement before accessing tagName or isContentEditable\n if (isHTMLElement(e.target)) {\n if (e.target.tagName === 'INPUT' || e.target.tagName === 'TEXTAREA') return\n if (e.target.isContentEditable) return\n }\n\n const currentIndex = reviewables.findIndex(({ fileId }) => selected.includes(fileId))\n const nextIndex = e.key === 'w' || e.key === 'ArrowUp' ? currentIndex - 1 : currentIndex + 1\n const nextReviewable =\n reviewables[nextIndex < 0 ? reviewables.length - 1 : nextIndex % reviewables.length]\n const nextFileId = nextReviewable.fileId\n\n onChange && onChange(nextFileId)\n requestAnimationFrame(() => scrollReviewableIntoView(nextFileId))\n // also set new label for the tooltip\n setLabelTooltip(nextReviewable.label ?? null)\n // set label tooltip position\n const el = document.getElementById('preview-' + nextFileId)\n\n if (el) {\n const top = el.offsetTop + el.offsetHeight / 2 - getScrollTop()\n setLabelTooltipYPos(top)\n }\n }\n }\n\n window.addEventListener('keydown', handleKeyDown)\n\n return () => {\n window.removeEventListener('keydown', handleKeyDown)\n }\n }, [selected, reviewables, onChange])\n\n // keep track of when NOT hovering over the reviewable cards\n useEffect(() => {\n const handleMouseMove = (event: MouseEvent) => {\n // check if the mouse is over a reviewable card\n const closest = (event.target as HTMLElement).closest('.reviewables')\n if (!closest) {\n setLabelTooltip(null)\n }\n }\n\n window.addEventListener('mousemove', handleMouseMove)\n\n return () => {\n window.removeEventListener('mousemove', handleMouseMove)\n }\n }, [])\n\n const handleMouseOver = (\n event: React.MouseEvent<HTMLDivElement>,\n { label }: Pick<ReviewableCardProps, 'label'>,\n ) => {\n // check event is coming from a reviewable card\n const closest = (event.target as HTMLElement).closest('.reviewable-card') as HTMLElement\n if (!closest) return\n setLabelTooltip(label ?? null)\n // set label tooltip position\n const top = closest.offsetTop + closest.offsetHeight / 2 - getScrollTop()\n setLabelTooltipYPos(top)\n }\n\n // select with enter or space key when focused on a reviewable card\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Enter' || event.key === ' ') {\n const closest = (event.target as HTMLElement).closest('.reviewable-card') as HTMLElement\n if (!closest) return\n const fileId = closest.id.replace('preview-', '')\n onChange && onChange(fileId)\n }\n }\n\n // if no reviewables, return null\n if (!reviewables.length) return <div />\n\n return (\n <Styled.ReviewablesSelector>\n <Styled.Scrollable\n className=\"reviewables\"\n ref={scrollRef}\n containerRef={(ref) => {\n scrollContainerRef.current = ref\n }}\n >\n {reviewables.map(({ fileId, label, tag, selectionVariant, contextMenuItems }) => (\n <Card\n projectName={projectName}\n fileId={fileId}\n label={label}\n selected={selected.includes(fileId)}\n selectionVariant={selectionVariant}\n tag={tag}\n contextMenuItems={contextMenuItems}\n onChange={onChange}\n onKeyDown={handleKeyDown}\n onMouseOver={handleMouseOver}\n />\n ))}\n {!!onUpload && (\n <Styled.AddButton\n icon=\"add\"\n onClick={onUpload}\n onMouseEnter={() => setLabelTooltip(null)}\n />\n )}\n </Styled.Scrollable>\n {labelTooltip && labelTooltipYPos && (\n <Styled.Label style={{ top: labelTooltipYPos }}>{labelTooltip}</Styled.Label>\n )}\n </Styled.ReviewablesSelector>\n )\n}\n\nexport default ReviewablesSelector\n"],"names":["ReviewablesSelector","reviewables","selected","projectName","onChange","onUpload","scrollRef","useRef","scrollContainerRef","labelTooltip","setLabelTooltip","useState","labelTooltipYPos","setLabelTooltipYPos","getScrollTop","scrollReviewableIntoView","fileId","container","el","containerRect","itemRect","useEffect","handleKeyDown","isHTMLElement","currentIndex","nextIndex","nextReviewable","nextFileId","top","handleMouseMove","event","handleMouseOver","label","closest","jsxs","Styled.ReviewablesSelector","Styled.Scrollable","ref","tag","selectionVariant","contextMenuItems","jsx","Card","Styled.AddButton","Styled.Label"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReviewablesSelector.es.js","sources":["../../../../../src/components/ReviewablesSelector/ReviewablesSelector.tsx"],"sourcesContent":["import { FC, useEffect, useRef, useState } from 'react'\nimport * as Styled from './ReviewablesSelector.styled'\nimport { isHTMLElement } from '@shared/util'\nimport ScrollBar from 'react-perfect-scrollbar'\nimport Card, { ReviewableCard, ReviewableCardProps } from './Card'\n\ninterface ReviewablesSelectorProps {\n reviewables: ReviewableCard[]\n selected: string[]\n projectName: string | null\n onChange?: (fileId: string) => void\n onUpload?: () => void\n}\n\nconst ReviewablesSelector: FC<ReviewablesSelectorProps> = ({\n reviewables = [],\n selected = [],\n projectName,\n onChange,\n onUpload,\n}) => {\n const scrollRef = useRef<ScrollBar>(null)\n const scrollContainerRef = useRef<HTMLElement | null>(null)\n const [labelTooltip, setLabelTooltip] = useState<null | string>(null)\n const [labelTooltipYPos, setLabelTooltipYPos] = useState<null | number>(null)\n\n const getScrollTop = (): number => {\n return scrollContainerRef.current?.scrollTop || 0\n }\n\n const scrollReviewableIntoView = (fileId: string) => {\n const container = scrollContainerRef.current\n const el = document.getElementById('preview-' + fileId)\n if (!container || !el) return\n\n const containerRect = container.getBoundingClientRect()\n const itemRect = el.getBoundingClientRect()\n\n if (itemRect.top < containerRect.top) {\n container.scrollTop -= containerRect.top - itemRect.top\n } else if (itemRect.bottom > containerRect.bottom) {\n container.scrollTop += itemRect.bottom - containerRect.bottom\n }\n\n // keep the custom scrollbar thumb in sync with manual scrollTop updates\n // @ts-ignore\n scrollRef.current?.updateScroll?.()\n }\n\n // add keyboard support\n // use up and down arrow keys to navigate through the reviewables\n // if at top and press up, go to bottom, if at bottom and press down, go to top\n useEffect(() => {\n if (reviewables.length === 1) return\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (['w', 's', 'ArrowUp', 'ArrowDown'].includes(e.key)) {\n // Check if e.target is an HTMLElement before accessing tagName or isContentEditable\n if (isHTMLElement(e.target)) {\n if (e.target.tagName === 'INPUT' || e.target.tagName === 'TEXTAREA') return\n if (e.target.isContentEditable) return\n }\n\n const currentIndex = reviewables.findIndex(({ fileId }) => selected.includes(fileId))\n const nextIndex = e.key === 'w' || e.key === 'ArrowUp' ? currentIndex - 1 : currentIndex + 1\n const nextReviewable =\n reviewables[nextIndex < 0 ? reviewables.length - 1 : nextIndex % reviewables.length]\n const nextFileId = nextReviewable.fileId\n\n onChange && onChange(nextFileId)\n requestAnimationFrame(() => scrollReviewableIntoView(nextFileId))\n // also set new label for the tooltip\n setLabelTooltip(nextReviewable.label ?? null)\n // set label tooltip position\n const el = document.getElementById('preview-' + nextFileId)\n\n if (el) {\n const top = el.offsetTop + el.offsetHeight / 2 - getScrollTop()\n setLabelTooltipYPos(top)\n }\n }\n }\n\n window.addEventListener('keydown', handleKeyDown)\n\n return () => {\n window.removeEventListener('keydown', handleKeyDown)\n }\n }, [selected, reviewables, onChange])\n\n // keep track of when NOT hovering over the reviewable cards\n useEffect(() => {\n const handleMouseMove = (event: MouseEvent) => {\n // check if the mouse is over a reviewable card\n const closest = (event.target as HTMLElement).closest('.reviewables')\n if (!closest) {\n setLabelTooltip(null)\n }\n }\n\n window.addEventListener('mousemove', handleMouseMove)\n\n return () => {\n window.removeEventListener('mousemove', handleMouseMove)\n }\n }, [])\n\n const handleMouseOver = (\n event: React.MouseEvent<HTMLDivElement>,\n { label }: Pick<ReviewableCardProps, 'label'>,\n ) => {\n // check event is coming from a reviewable card\n const closest = (event.target as HTMLElement).closest('.reviewable-card') as HTMLElement\n if (!closest) return\n setLabelTooltip(label ?? null)\n // set label tooltip position\n const top = closest.offsetTop + closest.offsetHeight / 2 - getScrollTop()\n setLabelTooltipYPos(top)\n }\n\n // select with enter or space key when focused on a reviewable card\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Enter' || event.key === ' ') {\n const closest = (event.target as HTMLElement).closest('.reviewable-card') as HTMLElement\n if (!closest) return\n const fileId = closest.id.replace('preview-', '')\n onChange && onChange(fileId)\n }\n }\n\n // if no reviewables, return null\n if (!reviewables.length) return <div />\n\n return (\n <Styled.ReviewablesSelector>\n <Styled.Scrollable\n className=\"reviewables\"\n ref={scrollRef}\n containerRef={(ref) => {\n scrollContainerRef.current = ref\n }}\n >\n {reviewables.map(({ fileId, label, tag, selectionVariant, contextMenuItems }) => (\n <Card\n projectName={projectName}\n fileId={fileId}\n label={label}\n selected={selected.includes(fileId)}\n selectionVariant={selectionVariant}\n tag={tag}\n contextMenuItems={contextMenuItems}\n onChange={onChange}\n onKeyDown={handleKeyDown}\n onMouseOver={handleMouseOver}\n />\n ))}\n {!!onUpload && (\n <Styled.AddButton\n icon=\"add\"\n onClick={onUpload}\n onMouseEnter={() => setLabelTooltip(null)}\n />\n )}\n </Styled.Scrollable>\n {labelTooltip && labelTooltipYPos && (\n <Styled.Label style={{ top: labelTooltipYPos }}>{labelTooltip}</Styled.Label>\n )}\n </Styled.ReviewablesSelector>\n )\n}\n\nexport default ReviewablesSelector\n"],"names":["ReviewablesSelector","reviewables","selected","projectName","onChange","onUpload","scrollRef","useRef","scrollContainerRef","labelTooltip","setLabelTooltip","useState","labelTooltipYPos","setLabelTooltipYPos","getScrollTop","scrollReviewableIntoView","fileId","container","el","containerRect","itemRect","useEffect","handleKeyDown","isHTMLElement","currentIndex","nextIndex","nextReviewable","nextFileId","top","handleMouseMove","event","handleMouseOver","label","closest","jsxs","Styled.ReviewablesSelector","Styled.Scrollable","ref","tag","selectionVariant","contextMenuItems","jsx","Card","Styled.AddButton","Styled.Label"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ReviewablesSelector.es.js","sources":["../../../../../src/components/ReviewablesSelector/ReviewablesSelector.tsx"],"sourcesContent":["import { FC, useEffect, useRef, useState } from 'react'\nimport * as Styled from './ReviewablesSelector.styled'\nimport { isHTMLElement } from '@shared/util'\nimport ScrollBar from 'react-perfect-scrollbar'\nimport Card, { ReviewableCard, ReviewableCardProps } from './Card'\n\ninterface ReviewablesSelectorProps {\n reviewables: ReviewableCard[]\n selected: string[]\n projectName: string | null\n onChange?: (fileId: string, modifier?: boolean) => void\n onUpload?: () => void\n}\n\nconst ReviewablesSelector: FC<ReviewablesSelectorProps> = ({\n reviewables = [],\n selected = [],\n projectName,\n onChange,\n onUpload,\n}) => {\n const scrollRef = useRef<ScrollBar>(null)\n const scrollContainerRef = useRef<HTMLElement | null>(null)\n const [labelTooltip, setLabelTooltip] = useState<null | string>(null)\n const [labelTooltipYPos, setLabelTooltipYPos] = useState<null | number>(null)\n\n const getScrollTop = (): number => {\n return scrollContainerRef.current?.scrollTop || 0\n }\n\n const scrollReviewableIntoView = (fileId: string) => {\n const container = scrollContainerRef.current\n const el = document.getElementById('preview-' + fileId)\n if (!container || !el) return\n\n const containerRect = container.getBoundingClientRect()\n const itemRect = el.getBoundingClientRect()\n\n if (itemRect.top < containerRect.top) {\n container.scrollTop -= containerRect.top - itemRect.top\n } else if (itemRect.bottom > containerRect.bottom) {\n container.scrollTop += itemRect.bottom - containerRect.bottom\n }\n\n // keep the custom scrollbar thumb in sync with manual scrollTop updates\n // @ts-ignore\n scrollRef.current?.updateScroll?.()\n }\n\n // add keyboard support\n // use up and down arrow keys to navigate through the reviewables\n // if at top and press up, go to bottom, if at bottom and press down, go to top\n useEffect(() => {\n if (reviewables.length === 1) return\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (['w', 's', 'ArrowUp', 'ArrowDown'].includes(e.key)) {\n // Check if e.target is an HTMLElement before accessing tagName or isContentEditable\n if (isHTMLElement(e.target)) {\n if (e.target.tagName === 'INPUT' || e.target.tagName === 'TEXTAREA') return\n if (e.target.isContentEditable) return\n }\n\n const currentIndex = reviewables.findIndex(({ fileId }) => selected.includes(fileId))\n const nextIndex = e.key === 'w' || e.key === 'ArrowUp' ? currentIndex - 1 : currentIndex + 1\n const nextReviewable =\n reviewables[nextIndex < 0 ? reviewables.length - 1 : nextIndex % reviewables.length]\n const nextFileId = nextReviewable.fileId\n\n onChange && onChange(nextFileId)\n requestAnimationFrame(() => scrollReviewableIntoView(nextFileId))\n // also set new label for the tooltip\n setLabelTooltip(nextReviewable.label ?? null)\n // set label tooltip position\n const el = document.getElementById('preview-' + nextFileId)\n\n if (el) {\n const top = el.offsetTop + el.offsetHeight / 2 - getScrollTop()\n setLabelTooltipYPos(top)\n }\n }\n }\n\n window.addEventListener('keydown', handleKeyDown)\n\n return () => {\n window.removeEventListener('keydown', handleKeyDown)\n }\n }, [selected, reviewables, onChange])\n\n // keep track of when NOT hovering over the reviewable cards\n useEffect(() => {\n const handleMouseMove = (event: MouseEvent) => {\n // check if the mouse is over a reviewable card\n const closest = (event.target as HTMLElement).closest('.reviewables')\n if (!closest) {\n setLabelTooltip(null)\n }\n }\n\n window.addEventListener('mousemove', handleMouseMove)\n\n return () => {\n window.removeEventListener('mousemove', handleMouseMove)\n }\n }, [])\n\n const handleMouseOver = (\n event: React.MouseEvent<HTMLDivElement>,\n { label }: Pick<ReviewableCardProps, 'label'>,\n ) => {\n // check event is coming from a reviewable card\n const closest = (event.target as HTMLElement).closest('.reviewable-card') as HTMLElement\n if (!closest) return\n setLabelTooltip(label ?? null)\n // set label tooltip position\n const top = closest.offsetTop + closest.offsetHeight / 2 - getScrollTop()\n setLabelTooltipYPos(top)\n }\n\n // select with enter or space key when focused on a reviewable card\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Enter' || event.key === ' ') {\n const closest = (event.target as HTMLElement).closest('.reviewable-card') as HTMLElement\n if (!closest) return\n const fileId = closest.id.replace('preview-', '')\n onChange && onChange(fileId)\n }\n }\n\n // if no reviewables, return null\n if (!reviewables.length) return <div />\n\n return (\n <Styled.ReviewablesSelector>\n <Styled.Scrollable\n className=\"reviewables\"\n ref={scrollRef}\n containerRef={(ref) => {\n scrollContainerRef.current = ref\n }}\n >\n {reviewables.map(({ fileId, label, tag, selectionVariant, contextMenuItems }) => (\n <Card\n projectName={projectName}\n fileId={fileId}\n label={label}\n selected={selected.includes(fileId)}\n selectionVariant={selectionVariant}\n tag={tag}\n contextMenuItems={contextMenuItems}\n onChange={onChange}\n onKeyDown={handleKeyDown}\n onMouseOver={handleMouseOver}\n />\n ))}\n {!!onUpload && (\n <Styled.AddButton\n icon=\"add\"\n onClick={onUpload}\n onMouseEnter={() => setLabelTooltip(null)}\n />\n )}\n </Styled.Scrollable>\n {labelTooltip && labelTooltipYPos && (\n <Styled.Label style={{ top: labelTooltipYPos }}>{labelTooltip}</Styled.Label>\n )}\n </Styled.ReviewablesSelector>\n )\n}\n\nexport default ReviewablesSelector\n"],"names":["ReviewablesSelector","reviewables","selected","projectName","onChange","onUpload","scrollRef","useRef","scrollContainerRef","labelTooltip","setLabelTooltip","useState","labelTooltipYPos","setLabelTooltipYPos","getScrollTop","scrollReviewableIntoView","fileId","container","el","containerRect","itemRect","useEffect","handleKeyDown","isHTMLElement","currentIndex","nextIndex","nextReviewable","nextFileId","top","handleMouseMove","event","handleMouseOver","label","closest","jsxs","Styled.ReviewablesSelector","Styled.Scrollable","ref","tag","selectionVariant","contextMenuItems","jsx","Card","Styled.AddButton","Styled.Label"],"mappings":"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"}
|
|
@@ -16,7 +16,7 @@ declare const injectedRtkApi: import('@reduxjs/toolkit/query').Api<import('@redu
|
|
|
16
16
|
deleteProjectFolder: import('@reduxjs/toolkit/query').MutationDefinition<DeleteProjectFolderApiArg, import('@reduxjs/toolkit/query').BaseQueryFn<string | import('@reduxjs/toolkit/query').FetchArgs, unknown, import('@reduxjs/toolkit/query').FetchBaseQueryError>, string, any, "restApi", unknown>;
|
|
17
17
|
updateProjectFolder: import('@reduxjs/toolkit/query').MutationDefinition<UpdateProjectFolderApiArg, import('@reduxjs/toolkit/query').BaseQueryFn<string | import('@reduxjs/toolkit/query').FetchArgs, unknown, import('@reduxjs/toolkit/query').FetchBaseQueryError>, string, any, "restApi", unknown>;
|
|
18
18
|
getProjectAnatomy: import('@reduxjs/toolkit/query').QueryDefinition<GetProjectAnatomyApiArg, import('@reduxjs/toolkit/query').BaseQueryFn<string | import('@reduxjs/toolkit/query').FetchArgs, unknown, import('@reduxjs/toolkit/query').FetchBaseQueryError>, string, Anatomy, "restApi", unknown>;
|
|
19
|
-
setProjectAnatomy: import('@reduxjs/toolkit/query').MutationDefinition<SetProjectAnatomyApiArg, import('@reduxjs/toolkit/query').BaseQueryFn<string | import('@reduxjs/toolkit/query').FetchArgs, unknown, import('@reduxjs/toolkit/query').FetchBaseQueryError>, string,
|
|
19
|
+
setProjectAnatomy: import('@reduxjs/toolkit/query').MutationDefinition<SetProjectAnatomyApiArg, import('@reduxjs/toolkit/query').BaseQueryFn<string | import('@reduxjs/toolkit/query').FetchArgs, unknown, import('@reduxjs/toolkit/query').FetchBaseQueryError>, string, any, "restApi", unknown>;
|
|
20
20
|
setProjectBundles: import('@reduxjs/toolkit/query').MutationDefinition<SetProjectBundlesApiArg, import('@reduxjs/toolkit/query').BaseQueryFn<string | import('@reduxjs/toolkit/query').FetchArgs, unknown, import('@reduxjs/toolkit/query').FetchBaseQueryError>, string, unknown, "restApi", unknown>;
|
|
21
21
|
getProjectBundleInfo: import('@reduxjs/toolkit/query').QueryDefinition<GetProjectBundleInfoApiArg, import('@reduxjs/toolkit/query').BaseQueryFn<string | import('@reduxjs/toolkit/query').FetchArgs, unknown, import('@reduxjs/toolkit/query').FetchBaseQueryError>, string, ProjectBundle, "restApi", unknown>;
|
|
22
22
|
setProjectBundle: import('@reduxjs/toolkit/query').MutationDefinition<SetProjectBundleApiArg, import('@reduxjs/toolkit/query').BaseQueryFn<string | import('@reduxjs/toolkit/query').FetchArgs, unknown, import('@reduxjs/toolkit/query').FetchBaseQueryError>, string, any, "restApi", unknown>;
|
|
@@ -32,12 +32,15 @@ declare const injectedRtkApi: import('@reduxjs/toolkit/query').Api<import('@redu
|
|
|
32
32
|
deleteProject: import('@reduxjs/toolkit/query').MutationDefinition<DeleteProjectApiArg, import('@reduxjs/toolkit/query').BaseQueryFn<string | import('@reduxjs/toolkit/query').FetchArgs, unknown, import('@reduxjs/toolkit/query').FetchBaseQueryError>, string, unknown, "restApi", unknown>;
|
|
33
33
|
updateProject: import('@reduxjs/toolkit/query').MutationDefinition<UpdateProjectApiArg, import('@reduxjs/toolkit/query').BaseQueryFn<string | import('@reduxjs/toolkit/query').FetchArgs, unknown, import('@reduxjs/toolkit/query').FetchBaseQueryError>, string, unknown, "restApi", unknown>;
|
|
34
34
|
getProjectStats: import('@reduxjs/toolkit/query').QueryDefinition<GetProjectStatsApiArg, import('@reduxjs/toolkit/query').BaseQueryFn<string | import('@reduxjs/toolkit/query').FetchArgs, unknown, import('@reduxjs/toolkit/query').FetchBaseQueryError>, string, any, "restApi", unknown>;
|
|
35
|
+
changeProjectName: import('@reduxjs/toolkit/query').MutationDefinition<ChangeProjectNameApiArg, import('@reduxjs/toolkit/query').BaseQueryFn<string | import('@reduxjs/toolkit/query').FetchArgs, unknown, import('@reduxjs/toolkit/query').FetchBaseQueryError>, string, unknown, "restApi", unknown>;
|
|
35
36
|
getProjectRootsOverrides: import('@reduxjs/toolkit/query').QueryDefinition<GetProjectRootsOverridesApiArg, import('@reduxjs/toolkit/query').BaseQueryFn<string | import('@reduxjs/toolkit/query').FetchArgs, unknown, import('@reduxjs/toolkit/query').FetchBaseQueryError>, string, GetProjectRootsOverridesApiResponse, "restApi", unknown>;
|
|
36
37
|
setProjectRootsOverrides: import('@reduxjs/toolkit/query').MutationDefinition<SetProjectRootsOverridesApiArg, import('@reduxjs/toolkit/query').BaseQueryFn<string | import('@reduxjs/toolkit/query').FetchArgs, unknown, import('@reduxjs/toolkit/query').FetchBaseQueryError>, string, any, "restApi", unknown>;
|
|
37
38
|
getProjectSiteRoots: import('@reduxjs/toolkit/query').QueryDefinition<GetProjectSiteRootsApiArg, import('@reduxjs/toolkit/query').BaseQueryFn<string | import('@reduxjs/toolkit/query').FetchArgs, unknown, import('@reduxjs/toolkit/query').FetchBaseQueryError>, string, GetProjectSiteRootsApiResponse, "restApi", unknown>;
|
|
38
39
|
getProjectTags: import('@reduxjs/toolkit/query').QueryDefinition<GetProjectTagsApiArg, import('@reduxjs/toolkit/query').BaseQueryFn<string | import('@reduxjs/toolkit/query').FetchArgs, unknown, import('@reduxjs/toolkit/query').FetchBaseQueryError>, string, ProjectTagsModel, "restApi", unknown>;
|
|
39
40
|
getProjectUsers: import('@reduxjs/toolkit/query').QueryDefinition<GetProjectUsersApiArg, import('@reduxjs/toolkit/query').BaseQueryFn<string | import('@reduxjs/toolkit/query').FetchArgs, unknown, import('@reduxjs/toolkit/query').FetchBaseQueryError>, string, GetProjectUsersApiResponse, "restApi", unknown>;
|
|
40
41
|
updateProjectUser: import('@reduxjs/toolkit/query').MutationDefinition<UpdateProjectUserApiArg, import('@reduxjs/toolkit/query').BaseQueryFn<string | import('@reduxjs/toolkit/query').FetchArgs, unknown, import('@reduxjs/toolkit/query').FetchBaseQueryError>, string, UpdateProjectUserApiResponse, "restApi", unknown>;
|
|
42
|
+
getProjectThumbnail: import('@reduxjs/toolkit/query').QueryDefinition<GetProjectThumbnailApiArg, import('@reduxjs/toolkit/query').BaseQueryFn<string | import('@reduxjs/toolkit/query').FetchArgs, unknown, import('@reduxjs/toolkit/query').FetchBaseQueryError>, string, any, "restApi", unknown>;
|
|
43
|
+
createProjectThumbnail: import('@reduxjs/toolkit/query').MutationDefinition<CreateProjectThumbnailApiArg, import('@reduxjs/toolkit/query').BaseQueryFn<string | import('@reduxjs/toolkit/query').FetchArgs, unknown, import('@reduxjs/toolkit/query').FetchBaseQueryError>, string, CreateThumbnailResponseModel, "restApi", unknown>;
|
|
41
44
|
getProjectEntityUris: import('@reduxjs/toolkit/query').MutationDefinition<GetProjectEntityUrisApiArg, import('@reduxjs/toolkit/query').BaseQueryFn<string | import('@reduxjs/toolkit/query').FetchArgs, unknown, import('@reduxjs/toolkit/query').FetchBaseQueryError>, string, GetUrisResponse, "restApi", unknown>;
|
|
42
45
|
}, "restApi", string, typeof import('@reduxjs/toolkit/query').coreModuleName | typeof import('@reduxjs/toolkit/dist/query/react').reactHooksModuleName>;
|
|
43
46
|
export { injectedRtkApi as api };
|
|
@@ -45,8 +48,6 @@ export type DeleteProjectActivityApiResponse = any;
|
|
|
45
48
|
export type DeleteProjectActivityApiArg = {
|
|
46
49
|
projectName: string;
|
|
47
50
|
activityId: string;
|
|
48
|
-
'x-sender'?: string;
|
|
49
|
-
'x-sender-type'?: string;
|
|
50
51
|
};
|
|
51
52
|
export type GetProjectFileApiResponse = any;
|
|
52
53
|
export type GetProjectFileApiArg = {
|
|
@@ -124,18 +125,14 @@ export type GetProjectAnatomyApiResponse = Anatomy;
|
|
|
124
125
|
export type GetProjectAnatomyApiArg = {
|
|
125
126
|
projectName: string;
|
|
126
127
|
};
|
|
127
|
-
export type SetProjectAnatomyApiResponse =
|
|
128
|
+
export type SetProjectAnatomyApiResponse = any;
|
|
128
129
|
export type SetProjectAnatomyApiArg = {
|
|
129
130
|
projectName: string;
|
|
130
|
-
'x-sender'?: string;
|
|
131
|
-
'x-sender-type'?: string;
|
|
132
131
|
anatomy: Anatomy;
|
|
133
132
|
};
|
|
134
133
|
export type SetProjectBundlesApiResponse = unknown;
|
|
135
134
|
export type SetProjectBundlesApiArg = {
|
|
136
135
|
projectName: string;
|
|
137
|
-
'x-sender'?: string;
|
|
138
|
-
'x-sender-type'?: string;
|
|
139
136
|
projectBundleModel: ProjectBundleModel;
|
|
140
137
|
};
|
|
141
138
|
export type GetProjectBundleInfoApiResponse = ProjectBundle;
|
|
@@ -147,16 +144,12 @@ export type SetProjectBundleApiResponse = any;
|
|
|
147
144
|
export type SetProjectBundleApiArg = {
|
|
148
145
|
projectName: string;
|
|
149
146
|
variant?: 'production' | 'staging';
|
|
150
|
-
'x-sender'?: string;
|
|
151
|
-
'x-sender-type'?: string;
|
|
152
147
|
projectBundle: ProjectBundle;
|
|
153
148
|
};
|
|
154
149
|
export type UnsetProjectBundleApiResponse = unknown;
|
|
155
150
|
export type UnsetProjectBundleApiArg = {
|
|
156
151
|
projectName: string;
|
|
157
152
|
variant?: 'production' | 'staging';
|
|
158
|
-
'x-sender'?: string;
|
|
159
|
-
'x-sender-type'?: string;
|
|
160
153
|
};
|
|
161
154
|
export type ListProjectsApiResponse =
|
|
162
155
|
/** status 200 Successful Response */ ListProjectsResponseModel;
|
|
@@ -169,6 +162,7 @@ export type ListProjectsApiArg = {
|
|
|
169
162
|
library?: boolean;
|
|
170
163
|
/** If not provided, return projects regardless the flag */
|
|
171
164
|
active?: boolean;
|
|
165
|
+
skeleton?: boolean;
|
|
172
166
|
/** Attribute to order the list by */
|
|
173
167
|
order?: 'name' | 'createdAt' | 'updatedAt';
|
|
174
168
|
desc?: boolean;
|
|
@@ -205,27 +199,26 @@ export type GetProjectApiArg = {
|
|
|
205
199
|
export type CreateProjectApiResponse = any;
|
|
206
200
|
export type CreateProjectApiArg = {
|
|
207
201
|
projectName: string;
|
|
208
|
-
'x-sender'?: string;
|
|
209
|
-
'x-sender-type'?: string;
|
|
210
202
|
projectPostModel: ProjectPostModel;
|
|
211
203
|
};
|
|
212
204
|
export type DeleteProjectApiResponse = unknown;
|
|
213
205
|
export type DeleteProjectApiArg = {
|
|
214
206
|
projectName: string;
|
|
215
|
-
'x-sender'?: string;
|
|
216
|
-
'x-sender-type'?: string;
|
|
217
207
|
};
|
|
218
208
|
export type UpdateProjectApiResponse = unknown;
|
|
219
209
|
export type UpdateProjectApiArg = {
|
|
220
210
|
projectName: string;
|
|
221
|
-
'x-sender'?: string;
|
|
222
|
-
'x-sender-type'?: string;
|
|
223
211
|
projectPatchModel: ProjectPatchModel;
|
|
224
212
|
};
|
|
225
213
|
export type GetProjectStatsApiResponse = any;
|
|
226
214
|
export type GetProjectStatsApiArg = {
|
|
227
215
|
projectName: string;
|
|
228
216
|
};
|
|
217
|
+
export type ChangeProjectNameApiResponse = unknown;
|
|
218
|
+
export type ChangeProjectNameApiArg = {
|
|
219
|
+
projectName: string;
|
|
220
|
+
renameProjectRequestModel: RenameProjectRequestModel;
|
|
221
|
+
};
|
|
229
222
|
export type GetProjectRootsOverridesApiResponse = {
|
|
230
223
|
[key: string]: {
|
|
231
224
|
[key: string]: string;
|
|
@@ -269,6 +262,18 @@ export type UpdateProjectUserApiArg = {
|
|
|
269
262
|
userName: string;
|
|
270
263
|
accessGroups: string[];
|
|
271
264
|
};
|
|
265
|
+
export type GetProjectThumbnailApiResponse = any;
|
|
266
|
+
export type GetProjectThumbnailApiArg = {
|
|
267
|
+
projectName: string;
|
|
268
|
+
placeholder?: 'empty' | 'none';
|
|
269
|
+
original?: boolean;
|
|
270
|
+
};
|
|
271
|
+
export type CreateProjectThumbnailApiResponse =
|
|
272
|
+
/** status 201 Successful Response */ CreateThumbnailResponseModel;
|
|
273
|
+
export type CreateProjectThumbnailApiArg = {
|
|
274
|
+
projectName: string;
|
|
275
|
+
'content-type'?: string;
|
|
276
|
+
};
|
|
272
277
|
export type GetProjectEntityUrisApiResponse = GetUrisResponse;
|
|
273
278
|
export type GetProjectEntityUrisApiArg = {
|
|
274
279
|
projectName: string;
|
|
@@ -579,8 +584,10 @@ export type ProjectBundle = {
|
|
|
579
584
|
export type ListProjectsItemModel = {
|
|
580
585
|
name: string;
|
|
581
586
|
code: string;
|
|
587
|
+
label?: string;
|
|
582
588
|
active?: boolean;
|
|
583
589
|
library?: boolean;
|
|
590
|
+
skeleton?: boolean;
|
|
584
591
|
pinned?: boolean;
|
|
585
592
|
projectFolder?: string;
|
|
586
593
|
createdAt: string;
|
|
@@ -594,16 +601,16 @@ export type ListProjectsResponseModel = {
|
|
|
594
601
|
projects?: ListProjectsItemModel[];
|
|
595
602
|
};
|
|
596
603
|
export type DeployProjectRequestModel = {
|
|
597
|
-
/** Project name */
|
|
598
604
|
name: string;
|
|
599
|
-
/** Project code */
|
|
600
605
|
code: string;
|
|
601
|
-
|
|
602
|
-
anatomy
|
|
603
|
-
|
|
606
|
+
anatomy?: Anatomy;
|
|
607
|
+
/** Anatomy preset to use instead of providing anatomy */
|
|
608
|
+
anatomyPreset?: string;
|
|
604
609
|
library?: boolean;
|
|
605
610
|
/** Assign default users to the project */
|
|
606
611
|
assignUsers?: boolean;
|
|
612
|
+
/** Create a project skeleton instead of a full project */
|
|
613
|
+
skeleton?: boolean;
|
|
607
614
|
};
|
|
608
615
|
export type GuestUserModel = {
|
|
609
616
|
email: string;
|
|
@@ -669,6 +676,7 @@ export type ProjectModel = {
|
|
|
669
676
|
/** Name is an unique id of the {entity_name} */
|
|
670
677
|
name: string;
|
|
671
678
|
code: string;
|
|
679
|
+
label?: string;
|
|
672
680
|
library?: boolean;
|
|
673
681
|
folderTypes?: FolderType[];
|
|
674
682
|
taskTypes?: TaskType[];
|
|
@@ -676,6 +684,7 @@ export type ProjectModel = {
|
|
|
676
684
|
statuses?: Status[];
|
|
677
685
|
tags?: Tag[];
|
|
678
686
|
config?: object;
|
|
687
|
+
skeleton?: boolean;
|
|
679
688
|
attrib?: ProjectAttribModel2;
|
|
680
689
|
data?: Record<string, any>;
|
|
681
690
|
/** Whether the project is active */
|
|
@@ -688,6 +697,7 @@ export type ProjectModel = {
|
|
|
688
697
|
};
|
|
689
698
|
export type ProjectPostModel = {
|
|
690
699
|
code: string;
|
|
700
|
+
label?: string;
|
|
691
701
|
library?: boolean;
|
|
692
702
|
folderTypes?: FolderType[];
|
|
693
703
|
taskTypes?: TaskType[];
|
|
@@ -702,6 +712,7 @@ export type ProjectPostModel = {
|
|
|
702
712
|
};
|
|
703
713
|
export type ProjectPatchModel = {
|
|
704
714
|
code?: string;
|
|
715
|
+
label?: string;
|
|
705
716
|
library?: boolean;
|
|
706
717
|
folderTypes?: FolderType[];
|
|
707
718
|
taskTypes?: TaskType[];
|
|
@@ -714,6 +725,10 @@ export type ProjectPatchModel = {
|
|
|
714
725
|
/** Whether the project is active */
|
|
715
726
|
active?: boolean;
|
|
716
727
|
};
|
|
728
|
+
export type RenameProjectRequestModel = {
|
|
729
|
+
/** New project name */
|
|
730
|
+
newName: string;
|
|
731
|
+
};
|
|
717
732
|
export type ProjectTagsModel = {
|
|
718
733
|
folders?: string[];
|
|
719
734
|
tasks?: string[];
|
|
@@ -722,6 +737,9 @@ export type ProjectTagsModel = {
|
|
|
722
737
|
representations?: string[];
|
|
723
738
|
workfiles?: string[];
|
|
724
739
|
};
|
|
740
|
+
export type CreateThumbnailResponseModel = {
|
|
741
|
+
id: string;
|
|
742
|
+
};
|
|
725
743
|
export type UriResponseItem = {
|
|
726
744
|
id: string;
|
|
727
745
|
uri: string;
|