croco-html 2.30.0 → 2.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/README.md +1 -1
  2. package/esm2022/lib/components/editor/custom-widget-editor/custom-widget-editor.component.mjs +41 -0
  3. package/esm2022/lib/components/editor/index.mjs +2 -1
  4. package/esm2022/lib/components/editor/main-editor-block/main-editor-block.component.mjs +6 -4
  5. package/esm2022/lib/components/editor/visual-editor/DefaultTags.mjs +3 -1
  6. package/esm2022/lib/components/editor/visual-editor/visual-editor.component.mjs +7 -1
  7. package/esm2022/lib/components/xml-tags/index.mjs +2 -1
  8. package/esm2022/lib/components/xml-tags/xml-tag-custom-widget/xml-tag-custom-widget.component.mjs +50 -0
  9. package/esm2022/lib/components/xml-tags/xml-tag-view/xml-tag-view.component.mjs +5 -3
  10. package/esm2022/lib/croco-html.module.mjs +18 -16
  11. package/esm2022/lib/extensions/BodyTagsExtensions.mjs +19 -2
  12. package/esm2022/lib/extensions/CustomWidgetMethods.mjs +33 -0
  13. package/esm2022/lib/extensions/HtmlExtractionMethods.mjs +3 -1
  14. package/esm2022/lib/extensions/Tags.mjs +3 -1
  15. package/esm2022/lib/extensions/index.mjs +2 -1
  16. package/esm2022/lib/index.mjs +5 -1
  17. package/esm2022/lib/options/index.mjs +1 -1
  18. package/fesm2022/croco-html.mjs +152 -12
  19. package/fesm2022/croco-html.mjs.map +1 -1
  20. package/lib/components/editor/custom-widget-editor/custom-widget-editor.component.d.ts +13 -0
  21. package/lib/components/editor/index.d.ts +1 -0
  22. package/lib/components/xml-tags/index.d.ts +1 -0
  23. package/lib/components/xml-tags/xml-tag-custom-widget/xml-tag-custom-widget.component.d.ts +19 -0
  24. package/lib/croco-html.module.d.ts +16 -14
  25. package/lib/extensions/CustomWidgetMethods.d.ts +20 -0
  26. package/lib/extensions/HtmlExtractionMethods.d.ts +1 -1
  27. package/lib/extensions/Tags.d.ts +1 -0
  28. package/lib/extensions/index.d.ts +1 -0
  29. package/lib/index.d.ts +6 -5
  30. package/lib/options/index.d.ts +5 -0
  31. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Injectable, Inject, EventEmitter, Component, ViewChild, Input, Output, ChangeDetectionStrategy, Pipe, ViewEncapsulation, NgModule } from '@angular/core';
2
+ import { Injectable, Inject, EventEmitter, Component, ViewChild, Input, Output, ChangeDetectionStrategy, Pipe, ViewContainerRef, ViewEncapsulation, NgModule } from '@angular/core';
3
3
  import * as i2 from '@angular/material/button';
4
4
  import { MatButton, MatButtonModule, MatIconButton } from '@angular/material/button';
5
5
  import * as i1 from '@angular/common/http';
@@ -18,6 +18,8 @@ import { BehaviorSubject, Subject, takeUntil } from 'rxjs';
18
18
  import { NgStyle, CommonModule } from '@angular/common';
19
19
  import * as i2$1 from '@angular/material/input';
20
20
  import { MatInput, MatInputModule } from '@angular/material/input';
21
+ import * as i12 from '@angular/material/tooltip';
22
+ import { MatTooltip, MatTooltipModule } from '@angular/material/tooltip';
21
23
  import { CdkTextareaAutosize } from '@angular/cdk/text-field';
22
24
  import * as i2$2 from '@ng-select/ng-select';
23
25
  import { NgSelectModule } from '@ng-select/ng-select';
@@ -38,8 +40,6 @@ import { MatTabsModule } from '@angular/material/tabs';
38
40
  import * as i1$5 from 'ngx-clipboard';
39
41
  import * as i2$3 from '@angular/material/snack-bar';
40
42
  import { MatSnackBarModule } from '@angular/material/snack-bar';
41
- import * as i12 from '@angular/material/tooltip';
42
- import { MatTooltipModule } from '@angular/material/tooltip';
43
43
  import * as i13 from '@angular/material/checkbox';
44
44
  import { MatCheckboxModule } from '@angular/material/checkbox';
45
45
  import * as i25 from '@angular/material/autocomplete';
@@ -595,6 +595,39 @@ class ButtonMethods {
595
595
  }
596
596
  }
597
597
 
