@pimcore/studio-ui-bundle 2025.4.0 → 2025.4.1

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 (54) hide show
  1. package/dist/build/types/src/core/app/api/pimcore/tags.d.ts +2 -0
  2. package/dist/build/types/src/core/app/i18n/iframe-i18n.d.ts +0 -3
  3. package/dist/build/types/src/core/components/element-tree/element-tree-slice.d.ts +10 -2
  4. package/dist/build/types/src/core/components/grid/grid-cell/grid-row.d.ts +2 -1
  5. package/dist/build/types/src/core/components/import-modal/components/selected-file-view/selected-file-view.d.ts +2 -1
  6. package/dist/build/types/src/core/components/import-modal/hooks/use-file-upload.d.ts +14 -2
  7. package/dist/build/types/src/core/components/import-modal/import-modal.d.ts +2 -22
  8. package/dist/build/types/src/core/components/import-modal/index.d.ts +2 -1
  9. package/dist/build/types/src/core/components/import-modal/types.d.ts +48 -0
  10. package/dist/build/types/src/core/components/many-to-many-relation/grid.d.ts +1 -0
  11. package/dist/build/types/src/core/components/many-to-many-relation/grid.styles.d.ts +15 -0
  12. package/dist/build/types/src/core/components/many-to-many-relation/many-to-many-relation.d.ts +1 -0
  13. package/dist/build/types/src/core/components/operational-grid/csv-import-button/csv-import-button.d.ts +11 -0
  14. package/dist/build/types/src/core/components/operational-grid/csv-import-modal/csv-import-modal.d.ts +19 -0
  15. package/dist/build/types/src/core/components/pql-query-input/pql-query-input.d.ts +2 -2
  16. package/dist/build/types/src/core/components/pql-query-input/pql-query-input.stories.d.ts +12 -0
  17. package/dist/build/types/src/core/components/pql-query-input/pql-query-input.styles.d.ts +1 -0
  18. package/dist/build/types/src/core/components/tabs/tab-context-menu.d.ts +16 -0
  19. package/dist/build/types/src/core/modules/app/error-handler/constants/errorTypes.d.ts +2 -1
  20. package/dist/build/types/src/core/modules/app/error-handler/types.d.ts +2 -0
  21. package/dist/build/types/src/core/modules/asset/asset-api-slice.gen.d.ts +3 -3
  22. package/dist/build/types/src/core/modules/class-definition/class-definition-slice.gen.d.ts +2 -2
  23. package/dist/build/types/src/core/modules/data-object/data-object-api-slice.gen.d.ts +3 -3
  24. package/dist/build/types/src/core/modules/document/editor/shared-tab-manager/tabs/edit/components/editables-dialog/types.d.ts +6 -1
  25. package/dist/build/types/src/core/modules/element/actions/index.d.ts +2 -1
  26. package/dist/build/types/src/core/modules/element/dynamic-types/definitions/document/editable/utils/select-options.d.ts +14 -1
  27. package/dist/build/types/src/core/modules/element/dynamic-types/definitions/objects/data-related/types/dynamic-type-object-data-image.d.ts +2 -1
  28. package/dist/build/types/src/core/modules/element/editor/shared-tab-manager/tabs/tags/components/assigned-tags/assigned-tags.d.ts +1 -1
  29. package/dist/build/types/src/core/modules/element/editor/shared-tab-manager/tabs/tags/hooks/use-optimistic-update.d.ts +4 -0
  30. package/dist/build/types/src/core/modules/element/export-api-slice.gen.d.ts +10 -6
  31. package/dist/build/types/src/core/modules/element/listing/decorators/general-filters/view-layer/components/sidebar/tabs/filters/filter-container.d.ts +1 -6
  32. package/dist/build/types/src/core/modules/execution-engine/jobs/batch-edit/abstract-batch-edit-job.d.ts +2 -0
  33. package/dist/build/types/src/core/modules/execution-engine/jobs/batch-edit/abstract-folder-batch-edit-job.d.ts +15 -0
  34. package/dist/build/types/src/core/modules/execution-engine/jobs/batch-edit/asset-folder-batch-edit-job.d.ts +3 -2
  35. package/dist/build/types/src/core/modules/execution-engine/jobs/batch-edit/data-object-folder-batch-edit-job.d.ts +3 -2
  36. package/dist/build/types/src/core/modules/execution-engine/jobs/download/download-job.d.ts +6 -0
  37. package/dist/build/types/src/core/modules/execution-engine/message-handlers/message-bus-job/message-bus-job-handler-types.d.ts +41 -0
  38. package/dist/build/types/src/core/modules/execution-engine/message-handlers/message-bus-job/message-bus-job-handler.d.ts +6 -38
  39. package/dist/build/types/src/core/modules/execution-engine/message-handlers/message-bus-job/message-bus-job-notification.d.ts +1 -0
  40. package/dist/build/types/src/core/modules/execution-engine/message-handlers/message-bus-job/progress-calculator/progress-calculator.interface.d.ts +46 -0
  41. package/dist/build/types/src/core/modules/execution-engine/message-handlers/message-bus-job/progress-calculator/progress-field-calculator.d.ts +30 -0
  42. package/dist/build/types/src/core/modules/execution-engine/message-handlers/message-bus-job/progress-calculator/step-completion-calculator.d.ts +29 -0
  43. package/dist/build/types/src/core/modules/execution-engine/message-handlers/message-bus-job/step-tracker/child-job-step-tracker.d.ts +40 -0
  44. package/dist/build/types/src/core/modules/execution-engine/message-handlers/message-bus-job/step-tracker/default-step-tracker.d.ts +43 -0
  45. package/dist/build/types/src/core/modules/execution-engine/message-handlers/message-bus-job/step-tracker/step-tracker.interface.d.ts +35 -0
  46. package/dist/build/types/src/core/modules/execution-engine/notification/job/job-view.d.ts +2 -0
  47. package/dist/build/types/src/core/modules/notifications/actions/share-via-notification/use-share-via-notification.d.ts +17 -0
  48. package/dist/build/types/src/core/modules/notifications/send-notification/send-notification-modal.d.ts +3 -1
  49. package/dist/build/types/src/core/modules/quantity-value/table/table.d.ts +4 -1
  50. package/dist/build/types/src/core/modules/select-option/components/tree/tree-container.d.ts +1 -1
  51. package/dist/build/types/src/core/modules/website-settings/table/table.d.ts +4 -1
  52. package/dist/build/types/src/core/modules/widget-editor/hooks/use-widget-editor.d.ts +1 -1
  53. package/dist/build/types/src/sdk/components/index.d.ts +1 -0
  54. package/package.json +1 -1
@@ -161,6 +161,7 @@ export declare const providingTags: {
161
161
  id: number;
162
162
  }[];
163
163
  ELEMENT_VERSIONS: (elementType: ElementType, id: number) => Tag[];
164
+ NOTES_AND_EVENTS: () => string[];
164
165
  NOTES_AND_EVENTS_DETAIL: (id: number) => {
165
166
  type: string;
166
167
  id: number;
@@ -337,6 +338,7 @@ export declare const invalidatingTags: {
337
338
  id: number;
338
339
  }[];
339
340
  ELEMENT_VERSIONS: (elementType: ElementType, id: number) => Tag[];
341
+ NOTES_AND_EVENTS: () => string[];
340
342
  NOTES_AND_EVENTS_DETAIL: (id: number) => {
341
343
  type: string;
342
344
  id: number;
@@ -9,8 +9,5 @@
9
9
  */
10
10
  import i18n from 'i18next';
11
11
  export declare const FALLBACK_LANGUAGE = "en";
12
- /**
13
- * Initialize i18n for iframe with translations from parent window
14
- */
15
12
  export declare const initializeIframeI18n: () => Promise<void>;
16
13
  export default i18n;
@@ -101,7 +101,11 @@ export declare const setNodeLoading: import("@reduxjs/toolkit").ActionCreatorWit
101
101
  treeId: string;
102
102
  nodeId: string;
103
103
  isFetching: boolean;
104
- }, "trees/setNodeFetching">, markNodeDeletingForTree: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
104
+ }, "trees/setNodeFetching">, setNodeFetchingInAllTrees: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
105
+ nodeId: string;
106
+ elementType: string;
107
+ isFetching: boolean;
108
+ }, "trees/setNodeFetchingInAllTrees">, markNodeDeletingForTree: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
105
109
  treeId: string;
