@testgorilla/tgo-ui 5.1.2 → 5.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,52 +1,262 @@
1
1
  import * as i0 from '@angular/core';
2
- import { EventEmitter, signal, Output, Input, ChangeDetectionStrategy, Component, NgModule } from '@angular/core';
3
- import * as i1 from '@testgorilla/tgo-ui/components/button';
2
+ import { input, model, output, inject, DestroyRef, signal, computed, ChangeDetectionStrategy, Component, NgModule } from '@angular/core';
3
+ import { trigger, transition, style, animate } from '@angular/animations';
4
+ import * as i1 from '@angular/forms';
5
+ import { FormControl, ReactiveFormsModule } from '@angular/forms';
6
+ import * as i9 from '@testgorilla/tgo-ui/components/core';
7
+ import { IS_MOBILE_TOKEN, UiTranslatePipe, MemoizeFuncPipe } from '@testgorilla/tgo-ui/components/core';
8
+ import { toSignal, takeUntilDestroyed } from '@angular/core/rxjs-interop';
9
+ import { Subject, debounceTime, distinctUntilChanged } from 'rxjs';
10
+ import * as i2 from '@testgorilla/tgo-ui/components/button';
4
11
  import { ButtonComponentModule } from '@testgorilla/tgo-ui/components/button';
5
- import * as i2 from '@testgorilla/tgo-ui/components/core';
6
- import { UiTranslatePipe } from '@testgorilla/tgo-ui/components/core';
7
- import * as i3 from '@angular/common';
8
- import { AsyncPipe } from '@angular/common';
12
+ import * as i3 from '@testgorilla/tgo-ui/components/card';
13
+ import { CardComponentModule } from '@testgorilla/tgo-ui/components/card';
14
+ import * as i4 from '@testgorilla/tgo-ui/components/tag';
15
+ import { TagComponentModule } from '@testgorilla/tgo-ui/components/tag';
16
+ import * as i5 from '@testgorilla/tgo-ui/components/field';
17
+ import { FieldComponentModule } from '@testgorilla/tgo-ui/components/field';
18
+ import * as i6 from '@testgorilla/tgo-ui/components/ai-caveat';
19
+ import { AiCaveatComponentModule } from '@testgorilla/tgo-ui/components/ai-caveat';
20
+ import * as i7 from '@testgorilla/tgo-ui/components/icon';
21
+ import { IconComponentModule } from '@testgorilla/tgo-ui/components/icon';
22
+ import * as i8 from '@angular/common';
23
+ import { CommonModule, AsyncPipe } from '@angular/common';
24
+
25
+ var AiFeedbackPanelType;
26
+ (function (AiFeedbackPanelType) {
27
+ AiFeedbackPanelType["POSITIVE"] = "positive";
28
+ AiFeedbackPanelType["NEGATIVE"] = "negative";
29
+ })(AiFeedbackPanelType || (AiFeedbackPanelType = {}));
9
30
 