598
+ class CustomWidgetTagDataConsts {
599
+ static { this.TagName = "custom-widget"; }
600
+ static { this.TypeAttrName = "type"; }
601
+ static { this.DataIdAttrName = "data-id"; }
602
+ static { this.WidgetIdAttrName = "widget-id"; }
603
+ }
604
+ class CustomWidgetMethods {
605
+ static ExtractCustomWidgetTagData(attributes) {
606
+ return {
607
+ type: attributes[CustomWidgetTagDataConsts.TypeAttrName],
608
+ dataId: attributes[CustomWidgetTagDataConsts.DataIdAttrName],
609
+ widgetId: attributes[CustomWidgetTagDataConsts.WidgetIdAttrName]
610
+ };
611
+ }
612
+ static ExtractCustomWidgetAttributes(customWidgetTagData) {
613
+ return {
614
+ [CustomWidgetTagDataConsts.TypeAttrName]: customWidgetTagData.type,
615
+ [CustomWidgetTagDataConsts.DataIdAttrName]: customWidgetTagData.dataId,
616
+ [CustomWidgetTagDataConsts.WidgetIdAttrName]: customWidgetTagData.widgetId
617
+ };
618
+ }
619
+ static ExtractCustomWidgetTag(elem) {
620
+ return {
621
+ type: CustomWidgetTagDataConsts.TagName,
622
+ data: {
623
+ type: elem.getAttribute(CustomWidgetTagDataConsts.TypeAttrName),
624
+ dataId: elem.getAttribute(CustomWidgetTagDataConsts.DataIdAttrName),
625
+ widgetId: elem.getAttribute(CustomWidgetTagDataConsts.WidgetIdAttrName)
626
+ }
627
+ };
628
+ }
629
+ }
630
+
598
631
  class HtmlExtractionMethods {
599
632
  static ExtractHeaderTag(elem, tagName) {
600
633
  var data = TextSimpleMethods.ExtractTextTag(elem);
@@ -621,6 +654,7 @@ class HtmlExtractionMethods {
621
654
  [ExternalVideoTagDataConsts.TagName.toUpperCase()]: (elem, options) => VideoMethods.ExtractExternalVideoTag(elem),
622
655
  [DownloadButtonTagDataConsts.TagName.toUpperCase()]: (elem, options) => DownloadButtonMethods.ExtractDownloadButtonTag(elem),
623
656
  [ButtonTagDataConsts.TagName.toUpperCase()]: (elem, options) => ButtonMethods.ExtractButtonTag(elem),
657
+ [CustomWidgetTagDataConsts.TagName.toUpperCase()]: (elem, options) => CustomWidgetMethods.ExtractCustomWidgetTag(elem),
624
658
  }; }
625
659
  static transformHtmlElementToBlocks(element, options) {
626
660
  var data = [];
@@ -676,6 +710,7 @@ class Tags {
676
710
  static { this.RichText = 'rich-text'; }
677
711
  static { this.ExternalVideo = ExternalVideoTagDataConsts.TagName; }
678
712
  static { this.UnsupportedTag = 'unsupported-tag'; }
713
+ static { this.CustomWidget = CustomWidgetTagDataConsts.TagName; }
679
714
  }
680
715
 
681
716
  class BodyTagsExtensions {
@@ -693,7 +728,8 @@ class BodyTagsExtensions {
693
728
  [DownloadButtonTagDataConsts.TagName]: "Кнопка",
694
729
  [HtmlRawTagDataConsts.TagName]: "Html разметка",
695
730
  [DownloadButtonTagDataConsts.TagName]: "Кнопка для скачивания",
696
- [ButtonTagDataConsts.TagName]: "Кнопка"
731
+ [ButtonTagDataConsts.TagName]: "Кнопка",
732
+ [CustomWidgetTagDataConsts.TagName]: "Кастомный виджет"
697
733
  };
698
734
  return descriptions[tagName];
699
735
  }
@@ -714,6 +750,9 @@ class BodyTagsExtensions {
714
750
  if (x.tagDescription.tag === ButtonTagDataConsts.TagName) {
715
751
  return `<${x.tagDescription.tag} text="${x.attributes[ButtonTagDataConsts.TextAttrName]}" type="${x.attributes[ButtonTagDataConsts.TypeAttrName]}" click="${x.attributes[ButtonTagDataConsts.ClickAttrName]}"></${x.tagDescription.tag}>`;
716
752
  }
753
+ if (x.tagDescription.tag === CustomWidgetTagDataConsts.TagName) {
754
+ return `<${x.tagDescription.tag} type="${x.attributes[CustomWidgetTagDataConsts.TypeAttrName]}" data-id="${x.attributes[CustomWidgetTagDataConsts.DataIdAttrName]}" widget-id="${x.attributes[CustomWidgetTagDataConsts.WidgetIdAttrName]}"></${x.tagDescription.tag}>`;
755
+ }
717
756
  return BodyTagsExtensions.imageTagToHtml(x);
718
757
  });
719
758
  let result = "";
@@ -809,6 +848,18 @@ class BodyTagsExtensions {
809
848
  innerHtml: ""
810
849
  };
811
850
  }
851
+ if (data.type === CustomWidgetTagDataConsts.TagName) {
852
+ let customWidgetTagData = data.data;
853
+ return {
854
+ presentOrEdit: true,
855
+ tagDescription: {
856
+ tag: data.type,
857
+ displayValue: BodyTagsExtensions.getDescription(data.type)
858
+ },
859
+ attributes: customWidgetTagData,
860
+ innerHtml: ""
861
+ };
862
+ }
812
863
  if (data.type === HtmlRawTagDataConsts.TagName) {
813
864
  return {
814
865
  presentOrEdit: true,
@@ -1468,6 +1519,52 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.4", ngImpor
1468
1519
  type: Output
1469
1520
  }] } });
1470
1521
 