106
110
  nodeId: string;
107
111
  isDeleting: boolean;
@@ -122,7 +126,11 @@ export declare const setNodeLoading: import("@reduxjs/toolkit").ActionCreatorWit
122
126
  nodeId: string;
123
127
  elementType: string;
124
128
  newLabel: string;
125
- }, "trees/renameNode">, updateNodeType: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
129
+ }, "trees/renameNode">, updateNodeData: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
130
+ nodeId: string;
131
+ elementType: string;
132
+ data: Partial<TreeNode>;
133
+ }, "trees/updateNodeData">, updateNodeType: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
126
134
  nodeId: string;
127
135
  elementType: string;
128
136
  newType: string;
@@ -23,6 +23,7 @@ export interface GridRowProps {
23
23
  onFocusCell?: (cell: GridCellReference) => void;
24
24
  contextMenu?: ListGridContextMenuComponents;
25
25
  onRowDoubleClick?: GridProps['onRowDoubleClick'];
26
+ enableRowVirtualizer: boolean;
26
27
  enableColumnVirtualizer: boolean;
27
28
  size?: GridProps['size'];
28
29
  rowStyle?: CSSProperties;
@@ -32,5 +33,5 @@ export interface GridRowProps {
32
33
  virtualPaddingLeft?: number;
33
34
  virtualPaddingRight?: number;
34
35
  }
35
- declare const CachedGridRow: React.MemoExoticComponent<({ row, isSelected, modifiedCells, rowStyle, virtualColumns, virtualPaddingLeft, virtualPaddingRight, enableColumnVirtualizer, ...props }: GridRowProps) => React.JSX.Element>;
36
+ declare const CachedGridRow: React.MemoExoticComponent<({ row, isSelected, modifiedCells, rowStyle, virtualColumns, virtualPaddingLeft, virtualPaddingRight, enableColumnVirtualizer, enableRowVirtualizer, ...props }: GridRowProps) => React.JSX.Element>;
36
37
  export { CachedGridRow as GridRow };
@@ -8,11 +8,12 @@
8
8
  * @license Pimcore Open Core License (POCL)
9
9
  */
10
10
  import React from 'react';
11
+ import { type FileUploadStatus } from '../../hooks/use-file-upload';
11
12
  interface SelectedFileViewProps {
12
13
  file: File;
13
14
  loading: boolean;
14
15
  isUploading: boolean;
15
- uploadStatus: 'normal' | 'active' | 'success' | 'exception';
16
+ uploadStatus: FileUploadStatus;
16
17
  uploadProgress: number;
17
18
  onRemove: () => void;
18
19
  }
@@ -11,16 +11,28 @@ interface UseFileUploadProps {
11
11
  action: string;
12
12
  headers?: Record<string, string>;
13
13
  data?: Record<string, any>;
14
+ fileKey?: string;
15
+ filesKey?: string;
14
16
  onUploadSuccess?: (response: any, file: File) => void;
15
17
  onUploadError?: (error: Error, file: File) => void;
16
18
  }
19
+ export type FileUploadStatus = 'normal' | 'active' | 'success' | 'exception';
20
+ export interface FileUploadState {
21
+ progress: number;
22
+ status: FileUploadStatus;
23
+ }
17
24
  interface UseFileUploadReturn {
18
25
  uploadProgress: number;
19
- uploadStatus: 'normal' | 'active' | 'success' | 'exception';
26
+ uploadStatus: FileUploadStatus;
20
27
  loading: boolean;
21
28
  isUploading: boolean;
22
29
  upload: (file: File) => Promise<void>;
30
+ uploadMultiple: (entries: Array<{
31
+ id: string;
32
+ file: File;
33
+ }>) => Promise<void>;
34
+ fileUploadStates: Record<string, FileUploadState>;
23
35
  resetUploadState: () => void;
24
36
  }
25
- export declare const useFileUpload: ({ action, headers, data, onUploadSuccess, onUploadError }: UseFileUploadProps) => UseFileUploadReturn;
37
+ export declare const useFileUpload: ({ action, headers, data, fileKey, filesKey, onUploadSuccess, onUploadError }: UseFileUploadProps) => UseFileUploadReturn;
26
38
  export {};
@@ -8,25 +8,5 @@
8
8
  * @license Pimcore Open Core License (POCL)
9
9
  */
10
10
  import React from 'react';
11
- export interface ImportModalProps {
12
- action: string;
13
- open?: boolean;
14
- onOpenChange?: (open: boolean) => void;
15
- title?: string;
16
- uploadButtonLabel?: string;
17
- browseButtonLabel?: string;
18
- dragDropLabel?: string;
19
- accept?: string;
20
- acceptMimeTypes?: string[];
21
- validateFile?: (file: File) => boolean;
22
- onValidationError?: (file: File) => void;
23
- maxFileSize?: number;
24
- headers?: Record<string, string>;
25
- data?: Record<string, any>;
26
- onUploadSuccess?: (response: any, file: File) => void;
27
- onUploadError?: (error: Error, file: File) => void;
28
- showSuccessMessage?: boolean;
29
- successMessage?: React.ReactNode;
30
- children?: React.ReactNode;
31
- }
32
- export declare const ImportModal: ({ action, open: controlledOpen, onOpenChange, title, uploadButtonLabel, browseButtonLabel, dragDropLabel, accept, acceptMimeTypes, validateFile, onValidationError, maxFileSize, headers, data, onUploadSuccess, onUploadError, showSuccessMessage, successMessage, children }: ImportModalProps) => React.JSX.Element;
11
+ import { type ImportModalProps } from './types';
12
+ export declare const ImportModal: ({ action, open: controlledOpen, onOpenChange, title, uploadButtonLabel, browseButtonLabel, dragDropLabel, accept, acceptMimeTypes, validateFile, onValidationError, maxFileSize, headers, data, fileKey, filesKey, onUploadSuccess, onUploadError, showSuccessMessage, successMessage, multiple, children }: ImportModalProps) => React.JSX.Element;
@@ -7,4 +7,5 @@
7
7
  * @copyright Copyright (c) Pimcore GmbH (https://www.pimcore.com)
8
8
  * @license Pimcore Open Core License (POCL)
9
9
  */
10
- export { ImportModal, type ImportModalProps } from './import-modal';
10
+ export { ImportModal } from './import-modal';
11
+ export { type ImportModalProps } from './types';
@@ -0,0 +1,48 @@
1
+ /**
2
+ * This source file is available under the terms of the
3
+ * Pimcore Open Core License (POCL)
4
+ * Full copyright and license information is available in
5
+ * LICENSE.md which is distributed with this source code.
6
+ *
7
+ * @copyright Copyright (c) Pimcore GmbH (https://www.pimcore.com)
8
+ * @license Pimcore Open Core License (POCL)
9
+ */
10
+ import type React from 'react';
11
+ export interface FileEntry {
12
+ id: string;
13
+ file: File;
14
+ }
15
+ export interface ImportModalProps {
16
+ action: string;
17
+ open?: boolean;
18
+ onOpenChange?: (open: boolean) => void;
19
+ title?: string;
20
+ uploadButtonLabel?: string;
21
+ browseButtonLabel?: string;
22
+ dragDropLabel?: string;
23
+ accept?: string;
24
+ acceptMimeTypes?: string[];
25
+ validateFile?: (file: File) => boolean;
26
+ onValidationError?: (file: File) => void;
27
+ maxFileSize?: number;
28
+ headers?: Record<string, string>;
29
+ data?: Record<string, any>;
30
+ /**
31
+ * fileKey is used when uploading a single file.
32
+ * The payload will be: `{ [fileKey]: File }`.
33
+ * Defaults to 'file'.
34
+ */
35
+ fileKey?: string;
36
+ /**
37
+ * filesKey is used when uploading multiple files.
38
+ * The payload will be: `{ [filesKey]: File, [filesKey]: File, ... }`.
39
+ * Defaults to 'files[]'.
40
+ */
41
+ filesKey?: string;
42
+ onUploadSuccess?: (response: any, file: File) => void;
43
+ onUploadError?: (error: Error, file: File) => void;
44
+ showSuccessMessage?: boolean;
45
+ successMessage?: React.ReactNode;
46
+ multiple?: boolean;
47
+ children?: React.ReactNode;
48
+ }
@@ -30,5 +30,6 @@ export interface ManyToManyRelationGridProps {
30
30
  name: string | undefined;
31
31
  class: string | undefined;
32
32
  };
33
+ enableRowVirtualizer: boolean;
33
34
  }
34
35
  export declare const ManyToManyRelationGrid: React.ForwardRefExoticComponent<ManyToManyRelationGridProps & React.RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,15 @@
1
+ /**
2
+ * This source file is available under the terms of the
3
+ * Pimcore Open Core License (POCL)
4
+ * Full copyright and license information is available in
5
+ * LICENSE.md which is distributed with this source code.
6
+ *
7
+ * @copyright Copyright (c) Pimcore GmbH (https://www.pimcore.com)
8
+ * @license Pimcore Open Core License (POCL)
9
+ */
10
+ export interface UseStylesProps {
11
+ height: string | null;
12
+ }
13
+ export declare const useStyles: (props?: UseStylesProps | undefined) => import("antd-style").ReturnStyles<{
14
+ grid: import("antd-style").SerializedStyles;
15
+ }>;
@@ -37,5 +37,6 @@ export interface ManyToManyRelationProps extends IRelationAllowedTypesDataCompon
37
37
  className?: string;
38
38
  disableInlineUpload?: boolean;
39
39
  enableRowDrag?: boolean;
40
+ noteditable?: boolean | null;
40
41
  }
