@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.
Files changed (45) hide show
  1. package/dist/_virtual/index.cjs6.js +1 -1
  2. package/dist/_virtual/index.cjs8.js +1 -1
  3. package/dist/_virtual/index.es6.js +2 -2
  4. package/dist/_virtual/index.es8.js +2 -2
  5. package/dist/api.cjs.js +1 -1
  6. package/dist/api.es.js +178 -176
  7. package/dist/node_modules/parse-numeric-range/index.cjs.js +1 -1
  8. package/dist/node_modules/parse-numeric-range/index.es.js +1 -1
  9. package/dist/node_modules/remove-accents/index.cjs.js +1 -1
  10. package/dist/node_modules/remove-accents/index.es.js +1 -1
  11. package/dist/shared/node_modules/@module-federation/error-codes/dist/index.cjs.js +1 -1
  12. package/dist/shared/node_modules/@module-federation/error-codes/dist/index.es.js +1 -1
  13. package/dist/shared/node_modules/@module-federation/runtime-core/dist/index.cjs.js +1 -1
  14. package/dist/shared/node_modules/@module-federation/runtime-core/dist/index.es.js +1 -1
  15. package/dist/shared/node_modules/react-is/index.cjs.js +1 -1
  16. package/dist/shared/node_modules/react-is/index.es.js +1 -1
  17. package/dist/shared/src/api/base/client.cjs.js +1 -1
  18. package/dist/shared/src/api/base/client.cjs.js.map +1 -1
  19. package/dist/shared/src/api/base/client.es.js +4 -3
  20. package/dist/shared/src/api/base/client.es.js.map +1 -1
  21. package/dist/shared/src/api/generated/projects.cjs.js +1 -1
  22. package/dist/shared/src/api/generated/projects.cjs.js.map +1 -1
  23. package/dist/shared/src/api/generated/projects.es.js +32 -41
  24. package/dist/shared/src/api/generated/projects.es.js.map +1 -1
  25. package/dist/shared/src/api/queries/project/getProject.cjs.js +1 -1
  26. package/dist/shared/src/api/queries/project/getProject.cjs.js.map +1 -1
  27. package/dist/shared/src/api/queries/project/getProject.es.js +29 -15
  28. package/dist/shared/src/api/queries/project/getProject.es.js.map +1 -1
  29. package/dist/shared/src/api/queries/project/updateProject.cjs.js +1 -1
  30. package/dist/shared/src/api/queries/project/updateProject.cjs.js.map +1 -1
  31. package/dist/shared/src/api/queries/project/updateProject.es.js +19 -14
  32. package/dist/shared/src/api/queries/project/updateProject.es.js.map +1 -1
  33. package/dist/shared/src/components/ReviewablesSelector/Card.cjs.js +1 -1
  34. package/dist/shared/src/components/ReviewablesSelector/Card.cjs.js.map +1 -1
  35. package/dist/shared/src/components/ReviewablesSelector/Card.es.js +21 -21
  36. package/dist/shared/src/components/ReviewablesSelector/Card.es.js.map +1 -1
  37. package/dist/shared/src/components/ReviewablesSelector/ReviewablesSelector.cjs.js.map +1 -1
  38. package/dist/shared/src/components/ReviewablesSelector/ReviewablesSelector.es.js.map +1 -1
  39. package/dist/types/api/generated/projects.d.ts +41 -23
  40. package/dist/types/api/queries/project/getProject.d.ts +188 -1
  41. package/dist/types/api/queries/project/updateProject.d.ts +171 -11
  42. package/dist/types/components/ReviewablesSelector/Card.d.ts +1 -1
  43. package/dist/types/components/ReviewablesSelector/ReviewablesSelector.d.ts +1 -1
  44. package/dist/types/containers/Slicer/hooks/useProjectAnatomySlices.d.ts +2 -0
  45. 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 b, Tag as d } from "./ReviewablesSelector.styled.es.js";
270
+ import { ReviewableCard as C, Tag as b } from "./ReviewablesSelector.styled.es.js";
271
271
  function hm({
272
- fileId: r,
273
- label: e,
274
- selected: a,
275
- projectName: n,
276
- onKeyDown: s,
277
- onMouseOver: u,
278
- onChange: i,
279
- tag: m,
280
- contextMenuItems: p,
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
- b,
285
+ C,
286
286
  {
287
- id: "preview-" + r,
288
- onClick: () => i && i(r),
289
- className: x("reviewable-card", { selected: a }, c),
290
- onMouseOver: (o) => u(o, { label: e }),
291
- onKeyDown: s,
292
- onContextMenu: (o) => {
293
- p && (o.preventDefault(), l(o, p));
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/${n}/files/${r}/thumbnail` }),
298
- m && /* @__PURE__ */ t.jsx(d, { children: m })
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
- r
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 && onChange(fileId)}\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","clsx","e","event","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,MAAMM,KAAYA,EAASN,CAAM;AAAA,MAC1C,WAAWc,EAAK,mBAAmB,EAAE,UAAAZ,EAAA,GAAYO,CAAgB;AAAA,MACjE,aAAa,CAACM,MAAMV,EAAYU,GAAG,EAAE,OAAAd,GAAO;AAAA,MAC5C,WAAAG;AAAA,MACA,eAAe,CAACY,MAAU;AACxB,QAAKR,MAELQ,EAAM,eAAA,GACNN,EAAgBM,GAAOR,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
+ {"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, unknown, "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, 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 = unknown;
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
- /** Project anatomy */
602
- anatomy: Anatomy;
603
- /** Library project */
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;