1522
+ class XmlTagCustomWidgetComponent {
1523
+ set tagData(value) {
1524
+ if (value) {
1525
+ this._tagData = value;
1526
+ this.tooltipData = `data-id:${value.dataId}; widget-id: ${value.widgetId}`;
1527
+ if (this.dynamicContainerRef?.instance) {
1528
+ this.dynamicContainerRef.instance.tagData = value;
1529
+ }
1530
+ }
1531
+ }
1532
+ ;
1533
+ get tagData() {
1534
+ return this._tagData;
1535
+ }
1536
+ constructor(_options) {
1537
+ this._options = _options;
1538
+ this.tooltipData = "";
1539
+ this.useDynamicComponent = false;
1540
+ }
1541
+ ngOnInit() {
1542
+ if (this._options.customWidgetRendererComponent) {
1543
+ this.useDynamicComponent = true;
1544
+ this.viewContainerRef.remove();
1545
+ this.dynamicContainerRef = this.viewContainerRef.createComponent(this._options.customWidgetRendererComponent);
1546
+ this.dynamicContainerRef.instance.tagData = this.tagData;
1547
+ }
1548
+ }
1549
+ ngOnDestroy() {
1550
+ this.dynamicContainerRef.destroy();
1551
+ }
1552
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: XmlTagCustomWidgetComponent, deps: [{ token: CrocoHtmlOptionsToken }], target: i0.ɵɵFactoryTarget.Component }); }
1553
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.4", type: XmlTagCustomWidgetComponent, isStandalone: true, selector: "croco-html-xml-tag-custom-widget", inputs: { tagData: "tagData" }, viewQueries: [{ propertyName: "viewContainerRef", first: true, predicate: ["container"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: "<ng-container #container>\n @if (!useDynamicComponent) {\n <div [matTooltip]=\"tooltipData\">\n \u041A\u0430\u0441\u0442\u043E\u043C\u043D\u044B\u0439 \u0432\u0438\u0434\u0436\u0435\u0442. \u0442\u0438\u043F \u0432\u0438\u0434\u0436\u0435\u0442\u0430: {{ tagData?.type }}\n </div>\n }\n</ng-container>\n\n", styles: [":host div{background-color:#a3ded5;padding:5px 10px;display:inline-block;border-radius:10px}\n"], dependencies: [{ kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] }); }
1554
+ }
1555
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: XmlTagCustomWidgetComponent, decorators: [{
1556
+ type: Component,
1557
+ args: [{ selector: 'croco-html-xml-tag-custom-widget', imports: [MatTooltip], standalone: true, template: "<ng-container #container>\n @if (!useDynamicComponent) {\n <div [matTooltip]=\"tooltipData\">\n \u041A\u0430\u0441\u0442\u043E\u043C\u043D\u044B\u0439 \u0432\u0438\u0434\u0436\u0435\u0442. \u0442\u0438\u043F \u0432\u0438\u0434\u0436\u0435\u0442\u0430: {{ tagData?.type }}\n </div>\n }\n</ng-container>\n\n", styles: [":host div{background-color:#a3ded5;padding:5px 10px;display:inline-block;border-radius:10px}\n"] }]
1558
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
1559
+ type: Inject,
1560
+ args: [CrocoHtmlOptionsToken]
1561
+ }] }], propDecorators: { viewContainerRef: [{
1562
+ type: ViewChild,
1563
+ args: ['container', { read: ViewContainerRef, static: true }]
1564
+ }], tagData: [{
1565
+ type: Input
1566
+ }] } });
1567
+
1471
1568
  class XmlTagViewComponent {
1472
1569
  constructor() {
1473
1570
  this.data = [];
@@ -1476,7 +1573,7 @@ class XmlTagViewComponent {
1476
1573
  return TextTags.headerTextTags.includes(item.type);
1477
1574
  }
1478
1575
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: XmlTagViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1479
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.4", type: XmlTagViewComponent, isStandalone: true, selector: "croco-html-xml-tag-view", inputs: { data: "data" }, ngImport: i0, template: "<div>\n @for (item of data; track $index) {\n <div class=\"row\">\n\n @if (item.type === 'text') {\n <div>\n <croco-html-xml-tag-text-view [item]=\"item\"></croco-html-xml-tag-text-view>\n </div>\n }\n\n @if (item.type === 'html-raw') {\n <div>\n <croco-html-raw-view [rawHtml]=\"item.data.innerHTML\">\n </croco-html-raw-view>\n </div>\n }\n\n @if (isHeaderTextTag(item)) {\n <div>\n <croco-html-xml-tag-header-text-view [item]=\"item\"></croco-html-xml-tag-header-text-view>\n </div>\n }\n\n @if (item.type === 'file-image') {\n <div>\n <croco-html-file-image-tag-view [item]=\"item\"></croco-html-file-image-tag-view>\n </div>\n }\n\n @if (item.type === 'table' && item.validationResult) {\n\n @if (item.validationResult.isSucceeded){\n <croco-html-xml-tag-html-view [html]=\"item.bootstrapHtml\">\n </croco-html-xml-tag-html-view>\n }\n @else {\n <croco-html-error-banner [message]=\"item.validationResult.message\">\n </croco-html-error-banner>\n }\n }\n\n @if (item.type === 'rich-text') {\n <div>\n <croco-html-xml-tag-text-view></croco-html-xml-tag-text-view>\n </div>\n }\n\n @if (item.type === 'external-video') {\n <div>\n <croco-html-xml-tag-external-video [data]=\"item\"></croco-html-xml-tag-external-video>\n </div>\n }\n\n @if (item.type === 'download-file-button') {\n <div>\n <croco-html-xml-tag-download-file-button [data]=\"item\"></croco-html-xml-tag-download-file-button>\n </div>\n }\n\n @if (item.type === 'button') {\n <div>\n <croco-html-xml-tag-button [data]=\"item\"></croco-html-xml-tag-button>\n </div>\n }\n @if (item.type === 'unsupported-tag') {\n <div class=\"red\" style=\"margin-top: 10px;\">\n <h4>\u0414\u0430\u043D\u043D\u044B\u0439 \u0442\u0435\u0433 \u043D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F</h4>\n <span>\n {{item.data.tagString}}\n </span>\n </div>\n }\n </div>\n }\n</div>", styles: [".red{background-color:#c94444;color:#fff}\n"], dependencies: [{ kind: "component", type: XmlTagTextViewComponent, selector: "croco-html-xml-tag-text-view", inputs: ["item"] }, { kind: "component", type: HtmlRawViewComponent, selector: "croco-html-raw-view", inputs: ["rawHtml"] }, { kind: "component", type: XmlTagHeaderTextViewComponent, selector: "croco-html-xml-tag-header-text-view", inputs: ["item"] }, { kind: "component", type: FileImageTagViewComponent, selector: "croco-html-file-image-tag-view", inputs: ["item"] }, { kind: "component", type: XmlTagHtmlViewComponent, selector: "croco-html-xml-tag-html-view", inputs: ["html"] }, { kind: "component", type: ErrorBannerComponent, selector: "croco-html-error-banner", inputs: ["message"] }, { kind: "component", type: XmlTagExternalVideoComponent, selector: "croco-html-xml-tag-external-video", inputs: ["data", "tagData"] }, { kind: "component", type: XmlTagDownloadFileButtonComponent, selector: "croco-html-xml-tag-download-file-button", inputs: ["data", "tagData"] }, { kind: "component", type: XmlTagButtonComponent, selector: "croco-html-xml-tag-button", inputs: ["data", "tagData"] }], encapsulation: i0.ViewEncapsulation.None }); }
1576
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.4", type: XmlTagViewComponent, isStandalone: true, selector: "croco-html-xml-tag-view", inputs: { data: "data" }, ngImport: i0, template: "<div>\n @for (item of data; track $index) {\n <div class=\"row\">\n\n @if (item.type === 'text') {\n <div>\n <croco-html-xml-tag-text-view [item]=\"item\"></croco-html-xml-tag-text-view>\n </div>\n }\n\n @if (item.type === 'html-raw') {\n <div>\n <croco-html-raw-view [rawHtml]=\"item.data.innerHTML\">\n </croco-html-raw-view>\n </div>\n }\n\n @if (isHeaderTextTag(item)) {\n <div>\n <croco-html-xml-tag-header-text-view [item]=\"item\"></croco-html-xml-tag-header-text-view>\n </div>\n }\n\n @if (item.type === 'file-image') {\n <div>\n <croco-html-file-image-tag-view [item]=\"item\"></croco-html-file-image-tag-view>\n </div>\n }\n\n @if (item.type === 'custom-widget') {\n <div>\n <croco-html-xml-tag-custom-widget [tagData]=\"item.data\"></croco-html-xml-tag-custom-widget>\n </div>\n }\n\n @if (item.type === 'table' && item.validationResult) {\n\n @if (item.validationResult.isSucceeded){\n <croco-html-xml-tag-html-view [html]=\"item.bootstrapHtml\">\n </croco-html-xml-tag-html-view>\n }\n @else {\n <croco-html-error-banner [message]=\"item.validationResult.message\">\n </croco-html-error-banner>\n }\n }\n\n @if (item.type === 'rich-text') {\n <div>\n <croco-html-xml-tag-text-view></croco-html-xml-tag-text-view>\n </div>\n }\n\n @if (item.type === 'external-video') {\n <div>\n <croco-html-xml-tag-external-video [data]=\"item\"></croco-html-xml-tag-external-video>\n </div>\n }\n\n @if (item.type === 'download-file-button') {\n <div>\n <croco-html-xml-tag-download-file-button [data]=\"item\"></croco-html-xml-tag-download-file-button>\n </div>\n }\n\n @if (item.type === 'button') {\n <div>\n <croco-html-xml-tag-button [data]=\"item\"></croco-html-xml-tag-button>\n </div>\n }\n @if (item.type === 'unsupported-tag') {\n <div class=\"red\" style=\"margin-top: 10px;\">\n <h4>\u0414\u0430\u043D\u043D\u044B\u0439 \u0442\u0435\u0433 \u043D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F</h4>\n <span>\n {{item.data.tagString}}\n </span>\n </div>\n }\n </div>\n }\n</div>\n", styles: [".red{background-color:#c94444;color:#fff}\n"], dependencies: [{ kind: "component", type: XmlTagTextViewComponent, selector: "croco-html-xml-tag-text-view", inputs: ["item"] }, { kind: "component", type: HtmlRawViewComponent, selector: "croco-html-raw-view", inputs: ["rawHtml"] }, { kind: "component", type: XmlTagHeaderTextViewComponent, selector: "croco-html-xml-tag-header-text-view", inputs: ["item"] }, { kind: "component", type: FileImageTagViewComponent, selector: "croco-html-file-image-tag-view", inputs: ["item"] }, { kind: "component", type: XmlTagHtmlViewComponent, selector: "croco-html-xml-tag-html-view", inputs: ["html"] }, { kind: "component", type: ErrorBannerComponent, selector: "croco-html-error-banner", inputs: ["message"] }, { kind: "component", type: XmlTagExternalVideoComponent, selector: "croco-html-xml-tag-external-video", inputs: ["data", "tagData"] }, { kind: "component", type: XmlTagDownloadFileButtonComponent, selector: "croco-html-xml-tag-download-file-button", inputs: ["data", "tagData"] }, { kind: "component", type: XmlTagButtonComponent, selector: "croco-html-xml-tag-button", inputs: ["data", "tagData"] }, { kind: "component", type: XmlTagCustomWidgetComponent, selector: "croco-html-xml-tag-custom-widget", inputs: ["tagData"] }], encapsulation: i0.ViewEncapsulation.None }); }
1480
1577
  }