41
42
  export declare const ManyToManyRelation: ({ enableRowDrag, ...props }: ManyToManyRelationProps) => React.JSX.Element;
@@ -0,0 +1,11 @@
1
+ /**
2
+ * This source file is available under the terms of the
3
+ * Pimcore Open Core License (POCL)
4
+ * Full copyright and license information is available in
5
+ * LICENSE.md which is distributed with this source code.
6
+ *
7
+ * @copyright Copyright (c) Pimcore GmbH (https://www.pimcore.com)
8
+ * @license Pimcore Open Core License (POCL)
9
+ */
10
+ import React from 'react';
11
+ export declare const CsvImportButton: () => React.JSX.Element;
@@ -0,0 +1,19 @@
1
+ /**
2
+ * This source file is available under the terms of the
3
+ * Pimcore Open Core License (POCL)
4
+ * Full copyright and license information is available in
5
+ * LICENSE.md which is distributed with this source code.
6
+ *
7
+ * @copyright Copyright (c) Pimcore GmbH (https://www.pimcore.com)
8
+ * @license Pimcore Open Core License (POCL)
9
+ */
10
+ import React from 'react';
11
+ import { type ColumnDef } from '@tanstack/react-table';
12
+ export interface CsvImportModalProps {
13
+ open: boolean;
14
+ columns: Array<ColumnDef<any>>;
15
+ value: any[];
16
+ onConfirm: (newRows: any[]) => void;
17
+ onCancel: () => void;
18
+ }
19
+ export declare const CsvImportModal: (props: CsvImportModalProps) => React.JSX.Element;
@@ -11,8 +11,8 @@ import React from 'react';
11
11
  import type { FetchBaseQueryError } from '@reduxjs/toolkit/query';
12
12
  interface IPQLQueryInputProps {
13
13
  value: string;
14
- handleChange: (e: React.ChangeEvent<HTMLTextAreaElement>) => void;
15
- handleBlur: (e: React.ChangeEvent<HTMLTextAreaElement>) => void;
14
+ handleChange: (value: string) => void;
15
+ handleBlur?: () => void;
16
16
  errorData?: FetchBaseQueryError;
17
17
  isShowError: boolean;
18
18
  }
@@ -12,17 +12,29 @@ declare const config: Meta;
12
12
  export declare const _default: {
13
13
  args: {
14
14
  value: string;
15
+ isShowError: boolean;
15
16
  };
16
17
  };
17
18
  export declare const WithValue: {
18
19
  args: {
19
20
  value: string;
21
+ isShowError: boolean;
20
22
  };
21
23
  };
22
24
  export declare const WithErrorMessage: {
23
25
  args: {
24
26
  value: string;
25
27
  isShowError: boolean;
28
+ errorData: {
29
+ status: number;
30
+ data: {
31
+ errorKey: string;
32
+ message: string;
33
+ position: number;
34
+ token: string;
35
+ query: string;
36
+ };
37
+ };
26
38
  };
27
39
  };
28
40
  export default config;
@@ -12,4 +12,5 @@ export declare const useStyles: (props?: unknown) => import("antd-style").Return
12
12
  infoIcon: import("antd-style").SerializedStyles;
13
13
  text: import("antd-style").SerializedStyles;
14
14
  link: import("antd-style").SerializedStyles;
15
+ editorError: import("antd-style").SerializedStyles;
15
16
  }>;
@@ -0,0 +1,16 @@
1
+ /**
2
+ * This source file is available under the terms of the
3
+ * Pimcore Open Core License (POCL)
4
+ * Full copyright and license information is available in
5
+ * LICENSE.md which is distributed with this source code.
6
+ *
7
+ * @copyright Copyright (c) Pimcore GmbH (https://www.pimcore.com)
8
+ * @license Pimcore Open Core License (POCL)
9
+ */
10
+ import React from 'react';
11
+ export interface TabContextMenuProps {
12
+ tabKey: string;
13
+ allKeys: string[];
14
+ onClose: (key: string) => void;
15
+ }
16
+ export declare const TabContextMenu: ({ tabKey, allKeys, onClose }: TabContextMenuProps) => React.JSX.Element;
@@ -19,5 +19,6 @@ export declare enum ErrorKeyTypes {
19
19
  WIDGET_NAME_MISSING = "error_widget_name_missing",
20
20
  WIDGET_NAME_INVALID = "error_widget_name_invalid",
21
21
  VALIDATION_FAILED = "error_validation_failed",
22
- ELEMENT_VALIDATION_FAILED = "error_element_validation_failed"
22
+ ELEMENT_VALIDATION_FAILED = "error_element_validation_failed",
23
+ GDI_PARSING_EXCEPTION = "error_gdi_parsing_exception"
23
24
  }
@@ -23,4 +23,6 @@ export interface IApiErrorDetails {
23
23
  errorKey?: string;
24
24
  message?: string;
25
25
  error?: string;
26
+ position?: number;
27
+ token?: string;
26
28
  }
@@ -453,15 +453,15 @@ export type AssetPatchFolderByIdApiResponse =
453
453
  jobRunId: number;
454
454
  };
455
455
  export type AssetPatchFolderByIdApiArg = {
456
+ /** Id of the folder */
457
+ id: number;
456
458
  body: {
457
459
  data: {
458
- /** Folder ID */
459
- folderId: number;
460
460
  parentId?: number | null;
461
461
  key?: string | null;
462
462
  locked?: string | null;
463
463
  metadata?: PatchCustomMetadata[] | null;
464
- }[];
464
+ };
465
465
  filters?: ExportAllFilter;
466
466
  };
467
467
  };
