@cuby-ui/core 0.0.490 → 0.0.492

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 (35) hide show
  1. package/components/sidebar/sidebar-header/sidebar-header.component.d.ts +1 -1
  2. package/components/sidebar/sidebar-navigation-item/sidebar-navigation-item.component.d.ts +1 -1
  3. package/esm2022/widgets/ui/criterion-info/criterion-info.component.mjs +18 -9
  4. package/esm2022/widgets/ui/criterion-info-form/criterion-info-form.component.mjs +26 -14
  5. package/esm2022/widgets/ui/criterion-info-form/criterion-info-form.options.mjs +1 -1
  6. package/esm2022/widgets/ui/criterion-readonly-info/criterion-readonly-info.component.mjs +25 -20
  7. package/esm2022/widgets/ui/index.mjs +8 -4
  8. package/esm2022/widgets/ui/instruction-info/instruction-info.component.mjs +7 -8
  9. package/esm2022/widgets/ui/instruction-info-form/instruction-info-form.component.mjs +17 -11
  10. package/esm2022/widgets/ui/instruction-readonly-info/instruction-readonly-info.component.mjs +25 -20
  11. package/esm2022/widgets/ui/utility-modal/components/criterion-modal-create/criterion-modal-create.component.mjs +4 -3
  12. package/esm2022/widgets/ui/utility-modal/components/index.mjs +3 -1
  13. package/esm2022/widgets/ui/utility-modal/components/instruction-modal-create/instruction-modal-create.component.mjs +4 -4
  14. package/esm2022/widgets/ui/utility-modal/components/readonly-criterion-modal/readonly-criterion-modal.component.mjs +13 -7
  15. package/esm2022/widgets/ui/utility-modal/components/readonly-instruction-modal/readonly-instruction-modal.component.mjs +11 -5
  16. package/esm2022/widgets/ui/utility-thumbnail/utility-thumbnail.component.mjs +6 -7
  17. package/fesm2022/cuby-ui-core.mjs +235 -191
  18. package/fesm2022/cuby-ui-core.mjs.map +1 -1
  19. package/package.json +4 -4
  20. package/widgets/ui/categories/components/category-item/category-item.component.d.ts +2 -2
  21. package/widgets/ui/criterion-info/criterion-info.component.d.ts +6 -7
  22. package/widgets/ui/criterion-info-form/criterion-info-form.component.d.ts +6 -2
  23. package/widgets/ui/criterion-info-form/criterion-info-form.options.d.ts +2 -0
  24. package/widgets/ui/criterion-readonly-info/criterion-readonly-info.component.d.ts +10 -9
  25. package/widgets/ui/index.d.ts +7 -3
  26. package/widgets/ui/instruction-info/instruction-info.component.d.ts +2 -4
  27. package/widgets/ui/instruction-info-form/instruction-info-form.component.d.ts +2 -2
  28. package/widgets/ui/instruction-readonly-info/instruction-readonly-info.component.d.ts +10 -9
  29. package/widgets/ui/storage-list/components/storage-list-item/storage-list-item.component.d.ts +1 -1
  30. package/widgets/ui/utility-modal/components/criterion-modal-create/criterion-modal-create.component.d.ts +3 -1
  31. package/widgets/ui/utility-modal/components/index.d.ts +2 -0
  32. package/widgets/ui/utility-modal/components/instruction-modal-create/instruction-modal-create.component.d.ts +3 -2
  33. package/widgets/ui/utility-modal/components/readonly-criterion-modal/readonly-criterion-modal.component.d.ts +10 -3
  34. package/widgets/ui/utility-modal/components/readonly-instruction-modal/readonly-instruction-modal.component.d.ts +10 -3
  35. package/widgets/ui/utility-thumbnail/utility-thumbnail.component.d.ts +2 -3
@@ -11,7 +11,7 @@ import { __decorate, __metadata } from 'tslib';
11
11
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
12
12
  import { trigger, transition, query, animateChild, style, animate, stagger } from '@angular/animations';
13
13
  import { OAuthService, OAuthErrorEvent, OAuthSuccessEvent, OAuthInfoEvent, provideOAuthClient } from 'angular-oauth2-oidc';
14
- import { CuiExchangeContextApiService, CuiJTextApiService, CuiTreeStructNavigatorApiService, CuiNodeChecklistApiService, CuiTreeStructApiService, CuiFrameApiService, UserCompanyApiService, SHARED_CONSTRUCTION_HTTP_OPTIONS, SHARED_INSTRUCTION_HTTP_OPTIONS, CuiQuantumGroupResourcesStructureApiService, ResourceContentType, CuiFactoryApiService, SeasonType, SHARED_FACTORY_HTTP_OPTIONS, UtilityApiService, CuiCriterionApiService, CuiStorageObjectType, CuiJobApiService, JobType } from '@cuby-ui/api';
14
+ import { CuiExchangeContextApiService, CuiJTextApiService, CuiTreeStructNavigatorApiService, CuiNodeChecklistApiService, CuiTreeStructApiService, CuiFrameApiService, CuiResourceApiService, UserCompanyApiService, SHARED_CONSTRUCTION_HTTP_OPTIONS, SHARED_INSTRUCTION_HTTP_OPTIONS, CuiQuantumGroupResourcesStructureApiService, ResourceContentType, CuiFactoryApiService, SeasonType, SHARED_FACTORY_HTTP_OPTIONS, UtilityApiService, CuiCriterionApiService, CuiStorageObjectType, CuiJobApiService, JobType } from '@cuby-ui/api';
15
15
  import { HttpErrorResponse } from '@angular/common/http';
16
16
  import * as i4 from '@jsverse/transloco';
17
17
  import { TranslocoService, TranslocoModule, TranslocoDirective, TranslocoPipe } from '@jsverse/transloco';
@@ -9298,20 +9298,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
9298
9298
  ], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, providers: [CuiCheckListBlockService], template: "<cui-content-wrapper\n *transloco=\"let t\"\n backgroundColor=\"var(--cui-base-10)\"\n [gap]=\"16\"\n>\n <ng-container *cuiLet=\"checkListItems() as checkListItems\">\n <header class=\"header\">\n <h2 class=\"heading\">{{ t('CHECKLIST') }}</h2>\n\n @if (checkListItems) {\n <span class=\"item\">{{ checkListItems?.length }} {{ t('ITEM_VARIANT') }}</span>\n }\n </header>\n <cui-content-wrapper>\n <cui-checklist-block-list [config]=\"config()\" />\n </cui-content-wrapper>\n <div>\n <button\n #actionButton=\"elementRef\"\n cuiElement\n cuiButton\n type=\"button\"\n appearance=\"flat\"\n size=\"xxs\"\n icon=\"cuiIconPlus\"\n >\n {{ t('ADD_NEW_ITEM') }}\n </button>\n <cui-context-menu\n [items]=\"CHECKLIST_BLOCK_SELECT_OPTIONS\"\n [target]=\"actionButton.nativeElement\"\n />\n </div>\n </ng-container>\n</cui-content-wrapper>\n", styles: [".header{display:flex;flex-direction:row;gap:12px;align-items:center;justify-content:space-between}.heading{font-weight:500;font-size:16px;line-height:24px}.item{font-weight:400;font-size:12px;line-height:14px;color:var(--cui-base-500)}\n"] }]
9299
9299
  }], ctorParameters: () => [] });
9300
9300
 