1481
1578
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: XmlTagViewComponent, decorators: [{
1482
1579
  type: Component,
@@ -1491,7 +1588,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.4", ngImpor
1491
1588
  XmlTagDownloadFileButtonComponent,
1492
1589
  ButtonEditorComponent,
1493
1590
  XmlTagButtonComponent,
1494
- ], template: "<div>\n @for (item of data; track $index) {\n <div class=\"row\">\n\n @if (item.type === 'text') {\n <div>\n <croco-html-xml-tag-text-view [item]=\"item\"></croco-html-xml-tag-text-view>\n </div>\n }\n\n @if (item.type === 'html-raw') {\n <div>\n <croco-html-raw-view [rawHtml]=\"item.data.innerHTML\">\n </croco-html-raw-view>\n </div>\n }\n\n @if (isHeaderTextTag(item)) {\n <div>\n <croco-html-xml-tag-header-text-view [item]=\"item\"></croco-html-xml-tag-header-text-view>\n </div>\n }\n\n @if (item.type === 'file-image') {\n <div>\n <croco-html-file-image-tag-view [item]=\"item\"></croco-html-file-image-tag-view>\n </div>\n }\n\n @if (item.type === 'table' && item.validationResult) {\n\n @if (item.validationResult.isSucceeded){\n <croco-html-xml-tag-html-view [html]=\"item.bootstrapHtml\">\n </croco-html-xml-tag-html-view>\n }\n @else {\n <croco-html-error-banner [message]=\"item.validationResult.message\">\n </croco-html-error-banner>\n }\n }\n\n @if (item.type === 'rich-text') {\n <div>\n <croco-html-xml-tag-text-view></croco-html-xml-tag-text-view>\n </div>\n }\n\n @if (item.type === 'external-video') {\n <div>\n <croco-html-xml-tag-external-video [data]=\"item\"></croco-html-xml-tag-external-video>\n </div>\n }\n\n @if (item.type === 'download-file-button') {\n <div>\n <croco-html-xml-tag-download-file-button [data]=\"item\"></croco-html-xml-tag-download-file-button>\n </div>\n }\n\n @if (item.type === 'button') {\n <div>\n <croco-html-xml-tag-button [data]=\"item\"></croco-html-xml-tag-button>\n </div>\n }\n @if (item.type === 'unsupported-tag') {\n <div class=\"red\" style=\"margin-top: 10px;\">\n <h4>\u0414\u0430\u043D\u043D\u044B\u0439 \u0442\u0435\u0433 \u043D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F</h4>\n <span>\n {{item.data.tagString}}\n </span>\n </div>\n }\n </div>\n }\n</div>", styles: [".red{background-color:#c94444;color:#fff}\n"] }]
1591
+ XmlTagCustomWidgetComponent,
1592
+ ], template: "<div>\n @for (item of data; track $index) {\n <div class=\"row\">\n\n @if (item.type === 'text') {\n <div>\n <croco-html-xml-tag-text-view [item]=\"item\"></croco-html-xml-tag-text-view>\n </div>\n }\n\n @if (item.type === 'html-raw') {\n <div>\n <croco-html-raw-view [rawHtml]=\"item.data.innerHTML\">\n </croco-html-raw-view>\n </div>\n }\n\n @if (isHeaderTextTag(item)) {\n <div>\n <croco-html-xml-tag-header-text-view [item]=\"item\"></croco-html-xml-tag-header-text-view>\n </div>\n }\n\n @if (item.type === 'file-image') {\n <div>\n <croco-html-file-image-tag-view [item]=\"item\"></croco-html-file-image-tag-view>\n </div>\n }\n\n @if (item.type === 'custom-widget') {\n <div>\n <croco-html-xml-tag-custom-widget [tagData]=\"item.data\"></croco-html-xml-tag-custom-widget>\n </div>\n }\n\n @if (item.type === 'table' && item.validationResult) {\n\n @if (item.validationResult.isSucceeded){\n <croco-html-xml-tag-html-view [html]=\"item.bootstrapHtml\">\n </croco-html-xml-tag-html-view>\n }\n @else {\n <croco-html-error-banner [message]=\"item.validationResult.message\">\n </croco-html-error-banner>\n }\n }\n\n @if (item.type === 'rich-text') {\n <div>\n <croco-html-xml-tag-text-view></croco-html-xml-tag-text-view>\n </div>\n }\n\n @if (item.type === 'external-video') {\n <div>\n <croco-html-xml-tag-external-video [data]=\"item\"></croco-html-xml-tag-external-video>\n </div>\n }\n\n @if (item.type === 'download-file-button') {\n <div>\n <croco-html-xml-tag-download-file-button [data]=\"item\"></croco-html-xml-tag-download-file-button>\n </div>\n }\n\n @if (item.type === 'button') {\n <div>\n <croco-html-xml-tag-button [data]=\"item\"></croco-html-xml-tag-button>\n </div>\n }\n @if (item.type === 'unsupported-tag') {\n <div class=\"red\" style=\"margin-top: 10px;\">\n <h4>\u0414\u0430\u043D\u043D\u044B\u0439 \u0442\u0435\u0433 \u043D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F</h4>\n <span>\n {{item.data.tagString}}\n </span>\n </div>\n }\n </div>\n }\n</div>\n", styles: [".red{background-color:#c94444;color:#fff}\n"] }]
1495
1593
  }], propDecorators: { data: [{
1496
1594
  type: Input
1497
1595
  }] } });
@@ -1757,6 +1855,7 @@ class DefaultTags {
1757
1855
  { tag: ExternalVideoTagDataConsts.TagName, displayValue: 'Внешнее видео' },
1758
1856
  { tag: DownloadButtonTagDataConsts.TagName, displayValue: 'Кнопка для скачивания' },
1759
1857
  { tag: ButtonTagDataConsts.TagName, displayValue: 'Кнопка' },
1858
+ { tag: CustomWidgetTagDataConsts.TagName, displayValue: 'Кастомный виджет' },
1760
1859
  ...DefaultTags.textTags
1761
1860
  ]; }