@@ -685,7 +685,7 @@ export type CustomLayouts = {
685
685
  /** Modification date timestamp */
686
686
  modificationDate: number;
687
687
  /** User id of owner */
688
- userOwner: number;
688
+ userOwner: number | null;
689
689
  /** Class id */
690
690
  classId: string;
691
691
  /** Whether it is the default layout */
@@ -751,7 +751,7 @@ export type ClassDefinition = {
751
751
  /** Modification date timestamp */
752
752
  modificationDate: number | null;
753
753
  /** User id of owner */
754
- userOwner: number;
754
+ userOwner: number | null;
755
755
  /** Namespace of parent class */
756
756
  parentClass: string;
757
757
  /** Interface implementations */
@@ -246,10 +246,10 @@ export type DataObjectPatchFolderByIdApiResponse =
246
246
  jobRunId: number;
247
247
  };
248
248
  export type DataObjectPatchFolderByIdApiArg = {
249
+ /** Id of the folder */
250
+ id: number;
249
251
  body: {
250
252
  data: {
251
- /** Folder ID */
252
- folderId: number;
253
253
  parentId?: number | null;
254
254
  index?: number | null;
255
255
  key?: string | null;
@@ -258,7 +258,7 @@ export type DataObjectPatchFolderByIdApiArg = {
258
258
  childrenSortOrder?: string | null;
259
259
  published?: boolean | null;
260
260
  editableData?: object | null;
261
- }[];
261
+ };
262
262
  filters?: ExportAllFilter;
263
263
  classId: string;
264
264
  };
@@ -11,9 +11,14 @@ export interface DialogConfig {
11
11
  id: string;
12
12
  width?: number;
13
13
  height?: number;
14
- items: DialogConfigItem;
14
+ items: DialogConfigItems;
15
15
  reloadOnClose?: boolean;
16
16
  }
17
+ export type DialogConfigItems = DialogConfigItem | SerializedDialogConfigItems;
18
+ export interface SerializedDialogConfigItems {
19
+ items?: unknown;
20
+ [key: string]: unknown;
21
+ }
17
22
  export interface DialogConfigItem {
18
23
  type: string;
19
24
  title?: string;
@@ -49,5 +49,6 @@ export declare enum ContextMenuActionName {
49
49
  download = "download",
50
50
  clearImageThumbnails = "clearImageThumbnails",
51
51
  clearVideoThumbnails = "clearVideoThumbnails",
52
- clearPdfThumbnails = "clearPdfThumbnails"
52
+ clearPdfThumbnails = "clearPdfThumbnails",
53
+ shareViaNotification = "shareViaNotification"
53
54
  }
@@ -7,9 +7,22 @@
7
7
  * @copyright Copyright (c) Pimcore GmbH (https://www.pimcore.com)
8
8
  * @license Pimcore Open Core License (POCL)
9
9
  */
10
+ import React from 'react';
10
11
  import { type SelectOptionType } from '../../../../../../../../sdk/modules/element';
11
12
  export type DocumentEditableStoreEntry = [string | number | null, string] | string | number;
12
13
  /**
13
- * Transforms document editable store entries into SelectOptionType array with sanitized HTML labels
14
+ * Transforms document editable store entries into SelectOptionType array.
15
+ *
16
+ * The `label` is returned as a plain string so that antd's built-in search
17
+ * (driven by `optionFilterProp="label"`) can match against it. HTML sanitization
18
+ * happens at render time via `renderSanitizedLabel`, used by the consuming
19
+ * components in their `optionRender` / `labelRender` props.
14
20
  */
15
21
  export declare const transformDocumentEditableStoreToOptions: (store?: DocumentEditableStoreEntry[]) => SelectOptionType[];
22
+ /**
23
+ * Renders a label with HTML sanitization. Intended for use in antd's
24
+ * `labelRender` / `optionRender` props, so that sanitization happens at the
25
+ * moment the label becomes DOM — while `label` itself stays a plain string
26
+ * so antd's built-in filter keeps working.
27
+ */
28
+ export declare const renderSanitizedLabel: (label: React.ReactNode) => React.JSX.Element;
@@ -8,7 +8,7 @@
8
8
  * @license Pimcore Open Core License (POCL)
9
9
  */
10
10
  import React from 'react';
11
- import { type AbstractObjectDataDefinition, DynamicTypeObjectDataAbstract, type EditMode, type GetGridCellDefinitionProps } from '../../../../../../../modules/element/dynamic-types/definitions/objects/data-related/dynamic-type-object-data-abstract';
11
+ import { type AbstractObjectDataDefinition, DynamicTypeObjectDataAbstract, type EditMode, type EditModalSettings, type GetGridCellDefinitionProps } from '../../../../../../../modules/element/dynamic-types/definitions/objects/data-related/dynamic-type-object-data-abstract';
12
12
  import { type ImageProps } from '../../../../../../../modules/element/dynamic-types/definitions/objects/data-related/components/image/image';
13
13
  import type { InheritanceOverlayType } from '../../../../../../../components/inheritance-overlay/inheritance-overlay';
14
14
  export type ImageObjectDataDefinition = AbstractObjectDataDefinition & ImageProps;
@@ -16,6 +16,7 @@ export declare class DynamicTypeObjectDataImage extends DynamicTypeObjectDataAbs
16
16
  id: string;
17
17
  inheritedMaskOverlay: InheritanceOverlayType;
18
18
  gridCellEditMode: EditMode;
19
+ gridCellEditModalSettings: EditModalSettings;
19
20
  getObjectDataComponent(props: ImageObjectDataDefinition): React.ReactElement<AbstractObjectDataDefinition>;
20
21
  getGridCellPreviewComponent(props: GetGridCellDefinitionProps): React.ReactElement;
21
22
  getDefaultGridColumnWidth(): number | undefined;
@@ -8,7 +8,7 @@
8
8
  * @license Pimcore Open Core License (POCL)
9
9
  */
10
10
  import React from 'react';
11
- import { type Tag } from '../../../../../../../../modules/element/editor/shared-tab-manager/tabs/tags/tags-api-slice.gen';
11
+ import { type Tag } from '../../../../../../../../modules/element/editor/shared-tab-manager/tabs/tags/tags-api-slice-enhanced';
12
12
  export declare const AssignedTagsTable: ({ tags, isLoading }: {
13
13
  tags: Tag[];
14
14
  isLoading: boolean;
@@ -14,8 +14,12 @@ interface UpdateTagsForElementByTypeAndIdProps extends TagGetCollectionForElemen
14
14
  flatTags: Tag[];
15
15
  checkedTags: Key[];
16
16
  }
17
+ interface RemoveTagFromElementProps extends TagGetCollectionForElementByTypeAndIdApiArg {
18
+ tagId: number;
19
+ }
17
20
  interface UseOptimisticUpdateReturn {
18
21
  updateTagsForElementByTypeAndId: (props: UpdateTagsForElementByTypeAndIdProps) => PatchCollection;
22
+ removeTagFromElement: (props: RemoveTagFromElementProps) => PatchCollection;
19
23
  }
20
24
  export declare const useOptimisticUpdate: () => UseOptimisticUpdateReturn;
21
25
  export {};
@@ -29,10 +29,11 @@ export type ExportCsvApiArg = {
29
29
  elements?: number[];
30
30
  columns?: GridColumnRequest[];
31
31
  config?: {
32
- header?: "id" | "custom_report_config" | "custom_report_to_export" | "element_class_id" | "element_to_export" | "element_type" | "folder_to_export" | "grid_export_data" | "grid_export_data_info" | "config" | "columns" | "filters" | "delimiter" | "header" | "no_header" | "title" | "name" | "\r\n" | "array" | "int" | "string" | "bool";
32
+ header?: "id" | "custom_report_config" | "custom_report_to_export" | "element_class_id" | "elements_to_export" | "element_type" | "export_format" | "folder_to_export" | "grid_export_data" | "grid_export_data_info" | "config" | "columns" | "filters" | "delimiter" | "header" | "no_header" | "title" | "name" | "\r\n" | "array" | "int" | "string" | "bool";
33
33
  delimiter?: string;
34
34
  };
35
35
  elementType?: "data-object" | "object" | "asset" | "document";
36
+ classId?: string | null;
36
37
  };
37
38
  };
38
39
  export type ExportCsvFolderApiResponse = {
@@ -40,12 +41,13 @@ export type ExportCsvFolderApiResponse = {
40
41
  jobRunId: number;
41
42
  };
42
43
  export type ExportCsvFolderApiArg = {
44
+ /** Id of the folder */
45
+ id: number;
43
46
  body: {
44
- folders?: number[];
45
47
  columns?: GridColumnRequest[];
46
48
  filters?: ExportAllFilter;
47
49
  config?: {
48
- header?: "id" | "custom_report_config" | "custom_report_to_export" | "element_class_id" | "element_to_export" | "element_type" | "folder_to_export" | "grid_export_data" | "grid_export_data_info" | "config" | "columns" | "filters" | "delimiter" | "header" | "no_header" | "title" | "name" | "\r\n" | "array" | "int" | "string" | "bool";
50
+ header?: "id" | "custom_report_config" | "custom_report_to_export" | "element_class_id" | "elements_to_export" | "element_type" | "export_format" | "folder_to_export" | "grid_export_data" | "grid_export_data_info" | "config" | "columns" | "filters" | "delimiter" | "header" | "no_header" | "title" | "name" | "\r\n" | "array" | "int" | "string" | "bool";
49
51
  delimiter?: string;
50
52
  };
51
53
  elementType?: "data-object" | "object" | "asset" | "document";
@@ -71,9 +73,10 @@ export type ExportXlsxApiArg = {
71
73
  elements?: number[];
72
74
  columns?: GridColumnRequest[];
73
75
  config?: {
74
- header?: "id" | "custom_report_config" | "custom_report_to_export" | "element_class_id" | "element_to_export" | "element_type" | "folder_to_export" | "grid_export_data" | "grid_export_data_info" | "config" | "columns" | "filters" | "delimiter" | "header" | "no_header" | "title" | "name" | "\r\n" | "array" | "int" | "string" | "bool";
76
+ header?: "id" | "custom_report_config" | "custom_report_to_export" | "element_class_id" | "elements_to_export" | "element_type" | "export_format" | "folder_to_export" | "grid_export_data" | "grid_export_data_info" | "config" | "columns" | "filters" | "delimiter" | "header" | "no_header" | "title" | "name" | "\r\n" | "array" | "int" | "string" | "bool";
75
77
  };
76
78
  elementType?: "data-object" | "object" | "asset" | "document";
79
+ classId?: string | null;
77
80
  };
78
81
  };
79
82
  export type ExportXlsxFolderApiResponse =
@@ -82,12 +85,13 @@ export type ExportXlsxFolderApiResponse =
82
85
  jobRunId: number;
83
86
  };
84
87
  export type ExportXlsxFolderApiArg = {
88
+ /** Id of the folder */
89
+ id: number;
85
90
  body: {
86
- folders?: number[];
87
91
  columns?: GridColumnRequest[];
88
92
  filters?: ExportAllFilter;
89
93
  config?: {
90
- header?: "id" | "custom_report_config" | "custom_report_to_export" | "element_class_id" | "element_to_export" | "element_type" | "folder_to_export" | "grid_export_data" | "grid_export_data_info" | "config" | "columns" | "filters" | "delimiter" | "header" | "no_header" | "title" | "name" | "\r\n" | "array" | "int" | "string" | "bool";
94
+ header?: "id" | "custom_report_config" | "custom_report_to_export" | "element_class_id" | "elements_to_export" | "element_type" | "export_format" | "folder_to_export" | "grid_export_data" | "grid_export_data_info" | "config" | "columns" | "filters" | "delimiter" | "header" | "no_header" | "title" | "name" | "\r\n" | "array" | "int" | "string" | "bool";
91
95
  };
92
96
  elementType?: "data-object" | "object" | "asset" | "document";
93
97
  classId?: string | null;
@@ -8,9 +8,4 @@
8
8
  * @license Pimcore Open Core License (POCL)
9
9
  */
10
10
  import React from 'react';
11
- import { type FetchBaseQueryError } from '@reduxjs/toolkit/query';
12
- interface IFilterContainerProps {
13
- errorData?: FetchBaseQueryError;
14
- }
15
- export declare const FilterContainer: ({ errorData }: IFilterContainerProps) => React.JSX.Element;
16
- export {};
11
+ export declare const FilterContainer: () => React.JSX.Element;
@@ -8,6 +8,7 @@
8
8
  * @license Pimcore Open Core License (POCL)
9
9
  */
10
10
  import { type JobInterface, type JobRunOptions } from '../job-interface';
11
+ import { MessageBusJobHandler, type MessageBusJobHandlerOptions } from '../../message-handlers/message-bus-job/message-bus-job-handler';
11
12
  export interface AbstractBatchEditJobOptions {
12
13
  title: string;
13
14
  assetContextId: number;
@@ -21,6 +22,7 @@ export declare abstract class AbstractBatchEditJob implements JobInterface {
21
22
  protected readonly refreshGrid: () => Promise<void>;
22
23
  constructor(options: AbstractBatchEditJobOptions);
23
24
  run(options: JobRunOptions): Promise<void>;
25
+ protected createHandler(options: MessageBusJobHandlerOptions): MessageBusJobHandler;
24
26
  protected abstract executeEditRequest(): Promise<number | null>;
25
27
  protected handleCompletion(): Promise<void>;
26
28
  protected handleJobFailure(error: any): Promise<void>;
@@ -0,0 +1,15 @@
1
+ /**
2
+ * This source file is available under the terms of the
3
+ * Pimcore Open Core License (POCL)
4
+ * Full copyright and license information is available in
5
+ * LICENSE.md which is distributed with this source code.
6
+ *
7
+ * @copyright Copyright (c) Pimcore GmbH (https://www.pimcore.com)
8
+ * @license Pimcore Open Core License (POCL)
9
+ */
10
+ import { AbstractBatchEditJob, type AbstractBatchEditJobOptions } from './abstract-batch-edit-job';
11
+ import { MessageBusJobHandler, type MessageBusJobHandlerOptions } from '../../message-handlers/message-bus-job/message-bus-job-handler';
12
+ export type AbstractFolderBatchEditJobOptions = AbstractBatchEditJobOptions;
13
+ export declare abstract class AbstractFolderBatchEditJob extends AbstractBatchEditJob {
14
+ protected createHandler(options: MessageBusJobHandlerOptions): MessageBusJobHandler;
15
+ }
@@ -7,14 +7,15 @@
7
7
  * @copyright Copyright (c) Pimcore GmbH (https://www.pimcore.com)
8
8
  * @license Pimcore Open Core License (POCL)
9
9
  */
10
- import { AbstractBatchEditJob, type AbstractBatchEditJobOptions } from './abstract-batch-edit-job';
10
+ import { AbstractFolderBatchEditJob } from './abstract-folder-batch-edit-job';
11
+ import { type AbstractBatchEditJobOptions } from './abstract-batch-edit-job';
11
12
  export interface AssetFolderBatchEditJobOptions extends AbstractBatchEditJobOptions {
12
13
  patchAssetsInFolder: (args: any) => Promise<any>;
13
14
  folderId: number;
14
15
  patches: any[];
15
16
  filters: any;
16
17
  }
17
- export declare class AssetFolderBatchEditJob extends AbstractBatchEditJob {
18
+ export declare class AssetFolderBatchEditJob extends AbstractFolderBatchEditJob {
18
19
  private readonly patchAssetsInFolder;
19
20
  private readonly folderId;
20
21
  private readonly patches;
@@ -7,7 +7,8 @@
7
7
  * @copyright Copyright (c) Pimcore GmbH (https://www.pimcore.com)
8
8
  * @license Pimcore Open Core License (POCL)
9
9
  */
10
- import { AbstractBatchEditJob, type AbstractBatchEditJobOptions } from './abstract-batch-edit-job';
10
+ import { AbstractFolderBatchEditJob } from './abstract-folder-batch-edit-job';
11
+ import { type AbstractBatchEditJobOptions } from './abstract-batch-edit-job';
11
12
  export interface DataObjectFolderBatchEditJobOptions extends AbstractBatchEditJobOptions {
12
13
  patchObjectsInFolder: (args: any) => Promise<any>;
13
14
  folderId: number;
@@ -15,7 +16,7 @@ export interface DataObjectFolderBatchEditJobOptions extends AbstractBatchEditJo
15
16
  filters: any;
16
17
  classId: string;
17
18
  }
18
- export declare class DataObjectFolderBatchEditJob extends AbstractBatchEditJob {
19
+ export declare class DataObjectFolderBatchEditJob extends AbstractFolderBatchEditJob {
19
20
  private readonly patchObjectsInFolder;
20
21
  private readonly folderId;
21
22
  private readonly values;
@@ -12,6 +12,12 @@ export interface DownloadJobOptions {
12
12
  title: string;
13
13
  action: () => Promise<number>;
14
14
  downloadUrl: string;
15
+ /**
16
+ * Set to true for folder exports that spawn a child job (collect → create file).
17
+ * Shows "Step 1/2" / "Step 2/2" in the UI.
18
+ * Leave unset for selected-row exports (single job run, no child).
19
+ */
20
+ hasChildJob?: boolean;
15
21
  }
16
22
  export declare class DownloadJob implements JobInterface {
17
23
  private readonly options;
@@ -0,0 +1,41 @@
1
+ /**
2
+ * This source file is available under the terms of the
3
+ * Pimcore Open Core License (POCL)
4
+ * Full copyright and license information is available in
5
+ * LICENSE.md which is distributed with this source code.
6
+ *
7
+ * @copyright Copyright (c) Pimcore GmbH (https://www.pimcore.com)
8
+ * @license Pimcore Open Core License (POCL)
9
+ */
10
+ import { type JobStatus, type AbstractJob } from '../../../../modules/execution-engine/jobs/abstact-job';
11
+ import { type JobButtonCustomizationContext } from './message-bus-job-notification';
12
+ import { type ProgressCalculator } from './progress-calculator/progress-calculator.interface';
13
+ import { type StepTracker } from './step-tracker/step-tracker.interface';
14
+ export interface MessageBusJob extends AbstractJob {
15
+ progress?: number;
16
+ indeterminate?: boolean;
17
+ currentStep?: number;
18
+ totalSteps?: number;
19
+ stepDescriptionKey?: string;
20
+ onRetry?: () => void | Promise<void>;
21
+ onCustomizeButtons?: (context: JobButtonCustomizationContext) => void;
22
+ messages?: string[];
23
+ jobRunId: number;
24
+ }
25
+ export interface JobCompletionData {
26
+ isSuccessful: boolean;
27
+ isFinished: boolean;
28
+ isFailed: boolean;
29
+ status: JobStatus;
30
+ payload: any;
31
+ }
32
+ export interface MessageBusJobHandlerOptions {
33
+ jobRunId: number;
34
+ title: string | ((job: MessageBusJob) => string);
35
+ stepDescriptions?: Record<number, string>;
36
+ stepTracker?: StepTracker;
37
+ progressCalculator?: ProgressCalculator;
38
+ onJobCompletion?: (data: JobCompletionData) => void | Promise<void>;
39
+ onRetry?: () => void | Promise<void>;
40
+ onCustomizeButtons?: (context: JobButtonCustomizationContext) => void;
41
+ }
@@ -9,23 +9,20 @@
9
9
  */
10
10
  import { AbstractMessageHandler } from '../../../../modules/global-message-bus/message-handlers/abstract-message-handler';
11
11
  import { type AbstractMercureMessage } from '../../../../modules/background-processor/process/abstract-mercure-process';
12
- import { JobStatus, type AbstractJob } from '../../../../modules/execution-engine/jobs/abstact-job';
13
- import { type JobButtonCustomizationContext } from './message-bus-job-notification';
14
- /**
15
- * Default job handler that provides common functionality for job management, Redux integration, status mapping, and progress handling
16
- * Can be used directly or extended by specific job handlers
17
- */
12
+ import { type MessageBusJobHandlerOptions } from './message-bus-job-handler-types';
13
+ export type { MessageBusJob, JobCompletionData, MessageBusJobHandlerOptions } from './message-bus-job-handler-types';
18
14
  export declare class MessageBusJobHandler extends AbstractMessageHandler {
19
15
  private jobRunId;
20
16
  private job;
21
17
  private readonly onJobCompletion?;
22
18
  private readonly onRetry?;
23
19
  private readonly onCustomizeButtons?;
24
- private currentStep;
25
- private readonly totalSteps?;
20
+ private readonly stepTracker;
21
+ private readonly stepDescriptions?;
22
+ private readonly progressCalculator;
26
23
  private lastProgressValue;
27
24
  private readonly title;
28
- private readonly polling;
25
+ private polling;
29
26
  private readonly throttledProgressUpdate;
30
27
  constructor(options: MessageBusJobHandlerOptions);
31
28
  shouldHandle(message: AbstractMercureMessage): boolean;
@@ -34,11 +31,6 @@ export declare class MessageBusJobHandler extends AbstractMessageHandler {
34
31
  handleMessage(message: AbstractMercureMessage): Promise<void>;
35
32
  onUnregister(): void;
36
33
  private getTitle;
37
- /**
38
- * Calculate progress percent from message data
39
- * Handles both step-based progress (if totalSteps > 1) and direct progress values (0-100)
40
- */
41
- private calculateProgress;
42
34
  private handleJobCompletion;
43
35
  private getJob;
44
36
  private createJob;
@@ -50,27 +42,3 @@ export declare class MessageBusJobHandler extends AbstractMessageHandler {
50
42
  private handlePolledStatusUpdate;
51
43
  private processUpdate;
52
44
  }
53
- export interface MessageBusJob extends AbstractJob {
54
- progress?: number;
55
- currentStep?: number;
56
- totalSteps?: number;
57
- onRetry?: () => void | Promise<void>;
58
- onCustomizeButtons?: (context: JobButtonCustomizationContext) => void;
59
- messages?: string[];
60
- jobRunId: number;
61
- }
62
- export interface JobCompletionData {
63
- isSuccessful: boolean;
64
- isFinished: boolean;
65
- isFailed: boolean;
66
- status: JobStatus;
67
- payload: any;
68
- }
69
- export interface MessageBusJobHandlerOptions {
70
- jobRunId: number;
71
- title: string | ((job: MessageBusJob) => string);
72
- totalSteps?: number;
73
- onJobCompletion?: (data: JobCompletionData) => void | Promise<void>;
74
- onRetry?: () => void | Promise<void>;
75
- onCustomizeButtons?: (context: JobButtonCustomizationContext) => void;
76
- }
@@ -11,6 +11,7 @@ import React from 'react';
11
11
  import { type ButtonAction } from '../../../../modules/execution-engine/notification/job/job-view';
12
12
  import { type MessageBusJob } from './message-bus-job-handler';
13
13
  export interface JobButtonCustomizationContext {
14
+ jobRunId: number;
14
15
  addSuccessButton: (action: ButtonAction, position?: 'start' | 'end') => void;
15
16
  addFinishedWithErrorsButton: (action: ButtonAction, position?: 'start' | 'end') => void;
16
17
  addFailureButton: (action: ButtonAction, position?: 'start' | 'end') => void;
@@ -0,0 +1,46 @@
1
+ /**
2
+ * This source file is available under the terms of the
3
+ * Pimcore Open Core License (POCL)
4
+ * Full copyright and license information is available in
5
+ * LICENSE.md which is distributed with this source code.
6
+ *
7
+ * @copyright Copyright (c) Pimcore GmbH (https://www.pimcore.com)
8
+ * @license Pimcore Open Core License (POCL)
9
+ */
10
+ /**
11
+ * Sentinel value returned by a ProgressCalculator to signal that the progress
12
+ * bar should not be updated at all (e.g. no relevant data in the message).
13
+ *
14
+ * Distinct from `null` which signals an indeterminate (spinner) state.
15
+ */
16
+ export declare const PROGRESS_NO_UPDATE: unique symbol;
17
+ /**
18
+ * The result of a progress calculation:
19
+ *
20
+ * - `number` – determinate progress value (0–100)
21
+ * - `null` – indeterminate state (show spinner)
22
+ * - `PROGRESS_NO_UPDATE` – skip update entirely, leave bar as-is
23
+ */
24
+ export type ProgressResult = number | null | typeof PROGRESS_NO_UPDATE;
25
+ export interface ProgressCalculatorContext {
26
+ /** Current step as tracked by the step tracker */
27
+ currentStep: number;
28
+ /** Total steps if known */
29
+ totalSteps?: number;
30
+ /** Last progress value successfully applied (-1 if none yet) */
31
+ lastProgressValue: number;
32
+ }
33
+ export interface ProgressCalculator {
34
+ /**
35
+ * Calculate the progress result from a raw SSE message payload.
36
+ *
37
+ * @param data Raw message payload from the backend
38
+ * @param context Current handler state
39
+ */
40
+ calculateProgress: (data: any, context: ProgressCalculatorContext) => ProgressResult;
41
+ /**
42
+ * Called when the step advances (same-job step change or child job transition).
43
+ * Calculators that maintain internal state should reset it here.
44
+ */
45
+ onStepChange?: () => void;
46
+ }
@@ -0,0 +1,30 @@
1
+ /**
2
+ * This source file is available under the terms of the
3
+ * Pimcore Open Core License (POCL)
4
+ * Full copyright and license information is available in
5
+ * LICENSE.md which is distributed with this source code.
6
+ *
7
+ * @copyright Copyright (c) Pimcore GmbH (https://www.pimcore.com)
8
+ * @license Pimcore Open Core License (POCL)
9
+ */
10
+ import { type ProgressCalculator, type ProgressCalculatorContext, type ProgressResult } from './progress-calculator.interface';
11
+ /**
12
+ * Reads the backend `progress` field (0–100) directly.
13
+ *
14
+ * Distinguishes between gradual steps and instant steps:
15
+ * - Gradual step: backend sends progress 0 → 100 over multiple messages → smooth bar
16
+ * - Instant step: backend sends only progress 100 in one message → spinner (null)
17
+ *
18
+ * When the step tracker has a known totalSteps and the backend reports finer-grained
19
+ * sub-steps within a child job (different totalSteps value), the two are combined:
20
+ * combined = ((subStep - 1) / subTotal) * 100 + progress / subTotal
21
+ *
22
+ * Internal gradual-progress state resets on every step change via onStepChange().
23
+ *
24
+ * Used for: batch-edit folder, zip-upload, CSV/XLSX export (all variants).
25
+ */
26
+ export declare class ProgressFieldCalculator implements ProgressCalculator {
27
+ private hadGradualProgress;
28
+ calculateProgress(data: any, context: ProgressCalculatorContext): ProgressResult;
29
+ onStepChange(): void;
30
+ }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * This source file is available under the terms of the
3
+ * Pimcore Open Core License (POCL)
4
+ * Full copyright and license information is available in
5
+ * LICENSE.md which is distributed with this source code.
6
+ *
7
+ * @copyright Copyright (c) Pimcore GmbH (https://www.pimcore.com)
8
+ * @license Pimcore Open Core License (POCL)
9
+ */
10
+ import { type ProgressCalculator, type ProgressCalculatorContext, type ProgressResult } from './progress-calculator.interface';
11
+ /**
12
+ * Calculates progress from completed steps: step N done = N / totalSteps * 100%.
13
+ *
14
+ * Each step is considered complete when the backend sends progress: 100.
15
+ * While a step is still running (progress < 100), the bar holds at the
16
+ * previous step boundary.
17
+ *
18
+ * step 1/7 completes → 14%
19
+ * step 2/7 completes → 29%
20
+ * step 7/7 completes → 100%
21
+ *
22
+ * Falls back to the raw progress field for single-step jobs (totalSteps === 1
23
+ * or totalSteps unknown).
24
+ *
25
+ * Used for: delete, batch-delete — one step per element, instant completion.
26
+ */
27
+ export declare class StepCompletionCalculator implements ProgressCalculator {
28
+ calculateProgress(data: any, context: ProgressCalculatorContext): ProgressResult;
29
+ }
@@ -0,0 +1,40 @@
1
+ /**
2
+ * This source file is available under the terms of the
3
+ * Pimcore Open Core License (POCL)
4
+ * Full copyright and license information is available in
5
+ * LICENSE.md which is distributed with this source code.
6
+ *
7
+ * @copyright Copyright (c) Pimcore GmbH (https://www.pimcore.com)
8
+ * @license Pimcore Open Core License (POCL)
9
+ */
10
+ import { type StepTracker, type StepTrackerState } from './step-tracker.interface';
11
+ export interface ChildJobStepTrackerOptions {
12
+ /**
13
+ * Total number of steps if known upfront (e.g. 2 for jobs that always
14
+ * spawn exactly one child job). When omitted the total is unknown and
15
+ * the UI will show "Step 1", "Step 2" etc. without a fraction.
16
+ */
17
+ totalSteps?: number;
18
+ }
19
+ /**
20
+ * Step tracker for jobs that spawn child job runs via transitionToChildJob.
21
+ *
22
+ * Each child job transition advances the step counter by one. Backend step
23
+ * messages from the child job (which reset to step 1) are intentionally
24
+ * ignored — this tracker owns the step counter exclusively.
25
+ *
26
+ * Always shows the step label in the UI.
27
+ *
28
+ * Used for:
29
+ * - zip-upload: parent extracts (step 1) → child creates assets (step 2)
30
+ * - CSV/XLSX folder export: parent collects (step 1) → child creates file (step 2)
31
+ * - clone: may or may not spawn a child (totalSteps omitted when unknown)
32
+ */
33
+ export declare class ChildJobStepTracker implements StepTracker {
34
+ readonly showStepLabel = true;
35
+ private _state;
36
+ constructor(options?: ChildJobStepTrackerOptions);
37
+ get state(): StepTrackerState;
38
+ onBackendStep(_backendStep: number): StepTrackerState | null;
39
+ onChildJobTransition(): StepTrackerState;
40
+ }
@@ -0,0 +1,43 @@
1
+ /**
2
+ * This source file is available under the terms of the
3
+ * Pimcore Open Core License (POCL)
4
+ * Full copyright and license information is available in
5
+ * LICENSE.md which is distributed with this source code.
6
+ *
7
+ * @copyright Copyright (c) Pimcore GmbH (https://www.pimcore.com)
8
+ * @license Pimcore Open Core License (POCL)
9
+ */
10
+ import { type StepTracker, type StepTrackerState } from './step-tracker.interface';
11
+ export interface DefaultStepTrackerOptions {
12
+ /**
13
+ * Whether to show the step label (Step X/Y) in the UI.
14
+ * Default: false.
15
+ *
16
+ * Set to true for jobs where the backend step structure is meaningful
17
+ * to the user (e.g. batch-edit: preparing → applying).
18
+ * Leave false for jobs where backend steps are an internal implementation
19
+ * detail (e.g. delete: one step per element).
20
+ */
21
+ showStepLabel?: boolean;
22
+ }
23
+ /**
24
+ * Default step tracker. Follows the backend's currentStep value, accepting
25
+ * only forward movement (ignores any step that would go backwards).
26
+ *
27
+ * totalSteps is derived from the first backend message that carries it —
28
+ * no hardcoding required in the job definition.
29
+ *
30
+ * Used for:
31
+ * - Jobs with no child job transitions (single job run)
32
+ * - delete/batch-delete: showStepLabel=false (internal steps, no UI label)
33
+ * - batch-edit folder: showStepLabel=true (preparing → applying, shown in UI)
34
+ */
35
+ export declare class DefaultStepTracker implements StepTracker {
36
+ readonly showStepLabel: boolean;
37
+ private _state;
38
+ constructor(options?: DefaultStepTrackerOptions);
39
+ get state(): StepTrackerState;
40
+ onBackendStep(backendStep: number): StepTrackerState | null;
41
+ onChildJobTransition(): StepTrackerState;
42
+ onBackendTotalSteps(totalSteps: number): void;
43
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * This source file is available under the terms of the
3
+ * Pimcore Open Core License (POCL)
4
+ * Full copyright and license information is available in
5
+ * LICENSE.md which is distributed with this source code.
6
+ *
7
+ * @copyright Copyright (c) Pimcore GmbH (https://www.pimcore.com)
8
+ * @license Pimcore Open Core License (POCL)
9
+ */
10
+ export interface StepTrackerState {
11
+ /** Current step (1-based) */
12
+ currentStep: number;
13
+ /** Total steps, if known */
14
+ totalSteps?: number;
15
+ }
16
+ export interface StepTracker {
17
+ /**
18
+ * Called on every incoming backend message that carries a currentStep value.
19
+ * Returns the new StepTrackerState if it changed, or null if nothing changed.
20
+ */
21
+ onBackendStep: (backendStep: number) => StepTrackerState | null;
22
+ /**
23
+ * Called when the handler transitions to a child job run.
24
+ * Returns the new StepTrackerState.
25
+ */
26
+ onChildJobTransition: () => StepTrackerState;
27
+ /**
28
+ * Whether to show the step label (Step X/Y) in the UI.
29
+ */
30
+ readonly showStepLabel: boolean;
31
+ /**
32
+ * Current tracked state.
33
+ */
34
+ readonly state: StepTrackerState;
35
+ }
@@ -19,7 +19,9 @@ export interface JobViewProps extends JobProps {
19
19
  finishedWithErrorsButtonActions?: ButtonAction[];
20
20
  onAbort?: () => void | Promise<void>;
21
21
  progress: number;
22
+ indeterminate?: boolean;
22
23
  currentStep?: number;
23
24
  totalSteps?: number;
25
+ stepDescriptionKey?: string;
24
26
  }
25
27
  export declare const JobView: (props: JobViewProps) => React.JSX.Element;
@@ -0,0 +1,17 @@
1
+ /**
2
+ * This source file is available under the terms of the
3
+ * Pimcore Open Core License (POCL)
4
+ * Full copyright and license information is available in
5
+ * LICENSE.md which is distributed with this source code.
6
+ *
7
+ * @copyright Copyright (c) Pimcore GmbH (https://www.pimcore.com)
8
+ * @license Pimcore Open Core License (POCL)
9
+ */
10
+ import { type ItemType } from '../../../../components/dropdown/dropdown';
11
+ import { type ManyToOneRelationValue } from '../../../../components/many-to-one-relation/many-to-one-relation';
12
+ import React from 'react';
13
+ export interface UseShareViaNotificationReturn {
14
+ shareViaNotificationContextMenuItem: ItemType;
15
+ shareViaNotificationModal: React.JSX.Element;
16
+ }
17
+ export declare const useShareViaNotification: (attachment: ManyToOneRelationValue | undefined) => UseShareViaNotificationReturn;
@@ -8,9 +8,11 @@
8
8
  * @license Pimcore Open Core License (POCL)
9
9
  */
10
10
  import React from 'react';
11
+ import { type ManyToOneRelationValue } from '../../../components/many-to-one-relation/many-to-one-relation';
11
12
  interface SendNotificationModalProps {
12
13
  open: boolean;
13
14
  onClose: () => void;
15
+ initialAttachment?: ManyToOneRelationValue;
14
16
  }
15
- export declare const SendNotificationModal: ({ open, ...props }: SendNotificationModalProps) => React.JSX.Element;
17
+ export declare const SendNotificationModal: ({ open, initialAttachment, ...props }: SendNotificationModalProps) => React.JSX.Element;
16
18
  export {};
@@ -8,10 +8,13 @@
8
8
  * @license Pimcore Open Core License (POCL)
9
9
  */
10
10
  import React from 'react';
11
+ import { type SortingState } from '@tanstack/react-table';
11
12
  import { type QuantityValueUnitRow } from '../hooks/use-quantity-value-unit';
12
13
  interface TableProps {
13
14
  quantityValueUnitRows: QuantityValueUnitRow[];
14
15
  setQuantityValueUnitRows: React.Dispatch<React.SetStateAction<QuantityValueUnitRow[]>>;
16
+ sorting?: SortingState;
17
+ onSortingChange?: (sorting: SortingState) => void;
15
18
  }
16
- export declare const Table: ({ quantityValueUnitRows, setQuantityValueUnitRows }: TableProps) => React.JSX.Element;
19
+ export declare const Table: ({ quantityValueUnitRows, setQuantityValueUnitRows, sorting, onSortingChange }: TableProps) => React.JSX.Element;
17
20
  export {};
@@ -13,7 +13,7 @@ interface ITreeContainerProps {
13
13
  treeData: TreeDataItem[];
14
14
  expandedKeys: React.Key[];
15
15
  isFetching: boolean;
16
- onReloadTree: () => Promise<void>;
16
+ onReloadTree: () => void;
17
17
  onSetExpandedKeys: (keys: React.Key[]) => void;
18
18
  }
19
19
  declare const TreeContainer: ({ expandedKeys, treeData, isFetching, onReloadTree, onSetExpandedKeys }: ITreeContainerProps) => React.JSX.Element;
@@ -9,6 +9,7 @@
9
9
  */
10
10
  import React from 'react';
11
11
  import { type SelectOption, type WebsiteSettingRow } from '../website-settings-container';
12
+ import { type SortingState } from '@tanstack/react-table';
12
13
  type WebsiteSettingEnrichedRow = WebsiteSettingRow & {
13
14
  siteDomain: string;
14
15
  };
@@ -19,6 +20,8 @@ interface TableProps {
19
20
  websiteSettingRows: WebsiteSettingRow[];
20
21
  setWebsiteSettingRows: React.Dispatch<React.SetStateAction<WebsiteSettingRow[]>>;
21
22
  typeSelectOptions: SelectOption[];
23
+ sorting?: SortingState;
24
+ onSortingChange?: (sorting: SortingState) => void;
22
25
  }
23
- export declare const Table: ({ websiteSettingRows, setWebsiteSettingRows, typeSelectOptions }: TableProps) => React.JSX.Element;
26
+ export declare const Table: ({ websiteSettingRows, setWebsiteSettingRows, typeSelectOptions, sorting, onSortingChange }: TableProps) => React.JSX.Element;
24
27
  export {};
@@ -9,7 +9,7 @@
9
9
  */
10
10
  import { type WidgetConfig } from '../../../modules/perspectives/perspectives-slice.enhanced';
11
11
  interface UseWidgetEditorReturn {
12
- createWidget: (name: string, widgetType: string, onFinish?: (newName: string) => void) => Promise<void>;
12
+ createWidget: (name: string, widgetType: string, onFinish?: (id: string) => void) => Promise<void>;
13
13
  getWidgetById: (widgetId: string, widgetType: string) => Promise<WidgetConfig | undefined>;
14
14
  updateWidget: (widgetId: string, widgetType: string, config: any, onFinish?: (updated: any) => void) => Promise<void>;
15
15
  removeWithConfirmation: (widgetId: string, widgetType: string, onFinish?: () => void) => void;
@@ -190,6 +190,7 @@ export * from '../../core/components/vertical-timeline/vertical-timeline';
190
190
  export * from '../../core/components/predefined-layouts/config/config-layout';
191
191
  export * from '../../core/components/tabpanel/tabpanel';
192
192
  export * from '../../core/components/operational-grid/operational-grid';
193
+ export * from '../../core/components/operational-grid/csv-import-button/csv-import-button';
193
194
  export * from '../../core/components/operational-grid/hooks/use-operations';
194
195
  export * from '../../core/components/url-link/url-link';
195
196
  export * from '../../core/components/pimcore-audio/pimcore-audio';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pimcore/studio-ui-bundle",
3
- "version": "2025.4.0",
3
+ "version": "2025.4.1",
4
4
  "keywords": [
5
5
  "pimcore",
6
6
  "pimcore-studio-ui"