9301
- class CuiUtilityReadonlyThumbnailComponent {
9302
- constructor() {
9303
- this.thumbnailUrl = input.required();
9304
- this.isVideo = input(false);
9305
- }
9306
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiUtilityReadonlyThumbnailComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
9307
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: CuiUtilityReadonlyThumbnailComponent, isStandalone: true, selector: "cui-utility-readonly-thumbnail", inputs: { thumbnailUrl: { classPropertyName: "thumbnailUrl", publicName: "thumbnailUrl", isSignal: true, isRequired: true, transformFunction: null }, isVideo: { classPropertyName: "isVideo", publicName: "isVideo", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@let url = thumbnailUrl();\n\n@if (url?.src; as src) {\n @if (isVideo()) {\n <video\n class=\"thumbnail\"\n [src]=\"src\"\n controls\n ></video>\n } @else {\n <img\n class=\"thumbnail\"\n [src]=\"src\"\n [alt]=\"url?.name\"\n />\n }\n}\n", styles: [".thumbnail{width:100%;max-height:271px;object-fit:contain}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
9308
- }
9309
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiUtilityReadonlyThumbnailComponent, decorators: [{
9310
- type: Component,
9311
- args: [{ selector: 'cui-utility-readonly-thumbnail', imports: [], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "@let url = thumbnailUrl();\n\n@if (url?.src; as src) {\n @if (isVideo()) {\n <video\n class=\"thumbnail\"\n [src]=\"src\"\n controls\n ></video>\n } @else {\n <img\n class=\"thumbnail\"\n [src]=\"src\"\n [alt]=\"url?.name\"\n />\n }\n}\n", styles: [".thumbnail{width:100%;max-height:271px;object-fit:contain}\n"] }]
9312
- }] });
9313
-
9314
- class CuiInstructionReadonlyInfoComponent {
9301
+ class CuiFramerPreviewComponent {
9315
9302
  constructor() {
9316
9303
  this.hostElement = inject(ElementRef).nativeElement;
9317
9304
  this.frameApiService = inject(CuiFrameApiService);
@@ -9320,16 +9307,20 @@ class CuiInstructionReadonlyInfoComponent {
9320
9307
  this.thumbnailUrl = signal(null);
9321
9308
  this.isDescriptionEmpty = computed(() => !this.jText()?.notEmpty);
9322
9309
  this.framerId = input.required();
9323
- this.element = input(this.hostElement);
9324
- this.tools = input.required();
9310
+ this.config = input.required();
9325
9311
  this.editorResourceUrl = input.required();
9312
+ this.title = input();
9326
9313
  this.initConfigEffect();
9327
9314
  this.initFramerIdEffect();
9328
9315
  }
9329
9316
  initConfigEffect() {
9330
9317
  effect(() => {
9331
- this.editorConfig = { readOnly: true, tools: this.tools(), element: this.element() };
9332
- });
9318
+ this.editorConfig = {
9319
+ element: this.hostElement,
9320
+ ...this.config(),
9321
+ readOnly: true
9322
+ };
9323
+ }, { allowSignalWrites: true });
9333
9324
  }
9334
9325
  initFramerIdEffect() {
9335
9326
  effect(() => {
@@ -9339,7 +9330,7 @@ class CuiInstructionReadonlyInfoComponent {
9339
9330
  }
9340
9331
  this.subscription?.unsubscribe();
9341
9332
  this.initFrameFragments();
9342
- });
9333
+ }, { allowSignalWrites: true });
9343
9334
  }
9344
9335
  initFrameFragments() {
9345
9336
  const frameId = this.framerId();
@@ -9349,31 +9340,33 @@ class CuiInstructionReadonlyInfoComponent {
9349
9340
  return;
9350
9341
  }
9351
9342
  const fragmentActions = {
9352
- ["J_TEXT" /* FragmentType.jText */]: (fragment) => {
9343
+ J_TEXT: (fragment) => {
9353
9344
  this.jText.set(fragment);
9354
9345
  },
9355
- ["RESOURCE_FILE" /* FragmentType.resourceFile */]: (fragment) => {
9346
+ RESOURCE_FILE: (fragment) => {
9356
9347
  this.setResourceFile(fragment);
9357
9348
  }
9358
9349
  };
9359
- this.subscription = this.frameApiService.getFrame(frameId).subscribe((frame) => {
9350
+ this.subscription = this.frameApiService
9351
+ .getFrame(frameId, this.editorConfig.requestOptions)
9352
+ .subscribe((frame) => {
9360
9353
  frame.fragments.forEach((fragment) => fragmentActions[fragment.type](fragment));
9361
9354
  });
9362
9355
  }
9363
9356
  setResourceFile(resource) {
9364
- const url = `${this.editorResourceUrl()}${resource.fileId}`;
9357
+ const url = `${this.editorResourceUrl()}/${resource.fileId}`;
9365
9358
  this.isVideo = resource?.name?.split('.').pop() === 'mp4';
9366
9359
  if (!url) {
9367
9360
  return;
9368
9361
  }
9369
9362
  this.thumbnailUrl.set({ src: resource.fileId && url, name: resource.name || resource.type });
9370
9363
  }
9371
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiInstructionReadonlyInfoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
9372
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: CuiInstructionReadonlyInfoComponent, isStandalone: true, selector: "cui-instruction-readonly-info", inputs: { framerId: { classPropertyName: "framerId", publicName: "framerId", isSignal: true, isRequired: true, transformFunction: null }, element: { classPropertyName: "element", publicName: "element", isSignal: true, isRequired: false, transformFunction: null }, tools: { classPropertyName: "tools", publicName: "tools", isSignal: true, isRequired: true, transformFunction: null }, editorResourceUrl: { classPropertyName: "editorResourceUrl", publicName: "editorResourceUrl", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<ng-container *transloco=\"let t\">\n @if (jText()) {\n @if (!isDescriptionEmpty()) {\n @if (thumbnailUrl(); as thumbnailUrl) {\n <cui-utility-readonly-thumbnail\n [thumbnailUrl]=\"thumbnailUrl\"\n [isVideo]=\"isVideo\"\n />\n }\n\n @if (jText()?.id; as id) {\n <div class=\"wrapper\">\n <cui-editor\n class=\"editor\"\n [editorApiId]=\"id\"\n [config]=\"editorConfig\"\n />\n </div>\n }\n } @else {\n <cui-empty-state [subtitle]=\"t('NO_DESCRIPTION_WAS_PROVIDED')\" />\n }\n }\n</ng-container>\n", styles: [":host{padding-top:16px;padding-right:16px;padding-left:16px;display:flex;flex-direction:column;gap:12px;height:100%;overflow:auto}.wrapper{padding:12px}.editor{display:block;height:100%;overflow:auto}\n"], dependencies: [{ kind: "component", type: CuiEditorComponent, selector: "cui-editor", inputs: ["editorApiId", "config", "requestSize"], outputs: ["editorEmpty"] }, { kind: "component", type: CuiEmptyStateComponent, selector: "cui-empty-state, [cuiEmptyState]", inputs: ["title", "subtitle"] }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "component", type: CuiUtilityReadonlyThumbnailComponent, selector: "cui-utility-readonly-thumbnail", inputs: ["thumbnailUrl", "isVideo"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
9364
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiFramerPreviewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
9365
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: CuiFramerPreviewComponent, isStandalone: true, selector: "cui-framer-preview", inputs: { framerId: { classPropertyName: "framerId", publicName: "framerId", isSignal: true, isRequired: true, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null }, editorResourceUrl: { classPropertyName: "editorResourceUrl", publicName: "editorResourceUrl", isSignal: true, isRequired: true, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<ng-container *transloco=\"let t\">\n @if (jText()) {\n @if (!isDescriptionEmpty()) {\n @let url = thumbnailUrl();\n\n @if (url?.src; as src) {\n @if (isVideo) {\n <video\n class=\"thumbnail\"\n [src]=\"src\"\n controls\n ></video>\n } @else {\n <img\n class=\"thumbnail\"\n [src]=\"src\"\n [alt]=\"url?.name\"\n />\n }\n }\n\n <div class=\"content\">\n @if (title(); as title) {\n <div class=\"title\">{{ title }}</div>\n }\n\n @if (jText()?.id; as id) {\n <div class=\"wrapper\">\n <cui-editor\n class=\"editor\"\n [editorApiId]=\"id\"\n [config]=\"editorConfig\"\n />\n </div>\n }\n </div>\n } @else {\n <cui-empty-state [subtitle]=\"t('NO_DESCRIPTION_WAS_PROVIDED')\" />\n }\n }\n</ng-container>\n", styles: [":host{display:flex;flex-direction:column;gap:0;height:100%;overflow:auto}.thumbnail{width:100%;max-height:271px;object-fit:contain}.content{display:flex;flex-direction:column;gap:14px;padding:16px 12px}.title{font-weight:500;font-size:18px;line-height:28px}.editor{display:block;height:100%;overflow:auto}\n"], dependencies: [{ kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "component", type: CuiEditorComponent, selector: "cui-editor", inputs: ["editorApiId", "config", "requestSize"], outputs: ["editorEmpty"] }, { kind: "component", type: CuiEmptyStateComponent, selector: "cui-empty-state, [cuiEmptyState]", inputs: ["title", "subtitle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
9373
9366
  }
9374
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiInstructionReadonlyInfoComponent, decorators: [{
9367
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiFramerPreviewComponent, decorators: [{
9375
9368
  type: Component,
9376
- args: [{ selector: 'cui-instruction-readonly-info', imports: [CuiEditorComponent, CuiEmptyStateComponent, TranslocoDirective, CuiUtilityReadonlyThumbnailComponent], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *transloco=\"let t\">\n @if (jText()) {\n @if (!isDescriptionEmpty()) {\n @if (thumbnailUrl(); as thumbnailUrl) {\n <cui-utility-readonly-thumbnail\n [thumbnailUrl]=\"thumbnailUrl\"\n [isVideo]=\"isVideo\"\n />\n }\n\n @if (jText()?.id; as id) {\n <div class=\"wrapper\">\n <cui-editor\n class=\"editor\"\n [editorApiId]=\"id\"\n [config]=\"editorConfig\"\n />\n </div>\n }\n } @else {\n <cui-empty-state [subtitle]=\"t('NO_DESCRIPTION_WAS_PROVIDED')\" />\n }\n }\n</ng-container>\n", styles: [":host{padding-top:16px;padding-right:16px;padding-left:16px;display:flex;flex-direction:column;gap:12px;height:100%;overflow:auto}.wrapper{padding:12px}.editor{display:block;height:100%;overflow:auto}\n"] }]
9369
+ args: [{ selector: 'cui-framer-preview', imports: [TranslocoDirective, CuiEditorComponent, CuiEmptyStateComponent], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *transloco=\"let t\">\n @if (jText()) {\n @if (!isDescriptionEmpty()) {\n @let url = thumbnailUrl();\n\n @if (url?.src; as src) {\n @if (isVideo) {\n <video\n class=\"thumbnail\"\n [src]=\"src\"\n controls\n ></video>\n } @else {\n <img\n class=\"thumbnail\"\n [src]=\"src\"\n [alt]=\"url?.name\"\n />\n }\n }\n\n <div class=\"content\">\n @if (title(); as title) {\n <div class=\"title\">{{ title }}</div>\n }\n\n @if (jText()?.id; as id) {\n <div class=\"wrapper\">\n <cui-editor\n class=\"editor\"\n [editorApiId]=\"id\"\n [config]=\"editorConfig\"\n />\n </div>\n }\n </div>\n } @else {\n <cui-empty-state [subtitle]=\"t('NO_DESCRIPTION_WAS_PROVIDED')\" />\n }\n }\n</ng-container>\n", styles: [":host{display:flex;flex-direction:column;gap:0;height:100%;overflow:auto}.thumbnail{width:100%;max-height:271px;object-fit:contain}.content{display:flex;flex-direction:column;gap:14px;padding:16px 12px}.title{font-weight:500;font-size:18px;line-height:28px}.editor{display:block;height:100%;overflow:auto}\n"] }]
9377
9370
  }], ctorParameters: () => [] });
9378
9371
 
9379
9372
  class CuiUtilityThumbnailComponent {
@@ -9384,10 +9377,10 @@ class CuiUtilityThumbnailComponent {
9384
9377
  this.MAX_FILE_SIZE = 20971520;
9385
9378
  this.thumbnailUrl = computed(() => {
9386
9379
  const thumbnail = this.thumbnail();
9387
- if (thumbnail?.resource) {
9388
- return thumbnail.resource;
9380
+ if (!thumbnail?.resource) {
9381
+ return null;
9389
9382
  }
9390
- return this.baseResourceUrl() + thumbnail.fileId;
9383
+ return thumbnail.resource;
9391
9384
  });
9392
9385
  this.uploadButtonName = computed(() => {
9393
9386
  const thumbnail = this.thumbnail();
@@ -9398,7 +9391,6 @@ class CuiUtilityThumbnailComponent {
9398
9391
  });
9399
9392
  this.thumbnail = model.required();
9400
9393
  this.framerId = input.required();
9401
- this.baseResourceUrl = input.required();
9402
9394
  }
9403
9395
  onSelectFile() {
9404
9396
  const types = 'image/jpg, image/jpeg, image/png, video/mp4';
@@ -9457,7 +9449,7 @@ class CuiUtilityThumbnailComponent {
9457
9449
  });
9458
9450
  }
9459
9451
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiUtilityThumbnailComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
9460
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: CuiUtilityThumbnailComponent, isStandalone: true, selector: "cui-utility-thumbnail", inputs: { thumbnail: { classPropertyName: "thumbnail", publicName: "thumbnail", isSignal: true, isRequired: true, transformFunction: null }, framerId: { classPropertyName: "framerId", publicName: "framerId", isSignal: true, isRequired: true, transformFunction: null }, baseResourceUrl: { classPropertyName: "baseResourceUrl", publicName: "baseResourceUrl", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { thumbnail: "thumbnailChange" }, ngImport: i0, template: "<section\n *transloco=\"let t\"\n class=\"file\"\n>\n <span class=\"title\">{{ t('THUMBNAIL') }}</span>\n <div class=\"upload\">\n <div class=\"upload-file\">\n @if (thumbnail()?.name; as fileId) {\n <div class=\"image\">\n <span class=\"image__name\">{{ thumbnail()?.name }}</span>\n <!-- TODO: ngSrc -->\n <img\n class=\"image__view\"\n [src]=\"thumbnailUrl()\"\n height=\"120\"\n width=\"184\"\n alt=\"Thumbnail\"\n />\n </div>\n }\n <div class=\"info\">\n <button\n type=\"button\"\n cuiButton\n appearance=\"outlined-gray\"\n size=\"xxs\"\n icon=\"cuiIconUpload\"\n (click)=\"onSelectFile()\"\n >\n {{ uploadButtonName() }}\n </button>\n @if (thumbnail()?.name) {\n <button\n class=\"remove-button\"\n cuiButton\n appearance=\"link\"\n size=\"sm\"\n type=\"button\"\n (click)=\"onRemoveThumbnail()\"\n >\n {{ t('REMOVE') }}\n </button>\n }\n\n <span class=\"accepted\">{{ t('ACCEPTED') }}: JPG, JPEG, PNG, MP4 {{ t('UP_TO') }} 20MB</span>\n </div>\n </div>\n </div>\n</section>\n", styles: [".file{display:flex;flex-direction:column;gap:4px}.title{font-weight:500;font-size:14px;line-height:20px;display:flex;gap:2px}.title_required{color:var(--cui-danger)}.upload{padding:12px 16px;border-radius:8px;border:1px solid var(--cui-base-200);background:var(--cui-base-10)}.upload-file{display:flex;align-items:center;gap:8px}.upload-file input[type=file]{display:none}.info{display:flex;flex-direction:row;gap:8px;align-items:center;justify-content:flex-start;flex-wrap:wrap}.accepted{color:var(--cui-base-500)}.remove-button ::ng-deep .c-content{color:var(--cui-danger)!important}.image{position:relative;display:inline-block}.image__view{border-radius:8px;object-fit:cover}.image__name{position:absolute;top:6px;left:14px;color:var(--cui-base-0);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:170px;z-index:1}.image:after{content:\"\";position:absolute;top:0;left:0;width:100%;height:100%;background-color:#0003;z-index:0;pointer-events:none;border-radius:8px}\n"], dependencies: [{ kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "ngmodule", type: CuiButtonModule }, { kind: "component", type: CuiButtonComponent, selector: "button[cuiButton], a[cuiButton]", inputs: ["shape", "disabled", "isLoaderShown", "icon", "iconRight", "appearance", "theme", "size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
9452
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: CuiUtilityThumbnailComponent, isStandalone: true, selector: "cui-utility-thumbnail", inputs: { thumbnail: { classPropertyName: "thumbnail", publicName: "thumbnail", isSignal: true, isRequired: true, transformFunction: null }, framerId: { classPropertyName: "framerId", publicName: "framerId", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { thumbnail: "thumbnailChange" }, ngImport: i0, template: "<section\n *transloco=\"let t\"\n class=\"file\"\n>\n <span class=\"title\">{{ t('THUMBNAIL') }}</span>\n <div class=\"upload\">\n <div class=\"upload-file\">\n @if (thumbnail()?.name; as fileId) {\n <div class=\"image\">\n <span class=\"image__name\">{{ thumbnail()?.name }}</span>\n <!-- TODO: ngSrc -->\n <img\n class=\"image__view\"\n [src]=\"thumbnailUrl()\"\n height=\"120\"\n width=\"184\"\n alt=\"Thumbnail\"\n />\n </div>\n }\n <div class=\"info\">\n <button\n type=\"button\"\n cuiButton\n appearance=\"outlined-gray\"\n size=\"xxs\"\n icon=\"cuiIconUpload\"\n (click)=\"onSelectFile()\"\n >\n {{ uploadButtonName() }}\n </button>\n @if (thumbnail()?.name) {\n <button\n class=\"remove-button\"\n cuiButton\n appearance=\"link\"\n size=\"sm\"\n type=\"button\"\n (click)=\"onRemoveThumbnail()\"\n >\n {{ t('REMOVE') }}\n </button>\n }\n\n <span class=\"accepted\">{{ t('ACCEPTED') }}: JPG, JPEG, PNG, MP4 {{ t('UP_TO') }} 20MB</span>\n </div>\n </div>\n </div>\n</section>\n", styles: [".file{display:flex;flex-direction:column;gap:4px}.title{font-weight:500;font-size:14px;line-height:20px;display:flex;gap:2px}.title_required{color:var(--cui-danger)}.upload{padding:12px 16px;border-radius:8px;border:1px solid var(--cui-base-200);background:var(--cui-base-10)}.upload-file{display:flex;align-items:center;gap:8px}.upload-file input[type=file]{display:none}.info{display:flex;flex-direction:row;gap:8px;align-items:center;justify-content:flex-start;flex-wrap:wrap}.accepted{color:var(--cui-base-500)}.remove-button ::ng-deep .c-content{color:var(--cui-danger)!important}.image{position:relative;display:inline-block}.image__view{border-radius:8px;object-fit:cover}.image__name{position:absolute;top:6px;left:14px;color:var(--cui-base-0);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:170px;z-index:1}.image:after{content:\"\";position:absolute;top:0;left:0;width:100%;height:100%;background-color:#0003;z-index:0;pointer-events:none;border-radius:8px}\n"], dependencies: [{ kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "ngmodule", type: CuiButtonModule }, { kind: "component", type: CuiButtonComponent, selector: "button[cuiButton], a[cuiButton]", inputs: ["shape", "disabled", "isLoaderShown", "icon", "iconRight", "appearance", "theme", "size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
9461
9453
  }
9462
9454
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiUtilityThumbnailComponent, decorators: [{
9463
9455
  type: Component,
@@ -9471,23 +9463,29 @@ class CuiCriterionInfoFormComponent {
9471
9463
  get isTitleError() {
9472
9464
  return this.controls.title.invalid && this.controls.title.dirty;
9473
9465
  }
9466
+ get isDescriptionError() {
9467
+ return this.controls.description.invalid && this.controls.description.dirty;
9468
+ }
9474
9469
  constructor() {
9475
9470
  this.destroy = inject(DestroyRef);
9476
9471
  this.formBuilder = inject(NonNullableFormBuilder);
9477
9472
  this.frameApiService = inject(CuiFrameApiService);
9473
+ this.resourceApiService = inject(CuiResourceApiService);
9478
9474
  this.cuiIdService = inject(CuiIdService);
9479
9475
  this.CONTROL_DELAY = 500;
9480
9476
  this.titleId = this.cuiIdService.generate();
9477
+ this.descriptionId = this.cuiIdService.generate();
9481
9478
  this.form = this.formBuilder.group({
9482
- title: this.formBuilder.control('', cuiCreateDefaultValidators({ asyncDelay: this.CONTROL_DELAY }))
9479
+ title: this.formBuilder.control('', cuiCreateDefaultValidators({ asyncDelay: this.CONTROL_DELAY })),
9480
+ description: this.formBuilder.control('', cuiCreateDefaultValidators({ asyncDelay: this.CONTROL_DELAY }))
9483
9481
  });
9484
9482
  this.heading = null;
9485
9483
  this.isDescriptionEmpty = signal(false);
9486
9484
  this.editorId = signal(null);
9487
9485
  this.thumbnail = signal(null);
9488
9486
  this.title = input.required();
9487
+ this.description = input.required();
9489
9488
  this.framerId = input.required();
9490
- this.baseResourceUrl = input.required();
9491
9489
  this.config = input.required();
9492
9490
  this.formChanged = output();
9493
9491
  this.isFormValidChanged = output();
@@ -9509,7 +9507,7 @@ class CuiCriterionInfoFormComponent {
9509
9507
  });
9510
9508
  }
9511
9509
  initFormSubscriptions() {
9512
- this.form.setValue({ title: this.title() }, { emitEvent: false });
9510
+ this.form.setValue({ title: this.title(), description: this.description() }, { emitEvent: false });
9513
9511
  this.form.statusChanges
9514
9512
  .pipe(takeUntilDestroyed(this.destroy))
9515
9513
  .subscribe(() => this.isFormValidChanged.emit(this.checkFormValidation()));
@@ -9538,12 +9536,12 @@ class CuiCriterionInfoFormComponent {
9538
9536
  });
9539
9537
  });
9540
9538
  }
9541
- compareFormValues([prevGroup, currentGroup]) {
9542
- const keys = Object.keys(currentGroup);
9539
+ compareFormValues([prevGroup, currentGruop]) {
9540
+ const keys = Object.keys(currentGruop);
9543
9541
  const changedFields = {};
9544
9542
  keys.forEach((key) => {
9545
9543
  const prev = prevGroup[key];
9546
- const current = currentGroup[key];
9544
+ const current = currentGruop[key];
9547
9545
  if (prev === current || this.controls[key].invalid) {
9548
9546
  return;
9549
9547
  }
@@ -9552,12 +9550,18 @@ class CuiCriterionInfoFormComponent {
9552
9550
  return changedFields;
9553
9551
  }
9554
9552
  setResourceFile(resource) {
9555
- const url = this.baseResourceUrl() + resource.fileId;
9556
- this.thumbnail.set(resource);
9557
- if (!url || resource?.name?.split('.').pop() !== 'mp4') {
9553
+ if (!resource.fileId) {
9558
9554
  return;
9559
9555
  }
9560
- this.getCaptureFromVideo(url);
9556
+ this.resourceApiService.get(resource.fileId, this.config().requestOptions)
9557
+ .pipe(takeUntilDestroyed(this.destroy), map((url) => URL.createObjectURL(url)))
9558
+ .subscribe((url) => {
9559
+ this.thumbnail.set({ ...resource, resource: url });
9560
+ if (!url || resource?.name?.split('.').pop() !== 'mp4') {
9561
+ return;
9562
+ }
9563
+ this.getCaptureFromVideo(url);
9564
+ });
9561
9565
  }
9562
9566
  getCaptureFromVideo(url, file) {
9563
9567
  takeCaptureFromVideo(url).then((capture) => {
@@ -9572,7 +9576,7 @@ class CuiCriterionInfoFormComponent {
9572
9576
  return !this.isDescriptionEmpty() && !this.form.invalid;
9573
9577
  }
9574
9578
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiCriterionInfoFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
9575
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: CuiCriterionInfoFormComponent, isStandalone: true, selector: "cui-criterion-info-form", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, framerId: { classPropertyName: "framerId", publicName: "framerId", isSignal: true, isRequired: true, transformFunction: null }, baseResourceUrl: { classPropertyName: "baseResourceUrl", publicName: "baseResourceUrl", isSignal: true, isRequired: true, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { formChanged: "formChanged", isFormValidChanged: "isFormValidChanged" }, ngImport: i0, template: "<ng-container *transloco=\"let t\">\n <section class=\"content\">\n <cui-form-field>\n <label\n cuiLabel\n [isRequired]=\"true\"\n [for]=\"titleId\"\n >\n {{ t('TITLE') }}\n </label>\n\n <cui-input-text\n [cuiTextFieldId]=\"titleId\"\n [cuiTextFieldPlaceholder]=\"t('ADD_A_TITLE')\"\n [cuiTextFieldIsError]=\"isTitleError\"\n [formControl]=\"form.controls.title\"\n />\n\n @if (isTitleError) {\n <cui-general-control-error-hint\n [control]=\"form.controls.title\"\n [isVisible]=\"true\"\n />\n }\n </cui-form-field>\n\n <cui-utility-thumbnail\n [baseResourceUrl]=\"baseResourceUrl()\"\n [framerId]=\"framerId()\"\n [(thumbnail)]=\"thumbnail\"\n />\n\n @if (editorId(); as editorId) {\n <cui-editor-block\n [title]=\"form.controls.title.value || title()\"\n [config]=\"config()\"\n [editorId]=\"editorId\"\n [required]=\"true\"\n class=\"editor\"\n (editorEmpty)=\"onEditorEmpty($event)\"\n />\n }\n </section>\n</ng-container>\n", styles: ["::ng-deep cui-dialog:has(.instruction-description-modal){inset:0;margin:auto;transform:none!important}:host{--editor-height: 650px;display:block}:host .editor{--max-editor-height: var(--editor-height)}.content{display:flex;flex-direction:column;gap:16px;padding:16px 24px}\n"], dependencies: [{ kind: "ngmodule", type: CuiAccordionModule }, { kind: "ngmodule", type: CuiButtonModule }, { kind: "component", type: CuiEditorBlockComponent, selector: "cui-editor-block", inputs: ["title", "editorId", "config", "required"], outputs: ["editorEmpty"] }, { kind: "ngmodule", type: CuiFormFieldModule }, { kind: "component", type: CuiFormFieldComponent, selector: "cui-form-field" }, { kind: "component", type: CuiGeneralControlErrorHintComponent, selector: "cui-general-control-error-hint", inputs: ["control", "isVisible"] }, { kind: "ngmodule", type: CuiHintModule }, { kind: "ngmodule", type: CuiInputModule }, { kind: "component", type: CuiInputTextComponent, selector: "cui-input-text" }, { kind: "directive", type: CuiTextFieldIdDirective, selector: "[cuiTextFieldId]", inputs: ["cuiTextFieldId"] }, { kind: "directive", type: CuiTextFieldPlaceholderDirective, selector: "[cuiTextFieldPlaceholder]", inputs: ["cuiTextFieldPlaceholder"] }, { kind: "directive", type: CuiTextFieldIsErrorDirective, selector: "[cuiTextFieldIsError]", inputs: ["cuiTextFieldIsError"] }, { kind: "ngmodule", type: CuiLabelModule }, { kind: "component", type: CuiLabelComponent, selector: "label[cuiLabel]", inputs: ["isRequired"] }, { kind: "component", type: CuiUtilityThumbnailComponent, selector: "cui-utility-thumbnail", inputs: ["thumbnail", "framerId", "baseResourceUrl"], outputs: ["thumbnailChange"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
9579
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: CuiCriterionInfoFormComponent, isStandalone: true, selector: "cui-criterion-info-form", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, description: { classPropertyName: "description", publicName: "description", isSignal: true, isRequired: true, transformFunction: null }, framerId: { classPropertyName: "framerId", publicName: "framerId", isSignal: true, isRequired: true, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { formChanged: "formChanged", isFormValidChanged: "isFormValidChanged" }, ngImport: i0, template: "<ng-container *transloco=\"let t\">\n <section class=\"content\">\n <cui-form-field>\n <label\n cuiLabel\n [isRequired]=\"true\"\n [for]=\"titleId\"\n >\n {{ t('TITLE') }}\n </label>\n\n <cui-input-text\n [cuiTextFieldId]=\"titleId\"\n [cuiTextFieldPlaceholder]=\"t('ADD_A_TITLE')\"\n [cuiTextFieldIsError]=\"isTitleError\"\n [formControl]=\"form.controls.title\"\n />\n\n @if (isTitleError) {\n <cui-general-control-error-hint\n [control]=\"form.controls.title\"\n [isVisible]=\"true\"\n />\n }\n </cui-form-field>\n\n <cui-form-field>\n <label\n cuiLabel\n [isRequired]=\"true\"\n [for]=\"descriptionId\"\n >\n {{ t('SHORT_DESCRIPTION') }}\n </label>\n\n <cui-input-text\n [cuiTextFieldId]=\"descriptionId\"\n cuiTextFieldPlaceholder=\"{{ t('SHORT_DESCRIPTION') }}...\"\n [cuiTextFieldIsError]=\"isDescriptionError\"\n [formControl]=\"form.controls.description\"\n />\n\n @if (isDescriptionError) {\n <cui-general-control-error-hint\n [control]=\"form.controls.description\"\n [isVisible]=\"true\"\n />\n }\n </cui-form-field>\n\n\n <cui-utility-thumbnail\n [framerId]=\"framerId()\"\n [(thumbnail)]=\"thumbnail\"\n />\n\n @if (editorId(); as editorId) {\n <cui-editor-block\n [title]=\"form.controls.title.value || title()\"\n [config]=\"config()\"\n [editorId]=\"editorId\"\n [required]=\"true\"\n class=\"editor\"\n (editorEmpty)=\"onEditorEmpty($event)\"\n />\n }\n </section>\n</ng-container>\n", styles: ["::ng-deep cui-dialog:has(.instruction-description-modal){inset:0;margin:auto;transform:none!important}:host{--editor-height: 650px;display:block}:host .editor{--max-editor-height: var(--editor-height)}.content{display:flex;flex-direction:column;gap:16px;padding:16px 24px}\n"], dependencies: [{ kind: "ngmodule", type: CuiAccordionModule }, { kind: "ngmodule", type: CuiButtonModule }, { kind: "component", type: CuiEditorBlockComponent, selector: "cui-editor-block", inputs: ["title", "editorId", "config", "required"], outputs: ["editorEmpty"] }, { kind: "ngmodule", type: CuiFormFieldModule }, { kind: "component", type: CuiFormFieldComponent, selector: "cui-form-field" }, { kind: "component", type: CuiGeneralControlErrorHintComponent, selector: "cui-general-control-error-hint", inputs: ["control", "isVisible"] }, { kind: "ngmodule", type: CuiHintModule }, { kind: "ngmodule", type: CuiInputModule }, { kind: "component", type: CuiInputTextComponent, selector: "cui-input-text" }, { kind: "directive", type: CuiTextFieldIdDirective, selector: "[cuiTextFieldId]", inputs: ["cuiTextFieldId"] }, { kind: "directive", type: CuiTextFieldPlaceholderDirective, selector: "[cuiTextFieldPlaceholder]", inputs: ["cuiTextFieldPlaceholder"] }, { kind: "directive", type: CuiTextFieldIsErrorDirective, selector: "[cuiTextFieldIsError]", inputs: ["cuiTextFieldIsError"] }, { kind: "ngmodule", type: CuiLabelModule }, { kind: "component", type: CuiLabelComponent, selector: "label[cuiLabel]", inputs: ["isRequired"] }, { kind: "component", type: CuiUtilityThumbnailComponent, selector: "cui-utility-thumbnail", inputs: ["thumbnail", "framerId"], outputs: ["thumbnailChange"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
9576
9580
  }
9577
9581
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiCriterionInfoFormComponent, decorators: [{
9578
9582
  type: Component,
@@ -9588,7 +9592,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
9588
9592
  CuiUtilityThumbnailComponent,
9589
9593
  ReactiveFormsModule,
9590
9594
  TranslocoDirective
9591
- ], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *transloco=\"let t\">\n <section class=\"content\">\n <cui-form-field>\n <label\n cuiLabel\n [isRequired]=\"true\"\n [for]=\"titleId\"\n >\n {{ t('TITLE') }}\n </label>\n\n <cui-input-text\n [cuiTextFieldId]=\"titleId\"\n [cuiTextFieldPlaceholder]=\"t('ADD_A_TITLE')\"\n [cuiTextFieldIsError]=\"isTitleError\"\n [formControl]=\"form.controls.title\"\n />\n\n @if (isTitleError) {\n <cui-general-control-error-hint\n [control]=\"form.controls.title\"\n [isVisible]=\"true\"\n />\n }\n </cui-form-field>\n\n <cui-utility-thumbnail\n [baseResourceUrl]=\"baseResourceUrl()\"\n [framerId]=\"framerId()\"\n [(thumbnail)]=\"thumbnail\"\n />\n\n @if (editorId(); as editorId) {\n <cui-editor-block\n [title]=\"form.controls.title.value || title()\"\n [config]=\"config()\"\n [editorId]=\"editorId\"\n [required]=\"true\"\n class=\"editor\"\n (editorEmpty)=\"onEditorEmpty($event)\"\n />\n }\n </section>\n</ng-container>\n", styles: ["::ng-deep cui-dialog:has(.instruction-description-modal){inset:0;margin:auto;transform:none!important}:host{--editor-height: 650px;display:block}:host .editor{--max-editor-height: var(--editor-height)}.content{display:flex;flex-direction:column;gap:16px;padding:16px 24px}\n"] }]
9595
+ ], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *transloco=\"let t\">\n <section class=\"content\">\n <cui-form-field>\n <label\n cuiLabel\n [isRequired]=\"true\"\n [for]=\"titleId\"\n >\n {{ t('TITLE') }}\n </label>\n\n <cui-input-text\n [cuiTextFieldId]=\"titleId\"\n [cuiTextFieldPlaceholder]=\"t('ADD_A_TITLE')\"\n [cuiTextFieldIsError]=\"isTitleError\"\n [formControl]=\"form.controls.title\"\n />\n\n @if (isTitleError) {\n <cui-general-control-error-hint\n [control]=\"form.controls.title\"\n [isVisible]=\"true\"\n />\n }\n </cui-form-field>\n\n <cui-form-field>\n <label\n cuiLabel\n [isRequired]=\"true\"\n [for]=\"descriptionId\"\n >\n {{ t('SHORT_DESCRIPTION') }}\n </label>\n\n <cui-input-text\n [cuiTextFieldId]=\"descriptionId\"\n cuiTextFieldPlaceholder=\"{{ t('SHORT_DESCRIPTION') }}...\"\n [cuiTextFieldIsError]=\"isDescriptionError\"\n [formControl]=\"form.controls.description\"\n />\n\n @if (isDescriptionError) {\n <cui-general-control-error-hint\n [control]=\"form.controls.description\"\n [isVisible]=\"true\"\n />\n }\n </cui-form-field>\n\n\n <cui-utility-thumbnail\n [framerId]=\"framerId()\"\n [(thumbnail)]=\"thumbnail\"\n />\n\n @if (editorId(); as editorId) {\n <cui-editor-block\n [title]=\"form.controls.title.value || title()\"\n [config]=\"config()\"\n [editorId]=\"editorId\"\n [required]=\"true\"\n class=\"editor\"\n (editorEmpty)=\"onEditorEmpty($event)\"\n />\n }\n </section>\n</ng-container>\n", styles: ["::ng-deep cui-dialog:has(.instruction-description-modal){inset:0;margin:auto;transform:none!important}:host{--editor-height: 650px;display:block}:host .editor{--max-editor-height: var(--editor-height)}.content{display:flex;flex-direction:column;gap:16px;padding:16px 24px}\n"] }]
9592
9596
  }], ctorParameters: () => [] });
9593
9597
 
9594
9598
  const UTILITY_MODAL_SERVICE_TOKEN = new InjectionToken('UTILITY_MODAL_SERVICE_TOKEN');
@@ -9652,6 +9656,7 @@ class CuiCriterionModalCreateComponent {
9652
9656
  this.isFormValid = signal(false);
9653
9657
  this.criterion = computed(() => this._criterion()());
9654
9658
  this.initialUtility = input.required();
9659
+ this.config = input.required();
9655
9660
  }
9656
9661
  onCriterionCreated(storageNodeId) {
9657
9662
  if (this.isCreated || this.initialUtility()) {
@@ -9666,11 +9671,11 @@ class CuiCriterionModalCreateComponent {
9666
9671
  });
9667
9672
  }
9668
9673
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiCriterionModalCreateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
9669
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: CuiCriterionModalCreateComponent, isStandalone: true, selector: "ng-component", inputs: { initialUtility: { classPropertyName: "initialUtility", publicName: "initialUtility", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<cui-utility-modal-create [initialUtility]=\"criterion()\">\n <cui-criterion-info\n [criterion]=\"criterion()\"\n [tools]=\"tools\"\n [editorResourceUrl]=\"editorResourceUrl\"\n (validationChanged)=\"isFormValid.set($event)\"\n (criterionCreated)=\"onCriterionCreated($event)\"\n />\n</cui-utility-modal-create>\n", dependencies: [{ kind: "ngmodule", type: CuiButtonModule }, { kind: "ngmodule", type: CuiSvgModule }, { kind: "component", type: CuiCriterionInfoComponent, selector: "cui-criterion-info", inputs: ["criterion", "tools", "editorResourceUrl"], outputs: ["criterionChange", "validationChanged", "criterionCreated"] }, { kind: "component", type: CuiUtilityModalCreateComponent, selector: "cui-utility-modal-create", inputs: ["initialUtility"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
9674
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: CuiCriterionModalCreateComponent, isStandalone: true, selector: "ng-component", inputs: { initialUtility: { classPropertyName: "initialUtility", publicName: "initialUtility", isSignal: true, isRequired: true, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<cui-utility-modal-create [initialUtility]=\"criterion()\">\n <cui-criterion-info\n [criterion]=\"criterion()\"\n [config]=\"config()\"\n (validationChanged)=\"isFormValid.set($event)\"\n (criterionCreated)=\"onCriterionCreated($event)\"\n />\n</cui-utility-modal-create>\n", dependencies: [{ kind: "ngmodule", type: CuiButtonModule }, { kind: "ngmodule", type: CuiSvgModule }, { kind: "component", type: CuiCriterionInfoComponent, selector: "cui-criterion-info", inputs: ["criterion", "config"], outputs: ["criterionChange", "validationChanged", "criterionCreated"] }, { kind: "component", type: CuiUtilityModalCreateComponent, selector: "cui-utility-modal-create", inputs: ["initialUtility"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
9670
9675
  }
9671
9676
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiCriterionModalCreateComponent, decorators: [{
9672
9677
  type: Component,
9673
- args: [{ imports: [CuiButtonModule, CuiSvgModule, CuiCriterionInfoComponent, CuiUtilityModalCreateComponent], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<cui-utility-modal-create [initialUtility]=\"criterion()\">\n <cui-criterion-info\n [criterion]=\"criterion()\"\n [tools]=\"tools\"\n [editorResourceUrl]=\"editorResourceUrl\"\n (validationChanged)=\"isFormValid.set($event)\"\n (criterionCreated)=\"onCriterionCreated($event)\"\n />\n</cui-utility-modal-create>\n" }]
9678
+ args: [{ imports: [CuiButtonModule, CuiSvgModule, CuiCriterionInfoComponent, CuiUtilityModalCreateComponent], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<cui-utility-modal-create [initialUtility]=\"criterion()\">\n <cui-criterion-info\n [criterion]=\"criterion()\"\n [config]=\"config()\"\n (validationChanged)=\"isFormValid.set($event)\"\n (criterionCreated)=\"onCriterionCreated($event)\"\n />\n</cui-utility-modal-create>\n" }]
9674
9679
  }] });
9675
9680
 
9676
9681
  class CuiInstructionInfoFormComponent {
@@ -9687,6 +9692,7 @@ class CuiInstructionInfoFormComponent {
9687
9692
  this.destroy = inject(DestroyRef);
9688
9693
  this.formBuilder = inject(NonNullableFormBuilder);
9689
9694
  this.frameApiService = inject(CuiFrameApiService);
9695
+ this.resourceApiService = inject(CuiResourceApiService);
9690
9696
  this.cuiIdService = inject(CuiIdService);
9691
9697
  this.CONTROL_DELAY = 500;
9692
9698
  this.titleId = this.cuiIdService.generate();
@@ -9702,7 +9708,6 @@ class CuiInstructionInfoFormComponent {
9702
9708
  this.title = input.required();
9703
9709
  this.description = input.required();
9704
9710
  this.framerId = input.required();
9705
- this.baseResourceUrl = input.required();
9706
9711
  this.config = input.required();
9707
9712
  this.formChanged = output();
9708
9713
  this.isFormValidChanged = output();
@@ -9767,12 +9772,18 @@ class CuiInstructionInfoFormComponent {
9767
9772
  return changedFields;
9768
9773
  }
9769
9774
  setResourceFile(resource) {
9770
- const url = this.baseResourceUrl() + resource.fileId;
9771
- this.thumbnail.set(resource);
9772
- if (!url || resource?.name?.split('.').pop() !== 'mp4') {
9775
+ if (!resource.fileId) {
9773
9776
  return;
9774
9777
  }
9775
- this.getCaptureFromVideo(url);
9778
+ this.resourceApiService.get(resource.fileId, this.config().requestOptions)
9779
+ .pipe(takeUntilDestroyed(this.destroy), map((url) => URL.createObjectURL(url)))
9780
+ .subscribe((url) => {
9781
+ this.thumbnail.set({ ...resource, resource: url });
9782
+ if (!url || resource?.name?.split('.').pop() !== 'mp4') {
9783
+ return;
9784
+ }
9785
+ this.getCaptureFromVideo(url);
9786
+ });
9776
9787
  }
9777
9788
  getCaptureFromVideo(url, file) {
9778
9789
  takeCaptureFromVideo(url).then((capture) => {
@@ -9787,7 +9798,7 @@ class CuiInstructionInfoFormComponent {
9787
9798
  return !this.isDescriptionEmpty() && !this.form.invalid;
9788
9799
  }
9789
9800
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiInstructionInfoFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
9790
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: CuiInstructionInfoFormComponent, isStandalone: true, selector: "cui-instruction-info-form", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, description: { classPropertyName: "description", publicName: "description", isSignal: true, isRequired: true, transformFunction: null }, framerId: { classPropertyName: "framerId", publicName: "framerId", isSignal: true, isRequired: true, transformFunction: null }, baseResourceUrl: { classPropertyName: "baseResourceUrl", publicName: "baseResourceUrl", isSignal: true, isRequired: true, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { formChanged: "formChanged", isFormValidChanged: "isFormValidChanged" }, ngImport: i0, template: "<ng-container *transloco=\"let t\">\n <section class=\"content\">\n <cui-form-field>\n <label\n cuiLabel\n [isRequired]=\"true\"\n [for]=\"titleId\"\n >\n {{ t('TITLE') }}\n </label>\n\n <cui-input-text\n [cuiTextFieldId]=\"titleId\"\n [cuiTextFieldPlaceholder]=\"t('ADD_A_TITLE')\"\n [cuiTextFieldIsError]=\"isTitleError\"\n [formControl]=\"form.controls.title\"\n />\n\n @if (isTitleError) {\n <cui-general-control-error-hint\n [control]=\"form.controls.title\"\n [isVisible]=\"true\"\n />\n }\n </cui-form-field>\n\n <cui-form-field>\n <label\n cuiLabel\n [isRequired]=\"true\"\n [for]=\"descriptionId\"\n >\n {{ t('SHORT_DESCRIPTION') }}\n </label>\n\n <cui-input-text\n [cuiTextFieldId]=\"descriptionId\"\n cuiTextFieldPlaceholder=\"{{ t('SHORT_DESCRIPTION') }}...\"\n [cuiTextFieldIsError]=\"isDescriptionError\"\n [formControl]=\"form.controls.description\"\n />\n\n @if (isDescriptionError) {\n <cui-general-control-error-hint\n [control]=\"form.controls.description\"\n [isVisible]=\"true\"\n />\n }\n </cui-form-field>\n\n <cui-utility-thumbnail\n [baseResourceUrl]=\"baseResourceUrl()\"\n [framerId]=\"framerId()\"\n [(thumbnail)]=\"thumbnail\"\n />\n\n @if (editorId(); as editorId) {\n <cui-editor-block\n [title]=\"form.controls.title.value || title()\"\n [config]=\"config()\"\n [editorId]=\"editorId\"\n [required]=\"true\"\n class=\"editor\"\n (editorEmpty)=\"onEditorEmpty($event)\"\n />\n }\n </section>\n</ng-container>\n", styles: ["::ng-deep cui-dialog:has(.instruction-description-modal){inset:0;margin:auto;transform:none!important}:host{--editor-height: 650px;display:block}:host .editor{--max-editor-height: var(--editor-height)}.content{display:flex;flex-direction:column;gap:16px;padding:16px 24px}\n"], dependencies: [{ kind: "ngmodule", type: CuiAccordionModule }, { kind: "ngmodule", type: CuiButtonModule }, { kind: "component", type: CuiEditorBlockComponent, selector: "cui-editor-block", inputs: ["title", "editorId", "config", "required"], outputs: ["editorEmpty"] }, { kind: "ngmodule", type: CuiFormFieldModule }, { kind: "component", type: CuiFormFieldComponent, selector: "cui-form-field" }, { kind: "component", type: CuiGeneralControlErrorHintComponent, selector: "cui-general-control-error-hint", inputs: ["control", "isVisible"] }, { kind: "ngmodule", type: CuiHintModule }, { kind: "ngmodule", type: CuiInputModule }, { kind: "component", type: CuiInputTextComponent, selector: "cui-input-text" }, { kind: "directive", type: CuiTextFieldIdDirective, selector: "[cuiTextFieldId]", inputs: ["cuiTextFieldId"] }, { kind: "directive", type: CuiTextFieldPlaceholderDirective, selector: "[cuiTextFieldPlaceholder]", inputs: ["cuiTextFieldPlaceholder"] }, { kind: "directive", type: CuiTextFieldIsErrorDirective, selector: "[cuiTextFieldIsError]", inputs: ["cuiTextFieldIsError"] }, { kind: "ngmodule", type: CuiLabelModule }, { kind: "component", type: CuiLabelComponent, selector: "label[cuiLabel]", inputs: ["isRequired"] }, { kind: "component", type: CuiUtilityThumbnailComponent, selector: "cui-utility-thumbnail", inputs: ["thumbnail", "framerId", "baseResourceUrl"], outputs: ["thumbnailChange"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
9801
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: CuiInstructionInfoFormComponent, isStandalone: true, selector: "cui-instruction-info-form", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, description: { classPropertyName: "description", publicName: "description", isSignal: true, isRequired: true, transformFunction: null }, framerId: { classPropertyName: "framerId", publicName: "framerId", isSignal: true, isRequired: true, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { formChanged: "formChanged", isFormValidChanged: "isFormValidChanged" }, ngImport: i0, template: "<ng-container *transloco=\"let t\">\n <section class=\"content\">\n <cui-form-field>\n <label\n cuiLabel\n [isRequired]=\"true\"\n [for]=\"titleId\"\n >\n {{ t('TITLE') }}\n </label>\n\n <cui-input-text\n [cuiTextFieldId]=\"titleId\"\n [cuiTextFieldPlaceholder]=\"t('ADD_A_TITLE')\"\n [cuiTextFieldIsError]=\"isTitleError\"\n [formControl]=\"form.controls.title\"\n />\n\n @if (isTitleError) {\n <cui-general-control-error-hint\n [control]=\"form.controls.title\"\n [isVisible]=\"true\"\n />\n }\n </cui-form-field>\n\n <cui-form-field>\n <label\n cuiLabel\n [isRequired]=\"true\"\n [for]=\"descriptionId\"\n >\n {{ t('SHORT_DESCRIPTION') }}\n </label>\n\n <cui-input-text\n [cuiTextFieldId]=\"descriptionId\"\n cuiTextFieldPlaceholder=\"{{ t('SHORT_DESCRIPTION') }}...\"\n [cuiTextFieldIsError]=\"isDescriptionError\"\n [formControl]=\"form.controls.description\"\n />\n\n @if (isDescriptionError) {\n <cui-general-control-error-hint\n [control]=\"form.controls.description\"\n [isVisible]=\"true\"\n />\n }\n </cui-form-field>\n\n <cui-utility-thumbnail\n [framerId]=\"framerId()\"\n [(thumbnail)]=\"thumbnail\"\n />\n\n @if (editorId(); as editorId) {\n <cui-editor-block\n [title]=\"form.controls.title.value || title()\"\n [config]=\"config()\"\n [editorId]=\"editorId\"\n [required]=\"true\"\n class=\"editor\"\n (editorEmpty)=\"onEditorEmpty($event)\"\n />\n }\n </section>\n</ng-container>\n", styles: ["::ng-deep cui-dialog:has(.instruction-description-modal){inset:0;margin:auto;transform:none!important}:host{--editor-height: 650px;display:block}:host .editor{--max-editor-height: var(--editor-height)}.content{display:flex;flex-direction:column;gap:16px;padding:16px 24px}\n"], dependencies: [{ kind: "ngmodule", type: CuiAccordionModule }, { kind: "ngmodule", type: CuiButtonModule }, { kind: "component", type: CuiEditorBlockComponent, selector: "cui-editor-block", inputs: ["title", "editorId", "config", "required"], outputs: ["editorEmpty"] }, { kind: "ngmodule", type: CuiFormFieldModule }, { kind: "component", type: CuiFormFieldComponent, selector: "cui-form-field" }, { kind: "component", type: CuiGeneralControlErrorHintComponent, selector: "cui-general-control-error-hint", inputs: ["control", "isVisible"] }, { kind: "ngmodule", type: CuiHintModule }, { kind: "ngmodule", type: CuiInputModule }, { kind: "component", type: CuiInputTextComponent, selector: "cui-input-text" }, { kind: "directive", type: CuiTextFieldIdDirective, selector: "[cuiTextFieldId]", inputs: ["cuiTextFieldId"] }, { kind: "directive", type: CuiTextFieldPlaceholderDirective, selector: "[cuiTextFieldPlaceholder]", inputs: ["cuiTextFieldPlaceholder"] }, { kind: "directive", type: CuiTextFieldIsErrorDirective, selector: "[cuiTextFieldIsError]", inputs: ["cuiTextFieldIsError"] }, { kind: "ngmodule", type: CuiLabelModule }, { kind: "component", type: CuiLabelComponent, selector: "label[cuiLabel]", inputs: ["isRequired"] }, { kind: "component", type: CuiUtilityThumbnailComponent, selector: "cui-utility-thumbnail", inputs: ["thumbnail", "framerId"], outputs: ["thumbnailChange"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
9791
9802
  }
9792
9803
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiInstructionInfoFormComponent, decorators: [{
9793
9804
  type: Component,
@@ -9803,7 +9814,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
9803
9814
  CuiUtilityThumbnailComponent,
9804
9815
  ReactiveFormsModule,
9805
9816
  TranslocoDirective
9806
- ], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *transloco=\"let t\">\n <section class=\"content\">\n <cui-form-field>\n <label\n cuiLabel\n [isRequired]=\"true\"\n [for]=\"titleId\"\n >\n {{ t('TITLE') }}\n </label>\n\n <cui-input-text\n [cuiTextFieldId]=\"titleId\"\n [cuiTextFieldPlaceholder]=\"t('ADD_A_TITLE')\"\n [cuiTextFieldIsError]=\"isTitleError\"\n [formControl]=\"form.controls.title\"\n />\n\n @if (isTitleError) {\n <cui-general-control-error-hint\n [control]=\"form.controls.title\"\n [isVisible]=\"true\"\n />\n }\n </cui-form-field>\n\n <cui-form-field>\n <label\n cuiLabel\n [isRequired]=\"true\"\n [for]=\"descriptionId\"\n >\n {{ t('SHORT_DESCRIPTION') }}\n </label>\n\n <cui-input-text\n [cuiTextFieldId]=\"descriptionId\"\n cuiTextFieldPlaceholder=\"{{ t('SHORT_DESCRIPTION') }}...\"\n [cuiTextFieldIsError]=\"isDescriptionError\"\n [formControl]=\"form.controls.description\"\n />\n\n @if (isDescriptionError) {\n <cui-general-control-error-hint\n [control]=\"form.controls.description\"\n [isVisible]=\"true\"\n />\n }\n </cui-form-field>\n\n <cui-utility-thumbnail\n [baseResourceUrl]=\"baseResourceUrl()\"\n [framerId]=\"framerId()\"\n [(thumbnail)]=\"thumbnail\"\n />\n\n @if (editorId(); as editorId) {\n <cui-editor-block\n [title]=\"form.controls.title.value || title()\"\n [config]=\"config()\"\n [editorId]=\"editorId\"\n [required]=\"true\"\n class=\"editor\"\n (editorEmpty)=\"onEditorEmpty($event)\"\n />\n }\n </section>\n</ng-container>\n", styles: ["::ng-deep cui-dialog:has(.instruction-description-modal){inset:0;margin:auto;transform:none!important}:host{--editor-height: 650px;display:block}:host .editor{--max-editor-height: var(--editor-height)}.content{display:flex;flex-direction:column;gap:16px;padding:16px 24px}\n"] }]
9817
+ ], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *transloco=\"let t\">\n <section class=\"content\">\n <cui-form-field>\n <label\n cuiLabel\n [isRequired]=\"true\"\n [for]=\"titleId\"\n >\n {{ t('TITLE') }}\n </label>\n\n <cui-input-text\n [cuiTextFieldId]=\"titleId\"\n [cuiTextFieldPlaceholder]=\"t('ADD_A_TITLE')\"\n [cuiTextFieldIsError]=\"isTitleError\"\n [formControl]=\"form.controls.title\"\n />\n\n @if (isTitleError) {\n <cui-general-control-error-hint\n [control]=\"form.controls.title\"\n [isVisible]=\"true\"\n />\n }\n </cui-form-field>\n\n <cui-form-field>\n <label\n cuiLabel\n [isRequired]=\"true\"\n [for]=\"descriptionId\"\n >\n {{ t('SHORT_DESCRIPTION') }}\n </label>\n\n <cui-input-text\n [cuiTextFieldId]=\"descriptionId\"\n cuiTextFieldPlaceholder=\"{{ t('SHORT_DESCRIPTION') }}...\"\n [cuiTextFieldIsError]=\"isDescriptionError\"\n [formControl]=\"form.controls.description\"\n />\n\n @if (isDescriptionError) {\n <cui-general-control-error-hint\n [control]=\"form.controls.description\"\n [isVisible]=\"true\"\n />\n }\n </cui-form-field>\n\n <cui-utility-thumbnail\n [framerId]=\"framerId()\"\n [(thumbnail)]=\"thumbnail\"\n />\n\n @if (editorId(); as editorId) {\n <cui-editor-block\n [title]=\"form.controls.title.value || title()\"\n [config]=\"config()\"\n [editorId]=\"editorId\"\n [required]=\"true\"\n class=\"editor\"\n (editorEmpty)=\"onEditorEmpty($event)\"\n />\n }\n </section>\n</ng-container>\n", styles: ["::ng-deep cui-dialog:has(.instruction-description-modal){inset:0;margin:auto;transform:none!important}:host{--editor-height: 650px;display:block}:host .editor{--max-editor-height: var(--editor-height)}.content{display:flex;flex-direction:column;gap:16px;padding:16px 24px}\n"] }]
9807
9818
  }], ctorParameters: () => [] });
9808
9819
 
9809
9820
  class CuiInstructionInfoComponent {
@@ -9825,8 +9836,7 @@ class CuiInstructionInfoComponent {
9825
9836
  this.selectTitle = computed(() => this.category()?.title || this.translocoService.translate('SELECT') + '...');
9826
9837
  this.element = viewChild('scrollContent');
9827
9838
  this.instruction = model();
9828
- this.tools = input.required();
9829
- this.editorResourceUrl = input.required();
9839
+ this.config = input.required();
9830
9840
  this.validationChanged = output();
9831
9841
  this.instructionCreated = output();
9832
9842
  this.initConfigEffect();
@@ -9869,7 +9879,7 @@ class CuiInstructionInfoComponent {
9869
9879
  if (!element) {
9870
9880
  return;
9871
9881
  }
9872
- this.editorConfig.set({ tools: this.tools(), element });
9882
+ this.editorConfig.set({ ...this.config(), element });
9873
9883
  });
9874
9884
  }
9875
9885
  initCategory() {
@@ -9921,7 +9931,7 @@ class CuiInstructionInfoComponent {
9921
9931
  }))));
9922
9932
  }
9923
9933
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiInstructionInfoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
9924
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: CuiInstructionInfoComponent, isStandalone: true, selector: "cui-instruction-info", inputs: { instruction: { classPropertyName: "instruction", publicName: "instruction", isSignal: true, isRequired: false, transformFunction: null }, tools: { classPropertyName: "tools", publicName: "tools", isSignal: true, isRequired: true, transformFunction: null }, editorResourceUrl: { classPropertyName: "editorResourceUrl", publicName: "editorResourceUrl", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { instruction: "instructionChange", validationChanged: "validationChanged", instructionCreated: "instructionCreated" }, providers: [CuiSelectedCategoryService], viewQueries: [{ propertyName: "element", first: true, predicate: ["scrollContent"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n class=\"wrapper\"\n *transloco=\"let t\"\n>\n <div\n #scrollContent\n class=\"content content_scrollable\"\n >\n <div class=\"category\">\n <cui-form-field>\n <label\n cuiLabel\n [for]=\"categoryId\"\n [isRequired]=\"true\"\n >\n {{ t('SELECT_CATEGORY') }}\n </label>\n <cui-categories\n [buttonId]=\"categoryId\"\n [treeStructType]=\"TYPE\"\n >\n <div class=\"select\">\n <span [style.color]=\"labelColor()\">\n {{ selectTitle() }}\n </span>\n\n <cui-svg icon=\"cuiIconChevronDown\" />\n </div>\n </cui-categories>\n </cui-form-field>\n </div>\n\n @let instructionData = instruction();\n @let editorConfigData = editorConfig();\n\n @if (editorConfigData && instructionData) {\n <cui-instruction-info-form\n [config]=\"editorConfigData\"\n [baseResourceUrl]=\"editorResourceUrl()\"\n [title]=\"instructionData.storageElement.title\"\n [description]=\"instructionData.storageElement.shortDescription\"\n [framerId]=\"instructionData.storageElement.framerInstructionId\"\n class=\"utility\"\n (isFormValidChanged)=\"onFormValidationChanged($event)\"\n (formChanged)=\"onFormChanged($event, instructionData.id)\"\n />\n }\n </div>\n</div>\n", styles: [".wrapper{display:flex;flex-direction:column;height:100%}.content{height:calc(100vh - 109px)}.content_scrollable{overflow:auto}.category{padding-top:16px;padding-right:23px;padding-left:23px}.select{padding:7px 13px;font-weight:400;font-size:14px;line-height:20px;display:flex;justify-content:space-between;height:36px;border-radius:8px;border:1px solid var(--cui-base-200);color:var(--cui-base-900);background:var(--cui-input)}.utility{--editor-height: none}\n"], dependencies: [{ kind: "ngmodule", type: CuiBadgeModule }, { kind: "ngmodule", type: CuiButtonModule }, { kind: "component", type: CuiCategoriesComponent, selector: "cui-categories", inputs: ["treeStructType", "buttonId", "disabled", "context"] }, { kind: "ngmodule", type: CuiDialogModule }, { kind: "ngmodule", type: CuiFormFieldModule }, { kind: "component", type: CuiFormFieldComponent, selector: "cui-form-field" }, { kind: "component", type: CuiInstructionInfoFormComponent, selector: "cui-instruction-info-form", inputs: ["title", "description", "framerId", "baseResourceUrl", "config"], outputs: ["formChanged", "isFormValidChanged"] }, { kind: "ngmodule", type: CuiLabelModule }, { kind: "component", type: CuiLabelComponent, selector: "label[cuiLabel]", inputs: ["isRequired"] }, { kind: "ngmodule", type: CuiSvgModule }, { kind: "component", type: CuiSvgComponent, selector: "cui-svg[icon]", inputs: ["width", "height", "strokeWidth", "color", "icon"] }, { kind: "ngmodule", type: TranslocoModule }, { kind: "directive", type: i4.TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
9934
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: CuiInstructionInfoComponent, isStandalone: true, selector: "cui-instruction-info", inputs: { instruction: { classPropertyName: "instruction", publicName: "instruction", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { instruction: "instructionChange", validationChanged: "validationChanged", instructionCreated: "instructionCreated" }, providers: [CuiSelectedCategoryService], viewQueries: [{ propertyName: "element", first: true, predicate: ["scrollContent"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n class=\"wrapper\"\n *transloco=\"let t\"\n>\n <div\n #scrollContent\n class=\"content content_scrollable\"\n >\n <div class=\"category\">\n <cui-form-field>\n <label\n cuiLabel\n [for]=\"categoryId\"\n [isRequired]=\"true\"\n >\n {{ t('SELECT_CATEGORY') }}\n </label>\n <cui-categories\n [buttonId]=\"categoryId\"\n [treeStructType]=\"TYPE\"\n >\n <div class=\"select\">\n <span [style.color]=\"labelColor()\">\n {{ selectTitle() }}\n </span>\n\n <cui-svg icon=\"cuiIconChevronDown\" />\n </div>\n </cui-categories>\n </cui-form-field>\n </div>\n\n @let instructionData = instruction();\n @let editorConfigData = editorConfig();\n\n @if (editorConfigData && instructionData) {\n <cui-instruction-info-form\n [config]=\"editorConfigData\"\n [title]=\"instructionData.storageElement.title\"\n [description]=\"instructionData.storageElement.shortDescription\"\n [framerId]=\"instructionData.storageElement.framerInstructionId\"\n class=\"utility\"\n (isFormValidChanged)=\"onFormValidationChanged($event)\"\n (formChanged)=\"onFormChanged($event, instructionData.id)\"\n />\n }\n </div>\n</div>\n", styles: [".wrapper{display:flex;flex-direction:column;height:100%}.content{height:calc(100vh - 109px)}.content_scrollable{overflow:auto}.category{padding-top:16px;padding-right:23px;padding-left:23px}.select{padding:7px 13px;font-weight:400;font-size:14px;line-height:20px;display:flex;justify-content:space-between;height:36px;border-radius:8px;border:1px solid var(--cui-base-200);color:var(--cui-base-900);background:var(--cui-input)}.utility{--editor-height: none}\n"], dependencies: [{ kind: "ngmodule", type: CuiBadgeModule }, { kind: "ngmodule", type: CuiButtonModule }, { kind: "component", type: CuiCategoriesComponent, selector: "cui-categories", inputs: ["treeStructType", "buttonId", "disabled", "context"] }, { kind: "ngmodule", type: CuiDialogModule }, { kind: "ngmodule", type: CuiFormFieldModule }, { kind: "component", type: CuiFormFieldComponent, selector: "cui-form-field" }, { kind: "component", type: CuiInstructionInfoFormComponent, selector: "cui-instruction-info-form", inputs: ["title", "description", "framerId", "config"], outputs: ["formChanged", "isFormValidChanged"] }, { kind: "ngmodule", type: CuiLabelModule }, { kind: "component", type: CuiLabelComponent, selector: "label[cuiLabel]", inputs: ["isRequired"] }, { kind: "ngmodule", type: CuiSvgModule }, { kind: "component", type: CuiSvgComponent, selector: "cui-svg[icon]", inputs: ["width", "height", "strokeWidth", "color", "icon"] }, { kind: "ngmodule", type: TranslocoModule }, { kind: "directive", type: i4.TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
9925
9935
  }
9926
9936
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiInstructionInfoComponent, decorators: [{
9927
9937
  type: Component,
@@ -9935,7 +9945,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
9935
9945
  CuiLabelModule,
9936
9946
  CuiSvgModule,
9937
9947
  TranslocoModule
9938
- ], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, providers: [CuiSelectedCategoryService], template: "<div\n class=\"wrapper\"\n *transloco=\"let t\"\n>\n <div\n #scrollContent\n class=\"content content_scrollable\"\n >\n <div class=\"category\">\n <cui-form-field>\n <label\n cuiLabel\n [for]=\"categoryId\"\n [isRequired]=\"true\"\n >\n {{ t('SELECT_CATEGORY') }}\n </label>\n <cui-categories\n [buttonId]=\"categoryId\"\n [treeStructType]=\"TYPE\"\n >\n <div class=\"select\">\n <span [style.color]=\"labelColor()\">\n {{ selectTitle() }}\n </span>\n\n <cui-svg icon=\"cuiIconChevronDown\" />\n </div>\n </cui-categories>\n </cui-form-field>\n </div>\n\n @let instructionData = instruction();\n @let editorConfigData = editorConfig();\n\n @if (editorConfigData && instructionData) {\n <cui-instruction-info-form\n [config]=\"editorConfigData\"\n [baseResourceUrl]=\"editorResourceUrl()\"\n [title]=\"instructionData.storageElement.title\"\n [description]=\"instructionData.storageElement.shortDescription\"\n [framerId]=\"instructionData.storageElement.framerInstructionId\"\n class=\"utility\"\n (isFormValidChanged)=\"onFormValidationChanged($event)\"\n (formChanged)=\"onFormChanged($event, instructionData.id)\"\n />\n }\n </div>\n</div>\n", styles: [".wrapper{display:flex;flex-direction:column;height:100%}.content{height:calc(100vh - 109px)}.content_scrollable{overflow:auto}.category{padding-top:16px;padding-right:23px;padding-left:23px}.select{padding:7px 13px;font-weight:400;font-size:14px;line-height:20px;display:flex;justify-content:space-between;height:36px;border-radius:8px;border:1px solid var(--cui-base-200);color:var(--cui-base-900);background:var(--cui-input)}.utility{--editor-height: none}\n"] }]
9948
+ ], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, providers: [CuiSelectedCategoryService], template: "<div\n class=\"wrapper\"\n *transloco=\"let t\"\n>\n <div\n #scrollContent\n class=\"content content_scrollable\"\n >\n <div class=\"category\">\n <cui-form-field>\n <label\n cuiLabel\n [for]=\"categoryId\"\n [isRequired]=\"true\"\n >\n {{ t('SELECT_CATEGORY') }}\n </label>\n <cui-categories\n [buttonId]=\"categoryId\"\n [treeStructType]=\"TYPE\"\n >\n <div class=\"select\">\n <span [style.color]=\"labelColor()\">\n {{ selectTitle() }}\n </span>\n\n <cui-svg icon=\"cuiIconChevronDown\" />\n </div>\n </cui-categories>\n </cui-form-field>\n </div>\n\n @let instructionData = instruction();\n @let editorConfigData = editorConfig();\n\n @if (editorConfigData && instructionData) {\n <cui-instruction-info-form\n [config]=\"editorConfigData\"\n [title]=\"instructionData.storageElement.title\"\n [description]=\"instructionData.storageElement.shortDescription\"\n [framerId]=\"instructionData.storageElement.framerInstructionId\"\n class=\"utility\"\n (isFormValidChanged)=\"onFormValidationChanged($event)\"\n (formChanged)=\"onFormChanged($event, instructionData.id)\"\n />\n }\n </div>\n</div>\n", styles: [".wrapper{display:flex;flex-direction:column;height:100%}.content{height:calc(100vh - 109px)}.content_scrollable{overflow:auto}.category{padding-top:16px;padding-right:23px;padding-left:23px}.select{padding:7px 13px;font-weight:400;font-size:14px;line-height:20px;display:flex;justify-content:space-between;height:36px;border-radius:8px;border:1px solid var(--cui-base-200);color:var(--cui-base-900);background:var(--cui-input)}.utility{--editor-height: none}\n"] }]
9939
9949
  }], ctorParameters: () => [] });
9940
9950
 
9941
9951
  class CuiInstructionModalCreateComponent {
@@ -9944,13 +9954,13 @@ class CuiInstructionModalCreateComponent {
9944
9954
  this.cuiDialogContext = inject(CUI_DIALOG_CONTEXT);
9945
9955
  this.instructionApiService = inject(UTILITY_MODAL_SERVICE_TOKEN);
9946
9956
  this.isCreated = false;
9947
- this.editorResourceUrl = this.cuiDialogContext.data.editorResourceUrl;
9948
9957
  this.tools = this.cuiDialogContext.data.tools;
9949
9958
  this.header = this.cuiDialogContext.data.header;
9950
9959
  this._instruction = computed(() => signal(this.initialUtility()));
9951
9960
  this.isFormValid = signal(false);
9952
9961
  this.instruction = computed(() => this._instruction()());
9953
9962
  this.initialUtility = input.required();
9963
+ this.config = input.required();
9954
9964
  }
9955
9965
  onInstructionCreated(storageNodeId) {
9956
9966
  if (this.isCreated || this.initialUtility()) {
@@ -9965,63 +9975,55 @@ class CuiInstructionModalCreateComponent {
9965
9975
  });
9966
9976
  }
9967
9977
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiInstructionModalCreateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
9968
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: CuiInstructionModalCreateComponent, isStandalone: true, selector: "ng-component", inputs: { initialUtility: { classPropertyName: "initialUtility", publicName: "initialUtility", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<cui-utility-modal-create [initialUtility]=\"instruction()\">\n <cui-instruction-info\n [instruction]=\"instruction()\"\n [tools]=\"tools\"\n [editorResourceUrl]=\"editorResourceUrl\"\n (validationChanged)=\"isFormValid.set($event)\"\n (instructionCreated)=\"onInstructionCreated($event)\"\n />\n</cui-utility-modal-create>\n", dependencies: [{ kind: "ngmodule", type: CuiButtonModule }, { kind: "ngmodule", type: CuiSvgModule }, { kind: "component", type: CuiUtilityModalCreateComponent, selector: "cui-utility-modal-create", inputs: ["initialUtility"] }, { kind: "component", type: CuiInstructionInfoComponent, selector: "cui-instruction-info", inputs: ["instruction", "tools", "editorResourceUrl"], outputs: ["instructionChange", "validationChanged", "instructionCreated"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
9978
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: CuiInstructionModalCreateComponent, isStandalone: true, selector: "ng-component", inputs: { initialUtility: { classPropertyName: "initialUtility", publicName: "initialUtility", isSignal: true, isRequired: true, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<cui-utility-modal-create [initialUtility]=\"instruction()\">\n <cui-instruction-info\n [instruction]=\"instruction()\"\n [config]=\"config()\"\n (validationChanged)=\"isFormValid.set($event)\"\n (instructionCreated)=\"onInstructionCreated($event)\"\n />\n</cui-utility-modal-create>\n", dependencies: [{ kind: "ngmodule", type: CuiButtonModule }, { kind: "ngmodule", type: CuiSvgModule }, { kind: "component", type: CuiUtilityModalCreateComponent, selector: "cui-utility-modal-create", inputs: ["initialUtility"] }, { kind: "component", type: CuiInstructionInfoComponent, selector: "cui-instruction-info", inputs: ["instruction", "config"], outputs: ["instructionChange", "validationChanged", "instructionCreated"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
9969
9979
  }
9970
9980
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiInstructionModalCreateComponent, decorators: [{
9971
9981
  type: Component,
9972
- args: [{ imports: [CuiButtonModule, CuiSvgModule, CuiUtilityModalCreateComponent, CuiInstructionInfoComponent], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<cui-utility-modal-create [initialUtility]=\"instruction()\">\n <cui-instruction-info\n [instruction]=\"instruction()\"\n [tools]=\"tools\"\n [editorResourceUrl]=\"editorResourceUrl\"\n (validationChanged)=\"isFormValid.set($event)\"\n (instructionCreated)=\"onInstructionCreated($event)\"\n />\n</cui-utility-modal-create>\n" }]
9982
+ args: [{ imports: [CuiButtonModule, CuiSvgModule, CuiUtilityModalCreateComponent, CuiInstructionInfoComponent], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<cui-utility-modal-create [initialUtility]=\"instruction()\">\n <cui-instruction-info\n [instruction]=\"instruction()\"\n [config]=\"config()\"\n (validationChanged)=\"isFormValid.set($event)\"\n (instructionCreated)=\"onInstructionCreated($event)\"\n />\n</cui-utility-modal-create>\n" }]
9973
9983
  }] });
9974
9984
 
9975
- class CuiReadonlyUtilityModalComponent {
9985
+ class CuiUtilityReadonlyThumbnailComponent {
9976
9986
  constructor() {
9977
- this.destroyRef = inject(DestroyRef);
9978
- this.cuiDialogContext = inject(CUI_DIALOG_CONTEXT);
9979
- this.utilityModalService = inject(UTILITY_MODAL_SERVICE_TOKEN);
9980
- this.editorResourceUrl = this.cuiDialogContext.data.editorResourceUrl;
9981
- this.tools = this.cuiDialogContext.data.tools;
9982
- this.header = this.cuiDialogContext.data.header;
9983
- this.isLoading = signal(false);
9984
- this.utility = input.required();
9985
- this.utilityUnbinded = output();
9986
- }
9987
- onClose() {
9988
- this.cuiDialogContext.completeWith();
9989
- }
9990
- onUnbind() {
9991
- this.isLoading.set(true);
9992
- this.utilityModalService
9993
- .unbindUtility(this.utility().id)
9994
- .pipe(takeUntilDestroyed(this.destroyRef), finalize(() => this.isLoading.set(false)))
9995
- .subscribe((utility) => {
9996
- this.utilityUnbinded.emit(utility);
9997
- });
9987
+ this.thumbnailUrl = input.required();
9988
+ this.isVideo = input(false);
9998
9989
  }
9999
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiReadonlyUtilityModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
10000
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: CuiReadonlyUtilityModalComponent, isStandalone: true, selector: "cui-readonly-utility-modal", inputs: { utility: { classPropertyName: "utility", publicName: "utility", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { utilityUnbinded: "utilityUnbinded" }, ngImport: i0, template: "<ng-container *transloco=\"let t\">\n <header class=\"header\">\n <ng-container [ngTemplateOutlet]=\"header\" />\n\n <cui-badge\n color=\"violet\"\n class=\"badge\"\n >\n <cui-svg\n class=\"icon\"\n icon=\"cuiIconVariant\"\n color=\"var(--cui-violet-400)\"\n />\n {{ t('INSERTED') }}\n </cui-badge>\n\n <button\n type=\"button\"\n cuiButton\n appearance=\"ghost\"\n icon=\"cuiIconX\"\n class=\"button\"\n (click)=\"onClose()\"\n ></button>\n </header>\n\n <ng-content />\n\n <div class=\"actions\">\n <button\n type=\"button\"\n #button\n cuiButton\n size=\"sm\"\n icon=\"cuiIconLinkBroken\"\n appearance=\"action-violet\"\n [isLoaderShown]=\"isLoading()\"\n (click)=\"onUnbind()\"\n >\n {{ t('UNBIND') }}\n </button>\n </div>\n</ng-container>\n", styles: [".header{display:flex;flex-direction:row;gap:8px;align-items:center;justify-content:flex-start;padding:16px 24px}.header__title{font-weight:500;font-size:16px;line-height:24px}.button{margin-left:auto}.actions{padding:16px;border-top:1px solid var(--cui-base-200)}.badge{display:flex;flex-direction:row;gap:4px;align-items:center;justify-content:flex-start;font-weight:500;font-size:14px;line-height:20px}\n"], dependencies: [{ kind: "ngmodule", type: CuiBadgeModule }, { kind: "component", type: CuiBadgeComponent, selector: "cui-badge", inputs: ["color", "size", "isWithDot"] }, { kind: "ngmodule", type: CuiButtonModule }, { kind: "component", type: CuiButtonComponent, selector: "button[cuiButton], a[cuiButton]", inputs: ["shape", "disabled", "isLoaderShown", "icon", "iconRight", "appearance", "theme", "size"] }, { kind: "ngmodule", type: CuiSvgModule }, { kind: "component", type: CuiSvgComponent, selector: "cui-svg[icon]", inputs: ["width", "height", "strokeWidth", "color", "icon"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
9990
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiUtilityReadonlyThumbnailComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
9991
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: CuiUtilityReadonlyThumbnailComponent, isStandalone: true, selector: "cui-utility-readonly-thumbnail", inputs: { thumbnailUrl: { classPropertyName: "thumbnailUrl", publicName: "thumbnailUrl", isSignal: true, isRequired: true, transformFunction: null }, isVideo: { classPropertyName: "isVideo", publicName: "isVideo", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@let url = thumbnailUrl();\n\n@if (url?.src; as src) {\n @if (isVideo()) {\n <video\n class=\"thumbnail\"\n [src]=\"src\"\n controls\n ></video>\n } @else {\n <img\n class=\"thumbnail\"\n [src]=\"src\"\n [alt]=\"url?.name\"\n />\n }\n}\n", styles: [".thumbnail{width:100%;max-height:271px;object-fit:contain}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
10001
9992
  }
10002
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiReadonlyUtilityModalComponent, decorators: [{
9993
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiUtilityReadonlyThumbnailComponent, decorators: [{
10003
9994
  type: Component,
10004
- args: [{ selector: 'cui-readonly-utility-modal', imports: [CuiBadgeModule, CuiButtonModule, CuiSvgModule, NgTemplateOutlet, TranslocoDirective], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *transloco=\"let t\">\n <header class=\"header\">\n <ng-container [ngTemplateOutlet]=\"header\" />\n\n <cui-badge\n color=\"violet\"\n class=\"badge\"\n >\n <cui-svg\n class=\"icon\"\n icon=\"cuiIconVariant\"\n color=\"var(--cui-violet-400)\"\n />\n {{ t('INSERTED') }}\n </cui-badge>\n\n <button\n type=\"button\"\n cuiButton\n appearance=\"ghost\"\n icon=\"cuiIconX\"\n class=\"button\"\n (click)=\"onClose()\"\n ></button>\n </header>\n\n <ng-content />\n\n <div class=\"actions\">\n <button\n type=\"button\"\n #button\n cuiButton\n size=\"sm\"\n icon=\"cuiIconLinkBroken\"\n appearance=\"action-violet\"\n [isLoaderShown]=\"isLoading()\"\n (click)=\"onUnbind()\"\n >\n {{ t('UNBIND') }}\n </button>\n </div>\n</ng-container>\n", styles: [".header{display:flex;flex-direction:row;gap:8px;align-items:center;justify-content:flex-start;padding:16px 24px}.header__title{font-weight:500;font-size:16px;line-height:24px}.button{margin-left:auto}.actions{padding:16px;border-top:1px solid var(--cui-base-200)}.badge{display:flex;flex-direction:row;gap:4px;align-items:center;justify-content:flex-start;font-weight:500;font-size:14px;line-height:20px}\n"] }]
9995
+ args: [{ selector: 'cui-utility-readonly-thumbnail', imports: [], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "@let url = thumbnailUrl();\n\n@if (url?.src; as src) {\n @if (isVideo()) {\n <video\n class=\"thumbnail\"\n [src]=\"src\"\n controls\n ></video>\n } @else {\n <img\n class=\"thumbnail\"\n [src]=\"src\"\n [alt]=\"url?.name\"\n />\n }\n}\n", styles: [".thumbnail{width:100%;max-height:271px;object-fit:contain}\n"] }]
10005
9996
  }] });
10006
9997
 
10007
9998
  class CuiCriterionReadonlyInfoComponent {
10008
9999
  constructor() {
10009
10000
  this.hostElement = inject(ElementRef).nativeElement;
10010
10001
  this.frameApiService = inject(CuiFrameApiService);
10002
+ this.resourceApiService = inject(CuiResourceApiService);
10011
10003
  this.isVideo = false;
10012
10004
  this.jText = signal(null);
10013
- this.thumbnailUrl = signal(null);
10005
+ this.resource = signal(null);
10006
+ this.thumbnailUrl = computed(() => {
10007
+ const resource = this.resource();
10008
+ if (!resource?.fileId) {
10009
+ return of(null);
10010
+ }
10011
+ return this.resourceApiService.get(resource.fileId, this.config().requestOptions).pipe(map((url) => {
10012
+ return {
10013
+ src: URL.createObjectURL(url),
10014
+ name: resource.name || resource.type
10015
+ };
10016
+ }));
10017
+ });
10014
10018
  this.isDescriptionEmpty = computed(() => !this.jText()?.notEmpty);
10015
10019
  this.framerId = input.required();
10016
- this.element = input(this.hostElement);
10017
- this.tools = input.required();
10018
- this.editorResourceUrl = input.required();
10020
+ this.config = input.required();
10019
10021
  this.initConfigEffect();
10020
10022
  this.initFramerIdEffect();
10021
10023
  }
10022
10024
  initConfigEffect() {
10023
10025
  effect(() => {
10024
- this.editorConfig = { readOnly: true, tools: this.tools(), element: this.element() };
10026
+ this.editorConfig = { readOnly: true, element: this.hostElement, ...this.config() };
10025
10027
  });
10026
10028
  }
10027
10029
  initFramerIdEffect() {
@@ -10037,7 +10039,7 @@ class CuiCriterionReadonlyInfoComponent {
10037
10039
  initFrameFragments() {
10038
10040
  const frameId = this.framerId();
10039
10041
  this.jText.set(null);
10040
- this.thumbnailUrl.set(null);
10042
+ this.resource.set(null);
10041
10043
  if (!frameId) {
10042
10044
  return;
10043
10045
  }
@@ -10046,39 +10048,69 @@ class CuiCriterionReadonlyInfoComponent {
10046
10048
  this.jText.set(fragment);
10047
10049
  },
10048
10050
  ["RESOURCE_FILE" /* FragmentType.resourceFile */]: (fragment) => {
10049
- this.setResourceFile(fragment);
10051
+ this.resource.set(fragment);
10050
10052
  }
10051
10053
  };
10052
10054
  this.subscription = this.frameApiService.getFrame(frameId).subscribe((frame) => {
10053
10055
  frame.fragments.forEach((fragment) => fragmentActions[fragment.type](fragment));
10054
10056
  });
10055
10057
  }
10056
- setResourceFile(resource) {
10057
- const url = `${this.editorResourceUrl()}${resource.fileId}`;
10058
- this.isVideo = resource?.name?.split('.').pop() === 'mp4';
10059
- if (!url) {
10060
- return;
10061
- }
10062
- this.thumbnailUrl.set({ src: resource.fileId && url, name: resource.name || resource.type });
10063
- }
10064
10058
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiCriterionReadonlyInfoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
10065
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: CuiCriterionReadonlyInfoComponent, isStandalone: true, selector: "cui-criterion-readonly-info", inputs: { framerId: { classPropertyName: "framerId", publicName: "framerId", isSignal: true, isRequired: true, transformFunction: null }, element: { classPropertyName: "element", publicName: "element", isSignal: true, isRequired: false, transformFunction: null }, tools: { classPropertyName: "tools", publicName: "tools", isSignal: true, isRequired: true, transformFunction: null }, editorResourceUrl: { classPropertyName: "editorResourceUrl", publicName: "editorResourceUrl", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<ng-container *transloco=\"let t\">\n @if (jText()) {\n @if (!isDescriptionEmpty()) {\n @if (thumbnailUrl(); as thumbnailUrl) {\n <cui-utility-readonly-thumbnail\n [thumbnailUrl]=\"thumbnailUrl\"\n [isVideo]=\"isVideo\"\n />\n }\n\n @if (jText()?.id; as id) {\n <div class=\"wrapper\">\n <cui-editor\n class=\"editor\"\n [editorApiId]=\"id\"\n [config]=\"editorConfig\"\n />\n </div>\n }\n } @else {\n <cui-empty-state [subtitle]=\"t('NO_DESCRIPTION_WAS_PROVIDED')\" />\n }\n }\n</ng-container>\n", styles: [":host{padding-top:16px;padding-right:16px;padding-left:16px;display:flex;flex-direction:column;gap:12px;height:100%;overflow:auto}.wrapper{padding:12px}.editor{display:block;height:100%;overflow:auto}\n"], dependencies: [{ kind: "component", type: CuiEditorComponent, selector: "cui-editor", inputs: ["editorApiId", "config", "requestSize"], outputs: ["editorEmpty"] }, { kind: "component", type: CuiEmptyStateComponent, selector: "cui-empty-state, [cuiEmptyState]", inputs: ["title", "subtitle"] }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "component", type: CuiUtilityReadonlyThumbnailComponent, selector: "cui-utility-readonly-thumbnail", inputs: ["thumbnailUrl", "isVideo"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
10059
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: CuiCriterionReadonlyInfoComponent, isStandalone: true, selector: "cui-criterion-readonly-info", inputs: { framerId: { classPropertyName: "framerId", publicName: "framerId", isSignal: true, isRequired: true, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<ng-container *transloco=\"let t\">\n @if (jText()) {\n @if (!isDescriptionEmpty()) {\n @if (thumbnailUrl() | async; as thumbnailUrl) {\n <cui-utility-readonly-thumbnail\n [thumbnailUrl]=\"thumbnailUrl\"\n [isVideo]=\"isVideo\"\n />\n }\n\n @if (jText()?.id; as id) {\n <div class=\"wrapper\">\n <cui-editor\n class=\"editor\"\n [editorApiId]=\"id\"\n [config]=\"editorConfig\"\n />\n </div>\n }\n } @else {\n <cui-empty-state [subtitle]=\"t('NO_DESCRIPTION_WAS_PROVIDED')\" />\n }\n }\n</ng-container>\n", styles: [":host{padding-top:16px;padding-right:16px;padding-left:16px;display:flex;flex-direction:column;gap:12px;height:100%;overflow:auto}.wrapper{padding:12px}.editor{display:block;height:100%;overflow:auto}\n"], dependencies: [{ kind: "component", type: CuiEditorComponent, selector: "cui-editor", inputs: ["editorApiId", "config", "requestSize"], outputs: ["editorEmpty"] }, { kind: "component", type: CuiEmptyStateComponent, selector: "cui-empty-state, [cuiEmptyState]", inputs: ["title", "subtitle"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "component", type: CuiUtilityReadonlyThumbnailComponent, selector: "cui-utility-readonly-thumbnail", inputs: ["thumbnailUrl", "isVideo"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
10066
10060
  }
10067
10061
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiCriterionReadonlyInfoComponent, decorators: [{
10068
10062
  type: Component,
10069
- args: [{ selector: 'cui-criterion-readonly-info', imports: [CuiEditorComponent, CuiEmptyStateComponent, TranslocoDirective, CuiUtilityReadonlyThumbnailComponent], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *transloco=\"let t\">\n @if (jText()) {\n @if (!isDescriptionEmpty()) {\n @if (thumbnailUrl(); as thumbnailUrl) {\n <cui-utility-readonly-thumbnail\n [thumbnailUrl]=\"thumbnailUrl\"\n [isVideo]=\"isVideo\"\n />\n }\n\n @if (jText()?.id; as id) {\n <div class=\"wrapper\">\n <cui-editor\n class=\"editor\"\n [editorApiId]=\"id\"\n [config]=\"editorConfig\"\n />\n </div>\n }\n } @else {\n <cui-empty-state [subtitle]=\"t('NO_DESCRIPTION_WAS_PROVIDED')\" />\n }\n }\n</ng-container>\n", styles: [":host{padding-top:16px;padding-right:16px;padding-left:16px;display:flex;flex-direction:column;gap:12px;height:100%;overflow:auto}.wrapper{padding:12px}.editor{display:block;height:100%;overflow:auto}\n"] }]
10063
+ args: [{ selector: 'cui-criterion-readonly-info', imports: [CuiEditorComponent, CuiEmptyStateComponent, AsyncPipe, TranslocoDirective, CuiUtilityReadonlyThumbnailComponent], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *transloco=\"let t\">\n @if (jText()) {\n @if (!isDescriptionEmpty()) {\n @if (thumbnailUrl() | async; as thumbnailUrl) {\n <cui-utility-readonly-thumbnail\n [thumbnailUrl]=\"thumbnailUrl\"\n [isVideo]=\"isVideo\"\n />\n }\n\n @if (jText()?.id; as id) {\n <div class=\"wrapper\">\n <cui-editor\n class=\"editor\"\n [editorApiId]=\"id\"\n [config]=\"editorConfig\"\n />\n </div>\n }\n } @else {\n <cui-empty-state [subtitle]=\"t('NO_DESCRIPTION_WAS_PROVIDED')\" />\n }\n }\n</ng-container>\n", styles: [":host{padding-top:16px;padding-right:16px;padding-left:16px;display:flex;flex-direction:column;gap:12px;height:100%;overflow:auto}.wrapper{padding:12px}.editor{display:block;height:100%;overflow:auto}\n"] }]
10070
10064
  }], ctorParameters: () => [] });
10071
10065
 
10066
+ class CuiReadonlyUtilityModalComponent {
10067
+ constructor() {
10068
+ this.destroyRef = inject(DestroyRef);
10069
+ this.cuiDialogContext = inject(CUI_DIALOG_CONTEXT);
10070
+ this.utilityModalService = inject(UTILITY_MODAL_SERVICE_TOKEN);
10071
+ this.editorResourceUrl = this.cuiDialogContext.data.editorResourceUrl;
10072
+ this.tools = this.cuiDialogContext.data.tools;
10073
+ this.header = this.cuiDialogContext.data.header;
10074
+ this.isLoading = signal(false);
10075
+ this.utility = input.required();
10076
+ this.utilityUnbinded = output();
10077
+ }
10078
+ onClose() {
10079
+ this.cuiDialogContext.completeWith();
10080
+ }
10081
+ onUnbind() {
10082
+ this.isLoading.set(true);
10083
+ this.utilityModalService
10084
+ .unbindUtility(this.utility().id)
10085
+ .pipe(takeUntilDestroyed(this.destroyRef), finalize(() => this.isLoading.set(false)))
10086
+ .subscribe((utility) => {
10087
+ this.utilityUnbinded.emit(utility);
10088
+ });
10089
+ }
10090
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiReadonlyUtilityModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
10091
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: CuiReadonlyUtilityModalComponent, isStandalone: true, selector: "cui-readonly-utility-modal", inputs: { utility: { classPropertyName: "utility", publicName: "utility", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { utilityUnbinded: "utilityUnbinded" }, ngImport: i0, template: "<ng-container *transloco=\"let t\">\n <header class=\"header\">\n <ng-container [ngTemplateOutlet]=\"header\" />\n\n <cui-badge\n color=\"violet\"\n class=\"badge\"\n >\n <cui-svg\n class=\"icon\"\n icon=\"cuiIconVariant\"\n color=\"var(--cui-violet-400)\"\n />\n {{ t('INSERTED') }}\n </cui-badge>\n\n <button\n type=\"button\"\n cuiButton\n appearance=\"ghost\"\n icon=\"cuiIconX\"\n class=\"button\"\n (click)=\"onClose()\"\n ></button>\n </header>\n\n <ng-content />\n\n <div class=\"actions\">\n <button\n type=\"button\"\n #button\n cuiButton\n size=\"sm\"\n icon=\"cuiIconLinkBroken\"\n appearance=\"action-violet\"\n [isLoaderShown]=\"isLoading()\"\n (click)=\"onUnbind()\"\n >\n {{ t('UNBIND') }}\n </button>\n </div>\n</ng-container>\n", styles: [".header{display:flex;flex-direction:row;gap:8px;align-items:center;justify-content:flex-start;padding:16px 24px}.header__title{font-weight:500;font-size:16px;line-height:24px}.button{margin-left:auto}.actions{padding:16px;border-top:1px solid var(--cui-base-200)}.badge{display:flex;flex-direction:row;gap:4px;align-items:center;justify-content:flex-start;font-weight:500;font-size:14px;line-height:20px}\n"], dependencies: [{ kind: "ngmodule", type: CuiBadgeModule }, { kind: "component", type: CuiBadgeComponent, selector: "cui-badge", inputs: ["color", "size", "isWithDot"] }, { kind: "ngmodule", type: CuiButtonModule }, { kind: "component", type: CuiButtonComponent, selector: "button[cuiButton], a[cuiButton]", inputs: ["shape", "disabled", "isLoaderShown", "icon", "iconRight", "appearance", "theme", "size"] }, { kind: "ngmodule", type: CuiSvgModule }, { kind: "component", type: CuiSvgComponent, selector: "cui-svg[icon]", inputs: ["width", "height", "strokeWidth", "color", "icon"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
10092
+ }
10093
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiReadonlyUtilityModalComponent, decorators: [{
10094
+ type: Component,
10095
+ args: [{ selector: 'cui-readonly-utility-modal', imports: [CuiBadgeModule, CuiButtonModule, CuiSvgModule, NgTemplateOutlet, TranslocoDirective], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *transloco=\"let t\">\n <header class=\"header\">\n <ng-container [ngTemplateOutlet]=\"header\" />\n\n <cui-badge\n color=\"violet\"\n class=\"badge\"\n >\n <cui-svg\n class=\"icon\"\n icon=\"cuiIconVariant\"\n color=\"var(--cui-violet-400)\"\n />\n {{ t('INSERTED') }}\n </cui-badge>\n\n <button\n type=\"button\"\n cuiButton\n appearance=\"ghost\"\n icon=\"cuiIconX\"\n class=\"button\"\n (click)=\"onClose()\"\n ></button>\n </header>\n\n <ng-content />\n\n <div class=\"actions\">\n <button\n type=\"button\"\n #button\n cuiButton\n size=\"sm\"\n icon=\"cuiIconLinkBroken\"\n appearance=\"action-violet\"\n [isLoaderShown]=\"isLoading()\"\n (click)=\"onUnbind()\"\n >\n {{ t('UNBIND') }}\n </button>\n </div>\n</ng-container>\n", styles: [".header{display:flex;flex-direction:row;gap:8px;align-items:center;justify-content:flex-start;padding:16px 24px}.header__title{font-weight:500;font-size:16px;line-height:24px}.button{margin-left:auto}.actions{padding:16px;border-top:1px solid var(--cui-base-200)}.badge{display:flex;flex-direction:row;gap:4px;align-items:center;justify-content:flex-start;font-weight:500;font-size:14px;line-height:20px}\n"] }]
10096
+ }] });
10097
+
10072
10098
  class CuiReadonlyCriterionModalComponent {
10073
10099
  constructor() {
10074
10100
  this.cuiDialogContext = inject(CUI_DIALOG_CONTEXT);
10075
10101
  this.cuiRenderDynamicComponentsService = inject(CuiRenderDynamicComponentsService);
10076
- this.editorResourceUrl = this.cuiDialogContext.data.editorResourceUrl;
10077
10102
  this.tools = this.cuiDialogContext.data.tools;
10078
10103
  this.header = this.cuiDialogContext.data.header;
10079
10104
  this.isLoading = signal(false);
10105
+ this.config = computed(() => ({
10106
+ tools: this.tools(),
10107
+ requestOptions: this.context(),
10108
+ element: this.element()?.nativeElement
10109
+ }));
10080
10110
  this.framerId = computed(() => this.criterion().storageElement.framerCriterionId);
10111
+ this.element = viewChild('scrollContainer');
10081
10112
  this.criterion = input.required();
10113
+ this.context = input.required();
10082
10114
  }
10083
10115
  onUnbind(criterion) {
10084
10116
  this.cuiRenderDynamicComponentsService.closeAll();
@@ -10088,7 +10120,7 @@ class CuiReadonlyCriterionModalComponent {
10088
10120
  });
10089
10121
  }
10090
10122
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiReadonlyCriterionModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
10091
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: CuiReadonlyCriterionModalComponent, isStandalone: true, selector: "cui-readonly-criterion-modal", inputs: { criterion: { classPropertyName: "criterion", publicName: "criterion", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<cui-readonly-utility-modal\n [utility]=\"criterion()\"\n (utilityUnbinded)=\"onUnbind($event)\"\n>\n <ng-container *transloco=\"let t\">\n <div\n #scrollContainer\n class=\"info\"\n >\n <h3 class=\"title\">{{ criterion().storageElement.title }}</h3>\n\n <cui-criterion-readonly-info\n [framerId]=\"framerId()\"\n [editorResourceUrl]=\"editorResourceUrl\"\n [tools]=\"tools\"\n [element]=\"scrollContainer\"\n class=\"info__block\"\n />\n </div>\n </ng-container>\n</cui-readonly-utility-modal>\n", styles: [".info{padding:16px 8px;display:flex;flex-direction:column;height:calc(100vh - 177px);overflow:auto}.info__block{overflow:visible}.title{padding-right:16px;padding-left:16px;font-weight:500;font-size:16px;line-height:24px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;overflow:visible}\n"], dependencies: [{ kind: "ngmodule", type: CuiBadgeModule }, { kind: "ngmodule", type: CuiButtonModule }, { kind: "ngmodule", type: CuiSvgModule }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "component", type: CuiReadonlyUtilityModalComponent, selector: "cui-readonly-utility-modal", inputs: ["utility"], outputs: ["utilityUnbinded"] }, { kind: "component", type: CuiCriterionReadonlyInfoComponent, selector: "cui-criterion-readonly-info", inputs: ["framerId", "element", "tools", "editorResourceUrl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
10123
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.14", type: CuiReadonlyCriterionModalComponent, isStandalone: true, selector: "cui-readonly-criterion-modal", inputs: { criterion: { classPropertyName: "criterion", publicName: "criterion", isSignal: true, isRequired: true, transformFunction: null }, context: { classPropertyName: "context", publicName: "context", isSignal: true, isRequired: true, transformFunction: null } }, viewQueries: [{ propertyName: "element", first: true, predicate: ["scrollContainer"], descendants: true, isSignal: true }], ngImport: i0, template: "<cui-readonly-utility-modal\n [utility]=\"criterion()\"\n (utilityUnbinded)=\"onUnbind($event)\"\n>\n <ng-container *transloco=\"let t\">\n <div\n #scrollContainer\n class=\"info\"\n >\n <h3 class=\"title\">{{ criterion().storageElement.title }}</h3>\n\n <cui-criterion-readonly-info\n [framerId]=\"framerId()\"\n [config]=\"config()\"\n class=\"info__block\"\n />\n </div>\n </ng-container>\n</cui-readonly-utility-modal>\n", styles: [".info{padding:16px 8px;display:flex;flex-direction:column;height:calc(100vh - 177px);overflow:auto}.info__block{overflow:visible}.title{padding-right:16px;padding-left:16px;font-weight:500;font-size:16px;line-height:24px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;overflow:visible}\n"], dependencies: [{ kind: "ngmodule", type: CuiBadgeModule }, { kind: "ngmodule", type: CuiButtonModule }, { kind: "ngmodule", type: CuiSvgModule }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "component", type: CuiReadonlyUtilityModalComponent, selector: "cui-readonly-utility-modal", inputs: ["utility"], outputs: ["utilityUnbinded"] }, { kind: "component", type: CuiCriterionReadonlyInfoComponent, selector: "cui-criterion-readonly-info", inputs: ["framerId", "config"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
10092
10124
  }
10093
10125
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiReadonlyCriterionModalComponent, decorators: [{
10094
10126
  type: Component,
@@ -10099,19 +10131,93 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
10099
10131
  TranslocoDirective,
10100
10132
  CuiReadonlyUtilityModalComponent,
10101
10133
  CuiCriterionReadonlyInfoComponent
10102
- ], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<cui-readonly-utility-modal\n [utility]=\"criterion()\"\n (utilityUnbinded)=\"onUnbind($event)\"\n>\n <ng-container *transloco=\"let t\">\n <div\n #scrollContainer\n class=\"info\"\n >\n <h3 class=\"title\">{{ criterion().storageElement.title }}</h3>\n\n <cui-criterion-readonly-info\n [framerId]=\"framerId()\"\n [editorResourceUrl]=\"editorResourceUrl\"\n [tools]=\"tools\"\n [element]=\"scrollContainer\"\n class=\"info__block\"\n />\n </div>\n </ng-container>\n</cui-readonly-utility-modal>\n", styles: [".info{padding:16px 8px;display:flex;flex-direction:column;height:calc(100vh - 177px);overflow:auto}.info__block{overflow:visible}.title{padding-right:16px;padding-left:16px;font-weight:500;font-size:16px;line-height:24px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;overflow:visible}\n"] }]
10134
+ ], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<cui-readonly-utility-modal\n [utility]=\"criterion()\"\n (utilityUnbinded)=\"onUnbind($event)\"\n>\n <ng-container *transloco=\"let t\">\n <div\n #scrollContainer\n class=\"info\"\n >\n <h3 class=\"title\">{{ criterion().storageElement.title }}</h3>\n\n <cui-criterion-readonly-info\n [framerId]=\"framerId()\"\n [config]=\"config()\"\n class=\"info__block\"\n />\n </div>\n </ng-container>\n</cui-readonly-utility-modal>\n", styles: [".info{padding:16px 8px;display:flex;flex-direction:column;height:calc(100vh - 177px);overflow:auto}.info__block{overflow:visible}.title{padding-right:16px;padding-left:16px;font-weight:500;font-size:16px;line-height:24px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;overflow:visible}\n"] }]
10103
10135
  }] });
10104
10136
 
10137
+ class CuiInstructionReadonlyInfoComponent {
10138
+ constructor() {
10139
+ this.hostElement = inject(ElementRef).nativeElement;
10140
+ this.frameApiService = inject(CuiFrameApiService);
10141
+ this.resourceApiService = inject(CuiResourceApiService);
10142
+ this.isVideo = false;
10143
+ this.jText = signal(null);
10144
+ this.resource = signal(null);
10145
+ this.thumbnailUrl = computed(() => {
10146
+ const resource = this.resource();
10147
+ if (!resource?.fileId) {
10148
+ return of(null);
10149
+ }
10150
+ return this.resourceApiService.get(resource.fileId, this.config().requestOptions).pipe(map((url) => {
10151
+ return {
10152
+ src: URL.createObjectURL(url),
10153
+ name: resource.name || resource.type
10154
+ };
10155
+ }));
10156
+ });
10157
+ this.isDescriptionEmpty = computed(() => !this.jText()?.notEmpty);
10158
+ this.framerId = input.required();
10159
+ this.config = input.required();
10160
+ this.initConfigEffect();
10161
+ this.initFramerIdEffect();
10162
+ }
10163
+ initConfigEffect() {
10164
+ effect(() => {
10165
+ this.editorConfig = { readOnly: true, element: this.hostElement, ...this.config() };
10166
+ });
10167
+ }
10168
+ initFramerIdEffect() {
10169
+ effect(() => {
10170
+ const framerId = this.framerId();
10171
+ if (!framerId) {
10172
+ return;
10173
+ }
10174
+ this.subscription?.unsubscribe();
10175
+ this.initFrameFragments();
10176
+ });
10177
+ }
10178
+ initFrameFragments() {
10179
+ const frameId = this.framerId();
10180
+ this.jText.set(null);
10181
+ this.resource.set(null);
10182
+ if (!frameId) {
10183
+ return;
10184
+ }
10185
+ const fragmentActions = {
10186
+ ["J_TEXT" /* FragmentType.jText */]: (fragment) => {
10187
+ this.jText.set(fragment);
10188
+ },
10189
+ ["RESOURCE_FILE" /* FragmentType.resourceFile */]: (fragment) => {
10190
+ this.resource.set(fragment);
10191
+ }
10192
+ };
10193
+ this.subscription = this.frameApiService.getFrame(frameId).subscribe((frame) => {
10194
+ frame.fragments.forEach((fragment) => fragmentActions[fragment.type](fragment));
10195
+ });
10196
+ }
10197
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiInstructionReadonlyInfoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
10198
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: CuiInstructionReadonlyInfoComponent, isStandalone: true, selector: "cui-instruction-readonly-info", inputs: { framerId: { classPropertyName: "framerId", publicName: "framerId", isSignal: true, isRequired: true, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<ng-container *transloco=\"let t\">\n @if (jText()) {\n @if (!isDescriptionEmpty()) {\n @if (thumbnailUrl() | async; as thumbnailUrl) {\n <cui-utility-readonly-thumbnail\n [thumbnailUrl]=\"thumbnailUrl\"\n [isVideo]=\"isVideo\"\n />\n }\n\n @if (jText()?.id; as id) {\n <div class=\"wrapper\">\n <cui-editor\n class=\"editor\"\n [editorApiId]=\"id\"\n [config]=\"editorConfig\"\n />\n </div>\n }\n } @else {\n <cui-empty-state [subtitle]=\"t('NO_DESCRIPTION_WAS_PROVIDED')\" />\n }\n }\n</ng-container>\n", styles: [":host{padding-top:16px;padding-right:16px;padding-left:16px;display:flex;flex-direction:column;gap:12px;height:100%;overflow:auto}.wrapper{padding:12px}.editor{display:block;height:100%;overflow:auto}\n"], dependencies: [{ kind: "component", type: CuiEditorComponent, selector: "cui-editor", inputs: ["editorApiId", "config", "requestSize"], outputs: ["editorEmpty"] }, { kind: "component", type: CuiEmptyStateComponent, selector: "cui-empty-state, [cuiEmptyState]", inputs: ["title", "subtitle"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "component", type: CuiUtilityReadonlyThumbnailComponent, selector: "cui-utility-readonly-thumbnail", inputs: ["thumbnailUrl", "isVideo"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
10199
+ }
10200
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiInstructionReadonlyInfoComponent, decorators: [{
10201
+ type: Component,
10202
+ args: [{ selector: 'cui-instruction-readonly-info', imports: [CuiEditorComponent, CuiEmptyStateComponent, AsyncPipe, TranslocoDirective, CuiUtilityReadonlyThumbnailComponent], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *transloco=\"let t\">\n @if (jText()) {\n @if (!isDescriptionEmpty()) {\n @if (thumbnailUrl() | async; as thumbnailUrl) {\n <cui-utility-readonly-thumbnail\n [thumbnailUrl]=\"thumbnailUrl\"\n [isVideo]=\"isVideo\"\n />\n }\n\n @if (jText()?.id; as id) {\n <div class=\"wrapper\">\n <cui-editor\n class=\"editor\"\n [editorApiId]=\"id\"\n [config]=\"editorConfig\"\n />\n </div>\n }\n } @else {\n <cui-empty-state [subtitle]=\"t('NO_DESCRIPTION_WAS_PROVIDED')\" />\n }\n }\n</ng-container>\n", styles: [":host{padding-top:16px;padding-right:16px;padding-left:16px;display:flex;flex-direction:column;gap:12px;height:100%;overflow:auto}.wrapper{padding:12px}.editor{display:block;height:100%;overflow:auto}\n"] }]
10203
+ }], ctorParameters: () => [] });
10204
+
10105
10205
  class CuiReadonlyInstructionModalComponent {
10106
10206
  constructor() {
10107
10207
  this.cuiDialogContext = inject(CUI_DIALOG_CONTEXT);
10108
10208
  this.cuiRenderDynamicComponentsService = inject(CuiRenderDynamicComponentsService);
10109
- this.editorResourceUrl = this.cuiDialogContext.data.editorResourceUrl;
10110
10209
  this.tools = this.cuiDialogContext.data.tools;
10111
10210
  this.header = this.cuiDialogContext.data.header;
10112
10211
  this.isLoading = signal(false);
10212
+ this.config = computed(() => ({
10213
+ tools: this.tools(),
10214
+ requestOptions: this.context(),
10215
+ element: this.element()?.nativeElement
10216
+ }));
10113
10217
  this.framerId = computed(() => this.instruction().storageElement.framerInstructionId);
10218
+ this.element = viewChild('scrollContainer');
10114
10219
  this.instruction = input.required();
10220
+ this.context = input.required();
10115
10221
  }
10116
10222
  onUnbind(instruction) {
10117
10223
  this.cuiRenderDynamicComponentsService.closeAll();
@@ -10121,7 +10227,7 @@ class CuiReadonlyInstructionModalComponent {
10121
10227
  });
10122
10228
  }
10123
10229
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiReadonlyInstructionModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
10124
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: CuiReadonlyInstructionModalComponent, isStandalone: true, selector: "cui-readonly-instruction-modal", inputs: { instruction: { classPropertyName: "instruction", publicName: "instruction", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<ng-container *transloco=\"let t\">\n <cui-readonly-utility-modal\n [utility]=\"instruction()\"\n (utilityUnbinded)=\"onUnbind($event)\"\n >\n <div\n #scrollContainer\n class=\"info\"\n >\n <h3 class=\"title\">{{ instruction().storageElement.title }}</h3>\n\n <cui-instruction-readonly-info\n [framerId]=\"framerId()\"\n [editorResourceUrl]=\"editorResourceUrl\"\n [tools]=\"tools\"\n [element]=\"scrollContainer\"\n class=\"info__block\"\n />\n </div>\n </cui-readonly-utility-modal>\n</ng-container>\n", styles: [".info{padding:16px 8px;display:flex;flex-direction:column;height:calc(100vh - 177px);overflow:auto}.info__block{overflow:visible}.title{padding-right:16px;padding-left:16px;font-weight:500;font-size:16px;line-height:24px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;overflow:visible}\n"], dependencies: [{ kind: "ngmodule", type: CuiBadgeModule }, { kind: "ngmodule", type: CuiButtonModule }, { kind: "ngmodule", type: CuiSvgModule }, { kind: "component", type: CuiInstructionReadonlyInfoComponent, selector: "cui-instruction-readonly-info", inputs: ["framerId", "element", "tools", "editorResourceUrl"] }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "component", type: CuiReadonlyUtilityModalComponent, selector: "cui-readonly-utility-modal", inputs: ["utility"], outputs: ["utilityUnbinded"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
10230
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.14", type: CuiReadonlyInstructionModalComponent, isStandalone: true, selector: "cui-readonly-instruction-modal", inputs: { instruction: { classPropertyName: "instruction", publicName: "instruction", isSignal: true, isRequired: true, transformFunction: null }, context: { classPropertyName: "context", publicName: "context", isSignal: true, isRequired: true, transformFunction: null } }, viewQueries: [{ propertyName: "element", first: true, predicate: ["scrollContainer"], descendants: true, isSignal: true }], ngImport: i0, template: "<ng-container *transloco=\"let t\">\n <cui-readonly-utility-modal\n [utility]=\"instruction()\"\n (utilityUnbinded)=\"onUnbind($event)\"\n >\n <div\n #scrollContainer\n class=\"info\"\n >\n <h3 class=\"title\">{{ instruction().storageElement.title }}</h3>\n\n <cui-instruction-readonly-info\n [framerId]=\"framerId()\"\n [config]=\"config()\"\n class=\"info__block\"\n />\n </div>\n </cui-readonly-utility-modal>\n</ng-container>\n", styles: [".info{padding:16px 8px;display:flex;flex-direction:column;height:calc(100vh - 177px);overflow:auto}.info__block{overflow:visible}.title{padding-right:16px;padding-left:16px;font-weight:500;font-size:16px;line-height:24px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;overflow:visible}\n"], dependencies: [{ kind: "ngmodule", type: CuiBadgeModule }, { kind: "ngmodule", type: CuiButtonModule }, { kind: "ngmodule", type: CuiSvgModule }, { kind: "component", type: CuiInstructionReadonlyInfoComponent, selector: "cui-instruction-readonly-info", inputs: ["framerId", "config"] }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "component", type: CuiReadonlyUtilityModalComponent, selector: "cui-readonly-utility-modal", inputs: ["utility"], outputs: ["utilityUnbinded"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
10125
10231
  }
10126
10232
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiReadonlyInstructionModalComponent, decorators: [{
10127
10233
  type: Component,
@@ -10132,7 +10238,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
10132
10238
  CuiInstructionReadonlyInfoComponent,
10133
10239
  TranslocoDirective,
10134
10240
  CuiReadonlyUtilityModalComponent
10135
- ], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *transloco=\"let t\">\n <cui-readonly-utility-modal\n [utility]=\"instruction()\"\n (utilityUnbinded)=\"onUnbind($event)\"\n >\n <div\n #scrollContainer\n class=\"info\"\n >\n <h3 class=\"title\">{{ instruction().storageElement.title }}</h3>\n\n <cui-instruction-readonly-info\n [framerId]=\"framerId()\"\n [editorResourceUrl]=\"editorResourceUrl\"\n [tools]=\"tools\"\n [element]=\"scrollContainer\"\n class=\"info__block\"\n />\n </div>\n </cui-readonly-utility-modal>\n</ng-container>\n", styles: [".info{padding:16px 8px;display:flex;flex-direction:column;height:calc(100vh - 177px);overflow:auto}.info__block{overflow:visible}.title{padding-right:16px;padding-left:16px;font-weight:500;font-size:16px;line-height:24px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;overflow:visible}\n"] }]
10241
+ ], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *transloco=\"let t\">\n <cui-readonly-utility-modal\n [utility]=\"instruction()\"\n (utilityUnbinded)=\"onUnbind($event)\"\n >\n <div\n #scrollContainer\n class=\"info\"\n >\n <h3 class=\"title\">{{ instruction().storageElement.title }}</h3>\n\n <cui-instruction-readonly-info\n [framerId]=\"framerId()\"\n [config]=\"config()\"\n class=\"info__block\"\n />\n </div>\n </cui-readonly-utility-modal>\n</ng-container>\n", styles: [".info{padding:16px 8px;display:flex;flex-direction:column;height:calc(100vh - 177px);overflow:auto}.info__block{overflow:visible}.title{padding-right:16px;padding-left:16px;font-weight:500;font-size:16px;line-height:24px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;overflow:visible}\n"] }]
10136
10242
  }] });
10137
10243
 
10138
10244
  class CuiUtilityModalComponent {
@@ -10162,19 +10268,18 @@ class CuiCriterionInfoComponent {
10162
10268
  this.cuiCategoriesModalService = inject(CuiSelectedCategoryService);
10163
10269
  this.treeStructNavigatorApiService = inject(CuiTreeStructNavigatorApiService);
10164
10270
  this.criterionApiService = inject(UTILITY_MODAL_SERVICE_TOKEN);
10271
+ this.TYPE = "INSTRUCTION_STORAGE" /* TreeStructType.Instruction */;
10165
10272
  this.skipCategoryChange = false;
10166
- this.TYPE = "CRITERION_STORAGE" /* TreeStructType.Criteria */;
10167
10273
  this.categoryId = this.cuiIdService.generate();
10168
10274
  this.category = this.cuiCategoriesModalService.category;
10169
10275
  this.isFormValid = signal(false);
10170
10276
  this.prevCategoryId = signal(null);
10171
10277
  this.editorConfig = signal(null);
10172
10278
  this.labelColor = computed(() => this.category()?.title ? 'var(--cui-base-900)' : 'var(--cui-base-400)');
10173
- this.selectTitle = computed(() => this.category()?.title ?? this.translocoService.translate('SELECT') + '...');
10279
+ this.selectTitle = computed(() => this.category()?.title || this.translocoService.translate('SELECT') + '...');
10174
10280
  this.element = viewChild('scrollContent');
10175
10281
  this.criterion = model();
10176
- this.tools = input.required();
10177
- this.editorResourceUrl = input.required();
10282
+ this.config = input.required();
10178
10283
  this.validationChanged = output();
10179
10284
  this.criterionCreated = output();
10180
10285
  this.initConfigEffect();
@@ -10185,7 +10290,8 @@ class CuiCriterionInfoComponent {
10185
10290
  }
10186
10291
  onFormChanged(values, criterionId) {
10187
10292
  const actions = {
10188
- title: (title) => this.changeTitle(title, criterionId)
10293
+ title: (title) => this.changeTitle(title, criterionId),
10294
+ description: (description) => this.changeDescription(description, criterionId)
10189
10295
  };
10190
10296
  forkJoin(Object.keys(values).map((key) => actions[key](values[key] || '')))
10191
10297
  .pipe(takeUntilDestroyed(this.destroyRef))
@@ -10216,7 +10322,7 @@ class CuiCriterionInfoComponent {
10216
10322
  if (!element) {
10217
10323
  return;
10218
10324
  }
10219
- this.editorConfig.set({ tools: this.tools(), element });
10325
+ this.editorConfig.set({ ...this.config(), element });
10220
10326
  });
10221
10327
  }
10222
10328
  initCategory() {
@@ -10258,8 +10364,17 @@ class CuiCriterionInfoComponent {
10258
10364
  storageElement: { ...prev.storageElement, title: value }
10259
10365
  }))));
10260
10366
  }
10367
+ changeDescription(value, criterionId) {
10368
+ if (!this.criterionApiService.changeDescription) {
10369
+ throw new Error('Change description not implemented');
10370
+ }
10371
+ return this.criterionApiService.changeDescription(criterionId, value).pipe(finalize(() => this.criterion.update((prev) => ({
10372
+ ...prev,
10373
+ storageElement: { ...prev.storageElement, shortDescription: value }
10374
+ }))));
10375
+ }
10261
10376
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiCriterionInfoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
10262
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: CuiCriterionInfoComponent, isStandalone: true, selector: "cui-criterion-info", inputs: { criterion: { classPropertyName: "criterion", publicName: "criterion", isSignal: true, isRequired: false, transformFunction: null }, tools: { classPropertyName: "tools", publicName: "tools", isSignal: true, isRequired: true, transformFunction: null }, editorResourceUrl: { classPropertyName: "editorResourceUrl", publicName: "editorResourceUrl", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { criterion: "criterionChange", validationChanged: "validationChanged", criterionCreated: "criterionCreated" }, providers: [CuiSelectedCategoryService], viewQueries: [{ propertyName: "element", first: true, predicate: ["scrollContent"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n class=\"wrapper\"\n *transloco=\"let t\"\n>\n <div\n #scrollContent\n class=\"content content_scrollable\"\n >\n <div class=\"category\">\n <cui-form-field>\n <label\n cuiLabel\n [for]=\"categoryId\"\n [isRequired]=\"true\"\n >\n {{ t('SELECT_CATEGORY') }}\n </label>\n <cui-categories\n [buttonId]=\"categoryId\"\n [treeStructType]=\"TYPE\"\n >\n <div class=\"select\">\n <span [style.color]=\"labelColor()\">\n {{ selectTitle() }}\n </span>\n\n <cui-svg icon=\"cuiIconChevronDown\" />\n </div>\n </cui-categories>\n </cui-form-field>\n </div>\n\n @let criterionData = criterion();\n @let editorConfigData = editorConfig();\n\n @if (editorConfigData && criterionData) {\n <cui-criterion-info-form\n [config]=\"editorConfigData\"\n [baseResourceUrl]=\"editorResourceUrl()\"\n [title]=\"criterionData.storageElement.title\"\n [framerId]=\"criterionData.storageElement.framerCriterionId\"\n class=\"utility\"\n (isFormValidChanged)=\"onFormValidationChanged($event)\"\n (formChanged)=\"onFormChanged($event, criterionData.id)\"\n />\n }\n </div>\n</div>\n", styles: [".wrapper{display:flex;flex-direction:column;height:100%}.content{height:calc(100vh - 109px)}.content_scrollable{overflow:auto}.category{padding-top:16px;padding-right:23px;padding-left:23px}.select{padding:7px 13px;font-weight:400;font-size:14px;line-height:20px;display:flex;justify-content:space-between;height:36px;border-radius:8px;border:1px solid var(--cui-base-200);color:var(--cui-base-900);background:var(--cui-input)}.utility{--editor-height: none}\n"], dependencies: [{ kind: "ngmodule", type: CuiBadgeModule }, { kind: "ngmodule", type: CuiButtonModule }, { kind: "component", type: CuiCategoriesComponent, selector: "cui-categories", inputs: ["treeStructType", "buttonId", "disabled", "context"] }, { kind: "ngmodule", type: CuiDialogModule }, { kind: "ngmodule", type: CuiFormFieldModule }, { kind: "component", type: CuiFormFieldComponent, selector: "cui-form-field" }, { kind: "component", type: CuiCriterionInfoFormComponent, selector: "cui-criterion-info-form", inputs: ["title", "framerId", "baseResourceUrl", "config"], outputs: ["formChanged", "isFormValidChanged"] }, { kind: "ngmodule", type: CuiLabelModule }, { kind: "component", type: CuiLabelComponent, selector: "label[cuiLabel]", inputs: ["isRequired"] }, { kind: "ngmodule", type: CuiSvgModule }, { kind: "component", type: CuiSvgComponent, selector: "cui-svg[icon]", inputs: ["width", "height", "strokeWidth", "color", "icon"] }, { kind: "ngmodule", type: TranslocoModule }, { kind: "directive", type: i4.TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
10377
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: CuiCriterionInfoComponent, isStandalone: true, selector: "cui-criterion-info", inputs: { criterion: { classPropertyName: "criterion", publicName: "criterion", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { criterion: "criterionChange", validationChanged: "validationChanged", criterionCreated: "criterionCreated" }, providers: [CuiSelectedCategoryService], viewQueries: [{ propertyName: "element", first: true, predicate: ["scrollContent"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n class=\"wrapper\"\n *transloco=\"let t\"\n>\n <div\n #scrollContent\n class=\"content content_scrollable\"\n >\n <div class=\"category\">\n <cui-form-field>\n <label\n cuiLabel\n [for]=\"categoryId\"\n [isRequired]=\"true\"\n >\n {{ t('SELECT_CATEGORY') }}\n </label>\n <cui-categories\n [buttonId]=\"categoryId\"\n [treeStructType]=\"TYPE\"\n >\n <div class=\"select\">\n <span [style.color]=\"labelColor()\">\n {{ selectTitle() }}\n </span>\n\n <cui-svg icon=\"cuiIconChevronDown\" />\n </div>\n </cui-categories>\n </cui-form-field>\n </div>\n\n @let criterionData = criterion();\n @let editorConfigData = editorConfig();\n\n @if (editorConfigData && criterionData) {\n <cui-criterion-info-form\n [config]=\"editorConfigData\"\n [title]=\"criterionData.storageElement.title\"\n [description]=\"criterionData.storageElement.shortDescription\"\n [framerId]=\"criterionData.storageElement.framerCriterionId\"\n class=\"utility\"\n (isFormValidChanged)=\"onFormValidationChanged($event)\"\n (formChanged)=\"onFormChanged($event, criterionData.id)\"\n />\n }\n </div>\n</div>\n", styles: [".wrapper{display:flex;flex-direction:column;height:100%}.content{height:calc(100vh - 109px)}.content_scrollable{overflow:auto}.category{padding-top:16px;padding-right:23px;padding-left:23px}.select{padding:7px 13px;font-weight:400;font-size:14px;line-height:20px;display:flex;justify-content:space-between;height:36px;border-radius:8px;border:1px solid var(--cui-base-200);color:var(--cui-base-900);background:var(--cui-input)}.utility{--editor-height: none}\n"], dependencies: [{ kind: "ngmodule", type: CuiBadgeModule }, { kind: "ngmodule", type: CuiButtonModule }, { kind: "component", type: CuiCategoriesComponent, selector: "cui-categories", inputs: ["treeStructType", "buttonId", "disabled", "context"] }, { kind: "ngmodule", type: CuiDialogModule }, { kind: "ngmodule", type: CuiFormFieldModule }, { kind: "component", type: CuiFormFieldComponent, selector: "cui-form-field" }, { kind: "component", type: CuiCriterionInfoFormComponent, selector: "cui-criterion-info-form", inputs: ["title", "description", "framerId", "config"], outputs: ["formChanged", "isFormValidChanged"] }, { kind: "ngmodule", type: CuiLabelModule }, { kind: "component", type: CuiLabelComponent, selector: "label[cuiLabel]", inputs: ["isRequired"] }, { kind: "ngmodule", type: CuiSvgModule }, { kind: "component", type: CuiSvgComponent, selector: "cui-svg[icon]", inputs: ["width", "height", "strokeWidth", "color", "icon"] }, { kind: "ngmodule", type: TranslocoModule }, { kind: "directive", type: i4.TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
10263
10378
  }
10264
10379
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiCriterionInfoComponent, decorators: [{
10265
10380
  type: Component,
@@ -10273,78 +10388,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
10273
10388
  CuiLabelModule,
10274
10389
  CuiSvgModule,
10275
10390
  TranslocoModule
10276
- ], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, providers: [CuiSelectedCategoryService], template: "<div\n class=\"wrapper\"\n *transloco=\"let t\"\n>\n <div\n #scrollContent\n class=\"content content_scrollable\"\n >\n <div class=\"category\">\n <cui-form-field>\n <label\n cuiLabel\n [for]=\"categoryId\"\n [isRequired]=\"true\"\n >\n {{ t('SELECT_CATEGORY') }}\n </label>\n <cui-categories\n [buttonId]=\"categoryId\"\n [treeStructType]=\"TYPE\"\n >\n <div class=\"select\">\n <span [style.color]=\"labelColor()\">\n {{ selectTitle() }}\n </span>\n\n <cui-svg icon=\"cuiIconChevronDown\" />\n </div>\n </cui-categories>\n </cui-form-field>\n </div>\n\n @let criterionData = criterion();\n @let editorConfigData = editorConfig();\n\n @if (editorConfigData && criterionData) {\n <cui-criterion-info-form\n [config]=\"editorConfigData\"\n [baseResourceUrl]=\"editorResourceUrl()\"\n [title]=\"criterionData.storageElement.title\"\n [framerId]=\"criterionData.storageElement.framerCriterionId\"\n class=\"utility\"\n (isFormValidChanged)=\"onFormValidationChanged($event)\"\n (formChanged)=\"onFormChanged($event, criterionData.id)\"\n />\n }\n </div>\n</div>\n", styles: [".wrapper{display:flex;flex-direction:column;height:100%}.content{height:calc(100vh - 109px)}.content_scrollable{overflow:auto}.category{padding-top:16px;padding-right:23px;padding-left:23px}.select{padding:7px 13px;font-weight:400;font-size:14px;line-height:20px;display:flex;justify-content:space-between;height:36px;border-radius:8px;border:1px solid var(--cui-base-200);color:var(--cui-base-900);background:var(--cui-input)}.utility{--editor-height: none}\n"] }]
10277
- }], ctorParameters: () => [] });
10278
-
10279
- class CuiFramerPreviewComponent {
10280
- constructor() {
10281
- this.hostElement = inject(ElementRef).nativeElement;
10282
- this.frameApiService = inject(CuiFrameApiService);
10283
- this.isVideo = false;
10284
- this.jText = signal(null);
10285
- this.thumbnailUrl = signal(null);
10286
- this.isDescriptionEmpty = computed(() => !this.jText()?.notEmpty);
10287
- this.framerId = input.required();
10288
- this.config = input.required();
10289
- this.editorResourceUrl = input.required();
10290
- this.title = input();
10291
- this.initConfigEffect();
10292
- this.initFramerIdEffect();
10293
- }
10294
- initConfigEffect() {
10295
- effect(() => {
10296
- this.editorConfig = {
10297
- element: this.hostElement,
10298
- ...this.config(),
10299
- readOnly: true
10300
- };
10301
- }, { allowSignalWrites: true });
10302
- }
10303
- initFramerIdEffect() {
10304
- effect(() => {
10305
- const framerId = this.framerId();
10306
- if (!framerId) {
10307
- return;
10308
- }
10309
- this.subscription?.unsubscribe();
10310
- this.initFrameFragments();
10311
- }, { allowSignalWrites: true });
10312
- }
10313
- initFrameFragments() {
10314
- const frameId = this.framerId();
10315
- this.jText.set(null);
10316
- this.thumbnailUrl.set(null);
10317
- if (!frameId) {
10318
- return;
10319
- }
10320
- const fragmentActions = {
10321
- J_TEXT: (fragment) => {
10322
- this.jText.set(fragment);
10323
- },
10324
- RESOURCE_FILE: (fragment) => {
10325
- this.setResourceFile(fragment);
10326
- }
10327
- };
10328
- this.subscription = this.frameApiService
10329
- .getFrame(frameId, this.editorConfig.requestOptions)
10330
- .subscribe((frame) => {
10331
- frame.fragments.forEach((fragment) => fragmentActions[fragment.type](fragment));
10332
- });
10333
- }
10334
- setResourceFile(resource) {
10335
- const url = `${this.editorResourceUrl()}/${resource.fileId}`;
10336
- this.isVideo = resource?.name?.split('.').pop() === 'mp4';
10337
- if (!url) {
10338
- return;
10339
- }
10340
- this.thumbnailUrl.set({ src: resource.fileId && url, name: resource.name || resource.type });
10341
- }
10342
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiFramerPreviewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
10343
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: CuiFramerPreviewComponent, isStandalone: true, selector: "cui-framer-preview", inputs: { framerId: { classPropertyName: "framerId", publicName: "framerId", isSignal: true, isRequired: true, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null }, editorResourceUrl: { classPropertyName: "editorResourceUrl", publicName: "editorResourceUrl", isSignal: true, isRequired: true, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<ng-container *transloco=\"let t\">\n @if (jText()) {\n @if (!isDescriptionEmpty()) {\n @let url = thumbnailUrl();\n\n @if (url?.src; as src) {\n @if (isVideo) {\n <video\n class=\"thumbnail\"\n [src]=\"src\"\n controls\n ></video>\n } @else {\n <img\n class=\"thumbnail\"\n [src]=\"src\"\n [alt]=\"url?.name\"\n />\n }\n }\n\n <div class=\"content\">\n @if (title(); as title) {\n <div class=\"title\">{{ title }}</div>\n }\n\n @if (jText()?.id; as id) {\n <div class=\"wrapper\">\n <cui-editor\n class=\"editor\"\n [editorApiId]=\"id\"\n [config]=\"editorConfig\"\n />\n </div>\n }\n </div>\n } @else {\n <cui-empty-state [subtitle]=\"t('NO_DESCRIPTION_WAS_PROVIDED')\" />\n }\n }\n</ng-container>\n", styles: [":host{display:flex;flex-direction:column;gap:0;height:100%;overflow:auto}.thumbnail{width:100%;max-height:271px;object-fit:contain}.content{display:flex;flex-direction:column;gap:14px;padding:16px 12px}.title{font-weight:500;font-size:18px;line-height:28px}.editor{display:block;height:100%;overflow:auto}\n"], dependencies: [{ kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "component", type: CuiEditorComponent, selector: "cui-editor", inputs: ["editorApiId", "config", "requestSize"], outputs: ["editorEmpty"] }, { kind: "component", type: CuiEmptyStateComponent, selector: "cui-empty-state, [cuiEmptyState]", inputs: ["title", "subtitle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
10344
- }
10345
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiFramerPreviewComponent, decorators: [{
10346
- type: Component,
10347
- args: [{ selector: 'cui-framer-preview', imports: [TranslocoDirective, CuiEditorComponent, CuiEmptyStateComponent], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *transloco=\"let t\">\n @if (jText()) {\n @if (!isDescriptionEmpty()) {\n @let url = thumbnailUrl();\n\n @if (url?.src; as src) {\n @if (isVideo) {\n <video\n class=\"thumbnail\"\n [src]=\"src\"\n controls\n ></video>\n } @else {\n <img\n class=\"thumbnail\"\n [src]=\"src\"\n [alt]=\"url?.name\"\n />\n }\n }\n\n <div class=\"content\">\n @if (title(); as title) {\n <div class=\"title\">{{ title }}</div>\n }\n\n @if (jText()?.id; as id) {\n <div class=\"wrapper\">\n <cui-editor\n class=\"editor\"\n [editorApiId]=\"id\"\n [config]=\"editorConfig\"\n />\n </div>\n }\n </div>\n } @else {\n <cui-empty-state [subtitle]=\"t('NO_DESCRIPTION_WAS_PROVIDED')\" />\n }\n }\n</ng-container>\n", styles: [":host{display:flex;flex-direction:column;gap:0;height:100%;overflow:auto}.thumbnail{width:100%;max-height:271px;object-fit:contain}.content{display:flex;flex-direction:column;gap:14px;padding:16px 12px}.title{font-weight:500;font-size:18px;line-height:28px}.editor{display:block;height:100%;overflow:auto}\n"] }]
10391
+ ], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, providers: [CuiSelectedCategoryService], template: "<div\n class=\"wrapper\"\n *transloco=\"let t\"\n>\n <div\n #scrollContent\n class=\"content content_scrollable\"\n >\n <div class=\"category\">\n <cui-form-field>\n <label\n cuiLabel\n [for]=\"categoryId\"\n [isRequired]=\"true\"\n >\n {{ t('SELECT_CATEGORY') }}\n </label>\n <cui-categories\n [buttonId]=\"categoryId\"\n [treeStructType]=\"TYPE\"\n >\n <div class=\"select\">\n <span [style.color]=\"labelColor()\">\n {{ selectTitle() }}\n </span>\n\n <cui-svg icon=\"cuiIconChevronDown\" />\n </div>\n </cui-categories>\n </cui-form-field>\n </div>\n\n @let criterionData = criterion();\n @let editorConfigData = editorConfig();\n\n @if (editorConfigData && criterionData) {\n <cui-criterion-info-form\n [config]=\"editorConfigData\"\n [title]=\"criterionData.storageElement.title\"\n [description]=\"criterionData.storageElement.shortDescription\"\n [framerId]=\"criterionData.storageElement.framerCriterionId\"\n class=\"utility\"\n (isFormValidChanged)=\"onFormValidationChanged($event)\"\n (formChanged)=\"onFormChanged($event, criterionData.id)\"\n />\n }\n </div>\n</div>\n", styles: [".wrapper{display:flex;flex-direction:column;height:100%}.content{height:calc(100vh - 109px)}.content_scrollable{overflow:auto}.category{padding-top:16px;padding-right:23px;padding-left:23px}.select{padding:7px 13px;font-weight:400;font-size:14px;line-height:20px;display:flex;justify-content:space-between;height:36px;border-radius:8px;border:1px solid var(--cui-base-200);color:var(--cui-base-900);background:var(--cui-input)}.utility{--editor-height: none}\n"] }]
10348
10392
  }], ctorParameters: () => [] });
10349
10393
 
10350
10394
  class CuiSelectModalFolderComponent {
@@ -12228,5 +12272,5 @@ function handleError(handler, useDefaultError = true) {
12228
12272
  * Generated bundle index. Do not edit.
12229
12273
  */
12230
12274
 
12231
- export { AlertHintComponent, AngularOutsideLoaderService, AssigneeRoleItemComponent, AssigneeRolesTabsComponent, ButtonChangeThemeComponent, CUI_ACTIVITY_SERVICE_TOKEN, CUI_ALERTS, CUI_ALERT_CONTEXT, CUI_ALERT_DEFAULT_OPTIONS, CUI_ALERT_OPTIONS, CUI_ANIMATIONS_DEFAULT_DURATION, CUI_BANNER_DEFAULT_OPTIONS, CUI_BANNER_OPTIONS, CUI_BUTTON_DEFAULT_OPTIONS, CUI_BUTTON_OPTIONS, CUI_DEFAULT_THEME, CUI_DIALOGS, CUI_DIALOG_CONTEXT, CUI_DIALOG_DEFAULT_OPTIONS, CUI_DIALOG_OPTIONS, CUI_INPUT_TIME_DEFAULT_OPTIONS, CUI_INPUT_TIME_OPTIONS, CUI_NOTIFICATION_DEFAULT_OPTIONS, CUI_NOTIFICATION_ICONS, CUI_NOTIFICATION_ICON_OPTIONS, CUI_NOTIFICATION_ICON_OPTIONS_DEFAULT_MODE, CUI_NOTIFICATION_ICON_OPTIONS_LIGHT_MODE, CUI_NOTIFICATION_OPTIONS, CUI_RESOURCE_STATE_SERVICE_TOKEN, CUI_ROOT_SELECTOR, CUI_STORAGE_LIST_SERVICE_TOKEN, CUI_SUBJECT_MODAL_SERVICE_TOKEN, CUI_TABS_SERVICE_TOKEN, CUI_TEXT_FIELD_CONTROLLER, CUI_TEXT_FIELD_ICON_LEFT, CUI_TEXT_FIELD_ID, CUI_TEXT_FIELD_IS_ERROR, CUI_TEXT_FIELD_PLACEHOLDER, CUI_TEXT_FIELD_SIZE, CUI_TEXT_FILED_CONTROLLER_PROVIDER, CUI_THEME, CUI_THEME_STORAGE_DEFAULT_KEY, CUI_THEME_STORAGE_KEY, CUI_TOOLTIP_COMPONENT, CUI_TOOLTIP_DEFAULT_OPTIONS, CUI_TOOLTIP_DIRECTIONS, CUI_TOOLTIP_OPTIONS, CUI_TOOLTIP_PROVIDERS, CUI_USED_ELEMENTS_SERVICE_TOKEN, CUI_UTILITY_SERVICE_TOKEN, ContentHeaderComponent, CuiAbstractTabsComponent, CuiAccordionComponent, CuiAccordionDirective, CuiAccordionItemComponent, CuiAccordionModule, CuiActivityBaseService, CuiActivityImplService, CuiAlertComponent, CuiAlertModule, CuiAlertService, CuiAlertsComponent, CuiAttachesTool, CuiAuthBase, CuiAuthService, CuiBadgeComponent, CuiBadgeModule, CuiBannerComponent, CuiBannerModule, CuiBreadcrumbComponent, CuiBreadcrumbsComponent, CuiBreadcrumbsModule, CuiButtonComponent, CuiButtonGroupComponent, CuiButtonGroupModule, CuiButtonModule, CuiCardWrapperComponent, CuiCategoriesComponent, CuiCheckboxComponent, CuiCheckboxModule, CuiChecklistBlockComponent, CuiCircleLoaderComponent, CuiContentWrapperComponent, CuiContextMenuComponent, CuiContextMenuModule, CuiCriterionInfoComponent, CuiCriterionModalCreateComponent, CuiDeleteModalComponent, CuiDialogActionsComponent, CuiDialogComponent, CuiDialogHeaderComponent, CuiDialogModule, CuiDialogService, CuiDialogsComponent, CuiDropdownDirective, CuiDropdownWrapperComponent, CuiEditorBlockComponent, CuiEditorComponent, CuiEditorModalComponent, CuiEditorReadonlyComponent, CuiEditorTranslations, CuiEmptyStateComponent, CuiFileIconComponent, CuiFileUploaderStatus, CuiFormFieldComponent, CuiFormFieldModule, CuiFramerPreviewComponent, CuiGeneralControlErrorHintComponent, CuiGhostInputComponent, CuiGlobalErrorHandler, CuiHeaderTool, CuiHintComponent, CuiHintModule, CuiIconButtonComponent, CuiIconButtonModule, CuiImageTool, CuiInputModule, CuiInputNumberComponent, CuiInputNumberModule, CuiInputPasswordComponent, CuiInputPasswordModule, CuiInputTextComponent, CuiInputTimeComponent, CuiInputTimeModule, CuiInstructionInfoComponent, CuiInstructionInfoFormComponent, CuiInstructionModalCreateComponent, CuiInstructionReadonlyInfoComponent, CuiLabelComponent, CuiLabelModule, CuiLayoutComponent, CuiLetterBoxComponent, CuiLibTranslations, CuiLinearLoaderComponent, CuiLinkMarker, CuiListTool, CuiLoaderService, CuiLoadingState, CuiNotificationComponent, CuiNotificationModule, CuiPositionService, CuiRadioComponent, CuiRadioModule, CuiReadonlyCriterionModalComponent, CuiReadonlyInstructionModalComponent, CuiRenderDynamicComponentsComponent, CuiRenderDynamicComponentsService, CuiRoleMarker, CuiRootComponent, CuiRootModule, CuiSelectComponent, CuiSelectModalComponent, CuiSelectModalFolderComponent, CuiSelectModalSearchComponent, CuiSelectModalService, CuiSelectModule, CuiSelectedCategoryService, CuiSidebarContainerComponent, CuiSidebarHeaderComponent, CuiSidebarNavigationComponent, CuiSidebarNavigationContainerComponent, CuiSidebarNavigationItemComponent, CuiSidebarService, CuiStatedLoaderComponent, CuiStorageListComponent, CuiSvgComponent, CuiSvgModule, CuiTabDirective, CuiTabsComponent, CuiTabsServiceImpl, CuiTextFieldController, CuiTextFieldControllerModule, CuiTextFieldIconLeftDirective, CuiTextFieldIdDirective, CuiTextFieldIsErrorDirective, CuiTextFieldPlaceholderDirective, CuiTextFieldSizeDirective, CuiTextareaComponent, CuiTextareaModule, CuiThemeService, CuiToggleComponent, CuiToggleModule, CuiToolMarker, CuiTooltip, CuiTooltipComponent, CuiTooltipDescribe, CuiTooltipDirective, CuiTooltipDriver, CuiTooltipHost, CuiTooltipHover, CuiTooltipManual, CuiTooltipOptionsDirective, CuiTooltipOverflow, CuiTooltipPointer, CuiTooltipPosition, CuiTooltipService, CuiTooltipUnstyled, CuiTooltipUnstyledComponent, CuiTooltips, CuiUserActionContextMenuComponent, CuiUtilityModalComponent, CuiVideoTool, CuiVisualViewportService, InsertedComponent, ModalDividedSectionComponent, ModalHeaderComponent, ModalHeaderInsertedButtonsComponent, ModalInfoTabComponent, ModalOperationPartComponent, ModalResourcesTabComponent, OptionsButtonComponent, RenderDynamicModalComponent, ResourceStateBaseService, ResourcesBlockComponent, ResourcesBlockPartComponent, ResourcesBlockTabsComponent$1 as ResourcesBlockTabsComponent, ResourcesOptionsComponent, SubjectModalBaseService, UTILITY_MODAL_SERVICE_TOKEN, UsedElementsBaseService, UtilityBaseService, UtilityInfoReadonlyComponent, createEditorTools, cuiAuthInterceptor, cuiCheckFixedPosition, cuiCreateDefaultValidators, cuiErrorHandlerInterceptor, cuiGetDuration, cuiIsObscured, cuiLoaderInterceptor, cuiOverrideOptions, cuiProvideEditor, cuiRemoveSpaces, cuiReplace, cuiToAnimationOptions, cuiTooltipOptionsProvider, cuiXNdjsonInterceptor, handleError, openFileInBrowser, provideCuiAuth, provideCuiErrorHandler, provideCuiTabs, setLoading, sseStreamReaderInterceptor };
12275
+ export { AlertHintComponent, AngularOutsideLoaderService, AssigneeRoleItemComponent, AssigneeRolesTabsComponent, ButtonChangeThemeComponent, CUI_ACTIVITY_SERVICE_TOKEN, CUI_ALERTS, CUI_ALERT_CONTEXT, CUI_ALERT_DEFAULT_OPTIONS, CUI_ALERT_OPTIONS, CUI_ANIMATIONS_DEFAULT_DURATION, CUI_BANNER_DEFAULT_OPTIONS, CUI_BANNER_OPTIONS, CUI_BUTTON_DEFAULT_OPTIONS, CUI_BUTTON_OPTIONS, CUI_DEFAULT_THEME, CUI_DIALOGS, CUI_DIALOG_CONTEXT, CUI_DIALOG_DEFAULT_OPTIONS, CUI_DIALOG_OPTIONS, CUI_INPUT_TIME_DEFAULT_OPTIONS, CUI_INPUT_TIME_OPTIONS, CUI_NOTIFICATION_DEFAULT_OPTIONS, CUI_NOTIFICATION_ICONS, CUI_NOTIFICATION_ICON_OPTIONS, CUI_NOTIFICATION_ICON_OPTIONS_DEFAULT_MODE, CUI_NOTIFICATION_ICON_OPTIONS_LIGHT_MODE, CUI_NOTIFICATION_OPTIONS, CUI_RESOURCE_STATE_SERVICE_TOKEN, CUI_ROOT_SELECTOR, CUI_STORAGE_LIST_SERVICE_TOKEN, CUI_SUBJECT_MODAL_SERVICE_TOKEN, CUI_TABS_SERVICE_TOKEN, CUI_TEXT_FIELD_CONTROLLER, CUI_TEXT_FIELD_ICON_LEFT, CUI_TEXT_FIELD_ID, CUI_TEXT_FIELD_IS_ERROR, CUI_TEXT_FIELD_PLACEHOLDER, CUI_TEXT_FIELD_SIZE, CUI_TEXT_FILED_CONTROLLER_PROVIDER, CUI_THEME, CUI_THEME_STORAGE_DEFAULT_KEY, CUI_THEME_STORAGE_KEY, CUI_TOOLTIP_COMPONENT, CUI_TOOLTIP_DEFAULT_OPTIONS, CUI_TOOLTIP_DIRECTIONS, CUI_TOOLTIP_OPTIONS, CUI_TOOLTIP_PROVIDERS, CUI_USED_ELEMENTS_SERVICE_TOKEN, CUI_UTILITY_SERVICE_TOKEN, ContentHeaderComponent, CuiAbstractTabsComponent, CuiAccordionComponent, CuiAccordionDirective, CuiAccordionItemComponent, CuiAccordionModule, CuiActivityBaseService, CuiActivityImplService, CuiAlertComponent, CuiAlertModule, CuiAlertService, CuiAlertsComponent, CuiAttachesTool, CuiAuthBase, CuiAuthService, CuiBadgeComponent, CuiBadgeModule, CuiBannerComponent, CuiBannerModule, CuiBreadcrumbComponent, CuiBreadcrumbsComponent, CuiBreadcrumbsModule, CuiButtonComponent, CuiButtonGroupComponent, CuiButtonGroupModule, CuiButtonModule, CuiCardWrapperComponent, CuiCategoriesComponent, CuiCheckboxComponent, CuiCheckboxModule, CuiChecklistBlockComponent, CuiCircleLoaderComponent, CuiContentWrapperComponent, CuiContextMenuComponent, CuiContextMenuModule, CuiCriterionInfoComponent, CuiCriterionInfoFormComponent, CuiCriterionModalCreateComponent, CuiCriterionReadonlyInfoComponent, CuiDeleteModalComponent, CuiDialogActionsComponent, CuiDialogComponent, CuiDialogHeaderComponent, CuiDialogModule, CuiDialogService, CuiDialogsComponent, CuiDropdownDirective, CuiDropdownWrapperComponent, CuiEditorBlockComponent, CuiEditorComponent, CuiEditorModalComponent, CuiEditorReadonlyComponent, CuiEditorTranslations, CuiEmptyStateComponent, CuiFileIconComponent, CuiFileUploaderStatus, CuiFormFieldComponent, CuiFormFieldModule, CuiFramerPreviewComponent, CuiGeneralControlErrorHintComponent, CuiGhostInputComponent, CuiGlobalErrorHandler, CuiHeaderTool, CuiHintComponent, CuiHintModule, CuiIconButtonComponent, CuiIconButtonModule, CuiImageTool, CuiInputModule, CuiInputNumberComponent, CuiInputNumberModule, CuiInputPasswordComponent, CuiInputPasswordModule, CuiInputTextComponent, CuiInputTimeComponent, CuiInputTimeModule, CuiInstructionInfoComponent, CuiInstructionInfoFormComponent, CuiInstructionModalCreateComponent, CuiInstructionReadonlyInfoComponent, CuiLabelComponent, CuiLabelModule, CuiLayoutComponent, CuiLetterBoxComponent, CuiLibTranslations, CuiLinearLoaderComponent, CuiLinkMarker, CuiListTool, CuiLoaderService, CuiLoadingState, CuiNotificationComponent, CuiNotificationModule, CuiPositionService, CuiRadioComponent, CuiRadioModule, CuiReadonlyCriterionModalComponent, CuiReadonlyInstructionModalComponent, CuiReadonlyUtilityModalComponent, CuiRenderDynamicComponentsComponent, CuiRenderDynamicComponentsService, CuiRoleMarker, CuiRootComponent, CuiRootModule, CuiSelectComponent, CuiSelectModalComponent, CuiSelectModalFolderComponent, CuiSelectModalSearchComponent, CuiSelectModalService, CuiSelectModule, CuiSelectedCategoryService, CuiSidebarContainerComponent, CuiSidebarHeaderComponent, CuiSidebarNavigationComponent, CuiSidebarNavigationContainerComponent, CuiSidebarNavigationItemComponent, CuiSidebarService, CuiStatedLoaderComponent, CuiStorageListComponent, CuiSvgComponent, CuiSvgModule, CuiTabDirective, CuiTabsComponent, CuiTabsServiceImpl, CuiTextFieldController, CuiTextFieldControllerModule, CuiTextFieldIconLeftDirective, CuiTextFieldIdDirective, CuiTextFieldIsErrorDirective, CuiTextFieldPlaceholderDirective, CuiTextFieldSizeDirective, CuiTextareaComponent, CuiTextareaModule, CuiThemeService, CuiToggleComponent, CuiToggleModule, CuiToolMarker, CuiTooltip, CuiTooltipComponent, CuiTooltipDescribe, CuiTooltipDirective, CuiTooltipDriver, CuiTooltipHost, CuiTooltipHover, CuiTooltipManual, CuiTooltipOptionsDirective, CuiTooltipOverflow, CuiTooltipPointer, CuiTooltipPosition, CuiTooltipService, CuiTooltipUnstyled, CuiTooltipUnstyledComponent, CuiTooltips, CuiUserActionContextMenuComponent, CuiUtilityModalComponent, CuiUtilityModalCreateComponent, CuiUtilityReadonlyThumbnailComponent, CuiUtilityThumbnailComponent, CuiVideoTool, CuiVisualViewportService, InsertedComponent, ModalDividedSectionComponent, ModalHeaderComponent, ModalHeaderInsertedButtonsComponent, ModalInfoTabComponent, ModalOperationPartComponent, ModalResourcesTabComponent, OptionsButtonComponent, RenderDynamicModalComponent, ResourceStateBaseService, ResourcesBlockComponent, ResourcesBlockPartComponent, ResourcesBlockTabsComponent$1 as ResourcesBlockTabsComponent, ResourcesOptionsComponent, SubjectModalBaseService, UTILITY_MODAL_SERVICE_TOKEN, UsedElementsBaseService, UtilityBaseService, UtilityInfoReadonlyComponent, createEditorTools, cuiAuthInterceptor, cuiCheckFixedPosition, cuiCreateDefaultValidators, cuiErrorHandlerInterceptor, cuiGetDuration, cuiIsObscured, cuiLoaderInterceptor, cuiOverrideOptions, cuiProvideEditor, cuiRemoveSpaces, cuiReplace, cuiToAnimationOptions, cuiTooltipOptionsProvider, cuiXNdjsonInterceptor, handleError, openFileInBrowser, provideCuiAuth, provideCuiErrorHandler, provideCuiTabs, setLoading, sseStreamReaderInterceptor };
12232
12276
  //# sourceMappingURL=cuby-ui-core.mjs.map