@acorex/platform 21.0.0-next.73 → 21.0.0-next.75

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.
@@ -21,7 +21,7 @@ import * as i1$6 from '@acorex/components/text-box';
21
21
  import { AXTextBoxModule } from '@acorex/components/text-box';
22
22
  import * as i6 from '@acorex/core/translation';
23
23
  import { AXTranslationModule, AXTranslationService, resolveMultiLanguageString } from '@acorex/core/translation';
24
- import { AXP_LOCALE_MANAGEMENT_PORT, AXPFilterOperatorMiddlewareService, AXPCleanNestedFilters, AXPClipBoardService, AXPSettingsService, AXPRegionalSetting, ALL_DEFAULT_OPERATORS, DATE_OPERATORS, BOOLEAN_OPERATORS, NUMBER_OPERATORS, STRING_OPERATORS, resolveDateFilterPresets, findManualPresetIdByOperation, applyDateFilterPreset, AXPFileStorageService, AXPFileActionsService, AXPStatusDefinitionProviderService, AXPRefreshEvent, AXPCommonSettings } from '@acorex/platform/common';
24
+ import { AXP_LOCALE_MANAGEMENT_PORT, AXPFilterOperatorMiddlewareService, AXPCleanNestedFilters, AXPClipBoardService, AXPSettingsService, AXPRegionalSetting, ALL_DEFAULT_OPERATORS, DATE_OPERATORS, BOOLEAN_OPERATORS, NUMBER_OPERATORS, STRING_OPERATORS, resolveDateFilterPresets, findManualPresetIdByOperation, applyDateFilterPreset, AXPFileStorageService, AXPFileActionsService, normalizePositiveNumberOption, resolveEntityRowDisplayText, resolveEntityRowDisplayTitle, downloadGraphicFromElement, printGraphicFromElement, AXPStatusDefinitionProviderService, AXPRefreshEvent, AXPCommonSettings } from '@acorex/platform/common';
25
25
  import { AXPDeviceService, setSmart, AXPColorPaletteService, extractValue, shouldUseLocaleMapShape, buildLocaleTextMapValue, AXPTagService, AXPExpressionEvaluatorService, AXPHookService, AXPDataGenerator, AXPDataSourceDefinitionProviderService, sortByMultiLanguageString, applyQueryArray, chordToKbdItemKeys, objectKeyValueTransforms } from '@acorex/platform/core';
26
26
  import * as i1$4 from '@angular/common';
27
27
  import { CommonModule, AsyncPipe } from '@angular/common';
