@bbq-chat/widgets-angular 1.0.8 → 1.0.10
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/README.md +119 -0
- package/fesm2022/index.mjs +153 -13
- package/fesm2022/index.mjs.map +1 -1
- package/package.json +1 -1
- package/types/index.d.ts +45 -4
package/README.md
CHANGED
|
@@ -131,6 +131,125 @@ export class AppComponent implements OnInit {
|
|
|
131
131
|
}
|
|
132
132
|
```
|
|
133
133
|
|
|
134
|
+
### FormValidationService
|
|
135
|
+
|
|
136
|
+
Service for monitoring and debugging form validation events. This is useful for:
|
|
137
|
+
- Debugging form validation logic across the application
|
|
138
|
+
- Showing validation state in a centralized UI component
|
|
139
|
+
- Building custom validation handling workflows
|
|
140
|
+
|
|
141
|
+
The service emits validation events whenever a form is validated, allowing any component in your application to subscribe to validation state changes without direct access to a specific form instance.
|
|
142
|
+
|
|
143
|
+
**API:**
|
|
144
|
+
|
|
145
|
+
```typescript
|
|
146
|
+
interface FormValidationEvent {
|
|
147
|
+
formId: string;
|
|
148
|
+
valid: boolean;
|
|
149
|
+
errors: Array<{ field: string; reason?: string }>;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
@Injectable({ providedIn: 'root' })
|
|
153
|
+
export class FormValidationService {
|
|
154
|
+
get validation$(): Observable<FormValidationEvent>
|
|
155
|
+
emit(event: FormValidationEvent): void
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
**Example - Direct Service Subscription:**
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
import { Component, OnInit, OnDestroy } from '@angular/core';
|
|
163
|
+
import { FormValidationService } from '@bbq-chat/widgets-angular';
|
|
164
|
+
import { Subscription } from 'rxjs';
|
|
165
|
+
|
|
166
|
+
@Component({
|
|
167
|
+
selector: 'app-validation-monitor',
|
|
168
|
+
template: `
|
|
169
|
+
<div *ngIf="lastEvent" class="validation-report">
|
|
170
|
+
<p>Form: {{ lastEvent.formId }}</p>
|
|
171
|
+
<p>Valid: {{ lastEvent.valid }}</p>
|
|
172
|
+
<ul *ngIf="lastEvent.errors.length > 0">
|
|
173
|
+
<li *ngFor="let error of lastEvent.errors">
|
|
174
|
+
{{ error.field }}: {{ error.reason }}
|
|
175
|
+
</li>
|
|
176
|
+
</ul>
|
|
177
|
+
</div>
|
|
178
|
+
`
|
|
179
|
+
})
|
|
180
|
+
export class ValidationMonitorComponent implements OnInit, OnDestroy {
|
|
181
|
+
lastEvent: any;
|
|
182
|
+
private sub?: Subscription;
|
|
183
|
+
|
|
184
|
+
constructor(private formValidationService: FormValidationService) {}
|
|
185
|
+
|
|
186
|
+
ngOnInit() {
|
|
187
|
+
this.sub = this.formValidationService.validation$.subscribe(event => {
|
|
188
|
+
this.lastEvent = event;
|
|
189
|
+
console.log('Form validation state:', event);
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
ngOnDestroy() {
|
|
194
|
+
this.sub?.unsubscribe();
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
**Example - Using FormValidationListenerComponent:**
|
|
200
|
+
|
|
201
|
+
For a quick solution, use the built-in `FormValidationListenerComponent`:
|
|
202
|
+
|
|
203
|
+
```typescript
|
|
204
|
+
import { Component } from '@angular/core';
|
|
205
|
+
import { FormValidationListenerComponent } from '@bbq-chat/widgets-angular';
|
|
206
|
+
|
|
207
|
+
@Component({
|
|
208
|
+
selector: 'app-root',
|
|
209
|
+
standalone: true,
|
|
210
|
+
imports: [FormValidationListenerComponent],
|
|
211
|
+
template: `
|
|
212
|
+
<!-- Optional: filter by formId, or omit to see all validation events -->
|
|
213
|
+
<bbq-form-validation-listener [formId]="'my-form-id'"></bbq-form-validation-listener>
|
|
214
|
+
`
|
|
215
|
+
})
|
|
216
|
+
export class AppComponent {}
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
**Overriding Form Field Components:**
|
|
220
|
+
|
|
221
|
+
You can also override the components used to render form fields by passing a registry override to `FormWidgetComponent`:
|
|
222
|
+
|
|
223
|
+
```typescript
|
|
224
|
+
import { Component } from '@angular/core';
|
|
225
|
+
import { FormWidgetComponent, CustomWidgetComponent } from '@bbq-chat/widgets-angular';
|
|
226
|
+
import { MyCustomInputComponent } from './my-custom-input.component';
|
|
227
|
+
|
|
228
|
+
@Component({
|
|
229
|
+
selector: 'app-form-container',
|
|
230
|
+
standalone: true,
|
|
231
|
+
imports: [FormWidgetComponent],
|
|
232
|
+
template: `
|
|
233
|
+
<bbq-form-widget
|
|
234
|
+
[widget]="formWidget"
|
|
235
|
+
[fieldComponentRegistryOverride]="fieldRegistry"
|
|
236
|
+
(validationState)="onValidation($event)">
|
|
237
|
+
</bbq-form-widget>
|
|
238
|
+
`
|
|
239
|
+
})
|
|
240
|
+
export class FormContainerComponent {
|
|
241
|
+
formWidget: any;
|
|
242
|
+
fieldRegistry = {
|
|
243
|
+
'input': MyCustomInputComponent,
|
|
244
|
+
// Add other overrides as needed
|
|
245
|
+
};
|
|
246
|
+
|
|
247
|
+
onValidation(event: { valid: boolean; errors: any[] }) {
|
|
248
|
+
console.log('Form validation:', event);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
```
|
|
252
|
+
|
|
134
253
|
## Widget Types
|
|
135
254
|
|
|
136
255
|
All standard widget types from `@bbq-chat/widgets` are supported and rendered as native Angular components:
|
package/fesm2022/index.mjs
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { Input, Component, createComponent, ViewContainerRef, ViewChildren,
|
|
2
|
+
import { Input, Component, Injectable, EventEmitter, createComponent, ViewContainerRef, ViewChildren, Output, InjectionToken, ViewChild, Inject, Optional } from '@angular/core';
|
|
3
3
|
import * as i1 from '@angular/common';
|
|
4
|
-
import { CommonModule } from '@angular/common';
|
|
4
|
+
import { CommonModule, JsonPipe } from '@angular/common';
|
|
5
5
|
import * as i2$1 from '@bbq-chat/widgets';
|
|
6
6
|
import { WidgetEventManager, SsrWidgetRenderer, customWidgetRegistry } from '@bbq-chat/widgets';
|
|
7
7
|
export { ChatWidget, SsrWidgetRenderer, WidgetEventManager, customWidgetRegistry } from '@bbq-chat/widgets';
|
|
8
8
|
import * as i2 from '@angular/forms';
|
|
9
9
|
import { FormsModule } from '@angular/forms';
|
|
10
|
+
import { Subject } from 'rxjs';
|
|
10
11
|
|
|
11
12
|
/**
|
|
12
13
|
* Type guard to check if a renderer is a TemplateRef
|
|
@@ -936,6 +937,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImpor
|
|
|
936
937
|
type: Input
|
|
937
938
|
}] } });
|
|
938
939
|
|
|
940
|
+
class FormValidationService {
|
|
941
|
+
subject = new Subject();
|
|
942
|
+
get validation$() {
|
|
943
|
+
return this.subject.asObservable();
|
|
944
|
+
}
|
|
945
|
+
emit(event) {
|
|
946
|
+
try {
|
|
947
|
+
this.subject.next(event);
|
|
948
|
+
}
|
|
949
|
+
catch { }
|
|
950
|
+
}
|
|
951
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: FormValidationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
952
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: FormValidationService, providedIn: 'root' });
|
|
953
|
+
}
|
|
954
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: FormValidationService, decorators: [{
|
|
955
|
+
type: Injectable,
|
|
956
|
+
args: [{ providedIn: 'root' }]
|
|
957
|
+
}] });
|
|
958
|
+
|
|
939
959
|
/**
|
|
940
960
|
* Helper class to wrap form fields as widgets for dynamic rendering
|
|
941
961
|
*/
|
|
@@ -1025,14 +1045,18 @@ class FormFieldWidget {
|
|
|
1025
1045
|
class FormWidgetComponent {
|
|
1026
1046
|
injector;
|
|
1027
1047
|
environmentInjector;
|
|
1048
|
+
hostRef;
|
|
1049
|
+
formValidationService;
|
|
1028
1050
|
widget;
|
|
1029
1051
|
widgetAction;
|
|
1052
|
+
fieldComponentRegistryOverride;
|
|
1053
|
+
validationState = new EventEmitter();
|
|
1030
1054
|
fieldContainers;
|
|
1031
1055
|
formId = '';
|
|
1032
1056
|
formData = {};
|
|
1033
1057
|
showValidationMessage = false;
|
|
1034
1058
|
componentRefs = [];
|
|
1035
|
-
// Component registry for field types
|
|
1059
|
+
// Component registry for field types (can be extended via `fieldComponentRegistryOverride`)
|
|
1036
1060
|
fieldComponentRegistry = {
|
|
1037
1061
|
'input': InputWidgetComponent,
|
|
1038
1062
|
'text': InputWidgetComponent,
|
|
@@ -1050,12 +1074,16 @@ class FormWidgetComponent {
|
|
|
1050
1074
|
'checkbox': ToggleWidgetComponent,
|
|
1051
1075
|
'radio': ToggleWidgetComponent,
|
|
1052
1076
|
};
|
|
1077
|
+
// Whether the form has been submitted; when true, user interaction is disabled
|
|
1078
|
+
isSubmitted = false;
|
|
1053
1079
|
get formWidget() {
|
|
1054
1080
|
return this.widget;
|
|
1055
1081
|
}
|
|
1056
|
-
constructor(injector, environmentInjector) {
|
|
1082
|
+
constructor(injector, environmentInjector, hostRef, formValidationService) {
|
|
1057
1083
|
this.injector = injector;
|
|
1058
1084
|
this.environmentInjector = environmentInjector;
|
|
1085
|
+
this.hostRef = hostRef;
|
|
1086
|
+
this.formValidationService = formValidationService;
|
|
1059
1087
|
}
|
|
1060
1088
|
ngOnInit() {
|
|
1061
1089
|
this.formId = `bbq-${this.formWidget.action.replace(/\s+/g, '-').toLowerCase()}`;
|
|
@@ -1074,6 +1102,10 @@ class FormWidgetComponent {
|
|
|
1074
1102
|
this.formData[field.name] = '';
|
|
1075
1103
|
}
|
|
1076
1104
|
}
|
|
1105
|
+
// Merge any overrides provided by the consumer
|
|
1106
|
+
if (this.fieldComponentRegistryOverride) {
|
|
1107
|
+
this.fieldComponentRegistry = { ...this.fieldComponentRegistry, ...this.fieldComponentRegistryOverride };
|
|
1108
|
+
}
|
|
1077
1109
|
}
|
|
1078
1110
|
ngAfterViewInit() {
|
|
1079
1111
|
// Render field widgets dynamically
|
|
@@ -1107,6 +1139,8 @@ class FormWidgetComponent {
|
|
|
1107
1139
|
// Set component inputs
|
|
1108
1140
|
const instance = componentRef.instance;
|
|
1109
1141
|
instance['widget'] = fieldWidget;
|
|
1142
|
+
// Pass current disabled state so custom components can opt-in to being readonly
|
|
1143
|
+
instance['disabled'] = this.isSubmitted;
|
|
1110
1144
|
// Connect to form data via widgetAction
|
|
1111
1145
|
instance['widgetAction'] = (actionName, payload) => {
|
|
1112
1146
|
// Handle field value changes - for now, we'll sync via the rendered widget's internal state
|
|
@@ -1128,6 +1162,7 @@ class FormWidgetComponent {
|
|
|
1128
1162
|
});
|
|
1129
1163
|
const instance = componentRef.instance;
|
|
1130
1164
|
instance['widget'] = fieldWidget;
|
|
1165
|
+
instance['disabled'] = this.isSubmitted;
|
|
1131
1166
|
container.insert(componentRef.hostView);
|
|
1132
1167
|
this.componentRefs.push(componentRef);
|
|
1133
1168
|
componentRef.changeDetectorRef.detectChanges();
|
|
@@ -1140,6 +1175,8 @@ class FormWidgetComponent {
|
|
|
1140
1175
|
return field[prop];
|
|
1141
1176
|
}
|
|
1142
1177
|
onActionClick(actionType) {
|
|
1178
|
+
if (this.isSubmitted)
|
|
1179
|
+
return;
|
|
1143
1180
|
if (actionType === 'submit') {
|
|
1144
1181
|
// Validate required fields
|
|
1145
1182
|
const hasErrors = this.validateForm();
|
|
@@ -1148,6 +1185,17 @@ class FormWidgetComponent {
|
|
|
1148
1185
|
return;
|
|
1149
1186
|
}
|
|
1150
1187
|
this.showValidationMessage = false;
|
|
1188
|
+
// Mark submitted to prevent further interaction
|
|
1189
|
+
this.isSubmitted = true;
|
|
1190
|
+
// Inform child components and disable DOM controls
|
|
1191
|
+
this.componentRefs.forEach(ref => {
|
|
1192
|
+
try {
|
|
1193
|
+
ref.instance['disabled'] = true;
|
|
1194
|
+
ref.changeDetectorRef.detectChanges();
|
|
1195
|
+
}
|
|
1196
|
+
catch { }
|
|
1197
|
+
});
|
|
1198
|
+
this.disableFormInteraction();
|
|
1151
1199
|
// Gather form data from the DOM (since widgets manage their own state)
|
|
1152
1200
|
this.gatherFormData();
|
|
1153
1201
|
if (this.widgetAction) {
|
|
@@ -1162,16 +1210,43 @@ class FormWidgetComponent {
|
|
|
1162
1210
|
}
|
|
1163
1211
|
}
|
|
1164
1212
|
validateForm() {
|
|
1213
|
+
const errors = [];
|
|
1165
1214
|
for (const field of this.formWidget.fields || []) {
|
|
1166
1215
|
if (field.required) {
|
|
1167
1216
|
const value = this.formData[field.name];
|
|
1168
1217
|
if (value === undefined || value === null || value === '' ||
|
|
1169
1218
|
(Array.isArray(value) && value.length === 0)) {
|
|
1170
|
-
|
|
1219
|
+
errors.push({ field: field.name, reason: 'required' });
|
|
1171
1220
|
}
|
|
1172
1221
|
}
|
|
1173
1222
|
}
|
|
1174
|
-
|
|
1223
|
+
const hasErrors = errors.length > 0;
|
|
1224
|
+
const payload = { formId: this.formId, valid: !hasErrors, errors };
|
|
1225
|
+
// Emit to the local Output for direct consumers
|
|
1226
|
+
this.validationState.emit({ valid: !hasErrors, errors });
|
|
1227
|
+
// Also publish via the shared service so consumers that don't have direct access
|
|
1228
|
+
// to the component instance can subscribe app-wide.
|
|
1229
|
+
try {
|
|
1230
|
+
this.formValidationService.emit(payload);
|
|
1231
|
+
}
|
|
1232
|
+
catch { }
|
|
1233
|
+
return hasErrors; // true when there are errors
|
|
1234
|
+
}
|
|
1235
|
+
disableFormInteraction() {
|
|
1236
|
+
try {
|
|
1237
|
+
const root = this.hostRef?.nativeElement;
|
|
1238
|
+
if (!root)
|
|
1239
|
+
return;
|
|
1240
|
+
const controls = root.querySelectorAll('input,select,textarea,button');
|
|
1241
|
+
controls.forEach((el) => {
|
|
1242
|
+
try {
|
|
1243
|
+
el.disabled = true;
|
|
1244
|
+
}
|
|
1245
|
+
catch { }
|
|
1246
|
+
});
|
|
1247
|
+
root.setAttribute('aria-disabled', 'true');
|
|
1248
|
+
}
|
|
1249
|
+
catch { }
|
|
1175
1250
|
}
|
|
1176
1251
|
gatherFormData() {
|
|
1177
1252
|
// Gather data from the rendered field widgets
|
|
@@ -1198,10 +1273,12 @@ class FormWidgetComponent {
|
|
|
1198
1273
|
}
|
|
1199
1274
|
});
|
|
1200
1275
|
}
|
|
1201
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: FormWidgetComponent, deps: [{ token: i0.Injector }, { token: i0.EnvironmentInjector }], target: i0.ɵɵFactoryTarget.Component });
|
|
1202
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.8", type: FormWidgetComponent, isStandalone: true, selector: "bbq-form-widget", inputs: { widget: "widget" }, viewQueries: [{ propertyName: "fieldContainers", predicate: ["fieldContainer"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: `
|
|
1276
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: FormWidgetComponent, deps: [{ token: i0.Injector }, { token: i0.EnvironmentInjector }, { token: i0.ElementRef }, { token: FormValidationService }], target: i0.ɵɵFactoryTarget.Component });
|
|
1277
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.8", type: FormWidgetComponent, isStandalone: true, selector: "bbq-form-widget", inputs: { widget: "widget", fieldComponentRegistryOverride: "fieldComponentRegistryOverride" }, outputs: { validationState: "validationState" }, viewQueries: [{ propertyName: "fieldContainers", predicate: ["fieldContainer"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: `
|
|
1203
1278
|
<div
|
|
1204
1279
|
class="bbq-widget bbq-form"
|
|
1280
|
+
[class.bbq-form-submitted]="isSubmitted"
|
|
1281
|
+
[attr.aria-disabled]="isSubmitted ? 'true' : null"
|
|
1205
1282
|
[attr.data-widget-id]="formId"
|
|
1206
1283
|
[attr.data-widget-type]="'form'"
|
|
1207
1284
|
[attr.data-action]="formWidget.action">
|
|
@@ -1242,6 +1319,7 @@ class FormWidgetComponent {
|
|
|
1242
1319
|
[class.bbq-form-cancel]="action.type !== 'submit'"
|
|
1243
1320
|
[attr.data-action]="formWidget.action"
|
|
1244
1321
|
[attr.data-action-type]="action.type"
|
|
1322
|
+
[disabled]="isSubmitted"
|
|
1245
1323
|
(click)="onActionClick(action.type)">
|
|
1246
1324
|
{{ action.label }}
|
|
1247
1325
|
</button>
|
|
@@ -1250,13 +1328,15 @@ class FormWidgetComponent {
|
|
|
1250
1328
|
}
|
|
1251
1329
|
</fieldset>
|
|
1252
1330
|
</div>
|
|
1253
|
-
`, isInline: true, styles: [".bbq-form-field-widget{display:contents}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }] });
|
|
1331
|
+
`, isInline: true, styles: [".bbq-form-field-widget{display:contents}.bbq-form-submitted{opacity:.7}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }] });
|
|
1254
1332
|
}
|
|
1255
1333
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: FormWidgetComponent, decorators: [{
|
|
1256
1334
|
type: Component,
|
|
1257
1335
|
args: [{ selector: 'bbq-form-widget', standalone: true, imports: [CommonModule, FormsModule], template: `
|
|
1258
1336
|
<div
|
|
1259
1337
|
class="bbq-widget bbq-form"
|
|
1338
|
+
[class.bbq-form-submitted]="isSubmitted"
|
|
1339
|
+
[attr.aria-disabled]="isSubmitted ? 'true' : null"
|
|
1260
1340
|
[attr.data-widget-id]="formId"
|
|
1261
1341
|
[attr.data-widget-type]="'form'"
|
|
1262
1342
|
[attr.data-action]="formWidget.action">
|
|
@@ -1297,6 +1377,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImpor
|
|
|
1297
1377
|
[class.bbq-form-cancel]="action.type !== 'submit'"
|
|
1298
1378
|
[attr.data-action]="formWidget.action"
|
|
1299
1379
|
[attr.data-action-type]="action.type"
|
|
1380
|
+
[disabled]="isSubmitted"
|
|
1300
1381
|
(click)="onActionClick(action.type)">
|
|
1301
1382
|
{{ action.label }}
|
|
1302
1383
|
</button>
|
|
@@ -1305,9 +1386,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImpor
|
|
|
1305
1386
|
}
|
|
1306
1387
|
</fieldset>
|
|
1307
1388
|
</div>
|
|
1308
|
-
`, styles: [".bbq-form-field-widget{display:contents}\n"] }]
|
|
1309
|
-
}], ctorParameters: () => [{ type: i0.Injector }, { type: i0.EnvironmentInjector }], propDecorators: { widget: [{
|
|
1389
|
+
`, styles: [".bbq-form-field-widget{display:contents}.bbq-form-submitted{opacity:.7}\n"] }]
|
|
1390
|
+
}], ctorParameters: () => [{ type: i0.Injector }, { type: i0.EnvironmentInjector }, { type: i0.ElementRef }, { type: FormValidationService }], propDecorators: { widget: [{
|
|
1310
1391
|
type: Input
|
|
1392
|
+
}], fieldComponentRegistryOverride: [{
|
|
1393
|
+
type: Input
|
|
1394
|
+
}], validationState: [{
|
|
1395
|
+
type: Output
|
|
1311
1396
|
}], fieldContainers: [{
|
|
1312
1397
|
type: ViewChildren,
|
|
1313
1398
|
args: ['fieldContainer', { read: ViewContainerRef }]
|
|
@@ -1969,6 +2054,61 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImpor
|
|
|
1969
2054
|
* Angular widget renderers
|
|
1970
2055
|
*/
|
|
1971
2056
|
|
|
2057
|
+
class FormValidationListenerComponent {
|
|
2058
|
+
svc;
|
|
2059
|
+
formId;
|
|
2060
|
+
lastEvent = null;
|
|
2061
|
+
sub;
|
|
2062
|
+
constructor(svc) {
|
|
2063
|
+
this.svc = svc;
|
|
2064
|
+
}
|
|
2065
|
+
ngOnInit() {
|
|
2066
|
+
this.sub = this.svc.validation$.subscribe(ev => {
|
|
2067
|
+
if (!this.formId || ev.formId === this.formId) {
|
|
2068
|
+
this.lastEvent = ev;
|
|
2069
|
+
}
|
|
2070
|
+
});
|
|
2071
|
+
}
|
|
2072
|
+
ngOnDestroy() {
|
|
2073
|
+
this.sub?.unsubscribe();
|
|
2074
|
+
}
|
|
2075
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: FormValidationListenerComponent, deps: [{ token: FormValidationService }], target: i0.ɵɵFactoryTarget.Component });
|
|
2076
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.8", type: FormValidationListenerComponent, isStandalone: true, selector: "bbq-form-validation-listener", inputs: { formId: "formId" }, ngImport: i0, template: `
|
|
2077
|
+
<div class="bbq-validation-listener">
|
|
2078
|
+
@if (lastEvent) {
|
|
2079
|
+
<div>
|
|
2080
|
+
<strong>Last validation (formId: {{ lastEvent.formId }})</strong>
|
|
2081
|
+
<pre>{{ lastEvent | json }}</pre>
|
|
2082
|
+
</div>
|
|
2083
|
+
} @else {
|
|
2084
|
+
<small>No validation events yet.</small>
|
|
2085
|
+
}
|
|
2086
|
+
</div>
|
|
2087
|
+
`, isInline: true, dependencies: [{ kind: "pipe", type: JsonPipe, name: "json" }] });
|
|
2088
|
+
}
|
|
2089
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: FormValidationListenerComponent, decorators: [{
|
|
2090
|
+
type: Component,
|
|
2091
|
+
args: [{
|
|
2092
|
+
selector: 'bbq-form-validation-listener',
|
|
2093
|
+
standalone: true,
|
|
2094
|
+
imports: [JsonPipe],
|
|
2095
|
+
template: `
|
|
2096
|
+
<div class="bbq-validation-listener">
|
|
2097
|
+
@if (lastEvent) {
|
|
2098
|
+
<div>
|
|
2099
|
+
<strong>Last validation (formId: {{ lastEvent.formId }})</strong>
|
|
2100
|
+
<pre>{{ lastEvent | json }}</pre>
|
|
2101
|
+
</div>
|
|
2102
|
+
} @else {
|
|
2103
|
+
<small>No validation events yet.</small>
|
|
2104
|
+
}
|
|
2105
|
+
</div>
|
|
2106
|
+
`,
|
|
2107
|
+
}]
|
|
2108
|
+
}], ctorParameters: () => [{ type: FormValidationService }], propDecorators: { formId: [{
|
|
2109
|
+
type: Input
|
|
2110
|
+
}] } });
|
|
2111
|
+
|
|
1972
2112
|
/**
|
|
1973
2113
|
* @bbq-chat/widgets-angular
|
|
1974
2114
|
*
|
|
@@ -1982,11 +2122,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImpor
|
|
|
1982
2122
|
*/
|
|
1983
2123
|
// Export components
|
|
1984
2124
|
// Version
|
|
1985
|
-
const VERSION = '1.0.
|
|
2125
|
+
const VERSION = '1.0.10';
|
|
1986
2126
|
|
|
1987
2127
|
/**
|
|
1988
2128
|
* Generated bundle index. Do not edit.
|
|
1989
2129
|
*/
|
|
1990
2130
|
|
|
1991
|
-
export { ANGULAR_WIDGET_RENDERER, AngularWidgetRenderer, BUILT_IN_WIDGET_COMPONENTS, ButtonWidgetComponent, CardWidgetComponent, DatePickerWidgetComponent, DropdownWidgetComponent, FileUploadWidgetComponent, FormWidgetComponent, ImageCollectionWidgetComponent, ImageWidgetComponent, InputWidgetComponent, MultiSelectWidgetComponent, ProgressBarWidgetComponent, SSR_WIDGET_RENDERER, SliderWidgetComponent, TextAreaWidgetComponent, ThemeSwitcherWidgetComponent, ToggleWidgetComponent, VERSION, WIDGET_EVENT_MANAGER_FACTORY, WidgetRegistryService, WidgetRendererComponent, angularWidgetRendererFactory, isComponentRenderer, isHtmlRenderer, isTemplateRenderer, ssrWidgetRendererFactory, widgetEventManagerFactoryProvider };
|
|
2131
|
+
export { ANGULAR_WIDGET_RENDERER, AngularWidgetRenderer, BUILT_IN_WIDGET_COMPONENTS, ButtonWidgetComponent, CardWidgetComponent, DatePickerWidgetComponent, DropdownWidgetComponent, FileUploadWidgetComponent, FormValidationListenerComponent, FormValidationService, FormWidgetComponent, ImageCollectionWidgetComponent, ImageWidgetComponent, InputWidgetComponent, MultiSelectWidgetComponent, ProgressBarWidgetComponent, SSR_WIDGET_RENDERER, SliderWidgetComponent, TextAreaWidgetComponent, ThemeSwitcherWidgetComponent, ToggleWidgetComponent, VERSION, WIDGET_EVENT_MANAGER_FACTORY, WidgetRegistryService, WidgetRendererComponent, angularWidgetRendererFactory, isComponentRenderer, isHtmlRenderer, isTemplateRenderer, ssrWidgetRendererFactory, widgetEventManagerFactoryProvider };
|
|
1992
2132
|
//# sourceMappingURL=index.mjs.map
|
package/fesm2022/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../src/custom-widget-renderer.types.ts","../../src/renderers/AngularWidgetRenderer.ts","../../src/components/button.component.ts","../../src/components/card.component.ts","../../src/components/input.component.ts","../../src/components/textarea.component.ts","../../src/components/dropdown.component.ts","../../src/components/slider.component.ts","../../src/components/toggle.component.ts","../../src/components/fileupload.component.ts","../../src/components/themeswitcher.component.ts","../../src/components/datepicker.component.ts","../../src/components/multiselect.component.ts","../../src/components/progressbar.component.ts","../../src/components/form.component.ts","../../src/components/image.component.ts","../../src/components/imagecollection.component.ts","../../src/components/index.ts","../../src/renderers/built-in-components.ts","../../src/widget-di.tokens.ts","../../src/widget-registry.service.ts","../../src/widget-renderer.component.ts","../../src/renderers/index.ts","../../src/public_api.ts","../../src/index.ts"],"sourcesContent":["import { Type, TemplateRef } from '@angular/core';\r\nimport { ChatWidget } from '@bbq-chat/widgets';\r\n\r\n/**\r\n * Context provided to template-based custom widget renderers\r\n */\r\nexport interface WidgetTemplateContext {\r\n /**\r\n * The widget instance being rendered\r\n */\r\n $implicit: ChatWidget;\r\n \r\n /**\r\n * The widget instance (alternative access)\r\n */\r\n widget: ChatWidget;\r\n \r\n /**\r\n * Emit a widget action\r\n */\r\n emitAction: (actionName: string, payload: unknown) => void;\r\n}\r\n\r\n/**\r\n * Interface for component-based custom widget renderers\r\n */\r\nexport interface CustomWidgetComponent {\r\n /**\r\n * The widget instance to render\r\n */\r\n widget: ChatWidget;\r\n \r\n /**\r\n * Event emitter for widget actions (optional, will be set by the renderer)\r\n */\r\n widgetAction?: (actionName: string, payload: unknown) => void;\r\n}\r\n\r\n/**\r\n * Type for custom widget renderer functions that return HTML strings\r\n */\r\nexport type CustomWidgetHtmlRenderer = (widget: ChatWidget) => string;\r\n\r\n/**\r\n * Type for custom widget renderer configurations\r\n */\r\nexport type CustomWidgetRenderer =\r\n | CustomWidgetHtmlRenderer\r\n | Type<CustomWidgetComponent>\r\n | TemplateRef<WidgetTemplateContext>;\r\n\r\n/**\r\n * Configuration for registering a custom widget renderer\r\n */\r\nexport interface CustomWidgetRendererConfig {\r\n /**\r\n * The widget type identifier\r\n */\r\n type: string;\r\n \r\n /**\r\n * The renderer: can be a function returning HTML, an Angular Component class, or a TemplateRef\r\n */\r\n renderer: CustomWidgetRenderer;\r\n}\r\n\r\n/**\r\n * Type guard to check if a renderer is a TemplateRef\r\n */\r\nexport function isTemplateRenderer(\r\n renderer: CustomWidgetRenderer\r\n): renderer is TemplateRef<WidgetTemplateContext> {\r\n return (\r\n renderer !== null &&\r\n typeof renderer === 'object' &&\r\n 'createEmbeddedView' in renderer\r\n );\r\n}\r\n\r\n/**\r\n * Type guard to check if a renderer is an Angular Component\r\n * \r\n * Note: This uses a heuristic check based on the following assumptions:\r\n * 1. Components are constructor functions\r\n * 2. Components have a prototype with a constructor property\r\n * 3. Components typically use dependency injection (no required constructor params)\r\n * \r\n * Limitation: This may not detect components with required constructor parameters.\r\n * For edge cases, explicitly check your component's constructor signature.\r\n * \r\n * Alternative: You can always register a wrapper component that has no required params.\r\n */\r\nexport function isComponentRenderer(\r\n renderer: CustomWidgetRenderer\r\n): renderer is Type<CustomWidgetComponent> {\r\n // Check if it's a function (constructor) but not a regular function renderer\r\n if (typeof renderer !== 'function') {\r\n return false;\r\n }\r\n \r\n // Check for Angular component characteristics\r\n // Components typically have prototype with constructor property\r\n return (\r\n renderer.prototype !== undefined &&\r\n renderer.prototype.constructor === renderer &&\r\n renderer.length === 0 // Constructor with no required params (Angular DI)\r\n );\r\n}\r\n\r\n/**\r\n * Type guard to check if a renderer is an HTML function\r\n * \r\n * Note: This should be checked AFTER checking for component and template renderers\r\n * since components are also functions but with additional properties.\r\n */\r\nexport function isHtmlRenderer(\r\n renderer: CustomWidgetRenderer\r\n): renderer is CustomWidgetHtmlRenderer {\r\n return typeof renderer === 'function';\r\n}\r\n","import { Type } from '@angular/core';\r\nimport { IWidgetRenderer } from '@bbq-chat/widgets';\r\nimport type { ChatWidget } from '@bbq-chat/widgets';\r\nimport { CustomWidgetComponent } from '../custom-widget-renderer.types';\r\n\r\n/**\r\n * Options for configuring the Angular widget renderer\r\n */\r\nexport interface AngularRendererOptions {\r\n /**\r\n * Per-widget-type component overrides. Key is widget.type.\r\n */\r\n components?: Partial<Record<string, Type<CustomWidgetComponent>>>;\r\n}\r\n\r\n/**\r\n * Angular widget renderer\r\n * Returns Angular component types for dynamic rendering\r\n * Provides feature parity with SsrWidgetRenderer but uses Angular components\r\n */\r\nexport class AngularWidgetRenderer implements IWidgetRenderer {\r\n readonly framework = 'Angular';\r\n private overrides: AngularRendererOptions['components'] | undefined;\r\n private componentRegistry: Map<string, Type<CustomWidgetComponent>> = new Map();\r\n\r\n constructor(options?: AngularRendererOptions) {\r\n this.overrides = options?.components;\r\n }\r\n\r\n /**\r\n * Register all built-in widget components\r\n * Must be called after components are imported to avoid circular dependencies\r\n */\r\n registerBuiltInComponents(components: Record<string, Type<CustomWidgetComponent>>) {\r\n for (const [type, component] of Object.entries(components)) {\r\n this.componentRegistry.set(type, component);\r\n }\r\n }\r\n\r\n /**\r\n * Register or override a widget component\r\n * Use this to replace built-in components or add custom ones\r\n * \r\n * @example\r\n * ```typescript\r\n * renderer.registerComponent('button', MyCustomButtonComponent);\r\n * ```\r\n */\r\n registerComponent(type: string, component: Type<CustomWidgetComponent>) {\r\n this.componentRegistry.set(type, component);\r\n }\r\n\r\n /**\r\n * Register multiple widget components at once\r\n * \r\n * @example\r\n * ```typescript\r\n * renderer.registerComponents({\r\n * button: MyButtonComponent,\r\n * card: MyCardComponent\r\n * });\r\n * ```\r\n */\r\n registerComponents(components: Record<string, Type<CustomWidgetComponent>>) {\r\n for (const [type, component] of Object.entries(components)) {\r\n this.componentRegistry.set(type, component);\r\n }\r\n }\r\n\r\n /**\r\n * Get the Angular component type for a given widget\r\n * Returns the component class that should be dynamically instantiated\r\n */\r\n getComponentType(widget: ChatWidget): Type<CustomWidgetComponent> | null {\r\n const type = widget.type;\r\n\r\n // Check for custom override first\r\n if (this.overrides && this.overrides[type]) {\r\n return this.overrides[type] as Type<CustomWidgetComponent>;\r\n }\r\n\r\n // Check built-in registry\r\n if (this.componentRegistry.has(type)) {\r\n return this.componentRegistry.get(type)!;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Legacy method for IWidgetRenderer interface compatibility\r\n * Not used in Angular rendering but required by interface\r\n * @deprecated Use getComponentType() instead for Angular rendering\r\n */\r\n renderWidget(widget: ChatWidget): string {\r\n // This method is not used in Angular rendering\r\n // It's only here for interface compatibility\r\n return `<!-- Angular component rendering for ${widget.type} -->`;\r\n }\r\n}\r\n","import { Component, Input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport type { ButtonWidget } from '@bbq-chat/widgets';\r\nimport { CustomWidgetComponent } from '../custom-widget-renderer.types';\r\n\r\n@Component({\r\n selector: 'bbq-button-widget',\r\n standalone: true,\r\n imports: [CommonModule],\r\n template: `\r\n <button \r\n class=\"bbq-widget bbq-button\" \r\n [attr.data-widget-type]=\"'button'\"\r\n [attr.data-action]=\"buttonWidget.action\"\r\n type=\"button\"\r\n (click)=\"onClick()\">\r\n {{ buttonWidget.label }}\r\n </button>\r\n `,\r\n styles: []\r\n})\r\nexport class ButtonWidgetComponent implements CustomWidgetComponent {\r\n @Input() widget!: any;\r\n widgetAction?: (actionName: string, payload: unknown) => void;\r\n\r\n get buttonWidget(): ButtonWidget {\r\n return this.widget as ButtonWidget;\r\n }\r\n\r\n onClick() {\r\n if (this.widgetAction) {\r\n this.widgetAction(this.buttonWidget.action, {});\r\n }\r\n }\r\n}\r\n","import { Component, Input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport type { CardWidget } from '@bbq-chat/widgets';\r\nimport { CustomWidgetComponent } from '../custom-widget-renderer.types';\r\n\r\n@Component({\r\n selector: 'bbq-card-widget',\r\n standalone: true,\r\n imports: [CommonModule],\r\n template: `\r\n <div \r\n class=\"bbq-widget bbq-card\" \r\n [attr.data-widget-type]=\"'card'\"\r\n [attr.data-action]=\"cardWidget.action\"\r\n role=\"article\">\r\n <h3 class=\"bbq-card-title\">{{ cardWidget.title }}</h3>\r\n @if (cardWidget.description) {\r\n <p class=\"bbq-card-description\">{{ cardWidget.description }}</p>\r\n }\r\n @if (cardWidget.imageUrl) {\r\n <img \r\n class=\"bbq-card-image\" \r\n [src]=\"cardWidget.imageUrl\" \r\n [alt]=\"cardWidget.title\"\r\n loading=\"lazy\"\r\n style=\"display:block;max-width:100%;height:auto;object-fit:cover;max-height:200px;border-radius:6px;margin-bottom:12px;\" />\r\n }\r\n <button \r\n class=\"bbq-card-action bbq-button\" \r\n [attr.data-action]=\"cardWidget.action\"\r\n type=\"button\"\r\n (click)=\"onClick()\">\r\n {{ cardWidget.label }}\r\n </button>\r\n </div>\r\n `,\r\n styles: []\r\n})\r\nexport class CardWidgetComponent implements CustomWidgetComponent {\r\n @Input() widget!: any;\r\n widgetAction?: (actionName: string, payload: unknown) => void;\r\n\r\n get cardWidget(): CardWidget {\r\n return this.widget as CardWidget;\r\n }\r\n\r\n onClick() {\r\n if (this.widgetAction) {\r\n this.widgetAction(this.cardWidget.action, {});\r\n }\r\n }\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport type { InputWidget } from '@bbq-chat/widgets';\r\nimport { CustomWidgetComponent } from '../custom-widget-renderer.types';\r\n\r\n@Component({\r\n selector: 'bbq-input-widget',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n template: `\r\n <div \r\n class=\"bbq-widget bbq-input\" \r\n [attr.data-widget-type]=\"'input'\">\r\n <label *ngIf=\"showLabel\" class=\"bbq-input-label\" [attr.for]=\"inputId\">\r\n {{ inputWidget.label }}\r\n </label>\r\n <input \r\n type=\"text\" \r\n [id]=\"inputId\"\r\n [ngClass]=\"inputClasses\"\r\n [attr.data-action]=\"inputWidget.action\"\r\n [placeholder]=\"inputWidget.placeholder || ''\"\r\n [maxLength]=\"inputWidget.maxLength || 0\"\r\n [(ngModel)]=\"value\" />\r\n </div>\r\n `,\r\n styles: []\r\n})\r\nexport class InputWidgetComponent implements CustomWidgetComponent, OnInit {\r\n @Input() widget!: any;\r\n widgetAction?: (actionName: string, payload: unknown) => void;\r\n \r\n value = '';\r\n inputId = '';\r\n\r\n get inputWidget(): InputWidget {\r\n return this.widget as InputWidget;\r\n }\r\n\r\n get showLabel(): boolean {\r\n const widget = this.inputWidget as any;\r\n if (widget.hideLabel === true) {\r\n return false;\r\n }\r\n if (widget.showLabel === false) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n get inputClasses(): string[] {\r\n return this.isFormAppearance ? ['bbq-form-input'] : ['bbq-input'];\r\n }\r\n\r\n private get isFormAppearance(): boolean {\r\n return (this.inputWidget as any).appearance === 'form';\r\n }\r\n\r\n ngOnInit() {\r\n this.inputId = `bbq-${this.inputWidget.action.replace(/\\s+/g, '-').toLowerCase()}-input`;\r\n }\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport type { TextAreaWidget } from '@bbq-chat/widgets';\r\nimport { CustomWidgetComponent } from '../custom-widget-renderer.types';\r\n\r\n@Component({\r\n selector: 'bbq-textarea-widget',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n template: `\r\n <div \r\n class=\"bbq-widget bbq-textarea\" \r\n [attr.data-widget-type]=\"'textarea'\">\r\n <label *ngIf=\"showLabel\" class=\"bbq-textarea-label\" [attr.for]=\"textareaId\">\r\n {{ textareaWidget.label }}\r\n </label>\r\n <textarea \r\n [id]=\"textareaId\"\r\n [ngClass]=\"textareaClasses\"\r\n [attr.data-action]=\"textareaWidget.action\"\r\n [placeholder]=\"textareaWidget.placeholder || ''\"\r\n [maxLength]=\"textareaWidget.maxLength || 0\"\r\n [rows]=\"textareaWidget.rows || 4\"\r\n [(ngModel)]=\"value\"></textarea>\r\n </div>\r\n `,\r\n styles: []\r\n})\r\nexport class TextAreaWidgetComponent implements CustomWidgetComponent, OnInit {\r\n @Input() widget!: any;\r\n widgetAction?: (actionName: string, payload: unknown) => void;\r\n \r\n value = '';\r\n textareaId = '';\r\n\r\n get textareaWidget(): TextAreaWidget {\r\n return this.widget as TextAreaWidget;\r\n }\r\n\r\n get showLabel(): boolean {\r\n const widget = this.textareaWidget as any;\r\n if (widget.hideLabel === true) {\r\n return false;\r\n }\r\n if (widget.showLabel === false) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n get textareaClasses(): string[] {\r\n return this.isFormAppearance ? ['bbq-form-textarea'] : ['bbq-form-textarea', 'bbq-input'];\r\n }\r\n\r\n private get isFormAppearance(): boolean {\r\n return (this.textareaWidget as any).appearance === 'form';\r\n }\r\n\r\n ngOnInit() {\r\n this.textareaId = `bbq-${this.textareaWidget.action.replace(/\\s+/g, '-').toLowerCase()}-textarea`;\r\n }\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport type { DropdownWidget } from '@bbq-chat/widgets';\r\nimport { CustomWidgetComponent } from '../custom-widget-renderer.types';\r\n\r\n@Component({\r\n selector: 'bbq-dropdown-widget',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n template: `\r\n <div \r\n class=\"bbq-widget bbq-dropdown\" \r\n [attr.data-widget-type]=\"'dropdown'\">\r\n <label *ngIf=\"showLabel\" class=\"bbq-dropdown-label\" [attr.for]=\"selectId\">\r\n {{ dropdownWidget.label }}\r\n </label>\r\n <select \r\n [id]=\"selectId\"\r\n [ngClass]=\"selectClasses\"\r\n [attr.data-action]=\"dropdownWidget.action\"\r\n [(ngModel)]=\"value\">\r\n @for (option of dropdownWidget.options; track option) {\r\n <option [value]=\"option\">{{ option }}</option>\r\n }\r\n </select>\r\n </div>\r\n `,\r\n styles: []\r\n})\r\nexport class DropdownWidgetComponent implements CustomWidgetComponent, OnInit {\r\n @Input() widget!: any;\r\n widgetAction?: (actionName: string, payload: unknown) => void;\r\n \r\n value = '';\r\n selectId = '';\r\n\r\n get dropdownWidget(): DropdownWidget {\r\n return this.widget as DropdownWidget;\r\n }\r\n\r\n get showLabel(): boolean {\r\n const widget = this.dropdownWidget as any;\r\n if (widget.hideLabel === true) {\r\n return false;\r\n }\r\n if (widget.showLabel === false) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n get selectClasses(): string[] {\r\n return this.isFormAppearance ? ['bbq-form-select'] : ['bbq-dropdown'];\r\n }\r\n\r\n private get isFormAppearance(): boolean {\r\n return (this.dropdownWidget as any).appearance === 'form';\r\n }\r\n\r\n ngOnInit() {\r\n this.selectId = `bbq-${this.dropdownWidget.action.replace(/\\s+/g, '-').toLowerCase()}-select`;\r\n this.value = this.dropdownWidget.options[0] || '';\r\n }\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport type { SliderWidget } from '@bbq-chat/widgets';\r\nimport { CustomWidgetComponent } from '../custom-widget-renderer.types';\r\n\r\n@Component({\r\n selector: 'bbq-slider-widget',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n template: `\r\n <div \r\n class=\"bbq-widget bbq-slider\" \r\n [attr.data-widget-type]=\"'slider'\">\r\n <label *ngIf=\"showLabel\" class=\"bbq-slider-label\" [attr.for]=\"sliderId\">\r\n {{ sliderWidget.label }}\r\n </label>\r\n <input \r\n type=\"range\" \r\n [id]=\"sliderId\"\r\n [ngClass]=\"sliderClasses\"\r\n [min]=\"sliderWidget.min\"\r\n [max]=\"sliderWidget.max\"\r\n [step]=\"sliderWidget.step\"\r\n [attr.data-action]=\"sliderWidget.action\"\r\n [attr.aria-label]=\"sliderWidget.label\"\r\n [(ngModel)]=\"value\" />\r\n <span class=\"bbq-slider-value\" aria-live=\"polite\">{{ value }}</span>\r\n </div>\r\n `,\r\n styles: []\r\n})\r\nexport class SliderWidgetComponent implements CustomWidgetComponent, OnInit {\r\n @Input() widget!: any;\r\n widgetAction?: (actionName: string, payload: unknown) => void;\r\n \r\n value: number = 0;\r\n sliderId = '';\r\n\r\n get sliderWidget(): SliderWidget {\r\n return this.widget as SliderWidget;\r\n }\r\n\r\n get showLabel(): boolean {\r\n const widget = this.sliderWidget as any;\r\n if (widget.hideLabel === true) {\r\n return false;\r\n }\r\n if (widget.showLabel === false) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n get sliderClasses(): string[] {\r\n return this.isFormAppearance ? ['bbq-form-slider'] : ['bbq-slider'];\r\n }\r\n\r\n private get isFormAppearance(): boolean {\r\n return (this.sliderWidget as any).appearance === 'form';\r\n }\r\n\r\n ngOnInit() {\r\n this.sliderId = `bbq-${this.sliderWidget.action.replace(/\\s+/g, '-').toLowerCase()}-slider`;\r\n this.value = this.sliderWidget.defaultValue ?? this.sliderWidget.min;\r\n }\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport type { ToggleWidget } from '@bbq-chat/widgets';\r\nimport { CustomWidgetComponent } from '../custom-widget-renderer.types';\r\n\r\n@Component({\r\n selector: 'bbq-toggle-widget',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n template: `\r\n <div \r\n class=\"bbq-widget bbq-toggle\" \r\n [attr.data-widget-type]=\"'toggle'\">\r\n <label class=\"bbq-toggle-label\" [attr.for]=\"checkboxId\">\r\n <input \r\n type=\"checkbox\" \r\n [id]=\"checkboxId\"\r\n [ngClass]=\"checkboxClasses\"\r\n [attr.data-action]=\"toggleWidget.action\"\r\n [attr.aria-label]=\"toggleWidget.label\"\r\n [(ngModel)]=\"checked\" />\r\n <span *ngIf=\"showLabel\" class=\"bbq-toggle-text\">{{ toggleWidget.label }}</span>\r\n </label>\r\n </div>\r\n `,\r\n styles: []\r\n})\r\nexport class ToggleWidgetComponent implements CustomWidgetComponent, OnInit {\r\n @Input() widget!: any;\r\n widgetAction?: (actionName: string, payload: unknown) => void;\r\n \r\n checked = false;\r\n checkboxId = '';\r\n\r\n get toggleWidget(): ToggleWidget {\r\n return this.widget as ToggleWidget;\r\n }\r\n\r\n get showLabel(): boolean {\r\n const widget = this.toggleWidget as any;\r\n if (widget.hideLabel === true) {\r\n return false;\r\n }\r\n if (widget.showLabel === false) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n get checkboxClasses(): string[] {\r\n return this.isFormAppearance ? ['bbq-toggle-input', 'bbq-form-toggle'] : ['bbq-toggle-input'];\r\n }\r\n\r\n private get isFormAppearance(): boolean {\r\n return (this.toggleWidget as any).appearance === 'form';\r\n }\r\n\r\n ngOnInit() {\r\n this.checkboxId = `bbq-${this.toggleWidget.action.replace(/\\s+/g, '-').toLowerCase()}-checkbox`;\r\n this.checked = this.toggleWidget.defaultValue ?? false;\r\n }\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport type { FileUploadWidget } from '@bbq-chat/widgets';\r\nimport { CustomWidgetComponent } from '../custom-widget-renderer.types';\r\n\r\n@Component({\r\n selector: 'bbq-fileupload-widget',\r\n standalone: true,\r\n imports: [CommonModule],\r\n template: `\r\n <div \r\n class=\"bbq-widget bbq-file-upload\" \r\n [attr.data-widget-type]=\"'fileupload'\">\r\n <label *ngIf=\"showLabel\" class=\"bbq-file-label\" [attr.for]=\"inputId\">\r\n {{ fileUploadWidget.label }}\r\n </label>\r\n <input \r\n type=\"file\" \r\n [id]=\"inputId\"\r\n [ngClass]=\"inputClasses\"\r\n [attr.data-action]=\"fileUploadWidget.action\"\r\n [accept]=\"fileUploadWidget.accept || ''\"\r\n [attr.data-max-bytes]=\"fileUploadWidget.maxBytes\"\r\n (change)=\"onFileChange($event)\" />\r\n </div>\r\n `,\r\n styles: []\r\n})\r\nexport class FileUploadWidgetComponent implements CustomWidgetComponent, OnInit {\r\n @Input() widget!: any;\r\n widgetAction?: (actionName: string, payload: unknown) => void;\r\n \r\n inputId = '';\r\n\r\n get fileUploadWidget(): FileUploadWidget {\r\n return this.widget as FileUploadWidget;\r\n }\r\n\r\n get showLabel(): boolean {\r\n const widget = this.fileUploadWidget as any;\r\n if (widget.hideLabel === true) {\r\n return false;\r\n }\r\n if (widget.showLabel === false) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n get inputClasses(): string[] {\r\n return this.isFormAppearance ? ['bbq-form-fileupload'] : ['bbq-file'];\r\n }\r\n\r\n private get isFormAppearance(): boolean {\r\n return (this.fileUploadWidget as any).appearance === 'form';\r\n }\r\n\r\n ngOnInit() {\r\n this.inputId = `bbq-${this.fileUploadWidget.action.replace(/\\s+/g, '-').toLowerCase()}-file`;\r\n }\r\n\r\n onFileChange(event: Event) {\r\n const target = event.target as HTMLInputElement;\r\n if (target.files && target.files.length > 0) {\r\n const file = target.files[0];\r\n if (this.widgetAction) {\r\n this.widgetAction(this.fileUploadWidget.action, { file });\r\n }\r\n }\r\n }\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport type { ThemeSwitcherWidget } from '@bbq-chat/widgets';\r\nimport { CustomWidgetComponent } from '../custom-widget-renderer.types';\r\n\r\n@Component({\r\n selector: 'bbq-themeswitcher-widget',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n template: `\r\n <div \r\n class=\"bbq-widget bbq-theme-switcher\" \r\n [attr.data-widget-type]=\"'themeswitcher'\">\r\n <label class=\"bbq-theme-switcher-label\" [attr.for]=\"selectId\">\r\n {{ themeSwitcherWidget.label }}\r\n </label>\r\n <select \r\n [id]=\"selectId\"\r\n class=\"bbq-theme-switcher-select\" \r\n [attr.data-action]=\"themeSwitcherWidget.action\"\r\n [(ngModel)]=\"value\">\r\n @for (theme of themeSwitcherWidget.themes; track theme) {\r\n <option [value]=\"theme\">{{ theme }}</option>\r\n }\r\n </select>\r\n </div>\r\n `,\r\n styles: []\r\n})\r\nexport class ThemeSwitcherWidgetComponent implements CustomWidgetComponent, OnInit {\r\n @Input() widget!: any;\r\n widgetAction?: (actionName: string, payload: unknown) => void;\r\n \r\n value = '';\r\n selectId = '';\r\n\r\n get themeSwitcherWidget(): ThemeSwitcherWidget {\r\n return this.widget as ThemeSwitcherWidget;\r\n }\r\n\r\n ngOnInit() {\r\n this.selectId = `bbq-${this.themeSwitcherWidget.action.replace(/\\s+/g, '-').toLowerCase()}-select`;\r\n this.value = this.themeSwitcherWidget.themes[0] || '';\r\n }\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport type { DatePickerWidget } from '@bbq-chat/widgets';\r\nimport { CustomWidgetComponent } from '../custom-widget-renderer.types';\r\n\r\n@Component({\r\n selector: 'bbq-datepicker-widget',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n template: `\r\n <div \r\n class=\"bbq-widget bbq-date-picker\" \r\n [attr.data-widget-type]=\"'datepicker'\">\r\n <label *ngIf=\"showLabel\" class=\"bbq-date-picker-label\" [attr.for]=\"inputId\">\r\n {{ datePickerWidget.label }}\r\n </label>\r\n <input \r\n type=\"date\" \r\n [id]=\"inputId\"\r\n [ngClass]=\"inputClasses\"\r\n [attr.data-action]=\"datePickerWidget.action\"\r\n [min]=\"datePickerWidget.minDate || ''\"\r\n [max]=\"datePickerWidget.maxDate || ''\"\r\n [(ngModel)]=\"value\" />\r\n </div>\r\n `,\r\n styles: []\r\n})\r\nexport class DatePickerWidgetComponent implements CustomWidgetComponent, OnInit {\r\n @Input() widget!: any;\r\n widgetAction?: (actionName: string, payload: unknown) => void;\r\n \r\n value = '';\r\n inputId = '';\r\n\r\n get datePickerWidget(): DatePickerWidget {\r\n return this.widget as DatePickerWidget;\r\n }\r\n\r\n get showLabel(): boolean {\r\n const widget = this.datePickerWidget as any;\r\n if (widget.hideLabel === true) {\r\n return false;\r\n }\r\n if (widget.showLabel === false) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n get inputClasses(): string[] {\r\n return this.isFormAppearance ? ['bbq-form-datepicker'] : ['bbq-form-datepicker', 'bbq-input'];\r\n }\r\n\r\n private get isFormAppearance(): boolean {\r\n return (this.datePickerWidget as any).appearance === 'form';\r\n }\r\n\r\n ngOnInit() {\r\n this.inputId = `bbq-${this.datePickerWidget.action.replace(/\\s+/g, '-').toLowerCase()}-date`;\r\n }\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport type { MultiSelectWidget } from '@bbq-chat/widgets';\r\nimport { CustomWidgetComponent } from '../custom-widget-renderer.types';\r\n\r\n@Component({\r\n selector: 'bbq-multiselect-widget',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n template: `\r\n <div \r\n class=\"bbq-widget bbq-multi-select\" \r\n [attr.data-widget-type]=\"'multiselect'\">\r\n <label *ngIf=\"showLabel\" class=\"bbq-multi-select-label\" [attr.for]=\"selectId\">\r\n {{ multiSelectWidget.label }}\r\n </label>\r\n <select \r\n [id]=\"selectId\"\r\n [ngClass]=\"selectClasses\"\r\n [attr.data-action]=\"multiSelectWidget.action\"\r\n multiple\r\n [(ngModel)]=\"values\">\r\n @for (option of multiSelectWidget.options; track option) {\r\n <option [value]=\"option\">{{ option }}</option>\r\n }\r\n </select>\r\n </div>\r\n `,\r\n styles: []\r\n})\r\nexport class MultiSelectWidgetComponent implements CustomWidgetComponent, OnInit {\r\n @Input() widget!: any;\r\n widgetAction?: (actionName: string, payload: unknown) => void;\r\n \r\n values: string[] = [];\r\n selectId = '';\r\n\r\n get multiSelectWidget(): MultiSelectWidget {\r\n return this.widget as MultiSelectWidget;\r\n }\r\n\r\n get showLabel(): boolean {\r\n const widget = this.multiSelectWidget as any;\r\n if (widget.hideLabel === true) {\r\n return false;\r\n }\r\n if (widget.showLabel === false) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n get selectClasses(): string[] {\r\n return this.isFormAppearance \r\n ? ['bbq-form-multiselect', 'bbq-form-select']\r\n : ['bbq-form-multiselect', 'bbq-form-select'];\r\n }\r\n\r\n private get isFormAppearance(): boolean {\r\n return (this.multiSelectWidget as any).appearance === 'form';\r\n }\r\n\r\n ngOnInit() {\r\n this.selectId = `bbq-${this.multiSelectWidget.action.replace(/\\s+/g, '-').toLowerCase()}-select`;\r\n }\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport type { ProgressBarWidget } from '@bbq-chat/widgets';\r\nimport { CustomWidgetComponent } from '../custom-widget-renderer.types';\r\n\r\n@Component({\r\n selector: 'bbq-progressbar-widget',\r\n standalone: true,\r\n imports: [CommonModule],\r\n template: `\r\n <div \r\n class=\"bbq-widget bbq-progress-bar\" \r\n [attr.data-widget-type]=\"'progressbar'\">\r\n <label class=\"bbq-progress-bar-label\" [attr.for]=\"progressId\">\r\n {{ progressBarWidget.label }}\r\n </label>\r\n <progress \r\n [id]=\"progressId\"\r\n class=\"bbq-progress-bar-element\" \r\n [value]=\"progressBarWidget.value\"\r\n [max]=\"progressBarWidget.max\"\r\n [attr.data-action]=\"progressBarWidget.action\"\r\n [attr.aria-label]=\"progressBarWidget.label\"\r\n [attr.aria-valuenow]=\"progressBarWidget.value\"\r\n [attr.aria-valuemin]=\"0\"\r\n [attr.aria-valuemax]=\"progressBarWidget.max\">\r\n {{ percentage }}%\r\n </progress>\r\n <span class=\"bbq-progress-bar-value\" aria-live=\"polite\">{{ percentage }}%</span>\r\n </div>\r\n `,\r\n styles: []\r\n})\r\nexport class ProgressBarWidgetComponent implements CustomWidgetComponent, OnInit {\r\n @Input() widget!: any;\r\n widgetAction?: (actionName: string, payload: unknown) => void;\r\n \r\n progressId = '';\r\n percentage = 0;\r\n\r\n get progressBarWidget(): ProgressBarWidget {\r\n return this.widget as ProgressBarWidget;\r\n }\r\n\r\n ngOnInit() {\r\n this.progressId = `bbq-${this.progressBarWidget.action.replace(/\\s+/g, '-').toLowerCase()}-progress`;\r\n const max = this.progressBarWidget.max;\r\n this.percentage = max > 0 ? Math.floor((this.progressBarWidget.value * 100) / max) : 0;\r\n }\r\n}\r\n","import { Component, Input, OnInit, AfterViewInit, ViewChildren, QueryList, ViewContainerRef, ComponentRef, Injector, EnvironmentInjector, createComponent, Type, OnDestroy } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport type { FormWidget, ChatWidget } from '@bbq-chat/widgets';\r\nimport { CustomWidgetComponent } from '../custom-widget-renderer.types';\r\nimport { InputWidgetComponent } from './input.component';\r\nimport { TextAreaWidgetComponent } from './textarea.component';\r\nimport { DropdownWidgetComponent } from './dropdown.component';\r\nimport { SliderWidgetComponent } from './slider.component';\r\nimport { ToggleWidgetComponent } from './toggle.component';\r\nimport { DatePickerWidgetComponent } from './datepicker.component';\r\nimport { MultiSelectWidgetComponent } from './multiselect.component';\r\nimport { FileUploadWidgetComponent } from './fileupload.component';\r\n\r\n/**\r\n * Helper class to wrap form fields as widgets for dynamic rendering\r\n */\r\nclass FormFieldWidget implements ChatWidget {\r\n readonly type: string;\r\n readonly label: string;\r\n readonly action: string;\r\n readonly appearance = 'form';\r\n readonly hideLabel = true;\r\n\r\n constructor(\r\n public field: any,\r\n public formId: string\r\n ) {\r\n this.type = this.mapFieldTypeToWidgetType(field.type);\r\n this.label = field.label;\r\n this.action = `${formId}_${field.name}`;\r\n }\r\n\r\n private mapFieldTypeToWidgetType(fieldType: string): string {\r\n const typeMap: Record<string, string> = {\r\n 'input': 'input',\r\n 'text': 'input',\r\n 'email': 'input',\r\n 'number': 'input',\r\n 'password': 'input',\r\n 'textarea': 'textarea',\r\n 'dropdown': 'dropdown',\r\n 'select': 'dropdown',\r\n 'slider': 'slider',\r\n 'toggle': 'toggle',\r\n 'datepicker': 'datepicker',\r\n 'multiselect': 'multiselect',\r\n 'fileupload': 'fileupload'\r\n };\r\n return typeMap[fieldType] || 'input';\r\n }\r\n\r\n // Map field properties to widget properties\r\n get placeholder(): string | undefined {\r\n return this.field.placeholder ?? undefined;\r\n }\r\n\r\n get maxLength(): number | undefined {\r\n return this.field['maxLength'];\r\n }\r\n\r\n get rows(): number | undefined {\r\n return this.field['rows'];\r\n }\r\n\r\n get options(): string[] {\r\n return this.field['options'] || [];\r\n }\r\n\r\n get min(): number {\r\n return this.field['min'] ?? 0;\r\n }\r\n\r\n get max(): number {\r\n return this.field['max'] ?? 100;\r\n }\r\n\r\n get step(): number {\r\n return this.field['step'] ?? 1;\r\n }\r\n\r\n get defaultValue(): any {\r\n return this.field['defaultValue'] ?? (this.type === 'slider' ? this.min : undefined);\r\n }\r\n\r\n get minDate(): string | undefined {\r\n return this.field['minDate'];\r\n }\r\n\r\n get maxDate(): string | undefined {\r\n return this.field['maxDate'];\r\n }\r\n\r\n get accept(): string | undefined {\r\n return this.field['accept'];\r\n }\r\n\r\n get maxBytes(): number | undefined {\r\n return this.field['maxBytes'];\r\n }\r\n\r\n // ChatWidget interface methods\r\n toJson(): string {\r\n return JSON.stringify(this.toObject());\r\n }\r\n\r\n toObject(): any {\r\n return {\r\n type: this.type,\r\n label: this.label,\r\n action: this.action,\r\n ...this.field\r\n };\r\n }\r\n}\r\n\r\n@Component({\r\n selector: 'bbq-form-widget',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n template: `\r\n <div \r\n class=\"bbq-widget bbq-form\" \r\n [attr.data-widget-id]=\"formId\"\r\n [attr.data-widget-type]=\"'form'\"\r\n [attr.data-action]=\"formWidget.action\">\r\n <fieldset class=\"bbq-form-fieldset\">\r\n <legend class=\"bbq-form-title\">{{ formWidget.title }}</legend>\r\n\r\n @for (field of formWidget.fields; track field.name) {\r\n <div \r\n class=\"bbq-form-field\"\r\n [class.bbq-form-field-required]=\"field.required\"\r\n [attr.data-required]=\"field.required ? 'true' : null\">\r\n <label class=\"bbq-form-field-label\" [attr.for]=\"getFieldId(field.name)\">\r\n {{ field.label }}\r\n @if (field.required) {\r\n <span class=\"bbq-form-required\">*</span>\r\n }\r\n </label>\r\n\r\n <div #fieldContainer class=\"bbq-form-field-widget\"></div>\r\n\r\n @if (getFieldProp(field, 'validationHint')) {\r\n <span class=\"bbq-form-field-hint\">{{ getFieldProp(field, 'validationHint') }}</span>\r\n }\r\n </div>\r\n }\r\n\r\n <div class=\"bbq-form-validation-message\" [style.display]=\"showValidationMessage ? 'block' : 'none'\">\r\n Please fill in all required fields before submitting.\r\n </div>\r\n\r\n @if (formWidget.actions && formWidget.actions.length > 0) {\r\n <div class=\"bbq-form-actions\">\r\n @for (action of formWidget.actions; track action.label) {\r\n <button \r\n type=\"button\" \r\n class=\"bbq-form-button\"\r\n [class.bbq-form-submit]=\"action.type === 'submit'\"\r\n [class.bbq-form-cancel]=\"action.type !== 'submit'\"\r\n [attr.data-action]=\"formWidget.action\"\r\n [attr.data-action-type]=\"action.type\"\r\n (click)=\"onActionClick(action.type)\">\r\n {{ action.label }}\r\n </button>\r\n }\r\n </div>\r\n }\r\n </fieldset>\r\n </div>\r\n `,\r\n styles: [`\r\n .bbq-form-field-widget {\r\n display: contents;\r\n }\r\n `]\r\n})\r\nexport class FormWidgetComponent implements CustomWidgetComponent, OnInit, AfterViewInit, OnDestroy {\r\n @Input() widget!: any;\r\n widgetAction?: (actionName: string, payload: unknown) => void;\r\n \r\n @ViewChildren('fieldContainer', { read: ViewContainerRef }) \r\n fieldContainers!: QueryList<ViewContainerRef>;\r\n\r\n formId = '';\r\n formData: Record<string, any> = {};\r\n showValidationMessage = false;\r\n private componentRefs: ComponentRef<any>[] = [];\r\n\r\n // Component registry for field types\r\n private fieldComponentRegistry: Record<string, Type<CustomWidgetComponent>> = {\r\n 'input': InputWidgetComponent,\r\n 'text': InputWidgetComponent,\r\n 'email': InputWidgetComponent,\r\n 'number': InputWidgetComponent,\r\n 'password': InputWidgetComponent,\r\n 'textarea': TextAreaWidgetComponent,\r\n 'dropdown': DropdownWidgetComponent,\r\n 'select': DropdownWidgetComponent,\r\n 'slider': SliderWidgetComponent,\r\n 'toggle': ToggleWidgetComponent,\r\n 'datepicker': DatePickerWidgetComponent,\r\n 'multiselect': MultiSelectWidgetComponent,\r\n 'fileupload': FileUploadWidgetComponent,\r\n 'checkbox': ToggleWidgetComponent,\r\n 'radio': ToggleWidgetComponent,\r\n };\r\n\r\n get formWidget(): FormWidget {\r\n return this.widget as FormWidget;\r\n }\r\n\r\n constructor(\r\n private injector: Injector,\r\n private environmentInjector: EnvironmentInjector\r\n ) {}\r\n\r\n ngOnInit() {\r\n this.formId = `bbq-${this.formWidget.action.replace(/\\s+/g, '-').toLowerCase()}`;\r\n \r\n // Initialize form data with default values\r\n for (const field of this.formWidget.fields || []) {\r\n if (field.type === 'slider') {\r\n this.formData[field.name] = field['default'] ?? field['defaultValue'] ?? field['min'] ?? 0;\r\n } else if (field.type === 'toggle' || field.type === 'checkbox') {\r\n this.formData[field.name] = field['defaultValue'] ?? false;\r\n } else if (field.type === 'multiselect') {\r\n this.formData[field.name] = [];\r\n } else {\r\n this.formData[field.name] = '';\r\n }\r\n }\r\n }\r\n\r\n ngAfterViewInit() {\r\n // Render field widgets dynamically\r\n setTimeout(() => this.renderFieldWidgets(), 0);\r\n }\r\n\r\n ngOnDestroy() {\r\n // Clean up component refs\r\n this.componentRefs.forEach(ref => ref.destroy());\r\n this.componentRefs = [];\r\n }\r\n\r\n private renderFieldWidgets() {\r\n const containers = this.fieldContainers.toArray();\r\n const fields = this.formWidget.fields || [];\r\n\r\n fields.forEach((field: any, index: number) => {\r\n const container = containers[index];\r\n if (!container) return;\r\n\r\n const componentType = this.fieldComponentRegistry[field.type];\r\n if (!componentType) {\r\n // Fallback to input for unknown types\r\n this.renderInputFallback(container, field);\r\n return;\r\n }\r\n\r\n // Create the field widget\r\n const fieldWidget = new FormFieldWidget(field, this.formId);\r\n \r\n // Create the component\r\n const componentRef = createComponent(componentType, {\r\n environmentInjector: this.environmentInjector,\r\n elementInjector: this.injector,\r\n });\r\n\r\n // Set component inputs\r\n const instance = componentRef.instance as any;\r\n instance['widget'] = fieldWidget;\r\n \r\n // Connect to form data via widgetAction\r\n instance['widgetAction'] = (actionName: string, payload: unknown) => {\r\n // Handle field value changes - for now, we'll sync via the rendered widget's internal state\r\n // The actual form submission will gather values from the DOM\r\n };\r\n\r\n // Attach to container\r\n container.insert(componentRef.hostView);\r\n this.componentRefs.push(componentRef);\r\n\r\n // Trigger change detection\r\n componentRef.changeDetectorRef.detectChanges();\r\n });\r\n }\r\n\r\n private renderInputFallback(container: ViewContainerRef, field: any) {\r\n // For unsupported field types, render a basic input\r\n const fieldWidget = new FormFieldWidget(field, this.formId);\r\n const componentRef = createComponent(InputWidgetComponent, {\r\n environmentInjector: this.environmentInjector,\r\n elementInjector: this.injector,\r\n });\r\n\r\n const instance = componentRef.instance as any;\r\n instance['widget'] = fieldWidget;\r\n\r\n container.insert(componentRef.hostView);\r\n this.componentRefs.push(componentRef);\r\n componentRef.changeDetectorRef.detectChanges();\r\n }\r\n\r\n getFieldId(fieldName: string): string {\r\n // Match the ID format used by dynamically rendered input widgets\r\n return `bbq-${this.formId}_${fieldName}-input`;\r\n }\r\n\r\n getFieldProp(field: any, prop: string): any {\r\n return field[prop];\r\n }\r\n\r\n onActionClick(actionType: string) {\r\n if (actionType === 'submit') {\r\n // Validate required fields\r\n const hasErrors = this.validateForm();\r\n \r\n if (hasErrors) {\r\n this.showValidationMessage = true;\r\n return;\r\n }\r\n \r\n this.showValidationMessage = false;\r\n \r\n // Gather form data from the DOM (since widgets manage their own state)\r\n this.gatherFormData();\r\n \r\n if (this.widgetAction) {\r\n this.widgetAction(this.formWidget.action, this.formData);\r\n }\r\n } else {\r\n // Cancel or other actions\r\n if (this.widgetAction) {\r\n this.widgetAction(this.formWidget.action, { actionType });\r\n }\r\n }\r\n }\r\n\r\n private validateForm(): boolean {\r\n for (const field of this.formWidget.fields || []) {\r\n if (field.required) {\r\n const value = this.formData[field.name];\r\n if (value === undefined || value === null || value === '' || \r\n (Array.isArray(value) && value.length === 0)) {\r\n return true; // Has errors\r\n }\r\n }\r\n }\r\n return false; // No errors\r\n }\r\n\r\n private gatherFormData() {\r\n // Gather data from the rendered field widgets\r\n // Since each widget component manages its own state via ngModel,\r\n // we need to query the DOM to get the current values\r\n const fields = this.formWidget.fields || [];\r\n \r\n fields.forEach((field: any) => {\r\n const fieldId = this.getFieldId(field.name);\r\n const element = document.getElementById(fieldId) as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n \r\n if (element) {\r\n if (element.type === 'checkbox') {\r\n this.formData[field.name] = (element as HTMLInputElement).checked;\r\n } else if (element.type === 'file') {\r\n this.formData[field.name] = (element as HTMLInputElement).files?.[0];\r\n } else if (element.tagName === 'SELECT' && (element as HTMLSelectElement).multiple) {\r\n const select = element as HTMLSelectElement;\r\n this.formData[field.name] = Array.from(select.selectedOptions).map(opt => opt.value);\r\n } else {\r\n this.formData[field.name] = element.value;\r\n }\r\n }\r\n });\r\n }\r\n}\r\n","import { Component, Input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport type { ImageWidget } from '@bbq-chat/widgets';\r\nimport { CustomWidgetComponent } from '../custom-widget-renderer.types';\r\n\r\n@Component({\r\n selector: 'bbq-image-widget',\r\n standalone: true,\r\n imports: [CommonModule],\r\n template: `\r\n <div \r\n class=\"bbq-widget bbq-image\" \r\n [attr.data-widget-type]=\"'image'\"\r\n [attr.data-action]=\"imageWidget.action\">\r\n <img \r\n class=\"bbq-image-img\" \r\n [src]=\"imageWidget.imageUrl\" \r\n [alt]=\"imageWidget.alt || 'Image'\"\r\n [style.width]=\"imageWidget.width ? imageWidget.width + 'px' : 'auto'\"\r\n [style.height]=\"imageWidget.height ? imageWidget.height + 'px' : 'auto'\"\r\n loading=\"lazy\" />\r\n </div>\r\n `,\r\n styles: []\r\n})\r\nexport class ImageWidgetComponent implements CustomWidgetComponent {\r\n @Input() widget!: any;\r\n widgetAction?: (actionName: string, payload: unknown) => void;\r\n\r\n get imageWidget(): ImageWidget {\r\n return this.widget as ImageWidget;\r\n }\r\n}\r\n","import { Component, Input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport type { ImageCollectionWidget } from '@bbq-chat/widgets';\r\nimport { CustomWidgetComponent } from '../custom-widget-renderer.types';\r\n\r\n@Component({\r\n selector: 'bbq-imagecollection-widget',\r\n standalone: true,\r\n imports: [CommonModule],\r\n template: `\r\n <div \r\n class=\"bbq-widget bbq-image-collection\" \r\n [attr.data-widget-type]=\"'imagecollection'\"\r\n [attr.data-action]=\"imageCollectionWidget.action\">\r\n <div class=\"bbq-image-collection-grid\">\r\n @for (image of imageCollectionWidget.images; track image.imageUrl) {\r\n <div class=\"bbq-image-collection-item\">\r\n <img \r\n class=\"bbq-image-collection-img\" \r\n [src]=\"image.imageUrl\" \r\n [alt]=\"image.alt || 'Image'\"\r\n [style.width]=\"image.width ? image.width + 'px' : 'auto'\"\r\n [style.height]=\"image.height ? image.height + 'px' : 'auto'\"\r\n loading=\"lazy\" />\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n `,\r\n styles: []\r\n})\r\nexport class ImageCollectionWidgetComponent implements CustomWidgetComponent {\r\n @Input() widget!: any;\r\n widgetAction?: (actionName: string, payload: unknown) => void;\r\n\r\n get imageCollectionWidget(): ImageCollectionWidget {\r\n return this.widget as ImageCollectionWidget;\r\n }\r\n}\r\n","/**\r\n * Built-in widget components\r\n * These components provide Angular implementations for all standard widget types\r\n */\r\n\r\nexport { ButtonWidgetComponent } from './button.component';\r\nexport { CardWidgetComponent } from './card.component';\r\nexport { InputWidgetComponent } from './input.component';\r\nexport { TextAreaWidgetComponent } from './textarea.component';\r\nexport { DropdownWidgetComponent } from './dropdown.component';\r\nexport { SliderWidgetComponent } from './slider.component';\r\nexport { ToggleWidgetComponent } from './toggle.component';\r\nexport { FileUploadWidgetComponent } from './fileupload.component';\r\nexport { ThemeSwitcherWidgetComponent } from './themeswitcher.component';\r\nexport { DatePickerWidgetComponent } from './datepicker.component';\r\nexport { MultiSelectWidgetComponent } from './multiselect.component';\r\nexport { ProgressBarWidgetComponent } from './progressbar.component';\r\nexport { FormWidgetComponent } from './form.component';\r\nexport { ImageWidgetComponent } from './image.component';\r\nexport { ImageCollectionWidgetComponent } from './imagecollection.component';\r\n","import { Type } from '@angular/core';\r\nimport { CustomWidgetComponent } from '../custom-widget-renderer.types';\r\nimport {\r\n ButtonWidgetComponent,\r\n CardWidgetComponent,\r\n InputWidgetComponent,\r\n TextAreaWidgetComponent,\r\n DropdownWidgetComponent,\r\n SliderWidgetComponent,\r\n ToggleWidgetComponent,\r\n FileUploadWidgetComponent,\r\n ThemeSwitcherWidgetComponent,\r\n DatePickerWidgetComponent,\r\n MultiSelectWidgetComponent,\r\n ProgressBarWidgetComponent,\r\n FormWidgetComponent,\r\n ImageWidgetComponent,\r\n ImageCollectionWidgetComponent,\r\n} from '../components';\r\n\r\n/**\r\n * Registry of all built-in widget components\r\n * Maps widget type to Angular component class\r\n */\r\nexport const BUILT_IN_WIDGET_COMPONENTS: Record<string, Type<CustomWidgetComponent>> = {\r\n button: ButtonWidgetComponent,\r\n card: CardWidgetComponent,\r\n input: InputWidgetComponent,\r\n textarea: TextAreaWidgetComponent,\r\n dropdown: DropdownWidgetComponent,\r\n slider: SliderWidgetComponent,\r\n toggle: ToggleWidgetComponent,\r\n fileupload: FileUploadWidgetComponent,\r\n themeswitcher: ThemeSwitcherWidgetComponent,\r\n datepicker: DatePickerWidgetComponent,\r\n multiselect: MultiSelectWidgetComponent,\r\n progressbar: ProgressBarWidgetComponent,\r\n form: FormWidgetComponent,\r\n image: ImageWidgetComponent,\r\n imagecollection: ImageCollectionWidgetComponent,\r\n};\r\n","import { InjectionToken } from '@angular/core';\r\nimport { SsrWidgetRenderer, WidgetEventManager, IWidgetActionHandler } from '@bbq-chat/widgets';\r\nimport { AngularWidgetRenderer } from './renderers/AngularWidgetRenderer';\r\nimport { BUILT_IN_WIDGET_COMPONENTS } from './renderers/built-in-components';\r\n\r\n/**\r\n * Injection token for WidgetEventManager factory\r\n * \r\n * Use this token to inject a factory function that creates WidgetEventManager instances.\r\n * The factory accepts an optional action handler to configure the manager.\r\n * \r\n * @example\r\n * ```typescript\r\n * constructor(@Inject(WIDGET_EVENT_MANAGER_FACTORY) private eventManagerFactory: WidgetEventManagerFactory) {\r\n * const actionHandler = { handle: async (action, payload) => { ... } };\r\n * this.eventManager = this.eventManagerFactory(actionHandler);\r\n * }\r\n * ```\r\n */\r\nexport type WidgetEventManagerFactory = (actionHandler?: IWidgetActionHandler) => WidgetEventManager;\r\n\r\nexport const WIDGET_EVENT_MANAGER_FACTORY = new InjectionToken<WidgetEventManagerFactory>(\r\n 'WIDGET_EVENT_MANAGER_FACTORY'\r\n);\r\n\r\n/**\r\n * Injection token for SsrWidgetRenderer\r\n * \r\n * Use this token to inject a SsrWidgetRenderer instance in your components.\r\n * By default, WidgetRendererComponent provides this token with a factory that creates\r\n * a new instance for each component.\r\n * \r\n * @example\r\n * ```typescript\r\n * constructor(@Inject(SSR_WIDGET_RENDERER) private renderer: SsrWidgetRenderer) {}\r\n * ```\r\n */\r\nexport const SSR_WIDGET_RENDERER = new InjectionToken<SsrWidgetRenderer>(\r\n 'SSR_WIDGET_RENDERER'\r\n);\r\n\r\n/**\r\n * Injection token for AngularWidgetRenderer\r\n * \r\n * Use this token to inject an AngularWidgetRenderer instance in your components.\r\n * This is the recommended renderer for Angular applications as it provides\r\n * native Angular component rendering instead of HTML string rendering.\r\n * \r\n * @example\r\n * ```typescript\r\n * constructor(@Inject(ANGULAR_WIDGET_RENDERER) private renderer: AngularWidgetRenderer) {}\r\n * ```\r\n */\r\nexport const ANGULAR_WIDGET_RENDERER = new InjectionToken<AngularWidgetRenderer>(\r\n 'ANGULAR_WIDGET_RENDERER'\r\n);\r\n\r\n/**\r\n * Factory function for creating WidgetEventManager instances\r\n * \r\n * This factory is used by default in WidgetRendererComponent's providers array.\r\n * You can override this in your own providers if you need custom initialization.\r\n * \r\n * @returns A factory function that creates WidgetEventManager instances\r\n */\r\nexport function widgetEventManagerFactoryProvider(): WidgetEventManagerFactory {\r\n return (actionHandler?: IWidgetActionHandler) => new WidgetEventManager(actionHandler);\r\n}\r\n\r\n/**\r\n * Factory function for creating SsrWidgetRenderer instances\r\n * \r\n * This factory is used by default in WidgetRendererComponent's providers array.\r\n * You can override this in your own providers if you need custom initialization\r\n * or custom rendering options.\r\n * \r\n * @returns A new SsrWidgetRenderer instance\r\n */\r\nexport function ssrWidgetRendererFactory(): SsrWidgetRenderer {\r\n return new SsrWidgetRenderer();\r\n}\r\n\r\n/**\r\n * Factory function for creating AngularWidgetRenderer instances\r\n * \r\n * This factory creates an AngularWidgetRenderer with all built-in widget components\r\n * pre-registered. This is the recommended renderer for Angular applications.\r\n * \r\n * @returns A new AngularWidgetRenderer instance with built-in components registered\r\n */\r\nexport function angularWidgetRendererFactory(): AngularWidgetRenderer {\r\n const renderer = new AngularWidgetRenderer();\r\n renderer.registerBuiltInComponents(BUILT_IN_WIDGET_COMPONENTS);\r\n return renderer;\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { customWidgetRegistry, ChatWidget } from '@bbq-chat/widgets';\r\nimport { CustomWidgetRenderer } from './custom-widget-renderer.types';\r\n\r\n/**\r\n * Service for registering custom widget factories and renderers\r\n * \r\n * This service provides a centralized way to register custom widget types\r\n * that extend the base widget functionality, including support for\r\n * Angular components and templates as custom renderers.\r\n * \r\n * @example\r\n * ```typescript\r\n * constructor(private widgetRegistry: WidgetRegistryService) {\r\n * // Register a widget factory\r\n * this.widgetRegistry.registerFactory('myWidget', (obj) => {\r\n * if (obj.type === 'myWidget') {\r\n * return new MyCustomWidget(obj.label, obj.action);\r\n * }\r\n * return null;\r\n * });\r\n * \r\n * // Register a component-based renderer\r\n * this.widgetRegistry.registerRenderer('myWidget', MyWidgetComponent);\r\n * }\r\n * ```\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class WidgetRegistryService {\r\n private readonly customRenderers = new Map<string, CustomWidgetRenderer>();\r\n /**\r\n * Register a custom widget factory function\r\n * \r\n * @param type - The widget type identifier\r\n * @param factory - Factory function that creates widget instances from plain objects\r\n */\r\n registerFactory(\r\n type: string,\r\n factory: (obj: unknown) => ChatWidget | null\r\n ): void {\r\n customWidgetRegistry.registerFactory(type, factory);\r\n }\r\n\r\n /**\r\n * Register a widget class with automatic factory creation\r\n * \r\n * @param type - The widget type identifier\r\n * @param ctor - Widget class constructor\r\n */\r\n registerClass(type: string, ctor: any): void {\r\n customWidgetRegistry.registerClass(type, ctor);\r\n }\r\n\r\n /**\r\n * Get a factory for a specific widget type\r\n * \r\n * @param type - The widget type identifier\r\n * @returns The factory function if registered, undefined otherwise\r\n */\r\n getFactory(type: string): ((obj: any) => ChatWidget | null) | undefined {\r\n return customWidgetRegistry.getFactory(type);\r\n }\r\n\r\n /**\r\n * Register a custom renderer for a specific widget type\r\n * \r\n * The renderer can be:\r\n * - A function that returns HTML string\r\n * - An Angular Component class\r\n * - An Angular TemplateRef\r\n * \r\n * @param type - The widget type identifier\r\n * @param renderer - The custom renderer (function, Component, or TemplateRef)\r\n * \r\n * @example\r\n * ```typescript\r\n * // HTML function renderer\r\n * widgetRegistry.registerRenderer('weather', (widget) => `<div>${widget.label}</div>`);\r\n * \r\n * // Component renderer\r\n * widgetRegistry.registerRenderer('weather', WeatherWidgetComponent);\r\n * \r\n * // Template renderer (from @ViewChild or elsewhere)\r\n * widgetRegistry.registerRenderer('weather', this.weatherTemplate);\r\n * ```\r\n */\r\n registerRenderer(type: string, renderer: CustomWidgetRenderer): void {\r\n if (!type || typeof type !== 'string') {\r\n throw new Error('type must be a non-empty string');\r\n }\r\n if (!renderer) {\r\n throw new Error('renderer is required');\r\n }\r\n this.customRenderers.set(type, renderer);\r\n }\r\n\r\n /**\r\n * Get a custom renderer for a specific widget type\r\n * \r\n * @param type - The widget type identifier\r\n * @returns The custom renderer if registered, undefined otherwise\r\n */\r\n getRenderer(type: string): CustomWidgetRenderer | undefined {\r\n return this.customRenderers.get(type);\r\n }\r\n\r\n /**\r\n * Check if a custom renderer is registered for a widget type\r\n * \r\n * @param type - The widget type identifier\r\n * @returns True if a custom renderer is registered, false otherwise\r\n */\r\n hasRenderer(type: string): boolean {\r\n return this.customRenderers.has(type);\r\n }\r\n\r\n /**\r\n * Unregister a custom renderer for a widget type\r\n * \r\n * @param type - The widget type identifier\r\n * @returns True if a renderer was removed, false if none was registered\r\n */\r\n unregisterRenderer(type: string): boolean {\r\n return this.customRenderers.delete(type);\r\n }\r\n}\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ElementRef,\r\n AfterViewInit,\r\n OnInit,\r\n OnDestroy,\r\n OnChanges,\r\n SimpleChanges,\r\n ViewChild,\r\n ComponentRef,\r\n EmbeddedViewRef,\r\n TemplateRef,\r\n Injector,\r\n createComponent,\r\n EnvironmentInjector,\r\n Inject,\r\n Optional,\r\n ChangeDetectorRef,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n SsrWidgetRenderer,\r\n WidgetEventManager,\r\n ChatWidget,\r\n} from '@bbq-chat/widgets';\r\nimport { WidgetRegistryService } from './widget-registry.service';\r\nimport {\r\n WidgetTemplateContext,\r\n isHtmlRenderer,\r\n isComponentRenderer,\r\n isTemplateRenderer,\r\n} from './custom-widget-renderer.types';\r\nimport {\r\n WIDGET_EVENT_MANAGER_FACTORY,\r\n SSR_WIDGET_RENDERER,\r\n ANGULAR_WIDGET_RENDERER,\r\n widgetEventManagerFactoryProvider,\r\n ssrWidgetRendererFactory,\r\n angularWidgetRendererFactory,\r\n WidgetEventManagerFactory,\r\n} from './widget-di.tokens';\r\nimport { AngularWidgetRenderer } from './renderers/AngularWidgetRenderer';\r\n\r\n/**\r\n * Angular component for rendering chat widgets\r\n * \r\n * This component handles rendering of chat widgets using the BbQ ChatWidgets library.\r\n * It manages widget lifecycle, event handling, and cleanup. \r\n * \r\n * Supports three types of custom widget renderers:\r\n * 1. HTML function renderers (return HTML strings)\r\n * 2. Angular Component renderers (render as dynamic components)\r\n * 3. Angular TemplateRef renderers (render as embedded views)\r\n * \r\n * @example\r\n * ```typescript\r\n * <bbq-widget-renderer \r\n * [widgets]=\"messageWidgets\" \r\n * (widgetAction)=\"handleWidgetAction($event)\">\r\n * </bbq-widget-renderer>\r\n * ```\r\n */\r\n@Component({\r\n selector: 'bbq-widget-renderer',\r\n standalone: true,\r\n imports: [CommonModule],\r\n providers: [\r\n { provide: WIDGET_EVENT_MANAGER_FACTORY, useFactory: widgetEventManagerFactoryProvider },\r\n { provide: SSR_WIDGET_RENDERER, useFactory: ssrWidgetRendererFactory },\r\n { provide: ANGULAR_WIDGET_RENDERER, useFactory: angularWidgetRendererFactory },\r\n ],\r\n template: `\r\n <div #widgetContainer class=\"bbq-widgets-container\" (click)=\"handleClick($event)\">\r\n @for (item of widgetItems; track item.index) {\r\n @if (item.isHtml) {\r\n <div class=\"bbq-widget\" [innerHTML]=\"item.html\"></div>\r\n } @else {\r\n <div class=\"bbq-widget\" #dynamicWidget></div>\r\n }\r\n }\r\n </div>\r\n `,\r\n styles: [\r\n `\r\n .bbq-widgets-container {\r\n margin-top: 0.5rem;\r\n }\r\n\r\n .bbq-widget {\r\n margin-bottom: 0.5rem;\r\n }\r\n `,\r\n ],\r\n})\r\nexport class WidgetRendererComponent\r\n implements OnInit, AfterViewInit, OnDestroy, OnChanges {\r\n /**\r\n * Array of widgets to render\r\n */\r\n @Input() widgets: ChatWidget[] | null | undefined;\r\n\r\n /**\r\n * Emits when a widget action is triggered\r\n */\r\n @Output() widgetAction = new EventEmitter<{\r\n actionName: string;\r\n payload: unknown;\r\n }>();\r\n\r\n @ViewChild('widgetContainer', { static: false })\r\n containerRef!: ElementRef<HTMLDivElement>;\r\n\r\n protected widgetItems: Array<{\r\n index: number;\r\n widget: ChatWidget;\r\n isHtml: boolean;\r\n html?: string;\r\n }> = [];\r\n\r\n protected eventManager?: WidgetEventManager;\r\n protected isViewInitialized = false;\r\n protected dynamicComponents: Array<ComponentRef<any>> = [];\r\n protected dynamicViews: Array<EmbeddedViewRef<WidgetTemplateContext>> = [];\r\n\r\n constructor(\r\n @Inject(SSR_WIDGET_RENDERER) protected renderer: SsrWidgetRenderer,\r\n @Optional() @Inject(ANGULAR_WIDGET_RENDERER) protected angularRenderer: AngularWidgetRenderer | null,\r\n @Inject(WIDGET_EVENT_MANAGER_FACTORY) protected eventManagerFactory: WidgetEventManagerFactory,\r\n protected widgetRegistry: WidgetRegistryService,\r\n protected injector: Injector,\r\n protected environmentInjector: EnvironmentInjector\r\n ) { }\r\n\r\n ngOnInit() {\r\n // this.updateWidgetHtml();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['widgets']) {\r\n this.updateWidgetHtml();\r\n }\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.updateWidgetHtml();\r\n this.isViewInitialized = true;\r\n this.setupEventHandlers();\r\n // Render dynamic components/templates after view init\r\n this.renderDynamicWidgets();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.cleanup();\r\n }\r\n\r\n /**\r\n * Base implementation for updating the rendered HTML for the current widgets.\r\n *\r\n * Subclasses may override this method to customize how widgets are rendered\r\n * (for example, to inject additional markup or perform preprocessing).\r\n *\r\n * Since this is the base implementation, overriding implementations are not\r\n * required to call `super.updateWidgetHtml()`.\r\n */\r\n protected updateWidgetHtml() {\r\n if (!this.widgets || this.widgets.length === 0) {\r\n this.widgetItems = [];\r\n return;\r\n }\r\n\r\n this.widgetItems = this.widgets.map((widget, index) => {\r\n const customRenderer = this.widgetRegistry.getRenderer(widget.type);\r\n\r\n // Check template renderer first (most specific)\r\n if (customRenderer && isTemplateRenderer(customRenderer)) {\r\n return {\r\n index,\r\n widget,\r\n isHtml: false,\r\n };\r\n }\r\n\r\n // Check component renderer second\r\n if (customRenderer && isComponentRenderer(customRenderer)) {\r\n return {\r\n index,\r\n widget,\r\n isHtml: false,\r\n };\r\n }\r\n\r\n // Check HTML function renderer last (most general, matches any function)\r\n if (customRenderer && isHtmlRenderer(customRenderer)) {\r\n return {\r\n index,\r\n widget,\r\n isHtml: true,\r\n html: customRenderer(widget),\r\n };\r\n }\r\n\r\n // Try to use AngularWidgetRenderer for built-in widgets\r\n if (this.angularRenderer) {\r\n const componentType = this.angularRenderer.getComponentType(widget);\r\n if (componentType) {\r\n return {\r\n index,\r\n widget,\r\n isHtml: false,\r\n };\r\n }\r\n }\r\n\r\n // Fallback: render using the SSR library renderer\r\n return {\r\n index,\r\n widget,\r\n isHtml: true,\r\n html: this.renderer.renderWidget(widget),\r\n };\r\n });\r\n\r\n // After view updates, reinitialize widgets only if view is already initialized\r\n if (this.isViewInitialized) {\r\n setTimeout(() => {\r\n this.setupEventHandlers();\r\n this.renderDynamicWidgets();\r\n }, 0);\r\n }\r\n }\r\n\r\n /**\r\n * Render dynamic components and templates for custom widgets\r\n */\r\n protected renderDynamicWidgets() {\r\n if (!this.containerRef?.nativeElement) return;\r\n\r\n // Use microtask to ensure Angular has completed change detection\r\n Promise.resolve().then(() => {\r\n if (!this.containerRef?.nativeElement) return;\r\n\r\n // Clean up existing dynamic components and views\r\n this.cleanupDynamicWidgets();\r\n\r\n const container = this.containerRef.nativeElement;\r\n // Query all widget divs without the data-rendered filter\r\n const dynamicWidgetDivs = Array.from(\r\n container.querySelectorAll('.bbq-widget')\r\n ) as HTMLElement[];\r\n\r\n let dynamicIndex = 0;\r\n this.widgetItems.forEach((item) => {\r\n if (!item.isHtml) {\r\n const customRenderer = this.widgetRegistry.getRenderer(item.widget.type);\r\n\r\n const targetDiv = dynamicWidgetDivs[dynamicIndex];\r\n if (!targetDiv) return;\r\n\r\n // Clear the div content before rendering\r\n targetDiv.innerHTML = '';\r\n\r\n // Handle custom renderers first\r\n if (customRenderer) {\r\n if (isComponentRenderer(customRenderer)) {\r\n this.renderComponent(customRenderer, item.widget, targetDiv);\r\n } else if (isTemplateRenderer(customRenderer)) {\r\n this.renderTemplate(customRenderer, item.widget, targetDiv);\r\n }\r\n } else if (this.angularRenderer) {\r\n // Try to render using AngularWidgetRenderer for built-in widgets\r\n const componentType = this.angularRenderer.getComponentType(item.widget);\r\n if (componentType) {\r\n this.renderComponent(componentType, item.widget, targetDiv);\r\n }\r\n }\r\n\r\n dynamicIndex++;\r\n }\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Render an Angular component for a custom widget\r\n * \r\n * Note: This method safely assigns properties to component instances\r\n * by checking for property existence at runtime. This approach is necessary\r\n * because we cannot statically verify that all components implement\r\n * the CustomWidgetComponent interface.\r\n */\r\n protected renderComponent(\r\n componentType: any,\r\n widget: ChatWidget,\r\n targetElement: HTMLElement\r\n ) {\r\n // Create the component using Angular's createComponent API\r\n const componentRef = createComponent(componentType, {\r\n environmentInjector: this.environmentInjector,\r\n elementInjector: this.injector,\r\n });\r\n\r\n // Safely set component inputs if they exist\r\n const instance = componentRef.instance as any;\r\n // Set widget property if it exists in the prototype chain\r\n if (!instance['widget']) {\r\n instance['widget'] = widget;\r\n }\r\n // Set widgetAction property if it exists in the prototype chain\r\n if(!instance['widgetAction']) {\r\n instance['widgetAction'] = (actionName: string, payload: unknown) => {\r\n this.widgetAction.emit({ actionName, payload });\r\n };\r\n }\r\n // Attach the component's host view to the target element\r\n targetElement.appendChild(componentRef.location.nativeElement);\r\n\r\n // Store reference for cleanup\r\n this.dynamicComponents.push(componentRef);\r\n\r\n // Trigger change detection (use optional chaining for safety)\r\n componentRef.changeDetectorRef?.detectChanges();\r\n }\r\n\r\n /**\r\n * Render an Angular template for a custom widget\r\n */\r\n protected renderTemplate(\r\n templateRef: TemplateRef<WidgetTemplateContext>,\r\n widget: ChatWidget,\r\n targetElement: HTMLElement\r\n ) {\r\n const context: WidgetTemplateContext = {\r\n $implicit: widget,\r\n widget: widget,\r\n emitAction: (actionName: string, payload: unknown) => {\r\n this.widgetAction.emit({ actionName, payload });\r\n },\r\n };\r\n\r\n const viewRef = templateRef.createEmbeddedView(context);\r\n\r\n // Attach the view's DOM nodes to the target element\r\n viewRef.rootNodes.forEach((node: Node) => {\r\n targetElement.appendChild(node);\r\n });\r\n\r\n // Store reference for cleanup\r\n this.dynamicViews.push(viewRef);\r\n\r\n // Trigger change detection\r\n viewRef.detectChanges();\r\n }\r\n\r\n /**\r\n * Cleanup dynamic components and views\r\n */\r\n protected cleanupDynamicWidgets() {\r\n this.dynamicComponents.forEach((componentRef) => {\r\n componentRef.destroy();\r\n });\r\n this.dynamicComponents = [];\r\n\r\n this.dynamicViews.forEach((viewRef) => {\r\n viewRef.destroy();\r\n });\r\n this.dynamicViews = [];\r\n }\r\n\r\n private setupEventHandlers() {\r\n if (!this.containerRef?.nativeElement) return;\r\n\r\n // Cleanup old resources before setting up new ones\r\n this.cleanup();\r\n\r\n const container = this.containerRef.nativeElement;\r\n\r\n // Create a custom action handler that emits events\r\n const actionHandler = {\r\n handle: async (action: string, payload: any) => {\r\n this.widgetAction.emit({ actionName: action, payload });\r\n },\r\n };\r\n\r\n // Use the injected factory to create an event manager with the component-specific action handler\r\n this.eventManager = this.eventManagerFactory(actionHandler);\r\n this.eventManager.attachHandlers(container);\r\n }\r\n\r\n handleClick(event: MouseEvent) {\r\n const target = event.target as HTMLElement;\r\n // Only trigger actions on non-form buttons and clickable elements (cards)\r\n // Don't trigger on input elements or form buttons (let WidgetEventManager handle those)\r\n const button = target.tagName === 'BUTTON' ? target : target.closest('button');\r\n if (button && !button.closest('[data-widget-type=\"form\"]')) {\r\n const actionName = button.getAttribute('data-action');\r\n if (actionName) {\r\n try {\r\n const payloadStr = button.getAttribute('data-payload');\r\n const payload = payloadStr ? JSON.parse(payloadStr) : {};\r\n this.widgetAction.emit({ actionName, payload });\r\n } catch (err) {\r\n console.error('Failed to parse widget action payload:', err);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Cleanup all resources including event listeners.\r\n */\r\n private cleanup() {\r\n // Cleanup dynamic widgets first\r\n this.cleanupDynamicWidgets();\r\n\r\n // Cleanup event manager\r\n this.eventManager = undefined;\r\n }\r\n}\r\n","/**\r\n * Angular widget renderers\r\n */\r\n\r\nexport { AngularWidgetRenderer } from './AngularWidgetRenderer';\r\nexport type { AngularRendererOptions } from './AngularWidgetRenderer';\r\nexport * from '../components';\r\n","/**\r\n * @bbq-chat/widgets-angular\r\n * \r\n * Angular components and services for BbQ ChatWidgets\r\n * \r\n * This package provides Angular-native components and services that wrap\r\n * the core @bbq-chat/widgets library, making it easy to integrate chat\r\n * widgets into Angular applications.\r\n * \r\n * @packageDocumentation\r\n */\r\n\r\n// Export components\r\nexport { WidgetRendererComponent } from './widget-renderer.component';\r\n\r\n// Export services\r\nexport { WidgetRegistryService } from './widget-registry.service';\r\n\r\n// Export DI tokens and factories\r\nexport {\r\n WIDGET_EVENT_MANAGER_FACTORY,\r\n SSR_WIDGET_RENDERER,\r\n ANGULAR_WIDGET_RENDERER,\r\n widgetEventManagerFactoryProvider,\r\n ssrWidgetRendererFactory,\r\n angularWidgetRendererFactory,\r\n} from './widget-di.tokens';\r\n\r\nexport type { WidgetEventManagerFactory } from './widget-di.tokens';\r\n\r\n// Export custom widget renderer types\r\nexport type {\r\n CustomWidgetComponent,\r\n CustomWidgetRenderer,\r\n CustomWidgetHtmlRenderer,\r\n CustomWidgetRendererConfig,\r\n WidgetTemplateContext,\r\n} from './custom-widget-renderer.types';\r\n\r\nexport {\r\n isHtmlRenderer,\r\n isComponentRenderer,\r\n isTemplateRenderer,\r\n} from './custom-widget-renderer.types';\r\n\r\n// Export Angular renderer and built-in components\r\nexport {\r\n AngularWidgetRenderer,\r\n ButtonWidgetComponent,\r\n CardWidgetComponent,\r\n InputWidgetComponent,\r\n TextAreaWidgetComponent,\r\n DropdownWidgetComponent,\r\n SliderWidgetComponent,\r\n ToggleWidgetComponent,\r\n FileUploadWidgetComponent,\r\n ThemeSwitcherWidgetComponent,\r\n DatePickerWidgetComponent,\r\n MultiSelectWidgetComponent,\r\n ProgressBarWidgetComponent,\r\n FormWidgetComponent,\r\n ImageWidgetComponent,\r\n ImageCollectionWidgetComponent,\r\n} from './renderers';\r\n\r\nexport type {\r\n AngularRendererOptions,\r\n} from './renderers';\r\n\r\nexport { BUILT_IN_WIDGET_COMPONENTS } from './renderers/built-in-components';\r\n\r\n// Re-export commonly used types and classes from core package\r\nexport {\r\n ChatWidget,\r\n} from '@bbq-chat/widgets';\r\n\r\nexport type {\r\n ButtonWidget,\r\n CardWidget,\r\n FormWidget,\r\n InputWidget,\r\n TextAreaWidget,\r\n DropdownWidget,\r\n SliderWidget,\r\n ToggleWidget,\r\n FileUploadWidget,\r\n DatePickerWidget,\r\n MultiSelectWidget,\r\n ProgressBarWidget,\r\n ThemeSwitcherWidget,\r\n ImageWidget,\r\n ImageCollectionWidget,\r\n} from '@bbq-chat/widgets';\r\n\r\n// Re-export utilities\r\nexport {\r\n SsrWidgetRenderer,\r\n WidgetEventManager,\r\n customWidgetRegistry,\r\n} from '@bbq-chat/widgets';\r\n\r\n// Version\r\nexport const VERSION = '1.0.8';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i1","i1.WidgetRegistryService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../src/custom-widget-renderer.types.ts","../../src/renderers/AngularWidgetRenderer.ts","../../src/components/button.component.ts","../../src/components/card.component.ts","../../src/components/input.component.ts","../../src/components/textarea.component.ts","../../src/components/dropdown.component.ts","../../src/components/slider.component.ts","../../src/components/toggle.component.ts","../../src/components/fileupload.component.ts","../../src/components/themeswitcher.component.ts","../../src/components/datepicker.component.ts","../../src/components/multiselect.component.ts","../../src/components/progressbar.component.ts","../../src/services/form-validation.service.ts","../../src/components/form.component.ts","../../src/components/image.component.ts","../../src/components/imagecollection.component.ts","../../src/components/index.ts","../../src/renderers/built-in-components.ts","../../src/widget-di.tokens.ts","../../src/widget-registry.service.ts","../../src/widget-renderer.component.ts","../../src/renderers/index.ts","../../src/examples/form-validation-listener.component.ts","../../src/public_api.ts","../../src/index.ts"],"sourcesContent":["import { Type, TemplateRef } from '@angular/core';\r\nimport { ChatWidget } from '@bbq-chat/widgets';\r\n\r\n/**\r\n * Context provided to template-based custom widget renderers\r\n */\r\nexport interface WidgetTemplateContext {\r\n /**\r\n * The widget instance being rendered\r\n */\r\n $implicit: ChatWidget;\r\n \r\n /**\r\n * The widget instance (alternative access)\r\n */\r\n widget: ChatWidget;\r\n \r\n /**\r\n * Emit a widget action\r\n */\r\n emitAction: (actionName: string, payload: unknown) => void;\r\n}\r\n\r\n/**\r\n * Interface for component-based custom widget renderers\r\n */\r\nexport interface CustomWidgetComponent {\r\n /**\r\n * The widget instance to render\r\n */\r\n widget: ChatWidget;\r\n \r\n /**\r\n * Event emitter for widget actions (optional, will be set by the renderer)\r\n */\r\n widgetAction?: (actionName: string, payload: unknown) => void;\r\n}\r\n\r\n/**\r\n * Type for custom widget renderer functions that return HTML strings\r\n */\r\nexport type CustomWidgetHtmlRenderer = (widget: ChatWidget) => string;\r\n\r\n/**\r\n * Type for custom widget renderer configurations\r\n */\r\nexport type CustomWidgetRenderer =\r\n | CustomWidgetHtmlRenderer\r\n | Type<CustomWidgetComponent>\r\n | TemplateRef<WidgetTemplateContext>;\r\n\r\n/**\r\n * Configuration for registering a custom widget renderer\r\n */\r\nexport interface CustomWidgetRendererConfig {\r\n /**\r\n * The widget type identifier\r\n */\r\n type: string;\r\n \r\n /**\r\n * The renderer: can be a function returning HTML, an Angular Component class, or a TemplateRef\r\n */\r\n renderer: CustomWidgetRenderer;\r\n}\r\n\r\n/**\r\n * Type guard to check if a renderer is a TemplateRef\r\n */\r\nexport function isTemplateRenderer(\r\n renderer: CustomWidgetRenderer\r\n): renderer is TemplateRef<WidgetTemplateContext> {\r\n return (\r\n renderer !== null &&\r\n typeof renderer === 'object' &&\r\n 'createEmbeddedView' in renderer\r\n );\r\n}\r\n\r\n/**\r\n * Type guard to check if a renderer is an Angular Component\r\n * \r\n * Note: This uses a heuristic check based on the following assumptions:\r\n * 1. Components are constructor functions\r\n * 2. Components have a prototype with a constructor property\r\n * 3. Components typically use dependency injection (no required constructor params)\r\n * \r\n * Limitation: This may not detect components with required constructor parameters.\r\n * For edge cases, explicitly check your component's constructor signature.\r\n * \r\n * Alternative: You can always register a wrapper component that has no required params.\r\n */\r\nexport function isComponentRenderer(\r\n renderer: CustomWidgetRenderer\r\n): renderer is Type<CustomWidgetComponent> {\r\n // Check if it's a function (constructor) but not a regular function renderer\r\n if (typeof renderer !== 'function') {\r\n return false;\r\n }\r\n \r\n // Check for Angular component characteristics\r\n // Components typically have prototype with constructor property\r\n return (\r\n renderer.prototype !== undefined &&\r\n renderer.prototype.constructor === renderer &&\r\n renderer.length === 0 // Constructor with no required params (Angular DI)\r\n );\r\n}\r\n\r\n/**\r\n * Type guard to check if a renderer is an HTML function\r\n * \r\n * Note: This should be checked AFTER checking for component and template renderers\r\n * since components are also functions but with additional properties.\r\n */\r\nexport function isHtmlRenderer(\r\n renderer: CustomWidgetRenderer\r\n): renderer is CustomWidgetHtmlRenderer {\r\n return typeof renderer === 'function';\r\n}\r\n","import { Type } from '@angular/core';\r\nimport { IWidgetRenderer } from '@bbq-chat/widgets';\r\nimport type { ChatWidget } from '@bbq-chat/widgets';\r\nimport { CustomWidgetComponent } from '../custom-widget-renderer.types';\r\n\r\n/**\r\n * Options for configuring the Angular widget renderer\r\n */\r\nexport interface AngularRendererOptions {\r\n /**\r\n * Per-widget-type component overrides. Key is widget.type.\r\n */\r\n components?: Partial<Record<string, Type<CustomWidgetComponent>>>;\r\n}\r\n\r\n/**\r\n * Angular widget renderer\r\n * Returns Angular component types for dynamic rendering\r\n * Provides feature parity with SsrWidgetRenderer but uses Angular components\r\n */\r\nexport class AngularWidgetRenderer implements IWidgetRenderer {\r\n readonly framework = 'Angular';\r\n private overrides: AngularRendererOptions['components'] | undefined;\r\n private componentRegistry: Map<string, Type<CustomWidgetComponent>> = new Map();\r\n\r\n constructor(options?: AngularRendererOptions) {\r\n this.overrides = options?.components;\r\n }\r\n\r\n /**\r\n * Register all built-in widget components\r\n * Must be called after components are imported to avoid circular dependencies\r\n */\r\n registerBuiltInComponents(components: Record<string, Type<CustomWidgetComponent>>) {\r\n for (const [type, component] of Object.entries(components)) {\r\n this.componentRegistry.set(type, component);\r\n }\r\n }\r\n\r\n /**\r\n * Register or override a widget component\r\n * Use this to replace built-in components or add custom ones\r\n * \r\n * @example\r\n * ```typescript\r\n * renderer.registerComponent('button', MyCustomButtonComponent);\r\n * ```\r\n */\r\n registerComponent(type: string, component: Type<CustomWidgetComponent>) {\r\n this.componentRegistry.set(type, component);\r\n }\r\n\r\n /**\r\n * Register multiple widget components at once\r\n * \r\n * @example\r\n * ```typescript\r\n * renderer.registerComponents({\r\n * button: MyButtonComponent,\r\n * card: MyCardComponent\r\n * });\r\n * ```\r\n */\r\n registerComponents(components: Record<string, Type<CustomWidgetComponent>>) {\r\n for (const [type, component] of Object.entries(components)) {\r\n this.componentRegistry.set(type, component);\r\n }\r\n }\r\n\r\n /**\r\n * Get the Angular component type for a given widget\r\n * Returns the component class that should be dynamically instantiated\r\n */\r\n getComponentType(widget: ChatWidget): Type<CustomWidgetComponent> | null {\r\n const type = widget.type;\r\n\r\n // Check for custom override first\r\n if (this.overrides && this.overrides[type]) {\r\n return this.overrides[type] as Type<CustomWidgetComponent>;\r\n }\r\n\r\n // Check built-in registry\r\n if (this.componentRegistry.has(type)) {\r\n return this.componentRegistry.get(type)!;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Legacy method for IWidgetRenderer interface compatibility\r\n * Not used in Angular rendering but required by interface\r\n * @deprecated Use getComponentType() instead for Angular rendering\r\n */\r\n renderWidget(widget: ChatWidget): string {\r\n // This method is not used in Angular rendering\r\n // It's only here for interface compatibility\r\n return `<!-- Angular component rendering for ${widget.type} -->`;\r\n }\r\n}\r\n","import { Component, Input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport type { ButtonWidget } from '@bbq-chat/widgets';\r\nimport { CustomWidgetComponent } from '../custom-widget-renderer.types';\r\n\r\n@Component({\r\n selector: 'bbq-button-widget',\r\n standalone: true,\r\n imports: [CommonModule],\r\n template: `\r\n <button \r\n class=\"bbq-widget bbq-button\" \r\n [attr.data-widget-type]=\"'button'\"\r\n [attr.data-action]=\"buttonWidget.action\"\r\n type=\"button\"\r\n (click)=\"onClick()\">\r\n {{ buttonWidget.label }}\r\n </button>\r\n `,\r\n styles: []\r\n})\r\nexport class ButtonWidgetComponent implements CustomWidgetComponent {\r\n @Input() widget!: any;\r\n widgetAction?: (actionName: string, payload: unknown) => void;\r\n\r\n get buttonWidget(): ButtonWidget {\r\n return this.widget as ButtonWidget;\r\n }\r\n\r\n onClick() {\r\n if (this.widgetAction) {\r\n this.widgetAction(this.buttonWidget.action, {});\r\n }\r\n }\r\n}\r\n","import { Component, Input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport type { CardWidget } from '@bbq-chat/widgets';\r\nimport { CustomWidgetComponent } from '../custom-widget-renderer.types';\r\n\r\n@Component({\r\n selector: 'bbq-card-widget',\r\n standalone: true,\r\n imports: [CommonModule],\r\n template: `\r\n <div \r\n class=\"bbq-widget bbq-card\" \r\n [attr.data-widget-type]=\"'card'\"\r\n [attr.data-action]=\"cardWidget.action\"\r\n role=\"article\">\r\n <h3 class=\"bbq-card-title\">{{ cardWidget.title }}</h3>\r\n @if (cardWidget.description) {\r\n <p class=\"bbq-card-description\">{{ cardWidget.description }}</p>\r\n }\r\n @if (cardWidget.imageUrl) {\r\n <img \r\n class=\"bbq-card-image\" \r\n [src]=\"cardWidget.imageUrl\" \r\n [alt]=\"cardWidget.title\"\r\n loading=\"lazy\"\r\n style=\"display:block;max-width:100%;height:auto;object-fit:cover;max-height:200px;border-radius:6px;margin-bottom:12px;\" />\r\n }\r\n <button \r\n class=\"bbq-card-action bbq-button\" \r\n [attr.data-action]=\"cardWidget.action\"\r\n type=\"button\"\r\n (click)=\"onClick()\">\r\n {{ cardWidget.label }}\r\n </button>\r\n </div>\r\n `,\r\n styles: []\r\n})\r\nexport class CardWidgetComponent implements CustomWidgetComponent {\r\n @Input() widget!: any;\r\n widgetAction?: (actionName: string, payload: unknown) => void;\r\n\r\n get cardWidget(): CardWidget {\r\n return this.widget as CardWidget;\r\n }\r\n\r\n onClick() {\r\n if (this.widgetAction) {\r\n this.widgetAction(this.cardWidget.action, {});\r\n }\r\n }\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport type { InputWidget } from '@bbq-chat/widgets';\r\nimport { CustomWidgetComponent } from '../custom-widget-renderer.types';\r\n\r\n@Component({\r\n selector: 'bbq-input-widget',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n template: `\r\n <div \r\n class=\"bbq-widget bbq-input\" \r\n [attr.data-widget-type]=\"'input'\">\r\n <label *ngIf=\"showLabel\" class=\"bbq-input-label\" [attr.for]=\"inputId\">\r\n {{ inputWidget.label }}\r\n </label>\r\n <input \r\n type=\"text\" \r\n [id]=\"inputId\"\r\n [ngClass]=\"inputClasses\"\r\n [attr.data-action]=\"inputWidget.action\"\r\n [placeholder]=\"inputWidget.placeholder || ''\"\r\n [maxLength]=\"inputWidget.maxLength || 0\"\r\n [(ngModel)]=\"value\" />\r\n </div>\r\n `,\r\n styles: []\r\n})\r\nexport class InputWidgetComponent implements CustomWidgetComponent, OnInit {\r\n @Input() widget!: any;\r\n widgetAction?: (actionName: string, payload: unknown) => void;\r\n \r\n value = '';\r\n inputId = '';\r\n\r\n get inputWidget(): InputWidget {\r\n return this.widget as InputWidget;\r\n }\r\n\r\n get showLabel(): boolean {\r\n const widget = this.inputWidget as any;\r\n if (widget.hideLabel === true) {\r\n return false;\r\n }\r\n if (widget.showLabel === false) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n get inputClasses(): string[] {\r\n return this.isFormAppearance ? ['bbq-form-input'] : ['bbq-input'];\r\n }\r\n\r\n private get isFormAppearance(): boolean {\r\n return (this.inputWidget as any).appearance === 'form';\r\n }\r\n\r\n ngOnInit() {\r\n this.inputId = `bbq-${this.inputWidget.action.replace(/\\s+/g, '-').toLowerCase()}-input`;\r\n }\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport type { TextAreaWidget } from '@bbq-chat/widgets';\r\nimport { CustomWidgetComponent } from '../custom-widget-renderer.types';\r\n\r\n@Component({\r\n selector: 'bbq-textarea-widget',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n template: `\r\n <div \r\n class=\"bbq-widget bbq-textarea\" \r\n [attr.data-widget-type]=\"'textarea'\">\r\n <label *ngIf=\"showLabel\" class=\"bbq-textarea-label\" [attr.for]=\"textareaId\">\r\n {{ textareaWidget.label }}\r\n </label>\r\n <textarea \r\n [id]=\"textareaId\"\r\n [ngClass]=\"textareaClasses\"\r\n [attr.data-action]=\"textareaWidget.action\"\r\n [placeholder]=\"textareaWidget.placeholder || ''\"\r\n [maxLength]=\"textareaWidget.maxLength || 0\"\r\n [rows]=\"textareaWidget.rows || 4\"\r\n [(ngModel)]=\"value\"></textarea>\r\n </div>\r\n `,\r\n styles: []\r\n})\r\nexport class TextAreaWidgetComponent implements CustomWidgetComponent, OnInit {\r\n @Input() widget!: any;\r\n widgetAction?: (actionName: string, payload: unknown) => void;\r\n \r\n value = '';\r\n textareaId = '';\r\n\r\n get textareaWidget(): TextAreaWidget {\r\n return this.widget as TextAreaWidget;\r\n }\r\n\r\n get showLabel(): boolean {\r\n const widget = this.textareaWidget as any;\r\n if (widget.hideLabel === true) {\r\n return false;\r\n }\r\n if (widget.showLabel === false) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n get textareaClasses(): string[] {\r\n return this.isFormAppearance ? ['bbq-form-textarea'] : ['bbq-form-textarea', 'bbq-input'];\r\n }\r\n\r\n private get isFormAppearance(): boolean {\r\n return (this.textareaWidget as any).appearance === 'form';\r\n }\r\n\r\n ngOnInit() {\r\n this.textareaId = `bbq-${this.textareaWidget.action.replace(/\\s+/g, '-').toLowerCase()}-textarea`;\r\n }\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport type { DropdownWidget } from '@bbq-chat/widgets';\r\nimport { CustomWidgetComponent } from '../custom-widget-renderer.types';\r\n\r\n@Component({\r\n selector: 'bbq-dropdown-widget',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n template: `\r\n <div \r\n class=\"bbq-widget bbq-dropdown\" \r\n [attr.data-widget-type]=\"'dropdown'\">\r\n <label *ngIf=\"showLabel\" class=\"bbq-dropdown-label\" [attr.for]=\"selectId\">\r\n {{ dropdownWidget.label }}\r\n </label>\r\n <select \r\n [id]=\"selectId\"\r\n [ngClass]=\"selectClasses\"\r\n [attr.data-action]=\"dropdownWidget.action\"\r\n [(ngModel)]=\"value\">\r\n @for (option of dropdownWidget.options; track option) {\r\n <option [value]=\"option\">{{ option }}</option>\r\n }\r\n </select>\r\n </div>\r\n `,\r\n styles: []\r\n})\r\nexport class DropdownWidgetComponent implements CustomWidgetComponent, OnInit {\r\n @Input() widget!: any;\r\n widgetAction?: (actionName: string, payload: unknown) => void;\r\n \r\n value = '';\r\n selectId = '';\r\n\r\n get dropdownWidget(): DropdownWidget {\r\n return this.widget as DropdownWidget;\r\n }\r\n\r\n get showLabel(): boolean {\r\n const widget = this.dropdownWidget as any;\r\n if (widget.hideLabel === true) {\r\n return false;\r\n }\r\n if (widget.showLabel === false) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n get selectClasses(): string[] {\r\n return this.isFormAppearance ? ['bbq-form-select'] : ['bbq-dropdown'];\r\n }\r\n\r\n private get isFormAppearance(): boolean {\r\n return (this.dropdownWidget as any).appearance === 'form';\r\n }\r\n\r\n ngOnInit() {\r\n this.selectId = `bbq-${this.dropdownWidget.action.replace(/\\s+/g, '-').toLowerCase()}-select`;\r\n this.value = this.dropdownWidget.options[0] || '';\r\n }\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport type { SliderWidget } from '@bbq-chat/widgets';\r\nimport { CustomWidgetComponent } from '../custom-widget-renderer.types';\r\n\r\n@Component({\r\n selector: 'bbq-slider-widget',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n template: `\r\n <div \r\n class=\"bbq-widget bbq-slider\" \r\n [attr.data-widget-type]=\"'slider'\">\r\n <label *ngIf=\"showLabel\" class=\"bbq-slider-label\" [attr.for]=\"sliderId\">\r\n {{ sliderWidget.label }}\r\n </label>\r\n <input \r\n type=\"range\" \r\n [id]=\"sliderId\"\r\n [ngClass]=\"sliderClasses\"\r\n [min]=\"sliderWidget.min\"\r\n [max]=\"sliderWidget.max\"\r\n [step]=\"sliderWidget.step\"\r\n [attr.data-action]=\"sliderWidget.action\"\r\n [attr.aria-label]=\"sliderWidget.label\"\r\n [(ngModel)]=\"value\" />\r\n <span class=\"bbq-slider-value\" aria-live=\"polite\">{{ value }}</span>\r\n </div>\r\n `,\r\n styles: []\r\n})\r\nexport class SliderWidgetComponent implements CustomWidgetComponent, OnInit {\r\n @Input() widget!: any;\r\n widgetAction?: (actionName: string, payload: unknown) => void;\r\n \r\n value: number = 0;\r\n sliderId = '';\r\n\r\n get sliderWidget(): SliderWidget {\r\n return this.widget as SliderWidget;\r\n }\r\n\r\n get showLabel(): boolean {\r\n const widget = this.sliderWidget as any;\r\n if (widget.hideLabel === true) {\r\n return false;\r\n }\r\n if (widget.showLabel === false) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n get sliderClasses(): string[] {\r\n return this.isFormAppearance ? ['bbq-form-slider'] : ['bbq-slider'];\r\n }\r\n\r\n private get isFormAppearance(): boolean {\r\n return (this.sliderWidget as any).appearance === 'form';\r\n }\r\n\r\n ngOnInit() {\r\n this.sliderId = `bbq-${this.sliderWidget.action.replace(/\\s+/g, '-').toLowerCase()}-slider`;\r\n this.value = this.sliderWidget.defaultValue ?? this.sliderWidget.min;\r\n }\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport type { ToggleWidget } from '@bbq-chat/widgets';\r\nimport { CustomWidgetComponent } from '../custom-widget-renderer.types';\r\n\r\n@Component({\r\n selector: 'bbq-toggle-widget',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n template: `\r\n <div \r\n class=\"bbq-widget bbq-toggle\" \r\n [attr.data-widget-type]=\"'toggle'\">\r\n <label class=\"bbq-toggle-label\" [attr.for]=\"checkboxId\">\r\n <input \r\n type=\"checkbox\" \r\n [id]=\"checkboxId\"\r\n [ngClass]=\"checkboxClasses\"\r\n [attr.data-action]=\"toggleWidget.action\"\r\n [attr.aria-label]=\"toggleWidget.label\"\r\n [(ngModel)]=\"checked\" />\r\n <span *ngIf=\"showLabel\" class=\"bbq-toggle-text\">{{ toggleWidget.label }}</span>\r\n </label>\r\n </div>\r\n `,\r\n styles: []\r\n})\r\nexport class ToggleWidgetComponent implements CustomWidgetComponent, OnInit {\r\n @Input() widget!: any;\r\n widgetAction?: (actionName: string, payload: unknown) => void;\r\n \r\n checked = false;\r\n checkboxId = '';\r\n\r\n get toggleWidget(): ToggleWidget {\r\n return this.widget as ToggleWidget;\r\n }\r\n\r\n get showLabel(): boolean {\r\n const widget = this.toggleWidget as any;\r\n if (widget.hideLabel === true) {\r\n return false;\r\n }\r\n if (widget.showLabel === false) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n get checkboxClasses(): string[] {\r\n return this.isFormAppearance ? ['bbq-toggle-input', 'bbq-form-toggle'] : ['bbq-toggle-input'];\r\n }\r\n\r\n private get isFormAppearance(): boolean {\r\n return (this.toggleWidget as any).appearance === 'form';\r\n }\r\n\r\n ngOnInit() {\r\n this.checkboxId = `bbq-${this.toggleWidget.action.replace(/\\s+/g, '-').toLowerCase()}-checkbox`;\r\n this.checked = this.toggleWidget.defaultValue ?? false;\r\n }\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport type { FileUploadWidget } from '@bbq-chat/widgets';\r\nimport { CustomWidgetComponent } from '../custom-widget-renderer.types';\r\n\r\n@Component({\r\n selector: 'bbq-fileupload-widget',\r\n standalone: true,\r\n imports: [CommonModule],\r\n template: `\r\n <div \r\n class=\"bbq-widget bbq-file-upload\" \r\n [attr.data-widget-type]=\"'fileupload'\">\r\n <label *ngIf=\"showLabel\" class=\"bbq-file-label\" [attr.for]=\"inputId\">\r\n {{ fileUploadWidget.label }}\r\n </label>\r\n <input \r\n type=\"file\" \r\n [id]=\"inputId\"\r\n [ngClass]=\"inputClasses\"\r\n [attr.data-action]=\"fileUploadWidget.action\"\r\n [accept]=\"fileUploadWidget.accept || ''\"\r\n [attr.data-max-bytes]=\"fileUploadWidget.maxBytes\"\r\n (change)=\"onFileChange($event)\" />\r\n </div>\r\n `,\r\n styles: []\r\n})\r\nexport class FileUploadWidgetComponent implements CustomWidgetComponent, OnInit {\r\n @Input() widget!: any;\r\n widgetAction?: (actionName: string, payload: unknown) => void;\r\n \r\n inputId = '';\r\n\r\n get fileUploadWidget(): FileUploadWidget {\r\n return this.widget as FileUploadWidget;\r\n }\r\n\r\n get showLabel(): boolean {\r\n const widget = this.fileUploadWidget as any;\r\n if (widget.hideLabel === true) {\r\n return false;\r\n }\r\n if (widget.showLabel === false) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n get inputClasses(): string[] {\r\n return this.isFormAppearance ? ['bbq-form-fileupload'] : ['bbq-file'];\r\n }\r\n\r\n private get isFormAppearance(): boolean {\r\n return (this.fileUploadWidget as any).appearance === 'form';\r\n }\r\n\r\n ngOnInit() {\r\n this.inputId = `bbq-${this.fileUploadWidget.action.replace(/\\s+/g, '-').toLowerCase()}-file`;\r\n }\r\n\r\n onFileChange(event: Event) {\r\n const target = event.target as HTMLInputElement;\r\n if (target.files && target.files.length > 0) {\r\n const file = target.files[0];\r\n if (this.widgetAction) {\r\n this.widgetAction(this.fileUploadWidget.action, { file });\r\n }\r\n }\r\n }\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport type { ThemeSwitcherWidget } from '@bbq-chat/widgets';\r\nimport { CustomWidgetComponent } from '../custom-widget-renderer.types';\r\n\r\n@Component({\r\n selector: 'bbq-themeswitcher-widget',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n template: `\r\n <div \r\n class=\"bbq-widget bbq-theme-switcher\" \r\n [attr.data-widget-type]=\"'themeswitcher'\">\r\n <label class=\"bbq-theme-switcher-label\" [attr.for]=\"selectId\">\r\n {{ themeSwitcherWidget.label }}\r\n </label>\r\n <select \r\n [id]=\"selectId\"\r\n class=\"bbq-theme-switcher-select\" \r\n [attr.data-action]=\"themeSwitcherWidget.action\"\r\n [(ngModel)]=\"value\">\r\n @for (theme of themeSwitcherWidget.themes; track theme) {\r\n <option [value]=\"theme\">{{ theme }}</option>\r\n }\r\n </select>\r\n </div>\r\n `,\r\n styles: []\r\n})\r\nexport class ThemeSwitcherWidgetComponent implements CustomWidgetComponent, OnInit {\r\n @Input() widget!: any;\r\n widgetAction?: (actionName: string, payload: unknown) => void;\r\n \r\n value = '';\r\n selectId = '';\r\n\r\n get themeSwitcherWidget(): ThemeSwitcherWidget {\r\n return this.widget as ThemeSwitcherWidget;\r\n }\r\n\r\n ngOnInit() {\r\n this.selectId = `bbq-${this.themeSwitcherWidget.action.replace(/\\s+/g, '-').toLowerCase()}-select`;\r\n this.value = this.themeSwitcherWidget.themes[0] || '';\r\n }\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport type { DatePickerWidget } from '@bbq-chat/widgets';\r\nimport { CustomWidgetComponent } from '../custom-widget-renderer.types';\r\n\r\n@Component({\r\n selector: 'bbq-datepicker-widget',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n template: `\r\n <div \r\n class=\"bbq-widget bbq-date-picker\" \r\n [attr.data-widget-type]=\"'datepicker'\">\r\n <label *ngIf=\"showLabel\" class=\"bbq-date-picker-label\" [attr.for]=\"inputId\">\r\n {{ datePickerWidget.label }}\r\n </label>\r\n <input \r\n type=\"date\" \r\n [id]=\"inputId\"\r\n [ngClass]=\"inputClasses\"\r\n [attr.data-action]=\"datePickerWidget.action\"\r\n [min]=\"datePickerWidget.minDate || ''\"\r\n [max]=\"datePickerWidget.maxDate || ''\"\r\n [(ngModel)]=\"value\" />\r\n </div>\r\n `,\r\n styles: []\r\n})\r\nexport class DatePickerWidgetComponent implements CustomWidgetComponent, OnInit {\r\n @Input() widget!: any;\r\n widgetAction?: (actionName: string, payload: unknown) => void;\r\n \r\n value = '';\r\n inputId = '';\r\n\r\n get datePickerWidget(): DatePickerWidget {\r\n return this.widget as DatePickerWidget;\r\n }\r\n\r\n get showLabel(): boolean {\r\n const widget = this.datePickerWidget as any;\r\n if (widget.hideLabel === true) {\r\n return false;\r\n }\r\n if (widget.showLabel === false) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n get inputClasses(): string[] {\r\n return this.isFormAppearance ? ['bbq-form-datepicker'] : ['bbq-form-datepicker', 'bbq-input'];\r\n }\r\n\r\n private get isFormAppearance(): boolean {\r\n return (this.datePickerWidget as any).appearance === 'form';\r\n }\r\n\r\n ngOnInit() {\r\n this.inputId = `bbq-${this.datePickerWidget.action.replace(/\\s+/g, '-').toLowerCase()}-date`;\r\n }\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport type { MultiSelectWidget } from '@bbq-chat/widgets';\r\nimport { CustomWidgetComponent } from '../custom-widget-renderer.types';\r\n\r\n@Component({\r\n selector: 'bbq-multiselect-widget',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n template: `\r\n <div \r\n class=\"bbq-widget bbq-multi-select\" \r\n [attr.data-widget-type]=\"'multiselect'\">\r\n <label *ngIf=\"showLabel\" class=\"bbq-multi-select-label\" [attr.for]=\"selectId\">\r\n {{ multiSelectWidget.label }}\r\n </label>\r\n <select \r\n [id]=\"selectId\"\r\n [ngClass]=\"selectClasses\"\r\n [attr.data-action]=\"multiSelectWidget.action\"\r\n multiple\r\n [(ngModel)]=\"values\">\r\n @for (option of multiSelectWidget.options; track option) {\r\n <option [value]=\"option\">{{ option }}</option>\r\n }\r\n </select>\r\n </div>\r\n `,\r\n styles: []\r\n})\r\nexport class MultiSelectWidgetComponent implements CustomWidgetComponent, OnInit {\r\n @Input() widget!: any;\r\n widgetAction?: (actionName: string, payload: unknown) => void;\r\n \r\n values: string[] = [];\r\n selectId = '';\r\n\r\n get multiSelectWidget(): MultiSelectWidget {\r\n return this.widget as MultiSelectWidget;\r\n }\r\n\r\n get showLabel(): boolean {\r\n const widget = this.multiSelectWidget as any;\r\n if (widget.hideLabel === true) {\r\n return false;\r\n }\r\n if (widget.showLabel === false) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n get selectClasses(): string[] {\r\n return this.isFormAppearance \r\n ? ['bbq-form-multiselect', 'bbq-form-select']\r\n : ['bbq-form-multiselect', 'bbq-form-select'];\r\n }\r\n\r\n private get isFormAppearance(): boolean {\r\n return (this.multiSelectWidget as any).appearance === 'form';\r\n }\r\n\r\n ngOnInit() {\r\n this.selectId = `bbq-${this.multiSelectWidget.action.replace(/\\s+/g, '-').toLowerCase()}-select`;\r\n }\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport type { ProgressBarWidget } from '@bbq-chat/widgets';\r\nimport { CustomWidgetComponent } from '../custom-widget-renderer.types';\r\n\r\n@Component({\r\n selector: 'bbq-progressbar-widget',\r\n standalone: true,\r\n imports: [CommonModule],\r\n template: `\r\n <div \r\n class=\"bbq-widget bbq-progress-bar\" \r\n [attr.data-widget-type]=\"'progressbar'\">\r\n <label class=\"bbq-progress-bar-label\" [attr.for]=\"progressId\">\r\n {{ progressBarWidget.label }}\r\n </label>\r\n <progress \r\n [id]=\"progressId\"\r\n class=\"bbq-progress-bar-element\" \r\n [value]=\"progressBarWidget.value\"\r\n [max]=\"progressBarWidget.max\"\r\n [attr.data-action]=\"progressBarWidget.action\"\r\n [attr.aria-label]=\"progressBarWidget.label\"\r\n [attr.aria-valuenow]=\"progressBarWidget.value\"\r\n [attr.aria-valuemin]=\"0\"\r\n [attr.aria-valuemax]=\"progressBarWidget.max\">\r\n {{ percentage }}%\r\n </progress>\r\n <span class=\"bbq-progress-bar-value\" aria-live=\"polite\">{{ percentage }}%</span>\r\n </div>\r\n `,\r\n styles: []\r\n})\r\nexport class ProgressBarWidgetComponent implements CustomWidgetComponent, OnInit {\r\n @Input() widget!: any;\r\n widgetAction?: (actionName: string, payload: unknown) => void;\r\n \r\n progressId = '';\r\n percentage = 0;\r\n\r\n get progressBarWidget(): ProgressBarWidget {\r\n return this.widget as ProgressBarWidget;\r\n }\r\n\r\n ngOnInit() {\r\n this.progressId = `bbq-${this.progressBarWidget.action.replace(/\\s+/g, '-').toLowerCase()}-progress`;\r\n const max = this.progressBarWidget.max;\r\n this.percentage = max > 0 ? Math.floor((this.progressBarWidget.value * 100) / max) : 0;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable, Subject } from 'rxjs';\r\n\r\nexport interface FormValidationEvent {\r\n formId: string;\r\n valid: boolean;\r\n errors: Array<{ field: string; reason?: string }>;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class FormValidationService {\r\n private subject = new Subject<FormValidationEvent>();\r\n\r\n get validation$(): Observable<FormValidationEvent> {\r\n return this.subject.asObservable();\r\n }\r\n\r\n emit(event: FormValidationEvent) {\r\n try { this.subject.next(event); } catch { }\r\n }\r\n}\r\n","import { Component, Input, Output, EventEmitter, OnInit, AfterViewInit, ViewChildren, QueryList, ViewContainerRef, ComponentRef, Injector, EnvironmentInjector, createComponent, Type, OnDestroy, ElementRef } from '@angular/core';\r\nimport { FormValidationService } from '../services/form-validation.service';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport type { FormWidget, ChatWidget } from '@bbq-chat/widgets';\r\nimport { CustomWidgetComponent } from '../custom-widget-renderer.types';\r\nimport { InputWidgetComponent } from './input.component';\r\nimport { TextAreaWidgetComponent } from './textarea.component';\r\nimport { DropdownWidgetComponent } from './dropdown.component';\r\nimport { SliderWidgetComponent } from './slider.component';\r\nimport { ToggleWidgetComponent } from './toggle.component';\r\nimport { DatePickerWidgetComponent } from './datepicker.component';\r\nimport { MultiSelectWidgetComponent } from './multiselect.component';\r\nimport { FileUploadWidgetComponent } from './fileupload.component';\r\n\r\n/**\r\n * Helper class to wrap form fields as widgets for dynamic rendering\r\n */\r\nclass FormFieldWidget implements ChatWidget {\r\n readonly type: string;\r\n readonly label: string;\r\n readonly action: string;\r\n readonly appearance = 'form';\r\n readonly hideLabel = true;\r\n\r\n constructor(\r\n public field: any,\r\n public formId: string\r\n ) {\r\n this.type = this.mapFieldTypeToWidgetType(field.type);\r\n this.label = field.label;\r\n this.action = `${formId}_${field.name}`;\r\n }\r\n\r\n private mapFieldTypeToWidgetType(fieldType: string): string {\r\n const typeMap: Record<string, string> = {\r\n 'input': 'input',\r\n 'text': 'input',\r\n 'email': 'input',\r\n 'number': 'input',\r\n 'password': 'input',\r\n 'textarea': 'textarea',\r\n 'dropdown': 'dropdown',\r\n 'select': 'dropdown',\r\n 'slider': 'slider',\r\n 'toggle': 'toggle',\r\n 'datepicker': 'datepicker',\r\n 'multiselect': 'multiselect',\r\n 'fileupload': 'fileupload'\r\n };\r\n return typeMap[fieldType] || 'input';\r\n }\r\n\r\n // Map field properties to widget properties\r\n get placeholder(): string | undefined {\r\n return this.field.placeholder ?? undefined;\r\n }\r\n\r\n get maxLength(): number | undefined {\r\n return this.field['maxLength'];\r\n }\r\n\r\n get rows(): number | undefined {\r\n return this.field['rows'];\r\n }\r\n\r\n get options(): string[] {\r\n return this.field['options'] || [];\r\n }\r\n\r\n get min(): number {\r\n return this.field['min'] ?? 0;\r\n }\r\n\r\n get max(): number {\r\n return this.field['max'] ?? 100;\r\n }\r\n\r\n get step(): number {\r\n return this.field['step'] ?? 1;\r\n }\r\n\r\n get defaultValue(): any {\r\n return this.field['defaultValue'] ?? (this.type === 'slider' ? this.min : undefined);\r\n }\r\n\r\n get minDate(): string | undefined {\r\n return this.field['minDate'];\r\n }\r\n\r\n get maxDate(): string | undefined {\r\n return this.field['maxDate'];\r\n }\r\n\r\n get accept(): string | undefined {\r\n return this.field['accept'];\r\n }\r\n\r\n get maxBytes(): number | undefined {\r\n return this.field['maxBytes'];\r\n }\r\n\r\n // ChatWidget interface methods\r\n toJson(): string {\r\n return JSON.stringify(this.toObject());\r\n }\r\n\r\n toObject(): any {\r\n return {\r\n type: this.type,\r\n label: this.label,\r\n action: this.action,\r\n ...this.field\r\n };\r\n }\r\n}\r\n\r\n@Component({\r\n selector: 'bbq-form-widget',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n template: `\r\n <div \r\n class=\"bbq-widget bbq-form\" \r\n [class.bbq-form-submitted]=\"isSubmitted\"\r\n [attr.aria-disabled]=\"isSubmitted ? 'true' : null\"\r\n [attr.data-widget-id]=\"formId\"\r\n [attr.data-widget-type]=\"'form'\"\r\n [attr.data-action]=\"formWidget.action\">\r\n <fieldset class=\"bbq-form-fieldset\">\r\n <legend class=\"bbq-form-title\">{{ formWidget.title }}</legend>\r\n\r\n @for (field of formWidget.fields; track field.name) {\r\n <div \r\n class=\"bbq-form-field\"\r\n [class.bbq-form-field-required]=\"field.required\"\r\n [attr.data-required]=\"field.required ? 'true' : null\">\r\n <label class=\"bbq-form-field-label\" [attr.for]=\"getFieldId(field.name)\">\r\n {{ field.label }}\r\n @if (field.required) {\r\n <span class=\"bbq-form-required\">*</span>\r\n }\r\n </label>\r\n\r\n <div #fieldContainer class=\"bbq-form-field-widget\"></div>\r\n\r\n @if (getFieldProp(field, 'validationHint')) {\r\n <span class=\"bbq-form-field-hint\">{{ getFieldProp(field, 'validationHint') }}</span>\r\n }\r\n </div>\r\n }\r\n\r\n <div class=\"bbq-form-validation-message\" [style.display]=\"showValidationMessage ? 'block' : 'none'\">\r\n Please fill in all required fields before submitting.\r\n </div>\r\n\r\n @if (formWidget.actions && formWidget.actions.length > 0) {\r\n <div class=\"bbq-form-actions\">\r\n @for (action of formWidget.actions; track action.label) {\r\n <button \r\n type=\"button\" \r\n class=\"bbq-form-button\"\r\n [class.bbq-form-submit]=\"action.type === 'submit'\"\r\n [class.bbq-form-cancel]=\"action.type !== 'submit'\"\r\n [attr.data-action]=\"formWidget.action\"\r\n [attr.data-action-type]=\"action.type\"\r\n [disabled]=\"isSubmitted\"\r\n (click)=\"onActionClick(action.type)\">\r\n {{ action.label }}\r\n </button>\r\n }\r\n </div>\r\n }\r\n </fieldset>\r\n </div>\r\n `,\r\n styles: [`\r\n .bbq-form-field-widget {\r\n display: contents;\r\n }\r\n .bbq-form-submitted {\r\n opacity: 0.7;\r\n }\r\n `]\r\n})\r\nexport class FormWidgetComponent implements CustomWidgetComponent, OnInit, AfterViewInit, OnDestroy {\r\n @Input() widget!: any;\r\n widgetAction?: (actionName: string, payload: unknown) => void;\r\n @Input() fieldComponentRegistryOverride?: Record<string, Type<CustomWidgetComponent>>;\r\n @Output() validationState = new EventEmitter<{ valid: boolean; errors: Array<{ field: string; reason?: string }> }>();\r\n \r\n @ViewChildren('fieldContainer', { read: ViewContainerRef }) \r\n fieldContainers!: QueryList<ViewContainerRef>;\r\n\r\n formId = '';\r\n formData: Record<string, any> = {};\r\n showValidationMessage = false;\r\n private componentRefs: ComponentRef<any>[] = [];\r\n\r\n // Component registry for field types (can be extended via `fieldComponentRegistryOverride`)\r\n private fieldComponentRegistry: Record<string, Type<CustomWidgetComponent>> = {\r\n 'input': InputWidgetComponent,\r\n 'text': InputWidgetComponent,\r\n 'email': InputWidgetComponent,\r\n 'number': InputWidgetComponent,\r\n 'password': InputWidgetComponent,\r\n 'textarea': TextAreaWidgetComponent,\r\n 'dropdown': DropdownWidgetComponent,\r\n 'select': DropdownWidgetComponent,\r\n 'slider': SliderWidgetComponent,\r\n 'toggle': ToggleWidgetComponent,\r\n 'datepicker': DatePickerWidgetComponent,\r\n 'multiselect': MultiSelectWidgetComponent,\r\n 'fileupload': FileUploadWidgetComponent,\r\n 'checkbox': ToggleWidgetComponent,\r\n 'radio': ToggleWidgetComponent,\r\n };\r\n\r\n // Whether the form has been submitted; when true, user interaction is disabled\r\n isSubmitted = false;\r\n\r\n get formWidget(): FormWidget {\r\n return this.widget as FormWidget;\r\n }\r\n\r\n constructor(\r\n private injector: Injector,\r\n private environmentInjector: EnvironmentInjector\r\n , private hostRef: ElementRef\r\n , private formValidationService: FormValidationService\r\n ) {}\r\n\r\n ngOnInit() {\r\n this.formId = `bbq-${this.formWidget.action.replace(/\\s+/g, '-').toLowerCase()}`;\r\n \r\n // Initialize form data with default values\r\n for (const field of this.formWidget.fields || []) {\r\n if (field.type === 'slider') {\r\n this.formData[field.name] = field['default'] ?? field['defaultValue'] ?? field['min'] ?? 0;\r\n } else if (field.type === 'toggle' || field.type === 'checkbox') {\r\n this.formData[field.name] = field['defaultValue'] ?? false;\r\n } else if (field.type === 'multiselect') {\r\n this.formData[field.name] = [];\r\n } else {\r\n this.formData[field.name] = '';\r\n }\r\n }\r\n\r\n // Merge any overrides provided by the consumer\r\n if (this.fieldComponentRegistryOverride) {\r\n this.fieldComponentRegistry = { ...this.fieldComponentRegistry, ...this.fieldComponentRegistryOverride };\r\n }\r\n }\r\n\r\n ngAfterViewInit() {\r\n // Render field widgets dynamically\r\n setTimeout(() => this.renderFieldWidgets(), 0);\r\n }\r\n\r\n ngOnDestroy() {\r\n // Clean up component refs\r\n this.componentRefs.forEach(ref => ref.destroy());\r\n this.componentRefs = [];\r\n }\r\n\r\n private renderFieldWidgets() {\r\n const containers = this.fieldContainers.toArray();\r\n const fields = this.formWidget.fields || [];\r\n\r\n fields.forEach((field: any, index: number) => {\r\n const container = containers[index];\r\n if (!container) return;\r\n\r\n const componentType = this.fieldComponentRegistry[field.type];\r\n if (!componentType) {\r\n // Fallback to input for unknown types\r\n this.renderInputFallback(container, field);\r\n return;\r\n }\r\n\r\n // Create the field widget\r\n const fieldWidget = new FormFieldWidget(field, this.formId);\r\n \r\n // Create the component\r\n const componentRef = createComponent(componentType, {\r\n environmentInjector: this.environmentInjector,\r\n elementInjector: this.injector,\r\n });\r\n\r\n // Set component inputs\r\n const instance = componentRef.instance as any;\r\n instance['widget'] = fieldWidget;\r\n // Pass current disabled state so custom components can opt-in to being readonly\r\n instance['disabled'] = this.isSubmitted;\r\n \r\n // Connect to form data via widgetAction\r\n instance['widgetAction'] = (actionName: string, payload: unknown) => {\r\n // Handle field value changes - for now, we'll sync via the rendered widget's internal state\r\n // The actual form submission will gather values from the DOM\r\n };\r\n\r\n // Attach to container\r\n container.insert(componentRef.hostView);\r\n this.componentRefs.push(componentRef);\r\n\r\n // Trigger change detection\r\n componentRef.changeDetectorRef.detectChanges();\r\n });\r\n }\r\n\r\n private renderInputFallback(container: ViewContainerRef, field: any) {\r\n // For unsupported field types, render a basic input\r\n const fieldWidget = new FormFieldWidget(field, this.formId);\r\n const componentRef = createComponent(InputWidgetComponent, {\r\n environmentInjector: this.environmentInjector,\r\n elementInjector: this.injector,\r\n });\r\n\r\n const instance = componentRef.instance as any;\r\n instance['widget'] = fieldWidget;\r\n instance['disabled'] = this.isSubmitted;\r\n\r\n container.insert(componentRef.hostView);\r\n this.componentRefs.push(componentRef);\r\n componentRef.changeDetectorRef.detectChanges();\r\n }\r\n\r\n getFieldId(fieldName: string): string {\r\n // Match the ID format used by dynamically rendered input widgets\r\n return `bbq-${this.formId}_${fieldName}-input`;\r\n }\r\n\r\n getFieldProp(field: any, prop: string): any {\r\n return field[prop];\r\n }\r\n\r\n onActionClick(actionType: string) {\r\n if (this.isSubmitted) return;\r\n if (actionType === 'submit') {\r\n // Validate required fields\r\n const hasErrors = this.validateForm();\r\n\r\n if (hasErrors) {\r\n this.showValidationMessage = true;\r\n return;\r\n }\r\n\r\n this.showValidationMessage = false;\r\n\r\n // Mark submitted to prevent further interaction\r\n this.isSubmitted = true;\r\n // Inform child components and disable DOM controls\r\n this.componentRefs.forEach(ref => {\r\n try {\r\n (ref.instance as any)['disabled'] = true;\r\n ref.changeDetectorRef.detectChanges();\r\n } catch { }\r\n });\r\n this.disableFormInteraction();\r\n\r\n // Gather form data from the DOM (since widgets manage their own state)\r\n this.gatherFormData();\r\n\r\n if (this.widgetAction) {\r\n this.widgetAction(this.formWidget.action, this.formData);\r\n }\r\n } else {\r\n // Cancel or other actions\r\n if (this.widgetAction) {\r\n this.widgetAction(this.formWidget.action, { actionType });\r\n }\r\n }\r\n }\r\n\r\n private validateForm(): boolean {\r\n const errors: Array<{ field: string; reason?: string }> = [];\r\n for (const field of this.formWidget.fields || []) {\r\n if (field.required) {\r\n const value = this.formData[field.name];\r\n if (value === undefined || value === null || value === '' ||\r\n (Array.isArray(value) && value.length === 0)) {\r\n errors.push({ field: field.name, reason: 'required' });\r\n }\r\n }\r\n }\r\n\r\n const hasErrors = errors.length > 0;\r\n const payload = { formId: this.formId, valid: !hasErrors, errors };\r\n // Emit to the local Output for direct consumers\r\n this.validationState.emit({ valid: !hasErrors, errors });\r\n // Also publish via the shared service so consumers that don't have direct access\r\n // to the component instance can subscribe app-wide.\r\n try { this.formValidationService.emit(payload); } catch { }\r\n return hasErrors; // true when there are errors\r\n }\r\n\r\n private disableFormInteraction() {\r\n try {\r\n const root: HTMLElement = this.hostRef?.nativeElement;\r\n if (!root) return;\r\n const controls = root.querySelectorAll('input,select,textarea,button');\r\n controls.forEach((el: Element) => {\r\n try { (el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement | HTMLButtonElement).disabled = true; } catch {}\r\n });\r\n root.setAttribute('aria-disabled', 'true');\r\n } catch { }\r\n }\r\n\r\n private gatherFormData() {\r\n // Gather data from the rendered field widgets\r\n // Since each widget component manages its own state via ngModel,\r\n // we need to query the DOM to get the current values\r\n const fields = this.formWidget.fields || [];\r\n \r\n fields.forEach((field: any) => {\r\n const fieldId = this.getFieldId(field.name);\r\n const element = document.getElementById(fieldId) as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n \r\n if (element) {\r\n if (element.type === 'checkbox') {\r\n this.formData[field.name] = (element as HTMLInputElement).checked;\r\n } else if (element.type === 'file') {\r\n this.formData[field.name] = (element as HTMLInputElement).files?.[0];\r\n } else if (element.tagName === 'SELECT' && (element as HTMLSelectElement).multiple) {\r\n const select = element as HTMLSelectElement;\r\n this.formData[field.name] = Array.from(select.selectedOptions).map(opt => opt.value);\r\n } else {\r\n this.formData[field.name] = element.value;\r\n }\r\n }\r\n });\r\n }\r\n}\r\n","import { Component, Input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport type { ImageWidget } from '@bbq-chat/widgets';\r\nimport { CustomWidgetComponent } from '../custom-widget-renderer.types';\r\n\r\n@Component({\r\n selector: 'bbq-image-widget',\r\n standalone: true,\r\n imports: [CommonModule],\r\n template: `\r\n <div \r\n class=\"bbq-widget bbq-image\" \r\n [attr.data-widget-type]=\"'image'\"\r\n [attr.data-action]=\"imageWidget.action\">\r\n <img \r\n class=\"bbq-image-img\" \r\n [src]=\"imageWidget.imageUrl\" \r\n [alt]=\"imageWidget.alt || 'Image'\"\r\n [style.width]=\"imageWidget.width ? imageWidget.width + 'px' : 'auto'\"\r\n [style.height]=\"imageWidget.height ? imageWidget.height + 'px' : 'auto'\"\r\n loading=\"lazy\" />\r\n </div>\r\n `,\r\n styles: []\r\n})\r\nexport class ImageWidgetComponent implements CustomWidgetComponent {\r\n @Input() widget!: any;\r\n widgetAction?: (actionName: string, payload: unknown) => void;\r\n\r\n get imageWidget(): ImageWidget {\r\n return this.widget as ImageWidget;\r\n }\r\n}\r\n","import { Component, Input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport type { ImageCollectionWidget } from '@bbq-chat/widgets';\r\nimport { CustomWidgetComponent } from '../custom-widget-renderer.types';\r\n\r\n@Component({\r\n selector: 'bbq-imagecollection-widget',\r\n standalone: true,\r\n imports: [CommonModule],\r\n template: `\r\n <div \r\n class=\"bbq-widget bbq-image-collection\" \r\n [attr.data-widget-type]=\"'imagecollection'\"\r\n [attr.data-action]=\"imageCollectionWidget.action\">\r\n <div class=\"bbq-image-collection-grid\">\r\n @for (image of imageCollectionWidget.images; track image.imageUrl) {\r\n <div class=\"bbq-image-collection-item\">\r\n <img \r\n class=\"bbq-image-collection-img\" \r\n [src]=\"image.imageUrl\" \r\n [alt]=\"image.alt || 'Image'\"\r\n [style.width]=\"image.width ? image.width + 'px' : 'auto'\"\r\n [style.height]=\"image.height ? image.height + 'px' : 'auto'\"\r\n loading=\"lazy\" />\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n `,\r\n styles: []\r\n})\r\nexport class ImageCollectionWidgetComponent implements CustomWidgetComponent {\r\n @Input() widget!: any;\r\n widgetAction?: (actionName: string, payload: unknown) => void;\r\n\r\n get imageCollectionWidget(): ImageCollectionWidget {\r\n return this.widget as ImageCollectionWidget;\r\n }\r\n}\r\n","/**\r\n * Built-in widget components\r\n * These components provide Angular implementations for all standard widget types\r\n */\r\n\r\nexport { ButtonWidgetComponent } from './button.component';\r\nexport { CardWidgetComponent } from './card.component';\r\nexport { InputWidgetComponent } from './input.component';\r\nexport { TextAreaWidgetComponent } from './textarea.component';\r\nexport { DropdownWidgetComponent } from './dropdown.component';\r\nexport { SliderWidgetComponent } from './slider.component';\r\nexport { ToggleWidgetComponent } from './toggle.component';\r\nexport { FileUploadWidgetComponent } from './fileupload.component';\r\nexport { ThemeSwitcherWidgetComponent } from './themeswitcher.component';\r\nexport { DatePickerWidgetComponent } from './datepicker.component';\r\nexport { MultiSelectWidgetComponent } from './multiselect.component';\r\nexport { ProgressBarWidgetComponent } from './progressbar.component';\r\nexport { FormWidgetComponent } from './form.component';\r\nexport { ImageWidgetComponent } from './image.component';\r\nexport { ImageCollectionWidgetComponent } from './imagecollection.component';\r\n","import { Type } from '@angular/core';\r\nimport { CustomWidgetComponent } from '../custom-widget-renderer.types';\r\nimport {\r\n ButtonWidgetComponent,\r\n CardWidgetComponent,\r\n InputWidgetComponent,\r\n TextAreaWidgetComponent,\r\n DropdownWidgetComponent,\r\n SliderWidgetComponent,\r\n ToggleWidgetComponent,\r\n FileUploadWidgetComponent,\r\n ThemeSwitcherWidgetComponent,\r\n DatePickerWidgetComponent,\r\n MultiSelectWidgetComponent,\r\n ProgressBarWidgetComponent,\r\n FormWidgetComponent,\r\n ImageWidgetComponent,\r\n ImageCollectionWidgetComponent,\r\n} from '../components';\r\n\r\n/**\r\n * Registry of all built-in widget components\r\n * Maps widget type to Angular component class\r\n */\r\nexport const BUILT_IN_WIDGET_COMPONENTS: Record<string, Type<CustomWidgetComponent>> = {\r\n button: ButtonWidgetComponent,\r\n card: CardWidgetComponent,\r\n input: InputWidgetComponent,\r\n textarea: TextAreaWidgetComponent,\r\n dropdown: DropdownWidgetComponent,\r\n slider: SliderWidgetComponent,\r\n toggle: ToggleWidgetComponent,\r\n fileupload: FileUploadWidgetComponent,\r\n themeswitcher: ThemeSwitcherWidgetComponent,\r\n datepicker: DatePickerWidgetComponent,\r\n multiselect: MultiSelectWidgetComponent,\r\n progressbar: ProgressBarWidgetComponent,\r\n form: FormWidgetComponent,\r\n image: ImageWidgetComponent,\r\n imagecollection: ImageCollectionWidgetComponent,\r\n};\r\n","import { InjectionToken } from '@angular/core';\r\nimport { SsrWidgetRenderer, WidgetEventManager, IWidgetActionHandler } from '@bbq-chat/widgets';\r\nimport { AngularWidgetRenderer } from './renderers/AngularWidgetRenderer';\r\nimport { BUILT_IN_WIDGET_COMPONENTS } from './renderers/built-in-components';\r\n\r\n/**\r\n * Injection token for WidgetEventManager factory\r\n * \r\n * Use this token to inject a factory function that creates WidgetEventManager instances.\r\n * The factory accepts an optional action handler to configure the manager.\r\n * \r\n * @example\r\n * ```typescript\r\n * constructor(@Inject(WIDGET_EVENT_MANAGER_FACTORY) private eventManagerFactory: WidgetEventManagerFactory) {\r\n * const actionHandler = { handle: async (action, payload) => { ... } };\r\n * this.eventManager = this.eventManagerFactory(actionHandler);\r\n * }\r\n * ```\r\n */\r\nexport type WidgetEventManagerFactory = (actionHandler?: IWidgetActionHandler) => WidgetEventManager;\r\n\r\nexport const WIDGET_EVENT_MANAGER_FACTORY = new InjectionToken<WidgetEventManagerFactory>(\r\n 'WIDGET_EVENT_MANAGER_FACTORY'\r\n);\r\n\r\n/**\r\n * Injection token for SsrWidgetRenderer\r\n * \r\n * Use this token to inject a SsrWidgetRenderer instance in your components.\r\n * By default, WidgetRendererComponent provides this token with a factory that creates\r\n * a new instance for each component.\r\n * \r\n * @example\r\n * ```typescript\r\n * constructor(@Inject(SSR_WIDGET_RENDERER) private renderer: SsrWidgetRenderer) {}\r\n * ```\r\n */\r\nexport const SSR_WIDGET_RENDERER = new InjectionToken<SsrWidgetRenderer>(\r\n 'SSR_WIDGET_RENDERER'\r\n);\r\n\r\n/**\r\n * Injection token for AngularWidgetRenderer\r\n * \r\n * Use this token to inject an AngularWidgetRenderer instance in your components.\r\n * This is the recommended renderer for Angular applications as it provides\r\n * native Angular component rendering instead of HTML string rendering.\r\n * \r\n * @example\r\n * ```typescript\r\n * constructor(@Inject(ANGULAR_WIDGET_RENDERER) private renderer: AngularWidgetRenderer) {}\r\n * ```\r\n */\r\nexport const ANGULAR_WIDGET_RENDERER = new InjectionToken<AngularWidgetRenderer>(\r\n 'ANGULAR_WIDGET_RENDERER'\r\n);\r\n\r\n/**\r\n * Factory function for creating WidgetEventManager instances\r\n * \r\n * This factory is used by default in WidgetRendererComponent's providers array.\r\n * You can override this in your own providers if you need custom initialization.\r\n * \r\n * @returns A factory function that creates WidgetEventManager instances\r\n */\r\nexport function widgetEventManagerFactoryProvider(): WidgetEventManagerFactory {\r\n return (actionHandler?: IWidgetActionHandler) => new WidgetEventManager(actionHandler);\r\n}\r\n\r\n/**\r\n * Factory function for creating SsrWidgetRenderer instances\r\n * \r\n * This factory is used by default in WidgetRendererComponent's providers array.\r\n * You can override this in your own providers if you need custom initialization\r\n * or custom rendering options.\r\n * \r\n * @returns A new SsrWidgetRenderer instance\r\n */\r\nexport function ssrWidgetRendererFactory(): SsrWidgetRenderer {\r\n return new SsrWidgetRenderer();\r\n}\r\n\r\n/**\r\n * Factory function for creating AngularWidgetRenderer instances\r\n * \r\n * This factory creates an AngularWidgetRenderer with all built-in widget components\r\n * pre-registered. This is the recommended renderer for Angular applications.\r\n * \r\n * @returns A new AngularWidgetRenderer instance with built-in components registered\r\n */\r\nexport function angularWidgetRendererFactory(): AngularWidgetRenderer {\r\n const renderer = new AngularWidgetRenderer();\r\n renderer.registerBuiltInComponents(BUILT_IN_WIDGET_COMPONENTS);\r\n return renderer;\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { customWidgetRegistry, ChatWidget } from '@bbq-chat/widgets';\r\nimport { CustomWidgetRenderer } from './custom-widget-renderer.types';\r\n\r\n/**\r\n * Service for registering custom widget factories and renderers\r\n * \r\n * This service provides a centralized way to register custom widget types\r\n * that extend the base widget functionality, including support for\r\n * Angular components and templates as custom renderers.\r\n * \r\n * @example\r\n * ```typescript\r\n * constructor(private widgetRegistry: WidgetRegistryService) {\r\n * // Register a widget factory\r\n * this.widgetRegistry.registerFactory('myWidget', (obj) => {\r\n * if (obj.type === 'myWidget') {\r\n * return new MyCustomWidget(obj.label, obj.action);\r\n * }\r\n * return null;\r\n * });\r\n * \r\n * // Register a component-based renderer\r\n * this.widgetRegistry.registerRenderer('myWidget', MyWidgetComponent);\r\n * }\r\n * ```\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class WidgetRegistryService {\r\n private readonly customRenderers = new Map<string, CustomWidgetRenderer>();\r\n /**\r\n * Register a custom widget factory function\r\n * \r\n * @param type - The widget type identifier\r\n * @param factory - Factory function that creates widget instances from plain objects\r\n */\r\n registerFactory(\r\n type: string,\r\n factory: (obj: unknown) => ChatWidget | null\r\n ): void {\r\n customWidgetRegistry.registerFactory(type, factory);\r\n }\r\n\r\n /**\r\n * Register a widget class with automatic factory creation\r\n * \r\n * @param type - The widget type identifier\r\n * @param ctor - Widget class constructor\r\n */\r\n registerClass(type: string, ctor: any): void {\r\n customWidgetRegistry.registerClass(type, ctor);\r\n }\r\n\r\n /**\r\n * Get a factory for a specific widget type\r\n * \r\n * @param type - The widget type identifier\r\n * @returns The factory function if registered, undefined otherwise\r\n */\r\n getFactory(type: string): ((obj: any) => ChatWidget | null) | undefined {\r\n return customWidgetRegistry.getFactory(type);\r\n }\r\n\r\n /**\r\n * Register a custom renderer for a specific widget type\r\n * \r\n * The renderer can be:\r\n * - A function that returns HTML string\r\n * - An Angular Component class\r\n * - An Angular TemplateRef\r\n * \r\n * @param type - The widget type identifier\r\n * @param renderer - The custom renderer (function, Component, or TemplateRef)\r\n * \r\n * @example\r\n * ```typescript\r\n * // HTML function renderer\r\n * widgetRegistry.registerRenderer('weather', (widget) => `<div>${widget.label}</div>`);\r\n * \r\n * // Component renderer\r\n * widgetRegistry.registerRenderer('weather', WeatherWidgetComponent);\r\n * \r\n * // Template renderer (from @ViewChild or elsewhere)\r\n * widgetRegistry.registerRenderer('weather', this.weatherTemplate);\r\n * ```\r\n */\r\n registerRenderer(type: string, renderer: CustomWidgetRenderer): void {\r\n if (!type || typeof type !== 'string') {\r\n throw new Error('type must be a non-empty string');\r\n }\r\n if (!renderer) {\r\n throw new Error('renderer is required');\r\n }\r\n this.customRenderers.set(type, renderer);\r\n }\r\n\r\n /**\r\n * Get a custom renderer for a specific widget type\r\n * \r\n * @param type - The widget type identifier\r\n * @returns The custom renderer if registered, undefined otherwise\r\n */\r\n getRenderer(type: string): CustomWidgetRenderer | undefined {\r\n return this.customRenderers.get(type);\r\n }\r\n\r\n /**\r\n * Check if a custom renderer is registered for a widget type\r\n * \r\n * @param type - The widget type identifier\r\n * @returns True if a custom renderer is registered, false otherwise\r\n */\r\n hasRenderer(type: string): boolean {\r\n return this.customRenderers.has(type);\r\n }\r\n\r\n /**\r\n * Unregister a custom renderer for a widget type\r\n * \r\n * @param type - The widget type identifier\r\n * @returns True if a renderer was removed, false if none was registered\r\n */\r\n unregisterRenderer(type: string): boolean {\r\n return this.customRenderers.delete(type);\r\n }\r\n}\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ElementRef,\r\n AfterViewInit,\r\n OnInit,\r\n OnDestroy,\r\n OnChanges,\r\n SimpleChanges,\r\n ViewChild,\r\n ComponentRef,\r\n EmbeddedViewRef,\r\n TemplateRef,\r\n Injector,\r\n createComponent,\r\n EnvironmentInjector,\r\n Inject,\r\n Optional,\r\n ChangeDetectorRef,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n SsrWidgetRenderer,\r\n WidgetEventManager,\r\n ChatWidget,\r\n} from '@bbq-chat/widgets';\r\nimport { WidgetRegistryService } from './widget-registry.service';\r\nimport {\r\n WidgetTemplateContext,\r\n isHtmlRenderer,\r\n isComponentRenderer,\r\n isTemplateRenderer,\r\n} from './custom-widget-renderer.types';\r\nimport {\r\n WIDGET_EVENT_MANAGER_FACTORY,\r\n SSR_WIDGET_RENDERER,\r\n ANGULAR_WIDGET_RENDERER,\r\n widgetEventManagerFactoryProvider,\r\n ssrWidgetRendererFactory,\r\n angularWidgetRendererFactory,\r\n WidgetEventManagerFactory,\r\n} from './widget-di.tokens';\r\nimport { AngularWidgetRenderer } from './renderers/AngularWidgetRenderer';\r\n\r\n/**\r\n * Angular component for rendering chat widgets\r\n * \r\n * This component handles rendering of chat widgets using the BbQ ChatWidgets library.\r\n * It manages widget lifecycle, event handling, and cleanup. \r\n * \r\n * Supports three types of custom widget renderers:\r\n * 1. HTML function renderers (return HTML strings)\r\n * 2. Angular Component renderers (render as dynamic components)\r\n * 3. Angular TemplateRef renderers (render as embedded views)\r\n * \r\n * @example\r\n * ```typescript\r\n * <bbq-widget-renderer \r\n * [widgets]=\"messageWidgets\" \r\n * (widgetAction)=\"handleWidgetAction($event)\">\r\n * </bbq-widget-renderer>\r\n * ```\r\n */\r\n@Component({\r\n selector: 'bbq-widget-renderer',\r\n standalone: true,\r\n imports: [CommonModule],\r\n providers: [\r\n { provide: WIDGET_EVENT_MANAGER_FACTORY, useFactory: widgetEventManagerFactoryProvider },\r\n { provide: SSR_WIDGET_RENDERER, useFactory: ssrWidgetRendererFactory },\r\n { provide: ANGULAR_WIDGET_RENDERER, useFactory: angularWidgetRendererFactory },\r\n ],\r\n template: `\r\n <div #widgetContainer class=\"bbq-widgets-container\" (click)=\"handleClick($event)\">\r\n @for (item of widgetItems; track item.index) {\r\n @if (item.isHtml) {\r\n <div class=\"bbq-widget\" [innerHTML]=\"item.html\"></div>\r\n } @else {\r\n <div class=\"bbq-widget\" #dynamicWidget></div>\r\n }\r\n }\r\n </div>\r\n `,\r\n styles: [\r\n `\r\n .bbq-widgets-container {\r\n margin-top: 0.5rem;\r\n }\r\n\r\n .bbq-widget {\r\n margin-bottom: 0.5rem;\r\n }\r\n `,\r\n ],\r\n})\r\nexport class WidgetRendererComponent\r\n implements OnInit, AfterViewInit, OnDestroy, OnChanges {\r\n /**\r\n * Array of widgets to render\r\n */\r\n @Input() widgets: ChatWidget[] | null | undefined;\r\n\r\n /**\r\n * Emits when a widget action is triggered\r\n */\r\n @Output() widgetAction = new EventEmitter<{\r\n actionName: string;\r\n payload: unknown;\r\n }>();\r\n\r\n @ViewChild('widgetContainer', { static: false })\r\n containerRef!: ElementRef<HTMLDivElement>;\r\n\r\n protected widgetItems: Array<{\r\n index: number;\r\n widget: ChatWidget;\r\n isHtml: boolean;\r\n html?: string;\r\n }> = [];\r\n\r\n protected eventManager?: WidgetEventManager;\r\n protected isViewInitialized = false;\r\n protected dynamicComponents: Array<ComponentRef<any>> = [];\r\n protected dynamicViews: Array<EmbeddedViewRef<WidgetTemplateContext>> = [];\r\n\r\n constructor(\r\n @Inject(SSR_WIDGET_RENDERER) protected renderer: SsrWidgetRenderer,\r\n @Optional() @Inject(ANGULAR_WIDGET_RENDERER) protected angularRenderer: AngularWidgetRenderer | null,\r\n @Inject(WIDGET_EVENT_MANAGER_FACTORY) protected eventManagerFactory: WidgetEventManagerFactory,\r\n protected widgetRegistry: WidgetRegistryService,\r\n protected injector: Injector,\r\n protected environmentInjector: EnvironmentInjector\r\n ) { }\r\n\r\n ngOnInit() {\r\n // this.updateWidgetHtml();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['widgets']) {\r\n this.updateWidgetHtml();\r\n }\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.updateWidgetHtml();\r\n this.isViewInitialized = true;\r\n this.setupEventHandlers();\r\n // Render dynamic components/templates after view init\r\n this.renderDynamicWidgets();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.cleanup();\r\n }\r\n\r\n /**\r\n * Base implementation for updating the rendered HTML for the current widgets.\r\n *\r\n * Subclasses may override this method to customize how widgets are rendered\r\n * (for example, to inject additional markup or perform preprocessing).\r\n *\r\n * Since this is the base implementation, overriding implementations are not\r\n * required to call `super.updateWidgetHtml()`.\r\n */\r\n protected updateWidgetHtml() {\r\n if (!this.widgets || this.widgets.length === 0) {\r\n this.widgetItems = [];\r\n return;\r\n }\r\n\r\n this.widgetItems = this.widgets.map((widget, index) => {\r\n const customRenderer = this.widgetRegistry.getRenderer(widget.type);\r\n\r\n // Check template renderer first (most specific)\r\n if (customRenderer && isTemplateRenderer(customRenderer)) {\r\n return {\r\n index,\r\n widget,\r\n isHtml: false,\r\n };\r\n }\r\n\r\n // Check component renderer second\r\n if (customRenderer && isComponentRenderer(customRenderer)) {\r\n return {\r\n index,\r\n widget,\r\n isHtml: false,\r\n };\r\n }\r\n\r\n // Check HTML function renderer last (most general, matches any function)\r\n if (customRenderer && isHtmlRenderer(customRenderer)) {\r\n return {\r\n index,\r\n widget,\r\n isHtml: true,\r\n html: customRenderer(widget),\r\n };\r\n }\r\n\r\n // Try to use AngularWidgetRenderer for built-in widgets\r\n if (this.angularRenderer) {\r\n const componentType = this.angularRenderer.getComponentType(widget);\r\n if (componentType) {\r\n return {\r\n index,\r\n widget,\r\n isHtml: false,\r\n };\r\n }\r\n }\r\n\r\n // Fallback: render using the SSR library renderer\r\n return {\r\n index,\r\n widget,\r\n isHtml: true,\r\n html: this.renderer.renderWidget(widget),\r\n };\r\n });\r\n\r\n // After view updates, reinitialize widgets only if view is already initialized\r\n if (this.isViewInitialized) {\r\n setTimeout(() => {\r\n this.setupEventHandlers();\r\n this.renderDynamicWidgets();\r\n }, 0);\r\n }\r\n }\r\n\r\n /**\r\n * Render dynamic components and templates for custom widgets\r\n */\r\n protected renderDynamicWidgets() {\r\n if (!this.containerRef?.nativeElement) return;\r\n\r\n // Use microtask to ensure Angular has completed change detection\r\n Promise.resolve().then(() => {\r\n if (!this.containerRef?.nativeElement) return;\r\n\r\n // Clean up existing dynamic components and views\r\n this.cleanupDynamicWidgets();\r\n\r\n const container = this.containerRef.nativeElement;\r\n // Query all widget divs without the data-rendered filter\r\n const dynamicWidgetDivs = Array.from(\r\n container.querySelectorAll('.bbq-widget')\r\n ) as HTMLElement[];\r\n\r\n let dynamicIndex = 0;\r\n this.widgetItems.forEach((item) => {\r\n if (!item.isHtml) {\r\n const customRenderer = this.widgetRegistry.getRenderer(item.widget.type);\r\n\r\n const targetDiv = dynamicWidgetDivs[dynamicIndex];\r\n if (!targetDiv) return;\r\n\r\n // Clear the div content before rendering\r\n targetDiv.innerHTML = '';\r\n\r\n // Handle custom renderers first\r\n if (customRenderer) {\r\n if (isComponentRenderer(customRenderer)) {\r\n this.renderComponent(customRenderer, item.widget, targetDiv);\r\n } else if (isTemplateRenderer(customRenderer)) {\r\n this.renderTemplate(customRenderer, item.widget, targetDiv);\r\n }\r\n } else if (this.angularRenderer) {\r\n // Try to render using AngularWidgetRenderer for built-in widgets\r\n const componentType = this.angularRenderer.getComponentType(item.widget);\r\n if (componentType) {\r\n this.renderComponent(componentType, item.widget, targetDiv);\r\n }\r\n }\r\n\r\n dynamicIndex++;\r\n }\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Render an Angular component for a custom widget\r\n * \r\n * Note: This method safely assigns properties to component instances\r\n * by checking for property existence at runtime. This approach is necessary\r\n * because we cannot statically verify that all components implement\r\n * the CustomWidgetComponent interface.\r\n */\r\n protected renderComponent(\r\n componentType: any,\r\n widget: ChatWidget,\r\n targetElement: HTMLElement\r\n ) {\r\n // Create the component using Angular's createComponent API\r\n const componentRef = createComponent(componentType, {\r\n environmentInjector: this.environmentInjector,\r\n elementInjector: this.injector,\r\n });\r\n\r\n // Safely set component inputs if they exist\r\n const instance = componentRef.instance as any;\r\n // Set widget property if it exists in the prototype chain\r\n if (!instance['widget']) {\r\n instance['widget'] = widget;\r\n }\r\n // Set widgetAction property if it exists in the prototype chain\r\n if(!instance['widgetAction']) {\r\n instance['widgetAction'] = (actionName: string, payload: unknown) => {\r\n this.widgetAction.emit({ actionName, payload });\r\n };\r\n }\r\n // Attach the component's host view to the target element\r\n targetElement.appendChild(componentRef.location.nativeElement);\r\n\r\n // Store reference for cleanup\r\n this.dynamicComponents.push(componentRef);\r\n\r\n // Trigger change detection (use optional chaining for safety)\r\n componentRef.changeDetectorRef?.detectChanges();\r\n }\r\n\r\n /**\r\n * Render an Angular template for a custom widget\r\n */\r\n protected renderTemplate(\r\n templateRef: TemplateRef<WidgetTemplateContext>,\r\n widget: ChatWidget,\r\n targetElement: HTMLElement\r\n ) {\r\n const context: WidgetTemplateContext = {\r\n $implicit: widget,\r\n widget: widget,\r\n emitAction: (actionName: string, payload: unknown) => {\r\n this.widgetAction.emit({ actionName, payload });\r\n },\r\n };\r\n\r\n const viewRef = templateRef.createEmbeddedView(context);\r\n\r\n // Attach the view's DOM nodes to the target element\r\n viewRef.rootNodes.forEach((node: Node) => {\r\n targetElement.appendChild(node);\r\n });\r\n\r\n // Store reference for cleanup\r\n this.dynamicViews.push(viewRef);\r\n\r\n // Trigger change detection\r\n viewRef.detectChanges();\r\n }\r\n\r\n /**\r\n * Cleanup dynamic components and views\r\n */\r\n protected cleanupDynamicWidgets() {\r\n this.dynamicComponents.forEach((componentRef) => {\r\n componentRef.destroy();\r\n });\r\n this.dynamicComponents = [];\r\n\r\n this.dynamicViews.forEach((viewRef) => {\r\n viewRef.destroy();\r\n });\r\n this.dynamicViews = [];\r\n }\r\n\r\n private setupEventHandlers() {\r\n if (!this.containerRef?.nativeElement) return;\r\n\r\n // Cleanup old resources before setting up new ones\r\n this.cleanup();\r\n\r\n const container = this.containerRef.nativeElement;\r\n\r\n // Create a custom action handler that emits events\r\n const actionHandler = {\r\n handle: async (action: string, payload: any) => {\r\n this.widgetAction.emit({ actionName: action, payload });\r\n },\r\n };\r\n\r\n // Use the injected factory to create an event manager with the component-specific action handler\r\n this.eventManager = this.eventManagerFactory(actionHandler);\r\n this.eventManager.attachHandlers(container);\r\n }\r\n\r\n handleClick(event: MouseEvent) {\r\n const target = event.target as HTMLElement;\r\n // Only trigger actions on non-form buttons and clickable elements (cards)\r\n // Don't trigger on input elements or form buttons (let WidgetEventManager handle those)\r\n const button = target.tagName === 'BUTTON' ? target : target.closest('button');\r\n if (button && !button.closest('[data-widget-type=\"form\"]')) {\r\n const actionName = button.getAttribute('data-action');\r\n if (actionName) {\r\n try {\r\n const payloadStr = button.getAttribute('data-payload');\r\n const payload = payloadStr ? JSON.parse(payloadStr) : {};\r\n this.widgetAction.emit({ actionName, payload });\r\n } catch (err) {\r\n console.error('Failed to parse widget action payload:', err);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Cleanup all resources including event listeners.\r\n */\r\n private cleanup() {\r\n // Cleanup dynamic widgets first\r\n this.cleanupDynamicWidgets();\r\n\r\n // Cleanup event manager\r\n this.eventManager = undefined;\r\n }\r\n}\r\n","/**\r\n * Angular widget renderers\r\n */\r\n\r\nexport { AngularWidgetRenderer } from './AngularWidgetRenderer';\r\nexport type { AngularRendererOptions } from './AngularWidgetRenderer';\r\nexport * from '../components';\r\n","import { Component, Input, OnDestroy, OnInit } from '@angular/core';\r\nimport { JsonPipe } from '@angular/common';\r\nimport { Subscription } from 'rxjs';\r\nimport { FormValidationService, FormValidationEvent } from '../services/form-validation.service';\r\n\r\n@Component({\r\n selector: 'bbq-form-validation-listener',\r\n standalone: true,\r\n imports: [JsonPipe],\r\n template: `\r\n <div class=\"bbq-validation-listener\">\r\n @if (lastEvent) {\r\n <div>\r\n <strong>Last validation (formId: {{ lastEvent.formId }})</strong>\r\n <pre>{{ lastEvent | json }}</pre>\r\n </div>\r\n } @else {\r\n <small>No validation events yet.</small>\r\n }\r\n </div>\r\n `,\r\n})\r\nexport class FormValidationListenerComponent implements OnInit, OnDestroy {\r\n @Input() formId?: string;\r\n lastEvent?: FormValidationEvent | null = null;\r\n private sub?: Subscription;\r\n\r\n constructor(private svc: FormValidationService) {}\r\n\r\n ngOnInit() {\r\n this.sub = this.svc.validation$.subscribe(ev => {\r\n if (!this.formId || ev.formId === this.formId) {\r\n this.lastEvent = ev;\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy() {\r\n this.sub?.unsubscribe();\r\n }\r\n}\r\n","/**\r\n * @bbq-chat/widgets-angular\r\n * \r\n * Angular components and services for BbQ ChatWidgets\r\n * \r\n * This package provides Angular-native components and services that wrap\r\n * the core @bbq-chat/widgets library, making it easy to integrate chat\r\n * widgets into Angular applications.\r\n * \r\n * @packageDocumentation\r\n */\r\n\r\n// Export components\r\nexport { WidgetRendererComponent } from './widget-renderer.component';\r\n\r\n// Export services\r\nexport { WidgetRegistryService } from './widget-registry.service';\r\nexport { FormValidationService } from './services/form-validation.service';\r\n\r\n// Export DI tokens and factories\r\nexport {\r\n WIDGET_EVENT_MANAGER_FACTORY,\r\n SSR_WIDGET_RENDERER,\r\n ANGULAR_WIDGET_RENDERER,\r\n widgetEventManagerFactoryProvider,\r\n ssrWidgetRendererFactory,\r\n angularWidgetRendererFactory,\r\n} from './widget-di.tokens';\r\n\r\nexport type { WidgetEventManagerFactory } from './widget-di.tokens';\r\n\r\n// Export custom widget renderer types\r\nexport type {\r\n CustomWidgetComponent,\r\n CustomWidgetRenderer,\r\n CustomWidgetHtmlRenderer,\r\n CustomWidgetRendererConfig,\r\n WidgetTemplateContext,\r\n} from './custom-widget-renderer.types';\r\n\r\nexport {\r\n isHtmlRenderer,\r\n isComponentRenderer,\r\n isTemplateRenderer,\r\n} from './custom-widget-renderer.types';\r\n\r\n// Export Angular renderer and built-in components\r\nexport {\r\n AngularWidgetRenderer,\r\n ButtonWidgetComponent,\r\n CardWidgetComponent,\r\n InputWidgetComponent,\r\n TextAreaWidgetComponent,\r\n DropdownWidgetComponent,\r\n SliderWidgetComponent,\r\n ToggleWidgetComponent,\r\n FileUploadWidgetComponent,\r\n ThemeSwitcherWidgetComponent,\r\n DatePickerWidgetComponent,\r\n MultiSelectWidgetComponent,\r\n ProgressBarWidgetComponent,\r\n FormWidgetComponent,\r\n ImageWidgetComponent,\r\n ImageCollectionWidgetComponent,\r\n} from './renderers';\r\n\r\nexport type {\r\n AngularRendererOptions,\r\n} from './renderers';\r\n\r\nexport { BUILT_IN_WIDGET_COMPONENTS } from './renderers/built-in-components';\r\n\r\n// Re-export commonly used types and classes from core package\r\nexport {\r\n ChatWidget,\r\n} from '@bbq-chat/widgets';\r\n\r\nexport type {\r\n ButtonWidget,\r\n CardWidget,\r\n FormWidget,\r\n InputWidget,\r\n TextAreaWidget,\r\n DropdownWidget,\r\n SliderWidget,\r\n ToggleWidget,\r\n FileUploadWidget,\r\n DatePickerWidget,\r\n MultiSelectWidget,\r\n ProgressBarWidget,\r\n ThemeSwitcherWidget,\r\n ImageWidget,\r\n ImageCollectionWidget,\r\n} from '@bbq-chat/widgets';\r\n\r\n// Re-export utilities\r\nexport {\r\n SsrWidgetRenderer,\r\n WidgetEventManager,\r\n customWidgetRegistry,\r\n} from '@bbq-chat/widgets';\r\n\r\n// Examples\r\nexport { FormValidationListenerComponent } from './examples/form-validation-listener.component';\r\n\r\n// Version\r\nexport const VERSION = '1.0.10';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i1","i1.FormValidationService","i1.WidgetRegistryService"],"mappings":"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"}
|
package/package.json
CHANGED
package/types/index.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import * as i0 from '@angular/core';
|
|
|
2
2
|
import { Type, TemplateRef, InjectionToken, OnInit, AfterViewInit, OnDestroy, OnChanges, Injector, EnvironmentInjector, EventEmitter, ElementRef, ComponentRef, EmbeddedViewRef, SimpleChanges, QueryList, ViewContainerRef } from '@angular/core';
|
|
3
3
|
import { ChatWidget, IWidgetRenderer, IWidgetActionHandler, WidgetEventManager, SsrWidgetRenderer, ButtonWidget, CardWidget, InputWidget, TextAreaWidget, DropdownWidget, SliderWidget, ToggleWidget, FileUploadWidget, ThemeSwitcherWidget, DatePickerWidget, MultiSelectWidget, ProgressBarWidget, FormWidget, ImageWidget, ImageCollectionWidget } from '@bbq-chat/widgets';
|
|
4
4
|
export { ButtonWidget, CardWidget, ChatWidget, DatePickerWidget, DropdownWidget, FileUploadWidget, FormWidget, ImageCollectionWidget, ImageWidget, InputWidget, MultiSelectWidget, ProgressBarWidget, SliderWidget, SsrWidgetRenderer, TextAreaWidget, ThemeSwitcherWidget, ToggleWidget, WidgetEventManager, customWidgetRegistry } from '@bbq-chat/widgets';
|
|
5
|
+
import { Observable } from 'rxjs';
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* Context provided to template-based custom widget renderers
|
|
@@ -399,6 +400,22 @@ declare class WidgetRendererComponent implements OnInit, AfterViewInit, OnDestro
|
|
|
399
400
|
static ɵcmp: i0.ɵɵComponentDeclaration<WidgetRendererComponent, "bbq-widget-renderer", never, { "widgets": { "alias": "widgets"; "required": false; }; }, { "widgetAction": "widgetAction"; }, never, never, true, never>;
|
|
400
401
|
}
|
|
401
402
|
|
|
403
|
+
interface FormValidationEvent {
|
|
404
|
+
formId: string;
|
|
405
|
+
valid: boolean;
|
|
406
|
+
errors: Array<{
|
|
407
|
+
field: string;
|
|
408
|
+
reason?: string;
|
|
409
|
+
}>;
|
|
410
|
+
}
|
|
411
|
+
declare class FormValidationService {
|
|
412
|
+
private subject;
|
|
413
|
+
get validation$(): Observable<FormValidationEvent>;
|
|
414
|
+
emit(event: FormValidationEvent): void;
|
|
415
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<FormValidationService, never>;
|
|
416
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<FormValidationService>;
|
|
417
|
+
}
|
|
418
|
+
|
|
402
419
|
declare class ButtonWidgetComponent implements CustomWidgetComponent {
|
|
403
420
|
widget: any;
|
|
404
421
|
widgetAction?: (actionName: string, payload: unknown) => void;
|
|
@@ -554,16 +571,27 @@ declare class ProgressBarWidgetComponent implements CustomWidgetComponent, OnIni
|
|
|
554
571
|
declare class FormWidgetComponent implements CustomWidgetComponent, OnInit, AfterViewInit, OnDestroy {
|
|
555
572
|
private injector;
|
|
556
573
|
private environmentInjector;
|
|
574
|
+
private hostRef;
|
|
575
|
+
private formValidationService;
|
|
557
576
|
widget: any;
|
|
558
577
|
widgetAction?: (actionName: string, payload: unknown) => void;
|
|
578
|
+
fieldComponentRegistryOverride?: Record<string, Type<CustomWidgetComponent>>;
|
|
579
|
+
validationState: EventEmitter<{
|
|
580
|
+
valid: boolean;
|
|
581
|
+
errors: Array<{
|
|
582
|
+
field: string;
|
|
583
|
+
reason?: string;
|
|
584
|
+
}>;
|
|
585
|
+
}>;
|
|
559
586
|
fieldContainers: QueryList<ViewContainerRef>;
|
|
560
587
|
formId: string;
|
|
561
588
|
formData: Record<string, any>;
|
|
562
589
|
showValidationMessage: boolean;
|
|
563
590
|
private componentRefs;
|
|
564
591
|
private fieldComponentRegistry;
|
|
592
|
+
isSubmitted: boolean;
|
|
565
593
|
get formWidget(): FormWidget;
|
|
566
|
-
constructor(injector: Injector, environmentInjector: EnvironmentInjector);
|
|
594
|
+
constructor(injector: Injector, environmentInjector: EnvironmentInjector, hostRef: ElementRef, formValidationService: FormValidationService);
|
|
567
595
|
ngOnInit(): void;
|
|
568
596
|
ngAfterViewInit(): void;
|
|
569
597
|
ngOnDestroy(): void;
|
|
@@ -573,9 +601,10 @@ declare class FormWidgetComponent implements CustomWidgetComponent, OnInit, Afte
|
|
|
573
601
|
getFieldProp(field: any, prop: string): any;
|
|
574
602
|
onActionClick(actionType: string): void;
|
|
575
603
|
private validateForm;
|
|
604
|
+
private disableFormInteraction;
|
|
576
605
|
private gatherFormData;
|
|
577
606
|
static ɵfac: i0.ɵɵFactoryDeclaration<FormWidgetComponent, never>;
|
|
578
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<FormWidgetComponent, "bbq-form-widget", never, { "widget": { "alias": "widget"; "required": false; }; }, {}, never, never, true, never>;
|
|
607
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<FormWidgetComponent, "bbq-form-widget", never, { "widget": { "alias": "widget"; "required": false; }; "fieldComponentRegistryOverride": { "alias": "fieldComponentRegistryOverride"; "required": false; }; }, { "validationState": "validationState"; }, never, never, true, never>;
|
|
579
608
|
}
|
|
580
609
|
|
|
581
610
|
declare class ImageWidgetComponent implements CustomWidgetComponent {
|
|
@@ -600,6 +629,18 @@ declare class ImageCollectionWidgetComponent implements CustomWidgetComponent {
|
|
|
600
629
|
*/
|
|
601
630
|
declare const BUILT_IN_WIDGET_COMPONENTS: Record<string, Type<CustomWidgetComponent>>;
|
|
602
631
|
|
|
632
|
+
declare class FormValidationListenerComponent implements OnInit, OnDestroy {
|
|
633
|
+
private svc;
|
|
634
|
+
formId?: string;
|
|
635
|
+
lastEvent?: FormValidationEvent | null;
|
|
636
|
+
private sub?;
|
|
637
|
+
constructor(svc: FormValidationService);
|
|
638
|
+
ngOnInit(): void;
|
|
639
|
+
ngOnDestroy(): void;
|
|
640
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<FormValidationListenerComponent, never>;
|
|
641
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<FormValidationListenerComponent, "bbq-form-validation-listener", never, { "formId": { "alias": "formId"; "required": false; }; }, {}, never, never, true, never>;
|
|
642
|
+
}
|
|
643
|
+
|
|
603
644
|
/**
|
|
604
645
|
* @bbq-chat/widgets-angular
|
|
605
646
|
*
|
|
@@ -612,7 +653,7 @@ declare const BUILT_IN_WIDGET_COMPONENTS: Record<string, Type<CustomWidgetCompon
|
|
|
612
653
|
* @packageDocumentation
|
|
613
654
|
*/
|
|
614
655
|
|
|
615
|
-
declare const VERSION = "1.0.
|
|
656
|
+
declare const VERSION = "1.0.10";
|
|
616
657
|
|
|
617
|
-
export { ANGULAR_WIDGET_RENDERER, AngularWidgetRenderer, BUILT_IN_WIDGET_COMPONENTS, ButtonWidgetComponent, CardWidgetComponent, DatePickerWidgetComponent, DropdownWidgetComponent, FileUploadWidgetComponent, FormWidgetComponent, ImageCollectionWidgetComponent, ImageWidgetComponent, InputWidgetComponent, MultiSelectWidgetComponent, ProgressBarWidgetComponent, SSR_WIDGET_RENDERER, SliderWidgetComponent, TextAreaWidgetComponent, ThemeSwitcherWidgetComponent, ToggleWidgetComponent, VERSION, WIDGET_EVENT_MANAGER_FACTORY, WidgetRegistryService, WidgetRendererComponent, angularWidgetRendererFactory, isComponentRenderer, isHtmlRenderer, isTemplateRenderer, ssrWidgetRendererFactory, widgetEventManagerFactoryProvider };
|
|
658
|
+
export { ANGULAR_WIDGET_RENDERER, AngularWidgetRenderer, BUILT_IN_WIDGET_COMPONENTS, ButtonWidgetComponent, CardWidgetComponent, DatePickerWidgetComponent, DropdownWidgetComponent, FileUploadWidgetComponent, FormValidationListenerComponent, FormValidationService, FormWidgetComponent, ImageCollectionWidgetComponent, ImageWidgetComponent, InputWidgetComponent, MultiSelectWidgetComponent, ProgressBarWidgetComponent, SSR_WIDGET_RENDERER, SliderWidgetComponent, TextAreaWidgetComponent, ThemeSwitcherWidgetComponent, ToggleWidgetComponent, VERSION, WIDGET_EVENT_MANAGER_FACTORY, WidgetRegistryService, WidgetRendererComponent, angularWidgetRendererFactory, isComponentRenderer, isHtmlRenderer, isTemplateRenderer, ssrWidgetRendererFactory, widgetEventManagerFactoryProvider };
|
|
618
659
|
export type { AngularRendererOptions, CustomWidgetComponent, CustomWidgetHtmlRenderer, CustomWidgetRenderer, CustomWidgetRendererConfig, WidgetEventManagerFactory, WidgetTemplateContext };
|