10
31
  class AiFeedbackComponent {
11
32
  constructor() {
12
- this.tooltipPosition = 'above';
13
- this.selectedValue = new EventEmitter();
14
- this.selected = signal(null);
15
- this.optionYes = 'yes';
16
- this.optionNo = 'no';
33
+ this.positiveConfig = input();
34
+ this.negativeConfig = input();
35
+ this.skipPanelForPositive = input(false);
36
+ this.applicationTheme = input('light');
37
+ this.variant = input('default');
38
+ this.isRatingDisabled = input(false);
39
+ this.enableAutoEmit = input(false);
40
+ this.isPositiveFeedback = model(null);
41
+ this.selectionChange = output();
42
+ this.feedbackSubmitted = output();
43
+ this.feedbackCancelled = output();
44
+ this.feedbackChanged = output();
45
+ this.isMobile$ = inject(IS_MOBILE_TOKEN);
46
+ this.destroyRef = inject(DestroyRef);
47
+ this.isMobile = toSignal(this.isMobile$, { initialValue: false });
48
+ this.showPanel = signal(false);
49
+ this.panelType = signal(null);
50
+ this.selectedOptions = signal([]);
51
+ this.otherTextControl = new FormControl('');
52
+ this.otherTextValue = signal('');
53
+ this.selectedOptionsSubject = new Subject();
54
+ this.otherTextSubject = new Subject();
55
+ this.translationContext = 'AI_FEEDBACK.';
56
+ this.AiFeedbackPanelType = AiFeedbackPanelType;
57
+ this.defaultPositiveTitle = `${this.translationContext}POSITIVE_TITLE`;
58
+ this.defaultNegativeTitle = `${this.translationContext}NEGATIVE_TITLE`;
59
+ this.OTHER_OPTION_ID = 'other';
60
+ this.shouldAutoEmit = computed(() => this.enableAutoEmit() && this.variant() !== 'default');
61
+ this.activeConfig = computed(() => {
62
+ const type = this.panelType();
63
+ if (type === AiFeedbackPanelType.POSITIVE) {
64
+ const config = this.positiveConfig();
65
+ if (this.variant() === 'panel' && config?.options?.length) {
66
+ return this.ensureOtherOption(config);
67
+ }
68
+ return config;
69
+ }
70
+ if (type === AiFeedbackPanelType.NEGATIVE) {
71
+ const config = this.negativeConfig();
72
+ if (this.variant() === 'panel' && config?.options?.length) {
73
+ return this.ensureOtherOption(config);
74
+ }
75
+ return config;
76
+ }
77
+ return null;
78
+ });
79
+ this.arrowPosition = computed(() => (this.panelType() === AiFeedbackPanelType.POSITIVE ? 'left' : 'right'));
80
+ this.isSubmitDisabled = computed(() => {
81
+ switch (this.variant()) {
82
+ case 'input-only':
83
+ return this.otherTextValue().trim().length === 0;
84
+ case 'panel':
85
+ return this.selectedOptions().length === 0;
86
+ case 'default':
87
+ default:
88
+ return false;
89
+ }
90
+ });
91
+ }
92
+ ngOnInit() {
93
+ this.otherTextControl.valueChanges.subscribe(value => {
94
+ this.otherTextValue.set(value || '');
95
+ if (this.shouldAutoEmit()) {
96
+ this.otherTextSubject.next(value || '');
97
+ }
98
+ });
99
+ this.selectedOptionsSubject
100
+ .pipe(debounceTime(500), distinctUntilChanged((prev, curr) => JSON.stringify(prev) === JSON.stringify(curr)), takeUntilDestroyed(this.destroyRef))
101
+ .subscribe(() => {
102
+ this.feedbackChanged.emit({
103
+ isPositiveFeedback: this.isPositiveFeedback(),
104
+ selectedOptions: this.selectedOptions(),
105
+ otherText: this.otherTextControl.value || undefined,
106
+ });
107
+ });
108
+ this.otherTextSubject
109
+ .pipe(debounceTime(500), distinctUntilChanged(), takeUntilDestroyed(this.destroyRef))
110
+ .subscribe(() => {
111
+ this.feedbackChanged.emit({
112
+ isPositiveFeedback: this.isPositiveFeedback(),
113
+ selectedOptions: this.selectedOptions(),
114
+ otherText: this.otherTextControl.value || undefined,
115
+ });
116
+ });
117
+ }
118
+ getDefaultPanelTitleTranslation(panelType) {
119
+ return panelType === AiFeedbackPanelType.POSITIVE ? this.defaultPositiveTitle : this.defaultNegativeTitle;
120
+ }
121
+ ensureOtherOption(config) {
122
+ if (this.variant() === 'input-only') {
123
+ return config;
124
+ }
125
+ const hasOther = config.options?.some(opt => opt.id === this.OTHER_OPTION_ID);
126
+ return hasOther
127
+ ? config
128
+ : {
129
+ ...config,
130
+ options: [...(config.options || []), { id: this.OTHER_OPTION_ID, label: 'Other' }],
131
+ };
132
+ }
133
+ buildFeedbackData() {
134
+ if (this.variant() === 'input-only') {
135
+ return {
136
+ isPositiveFeedback: this.isPositiveFeedback(),
137
+ otherText: this.otherTextControl.value || undefined,
138
+ };
139
+ }
140
+ return {
141
+ isPositiveFeedback: this.isPositiveFeedback(),
142
+ selectedOptions: this.selectedOptions(),
143
+ otherText: this.otherTextControl.value || undefined,
144
+ };
145
+ }
146
+ resetPanelState() {
147
+ this.showPanel.set(false);
148
+ this.panelType.set(null);
149
+ this.selectedOptions.set([]);
150
+ this.otherTextControl.setValue('');
17
151
  }
18
- set selection(selection) {
19
- this.selected.set(selection || null);
152
+ shouldShowPanelForVariant() {
153
+ return this.variant() === 'panel' || this.variant() === 'input-only';
20
154
  }
21
- onSelectionChange(selection) {
22
- const newValue = this.selected() === selection ? null : selection;
23
- this.selected.set(newValue);
24
- this.selectedValue.emit(this.selected());
155
+ onSelectionChange(isPositive) {
156
+ if (this.isRatingDisabled()) {
157
+ return;
158
+ }
159
+ const newValue = this.isPositiveFeedback() === isPositive ? null : isPositive;
160
+ this.isPositiveFeedback.set(newValue);
161
+ this.selectionChange.emit(newValue);
162
+ if (newValue !== null) {
163
+ const shouldSkipPanel = isPositive && this.skipPanelForPositive();
164
+ if (this.shouldShowPanelForVariant() && !shouldSkipPanel) {
165
+ this.panelType.set(isPositive ? AiFeedbackPanelType.POSITIVE : AiFeedbackPanelType.NEGATIVE);
166
+ this.showPanel.set(true);
167
+ this.selectedOptions.set([]);
168
+ this.otherTextControl.setValue('');
169
+ }
170
+ }
171
+ else {
172
+ this.closePanel();
173
+ }
174
+ }
175
+ toggleOption(optionId) {
176
+ const current = this.selectedOptions();
177
+ const updated = current.includes(optionId) ? current.filter(id => id !== optionId) : [...current, optionId];
178
+ this.selectedOptions.set(updated);
179
+ if (this.shouldAutoEmit()) {
180
+ this.selectedOptionsSubject.next(updated);
181
+ }
182
+ }
183
+ isOptionSelected(optionId) {
184
+ return this.selectedOptions().includes(optionId);
185
+ }
186
+ showOtherField() {
187
+ return this.variant() === 'input-only' || this.selectedOptions().includes(this.OTHER_OPTION_ID);
188
+ }
189
+ onSubmit() {
190
+ this.feedbackSubmitted.emit(this.buildFeedbackData());
191
+ this.showPanel.set(false);
192
+ }
193
+ closePanel() {
194
+ this.feedbackCancelled.emit(this.buildFeedbackData());
195
+ this.resetPanelState();
25
196
  }
26
197
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: AiFeedbackComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.18", type: AiFeedbackComponent, isStandalone: false, selector: "ui-ai-feedback", inputs: { selection: "selection", tooltipPosition: "tooltipPosition" }, outputs: { selectedValue: "selectedValue" }, ngImport: i0, template: "<div class=\"ai-feedback\" [attr.aria-label]=\"'AI_FEEDBACK.TITLE' | uiTranslate\">\n <span>{{ 'AI_FEEDBACK.TITLE' | uiTranslate | async}}</span>\n <div class=\"ai-feedback-buttons\">\n @if(selected() !== optionNo) {\n <ui-button\n [justIcon]=\"true\"\n [iconName]=\"'Thumb-up-in-line'\"\n [size]=\"'small'\"\n [tooltipPosition]=\"tooltipPosition\"\n [tooltip]=\"('COMMON.YES' | uiTranslate | async)!\"\n [ariaLabel]=\"('COMMON.YES' | uiTranslate | async)!\"\n [iconFilled]=\"selected() === optionYes\"\n (buttonClickEvent)=\"onSelectionChange(optionYes)\"\n variant=\"icon-button\"\n role=\"button\"\n ></ui-button>\n }\n\n @if(selected() !== optionYes) {\n <ui-button\n [justIcon]=\"true\"\n [iconName]=\"'Thumb-down-in-line'\"\n [iconFilled]=\"selected() === optionNo\"\n [tooltip]=\"('COMMON.NO' | uiTranslate | async)!\"\n [ariaLabel]=\"('COMMON.NO' | uiTranslate | async)!\"\n [size]=\"'small'\"\n (buttonClickEvent)=\"onSelectionChange(optionNo)\"\n variant=\"icon-button\"\n role=\"button\"\n ></ui-button>\n }\n </div>\n</div>\n", styles: [".bg-teal-60b{background:#1c443c}.bg-teal-30b{background:#31766a}.bg-teal-default{background:#46a997}.bg-teal-30w{background:#7ec3b6}.bg-teal-60w{background:#b5ddd5}.bg-teal-secondary{background:#cbd6cb}.bg-teal-90w{background:#ecf6f5}.bg-petrol-60b{background:#102930}.bg-petrol-30b{background:#1b4754}.bg-petrol-default{background:#276678}.bg-petrol-30w{background:#6894a0}.bg-petrol-60w{background:#a9c2c9}.bg-petrol-secondary{background:#c8d7de}.bg-petrol-90w{background:#e9f0f1}.bg-error-60b{background:#513131}.bg-error-30b{background:#8e5655}.bg-error-60w{background:#e3c3c6}.bg-error-secondary{background:#f0dad9}.bg-error-default{background:#cb7b7a}.bg-warning-secondary{background:#f0d6bb}.bg-warning-default{background:#cca45f}.bg-black{background:#000}.bg-dark{background:#888}.bg-medium{background:#e0e0e0}.bg-grey{background:#ededed}.bg-light{background:#f6f6f6}.bg-white{background:#fff}.bg-box-shadow{background:#00000014}.bg-navigation-subtitle{background:#528593}.bgc-teal-60b{background-color:#1c443c}.bgc-teal-30b{background-color:#31766a}.bgc-teal-default{background-color:#46a997}.bgc-teal-30w{background-color:#7ec3b6}.bgc-teal-60w{background-color:#b5ddd5}.bgc-teal-secondary{background-color:#cbd6cb}.bgc-teal-90w{background-color:#ecf6f5}.bgc-petrol-60b{background-color:#102930}.bgc-petrol-30b{background-color:#1b4754}.bgc-petrol-default{background-color:#276678}.bgc-petrol-30w{background-color:#6894a0}.bgc-petrol-60w{background-color:#a9c2c9}.bgc-petrol-secondary{background-color:#c8d7de}.bgc-petrol-90w{background-color:#e9f0f1}.bgc-error-60b{background-color:#513131}.bgc-error-30b{background-color:#8e5655}.bgc-error-60w{background-color:#e3c3c6}.bgc-error-secondary{background-color:#f0dad9}.bgc-error-default{background-color:#cb7b7a}.bgc-warning-secondary{background-color:#f0d6bb}.bgc-warning-default{background-color:#cca45f}.bgc-black{background-color:#000}.bgc-dark{background-color:#888}.bgc-medium{background-color:#e0e0e0}.bgc-grey{background-color:#ededed}.bgc-light{background-color:#f6f6f6}.bgc-white{background-color:#fff}.bgc-box-shadow{background-color:#00000014}.bgc-navigation-subtitle{background-color:#528593}.ai-feedback,.ai-feedback-buttons{display:flex;flex-flow:row nowrap;align-items:center}.ai-feedback>span{color:#666;margin-right:16px}.ai-feedback-buttons{justify-content:center}.ai-feedback-buttons>ui-button:first-child{margin-right:8px}\n"], dependencies: [{ kind: "component", type: i1.ButtonComponent, selector: "ui-button", inputs: ["size", "variant", "label", "iconPosition", "justIcon", "iconName", "disabled", "loading", "fullWidth", "url", "urlTarget", "value", "tooltip", "isPremium", "type", "companyColor", "buttonBadgeConfig", "applicationTheme", "disabledScaleOnClick", "ariaLabel", "ariaRequired", "ariaLabelledby", "ariaDescribedby", "preventDefault", "hasBackground", "tooltipPosition", "role", "iconFilled"], outputs: ["buttonClickEvent", "buttonHoverEvent"] }, { kind: "pipe", type: i2.UiTranslatePipe, name: "uiTranslate" }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
198
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.18", type: AiFeedbackComponent, isStandalone: false, selector: "ui-ai-feedback", inputs: { positiveConfig: { classPropertyName: "positiveConfig", publicName: "positiveConfig", isSignal: true, isRequired: false, transformFunction: null }, negativeConfig: { classPropertyName: "negativeConfig", publicName: "negativeConfig", isSignal: true, isRequired: false, transformFunction: null }, skipPanelForPositive: { classPropertyName: "skipPanelForPositive", publicName: "skipPanelForPositive", isSignal: true, isRequired: false, transformFunction: null }, applicationTheme: { classPropertyName: "applicationTheme", publicName: "applicationTheme", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, isRatingDisabled: { classPropertyName: "isRatingDisabled", publicName: "isRatingDisabled", isSignal: true, isRequired: false, transformFunction: null }, enableAutoEmit: { classPropertyName: "enableAutoEmit", publicName: "enableAutoEmit", isSignal: true, isRequired: false, transformFunction: null }, isPositiveFeedback: { classPropertyName: "isPositiveFeedback", publicName: "isPositiveFeedback", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { isPositiveFeedback: "isPositiveFeedbackChange", selectionChange: "selectionChange", feedbackSubmitted: "feedbackSubmitted", feedbackCancelled: "feedbackCancelled", feedbackChanged: "feedbackChanged" }, ngImport: i0, template: "<div class=\"ai-feedback-wrapper\">\n <div class=\"ai-feedback\" [attr.aria-label]=\"translationContext + 'TITLE' | uiTranslate\" role=\"group\">\n <ui-ai-caveat [applicationTheme]=\"applicationTheme()\"></ui-ai-caveat>\n\n <div class=\"ai-feedback-buttons-section\">\n @if (isRatingDisabled()) {\n <div class=\"ai-feedback-saved\">\n <span class=\"ai-feedback-saved-text\">{{ translationContext + 'RATING_SAVED' | uiTranslate | async }}</span>\n <ui-icon\n [name]=\"isPositiveFeedback() ? 'Thumb-up-filled' : 'Thumb-down-filled'\"\n [filled]=\"true\"\n [applicationTheme]=\"applicationTheme()\"\n [color]=\"'gray'\"\n />\n </div>\n } @else {\n <span class=\"ai-feedback-label\">{{ translationContext + 'TITLE' | uiTranslate | async }}</span>\n\n <div\n class=\"ai-feedback-buttons\"\n role=\"group\"\n [attr.aria-expanded]=\"showPanel()\"\n [attr.aria-controls]=\"showPanel() ? 'feedback-panel' : null\"\n >\n <ui-button\n class=\"ai-feedback-button-positive\"\n data-testid=\"ai-feedback-button-positive\"\n [justIcon]=\"true\"\n [iconName]=\"'Thumb-up-in-line'\"\n [size]=\"'small'\"\n [tooltip]=\"('COMMON.YES' | uiTranslate | async)!\"\n [ariaLabel]=\"('COMMON.YES' | uiTranslate | async)!\"\n [iconFilled]=\"isPositiveFeedback() === true\"\n (buttonClickEvent)=\"onSelectionChange(true)\"\n variant=\"icon-button\"\n role=\"button\"\n >\n </ui-button>\n\n <ui-button\n data-testid=\"ai-feedback-button-negative\"\n [justIcon]=\"true\"\n [iconName]=\"'Thumb-down-in-line'\"\n [size]=\"'small'\"\n [tooltip]=\"('COMMON.NO' | uiTranslate | async)!\"\n [ariaLabel]=\"('COMMON.NO' | uiTranslate | async)!\"\n [iconFilled]=\"isPositiveFeedback() === false\"\n (buttonClickEvent)=\"onSelectionChange(false)\"\n variant=\"icon-button\"\n role=\"button\"\n >\n </ui-button>\n </div>\n }\n </div>\n </div>\n\n @if (showPanel()) {\n @let panelTitle =\n activeConfig()?.title ??\n (panelType() | memoizeFunc: getDefaultPanelTitleTranslation : this | uiTranslate | async);\n\n <ui-card\n id=\"feedback-panel\"\n class=\"feedback-panel\"\n [class.arrow-left]=\"arrowPosition() === 'left'\"\n [class.arrow-right]=\"arrowPosition() === 'right'\"\n [applicationTheme]=\"applicationTheme()\"\n [size]=\"isMobile() ? 'small' : 'medium'\"\n role=\"region\"\n [attr.aria-label]=\"panelTitle\"\n [@slideDown]\n >\n <div class=\"feedback-panel-arrow\"></div>\n\n <div class=\"feedback-panel-content\">\n <div class=\"feedback-panel-title-container\">\n <h4 class=\"feedback-panel-title\">\n {{ panelTitle }}\n </h4>\n\n <ui-button\n [justIcon]=\"true\"\n [iconName]=\"'Close-filled'\"\n [size]=\"'small'\"\n [ariaLabel]=\"'Close feedback panel'\"\n variant=\"icon-button\"\n (buttonClickEvent)=\"closePanel()\"\n >\n </ui-button>\n </div>\n\n @if (variant() === 'panel' && activeConfig()?.options && activeConfig()!.options!.length > 0) {\n <div class=\"feedback-options\">\n @for (option of activeConfig()?.options; track option.id) {\n <ui-tag\n [label]=\"option.label\"\n [isSelected]=\"isOptionSelected(option.id)\"\n [showIconWhenSelected]=\"true\"\n [applicationTheme]=\"applicationTheme()\"\n (press)=\"toggleOption(option.id)\"\n >\n </ui-tag>\n }\n </div>\n }\n\n @if (showOtherField()) {\n <ui-field\n class=\"feedback-field\"\n type=\"text\"\n [label]=\"\n activeConfig()?.otherPlaceholder ?? (translationContext + 'OTHER_PLACEHOLDER' | uiTranslate | async) ?? ''\n \"\n [formControl]=\"otherTextControl\"\n [applicationTheme]=\"applicationTheme()\"\n [fullWidth]=\"true\"\n [showBottomContent]=\"false\"\n >\n </ui-field>\n }\n\n <div class=\"feedback-submit-container\">\n <ui-button\n [label]=\"(translationContext + 'SUBMIT' | uiTranslate | async) || ''\"\n [disabled]=\"isSubmitDisabled()\"\n [size]=\"'small'\"\n [fullWidth]=\"isMobile()\"\n (buttonClickEvent)=\"onSubmit()\"\n variant=\"primary\"\n >\n </ui-button>\n </div>\n </div>\n </ui-card>\n }\n</div>\n", styles: [".bg-teal-60b{background:#1c443c}.bg-teal-30b{background:#31766a}.bg-teal-default{background:#46a997}.bg-teal-30w{background:#7ec3b6}.bg-teal-60w{background:#b5ddd5}.bg-teal-secondary{background:#cbd6cb}.bg-teal-90w{background:#ecf6f5}.bg-petrol-60b{background:#102930}.bg-petrol-30b{background:#1b4754}.bg-petrol-default{background:#276678}.bg-petrol-30w{background:#6894a0}.bg-petrol-60w{background:#a9c2c9}.bg-petrol-secondary{background:#c8d7de}.bg-petrol-90w{background:#e9f0f1}.bg-error-60b{background:#513131}.bg-error-30b{background:#8e5655}.bg-error-60w{background:#e3c3c6}.bg-error-secondary{background:#f0dad9}.bg-error-default{background:#cb7b7a}.bg-warning-secondary{background:#f0d6bb}.bg-warning-default{background:#cca45f}.bg-black{background:#000}.bg-dark{background:#888}.bg-medium{background:#e0e0e0}.bg-grey{background:#ededed}.bg-light{background:#f6f6f6}.bg-white{background:#fff}.bg-box-shadow{background:#00000014}.bg-navigation-subtitle{background:#528593}.bgc-teal-60b{background-color:#1c443c}.bgc-teal-30b{background-color:#31766a}.bgc-teal-default{background-color:#46a997}.bgc-teal-30w{background-color:#7ec3b6}.bgc-teal-60w{background-color:#b5ddd5}.bgc-teal-secondary{background-color:#cbd6cb}.bgc-teal-90w{background-color:#ecf6f5}.bgc-petrol-60b{background-color:#102930}.bgc-petrol-30b{background-color:#1b4754}.bgc-petrol-default{background-color:#276678}.bgc-petrol-30w{background-color:#6894a0}.bgc-petrol-60w{background-color:#a9c2c9}.bgc-petrol-secondary{background-color:#c8d7de}.bgc-petrol-90w{background-color:#e9f0f1}.bgc-error-60b{background-color:#513131}.bgc-error-30b{background-color:#8e5655}.bgc-error-60w{background-color:#e3c3c6}.bgc-error-secondary{background-color:#f0dad9}.bgc-error-default{background-color:#cb7b7a}.bgc-warning-secondary{background-color:#f0d6bb}.bgc-warning-default{background-color:#cca45f}.bgc-black{background-color:#000}.bgc-dark{background-color:#888}.bgc-medium{background-color:#e0e0e0}.bgc-grey{background-color:#ededed}.bgc-light{background-color:#f6f6f6}.bgc-white{background-color:#fff}.bgc-box-shadow{background-color:#00000014}.bgc-navigation-subtitle{background-color:#528593}.ai-feedback-wrapper{position:relative}.ai-feedback{display:flex;flex-flow:row nowrap;align-items:center;justify-content:space-between;gap:16px;padding-right:4px}@media (max-width: 600px){.ai-feedback{flex-wrap:wrap}}.ai-feedback-buttons-section{display:flex;flex-flow:row nowrap;align-items:center;gap:8px;color:#666}@media (max-width: 600px){.ai-feedback-buttons-section{flex:1 0 100%;justify-content:space-between}}.ai-feedback-buttons{display:flex;flex-flow:row nowrap;align-items:center;justify-content:center}.ai-feedback-button-positive{margin-right:8px}.ai-feedback-saved{display:flex;flex-flow:row nowrap;align-items:center;gap:8px}.ai-feedback-saved-text{font-size:12px;color:#666}.feedback-panel{display:block;margin-top:16px}.feedback-panel-arrow{position:absolute;top:-8px;width:16px;height:16px;background:inherit;border-left:1px solid;border-top:1px solid;border-color:inherit;transform:rotate(45deg);transition:right .2s ease-out}.feedback-panel.arrow-left .feedback-panel-arrow{right:40px}.feedback-panel.arrow-right .feedback-panel-arrow{right:8px}.feedback-panel-content{position:relative}.feedback-panel-title-container{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}.feedback-panel-title{font-size:16px;font-weight:600;color:#242424}.feedback-options{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:16px}.feedback-field{margin-bottom:16px}.feedback-submit-container{display:flex;justify-content:flex-end}@media (max-width: 600px){.feedback-submit-container{display:block}}\n"], dependencies: [{ kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i2.ButtonComponent, selector: "ui-button", inputs: ["size", "variant", "label", "iconPosition", "justIcon", "iconName", "disabled", "loading", "fullWidth", "url", "urlTarget", "value", "tooltip", "isPremium", "type", "companyColor", "buttonBadgeConfig", "applicationTheme", "disabledScaleOnClick", "ariaLabel", "ariaRequired", "ariaLabelledby", "ariaDescribedby", "preventDefault", "hasBackground", "tooltipPosition", "role", "iconFilled"], outputs: ["buttonClickEvent", "buttonHoverEvent"] }, { kind: "component", type: i3.CardComponent, selector: "ui-card", inputs: ["size", "variant", "applicationTheme", "errors", "errorsSize", "selected", "allowSelect", "allowFocus"], outputs: ["cardSelected"] }, { kind: "component", type: i4.TagComponent, selector: "ui-tag", inputs: ["label", "icon", "allowClose", "readOnly", "isSelected", "showIconWhenSelected", "isDisabled", "applicationTheme", "ariaLabel", "ariaRequired"], outputs: ["close", "press"] }, { kind: "component", type: i5.FieldComponent, selector: "ui-field", inputs: ["fullWidth", "fullHeight", "label", "labelHtml", "labelIcon", "fieldName", "placeholder", "id", "value", "badgeVariant", "errors", "disabled", "required", "readOnly", "hintMessage", "type", "updateOnBlur", "allowOnlyDigits", "isAutocompleteOff", "allowNegative", "showBottomContent", "applicationTheme", "ariaLabel", "loading", "isValid", "maxCharacters", "trimOnBlur", "trimOnSubmit", "maxRows", "hasTextAreaCounter", "hideBuiltInErrors", "hideLabelInErrors", "max", "min", "textareaHeight", "borderless", "autosizableTextarea", "isAIVariant", "ariaLabelledby", "ariaDescribedby", "hasError"], outputs: ["validateEvent", "fieldBlur"] }, { kind: "component", type: i6.AiCaveatComponent, selector: "ui-ai-caveat", inputs: ["applicationTheme"] }, { kind: "component", type: i7.IconComponent, selector: "ui-icon", inputs: ["size", "cssClass", "name", "color", "filled", "toggleIconStyle", "applicationTheme", "useFullIconName"] }, { kind: "pipe", type: i8.AsyncPipe, name: "async" }, { kind: "pipe", type: i9.UiTranslatePipe, name: "uiTranslate" }, { kind: "pipe", type: i9.MemoizeFuncPipe, name: "memoizeFunc" }], animations: [
199
+ trigger('slideDown', [
200
+ transition(':enter', [
201
+ style({ height: 0, opacity: 0, overflow: 'hidden' }),
202
+ animate('200ms ease-out', style({ height: '*', opacity: 1 })),
203
+ ]),
204
+ transition(':leave', [animate('200ms ease-in', style({ height: 0, opacity: 0, overflow: 'hidden' }))]),
205
+ ]),
206
+ ], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28
207
  }
29
208
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: AiFeedbackComponent, decorators: [{
30
209
  type: Component,
31
- args: [{ selector: 'ui-ai-feedback', changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<div class=\"ai-feedback\" [attr.aria-label]=\"'AI_FEEDBACK.TITLE' | uiTranslate\">\n <span>{{ 'AI_FEEDBACK.TITLE' | uiTranslate | async}}</span>\n <div class=\"ai-feedback-buttons\">\n @if(selected() !== optionNo) {\n <ui-button\n [justIcon]=\"true\"\n [iconName]=\"'Thumb-up-in-line'\"\n [size]=\"'small'\"\n [tooltipPosition]=\"tooltipPosition\"\n [tooltip]=\"('COMMON.YES' | uiTranslate | async)!\"\n [ariaLabel]=\"('COMMON.YES' | uiTranslate | async)!\"\n [iconFilled]=\"selected() === optionYes\"\n (buttonClickEvent)=\"onSelectionChange(optionYes)\"\n variant=\"icon-button\"\n role=\"button\"\n ></ui-button>\n }\n\n @if(selected() !== optionYes) {\n <ui-button\n [justIcon]=\"true\"\n [iconName]=\"'Thumb-down-in-line'\"\n [iconFilled]=\"selected() === optionNo\"\n [tooltip]=\"('COMMON.NO' | uiTranslate | async)!\"\n [ariaLabel]=\"('COMMON.NO' | uiTranslate | async)!\"\n [size]=\"'small'\"\n (buttonClickEvent)=\"onSelectionChange(optionNo)\"\n variant=\"icon-button\"\n role=\"button\"\n ></ui-button>\n }\n </div>\n</div>\n", styles: [".bg-teal-60b{background:#1c443c}.bg-teal-30b{background:#31766a}.bg-teal-default{background:#46a997}.bg-teal-30w{background:#7ec3b6}.bg-teal-60w{background:#b5ddd5}.bg-teal-secondary{background:#cbd6cb}.bg-teal-90w{background:#ecf6f5}.bg-petrol-60b{background:#102930}.bg-petrol-30b{background:#1b4754}.bg-petrol-default{background:#276678}.bg-petrol-30w{background:#6894a0}.bg-petrol-60w{background:#a9c2c9}.bg-petrol-secondary{background:#c8d7de}.bg-petrol-90w{background:#e9f0f1}.bg-error-60b{background:#513131}.bg-error-30b{background:#8e5655}.bg-error-60w{background:#e3c3c6}.bg-error-secondary{background:#f0dad9}.bg-error-default{background:#cb7b7a}.bg-warning-secondary{background:#f0d6bb}.bg-warning-default{background:#cca45f}.bg-black{background:#000}.bg-dark{background:#888}.bg-medium{background:#e0e0e0}.bg-grey{background:#ededed}.bg-light{background:#f6f6f6}.bg-white{background:#fff}.bg-box-shadow{background:#00000014}.bg-navigation-subtitle{background:#528593}.bgc-teal-60b{background-color:#1c443c}.bgc-teal-30b{background-color:#31766a}.bgc-teal-default{background-color:#46a997}.bgc-teal-30w{background-color:#7ec3b6}.bgc-teal-60w{background-color:#b5ddd5}.bgc-teal-secondary{background-color:#cbd6cb}.bgc-teal-90w{background-color:#ecf6f5}.bgc-petrol-60b{background-color:#102930}.bgc-petrol-30b{background-color:#1b4754}.bgc-petrol-default{background-color:#276678}.bgc-petrol-30w{background-color:#6894a0}.bgc-petrol-60w{background-color:#a9c2c9}.bgc-petrol-secondary{background-color:#c8d7de}.bgc-petrol-90w{background-color:#e9f0f1}.bgc-error-60b{background-color:#513131}.bgc-error-30b{background-color:#8e5655}.bgc-error-60w{background-color:#e3c3c6}.bgc-error-secondary{background-color:#f0dad9}.bgc-error-default{background-color:#cb7b7a}.bgc-warning-secondary{background-color:#f0d6bb}.bgc-warning-default{background-color:#cca45f}.bgc-black{background-color:#000}.bgc-dark{background-color:#888}.bgc-medium{background-color:#e0e0e0}.bgc-grey{background-color:#ededed}.bgc-light{background-color:#f6f6f6}.bgc-white{background-color:#fff}.bgc-box-shadow{background-color:#00000014}.bgc-navigation-subtitle{background-color:#528593}.ai-feedback,.ai-feedback-buttons{display:flex;flex-flow:row nowrap;align-items:center}.ai-feedback>span{color:#666;margin-right:16px}.ai-feedback-buttons{justify-content:center}.ai-feedback-buttons>ui-button:first-child{margin-right:8px}\n"] }]
32
- }], propDecorators: { selection: [{
33
- type: Input
34
- }], tooltipPosition: [{
35
- type: Input
36
- }], selectedValue: [{
37
- type: Output
38
- }] } });
210
+ args: [{ selector: 'ui-ai-feedback', changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, animations: [
211
+ trigger('slideDown', [
212
+ transition(':enter', [
213
+ style({ height: 0, opacity: 0, overflow: 'hidden' }),
214
+ animate('200ms ease-out', style({ height: '*', opacity: 1 })),
215
+ ]),
216
+ transition(':leave', [animate('200ms ease-in', style({ height: 0, opacity: 0, overflow: 'hidden' }))]),
217
+ ]),
218
+ ], template: "<div class=\"ai-feedback-wrapper\">\n <div class=\"ai-feedback\" [attr.aria-label]=\"translationContext + 'TITLE' | uiTranslate\" role=\"group\">\n <ui-ai-caveat [applicationTheme]=\"applicationTheme()\"></ui-ai-caveat>\n\n <div class=\"ai-feedback-buttons-section\">\n @if (isRatingDisabled()) {\n <div class=\"ai-feedback-saved\">\n <span class=\"ai-feedback-saved-text\">{{ translationContext + 'RATING_SAVED' | uiTranslate | async }}</span>\n <ui-icon\n [name]=\"isPositiveFeedback() ? 'Thumb-up-filled' : 'Thumb-down-filled'\"\n [filled]=\"true\"\n [applicationTheme]=\"applicationTheme()\"\n [color]=\"'gray'\"\n />\n </div>\n } @else {\n <span class=\"ai-feedback-label\">{{ translationContext + 'TITLE' | uiTranslate | async }}</span>\n\n <div\n class=\"ai-feedback-buttons\"\n role=\"group\"\n [attr.aria-expanded]=\"showPanel()\"\n [attr.aria-controls]=\"showPanel() ? 'feedback-panel' : null\"\n >\n <ui-button\n class=\"ai-feedback-button-positive\"\n data-testid=\"ai-feedback-button-positive\"\n [justIcon]=\"true\"\n [iconName]=\"'Thumb-up-in-line'\"\n [size]=\"'small'\"\n [tooltip]=\"('COMMON.YES' | uiTranslate | async)!\"\n [ariaLabel]=\"('COMMON.YES' | uiTranslate | async)!\"\n [iconFilled]=\"isPositiveFeedback() === true\"\n (buttonClickEvent)=\"onSelectionChange(true)\"\n variant=\"icon-button\"\n role=\"button\"\n >\n </ui-button>\n\n <ui-button\n data-testid=\"ai-feedback-button-negative\"\n [justIcon]=\"true\"\n [iconName]=\"'Thumb-down-in-line'\"\n [size]=\"'small'\"\n [tooltip]=\"('COMMON.NO' | uiTranslate | async)!\"\n [ariaLabel]=\"('COMMON.NO' | uiTranslate | async)!\"\n [iconFilled]=\"isPositiveFeedback() === false\"\n (buttonClickEvent)=\"onSelectionChange(false)\"\n variant=\"icon-button\"\n role=\"button\"\n >\n </ui-button>\n </div>\n }\n </div>\n </div>\n\n @if (showPanel()) {\n @let panelTitle =\n activeConfig()?.title ??\n (panelType() | memoizeFunc: getDefaultPanelTitleTranslation : this | uiTranslate | async);\n\n <ui-card\n id=\"feedback-panel\"\n class=\"feedback-panel\"\n [class.arrow-left]=\"arrowPosition() === 'left'\"\n [class.arrow-right]=\"arrowPosition() === 'right'\"\n [applicationTheme]=\"applicationTheme()\"\n [size]=\"isMobile() ? 'small' : 'medium'\"\n role=\"region\"\n [attr.aria-label]=\"panelTitle\"\n [@slideDown]\n >\n <div class=\"feedback-panel-arrow\"></div>\n\n <div class=\"feedback-panel-content\">\n <div class=\"feedback-panel-title-container\">\n <h4 class=\"feedback-panel-title\">\n {{ panelTitle }}\n </h4>\n\n <ui-button\n [justIcon]=\"true\"\n [iconName]=\"'Close-filled'\"\n [size]=\"'small'\"\n [ariaLabel]=\"'Close feedback panel'\"\n variant=\"icon-button\"\n (buttonClickEvent)=\"closePanel()\"\n >\n </ui-button>\n </div>\n\n @if (variant() === 'panel' && activeConfig()?.options && activeConfig()!.options!.length > 0) {\n <div class=\"feedback-options\">\n @for (option of activeConfig()?.options; track option.id) {\n <ui-tag\n [label]=\"option.label\"\n [isSelected]=\"isOptionSelected(option.id)\"\n [showIconWhenSelected]=\"true\"\n [applicationTheme]=\"applicationTheme()\"\n (press)=\"toggleOption(option.id)\"\n >\n </ui-tag>\n }\n </div>\n }\n\n @if (showOtherField()) {\n <ui-field\n class=\"feedback-field\"\n type=\"text\"\n [label]=\"\n activeConfig()?.otherPlaceholder ?? (translationContext + 'OTHER_PLACEHOLDER' | uiTranslate | async) ?? ''\n \"\n [formControl]=\"otherTextControl\"\n [applicationTheme]=\"applicationTheme()\"\n [fullWidth]=\"true\"\n [showBottomContent]=\"false\"\n >\n </ui-field>\n }\n\n <div class=\"feedback-submit-container\">\n <ui-button\n [label]=\"(translationContext + 'SUBMIT' | uiTranslate | async) || ''\"\n [disabled]=\"isSubmitDisabled()\"\n [size]=\"'small'\"\n [fullWidth]=\"isMobile()\"\n (buttonClickEvent)=\"onSubmit()\"\n variant=\"primary\"\n >\n </ui-button>\n </div>\n </div>\n </ui-card>\n }\n</div>\n", styles: [".bg-teal-60b{background:#1c443c}.bg-teal-30b{background:#31766a}.bg-teal-default{background:#46a997}.bg-teal-30w{background:#7ec3b6}.bg-teal-60w{background:#b5ddd5}.bg-teal-secondary{background:#cbd6cb}.bg-teal-90w{background:#ecf6f5}.bg-petrol-60b{background:#102930}.bg-petrol-30b{background:#1b4754}.bg-petrol-default{background:#276678}.bg-petrol-30w{background:#6894a0}.bg-petrol-60w{background:#a9c2c9}.bg-petrol-secondary{background:#c8d7de}.bg-petrol-90w{background:#e9f0f1}.bg-error-60b{background:#513131}.bg-error-30b{background:#8e5655}.bg-error-60w{background:#e3c3c6}.bg-error-secondary{background:#f0dad9}.bg-error-default{background:#cb7b7a}.bg-warning-secondary{background:#f0d6bb}.bg-warning-default{background:#cca45f}.bg-black{background:#000}.bg-dark{background:#888}.bg-medium{background:#e0e0e0}.bg-grey{background:#ededed}.bg-light{background:#f6f6f6}.bg-white{background:#fff}.bg-box-shadow{background:#00000014}.bg-navigation-subtitle{background:#528593}.bgc-teal-60b{background-color:#1c443c}.bgc-teal-30b{background-color:#31766a}.bgc-teal-default{background-color:#46a997}.bgc-teal-30w{background-color:#7ec3b6}.bgc-teal-60w{background-color:#b5ddd5}.bgc-teal-secondary{background-color:#cbd6cb}.bgc-teal-90w{background-color:#ecf6f5}.bgc-petrol-60b{background-color:#102930}.bgc-petrol-30b{background-color:#1b4754}.bgc-petrol-default{background-color:#276678}.bgc-petrol-30w{background-color:#6894a0}.bgc-petrol-60w{background-color:#a9c2c9}.bgc-petrol-secondary{background-color:#c8d7de}.bgc-petrol-90w{background-color:#e9f0f1}.bgc-error-60b{background-color:#513131}.bgc-error-30b{background-color:#8e5655}.bgc-error-60w{background-color:#e3c3c6}.bgc-error-secondary{background-color:#f0dad9}.bgc-error-default{background-color:#cb7b7a}.bgc-warning-secondary{background-color:#f0d6bb}.bgc-warning-default{background-color:#cca45f}.bgc-black{background-color:#000}.bgc-dark{background-color:#888}.bgc-medium{background-color:#e0e0e0}.bgc-grey{background-color:#ededed}.bgc-light{background-color:#f6f6f6}.bgc-white{background-color:#fff}.bgc-box-shadow{background-color:#00000014}.bgc-navigation-subtitle{background-color:#528593}.ai-feedback-wrapper{position:relative}.ai-feedback{display:flex;flex-flow:row nowrap;align-items:center;justify-content:space-between;gap:16px;padding-right:4px}@media (max-width: 600px){.ai-feedback{flex-wrap:wrap}}.ai-feedback-buttons-section{display:flex;flex-flow:row nowrap;align-items:center;gap:8px;color:#666}@media (max-width: 600px){.ai-feedback-buttons-section{flex:1 0 100%;justify-content:space-between}}.ai-feedback-buttons{display:flex;flex-flow:row nowrap;align-items:center;justify-content:center}.ai-feedback-button-positive{margin-right:8px}.ai-feedback-saved{display:flex;flex-flow:row nowrap;align-items:center;gap:8px}.ai-feedback-saved-text{font-size:12px;color:#666}.feedback-panel{display:block;margin-top:16px}.feedback-panel-arrow{position:absolute;top:-8px;width:16px;height:16px;background:inherit;border-left:1px solid;border-top:1px solid;border-color:inherit;transform:rotate(45deg);transition:right .2s ease-out}.feedback-panel.arrow-left .feedback-panel-arrow{right:40px}.feedback-panel.arrow-right .feedback-panel-arrow{right:8px}.feedback-panel-content{position:relative}.feedback-panel-title-container{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}.feedback-panel-title{font-size:16px;font-weight:600;color:#242424}.feedback-options{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:16px}.feedback-field{margin-bottom:16px}.feedback-submit-container{display:flex;justify-content:flex-end}@media (max-width: 600px){.feedback-submit-container{display:block}}\n"] }]
219
+ }] });
39
220
 