@@ -6542,6 +6542,7 @@ class AXPRichTextWidgetEditComponent extends AXPValueWidgetComponent {
6542
6542
  [placeHolder]="(placeholder() | translate | async)!"
6543
6543
  [disabled]="disabled()"
6544
6544
  [readonly]="readonly()"
6545
+ [initialLine]="3"
6545
6546
  [look]="'solid'"
6546
6547
  [ngModel]="getCurrentText()"
6547
6548
  (onValueChanged)="onWysiwygChanged($event)"
@@ -6573,7 +6574,7 @@ class AXPRichTextWidgetEditComponent extends AXPValueWidgetComponent {
6573
6574
  [options]="validation.options"
6574
6575
  ></ax-validation-rule>
6575
6576
  }
6576
- </ax-wysiwyg-container>`, isInline: true, dependencies: [{ kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2$1.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXWysiwygModule }, { kind: "component", type: i2$5.AXWysiwygContainerComponent, selector: "ax-wysiwyg-container", inputs: ["look", "readonly", "disabled", "value", "placeHolder"], outputs: ["onValueChanged"] }, { kind: "component", type: i2$5.AXWysiwygViewComponent, selector: "ax-wysiwyg-view" }, { kind: "component", type: i2$5.AXWysiwygAlignmentComponent, selector: "ax-wysiwyg-alignment" }, { kind: "component", type: i2$5.AXWysiwygColorsComponent, selector: "ax-wysiwyg-colors" }, { kind: "component", type: i2$5.AXWysiwygFontStyleComponent, selector: "ax-wysiwyg-font-style" }, { kind: "component", type: i2$5.AXWysiwygHistoryComponent, selector: "ax-wysiwyg-history" }, { kind: "component", type: i2$5.AXWysiwygInsertComponent, selector: "ax-wysiwyg-insert" }, { kind: "component", type: i2$5.AXWysiwygListComponent, selector: "ax-wysiwyg-list" }, { kind: "component", type: i2$5.AXWysiwygToolbarComponent, selector: "ax-wysiwyg-toolbar" }, { kind: "ngmodule", type: AXValidationModule }, { kind: "ngmodule", type: AXFormModule }, { kind: "directive", type: i3.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i6.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
6577
+ </ax-wysiwyg-container>`, isInline: true, dependencies: [{ kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2$1.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXWysiwygModule }, { kind: "component", type: i2$5.AXWysiwygContainerComponent, selector: "ax-wysiwyg-container", inputs: ["look", "readonly", "disabled", "value", "placeHolder", "initialLine"], outputs: ["onValueChanged"] }, { kind: "component", type: i2$5.AXWysiwygViewComponent, selector: "ax-wysiwyg-view" }, { kind: "component", type: i2$5.AXWysiwygAlignmentComponent, selector: "ax-wysiwyg-alignment" }, { kind: "component", type: i2$5.AXWysiwygColorsComponent, selector: "ax-wysiwyg-colors" }, { kind: "component", type: i2$5.AXWysiwygFontStyleComponent, selector: "ax-wysiwyg-font-style" }, { kind: "component", type: i2$5.AXWysiwygHistoryComponent, selector: "ax-wysiwyg-history" }, { kind: "component", type: i2$5.AXWysiwygInsertComponent, selector: "ax-wysiwyg-insert" }, { kind: "component", type: i2$5.AXWysiwygListComponent, selector: "ax-wysiwyg-list" }, { kind: "component", type: i2$5.AXWysiwygToolbarComponent, selector: "ax-wysiwyg-toolbar" }, { kind: "ngmodule", type: AXValidationModule }, { kind: "ngmodule", type: AXFormModule }, { kind: "directive", type: i3.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i6.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
6577
6578
  }
6578
6579
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPRichTextWidgetEditComponent, decorators: [{
6579
6580
  type: Component,
@@ -6584,6 +6585,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
6584
6585
  [placeHolder]="(placeholder() | translate | async)!"
6585
6586
  [disabled]="disabled()"
6586
6587
  [readonly]="readonly()"
6588
+ [initialLine]="3"
6587
6589
  [look]="'solid'"
6588
6590
  [ngModel]="getCurrentText()"
6589
6591
  (onValueChanged)="onWysiwygChanged($event)"
@@ -12010,46 +12012,59 @@ var mapWidgetView_component = /*#__PURE__*/Object.freeze({
12010
12012
  AXPMapWidgetViewComponent: AXPMapWidgetViewComponent
12011
12013
  });
12012
12014
 
12013
- //#region ---- QR code print utility ----
12014
- /**
12015
- * Opens the system print dialog for the QR code SVG inside the given container.
12016
- */
12017
- function printQrcodeFromElement(container, size) {
12018
- const svg = container.querySelector('svg');
12019
- if (!svg) {
12020
- return;
12021
- }
12022
- const printWindow = window.open('', '_blank', 'noopener,noreferrer');
12023
- if (!printWindow) {
12024
- return;
12025
- }
12026
- const svgMarkup = svg.outerHTML;
12027
- printWindow.document.write(`<!DOCTYPE html>
12028
- <html>
12029
- <head>
12030
- <title>QR Code</title>
12031
- <style>
12032
- body {
12033
- display: flex;
12034
- align-items: center;
12035
- justify-content: center;
12036
- min-height: 100vh;
12037
- margin: 0;
12038
- }
12039
- svg {
12040
- width: ${size}px;
12041
- height: ${size}px;
12042
- }
12043
- </style>
12044
- </head>
12045
- <body>${svgMarkup}</body>
12046
- </html>`);
12047
- printWindow.document.close();
12048
- printWindow.focus();
12049
- printWindow.print();
12050
- printWindow.close();
12051
- }
12052
- //#endregion
12015
+ const DEFAULT_QRCODE_SIZE = 200;
12016
+ const AXPQrcodeWidget = {
12017
+ name: 'qrcode',
12018
+ title: '@platform-layout-widgets:widgets.qrcode.title',
12019
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
12020
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_MEDIA,
12021
+ icon: 'fa-light fa-qrcode',
12022
+ description: '@platform-layout-widgets:widgets.qrcode.description',
12023
+ type: 'view',
12024
+ properties: [
12025
+ AXP_NAME_PROPERTY,
12026
+ AXP_DATA_PATH_PROPERTY,
12027
+ cloneProperty(AXP_COLOR_PROPERTY, { schema: { interface: { defaultValue: '#000000' } } }),
12028
+ cloneProperty(AXP_CONTENT_PROPERTY, { schema: { interface: { defaultValue: 'http://google.com' } } }),
12029
+ createNumberProperty({
12030
+ name: 'size',
12031
+ title: 'Size',
12032
+ path: 'options.size',
12033
+ group: AXP_STYLING_PROPERTY_GROUP,
12034
+ defaultValue: DEFAULT_QRCODE_SIZE,
12035
+ }),
12036
+ createSelectProperty({
12037
+ name: 'level',
12038
+ title: 'Error Correction Level',
12039
+ path: 'options.level',
12040
+ group: AXP_STYLING_PROPERTY_GROUP,
12041
+ dataSource: ['L', 'M', 'Q', 'H'],
12042
+ defaultValue: 'M',
12043
+ }),
12044
+ createSelectProperty({
12045
+ name: 'outputType',
12046
+ title: 'Output Type',
12047
+ path: 'options.outputType',
12048
+ group: AXP_STYLING_PROPERTY_GROUP,
12049
+ dataSource: ['svg', 'canvas'],
12050
+ defaultValue: 'svg',
12051
+ }),
12052
+ ],
12053
+ components: {
12054
+ view: {
12055
+ component: () => Promise.resolve().then(function () { return qrcodeWidgetView_component; }).then((c) => c.AXPQrcodeWidgetViewComponent),
12056
+ },
12057
+ edit: {
12058
+ component: () => Promise.resolve().then(function () { return qrcodeWidgetEdit_component; }).then((c) => c.AXPQrcodeWidgetEditComponent),
12059
+ },
12060
+ column: {
12061
+ component: () => Promise.resolve().then(function () { return qrcodeWidgetColumn_component; }).then((c) => c.AXPQrcodeWidgetColumnComponent),
12062
+ },
12063
+ designer: {
12064
+ component: () => Promise.resolve().then(function () { return qrcodeWidgetView_component; }).then((c) => c.AXPQrcodeWidgetViewComponent),
12065
+ },
12066
+ },
12067
+ };
12053
12068
 
12054
12069
  //#region ---- Types ----
12055
12070
  const QRCODE_WIDGET_NAME = 'qrcode';
@@ -12062,6 +12077,7 @@ class AXPQrcodeViewerService {
12062
12077
  constructor() {
12063
12078
  //#region ---- Services & Dependencies ----
12064
12079
  this.layoutBuilder = inject(AXPLayoutBuilderService);
12080
+ this.translation = inject(AXTranslationService);
12065
12081
  }
12066
12082
  //#endregion
12067
12083
  //#region ---- Public API ----
@@ -12074,19 +12090,25 @@ class AXPQrcodeViewerService {
12074
12090
  .create()
12075
12091
  .dialog((dialog) => {
12076
12092
  dialog
12077
- .setTitle(options.title ?? '@platform-layout-widgets:widgets.qrcode.title')
12093
+ .setTitle(this.resolveDialogTitle(options.title))
12078
12094
  .setSize('md')
12079
12095
  .setCloseButton(true)
12080
12096
  .setContext({ qr: contentValue })
12081
12097
  .content((content) => {
12082
- content.setDirection('column').setGap('24px').setAlignItems('center').customWidget(QRCODE_WIDGET_NAME, {
12098
+ content
12099
+ .setDirection('column')
12100
+ .setGap('24px')
12101
+ .setAlignItems('center')
12102
+ .mode('view')
12103
+ .customWidget(QRCODE_WIDGET_NAME, {
12083
12104
  name: QRCODE_WIDGET_NAME,
12084
12105
  path: 'qr',
12085
- size: options.size ?? 200,
12106
+ size: normalizePositiveNumberOption(options.size, DEFAULT_QRCODE_SIZE),
12086
12107
  level: options.level ?? 'M',
12087
12108
  color: options.color ?? '#000000',
12088
12109
  readonly: true,
12089
12110
  outputType: options.outputType ?? 'svg',
12111
+ showContent: true,
12090
12112
  });
12091
12113
  })
12092
12114
  .setActions((actions) => {
@@ -12102,6 +12124,12 @@ class AXPQrcodeViewerService {
12102
12124
  .show();
12103
12125
  ref.close();
12104
12126
  }
12127
+ //#endregion
12128
+ //#region ---- Utility Methods ----
12129
+ resolveDialogTitle(title) {
12130
+ const resolved = resolveEntityRowDisplayText(title, this.translation.getActiveLang());
12131
+ return resolved || '@platform-layout-widgets:widgets.qrcode.title';
12132
+ }
12105
12133
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPQrcodeViewerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
12106
12134
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPQrcodeViewerService, providedIn: 'root' }); }
12107
12135
  }
@@ -12110,24 +12138,49 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
12110
12138
  args: [{ providedIn: 'root' }]
12111
12139
  }] });
12112
12140
 
12141
+ //#region ---- Imports ----
12142
+ //#endregion
12143
+ //#region ---- Viewer open helper ----
12144
+ function buildQrcodeViewerOpenOptions(params) {
12145
+ const title = params.data
12146
+ ? resolveEntityRowDisplayTitle({
12147
+ data: params.data,
12148
+ widgetOptions: params.widgetOptions,
12149
+ formatService: params.formatService,
12150
+ activeLang: params.activeLang,
12151
+ entity: params.entity,
12152
+ })
12153
+ : '';
12154
+ const levelOption = params.widgetOptions['level'];
12155
+ const resolvedLevel = (typeof levelOption === 'string'
12156
+ ? levelOption
12157
+ : levelOption?.id) ?? 'M';
12158
+ return {
12159
+ content: params.content,
12160
+ title: title || params.fallbackTitleKey,
12161
+ size: normalizePositiveNumberOption(params.widgetOptions['size'], DEFAULT_QRCODE_SIZE),
12162
+ level: resolvedLevel,
12163
+ color: params.widgetOptions['color'] ?? '#000000',
12164
+ outputType: params.widgetOptions['outputType'] ?? 'svg',
12165
+ };
12166
+ }
12167
+ async function openQrcodeViewer(viewer, params) {
12168
+ const content = params.content?.trim();
12169
+ if (!content) {
12170
+ return;
12171
+ }
12172
+ await viewer.open(buildQrcodeViewerOpenOptions({ ...params, content }));
12173
+ }
12174
+ //#endregion
12175
+
12113
12176
  //#region ---- Component: QR Code Widget Column ----
12114
12177
  class AXPQrcodeWidgetColumnComponent extends AXPColumnWidgetComponent {
12115
12178
  constructor() {
12116
12179
  super(...arguments);
12117
12180
  //#region ---- Services & Dependencies ----
12118
12181
  this.qrcodeViewer = inject(AXPQrcodeViewerService);
12119
- //#endregion
12120
- //#region ---- Computed Properties ----
12121
- this.size = computed(() => this.options?.size ?? 200, ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
12122
- this.level = computed(() => {
12123
- const opt = this.options?.level;
12124
- return typeof opt === 'string' ? opt : (opt?.id ?? 'M');
12125
- }, ...(ngDevMode ? [{ debugName: "level" }] : /* istanbul ignore next */ []));
12126
- this.color = computed(() => {
12127
- const opt = this.options?.color;
12128
- return AXColorUtil.colorStringToHex(opt ?? '#000000');
12129
- }, ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
12130
- this.outputType = computed(() => this.options?.outputType ?? 'svg', ...(ngDevMode ? [{ debugName: "outputType" }] : /* istanbul ignore next */ []));
12182
+ this.formatService = inject(AXFormatService);
12183
+ this.translation = inject(AXTranslationService);
12131
12184
  }
12132
12185
  //#endregion
12133
12186
  //#region ---- UI Handlers ----
@@ -12136,12 +12189,12 @@ class AXPQrcodeWidgetColumnComponent extends AXPColumnWidgetComponent {
12136
12189
  if (!contentValue) {
12137
12190
  return;
12138
12191
  }
12139
- await this.qrcodeViewer.open({
12192
+ await openQrcodeViewer(this.qrcodeViewer, {
12140
12193
  content: contentValue,
12141
- size: this.size(),
12142
- level: this.level(),
12143
- color: this.color(),
12144
- outputType: this.outputType(),
12194
+ data: this.rowData,
12195
+ widgetOptions: { ...this.options, size: 500 },
12196
+ formatService: this.formatService,
12197
+ activeLang: this.translation.getActiveLang(),
12145
12198
  });
12146
12199
  }
12147
12200
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPQrcodeWidgetColumnComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
@@ -12190,8 +12243,13 @@ var qrcodeWidgetColumn_component = /*#__PURE__*/Object.freeze({
12190
12243
  class AXPQrcodeWidgetEditComponent extends AXPValueWidgetComponent {
12191
12244
  constructor() {
12192
12245
  super(...arguments);
12246
+ //#region ---- Services & Dependencies ----
12247
+ this.qrcodeViewer = inject(AXPQrcodeViewerService);
12248
+ this.formatService = inject(AXFormatService);
12249
+ this.translation = inject(AXTranslationService);
12250
+ //#endregion
12193
12251
  this.value = computed(() => this.getValue(), ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
12194
- this.size = computed(() => this.options()['size'] ?? 200, ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
12252
+ this.size = computed(() => normalizePositiveNumberOption(this.options()['size'], DEFAULT_QRCODE_SIZE), ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
12195
12253
  this.level = computed(() => this.options()['level']?.id ?? 'M', ...(ngDevMode ? [{ debugName: "level" }] : /* istanbul ignore next */ []));
12196
12254
  this.color = computed(() => AXColorUtil.colorStringToHex(this.options()['color'] ?? '#000000'), ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
12197
12255
  this.format = computed(() => this.options()['format']?.id ?? 'png', ...(ngDevMode ? [{ debugName: "format" }] : /* istanbul ignore next */ []));
@@ -12221,73 +12279,27 @@ class AXPQrcodeWidgetEditComponent extends AXPValueWidgetComponent {
12221
12279
  cancelEdit() {
12222
12280
  this.draft.set(this.value() ?? '');
12223
12281
  }
12224
- downloadQr(el) {
12225
- const svg = el.querySelector('svg');
12226
- const fmt = this.format();
12227
- if (fmt === 'svg') {
12228
- this.downloadSVGElement(svg, 'qrcode.svg');
12229
- }
12230
- else if (fmt === 'png') {
12231
- this.rasterizeAndDownload(el, 'image/png', 'qrcode.png');
12232
- }
12233
- else {
12234
- this.rasterizeAndDownload(el, 'image/jpeg', 'qrcode.jpg');
12282
+ async openPreview() {
12283
+ const content = this.value();
12284
+ if (!content) {
12285
+ return;
12235
12286
  }
12287
+ await openQrcodeViewer(this.qrcodeViewer, {
12288
+ content,
12289
+ data: this.contextService.data(),
12290
+ widgetOptions: this.options(),
12291
+ formatService: this.formatService,
12292
+ activeLang: this.translation.getActiveLang(),
12293
+ });
12236
12294
  }
12237
- downloadSVGElement(svgEl, filename = 'image.svg') {
12238
- // Convert the SVG element to a string
12239
- if (!svgEl)
12240
- return;
12241
- const serializer = new XMLSerializer();
12242
- let source = serializer.serializeToString(svgEl);
12243
- // Add the XML declaration (optional but recommended)
12244
- if (!source.match(/^<\?xml/)) {
12245
- source = '<?xml version="1.0" standalone="no"?>\r\n' + source;
12246
- }
12247
- // Create a Blob and trigger download
12248
- const blob = new Blob([source], { type: 'image/svg+xml;charset=utf-8' });
12249
- const url = URL.createObjectURL(blob);
12250
- const a = document.createElement('a');
12251
- a.href = url;
12252
- a.download = filename;
12253
- document.body.appendChild(a);
12254
- a.click();
12255
- document.body.removeChild(a);
12256
- URL.revokeObjectURL(url);
12257
- }
12258
- rasterizeAndDownload(el, mime, filename) {
12259
- const svgEl = el.querySelector('svg');
12260
- if (!svgEl)
12261
- return;
12262
- const serializer = new XMLSerializer();
12263
- let source = serializer.serializeToString(svgEl);
12264
- if (!source.match(/^<\?xml/)) {
12265
- source = '<?xml version="1.0" standalone="no"?>\r\n' + source;
12266
- }
12267
- const svgUrl = 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(source);
12268
- const img = new Image();
12269
- const size = this.size();
12270
- const canvas = document.createElement('canvas');
12271
- canvas.width = size;
12272
- canvas.height = size;
12273
- const ctx = canvas.getContext('2d');
12274
- if (!ctx)
12275
- return;
12276
- if (mime === 'image/jpeg') {
12277
- ctx.fillStyle = '#ffffff';
12278
- ctx.fillRect(0, 0, canvas.width, canvas.height);
12279
- }
12280
- img.onload = () => {
12281
- ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
12282
- const url = canvas.toDataURL(mime);
12283
- const a = document.createElement('a');
12284
- a.href = url;
12285
- a.download = filename;
12286
- document.body.appendChild(a);
12287
- a.click();
12288
- document.body.removeChild(a);
12289
- };
12290
- img.src = svgUrl;
12295
+ downloadQr(el) {
12296
+ const fmt = this.format();
12297
+ const format = fmt === 'jpg' ? 'jpeg' : fmt;
12298
+ downloadGraphicFromElement(el, {
12299
+ format,
12300
+ filename: `qrcode.${fmt}`,
12301
+ fallbackSize: this.size(),
12302
+ });
12291
12303
  }
12292
12304
  clearValue() {
12293
12305
  this.setValue('');
@@ -12309,7 +12321,7 @@ class AXPQrcodeWidgetEditComponent extends AXPValueWidgetComponent {
12309
12321
  }
12310
12322
  }
12311
12323
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPQrcodeWidgetEditComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
12312
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXPQrcodeWidgetEditComponent, isStandalone: true, selector: "axp-qrcode-widget-edit", host: { classAttribute: "ax-block ax-flex-1" }, usesInheritance: true, ngImport: i0, template: "<!-- Main Container -->\n<div class=\"ax-flex ax-flex-col ax-gap-3 ax-p-3 ax-w-fit\">\n <div class=\"ax-flex ax-justify-center\">\n <!-- QR Code Container -->\n <div class=\"ax-bg-lightest ax-border ax-border-default ax-rounded-md ax-shadow-md ax-p-3\" #qr>\n <!-- QR Code Display or Empty Placeholder -->\n @if (value()) {\n <!-- Display QR Code when value exists -->\n <ax-qrcode [content]=\"value()\" [size]=\"size()\" [color]=\"color()\" [level]=\"level()\" [outputType]=\"'svg'\">\n </ax-qrcode>\n } @else {\n <!-- Empty State: Show placeholder when value is null or empty -->\n <div\n class=\"ax-flex ax-flex-col ax-items-center ax-justify-center ax-text-center\"\n [style.width.px]=\"size()\"\n [style.height.px]=\"size()\"\n >\n <ax-icon icon=\"fa-light fa-qrcode\" class=\"ax-text-4xl ax-text-gray-400 ax-mb-3\"></ax-icon>\n <div class=\"ax-text-sm ax-text-gray-500\">\n {{ '@general:state-message.empty.title' | translate | async }}\n </div>\n </div>\n }\n\n <!-- Action Buttons Section -->\n @if (!readonly()) {\n <div class=\"ax-flex ax-items-center ax-justify-between ax-gap-2 ax-pt-4\">\n <!-- Edit Button: Opens popover to edit QR code content -->\n <ax-button\n #editBtn\n look=\"twotone\"\n [title]=\"('@general:actions.edit.title' | translate | async)!\"\n (onClick)=\"beginEdit()\"\n >\n <!-- Edit Popover: Text input for editing QR code content -->\n <ax-popover #po [target]=\"editBtn\" [openOn]=\"'toggle'\" [closeOn]=\"'clickOut'\" [adaptivityEnabled]=\"true\">\n <div\n class=\"ax-bg-lightest ax-border ax-border-default ax-rounded-md ax-shadow-md ax-p-5 ax-w-full sm:ax-w-96\"\n >\n <!-- Text Input for QR Code Content -->\n <ax-text-box\n [value]=\"draft()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n [placeholder]=\"placeholder() | translate | async\"\n (onValueChanged)=\"onDraftChange($event)\"\n >\n @if (hasClearButton()) {\n <ax-clear-button></ax-clear-button>\n }\n </ax-text-box>\n <!-- Popover Action Buttons -->\n <div class=\"ax-flex ax-justify-end ax-gap-2 ax-mt-3\">\n <ax-button\n look=\"outline\"\n class=\"ax-sm\"\n [text]=\"('@general:actions.cancel.title' | translate | async)!\"\n (onClick)=\"cancelEdit(); po.close()\"\n ></ax-button>\n <ax-button\n look=\"solid\"\n class=\"ax-sm\"\n color=\"primary\"\n [text]=\"('@general:actions.submit.title' | translate | async)!\"\n (onClick)=\"applyDraft(); po.close()\"\n ></ax-button>\n </div>\n </div>\n </ax-popover>\n <ax-icon icon=\"fa-light fa-pen\"></ax-icon>\n </ax-button>\n\n <!-- Upload Button: Upload text file to set QR code content -->\n <!-- <ax-button\n look=\"twotone\"\n [title]=\"('@general:actions.upload.title' | translate | async)!\"\n (onClick)=\"fileInput.click()\"\n >\n <input #fileInput type=\"file\" accept=\"text/plain\" class=\"ax-hidden\" (change)=\"onFileSelected($event)\" />\n <ax-icon icon=\"fa-light fa-upload\"></ax-icon>\n </ax-button> -->\n\n <!-- Export Button: Download QR code as image (only shown when value exists) -->\n @if (value()) {\n <ax-button\n look=\"twotone\"\n [title]=\"('@general:actions.export.title' | translate | async)!\"\n (onClick)=\"downloadQr(qr)\"\n >\n <ax-icon icon=\"fa-light fa-download\"></ax-icon>\n </ax-button>\n }\n\n <!-- Delete Button: Clear QR code value (only shown when not readonly and value exists) -->\n @if (!readonly() && value()) {\n <ax-button\n look=\"twotone\"\n [title]=\"('@general:actions.delete.title' | translate | async)!\"\n (onClick)=\"clearValue()\"\n >\n <ax-icon icon=\"ax-text-danger fa-light fa-trash-can\"></ax-icon>\n </ax-button>\n }\n </div>\n }\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "ngmodule", type: AXTextBoxModule }, { kind: "component", type: i1$6.AXTextBoxComponent, selector: "ax-text-box", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "id", "placeholder", "maxLength", "allowNull", "type", "autoComplete", "look", "maskPattern", "customTokens", "class"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress", "onMaskChanged"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2$1.AXDecoratorClearButtonComponent, selector: "ax-clear-button", inputs: ["icon"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i3$2.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "closeOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXQrcodeModule }, { kind: "component", type: i5$3.AXQrcodeComponent, selector: "ax-qrcode", inputs: ["content", "size", "level", "color", "backgroundColor", "outputType"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: FormsModule }, { kind: "pipe", type: i6.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
12324
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXPQrcodeWidgetEditComponent, isStandalone: true, selector: "axp-qrcode-widget-edit", host: { classAttribute: "ax-block ax-flex-1" }, usesInheritance: true, ngImport: i0, template: "<!-- Main Container -->\n<div class=\"ax-flex ax-flex-col ax-gap-3 ax-p-3 ax-w-fit\">\n <div class=\"ax-flex ax-justify-center\">\n <!-- QR Code Container -->\n <div class=\"ax-bg-lightest ax-border ax-border-default ax-rounded-md ax-shadow-md ax-p-3\" #qr>\n <!-- QR Code Display or Empty Placeholder -->\n @if (value()) {\n <!-- Display QR Code when value exists -->\n <ax-qrcode [content]=\"value()\" [size]=\"size()\" [color]=\"color()\" [level]=\"level()\" [outputType]=\"'svg'\">\n </ax-qrcode>\n } @else {\n <!-- Empty State: Show placeholder when value is null or empty -->\n <div\n class=\"ax-flex ax-flex-col ax-items-center ax-justify-center ax-text-center\"\n [style.width.px]=\"size()\"\n [style.height.px]=\"size()\"\n >\n <ax-icon icon=\"fa-light fa-qrcode\" class=\"ax-text-4xl ax-text-gray-400 ax-mb-3\"></ax-icon>\n <div class=\"ax-text-sm ax-text-gray-500\">\n {{ '@general:state-message.empty.title' | translate | async }}\n </div>\n </div>\n }\n\n <!-- Action Buttons Section -->\n @if (!readonly()) {\n <div class=\"ax-flex ax-items-center ax-justify-between ax-gap-2 ax-pt-4\">\n <!-- Edit Button: Opens popover to edit QR code content -->\n <ax-button\n #editBtn\n look=\"twotone\"\n [title]=\"('@general:actions.edit.title' | translate | async)!\"\n (onClick)=\"beginEdit()\"\n >\n <!-- Edit Popover: Text input for editing QR code content -->\n <ax-popover #po [target]=\"editBtn\" [openOn]=\"'toggle'\" [closeOn]=\"'clickOut'\" [adaptivityEnabled]=\"true\">\n <div\n class=\"ax-bg-lightest ax-border ax-border-default ax-rounded-md ax-shadow-md ax-p-5 ax-w-full sm:ax-w-96\"\n >\n <!-- Text Input for QR Code Content -->\n <ax-text-box\n [value]=\"draft()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n [placeholder]=\"placeholder() | translate | async\"\n (onValueChanged)=\"onDraftChange($event)\"\n >\n @if (hasClearButton()) {\n <ax-clear-button></ax-clear-button>\n }\n </ax-text-box>\n <!-- Popover Action Buttons -->\n <div class=\"ax-flex ax-justify-end ax-gap-2 ax-mt-3\">\n <ax-button\n look=\"outline\"\n class=\"ax-sm\"\n [text]=\"('@general:actions.cancel.title' | translate | async)!\"\n (onClick)=\"cancelEdit(); po.close()\"\n ></ax-button>\n <ax-button\n look=\"solid\"\n class=\"ax-sm\"\n color=\"primary\"\n [text]=\"('@general:actions.submit.title' | translate | async)!\"\n (onClick)=\"applyDraft(); po.close()\"\n ></ax-button>\n </div>\n </div>\n </ax-popover>\n <ax-icon icon=\"fa-light fa-pen\"></ax-icon>\n </ax-button>\n\n <!-- Upload Button: Upload text file to set QR code content -->\n <!-- <ax-button\n look=\"twotone\"\n [title]=\"('@general:actions.upload.title' | translate | async)!\"\n (onClick)=\"fileInput.click()\"\n >\n <input #fileInput type=\"file\" accept=\"text/plain\" class=\"ax-hidden\" (change)=\"onFileSelected($event)\" />\n <ax-icon icon=\"fa-light fa-upload\"></ax-icon>\n </ax-button> -->\n\n <!-- Export Button: Download QR code as image (only shown when value exists) -->\n @if (value()) {\n <ax-button\n look=\"twotone\"\n [title]=\"('@general:actions.preview.title' | translate | async)!\"\n (onClick)=\"openPreview()\"\n >\n <ax-icon icon=\"fa-light fa-expand\"></ax-icon>\n </ax-button>\n\n <ax-button\n look=\"twotone\"\n [title]=\"('@general:actions.export.title' | translate | async)!\"\n (onClick)=\"downloadQr(qr)\"\n >\n <ax-icon icon=\"fa-light fa-download\"></ax-icon>\n </ax-button>\n }\n\n <!-- Delete Button: Clear QR code value (only shown when not readonly and value exists) -->\n @if (!readonly() && value()) {\n <ax-button\n look=\"twotone\"\n [title]=\"('@general:actions.delete.title' | translate | async)!\"\n (onClick)=\"clearValue()\"\n >\n <ax-icon icon=\"ax-text-danger fa-light fa-trash-can\"></ax-icon>\n </ax-button>\n }\n </div>\n }\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "ngmodule", type: AXTextBoxModule }, { kind: "component", type: i1$6.AXTextBoxComponent, selector: "ax-text-box", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "id", "placeholder", "maxLength", "allowNull", "type", "autoComplete", "look", "maskPattern", "customTokens", "class"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress", "onMaskChanged"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2$1.AXDecoratorClearButtonComponent, selector: "ax-clear-button", inputs: ["icon"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i3$2.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "closeOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXQrcodeModule }, { kind: "component", type: i5$3.AXQrcodeComponent, selector: "ax-qrcode", inputs: ["content", "size", "level", "color", "backgroundColor", "outputType"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: FormsModule }, { kind: "pipe", type: i6.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
12313
12325
  }
12314
12326
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPQrcodeWidgetEditComponent, decorators: [{
12315
12327
  type: Component,
@@ -12322,7 +12334,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
12322
12334
  AXTranslationModule,
12323
12335
  AsyncPipe,
12324
12336
  FormsModule,
12325
- ], host: { class: 'ax-block ax-flex-1' }, template: "<!-- Main Container -->\n<div class=\"ax-flex ax-flex-col ax-gap-3 ax-p-3 ax-w-fit\">\n <div class=\"ax-flex ax-justify-center\">\n <!-- QR Code Container -->\n <div class=\"ax-bg-lightest ax-border ax-border-default ax-rounded-md ax-shadow-md ax-p-3\" #qr>\n <!-- QR Code Display or Empty Placeholder -->\n @if (value()) {\n <!-- Display QR Code when value exists -->\n <ax-qrcode [content]=\"value()\" [size]=\"size()\" [color]=\"color()\" [level]=\"level()\" [outputType]=\"'svg'\">\n </ax-qrcode>\n } @else {\n <!-- Empty State: Show placeholder when value is null or empty -->\n <div\n class=\"ax-flex ax-flex-col ax-items-center ax-justify-center ax-text-center\"\n [style.width.px]=\"size()\"\n [style.height.px]=\"size()\"\n >\n <ax-icon icon=\"fa-light fa-qrcode\" class=\"ax-text-4xl ax-text-gray-400 ax-mb-3\"></ax-icon>\n <div class=\"ax-text-sm ax-text-gray-500\">\n {{ '@general:state-message.empty.title' | translate | async }}\n </div>\n </div>\n }\n\n <!-- Action Buttons Section -->\n @if (!readonly()) {\n <div class=\"ax-flex ax-items-center ax-justify-between ax-gap-2 ax-pt-4\">\n <!-- Edit Button: Opens popover to edit QR code content -->\n <ax-button\n #editBtn\n look=\"twotone\"\n [title]=\"('@general:actions.edit.title' | translate | async)!\"\n (onClick)=\"beginEdit()\"\n >\n <!-- Edit Popover: Text input for editing QR code content -->\n <ax-popover #po [target]=\"editBtn\" [openOn]=\"'toggle'\" [closeOn]=\"'clickOut'\" [adaptivityEnabled]=\"true\">\n <div\n class=\"ax-bg-lightest ax-border ax-border-default ax-rounded-md ax-shadow-md ax-p-5 ax-w-full sm:ax-w-96\"\n >\n <!-- Text Input for QR Code Content -->\n <ax-text-box\n [value]=\"draft()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n [placeholder]=\"placeholder() | translate | async\"\n (onValueChanged)=\"onDraftChange($event)\"\n >\n @if (hasClearButton()) {\n <ax-clear-button></ax-clear-button>\n }\n </ax-text-box>\n <!-- Popover Action Buttons -->\n <div class=\"ax-flex ax-justify-end ax-gap-2 ax-mt-3\">\n <ax-button\n look=\"outline\"\n class=\"ax-sm\"\n [text]=\"('@general:actions.cancel.title' | translate | async)!\"\n (onClick)=\"cancelEdit(); po.close()\"\n ></ax-button>\n <ax-button\n look=\"solid\"\n class=\"ax-sm\"\n color=\"primary\"\n [text]=\"('@general:actions.submit.title' | translate | async)!\"\n (onClick)=\"applyDraft(); po.close()\"\n ></ax-button>\n </div>\n </div>\n </ax-popover>\n <ax-icon icon=\"fa-light fa-pen\"></ax-icon>\n </ax-button>\n\n <!-- Upload Button: Upload text file to set QR code content -->\n <!-- <ax-button\n look=\"twotone\"\n [title]=\"('@general:actions.upload.title' | translate | async)!\"\n (onClick)=\"fileInput.click()\"\n >\n <input #fileInput type=\"file\" accept=\"text/plain\" class=\"ax-hidden\" (change)=\"onFileSelected($event)\" />\n <ax-icon icon=\"fa-light fa-upload\"></ax-icon>\n </ax-button> -->\n\n <!-- Export Button: Download QR code as image (only shown when value exists) -->\n @if (value()) {\n <ax-button\n look=\"twotone\"\n [title]=\"('@general:actions.export.title' | translate | async)!\"\n (onClick)=\"downloadQr(qr)\"\n >\n <ax-icon icon=\"fa-light fa-download\"></ax-icon>\n </ax-button>\n }\n\n <!-- Delete Button: Clear QR code value (only shown when not readonly and value exists) -->\n @if (!readonly() && value()) {\n <ax-button\n look=\"twotone\"\n [title]=\"('@general:actions.delete.title' | translate | async)!\"\n (onClick)=\"clearValue()\"\n >\n <ax-icon icon=\"ax-text-danger fa-light fa-trash-can\"></ax-icon>\n </ax-button>\n }\n </div>\n }\n </div>\n </div>\n</div>\n" }]
12337
+ ], host: { class: 'ax-block ax-flex-1' }, template: "<!-- Main Container -->\n<div class=\"ax-flex ax-flex-col ax-gap-3 ax-p-3 ax-w-fit\">\n <div class=\"ax-flex ax-justify-center\">\n <!-- QR Code Container -->\n <div class=\"ax-bg-lightest ax-border ax-border-default ax-rounded-md ax-shadow-md ax-p-3\" #qr>\n <!-- QR Code Display or Empty Placeholder -->\n @if (value()) {\n <!-- Display QR Code when value exists -->\n <ax-qrcode [content]=\"value()\" [size]=\"size()\" [color]=\"color()\" [level]=\"level()\" [outputType]=\"'svg'\">\n </ax-qrcode>\n } @else {\n <!-- Empty State: Show placeholder when value is null or empty -->\n <div\n class=\"ax-flex ax-flex-col ax-items-center ax-justify-center ax-text-center\"\n [style.width.px]=\"size()\"\n [style.height.px]=\"size()\"\n >\n <ax-icon icon=\"fa-light fa-qrcode\" class=\"ax-text-4xl ax-text-gray-400 ax-mb-3\"></ax-icon>\n <div class=\"ax-text-sm ax-text-gray-500\">\n {{ '@general:state-message.empty.title' | translate | async }}\n </div>\n </div>\n }\n\n <!-- Action Buttons Section -->\n @if (!readonly()) {\n <div class=\"ax-flex ax-items-center ax-justify-between ax-gap-2 ax-pt-4\">\n <!-- Edit Button: Opens popover to edit QR code content -->\n <ax-button\n #editBtn\n look=\"twotone\"\n [title]=\"('@general:actions.edit.title' | translate | async)!\"\n (onClick)=\"beginEdit()\"\n >\n <!-- Edit Popover: Text input for editing QR code content -->\n <ax-popover #po [target]=\"editBtn\" [openOn]=\"'toggle'\" [closeOn]=\"'clickOut'\" [adaptivityEnabled]=\"true\">\n <div\n class=\"ax-bg-lightest ax-border ax-border-default ax-rounded-md ax-shadow-md ax-p-5 ax-w-full sm:ax-w-96\"\n >\n <!-- Text Input for QR Code Content -->\n <ax-text-box\n [value]=\"draft()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n [placeholder]=\"placeholder() | translate | async\"\n (onValueChanged)=\"onDraftChange($event)\"\n >\n @if (hasClearButton()) {\n <ax-clear-button></ax-clear-button>\n }\n </ax-text-box>\n <!-- Popover Action Buttons -->\n <div class=\"ax-flex ax-justify-end ax-gap-2 ax-mt-3\">\n <ax-button\n look=\"outline\"\n class=\"ax-sm\"\n [text]=\"('@general:actions.cancel.title' | translate | async)!\"\n (onClick)=\"cancelEdit(); po.close()\"\n ></ax-button>\n <ax-button\n look=\"solid\"\n class=\"ax-sm\"\n color=\"primary\"\n [text]=\"('@general:actions.submit.title' | translate | async)!\"\n (onClick)=\"applyDraft(); po.close()\"\n ></ax-button>\n </div>\n </div>\n </ax-popover>\n <ax-icon icon=\"fa-light fa-pen\"></ax-icon>\n </ax-button>\n\n <!-- Upload Button: Upload text file to set QR code content -->\n <!-- <ax-button\n look=\"twotone\"\n [title]=\"('@general:actions.upload.title' | translate | async)!\"\n (onClick)=\"fileInput.click()\"\n >\n <input #fileInput type=\"file\" accept=\"text/plain\" class=\"ax-hidden\" (change)=\"onFileSelected($event)\" />\n <ax-icon icon=\"fa-light fa-upload\"></ax-icon>\n </ax-button> -->\n\n <!-- Export Button: Download QR code as image (only shown when value exists) -->\n @if (value()) {\n <ax-button\n look=\"twotone\"\n [title]=\"('@general:actions.preview.title' | translate | async)!\"\n (onClick)=\"openPreview()\"\n >\n <ax-icon icon=\"fa-light fa-expand\"></ax-icon>\n </ax-button>\n\n <ax-button\n look=\"twotone\"\n [title]=\"('@general:actions.export.title' | translate | async)!\"\n (onClick)=\"downloadQr(qr)\"\n >\n <ax-icon icon=\"fa-light fa-download\"></ax-icon>\n </ax-button>\n }\n\n <!-- Delete Button: Clear QR code value (only shown when not readonly and value exists) -->\n @if (!readonly() && value()) {\n <ax-button\n look=\"twotone\"\n [title]=\"('@general:actions.delete.title' | translate | async)!\"\n (onClick)=\"clearValue()\"\n >\n <ax-icon icon=\"ax-text-danger fa-light fa-trash-can\"></ax-icon>\n </ax-button>\n }\n </div>\n }\n </div>\n </div>\n</div>\n" }]
12326
12338
  }] });
12327
12339
 
12328
12340
  var qrcodeWidgetEdit_component = /*#__PURE__*/Object.freeze({
@@ -12333,23 +12345,36 @@ var qrcodeWidgetEdit_component = /*#__PURE__*/Object.freeze({
12333
12345
  class AXPQrcodeWidgetViewComponent extends AXPValueWidgetComponent {
12334
12346
  constructor() {
12335
12347
  super(...arguments);
12348
+ //#region ---- Services & Dependencies ----
12349
+ this.qrcodeViewer = inject(AXPQrcodeViewerService);
12350
+ this.formatService = inject(AXFormatService);
12351
+ this.translation = inject(AXTranslationService);
12352
+ //#endregion
12336
12353
  //#region ---- View Children ----
12337
12354
  this.qrContainer = viewChild('qrContainer', ...(ngDevMode ? [{ debugName: "qrContainer" }] : /* istanbul ignore next */ []));
12338
12355
  //#endregion
12339
12356
  //#region ---- Computed Properties ----
12340
- this.size = computed(() => this.options()['size'] ?? 200, ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
12357
+ this.size = computed(() => normalizePositiveNumberOption(this.options()['size'], DEFAULT_QRCODE_SIZE), ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
12341
12358
  this.level = computed(() => this.options()['level']?.id ?? 'M', ...(ngDevMode ? [{ debugName: "level" }] : /* istanbul ignore next */ []));
12342
12359
  this.color = computed(() => AXColorUtil.colorStringToHex(this.options()['color'] ?? '#000000'), ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
12343
12360
  this.outputType = computed(() => this.options()['outputType'] ?? 'svg', ...(ngDevMode ? [{ debugName: "outputType" }] : /* istanbul ignore next */ []));
12361
+ this.showContent = computed(() => !!this.options()['showContent'], ...(ngDevMode ? [{ debugName: "showContent" }] : /* istanbul ignore next */ []));
12362
+ this.contentLabel = computed(() => this.options()['contentLabel'] ?? '@platform-layout-widgets:widgets.qrcode.content', ...(ngDevMode ? [{ debugName: "contentLabel" }] : /* istanbul ignore next */ []));
12344
12363
  }
12345
12364
  //#endregion
12346
- //#region ---- Host Bindings ----
12347
- get __class() {
12348
- const cls = {};
12349
- cls['ax-inline-block'] = true;
12350
- return Object.keys(cls)
12351
- .filter((key) => cls[key])
12352
- .join(' ');
12365
+ //#region ---- UI Handlers ----
12366
+ async openPreview() {
12367
+ const content = this.getValue();
12368
+ if (!content) {
12369
+ return;
12370
+ }
12371
+ await openQrcodeViewer(this.qrcodeViewer, {
12372
+ content,
12373
+ data: this.contextService.data(),
12374
+ widgetOptions: this.options(),
12375
+ formatService: this.formatService,
12376
+ activeLang: this.translation.getActiveLang(),
12377
+ });
12353
12378
  }
12354
12379
  //#endregion
12355
12380
  //#region ---- Widget API ----
@@ -12358,26 +12383,47 @@ class AXPQrcodeWidgetViewComponent extends AXPValueWidgetComponent {
12358
12383
  print: () => {
12359
12384
  const container = this.qrContainer()?.nativeElement;
12360
12385
  if (container) {
12361
- printQrcodeFromElement(container, this.size());
12386
+ printGraphicFromElement(container, {
12387
+ fallbackSize: this.size(),
12388
+ title: 'QR Code',
12389
+ imageAlt: 'QR Code',
12390
+ });
12362
12391
  }
12363
12392
  },
12364
12393
  };
12365
12394
  }
12366
12395
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPQrcodeWidgetViewComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
12367
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXPQrcodeWidgetViewComponent, isStandalone: true, selector: "axp-qrcode-widget", host: { properties: { "class": "this.__class" } }, viewQueries: [{ propertyName: "qrContainer", first: true, predicate: ["qrContainer"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: `
12396
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXPQrcodeWidgetViewComponent, isStandalone: true, selector: "axp-qrcode-widget", host: { classAttribute: "ax-block ax-w-full" }, viewQueries: [{ propertyName: "qrContainer", first: true, predicate: ["qrContainer"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: `
12368
12397
  @if (getValue()) {
12369
- <div #qrContainer class="ax-inline-block">
12370
- <ax-qrcode
12371
- [content]="getValue()"
12372
- [size]="size()"
12373
- [color]="color()"
12374
- [level]="level()"
12375
- [outputType]="outputType()"
12376
- >
12377
- </ax-qrcode>
12398
+ <div class="ax-flex ax-w-full ax-flex-col ax-items-center ax-gap-4 ax-text-center">
12399
+ <div #qrContainer class="ax-inline-block">
12400
+ <ax-qrcode
12401
+ [content]="getValue()"
12402
+ [size]="size()"
12403
+ [color]="color()"
12404
+ [level]="level()"
12405
+ [outputType]="outputType()"
12406
+ >
12407
+ </ax-qrcode>
12408
+ </div>
12409
+ @if (showContent()) {
12410
+ <div class="ax-flex ax-max-w-full ax-flex-col ax-items-center ax-gap-1">
12411
+ <span class="ax-text-sm ax-font-medium">{{ contentLabel() | translate | async }}</span>
12412
+ <span class="ax-break-all ax-text-sm">{{ getValue() }}</span>
12413
+ </div>
12414
+ } @else {
12415
+ <ax-button
12416
+ look="twotone"
12417
+ class="ax-sm"
12418
+ [title]="('@general:actions.preview.title' | translate | async)!"
12419
+ (onClick)="openPreview()"
12420
+ >
12421
+ <ax-icon icon="fa-light fa-expand"></ax-icon>
12422
+ </ax-button>
12423
+ }
12378
12424
  </div>
12379
12425
  }
12380
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXQrcodeModule }, { kind: "component", type: i5$3.AXQrcodeComponent, selector: "ax-qrcode", inputs: ["content", "size", "level", "color", "backgroundColor", "outputType"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
12426
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type: AXQrcodeModule }, { kind: "component", type: i5$3.AXQrcodeComponent, selector: "ax-qrcode", inputs: ["content", "size", "level", "color", "backgroundColor", "outputType"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i6.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
12381
12427
  }
12382
12428
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPQrcodeWidgetViewComponent, decorators: [{
12383
12429
  type: Component,
@@ -12385,84 +12431,46 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
12385
12431
  selector: 'axp-qrcode-widget',
12386
12432
  template: `
12387
12433
  @if (getValue()) {
12388
- <div #qrContainer class="ax-inline-block">
12389
- <ax-qrcode
12390
- [content]="getValue()"
12391
- [size]="size()"
12392
- [color]="color()"
12393
- [level]="level()"
12394
- [outputType]="outputType()"
12395
- >
12396
- </ax-qrcode>
12434
+ <div class="ax-flex ax-w-full ax-flex-col ax-items-center ax-gap-4 ax-text-center">
12435
+ <div #qrContainer class="ax-inline-block">
12436
+ <ax-qrcode
12437
+ [content]="getValue()"
12438
+ [size]="size()"
12439
+ [color]="color()"
12440
+ [level]="level()"
12441
+ [outputType]="outputType()"
12442
+ >
12443
+ </ax-qrcode>
12444
+ </div>
12445
+ @if (showContent()) {
12446
+ <div class="ax-flex ax-max-w-full ax-flex-col ax-items-center ax-gap-1">
12447
+ <span class="ax-text-sm ax-font-medium">{{ contentLabel() | translate | async }}</span>
12448
+ <span class="ax-break-all ax-text-sm">{{ getValue() }}</span>
12449
+ </div>
12450
+ } @else {
12451
+ <ax-button
12452
+ look="twotone"
12453
+ class="ax-sm"
12454
+ [title]="('@general:actions.preview.title' | translate | async)!"
12455
+ (onClick)="openPreview()"
12456
+ >
12457
+ <ax-icon icon="fa-light fa-expand"></ax-icon>
12458
+ </ax-button>
12459
+ }
12397
12460
  </div>
12398
12461
  }
12399
12462
  `,
12400
12463
  changeDetection: ChangeDetectionStrategy.OnPush,
12401
- imports: [AXQrcodeModule],
12464
+ imports: [AXButtonModule, AXDecoratorModule, AXQrcodeModule, AXTranslationModule, AsyncPipe],
12465
+ host: { class: 'ax-block ax-w-full' },
12402
12466
  }]
12403
- }], propDecorators: { qrContainer: [{ type: i0.ViewChild, args: ['qrContainer', { isSignal: true }] }], __class: [{
12404
- type: HostBinding,
12405
- args: ['class']
12406
- }] } });
12467
+ }], propDecorators: { qrContainer: [{ type: i0.ViewChild, args: ['qrContainer', { isSignal: true }] }] } });
12407
12468
 
12408
12469
  var qrcodeWidgetView_component = /*#__PURE__*/Object.freeze({
12409
12470
  __proto__: null,
12410
12471
  AXPQrcodeWidgetViewComponent: AXPQrcodeWidgetViewComponent
12411
12472
  });
12412
12473
 
12413
- const AXPQrcodeWidget = {
12414
- name: 'qrcode',
12415
- title: '@platform-layout-widgets:widgets.qrcode.title',
12416
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
12417
- subCategory: AXP_WIDGETS_ADVANCE_SUB_MEDIA,
12418
- icon: 'fa-light fa-qrcode',
12419
- description: '@platform-layout-widgets:widgets.qrcode.description',
12420
- type: 'view',
12421
- properties: [
12422
- AXP_NAME_PROPERTY,
12423
- AXP_DATA_PATH_PROPERTY,
12424
- cloneProperty(AXP_COLOR_PROPERTY, { schema: { interface: { defaultValue: '#000000' } } }),
12425
- cloneProperty(AXP_CONTENT_PROPERTY, { schema: { interface: { defaultValue: 'http://google.com' } } }),
12426
- createNumberProperty({
12427
- name: 'size',
12428
- title: 'Size',
12429
- path: 'options.size',
12430
- group: AXP_STYLING_PROPERTY_GROUP,
12431
- defaultValue: 200,
12432
- }),
12433
- createSelectProperty({
12434
- name: 'level',
12435
- title: 'Error Correction Level',
12436
- path: 'options.level',
12437
- group: AXP_STYLING_PROPERTY_GROUP,
12438
- dataSource: ['L', 'M', 'Q', 'H'],
12439
- defaultValue: 'M',
12440
- }),
12441
- createSelectProperty({
12442
- name: 'outputType',
12443
- title: 'Output Type',
12444
- path: 'options.outputType',
12445
- group: AXP_STYLING_PROPERTY_GROUP,
12446
- dataSource: ['svg', 'canvas'],
12447
- defaultValue: 'svg',
12448
- }),
12449
- ],
12450
- components: {
12451
- view: {
12452
- component: () => Promise.resolve().then(function () { return qrcodeWidgetView_component; }).then((c) => c.AXPQrcodeWidgetViewComponent),
12453
- },
12454
- edit: {
12455
- component: () => Promise.resolve().then(function () { return qrcodeWidgetEdit_component; }).then((c) => c.AXPQrcodeWidgetEditComponent),
12456
- },
12457
- column: {
12458
- component: () => Promise.resolve().then(function () { return qrcodeWidgetColumn_component; }).then((c) => c.AXPQrcodeWidgetColumnComponent),
12459
- },
12460
- designer: {
12461
- component: () => Promise.resolve().then(function () { return qrcodeWidgetView_component; }).then((c) => c.AXPQrcodeWidgetViewComponent),
12462
- },
12463
- },
12464
- };
12465
-
12466
12474
  //#region ---- Imports ----
12467
12475
  //#endregion
12468
12476
  //#region ---- Component ----
@@ -28125,5 +28133,5 @@ var getWidgetsForAi_query = /*#__PURE__*/Object.freeze({
28125
28133
  * Generated bundle index. Do not edit.
28126
28134
  */
28127
28135
 
28128
- export { AXPAddressWidget, AXPAddressWidgetColumnComponent, AXPAddressWidgetEditComponent, AXPAddressWidgetService, AXPAddressWidgetViewComponent, AXPAdvancedGridItemWidget, AXPAdvancedGridItemWidgetDesignerComponent, AXPAdvancedGridItemWidgetViewComponent, AXPAdvancedGridOptionsWidget, AXPAdvancedGridOptionsWidgetEditComponent, AXPAdvancedGridWidget, AXPAdvancedGridWidgetDesignerComponent, AXPAdvancedGridWidgetViewComponent, AXPAvatarWidget, AXPAvatarWidgetColumnComponent, AXPAvatarWidgetDesignerComponent, AXPAvatarWidgetEditComponent, AXPAvatarWidgetViewComponent, AXPBetweenExpressionValidationWidget, AXPBetweenValidationWidgetEditComponent, AXPBlockWidget, AXPBlockWidgetDesignerComponent, AXPBlockWidgetViewComponent, AXPBorderWidget, AXPBorderWidgetEditComponent, AXPButtonWidget, AXPButtonWidgetColumnComponent, AXPButtonWidgetViewComponent, AXPCallbackValidationWidget, AXPCallbackValidationWidgetEditComponent, AXPCheckBoxWidget, AXPCheckBoxWidgetColumnComponent, AXPCheckBoxWidgetDesignerComponent, AXPCheckBoxWidgetEditComponent, AXPCheckBoxWidgetViewComponent, AXPCodeEditorWidget, AXPCodeEditorWidgetColumnComponent, AXPCodeEditorWidgetEditComponent, AXPCodeEditorWidgetViewComponent, AXPColorBoxWidget, AXPColorBoxWidgetColumnComponent, AXPColorBoxWidgetDesignerComponent, AXPColorBoxWidgetEditComponent, AXPColorBoxWidgetViewComponent, AXPColorPaletteWidget, AXPColorPaletteWidgetColumnComponent, AXPColorPaletteWidgetDesignerComponent, AXPColorPaletteWidgetEditComponent, AXPColorPaletteWidgetViewComponent, AXPConditionBuilderWidget, AXPConditionBuilderWidgetEditComponent, AXPConditionBuilderWidgetViewComponent, AXPConnectedDragDropListsWidget, AXPConnectedListsWidgetColumnComponent, AXPConnectedListsWidgetEditComponent, AXPConnectedListsWidgetViewComponent, AXPContactWidget, AXPContactWidgetColumnComponent, AXPContactWidgetEditComponent, AXPContactWidgetViewComponent, AXPDataListWidget, AXPDataListWidgetViewComponent, AXPDataSourceOptionsWidget, AXPDataSourceOptionsWidgetEditComponent, AXPDateTimeBoxWidget, AXPDateTimeBoxWidgetColumnComponent, AXPDateTimeBoxWidgetEditComponent, AXPDateTimeBoxWidgetViewComponent, AXPDirectionWidget, AXPDirectionWidgetEditComponent, AXPDragDropListWidget, AXPEditorJsWidget, AXPEditorJsWidgetColumnComponent, AXPEditorJsWidgetEditComponent, AXPEditorJsWidgetViewComponent, AXPEqualValidationWidget, AXPEqualValidationWidgetEditComponent, AXPFieldsetWidget, AXPFieldsetWidgetDesignerComponent, AXPFieldsetWidgetViewComponent, AXPFlexItemOptionsWidget, AXPFlexItemOptionsWidgetEditComponent, AXPFlexItemWidget, AXPFlexItemWidgetDesignerComponent, AXPFlexItemWidgetViewComponent, AXPFlexOptionsWidget, AXPFlexOptionsWidgetEditComponent, AXPFlexWidget, AXPFlexWidgetDesignerComponent, AXPFlexWidgetViewComponent, AXPGalleryWidget, AXPGalleryWidgetEditComponent, AXPGalleryWidgetViewComponent, AXPGetWidgetsForAIQuery, AXPGreaterThanExpressionValidationWidget, AXPGreaterThanValidationWidgetEditComponent, AXPGridItemOptionsWidget, AXPGridItemOptionsWidgetEditComponent, AXPGridOptionsWidget, AXPGridOptionsWidgetEditComponent, AXPImageMarkerPopupComponent, AXPImageMarkerWidget, AXPImageMarkerWidgetColumnComponent, AXPImageMarkerWidgetEditComponent, AXPImageMarkerWidgetViewComponent, AXPItemConfiguratorWidget, AXPItemConfiguratorWidgetColumnComponent, AXPItemConfiguratorWidgetEditComponent, AXPJsonViewerWidget, AXPJsonViewerWidgetEditComponent, AXPJsonViewerWidgetViewComponent, AXPLargeTextWidget, AXPLargeTextWidgetColumnComponent, AXPLargeTextWidgetEditComponent, AXPLargeTextWidgetViewComponent, AXPLessThanExpressionValidationWidget, AXPLessThanValidationWidgetEditComponent, AXPListWidgetColumnComponent, AXPListWidgetEditComponent, AXPListWidgetViewComponent, AXPMapWidgetEditComponent, AXPMapWidgetViewComponent, AXPMaxLengthExpressionValidationWidget, AXPMaxLengthValidationWidgetEditComponent, AXPMinLengthExpressionValidationWidget, AXPMinLengthValidationWidgetEditComponent, AXPNumberBoxWidget, AXPNumberBoxWidgetColumnComponent, AXPNumberBoxWidgetEditComponent, AXPNumberBoxWidgetViewComponent, AXPOutcomeResultsViewerWidget, AXPOutcomeResultsViewerWidgetViewComponent, AXPPageWidget, AXPPageWidgetViewComponent, AXPPasswordBoxWidget, AXPPasswordBoxWidgetColumnComponent, AXPPasswordBoxWidgetEditComponent, AXPPasswordBoxWidgetViewComponent, AXPProgressBarWidget, AXPProgressBarWidgetColumnComponent, AXPProgressBarWidgetEditComponent, AXPProgressBarWidgetViewComponent, AXPProviderSelectWidgetColumnComponent, AXPProviderSelectWidgetEditBase, AXPProviderSelectWidgetViewComponent, AXPQrcodeViewerService, AXPQrcodeWidget, AXPQrcodeWidgetColumnComponent, AXPQrcodeWidgetEditComponent, AXPQrcodeWidgetViewComponent, AXPRatePickerWidget, AXPRatePickerWidgetColumnComponent, AXPRatePickerWidgetEditComponent, AXPRatePickerWidgetViewComponent, AXPRegularExpressionValidationWidget, AXPRegularExpressionValidationWidgetEditComponent, AXPRepeaterWidget, AXPRepeaterWidgetDesignerComponent, AXPRepeaterWidgetEditComponent, AXPRepeaterWidgetViewComponent, AXPRequiredValidationWidget, AXPRequiredValidationWidgetEditComponent, AXPRichTextWidget, AXPRichTextWidgetColumnComponent, AXPRichTextWidgetEditComponent, AXPRichTextWidgetViewComponent, AXPSchedulerPickerWidget, AXPSchedulerPickerWidgetColumnComponent, AXPSchedulerPickerWidgetEditComponent, AXPSchedulerPickerWidgetViewComponent, AXPSelectBoxWidget, AXPSelectBoxWidgetColumnComponent, AXPSelectBoxWidgetEditComponent, AXPSelectBoxWidgetViewComponent, AXPSelectLanguagePopup, AXPSelectionListWidget, AXPSelectionListWidgetColumnComponent, AXPSelectionListWidgetDesignerComponent, AXPSelectionListWidgetEditComponent, AXPSelectionListWidgetViewComponent, AXPSignatureWidget, AXPSignatureWidgetColumnComponent, AXPSignatureWidgetEditComponent, AXPSignatureWidgetViewComponent, AXPSpacingWidget, AXPSpacingWidgetEditComponent, AXPStatusChipComponent, AXPStatusWidget, AXPStatusWidgetColumnComponent, AXPStatusWidgetEditComponent, AXPStatusWidgetViewComponent, AXPStepWizardWidget, AXPStepWizardWidgetViewComponent, AXPStopwatchWidget, AXPStopwatchWidgetViewComponent, AXPTableItemWidget, AXPTableItemWidgetDesignerComponent, AXPTableItemWidgetViewComponent, AXPTableWidget, AXPTableWidgetDesignerComponent, AXPTableWidgetViewComponent, AXPTagEditorWidget, AXPTagEditorWidgetColumnComponent, AXPTagEditorWidgetEditComponent, AXPTagEditorWidgetViewComponent, AXPTemplateBoxWidget, AXPTemplateBoxWidgetColumnComponent, AXPTemplateBoxWidgetEditComponent, AXPTemplateBoxWidgetPrintComponent, AXPTemplateBoxWidgetViewComponent, AXPTextBoxWidget, AXPTextBoxWidgetColumnComponent, AXPTextBoxWidgetEditComponent, AXPTextBoxWidgetViewComponent, AXPToggleWidget, AXPToggleWidgetColumnComponent, AXPToggleWidgetEditComponent, AXPToggleWidgetViewComponent, AXPWidgetFieldConfiguratorWidget, AXPWidgetFieldConfiguratorWidgetColumnComponent, AXPWidgetFieldConfiguratorWidgetEditComponent, AXPWidgetsModule, AXP_ABSOLUTE_UNITS, AXP_BORDER_RADIUS_UNITS, AXP_BORDER_WIDTH_UNITS, AXP_DATA_LIST_CMD_DELETE, AXP_DATA_LIST_CMD_EDIT, AXP_DATA_LIST_PENDING_DELETE_KEY, AXP_Flex_Box_Align_Options, AXP_Flex_Box_Alignments, AXP_Flex_Box_Justify_Options, AXP_Grid_Box_Align_Items_Options, AXP_Grid_Box_Alignments, AXP_Grid_Box_Justify_Items_Options, AXP_RELATIVE_UNITS, AXP_RELATIVE_UNITS_NO_PERCENT, AXP_ROW_EXPR_PREFIX, AXP_SPACING_UNITS, AXP_WIDGET_AI_AGENT_ASSIST_FOLLOW_UP_CHIPS_LAYOUT, AXP_WIDGET_AI_AGENT_CHART_LAYOUT, AXP_WIDGET_AI_AGENT_FORM_LAYOUT, AXP_WIDGET_AI_AGENT_NAMES, AXP_default_Border_Box_Units, AXP_default_Border_Box_Value, AXP_default_Spacing_Box_Units, AXP_default_Spacing_Box_Value, DEFAULT_STRATEGY_CONFIG, STRATEGY_CONFIG_TOKEN, matchesWidgetAiAgent, printQrcodeFromElement };
28136
+ export { AXPAddressWidget, AXPAddressWidgetColumnComponent, AXPAddressWidgetEditComponent, AXPAddressWidgetService, AXPAddressWidgetViewComponent, AXPAdvancedGridItemWidget, AXPAdvancedGridItemWidgetDesignerComponent, AXPAdvancedGridItemWidgetViewComponent, AXPAdvancedGridOptionsWidget, AXPAdvancedGridOptionsWidgetEditComponent, AXPAdvancedGridWidget, AXPAdvancedGridWidgetDesignerComponent, AXPAdvancedGridWidgetViewComponent, AXPAvatarWidget, AXPAvatarWidgetColumnComponent, AXPAvatarWidgetDesignerComponent, AXPAvatarWidgetEditComponent, AXPAvatarWidgetViewComponent, AXPBetweenExpressionValidationWidget, AXPBetweenValidationWidgetEditComponent, AXPBlockWidget, AXPBlockWidgetDesignerComponent, AXPBlockWidgetViewComponent, AXPBorderWidget, AXPBorderWidgetEditComponent, AXPButtonWidget, AXPButtonWidgetColumnComponent, AXPButtonWidgetViewComponent, AXPCallbackValidationWidget, AXPCallbackValidationWidgetEditComponent, AXPCheckBoxWidget, AXPCheckBoxWidgetColumnComponent, AXPCheckBoxWidgetDesignerComponent, AXPCheckBoxWidgetEditComponent, AXPCheckBoxWidgetViewComponent, AXPCodeEditorWidget, AXPCodeEditorWidgetColumnComponent, AXPCodeEditorWidgetEditComponent, AXPCodeEditorWidgetViewComponent, AXPColorBoxWidget, AXPColorBoxWidgetColumnComponent, AXPColorBoxWidgetDesignerComponent, AXPColorBoxWidgetEditComponent, AXPColorBoxWidgetViewComponent, AXPColorPaletteWidget, AXPColorPaletteWidgetColumnComponent, AXPColorPaletteWidgetDesignerComponent, AXPColorPaletteWidgetEditComponent, AXPColorPaletteWidgetViewComponent, AXPConditionBuilderWidget, AXPConditionBuilderWidgetEditComponent, AXPConditionBuilderWidgetViewComponent, AXPConnectedDragDropListsWidget, AXPConnectedListsWidgetColumnComponent, AXPConnectedListsWidgetEditComponent, AXPConnectedListsWidgetViewComponent, AXPContactWidget, AXPContactWidgetColumnComponent, AXPContactWidgetEditComponent, AXPContactWidgetViewComponent, AXPDataListWidget, AXPDataListWidgetViewComponent, AXPDataSourceOptionsWidget, AXPDataSourceOptionsWidgetEditComponent, AXPDateTimeBoxWidget, AXPDateTimeBoxWidgetColumnComponent, AXPDateTimeBoxWidgetEditComponent, AXPDateTimeBoxWidgetViewComponent, AXPDirectionWidget, AXPDirectionWidgetEditComponent, AXPDragDropListWidget, AXPEditorJsWidget, AXPEditorJsWidgetColumnComponent, AXPEditorJsWidgetEditComponent, AXPEditorJsWidgetViewComponent, AXPEqualValidationWidget, AXPEqualValidationWidgetEditComponent, AXPFieldsetWidget, AXPFieldsetWidgetDesignerComponent, AXPFieldsetWidgetViewComponent, AXPFlexItemOptionsWidget, AXPFlexItemOptionsWidgetEditComponent, AXPFlexItemWidget, AXPFlexItemWidgetDesignerComponent, AXPFlexItemWidgetViewComponent, AXPFlexOptionsWidget, AXPFlexOptionsWidgetEditComponent, AXPFlexWidget, AXPFlexWidgetDesignerComponent, AXPFlexWidgetViewComponent, AXPGalleryWidget, AXPGalleryWidgetEditComponent, AXPGalleryWidgetViewComponent, AXPGetWidgetsForAIQuery, AXPGreaterThanExpressionValidationWidget, AXPGreaterThanValidationWidgetEditComponent, AXPGridItemOptionsWidget, AXPGridItemOptionsWidgetEditComponent, AXPGridOptionsWidget, AXPGridOptionsWidgetEditComponent, AXPImageMarkerPopupComponent, AXPImageMarkerWidget, AXPImageMarkerWidgetColumnComponent, AXPImageMarkerWidgetEditComponent, AXPImageMarkerWidgetViewComponent, AXPItemConfiguratorWidget, AXPItemConfiguratorWidgetColumnComponent, AXPItemConfiguratorWidgetEditComponent, AXPJsonViewerWidget, AXPJsonViewerWidgetEditComponent, AXPJsonViewerWidgetViewComponent, AXPLargeTextWidget, AXPLargeTextWidgetColumnComponent, AXPLargeTextWidgetEditComponent, AXPLargeTextWidgetViewComponent, AXPLessThanExpressionValidationWidget, AXPLessThanValidationWidgetEditComponent, AXPListWidgetColumnComponent, AXPListWidgetEditComponent, AXPListWidgetViewComponent, AXPMapWidgetEditComponent, AXPMapWidgetViewComponent, AXPMaxLengthExpressionValidationWidget, AXPMaxLengthValidationWidgetEditComponent, AXPMinLengthExpressionValidationWidget, AXPMinLengthValidationWidgetEditComponent, AXPNumberBoxWidget, AXPNumberBoxWidgetColumnComponent, AXPNumberBoxWidgetEditComponent, AXPNumberBoxWidgetViewComponent, AXPOutcomeResultsViewerWidget, AXPOutcomeResultsViewerWidgetViewComponent, AXPPageWidget, AXPPageWidgetViewComponent, AXPPasswordBoxWidget, AXPPasswordBoxWidgetColumnComponent, AXPPasswordBoxWidgetEditComponent, AXPPasswordBoxWidgetViewComponent, AXPProgressBarWidget, AXPProgressBarWidgetColumnComponent, AXPProgressBarWidgetEditComponent, AXPProgressBarWidgetViewComponent, AXPProviderSelectWidgetColumnComponent, AXPProviderSelectWidgetEditBase, AXPProviderSelectWidgetViewComponent, AXPQrcodeViewerService, AXPQrcodeWidget, AXPQrcodeWidgetColumnComponent, AXPQrcodeWidgetEditComponent, AXPQrcodeWidgetViewComponent, AXPRatePickerWidget, AXPRatePickerWidgetColumnComponent, AXPRatePickerWidgetEditComponent, AXPRatePickerWidgetViewComponent, AXPRegularExpressionValidationWidget, AXPRegularExpressionValidationWidgetEditComponent, AXPRepeaterWidget, AXPRepeaterWidgetDesignerComponent, AXPRepeaterWidgetEditComponent, AXPRepeaterWidgetViewComponent, AXPRequiredValidationWidget, AXPRequiredValidationWidgetEditComponent, AXPRichTextWidget, AXPRichTextWidgetColumnComponent, AXPRichTextWidgetEditComponent, AXPRichTextWidgetViewComponent, AXPSchedulerPickerWidget, AXPSchedulerPickerWidgetColumnComponent, AXPSchedulerPickerWidgetEditComponent, AXPSchedulerPickerWidgetViewComponent, AXPSelectBoxWidget, AXPSelectBoxWidgetColumnComponent, AXPSelectBoxWidgetEditComponent, AXPSelectBoxWidgetViewComponent, AXPSelectLanguagePopup, AXPSelectionListWidget, AXPSelectionListWidgetColumnComponent, AXPSelectionListWidgetDesignerComponent, AXPSelectionListWidgetEditComponent, AXPSelectionListWidgetViewComponent, AXPSignatureWidget, AXPSignatureWidgetColumnComponent, AXPSignatureWidgetEditComponent, AXPSignatureWidgetViewComponent, AXPSpacingWidget, AXPSpacingWidgetEditComponent, AXPStatusChipComponent, AXPStatusWidget, AXPStatusWidgetColumnComponent, AXPStatusWidgetEditComponent, AXPStatusWidgetViewComponent, AXPStepWizardWidget, AXPStepWizardWidgetViewComponent, AXPStopwatchWidget, AXPStopwatchWidgetViewComponent, AXPTableItemWidget, AXPTableItemWidgetDesignerComponent, AXPTableItemWidgetViewComponent, AXPTableWidget, AXPTableWidgetDesignerComponent, AXPTableWidgetViewComponent, AXPTagEditorWidget, AXPTagEditorWidgetColumnComponent, AXPTagEditorWidgetEditComponent, AXPTagEditorWidgetViewComponent, AXPTemplateBoxWidget, AXPTemplateBoxWidgetColumnComponent, AXPTemplateBoxWidgetEditComponent, AXPTemplateBoxWidgetPrintComponent, AXPTemplateBoxWidgetViewComponent, AXPTextBoxWidget, AXPTextBoxWidgetColumnComponent, AXPTextBoxWidgetEditComponent, AXPTextBoxWidgetViewComponent, AXPToggleWidget, AXPToggleWidgetColumnComponent, AXPToggleWidgetEditComponent, AXPToggleWidgetViewComponent, AXPWidgetFieldConfiguratorWidget, AXPWidgetFieldConfiguratorWidgetColumnComponent, AXPWidgetFieldConfiguratorWidgetEditComponent, AXPWidgetsModule, AXP_ABSOLUTE_UNITS, AXP_BORDER_RADIUS_UNITS, AXP_BORDER_WIDTH_UNITS, AXP_DATA_LIST_CMD_DELETE, AXP_DATA_LIST_CMD_EDIT, AXP_DATA_LIST_PENDING_DELETE_KEY, AXP_Flex_Box_Align_Options, AXP_Flex_Box_Alignments, AXP_Flex_Box_Justify_Options, AXP_Grid_Box_Align_Items_Options, AXP_Grid_Box_Alignments, AXP_Grid_Box_Justify_Items_Options, AXP_RELATIVE_UNITS, AXP_RELATIVE_UNITS_NO_PERCENT, AXP_ROW_EXPR_PREFIX, AXP_SPACING_UNITS, AXP_WIDGET_AI_AGENT_ASSIST_FOLLOW_UP_CHIPS_LAYOUT, AXP_WIDGET_AI_AGENT_CHART_LAYOUT, AXP_WIDGET_AI_AGENT_FORM_LAYOUT, AXP_WIDGET_AI_AGENT_NAMES, AXP_default_Border_Box_Units, AXP_default_Border_Box_Value, AXP_default_Spacing_Box_Units, AXP_default_Spacing_Box_Value, DEFAULT_QRCODE_SIZE, DEFAULT_STRATEGY_CONFIG, STRATEGY_CONFIG_TOKEN, matchesWidgetAiAgent };
28129
28137
  //# sourceMappingURL=acorex-platform-layout-widgets.mjs.map