@ynput/ayon-frontend-shared 0.7.5 → 0.8.0

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 (74) hide show
  1. package/dist/DetailsPanel.es.js +471 -469
  2. package/dist/Feed.es.js +1 -1
  3. package/dist/ListTable.es.js +20 -20
  4. package/dist/NewEntity.es.js +7 -7
  5. package/dist/ProjectTreeTable.es.js +2523 -2502
  6. package/dist/ProjectsTable.es.js +5 -5
  7. package/dist/Slicer.es.js +28 -25
  8. package/dist/Views.es.js +150 -151
  9. package/dist/api.es.js +166 -165
  10. package/dist/chunks/Actions.es.js +9 -10
  11. package/dist/chunks/ColumnDropIndicator.es.js +4 -4
  12. package/dist/chunks/ColumnHeaderMenuUI.es.js +4 -5
  13. package/dist/chunks/DeleteEntitiesConfirmDialog.es.js +2 -2
  14. package/dist/chunks/DetailsDialog.es.js +3 -3
  15. package/dist/chunks/EmptyPlaceholder.es.js +7 -7
  16. package/dist/chunks/EntityPath.es.js +38 -39
  17. package/dist/chunks/EntityPickerDialog.es.js +482 -462
  18. package/dist/chunks/EntityTooltip.es.js +18 -19
  19. package/dist/chunks/Feed.es.js +1382 -1355
  20. package/dist/chunks/FilmstripEntityCard.es.js +5201 -0
  21. package/dist/chunks/FilterErrorActions.es.js +3 -4
  22. package/dist/chunks/GroupSettingsFallback.es.js +4 -4
  23. package/dist/chunks/Menu.es.js +242 -240
  24. package/dist/chunks/MetaWidget.es.js +1948 -1875
  25. package/dist/chunks/ProjectFoldersContext.es.js +237 -0
  26. package/dist/chunks/RepresentationsList.es.js +1 -1
  27. package/dist/chunks/ReviewablesSelector.es.js +1260 -1190
  28. package/dist/chunks/SimpleTable.es.js +303 -297
  29. package/dist/chunks/Slicer.es.js +420 -413
  30. package/dist/chunks/TableExportContextInstance.es.js +622 -378
  31. package/dist/chunks/TableSettingsFallback.es.js +3 -4
  32. package/dist/chunks/ThumbnailSimple.es.js +114 -99
  33. package/dist/chunks/ThumbnailUploaderContext.es.js +48 -0
  34. package/dist/chunks/VideoPlayer.es.js +8 -9
  35. package/dist/chunks/Watchers.es.js +929 -872
  36. package/dist/chunks/{ColumnDropIndicator.styled.es.js → addonColumnTags.es.js} +60 -47
  37. package/dist/chunks/expandRelativeDates.es.js +1 -1
  38. package/dist/chunks/getThumbnailUrl.es.js +33 -21
  39. package/dist/chunks/getUris.es.js +1580 -1610
  40. package/dist/chunks/queryFilterToClientFilter.es.js +1 -1
  41. package/dist/chunks/realtimeUpdatesUtils.es.js +15 -15
  42. package/dist/chunks/searchTerms.es.js +773 -696
  43. package/dist/chunks/useAttributeEnums.es.js +22 -22
  44. package/dist/chunks/useDateRangeFilter.es.js +1 -1
  45. package/dist/chunks/useHierarchySelection.es.js +3 -4
  46. package/dist/chunks/useLoadModule.es.js +3 -4
  47. package/dist/components.es.js +1391 -1253
  48. package/dist/context.es.js +645 -668
  49. package/dist/hooks.es.js +193 -171
  50. package/dist/index.es.js +4 -4
  51. package/dist/types/Actions.d.ts +10 -8
  52. package/dist/types/DetailsPanel.d.ts +54 -76
  53. package/dist/types/EntityPickerDialog.d.ts +51 -2
  54. package/dist/types/Feed.d.ts +24 -24
  55. package/dist/types/ListTable.d.ts +33 -27
  56. package/dist/types/NewEntity.d.ts +26 -39
  57. package/dist/types/ProjectTreeTable.d.ts +318 -212
  58. package/dist/types/ProjectsTable.d.ts +6 -6
  59. package/dist/types/RepresentationsList.d.ts +4 -0
  60. package/dist/types/Slicer.d.ts +63 -246
  61. package/dist/types/Views.d.ts +71 -298
  62. package/dist/types/api.d.ts +3164 -2363
  63. package/dist/types/components.d.ts +537 -497
  64. package/dist/types/context.d.ts +293 -572
  65. package/dist/types/hooks.d.ts +76 -47
  66. package/dist/types/index.d.ts +6 -0
  67. package/dist/types/util.d.ts +141 -120
  68. package/dist/util.es.js +71 -68
  69. package/package.json +6 -6
  70. package/dist/chunks/EntityUpdatesContext.es.js +0 -61
  71. package/dist/chunks/PlayableIcon.es.js +0 -5020
  72. package/dist/chunks/ProjectContext.es.js +0 -158
  73. package/dist/chunks/useQueryArgumentChangeLoading.es.js +0 -11
  74. package/dist/chunks/viewUpdateHelper.es.js +0 -153
@@ -24,6 +24,7 @@ import { DropdownRef } from '@ynput/ayon-react-components';
24
24
  import { EditorConfig } from 'lexical';
25
25
  import { ElementFormatType } from 'lexical';
26
26
  import { ElementNode } from 'lexical';
27
+ import { EntityCardProps } from '@ynput/ayon-react-components';
27
28
  import { ExecutionProps } from 'styled-components';
28
29
  import { FastOmit } from 'styled-components';
29
30
  import { FC } from 'react';