40
221
  class AiFeedbackModule {
41
222
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: AiFeedbackModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
42
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.18", ngImport: i0, type: AiFeedbackModule, declarations: [AiFeedbackComponent], imports: [ButtonComponentModule, UiTranslatePipe, AsyncPipe], exports: [AiFeedbackComponent] }); }
43
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: AiFeedbackModule, imports: [ButtonComponentModule] }); }
223
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.18", ngImport: i0, type: AiFeedbackModule, declarations: [AiFeedbackComponent], imports: [CommonModule,
224
+ AsyncPipe,
225
+ ReactiveFormsModule,
226
+ ButtonComponentModule,
227
+ CardComponentModule,
228
+ TagComponentModule,
229
+ FieldComponentModule,
230
+ AiCaveatComponentModule,
231
+ IconComponentModule,
232
+ UiTranslatePipe,
233
+ MemoizeFuncPipe], exports: [AiFeedbackComponent] }); }
234
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: AiFeedbackModule, imports: [CommonModule,
235
+ ReactiveFormsModule,
236
+ ButtonComponentModule,
237
+ CardComponentModule,
238
+ TagComponentModule,
239
+ FieldComponentModule,
240
+ AiCaveatComponentModule,
241
+ IconComponentModule] }); }
44
242
  }