1762
1861
  static { this.htmlRawTag = {
@@ -1826,6 +1925,39 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.4", ngImpor
1826
1925
  type: Output
1827
1926
  }] } });
1828
1927
 
1928
+ class CustomWidgetEditorComponent {
1929
+ constructor() {
1930
+ this.onTagUpdated = new EventEmitter();
1931
+ this.tagData = {
1932
+ type: '',
1933
+ dataId: '',
1934
+ widgetId: ''
1935
+ };
1936
+ }
1937
+ ngOnInit() {
1938
+ this.tagData = CustomWidgetMethods.ExtractCustomWidgetTagData(this.tag.attributes);
1939
+ }
1940
+ dataChanged() {
1941
+ this.tag.attributes = CustomWidgetMethods.ExtractCustomWidgetAttributes(this.tagData);
1942
+ }
1943
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: CustomWidgetEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1944
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.4", type: CustomWidgetEditorComponent, isStandalone: true, selector: "croco-html-custom-widget-editor", inputs: { tag: "tag" }, outputs: { onTagUpdated: "onTagUpdated" }, ngImport: i0, template: "@if (tag.presentOrEdit) {\n <div>\n <div>\n <b>type:</b> {{tagData.type}}\n </div>\n <div style=\"height: 10px;\"></div>\n <div>\n <b>data-id:</b> {{tagData.dataId}}\n </div>\n <div style=\"height: 10px;\"></div>\n <div>\n <b>widget-id:</b> {{tagData.widgetId}}\n </div>\n <div style=\"height: 10px;\"></div>\n <croco-html-xml-tag-custom-widget [tagData]=\"tagData\"></croco-html-xml-tag-custom-widget>\n </div>\n} @else {\n <div>\n <mat-form-field class=\"w-100\">\n <mat-label>\n type\n </mat-label>\n <input matInput\n placeholder=\"type\"\n autocomplete=\"off\"\n [(ngModel)]=\"tagData.type\"\n (ngModelChange)=\"dataChanged()\">\n </mat-form-field>\n\n <mat-form-field class=\"w-100\">\n <mat-label>\n data-id\n </mat-label>\n <input matInput\n placeholder=\"data-id\"\n autocomplete=\"off\"\n [(ngModel)]=\"tagData.dataId\"\n (ngModelChange)=\"dataChanged()\">\n </mat-form-field>\n\n <mat-form-field class=\"w-100\">\n <mat-label>\n widget-id\n </mat-label>\n <input matInput\n placeholder=\"widget-id\"\n autocomplete=\"off\"\n [(ngModel)]=\"tagData.widgetId\"\n (ngModelChange)=\"dataChanged()\">\n </mat-form-field>\n </div>\n}\n", styles: [""], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "component", type: XmlTagCustomWidgetComponent, selector: "croco-html-xml-tag-custom-widget", inputs: ["tagData"] }] }); }
1945
+ }
1946
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: CustomWidgetEditorComponent, decorators: [{
1947
+ type: Component,
1948
+ args: [{ selector: 'croco-html-custom-widget-editor', standalone: true, imports: [
1949
+ FormsModule,
1950
+ MatFormField,
1951
+ MatInput,
1952
+ MatLabel,
1953
+ XmlTagCustomWidgetComponent,
1954
+ ], template: "@if (tag.presentOrEdit) {\n <div>\n <div>\n <b>type:</b> {{tagData.type}}\n </div>\n <div style=\"height: 10px;\"></div>\n <div>\n <b>data-id:</b> {{tagData.dataId}}\n </div>\n <div style=\"height: 10px;\"></div>\n <div>\n <b>widget-id:</b> {{tagData.widgetId}}\n </div>\n <div style=\"height: 10px;\"></div>\n <croco-html-xml-tag-custom-widget [tagData]=\"tagData\"></croco-html-xml-tag-custom-widget>\n </div>\n} @else {\n <div>\n <mat-form-field class=\"w-100\">\n <mat-label>\n type\n </mat-label>\n <input matInput\n placeholder=\"type\"\n autocomplete=\"off\"\n [(ngModel)]=\"tagData.type\"\n (ngModelChange)=\"dataChanged()\">\n </mat-form-field>\n\n <mat-form-field class=\"w-100\">\n <mat-label>\n data-id\n </mat-label>\n <input matInput\n placeholder=\"data-id\"\n autocomplete=\"off\"\n [(ngModel)]=\"tagData.dataId\"\n (ngModelChange)=\"dataChanged()\">\n </mat-form-field>\n\n <mat-form-field class=\"w-100\">\n <mat-label>\n widget-id\n </mat-label>\n <input matInput\n placeholder=\"widget-id\"\n autocomplete=\"off\"\n [(ngModel)]=\"tagData.widgetId\"\n (ngModelChange)=\"dataChanged()\">\n </mat-form-field>\n </div>\n}\n" }]
1955
+ }], propDecorators: { tag: [{
1956
+ type: Input
1957
+ }], onTagUpdated: [{
1958
+ type: Output
1959
+ }] } });
1960
+
1829
1961
  class MainEditorBlockComponent {
1830
1962
  constructor() {
1831
1963
  this.textTags = TextTags.allTextTags;
@@ -1844,7 +1976,7 @@ class MainEditorBlockComponent {
1844
1976
  ngOnInit() {
1845
1977
  }
1846
1978
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: MainEditorBlockComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1847
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.4", type: MainEditorBlockComponent, isStandalone: true, selector: "croco-html-main-editor-block", inputs: { tag: "tag" }, outputs: { onTagSaved: "onTagSaved", onTagRemoved: "onTagRemoved" }, ngImport: i0, template: "<div>\n <div>\n @if (textTags.includes(tag.tagDescription.tag)) {\n <div>\n <croco-html-text-editor (onTagUpdated)=\"tagUpdatedHandler($event)\" [tag]=\"tag\">\n </croco-html-text-editor>\n </div>\n }\n\n @if (tag.tagDescription.tag === 'file-image') {\n <div>\n <croco-html-image-editor (onTagUpdated)=\"tagUpdatedHandler($event)\" [tag]=\"tag\">\n </croco-html-image-editor>\n </div>\n }\n\n @if (tag.tagDescription.tag === 'external-video') {\n <div>\n <croco-html-external-video-editor (onTagUpdated)=\"tagUpdatedHandler($event)\" [tag]=\"tag\">\n </croco-html-external-video-editor>\n </div>\n }\n\n @if (tag.tagDescription.tag === 'download-file-button') {\n <div>\n <croco-html-download-file-button-editor (onTagUpdated)=\"tagUpdatedHandler($event)\" [tag]=\"tag\">\n </croco-html-download-file-button-editor>\n </div>\n }\n\n @if (tag.tagDescription.tag === 'button') {\n <div>\n <croco-html-button-editor (onTagUpdated)=\"tagUpdatedHandler($event)\" [tag]=\"tag\">\n </croco-html-button-editor>\n </div>\n }\n\n @if (tag.tagDescription.tag === 'html-raw') {\n <div>\n <croco-html-html-raw-editor (onTagUpdated)=\"tagUpdatedHandler($event)\" [tag]=\"tag\">\n </croco-html-html-raw-editor>\n </div>\n }\n\n </div>\n\n <div class=\"d-flex justify-content-between\">\n <div class=\"d-flex justify-content-end align-self-center\">\n <div>\n @if (tag.presentOrEdit) {\n <button (click)=\"tag.presentOrEdit = false\" mat-icon-button>\n <mat-icon>edit</mat-icon>\n </button>\n }\n @if (!tag.presentOrEdit) {\n <button (click)=\"save()\" mat-icon-button>\n <mat-icon>save</mat-icon>\n </button>\n }\n <button (click)=\"deleteItem()\" mat-icon-button color=\"warn\">\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n </div>\n\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "component", type: TextEditorComponent, selector: "croco-html-text-editor", inputs: ["tag"], outputs: ["onTagUpdated"] }, { kind: "component", type: ImageEditorComponent, selector: "croco-html-image-editor", inputs: ["tag"], outputs: ["onTagUpdated"] }, { kind: "component", type: DownloadFileButtonEditorComponent, selector: "croco-html-download-file-button-editor", inputs: ["tag"], outputs: ["onTagUpdated"] }, { kind: "component", type: HtmlRawEditorComponent, selector: "croco-html-html-raw-editor", inputs: ["tag"], outputs: ["onTagUpdated"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: ExternalVideoEditorComponent, selector: "croco-html-external-video-editor", inputs: ["tag"], outputs: ["onTagUpdated"] }, { kind: "component", type: ButtonEditorComponent, selector: "croco-html-button-editor", inputs: ["tag"], outputs: ["onTagUpdated"] }] }); }
1979
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.4", type: MainEditorBlockComponent, isStandalone: true, selector: "croco-html-main-editor-block", inputs: { tag: "tag" }, outputs: { onTagSaved: "onTagSaved", onTagRemoved: "onTagRemoved" }, ngImport: i0, template: "<div>\n <div>\n @if (textTags.includes(tag.tagDescription.tag)) {\n <div>\n <croco-html-text-editor (onTagUpdated)=\"tagUpdatedHandler($event)\" [tag]=\"tag\">\n </croco-html-text-editor>\n </div>\n }\n\n @if (tag.tagDescription.tag === 'file-image') {\n <div>\n <croco-html-image-editor (onTagUpdated)=\"tagUpdatedHandler($event)\" [tag]=\"tag\">\n </croco-html-image-editor>\n </div>\n }\n\n @if (tag.tagDescription.tag === 'custom-widget') {\n <div>\n <croco-html-custom-widget-editor (onTagUpdated)=\"tagUpdatedHandler($event)\" [tag]=\"tag\">\n </croco-html-custom-widget-editor>\n </div>\n }\n\n @if (tag.tagDescription.tag === 'external-video') {\n <div>\n <croco-html-external-video-editor (onTagUpdated)=\"tagUpdatedHandler($event)\" [tag]=\"tag\">\n </croco-html-external-video-editor>\n </div>\n }\n\n @if (tag.tagDescription.tag === 'download-file-button') {\n <div>\n <croco-html-download-file-button-editor (onTagUpdated)=\"tagUpdatedHandler($event)\" [tag]=\"tag\">\n </croco-html-download-file-button-editor>\n </div>\n }\n\n @if (tag.tagDescription.tag === 'button') {\n <div>\n <croco-html-button-editor (onTagUpdated)=\"tagUpdatedHandler($event)\" [tag]=\"tag\">\n </croco-html-button-editor>\n </div>\n }\n\n @if (tag.tagDescription.tag === 'html-raw') {\n <div>\n <croco-html-html-raw-editor (onTagUpdated)=\"tagUpdatedHandler($event)\" [tag]=\"tag\">\n </croco-html-html-raw-editor>\n </div>\n }\n\n </div>\n\n <div class=\"d-flex justify-content-between\">\n <div class=\"d-flex justify-content-end align-self-center\">\n <div>\n @if (tag.presentOrEdit) {\n <button (click)=\"tag.presentOrEdit = false\" mat-icon-button>\n <mat-icon>edit</mat-icon>\n </button>\n }\n @if (!tag.presentOrEdit) {\n <button (click)=\"save()\" mat-icon-button>\n <mat-icon>save</mat-icon>\n </button>\n }\n <button (click)=\"deleteItem()\" mat-icon-button color=\"warn\">\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n </div>\n\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "component", type: TextEditorComponent, selector: "croco-html-text-editor", inputs: ["tag"], outputs: ["onTagUpdated"] }, { kind: "component", type: ImageEditorComponent, selector: "croco-html-image-editor", inputs: ["tag"], outputs: ["onTagUpdated"] }, { kind: "component", type: DownloadFileButtonEditorComponent, selector: "croco-html-download-file-button-editor", inputs: ["tag"], outputs: ["onTagUpdated"] }, { kind: "component", type: HtmlRawEditorComponent, selector: "croco-html-html-raw-editor", inputs: ["tag"], outputs: ["onTagUpdated"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: ExternalVideoEditorComponent, selector: "croco-html-external-video-editor", inputs: ["tag"], outputs: ["onTagUpdated"] }, { kind: "component", type: ButtonEditorComponent, selector: "croco-html-button-editor", inputs: ["tag"], outputs: ["onTagUpdated"] }, { kind: "component", type: CustomWidgetEditorComponent, selector: "croco-html-custom-widget-editor", inputs: ["tag"], outputs: ["onTagUpdated"] }] }); }
1848
1980
  }
1849
1981
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: MainEditorBlockComponent, decorators: [{
1850
1982
  type: Component,
@@ -1856,8 +1988,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.4", ngImpor
1856
1988
  MatIconButton,
1857
1989
  MatIcon,
1858
1990
  ExternalVideoEditorComponent,
1859
- ButtonEditorComponent
1860
- ], template: "<div>\n <div>\n @if (textTags.includes(tag.tagDescription.tag)) {\n <div>\n <croco-html-text-editor (onTagUpdated)=\"tagUpdatedHandler($event)\" [tag]=\"tag\">\n </croco-html-text-editor>\n </div>\n }\n\n @if (tag.tagDescription.tag === 'file-image') {\n <div>\n <croco-html-image-editor (onTagUpdated)=\"tagUpdatedHandler($event)\" [tag]=\"tag\">\n </croco-html-image-editor>\n </div>\n }\n\n @if (tag.tagDescription.tag === 'external-video') {\n <div>\n <croco-html-external-video-editor (onTagUpdated)=\"tagUpdatedHandler($event)\" [tag]=\"tag\">\n </croco-html-external-video-editor>\n </div>\n }\n\n @if (tag.tagDescription.tag === 'download-file-button') {\n <div>\n <croco-html-download-file-button-editor (onTagUpdated)=\"tagUpdatedHandler($event)\" [tag]=\"tag\">\n </croco-html-download-file-button-editor>\n </div>\n }\n\n @if (tag.tagDescription.tag === 'button') {\n <div>\n <croco-html-button-editor (onTagUpdated)=\"tagUpdatedHandler($event)\" [tag]=\"tag\">\n </croco-html-button-editor>\n </div>\n }\n\n @if (tag.tagDescription.tag === 'html-raw') {\n <div>\n <croco-html-html-raw-editor (onTagUpdated)=\"tagUpdatedHandler($event)\" [tag]=\"tag\">\n </croco-html-html-raw-editor>\n </div>\n }\n\n </div>\n\n <div class=\"d-flex justify-content-between\">\n <div class=\"d-flex justify-content-end align-self-center\">\n <div>\n @if (tag.presentOrEdit) {\n <button (click)=\"tag.presentOrEdit = false\" mat-icon-button>\n <mat-icon>edit</mat-icon>\n </button>\n }\n @if (!tag.presentOrEdit) {\n <button (click)=\"save()\" mat-icon-button>\n <mat-icon>save</mat-icon>\n </button>\n }\n <button (click)=\"deleteItem()\" mat-icon-button color=\"warn\">\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n </div>\n\n </div>\n</div>\n" }]
1991
+ ButtonEditorComponent,
1992
+ CustomWidgetEditorComponent
1993
+ ], template: "<div>\n <div>\n @if (textTags.includes(tag.tagDescription.tag)) {\n <div>\n <croco-html-text-editor (onTagUpdated)=\"tagUpdatedHandler($event)\" [tag]=\"tag\">\n </croco-html-text-editor>\n </div>\n }\n\n @if (tag.tagDescription.tag === 'file-image') {\n <div>\n <croco-html-image-editor (onTagUpdated)=\"tagUpdatedHandler($event)\" [tag]=\"tag\">\n </croco-html-image-editor>\n </div>\n }\n\n @if (tag.tagDescription.tag === 'custom-widget') {\n <div>\n <croco-html-custom-widget-editor (onTagUpdated)=\"tagUpdatedHandler($event)\" [tag]=\"tag\">\n </croco-html-custom-widget-editor>\n </div>\n }\n\n @if (tag.tagDescription.tag === 'external-video') {\n <div>\n <croco-html-external-video-editor (onTagUpdated)=\"tagUpdatedHandler($event)\" [tag]=\"tag\">\n </croco-html-external-video-editor>\n </div>\n }\n\n @if (tag.tagDescription.tag === 'download-file-button') {\n <div>\n <croco-html-download-file-button-editor (onTagUpdated)=\"tagUpdatedHandler($event)\" [tag]=\"tag\">\n </croco-html-download-file-button-editor>\n </div>\n }\n\n @if (tag.tagDescription.tag === 'button') {\n <div>\n <croco-html-button-editor (onTagUpdated)=\"tagUpdatedHandler($event)\" [tag]=\"tag\">\n </croco-html-button-editor>\n </div>\n }\n\n @if (tag.tagDescription.tag === 'html-raw') {\n <div>\n <croco-html-html-raw-editor (onTagUpdated)=\"tagUpdatedHandler($event)\" [tag]=\"tag\">\n </croco-html-html-raw-editor>\n </div>\n }\n\n </div>\n\n <div class=\"d-flex justify-content-between\">\n <div class=\"d-flex justify-content-end align-self-center\">\n <div>\n @if (tag.presentOrEdit) {\n <button (click)=\"tag.presentOrEdit = false\" mat-icon-button>\n <mat-icon>edit</mat-icon>\n </button>\n }\n @if (!tag.presentOrEdit) {\n <button (click)=\"save()\" mat-icon-button>\n <mat-icon>save</mat-icon>\n </button>\n }\n <button (click)=\"deleteItem()\" mat-icon-button color=\"warn\">\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n </div>\n\n </div>\n</div>\n" }]
1861
1994
  }], propDecorators: { tag: [{
1862
1995
  type: Input
1863
1996
  }], onTagSaved: [{
@@ -1934,6 +2067,11 @@ class VisualEditorComponent {
1934
2067
  attrs[ButtonTagDataConsts.TypeAttrName] = 'button';
1935
2068
  attrs[ButtonTagDataConsts.TextAttrName] = 'Кнопка';
1936
2069
  }
2070
+ else if (tagDescription.tag == CustomWidgetTagDataConsts.TagName) {
2071
+ attrs[CustomWidgetTagDataConsts.TypeAttrName] = 'example-type';
2072
+ attrs[CustomWidgetTagDataConsts.DataIdAttrName] = 'example-data-id';
2073
+ attrs[CustomWidgetTagDataConsts.WidgetIdAttrName] = 'example-widget-id';
2074
+ }
1937
2075
  else {
1938
2076
  attrs[FileImageTagDataConsts.FileIdAttrName] = null;
1939
2077
  }
@@ -2225,6 +2363,7 @@ const EditorComponents = [
2225
2363
  VisualEditorComponent,
2226
2364
  AddFilesBtnComponent,
2227
2365
  HtmlRawEditorComponent,
2366
+ CustomWidgetEditorComponent,
2228
2367
  ];
2229
2368
  const XmlComponents = [
2230
2369
  XmlTagTableViewComponent,
@@ -2237,6 +2376,7 @@ const XmlComponents = [
2237
2376
  XmlTagExternalVideoComponent,
2238
2377
  HtmlRawViewComponent,
2239
2378
  FileImageTagViewComponent,
2379
+ XmlTagCustomWidgetComponent,
2240
2380
  HtmlViewComponent
2241
2381
  ];
2242
2382
  const CrocoPipes = [
@@ -2294,13 +2434,13 @@ class CrocoHtmlModule {
2294
2434
  VkVideoPlayerComponent,
2295
2435
  YoutubeVideoPlayerComponent,
2296
2436
  DownloadFileButtonEditorComponent,
2297
- XmlTagDownloadFileButtonComponent, UploadFilesBtnComponent, HtmlViewComponent, XmlTagTableViewComponent, XmlTagViewComponent, XmlTagRichTextViewComponent, XmlTagHtmlViewComponent, XmlTagTextViewComponent, XmlTagHeaderTextViewComponent, XmlTagHeaderInnerTextViewComponent, XmlTagExternalVideoComponent, HtmlRawViewComponent, FileImageTagViewComponent, HtmlViewComponent, MainEditorComponent, FileIdSelectComponent, TextEditorComponent, ImageEditorComponent, MainEditorBlockComponent, VisualEditorComponent, AddFilesBtnComponent, HtmlRawEditorComponent, RichTextToHtmlPipe, TagToSpanPipe, ToPreviewPipe, ToHtmlBodyTagsPipe, ToPreviewHtmlPipe], exports: [UploadFilesBtnComponent, HtmlViewComponent, XmlTagTableViewComponent, XmlTagViewComponent, XmlTagRichTextViewComponent, XmlTagHtmlViewComponent, XmlTagTextViewComponent, XmlTagHeaderTextViewComponent, XmlTagHeaderInnerTextViewComponent, XmlTagExternalVideoComponent, HtmlRawViewComponent, FileImageTagViewComponent, HtmlViewComponent, MainEditorComponent, FileIdSelectComponent, TextEditorComponent, ImageEditorComponent, MainEditorBlockComponent, VisualEditorComponent, AddFilesBtnComponent, HtmlRawEditorComponent, RichTextToHtmlPipe, TagToSpanPipe, ToPreviewPipe, ToHtmlBodyTagsPipe, ToPreviewHtmlPipe] }); }
2437
+ XmlTagDownloadFileButtonComponent, UploadFilesBtnComponent, HtmlViewComponent, XmlTagTableViewComponent, XmlTagViewComponent, XmlTagRichTextViewComponent, XmlTagHtmlViewComponent, XmlTagTextViewComponent, XmlTagHeaderTextViewComponent, XmlTagHeaderInnerTextViewComponent, XmlTagExternalVideoComponent, HtmlRawViewComponent, FileImageTagViewComponent, XmlTagCustomWidgetComponent, HtmlViewComponent, MainEditorComponent, FileIdSelectComponent, TextEditorComponent, ImageEditorComponent, MainEditorBlockComponent, VisualEditorComponent, AddFilesBtnComponent, HtmlRawEditorComponent, CustomWidgetEditorComponent, RichTextToHtmlPipe, TagToSpanPipe, ToPreviewPipe, ToHtmlBodyTagsPipe, ToPreviewHtmlPipe], exports: [UploadFilesBtnComponent, HtmlViewComponent, XmlTagTableViewComponent, XmlTagViewComponent, XmlTagRichTextViewComponent, XmlTagHtmlViewComponent, XmlTagTextViewComponent, XmlTagHeaderTextViewComponent, XmlTagHeaderInnerTextViewComponent, XmlTagExternalVideoComponent, HtmlRawViewComponent, FileImageTagViewComponent, XmlTagCustomWidgetComponent, HtmlViewComponent, MainEditorComponent, FileIdSelectComponent, TextEditorComponent, ImageEditorComponent, MainEditorBlockComponent, VisualEditorComponent, AddFilesBtnComponent, HtmlRawEditorComponent, CustomWidgetEditorComponent, RichTextToHtmlPipe, TagToSpanPipe, ToPreviewPipe, ToHtmlBodyTagsPipe, ToPreviewHtmlPipe] }); }
2298
2438
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: CrocoHtmlModule, imports: [CommonModule,
2299
2439
  FormsModule,
2300
2440
  ReactiveFormsModule,
2301
2441
  NgSelectModule, MaterialModules, ErrorBannerComponent,
2302
2442
  DownloadFileButtonEditorComponent,
2303
- XmlTagDownloadFileButtonComponent, UploadFilesBtnComponent, HtmlViewComponent, XmlTagTableViewComponent, XmlTagViewComponent, HtmlViewComponent, MainEditorComponent, FileIdSelectComponent, TextEditorComponent, ImageEditorComponent, MainEditorBlockComponent, VisualEditorComponent, AddFilesBtnComponent, HtmlRawEditorComponent] }); }
2443
+ XmlTagDownloadFileButtonComponent, UploadFilesBtnComponent, HtmlViewComponent, XmlTagTableViewComponent, XmlTagViewComponent, HtmlViewComponent, MainEditorComponent, FileIdSelectComponent, TextEditorComponent, ImageEditorComponent, MainEditorBlockComponent, VisualEditorComponent, AddFilesBtnComponent, HtmlRawEditorComponent, CustomWidgetEditorComponent] }); }
2304
2444
  }