@@ -198,7 +199,7 @@ export declare interface AddonButtonProps<S extends ButtonSlot> {
198
199
  context: Omit<SlotMap[S]['context'], 'navigate'>;
199
200
  /** the host's button; not called for a `component` item, which draws itself */
200
201
  renderButton: (props: AddonButtonRenderProps) => ReactNode;
201
- /** dev shell: open the dialog right away */
202
+ /** dev shell: open the dialog or popover right away */
202
203
  autoOpen?: boolean;
203
204
  /** dev shell: the context the item's code gets */
204
205
  onContext?: (context: object) => void;
@@ -206,7 +207,7 @@ export declare interface AddonButtonProps<S extends ButtonSlot> {
206
207
 
207
208
  export declare interface AddonButtonRenderProps {
208
209
  ref: (element: HTMLElement | null) => void;
209
- /** its dialog or menu is open */
210
+ /** its dialog, menu or popover is open */
210
211
  active: boolean;
211
212
  onClick: () => void;
212
213
  onMouseEnter: () => void;
@@ -224,6 +225,8 @@ export declare interface AddonDialogProps<S extends SlotName> {
224
225
  };
225
226
  }
226
227
 
228
+ export declare const AddonEntityPicker: ({ projectName, entityType, multiSelect, initialSelection, onSubmit, onClose, }: EntityPickerProps) => JSX_2.Element;
229
+
227
230
  /** The addon a contribution came from. */
228
231
  declare interface AddonInfo {
229
232
  /** addon name, as on the server */
@@ -255,6 +258,28 @@ declare type AddonMenuItem =
255
258
  danger?: boolean
256
259
  }
257
260
 
261
+ export declare const AddonMoreMenu: ({ items, icon, label, tooltip, variant, align, disabled, className, onError, "data-testid": testId, }: HostMoreMenuProps) => JSX_2.Element;
262
+
263
+ export declare const AddonServices: ({ projectName }: {
264
+ projectName: string | null;
265
+ }) => JSX_2.Element;
266
+
267
+ /** The signed-in user, as addons see it: in every slot's context (`user`) and from `useUser`. */
268
+ declare interface AddonUser {
269
+ name: string
270
+ fullName?: string
271
+ email?: string
272
+ /** admins, and service users (the server treats them as admins) */
273
+ isAdmin: boolean
274
+ /** managers and admins */
275
+ isManager: boolean
276
+ isGuest: boolean
277
+ /** a service user: an API key session (services, agents, CI) */
278
+ isService: boolean
279
+ /** developer mode is on */
280
+ isDeveloper: boolean
281
+ }
282
+
258
283
  declare type AlignType = 'left' | 'right';
259
284
 
260
285
  declare type Anatomy = {
@@ -265,7 +290,9 @@ declare type Anatomy = {
265
290
  /** Path templates configuration */
266
291
  templates?: Templates;
267
292
  /** Attributes configuration */
268
- attributes?: ProjectAttribModel;
293
+ attributes?: {
294
+ [key: string]: any;
295
+ };
269
296
  /** Folder types configuration */
270
297
  folder_types?: FolderType[];
271
298
  /** Task types configuration */
@@ -288,6 +315,18 @@ declare interface AnyContribution {
288
315
  [field: string]: unknown
289
316
  }
290
317
 
318
+ /** Context of a service. */
319
+ declare interface AppServiceContext {
320
+ /** the project whose page is open, else `null` */
321
+ projectName: string | null
322
+ }
323
+
324
+ /** Description of an `app.service` contribution. */
325
+ declare interface AppServiceMeta {
326
+ /** unique among the addon's services */
327
+ id: string
328
+ }
329
+
291
330
  export declare type AttributeData = {
292
331
  id: string;
293
332
  isExpanded: boolean;
@@ -303,36 +342,40 @@ declare type AttributeData_2 = {
303
342
  /** Type of attribute value */
304
343
  type?: 'string' | 'integer' | 'float' | 'boolean' | 'datetime' | 'list_of_strings' | 'list_of_integers' | 'list_of_any' | 'list_of_submodels' | 'dict';
305
344
  /** Nice, human readable title of the attribute */
306
- title?: string;
307
- description?: string;
345
+ title?: string | null;
346
+ description?: string | null;
308
347
  /** Example value of the field. */
309
348
  example?: any;
310
349
  /** Default value for the attribute. Do not set for list types. */
311
350
  default?: any;
312
- gt?: number | number;
313
- ge?: number | number;
314
- lt?: number | number;
315
- le?: number | number;
316
- minLength?: number;
317
- maxLength?: number;
351
+ gt?: number | number | null;
352
+ ge?: number | number | null;
353
+ lt?: number | number | null;
354
+ le?: number | number | null;
355
+ minLength?: number | null;
356
+ maxLength?: number | null;
318
357
  /** Minimum number of items in list type. */
319
- minItems?: number;
358
+ minItems?: number | null;
320
359
  /** Only for list types. Maximum number of items in the list. */
321
- maxItems?: number;
360
+ maxItems?: number | null;
322
361
  /** Only for string types. The value must match this regex. */
323
- regex?: string;
362
+ regex?: string | null;
324
363
  /** List of enum items used for displaying select widgets */
325
- enum?: EnumItem[];
364
+ enum?: EnumItem[] | null;
326
365
  /** Name of the function that provides enum values dynamically. */
327
- enumResolver?: string;
366
+ enumResolver?: string | null;
328
367
  /** Settings passed to the enum resolver function. */
329
- enumResolverSettings?: object;
368
+ enumResolverSettings?: {
369
+ [key: string]: any;
370
+ } | null;
330
371
  /** Inherit the attribute value from the parent entity. */
331
372
  inherit?: boolean;
332
373
  /** Specific widget style this field should use. */
333
- widget?: string;
374
+ widget?: string | null;
334
375
  /** Any additional config specific for the widget style.(Date formats, precision etc.) */
335
- widgetSettings?: object;
376
+ widgetSettings?: {
377
+ [key: string]: any;
378
+ } | null;
336
379
  };
337
380
 
338
381
  declare type AttributeDataValue = AttributeType | null | undefined;
@@ -436,8 +479,11 @@ declare const Button: IStyledComponentBase<"web", FastOmit<Omit< ButtonProps & R
436
479
  ref?: ((instance: HTMLButtonElement | null) => void | DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES]) | RefObject<HTMLButtonElement> | null | undefined;
437
480
  }, never>>> & string & Omit< ForwardRefExoticComponent< ButtonProps & RefAttributes<HTMLButtonElement>>, keyof Component<any, {}, any>>;
438
481
 
439
- /** What a button contribution does on click: exactly one is set (checked when the manifest loads). */
440
- export declare type ButtonAction = 'to' | 'run' | 'dialog' | 'menu' | 'component';
482
+ /**
483
+ * What a button contribution does on click: exactly one is set (checked when the manifest loads),
484
+ * except that a `component` may be a `popover`'s button (the action is then `popover`).
485
+ */
486
+ export declare type ButtonAction = 'to' | 'run' | 'dialog' | 'menu' | 'popover' | 'component';
441
487
 
442
488
  /** Description fields of a button the host draws (header and toolbar items). */
443
489
  declare interface ButtonMeta {
@@ -463,8 +509,20 @@ declare interface ButtonPieces<S extends SlotName> {
463
509
  dialog?: Loader<ComponentType<SlotProps<S> & DialogScope>>
464
510
  /** the items of a menu the host opens under the button, like the header's help menu */
465
511
  menu?: Loader<MenuPiece<S>>
466
- /** the addon's own component instead of the host's button: a dropdown, a toggle, anything */
467
- component?: Loader<ComponentType<SlotProps<S>>>
512
+ /**
513
+ * the content of a popover the host opens under the button, like the header's menus: the host
514
+ * positions it and closes it on a click outside or Escape (an Escape or click inside a menu or
515
+ * dialog opened from the popover closes only that). It gets `close`
516
+ */
517
+ popover?: Loader<ComponentType<SlotProps<S> & PopoverScope>>
518
+ /**
519
+ * the addon's own component instead of the host's button: a dropdown, a toggle, anything. With
520
+ * `popover`, it is the popover's button (its icon, a badge, a tooltip of its own) and gets
521
+ * `popoverOpen` and `togglePopover`
522
+ */
523
+ component?:
524
+ | Loader<ComponentType<SlotProps<S>>>
525
+ | Loader<ComponentType<SlotProps<S> & PopoverButtonScope>>
468
526
  }
469
527
 
470
528
  /** Context of a button's code (`run`, `dialog`, `menu`, `component`) besides the slot's own. */
@@ -526,13 +584,6 @@ declare interface ColumnHeaderMenuUIProps {
526
584
 
527
585
  declare type ColumnIdAliases = Record<string, string>;
528
586
 
529
- declare type ColumnItemModel = {
530
- name: string;
531
- visible?: boolean;
532
- pinned?: boolean;
533
- width?: number;
534
- };
535
-
536
587
  export declare const ColumnMenuButton: IStyledComponentBase<"web", FastOmit< FastOmit<Omit< ButtonProps & RefAttributes<HTMLButtonElement>, "ref"> & {
537
588
  ref?: ((instance: HTMLButtonElement | null) => void | DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES]) | RefObject<HTMLButtonElement> | null | undefined;
538
589
  }, "$isOpen"> & {
@@ -680,8 +731,8 @@ export declare const createFeedMentionSource: ({ suggestions, project, taskTypes
680
731
 
681
732
  declare type CreateViewApiArg = {
682
733
  viewType: string;
683
- projectName?: string;
684
- payload: OverviewViewPostModel | TaskProgressViewPostModel | ListsViewPostModel | ReviewsViewPostModel | VersionsViewPostModel | GenericViewPostModel;
734
+ projectName?: string | null;
735
+ genericViewPostModel: GenericViewPostModel;
685
736
  };
686
737
 
687
738
  export declare const CUSTOM_RANGE_ICON = "tune";
@@ -837,7 +888,7 @@ export declare type DeleteEntitiesConfirmDialogProps = {
837
888
  declare type DeleteViewApiArg = {
838
889
  viewType: string;
839
890
  viewId: string;
840
- projectName?: string;
891
+ projectName?: string | null;
841
892
  };
842
893
 
843
894
  declare type DeliveryTemplate = {
@@ -992,6 +1043,8 @@ declare type DetailsPanelEntityData = {
992
1043
  status: string;
993
1044
  updatedAt: string;
994
1045
  createdAt: string;
1046
+ createdBy?: string | null;
1047
+ updatedBy?: string | null;
995
1048
  thumbnailHash: string;
996
1049
  attrib: Record<string, string | number>;
997
1050
  hasReviewables?: boolean;
@@ -1024,11 +1077,7 @@ declare type DetailsPanelFolderFragmentFragment = {
1024
1077
  };
1025
1078
 
1026
1079
  /** Context of a details panel menu item. */
1027
- declare interface DetailsPanelMenuItemContext extends ProjectNameScope {
1028
- entityType: string
1029
- /** the entities the panel shows */
1030
- selectedEntities: EntityRef[]
1031
- }
1080
+ declare interface DetailsPanelMenuItemContext extends ProjectNameScope, EntityScope {}
1032
1081
 
1033
1082
  /** Description of a `detailsPanel.menuItem` contribution. */
1034
1083
  declare interface DetailsPanelMenuItemMeta extends MenuItemMeta {
@@ -1119,6 +1168,10 @@ declare interface DetailsSectionProps {
1119
1168
  form: Record<string, any>;
1120
1169
  mixedFields?: string[];
1121
1170
  isLoading: boolean;
1171
+ users?: {
1172
+ name: string;
1173
+ fullName?: string | null;
1174
+ }[];
1122
1175
  }
1123
1176
 
1124
1177
  /**
@@ -1242,17 +1295,21 @@ declare type EntityListItemModel = {
1242
1295
  /** Position of the item in the list */
1243
1296
  position: number;
1244
1297
  /** Label of the item */
1245
- label?: string;
1298
+ label?: string | null;
1246
1299
  /** Overrides of the listed entity attributes */
1247
- attrib?: object;
1300
+ attrib?: {
1301
+ [key: string]: any;
1302
+ };
1248
1303
  /** Additional data associated with the item */
1249
- data?: Record<string, any>;
1304
+ data?: {
1305
+ [key: string]: any;
1306
+ };
1250
1307
  /** Tags associated with the item */
1251
1308
  tags?: string[];
1252
1309
  /** Path to the folder where the item is located */
1253
1310
  folderPath: string;
1254
- createdBy?: string;
1255
- updatedBy?: string;
1311
+ createdBy?: string | null;
1312
+ updatedBy?: string | null;
1256
1313
  createdAt?: string;
1257
1314
  updatedAt?: string;
1258
1315
  };
@@ -1262,7 +1319,7 @@ declare type EntityListModel = {
1262
1319
  /** Type of the list */
1263
1320
  entityListType: string;
1264
1321
  /** ID of the folder containing the list */
1265
- entityListFolderId?: string;
1322
+ entityListFolderId?: string | null;
1266
1323
  /** Type of the entity that can be included in the list */
1267
1324
  entityType: 'folder' | 'product' | 'version' | 'representation' | 'task' | 'workfile';
1268
1325
  label: string;
@@ -1271,17 +1328,23 @@ declare type EntityListModel = {
1271
1328
  [key: string]: ListAccessLevel;
1272
1329
  };
1273
1330
  /** List attributes */
1274
- attrib?: object;
1331
+ attrib?: {
1332
+ [key: string]: any;
1333
+ };
1275
1334
  /** Additional data associated with the list */
1276
- data?: Record<string, any>;
1277
- template?: object;
1335
+ data?: {
1336
+ [key: string]: any;
1337
+ };
1338
+ template?: {
1339
+ [key: string]: any;
1340
+ };
1278
1341
  /** List tags */
1279
1342
  tags?: string[];
1280
1343
  items?: EntityListItemModel[];
1281
1344
  /** Name of the user who created the list */
1282
- owner?: string;
1283
- createdBy?: string;
1284
- updatedBy?: string;
1345
+ owner?: string | null;
1346
+ createdBy?: string | null;
1347
+ updatedBy?: string | null;
1285
1348
  createdAt?: string;
1286
1349
  updatedAt?: string;
1287
1350
  /** Whether the list is active or not */
@@ -1340,6 +1403,30 @@ export declare interface EntityPathProps {
1340
1403
  scope: string;
1341
1404
  }
1342
1405
 
1406
+ declare interface EntityPickerProps {
1407
+ /** the project to pick from */
1408
+ projectName: string
1409
+ /**
1410
+ * What to pick. The picker also shows the types above it to narrow the list down, e.g. folders
1411
+ * then tasks for `task`, folders, products then versions for `version`.
1412
+ */
1413
+ entityType: PickableEntityType
1414
+ /** let the user pick several; one by default */
1415
+ multiSelect?: boolean
1416
+ /**
1417
+ * Selected when the picker opens: entities of `entityType`, or of a type above it to narrow the
1418
+ * list (a folder opens the folder tree at it). `EntityRef`s from a slot context fit as they are.
1419
+ */
1420
+ initialSelection?: Pick<EntityRef, 'id' | 'entityType'>[]
1421
+ /**
1422
+ * The picked entities, of `entityType` in this project. `name` and `label` are set when the
1423
+ * picker has loaded them. The picker stays open until you stop rendering it: close it here.
1424
+ */
1425
+ onSubmit: (entities: EntityRef[]) => void
1426
+ /** the user closed the picker without picking (its close button or Escape) */
1427
+ onClose: () => void
1428
+ }
1429
+
1343
1430
  /** An entity a slot is about: its id and type, and its name when the host has it. */
1344
1431
  declare interface EntityRef {
1345
1432
  id: string
@@ -1352,7 +1439,9 @@ declare interface EntityRef {
1352
1439
 
1353
1440
  /** Slots about one or more entities of one type. */
1354
1441
  declare interface EntityScope {
1442
+ /** the type of every entity in `entities` */
1355
1443
  entityType: string
1444
+ /** the entities the slot is about, e.g. the ones the details panel shows */
1356
1445
  entities: EntityRef[]
1357
1446
  }
1358
1447
 
@@ -1436,19 +1525,21 @@ export declare interface EnumEditorPt {
1436
1525
  declare type EnumItem = {
1437
1526
  value: string | number | number | boolean;
1438
1527
  label: string;
1439
- description?: string;
1440
- fulltext?: string[];
1441
- group?: string;
1528
+ description?: string | null;
1529
+ fulltext?: string[] | null;
1530
+ group?: string | null;
1442
1531
  /** Icon name (material symbol) or IconModel object */
1443
- icon?: string | IconModel;
1444
- color?: string;
1445
- shortName?: string;
1532
+ icon?: string | IconModel | null;
1533
+ color?: string | null;
1534
+ shortName?: string | null;
1446
1535
  /** Enum item is visible, but not selectable */
1447
1536
  disabled?: boolean;
1448
1537
  /** Message to show when the option is disabled */
1449
- disabledMessage?: string;
1450
- /** Enum item is not offered for selection, but resolves when already used */
1538
+ disabledMessage?: string | null;
1539
+ /** Enum item is not visible in the dropdown */
1451
1540
  hidden?: boolean;
1541
+ /** Extra badge labels to display next to the item */
1542
+ badges?: string[] | null;
1452
1543
  };
1453
1544
 
1454
1545
  declare const EnumItemBody: IStyledComponentBase<"web", FastOmit<DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never> & Partial<Pick< DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never>>> & string;
@@ -1554,9 +1645,58 @@ export declare const FileThumbnail: FC<FileThumbnailProps>;
1554
1645
  export declare interface FileThumbnailProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onError' | 'onLoad'> {
1555
1646
  src: string;
1556
1647
  mimetype?: string;
1648
+ /** hover-scrub filmstrip url (see getFileFilmstripUrl) */
1649
+ filmstripSrc?: string | null;
1557
1650
  imgProps?: Omit<ImgHTMLAttributes<HTMLImageElement>, 'src' | 'onError' | 'onLoad'>;
1558
1651
  }
1559
1652
 
1653
+ /**
1654
+ * Hover-scrub preview of a video thumbnail.
1655
+ *
1656
+ * Render it as the last child of a positioned thumbnail element. While the cursor is over
1657
+ * that element, the overlay shows the filmstrip frame matching the cursor position,
1658
+ * so moving the cursor left to right "plays" the video.
1659
+ */
1660
+ export declare const Filmstrip: FC<FilmstripProps>;
1661
+
1662
+ export declare const FILMSTRIP_ACTIVE_ATTRIBUTE = "data-filmstrip-active";
1663
+
1664
+ export declare const FILMSTRIP_FILE_ATTRIBUTE = "data-filmstrip-file-id";
1665
+
1666
+ export declare const FILMSTRIP_POSITION_ATTRIBUTE = "data-filmstrip-position";
1667
+
1668
+ export declare interface FilmstripData {
1669
+ fileId: string;
1670
+ url: string;
1671
+ frames: number;
1672
+ columns: number;
1673
+ frameWidth: number;
1674
+ frameHeight: number;
1675
+ }
1676
+
1677
+ /** ARC EntityCard with a hover-scrub filmstrip */
1678
+ export declare const FilmstripEntityCard: ForwardRefExoticComponent<FilmstripEntityCardProps & RefAttributes<HTMLDivElement>>;
1679
+
1680
+ export declare interface FilmstripEntityCardProps extends EntityCardProps {
1681
+ /** hover-scrub filmstrip url (see getEntityFilmstripUrl) */
1682
+ filmstripUrl?: string | null;
1683
+ }
1684
+
1685
+ export declare interface FilmstripProps {
1686
+ /** Filmstrip URL (see getEntityFilmstripUrl). Nothing happens when empty. */
1687
+ src?: string | null;
1688
+ /** Should match object-fit of the static thumbnail underneath */
1689
+ fit?: 'cover' | 'contain';
1690
+ disabled?: boolean;
1691
+ className?: string;
1692
+ style?: CSSProperties;
1693
+ }
1694
+
1695
+ export declare interface FilmstripTarget {
1696
+ position: number;
1697
+ fileId: string;
1698
+ }
1699
+
1560
1700
  export declare const FILTER_TYPES_BY_SCOPE: Record<ScopeType_2, FilterFieldType[]>;
1561
1701
 
1562
1702
  declare type FilterConfig = {
@@ -1676,19 +1816,19 @@ declare interface FolderProduct {
1676
1816
 
1677
1817
  declare type FolderSuggestionItem = {
1678
1818
  /** The date and time when the suggested entity was created */
1679
- createdAt?: string;
1819
+ createdAt?: string | null;
1680
1820
  /** The relevance score of the suggestion */
1681
- relevance?: number;
1821
+ relevance?: number | null;
1682
1822
  id: string;
1683
1823
  folderType: string;
1684
1824
  name: string;
1685
- label?: string;
1686
- thumbnailId?: string;
1825
+ label?: string | null;
1826
+ thumbnailId?: string | null;
1687
1827
  };
1688
1828
 
1689
1829
  declare type FolderType = {
1690
1830
  name: string;
1691
- original_name?: string;
1831
+ original_name?: string | null;
1692
1832
  shortName?: string;
1693
1833
  color?: string;
1694
1834
  icon?: string;
@@ -1696,7 +1836,7 @@ declare type FolderType = {
1696
1836
 
1697
1837
  declare type FolderType_2 = {
1698
1838
  name: string;
1699
- original_name?: string;
1839
+ original_name?: string | null;
1700
1840
  shortName?: string;
1701
1841
  color?: string;
1702
1842
  icon?: string;
@@ -1710,29 +1850,40 @@ declare interface FormData_2 {
1710
1850
  export { FormData_2 as FormData }
1711
1851
 
1712
1852
  declare type FormFieldPatch = {
1713
- value?: string | number | number | boolean | string[] | number[] | number[] | null;
1853
+ value?: string | number | number | boolean | string[] | number[] | number[] | FormFileData | null;
1714
1854
  label?: string;
1715
1855
  placeholder?: any;
1716
1856
  options?: FormOptionItem[];
1717
- readOnly?: boolean;
1718
- disabled?: boolean;
1857
+ enum_resolver?: string;
1858
+ enum_resolver_params?: {
1859
+ [key: string]: any;
1860
+ };
1861
+ read_only?: boolean;
1719
1862
  hidden?: boolean;
1863
+ disabled?: boolean;
1720
1864
  highlight?: 'info' | 'warning' | 'error';
1721
1865
  };
1722
1866
 
1723
1867
  declare type FormFieldRule = {
1724
- when: QueryFilter;
1868
+ /** Filter source events */
1869
+ when: QueryFilter_2;
1725
1870
  set: FormFieldPatch;
1726
1871
  };
1727
1872
 
1728
- declare interface FormFileData {
1873
+ declare type FormFileData = {
1874
+ filename: string;
1875
+ payload: string;
1876
+ download?: boolean;
1877
+ };
1878
+
1879
+ declare interface FormFileData_2 {
1729
1880
  payload: string;
1730
1881
  filename: string;
1731
1882
  download?: boolean;
1732
1883
  }
1733
1884
 
1734
1885
  declare type FormOptionItem = {
1735
- value: string | number | boolean;
1886
+ value: string | number | number | boolean;
1736
1887
  label?: string;
1737
1888
  description?: string;
1738
1889
  group?: string;
@@ -1774,16 +1925,22 @@ declare type GenericViewModel = {
1774
1925
  working: boolean;
1775
1926
  position: number;
1776
1927
  accessLevel: number;
1777
- settings: object;
1778
- access: object;
1779
1928
  viewType: string;
1929
+ settings: {
1930
+ [key: string]: any;
1931
+ };
1932
+ access: {
1933
+ [key: string]: any;
1934
+ };
1780
1935
  };
1781
1936
 
1782
1937
  declare type GenericViewPatchModel = {
1783
- label?: string;
1784
- owner?: string;
1785
- settings?: object;
1786
- viewType: string;
1938
+ label?: string | null;
1939
+ owner?: string | null;
1940
+ viewType?: string | null;
1941
+ settings?: {
1942
+ [key: string]: any;
1943
+ } | null;
1787
1944
  };
1788
1945
 
1789
1946
  declare type GenericViewPostModel = {
@@ -1793,29 +1950,25 @@ declare type GenericViewPostModel = {
1793
1950
  label: string;
1794
1951
  /** Working view is a special type of the view that automatically stores the current view settings without explicitly saving them. Working views are always private and scoped to the project */
1795
1952
  working?: boolean;
1796
- settings: object;
1797
- viewType: string;
1953
+ viewType?: string | null;
1954
+ settings: {
1955
+ [key: string]: any;
1956
+ };
1798
1957
  };
1799
1958
 
1800
1959
  declare type GetBaseViewApiArg = {
1801
1960
  viewType: string;
1802
- projectName?: string;
1961
+ projectName?: string | null;
1803
1962
  };
1804
1963
 
1805
- declare type GetBaseViewApiResponse =
1806
- /** status 200 Successful Response */
1807
- OverviewViewModel | TaskProgressViewModel | ListsViewModel | ReviewsViewModel | VersionsViewModel | GenericViewModel;
1808
-
1809
1964
  export declare const getButtonAction: (contribution: AnyContribution) => ButtonAction | undefined;
1810
1965
 
1811
1966
  declare type GetDefaultViewApiArg = {
1812
1967
  viewType: string;
1813
- projectName?: string;
1968
+ projectName?: string | null;
1814
1969
  };
1815
1970
 
1816
- declare type GetDefaultViewApiResponse =
1817
- /** status 200 Successful Response */
1818
- OverviewViewModel | TaskProgressViewModel | ListsViewModel | ReviewsViewModel | VersionsViewModel | GenericViewModel;
1971
+ declare type GetDefaultViewApiResponse = GenericViewModel;
1819
1972
 
1820
1973
  declare type GetDetailsPanelTaskQuery = {
1821
1974
  project: {
@@ -1832,6 +1985,8 @@ declare type GetDetailsPanelTaskQuery = {
1832
1985
  assignees: Array<string>;
1833
1986
  updatedAt: unknown;
1834
1987
  createdAt: unknown;
1988
+ createdBy: string | null;
1989
+ updatedBy: string | null;
1835
1990
  thumbnailHash: string;
1836
1991
  folderId: string;
1837
1992
  thumbnailId: string | null;
@@ -1873,6 +2028,15 @@ declare type GetDetailsPanelTaskQuery = {
1873
2028
  };
1874
2029
  };
1875
2030
 
2031
+ /**
2032
+ * The filmstrip frame shown under the cursor, for opening the viewer at the same reviewable
2033
+ * and frame the user was looking at.
2034
+ * Returns undefined when the event did not come from a scrubbed thumbnail.
2035
+ */
2036
+ export declare const getFilmstripTarget: (event?: {
2037
+ target: EventTarget | null;
2038
+ }) => FilmstripTarget | undefined;
2039
+
1876
2040
  export declare const getGroupedReviewables: (reviewables: ReviewableResponse[], hasTranscoder?: boolean | undefined) => {
1877
2041
  playable: ReviewableResponse[];
1878
2042
  incompatible: ReviewableResponse[];
@@ -1918,22 +2082,14 @@ export declare const getUiTypeLabel: (type: AttributeData_2["type"] | undefined,
1918
2082
  declare type GetViewApiArg = {
1919
2083
  viewType: string;
1920
2084
  viewId: string;
1921
- projectName?: string;
2085
+ projectName?: string | null;
1922
2086
  };
1923
2087
 
1924
- declare type GetViewApiResponse =
1925
- /** status 200 Successful Response */
1926
- OverviewViewModel | TaskProgressViewModel | ListsViewModel | ReviewsViewModel | VersionsViewModel | GenericViewModel;
1927
-
1928
2088
  declare type GetWorkingViewApiArg = {
1929
2089
  viewType: string;
1930
- projectName?: string;
2090
+ projectName?: string | null;
1931
2091
  };
1932
2092
 
1933
- declare type GetWorkingViewApiResponse =
1934
- /** status 200 Successful Response */
1935
- OverviewViewModel | TaskProgressViewModel | ListsViewModel | ReviewsViewModel | VersionsViewModel | GenericViewModel;
1936
-
1937
2093
  declare interface GridConfig {
1938
2094
  columns: number;
1939
2095
  rows: number;
@@ -2018,26 +2174,32 @@ declare type HeroTemplate = {
2018
2174
  file: string;
2019
2175
  };
2020
2176
 
2177
+ /** What the host's `MoreMenu` gets: the addon's props and where to report a failing item. */
2178
+ declare interface HostMoreMenuProps extends MoreMenuProps {
2179
+ /** a failing `onClick`: shown as a toast naming the addon */
2180
+ onError: (error: unknown) => void
2181
+ }
2182
+
2021
2183
  declare type IconInputPt = Partial<React.ComponentProps<typeof Styled.IconSelect>>;
2022
2184
 
2023
2185
  declare type IconModel = {
2024
2186
  type?: 'material-symbols' | 'url';
2025
2187
  /** The name of the icon (for type material-symbols) */
2026
- name?: string;
2188
+ name?: string | null;
2027
2189
  /** The color of the icon (for type material-symbols) */
2028
- color?: string;
2190
+ color?: string | null;
2029
2191
  /** The URL of the icon (for type url) */
2030
- url?: string;
2192
+ url?: string | null;
2031
2193
  };
2032
2194
 
2033
2195
  declare type IconModel_2 = {
2034
2196
  type?: 'material-symbols' | 'url';
2035
2197
  /** The name of the icon (for type material-symbols) */
2036
- name?: string;
2198
+ name?: string | null;
2037
2199
  /** The color of the icon (for type material-symbols) */
2038
- color?: string;
2200
+ color?: string | null;
2039
2201
  /** The URL of the icon (for type url) */
2040
- url?: string;
2202
+ url?: string | null;
2041
2203
  };
2042
2204
 
2043
2205
  declare const IconSelect: IStyledComponentBase<"web", FastOmit<Omit< IconSelectProps & RefAttributes<DropdownRef>, "ref"> & {
@@ -2155,7 +2317,7 @@ declare type LinkType = {
2155
2317
  link_type: string;
2156
2318
  input_type: 'folder' | 'product' | 'version' | 'representation' | 'task' | 'workfile';
2157
2319
  output_type: 'folder' | 'product' | 'version' | 'representation' | 'task' | 'workfile';
2158
- color?: string;
2320
+ color?: string | null;
2159
2321
  style?: 'solid' | 'dashed';
2160
2322
  };
2161
2323
 
@@ -2169,7 +2331,9 @@ declare type LinkTypeModel_2 = {
2169
2331
  /** Output entity type */
2170
2332
  outputType: string;
2171
2333
  /** Additional link type data */
2172
- data?: object;
2334
+ data?: {
2335
+ [key: string]: any;
2336
+ };
2173
2337
  };
2174
2338
 
2175
2339
  declare type ListAccessLevel = 0 | 10 | 20 | 30;
@@ -2196,55 +2360,9 @@ declare interface ListMetaDataProps {
2196
2360
  isLoading?: boolean;
2197
2361
  }
2198
2362
 
2199
- declare type ListsSettings = {
2200
- rowHeight?: number;
2201
- sortBy?: string | string[];
2202
- sortDesc?: boolean;
2203
- filter?: QueryFilter_5;
2204
- columns?: ColumnItemModel[];
2205
- };
2206
-
2207
- declare type ListsViewModel = {
2208
- /** Unique identifier for the view within the given scope. */
2209
- id?: string;
2210
- /** Human-readable name of the view. */
2211
- label: string;
2212
- /** Determines whether the view is only available for the given project or for all projects (studio). */
2213
- scope: 'project' | 'studio';
2214
- /** Name of the user who created the view. Owners have full control over the view, */
2215
- owner: string;
2216
- /** Visibility of the view. Public views are visible to all users, private views are only visible to the owner. */
2217
- visibility: 'public' | 'private';
2218
- /** Working view is a special type of the view that automatically stores the current view settings without explicitly saving them. Working views are always private and scoped to the project */
2219
- working: boolean;
2220
- position: number;
2221
- accessLevel: number;
2222
- settings: ListsSettings;
2223
- access: object;
2224
- viewType?: 'lists';
2225
- };
2226
-
2227
- declare type ListsViewPatchModel = {
2228
- label?: string;
2229
- owner?: string;
2230
- settings?: ListsSettings;
2231
- viewType?: 'lists';
2232
- };
2233
-
2234
- declare type ListsViewPostModel = {
2235
- /** Unique identifier for the view within the given scope. */
2236
- id?: string;
2237
- /** Human-readable name of the view. */
2238
- label: string;
2239
- /** Working view is a special type of the view that automatically stores the current view settings without explicitly saving them. Working views are always private and scoped to the project */
2240
- working?: boolean;
2241
- settings: ListsSettings;
2242
- viewType?: 'lists';
2243
- };
2244
-
2245
2363
  declare type ListViewsApiArg = {
2246
2364
  viewType: string;
2247
- projectName?: string;
2365
+ projectName?: string | null;
2248
2366
  };
2249
2367
 
2250
2368
  /**
@@ -2253,6 +2371,9 @@ declare type ListViewsApiArg = {
2253
2371
  */
2254
2372
  declare type Loader<T> = () => Promise<{ default: T }>
2255
2373
 
2374
+ /** Loads a filmstrip, deduplicating concurrent and repeated requests until it expires */
2375
+ export declare const loadFilmstrip: (src: string) => Promise<FilmstripData | null>;
2376
+
2256
2377
  export declare const LoginPage: ({ onLogin, loading, isFirstTime }: LoginPageProps) => JSX_2.Element | null;
2257
2378
 
2258
2379
  export declare interface LoginPageProps {
@@ -2484,6 +2605,10 @@ declare interface MenuContainerProps {
2484
2605
  targetId?: string;
2485
2606
  align?: AlignType;
2486
2607
  theme?: ThemeType;
2608
+ /** open state kept by the caller instead of the app's one open menu (`menuOpen === id`) */
2609
+ isOpen?: boolean;
2610
+ /** with `isOpen`: called to close it (`onClose` stays the dialog's own event) */
2611
+ onDismiss?: () => void;
2487
2612
  children: ReactNode;
2488
2613
  [key: string]: any;
2489
2614
  }
@@ -2580,6 +2705,26 @@ declare interface MenuProps {
2580
2705
  footer?: string;
2581
2706
  }
2582
2707
 
2708
+ declare interface MoreMenuProps {
2709
+ /** the menu's entries: the same items a `menu` piece returns (dividers, submenus, `danger`, ...) */
2710
+ items: AddonMenuItem[]
2711
+ /** a Material Symbols icon name; `more_horiz` (AYON's "more" button) when not set */
2712
+ icon?: string
2713
+ /** shown next to the icon; an icon-only button when not set */
2714
+ label?: string
2715
+ /** shown on hover and read by screen readers; the label, or `More`, when not set */
2716
+ tooltip?: string
2717
+ /** the button's look, as AYON's `Button`: `text` (default), `surface`, `tonal`, `filled`, `nav` */
2718
+ variant?: 'text' | 'surface' | 'tonal' | 'filled' | 'nav' | 'tertiary' | 'danger'
2719
+ /** which edge of the button the menu lines up with: `right` (default) or `left` */
2720
+ align?: 'left' | 'right'
2721
+ disabled?: boolean
2722
+ /** on the button */
2723
+ className?: string
2724
+ /** on the button, for tests */
2725
+ 'data-testid'?: string
2726
+ }
2727
+
2583
2728
  export declare const NO_DATE = "no-date";
2584
2729
 
2585
2730
  export declare type NormalizedData = {
@@ -2621,66 +2766,16 @@ declare type OperationModel = {
2621
2766
  id?: string;
2622
2767
  type: 'create' | 'update' | 'delete';
2623
2768
  entityType: 'folder' | 'product' | 'version' | 'representation' | 'task' | 'workfile';
2624
- entityId?: string;
2625
- data?: Record<string, any>;
2769
+ entityId?: string | null;
2770
+ data?: {
2771
+ [key: string]: any;
2772
+ } | null;
2626
2773
  force?: boolean;
2627
- asUser?: string;
2628
- };
2629
-
2630
- declare type OverviewSettings = {
2631
- showHierarchy?: boolean;
2632
- rowHeight?: number;
2633
- groupBy?: string;
2634
- groupSortByDesc?: boolean;
2635
- showEmptyGroups?: boolean;
2636
- sortBy?: string | string[];
2637
- sortDesc?: boolean;
2638
- filter?: QueryFilter_5;
2639
- folderFilter?: QueryFilter_5;
2640
- sliceType?: string;
2641
- columns?: ColumnItemModel[];
2774
+ asUser?: string | null;
2642
2775
  };
2643
2776
 
2644
2777
  export declare type OverviewSettingsChange = (setting: 'columns' | 'group-by', value: any) => void;
2645
2778
 
2646
- declare type OverviewViewModel = {
2647
- /** Unique identifier for the view within the given scope. */
2648
- id?: string;
2649
- /** Human-readable name of the view. */
2650
- label: string;
2651
- /** Determines whether the view is only available for the given project or for all projects (studio). */
2652
- scope: 'project' | 'studio';
2653
- /** Name of the user who created the view. Owners have full control over the view, */
2654
- owner: string;
2655
- /** Visibility of the view. Public views are visible to all users, private views are only visible to the owner. */
2656
- visibility: 'public' | 'private';
2657
- /** Working view is a special type of the view that automatically stores the current view settings without explicitly saving them. Working views are always private and scoped to the project */
2658
- working: boolean;
2659
- position: number;
2660
- accessLevel: number;
2661
- settings: OverviewSettings;
2662
- access: object;
2663
- viewType?: 'overview';
2664
- };
2665
-
2666
- declare type OverviewViewPatchModel = {
2667
- label?: string;
2668
- owner?: string;
2669
- settings?: OverviewSettings;
2670
- viewType?: 'overview';
2671
- };
2672
-
2673
- declare type OverviewViewPostModel = {
2674
- /** Unique identifier for the view within the given scope. */
2675
- id?: string;
2676
- /** Human-readable name of the view. */
2677
- label: string;
2678
- /** Working view is a special type of the view that automatically stores the current view settings without explicitly saving them. Working views are always private and scoped to the project */
2679
- working?: boolean;
2680
- settings: OverviewSettings;
2681
- viewType?: 'overview';
2682
- };
2683
-
2684
2779
  /** Description of a page contribution (`project.page`, `studio.page`). */
2685
2780
  declare interface PageMeta {
2686
2781
  /**
@@ -2774,12 +2869,38 @@ export declare type PathSegment = {
2774
2869
  id: string;
2775
2870
  };
2776
2871
 
2872
+ /**
2873
+ * Returns a loaded filmstrip that is still valid: data, `null` (not available)
2874
+ * or `undefined` (not loaded, expired or evicted - call loadFilmstrip)
2875
+ */
2876
+ export declare const peekFilmstrip: (src: string) => FilmstripData | null | undefined;
2877
+
2878
+ /** What `EntityPicker` picks. */
2879
+ declare type PickableEntityType = 'folder' | 'task' | 'product' | 'version' | 'representation' | 'workfile'
2880
+
2777
2881
  export declare const Placeholder: IStyledComponentBase<"web", FastOmit<DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never> & Partial<Pick< DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never>>> & string;
2778
2882
 
2779
2883
  declare const Placeholder_2: IStyledComponentBase<"web", FastOmit<DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never> & Partial<Pick< DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never>>> & string;
2780
2884
 
2781
2885
  declare const PlaceholderWrapper: IStyledComponentBase<"web", FastOmit<DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never> & Partial<Pick< DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never>>> & string;
2782
2886
 
2887
+ /**
2888
+ * What a `component` gets besides the slot context when it draws the button of a `popover`. The
2889
+ * host anchors the popover on the component's box.
2890
+ */
2891
+ declare interface PopoverButtonScope {
2892
+ /** the popover is open: show the button as active (`aria-expanded`) */
2893
+ popoverOpen: boolean
2894
+ /** opens or closes the popover: the button's `onClick` */
2895
+ togglePopover: () => void
2896
+ }
2897
+
2898
+ /** What a `popover` piece gets besides the slot context. */
2899
+ declare interface PopoverScope {
2900
+ /** closes the popover */
2901
+ close: () => void
2902
+ }
2903
+
2783
2904
  export declare const PowerpackButton: ForwardRefExoticComponent<PowerpackButtonProps & RefAttributes<HTMLButtonElement>>;
2784
2905
 
2785
2906
  export declare interface PowerpackButtonProps extends Omit<ButtonProps, 'variant'> {
@@ -2829,13 +2950,13 @@ declare type ProductBaseTypes = {
2829
2950
 
2830
2951
  declare type ProductSuggestionItem = {
2831
2952
  /** The date and time when the suggested entity was created */
2832
- createdAt?: string;
2953
+ createdAt?: string | null;
2833
2954
  /** The relevance score of the suggestion */
2834
- relevance?: number;
2955
+ relevance?: number | null;
2835
2956
  id: string;
2836
2957
  name: string;
2837
2958
  productType: string;
2838
- parent?: FolderSuggestionItem;
2959
+ parent?: FolderSuggestionItem | null;
2839
2960
  };
2840
2961
 
2841
2962
  declare type ProductType = {
@@ -2847,55 +2968,9 @@ declare type ProductType = {
2847
2968
 
2848
2969
  declare type ProductTypeListItem = {
2849
2970
  name: string;
2850
- baseType?: string;
2851
- color?: string;
2852
- icon?: string;
2853
- };
2854
-
2855
- declare type ProjectAttribModel = {
2856
- priority?: 'urgent' | 'high' | 'normal' | 'low';
2857
- /** Frame rate */
2858
- fps?: number;
2859
- /** Horizontal resolution */
2860
- resolutionWidth?: number;
2861
- /** Vertical resolution */
2862
- resolutionHeight?: number;
2863
- pixelAspect?: number;
2864
- clipIn?: number;
2865
- clipOut?: number;
2866
- frameStart?: number;
2867
- frameEnd?: number;
2868
- handleStart?: number;
2869
- handleEnd?: number;
2870
- /** Date and time when the project or task or asset was started */
2871
- startDate?: string;
2872
- /** Deadline date and time */
2873
- endDate?: string;
2874
- /** Textual description of the entity */
2875
- description?: string;
2876
- };
2877
-
2878
- declare type ProjectAttribModel2 = {
2879
- priority?: 'urgent' | 'high' | 'normal' | 'low';
2880
- /** Frame rate */
2881
- fps?: number;
2882
- /** Horizontal resolution */
2883
- resolutionWidth?: number;
2884
- /** Vertical resolution */
2885
- resolutionHeight?: number;
2886
- pixelAspect?: number;
2887
- clipIn?: number;
2888
- clipOut?: number;
2889
- frameStart?: number;
2890
- frameEnd?: number;
2891
- handleStart?: number;
2892
- handleEnd?: number;
2893
- /** Date and time when the project or task or asset was started */
2894
- startDate?: string;
2895
- /** Deadline date and time */
2896
- endDate?: string;
2897
- /** Textual description of the entity */
2898
- description?: string;
2971
+ baseType?: string | null;
2972
+ color?: string | null;
2973
+ icon?: string | null;
2899
2974
  };
2900
2975
 
2901
2976
  declare interface ProjectContextValue extends ProjectModelWithProducts {
@@ -2967,22 +3042,30 @@ declare interface ProjectListMenuItemContext {
2967
3042
  }
2968
3043
 
2969
3044
  declare type ProjectModel = {
2970
- /** Name is an unique id of the {entity_name} */
3045
+ /** Unique name of the project */
2971
3046
  name: string;
2972
3047
  code: string;
2973
- label?: string;
3048
+ label?: string | null;
2974
3049
  library?: boolean;
2975
3050
  folderTypes?: FolderType_2[];
2976
3051
  taskTypes?: TaskType_2[];
2977
3052
  linkTypes?: LinkTypeModel_2[];
2978
3053
  statuses?: Status_2[];
2979
3054
  tags?: Tag_2[];
2980
- config?: object;
2981
- skeleton?: boolean;
2982
- attrib?: ProjectAttribModel2;
2983
- data?: object;
2984
- /** Whether the project is active */
3055
+ config?: {
3056
+ [key: string]: any;
3057
+ };
3058
+ skeleton?: boolean | null;
3059
+ /** Attribute values of the entity */
3060
+ attrib?: {
3061
+ [key: string]: any;
3062
+ };
3063
+ data?: {
3064
+ [key: string]: any;
3065
+ };
3066
+ /** Whether the entity is active */
2985
3067
  active?: boolean;
3068
+ /** List of attributes explicitly set on the entity itself (not inherited) */
2986
3069
  ownAttrib?: string[];
2987
3070
  /** Time of creation */
2988
3071
  createdAt?: string;
@@ -3007,6 +3090,15 @@ declare interface ProjectPageLayoutProps {
3007
3090
  children: ReactNode
3008
3091
  }
3009
3092
 
3093
+ /** Description of a `project.page` contribution: a page, and what the host adds around it. */
3094
+ declare interface ProjectPageMeta extends PageMeta {
3095
+ /**
3096
+ * Shows AYON's details panel next to the page, for the page to open with `openDetails`. The page
3097
+ * is in a splitter while the panel is there; it only shows when the page opens it.
3098
+ */
3099
+ detailsPanel?: boolean
3100
+ }
3101
+
3010
3102
  export declare const ProjectPageRemote: FC<ProjectPageRemoteProps>;
3011
3103
 
3012
3104
  export declare interface ProjectPageRemoteProps extends RemotePageWrapperProps {
@@ -3107,18 +3199,18 @@ declare type QueryCondition = {
3107
3199
  /** Path to the key separated by slashes */
3108
3200
  key: string;
3109
3201
  /** Value to compare against */
3110
- value?: string | number | number | boolean | string[] | number[] | number[];
3111
- /** Comparison operator */
3112
- operator?: 'eq' | 'like' | 'notlike' | 'lt' | 'gt' | 'lte' | 'gte' | 'ne' | 'isnull' | 'notnull' | 'in' | 'notin' | 'includes' | 'excludes' | 'includesall' | 'excludesall' | 'includesany' | 'excludesany';
3202
+ value?: string | number | number | boolean | string[] | number[] | number[] | null;
3203
+ /** Comparison operator. like and notlike perform case-insensitive substring matching. One surrounding pair of % is treated as a substring wrapper; %, _ and backslashes within it are literal. */
3204
+ operator?: 'eq' | 'like' | 'notlike' | 're' | 'lt' | 'gt' | 'lte' | 'gte' | 'ne' | 'isnull' | 'notnull' | 'in' | 'notin' | 'includes' | 'excludes' | 'includesall' | 'excludesall' | 'includesany' | 'excludesany';
3113
3205
  };
3114
3206
 
3115
- declare type QueryCondition_5 = {
3207
+ declare type QueryCondition_2 = {
3116
3208
  /** Path to the key separated by slashes */
3117
3209
  key: string;
3118
3210
  /** Value to compare against */
3119
- value?: string | number | number | boolean | string[] | number[] | number[];
3120
- /** Comparison operator */
3121
- operator?: 'eq' | 'like' | 'notlike' | 'lt' | 'gt' | 'lte' | 'gte' | 'ne' | 'isnull' | 'notnull' | 'in' | 'notin' | 'includes' | 'excludes' | 'includesall' | 'excludesall' | 'includesany' | 'excludesany';
3211
+ value?: string | number | number | boolean | string[] | number[] | number[] | null;
3212
+ /** Comparison operator. like and notlike perform case-insensitive substring matching. One surrounding pair of % is treated as a substring wrapper; %, _ and backslashes within it are literal. */
3213
+ operator?: 'eq' | 'like' | 'notlike' | 're' | 'lt' | 'gt' | 'lte' | 'gte' | 'ne' | 'isnull' | 'notnull' | 'in' | 'notin' | 'includes' | 'excludes' | 'includesall' | 'excludesall' | 'includesany' | 'excludesany';
3122
3214
  };
3123
3215
 
3124
3216
  declare type QueryFilter = {
@@ -3128,9 +3220,9 @@ declare type QueryFilter = {
3128
3220
  operator?: 'and' | 'or';
3129
3221
  };
3130
3222
 
3131
- declare type QueryFilter_5 = {
3223
+ declare type QueryFilter_2 = {
3132
3224
  /** List of conditions to be evaluated */
3133
- conditions?: (QueryCondition_5 | QueryFilter_5)[];
3225
+ conditions?: (QueryCondition_2 | QueryFilter_2)[];
3134
3226
  /** Operator to use when joining conditions */
3135
3227
  operator?: 'and' | 'or';
3136
3228
  };
@@ -3207,6 +3299,12 @@ export declare const renderYouTubeParagraph: (props: {
3207
3299
  node?: HastNode;
3208
3300
  }) => ReactNode | null;
3209
3301
 
3302
+ export declare const ReportCrash: ({ contribution, error, onReported, }: {
3303
+ contribution: AnyContribution;
3304
+ error: Error;
3305
+ onReported: () => void;
3306
+ }) => null;
3307
+
3210
3308
  export declare interface ReportsLoadingScreenProps extends HTMLAttributes<HTMLDivElement> {
3211
3309
  showSidebar?: boolean;
3212
3310
  sidebarConfig?: SidebarConfig;
@@ -3231,7 +3329,7 @@ declare type RequiredAddonVersionProps = BaseProps & ({
3231
3329
 
3232
3330
  declare type ReviewableAuthor = {
3233
3331
  name: string;
3234
- fullName?: string;
3332
+ fullName?: string | null;
3235
3333
  };
3236
3334
 
3237
3335
  export declare const ReviewableCard: ForwardRefExoticComponent<ReviewableCardProps & RefAttributes<HTMLDivElement>>;
@@ -3257,20 +3355,22 @@ declare type ReviewableModel = {
3257
3355
  fileId: string;
3258
3356
  activityId: string;
3259
3357
  filename: string;
3260
- label?: string;
3358
+ label?: string | null;
3261
3359
  mimetype: string;
3262
3360
  availability?: 'unknown' | 'conversionRequired' | 'conversionRecommended' | 'ready';
3263
- mediaInfo?: object;
3264
- createdFrom?: string;
3361
+ mediaInfo?: {
3362
+ [key: string]: any;
3363
+ } | null;
3364
+ createdFrom?: string | null;
3265
3365
  /** Information about the processing status */
3266
- processing?: ReviewableProcessingStatus;
3366
+ processing?: ReviewableProcessingStatus | null;
3267
3367
  createdAt?: string;
3268
3368
  updatedAt?: string;
3269
3369
  author: ReviewableAuthor;
3270
3370
  };
3271
3371
 
3272
3372
  declare type ReviewableProcessingStatus = {
3273
- eventId?: string;
3373
+ eventId?: string | null;
3274
3374
  status: string;
3275
3375
  description: string;
3276
3376
  };
@@ -3363,54 +3463,6 @@ export declare interface ReviewableUploadProps extends React.HTMLProps<HTMLDivEl
3363
3463
  };
3364
3464
  }
3365
3465
 
3366
- declare type ReviewsSettings = {
3367
- rowHeight?: number;
3368
- sortBy?: string | string[];
3369
- sortDesc?: boolean;
3370
- filter?: QueryFilter_5;
3371
- columns?: ColumnItemModel[];
3372
- gridHeight?: number;
3373
- displayStyle?: 'cards' | 'table' | 'playlist';
3374
- };
3375
-
3376
- declare type ReviewsViewModel = {
3377
- /** Unique identifier for the view within the given scope. */
3378
- id?: string;
3379
- /** Human-readable name of the view. */
3380
- label: string;
3381
- /** Determines whether the view is only available for the given project or for all projects (studio). */
3382
- scope: 'project' | 'studio';
3383
- /** Name of the user who created the view. Owners have full control over the view, */
3384
- owner: string;
3385
- /** Visibility of the view. Public views are visible to all users, private views are only visible to the owner. */
3386
- visibility: 'public' | 'private';
3387
- /** Working view is a special type of the view that automatically stores the current view settings without explicitly saving them. Working views are always private and scoped to the project */
3388
- working: boolean;
3389
- position: number;
3390
- accessLevel: number;
3391
- settings: ReviewsSettings;
3392
- access: object;
3393
- viewType?: 'reviews';
3394
- };
3395
-
3396
- declare type ReviewsViewPatchModel = {
3397
- label?: string;
3398
- owner?: string;
3399
- settings?: ReviewsSettings;
3400
- viewType?: 'reviews';
3401
- };
3402
-
3403
- declare type ReviewsViewPostModel = {
3404
- /** Unique identifier for the view within the given scope. */
3405
- id?: string;
3406
- /** Human-readable name of the view. */
3407
- label: string;
3408
- /** Working view is a special type of the view that automatically stores the current view settings without explicitly saving them. Working views are always private and scoped to the project */
3409
- working?: boolean;
3410
- settings: ReviewsSettings;
3411
- viewType?: 'reviews';
3412
- };
3413
-
3414
3466
  declare type Root = {
3415
3467
  name: string;
3416
3468
  windows?: string;
@@ -3511,7 +3563,7 @@ declare type SerializedYouTubeNode = Spread<{
3511
3563
 
3512
3564
  declare type SetDefaultViewApiArg = {
3513
3565
  viewType: string;
3514
- projectName?: string;
3566
+ projectName?: string | null;
3515
3567
  setDefaultViewRequestModel: SetDefaultViewRequestModel;
3516
3568
  };
3517
3569
 
@@ -3579,7 +3631,7 @@ declare type ShareOption = {
3579
3631
  value: string;
3580
3632
  name: string;
3581
3633
  label: string;
3582
- attribute?: string;
3634
+ attribute?: string | null;
3583
3635
  };
3584
3636
 
3585
3637
  export declare const ShareOptionIcon: FC<ShareOptionIconProps>;
@@ -3594,6 +3646,12 @@ export declare interface ShareOptionIconProps {
3594
3646
  withTooltip?: boolean;
3595
3647
  }
3596
3648
 
3649
+ /**
3650
+ * The entities of a shortcut's rows: every row of the project tables is one (list items resolve
3651
+ * to theirs). The panels' rows are not all entities (the lists panel's are lists), so none there.
3652
+ */
3653
+ export declare const shortcutEntities: (table: ShortcutTable, projectName: string | null, rows: TableRowRef[]) => EntityRef[];
3654
+
3597
3655
  declare type ShortcutKeyEvent = Pick<KeyboardEvent, 'key' | 'code' | 'ctrlKey' | 'metaKey' | 'altKey' | 'shiftKey' | 'repeat'> & {
3598
3656
  preventDefault: () => void;
3599
3657
  stopPropagation: () => void;
@@ -3649,7 +3707,7 @@ declare type SimpleFormField = {
3649
3707
  name: string;
3650
3708
  label?: string;
3651
3709
  placeholder?: any;
3652
- value?: string | number | number | boolean | string[] | number[] | number[];
3710
+ value?: string | number | number | boolean | string[] | number[] | number[] | FormFileData;
3653
3711
  regex?: string;
3654
3712
  multiline?: boolean;
3655
3713
  syntax?: string;
@@ -3658,7 +3716,7 @@ declare type SimpleFormField = {
3658
3716
  min?: number | number;
3659
3717
  max?: number | number;
3660
3718
  valid_extensions?: string[];
3661
- readOnly?: boolean;
3719
+ read_only?: boolean;
3662
3720
  disabled?: boolean;
3663
3721
  hidden?: boolean;
3664
3722
  enum_resolver?: string;
@@ -3679,7 +3737,7 @@ export declare interface SimpleFormProps {
3679
3737
  style?: default_2.CSSProperties;
3680
3738
  }
3681
3739
 
3682
- export declare type SimpleFormValue = string | number | boolean | string[] | number[] | FormFileData | null | undefined;
3740
+ export declare type SimpleFormValue = string | number | boolean | string[] | number[] | FormFileData_2 | null | undefined;
3683
3741
 
3684
3742
  export declare type SimpleFormValueDict = Record<string, SimpleFormValue>;
3685
3743
 
@@ -3696,6 +3754,8 @@ declare interface SlicerMenuItemContext extends ProjectNameScope {
3696
3754
  sliceType: string
3697
3755
  /** the rows it acts on: the selected ones, or the right-clicked one */
3698
3756
  selected: SlicerRowRef[]
3757
+ /** `hierarchy`: the folders and tasks of `selected`; empty for the other slice types */
3758
+ entities: EntityRef[]
3699
3759
  menu: MenuKind
3700
3760
  }
3701
3761
 
@@ -3738,9 +3798,12 @@ declare type SlideOut = {
3738
3798
  projectName: string;
3739
3799
  };
3740
3800
 
3741
- /** What the code of a contribution to slot `S` gets: `{ slot: S, ...context }`. */
3801
+ /**
3802
+ * What the code of a contribution to slot `S` gets: `{ slot: S, user, ...context }`. The host
3803
+ * passes the slot's own context; `ContributionView` and `runContribution` add `slot` and `user`.
3804
+ */
3742
3805
  declare type SlotContext<S extends SlotName> = S extends SlotName
3743
- ? { slot: S } & SlotMap[S]['context']
3806
+ ? { slot: S } & UserScope & SlotMap[S]['context']
3744
3807
  : never
3745
3808
 
3746
3809
  /**
@@ -3755,7 +3818,7 @@ declare interface SlotMap {
3755
3818
  */
3756
3819
  'project.page': {
3757
3820
  version: 1
3758
- meta: PageMeta
3821
+ meta: ProjectPageMeta
3759
3822
  context: ProjectScope & SlicerScope & ProjectFoldersScope & ViewsScope
3760
3823
  pieces: { component: Loader<ComponentType<SlotProps<'project.page'>>> }
3761
3824
  }
@@ -3771,8 +3834,9 @@ declare interface SlotMap {
3771
3834
  }
3772
3835
  /**
3773
3836
  * A button in the main header, drawn by the host like its own buttons. What a click does is the
3774
- * addon's: navigate (`to`), run code (`run`), open a dialog (`dialog`) or a menu (`menu`); or the
3775
- * addon draws the item itself (`component`, loaded with the header). Set exactly one.
3837
+ * addon's: navigate (`to`), run code (`run`), open a dialog (`dialog`), a menu (`menu`) or a
3838
+ * popover (`popover`); or the addon draws the item itself (`component`, loaded with the header).
3839
+ * Set exactly one, except that `component` may draw the button of a `popover`.
3776
3840
  */
3777
3841
  'header.item': {
3778
3842
  version: 1
@@ -3833,8 +3897,9 @@ declare interface SlotMap {
3833
3897
  /**
3834
3898
  * A button in the project tables' toolbar, before Customize (Overview, Products, Lists), drawn
3835
3899
  * by the host like the toolbar's own. What a click does is the addon's: navigate (`to`), run code
3836
- * (`run`), open a dialog (`dialog`) or a menu (`menu`); or the addon draws the item itself
3837
- * (`component`, loaded with the toolbar). Set exactly one.
3900
+ * (`run`), open a dialog (`dialog`), a menu (`menu`) or a popover (`popover`); or the addon draws
3901
+ * the item itself (`component`, loaded with the toolbar). Set exactly one, except that
3902
+ * `component` may draw the button of a `popover`.
3838
3903
  */
3839
3904
  'projectTable.toolbarItem': {
3840
3905
  version: 1
@@ -3857,7 +3922,9 @@ declare interface SlotMap {
3857
3922
  * settings from the description; `cell` and `fetchValues` load with the table. The host draws
3858
3923
  * the cell box (padding, selection, focus), so `cell` renders only its content; selecting, the
3859
3924
  * right-click menu and Copy (the cell's `value` as text) work as in other columns. Not sortable,
3860
- * and pasting into it changes nothing.
3925
+ * and pasting into it changes nothing. When the values depend on data your mutations change, list
3926
+ * its cache tags in `providesTags` and the column refreshes itself when they are invalidated:
3927
+ * `tableColumn({ id, label, cell, fetchValues, providesTags: [{ type: 'myaddonLog', id: 'LIST' }] })`.
3861
3928
  */
3862
3929
  tableColumn: {
3863
3930
  version: 1
@@ -3881,6 +3948,19 @@ declare interface SlotMap {
3881
3948
  context: TableShortcutContext
3882
3949
  pieces: TableShortcutPieces
3883
3950
  }
3951
+ /**
3952
+ * Code with no UI that runs while AYON is open, whatever the page: keeping a state, listening to
3953
+ * websocket events, registering a store listener. `component` loads at startup and is mounted
3954
+ * once for the whole app, under AYON's providers (store, router, contexts), so it can use hooks;
3955
+ * it renders nothing (`return null`). Clean up in its effects. A crash unmounts it and shows a
3956
+ * toast; the rest of AYON keeps working.
3957
+ */
3958
+ 'app.service': {
3959
+ version: 1
3960
+ meta: AppServiceMeta
3961
+ context: AppServiceContext
3962
+ pieces: { component: Loader<ComponentType<SlotProps<'app.service'>>> }
3963
+ }
3884
3964
  }
3885
3965
 
3886
3966
  /** The name of a slot, e.g. `'project.page'`. */
@@ -3945,7 +4025,7 @@ export declare const splitFiltersByScope: (combinedFilter: Record<string, any> |
3945
4025
 
3946
4026
  export declare const SplitterStyles: NamedExoticComponent< ExecutionProps & object>;
3947
4027
 
3948
- export declare const StackedThumbnails: ({ thumbnails, isLoading, className, style, ...props }: StackedThumbnailsProps) => JSX_2.Element | null;
4028
+ export declare const StackedThumbnails: ({ thumbnails, isLoading, className, style, filmstrip, ...props }: StackedThumbnailsProps) => JSX_2.Element | null;
3949
4029
 
3950
4030
  export declare interface StackedThumbnailsProps extends Omit<ThumbnailProps, 'entityType' | 'entityId' | 'projectName' | 'thumbnailHash'> {
3951
4031
  thumbnails?: Thumbnail[];
@@ -3961,24 +4041,24 @@ declare type StagingDirectory = {
3961
4041
 
3962
4042
  declare type Status = {
3963
4043
  name: string;
3964
- original_name?: string;
4044
+ original_name?: string | null;
3965
4045
  shortName?: string;
3966
4046
  state?: 'not_started' | 'in_progress' | 'done' | 'blocked';
3967
4047
  icon?: string;
3968
4048
  color?: string;
3969
4049
  /** Limit the status to specific entity types. */
3970
- scope?: string[];
4050
+ scope?: string[] | null;
3971
4051
  };
3972
4052
 
3973
4053
  declare type Status_2 = {
3974
4054
  name: string;
3975
- original_name?: string;
4055
+ original_name?: string | null;
3976
4056
  shortName?: string;
3977
4057
  state?: 'not_started' | 'in_progress' | 'done' | 'blocked';
3978
4058
  icon?: string;
3979
4059
  color?: string;
3980
4060
  /** Limit the status to specific entity types. */
3981
- scope?: string[];
4061
+ scope?: string[] | null;
3982
4062
  };
3983
4063
 
3984
4064
  declare type Status_3 = {
@@ -4100,7 +4180,8 @@ declare interface TableCellContext extends ProjectNameScope {
4100
4180
  * Gets a column's values, by entity id; each cell gets its own as `value`. AYON calls it with
4101
4181
  * the rows that come on screen and that it has no value for yet, in batches once scrolling
4102
4182
  * pauses, and keeps what it returns: scrolling back costs nothing. A row whose entity changes
4103
- * (here or by someone else) is asked for again; `refreshTableColumn(id)` asks again for all.
4183
+ * (here or by someone else) is asked for again; for anything else the values depend on, list its
4184
+ * cache tags in the column's `providesTags`, or call `refreshTableColumn(id)` to ask again for all.
4104
4185
  * When it throws, those cells show the error and are tried again when they next come on
4105
4186
  * screen. Fetch through AYON's store (`dispatch(api.endpoints.x.initiate(...))`) to share its
4106
4187
  * cache.
@@ -4135,8 +4216,23 @@ declare interface TableColumnMeta {
4135
4216
  * `false` for the menu's top level
4136
4217
  */
4137
4218
  menu?: string | false
4219
+ /**
4220
+ * cache tags of AYON's api that the values depend on: when one is invalidated (by your
4221
+ * mutations or AYON's), the values are fetched again as with `refreshTableColumn`. Needs
4222
+ * `fetchValues`. Names as you register them (`enhanceEndpoints({ addTagTypes })`, prefixed with
4223
+ * your addon name) or AYON's own. A plain name follows invalidations of the whole type only: to
4224
+ * follow `{ type, id }`, such as a list tag, give that tag
4225
+ */
4226
+ providesTags?: TableColumnTag[]
4138
4227
  }
4139
4228
 
4229
+ /**
4230
+ * A cache tag a `tableColumn` depends on (`providesTags`), as in RTK Query: a tag type, or a type
4231
+ * and id. Invalidating `'x'` refreshes columns that list `'x'` or `{ type: 'x', id }`;
4232
+ * invalidating `{ type: 'x', id: 'LIST' }` refreshes only columns that list that tag.
4233
+ */
4234
+ declare type TableColumnTag = string | { type: string; id?: string | number }
4235
+
4140
4236
  export declare const TableGridSwitch: ForwardRefExoticComponent<TableGridSwitchProps & RefAttributes<HTMLDivElement>>;
4141
4237
 
4142
4238
  declare interface TableGridSwitchProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {
@@ -4190,6 +4286,11 @@ declare interface TableShortcutContext {
4190
4286
  projectName: string | null
4191
4287
  /** the rows it acts on: the selected ones when the key was pressed in one of them, else its row */
4192
4288
  rows: TableRowRef[]
4289
+ /**
4290
+ * the entities of `rows` in the project tables (list items resolve to their entity); empty in
4291
+ * the panels' tables, whose rows are not all entities: read `rows` there
4292
+ */
4293
+ entities: EntityRef[]
4193
4294
  /** where the key was pressed: the row's id, and the column's in the project tables */
4194
4295
  focused: { rowId: string; columnId?: string }
4195
4296
  /** project tables: the selected cells, by row (entity) and column id; empty elsewhere */
@@ -4227,82 +4328,41 @@ declare interface TableShortcutPieces {
4227
4328
  dialog?: Loader<ComponentType<SlotProps<'table.shortcut'> & DialogScope>>
4228
4329
  }
4229
4330
 
4331
+ /** The context without `entities`: the hook adds them from the rows. */
4332
+ export declare type TableShortcutRows = Omit<TableShortcutContext, 'entities'>;
4333
+
4230
4334
  declare interface TabStateByScope {
4231
4335
  [scope: string]: DetailsPanelTab;
4232
4336
  }
4233
4337
 
4234
4338
  declare type Tag = {
4235
4339
  name: string;
4236
- original_name?: string;
4340
+ original_name?: string | null;
4237
4341
  color?: string;
4238
4342
  };
4239
4343
 
4240
4344
  declare type Tag_2 = {
4241
4345
  name: string;
4242
- original_name?: string;
4346
+ original_name?: string | null;
4243
4347
  color?: string;
4244
4348
  };
4245
4349
 
4246
- declare type TaskProgressSettings = {
4247
- filter?: QueryFilter_5;
4248
- sliceType?: string;
4249
- columns?: ColumnItemModel[];
4250
- };
4251
-
4252
- declare type TaskProgressViewModel = {
4253
- /** Unique identifier for the view within the given scope. */
4254
- id?: string;
4255
- /** Human-readable name of the view. */
4256
- label: string;
4257
- /** Determines whether the view is only available for the given project or for all projects (studio). */
4258
- scope: 'project' | 'studio';
4259
- /** Name of the user who created the view. Owners have full control over the view, */
4260
- owner: string;
4261
- /** Visibility of the view. Public views are visible to all users, private views are only visible to the owner. */
4262
- visibility: 'public' | 'private';
4263
- /** Working view is a special type of the view that automatically stores the current view settings without explicitly saving them. Working views are always private and scoped to the project */
4264
- working: boolean;
4265
- position: number;
4266
- accessLevel: number;
4267
- settings: TaskProgressSettings;
4268
- access: object;
4269
- viewType?: 'taskProgress';
4270
- };
4271
-
4272
- declare type TaskProgressViewPatchModel = {
4273
- label?: string;
4274
- owner?: string;
4275
- settings?: TaskProgressSettings;
4276
- viewType?: 'taskProgress';
4277
- };
4278
-
4279
- declare type TaskProgressViewPostModel = {
4280
- /** Unique identifier for the view within the given scope. */
4281
- id?: string;
4282
- /** Human-readable name of the view. */
4283
- label: string;
4284
- /** Working view is a special type of the view that automatically stores the current view settings without explicitly saving them. Working views are always private and scoped to the project */
4285
- working?: boolean;
4286
- settings: TaskProgressSettings;
4287
- viewType?: 'taskProgress';
4288
- };
4289
-
4290
4350
  declare type TaskSuggestionItem = {
4291
4351
  /** The date and time when the suggested entity was created */
4292
- createdAt?: string;
4352
+ createdAt?: string | null;
4293
4353
  /** The relevance score of the suggestion */
4294
- relevance?: number;
4354
+ relevance?: number | null;
4295
4355
  id: string;
4296
4356
  taskType: string;
4297
4357
  name: string;
4298
- label?: string;
4299
- thumbnailId?: string;
4300
- parent?: FolderSuggestionItem;
4358
+ label?: string | null;
4359
+ thumbnailId?: string | null;
4360
+ parent?: FolderSuggestionItem | null;
4301
4361
  };
4302
4362
 
4303
4363
  declare type TaskType = {
4304
4364
  name: string;
4305
- original_name?: string;
4365
+ original_name?: string | null;
4306
4366
  shortName?: string;
4307
4367
  color?: string;
4308
4368
  icon?: string;
@@ -4310,7 +4370,7 @@ declare type TaskType = {
4310
4370
 
4311
4371
  declare type TaskType_2 = {
4312
4372
  name: string;
4313
- original_name?: string;
4373
+ original_name?: string | null;
4314
4374
  shortName?: string;
4315
4375
  color?: string;
4316
4376
  icon?: string;
@@ -4328,9 +4388,9 @@ export declare const TEAM_KEY_PREFIX = "team:";
4328
4388
 
4329
4389
  declare type TeamSuggestionItem = {
4330
4390
  /** The date and time when the suggested entity was created */
4331
- createdAt?: string;
4391
+ createdAt?: string | null;
4332
4392
  /** The relevance score of the suggestion */
4333
- relevance?: number;
4393
+ relevance?: number | null;
4334
4394
  name: string;
4335
4395
  };
4336
4396
 
@@ -4353,7 +4413,7 @@ declare type TextInputPt = Partial<React.ComponentProps<typeof Styled.InputText>
4353
4413
 
4354
4414
  declare type ThemeType = 'light' | 'dark';
4355
4415
 
4356
- export declare const Thumbnail: ({ projectName, entityType, entityId, icon, color, thumbnailHash, isLoading, shimmer, className, disabled, src, hoverIcon, showBorder, ...props }: ThumbnailProps) => JSX_2.Element;
4416
+ export declare const Thumbnail: ({ projectName, entityType, entityId, icon, color, thumbnailHash, isLoading, shimmer, className, disabled, src, hoverIcon, showBorder, filmstrip, ...props }: ThumbnailProps) => JSX_2.Element;
4357
4417
 
4358
4418
  export declare interface ThumbnailProps extends Omit<HTMLAttributes<HTMLDivElement>, 'color'> {
4359
4419
  projectName?: string;
@@ -4369,6 +4429,8 @@ export declare interface ThumbnailProps extends Omit<HTMLAttributes<HTMLDivEleme
4369
4429
  src?: string;
4370
4430
  hoverIcon?: string;
4371
4431
  showBorder?: boolean;
4432
+ /** show a hover-scrub filmstrip (the entity should have reviewables) */
4433
+ filmstrip?: boolean;
4372
4434
  }
4373
4435
 
4374
4436
  export declare const ThumbnailSimple: default_2.FC<ThumbnailSimpleProps>;
@@ -4385,6 +4447,12 @@ export declare interface ThumbnailSimpleProps extends default_2.HTMLAttributes<H
4385
4447
  onLoad?: default_2.ReactEventHandler<HTMLImageElement>;
4386
4448
  onError?: default_2.ReactEventHandler<HTMLImageElement>;
4387
4449
  iconOnly?: boolean;
4450
+ /** show a hover-scrub filmstrip (the entity should have reviewables) */
4451
+ filmstrip?: boolean;
4452
+ /** filmstrip url override, when the entity props are not available */
4453
+ filmstripUrl?: string | null;
4454
+ /** should match object-fit of the image */
4455
+ filmstripFit?: 'cover' | 'contain';
4388
4456
  }
4389
4457
 
4390
4458
  /**
@@ -4395,9 +4463,10 @@ export declare const toggleBlockFormat: (editor: LexicalEditor, format: BlockFor
4395
4463
 
4396
4464
  /**
4397
4465
  * An addon's menu entries as the shared Menu's items: `to` and `href` become links (the Menu
4398
- * follows them), and a failing `onClick` is reported as a toast naming the addon.
4466
+ * follows them), and a failing `onClick` goes to `onError` (`reportContributionError`: a toast
4467
+ * naming the addon). Used by `menu` buttons and `MoreMenu`.
4399
4468
  */
4400
- export declare const toMenuItems: (items: AddonMenuItem[], contribution: AnyContribution) => MenuItemType[];
4469
+ export declare const toMenuItems: (items: AddonMenuItem[], onError: (error: unknown) => void) => MenuItemType[];
4401
4470
 
4402
4471
  export declare type ToolbarItem = 'h1' | 'h2' | 'h3' | 'bold' | 'italic' | 'strikethrough' | 'code' | 'link' | 'codeBlock' | 'quote' | 'numberList' | 'bulletList' | 'checkList';
4403
4472
 
@@ -4435,8 +4504,8 @@ declare type UpdateSubtasksMutation = ReturnType<typeof useUpdateSubtasksMutatio
4435
4504
  declare type UpdateViewApiArg = {
4436
4505
  viewType: string;
4437
4506
  viewId: string;
4438
- projectName?: string;
4439
- payload: OverviewViewPatchModel | TaskProgressViewPatchModel | ListsViewPatchModel | ReviewsViewPatchModel | VersionsViewPatchModel | GenericViewPatchModel;
4507
+ projectName?: string | null;
4508
+ genericViewPatchModel: GenericViewPatchModel;
4440
4509
  };
4441
4510
 
4442
4511
  declare type UpdateViewSettingsFn = (updatedSettings: any, localStateSetter: (value: any) => void, newLocalValue: any, options: UpdateOptions) => Promise<void>;
@@ -4472,8 +4541,8 @@ export declare const useAddonCustomizeSections: (page: ProjectTablePage) => Sett
4472
4541
  /** `table`: which table this is; no shortcuts when not set. */
4473
4542
  export declare const useAddonTableShortcuts: (table: ShortcutTable | undefined) => {
4474
4543
  hasShortcuts: boolean;
4475
- handleShortcut: (event: ShortcutKeyEvent, getContext: () => Omit<TableShortcutContext, "table"> | undefined) => boolean;
4476
- runShortcut: (contribution: Contribution<"table.shortcut">, context: TableShortcutContext) => void;
4544
+ handleShortcut: (event: ShortcutKeyEvent, getContext: () => Omit<TableShortcutRows, "table"> | undefined) => boolean;
4545
+ runShortcut: (contribution: Contribution<"table.shortcut">, rowsContext: TableShortcutRows) => void;
4477
4546
  dialog: OpenAddonShortcutDialog | null;
4478
4547
  };
4479
4548
 
@@ -4513,6 +4582,28 @@ export declare type UseDateRangeFilterReturn = {
4513
4582
  handleCustomRangeClose: () => void;
4514
4583
  };
4515
4584
 
4585
+ /**
4586
+ * Adds a hover-scrub filmstrip to an ARC EntityCard.
4587
+ *
4588
+ * EntityCard does not accept thumbnail children, but it spreads `pt.thumbnail` onto its
4589
+ * thumbnail element (ref included), so the filmstrip is portalled into that element.
4590
+ *
4591
+ * @example
4592
+ * const { thumbnailProps, filmstrip } = useEntityCardFilmstrip(filmstripUrl)
4593
+ * <EntityCard pt={{ thumbnail: thumbnailProps }} />
4594
+ * {filmstrip}
4595
+ */
4596
+ export declare const useEntityCardFilmstrip: (src?: string | null, { disabled }?: {
4597
+ disabled?: boolean;
4598
+ }) => UseEntityCardFilmstripResult;
4599
+
4600
+ declare interface UseEntityCardFilmstripResult {
4601
+ /** pass to EntityCard `pt.thumbnail` */
4602
+ thumbnailProps: Partial<HTMLAttributes<HTMLDivElement>>;
4603
+ /** render next to the EntityCard */
4604
+ filmstrip: ReactNode;
4605
+ }
4606
+
4516
4607
  export declare const useFeedback: () => FeedbackContextType;
4517
4608
 
4518
4609
  export declare const useFeedbackSafe: () => FeedbackContextType | undefined;
@@ -4524,13 +4615,6 @@ export declare const useProjectPageSlotContext: (projectName: string) => SlotMap
4524
4615
 
4525
4616
  export declare const USER_KEY_PREFIX = "user:";
4526
4617
 
4527
- declare type UserAttribModel = {
4528
- fullName?: string;
4529
- email?: string;
4530
- avatarUrl?: string;
4531
- developerMode?: boolean;
4532
- };
4533
-
4534
4618
  export declare const useReviewablesUpload: ({ projectName, versionId, taskId, folderId, productId, dispatch, onUpload, onProgress, }: UseReviewablesUploadProps) => UploadHandlers;
4535
4619
 
4536
4620
  export declare interface UseReviewablesUploadProps {
@@ -4556,13 +4640,19 @@ declare interface UserImageProps {
4556
4640
  }
4557
4641
 
4558
4642
  declare type UserModel = {
4559
- /** Name is an unique id of the {entity_name} */
4643
+ /** Unique name of the user */
4560
4644
  name: string;
4561
- uiExposureLevel?: number;
4562
- attrib?: UserAttribModel;
4563
- data?: Record<string, any>;
4564
- /** Whether the user is active */
4645
+ uiExposureLevel?: number | null;
4646
+ /** Attribute values of the entity */
4647
+ attrib?: {
4648
+ [key: string]: any;
4649
+ };
4650
+ data?: {
4651
+ [key: string]: any;
4652
+ };
4653
+ /** Whether the entity is active */
4565
4654
  active?: boolean;
4655
+ /** List of attributes explicitly set on the entity itself (not inherited) */
4566
4656
  ownAttrib?: string[];
4567
4657
  /** Time of creation */
4568
4658
  createdAt?: string;
@@ -4570,13 +4660,18 @@ declare type UserModel = {
4570
4660
  updatedAt?: string;
4571
4661
  };
4572
4662
 
4663
+ /** Every slot: the signed-in user. The host adds it; AYON renders addons only once signed in. */
4664
+ declare interface UserScope {
4665
+ user: AddonUser
4666
+ }
4667
+
4573
4668
  declare type UserSuggestionItem = {
4574
4669
  /** The date and time when the suggested entity was created */
4575
- createdAt?: string;
4670
+ createdAt?: string | null;
4576
4671
  /** The relevance score of the suggestion */
4577
- relevance?: number;
4672
+ relevance?: number | null;
4578
4673
  name: string;
4579
- fullName?: string;
4674
+ fullName?: string | null;
4580
4675
  };
4581
4676
 
4582
4677
  /** The context of a studio.page contribution. */
@@ -4767,7 +4862,7 @@ declare const useUpdateSubtasksMutation: <R extends Record<string, any> = ({
4767
4862
  export declare const useVersionUploadContext: () => VersionUploadContextType;
4768
4863
 
4769
4864
  declare type UseViewMutations = {
4770
- onCreateView: (payload: CreateViewApiArg['payload'], isStudioScope: boolean) => Promise<void>;
4865
+ onCreateView: (payload: GenericViewPostModel, isStudioScope: boolean) => Promise<void>;
4771
4866
  onDeleteView: (viewId: string, isStudioScope: boolean) => Promise<void>;
4772
4867
  onUpdateView: (viewId: string, payload: Partial<ViewData>, isStudioScope: boolean) => Promise<void>;
4773
4868
  onResetWorkingView: (args?: {
@@ -4779,70 +4874,15 @@ declare type UseViewMutations = {
4779
4874
  }) => Promise<string>;
4780
4875
  };
4781
4876
 
4782
- declare type VersionsSettings = {
4783
- showProducts?: boolean;
4784
- rowHeight?: number;
4785
- showGrid?: boolean;
4786
- gridHeight?: number;
4787
- featuredVersionOrder?: string[];
4788
- slicerType?: string;
4789
- groupBy?: string;
4790
- groupSortByDesc?: boolean;
4791
- showEmptyGroups?: boolean;
4792
- latestPerFolder?: boolean;
4793
- sortBy?: string | string[];
4794
- sortDesc?: boolean;
4795
- filter?: QueryFilter_5;
4796
- columns?: ColumnItemModel[];
4797
- };
4798
-
4799
4877
  declare type VersionSuggestionItem = {
4800
4878
  /** The date and time when the suggested entity was created */
4801
- createdAt?: string;
4879
+ createdAt?: string | null;
4802
4880
  /** The relevance score of the suggestion */
4803
- relevance?: number;
4881
+ relevance?: number | null;
4804
4882
  id: string;
4805
4883
  version: number;
4806
- parent?: ProductSuggestionItem;
4807
- name?: string;
4808
- };
4809
-
4810
- declare type VersionsViewModel = {
4811
- /** Unique identifier for the view within the given scope. */
4812
- id?: string;
4813
- /** Human-readable name of the view. */
4814
- label: string;
4815
- /** Determines whether the view is only available for the given project or for all projects (studio). */
4816
- scope: 'project' | 'studio';
4817
- /** Name of the user who created the view. Owners have full control over the view, */
4818
- owner: string;
4819
- /** Visibility of the view. Public views are visible to all users, private views are only visible to the owner. */
4820
- visibility: 'public' | 'private';
4821
- /** Working view is a special type of the view that automatically stores the current view settings without explicitly saving them. Working views are always private and scoped to the project */
4822
- working: boolean;
4823
- position: number;
4824
- accessLevel: number;
4825
- settings: VersionsSettings;
4826
- access: object;
4827
- viewType?: 'versions';
4828
- };
4829
-
4830
- declare type VersionsViewPatchModel = {
4831
- label?: string;
4832
- owner?: string;
4833
- settings?: VersionsSettings;
4834
- viewType?: 'versions';
4835
- };
4836
-
4837
- declare type VersionsViewPostModel = {
4838
- /** Unique identifier for the view within the given scope. */
4839
- id?: string;
4840
- /** Human-readable name of the view. */
4841
- label: string;
4842
- /** Working view is a special type of the view that automatically stores the current view settings without explicitly saving them. Working views are always private and scoped to the project */
4843
- working?: boolean;
4844
- settings: VersionsSettings;
4845
- viewType?: 'versions';
4884
+ parent?: ProductSuggestionItem | null;
4885
+ name?: string | null;
4846
4886
  };
4847
4887
 
4848
4888
  export declare const VersionUploadContext: Context<VersionUploadContextType | undefined>;
@@ -5018,15 +5058,15 @@ declare const viewsQueries: Api<BaseQueryFn<string | {
5018
5058
  getWorkingView: QueryDefinition<GetWorkingViewApiArg, BaseQueryFn<string | {
5019
5059
  document: string | DocumentNode;
5020
5060
  variables?: any;
5021
- } | FetchArgs, unknown, FetchBaseQueryError, {} | Partial<Pick< ClientError, "response" | "request">>>, string, GetWorkingViewApiResponse, "restApi", unknown>;
5061
+ } | FetchArgs, unknown, FetchBaseQueryError, {} | Partial<Pick< ClientError, "response" | "request">>>, string, GenericViewModel, "restApi", unknown>;
5022
5062
  getBaseView: QueryDefinition<GetBaseViewApiArg, BaseQueryFn<string | {
5023
5063
  document: string | DocumentNode;
5024
5064
  variables?: any;
5025
- } | FetchArgs, unknown, FetchBaseQueryError, {} | Partial<Pick< ClientError, "response" | "request">>>, string, GetBaseViewApiResponse, "restApi", unknown>;
5065
+ } | FetchArgs, unknown, FetchBaseQueryError, {} | Partial<Pick< ClientError, "response" | "request">>>, string, GenericViewModel, "restApi", unknown>;
5026
5066
  getDefaultView: QueryDefinition<GetDefaultViewApiArg, BaseQueryFn<string | {
5027
5067
  document: string | DocumentNode;
5028
5068
  variables?: any;
5029
- } | FetchArgs, unknown, FetchBaseQueryError, {} | Partial<Pick< ClientError, "response" | "request">>>, string, GetDefaultViewApiResponse, "restApi", unknown>;
5069
+ } | FetchArgs, unknown, FetchBaseQueryError, {} | Partial<Pick< ClientError, "response" | "request">>>, string, GenericViewModel, "restApi", unknown>;
5030
5070
  setDefaultView: MutationDefinition<SetDefaultViewApiArg, BaseQueryFn<string | {
5031
5071
  document: string | DocumentNode;
5032
5072
  variables?: any;
@@ -5034,12 +5074,12 @@ declare const viewsQueries: Api<BaseQueryFn<string | {
5034
5074
  getView: QueryDefinition<GetViewApiArg, BaseQueryFn<string | {
5035
5075
  document: string | DocumentNode;
5036
5076
  variables?: any;
5037
- } | FetchArgs, unknown, FetchBaseQueryError, {} | Partial<Pick< ClientError, "response" | "request">>>, string, GetViewApiResponse, "restApi", unknown>;
5038
- deleteView: MutationDefinition<DeleteViewApiArg, BaseQueryFn<string | {
5077
+ } | FetchArgs, unknown, FetchBaseQueryError, {} | Partial<Pick< ClientError, "response" | "request">>>, string, GenericViewModel, "restApi", unknown>;
5078
+ updateView: MutationDefinition<UpdateViewApiArg, BaseQueryFn<string | {
5039
5079
  document: string | DocumentNode;
5040
5080
  variables?: any;
5041
5081
  } | FetchArgs, unknown, FetchBaseQueryError, {} | Partial<Pick< ClientError, "response" | "request">>>, string, any, "restApi", unknown>;
5042
- updateView: MutationDefinition<UpdateViewApiArg, BaseQueryFn<string | {
5082
+ deleteView: MutationDefinition<DeleteViewApiArg, BaseQueryFn<string | {
5043
5083
  document: string | DocumentNode;
5044
5084
  variables?: any;
5045
5085
  } | FetchArgs, unknown, FetchBaseQueryError, {} | Partial<Pick< ClientError, "response" | "request">>>, string, any, "restApi", unknown>;
@@ -5055,15 +5095,15 @@ declare const viewsQueries: Api<BaseQueryFn<string | {
5055
5095
  getWorkingView: QueryDefinition<GetWorkingViewApiArg, BaseQueryFn<string | {
5056
5096
  document: string | DocumentNode;
5057
5097
  variables?: any;
5058
- } | FetchArgs, unknown, FetchBaseQueryError, {} | Partial<Pick< ClientError, "response" | "request">>>, string, GetWorkingViewApiResponse, "restApi", unknown>;
5098
+ } | FetchArgs, unknown, FetchBaseQueryError, {} | Partial<Pick< ClientError, "response" | "request">>>, string, GenericViewModel, "restApi", unknown>;
5059
5099
  getBaseView: QueryDefinition<GetBaseViewApiArg, BaseQueryFn<string | {
5060
5100
  document: string | DocumentNode;
5061
5101
  variables?: any;
5062
- } | FetchArgs, unknown, FetchBaseQueryError, {} | Partial<Pick< ClientError, "response" | "request">>>, string, GetBaseViewApiResponse, "restApi", unknown>;
5102
+ } | FetchArgs, unknown, FetchBaseQueryError, {} | Partial<Pick< ClientError, "response" | "request">>>, string, GenericViewModel, "restApi", unknown>;
5063
5103
  getDefaultView: QueryDefinition<GetDefaultViewApiArg, BaseQueryFn<string | {
5064
5104
  document: string | DocumentNode;
5065
5105
  variables?: any;
5066
- } | FetchArgs, unknown, FetchBaseQueryError, {} | Partial<Pick< ClientError, "response" | "request">>>, string, GetDefaultViewApiResponse, "restApi", unknown>;
5106
+ } | FetchArgs, unknown, FetchBaseQueryError, {} | Partial<Pick< ClientError, "response" | "request">>>, string, GenericViewModel, "restApi", unknown>;
5067
5107
  setDefaultView: MutationDefinition<SetDefaultViewApiArg, BaseQueryFn<string | {
5068
5108
  document: string | DocumentNode;
5069
5109
  variables?: any;
@@ -5071,12 +5111,12 @@ declare const viewsQueries: Api<BaseQueryFn<string | {
5071
5111
  getView: QueryDefinition<GetViewApiArg, BaseQueryFn<string | {
5072
5112
  document: string | DocumentNode;
5073
5113
  variables?: any;
5074
- } | FetchArgs, unknown, FetchBaseQueryError, {} | Partial<Pick< ClientError, "response" | "request">>>, string, GetViewApiResponse, "restApi", unknown>;
5075
- deleteView: MutationDefinition<DeleteViewApiArg, BaseQueryFn<string | {
5114
+ } | FetchArgs, unknown, FetchBaseQueryError, {} | Partial<Pick< ClientError, "response" | "request">>>, string, GenericViewModel, "restApi", unknown>;
5115
+ updateView: MutationDefinition<UpdateViewApiArg, BaseQueryFn<string | {
5076
5116
  document: string | DocumentNode;
5077
5117
  variables?: any;
5078
5118
  } | FetchArgs, unknown, FetchBaseQueryError, {} | Partial<Pick< ClientError, "response" | "request">>>, string, any, "restApi", unknown>;
5079
- updateView: MutationDefinition<UpdateViewApiArg, BaseQueryFn<string | {
5119
+ deleteView: MutationDefinition<DeleteViewApiArg, BaseQueryFn<string | {
5080
5120
  document: string | DocumentNode;
5081
5121
  variables?: any;
5082
5122
  } | FetchArgs, unknown, FetchBaseQueryError, {} | Partial<Pick< ClientError, "response" | "request">>>, string, any, "restApi", unknown>;