@acorex/platform 19.3.0-next.4 → 19.3.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.
- package/common/lib/app/index.d.ts +0 -1
- package/common/lib/common.module.d.ts +1 -1
- package/common/lib/configs/app.config.d.ts +12 -3
- package/common/lib/home-page/home-page.service.d.ts +6 -0
- package/common/lib/layout/logo/logo.component.d.ts +4 -0
- package/common/lib/settings/settings.service.d.ts +4 -1
- package/common/lib/utils/regional-util.service.d.ts +2 -2
- package/common/lib/utils/regional.types.d.ts +6 -16
- package/core/lib/index.d.ts +1 -0
- package/{common/lib/app → core/lib/startup}/app-startup.service.d.ts +1 -5
- package/core/lib/startup/app-startup.types.d.ts +6 -0
- package/core/lib/startup/index.d.ts +2 -0
- package/core/lib/types/logo.types.d.ts +5 -9
- package/fesm2022/acorex-platform-auth.mjs +5 -1
- package/fesm2022/acorex-platform-auth.mjs.map +1 -1
- package/fesm2022/acorex-platform-common.mjs +130 -85
- package/fesm2022/acorex-platform-common.mjs.map +1 -1
- package/fesm2022/acorex-platform-core.mjs +42 -13
- package/fesm2022/acorex-platform-core.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-builder.mjs +17 -0
- package/fesm2022/acorex-platform-layout-builder.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-designer.mjs +2 -2
- package/fesm2022/acorex-platform-layout-designer.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-entity.mjs +51 -24
- package/fesm2022/acorex-platform-layout-entity.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-search.mjs +4 -3
- package/fesm2022/acorex-platform-layout-search.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-setting.mjs +5 -4
- package/fesm2022/acorex-platform-layout-setting.mjs.map +1 -1
- package/fesm2022/{acorex-platform-themes-default-entity-master-list-view.component-CuyWAi6X.mjs → acorex-platform-themes-default-entity-master-list-view.component-Ol8haGqF.mjs} +5 -4
- package/fesm2022/acorex-platform-themes-default-entity-master-list-view.component-Ol8haGqF.mjs.map +1 -0
- package/fesm2022/acorex-platform-themes-default.mjs +18 -20
- package/fesm2022/acorex-platform-themes-default.mjs.map +1 -1
- package/fesm2022/acorex-platform-themes-shared.mjs +22 -18
- package/fesm2022/acorex-platform-themes-shared.mjs.map +1 -1
- package/fesm2022/acorex-platform-widgets.mjs +770 -123
- package/fesm2022/acorex-platform-widgets.mjs.map +1 -1
- package/layout/builder/lib/builder/context-store.service.d.ts +2 -1
- package/layout/builder/lib/builder/widget-base.component.d.ts +1 -0
- package/layout/builder/lib/builder/widget-container.component.d.ts +1 -0
- package/layout/builder/lib/builder/widget-map.d.ts +1 -0
- package/layout/builder/lib/builder/widget-renderer.directive.d.ts +1 -0
- package/layout/entity/lib/entity-master-single.viewmodel.d.ts +1 -0
- package/layout/entity/lib/entity.module.d.ts +1 -1
- package/layout/entity/lib/widgets/lookup-widget/lookup-widget-column.component.d.ts +1 -1
- package/layout/entity/lib/widgets/lookup-widget/lookup-widget-edit.component.d.ts +2 -0
- package/layout/entity/lib/widgets/lookup-widget/lookup-widget.config.d.ts +0 -5
- package/layout/search/lib/search.module.d.ts +1 -1
- package/layout/setting/lib/settings.module.d.ts +1 -1
- package/package.json +4 -2
- package/themes/default/lib/layouts/root-layout/components/header/header.component.d.ts +12 -3
- package/themes/default/lib/layouts/root-layout/horizontal/horizontal-layout.component.d.ts +12 -6
- package/themes/default/lib/layouts/root-layout/root-layout.component.d.ts +2 -1
- package/themes/default/lib/layouts/root-layout/vertical/vertical-layout.component.d.ts +14 -5
- package/themes/shared/lib/shared.module.d.ts +1 -1
- package/widgets/lib/widgets/charts/bar-chart/bar-chart-widget.component.d.ts +31 -0
- package/widgets/lib/widgets/charts/gauge-chart/gauge-chart-widget.component.d.ts +18 -12
- package/widgets/lib/widgets/charts/index.d.ts +11 -0
- package/widgets/lib/widgets/charts/line-chart/index.d.ts +3 -0
- package/widgets/lib/widgets/charts/line-chart/line-chart-widget.component.d.ts +76 -0
- package/widgets/lib/widgets/charts/line-chart/line-chart-widget.config.d.ts +7 -0
- package/widgets/lib/widgets/charts/line-chart/line-chart.type.d.ts +41 -0
- package/widgets/lib/widgets/charts/shared/index.d.ts +3 -0
- package/widgets/lib/widgets/charts/weather/index.d.ts +0 -1
- package/widgets/lib/widgets/index.d.ts +3 -1
- package/fesm2022/acorex-platform-themes-default-entity-master-list-view.component-CuyWAi6X.mjs.map +0 -1
- package/widgets/lib/widgets/charts/weather/weather.module.d.ts +0 -11
|
@@ -12,7 +12,7 @@ import { AXLoadingModule } from '@acorex/components/loading';
|
|
|
12
12
|
import * as i1$1 from '@angular/common';
|
|
13
13
|
import { CommonModule, DatePipe } from '@angular/common';
|
|
14
14
|
import * as i0 from '@angular/core';
|
|
15
|
-
import { computed, EventEmitter, ChangeDetectionStrategy, Component, inject, afterNextRender, HostBinding, signal, ViewEncapsulation, InjectionToken, effect, ViewChild, untracked, CUSTOM_ELEMENTS_SCHEMA, ChangeDetectorRef, viewChild, ElementRef, afterRender, NgZone, model, input, linkedSignal, Injector, runInInjectionContext, Directive, output, HostListener, Injectable,
|
|
15
|
+
import { computed, EventEmitter, ChangeDetectionStrategy, Component, inject, afterNextRender, HostBinding, signal, ViewEncapsulation, InjectionToken, effect, ViewChild, untracked, CUSTOM_ELEMENTS_SCHEMA, ChangeDetectorRef, viewChild, ElementRef, afterRender, NgZone, model, input, linkedSignal, Injector, runInInjectionContext, Directive, output, HostListener, Injectable, importProvidersFrom, NgModule } from '@angular/core';
|
|
16
16
|
import * as i1 from '@acorex/components/check-box';
|
|
17
17
|
import { AXCheckBoxModule } from '@acorex/components/check-box';
|
|
18
18
|
import * as i4 from '@acorex/components/form';
|
|
@@ -1927,7 +1927,7 @@ class AXPDateTimeBoxWidgetEditComponent extends AXPValueWidgetComponent {
|
|
|
1927
1927
|
></ax-button>
|
|
1928
1928
|
}
|
|
1929
1929
|
</div>
|
|
1930
|
-
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXFormModule }, { kind: "directive", type: i4.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message"] }, { kind: "ngmodule", type: AXValidationModule }, { kind: "ngmodule", type: AXDateTimeBoxModule }, { kind: "component", type: i3$2.AXDateTimeBoxComponent, selector: "ax-datetime-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "minValue", "maxValue", "value", "state", "name", "depth", "id", "type", "look", "holidayDates", "allowTyping", "format"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "onOpened", "onClosed", "readonlyChange", "disabledChange", "formatChange"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i5.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: i3.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i3.AXDecoratorClearButtonComponent, selector: "ax-clear-button", inputs: ["icon"] }, { kind: "component", type: i3.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" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
1930
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXFormModule }, { kind: "directive", type: i4.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message"] }, { kind: "ngmodule", type: AXValidationModule }, { kind: "ngmodule", type: AXDateTimeBoxModule }, { kind: "component", type: i3$2.AXDateTimeBoxComponent, selector: "ax-datetime-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "minValue", "maxValue", "value", "state", "name", "depth", "id", "type", "look", "holidayDates", "allowTyping", "calendar", "picker", "format"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "onOpened", "onClosed", "readonlyChange", "disabledChange", "formatChange"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i5.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: i3.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i3.AXDecoratorClearButtonComponent, selector: "ax-clear-button", inputs: ["icon"] }, { kind: "component", type: i3.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" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
1931
1931
|
}
|
|
1932
1932
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: AXPDateTimeBoxWidgetEditComponent, decorators: [{
|
|
1933
1933
|
type: Component,
|
|
@@ -6721,20 +6721,19 @@ class AXPToggleWidgetEditComponent extends AXPValueWidgetComponent {
|
|
|
6721
6721
|
}
|
|
6722
6722
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: AXPToggleWidgetEditComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
6723
6723
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.3", type: AXPToggleWidgetEditComponent, isStandalone: true, selector: "axp-switch-widget-edit", host: { properties: { "class": "this.__class" } }, usesInheritance: true, ngImport: i0, template: `
|
|
6724
|
-
|
|
6725
|
-
|
|
6726
|
-
|
|
6727
|
-
|
|
6728
|
-
|
|
6729
|
-
|
|
6730
|
-
|
|
6731
|
-
|
|
6724
|
+
<div class="ax-flex ax-items-center ax-gap-2">
|
|
6725
|
+
<ax-switch
|
|
6726
|
+
[ngModel]="this.getValue()"
|
|
6727
|
+
[disabled]="disabled()"
|
|
6728
|
+
[readonly]="readonly()"
|
|
6729
|
+
[color]="color()"
|
|
6730
|
+
(onValueChanged)="handleValueChanged($event)"
|
|
6731
|
+
>
|
|
6732
6732
|
</ax-switch>
|
|
6733
|
-
@if(label())
|
|
6734
|
-
|
|
6735
|
-
<ax-label [textContent]="label()"></ax-label>
|
|
6733
|
+
@if(label()) {
|
|
6734
|
+
<ax-label [textContent]="label()"></ax-label>
|
|
6736
6735
|
}
|
|
6737
|
-
|
|
6736
|
+
</div>
|
|
6738
6737
|
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXFormModule }, { kind: "ngmodule", type: AXSwitchModule }, { kind: "component", type: i2$5.AXSwitchComponent, selector: "ax-switch", inputs: ["disabled", "readonly", "color", "tabIndex", "value", "name", "isLoading"], outputs: ["onBlur", "onFocus", "valueChange", "onValueChanged", "readonlyChange", "disabledChange"] }, { kind: "ngmodule", type: AXValidationModule }, { kind: "ngmodule", type: AXLabelModule }, { kind: "component", type: i2$2.AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
6739
6738
|
}
|
|
6740
6739
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: AXPToggleWidgetEditComponent, decorators: [{
|
|
@@ -6742,20 +6741,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.3", ngImpor
|
|
|
6742
6741
|
args: [{
|
|
6743
6742
|
selector: 'axp-switch-widget-edit',
|
|
6744
6743
|
template: `
|
|
6745
|
-
|
|
6746
|
-
|
|
6747
|
-
|
|
6748
|
-
|
|
6749
|
-
|
|
6750
|
-
|
|
6751
|
-
|
|
6752
|
-
|
|
6744
|
+
<div class="ax-flex ax-items-center ax-gap-2">
|
|
6745
|
+
<ax-switch
|
|
6746
|
+
[ngModel]="this.getValue()"
|
|
6747
|
+
[disabled]="disabled()"
|
|
6748
|
+
[readonly]="readonly()"
|
|
6749
|
+
[color]="color()"
|
|
6750
|
+
(onValueChanged)="handleValueChanged($event)"
|
|
6751
|
+
>
|
|
6753
6752
|
</ax-switch>
|
|
6754
|
-
@if(label())
|
|
6755
|
-
|
|
6756
|
-
<ax-label [textContent]="label()"></ax-label>
|
|
6753
|
+
@if(label()) {
|
|
6754
|
+
<ax-label [textContent]="label()"></ax-label>
|
|
6757
6755
|
}
|
|
6758
|
-
|
|
6756
|
+
</div>
|
|
6759
6757
|
`,
|
|
6760
6758
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
6761
6759
|
imports: [CommonModule, FormsModule, AXFormModule, AXSwitchModule, AXValidationModule, AXLabelModule],
|
|
@@ -7879,7 +7877,7 @@ class AXPGalleryWidgetViewComponent extends AXPValueWidgetComponent {
|
|
|
7879
7877
|
<small>No Media!</small>
|
|
7880
7878
|
}
|
|
7881
7879
|
</div>
|
|
7882
|
-
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: AXImageModule }, { kind: "component", type: i2$7.AXImageComponent, selector: "ax-image", inputs: ["overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i3.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: AXLoadingModule }, { kind: "component", type: i2.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
7880
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: AXImageModule }, { kind: "component", type: i2$7.AXImageComponent, selector: "ax-image", inputs: ["width", "height", "overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i3.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: AXLoadingModule }, { kind: "component", type: i2.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
7883
7881
|
}
|
|
7884
7882
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: AXPGalleryWidgetViewComponent, decorators: [{
|
|
7885
7883
|
type: Component,
|
|
@@ -8416,7 +8414,7 @@ class AXPSignatureWidgetEditComponent extends AXPValueWidgetComponent {
|
|
|
8416
8414
|
</div>
|
|
8417
8415
|
}
|
|
8418
8416
|
</div>
|
|
8419
|
-
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i5.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: i3.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i3.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: AXImageModule }, { kind: "component", type: i2$7.AXImageComponent, selector: "ax-image", inputs: ["overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
8417
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i5.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: i3.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i3.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: AXImageModule }, { kind: "component", type: i2$7.AXImageComponent, selector: "ax-image", inputs: ["width", "height", "overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
8420
8418
|
}
|
|
8421
8419
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: AXPSignatureWidgetEditComponent, decorators: [{
|
|
8422
8420
|
type: Component,
|
|
@@ -8514,7 +8512,7 @@ class AXPSignatureWidgetViewComponent extends AXPValueWidgetComponent {
|
|
|
8514
8512
|
<span>{{placeholder()}}</span>
|
|
8515
8513
|
}
|
|
8516
8514
|
</div>
|
|
8517
|
-
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXImageModule }, { kind: "component", type: i2$7.AXImageComponent, selector: "ax-image", inputs: ["overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
8515
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXImageModule }, { kind: "component", type: i2$7.AXImageComponent, selector: "ax-image", inputs: ["width", "height", "overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
8518
8516
|
}
|
|
8519
8517
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: AXPSignatureWidgetViewComponent, decorators: [{
|
|
8520
8518
|
type: Component,
|
|
@@ -12581,6 +12579,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.3", ngImpor
|
|
|
12581
12579
|
args: [{ selector: 'ax-chart-tooltip', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (visible() && data()) {\n<div class=\"chart-tooltip\" [style.left.px]=\"position().x\" [style.top.px]=\"position().y\" [ngStyle]=\"style()\">\n <div class=\"chart-tooltip-title\">{{ data()!.title }}</div>\n <div class=\"chart-tooltip-content\">\n @if (data()!.color) {\n <div class=\"chart-tooltip-color\" [style.background-color]=\"data()!.color\"></div>\n }\n <div class=\"chart-tooltip-value\">{{ data()!.value }}</div>\n @if (showPercentage() && data()!.percentage) {\n <div class=\"chart-tooltip-percentage\">{{ data()!.percentage }}</div>\n }\n </div>\n</div>\n}\n", styles: [".chart-tooltip{position:absolute;pointer-events:none;background-color:rgba(33,33,33,.9);color:#fff;padding:.5rem .75rem;border-radius:.375rem;font-size:.8rem;z-index:10;box-shadow:0 4px 12px rgba(0,0,0,.15);-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);border:1px solid rgba(255,255,255,.1);transform:translate(10px,-50%);max-width:200px;font-family:var(--ax-font-family, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif);transition:opacity .15s ease,transform .15s ease}.chart-tooltip-title{font-weight:600;padding-bottom:.5rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.chart-tooltip-content{display:flex;justify-content:space-between;align-items:center;gap:.5rem}.chart-tooltip-color{width:10px;height:10px;border-radius:2px;flex-shrink:0;box-shadow:0 1px 2px rgba(0,0,0,.2)}.chart-tooltip-value{font-weight:500;flex-grow:1}.chart-tooltip-percentage{background-color:rgba(255,255,255,.2);padding:.125rem .375rem;border-radius:1rem;font-size:.7rem;font-weight:500;flex-shrink:0}\n"] }]
|
|
12582
12580
|
}] });
|
|
12583
12581
|
|
|
12582
|
+
/**
|
|
12583
|
+
* Bar Chart Widget Component
|
|
12584
|
+
* Renders data as vertical bars with interactive hover effects and animations
|
|
12585
|
+
*/
|
|
12584
12586
|
class AXPBarChartWidgetViewComponent extends AXPChartBaseComponent {
|
|
12585
12587
|
constructor() {
|
|
12586
12588
|
super(...arguments);
|
|
@@ -12606,6 +12608,9 @@ class AXPBarChartWidgetViewComponent extends AXPChartBaseComponent {
|
|
|
12606
12608
|
this.cornerRadius = computed(() => this.options()['cornerRadius'] ?? 4);
|
|
12607
12609
|
}
|
|
12608
12610
|
// Chart lifecycle methods
|
|
12611
|
+
/**
|
|
12612
|
+
* Creates the bar chart SVG and renders all elements
|
|
12613
|
+
*/
|
|
12609
12614
|
createChart() {
|
|
12610
12615
|
if (!this.d3 || !this.chartContainerEl()?.nativeElement)
|
|
12611
12616
|
return;
|
|
@@ -12621,14 +12626,7 @@ class AXPBarChartWidgetViewComponent extends AXPChartBaseComponent {
|
|
|
12621
12626
|
// Get options and setup dimensions
|
|
12622
12627
|
const options = this.options();
|
|
12623
12628
|
this.setupDimensions(containerElement, options);
|
|
12624
|
-
//
|
|
12625
|
-
this.svg = this.d3
|
|
12626
|
-
.select(containerElement)
|
|
12627
|
-
.append('svg')
|
|
12628
|
-
.attr('width', this.width + this.margin.left + this.margin.right)
|
|
12629
|
-
.attr('height', this.height + this.margin.top + this.margin.bottom);
|
|
12630
|
-
// Create chart group with margins
|
|
12631
|
-
this.chart = this.svg.append('g').attr('transform', `translate(${this.margin.left},${this.margin.top})`);
|
|
12629
|
+
// No need to create SVG here as it's now done in setupDimensions
|
|
12632
12630
|
// Create scales and axes
|
|
12633
12631
|
this.setupScales(data);
|
|
12634
12632
|
this.createAxes(options);
|
|
@@ -12647,15 +12645,40 @@ class AXPBarChartWidgetViewComponent extends AXPChartBaseComponent {
|
|
|
12647
12645
|
this._tooltipVisible.set(false);
|
|
12648
12646
|
}
|
|
12649
12647
|
// Private chart creation methods
|
|
12648
|
+
/**
|
|
12649
|
+
* Sets up chart dimensions and creates SVG with responsive attributes
|
|
12650
|
+
*/
|
|
12650
12651
|
setupDimensions(containerElement, options) {
|
|
12651
|
-
//
|
|
12652
|
+
// Get container dimensions
|
|
12652
12653
|
const containerWidth = containerElement.clientWidth;
|
|
12653
12654
|
const containerHeight = containerElement.clientHeight;
|
|
12654
|
-
//
|
|
12655
|
-
const minDim = 200;
|
|
12656
|
-
|
|
12657
|
-
|
|
12655
|
+
// If options specify width and height, use those, otherwise default to container size
|
|
12656
|
+
const minDim = Math.min(200, containerWidth, containerHeight); // Ensure reasonable minimum
|
|
12657
|
+
if (options.width && options.height) {
|
|
12658
|
+
// Explicit dimensions provided
|
|
12659
|
+
this.width = options.width - this.margin.left - this.margin.right;
|
|
12660
|
+
this.height = options.height - this.margin.top - this.margin.bottom;
|
|
12661
|
+
}
|
|
12662
|
+
else {
|
|
12663
|
+
// Responsive dimensions
|
|
12664
|
+
this.width = Math.max(containerWidth, minDim) - this.margin.left - this.margin.right;
|
|
12665
|
+
this.height = Math.max(containerHeight, minDim) - this.margin.top - this.margin.bottom;
|
|
12666
|
+
}
|
|
12667
|
+
// Create responsive SVG that scales with its container
|
|
12668
|
+
const svg = this.d3
|
|
12669
|
+
.select(containerElement)
|
|
12670
|
+
.append('svg')
|
|
12671
|
+
.attr('width', '100%')
|
|
12672
|
+
.attr('height', '100%')
|
|
12673
|
+
.attr('viewBox', `0 0 ${this.width + this.margin.left + this.margin.right} ${this.height + this.margin.top + this.margin.bottom}`)
|
|
12674
|
+
.attr('preserveAspectRatio', 'xMidYMid meet');
|
|
12675
|
+
this.svg = svg;
|
|
12676
|
+
// Create chart group with margins
|
|
12677
|
+
this.chart = this.svg.append('g').attr('transform', `translate(${this.margin.left},${this.margin.top})`);
|
|
12658
12678
|
}
|
|
12679
|
+
/**
|
|
12680
|
+
* Creates x and y scales for the chart
|
|
12681
|
+
*/
|
|
12659
12682
|
setupScales(data) {
|
|
12660
12683
|
// Get the bar width percentage (default 80%)
|
|
12661
12684
|
const barWidthPercent = this.barWidth() / 100;
|
|
@@ -12674,6 +12697,9 @@ class AXPBarChartWidgetViewComponent extends AXPChartBaseComponent {
|
|
|
12674
12697
|
.nice()
|
|
12675
12698
|
.range([this.height, 0]);
|
|
12676
12699
|
}
|
|
12700
|
+
/**
|
|
12701
|
+
* Creates x and y axes with grid lines
|
|
12702
|
+
*/
|
|
12677
12703
|
createAxes(options) {
|
|
12678
12704
|
// Only create axes if they are enabled in options
|
|
12679
12705
|
const showXAxis = options.showXAxis !== false;
|
|
@@ -12704,6 +12730,9 @@ class AXPBarChartWidgetViewComponent extends AXPChartBaseComponent {
|
|
|
12704
12730
|
.style('color', 'rgb(153 153 153 / 30%)'); // Add gray color to ticks
|
|
12705
12731
|
}
|
|
12706
12732
|
}
|
|
12733
|
+
/**
|
|
12734
|
+
* Renders the bars with animations
|
|
12735
|
+
*/
|
|
12707
12736
|
renderBars(data) {
|
|
12708
12737
|
// Get corner radius from options
|
|
12709
12738
|
const radius = this.cornerRadius();
|
|
@@ -12735,6 +12764,9 @@ class AXPBarChartWidgetViewComponent extends AXPChartBaseComponent {
|
|
|
12735
12764
|
.ease(this.d3.easeQuadOut); // Simple quadratic ease-out animation
|
|
12736
12765
|
}
|
|
12737
12766
|
// Event handlers
|
|
12767
|
+
/**
|
|
12768
|
+
* Handles bar hover event and shows tooltip
|
|
12769
|
+
*/
|
|
12738
12770
|
handleBarHover(event, datum) {
|
|
12739
12771
|
if (this.options().showTooltip !== false) {
|
|
12740
12772
|
const index = this.chartData().findIndex((item) => item.id === datum.id);
|
|
@@ -12752,6 +12784,9 @@ class AXPBarChartWidgetViewComponent extends AXPChartBaseComponent {
|
|
|
12752
12784
|
this._tooltipVisible.set(true);
|
|
12753
12785
|
}
|
|
12754
12786
|
}
|
|
12787
|
+
/**
|
|
12788
|
+
* Updates tooltip position based on mouse coordinates
|
|
12789
|
+
*/
|
|
12755
12790
|
updateTooltipPosition(event) {
|
|
12756
12791
|
const container = this.chartContainerEl().nativeElement.getBoundingClientRect();
|
|
12757
12792
|
const x = event.clientX - container.left;
|
|
@@ -12761,9 +12796,15 @@ class AXPBarChartWidgetViewComponent extends AXPChartBaseComponent {
|
|
|
12761
12796
|
y: y,
|
|
12762
12797
|
});
|
|
12763
12798
|
}
|
|
12799
|
+
/**
|
|
12800
|
+
* Handles bar click event
|
|
12801
|
+
*/
|
|
12764
12802
|
handleBarClick(event, datum) {
|
|
12765
12803
|
this.barClick.emit(datum);
|
|
12766
12804
|
}
|
|
12805
|
+
/**
|
|
12806
|
+
* Shows a message when no data is available
|
|
12807
|
+
*/
|
|
12767
12808
|
showNoDataMessage(containerElement) {
|
|
12768
12809
|
const messageContainer = this.d3
|
|
12769
12810
|
.select(containerElement)
|
|
@@ -12793,11 +12834,11 @@ class AXPBarChartWidgetViewComponent extends AXPChartBaseComponent {
|
|
|
12793
12834
|
.text('No data available');
|
|
12794
12835
|
}
|
|
12795
12836
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: AXPBarChartWidgetViewComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
12796
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "19.0.3", type: AXPBarChartWidgetViewComponent, isStandalone: true, selector: "ng-component", outputs: { barClick: "barClick" }, viewQueries: [{ propertyName: "chartContainerEl", first: true, predicate: ["chartContainer"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"axp-bar-chart\" #chartContainer>\n <!-- Shared tooltip component -->\n <ax-chart-tooltip\n [visible]=\"tooltipVisible()\"\n [position]=\"tooltipPosition()\"\n [data]=\"tooltipData()\"\n [showPercentage]=\"true\"\n ></ax-chart-tooltip>\n</div>\n", styles: [":host{display:block;width:100%;height:100%;min-height:
|
|
12837
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "19.0.3", type: AXPBarChartWidgetViewComponent, isStandalone: true, selector: "ng-component", outputs: { barClick: "barClick" }, viewQueries: [{ propertyName: "chartContainerEl", first: true, predicate: ["chartContainer"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"axp-bar-chart\" #chartContainer>\n <!-- Shared tooltip component -->\n <ax-chart-tooltip\n [visible]=\"tooltipVisible()\"\n [position]=\"tooltipPosition()\"\n [data]=\"tooltipData()\"\n [showPercentage]=\"true\"\n ></ax-chart-tooltip>\n</div>\n", styles: [":host{display:block;width:100%;height:100%;min-height:200px}.axp-bar-chart{width:100%;height:100%;position:relative;display:flex;align-items:center;justify-content:center;border-radius:.5rem;overflow:hidden}.axp-bar-chart svg{width:100%;height:100%;max-width:100%;max-height:100%;overflow:visible}.axp-bar-chart-bar{transition:all .3s cubic-bezier(.4,0,.2,1);cursor:pointer}.axp-bar-chart-bar:hover{filter:brightness(.9);transform:translateY(-3px)}.axp-bar-chart-axis-x path,.axp-bar-chart-axis-y path{stroke:var(--ax-border-color, #e0e0e0)}.axp-bar-chart-axis-x line,.axp-bar-chart-axis-y line,.axp-bar-chart-grid line{stroke:var(--ax-border-color, #e0e0e0);stroke-dasharray:2,2;stroke-opacity:.5}.axp-bar-chart-grid path{stroke-width:0}.axp-bar-chart-axis-x text,.axp-bar-chart-axis-y text{fill:var(--ax-text-muted, #666);font-size:clamp(8px,2vmin,12px)}.axp-bar-chart-no-data-message{font-family:var(--ax-font-family, system-ui, sans-serif);display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:1rem;width:100%;height:100%}.axp-bar-chart-no-data-icon{margin-bottom:.75rem;color:var(--ax-text-muted, #999)}.axp-bar-chart-no-data-text{font-weight:600;color:var(--ax-text-color, #333)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: AXPChartTooltipComponent, selector: "ax-chart-tooltip", inputs: ["data", "position", "visible", "showPercentage", "style"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
12797
12838
|
}
|
|
12798
12839
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: AXPBarChartWidgetViewComponent, decorators: [{
|
|
12799
12840
|
type: Component,
|
|
12800
|
-
args: [{ standalone: true, imports: [CommonModule, AXPChartTooltipComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"axp-bar-chart\" #chartContainer>\n <!-- Shared tooltip component -->\n <ax-chart-tooltip\n [visible]=\"tooltipVisible()\"\n [position]=\"tooltipPosition()\"\n [data]=\"tooltipData()\"\n [showPercentage]=\"true\"\n ></ax-chart-tooltip>\n</div>\n", styles: [":host{display:block;width:100%;height:100%;min-height:
|
|
12841
|
+
args: [{ standalone: true, imports: [CommonModule, AXPChartTooltipComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"axp-bar-chart\" #chartContainer>\n <!-- Shared tooltip component -->\n <ax-chart-tooltip\n [visible]=\"tooltipVisible()\"\n [position]=\"tooltipPosition()\"\n [data]=\"tooltipData()\"\n [showPercentage]=\"true\"\n ></ax-chart-tooltip>\n</div>\n", styles: [":host{display:block;width:100%;height:100%;min-height:200px}.axp-bar-chart{width:100%;height:100%;position:relative;display:flex;align-items:center;justify-content:center;border-radius:.5rem;overflow:hidden}.axp-bar-chart svg{width:100%;height:100%;max-width:100%;max-height:100%;overflow:visible}.axp-bar-chart-bar{transition:all .3s cubic-bezier(.4,0,.2,1);cursor:pointer}.axp-bar-chart-bar:hover{filter:brightness(.9);transform:translateY(-3px)}.axp-bar-chart-axis-x path,.axp-bar-chart-axis-y path{stroke:var(--ax-border-color, #e0e0e0)}.axp-bar-chart-axis-x line,.axp-bar-chart-axis-y line,.axp-bar-chart-grid line{stroke:var(--ax-border-color, #e0e0e0);stroke-dasharray:2,2;stroke-opacity:.5}.axp-bar-chart-grid path{stroke-width:0}.axp-bar-chart-axis-x text,.axp-bar-chart-axis-y text{fill:var(--ax-text-muted, #666);font-size:clamp(8px,2vmin,12px)}.axp-bar-chart-no-data-message{font-family:var(--ax-font-family, system-ui, sans-serif);display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:1rem;width:100%;height:100%}.axp-bar-chart-no-data-icon{margin-bottom:.75rem;color:var(--ax-text-muted, #999)}.axp-bar-chart-no-data-text{font-weight:600;color:var(--ax-text-color, #333)}\n"] }]
|
|
12801
12842
|
}] });
|
|
12802
12843
|
|
|
12803
12844
|
var barChartWidget_component = /*#__PURE__*/Object.freeze({
|
|
@@ -13881,6 +13922,10 @@ const AXPDonutChartWidget = {
|
|
|
13881
13922
|
},
|
|
13882
13923
|
};
|
|
13883
13924
|
|
|
13925
|
+
/**
|
|
13926
|
+
* Gauge Chart Widget Component
|
|
13927
|
+
* Renders a semi-circular gauge chart with animated needle and thresholds
|
|
13928
|
+
*/
|
|
13884
13929
|
class AXPGaugeChartWidgetViewComponent extends AXPChartBaseComponent {
|
|
13885
13930
|
constructor() {
|
|
13886
13931
|
super(...arguments);
|
|
@@ -13904,15 +13949,30 @@ class AXPGaugeChartWidgetViewComponent extends AXPChartBaseComponent {
|
|
|
13904
13949
|
this.gaugeWidth = computed(() => this.options()['gaugeWidth'] ?? 22);
|
|
13905
13950
|
this.cornerRadius = computed(() => this.options()['cornerRadius'] ?? 5);
|
|
13906
13951
|
}
|
|
13952
|
+
/**
|
|
13953
|
+
* Creates the gauge chart with all elements
|
|
13954
|
+
*/
|
|
13907
13955
|
createChart() {
|
|
13908
13956
|
// Clear any existing chart
|
|
13909
13957
|
this.d3.select(this.chartEl().nativeElement).selectAll('*').remove();
|
|
13910
13958
|
// Calculate responsive dimensions
|
|
13911
|
-
const
|
|
13912
|
-
const
|
|
13913
|
-
const
|
|
13959
|
+
const containerElement = this.chartContainerEl().nativeElement;
|
|
13960
|
+
const containerWidth = containerElement.clientWidth;
|
|
13961
|
+
const containerHeight = containerElement.clientHeight;
|
|
13962
|
+
// Determine size based on explicit dimensions or container size
|
|
13963
|
+
const options = this.options();
|
|
13964
|
+
let size;
|
|
13965
|
+
if (options.width && options.height) {
|
|
13966
|
+
// Use explicit dimensions if provided
|
|
13967
|
+
size = Math.min(options.width, options.height * 2);
|
|
13968
|
+
}
|
|
13969
|
+
else {
|
|
13970
|
+
// Use container dimensions with minimum constraints
|
|
13971
|
+
const minDim = Math.max(200, Math.min(containerWidth, containerHeight));
|
|
13972
|
+
size = Math.min(containerWidth, containerHeight * 2, minDim * 2);
|
|
13973
|
+
}
|
|
13914
13974
|
const margin = size * 0.1;
|
|
13915
|
-
// Set up SVG
|
|
13975
|
+
// Set up SVG with responsive viewBox
|
|
13916
13976
|
const svg = this.d3
|
|
13917
13977
|
.select(this.chartEl().nativeElement)
|
|
13918
13978
|
.attr('width', '100%')
|
|
@@ -13951,7 +14011,7 @@ class AXPGaugeChartWidgetViewComponent extends AXPChartBaseComponent {
|
|
|
13951
14011
|
}
|
|
13952
14012
|
}
|
|
13953
14013
|
/**
|
|
13954
|
-
*
|
|
14014
|
+
* Creates gradient definitions for thresholds
|
|
13955
14015
|
*/
|
|
13956
14016
|
createGradients(svg, thresholds) {
|
|
13957
14017
|
const defs = svg.append('defs');
|
|
@@ -13996,7 +14056,7 @@ class AXPGaugeChartWidgetViewComponent extends AXPChartBaseComponent {
|
|
|
13996
14056
|
}
|
|
13997
14057
|
}
|
|
13998
14058
|
/**
|
|
13999
|
-
*
|
|
14059
|
+
* Draws the background arc
|
|
14000
14060
|
*/
|
|
14001
14061
|
drawBackgroundArc(chartGroup, innerRadius, outerRadius, cornerRadius) {
|
|
14002
14062
|
const backgroundArc = this.d3
|
|
@@ -14018,7 +14078,7 @@ class AXPGaugeChartWidgetViewComponent extends AXPChartBaseComponent {
|
|
|
14018
14078
|
.attr('filter', 'drop-shadow(0px 2px 3px rgba(0,0,0,0.1))');
|
|
14019
14079
|
}
|
|
14020
14080
|
/**
|
|
14021
|
-
*
|
|
14081
|
+
* Draws the threshold arcs with colors
|
|
14022
14082
|
*/
|
|
14023
14083
|
drawThresholds(chartGroup, innerRadius, outerRadius, minValue, maxValue, thresholds, cornerRadius) {
|
|
14024
14084
|
const arc = this.d3
|
|
@@ -14064,7 +14124,7 @@ class AXPGaugeChartWidgetViewComponent extends AXPChartBaseComponent {
|
|
|
14064
14124
|
}
|
|
14065
14125
|
}
|
|
14066
14126
|
/**
|
|
14067
|
-
*
|
|
14127
|
+
* Draws tick marks around the gauge
|
|
14068
14128
|
*/
|
|
14069
14129
|
drawTicks(chartGroup, radius, minValue, maxValue) {
|
|
14070
14130
|
const tickCount = 10;
|
|
@@ -14128,13 +14188,13 @@ class AXPGaugeChartWidgetViewComponent extends AXPChartBaseComponent {
|
|
|
14128
14188
|
}
|
|
14129
14189
|
}
|
|
14130
14190
|
/**
|
|
14131
|
-
*
|
|
14191
|
+
* Draws the value display in the center
|
|
14132
14192
|
*/
|
|
14133
14193
|
drawValueDisplay(chartGroup, value, label, radius) {
|
|
14134
14194
|
// Value text - positioned below the needle pivot
|
|
14135
14195
|
chartGroup
|
|
14136
14196
|
.append('text')
|
|
14137
|
-
.attr('class', 'value')
|
|
14197
|
+
.attr('class', 'gauge-value')
|
|
14138
14198
|
.attr('x', 0)
|
|
14139
14199
|
.attr('y', radius * 0.25) // Moved up from 0.3
|
|
14140
14200
|
.attr('text-anchor', 'middle')
|
|
@@ -14146,7 +14206,7 @@ class AXPGaugeChartWidgetViewComponent extends AXPChartBaseComponent {
|
|
|
14146
14206
|
// Label text
|
|
14147
14207
|
chartGroup
|
|
14148
14208
|
.append('text')
|
|
14149
|
-
.attr('class', 'label')
|
|
14209
|
+
.attr('class', 'gauge-label')
|
|
14150
14210
|
.attr('x', 0)
|
|
14151
14211
|
.attr('y', radius * 0.45) // Keeping this position to create more space
|
|
14152
14212
|
.attr('text-anchor', 'middle')
|
|
@@ -14156,7 +14216,7 @@ class AXPGaugeChartWidgetViewComponent extends AXPChartBaseComponent {
|
|
|
14156
14216
|
.text(label);
|
|
14157
14217
|
}
|
|
14158
14218
|
/**
|
|
14159
|
-
*
|
|
14219
|
+
* Draws the dial/needle with animation
|
|
14160
14220
|
*/
|
|
14161
14221
|
drawDial(chartGroup, radius, value, minValue, maxValue) {
|
|
14162
14222
|
const needleGroup = chartGroup.append('g');
|
|
@@ -14195,7 +14255,7 @@ class AXPGaugeChartWidgetViewComponent extends AXPChartBaseComponent {
|
|
|
14195
14255
|
});
|
|
14196
14256
|
}
|
|
14197
14257
|
/**
|
|
14198
|
-
*
|
|
14258
|
+
* Creates a path for the needle
|
|
14199
14259
|
*/
|
|
14200
14260
|
createNeedlePath(radius) {
|
|
14201
14261
|
const needleLength = radius * 0.75;
|
|
@@ -14203,42 +14263,33 @@ class AXPGaugeChartWidgetViewComponent extends AXPChartBaseComponent {
|
|
|
14203
14263
|
return `M 0 -${needleBaseWidth} L ${needleLength} 0 L 0 ${needleBaseWidth} Z`;
|
|
14204
14264
|
}
|
|
14205
14265
|
/**
|
|
14206
|
-
*
|
|
14207
|
-
*/
|
|
14208
|
-
drawLabel(chartGroup, label) {
|
|
14209
|
-
chartGroup
|
|
14210
|
-
.append('text')
|
|
14211
|
-
.attr('text-anchor', 'middle')
|
|
14212
|
-
.attr('dy', '0.35em')
|
|
14213
|
-
.text(label || '')
|
|
14214
|
-
.style('font-size', '16px')
|
|
14215
|
-
.style('fill', '#000');
|
|
14216
|
-
}
|
|
14217
|
-
/**
|
|
14218
|
-
* Scale a value to an angle for the gauge chart.
|
|
14266
|
+
* Scales a value to an angle for needle positioning
|
|
14219
14267
|
*/
|
|
14220
14268
|
scaleValueToAngle(value, min, max) {
|
|
14221
14269
|
const scaledValue = (value - min) / (max - min);
|
|
14222
14270
|
// Map from -180 to 0 degrees in radians, starting from the left
|
|
14223
14271
|
return -Math.PI + scaledValue * Math.PI;
|
|
14224
14272
|
}
|
|
14273
|
+
/**
|
|
14274
|
+
* Scales a value to an angle for threshold colors
|
|
14275
|
+
*/
|
|
14225
14276
|
scaleValueToColorAngle(value, min, max) {
|
|
14226
14277
|
const scaledValue = (value - min) / (max - min);
|
|
14227
14278
|
// Map from -90 to 90 degrees in radians (-π/2 to π/2), starting from the bottom
|
|
14228
14279
|
return -Math.PI / 2 + scaledValue * Math.PI;
|
|
14229
14280
|
}
|
|
14230
14281
|
/**
|
|
14231
|
-
*
|
|
14282
|
+
* Converts radians to degrees
|
|
14232
14283
|
*/
|
|
14233
14284
|
radiansToDegrees(radians) {
|
|
14234
14285
|
return radians * (180 / Math.PI);
|
|
14235
14286
|
}
|
|
14236
14287
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: AXPGaugeChartWidgetViewComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
14237
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "19.0.3", type: AXPGaugeChartWidgetViewComponent, isStandalone: true, selector: "ng-component", viewQueries: [{ propertyName: "chartContainerEl", first: true, predicate: ["chartContainer"], descendants: true, isSignal: true }, { propertyName: "chartEl", first: true, predicate: ["chart"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"ax-flex ax-justify-center ax-items-center ax-w-full ax-h-full\" #chartContainer>\n <svg #chart class=\"ax-w-full ax-h-full\"></svg>\n</div>\n", styles: [":host{display:block;width:100%;height:100
|
|
14288
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "19.0.3", type: AXPGaugeChartWidgetViewComponent, isStandalone: true, selector: "ng-component", viewQueries: [{ propertyName: "chartContainerEl", first: true, predicate: ["chartContainer"], descendants: true, isSignal: true }, { propertyName: "chartEl", first: true, predicate: ["chart"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"ax-flex ax-justify-center ax-items-center ax-w-full ax-h-full\" #chartContainer>\n <svg #chart class=\"ax-w-full ax-h-full\"></svg>\n</div>\n", styles: [":host{display:block;width:100%;height:100%;min-height:200px}div.ax-flex{position:relative;width:100%;height:100%;overflow:visible}svg{display:block;width:100%;height:100%;max-width:100%;max-height:100%;overflow:visible}.gauge-arc{transition:stroke-dashoffset 1s ease}.gauge-label{font-family:var(--ax-font-family, system-ui, sans-serif);font-weight:600}.gauge-value{font-family:var(--ax-font-family, system-ui, sans-serif);font-weight:700}.gauge-min-max{font-family:var(--ax-font-family, system-ui, sans-serif);opacity:.7}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
14238
14289
|
}
|
|
14239
14290
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: AXPGaugeChartWidgetViewComponent, decorators: [{
|
|
14240
14291
|
type: Component,
|
|
14241
|
-
args: [{ standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"ax-flex ax-justify-center ax-items-center ax-w-full ax-h-full\" #chartContainer>\n <svg #chart class=\"ax-w-full ax-h-full\"></svg>\n</div>\n", styles: [":host{display:block;width:100%;height:100
|
|
14292
|
+
args: [{ standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"ax-flex ax-justify-center ax-items-center ax-w-full ax-h-full\" #chartContainer>\n <svg #chart class=\"ax-w-full ax-h-full\"></svg>\n</div>\n", styles: [":host{display:block;width:100%;height:100%;min-height:200px}div.ax-flex{position:relative;width:100%;height:100%;overflow:visible}svg{display:block;width:100%;height:100%;max-width:100%;max-height:100%;overflow:visible}.gauge-arc{transition:stroke-dashoffset 1s ease}.gauge-label{font-family:var(--ax-font-family, system-ui, sans-serif);font-weight:600}.gauge-value{font-family:var(--ax-font-family, system-ui, sans-serif);font-weight:700}.gauge-min-max{font-family:var(--ax-font-family, system-ui, sans-serif);opacity:.7}\n"] }]
|
|
14242
14293
|
}] });
|
|
14243
14294
|
|
|
14244
14295
|
var gaugeChartWidget_component = /*#__PURE__*/Object.freeze({
|
|
@@ -14400,6 +14451,643 @@ const AXPGaugeChartWidget = {
|
|
|
14400
14451
|
},
|
|
14401
14452
|
};
|
|
14402
14453
|
|
|
14454
|
+
/**
|
|
14455
|
+
* Line Chart Widget Component
|
|
14456
|
+
* Renders data as lines with interactive hover effects and animations
|
|
14457
|
+
*/
|
|
14458
|
+
class AXPLineChartWidgetViewComponent extends AXPChartBaseComponent {
|
|
14459
|
+
constructor() {
|
|
14460
|
+
super(...arguments);
|
|
14461
|
+
this.pointClick = output();
|
|
14462
|
+
// Chart container reference
|
|
14463
|
+
this.chartContainerEl = viewChild.required('chartContainer');
|
|
14464
|
+
this.margin = { top: 20, right: 20, bottom: 30, left: 40 };
|
|
14465
|
+
// Tooltip state
|
|
14466
|
+
this._tooltipVisible = signal(false);
|
|
14467
|
+
this._tooltipPosition = signal({ x: 0, y: 0 });
|
|
14468
|
+
this._tooltipData = signal({
|
|
14469
|
+
title: '',
|
|
14470
|
+
value: '0',
|
|
14471
|
+
percentage: '0%',
|
|
14472
|
+
color: '',
|
|
14473
|
+
});
|
|
14474
|
+
// Tooltip accessors
|
|
14475
|
+
this.tooltipVisible = computed(() => this._tooltipVisible());
|
|
14476
|
+
this.tooltipPosition = computed(() => this._tooltipPosition());
|
|
14477
|
+
this.tooltipData = computed(() => this._tooltipData());
|
|
14478
|
+
// Line appearance options
|
|
14479
|
+
this.lineWidth = computed(() => this.options()['lineWidth'] ?? 2);
|
|
14480
|
+
this.showPoints = computed(() => this.options()['showPoints'] !== false);
|
|
14481
|
+
this.pointRadius = computed(() => this.options()['pointRadius'] ?? 4);
|
|
14482
|
+
this.smoothLine = computed(() => this.options()['smoothLine'] !== false);
|
|
14483
|
+
this.fillArea = computed(() => this.options()['fillArea'] === true);
|
|
14484
|
+
this.fillOpacity = computed(() => (this.options()['fillOpacity'] ?? 20) / 100);
|
|
14485
|
+
}
|
|
14486
|
+
// Chart lifecycle methods
|
|
14487
|
+
/**
|
|
14488
|
+
* Creates the line chart SVG and renders all elements
|
|
14489
|
+
*/
|
|
14490
|
+
createChart() {
|
|
14491
|
+
if (!this.d3 || !this.chartContainerEl()?.nativeElement)
|
|
14492
|
+
return;
|
|
14493
|
+
const containerElement = this.chartContainerEl().nativeElement;
|
|
14494
|
+
let data = this.chartData() || [];
|
|
14495
|
+
// Clear existing chart
|
|
14496
|
+
this.d3.select(containerElement).selectAll('svg').remove();
|
|
14497
|
+
// Normalize data structure to array of arrays (multi-series format)
|
|
14498
|
+
let normalizedData = [];
|
|
14499
|
+
// Handle both flat array and array of arrays formats
|
|
14500
|
+
if (data.length > 0) {
|
|
14501
|
+
if (Array.isArray(data[0])) {
|
|
14502
|
+
// Already in multi-series format
|
|
14503
|
+
normalizedData = data;
|
|
14504
|
+
}
|
|
14505
|
+
else {
|
|
14506
|
+
// Single series or flat array with seriesName
|
|
14507
|
+
const dataPoints = data;
|
|
14508
|
+
// Check if this is multi-series data (has seriesName property)
|
|
14509
|
+
const hasSeriesNames = dataPoints.some((d) => d.seriesName !== undefined);
|
|
14510
|
+
if (hasSeriesNames) {
|
|
14511
|
+
// Organize by series name
|
|
14512
|
+
const seriesMap = new Map();
|
|
14513
|
+
dataPoints.forEach((d) => {
|
|
14514
|
+
const seriesName = d.seriesName || 'default';
|
|
14515
|
+
if (!seriesMap.has(seriesName)) {
|
|
14516
|
+
seriesMap.set(seriesName, []);
|
|
14517
|
+
}
|
|
14518
|
+
seriesMap.get(seriesName).push(d);
|
|
14519
|
+
});
|
|
14520
|
+
// Convert to array of arrays
|
|
14521
|
+
normalizedData = Array.from(seriesMap.values());
|
|
14522
|
+
}
|
|
14523
|
+
else {
|
|
14524
|
+
// Single series, wrap it in an array
|
|
14525
|
+
normalizedData = [dataPoints];
|
|
14526
|
+
}
|
|
14527
|
+
}
|
|
14528
|
+
}
|
|
14529
|
+
// Early return if no data
|
|
14530
|
+
if (normalizedData.length === 0 || normalizedData.flat().length === 0) {
|
|
14531
|
+
this.showNoDataMessage(containerElement);
|
|
14532
|
+
return;
|
|
14533
|
+
}
|
|
14534
|
+
// Get options and setup dimensions
|
|
14535
|
+
const options = this.options();
|
|
14536
|
+
this.setupDimensions(containerElement, options);
|
|
14537
|
+
// Flatten data for scale calculation
|
|
14538
|
+
const flatData = normalizedData.flat();
|
|
14539
|
+
// Create scales with the flattened data
|
|
14540
|
+
this.setupScales(flatData);
|
|
14541
|
+
this.createAxes(options);
|
|
14542
|
+
// Render the lines using the structured data (array of arrays)
|
|
14543
|
+
this.renderLines(normalizedData);
|
|
14544
|
+
}
|
|
14545
|
+
updateChart() {
|
|
14546
|
+
this.createChart();
|
|
14547
|
+
}
|
|
14548
|
+
cleanupChart() {
|
|
14549
|
+
if (this.svg) {
|
|
14550
|
+
this.d3.select(this.chartContainerEl()?.nativeElement).selectAll('svg').remove();
|
|
14551
|
+
this.svg = null;
|
|
14552
|
+
this.chart = null;
|
|
14553
|
+
}
|
|
14554
|
+
this._tooltipVisible.set(false);
|
|
14555
|
+
}
|
|
14556
|
+
// Private chart creation methods
|
|
14557
|
+
/**
|
|
14558
|
+
* Sets up chart dimensions and creates SVG with responsive attributes
|
|
14559
|
+
*/
|
|
14560
|
+
setupDimensions(containerElement, options) {
|
|
14561
|
+
// Get container dimensions
|
|
14562
|
+
const containerWidth = containerElement.clientWidth;
|
|
14563
|
+
const containerHeight = containerElement.clientHeight;
|
|
14564
|
+
// If options specify width and height, use those, otherwise default to container size
|
|
14565
|
+
const minDim = Math.min(200, containerWidth, containerHeight); // Ensure reasonable minimum
|
|
14566
|
+
if (options.width && options.height) {
|
|
14567
|
+
// Explicit dimensions provided
|
|
14568
|
+
this.width = options.width - this.margin.left - this.margin.right;
|
|
14569
|
+
this.height = options.height - this.margin.top - this.margin.bottom;
|
|
14570
|
+
}
|
|
14571
|
+
else {
|
|
14572
|
+
// Responsive dimensions
|
|
14573
|
+
this.width = Math.max(containerWidth, minDim) - this.margin.left - this.margin.right;
|
|
14574
|
+
this.height = Math.max(containerHeight, minDim) - this.margin.top - this.margin.bottom;
|
|
14575
|
+
}
|
|
14576
|
+
// Create responsive SVG that scales with its container
|
|
14577
|
+
const svg = this.d3
|
|
14578
|
+
.select(containerElement)
|
|
14579
|
+
.append('svg')
|
|
14580
|
+
.attr('width', '100%')
|
|
14581
|
+
.attr('height', '100%')
|
|
14582
|
+
.attr('viewBox', `0 0 ${this.width + this.margin.left + this.margin.right} ${this.height + this.margin.top + this.margin.bottom}`)
|
|
14583
|
+
.attr('preserveAspectRatio', 'xMidYMid meet');
|
|
14584
|
+
this.svg = svg;
|
|
14585
|
+
// Create chart group with margins
|
|
14586
|
+
this.chart = this.svg.append('g').attr('transform', `translate(${this.margin.left},${this.margin.top})`);
|
|
14587
|
+
}
|
|
14588
|
+
/**
|
|
14589
|
+
* Creates x and y scales for the chart
|
|
14590
|
+
*/
|
|
14591
|
+
setupScales(data) {
|
|
14592
|
+
// Determine x-axis type based on data
|
|
14593
|
+
const allNumericX = data.every((d) => typeof d.xValue === 'number');
|
|
14594
|
+
const allDates = data.every((d) => !isNaN(new Date(d.xValue).getTime()));
|
|
14595
|
+
// Create appropriate x scale based on data type
|
|
14596
|
+
if (allNumericX) {
|
|
14597
|
+
// Numeric x-axis
|
|
14598
|
+
this.xScale = this.d3
|
|
14599
|
+
.scaleLinear()
|
|
14600
|
+
.domain([
|
|
14601
|
+
this.d3.min(data, (d) => d.xValue) || 0,
|
|
14602
|
+
this.d3.max(data, (d) => d.xValue) || 0,
|
|
14603
|
+
])
|
|
14604
|
+
.range([0, this.width]);
|
|
14605
|
+
}
|
|
14606
|
+
else if (allDates) {
|
|
14607
|
+
// Date x-axis
|
|
14608
|
+
this.xScale = this.d3
|
|
14609
|
+
.scaleTime()
|
|
14610
|
+
.domain([
|
|
14611
|
+
this.d3.min(data, (d) => new Date(d.xValue)) || new Date(),
|
|
14612
|
+
this.d3.max(data, (d) => new Date(d.xValue)) || new Date(),
|
|
14613
|
+
])
|
|
14614
|
+
.range([0, this.width]);
|
|
14615
|
+
}
|
|
14616
|
+
else {
|
|
14617
|
+
// Categorical x-axis
|
|
14618
|
+
this.xScale = this.d3
|
|
14619
|
+
.scaleBand()
|
|
14620
|
+
.domain(data.map((d) => d.xValue.toString()))
|
|
14621
|
+
.range([0, this.width])
|
|
14622
|
+
.padding(0.1);
|
|
14623
|
+
}
|
|
14624
|
+
// Create y scale (linear scale for values)
|
|
14625
|
+
this.yScale = this.d3
|
|
14626
|
+
.scaleLinear()
|
|
14627
|
+
.domain([0, this.d3.max(data, (d) => d.value) || 0])
|
|
14628
|
+
.nice()
|
|
14629
|
+
.range([this.height, 0]);
|
|
14630
|
+
}
|
|
14631
|
+
/**
|
|
14632
|
+
* Creates x and y axes with grid lines
|
|
14633
|
+
*/
|
|
14634
|
+
createAxes(options) {
|
|
14635
|
+
// Only create axes if they are enabled in options
|
|
14636
|
+
const showXAxis = options.showXAxis !== false;
|
|
14637
|
+
const showYAxis = options.showYAxis !== false;
|
|
14638
|
+
const showGrid = options.showGrid !== false;
|
|
14639
|
+
if (showXAxis) {
|
|
14640
|
+
// Create X axis
|
|
14641
|
+
this.xAxis = this.chart
|
|
14642
|
+
.append('g')
|
|
14643
|
+
.attr('class', 'axp-line-chart-axis-x')
|
|
14644
|
+
.attr('transform', `translate(0,${this.height})`)
|
|
14645
|
+
.call(this.d3.axisBottom(this.xScale));
|
|
14646
|
+
}
|
|
14647
|
+
if (showYAxis) {
|
|
14648
|
+
// Create Y axis
|
|
14649
|
+
this.yAxis = this.chart.append('g').attr('class', 'axp-line-chart-axis-y').call(this.d3.axisLeft(this.yScale));
|
|
14650
|
+
}
|
|
14651
|
+
if (showGrid) {
|
|
14652
|
+
// Add horizontal grid lines
|
|
14653
|
+
this.chart
|
|
14654
|
+
.append('g')
|
|
14655
|
+
.attr('class', 'axp-line-chart-grid')
|
|
14656
|
+
.call(this.d3
|
|
14657
|
+
.axisLeft(this.yScale)
|
|
14658
|
+
.tickSize(-this.width)
|
|
14659
|
+
.tickFormat(() => ''))
|
|
14660
|
+
.selectAll('.tick')
|
|
14661
|
+
.style('color', 'rgb(153 153 153 / 30%)'); // Add gray color to ticks
|
|
14662
|
+
}
|
|
14663
|
+
}
|
|
14664
|
+
/**
|
|
14665
|
+
* Renders the lines with animations
|
|
14666
|
+
*/
|
|
14667
|
+
renderLines(data) {
|
|
14668
|
+
// Get line options
|
|
14669
|
+
const lineWidth = this.lineWidth();
|
|
14670
|
+
const useSmooth = this.smoothLine();
|
|
14671
|
+
const shouldFill = this.fillArea();
|
|
14672
|
+
const fillOpacity = this.fillOpacity();
|
|
14673
|
+
// Create line generator
|
|
14674
|
+
const getX = (d) => {
|
|
14675
|
+
// Handle different x scale types
|
|
14676
|
+
if (this.xScale.bandwidth) {
|
|
14677
|
+
// band scale for categorical
|
|
14678
|
+
return this.xScale(d.xValue.toString()) + this.xScale.bandwidth() / 2;
|
|
14679
|
+
}
|
|
14680
|
+
else {
|
|
14681
|
+
// linear or time scale
|
|
14682
|
+
return this.xScale(d.xValue);
|
|
14683
|
+
}
|
|
14684
|
+
};
|
|
14685
|
+
// Define line generator function
|
|
14686
|
+
const lineGenerator = useSmooth
|
|
14687
|
+
? this.d3
|
|
14688
|
+
.line()
|
|
14689
|
+
.x(getX)
|
|
14690
|
+
.y((d) => this.yScale(d.value))
|
|
14691
|
+
.curve(this.d3.curveMonotoneX) // Smooth curve
|
|
14692
|
+
: this.d3
|
|
14693
|
+
.line()
|
|
14694
|
+
.x(getX)
|
|
14695
|
+
.y((d) => this.yScale(d.value))
|
|
14696
|
+
.curve(this.d3.curveLinear); // Straight lines
|
|
14697
|
+
// Define area generator if we should fill
|
|
14698
|
+
const areaGenerator = useSmooth
|
|
14699
|
+
? this.d3
|
|
14700
|
+
.area()
|
|
14701
|
+
.x(getX)
|
|
14702
|
+
.y0(this.height)
|
|
14703
|
+
.y1((d) => this.yScale(d.value))
|
|
14704
|
+
.curve(this.d3.curveMonotoneX)
|
|
14705
|
+
: this.d3
|
|
14706
|
+
.area()
|
|
14707
|
+
.x(getX)
|
|
14708
|
+
.y0(this.height)
|
|
14709
|
+
.y1((d) => this.yScale(d.value))
|
|
14710
|
+
.curve(this.d3.curveLinear);
|
|
14711
|
+
// Render each series
|
|
14712
|
+
data.forEach((seriesData, seriesIndex) => {
|
|
14713
|
+
// Skip empty series
|
|
14714
|
+
if (!seriesData.length)
|
|
14715
|
+
return;
|
|
14716
|
+
// Sort data within series by x value
|
|
14717
|
+
seriesData.sort((a, b) => {
|
|
14718
|
+
if (typeof a.xValue === 'number' && typeof b.xValue === 'number') {
|
|
14719
|
+
return a.xValue - b.xValue;
|
|
14720
|
+
}
|
|
14721
|
+
else {
|
|
14722
|
+
return a.xValue.toString().localeCompare(b.xValue.toString());
|
|
14723
|
+
}
|
|
14724
|
+
});
|
|
14725
|
+
// Get series name and color
|
|
14726
|
+
const seriesName = seriesData[0].seriesName || `Series ${seriesIndex + 1}`;
|
|
14727
|
+
// Get color for this series - prefer the color from data point, otherwise use palette
|
|
14728
|
+
const seriesColor = seriesData[0]?.color || AXPChartColors.getColor(seriesIndex);
|
|
14729
|
+
// Draw the area if fill is enabled
|
|
14730
|
+
if (shouldFill) {
|
|
14731
|
+
this.chart
|
|
14732
|
+
.append('path')
|
|
14733
|
+
.datum(seriesData)
|
|
14734
|
+
.attr('class', 'axp-line-chart-area')
|
|
14735
|
+
.attr('fill', seriesColor)
|
|
14736
|
+
.attr('fill-opacity', fillOpacity)
|
|
14737
|
+
.attr('d', areaGenerator);
|
|
14738
|
+
}
|
|
14739
|
+
// Draw the line with animation
|
|
14740
|
+
const path = this.chart
|
|
14741
|
+
.append('path')
|
|
14742
|
+
.datum(seriesData)
|
|
14743
|
+
.attr('class', 'axp-line-chart-line')
|
|
14744
|
+
.attr('stroke', seriesColor)
|
|
14745
|
+
.attr('stroke-width', lineWidth)
|
|
14746
|
+
.attr('fill', 'none') // Ensure no fill on the line
|
|
14747
|
+
.attr('d', lineGenerator);
|
|
14748
|
+
// Animate the line drawing
|
|
14749
|
+
const pathLength = path.node().getTotalLength();
|
|
14750
|
+
path
|
|
14751
|
+
.attr('stroke-dasharray', pathLength)
|
|
14752
|
+
.attr('stroke-dashoffset', pathLength)
|
|
14753
|
+
.transition()
|
|
14754
|
+
.duration(1000)
|
|
14755
|
+
.attr('stroke-dashoffset', 0)
|
|
14756
|
+
.ease(this.d3.easeQuadOut);
|
|
14757
|
+
// Add data points if enabled
|
|
14758
|
+
if (this.showPoints()) {
|
|
14759
|
+
this.chart
|
|
14760
|
+
.selectAll(`.axp-line-chart-point-${seriesIndex}`)
|
|
14761
|
+
.data(seriesData)
|
|
14762
|
+
.enter()
|
|
14763
|
+
.append('circle')
|
|
14764
|
+
.attr('class', `axp-line-chart-point axp-line-chart-point-${seriesIndex}`)
|
|
14765
|
+
.attr('cx', (d) => getX(d))
|
|
14766
|
+
.attr('cy', (d) => this.yScale(d.value))
|
|
14767
|
+
.attr('r', 0) // Start with radius 0 for animation
|
|
14768
|
+
.attr('fill', seriesColor)
|
|
14769
|
+
.attr('stroke', 'white')
|
|
14770
|
+
.attr('stroke-width', 1)
|
|
14771
|
+
.on('mouseenter', (event, d) => this.handlePointHover(event, d, seriesName))
|
|
14772
|
+
.on('mousemove', (event) => this.updateTooltipPosition(event))
|
|
14773
|
+
.on('mouseleave', () => this._tooltipVisible.set(false))
|
|
14774
|
+
.on('click', (event, d) => this.handlePointClick(event, d))
|
|
14775
|
+
.transition()
|
|
14776
|
+
.delay((d, i) => i * 50 + 300) // Stagger with delay after line animation
|
|
14777
|
+
.duration(300)
|
|
14778
|
+
.attr('r', this.pointRadius())
|
|
14779
|
+
.ease(this.d3.easeBackOut); // Bouncy animation
|
|
14780
|
+
}
|
|
14781
|
+
});
|
|
14782
|
+
}
|
|
14783
|
+
// Event handlers
|
|
14784
|
+
/**
|
|
14785
|
+
* Handles point hover event and shows tooltip
|
|
14786
|
+
*/
|
|
14787
|
+
handlePointHover(event, datum, seriesName) {
|
|
14788
|
+
if (this.options().showTooltip !== false) {
|
|
14789
|
+
const data = this.chartData();
|
|
14790
|
+
let index = 0;
|
|
14791
|
+
// Find index based on data structure
|
|
14792
|
+
if (Array.isArray(data)) {
|
|
14793
|
+
if (Array.isArray(data[0])) {
|
|
14794
|
+
// Multi-series data (array of arrays)
|
|
14795
|
+
const flatData = data.flat();
|
|
14796
|
+
index = flatData.findIndex((item) => item.id === datum.id);
|
|
14797
|
+
}
|
|
14798
|
+
else {
|
|
14799
|
+
// Single series (array of data points)
|
|
14800
|
+
index = data.findIndex((item) => item.id === datum.id);
|
|
14801
|
+
}
|
|
14802
|
+
}
|
|
14803
|
+
const color = datum.color || AXPChartColors.getColor(index);
|
|
14804
|
+
// Update tooltip data
|
|
14805
|
+
this._tooltipData.set({
|
|
14806
|
+
title: datum.label || seriesName,
|
|
14807
|
+
value: datum.value.toString(),
|
|
14808
|
+
percentage: '', // Not showing percentage for line charts
|
|
14809
|
+
color,
|
|
14810
|
+
});
|
|
14811
|
+
// Position tooltip near the point
|
|
14812
|
+
this.updateTooltipPosition(event);
|
|
14813
|
+
this._tooltipVisible.set(true);
|
|
14814
|
+
}
|
|
14815
|
+
}
|
|
14816
|
+
/**
|
|
14817
|
+
* Updates tooltip position based on mouse coordinates
|
|
14818
|
+
*/
|
|
14819
|
+
updateTooltipPosition(event) {
|
|
14820
|
+
const rect = event.target.getBoundingClientRect();
|
|
14821
|
+
const containerRect = this.chartContainerEl().nativeElement.getBoundingClientRect();
|
|
14822
|
+
// Position relative to the container
|
|
14823
|
+
const x = event.clientX - containerRect.left;
|
|
14824
|
+
const y = event.clientY - containerRect.top;
|
|
14825
|
+
this._tooltipPosition.set({ x, y });
|
|
14826
|
+
}
|
|
14827
|
+
/**
|
|
14828
|
+
* Handles point click event
|
|
14829
|
+
*/
|
|
14830
|
+
handlePointClick(event, datum) {
|
|
14831
|
+
// Emit click event with the data point
|
|
14832
|
+
this.pointClick.emit(datum);
|
|
14833
|
+
}
|
|
14834
|
+
/**
|
|
14835
|
+
* Shows a message when no data is available
|
|
14836
|
+
*/
|
|
14837
|
+
showNoDataMessage(containerElement) {
|
|
14838
|
+
const noDataDiv = this.d3.select(containerElement).append('div').attr('class', 'axp-line-chart-no-data-message');
|
|
14839
|
+
noDataDiv
|
|
14840
|
+
.append('div')
|
|
14841
|
+
.attr('class', 'axp-line-chart-no-data-icon')
|
|
14842
|
+
.html('<i class="fa-light fa-chart-line fa-3x"></i>');
|
|
14843
|
+
noDataDiv.append('div').attr('class', 'axp-line-chart-no-data-text').text('No data available');
|
|
14844
|
+
}
|
|
14845
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: AXPLineChartWidgetViewComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
14846
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "19.0.3", type: AXPLineChartWidgetViewComponent, isStandalone: true, selector: "ng-component", outputs: { pointClick: "pointClick" }, viewQueries: [{ propertyName: "chartContainerEl", first: true, predicate: ["chartContainer"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"axp-line-chart\" #chartContainer>\n <!-- Shared tooltip component -->\n <ax-chart-tooltip\n [visible]=\"tooltipVisible()\"\n [position]=\"tooltipPosition()\"\n [data]=\"tooltipData()\"\n [showPercentage]=\"false\"\n ></ax-chart-tooltip>\n</div>\n", styles: [":host{display:block;width:100%;height:100%;min-height:200px}.axp-line-chart{width:100%;height:100%;position:relative;display:flex;align-items:center;justify-content:center;border-radius:.5rem;overflow:hidden}.axp-line-chart svg{width:100%;height:100%;max-width:100%;max-height:100%;overflow:visible}.axp-line-chart-line{fill:none;stroke-width:2px;stroke-linejoin:round;stroke-linecap:round;transition:stroke-width .3s ease}.axp-line-chart-line:hover{stroke-width:3px}.axp-line-chart-area{opacity:.2;transition:opacity .3s ease}.axp-line-chart-area:hover{opacity:.3}.axp-line-chart-point{cursor:pointer;transition:all .3s cubic-bezier(.4,0,.2,1)}.axp-line-chart-point:hover{r:6;stroke-width:2;stroke:var(--ax-background-color, #fff)}.axp-line-chart-axis-x path,.axp-line-chart-axis-y path{stroke:var(--ax-border-color, #e0e0e0)}.axp-line-chart-axis-x line,.axp-line-chart-axis-y line,.axp-line-chart-grid line{stroke:var(--ax-border-color, #e0e0e0);stroke-dasharray:2,2;stroke-opacity:.5}.axp-line-chart-grid path{stroke-width:0}.axp-line-chart-axis-x text,.axp-line-chart-axis-y text{fill:var(--ax-text-muted, #666);font-size:clamp(8px,2vmin,12px)}.axp-line-chart-no-data-message{font-family:var(--ax-font-family, system-ui, sans-serif);display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:1rem;width:100%;height:100%}.axp-line-chart-no-data-icon{margin-bottom:.75rem;color:var(--ax-text-muted, #999)}.axp-line-chart-no-data-text{font-weight:600;color:var(--ax-text-color, #333)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: AXPChartTooltipComponent, selector: "ax-chart-tooltip", inputs: ["data", "position", "visible", "showPercentage", "style"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
14847
|
+
}
|
|
14848
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: AXPLineChartWidgetViewComponent, decorators: [{
|
|
14849
|
+
type: Component,
|
|
14850
|
+
args: [{ standalone: true, imports: [CommonModule, AXPChartTooltipComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"axp-line-chart\" #chartContainer>\n <!-- Shared tooltip component -->\n <ax-chart-tooltip\n [visible]=\"tooltipVisible()\"\n [position]=\"tooltipPosition()\"\n [data]=\"tooltipData()\"\n [showPercentage]=\"false\"\n ></ax-chart-tooltip>\n</div>\n", styles: [":host{display:block;width:100%;height:100%;min-height:200px}.axp-line-chart{width:100%;height:100%;position:relative;display:flex;align-items:center;justify-content:center;border-radius:.5rem;overflow:hidden}.axp-line-chart svg{width:100%;height:100%;max-width:100%;max-height:100%;overflow:visible}.axp-line-chart-line{fill:none;stroke-width:2px;stroke-linejoin:round;stroke-linecap:round;transition:stroke-width .3s ease}.axp-line-chart-line:hover{stroke-width:3px}.axp-line-chart-area{opacity:.2;transition:opacity .3s ease}.axp-line-chart-area:hover{opacity:.3}.axp-line-chart-point{cursor:pointer;transition:all .3s cubic-bezier(.4,0,.2,1)}.axp-line-chart-point:hover{r:6;stroke-width:2;stroke:var(--ax-background-color, #fff)}.axp-line-chart-axis-x path,.axp-line-chart-axis-y path{stroke:var(--ax-border-color, #e0e0e0)}.axp-line-chart-axis-x line,.axp-line-chart-axis-y line,.axp-line-chart-grid line{stroke:var(--ax-border-color, #e0e0e0);stroke-dasharray:2,2;stroke-opacity:.5}.axp-line-chart-grid path{stroke-width:0}.axp-line-chart-axis-x text,.axp-line-chart-axis-y text{fill:var(--ax-text-muted, #666);font-size:clamp(8px,2vmin,12px)}.axp-line-chart-no-data-message{font-family:var(--ax-font-family, system-ui, sans-serif);display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:1rem;width:100%;height:100%}.axp-line-chart-no-data-icon{margin-bottom:.75rem;color:var(--ax-text-muted, #999)}.axp-line-chart-no-data-text{font-weight:600;color:var(--ax-text-color, #333)}\n"] }]
|
|
14851
|
+
}] });
|
|
14852
|
+
|
|
14853
|
+
var lineChartWidget_component = /*#__PURE__*/Object.freeze({
|
|
14854
|
+
__proto__: null,
|
|
14855
|
+
AXPLineChartWidgetViewComponent: AXPLineChartWidgetViewComponent
|
|
14856
|
+
});
|
|
14857
|
+
|
|
14858
|
+
const AXPLineChartWidget = {
|
|
14859
|
+
name: 'line-chart',
|
|
14860
|
+
title: 'Line Chart Widget',
|
|
14861
|
+
categories: [AXP_WIDGETS_CHART_CATEGORY],
|
|
14862
|
+
groups: [AXPWidgetGroupEnum.DashboardWidget],
|
|
14863
|
+
type: 'dashboard',
|
|
14864
|
+
icon: 'fa-light fa-chart-line',
|
|
14865
|
+
properties: [
|
|
14866
|
+
// ====== Layout & Dimensions ======
|
|
14867
|
+
{
|
|
14868
|
+
name: 'height',
|
|
14869
|
+
title: 'Height',
|
|
14870
|
+
group: AXP_STYLING_PROPERTY_GROUP,
|
|
14871
|
+
schema: {
|
|
14872
|
+
defaultValue: 300,
|
|
14873
|
+
dataType: 'number',
|
|
14874
|
+
interface: {
|
|
14875
|
+
name: 'height',
|
|
14876
|
+
path: 'options.height',
|
|
14877
|
+
type: AXPWidgetsCatalog.number,
|
|
14878
|
+
options: {
|
|
14879
|
+
minValue: 0,
|
|
14880
|
+
maxValue: 800,
|
|
14881
|
+
},
|
|
14882
|
+
},
|
|
14883
|
+
},
|
|
14884
|
+
visible: true,
|
|
14885
|
+
},
|
|
14886
|
+
{
|
|
14887
|
+
name: 'width',
|
|
14888
|
+
title: 'Width',
|
|
14889
|
+
group: AXP_STYLING_PROPERTY_GROUP,
|
|
14890
|
+
schema: {
|
|
14891
|
+
defaultValue: null,
|
|
14892
|
+
dataType: 'number',
|
|
14893
|
+
interface: {
|
|
14894
|
+
name: 'width',
|
|
14895
|
+
path: 'options.width',
|
|
14896
|
+
type: AXPWidgetsCatalog.number,
|
|
14897
|
+
options: {
|
|
14898
|
+
minValue: 0,
|
|
14899
|
+
maxValue: 1200,
|
|
14900
|
+
},
|
|
14901
|
+
},
|
|
14902
|
+
},
|
|
14903
|
+
visible: true,
|
|
14904
|
+
},
|
|
14905
|
+
// ====== Axis Settings ======
|
|
14906
|
+
{
|
|
14907
|
+
name: 'showXAxis',
|
|
14908
|
+
title: 'Show X Axis',
|
|
14909
|
+
group: AXP_APPEARANCE_PROPERTY_GROUP,
|
|
14910
|
+
schema: {
|
|
14911
|
+
defaultValue: true,
|
|
14912
|
+
dataType: 'boolean',
|
|
14913
|
+
interface: {
|
|
14914
|
+
name: 'showXAxis',
|
|
14915
|
+
path: 'options.showXAxis',
|
|
14916
|
+
type: AXPWidgetsCatalog.toggle,
|
|
14917
|
+
},
|
|
14918
|
+
},
|
|
14919
|
+
visible: true,
|
|
14920
|
+
},
|
|
14921
|
+
{
|
|
14922
|
+
name: 'showYAxis',
|
|
14923
|
+
title: 'Show Y Axis',
|
|
14924
|
+
group: AXP_APPEARANCE_PROPERTY_GROUP,
|
|
14925
|
+
schema: {
|
|
14926
|
+
defaultValue: true,
|
|
14927
|
+
dataType: 'boolean',
|
|
14928
|
+
interface: {
|
|
14929
|
+
name: 'showYAxis',
|
|
14930
|
+
path: 'options.showYAxis',
|
|
14931
|
+
type: AXPWidgetsCatalog.toggle,
|
|
14932
|
+
},
|
|
14933
|
+
},
|
|
14934
|
+
visible: true,
|
|
14935
|
+
},
|
|
14936
|
+
{
|
|
14937
|
+
name: 'showGrid',
|
|
14938
|
+
title: 'Show Grid Lines',
|
|
14939
|
+
group: AXP_APPEARANCE_PROPERTY_GROUP,
|
|
14940
|
+
schema: {
|
|
14941
|
+
defaultValue: true,
|
|
14942
|
+
dataType: 'boolean',
|
|
14943
|
+
interface: {
|
|
14944
|
+
name: 'showGrid',
|
|
14945
|
+
path: 'options.showGrid',
|
|
14946
|
+
type: AXPWidgetsCatalog.toggle,
|
|
14947
|
+
},
|
|
14948
|
+
},
|
|
14949
|
+
visible: true,
|
|
14950
|
+
},
|
|
14951
|
+
// ====== Tooltip Settings ======
|
|
14952
|
+
{
|
|
14953
|
+
name: 'showTooltip',
|
|
14954
|
+
title: 'Show Tooltip',
|
|
14955
|
+
group: AXP_APPEARANCE_PROPERTY_GROUP,
|
|
14956
|
+
schema: {
|
|
14957
|
+
defaultValue: true,
|
|
14958
|
+
dataType: 'boolean',
|
|
14959
|
+
interface: {
|
|
14960
|
+
name: 'showTooltip',
|
|
14961
|
+
path: 'options.showTooltip',
|
|
14962
|
+
type: AXPWidgetsCatalog.toggle,
|
|
14963
|
+
},
|
|
14964
|
+
},
|
|
14965
|
+
visible: true,
|
|
14966
|
+
},
|
|
14967
|
+
// ====== Line Appearance ======
|
|
14968
|
+
{
|
|
14969
|
+
name: 'lineWidth',
|
|
14970
|
+
title: 'Line Width',
|
|
14971
|
+
group: AXP_APPEARANCE_PROPERTY_GROUP,
|
|
14972
|
+
schema: {
|
|
14973
|
+
defaultValue: 2,
|
|
14974
|
+
dataType: 'number',
|
|
14975
|
+
interface: {
|
|
14976
|
+
name: 'lineWidth',
|
|
14977
|
+
path: 'options.lineWidth',
|
|
14978
|
+
type: AXPWidgetsCatalog.number,
|
|
14979
|
+
options: {
|
|
14980
|
+
placeholder: '1-10',
|
|
14981
|
+
minValue: 1,
|
|
14982
|
+
maxValue: 10,
|
|
14983
|
+
},
|
|
14984
|
+
},
|
|
14985
|
+
},
|
|
14986
|
+
visible: true,
|
|
14987
|
+
},
|
|
14988
|
+
{
|
|
14989
|
+
name: 'showPoints',
|
|
14990
|
+
title: 'Show Points',
|
|
14991
|
+
group: AXP_APPEARANCE_PROPERTY_GROUP,
|
|
14992
|
+
schema: {
|
|
14993
|
+
defaultValue: true,
|
|
14994
|
+
dataType: 'boolean',
|
|
14995
|
+
interface: {
|
|
14996
|
+
name: 'showPoints',
|
|
14997
|
+
path: 'options.showPoints',
|
|
14998
|
+
type: AXPWidgetsCatalog.toggle,
|
|
14999
|
+
},
|
|
15000
|
+
},
|
|
15001
|
+
visible: true,
|
|
15002
|
+
},
|
|
15003
|
+
{
|
|
15004
|
+
name: 'pointRadius',
|
|
15005
|
+
title: 'Point Size',
|
|
15006
|
+
group: AXP_APPEARANCE_PROPERTY_GROUP,
|
|
15007
|
+
schema: {
|
|
15008
|
+
defaultValue: 4,
|
|
15009
|
+
dataType: 'number',
|
|
15010
|
+
interface: {
|
|
15011
|
+
name: 'pointRadius',
|
|
15012
|
+
path: 'options.pointRadius',
|
|
15013
|
+
type: AXPWidgetsCatalog.number,
|
|
15014
|
+
options: {
|
|
15015
|
+
placeholder: '1-10',
|
|
15016
|
+
minValue: 1,
|
|
15017
|
+
maxValue: 10,
|
|
15018
|
+
},
|
|
15019
|
+
},
|
|
15020
|
+
},
|
|
15021
|
+
visible: true,
|
|
15022
|
+
},
|
|
15023
|
+
{
|
|
15024
|
+
name: 'smoothLine',
|
|
15025
|
+
title: 'Smooth Line',
|
|
15026
|
+
group: AXP_APPEARANCE_PROPERTY_GROUP,
|
|
15027
|
+
schema: {
|
|
15028
|
+
defaultValue: true,
|
|
15029
|
+
dataType: 'boolean',
|
|
15030
|
+
interface: {
|
|
15031
|
+
name: 'smoothLine',
|
|
15032
|
+
path: 'options.smoothLine',
|
|
15033
|
+
type: AXPWidgetsCatalog.toggle,
|
|
15034
|
+
},
|
|
15035
|
+
},
|
|
15036
|
+
visible: true,
|
|
15037
|
+
},
|
|
15038
|
+
{
|
|
15039
|
+
name: 'fillArea',
|
|
15040
|
+
title: 'Fill Area',
|
|
15041
|
+
group: AXP_APPEARANCE_PROPERTY_GROUP,
|
|
15042
|
+
schema: {
|
|
15043
|
+
defaultValue: false,
|
|
15044
|
+
dataType: 'boolean',
|
|
15045
|
+
interface: {
|
|
15046
|
+
name: 'fillArea',
|
|
15047
|
+
path: 'options.fillArea',
|
|
15048
|
+
type: AXPWidgetsCatalog.toggle,
|
|
15049
|
+
},
|
|
15050
|
+
},
|
|
15051
|
+
visible: true,
|
|
15052
|
+
},
|
|
15053
|
+
{
|
|
15054
|
+
name: 'fillOpacity',
|
|
15055
|
+
title: 'Fill Opacity',
|
|
15056
|
+
group: AXP_APPEARANCE_PROPERTY_GROUP,
|
|
15057
|
+
schema: {
|
|
15058
|
+
defaultValue: 10,
|
|
15059
|
+
dataType: 'number',
|
|
15060
|
+
interface: {
|
|
15061
|
+
name: 'fillOpacity',
|
|
15062
|
+
path: 'options.fillOpacity',
|
|
15063
|
+
type: AXPWidgetsCatalog.number,
|
|
15064
|
+
options: {
|
|
15065
|
+
placeholder: '0-100',
|
|
15066
|
+
minValue: 0,
|
|
15067
|
+
maxValue: 100,
|
|
15068
|
+
},
|
|
15069
|
+
},
|
|
15070
|
+
},
|
|
15071
|
+
visible: true,
|
|
15072
|
+
},
|
|
15073
|
+
],
|
|
15074
|
+
components: {
|
|
15075
|
+
view: {
|
|
15076
|
+
component: () => Promise.resolve().then(function () { return lineChartWidget_component; }).then((c) => c.AXPLineChartWidgetViewComponent),
|
|
15077
|
+
},
|
|
15078
|
+
},
|
|
15079
|
+
meta: {
|
|
15080
|
+
dimensions: {
|
|
15081
|
+
width: 5,
|
|
15082
|
+
height: 6,
|
|
15083
|
+
minWidth: 2,
|
|
15084
|
+
minHeight: 2,
|
|
15085
|
+
maxWidth: 6,
|
|
15086
|
+
maxHeight: 7,
|
|
15087
|
+
},
|
|
15088
|
+
},
|
|
15089
|
+
};
|
|
15090
|
+
|
|
14403
15091
|
/**
|
|
14404
15092
|
* Notification Widget Component
|
|
14405
15093
|
* Displays notifications in a card with tabs
|
|
@@ -14530,7 +15218,7 @@ class AXPNotificationWidgetViewComponent extends AXPValueWidgetComponent {
|
|
|
14530
15218
|
return Math.floor(diffMs / (1000 * 60 * 60 * 24));
|
|
14531
15219
|
}
|
|
14532
15220
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: AXPNotificationWidgetViewComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
14533
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.3", type: AXPNotificationWidgetViewComponent, isStandalone: true, selector: "ng-component", outputs: { notificationClick: "notificationClick", markAsRead: "markAsRead" }, providers: [DatePipe], usesInheritance: true, ngImport: i0, template: "<div class=\"ax-p-4 ax-size-full\">\n <ax-tabs\n class=\"ax-bg-light-start ax-border-b ax-border-default\"\n [fitParent]=\"true\"\n location=\"bottom\"\n (onActiveTabChanged)=\"handleTabChange($event)\"\n >\n <ax-tab-item [text]=\"('widget.notification.new' | translate | async) ?? 'New'\" class=\"ax-font-medium\">\n <ax-suffix>\n @if (getNewMessageCount() > 0) {\n <ax-badge color=\"primary\" [text]=\"getNewMessageCount().toString()\" size=\"sm\" class=\"ax-ml-1\"></ax-badge>\n }\n </ax-suffix>\n </ax-tab-item>\n <ax-tab-item [text]=\"('widget.notification.all' | translate | async) ?? 'All'\" class=\"ax-font-medium\"></ax-tab-item>\n </ax-tabs>\n <div class=\"ax-space-y-4 ax-mt-4 ax-px-2\">\n @for (item of notificationItems(); track item.id) {\n <ng-container [ngTemplateOutlet]=\"chatItemTemplateRef\" [ngTemplateOutletContext]=\"{ $implicit: item }\">\n </ng-container>\n } @empty {\n <div class=\"ax-flex ax-flex-col ax-items-center ax-justify-center ax-py-12 ax-px-4 ax-text-gray-400\">\n <ax-icon class=\"ax-text-4xl ax-mb-3 ax-text-gray-300\">\n <i class=\"fa-light fa-bell-slash\"></i>\n </ax-icon>\n <p class=\"ax-text-center\">{{ 'widget.notification.noNotifications' | translate | async }}</p>\n </div>\n }\n </div>\n</div>\n\n<ng-template #chatItemTemplateRef let-data>\n <div class=\"ax-flex ax-gap-3\">\n @if(showAvatar()){\n <div class=\"ax-rounded-full ax-size-10\">\n <ax-avatar shape=\"rounded\" class=\"ax-shrink-0\" [size]=\"40\">\n @if(data.user?.image){\n <ax-image\n [src]=\"data.user.image\"\n [alt]=\"data.user?.name || ('widget.notification.user' | translate | async)\"\n ></ax-image>\n } @else {\n <ax-icon>\n <i class=\"fa-light fa-user\"></i>\n </ax-icon>\n }\n </ax-avatar>\n </div>\n }\n <div class=\"ax-overflow-hidden ax-grow ax-text-start\">\n <h6 class=\"ax-pb-2 ax-font-semibold ax-truncate\">{{ data.user?.name || data.title }}</h6>\n <p class=\"ax-text-xs ax-truncate\">{{ data.body }}</p>\n </div>\n @if(showDate()){\n <div class=\"ax-text-xs ax-shrink-0\">\n <span>\n {{ formatTime(data.createdAt) }}\n </span>\n </div>\n }\n </div>\n</ng-template>\n", styles: [":host{display:block;width:100%;height:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: AXTabsModule }, { kind: "component", type: i4$1.AXTabsComponent, selector: "ax-tabs", inputs: ["look", "location", "fitParent", "minWidth", "content"], outputs: ["onActiveTabChanged"] }, { kind: "component", type: i4$1.AXTabItemComponent, selector: "ax-tab-item", inputs: ["disabled", "text", "key", "headerTemplate", "active"], outputs: ["disabledChange", "onClick", "onBlur", "onFocus", "activeChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i3.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: AXButtonModule }, { kind: "ngmodule", type: AXBadgeModule }, { kind: "component", type: i1$2.AXBadgeComponent, selector: "ax-badge", inputs: ["color", "look", "text"] }, { kind: "ngmodule", type: AXAvatarModule }, { kind: "component", type: i5$4.AXAvatarComponent, selector: "ax-avatar", inputs: ["color", "size", "shape", "look"], outputs: ["sizeChange"] }, { kind: "ngmodule", type: AXImageModule }, { kind: "component", type: i2$7.AXImageComponent, selector: "ax-image", inputs: ["overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i5$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
15221
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.3", type: AXPNotificationWidgetViewComponent, isStandalone: true, selector: "ng-component", outputs: { notificationClick: "notificationClick", markAsRead: "markAsRead" }, providers: [DatePipe], usesInheritance: true, ngImport: i0, template: "<div class=\"ax-p-4 ax-size-full\">\n <ax-tabs\n class=\"ax-bg-light-start ax-border-b ax-border-default\"\n [fitParent]=\"true\"\n location=\"bottom\"\n (onActiveTabChanged)=\"handleTabChange($event)\"\n >\n <ax-tab-item [text]=\"('widget.notification.new' | translate | async) ?? 'New'\" class=\"ax-font-medium\">\n <ax-suffix>\n @if (getNewMessageCount() > 0) {\n <ax-badge color=\"primary\" [text]=\"getNewMessageCount().toString()\" size=\"sm\" class=\"ax-ml-1\"></ax-badge>\n }\n </ax-suffix>\n </ax-tab-item>\n <ax-tab-item [text]=\"('widget.notification.all' | translate | async) ?? 'All'\" class=\"ax-font-medium\"></ax-tab-item>\n </ax-tabs>\n <div class=\"ax-space-y-4 ax-mt-4 ax-px-2\">\n @for (item of notificationItems(); track item.id) {\n <ng-container [ngTemplateOutlet]=\"chatItemTemplateRef\" [ngTemplateOutletContext]=\"{ $implicit: item }\">\n </ng-container>\n } @empty {\n <div class=\"ax-flex ax-flex-col ax-items-center ax-justify-center ax-py-12 ax-px-4 ax-text-gray-400\">\n <ax-icon class=\"ax-text-4xl ax-mb-3 ax-text-gray-300\">\n <i class=\"fa-light fa-bell-slash\"></i>\n </ax-icon>\n <p class=\"ax-text-center\">{{ 'widget.notification.noNotifications' | translate | async }}</p>\n </div>\n }\n </div>\n</div>\n\n<ng-template #chatItemTemplateRef let-data>\n <div class=\"ax-flex ax-gap-3\">\n @if(showAvatar()){\n <div class=\"ax-rounded-full ax-size-10\">\n <ax-avatar shape=\"rounded\" class=\"ax-shrink-0\" [size]=\"40\">\n @if(data.user?.image){\n <ax-image\n [src]=\"data.user.image\"\n [alt]=\"data.user?.name || ('widget.notification.user' | translate | async)\"\n ></ax-image>\n } @else {\n <ax-icon>\n <i class=\"fa-light fa-user\"></i>\n </ax-icon>\n }\n </ax-avatar>\n </div>\n }\n <div class=\"ax-overflow-hidden ax-grow ax-text-start\">\n <h6 class=\"ax-pb-2 ax-font-semibold ax-truncate\">{{ data.user?.name || data.title }}</h6>\n <p class=\"ax-text-xs ax-truncate\">{{ data.body }}</p>\n </div>\n @if(showDate()){\n <div class=\"ax-text-xs ax-shrink-0\">\n <span>\n {{ formatTime(data.createdAt) }}\n </span>\n </div>\n }\n </div>\n</ng-template>\n", styles: [":host{display:block;width:100%;height:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: AXTabsModule }, { kind: "component", type: i4$1.AXTabsComponent, selector: "ax-tabs", inputs: ["look", "location", "fitParent", "minWidth", "content"], outputs: ["onActiveTabChanged"] }, { kind: "component", type: i4$1.AXTabItemComponent, selector: "ax-tab-item", inputs: ["disabled", "text", "key", "headerTemplate", "active"], outputs: ["disabledChange", "onClick", "onBlur", "onFocus", "activeChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i3.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: AXButtonModule }, { kind: "ngmodule", type: AXBadgeModule }, { kind: "component", type: i1$2.AXBadgeComponent, selector: "ax-badge", inputs: ["color", "look", "text"] }, { kind: "ngmodule", type: AXAvatarModule }, { kind: "component", type: i5$4.AXAvatarComponent, selector: "ax-avatar", inputs: ["color", "size", "shape", "look"], outputs: ["sizeChange"] }, { kind: "ngmodule", type: AXImageModule }, { kind: "component", type: i2$7.AXImageComponent, selector: "ax-image", inputs: ["width", "height", "overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i5$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
14534
15222
|
}
|
|
14535
15223
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: AXPNotificationWidgetViewComponent, decorators: [{
|
|
14536
15224
|
type: Component,
|
|
@@ -14689,7 +15377,7 @@ class AXPStickyNoteWidgetViewComponent extends AXPValueWidgetComponent {
|
|
|
14689
15377
|
provide: AXGridLayoutWidgetComponent,
|
|
14690
15378
|
useExisting: AXPStickyNoteWidgetViewComponent,
|
|
14691
15379
|
},
|
|
14692
|
-
], viewQueries: [{ propertyName: "wysiwyg", first: true, predicate: ["wysiwyg"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div\n class=\"sticky-note-container ax-size-full ax-rounded-lg ax-flex ax-flex-col ax-p-4 ax-shadow-md ax-transition-all ax-duration-300 hover:ax-shadow-lg\"\n [style.background-color]=\"bgColor()\"\n [style.color]=\"color()\"\n [class.ax-shadow-lg]=\"isEditing()\"\n [class.ax-scale-[1.02]]=\"isEditing()\"\n (dblclick)=\"activateEdit()\"\n>\n <!-- Header with timestamp -->\n <div class=\"ax-flex ax-justify-between ax-items-center ax-mb-3\">\n <div class=\"ax-text-xs ax-opacity-70 ax-font-medium ax-flex ax-items-center ax-gap-1\">\n <i class=\"fa-regular fa-clock ax-text-[0.65rem]\"></i>\n {{ date() | format : 'datetime' : 'dd MMM, YY HH:mm' | async }}\n </div>\n </div>\n\n <!-- Content area -->\n <div class=\"ax-flex-1 ax-overflow-auto\">\n <ax-wysiwyg-container\n #wysiwyg\n [class]=\"
|
|
15380
|
+
], viewQueries: [{ propertyName: "wysiwyg", first: true, predicate: ["wysiwyg"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div\n class=\"sticky-note-container ax-size-full ax-rounded-lg ax-flex ax-flex-col ax-p-4 ax-shadow-md ax-transition-all ax-duration-300 hover:ax-shadow-lg\"\n [style.background-color]=\"bgColor()\"\n [style.color]=\"color()\"\n [class.ax-shadow-lg]=\"isEditing()\"\n [class.ax-scale-[1.02]]=\"isEditing()\"\n (dblclick)=\"activateEdit()\"\n>\n <!-- Header with timestamp -->\n <div class=\"ax-flex ax-justify-between ax-items-center ax-mb-3\">\n <div class=\"ax-text-xs ax-opacity-70 ax-font-medium ax-flex ax-items-center ax-gap-1\">\n <i class=\"fa-regular fa-clock ax-text-[0.65rem]\"></i>\n {{ date() | format : 'datetime' : 'dd MMM, YY HH:mm' | async }}\n </div>\n </div>\n\n <!-- Content area -->\n <div class=\"ax-flex-1 ax-overflow-auto\">\n <ax-wysiwyg-container\n #wysiwyg\n [class]=\"isEditing() ? 'ax-pointer-events-auto ax-cursor-text' : 'ax-pointer-events-none !ax-cursor-pointer'\"\n class=\"ax-h-full\"\n placeHolder=\"start writing with double click...\"\n look=\"none\"\n (onValueChanged)=\"valueChange($event)\"\n [ngModel]=\"value()\"\n >\n <ax-wysiwyg-view class=\"!ax-size-full ax-border-b-0\"></ax-wysiwyg-view>\n </ax-wysiwyg-container>\n </div>\n\n <!-- Footer with color selector and save button -->\n @if (isEditing()) {\n <div class=\"ax-absolute ax-bottom-2 ax-left-2 ax-right-2 ax-flex ax-flex-wrap ax-gap-1 ax-text-xs\">\n <!-- Color selection bar when in edit mode -->\n <div class=\"ax-flex ax-w-full ax-mt-2 ax-border ax-border-gray-200 ax-overflow-hidden ax-rounded-md\">\n @for (preset of colorPresets; track preset) {\n <div\n class=\"ax-h-6 ax-flex-1 ax-cursor-pointer ax-transition-all ax-duration-200 ax-border-r ax-border-gray-200 last:ax-border-r-0 hover:ax-brightness-95\"\n [style.background-color]=\"preset\"\n [class.ax-ring-inset]=\"bgColor() === preset\"\n [class.ax-ring-2]=\"bgColor() === preset\"\n [class.ax-ring-primary]=\"bgColor() === preset\"\n (click)=\"setColor(preset)\"\n ></div>\n }\n </div>\n </div>\n }\n</div>\n", styles: [":host{display:block;width:100%;height:100%}:host ::ng-deep ax-wysiwyg-view{color:#2e2e2e!important}\n"], dependencies: [{ kind: "ngmodule", type: AXWysiwygModule }, { kind: "component", type: i2$3.AXWysiwygContainerComponent, selector: "ax-wysiwyg-container", inputs: ["look", "placeHolder"], outputs: ["onValueChanged"] }, { kind: "component", type: i2$3.AXWysiwygViewComponent, selector: "ax-wysiwyg-view", inputs: ["class"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "ngmodule", type: AXToolBarModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXDateTimeModule }, { kind: "ngmodule", type: AXFormatModule }, { kind: "pipe", type: i2$9.AXFormatPipe, name: "format" }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: AXColorBoxModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
14693
15381
|
}
|
|
14694
15382
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: AXPStickyNoteWidgetViewComponent, decorators: [{
|
|
14695
15383
|
type: Component,
|
|
@@ -14709,7 +15397,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.3", ngImpor
|
|
|
14709
15397
|
provide: AXGridLayoutWidgetComponent,
|
|
14710
15398
|
useExisting: AXPStickyNoteWidgetViewComponent,
|
|
14711
15399
|
},
|
|
14712
|
-
], template: "<div\n class=\"sticky-note-container ax-size-full ax-rounded-lg ax-flex ax-flex-col ax-p-4 ax-shadow-md ax-transition-all ax-duration-300 hover:ax-shadow-lg\"\n [style.background-color]=\"bgColor()\"\n [style.color]=\"color()\"\n [class.ax-shadow-lg]=\"isEditing()\"\n [class.ax-scale-[1.02]]=\"isEditing()\"\n (dblclick)=\"activateEdit()\"\n>\n <!-- Header with timestamp -->\n <div class=\"ax-flex ax-justify-between ax-items-center ax-mb-3\">\n <div class=\"ax-text-xs ax-opacity-70 ax-font-medium ax-flex ax-items-center ax-gap-1\">\n <i class=\"fa-regular fa-clock ax-text-[0.65rem]\"></i>\n {{ date() | format : 'datetime' : 'dd MMM, YY HH:mm' | async }}\n </div>\n </div>\n\n <!-- Content area -->\n <div class=\"ax-flex-1 ax-overflow-auto\">\n <ax-wysiwyg-container\n #wysiwyg\n [class]=\"
|
|
15400
|
+
], template: "<div\n class=\"sticky-note-container ax-size-full ax-rounded-lg ax-flex ax-flex-col ax-p-4 ax-shadow-md ax-transition-all ax-duration-300 hover:ax-shadow-lg\"\n [style.background-color]=\"bgColor()\"\n [style.color]=\"color()\"\n [class.ax-shadow-lg]=\"isEditing()\"\n [class.ax-scale-[1.02]]=\"isEditing()\"\n (dblclick)=\"activateEdit()\"\n>\n <!-- Header with timestamp -->\n <div class=\"ax-flex ax-justify-between ax-items-center ax-mb-3\">\n <div class=\"ax-text-xs ax-opacity-70 ax-font-medium ax-flex ax-items-center ax-gap-1\">\n <i class=\"fa-regular fa-clock ax-text-[0.65rem]\"></i>\n {{ date() | format : 'datetime' : 'dd MMM, YY HH:mm' | async }}\n </div>\n </div>\n\n <!-- Content area -->\n <div class=\"ax-flex-1 ax-overflow-auto\">\n <ax-wysiwyg-container\n #wysiwyg\n [class]=\"isEditing() ? 'ax-pointer-events-auto ax-cursor-text' : 'ax-pointer-events-none !ax-cursor-pointer'\"\n class=\"ax-h-full\"\n placeHolder=\"start writing with double click...\"\n look=\"none\"\n (onValueChanged)=\"valueChange($event)\"\n [ngModel]=\"value()\"\n >\n <ax-wysiwyg-view class=\"!ax-size-full ax-border-b-0\"></ax-wysiwyg-view>\n </ax-wysiwyg-container>\n </div>\n\n <!-- Footer with color selector and save button -->\n @if (isEditing()) {\n <div class=\"ax-absolute ax-bottom-2 ax-left-2 ax-right-2 ax-flex ax-flex-wrap ax-gap-1 ax-text-xs\">\n <!-- Color selection bar when in edit mode -->\n <div class=\"ax-flex ax-w-full ax-mt-2 ax-border ax-border-gray-200 ax-overflow-hidden ax-rounded-md\">\n @for (preset of colorPresets; track preset) {\n <div\n class=\"ax-h-6 ax-flex-1 ax-cursor-pointer ax-transition-all ax-duration-200 ax-border-r ax-border-gray-200 last:ax-border-r-0 hover:ax-brightness-95\"\n [style.background-color]=\"preset\"\n [class.ax-ring-inset]=\"bgColor() === preset\"\n [class.ax-ring-2]=\"bgColor() === preset\"\n [class.ax-ring-primary]=\"bgColor() === preset\"\n (click)=\"setColor(preset)\"\n ></div>\n }\n </div>\n </div>\n }\n</div>\n", styles: [":host{display:block;width:100%;height:100%}:host ::ng-deep ax-wysiwyg-view{color:#2e2e2e!important}\n"] }]
|
|
14713
15401
|
}], propDecorators: { handleClickOutside: [{
|
|
14714
15402
|
type: HostListener,
|
|
14715
15403
|
args: ['document:click', ['$event']]
|
|
@@ -15790,7 +16478,7 @@ class AXPWeatherWidgetViewComponent extends AXPValueWidgetComponent {
|
|
|
15790
16478
|
provide: AXPWeatherApiAbstract,
|
|
15791
16479
|
useClass: AXPWeatherApiService,
|
|
15792
16480
|
},
|
|
15793
|
-
], viewQueries: [{ propertyName: "containerEl", first: true, predicate: ["containerElement"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<!-- Weather Widget Component Template -->\n<div class=\"axp-weather-container\" #containerElement>\n <!-- Loading indicator -->\n @if (isLoading()) {\n <div class=\"axp-weather-loading-overlay\">\n <div class=\"axp-weather-loading-spinner\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading weather data...</span>\n </div>\n </div>\n }\n\n <!-- Error message -->\n @if (hasError()) {\n <div class=\"axp-weather-error-overlay\">\n <div class=\"axp-weather-error-message\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <span>{{ errorMessage() }}</span>\n <button class=\"axp-weather-retry-button\" (click)=\"refreshWeather()\">\n <i class=\"fa-solid fa-sync-alt\"></i>\n <span>Retry</span>\n </button>\n </div>\n </div>\n }\n\n <!-- Weather content - only show when we have data -->\n @if (weatherData()) {\n <!-- Background decorations based on weather condition -->\n <div class=\"axp-weather-background-decorations\">\n <div class=\"axp-weather-decoration\" [ngClass]=\"weatherData()?.current?.condition?.toLowerCase()\"></div>\n <div class=\"axp-weather-gradient-overlay\"></div>\n </div>\n\n <div class=\"axp-weather-inner\">\n <!-- Location information section -->\n <div class=\"axp-weather-location-info\">\n <div class=\"axp-weather-location-icon\">\n <i class=\"fa-solid fa-location-dot\"></i>\n </div>\n <div class=\"axp-weather-location-text\">\n <h2 class=\"axp-weather-location-name\">{{ city() }}</h2>\n </div>\n </div>\n\n <!-- Current weather conditions section -->\n <div class=\"axp-weather-current-weather\">\n <!-- Weather icon and condition name -->\n @if (showCurrentCondition()) {\n <div class=\"axp-weather-condition\">\n <div class=\"axp-weather-icon-wrapper\">\n <div class=\"axp-weather-icon\">\n <i\n [class]=\"getConditionIcon(weatherData()?.current?.condition || '')\"\n [style.color]=\"getConditionColor(weatherData()?.current?.condition || '')\"\n ></i>\n </div>\n <div\n class=\"axp-weather-icon-glow\"\n [style.background-color]=\"getConditionColor(weatherData()?.current?.condition || '')\"\n ></div>\n </div>\n <div class=\"axp-weather-condition-name\">{{ getCurrentCondition() }}</div>\n </div>\n }\n\n <!-- Temperature display -->\n @if (showTemperature()) {\n <div class=\"axp-weather-temperature\">\n <span class=\"axp-weather-temperature-value\">{{ getCurrentTemperature() }}</span>\n <span class=\"axp-weather-temperature-unit\">{{ temperatureUnit() }}</span>\n </div>\n }\n </div>\n\n <!-- Weather details section (humidity and wind) -->\n @if (showHumidity() || showWind()) {\n <div class=\"axp-weather-details\">\n <!-- Humidity information -->\n @if (showHumidity()) {\n <div class=\"axp-weather-detail-item\">\n <div class=\"axp-weather-detail-icon\">\n <i class=\"fa-solid fa-droplet\"></i>\n </div>\n <div class=\"axp-weather-detail-info\">\n <div class=\"axp-weather-detail-label\">Humidity</div>\n <div class=\"axp-weather-detail-value\">{{ getHumidity() }}%</div>\n </div>\n </div>\n }\n\n <!-- Wind speed information -->\n @if (showWind()) {\n <div class=\"axp-weather-detail-item\">\n <div class=\"axp-weather-detail-icon\">\n <i class=\"fa-solid fa-wind\"></i>\n </div>\n <div class=\"axp-weather-detail-info\">\n <div class=\"axp-weather-detail-label\">Wind</div>\n <div class=\"axp-weather-detail-value\">{{ getWindSpeed() }} {{ windSpeedUnit() }}</div>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Weather forecast section -->\n @if (showForecast() && weatherData()?.forecast) {\n <div class=\"axp-weather-forecast\">\n <div class=\"axp-weather-forecast-header\">\n <h3 class=\"axp-weather-forecast-title\">\n <i class=\"fa-solid fa-calendar-days\"></i>\n <span>Forecast</span>\n </h3>\n <!-- <div class=\"axp-weather-scroll-indicator\">\n <i class=\"fa-solid fa-chevron-right\"></i>\n </div> -->\n </div>\n <!-- Loading indicator for forecast -->\n @if (isForecastLoading()) {\n <div class=\"axp-weather-forecast-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading forecast...</span>\n </div>\n }\n <!-- Scrollable forecast days display -->\n <div class=\"axp-weather-forecast-items\">\n @for (day of displayedForecast(); track day.day) {\n <div class=\"axp-weather-forecast-day\">\n <div class=\"axp-weather-forecast-day-name\">{{ day.day }}</div>\n <div class=\"axp-weather-forecast-icon\" title=\"{{ getConditionName(day.condition) }}\">\n <i [class]=\"getConditionIcon(day.condition)\" [style.color]=\"getConditionColor(day.condition)\"></i>\n </div>\n <div class=\"axp-weather-forecast-temps\">\n <span class=\"axp-weather-forecast-low\">\n {{ temperatureUnit() === '\u00B0C' ? day.minTempC : day.minTempF }}\u00B0\n </span>\n <span class=\"axp-weather-forecast-high\">\n {{ temperatureUnit() === '\u00B0C' ? day.maxTempC : day.maxTempF }}\u00B0\n </span>\n </div>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Last updated timestamp -->\n <div class=\"axp-weather-last-updated\">\n <span>Last updated: {{ getLastUpdated() }}</span>\n </div>\n\n <!-- Manual refresh button -->\n <div class=\"axp-weather-refresh-action\">\n <button\n class=\"axp-weather-refresh-button\"\n (click)=\"refreshWeather()\"\n [attr.aria-label]=\"'Refresh weather data'\"\n title=\"Refresh weather data\"\n >\n <i class=\"fa-solid fa-sync-alt\"></i>\n <span>Refresh</span>\n </button>\n </div>\n </div>\n } @else if (!isLoading() && !hasError()) {\n <!-- No data state (not loading, no error) -->\n <div class=\"axp-weather-no-data-state\">\n <i class=\"fa-solid fa-cloud-sun\"></i>\n <p>No weather data available</p>\n <button class=\"axp-weather-refresh-button\" (click)=\"refreshWeather()\">\n <i class=\"fa-solid fa-sync-alt\"></i>\n <span>Load Data</span>\n </button>\n </div>\n }\n</div>\n", styles: [":host{display:block;width:100%;height:100%;--primary-gradient-start: #2196f3;--primary-gradient-end: #1976d2;--shadow-color: rgba(0, 0, 0, .2);--glass-bg: rgba(255, 255, 255, .15);--glass-border: rgba(255, 255, 255, .2);--text-primary: rgba(255, 255, 255, .95);--text-secondary: rgba(255, 255, 255, .75);--transition-speed: .3s}.axp-weather-container{width:100%;height:100%;border-radius:8px;overflow:hidden;position:relative;box-shadow:0 4px 8px rgba(0,0,0,.1);color:#fff;min-height:300px;background-color:#2c3e50}.axp-weather-loading-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:rgba(44,62,80,.85);display:flex;justify-content:center;align-items:center;z-index:100}.axp-weather-loading-spinner{text-align:center}.axp-weather-loading-spinner i{font-size:2.5rem;color:#fff;margin-bottom:.5rem}.axp-weather-loading-spinner span{display:block;color:#fff;font-size:1rem}.axp-weather-error-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:rgba(189,54,47,.85);display:flex;justify-content:center;align-items:center;z-index:100}.axp-weather-error-message{text-align:center;padding:1rem}.axp-weather-error-message i{font-size:2.5rem;color:#fff;margin-bottom:.5rem}.axp-weather-error-message span{display:block;color:#fff;font-size:1.1rem;margin-bottom:1rem}.axp-weather-error-message .axp-weather-retry-button{color:#bd362f;border:none;border-radius:4px;padding:.5rem 1rem;font-size:1rem;cursor:pointer;transition:all .3s ease;display:inline-flex;align-items:center;gap:.5rem}.axp-weather-error-message .axp-weather-retry-button:hover{transform:translateY(-1px)}.axp-weather-no-data-state{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;padding:2rem;text-align:center}.axp-weather-no-data-state i{font-size:3rem;margin-bottom:1rem;color:rgba(255,255,255,.8)}.axp-weather-no-data-state p{margin-bottom:1.5rem;font-size:1.1rem}.axp-weather-no-data-state .axp-weather-refresh-button{background-color:rgba(255,255,255,.2);color:#fff;border:none;border-radius:4px;padding:.5rem 1rem;font-size:1rem;cursor:pointer;transition:all .3s ease;display:inline-flex;align-items:center;gap:.5rem}.axp-weather-no-data-state .axp-weather-refresh-button:hover{background-color:rgba(255,255,255,.3);transform:translateY(-1px)}.axp-weather-background-decorations{position:absolute;top:0;left:0;width:100%;height:100%;z-index:1}.axp-weather-decoration{position:absolute;top:0;left:0;width:100%;height:100%;background-size:cover;background-position:center}.axp-weather-decoration.sunny{background:linear-gradient(135deg,#ff7e00,#f7d358)}.axp-weather-decoration.partlyCloudy{background:linear-gradient(135deg,#7ba2e7,#b4d2f7)}.axp-weather-decoration.cloudy{background:linear-gradient(135deg,#717e8c,#919eab)}.axp-weather-decoration.rain{background:linear-gradient(135deg,#6a8caf,#567a9e)}.axp-weather-decoration.snow{background:linear-gradient(135deg,#99b3cc,#c6d4e1)}.axp-weather-decoration.thunder{background:linear-gradient(135deg,#425777,#2c3e50)}.axp-weather-decoration.mist{background:linear-gradient(135deg,#94a3b8,#cbd5e1)}.axp-weather-gradient-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background:linear-gradient(rgba(0,0,0,.2),rgba(0,0,0,.5))}.axp-weather-inner{position:relative;z-index:2;height:100%;padding:1.5rem;display:flex;flex-direction:column}.axp-weather-location-info{display:flex;align-items:center;margin-bottom:1.5rem}.axp-weather-location-icon{width:32px;height:32px;display:flex;align-items:center;justify-content:center;background-color:rgba(255,255,255,.2);border-radius:50%;margin-right:.75rem}.axp-weather-location-icon i{color:#fff}.axp-weather-location-name{margin:0;font-size:1.5rem;font-weight:500;text-shadow:1px 1px 3px rgba(0,0,0,.2);text-transform:capitalize}.axp-weather-current-weather{display:flex;align-items:center;justify-content:space-between;margin-bottom:1.5rem;flex-wrap:wrap}.axp-weather-condition{display:flex;flex-direction:column;align-items:center}.axp-weather-icon-wrapper{position:relative;margin-bottom:.5rem}.axp-weather-icon{position:relative;z-index:2}.axp-weather-icon i{font-size:2.75rem;filter:drop-shadow(0 0 8px rgba(0,0,0,.3))}.axp-weather-icon-glow{position:absolute;z-index:1;top:50%;left:50%;transform:translate(-50%,-50%);width:45px;height:45px;border-radius:50%;filter:blur(15px);opacity:.75}.axp-weather-condition-name{font-size:1.1rem;text-align:center;text-shadow:1px 1px 2px rgba(0,0,0,.2)}.axp-weather-temperature{display:flex;align-items:flex-start;text-shadow:1px 1px 3px rgba(0,0,0,.3)}.axp-weather-temperature-value{font-size:3.5rem;font-weight:500;line-height:1}.axp-weather-temperature-unit{font-size:1.5rem;margin-top:.25rem}.axp-weather-details{display:flex;flex-wrap:wrap;gap:1.5rem;margin-bottom:1.5rem;padding:1rem;background-color:rgba(0,0,0,.15);border-radius:8px}.axp-weather-detail-item{display:flex;align-items:center;flex:1;min-width:120px}.axp-weather-detail-icon{width:40px;height:40px;border-radius:50%;background-color:rgba(255,255,255,.2);display:flex;align-items:center;justify-content:center;margin-right:.75rem}.axp-weather-detail-icon i{font-size:1.25rem}.axp-weather-detail-info{display:flex;flex-direction:column}.axp-weather-detail-label{font-size:.875rem;color:rgba(255,255,255,.8);margin-bottom:.25rem}.axp-weather-detail-value{font-size:1.125rem;font-weight:500}.axp-weather-forecast{margin-top:auto;margin-bottom:1rem;background-color:rgba(0,0,0,.15);border-radius:8px;padding:1rem}.axp-weather-forecast-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:.75rem}.axp-weather-forecast-title{margin:0;font-size:1.125rem;font-weight:500;display:flex;align-items:center}.axp-weather-forecast-title i{margin-right:.5rem;opacity:.8}.axp-weather-scroll-indicator{color:rgba(255,255,255,.6)}.axp-weather-forecast-items{display:flex;overflow-x:auto;gap:.75rem;padding-bottom:.5rem}.axp-weather-forecast-items::-webkit-scrollbar{height:4px}.axp-weather-forecast-items::-webkit-scrollbar-thumb{background-color:rgba(255,255,255,.3);border-radius:4px}.axp-weather-forecast-items::-webkit-scrollbar-track{background-color:rgba(0,0,0,.1);border-radius:4px}.axp-weather-forecast-day{min-width:80px;display:flex;flex-direction:column;align-items:center;padding:.75rem .5rem;background-color:rgba(255,255,255,.1);border-radius:6px;transition:all .3s ease}.axp-weather-forecast-day:hover{background-color:rgba(255,255,255,.15);transform:translateY(-2px)}.axp-weather-forecast-day-name{font-size:.875rem;margin-bottom:.5rem;font-weight:500}.axp-weather-forecast-icon{font-size:1.5rem;margin-bottom:.5rem}.axp-weather-forecast-icon i{filter:drop-shadow(0 0 5px rgba(0,0,0,.2))}.axp-weather-forecast-temps{display:flex;flex-direction:row;gap:.75rem;align-items:center;font-size:.875rem}.axp-weather-last-updated{text-align:center;font-size:.75rem;opacity:.7;margin-bottom:.5rem}.axp-weather-refresh-action{text-align:center}.axp-weather-refresh-button{background-color:rgba(255,255,255,.2);color:#fff;border:none;border-radius:4px;padding:.5rem 1rem;font-size:.875rem;cursor:pointer;transition:all .3s ease;display:inline-flex;align-items:center;gap:.5rem}.axp-weather-refresh-button:hover{background-color:rgba(255,255,255,.3);transform:translateY(-1px)}.axp-weather-refresh-button i{font-size:.875rem}@media (max-width: 576px){.axp-weather-inner{padding:.8rem;gap:.6rem}.axp-weather-location-name{font-size:1.1rem}.axp-weather-temperature{font-size:2.5rem}.axp-weather-temperature-unit{font-size:1.1rem}.axp-weather-weather-details{flex-direction:column;gap:.5rem}.axp-weather-forecast-items{flex-wrap:nowrap;overflow-x:auto;padding-bottom:.5rem;margin:0 -.4rem;scroll-behavior:smooth;-webkit-overflow-scrolling:touch;scrollbar-width:thin;mask-image:linear-gradient(to right,#000 95%,rgba(0,0,0,0));-webkit-mask-image:linear-gradient(to right,rgb(0,0,0) 95%,rgba(0,0,0,0))}.axp-weather-forecast-items::-webkit-scrollbar{height:4px}.axp-weather-forecast-items::-webkit-scrollbar-thumb{background-color:rgba(255,255,255,.2);border-radius:4px}.axp-weather-forecast-day{min-width:60px;flex:0 0 auto;padding:.4rem .6rem}.axp-weather-forecast-day-name{font-size:.7rem}.axp-weather-forecast-icon{padding:.3rem;height:1.6rem}.axp-weather-forecast-temps{font-size:.7rem}.axp-weather-scroll-indicator{display:block}}@media (max-width: 400px){.axp-weather-current-weather{flex-direction:column;gap:.8rem;align-items:center}.axp-weather-temperature{font-size:2.2rem}.axp-weather-forecast-day{min-width:55px}}:host-context(.theme-dark){--glass-bg: rgba(0, 0, 0, .3);--glass-border: rgba(255, 255, 255, .1)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: AXDateTimeModule }, { kind: "ngmodule", type: AXFormatModule }, { kind: "ngmodule", type: HttpClientModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
16481
|
+
], viewQueries: [{ propertyName: "containerEl", first: true, predicate: ["containerElement"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<!-- Weather Widget Component Template -->\n<div class=\"axp-weather-container\" #containerElement>\n <!-- Loading indicator -->\n @if (isLoading()) {\n <div class=\"axp-weather-loading-overlay\">\n <div class=\"axp-weather-loading-spinner\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading weather data...</span>\n </div>\n </div>\n }\n\n <!-- Error message -->\n @if (hasError()) {\n <div class=\"axp-weather-error-overlay\">\n <div class=\"axp-weather-error-message\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <span>{{ errorMessage() }}</span>\n <button class=\"axp-weather-retry-button\" (click)=\"refreshWeather()\">\n <i class=\"fa-solid fa-sync-alt\"></i>\n <span>Retry</span>\n </button>\n </div>\n </div>\n }\n\n <!-- Weather content - only show when we have data -->\n @if (weatherData()) {\n <!-- Background decorations based on weather condition -->\n <div class=\"axp-weather-background-decorations\">\n <div class=\"axp-weather-decoration\" [ngClass]=\"weatherData()?.current?.condition?.toLowerCase()\"></div>\n <div class=\"axp-weather-gradient-overlay\"></div>\n </div>\n\n <div class=\"axp-weather-inner\">\n <!-- Location information section -->\n <div class=\"axp-weather-location-info\">\n <div class=\"axp-weather-location-icon\">\n <i class=\"fa-solid fa-location-dot\"></i>\n </div>\n <div class=\"axp-weather-location-text\">\n <h2 class=\"axp-weather-location-name\">{{ city() }}</h2>\n </div>\n </div>\n\n <!-- Current weather conditions section -->\n <div class=\"axp-weather-current-weather\">\n <!-- Weather icon and condition name -->\n @if (showCurrentCondition()) {\n <div class=\"axp-weather-condition\">\n <div class=\"axp-weather-icon-wrapper\">\n <div class=\"axp-weather-icon\">\n <i\n [class]=\"getConditionIcon(weatherData()?.current?.condition || '')\"\n [style.color]=\"getConditionColor(weatherData()?.current?.condition || '')\"\n ></i>\n </div>\n <div\n class=\"axp-weather-icon-glow\"\n [style.background-color]=\"getConditionColor(weatherData()?.current?.condition || '')\"\n ></div>\n </div>\n <div class=\"axp-weather-condition-name\">{{ getCurrentCondition() }}</div>\n </div>\n }\n\n <!-- Temperature display -->\n @if (showTemperature()) {\n <div class=\"axp-weather-temperature\">\n <span class=\"axp-weather-temperature-value\">{{ getCurrentTemperature() }}</span>\n <span class=\"axp-weather-temperature-unit\">{{ temperatureUnit() }}</span>\n </div>\n }\n </div>\n\n <!-- Weather details section (humidity and wind) -->\n @if (showHumidity() || showWind()) {\n <div class=\"axp-weather-details\">\n <!-- Humidity information -->\n @if (showHumidity()) {\n <div class=\"axp-weather-detail-item\">\n <div class=\"axp-weather-detail-icon\">\n <i class=\"fa-solid fa-droplet\"></i>\n </div>\n <div class=\"axp-weather-detail-info\">\n <div class=\"axp-weather-detail-label\">Humidity</div>\n <div class=\"axp-weather-detail-value\">{{ getHumidity() }}%</div>\n </div>\n </div>\n }\n\n <!-- Wind speed information -->\n @if (showWind()) {\n <div class=\"axp-weather-detail-item\">\n <div class=\"axp-weather-detail-icon\">\n <i class=\"fa-solid fa-wind\"></i>\n </div>\n <div class=\"axp-weather-detail-info\">\n <div class=\"axp-weather-detail-label\">Wind</div>\n <div class=\"axp-weather-detail-value\">{{ getWindSpeed() }} {{ windSpeedUnit() }}</div>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Weather forecast section -->\n @if (showForecast() && weatherData()?.forecast) {\n <div class=\"axp-weather-forecast\">\n <div class=\"axp-weather-forecast-header\">\n <h3 class=\"axp-weather-forecast-title\">\n <i class=\"fa-solid fa-calendar-days\"></i>\n <span>Forecast</span>\n </h3>\n <!-- <div class=\"axp-weather-scroll-indicator\">\n <i class=\"fa-solid fa-chevron-right\"></i>\n </div> -->\n </div>\n <!-- Loading indicator for forecast -->\n @if (isForecastLoading()) {\n <div class=\"axp-weather-forecast-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading forecast...</span>\n </div>\n }\n <!-- Scrollable forecast days display -->\n <div class=\"axp-weather-forecast-items\">\n @for (day of displayedForecast(); track day.day) {\n <div class=\"axp-weather-forecast-day\">\n <div class=\"axp-weather-forecast-day-name\">{{ day.day }}</div>\n <div class=\"axp-weather-forecast-icon\" title=\"{{ getConditionName(day.condition) }}\">\n <i [class]=\"getConditionIcon(day.condition)\" [style.color]=\"getConditionColor(day.condition)\"></i>\n </div>\n <div class=\"axp-weather-forecast-temps\">\n <span class=\"axp-weather-forecast-low\">\n {{ temperatureUnit() === '\u00B0C' ? day.minTempC : day.minTempF }}\u00B0\n </span>\n <span class=\"axp-weather-forecast-high\">\n {{ temperatureUnit() === '\u00B0C' ? day.maxTempC : day.maxTempF }}\u00B0\n </span>\n </div>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Last updated timestamp -->\n <div class=\"axp-weather-last-updated\">\n <span>Last updated: {{ getLastUpdated() }}</span>\n </div>\n\n <!-- Manual refresh button -->\n <div class=\"axp-weather-refresh-action\">\n <button\n class=\"axp-weather-refresh-button\"\n (click)=\"refreshWeather()\"\n [attr.aria-label]=\"'Refresh weather data'\"\n title=\"Refresh weather data\"\n >\n <i class=\"fa-solid fa-sync-alt\"></i>\n <span>Refresh</span>\n </button>\n </div>\n </div>\n } @else if (!isLoading() && !hasError()) {\n <!-- No data state (not loading, no error) -->\n <div class=\"axp-weather-no-data-state\">\n <i class=\"fa-solid fa-cloud-sun\"></i>\n <p>No weather data available</p>\n <button class=\"axp-weather-refresh-button\" (click)=\"refreshWeather()\">\n <i class=\"fa-solid fa-sync-alt\"></i>\n <span>Load Data</span>\n </button>\n </div>\n }\n</div>\n", styles: [":host{display:block;width:100%;height:100%;--primary-gradient-start: #2196f3;--primary-gradient-end: #1976d2;--shadow-color: rgba(0, 0, 0, .2);--glass-bg: rgba(255, 255, 255, .15);--glass-border: rgba(255, 255, 255, .2);--text-primary: rgba(255, 255, 255, .95);--text-secondary: rgba(255, 255, 255, .75);--transition-speed: .3s}.axp-weather-container{width:100%;height:100%;border-radius:8px;overflow:hidden;position:relative;box-shadow:0 4px 8px rgba(0,0,0,.1);color:#fff;min-height:300px;background-color:#2c3e50}.axp-weather-loading-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:rgba(44,62,80,.85);display:flex;justify-content:center;align-items:center;z-index:100}.axp-weather-loading-spinner{text-align:center}.axp-weather-loading-spinner i{font-size:2.5rem;color:#fff;margin-bottom:.5rem}.axp-weather-loading-spinner span{display:block;color:#fff;font-size:1rem}.axp-weather-error-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:rgba(189,54,47,.85);display:flex;justify-content:center;align-items:center;z-index:100}.axp-weather-error-message{text-align:center;padding:1rem}.axp-weather-error-message i{font-size:2.5rem;color:#fff;margin-bottom:.5rem}.axp-weather-error-message span{display:block;color:#fff;font-size:1.1rem;margin-bottom:1rem}.axp-weather-error-message .axp-weather-retry-button{color:#bd362f;border:none;border-radius:4px;padding:.5rem 1rem;font-size:1rem;cursor:pointer;transition:all .3s ease;display:inline-flex;align-items:center;gap:.5rem}.axp-weather-error-message .axp-weather-retry-button:hover{transform:translateY(-1px)}.axp-weather-no-data-state{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;padding:2rem;text-align:center}.axp-weather-no-data-state i{font-size:3rem;margin-bottom:1rem;color:rgba(255,255,255,.8)}.axp-weather-no-data-state p{margin-bottom:1.5rem;font-size:1.1rem}.axp-weather-no-data-state .axp-weather-refresh-button{background-color:rgba(255,255,255,.2);color:#fff;border:none;border-radius:4px;padding:.5rem 1rem;font-size:1rem;cursor:pointer;transition:all .3s ease;display:inline-flex;align-items:center;gap:.5rem}.axp-weather-no-data-state .axp-weather-refresh-button:hover{background-color:rgba(255,255,255,.3);transform:translateY(-1px)}.axp-weather-background-decorations{position:absolute;top:0;left:0;width:100%;height:100%;z-index:1}.axp-weather-decoration{position:absolute;top:0;left:0;width:100%;height:100%;background-size:cover;background-position:center}.axp-weather-decoration.sunny{background:linear-gradient(135deg,#ff7e00,#f7d358)}.axp-weather-decoration.partlyCloudy{background:linear-gradient(135deg,#7ba2e7,#b4d2f7)}.axp-weather-decoration.cloudy{background:linear-gradient(135deg,#717e8c,#919eab)}.axp-weather-decoration.rain{background:linear-gradient(135deg,#6a8caf,#567a9e)}.axp-weather-decoration.snow{background:linear-gradient(135deg,#99b3cc,#c6d4e1)}.axp-weather-decoration.thunder{background:linear-gradient(135deg,#425777,#2c3e50)}.axp-weather-decoration.mist{background:linear-gradient(135deg,#94a3b8,#cbd5e1)}.axp-weather-gradient-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background:linear-gradient(rgba(0,0,0,.2),rgba(0,0,0,.5))}.axp-weather-inner{position:relative;z-index:2;height:100%;padding:1.5rem;display:flex;flex-direction:column}.axp-weather-location-info{display:flex;align-items:center;margin-bottom:1.5rem}.axp-weather-location-icon{width:32px;height:32px;display:flex;align-items:center;justify-content:center;background-color:rgba(255,255,255,.2);border-radius:50%;margin-right:.75rem}.axp-weather-location-icon i{color:#fff}.axp-weather-location-name{margin:0;font-size:1.5rem;font-weight:500;text-shadow:1px 1px 3px rgba(0,0,0,.2);text-transform:capitalize}.axp-weather-current-weather{display:flex;align-items:center;justify-content:space-between;margin-bottom:1.5rem;flex-wrap:wrap}.axp-weather-condition{display:flex;flex-direction:column;align-items:center}.axp-weather-icon-wrapper{position:relative;margin-bottom:.5rem}.axp-weather-icon{position:relative;z-index:2}.axp-weather-icon i{font-size:2.75rem;filter:drop-shadow(0 0 8px rgba(0,0,0,.3))}.axp-weather-icon-glow{position:absolute;z-index:1;top:50%;left:50%;transform:translate(-50%,-50%);width:45px;height:45px;border-radius:50%;filter:blur(15px);opacity:.75}.axp-weather-condition-name{font-size:1.1rem;text-align:center;text-shadow:1px 1px 2px rgba(0,0,0,.2)}.axp-weather-temperature{display:flex;align-items:flex-start;text-shadow:1px 1px 3px rgba(0,0,0,.3)}.axp-weather-temperature-value{font-size:3.5rem;font-weight:500;line-height:1}.axp-weather-temperature-unit{font-size:1.5rem;margin-top:.25rem}.axp-weather-details{display:flex;flex-wrap:wrap;gap:1.5rem;margin-bottom:1.5rem;padding:1rem;background-color:rgba(0,0,0,.15);border-radius:8px}.axp-weather-detail-item{display:flex;align-items:center;flex:1;min-width:120px}.axp-weather-detail-icon{width:40px;height:40px;border-radius:50%;background-color:rgba(255,255,255,.2);display:flex;align-items:center;justify-content:center;margin-right:.75rem}.axp-weather-detail-icon i{font-size:1.25rem}.axp-weather-detail-info{display:flex;flex-direction:column}.axp-weather-detail-label{font-size:.875rem;color:rgba(255,255,255,.8);margin-bottom:.25rem}.axp-weather-detail-value{font-size:1.125rem;font-weight:500}.axp-weather-forecast{margin-top:auto;margin-bottom:1rem;background-color:rgba(0,0,0,.15);border-radius:8px;padding:1rem}.axp-weather-forecast-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:.75rem}.axp-weather-forecast-title{margin:0;font-size:1.125rem;font-weight:500;display:flex;align-items:center}.axp-weather-forecast-title i{margin-right:.5rem;opacity:.8}.axp-weather-scroll-indicator{color:rgba(255,255,255,.6)}.axp-weather-forecast-items{display:flex;overflow-x:auto;gap:.75rem;padding-bottom:.5rem}.axp-weather-forecast-items::-webkit-scrollbar{height:4px}.axp-weather-forecast-items::-webkit-scrollbar-thumb{background-color:rgba(255,255,255,.3);border-radius:4px}.axp-weather-forecast-items::-webkit-scrollbar-track{background-color:rgba(0,0,0,.1);border-radius:4px}.axp-weather-forecast-day{min-width:80px;display:flex;flex-direction:column;align-items:center;padding:.75rem .5rem;background-color:rgba(255,255,255,.1);border-radius:6px;transition:all .3s ease}.axp-weather-forecast-day:hover{background-color:rgba(255,255,255,.15);transform:translateY(-2px)}.axp-weather-forecast-day-name{font-size:.875rem;margin-bottom:.5rem;font-weight:500}.axp-weather-forecast-icon{font-size:1.5rem;margin-bottom:.5rem}.axp-weather-forecast-icon i{filter:drop-shadow(0 0 5px rgba(0,0,0,.2))}.axp-weather-forecast-temps{display:flex;flex-direction:row;gap:.75rem;align-items:center;font-size:.875rem}.axp-weather-last-updated{text-align:center;font-size:.75rem;opacity:.7;margin-bottom:.5rem}.axp-weather-refresh-action{text-align:center}.axp-weather-refresh-button{background-color:rgba(255,255,255,.2);color:#fff;border:none;border-radius:4px;padding:.5rem 1rem;font-size:.875rem;cursor:pointer;transition:all .3s ease;display:inline-flex;align-items:center;gap:.5rem}.axp-weather-refresh-button:hover{background-color:rgba(255,255,255,.3);transform:translateY(-1px)}.axp-weather-refresh-button i{font-size:.875rem}@media (max-width: 576px){.axp-weather-inner{padding:.8rem;gap:.4rem}.axp-weather-location-name{font-size:1.1rem}.axp-weather-temperature{font-size:2.5rem}.axp-weather-temperature-unit{font-size:1.1rem}.axp-weather-weather-details{flex-direction:column;gap:.5rem}.axp-weather-forecast-items{flex-wrap:nowrap;overflow-x:auto;padding-bottom:.5rem;margin:0 -.4rem;scroll-behavior:smooth;-webkit-overflow-scrolling:touch;scrollbar-width:thin;mask-image:linear-gradient(to right,#000 95%,rgba(0,0,0,0));-webkit-mask-image:linear-gradient(to right,rgb(0,0,0) 95%,rgba(0,0,0,0))}.axp-weather-forecast-items::-webkit-scrollbar{height:4px}.axp-weather-forecast-items::-webkit-scrollbar-thumb{background-color:rgba(255,255,255,.2);border-radius:4px}.axp-weather-forecast-day{min-width:60px;flex:0 0 auto;padding:.4rem .6rem}.axp-weather-forecast-day-name{font-size:.7rem}.axp-weather-forecast-icon{padding:.3rem;height:1.6rem}.axp-weather-forecast-temps{font-size:.7rem}.axp-weather-scroll-indicator{display:block}}:host-context(.theme-dark){--glass-bg: rgba(0, 0, 0, .3);--glass-border: rgba(255, 255, 255, .1)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: AXDateTimeModule }, { kind: "ngmodule", type: AXFormatModule }, { kind: "ngmodule", type: HttpClientModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
15794
16482
|
}
|
|
15795
16483
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: AXPWeatherWidgetViewComponent, decorators: [{
|
|
15796
16484
|
type: Component,
|
|
@@ -15799,7 +16487,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.3", ngImpor
|
|
|
15799
16487
|
provide: AXPWeatherApiAbstract,
|
|
15800
16488
|
useClass: AXPWeatherApiService,
|
|
15801
16489
|
},
|
|
15802
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Weather Widget Component Template -->\n<div class=\"axp-weather-container\" #containerElement>\n <!-- Loading indicator -->\n @if (isLoading()) {\n <div class=\"axp-weather-loading-overlay\">\n <div class=\"axp-weather-loading-spinner\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading weather data...</span>\n </div>\n </div>\n }\n\n <!-- Error message -->\n @if (hasError()) {\n <div class=\"axp-weather-error-overlay\">\n <div class=\"axp-weather-error-message\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <span>{{ errorMessage() }}</span>\n <button class=\"axp-weather-retry-button\" (click)=\"refreshWeather()\">\n <i class=\"fa-solid fa-sync-alt\"></i>\n <span>Retry</span>\n </button>\n </div>\n </div>\n }\n\n <!-- Weather content - only show when we have data -->\n @if (weatherData()) {\n <!-- Background decorations based on weather condition -->\n <div class=\"axp-weather-background-decorations\">\n <div class=\"axp-weather-decoration\" [ngClass]=\"weatherData()?.current?.condition?.toLowerCase()\"></div>\n <div class=\"axp-weather-gradient-overlay\"></div>\n </div>\n\n <div class=\"axp-weather-inner\">\n <!-- Location information section -->\n <div class=\"axp-weather-location-info\">\n <div class=\"axp-weather-location-icon\">\n <i class=\"fa-solid fa-location-dot\"></i>\n </div>\n <div class=\"axp-weather-location-text\">\n <h2 class=\"axp-weather-location-name\">{{ city() }}</h2>\n </div>\n </div>\n\n <!-- Current weather conditions section -->\n <div class=\"axp-weather-current-weather\">\n <!-- Weather icon and condition name -->\n @if (showCurrentCondition()) {\n <div class=\"axp-weather-condition\">\n <div class=\"axp-weather-icon-wrapper\">\n <div class=\"axp-weather-icon\">\n <i\n [class]=\"getConditionIcon(weatherData()?.current?.condition || '')\"\n [style.color]=\"getConditionColor(weatherData()?.current?.condition || '')\"\n ></i>\n </div>\n <div\n class=\"axp-weather-icon-glow\"\n [style.background-color]=\"getConditionColor(weatherData()?.current?.condition || '')\"\n ></div>\n </div>\n <div class=\"axp-weather-condition-name\">{{ getCurrentCondition() }}</div>\n </div>\n }\n\n <!-- Temperature display -->\n @if (showTemperature()) {\n <div class=\"axp-weather-temperature\">\n <span class=\"axp-weather-temperature-value\">{{ getCurrentTemperature() }}</span>\n <span class=\"axp-weather-temperature-unit\">{{ temperatureUnit() }}</span>\n </div>\n }\n </div>\n\n <!-- Weather details section (humidity and wind) -->\n @if (showHumidity() || showWind()) {\n <div class=\"axp-weather-details\">\n <!-- Humidity information -->\n @if (showHumidity()) {\n <div class=\"axp-weather-detail-item\">\n <div class=\"axp-weather-detail-icon\">\n <i class=\"fa-solid fa-droplet\"></i>\n </div>\n <div class=\"axp-weather-detail-info\">\n <div class=\"axp-weather-detail-label\">Humidity</div>\n <div class=\"axp-weather-detail-value\">{{ getHumidity() }}%</div>\n </div>\n </div>\n }\n\n <!-- Wind speed information -->\n @if (showWind()) {\n <div class=\"axp-weather-detail-item\">\n <div class=\"axp-weather-detail-icon\">\n <i class=\"fa-solid fa-wind\"></i>\n </div>\n <div class=\"axp-weather-detail-info\">\n <div class=\"axp-weather-detail-label\">Wind</div>\n <div class=\"axp-weather-detail-value\">{{ getWindSpeed() }} {{ windSpeedUnit() }}</div>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Weather forecast section -->\n @if (showForecast() && weatherData()?.forecast) {\n <div class=\"axp-weather-forecast\">\n <div class=\"axp-weather-forecast-header\">\n <h3 class=\"axp-weather-forecast-title\">\n <i class=\"fa-solid fa-calendar-days\"></i>\n <span>Forecast</span>\n </h3>\n <!-- <div class=\"axp-weather-scroll-indicator\">\n <i class=\"fa-solid fa-chevron-right\"></i>\n </div> -->\n </div>\n <!-- Loading indicator for forecast -->\n @if (isForecastLoading()) {\n <div class=\"axp-weather-forecast-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading forecast...</span>\n </div>\n }\n <!-- Scrollable forecast days display -->\n <div class=\"axp-weather-forecast-items\">\n @for (day of displayedForecast(); track day.day) {\n <div class=\"axp-weather-forecast-day\">\n <div class=\"axp-weather-forecast-day-name\">{{ day.day }}</div>\n <div class=\"axp-weather-forecast-icon\" title=\"{{ getConditionName(day.condition) }}\">\n <i [class]=\"getConditionIcon(day.condition)\" [style.color]=\"getConditionColor(day.condition)\"></i>\n </div>\n <div class=\"axp-weather-forecast-temps\">\n <span class=\"axp-weather-forecast-low\">\n {{ temperatureUnit() === '\u00B0C' ? day.minTempC : day.minTempF }}\u00B0\n </span>\n <span class=\"axp-weather-forecast-high\">\n {{ temperatureUnit() === '\u00B0C' ? day.maxTempC : day.maxTempF }}\u00B0\n </span>\n </div>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Last updated timestamp -->\n <div class=\"axp-weather-last-updated\">\n <span>Last updated: {{ getLastUpdated() }}</span>\n </div>\n\n <!-- Manual refresh button -->\n <div class=\"axp-weather-refresh-action\">\n <button\n class=\"axp-weather-refresh-button\"\n (click)=\"refreshWeather()\"\n [attr.aria-label]=\"'Refresh weather data'\"\n title=\"Refresh weather data\"\n >\n <i class=\"fa-solid fa-sync-alt\"></i>\n <span>Refresh</span>\n </button>\n </div>\n </div>\n } @else if (!isLoading() && !hasError()) {\n <!-- No data state (not loading, no error) -->\n <div class=\"axp-weather-no-data-state\">\n <i class=\"fa-solid fa-cloud-sun\"></i>\n <p>No weather data available</p>\n <button class=\"axp-weather-refresh-button\" (click)=\"refreshWeather()\">\n <i class=\"fa-solid fa-sync-alt\"></i>\n <span>Load Data</span>\n </button>\n </div>\n }\n</div>\n", styles: [":host{display:block;width:100%;height:100%;--primary-gradient-start: #2196f3;--primary-gradient-end: #1976d2;--shadow-color: rgba(0, 0, 0, .2);--glass-bg: rgba(255, 255, 255, .15);--glass-border: rgba(255, 255, 255, .2);--text-primary: rgba(255, 255, 255, .95);--text-secondary: rgba(255, 255, 255, .75);--transition-speed: .3s}.axp-weather-container{width:100%;height:100%;border-radius:8px;overflow:hidden;position:relative;box-shadow:0 4px 8px rgba(0,0,0,.1);color:#fff;min-height:300px;background-color:#2c3e50}.axp-weather-loading-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:rgba(44,62,80,.85);display:flex;justify-content:center;align-items:center;z-index:100}.axp-weather-loading-spinner{text-align:center}.axp-weather-loading-spinner i{font-size:2.5rem;color:#fff;margin-bottom:.5rem}.axp-weather-loading-spinner span{display:block;color:#fff;font-size:1rem}.axp-weather-error-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:rgba(189,54,47,.85);display:flex;justify-content:center;align-items:center;z-index:100}.axp-weather-error-message{text-align:center;padding:1rem}.axp-weather-error-message i{font-size:2.5rem;color:#fff;margin-bottom:.5rem}.axp-weather-error-message span{display:block;color:#fff;font-size:1.1rem;margin-bottom:1rem}.axp-weather-error-message .axp-weather-retry-button{color:#bd362f;border:none;border-radius:4px;padding:.5rem 1rem;font-size:1rem;cursor:pointer;transition:all .3s ease;display:inline-flex;align-items:center;gap:.5rem}.axp-weather-error-message .axp-weather-retry-button:hover{transform:translateY(-1px)}.axp-weather-no-data-state{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;padding:2rem;text-align:center}.axp-weather-no-data-state i{font-size:3rem;margin-bottom:1rem;color:rgba(255,255,255,.8)}.axp-weather-no-data-state p{margin-bottom:1.5rem;font-size:1.1rem}.axp-weather-no-data-state .axp-weather-refresh-button{background-color:rgba(255,255,255,.2);color:#fff;border:none;border-radius:4px;padding:.5rem 1rem;font-size:1rem;cursor:pointer;transition:all .3s ease;display:inline-flex;align-items:center;gap:.5rem}.axp-weather-no-data-state .axp-weather-refresh-button:hover{background-color:rgba(255,255,255,.3);transform:translateY(-1px)}.axp-weather-background-decorations{position:absolute;top:0;left:0;width:100%;height:100%;z-index:1}.axp-weather-decoration{position:absolute;top:0;left:0;width:100%;height:100%;background-size:cover;background-position:center}.axp-weather-decoration.sunny{background:linear-gradient(135deg,#ff7e00,#f7d358)}.axp-weather-decoration.partlyCloudy{background:linear-gradient(135deg,#7ba2e7,#b4d2f7)}.axp-weather-decoration.cloudy{background:linear-gradient(135deg,#717e8c,#919eab)}.axp-weather-decoration.rain{background:linear-gradient(135deg,#6a8caf,#567a9e)}.axp-weather-decoration.snow{background:linear-gradient(135deg,#99b3cc,#c6d4e1)}.axp-weather-decoration.thunder{background:linear-gradient(135deg,#425777,#2c3e50)}.axp-weather-decoration.mist{background:linear-gradient(135deg,#94a3b8,#cbd5e1)}.axp-weather-gradient-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background:linear-gradient(rgba(0,0,0,.2),rgba(0,0,0,.5))}.axp-weather-inner{position:relative;z-index:2;height:100%;padding:1.5rem;display:flex;flex-direction:column}.axp-weather-location-info{display:flex;align-items:center;margin-bottom:1.5rem}.axp-weather-location-icon{width:32px;height:32px;display:flex;align-items:center;justify-content:center;background-color:rgba(255,255,255,.2);border-radius:50%;margin-right:.75rem}.axp-weather-location-icon i{color:#fff}.axp-weather-location-name{margin:0;font-size:1.5rem;font-weight:500;text-shadow:1px 1px 3px rgba(0,0,0,.2);text-transform:capitalize}.axp-weather-current-weather{display:flex;align-items:center;justify-content:space-between;margin-bottom:1.5rem;flex-wrap:wrap}.axp-weather-condition{display:flex;flex-direction:column;align-items:center}.axp-weather-icon-wrapper{position:relative;margin-bottom:.5rem}.axp-weather-icon{position:relative;z-index:2}.axp-weather-icon i{font-size:2.75rem;filter:drop-shadow(0 0 8px rgba(0,0,0,.3))}.axp-weather-icon-glow{position:absolute;z-index:1;top:50%;left:50%;transform:translate(-50%,-50%);width:45px;height:45px;border-radius:50%;filter:blur(15px);opacity:.75}.axp-weather-condition-name{font-size:1.1rem;text-align:center;text-shadow:1px 1px 2px rgba(0,0,0,.2)}.axp-weather-temperature{display:flex;align-items:flex-start;text-shadow:1px 1px 3px rgba(0,0,0,.3)}.axp-weather-temperature-value{font-size:3.5rem;font-weight:500;line-height:1}.axp-weather-temperature-unit{font-size:1.5rem;margin-top:.25rem}.axp-weather-details{display:flex;flex-wrap:wrap;gap:1.5rem;margin-bottom:1.5rem;padding:1rem;background-color:rgba(0,0,0,.15);border-radius:8px}.axp-weather-detail-item{display:flex;align-items:center;flex:1;min-width:120px}.axp-weather-detail-icon{width:40px;height:40px;border-radius:50%;background-color:rgba(255,255,255,.2);display:flex;align-items:center;justify-content:center;margin-right:.75rem}.axp-weather-detail-icon i{font-size:1.25rem}.axp-weather-detail-info{display:flex;flex-direction:column}.axp-weather-detail-label{font-size:.875rem;color:rgba(255,255,255,.8);margin-bottom:.25rem}.axp-weather-detail-value{font-size:1.125rem;font-weight:500}.axp-weather-forecast{margin-top:auto;margin-bottom:1rem;background-color:rgba(0,0,0,.15);border-radius:8px;padding:1rem}.axp-weather-forecast-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:.75rem}.axp-weather-forecast-title{margin:0;font-size:1.125rem;font-weight:500;display:flex;align-items:center}.axp-weather-forecast-title i{margin-right:.5rem;opacity:.8}.axp-weather-scroll-indicator{color:rgba(255,255,255,.6)}.axp-weather-forecast-items{display:flex;overflow-x:auto;gap:.75rem;padding-bottom:.5rem}.axp-weather-forecast-items::-webkit-scrollbar{height:4px}.axp-weather-forecast-items::-webkit-scrollbar-thumb{background-color:rgba(255,255,255,.3);border-radius:4px}.axp-weather-forecast-items::-webkit-scrollbar-track{background-color:rgba(0,0,0,.1);border-radius:4px}.axp-weather-forecast-day{min-width:80px;display:flex;flex-direction:column;align-items:center;padding:.75rem .5rem;background-color:rgba(255,255,255,.1);border-radius:6px;transition:all .3s ease}.axp-weather-forecast-day:hover{background-color:rgba(255,255,255,.15);transform:translateY(-2px)}.axp-weather-forecast-day-name{font-size:.875rem;margin-bottom:.5rem;font-weight:500}.axp-weather-forecast-icon{font-size:1.5rem;margin-bottom:.5rem}.axp-weather-forecast-icon i{filter:drop-shadow(0 0 5px rgba(0,0,0,.2))}.axp-weather-forecast-temps{display:flex;flex-direction:row;gap:.75rem;align-items:center;font-size:.875rem}.axp-weather-last-updated{text-align:center;font-size:.75rem;opacity:.7;margin-bottom:.5rem}.axp-weather-refresh-action{text-align:center}.axp-weather-refresh-button{background-color:rgba(255,255,255,.2);color:#fff;border:none;border-radius:4px;padding:.5rem 1rem;font-size:.875rem;cursor:pointer;transition:all .3s ease;display:inline-flex;align-items:center;gap:.5rem}.axp-weather-refresh-button:hover{background-color:rgba(255,255,255,.3);transform:translateY(-1px)}.axp-weather-refresh-button i{font-size:.875rem}@media (max-width: 576px){.axp-weather-inner{padding:.8rem;gap:.6rem}.axp-weather-location-name{font-size:1.1rem}.axp-weather-temperature{font-size:2.5rem}.axp-weather-temperature-unit{font-size:1.1rem}.axp-weather-weather-details{flex-direction:column;gap:.5rem}.axp-weather-forecast-items{flex-wrap:nowrap;overflow-x:auto;padding-bottom:.5rem;margin:0 -.4rem;scroll-behavior:smooth;-webkit-overflow-scrolling:touch;scrollbar-width:thin;mask-image:linear-gradient(to right,#000 95%,rgba(0,0,0,0));-webkit-mask-image:linear-gradient(to right,rgb(0,0,0) 95%,rgba(0,0,0,0))}.axp-weather-forecast-items::-webkit-scrollbar{height:4px}.axp-weather-forecast-items::-webkit-scrollbar-thumb{background-color:rgba(255,255,255,.2);border-radius:4px}.axp-weather-forecast-day{min-width:60px;flex:0 0 auto;padding:.4rem .6rem}.axp-weather-forecast-day-name{font-size:.7rem}.axp-weather-forecast-icon{padding:.3rem;height:1.6rem}.axp-weather-forecast-temps{font-size:.7rem}.axp-weather-scroll-indicator{display:block}}@media (max-width: 400px){.axp-weather-current-weather{flex-direction:column;gap:.8rem;align-items:center}.axp-weather-temperature{font-size:2.2rem}.axp-weather-forecast-day{min-width:55px}}:host-context(.theme-dark){--glass-bg: rgba(0, 0, 0, .3);--glass-border: rgba(255, 255, 255, .1)}\n"] }]
|
|
16490
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Weather Widget Component Template -->\n<div class=\"axp-weather-container\" #containerElement>\n <!-- Loading indicator -->\n @if (isLoading()) {\n <div class=\"axp-weather-loading-overlay\">\n <div class=\"axp-weather-loading-spinner\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading weather data...</span>\n </div>\n </div>\n }\n\n <!-- Error message -->\n @if (hasError()) {\n <div class=\"axp-weather-error-overlay\">\n <div class=\"axp-weather-error-message\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <span>{{ errorMessage() }}</span>\n <button class=\"axp-weather-retry-button\" (click)=\"refreshWeather()\">\n <i class=\"fa-solid fa-sync-alt\"></i>\n <span>Retry</span>\n </button>\n </div>\n </div>\n }\n\n <!-- Weather content - only show when we have data -->\n @if (weatherData()) {\n <!-- Background decorations based on weather condition -->\n <div class=\"axp-weather-background-decorations\">\n <div class=\"axp-weather-decoration\" [ngClass]=\"weatherData()?.current?.condition?.toLowerCase()\"></div>\n <div class=\"axp-weather-gradient-overlay\"></div>\n </div>\n\n <div class=\"axp-weather-inner\">\n <!-- Location information section -->\n <div class=\"axp-weather-location-info\">\n <div class=\"axp-weather-location-icon\">\n <i class=\"fa-solid fa-location-dot\"></i>\n </div>\n <div class=\"axp-weather-location-text\">\n <h2 class=\"axp-weather-location-name\">{{ city() }}</h2>\n </div>\n </div>\n\n <!-- Current weather conditions section -->\n <div class=\"axp-weather-current-weather\">\n <!-- Weather icon and condition name -->\n @if (showCurrentCondition()) {\n <div class=\"axp-weather-condition\">\n <div class=\"axp-weather-icon-wrapper\">\n <div class=\"axp-weather-icon\">\n <i\n [class]=\"getConditionIcon(weatherData()?.current?.condition || '')\"\n [style.color]=\"getConditionColor(weatherData()?.current?.condition || '')\"\n ></i>\n </div>\n <div\n class=\"axp-weather-icon-glow\"\n [style.background-color]=\"getConditionColor(weatherData()?.current?.condition || '')\"\n ></div>\n </div>\n <div class=\"axp-weather-condition-name\">{{ getCurrentCondition() }}</div>\n </div>\n }\n\n <!-- Temperature display -->\n @if (showTemperature()) {\n <div class=\"axp-weather-temperature\">\n <span class=\"axp-weather-temperature-value\">{{ getCurrentTemperature() }}</span>\n <span class=\"axp-weather-temperature-unit\">{{ temperatureUnit() }}</span>\n </div>\n }\n </div>\n\n <!-- Weather details section (humidity and wind) -->\n @if (showHumidity() || showWind()) {\n <div class=\"axp-weather-details\">\n <!-- Humidity information -->\n @if (showHumidity()) {\n <div class=\"axp-weather-detail-item\">\n <div class=\"axp-weather-detail-icon\">\n <i class=\"fa-solid fa-droplet\"></i>\n </div>\n <div class=\"axp-weather-detail-info\">\n <div class=\"axp-weather-detail-label\">Humidity</div>\n <div class=\"axp-weather-detail-value\">{{ getHumidity() }}%</div>\n </div>\n </div>\n }\n\n <!-- Wind speed information -->\n @if (showWind()) {\n <div class=\"axp-weather-detail-item\">\n <div class=\"axp-weather-detail-icon\">\n <i class=\"fa-solid fa-wind\"></i>\n </div>\n <div class=\"axp-weather-detail-info\">\n <div class=\"axp-weather-detail-label\">Wind</div>\n <div class=\"axp-weather-detail-value\">{{ getWindSpeed() }} {{ windSpeedUnit() }}</div>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Weather forecast section -->\n @if (showForecast() && weatherData()?.forecast) {\n <div class=\"axp-weather-forecast\">\n <div class=\"axp-weather-forecast-header\">\n <h3 class=\"axp-weather-forecast-title\">\n <i class=\"fa-solid fa-calendar-days\"></i>\n <span>Forecast</span>\n </h3>\n <!-- <div class=\"axp-weather-scroll-indicator\">\n <i class=\"fa-solid fa-chevron-right\"></i>\n </div> -->\n </div>\n <!-- Loading indicator for forecast -->\n @if (isForecastLoading()) {\n <div class=\"axp-weather-forecast-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading forecast...</span>\n </div>\n }\n <!-- Scrollable forecast days display -->\n <div class=\"axp-weather-forecast-items\">\n @for (day of displayedForecast(); track day.day) {\n <div class=\"axp-weather-forecast-day\">\n <div class=\"axp-weather-forecast-day-name\">{{ day.day }}</div>\n <div class=\"axp-weather-forecast-icon\" title=\"{{ getConditionName(day.condition) }}\">\n <i [class]=\"getConditionIcon(day.condition)\" [style.color]=\"getConditionColor(day.condition)\"></i>\n </div>\n <div class=\"axp-weather-forecast-temps\">\n <span class=\"axp-weather-forecast-low\">\n {{ temperatureUnit() === '\u00B0C' ? day.minTempC : day.minTempF }}\u00B0\n </span>\n <span class=\"axp-weather-forecast-high\">\n {{ temperatureUnit() === '\u00B0C' ? day.maxTempC : day.maxTempF }}\u00B0\n </span>\n </div>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Last updated timestamp -->\n <div class=\"axp-weather-last-updated\">\n <span>Last updated: {{ getLastUpdated() }}</span>\n </div>\n\n <!-- Manual refresh button -->\n <div class=\"axp-weather-refresh-action\">\n <button\n class=\"axp-weather-refresh-button\"\n (click)=\"refreshWeather()\"\n [attr.aria-label]=\"'Refresh weather data'\"\n title=\"Refresh weather data\"\n >\n <i class=\"fa-solid fa-sync-alt\"></i>\n <span>Refresh</span>\n </button>\n </div>\n </div>\n } @else if (!isLoading() && !hasError()) {\n <!-- No data state (not loading, no error) -->\n <div class=\"axp-weather-no-data-state\">\n <i class=\"fa-solid fa-cloud-sun\"></i>\n <p>No weather data available</p>\n <button class=\"axp-weather-refresh-button\" (click)=\"refreshWeather()\">\n <i class=\"fa-solid fa-sync-alt\"></i>\n <span>Load Data</span>\n </button>\n </div>\n }\n</div>\n", styles: [":host{display:block;width:100%;height:100%;--primary-gradient-start: #2196f3;--primary-gradient-end: #1976d2;--shadow-color: rgba(0, 0, 0, .2);--glass-bg: rgba(255, 255, 255, .15);--glass-border: rgba(255, 255, 255, .2);--text-primary: rgba(255, 255, 255, .95);--text-secondary: rgba(255, 255, 255, .75);--transition-speed: .3s}.axp-weather-container{width:100%;height:100%;border-radius:8px;overflow:hidden;position:relative;box-shadow:0 4px 8px rgba(0,0,0,.1);color:#fff;min-height:300px;background-color:#2c3e50}.axp-weather-loading-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:rgba(44,62,80,.85);display:flex;justify-content:center;align-items:center;z-index:100}.axp-weather-loading-spinner{text-align:center}.axp-weather-loading-spinner i{font-size:2.5rem;color:#fff;margin-bottom:.5rem}.axp-weather-loading-spinner span{display:block;color:#fff;font-size:1rem}.axp-weather-error-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:rgba(189,54,47,.85);display:flex;justify-content:center;align-items:center;z-index:100}.axp-weather-error-message{text-align:center;padding:1rem}.axp-weather-error-message i{font-size:2.5rem;color:#fff;margin-bottom:.5rem}.axp-weather-error-message span{display:block;color:#fff;font-size:1.1rem;margin-bottom:1rem}.axp-weather-error-message .axp-weather-retry-button{color:#bd362f;border:none;border-radius:4px;padding:.5rem 1rem;font-size:1rem;cursor:pointer;transition:all .3s ease;display:inline-flex;align-items:center;gap:.5rem}.axp-weather-error-message .axp-weather-retry-button:hover{transform:translateY(-1px)}.axp-weather-no-data-state{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;padding:2rem;text-align:center}.axp-weather-no-data-state i{font-size:3rem;margin-bottom:1rem;color:rgba(255,255,255,.8)}.axp-weather-no-data-state p{margin-bottom:1.5rem;font-size:1.1rem}.axp-weather-no-data-state .axp-weather-refresh-button{background-color:rgba(255,255,255,.2);color:#fff;border:none;border-radius:4px;padding:.5rem 1rem;font-size:1rem;cursor:pointer;transition:all .3s ease;display:inline-flex;align-items:center;gap:.5rem}.axp-weather-no-data-state .axp-weather-refresh-button:hover{background-color:rgba(255,255,255,.3);transform:translateY(-1px)}.axp-weather-background-decorations{position:absolute;top:0;left:0;width:100%;height:100%;z-index:1}.axp-weather-decoration{position:absolute;top:0;left:0;width:100%;height:100%;background-size:cover;background-position:center}.axp-weather-decoration.sunny{background:linear-gradient(135deg,#ff7e00,#f7d358)}.axp-weather-decoration.partlyCloudy{background:linear-gradient(135deg,#7ba2e7,#b4d2f7)}.axp-weather-decoration.cloudy{background:linear-gradient(135deg,#717e8c,#919eab)}.axp-weather-decoration.rain{background:linear-gradient(135deg,#6a8caf,#567a9e)}.axp-weather-decoration.snow{background:linear-gradient(135deg,#99b3cc,#c6d4e1)}.axp-weather-decoration.thunder{background:linear-gradient(135deg,#425777,#2c3e50)}.axp-weather-decoration.mist{background:linear-gradient(135deg,#94a3b8,#cbd5e1)}.axp-weather-gradient-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background:linear-gradient(rgba(0,0,0,.2),rgba(0,0,0,.5))}.axp-weather-inner{position:relative;z-index:2;height:100%;padding:1.5rem;display:flex;flex-direction:column}.axp-weather-location-info{display:flex;align-items:center;margin-bottom:1.5rem}.axp-weather-location-icon{width:32px;height:32px;display:flex;align-items:center;justify-content:center;background-color:rgba(255,255,255,.2);border-radius:50%;margin-right:.75rem}.axp-weather-location-icon i{color:#fff}.axp-weather-location-name{margin:0;font-size:1.5rem;font-weight:500;text-shadow:1px 1px 3px rgba(0,0,0,.2);text-transform:capitalize}.axp-weather-current-weather{display:flex;align-items:center;justify-content:space-between;margin-bottom:1.5rem;flex-wrap:wrap}.axp-weather-condition{display:flex;flex-direction:column;align-items:center}.axp-weather-icon-wrapper{position:relative;margin-bottom:.5rem}.axp-weather-icon{position:relative;z-index:2}.axp-weather-icon i{font-size:2.75rem;filter:drop-shadow(0 0 8px rgba(0,0,0,.3))}.axp-weather-icon-glow{position:absolute;z-index:1;top:50%;left:50%;transform:translate(-50%,-50%);width:45px;height:45px;border-radius:50%;filter:blur(15px);opacity:.75}.axp-weather-condition-name{font-size:1.1rem;text-align:center;text-shadow:1px 1px 2px rgba(0,0,0,.2)}.axp-weather-temperature{display:flex;align-items:flex-start;text-shadow:1px 1px 3px rgba(0,0,0,.3)}.axp-weather-temperature-value{font-size:3.5rem;font-weight:500;line-height:1}.axp-weather-temperature-unit{font-size:1.5rem;margin-top:.25rem}.axp-weather-details{display:flex;flex-wrap:wrap;gap:1.5rem;margin-bottom:1.5rem;padding:1rem;background-color:rgba(0,0,0,.15);border-radius:8px}.axp-weather-detail-item{display:flex;align-items:center;flex:1;min-width:120px}.axp-weather-detail-icon{width:40px;height:40px;border-radius:50%;background-color:rgba(255,255,255,.2);display:flex;align-items:center;justify-content:center;margin-right:.75rem}.axp-weather-detail-icon i{font-size:1.25rem}.axp-weather-detail-info{display:flex;flex-direction:column}.axp-weather-detail-label{font-size:.875rem;color:rgba(255,255,255,.8);margin-bottom:.25rem}.axp-weather-detail-value{font-size:1.125rem;font-weight:500}.axp-weather-forecast{margin-top:auto;margin-bottom:1rem;background-color:rgba(0,0,0,.15);border-radius:8px;padding:1rem}.axp-weather-forecast-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:.75rem}.axp-weather-forecast-title{margin:0;font-size:1.125rem;font-weight:500;display:flex;align-items:center}.axp-weather-forecast-title i{margin-right:.5rem;opacity:.8}.axp-weather-scroll-indicator{color:rgba(255,255,255,.6)}.axp-weather-forecast-items{display:flex;overflow-x:auto;gap:.75rem;padding-bottom:.5rem}.axp-weather-forecast-items::-webkit-scrollbar{height:4px}.axp-weather-forecast-items::-webkit-scrollbar-thumb{background-color:rgba(255,255,255,.3);border-radius:4px}.axp-weather-forecast-items::-webkit-scrollbar-track{background-color:rgba(0,0,0,.1);border-radius:4px}.axp-weather-forecast-day{min-width:80px;display:flex;flex-direction:column;align-items:center;padding:.75rem .5rem;background-color:rgba(255,255,255,.1);border-radius:6px;transition:all .3s ease}.axp-weather-forecast-day:hover{background-color:rgba(255,255,255,.15);transform:translateY(-2px)}.axp-weather-forecast-day-name{font-size:.875rem;margin-bottom:.5rem;font-weight:500}.axp-weather-forecast-icon{font-size:1.5rem;margin-bottom:.5rem}.axp-weather-forecast-icon i{filter:drop-shadow(0 0 5px rgba(0,0,0,.2))}.axp-weather-forecast-temps{display:flex;flex-direction:row;gap:.75rem;align-items:center;font-size:.875rem}.axp-weather-last-updated{text-align:center;font-size:.75rem;opacity:.7;margin-bottom:.5rem}.axp-weather-refresh-action{text-align:center}.axp-weather-refresh-button{background-color:rgba(255,255,255,.2);color:#fff;border:none;border-radius:4px;padding:.5rem 1rem;font-size:.875rem;cursor:pointer;transition:all .3s ease;display:inline-flex;align-items:center;gap:.5rem}.axp-weather-refresh-button:hover{background-color:rgba(255,255,255,.3);transform:translateY(-1px)}.axp-weather-refresh-button i{font-size:.875rem}@media (max-width: 576px){.axp-weather-inner{padding:.8rem;gap:.4rem}.axp-weather-location-name{font-size:1.1rem}.axp-weather-temperature{font-size:2.5rem}.axp-weather-temperature-unit{font-size:1.1rem}.axp-weather-weather-details{flex-direction:column;gap:.5rem}.axp-weather-forecast-items{flex-wrap:nowrap;overflow-x:auto;padding-bottom:.5rem;margin:0 -.4rem;scroll-behavior:smooth;-webkit-overflow-scrolling:touch;scrollbar-width:thin;mask-image:linear-gradient(to right,#000 95%,rgba(0,0,0,0));-webkit-mask-image:linear-gradient(to right,rgb(0,0,0) 95%,rgba(0,0,0,0))}.axp-weather-forecast-items::-webkit-scrollbar{height:4px}.axp-weather-forecast-items::-webkit-scrollbar-thumb{background-color:rgba(255,255,255,.2);border-radius:4px}.axp-weather-forecast-day{min-width:60px;flex:0 0 auto;padding:.4rem .6rem}.axp-weather-forecast-day-name{font-size:.7rem}.axp-weather-forecast-icon{padding:.3rem;height:1.6rem}.axp-weather-forecast-temps{font-size:.7rem}.axp-weather-scroll-indicator{display:block}}:host-context(.theme-dark){--glass-bg: rgba(0, 0, 0, .3);--glass-border: rgba(255, 255, 255, .1)}\n"] }]
|
|
15803
16491
|
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }] });
|
|
15804
16492
|
|
|
15805
16493
|
var weatherWidget_component = /*#__PURE__*/Object.freeze({
|
|
@@ -16050,49 +16738,6 @@ const AXPWeatherWidget = {
|
|
|
16050
16738
|
},
|
|
16051
16739
|
};
|
|
16052
16740
|
|
|
16053
|
-
/**
|
|
16054
|
-
* Weather Widget Module
|
|
16055
|
-
* Provides weather display functionality as a dashboard widget
|
|
16056
|
-
*/
|
|
16057
|
-
class AXPWeatherWidgetModule {
|
|
16058
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: AXPWeatherWidgetModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
16059
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.0.3", ngImport: i0, type: AXPWeatherWidgetModule, imports: [HttpClientModule] }); }
|
|
16060
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: AXPWeatherWidgetModule, providers: [
|
|
16061
|
-
// You can choose which implementation to use:
|
|
16062
|
-
// Option 1: Use the mock service for development/testing
|
|
16063
|
-
{
|
|
16064
|
-
provide: AXPWeatherApiAbstract,
|
|
16065
|
-
useClass: AXPWeatherApiMockService,
|
|
16066
|
-
},
|
|
16067
|
-
// Option 2: Use the real API service for production (uncomment to use)
|
|
16068
|
-
// {
|
|
16069
|
-
// provide: AXPWeatherApiAbstract,
|
|
16070
|
-
// useClass: AXPWeatherApiService
|
|
16071
|
-
// }
|
|
16072
|
-
], imports: [HttpClientModule] }); }
|
|
16073
|
-
}
|
|
16074
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: AXPWeatherWidgetModule, decorators: [{
|
|
16075
|
-
type: NgModule,
|
|
16076
|
-
args: [{
|
|
16077
|
-
imports: [HttpClientModule],
|
|
16078
|
-
declarations: [],
|
|
16079
|
-
providers: [
|
|
16080
|
-
// You can choose which implementation to use:
|
|
16081
|
-
// Option 1: Use the mock service for development/testing
|
|
16082
|
-
{
|
|
16083
|
-
provide: AXPWeatherApiAbstract,
|
|
16084
|
-
useClass: AXPWeatherApiMockService,
|
|
16085
|
-
},
|
|
16086
|
-
// Option 2: Use the real API service for production (uncomment to use)
|
|
16087
|
-
// {
|
|
16088
|
-
// provide: AXPWeatherApiAbstract,
|
|
16089
|
-
// useClass: AXPWeatherApiService
|
|
16090
|
-
// }
|
|
16091
|
-
],
|
|
16092
|
-
exports: [],
|
|
16093
|
-
}]
|
|
16094
|
-
}] });
|
|
16095
|
-
|
|
16096
16741
|
// export interface AXPWidgetOptions {
|
|
16097
16742
|
// }
|
|
16098
16743
|
// export interface AXPWidgetConfig<T extends AXPWidgetOptions> {
|
|
@@ -17656,7 +18301,7 @@ class AXPDateTimeFilterWidgetEditComponent extends AXPValueWidgetComponent {
|
|
|
17656
18301
|
</div>
|
|
17657
18302
|
}
|
|
17658
18303
|
</div>
|
|
17659
|
-
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i5$1.AXTranslatorPipe, name: "translate" }, { kind: "ngmodule", type: AXSelectBoxModule }, { kind: "component", type: i3$1.AXSelectBoxComponent, selector: "ax-select-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "minValue", "maxValue", "value", "state", "name", "id", "type", "look", "multiple", "valueField", "textField", "disabledField", "textTemplate", "selectedItems", "dataSource", "minRecordsForSearch", "caption", "itemTemplate", "selectedTemplate", "emptyTemplate", "loadingTemplate", "dropdownWidth", "searchBoxAutoFocus"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onOpened", "onClosed"] }, { kind: "ngmodule", type: AXDateTimeBoxModule }, { kind: "component", type: i3$2.AXDateTimeBoxComponent, selector: "ax-datetime-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "minValue", "maxValue", "value", "state", "name", "depth", "id", "type", "look", "holidayDates", "allowTyping", "format"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "onOpened", "onClosed", "readonlyChange", "disabledChange", "formatChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3.AXDecoratorClearButtonComponent, selector: "ax-clear-button", inputs: ["icon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
18304
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i5$1.AXTranslatorPipe, name: "translate" }, { kind: "ngmodule", type: AXSelectBoxModule }, { kind: "component", type: i3$1.AXSelectBoxComponent, selector: "ax-select-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "minValue", "maxValue", "value", "state", "name", "id", "type", "look", "multiple", "valueField", "textField", "disabledField", "textTemplate", "selectedItems", "dataSource", "minRecordsForSearch", "caption", "itemTemplate", "selectedTemplate", "emptyTemplate", "loadingTemplate", "dropdownWidth", "searchBoxAutoFocus"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onOpened", "onClosed"] }, { kind: "ngmodule", type: AXDateTimeBoxModule }, { kind: "component", type: i3$2.AXDateTimeBoxComponent, selector: "ax-datetime-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "minValue", "maxValue", "value", "state", "name", "depth", "id", "type", "look", "holidayDates", "allowTyping", "calendar", "picker", "format"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "onOpened", "onClosed", "readonlyChange", "disabledChange", "formatChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3.AXDecoratorClearButtonComponent, selector: "ax-clear-button", inputs: ["icon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
17660
18305
|
}
|
|
17661
18306
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: AXPDateTimeFilterWidgetEditComponent, decorators: [{
|
|
17662
18307
|
type: Component,
|
|
@@ -19332,6 +19977,7 @@ class AXPWidgetsModule {
|
|
|
19332
19977
|
//charts
|
|
19333
19978
|
AXPDonutChartWidget,
|
|
19334
19979
|
AXPBarChartWidget,
|
|
19980
|
+
AXPLineChartWidget,
|
|
19335
19981
|
AXPGaugeChartWidget,
|
|
19336
19982
|
AXPStickyNoteWidget,
|
|
19337
19983
|
AXPClockCalendarWidget,
|
|
@@ -19412,6 +20058,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.3", ngImpor
|
|
|
19412
20058
|
//charts
|
|
19413
20059
|
AXPDonutChartWidget,
|
|
19414
20060
|
AXPBarChartWidget,
|
|
20061
|
+
AXPLineChartWidget,
|
|
19415
20062
|
AXPGaugeChartWidget,
|
|
19416
20063
|
AXPStickyNoteWidget,
|
|
19417
20064
|
AXPClockCalendarWidget,
|
|
@@ -19438,5 +20085,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.3", ngImpor
|
|
|
19438
20085
|
* Generated bundle index. Do not edit.
|
|
19439
20086
|
*/
|
|
19440
20087
|
|
|
19441
|
-
export { AXPAdvancedGridItemWidget, AXPAdvancedGridItemWidgetDesignerComponent, AXPAdvancedGridItemWidgetPrintComponent, AXPAdvancedGridItemWidgetViewComponent, AXPAdvancedGridOptionsWidget, AXPAdvancedGridOptionsWidgetEditComponent, AXPAdvancedGridWidget, AXPAdvancedGridWidgetDesignerComponent, AXPAdvancedGridWidgetViewComponent, AXPAvatarWidget, AXPAvatarWidgetColumnComponent, AXPAvatarWidgetDesignerComponent, AXPAvatarWidgetEditComponent, AXPAvatarWidgetPrintComponent, AXPAvatarWidgetViewComponent, AXPBarChartWidget, AXPBarChartWidgetViewComponent, AXPBetweenExpressionValidationWidget, AXPBetweenValidationWidgetEditComponent, AXPBlockWidget, AXPBlockWidgetDesignerComponent, AXPBlockWidgetViewComponent, AXPBorderWidget, AXPBorderWidgetEditComponent, AXPButtonWidget, AXPButtonWidgetViewComponent, AXPCallbackValidationWidget, AXPCallbackValidationWidgetEditComponent, AXPCheckBoxWidget, AXPCheckBoxWidgetEditComponent, AXPClockCalendarWidget, AXPClockCalendarWidgetViewComponent, AXPContactWidget, AXPContactWidgetColumnComponent, AXPContactWidgetEditComponent, AXPContactWidgetPrintComponent, AXPContactWidgetViewComponent, AXPDateTimeBoxWidget, AXPDateTimeBoxWidgetColumnComponent, AXPDateTimeBoxWidgetEditComponent, AXPDateTimeBoxWidgetFilterComponent, AXPDateTimeBoxWidgetPrintComponent, AXPDateTimeBoxWidgetViewComponent, AXPDonutChartWidget, AXPDonutChartWidgetViewComponent, AXPEmailBoxWidget, AXPEmailBoxWidgetColumnComponent, AXPEmailBoxWidgetEditComponent, AXPEmailBoxWidgetFilterComponent, AXPEmailBoxWidgetPrintComponent, AXPEmailBoxWidgetViewComponent, AXPEqualValidationWidget, AXPEqualValidationWidgetEditComponent, AXPFileBoxWidget, AXPFileBoxWidgetColumnComponent, AXPFileBoxWidgetEditComponent, AXPFileBoxWidgetFilterComponent, AXPFileBoxWidgetPrintComponent, AXPFileBoxWidgetViewComponent, AXPFileManagementService, AXPFlexOptionsWidget, AXPFlexOptionsWidgetEditComponent, AXPGalleryWidget, AXPGalleryWidgetEditComponent, AXPGalleryWidgetPrintComponent, AXPGalleryWidgetViewComponent, AXPGaugeChartWidget, AXPGaugeChartWidgetViewComponent, AXPGreaterThanExpressionValidationWidget, AXPGreaterThanValidationWidgetEditComponent, AXPGridOptionsWidget, AXPGridOptionsWidgetEditComponent, AXPLargeTextWidget, AXPLargeTextWidgetColumnComponent, AXPLargeTextWidgetEditComponent, AXPLargeTextWidgetFilterComponent, AXPLargeTextWidgetPrintComponent, AXPLargeTextWidgetViewComponent, AXPLessThanExpressionValidationWidget, AXPLessThanValidationWidgetEditComponent, AXPLinkWidget, AXPLinkWidgetColumnComponent, AXPLinkWidgetEditComponent, AXPLinkWidgetFilterComponent, AXPLinkWidgetPrintComponent, AXPLinkWidgetViewComponent, AXPMapBoxWidget, AXPMapBoxWidgetEditComponent, AXPMapBoxWidgetViewComponent, AXPMaxLengthExpressionValidationWidget, AXPMaxLengthValidationWidgetEditComponent, AXPMinLengthExpressionValidationWidget, AXPMinLengthValidationWidgetEditComponent, AXPNotificationWidget, AXPNotificationWidgetViewComponent, AXPNumberBoxWidget, AXPNumberBoxWidgetColumnComponent, AXPNumberBoxWidgetEditComponent, AXPNumberBoxWidgetFilterComponent, AXPNumberBoxWidgetPrintComponent, AXPNumberBoxWidgetViewComponent, AXPPageWidget, AXPPageWidgetViewComponent, AXPPasswordBoxWidget, AXPPasswordBoxWidgetColumnComponent, AXPPasswordBoxWidgetEditComponent, AXPPasswordBoxWidgetFilterComponent, AXPPasswordBoxWidgetPrintComponent, AXPPasswordBoxWidgetViewComponent, AXPPhoneBoxWidget, AXPPhoneBoxWidgetColumnComponent, AXPPhoneBoxWidgetEditComponent, AXPPhoneBoxWidgetFilterComponent, AXPPhoneBoxWidgetPrintComponent, AXPPhoneBoxWidgetViewComponent, AXPPropertyEditorHelper, AXPRegularExpressionValidationWidget, AXPRegularExpressionValidationWidgetEditComponent, AXPRepeaterWidget, AXPRepeaterWidgetDesignerComponent, AXPRepeaterWidgetEditComponent, AXPRepeaterWidgetPrintComponent, AXPRepeaterWidgetViewComponent, AXPRequiredValidationWidget, AXPRequiredValidationWidgetEditComponent, AXPRichTextWidget, AXPRichTextWidgetColumnComponent, AXPRichTextWidgetEditComponent, AXPRichTextWidgetFilterComponent, AXPRichTextWidgetPrintComponent, AXPRichTextWidgetViewComponent, AXPSelectBoxWidget, AXPSelectBoxWidgetColumnComponent, AXPSelectBoxWidgetEditComponent, AXPSelectBoxWidgetFilterComponent, AXPSelectBoxWidgetPrintComponent, AXPSelectBoxWidgetViewComponent, AXPSelectionListWidget, AXPSelectionListWidgetColumnComponent, AXPSelectionListWidgetDesignerComponent, AXPSelectionListWidgetEditComponent, AXPSelectionListWidgetFilterComponent, AXPSelectionListWidgetPrintComponent, AXPSelectionListWidgetViewComponent, AXPSignatureWidget, AXPSignatureWidgetColumnComponent, AXPSignatureWidgetEditComponent, AXPSignatureWidgetFilterComponent, AXPSignatureWidgetPrintComponent, AXPSignatureWidgetViewComponent, AXPSingleFileBoxWidget, AXPSingleFileBoxWidgetColumnComponent, AXPSingleFileBoxWidgetEditComponent, AXPSingleFileBoxWidgetFilterComponent, AXPSingleFileBoxWidgetPrintComponent, AXPSingleFileBoxWidgetViewComponent, AXPSpacingWidget, AXPSpacingWidgetEditComponent, AXPStickyNoteWidget, AXPStickyNoteWidgetViewComponent, AXPTaskListWidget, AXPTaskListWidgetViewComponent, AXPTemplateBoxWidget, AXPTemplateBoxWidgetColumnComponent, AXPTemplateBoxWidgetEditComponent, AXPTemplateBoxWidgetFilterComponent, AXPTemplateBoxWidgetPrintComponent, AXPTemplateBoxWidgetViewComponent, AXPTextBoxWidget, AXPTextBoxWidgetColumnComponent, AXPTextBoxWidgetEditComponent, AXPTextBoxWidgetFilterComponent, AXPTextBoxWidgetPrintComponent$1 as AXPTextBoxWidgetPrintComponent, AXPTextBoxWidgetViewComponent, AXPToggleWidget, AXPToggleWidgetColumnComponent, AXPToggleWidgetEditComponent, AXPToggleWidgetFilterComponent, AXPToggleWidgetPrintComponent, AXPToggleWidgetViewComponent, AXPWeatherApiAbstract, AXPWeatherApiMockService, AXPWeatherApiService, AXPWeatherWidget,
|
|
20088
|
+
export { AXPAdvancedGridItemWidget, AXPAdvancedGridItemWidgetDesignerComponent, AXPAdvancedGridItemWidgetPrintComponent, AXPAdvancedGridItemWidgetViewComponent, AXPAdvancedGridOptionsWidget, AXPAdvancedGridOptionsWidgetEditComponent, AXPAdvancedGridWidget, AXPAdvancedGridWidgetDesignerComponent, AXPAdvancedGridWidgetViewComponent, AXPAvatarWidget, AXPAvatarWidgetColumnComponent, AXPAvatarWidgetDesignerComponent, AXPAvatarWidgetEditComponent, AXPAvatarWidgetPrintComponent, AXPAvatarWidgetViewComponent, AXPBarChartWidget, AXPBarChartWidgetViewComponent, AXPBetweenExpressionValidationWidget, AXPBetweenValidationWidgetEditComponent, AXPBlockWidget, AXPBlockWidgetDesignerComponent, AXPBlockWidgetViewComponent, AXPBorderWidget, AXPBorderWidgetEditComponent, AXPButtonWidget, AXPButtonWidgetViewComponent, AXPCallbackValidationWidget, AXPCallbackValidationWidgetEditComponent, AXPChartBaseComponent, AXPChartColors, AXPChartTooltipComponent, AXPCheckBoxWidget, AXPCheckBoxWidgetEditComponent, AXPClockCalendarWidget, AXPClockCalendarWidgetViewComponent, AXPContactWidget, AXPContactWidgetColumnComponent, AXPContactWidgetEditComponent, AXPContactWidgetPrintComponent, AXPContactWidgetViewComponent, AXPDateTimeBoxWidget, AXPDateTimeBoxWidgetColumnComponent, AXPDateTimeBoxWidgetEditComponent, AXPDateTimeBoxWidgetFilterComponent, AXPDateTimeBoxWidgetPrintComponent, AXPDateTimeBoxWidgetViewComponent, AXPDonutChartWidget, AXPDonutChartWidgetViewComponent, AXPEmailBoxWidget, AXPEmailBoxWidgetColumnComponent, AXPEmailBoxWidgetEditComponent, AXPEmailBoxWidgetFilterComponent, AXPEmailBoxWidgetPrintComponent, AXPEmailBoxWidgetViewComponent, AXPEqualValidationWidget, AXPEqualValidationWidgetEditComponent, AXPFileBoxWidget, AXPFileBoxWidgetColumnComponent, AXPFileBoxWidgetEditComponent, AXPFileBoxWidgetFilterComponent, AXPFileBoxWidgetPrintComponent, AXPFileBoxWidgetViewComponent, AXPFileManagementService, AXPFlexOptionsWidget, AXPFlexOptionsWidgetEditComponent, AXPGalleryWidget, AXPGalleryWidgetEditComponent, AXPGalleryWidgetPrintComponent, AXPGalleryWidgetViewComponent, AXPGaugeChartWidget, AXPGaugeChartWidgetViewComponent, AXPGreaterThanExpressionValidationWidget, AXPGreaterThanValidationWidgetEditComponent, AXPGridOptionsWidget, AXPGridOptionsWidgetEditComponent, AXPLargeTextWidget, AXPLargeTextWidgetColumnComponent, AXPLargeTextWidgetEditComponent, AXPLargeTextWidgetFilterComponent, AXPLargeTextWidgetPrintComponent, AXPLargeTextWidgetViewComponent, AXPLessThanExpressionValidationWidget, AXPLessThanValidationWidgetEditComponent, AXPLineChartWidget, AXPLineChartWidgetViewComponent, AXPLinkWidget, AXPLinkWidgetColumnComponent, AXPLinkWidgetEditComponent, AXPLinkWidgetFilterComponent, AXPLinkWidgetPrintComponent, AXPLinkWidgetViewComponent, AXPMapBoxWidget, AXPMapBoxWidgetEditComponent, AXPMapBoxWidgetViewComponent, AXPMaxLengthExpressionValidationWidget, AXPMaxLengthValidationWidgetEditComponent, AXPMinLengthExpressionValidationWidget, AXPMinLengthValidationWidgetEditComponent, AXPNotificationWidget, AXPNotificationWidgetViewComponent, AXPNumberBoxWidget, AXPNumberBoxWidgetColumnComponent, AXPNumberBoxWidgetEditComponent, AXPNumberBoxWidgetFilterComponent, AXPNumberBoxWidgetPrintComponent, AXPNumberBoxWidgetViewComponent, AXPPageWidget, AXPPageWidgetViewComponent, AXPPasswordBoxWidget, AXPPasswordBoxWidgetColumnComponent, AXPPasswordBoxWidgetEditComponent, AXPPasswordBoxWidgetFilterComponent, AXPPasswordBoxWidgetPrintComponent, AXPPasswordBoxWidgetViewComponent, AXPPhoneBoxWidget, AXPPhoneBoxWidgetColumnComponent, AXPPhoneBoxWidgetEditComponent, AXPPhoneBoxWidgetFilterComponent, AXPPhoneBoxWidgetPrintComponent, AXPPhoneBoxWidgetViewComponent, AXPPropertyEditorHelper, AXPRegularExpressionValidationWidget, AXPRegularExpressionValidationWidgetEditComponent, AXPRepeaterWidget, AXPRepeaterWidgetDesignerComponent, AXPRepeaterWidgetEditComponent, AXPRepeaterWidgetPrintComponent, AXPRepeaterWidgetViewComponent, AXPRequiredValidationWidget, AXPRequiredValidationWidgetEditComponent, AXPRichTextWidget, AXPRichTextWidgetColumnComponent, AXPRichTextWidgetEditComponent, AXPRichTextWidgetFilterComponent, AXPRichTextWidgetPrintComponent, AXPRichTextWidgetViewComponent, AXPSelectBoxWidget, AXPSelectBoxWidgetColumnComponent, AXPSelectBoxWidgetEditComponent, AXPSelectBoxWidgetFilterComponent, AXPSelectBoxWidgetPrintComponent, AXPSelectBoxWidgetViewComponent, AXPSelectionListWidget, AXPSelectionListWidgetColumnComponent, AXPSelectionListWidgetDesignerComponent, AXPSelectionListWidgetEditComponent, AXPSelectionListWidgetFilterComponent, AXPSelectionListWidgetPrintComponent, AXPSelectionListWidgetViewComponent, AXPSignatureWidget, AXPSignatureWidgetColumnComponent, AXPSignatureWidgetEditComponent, AXPSignatureWidgetFilterComponent, AXPSignatureWidgetPrintComponent, AXPSignatureWidgetViewComponent, AXPSingleFileBoxWidget, AXPSingleFileBoxWidgetColumnComponent, AXPSingleFileBoxWidgetEditComponent, AXPSingleFileBoxWidgetFilterComponent, AXPSingleFileBoxWidgetPrintComponent, AXPSingleFileBoxWidgetViewComponent, AXPSpacingWidget, AXPSpacingWidgetEditComponent, AXPStickyNoteWidget, AXPStickyNoteWidgetViewComponent, AXPTaskListWidget, AXPTaskListWidgetViewComponent, AXPTemplateBoxWidget, AXPTemplateBoxWidgetColumnComponent, AXPTemplateBoxWidgetEditComponent, AXPTemplateBoxWidgetFilterComponent, AXPTemplateBoxWidgetPrintComponent, AXPTemplateBoxWidgetViewComponent, AXPTextBoxWidget, AXPTextBoxWidgetColumnComponent, AXPTextBoxWidgetEditComponent, AXPTextBoxWidgetFilterComponent, AXPTextBoxWidgetPrintComponent$1 as AXPTextBoxWidgetPrintComponent, AXPTextBoxWidgetViewComponent, AXPToggleWidget, AXPToggleWidgetColumnComponent, AXPToggleWidgetEditComponent, AXPToggleWidgetFilterComponent, AXPToggleWidgetPrintComponent, AXPToggleWidgetViewComponent, AXPWeatherApiAbstract, AXPWeatherApiMockService, AXPWeatherApiService, AXPWeatherWidget, AXPWeatherWidgetViewComponent, AXPWidgetsModule, AXP_ALLOW_MULTIPLE_PROPERTY, AXP_ALLOW_SEARCH_PROPERTY, AXP_ANIMATION_PROPERTY_GROUP, AXP_APPEARANCE_PROPERTY_GROUP, AXP_BEHAVIOR_PROPERTY_GROUP, AXP_BETWEEN_VALIDATION_PROPERTY, AXP_BG_COLOR_PROPERTY, AXP_BOX_MODEL_PROPERTY_GROUP, AXP_CALLBACK_VALIDATION_PROPERTY, AXP_COLOR_PROPERTY, AXP_CONTENT_PROPERTY, AXP_DATA_PATH_PROPERTY, AXP_DATA_PROPERTY_GROUP, AXP_DATA_SOURCE_PROPERTIES, AXP_DATA_SOURCE_PROPERTY, AXP_DATA_SOURCE_TEXT_FIELD, AXP_DATA_SOURCE_VALUE_FIELD, AXP_DATE_FORMAT_OPTIONS, AXP_DATE_FORMAT_PROPERTY, AXP_DESCRIPTION_PROPERTY, AXP_DIRECTION_PROPERTY, AXP_DISABLED_PROPERTY, AXP_DOWNLOADABLE_PROPERTY, AXP_EQUAL_VALIDATION_PROPERTY, AXP_FALSY_TEXT_PROPERTY, AXP_FONT_SIZE_PROPERTY, AXP_Flex_Box_Align_Options, AXP_Flex_Box_Alignments, AXP_Flex_Box_Justify_Options, AXP_GREATER_THAN_VALIDATION_PROPERTY, AXP_Grid_Box_Align_Items_Options, AXP_Grid_Box_Alignments, AXP_Grid_Box_Justify_Items_Options, AXP_HAS_CLEAR_BUTTON_PROPERTY, AXP_HAS_COPY_ICON_PROPERTY, AXP_HAS_EYE_ICON_PROPERTY, AXP_HAS_ICON_PROPERTY, AXP_HAS_LABEL_PROPERTY, AXP_ICON_PROPERTY, AXP_IS_LOADING_PROPERTY, AXP_LABEL_PROPERTY, AXP_LAYOUT_ADVANCED_GRID_PROPERTY, AXP_LAYOUT_BORDER_PROPERTY, AXP_LAYOUT_COLUMNS_PROPERTY, AXP_LAYOUT_COL_END_PROPERTY, AXP_LAYOUT_COL_SPAN_PROPERTY, AXP_LAYOUT_COL_START_PROPERTY, AXP_LAYOUT_FLEX_PROPERTY, AXP_LAYOUT_FLEX_PROPERTY_GROUP, AXP_LAYOUT_GAP_PROPERTY, AXP_LAYOUT_GRID_ITEM_PROPERTIES, AXP_LAYOUT_GRID_PROPERTIES, AXP_LAYOUT_GRID_PROPERTY, AXP_LAYOUT_GRID_PROPERTY_GROUP, AXP_LAYOUT_GRID_ROW_PROPERTIES, AXP_LAYOUT_ROWS_PROPERTY, AXP_LAYOUT_SPACING_PROPERTY, AXP_LESS_THAN_VALIDATION_PROPERTY, AXP_MAX_LENGTH_VALIDATION_PROPERTY, AXP_MIN_LENGTH_VALIDATION_PROPERTY, AXP_NAME_PROPERTY, AXP_PLACEHOLDER_PROPERTY, AXP_READONLY_PROPERTY, AXP_REGULAR_EXPRESSION_VALIDATION_PROPERTY, AXP_REQUIRED_VALIDATION_PROPERTY, AXP_STYLE_COLOR_PROPERTY, AXP_STYLE_LOOK_PROPERTY, AXP_STYLING_PROPERTY_GROUP, AXP_TABLE_COLUMN_HEIGHT_PROPERTY, AXP_TABLE_COLUMN_WIDTH_PROPERTY, AXP_TEXT_FIELD_PROPERTY, AXP_TEXT_PROPERTY, AXP_THEME_PROPERTY, AXP_TIMEZONE_OPTIONS, AXP_TITLE_PROPERTY, AXP_TRULY_TEXT_PROPERTY, AXP_VALIDATION_PROPERTY_GROUP, AXP_VALUE_FIELD_PROPERTY, AXP_WIDGETS_CHART_CATEGORY, AXP_WIDGETS_UTILITY_CATEGORY, AXP_WIDGET_PROPERTY_GROUP, 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, booleanDefaultProperty, findNonEmptyBreakpoints, largeTextDefaultProperty, loadD3, numberDefaultProperty, numberMaxValueProperty, numberMinValueProperty, plainTextDefaultProperty };
|
|
19442
20089
|
//# sourceMappingURL=acorex-platform-widgets.mjs.map
|