2305
2445
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: CrocoHtmlModule, decorators: [{
2306
2446
  type: NgModule,
@@ -2332,5 +2472,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.4", ngImpor
2332
2472
  * Generated bundle index. Do not edit.
2333
2473
  */
2334
2474
 
2335
- export { AddFilesBtnComponent, AngularMaterialTableMethods, BodyTagsExtensions, BootstrapTableMethods, CrocoHtmlModule, CrocoHtmlOptionsToken, ExternalVideoEditorComponent, ExternalVideoPlayers, ExternalVideoSupportedTypes, ExternalVideoTagDataConsts, FileIdSelectComponent, FileImageTagDataConsts, FileImageTagViewComponent, HtmlRawEditorComponent, HtmlRawViewComponent, HtmlViewComponent, HtmlViewController, ImageEditorComponent, ImageMethods, MainEditorBlockComponent, MainEditorComponent, RichTextToHtmlPipe, TableBuilder, TableMethods, TableTypes, TagToSpanPipe, TextEditorComponent, TextMethods, TextSimpleMethods, TextTag, TextTagDataConsts, TextTags, ToHtmlBodyTagsPipe, ToPreviewHtmlPipe, ToPreviewPipe, UploadFilesBtnComponent, VideoMethods, VisualEditorComponent, XmlExtensions, XmlTagExternalVideoComponent, XmlTagHeaderInnerTextViewComponent, XmlTagHeaderTextViewComponent, XmlTagHtmlViewComponent, XmlTagRichTextViewComponent, XmlTagTableViewComponent, XmlTagTextViewComponent, XmlTagViewComponent, defaultLinkForDownload, defaultLinkVk, defaultLinkYouTube };
2475
+ export { AddFilesBtnComponent, AngularMaterialTableMethods, BodyTagsExtensions, BootstrapTableMethods, CrocoHtmlModule, CrocoHtmlOptionsToken, CustomWidgetEditorComponent, CustomWidgetMethods, CustomWidgetTagDataConsts, ExternalVideoEditorComponent, ExternalVideoPlayers, ExternalVideoSupportedTypes, ExternalVideoTagDataConsts, FileIdSelectComponent, FileImageTagDataConsts, FileImageTagViewComponent, HtmlRawEditorComponent, HtmlRawViewComponent, HtmlViewComponent, HtmlViewController, ImageEditorComponent, ImageMethods, MainEditorBlockComponent, MainEditorComponent, RichTextToHtmlPipe, TableBuilder, TableMethods, TableTypes, TagToSpanPipe, TextEditorComponent, TextMethods, TextSimpleMethods, TextTag, TextTagDataConsts, TextTags, ToHtmlBodyTagsPipe, ToPreviewHtmlPipe, ToPreviewPipe, UploadFilesBtnComponent, VideoMethods, VisualEditorComponent, XmlExtensions, XmlTagCustomWidgetComponent, XmlTagExternalVideoComponent, XmlTagHeaderInnerTextViewComponent, XmlTagHeaderTextViewComponent, XmlTagHtmlViewComponent, XmlTagRichTextViewComponent, XmlTagTableViewComponent, XmlTagTextViewComponent, XmlTagViewComponent, defaultLinkForDownload, defaultLinkVk, defaultLinkYouTube };
2336
2476
  //# sourceMappingURL=croco-html.mjs.map