45
243
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: AiFeedbackModule, decorators: [{
46
244
  type: NgModule,
47
245
  args: [{
48
246
  declarations: [AiFeedbackComponent],
49
- imports: [ButtonComponentModule, UiTranslatePipe, AsyncPipe],
247
+ imports: [
248
+ CommonModule,
249
+ AsyncPipe,
250
+ ReactiveFormsModule,
251
+ ButtonComponentModule,
252
+ CardComponentModule,
253
+ TagComponentModule,
254
+ FieldComponentModule,
255
+ AiCaveatComponentModule,
256
+ IconComponentModule,
257
+ UiTranslatePipe,
258
+ MemoizeFuncPipe,
259
+ ],
50
260
  exports: [AiFeedbackComponent],
51
261
  }]
52
262
  }] });
@@ -55,5 +265,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImpo
55
265
  * Generated bundle index. Do not edit.
56
266
  */
57
267
 
58
- export { AiFeedbackComponent, AiFeedbackModule };
268
+ export { AiFeedbackComponent, AiFeedbackModule, AiFeedbackPanelType };
59
269
  //# sourceMappingURL=testgorilla-tgo-ui-components-ai-feedback.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"testgorilla-tgo-ui-components-ai-feedback.mjs","sources":["../../../components/ai-feedback/ai-feedback.component.ts","../../../components/ai-feedback/ai-feedback.component.html","../../../components/ai-feedback/ai-feedback.module.ts","../../../components/ai-feedback/testgorilla-tgo-ui-components-ai-feedback.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, signal } from '@angular/core';\nimport { AiFeedbackSelection } from './ai-feedback.model';\nimport { TooltipPosition } from '@angular/material/tooltip';\n\n@Component({\n selector: 'ui-ai-feedback',\n templateUrl: './ai-feedback.component.html',\n styleUrl: './ai-feedback.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class AiFeedbackComponent {\n @Input() set selection(selection: AiFeedbackSelection) {\n this.selected.set(selection || null);\n }\n\n @Input() tooltipPosition: TooltipPosition = 'above';\n\n @Output() selectedValue: EventEmitter<AiFeedbackSelection> = new EventEmitter<AiFeedbackSelection>();\n\n selected = signal<AiFeedbackSelection>(null);\n readonly optionYes: AiFeedbackSelection = 'yes';\n readonly optionNo: AiFeedbackSelection = 'no';\n\n onSelectionChange(selection: AiFeedbackSelection): void {\n const newValue = this.selected() === selection ? null : selection;\n this.selected.set(newValue);\n\n this.selectedValue.emit(this.selected());\n }\n}\n","<div class=\"ai-feedback\" [attr.aria-label]=\"'AI_FEEDBACK.TITLE' | uiTranslate\">\n <span>{{ 'AI_FEEDBACK.TITLE' | uiTranslate | async}}</span>\n <div class=\"ai-feedback-buttons\">\n @if(selected() !== optionNo) {\n <ui-button\n [justIcon]=\"true\"\n [iconName]=\"'Thumb-up-in-line'\"\n [size]=\"'small'\"\n [tooltipPosition]=\"tooltipPosition\"\n [tooltip]=\"('COMMON.YES' | uiTranslate | async)!\"\n [ariaLabel]=\"('COMMON.YES' | uiTranslate | async)!\"\n [iconFilled]=\"selected() === optionYes\"\n (buttonClickEvent)=\"onSelectionChange(optionYes)\"\n variant=\"icon-button\"\n role=\"button\"\n ></ui-button>\n }\n\n @if(selected() !== optionYes) {\n <ui-button\n [justIcon]=\"true\"\n [iconName]=\"'Thumb-down-in-line'\"\n [iconFilled]=\"selected() === optionNo\"\n [tooltip]=\"('COMMON.NO' | uiTranslate | async)!\"\n [ariaLabel]=\"('COMMON.NO' | uiTranslate | async)!\"\n [size]=\"'small'\"\n (buttonClickEvent)=\"onSelectionChange(optionNo)\"\n variant=\"icon-button\"\n role=\"button\"\n ></ui-button>\n }\n </div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { AiFeedbackComponent } from './ai-feedback.component';\nimport { UiTranslatePipe } from '@testgorilla/tgo-ui/components/core';\nimport { ButtonComponentModule } from '@testgorilla/tgo-ui/components/button';\nimport { AsyncPipe } from '@angular/common';\n\n@NgModule({\n declarations: [AiFeedbackComponent],\n imports: [ButtonComponentModule, UiTranslatePipe, AsyncPipe],\n exports: [AiFeedbackComponent],\n})\nexport class AiFeedbackModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"testgorilla-tgo-ui-components-ai-feedback.mjs","sources":["../../../components/ai-feedback/ai-feedback.model.ts","../../../components/ai-feedback/ai-feedback.component.ts","../../../components/ai-feedback/ai-feedback.component.html","../../../components/ai-feedback/ai-feedback.module.ts","../../../components/ai-feedback/testgorilla-tgo-ui-components-ai-feedback.ts"],"sourcesContent":["export enum AiFeedbackPanelType {\n POSITIVE = 'positive',\n NEGATIVE = 'negative',\n}\n\nexport type AiFeedbackVariant = 'default' | 'panel' | 'input-only';\n\nexport interface AiFeedbackOption {\n id: string;\n label: string;\n}\n\nexport interface AiFeedbackConfig {\n title: string;\n options?: AiFeedbackOption[]; // \"Other\" option will be automatically appended if options are provided\n otherPlaceholder?: string;\n}\n\nexport interface AiFeedbackData {\n isPositiveFeedback: boolean | null;\n selectedOptions?: string[];\n otherText?: string;\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n inject,\n input,\n model,\n OnInit,\n output,\n signal,\n} from '@angular/core';\nimport { trigger, transition, style, animate } from '@angular/animations';\nimport { FormControl } from '@angular/forms';\nimport { AiFeedbackPanelType, AiFeedbackConfig, AiFeedbackData, AiFeedbackVariant } from './ai-feedback.model';\nimport { ApplicationTheme, IS_MOBILE_TOKEN } from '@testgorilla/tgo-ui/components/core';\nimport { toSignal, takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Subject, debounceTime, distinctUntilChanged } from 'rxjs';\n\n@Component({\n selector: 'ui-ai-feedback',\n templateUrl: './ai-feedback.component.html',\n styleUrl: './ai-feedback.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false,\n animations: [\n trigger('slideDown', [\n transition(':enter', [\n style({ height: 0, opacity: 0, overflow: 'hidden' }),\n animate('200ms ease-out', style({ height: '*', opacity: 1 })),\n ]),\n transition(':leave', [animate('200ms ease-in', style({ height: 0, opacity: 0, overflow: 'hidden' }))]),\n ]),\n ],\n})\nexport class AiFeedbackComponent implements OnInit {\n positiveConfig = input<AiFeedbackConfig>();\n negativeConfig = input<AiFeedbackConfig>();\n skipPanelForPositive = input<boolean>(false);\n applicationTheme = input<ApplicationTheme>('light');\n variant = input<AiFeedbackVariant>('default');\n isRatingDisabled = input<boolean>(false);\n enableAutoEmit = input<boolean>(false);\n isPositiveFeedback = model<boolean | null>(null);\n\n selectionChange = output<boolean | null>();\n feedbackSubmitted = output<AiFeedbackData>();\n feedbackCancelled = output<AiFeedbackData>();\n feedbackChanged = output<AiFeedbackData>();\n\n protected readonly isMobile$ = inject(IS_MOBILE_TOKEN);\n private destroyRef = inject(DestroyRef);\n\n isMobile = toSignal(this.isMobile$, { initialValue: false });\n\n showPanel = signal<boolean>(false);\n panelType = signal<AiFeedbackPanelType | null>(null);\n selectedOptions = signal<string[]>([]);\n otherTextControl = new FormControl<string>('');\n otherTextValue = signal<string>('');\n\n private selectedOptionsSubject = new Subject<string[]>();\n private otherTextSubject = new Subject<string>();\n\n readonly translationContext = 'AI_FEEDBACK.';\n readonly AiFeedbackPanelType = AiFeedbackPanelType;\n private readonly defaultPositiveTitle = `${this.translationContext}POSITIVE_TITLE`;\n private readonly defaultNegativeTitle = `${this.translationContext}NEGATIVE_TITLE`;\n private readonly OTHER_OPTION_ID = 'other';\n\n shouldAutoEmit = computed(() => this.enableAutoEmit() && this.variant() !== 'default');\n\n ngOnInit(): void {\n this.otherTextControl.valueChanges.subscribe(value => {\n this.otherTextValue.set(value || '');\n\n if (this.shouldAutoEmit()) {\n this.otherTextSubject.next(value || '');\n }\n });\n\n this.selectedOptionsSubject\n .pipe(\n debounceTime(500),\n distinctUntilChanged((prev, curr) => JSON.stringify(prev) === JSON.stringify(curr)),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe(() => {\n this.feedbackChanged.emit({\n isPositiveFeedback: this.isPositiveFeedback(),\n selectedOptions: this.selectedOptions(),\n otherText: this.otherTextControl.value || undefined,\n });\n });\n\n this.otherTextSubject\n .pipe(debounceTime(500), distinctUntilChanged(), takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.feedbackChanged.emit({\n isPositiveFeedback: this.isPositiveFeedback(),\n selectedOptions: this.selectedOptions(),\n otherText: this.otherTextControl.value || undefined,\n });\n });\n }\n\n getDefaultPanelTitleTranslation(panelType: AiFeedbackPanelType | null): string {\n return panelType === AiFeedbackPanelType.POSITIVE ? this.defaultPositiveTitle : this.defaultNegativeTitle;\n }\n\n activeConfig = computed(() => {\n const type = this.panelType();\n\n if (type === AiFeedbackPanelType.POSITIVE) {\n const config = this.positiveConfig();\n if (this.variant() === 'panel' && config?.options?.length) {\n return this.ensureOtherOption(config);\n }\n return config;\n }\n\n if (type === AiFeedbackPanelType.NEGATIVE) {\n const config = this.negativeConfig();\n if (this.variant() === 'panel' && config?.options?.length) {\n return this.ensureOtherOption(config);\n }\n return config;\n }\n\n return null;\n });\n\n arrowPosition = computed(() => (this.panelType() === AiFeedbackPanelType.POSITIVE ? 'left' : 'right'));\n\n isSubmitDisabled = computed(() => {\n switch (this.variant()) {\n case 'input-only':\n return this.otherTextValue().trim().length === 0;\n case 'panel':\n return this.selectedOptions().length === 0;\n case 'default':\n default:\n return false;\n }\n });\n\n private ensureOtherOption(config: AiFeedbackConfig): AiFeedbackConfig {\n if (this.variant() === 'input-only') {\n return config;\n }\n const hasOther = config.options?.some(opt => opt.id === this.OTHER_OPTION_ID);\n return hasOther\n ? config\n : {\n ...config,\n options: [...(config.options || []), { id: this.OTHER_OPTION_ID, label: 'Other' }],\n };\n }\n\n private buildFeedbackData(): AiFeedbackData {\n if (this.variant() === 'input-only') {\n return {\n isPositiveFeedback: this.isPositiveFeedback(),\n otherText: this.otherTextControl.value || undefined,\n };\n }\n return {\n isPositiveFeedback: this.isPositiveFeedback(),\n selectedOptions: this.selectedOptions(),\n otherText: this.otherTextControl.value || undefined,\n };\n }\n\n private resetPanelState(): void {\n this.showPanel.set(false);\n this.panelType.set(null);\n this.selectedOptions.set([]);\n this.otherTextControl.setValue('');\n }\n\n private shouldShowPanelForVariant(): boolean {\n return this.variant() === 'panel' || this.variant() === 'input-only';\n }\n\n onSelectionChange(isPositive: boolean): void {\n if (this.isRatingDisabled()) {\n return;\n }\n\n const newValue = this.isPositiveFeedback() === isPositive ? null : isPositive;\n this.isPositiveFeedback.set(newValue);\n\n this.selectionChange.emit(newValue);\n\n if (newValue !== null) {\n const shouldSkipPanel = isPositive && this.skipPanelForPositive();\n\n if (this.shouldShowPanelForVariant() && !shouldSkipPanel) {\n this.panelType.set(isPositive ? AiFeedbackPanelType.POSITIVE : AiFeedbackPanelType.NEGATIVE);\n this.showPanel.set(true);\n this.selectedOptions.set([]);\n this.otherTextControl.setValue('');\n }\n } else {\n this.closePanel();\n }\n }\n\n toggleOption(optionId: string): void {\n const current = this.selectedOptions();\n const updated = current.includes(optionId) ? current.filter(id => id !== optionId) : [...current, optionId];\n this.selectedOptions.set(updated);\n\n if (this.shouldAutoEmit()) {\n this.selectedOptionsSubject.next(updated);\n }\n }\n\n isOptionSelected(optionId: string): boolean {\n return this.selectedOptions().includes(optionId);\n }\n\n showOtherField(): boolean {\n return this.variant() === 'input-only' || this.selectedOptions().includes(this.OTHER_OPTION_ID);\n }\n\n onSubmit(): void {\n this.feedbackSubmitted.emit(this.buildFeedbackData());\n this.showPanel.set(false);\n }\n\n closePanel(): void {\n this.feedbackCancelled.emit(this.buildFeedbackData());\n this.resetPanelState();\n }\n}\n","<div class=\"ai-feedback-wrapper\">\n <div class=\"ai-feedback\" [attr.aria-label]=\"translationContext + 'TITLE' | uiTranslate\" role=\"group\">\n <ui-ai-caveat [applicationTheme]=\"applicationTheme()\"></ui-ai-caveat>\n\n <div class=\"ai-feedback-buttons-section\">\n @if (isRatingDisabled()) {\n <div class=\"ai-feedback-saved\">\n <span class=\"ai-feedback-saved-text\">{{ translationContext + 'RATING_SAVED' | uiTranslate | async }}</span>\n <ui-icon\n [name]=\"isPositiveFeedback() ? 'Thumb-up-filled' : 'Thumb-down-filled'\"\n [filled]=\"true\"\n [applicationTheme]=\"applicationTheme()\"\n [color]=\"'gray'\"\n />\n </div>\n } @else {\n <span class=\"ai-feedback-label\">{{ translationContext + 'TITLE' | uiTranslate | async }}</span>\n\n <div\n class=\"ai-feedback-buttons\"\n role=\"group\"\n [attr.aria-expanded]=\"showPanel()\"\n [attr.aria-controls]=\"showPanel() ? 'feedback-panel' : null\"\n >\n <ui-button\n class=\"ai-feedback-button-positive\"\n data-testid=\"ai-feedback-button-positive\"\n [justIcon]=\"true\"\n [iconName]=\"'Thumb-up-in-line'\"\n [size]=\"'small'\"\n [tooltip]=\"('COMMON.YES' | uiTranslate | async)!\"\n [ariaLabel]=\"('COMMON.YES' | uiTranslate | async)!\"\n [iconFilled]=\"isPositiveFeedback() === true\"\n (buttonClickEvent)=\"onSelectionChange(true)\"\n variant=\"icon-button\"\n role=\"button\"\n >\n </ui-button>\n\n <ui-button\n data-testid=\"ai-feedback-button-negative\"\n [justIcon]=\"true\"\n [iconName]=\"'Thumb-down-in-line'\"\n [size]=\"'small'\"\n [tooltip]=\"('COMMON.NO' | uiTranslate | async)!\"\n [ariaLabel]=\"('COMMON.NO' | uiTranslate | async)!\"\n [iconFilled]=\"isPositiveFeedback() === false\"\n (buttonClickEvent)=\"onSelectionChange(false)\"\n variant=\"icon-button\"\n role=\"button\"\n >\n </ui-button>\n </div>\n }\n </div>\n </div>\n\n @if (showPanel()) {\n @let panelTitle =\n activeConfig()?.title ??\n (panelType() | memoizeFunc: getDefaultPanelTitleTranslation : this | uiTranslate | async);\n\n <ui-card\n id=\"feedback-panel\"\n class=\"feedback-panel\"\n [class.arrow-left]=\"arrowPosition() === 'left'\"\n [class.arrow-right]=\"arrowPosition() === 'right'\"\n [applicationTheme]=\"applicationTheme()\"\n [size]=\"isMobile() ? 'small' : 'medium'\"\n role=\"region\"\n [attr.aria-label]=\"panelTitle\"\n [@slideDown]\n >\n <div class=\"feedback-panel-arrow\"></div>\n\n <div class=\"feedback-panel-content\">\n <div class=\"feedback-panel-title-container\">\n <h4 class=\"feedback-panel-title\">\n {{ panelTitle }}\n </h4>\n\n <ui-button\n [justIcon]=\"true\"\n [iconName]=\"'Close-filled'\"\n [size]=\"'small'\"\n [ariaLabel]=\"'Close feedback panel'\"\n variant=\"icon-button\"\n (buttonClickEvent)=\"closePanel()\"\n >\n </ui-button>\n </div>\n\n @if (variant() === 'panel' && activeConfig()?.options && activeConfig()!.options!.length > 0) {\n <div class=\"feedback-options\">\n @for (option of activeConfig()?.options; track option.id) {\n <ui-tag\n [label]=\"option.label\"\n [isSelected]=\"isOptionSelected(option.id)\"\n [showIconWhenSelected]=\"true\"\n [applicationTheme]=\"applicationTheme()\"\n (press)=\"toggleOption(option.id)\"\n >\n </ui-tag>\n }\n </div>\n }\n\n @if (showOtherField()) {\n <ui-field\n class=\"feedback-field\"\n type=\"text\"\n [label]=\"\n activeConfig()?.otherPlaceholder ?? (translationContext + 'OTHER_PLACEHOLDER' | uiTranslate | async) ?? ''\n \"\n [formControl]=\"otherTextControl\"\n [applicationTheme]=\"applicationTheme()\"\n [fullWidth]=\"true\"\n [showBottomContent]=\"false\"\n >\n </ui-field>\n }\n\n <div class=\"feedback-submit-container\">\n <ui-button\n [label]=\"(translationContext + 'SUBMIT' | uiTranslate | async) || ''\"\n [disabled]=\"isSubmitDisabled()\"\n [size]=\"'small'\"\n [fullWidth]=\"isMobile()\"\n (buttonClickEvent)=\"onSubmit()\"\n variant=\"primary\"\n >\n </ui-button>\n </div>\n </div>\n </ui-card>\n }\n</div>\n","import { NgModule } from '@angular/core';\nimport { CommonModule, AsyncPipe } from '@angular/common';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { AiFeedbackComponent } from './ai-feedback.component';\nimport { UiTranslatePipe, MemoizeFuncPipe } from '@testgorilla/tgo-ui/components/core';\nimport { ButtonComponentModule } from '@testgorilla/tgo-ui/components/button';\nimport { CardComponentModule } from '@testgorilla/tgo-ui/components/card';\nimport { TagComponentModule } from '@testgorilla/tgo-ui/components/tag';\nimport { FieldComponentModule } from '@testgorilla/tgo-ui/components/field';\nimport { AiCaveatComponentModule } from '@testgorilla/tgo-ui/components/ai-caveat';\nimport { IconComponentModule } from '@testgorilla/tgo-ui/components/icon';\n\n@NgModule({\n declarations: [AiFeedbackComponent],\n imports: [\n CommonModule,\n AsyncPipe,\n ReactiveFormsModule,\n ButtonComponentModule,\n CardComponentModule,\n TagComponentModule,\n FieldComponentModule,\n AiCaveatComponentModule,\n IconComponentModule,\n UiTranslatePipe,\n MemoizeFuncPipe,\n ],\n exports: [AiFeedbackComponent],\n})\nexport class AiFeedbackModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -924,7 +924,12 @@ var AVATAR$b = {
924
924
  EDIT_AVATAR: "Edit profile photo"
925
925
  };
926
926
  var AI_FEEDBACK$b = {
927
- TITLE: "Were these suggestions useful?"
927
+ TITLE: "Were these suggestions useful?",
928
+ POSITIVE_TITLE: "What did you like about these suggestions?",
929
+ NEGATIVE_TITLE: "What didn't you like about these suggestions?",
930
+ SUBMIT: "Submit",
931
+ OTHER_PLACEHOLDER: "Tell us more",
932
+ RATING_SAVED: "Rating saved."
928
933
  };
929
934
  var AI_CAVEAT = {
930
935
  DISCLAIMER: "AI can make mistakes. Review for accuracy."