@rangertechnologies/ngnxt 2.1.83 → 2.1.84

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.
@@ -29,6 +29,9 @@ import { NgSelectModule } from '@ng-select/ng-select';
29
29
  import * as i9$1 from '@angular/material/tooltip';
30
30
  import { MatTooltipModule } from '@angular/material/tooltip';
31
31
  import * as i10 from '@angular/cdk/bidi';
32
+ import * as i4$2 from '@angular/cdk/drag-drop';
33
+ import { moveItemInArray, DragDropModule } from '@angular/cdk/drag-drop';
34
+ import { v4 } from 'uuid';
32
35
 
33
36
  class NxtAppService {
34
37
  constructor() { }
@@ -4278,7 +4281,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
4278
4281
 
4279
4282
  // Changes commented out due to Angular version compatibility; will apply after upgrade.
4280
4283
  // // RS 06JAN2025
4281
- // RS 17JAN2025
4284
+ // RS 17JAN2025
4282
4285
  // An array fontFamilyArr is created containing a list of font family names as strings.
4283
4286
  const fontFamilyArr = ["Roboto", "Roboto Condensed", "Arial", "Verdana", "Tahoma", "Trebuchet MS",
4284
4287
  "Georgia", "Times New Roman", "Courier New", "Palatino Linotype",
@@ -4288,7 +4291,7 @@ const fontFamilyArr = ["Roboto", "Roboto Condensed", "Arial", "Verdana", "Tahoma
4288
4291
  Quill.register('modules/mention', Mention);
4289
4292
  ImageResizor.Quill = Quill;
4290
4293
  Quill.register('modules/imageResizor', ImageResizor);
4291
- // RS 17JAN2025
4294
+ // RS 17JAN2025
4292
4295
  //The Quill font style attributor is imported and it is registered with Quil
4293
4296
  let fonts = Quill.import("attributors/style/font");
4294
4297
  fonts.whitelist = fontFamilyArr;
@@ -4394,13 +4397,28 @@ class CustomRichTextComponent {
4394
4397
  }
4395
4398
  }
4396
4399
  }
4397
- onEditorChange(event) {
4398
- if (event && event.html !== undefined) {
4399
- this.textValueChange.emit(event.html);
4400
- }
4401
- else {
4402
- this.textValueChange.emit('');
4403
- }
4400
+ // onEditorChange(event: any): void {
4401
+ // if (event && event.html !== undefined) {
4402
+ // this.textValueChange.emit(event.html);
4403
+ // } else {
4404
+ // this.textValueChange.emit('');
4405
+ // }
4406
+ // }
4407
+ // onEditorChange(event: any): void {
4408
+ // console.log('Typing detected...', event.html);
4409
+ // if (this.typingTimer) {
4410
+ // clearTimeout(this.typingTimer); // Clear previous timer
4411
+ // }
4412
+ // this.typingTimer = setTimeout(() => {
4413
+ // console.log('Debounced event fired:', event.html);
4414
+ // const newValue = event?.html ? event.html : ''; // Ensure empty values are handled
4415
+ // this.textValueChange.emit(newValue);
4416
+ // }, this.doneTypingInterval);
4417
+ // }
4418
+ onEditorBlur() {
4419
+ // Only emit if we have a value change
4420
+ const currentValue = this.value || '';
4421
+ this.textValueChange.emit(currentValue);
4404
4422
  }
4405
4423
  // Added ngOnDestroy to prevent memory leaks
4406
4424
  ngOnDestroy() {
@@ -4409,11 +4427,11 @@ class CustomRichTextComponent {
4409
4427
  }
4410
4428
  }
4411
4429
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CustomRichTextComponent, deps: [{ token: I18nService }, { token: ChangeService }], target: i0.ɵɵFactoryTarget.Component });
4412
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CustomRichTextComponent, isStandalone: true, selector: "app-custom-rich-text", inputs: { value: "value", placeholder: "placeholder", error: "error", question: "question", rows: "rows", readOnly: "readOnly", minLength: "minLength", maxLength: "maxLength" }, outputs: { textValueChange: "textValueChange" }, ngImport: i0, template: "<!-- RS 06JAN25 -->\r\n<div class=\"rich-text-container\">\r\n <quill-editor\r\n [(ngModel)]=\"value\"\r\n [placeholder]=\"placeholder\"\r\n [modules]=\"quillConfiguration\"\r\n [readOnly]=\"readOnly\"\r\n (onContentChanged)=\"onEditorChange($event)\"\r\n [class.error]=\"error\">\r\n </quill-editor>\r\n <div *ngIf=\"error\" class=\"error-message\">\r\n {{ error }}\r\n </div>\r\n</div>", styles: [".rich-text-container{width:100%;margin:10px 0}.error{border:1px solid red}:is() .ql-editor img{cursor:pointer}:is() .image-resizer{display:block!important;visibility:visible!important}:is() .ql-editor .image-resizer{border:1px dashed #000;position:absolute}:is() .ql-editor .image-resizer .handle{background-color:#000;border:1px solid #fff;border-radius:50%;height:12px;width:12px;position:absolute}quill-editor{width:100%}\n"], dependencies: [{ kind: "component", type: QuillEditorComponent, selector: "quill-editor" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
4430
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CustomRichTextComponent, isStandalone: true, selector: "app-custom-rich-text", inputs: { value: "value", placeholder: "placeholder", error: "error", question: "question", rows: "rows", readOnly: "readOnly", minLength: "minLength", maxLength: "maxLength" }, outputs: { textValueChange: "textValueChange" }, ngImport: i0, template: "<!-- RS 06JAN25 -->\r\n<div class=\"rich-text-container\">\r\n <quill-editor\r\n [(ngModel)]=\"value\"\r\n [placeholder]=\"placeholder\"\r\n [modules]=\"quillConfiguration\"\r\n [readOnly]=\"readOnly\"\r\n (onBlur)=\"onEditorBlur()\"\r\n [class.error]=\"error\">\r\n </quill-editor>\r\n <div *ngIf=\"error\" class=\"error-message\">\r\n {{ error }}\r\n </div>\r\n</div>", styles: [".rich-text-container{width:100%;margin:10px 0}.error{border:1px solid red}:is() .ql-editor img{cursor:pointer}:is() .image-resizer{display:block!important;visibility:visible!important}:is() .ql-editor .image-resizer{border:1px dashed #000;position:absolute}:is() .ql-editor .image-resizer .handle{background-color:#000;border:1px solid #fff;border-radius:50%;height:12px;width:12px;position:absolute}quill-editor{width:100%}\n"], dependencies: [{ kind: "component", type: QuillEditorComponent, selector: "quill-editor" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
4413
4431
  }
4414
4432
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CustomRichTextComponent, decorators: [{
4415
4433
  type: Component,
4416
- args: [{ imports: [QuillEditorComponent, FormsModule, CommonModule], selector: 'app-custom-rich-text', standalone: true, template: "<!-- RS 06JAN25 -->\r\n<div class=\"rich-text-container\">\r\n <quill-editor\r\n [(ngModel)]=\"value\"\r\n [placeholder]=\"placeholder\"\r\n [modules]=\"quillConfiguration\"\r\n [readOnly]=\"readOnly\"\r\n (onContentChanged)=\"onEditorChange($event)\"\r\n [class.error]=\"error\">\r\n </quill-editor>\r\n <div *ngIf=\"error\" class=\"error-message\">\r\n {{ error }}\r\n </div>\r\n</div>", styles: [".rich-text-container{width:100%;margin:10px 0}.error{border:1px solid red}:is() .ql-editor img{cursor:pointer}:is() .image-resizer{display:block!important;visibility:visible!important}:is() .ql-editor .image-resizer{border:1px dashed #000;position:absolute}:is() .ql-editor .image-resizer .handle{background-color:#000;border:1px solid #fff;border-radius:50%;height:12px;width:12px;position:absolute}quill-editor{width:100%}\n"] }]
4434
+ args: [{ imports: [QuillEditorComponent, FormsModule, CommonModule], selector: 'app-custom-rich-text', standalone: true, template: "<!-- RS 06JAN25 -->\r\n<div class=\"rich-text-container\">\r\n <quill-editor\r\n [(ngModel)]=\"value\"\r\n [placeholder]=\"placeholder\"\r\n [modules]=\"quillConfiguration\"\r\n [readOnly]=\"readOnly\"\r\n (onBlur)=\"onEditorBlur()\"\r\n [class.error]=\"error\">\r\n </quill-editor>\r\n <div *ngIf=\"error\" class=\"error-message\">\r\n {{ error }}\r\n </div>\r\n</div>", styles: [".rich-text-container{width:100%;margin:10px 0}.error{border:1px solid red}:is() .ql-editor img{cursor:pointer}:is() .image-resizer{display:block!important;visibility:visible!important}:is() .ql-editor .image-resizer{border:1px dashed #000;position:absolute}:is() .ql-editor .image-resizer .handle{background-color:#000;border:1px solid #fff;border-radius:50%;height:12px;width:12px;position:absolute}quill-editor{width:100%}\n"] }]
4417
4435
  }], ctorParameters: () => [{ type: I18nService }, { type: ChangeService }], propDecorators: { value: [{
4418
4436
  type: Input
4419
4437
  }], placeholder: [{
@@ -10192,6 +10210,809 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
10192
10210
  }]
10193
10211
  }], ctorParameters: () => [{ type: i0.ViewContainerRef }] });
10194
10212
 
10213
+ // AP 22JAN25
10214
+ class FormBuilderService {
10215
+ formElements = [];
10216
+ formElementsSubject = new BehaviorSubject([]);
10217
+ selectedElementSubject = new BehaviorSubject(-1);
10218
+ elementComponent = null;
10219
+ book;
10220
+ formElements$ = this.formElementsSubject.asObservable();
10221
+ selectedElement$ = this.selectedElementSubject.asObservable();
10222
+ unique_id;
10223
+ tempElem;
10224
+ // book: { bookQuestionsMap: { unique_id: { subQuestions: any[]; }; }; };
10225
+ constructor() {
10226
+ // Load saved elements from localStorage
10227
+ const savedFormElements = localStorage.getItem('formElements');
10228
+ if (savedFormElements) {
10229
+ this.formElements = JSON.parse(savedFormElements);
10230
+ this.formElementsSubject.next([...this.formElements]);
10231
+ this.book = JSON.parse(localStorage.getItem('book') || '{}');
10232
+ this.unique_id = localStorage.getItem('unique_id');
10233
+ }
10234
+ }
10235
+ // Get the element component reference
10236
+ getElementComponent() {
10237
+ return this.elementComponent;
10238
+ }
10239
+ setElementComponent(component) {
10240
+ this.elementComponent = component;
10241
+ }
10242
+ // Add a new element to the form
10243
+ addElement(element, parentId = null) {
10244
+ // const savedFormElements = localStorage.getItem('formElements');
10245
+ console.log("aswin", this.formElements.length);
10246
+ if (this.formElements.length == 0) {
10247
+ console.log("savedFormElements", this.formElements);
10248
+ // this.formElements = JSON.parse(savedFormElements);
10249
+ // this.formElementsSubject.next([...this.formElements]);
10250
+ // this.book = JSON.parse(localStorage.getItem('book') || '{}');
10251
+ this.book = {};
10252
+ if (localStorage.getItem('status') == "edit") {
10253
+ this.unique_id = localStorage.getItem('unique_id');
10254
+ this.book = {
10255
+ 'bookQuestionsMap': {
10256
+ [this.unique_id]: {
10257
+ 'subQuestions': []
10258
+ }
10259
+ }
10260
+ };
10261
+ }
10262
+ else {
10263
+ this.unique_id = v4();
10264
+ this.book = {
10265
+ 'bookQuestionsMap': {
10266
+ [this.unique_id]: {
10267
+ 'subQuestions': []
10268
+ }
10269
+ }
10270
+ };
10271
+ }
10272
+ // this.unique_id = uuidv4();
10273
+ localStorage.setItem('book', JSON.stringify(this.book));
10274
+ localStorage.setItem('unique_id', this.unique_id);
10275
+ }
10276
+ this.formElements.push(element);
10277
+ localStorage.setItem('formElements', JSON.stringify(this.formElements));
10278
+ this.formElementsSubject.next([...this.formElements]);
10279
+ }
10280
+ updateElement(index, updates) {
10281
+ const elements = [...this.getElements()];
10282
+ if (elements[index]) {
10283
+ elements[index] = {
10284
+ ...elements[index],
10285
+ ...updates
10286
+ };
10287
+ this.formElementsSubject.next(elements);
10288
+ }
10289
+ if (index >= 0 && index < this.formElements.length) {
10290
+ const updatedElement = {
10291
+ ...this.formElements[index],
10292
+ ...updates
10293
+ };
10294
+ if (updates.required !== undefined) {
10295
+ if (updatedElement.questionText) {
10296
+ const questionText = updatedElement.questionText.replace(/\s*\*+$/, '');
10297
+ updatedElement.questionText = updates.required ? `${questionText} *` : questionText;
10298
+ }
10299
+ }
10300
+ // Handle special cases
10301
+ if (updates.required === true && updatedElement.questionText && !updatedElement.questionText.endsWith('*')) {
10302
+ updatedElement.questionText = `${updatedElement.questionText} *`;
10303
+ }
10304
+ else if (updates.required === false && updatedElement.questionText && updatedElement.questionText.endsWith('*')) {
10305
+ updatedElement.questionText = updatedElement.questionText.slice(0, -2);
10306
+ }
10307
+ this.formElements[index] = updatedElement;
10308
+ this.formElementsSubject.next([...this.formElements]);
10309
+ localStorage.setItem('formElements', JSON.stringify(this.formElements));
10310
+ }
10311
+ }
10312
+ setSelectedElement(index) {
10313
+ this.selectedElementSubject.next(index);
10314
+ }
10315
+ getElements() {
10316
+ return this.formElements;
10317
+ }
10318
+ downloadElement() {
10319
+ console.log("book", this.book);
10320
+ this.book.bookQuestionsMap[this.unique_id].subQuestions = this.formElements;
10321
+ let tempElement = {};
10322
+ this.formElements.forEach((element) => {
10323
+ if (element.type === 'Dropdown' || element.type === 'Radio' || element.type === 'CheckBox') {
10324
+ // Initialize the array if it doesn't exist
10325
+ if (!tempElement[element.id]) {
10326
+ tempElement[element.id] = [];
10327
+ }
10328
+ // Push the current element into the array
10329
+ tempElement[element.id].push(element);
10330
+ }
10331
+ });
10332
+ this.book.bookQuestionsMap[this.unique_id]['sqOptions'] = tempElement;
10333
+ return this.book;
10334
+ }
10335
+ // // Find an element by its ID
10336
+ // findElementById(id: string): FormElement | null {
10337
+ // const findRecursive = (elements: FormElement[]): FormElement | null => {
10338
+ // for (const el of elements) {
10339
+ // if (el.id === id) return el;
10340
+ // if (el.subQuestions) {
10341
+ // const found = findRecursive(el.subQuestions);
10342
+ // if (found) return found;
10343
+ // }
10344
+ // }
10345
+ // return null;
10346
+ // };
10347
+ // return findRecursive(this.formElements);
10348
+ // }
10349
+ // Remove an element by UID
10350
+ // Save elements to localStorage and update the subject
10351
+ removeElementComponent(uid) {
10352
+ this.tempElem = [];
10353
+ this.formElements.forEach((element) => {
10354
+ if (element.uid !== uid) {
10355
+ this.tempElem.push(element);
10356
+ }
10357
+ });
10358
+ this.formElements = this.tempElem;
10359
+ localStorage.setItem('formElements', JSON.stringify(this.formElements));
10360
+ this.formElementsSubject.next([...this.formElements]);
10361
+ }
10362
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormBuilderService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
10363
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormBuilderService, providedIn: 'root' });
10364
+ }
10365
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormBuilderService, decorators: [{
10366
+ type: Injectable,
10367
+ args: [{
10368
+ providedIn: 'root',
10369
+ }]
10370
+ }], ctorParameters: () => [] });
10371
+
10372
+ // AP 22JAN25 - form preview and All form elements
10373
+ class ElementComponent {
10374
+ formBuilderService;
10375
+ elementButtonClicked = new EventEmitter();
10376
+ formContainer;
10377
+ bookletJSON;
10378
+ bookletId;
10379
+ formElements = [];
10380
+ constructor(formBuilderService) {
10381
+ this.formBuilderService = formBuilderService;
10382
+ }
10383
+ ngOnInit() {
10384
+ // Subscribe to the formElements$ observable
10385
+ this.formBuilderService.formElements$.subscribe((elements) => {
10386
+ this.formElements = elements; // Update the local array with the latest data
10387
+ console.log('Form Elements:', this.formElements);
10388
+ });
10389
+ console.log("bookletJSON==" + this.bookletJSON);
10390
+ if (this.bookletJSON) {
10391
+ localStorage.setItem('status', ("edit"));
10392
+ localStorage.setItem('unique_id', (this.bookletId));
10393
+ this.formElements = [];
10394
+ this.bookletJSON.bookQuestionsMap[this.bookletId].subQuestions.forEach(newElement => {
10395
+ this.formBuilderService.addElement(newElement);
10396
+ this.formElements = this.formBuilderService.getElements();
10397
+ });
10398
+ }
10399
+ else {
10400
+ localStorage.setItem('status', ("new"));
10401
+ }
10402
+ }
10403
+ drop(event) {
10404
+ moveItemInArray(this.formElements, event.previousIndex, event.currentIndex);
10405
+ }
10406
+ // Add this method to handle element selection
10407
+ selectElement(index) {
10408
+ this.formBuilderService.setSelectedElement(index);
10409
+ const element = this.formElements[index];
10410
+ this.elementButtonClicked.emit(element.type); // Emit the type when selecting
10411
+ }
10412
+ addElement(type) {
10413
+ const unique_id = v4();
10414
+ const newElement = {
10415
+ id: unique_id,
10416
+ uid: unique_id,
10417
+ name: '',
10418
+ type,
10419
+ questionText: '',
10420
+ question: '',
10421
+ helpText: '',
10422
+ errorMessage: '',
10423
+ isReadOnly: false,
10424
+ isHidden: false,
10425
+ required: false,
10426
+ subText: '',
10427
+ referenceField: '',
10428
+ additionalRichContent: '',
10429
+ groupName: '',
10430
+ isDateBackward: false,
10431
+ title: '',
10432
+ subTitle: '',
10433
+ isDateForward: false,
10434
+ isOptional: false,
10435
+ isTitle: false,
10436
+ nextQuestion: '',
10437
+ allowedFileExtensions: '',
10438
+ questionNumber: this.formBuilderService.getElements().length + 1,
10439
+ questionBookId: '',
10440
+ parentQuestion: '',
10441
+ fieldsMeta: '',
10442
+ recordTypeName: '',
10443
+ recordTypeId: '',
10444
+ trackingId: '',
10445
+ dateText: '',
10446
+ timeText: '',
10447
+ recordId: '',
10448
+ qbReference: '',
10449
+ qbReferenceQuestions: '',
10450
+ questionBookSubTitle: '',
10451
+ style: '',
10452
+ options: type === 'CheckBox' || type === 'Radio' || type === 'Dropdown' ? [
10453
+ { label: 'Option 1', value: '', type: 'text', key: 'option1' },
10454
+ { label: 'Option 2', value: '', type: 'text', key: 'option2' }
10455
+ ] : null,
10456
+ };
10457
+ this.formBuilderService.addElement(newElement);
10458
+ this.formElements = this.formBuilderService.getElements();
10459
+ }
10460
+ addOption(options) {
10461
+ options.push({ label: `Option ${options.length + 1}`, value: '' });
10462
+ }
10463
+ removeOption(options, index) {
10464
+ options.splice(index, 1);
10465
+ }
10466
+ // Remove an element by index
10467
+ removeElement(field, index) {
10468
+ console.log('remove', index);
10469
+ this.formBuilderService.removeElementComponent(field.uid);
10470
+ this.formElements = this.formBuilderService.getElements();
10471
+ }
10472
+ getFontStyles(field) {
10473
+ const styles = {
10474
+ 'font-family': field.font || 'Helvetica Neue',
10475
+ 'font-weight': field.fontWeight || '400',
10476
+ 'width': `${field.width || 980}px`,
10477
+ 'height': `${field.height || 91}px`,
10478
+ 'text-align': field.textAlign || 'left'
10479
+ };
10480
+ // Handle array of style classes
10481
+ if (field.styles && Array.isArray(field.styles)) {
10482
+ if (field.styles.includes('bold')) {
10483
+ styles['font-weight'] = '700';
10484
+ }
10485
+ if (field.styles.includes('italic')) {
10486
+ styles['font-style'] = 'italic';
10487
+ }
10488
+ if (field.styles.includes('underline')) {
10489
+ styles['text-decoration'] = 'underline';
10490
+ }
10491
+ if (field.styles.includes('capitalize')) {
10492
+ styles['text-transform'] = 'capitalize';
10493
+ }
10494
+ if (field.styles.includes('lowercase')) {
10495
+ styles['text-transform'] = 'lowercase';
10496
+ }
10497
+ }
10498
+ return styles;
10499
+ }
10500
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ElementComponent, deps: [{ token: FormBuilderService }], target: i0.ɵɵFactoryTarget.Component });
10501
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ElementComponent, selector: "app-element", inputs: { bookletJSON: "bookletJSON", bookletId: "bookletId" }, outputs: { elementButtonClicked: "elementButtonClicked" }, viewQueries: [{ propertyName: "formContainer", first: true, predicate: ["formContainer"], descendants: true }], ngImport: i0, template: "<!-- AP 22JAN25 - form preview and All form elements -->\r\n<div class=\"center-frame\">\r\n <link href=\"https://fonts.googleapis.com/css?family=Roboto:300,400,500&display=swap\" rel=\"stylesheet\">\r\n <div class=\"box\">\r\n <div class=\"form-preview\" cdkDropList [cdkDropListData]=\"formElements\" (cdkDropListDropped)=\"drop($event)\">\r\n <ng-container *ngFor=\"let field of formElements; let i = index\" getProperties().elementProps>\r\n\r\n <!-- TextBox -->\r\n <div *ngIf=\"field.type === 'Text'\" class=\"\" style=\"padding: 10px;\r\n background-color: whitesmoke;\" (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\" cdkDrag>\r\n <div class=\"flex\" style=\"display: flex;\">\r\n <div class=\"all-dots\"><div *ngFor=\"let _ of [1,2,3,4,5,6,7,8]\"></div></div>\r\n <div style=\"width: 97%;\">\r\n <div class=\"flex lab-conatiner\">\r\n <label [class.required]=\"field.required\">{{ field.questionText ? field.questionText : 'lable' }}</label>\r\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" />\r\n </div>\r\n <input type=\"text\" [placeholder]=\"field.question || 'Enter text'\" [readonly]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\" [(ngModel)]=\"field.text\" />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- CheckBox -->\r\n <div class=\"CheckBox-options\" *ngIf=\"field.type === 'CheckBox'\" cdkDrag (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\">\r\n <span class=\"label-text\">{{ field.questionText }}</span>\r\n <div class=\"checkbox-container\">\r\n <label class=\"option-label\">\r\n <!-- Options Section -->\r\n <div *ngIf=\"field.options?.length > 0\" class=\"options-container\">\r\n <div *ngFor=\"let option of field.options; let i = index\" class=\"option-item\">\r\n <!-- Option Input -->\r\n <input type=\"text\" [(ngModel)]=\"option.label\" placeholder=\"Label\" class=\"option-label\"/>\r\n <input type=\"text\" [(ngModel)]=\"option.value\" placeholder=\"Value\"class=\"option-value\"/>\r\n <!-- Remove Button -->\r\n <button class=\"remove-option-btn\" (click)=\"removeOption(field.options, i)\">\r\n <img src=\"../assets/icons/Trash.svg\" alt=\"Remove Option\" />\r\n </button>\r\n </div>\r\n <!-- Add Option Button -->\r\n <button type=\"button\" class=\"add-option-btn\" (click)=\"addOption(field.options)\">\r\n <span class=\"text-lg\">+</span>\r\n </button>\r\n </div>\r\n </label>\r\n <button class=\"trash-right\" (click)=\"removeElement(field, i)\">\r\n <img src=\"../assets/icons/Trash.svg\" alt=\"Delete\" />\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Dropdown -->\r\n <div *ngIf=\"field.type === 'Dropdown'\" class=\"dropdown-container\" cdkDrag (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\">\r\n <label>{{ field.questionText }}</label>\r\n <select class=\"dropdown-options\"><option *ngFor=\"let option of field.options\" >{{ option }}</option></select>\r\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" />\r\n </div>\r\n\r\n <!-- Calendar -->\r\n <div *ngIf=\"['Calendar'].includes(field.type)\" class=\"calender-container\" cdkDrag (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\">\r\n <label>{{ field.questionText }}</label>\r\n <input type=\"date\" />\r\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" />\r\n </div>\r\n\r\n <!-- Email -->\r\n <div *ngIf=\"field.type === 'Email'\" class=\"email-container\" cdkDrag (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\">\r\n <label>{{ field.questionText }}</label>\r\n <input type=\"email\" [placeholder]=\"field.question || 'Enter text'\" [readonly]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\" />\r\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" />\r\n </div>\r\n\r\n <!-- Numbers -->\r\n <div *ngIf=\"field.type === 'Numbers'\" class=\"numbers-container\" cdkDrag (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\">\r\n <label>{{ field.questionText }}</label>\r\n <input type=\"number\" [placeholder]=\"field.question || 'Enter text'\" [readonly]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\" />\r\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" />\r\n </div>\r\n\r\n <!-- List -->\r\n <div *ngIf=\"field.type === 'List'\" class=\"list-container\" cdkDrag (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\">\r\n <label>{{ field.questionText }}</label>\r\n <ul><li *ngFor=\"let item of field.items\">{{ item }}</li></ul>\r\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" />\r\n </div>\r\n\r\n <!-- TextArea -->\r\n <div *ngIf=\"field.type === 'TextArea'\" class=\"textarea-container\" cdkDrag (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\">\r\n <label [class.required]=\"field.required\">{{ field.questionText }}<span *ngIf=\"field.required\" class=\"text-red-500\">*</span></label>\r\n <textarea [placeholder]=\"field.question || 'Enter text'\" [style.height.px]=\"field.size\" [readonly]=\"field.readOnly\" [class.hidden]=\"field.isHide\"></textarea>\r\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" />\r\n </div>\r\n\r\n\r\n <!-- Radio -->\r\n <div *ngIf=\"field.type === 'Radio'\" class=\"Radio-options\" cdkDrag (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\">\r\n <label>{{ field.questionText }}</label>\r\n <div *ngFor=\"let option of field.options\" class=\"radio-item\">\r\n <label><input type=\"radio\" name=\"{{ field.questionText }}\" /><span>{{ option }}</span></label>\r\n </div>\r\n <button class=\"delete-btn2\" (click)=\"removeElement(field, i)\"><img src=\"../assets/icons/Trash.svg\" alt=\"Delete\" /></button>\r\n </div>\r\n\r\n <!-- Image -->\r\n <div *ngIf=\"field.type === 'Image'\" class=\"image-container\" cdkDrag (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\">\r\n <label>{{ field.questionText }}</label>\r\n <input type=\"file\" accept=\"image/*\" />\r\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" />\r\n </div>\r\n\r\n <!-- Button -->\r\n <div *ngIf=\"field.type === 'Button'\" class=\"button-container\" cdkDrag (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\">\r\n <button>{{ field.questionText }}</button>\r\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" />\r\n </div>\r\n\r\n <!-- File -->\r\n <div *ngIf=\"field.type === 'File'\" class=\"file-field-container\" cdkDrag (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\" [ngStyle]=\"getFontStyles(field)\">\r\n <label>{{ field.questionText }}</label>\r\n <input type=\"file\" />\r\n <img class=\"trash-right\" src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" />\r\n </div>\r\n\r\n<!-- Tables -->\r\n<div *ngIf=\"field.type === 'Tables'\" class=\"table-container\" cdkDrag (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\">\r\n <label>{{ field.questionText }}</label>\r\n <table [style.width.px]=\"field.colWidth\" [style.height.%]=\"field.rowHeight\">\r\n <thead><tr><th *ngFor=\"let header of field.headers\" [style.width.px]=\"field.colWidth / field.colNos\">{{ header }}</th></tr></thead>\r\n <tbody><tr *ngFor=\"let row of field.rows\"><td *ngFor=\"let cell of row\">{{ cell }}</td></tr></tbody>\r\n </table>\r\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" />\r\n</div>\r\n\r\n\r\n <!-- Book -->\r\n <div *ngIf=\"field.type === 'Book'\" class=\"calender-container\" cdkDrag (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\">\r\n <label>{{ field.questionText }}</label>\r\n <input type=\"text\" placeholder=\"Enter book title\" />\r\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field,i)\">\r\n </div>\r\n\r\n <!-- Label -->\r\n <div *ngIf=\"field.type === 'Label'\" class=\"calender-container\" cdkDrag (click)=\"selectElement(i)\" >\r\n <label>{{ field.questionText }}</label>\r\n <input type=\"Label\" />\r\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field,i)\">\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Form Builder Section All Elements -->\r\n <div class=\"form-builder\">\r\n <div class=\"element\" (click)=\"addElement('Calendar')\">\r\n <img class=\"calendar-img\" src=\"../assets/icons/Calendar.svg\">\r\n <div class=\"hover-label\">Calendar</div>\r\n </div>\r\n\r\n <div class=\"element\" (click)=\"addElement('CheckBox')\">\r\n <img src=\"../assets/icons/CheckBox.svg\">\r\n <div class=\"hover-label\">Check Box</div>\r\n </div>\r\n\r\n <div class=\"element\" (click)=\"addElement('Email')\">\r\n <img src=\"../assets/icons/Email.svg\">\r\n <div class=\"hover-label\">Email</div>\r\n </div>\r\n\r\n <div class=\"element\" (click)=\"addElement('File')\">\r\n <img src=\"../assets/icons/File.svg\">\r\n <div class=\"hover-label\">File</div>\r\n </div>\r\n\r\n <div class=\"element\" (click)=\"addElement('List')\">\r\n <img src=\"../assets/icons/List.svg\">\r\n <div class=\"hover-label\">List</div>\r\n </div>\r\n\r\n <div class=\"element\" (click)=\"addElement('Tables')\">\r\n <img src=\"../assets/icons/Table.svg\">\r\n <div class=\"hover-label\">Tables</div>\r\n </div>\r\n\r\n <div class=\"element\" (click)=\"addElement('Text')\">\r\n <img src=\"../assets/icons/Text.svg\">\r\n <div class=\"hover-label\">Text Box</div>\r\n </div>\r\n\r\n <div class=\"element\" (click)=\"addElement('TextArea')\">\r\n <img src=\"../assets/icons/TextArea.svg\">\r\n <div class=\"hover-label\">Text Area</div>\r\n </div>\r\n\r\n <div class=\"element\" (click)=\"addElement('Numbers')\">\r\n <img src=\"../assets/icons/Number.svg\">\r\n <div class=\"hover-label\">Numbers</div>\r\n </div>\r\n\r\n <div class=\"element\" (click)=\"addElement('Dropdown')\">\r\n <img src=\"../assets/icons/Drop.svg\">\r\n <div class=\"hover-label\">Dropdown</div>\r\n </div>\r\n\r\n <div class=\"element\" (click)=\"addElement('Image')\">\r\n <img src=\"../assets/Image.svg\">\r\n <div class=\"hover-label\">Image</div>\r\n </div>\r\n\r\n <div class=\"element\" (click)=\"addElement('Radio')\">\r\n <img src=\"../assets/icons/Radio.svg\">\r\n <div class=\"hover-label\">Radio</div>\r\n </div>\r\n\r\n <div class=\"element\" (click)=\"addElement('Label')\">\r\n <img src=\"../assets/icons/Label.svg\">\r\n <div class=\"hover-label\">Label</div>\r\n </div>\r\n\r\n <div class=\"element\" (click)=\"addElement('Book')\">\r\n <img src=\"../assets/icons/Book.svg\">\r\n <div class=\"hover-label\">Book</div>\r\n </div>\r\n\r\n <div class=\"element\" (click)=\"addElement('Button')\">\r\n <img src=\"../assets/icons/Button.svg\">\r\n <div class=\"hover-label\">Button</div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</div>\r\n\r\n", styles: [".center-frame{position:absolute;top:68px;right:24%;width:71%;padding:26px;box-sizing:border-box;background-color:#edf1f5}.box{box-sizing:border-box}.inner-border{box-sizing:border-box;height:39rem;border-radius:10px}.form-builder{display:flex;flex-wrap:wrap;gap:3px;justify-content:center;position:relative;right:6px;bottom:91px;width:78%;height:46px;margin:auto;box-shadow:0 2px 4px #888;border-top:none;border-radius:8px;background-color:#fff}.element{position:relative;text-align:center;cursor:pointer;padding:7px;color:#94a3b8;width:49px;height:44px;border-radius:6px;transition:background-color .3s,color .3s}.element:hover{background-color:#3374f2;color:#fff;border-radius:5px}.calendar-img{position:relative;top:-6px}.element img:hover{color:#fff}.hover-label{display:none;position:absolute;top:-30px;left:50%;transform:translate(-50%);background-color:#233859;color:#fff;padding:4px 8px;font-size:12px;border-radius:4px;white-space:nowrap}.element:hover .hover-label{display:block}.form-preview{margin-top:0;padding:16px;height:39rem;overflow-y:auto;border-radius:8px;background-color:#fff;display:flex;flex-wrap:wrap;gap:10px}.form-preview[cdkDropListOrientation=vertical]{flex-direction:column}.form-preview[cdkDropListOrientation=horizontal]{flex-direction:row}.textbox-container,.CheckBox-options,.dropdown-container,.date-container{margin-bottom:10px}.lab-conatiner{justify-content:space-between;display:flex}.all-dots{display:grid;gap:9px 0px;grid-template-columns:auto auto;width:18px;margin-top:15px;margin-right:10px}.all-dots>div{height:5px;width:4px;background-color:#bbb;border-radius:50%}.all-dots1{display:grid;gap:9px 0px;grid-template-columns:auto auto;width:18px;position:relative;top:93px;right:5px;margin-bottom:-19px}.all-dots1>div{height:5px;width:4px;background-color:#bbb;border-radius:50%}.textbox-container label{flex-grow:1}.trash-right{width:28px;position:relative;background-color:#f5ebea;height:27px;border-radius:50px}.trash-right img{position:relative;left:23%;top:3px}.table-container{overflow-x:auto}.textbox-container{display:flex;flex-direction:column;gap:10px;align-items:flex-start;margin:10px auto;background-color:#f6f6f6;padding:10px 15px;border-radius:5px;box-shadow:0 1px 3px #0000001a;position:relative}.textbox-container label{font-size:14px;width:100px;color:#15234b;margin-bottom:5px;display:block;position:relative;left:27px;top:-12px}.textbox-container input[type=text]{width:95%;height:40px;padding:0 0 0 10px;font-size:14px;border:none;border-radius:5px;background-color:#fff;color:#333;position:absolute;left:40px;top:39px}.textbox-container input[type=text]::placeholder{color:#b8bcca;font-style:italic}.textbox-container input[type=text]:hover,.textbox-container input[type=text]:focus{outline:none;border:1px solid #15234b;box-shadow:0 0 5px #15234b4d}.textbox-container .remove-icon{position:relative;top:-40px;right:-17px;font-size:18px;color:#ff4d4d;cursor:pointer;transition:transform .2s,color .2s}.textbox-container .remove-icon:hover{transform:scale(1.2);color:#d11a2a}.table-container{width:100%;max-width:600px;margin:20px auto;background-color:#d9d9d9;padding:15px;height:47%;border-radius:5px;box-shadow:0 1px 3px #0000001a}.table-container label{font-size:16px;font-weight:700;color:#15234b;margin-bottom:10px;display:block;width:200px;position:relative;top:-53px;left:21px}table{width:557px;height:90%;position:relative;left:20px;top:-58px;border-collapse:collapse;margin-top:10px;text-align:left}table th{background-color:#e4881e;color:#fff;padding:10px;font-size:14px;text-transform:uppercase}table thead{height:38px}table td{background-color:#fff;color:#333;padding:10px;font-size:14px;border:1px solid #ddd}table tbody tr:nth-child(2n) td{background-color:#f9f9f9}table tbody tr:hover td{background-color:#f1f1f1;transition:background-color .2s ease-in-out}.trash-right1{width:28px;position:relative;top:-233px;left:96%;background-color:#d7bbc3;height:27px;border-radius:50px}.trash-right1 img{position:relative;left:23%;top:4px}.file-field-container{display:flex;flex-direction:column;align-items:flex-start;gap:10px;padding:11px;border:none;border-radius:8px;background-color:#f6f6f6;width:47%;height:98px;position:relative}.file-field-container label{font-size:14px;color:#333;margin-bottom:-1px;position:relative;left:26px}.file-field-container input[type=file]{width:95%;padding:10px;font-size:14px;position:relative;left:22px;border-radius:5px;background-color:#fff;cursor:pointer;box-shadow:0 2px 4px #0000001a;transition:border-color .3s ease,box-shadow .3s ease}.file-field-container input[type=file]:hover,.file-field-container input[type=file]:focus{border-color:#007bff;box-shadow:0 0 4px #007bff80;outline:none}.file-field-container img{width:20px;height:20px;cursor:pointer;position:absolute;top:10px;right:10px;opacity:.7;transition:opacity .3s ease}.file-field-container img:hover{opacity:1}.email-comtainer{display:flex;flex-direction:column;align-items:flex-start;gap:10px;padding:11px;border:none;border-radius:8px;background-color:#f6f6f6;width:47%;height:98px;position:relative}.email-comtainer input[type=email]{width:95%;padding:10px;font-size:14px;border:none;position:relative;left:22px;border-radius:5px;background-color:#fff;cursor:pointer;box-shadow:0 2px 4px #0000001a;transition:border-color .3s ease,box-shadow .3s ease}.email-comtainer img{width:20px;height:20px;cursor:pointer;position:absolute;top:10px;right:10px;opacity:.7;transition:opacity .3s ease}.email-comtainer label{font-size:14px;color:#333;margin-bottom:-1px;position:relative;left:26px}.dropdown-container{display:flex;flex-direction:column;align-items:flex-start;gap:10px;padding:11px;border:none;border-radius:8px;background-color:#f6f6f6;width:47%;height:98px;position:relative}.dropdown-container img{width:20px;height:20px;cursor:pointer;position:absolute;top:10px;right:10px;opacity:.7;transition:opacity .3s ease}.dropdown-container label{font-size:14px;color:#333;margin-bottom:-1px;position:relative;left:26px}.dropdown-options{width:94%;position:relative;left:25px;height:100px;border-radius:5px;border:none}.CheckBox-options{display:flex;flex-direction:column;gap:10px;height:94px;width:45%;padding:10px;background-color:#f6f6f6;border-radius:8px;box-shadow:0 2px 4px #0000001a}.checkbox-container{display:flex;align-items:center;justify-content:space-between;padding:8px;border-radius:6px;background-color:#fff;position:relative;right:-25px;width:94%}.label-text{width:93px;position:relative;left:27px}.option-label{display:flex;align-items:center;gap:10px;position:relative;top:5px;left:10px;font-size:14px;font-weight:500;color:gray;width:83px}.option-label input[type=checkbox]{width:18px;height:18px;accent-color:#007bff;cursor:pointer}.label-text{margin-left:5px}.option-value{position:relative;left:113px;top:-19px}.add-option-btn{position:absolute;top:5px;left:273px;border:none}.remove-option-btn{position:absolute;top:4px;left:310px;border:none}.delete-btn1{position:relative;top:-39px;left:18px;background:none;border:none;cursor:pointer;padding:5px;display:flex;align-items:center;justify-content:center}.delete-btn1 img{width:18px;height:18px}.Radio-options{display:flex;flex-direction:column;padding:10px;background-color:#f6f6f6;height:94px;width:45%;border-radius:8px;box-shadow:0 2px 4px #0000001a}.radio-container{display:flex;flex-direction:column;position:relative;top:1px;right:-26px;width:94%;height:43px;padding:10px;border-radius:6px;background-color:#fff}.radio-label{font-size:14px;color:#000;margin-bottom:8px;width:104px;height:21px;position:relative;left:31px}.radio-group{display:flex;gap:20px}.radio-item{display:flex;align-items:center}.option-label{display:flex;align-items:center;gap:8px;font-size:14px;font-weight:500;color:#333}.option-label input[type=radio]{width:18px;height:18px;accent-color:#007bff;cursor:pointer}.radio-text{margin-left:5px}.delete-btn2{position:relative;top:-33px;left:374px;width:24px;background:none;border:none;cursor:pointer;padding:5px;display:flex;align-items:center;justify-content:center;transition:transform .2s ease-in-out}.delete-btn2 img{width:18px;height:18px}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4$2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i4$2.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }] });
10502
+ }
10503
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ElementComponent, decorators: [{
10504
+ type: Component,
10505
+ args: [{ selector: 'app-element', template: "<!-- AP 22JAN25 - form preview and All form elements -->\r\n<div class=\"center-frame\">\r\n <link href=\"https://fonts.googleapis.com/css?family=Roboto:300,400,500&display=swap\" rel=\"stylesheet\">\r\n <div class=\"box\">\r\n <div class=\"form-preview\" cdkDropList [cdkDropListData]=\"formElements\" (cdkDropListDropped)=\"drop($event)\">\r\n <ng-container *ngFor=\"let field of formElements; let i = index\" getProperties().elementProps>\r\n\r\n <!-- TextBox -->\r\n <div *ngIf=\"field.type === 'Text'\" class=\"\" style=\"padding: 10px;\r\n background-color: whitesmoke;\" (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\" cdkDrag>\r\n <div class=\"flex\" style=\"display: flex;\">\r\n <div class=\"all-dots\"><div *ngFor=\"let _ of [1,2,3,4,5,6,7,8]\"></div></div>\r\n <div style=\"width: 97%;\">\r\n <div class=\"flex lab-conatiner\">\r\n <label [class.required]=\"field.required\">{{ field.questionText ? field.questionText : 'lable' }}</label>\r\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" />\r\n </div>\r\n <input type=\"text\" [placeholder]=\"field.question || 'Enter text'\" [readonly]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\" [(ngModel)]=\"field.text\" />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- CheckBox -->\r\n <div class=\"CheckBox-options\" *ngIf=\"field.type === 'CheckBox'\" cdkDrag (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\">\r\n <span class=\"label-text\">{{ field.questionText }}</span>\r\n <div class=\"checkbox-container\">\r\n <label class=\"option-label\">\r\n <!-- Options Section -->\r\n <div *ngIf=\"field.options?.length > 0\" class=\"options-container\">\r\n <div *ngFor=\"let option of field.options; let i = index\" class=\"option-item\">\r\n <!-- Option Input -->\r\n <input type=\"text\" [(ngModel)]=\"option.label\" placeholder=\"Label\" class=\"option-label\"/>\r\n <input type=\"text\" [(ngModel)]=\"option.value\" placeholder=\"Value\"class=\"option-value\"/>\r\n <!-- Remove Button -->\r\n <button class=\"remove-option-btn\" (click)=\"removeOption(field.options, i)\">\r\n <img src=\"../assets/icons/Trash.svg\" alt=\"Remove Option\" />\r\n </button>\r\n </div>\r\n <!-- Add Option Button -->\r\n <button type=\"button\" class=\"add-option-btn\" (click)=\"addOption(field.options)\">\r\n <span class=\"text-lg\">+</span>\r\n </button>\r\n </div>\r\n </label>\r\n <button class=\"trash-right\" (click)=\"removeElement(field, i)\">\r\n <img src=\"../assets/icons/Trash.svg\" alt=\"Delete\" />\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Dropdown -->\r\n <div *ngIf=\"field.type === 'Dropdown'\" class=\"dropdown-container\" cdkDrag (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\">\r\n <label>{{ field.questionText }}</label>\r\n <select class=\"dropdown-options\"><option *ngFor=\"let option of field.options\" >{{ option }}</option></select>\r\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" />\r\n </div>\r\n\r\n <!-- Calendar -->\r\n <div *ngIf=\"['Calendar'].includes(field.type)\" class=\"calender-container\" cdkDrag (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\">\r\n <label>{{ field.questionText }}</label>\r\n <input type=\"date\" />\r\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" />\r\n </div>\r\n\r\n <!-- Email -->\r\n <div *ngIf=\"field.type === 'Email'\" class=\"email-container\" cdkDrag (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\">\r\n <label>{{ field.questionText }}</label>\r\n <input type=\"email\" [placeholder]=\"field.question || 'Enter text'\" [readonly]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\" />\r\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" />\r\n </div>\r\n\r\n <!-- Numbers -->\r\n <div *ngIf=\"field.type === 'Numbers'\" class=\"numbers-container\" cdkDrag (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\">\r\n <label>{{ field.questionText }}</label>\r\n <input type=\"number\" [placeholder]=\"field.question || 'Enter text'\" [readonly]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\" />\r\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" />\r\n </div>\r\n\r\n <!-- List -->\r\n <div *ngIf=\"field.type === 'List'\" class=\"list-container\" cdkDrag (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\">\r\n <label>{{ field.questionText }}</label>\r\n <ul><li *ngFor=\"let item of field.items\">{{ item }}</li></ul>\r\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" />\r\n </div>\r\n\r\n <!-- TextArea -->\r\n <div *ngIf=\"field.type === 'TextArea'\" class=\"textarea-container\" cdkDrag (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\">\r\n <label [class.required]=\"field.required\">{{ field.questionText }}<span *ngIf=\"field.required\" class=\"text-red-500\">*</span></label>\r\n <textarea [placeholder]=\"field.question || 'Enter text'\" [style.height.px]=\"field.size\" [readonly]=\"field.readOnly\" [class.hidden]=\"field.isHide\"></textarea>\r\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" />\r\n </div>\r\n\r\n\r\n <!-- Radio -->\r\n <div *ngIf=\"field.type === 'Radio'\" class=\"Radio-options\" cdkDrag (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\">\r\n <label>{{ field.questionText }}</label>\r\n <div *ngFor=\"let option of field.options\" class=\"radio-item\">\r\n <label><input type=\"radio\" name=\"{{ field.questionText }}\" /><span>{{ option }}</span></label>\r\n </div>\r\n <button class=\"delete-btn2\" (click)=\"removeElement(field, i)\"><img src=\"../assets/icons/Trash.svg\" alt=\"Delete\" /></button>\r\n </div>\r\n\r\n <!-- Image -->\r\n <div *ngIf=\"field.type === 'Image'\" class=\"image-container\" cdkDrag (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\">\r\n <label>{{ field.questionText }}</label>\r\n <input type=\"file\" accept=\"image/*\" />\r\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" />\r\n </div>\r\n\r\n <!-- Button -->\r\n <div *ngIf=\"field.type === 'Button'\" class=\"button-container\" cdkDrag (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\">\r\n <button>{{ field.questionText }}</button>\r\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" />\r\n </div>\r\n\r\n <!-- File -->\r\n <div *ngIf=\"field.type === 'File'\" class=\"file-field-container\" cdkDrag (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\" [ngStyle]=\"getFontStyles(field)\">\r\n <label>{{ field.questionText }}</label>\r\n <input type=\"file\" />\r\n <img class=\"trash-right\" src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" />\r\n </div>\r\n\r\n<!-- Tables -->\r\n<div *ngIf=\"field.type === 'Tables'\" class=\"table-container\" cdkDrag (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\">\r\n <label>{{ field.questionText }}</label>\r\n <table [style.width.px]=\"field.colWidth\" [style.height.%]=\"field.rowHeight\">\r\n <thead><tr><th *ngFor=\"let header of field.headers\" [style.width.px]=\"field.colWidth / field.colNos\">{{ header }}</th></tr></thead>\r\n <tbody><tr *ngFor=\"let row of field.rows\"><td *ngFor=\"let cell of row\">{{ cell }}</td></tr></tbody>\r\n </table>\r\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" />\r\n</div>\r\n\r\n\r\n <!-- Book -->\r\n <div *ngIf=\"field.type === 'Book'\" class=\"calender-container\" cdkDrag (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\">\r\n <label>{{ field.questionText }}</label>\r\n <input type=\"text\" placeholder=\"Enter book title\" />\r\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field,i)\">\r\n </div>\r\n\r\n <!-- Label -->\r\n <div *ngIf=\"field.type === 'Label'\" class=\"calender-container\" cdkDrag (click)=\"selectElement(i)\" >\r\n <label>{{ field.questionText }}</label>\r\n <input type=\"Label\" />\r\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field,i)\">\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Form Builder Section All Elements -->\r\n <div class=\"form-builder\">\r\n <div class=\"element\" (click)=\"addElement('Calendar')\">\r\n <img class=\"calendar-img\" src=\"../assets/icons/Calendar.svg\">\r\n <div class=\"hover-label\">Calendar</div>\r\n </div>\r\n\r\n <div class=\"element\" (click)=\"addElement('CheckBox')\">\r\n <img src=\"../assets/icons/CheckBox.svg\">\r\n <div class=\"hover-label\">Check Box</div>\r\n </div>\r\n\r\n <div class=\"element\" (click)=\"addElement('Email')\">\r\n <img src=\"../assets/icons/Email.svg\">\r\n <div class=\"hover-label\">Email</div>\r\n </div>\r\n\r\n <div class=\"element\" (click)=\"addElement('File')\">\r\n <img src=\"../assets/icons/File.svg\">\r\n <div class=\"hover-label\">File</div>\r\n </div>\r\n\r\n <div class=\"element\" (click)=\"addElement('List')\">\r\n <img src=\"../assets/icons/List.svg\">\r\n <div class=\"hover-label\">List</div>\r\n </div>\r\n\r\n <div class=\"element\" (click)=\"addElement('Tables')\">\r\n <img src=\"../assets/icons/Table.svg\">\r\n <div class=\"hover-label\">Tables</div>\r\n </div>\r\n\r\n <div class=\"element\" (click)=\"addElement('Text')\">\r\n <img src=\"../assets/icons/Text.svg\">\r\n <div class=\"hover-label\">Text Box</div>\r\n </div>\r\n\r\n <div class=\"element\" (click)=\"addElement('TextArea')\">\r\n <img src=\"../assets/icons/TextArea.svg\">\r\n <div class=\"hover-label\">Text Area</div>\r\n </div>\r\n\r\n <div class=\"element\" (click)=\"addElement('Numbers')\">\r\n <img src=\"../assets/icons/Number.svg\">\r\n <div class=\"hover-label\">Numbers</div>\r\n </div>\r\n\r\n <div class=\"element\" (click)=\"addElement('Dropdown')\">\r\n <img src=\"../assets/icons/Drop.svg\">\r\n <div class=\"hover-label\">Dropdown</div>\r\n </div>\r\n\r\n <div class=\"element\" (click)=\"addElement('Image')\">\r\n <img src=\"../assets/Image.svg\">\r\n <div class=\"hover-label\">Image</div>\r\n </div>\r\n\r\n <div class=\"element\" (click)=\"addElement('Radio')\">\r\n <img src=\"../assets/icons/Radio.svg\">\r\n <div class=\"hover-label\">Radio</div>\r\n </div>\r\n\r\n <div class=\"element\" (click)=\"addElement('Label')\">\r\n <img src=\"../assets/icons/Label.svg\">\r\n <div class=\"hover-label\">Label</div>\r\n </div>\r\n\r\n <div class=\"element\" (click)=\"addElement('Book')\">\r\n <img src=\"../assets/icons/Book.svg\">\r\n <div class=\"hover-label\">Book</div>\r\n </div>\r\n\r\n <div class=\"element\" (click)=\"addElement('Button')\">\r\n <img src=\"../assets/icons/Button.svg\">\r\n <div class=\"hover-label\">Button</div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</div>\r\n\r\n", styles: [".center-frame{position:absolute;top:68px;right:24%;width:71%;padding:26px;box-sizing:border-box;background-color:#edf1f5}.box{box-sizing:border-box}.inner-border{box-sizing:border-box;height:39rem;border-radius:10px}.form-builder{display:flex;flex-wrap:wrap;gap:3px;justify-content:center;position:relative;right:6px;bottom:91px;width:78%;height:46px;margin:auto;box-shadow:0 2px 4px #888;border-top:none;border-radius:8px;background-color:#fff}.element{position:relative;text-align:center;cursor:pointer;padding:7px;color:#94a3b8;width:49px;height:44px;border-radius:6px;transition:background-color .3s,color .3s}.element:hover{background-color:#3374f2;color:#fff;border-radius:5px}.calendar-img{position:relative;top:-6px}.element img:hover{color:#fff}.hover-label{display:none;position:absolute;top:-30px;left:50%;transform:translate(-50%);background-color:#233859;color:#fff;padding:4px 8px;font-size:12px;border-radius:4px;white-space:nowrap}.element:hover .hover-label{display:block}.form-preview{margin-top:0;padding:16px;height:39rem;overflow-y:auto;border-radius:8px;background-color:#fff;display:flex;flex-wrap:wrap;gap:10px}.form-preview[cdkDropListOrientation=vertical]{flex-direction:column}.form-preview[cdkDropListOrientation=horizontal]{flex-direction:row}.textbox-container,.CheckBox-options,.dropdown-container,.date-container{margin-bottom:10px}.lab-conatiner{justify-content:space-between;display:flex}.all-dots{display:grid;gap:9px 0px;grid-template-columns:auto auto;width:18px;margin-top:15px;margin-right:10px}.all-dots>div{height:5px;width:4px;background-color:#bbb;border-radius:50%}.all-dots1{display:grid;gap:9px 0px;grid-template-columns:auto auto;width:18px;position:relative;top:93px;right:5px;margin-bottom:-19px}.all-dots1>div{height:5px;width:4px;background-color:#bbb;border-radius:50%}.textbox-container label{flex-grow:1}.trash-right{width:28px;position:relative;background-color:#f5ebea;height:27px;border-radius:50px}.trash-right img{position:relative;left:23%;top:3px}.table-container{overflow-x:auto}.textbox-container{display:flex;flex-direction:column;gap:10px;align-items:flex-start;margin:10px auto;background-color:#f6f6f6;padding:10px 15px;border-radius:5px;box-shadow:0 1px 3px #0000001a;position:relative}.textbox-container label{font-size:14px;width:100px;color:#15234b;margin-bottom:5px;display:block;position:relative;left:27px;top:-12px}.textbox-container input[type=text]{width:95%;height:40px;padding:0 0 0 10px;font-size:14px;border:none;border-radius:5px;background-color:#fff;color:#333;position:absolute;left:40px;top:39px}.textbox-container input[type=text]::placeholder{color:#b8bcca;font-style:italic}.textbox-container input[type=text]:hover,.textbox-container input[type=text]:focus{outline:none;border:1px solid #15234b;box-shadow:0 0 5px #15234b4d}.textbox-container .remove-icon{position:relative;top:-40px;right:-17px;font-size:18px;color:#ff4d4d;cursor:pointer;transition:transform .2s,color .2s}.textbox-container .remove-icon:hover{transform:scale(1.2);color:#d11a2a}.table-container{width:100%;max-width:600px;margin:20px auto;background-color:#d9d9d9;padding:15px;height:47%;border-radius:5px;box-shadow:0 1px 3px #0000001a}.table-container label{font-size:16px;font-weight:700;color:#15234b;margin-bottom:10px;display:block;width:200px;position:relative;top:-53px;left:21px}table{width:557px;height:90%;position:relative;left:20px;top:-58px;border-collapse:collapse;margin-top:10px;text-align:left}table th{background-color:#e4881e;color:#fff;padding:10px;font-size:14px;text-transform:uppercase}table thead{height:38px}table td{background-color:#fff;color:#333;padding:10px;font-size:14px;border:1px solid #ddd}table tbody tr:nth-child(2n) td{background-color:#f9f9f9}table tbody tr:hover td{background-color:#f1f1f1;transition:background-color .2s ease-in-out}.trash-right1{width:28px;position:relative;top:-233px;left:96%;background-color:#d7bbc3;height:27px;border-radius:50px}.trash-right1 img{position:relative;left:23%;top:4px}.file-field-container{display:flex;flex-direction:column;align-items:flex-start;gap:10px;padding:11px;border:none;border-radius:8px;background-color:#f6f6f6;width:47%;height:98px;position:relative}.file-field-container label{font-size:14px;color:#333;margin-bottom:-1px;position:relative;left:26px}.file-field-container input[type=file]{width:95%;padding:10px;font-size:14px;position:relative;left:22px;border-radius:5px;background-color:#fff;cursor:pointer;box-shadow:0 2px 4px #0000001a;transition:border-color .3s ease,box-shadow .3s ease}.file-field-container input[type=file]:hover,.file-field-container input[type=file]:focus{border-color:#007bff;box-shadow:0 0 4px #007bff80;outline:none}.file-field-container img{width:20px;height:20px;cursor:pointer;position:absolute;top:10px;right:10px;opacity:.7;transition:opacity .3s ease}.file-field-container img:hover{opacity:1}.email-comtainer{display:flex;flex-direction:column;align-items:flex-start;gap:10px;padding:11px;border:none;border-radius:8px;background-color:#f6f6f6;width:47%;height:98px;position:relative}.email-comtainer input[type=email]{width:95%;padding:10px;font-size:14px;border:none;position:relative;left:22px;border-radius:5px;background-color:#fff;cursor:pointer;box-shadow:0 2px 4px #0000001a;transition:border-color .3s ease,box-shadow .3s ease}.email-comtainer img{width:20px;height:20px;cursor:pointer;position:absolute;top:10px;right:10px;opacity:.7;transition:opacity .3s ease}.email-comtainer label{font-size:14px;color:#333;margin-bottom:-1px;position:relative;left:26px}.dropdown-container{display:flex;flex-direction:column;align-items:flex-start;gap:10px;padding:11px;border:none;border-radius:8px;background-color:#f6f6f6;width:47%;height:98px;position:relative}.dropdown-container img{width:20px;height:20px;cursor:pointer;position:absolute;top:10px;right:10px;opacity:.7;transition:opacity .3s ease}.dropdown-container label{font-size:14px;color:#333;margin-bottom:-1px;position:relative;left:26px}.dropdown-options{width:94%;position:relative;left:25px;height:100px;border-radius:5px;border:none}.CheckBox-options{display:flex;flex-direction:column;gap:10px;height:94px;width:45%;padding:10px;background-color:#f6f6f6;border-radius:8px;box-shadow:0 2px 4px #0000001a}.checkbox-container{display:flex;align-items:center;justify-content:space-between;padding:8px;border-radius:6px;background-color:#fff;position:relative;right:-25px;width:94%}.label-text{width:93px;position:relative;left:27px}.option-label{display:flex;align-items:center;gap:10px;position:relative;top:5px;left:10px;font-size:14px;font-weight:500;color:gray;width:83px}.option-label input[type=checkbox]{width:18px;height:18px;accent-color:#007bff;cursor:pointer}.label-text{margin-left:5px}.option-value{position:relative;left:113px;top:-19px}.add-option-btn{position:absolute;top:5px;left:273px;border:none}.remove-option-btn{position:absolute;top:4px;left:310px;border:none}.delete-btn1{position:relative;top:-39px;left:18px;background:none;border:none;cursor:pointer;padding:5px;display:flex;align-items:center;justify-content:center}.delete-btn1 img{width:18px;height:18px}.Radio-options{display:flex;flex-direction:column;padding:10px;background-color:#f6f6f6;height:94px;width:45%;border-radius:8px;box-shadow:0 2px 4px #0000001a}.radio-container{display:flex;flex-direction:column;position:relative;top:1px;right:-26px;width:94%;height:43px;padding:10px;border-radius:6px;background-color:#fff}.radio-label{font-size:14px;color:#000;margin-bottom:8px;width:104px;height:21px;position:relative;left:31px}.radio-group{display:flex;gap:20px}.radio-item{display:flex;align-items:center}.option-label{display:flex;align-items:center;gap:8px;font-size:14px;font-weight:500;color:#333}.option-label input[type=radio]{width:18px;height:18px;accent-color:#007bff;cursor:pointer}.radio-text{margin-left:5px}.delete-btn2{position:relative;top:-33px;left:374px;width:24px;background:none;border:none;cursor:pointer;padding:5px;display:flex;align-items:center;justify-content:center;transition:transform .2s ease-in-out}.delete-btn2 img{width:18px;height:18px}\n"] }]
10506
+ }], ctorParameters: () => [{ type: FormBuilderService }], propDecorators: { elementButtonClicked: [{
10507
+ type: Output
10508
+ }], formContainer: [{
10509
+ type: ViewChild,
10510
+ args: ['formContainer']
10511
+ }], bookletJSON: [{
10512
+ type: Input
10513
+ }], bookletId: [{
10514
+ type: Input
10515
+ }] } });
10516
+
10517
+ class PropertiesComponent {
10518
+ http;
10519
+ formBuilderService;
10520
+ // selectedElement: any;
10521
+ colorWheel;
10522
+ ctx;
10523
+ selectedOption = '';
10524
+ selectedElementIndex = -1;
10525
+ // @Input() selectedElement: any;
10526
+ selectedElementType = '';
10527
+ selectedAlign = 'align-left'; // Add this property
10528
+ selectedStyles = []; // Using array since multiple styles can be selected
10529
+ errorMessage = '';
10530
+ selectedElement = null; // Receive the selected element
10531
+ onToggleChange(property, event) {
10532
+ const value = event.target.checked;
10533
+ if (this.selectedElement) {
10534
+ const update = { [property]: value };
10535
+ this.formBuilderService.updateElement(this.selectedElementIndex, update);
10536
+ // Update the selected element directly for immediate UI feedback
10537
+ this.selectedElement[property] = value;
10538
+ }
10539
+ }
10540
+ updateProperties(elementType) {
10541
+ // Reset alignment and styles if switching elements
10542
+ this.selectedAlign = 'align-left';
10543
+ this.selectedStyles = [];
10544
+ // Fetch the properties of the selected element type
10545
+ const properties = this.getProperties();
10546
+ if (properties) {
10547
+ // Make sure the properties are dynamically updated
10548
+ }
10549
+ }
10550
+ onAlignSelect(value) {
10551
+ if (this.selectedElement) {
10552
+ this.selectedElement.textAlign = value;
10553
+ console.log(`Selected alignment: ${value}`);
10554
+ }
10555
+ }
10556
+ onStyleSelect(value) {
10557
+ if (!this.selectedElement)
10558
+ return;
10559
+ // Initialize styles array if it doesn't exist
10560
+ this.selectedElement.styles = this.selectedElement.styles || [];
10561
+ // Ensure only one style is selected at a time
10562
+ this.selectedElement.styles = [value];
10563
+ console.log('Updated styles:', this.selectedElement.styles);
10564
+ }
10565
+ isStyleActive(value) {
10566
+ return this.selectedElement?.styles?.includes(value) || false;
10567
+ }
10568
+ elementProperties = {
10569
+ // Add other element types here similarly
10570
+ 'Text': {
10571
+ elementProps: [
10572
+ // questionText - Label-follow all element properties
10573
+ { label: 'Label', placeholder: 'Enter Text ', type: 'text', key: 'questionText' },
10574
+ // question - Placeholder-follow all element properties
10575
+ { label: 'placeholder', placeholder: 'Enter Text', type: 'text', key: 'question' },
10576
+ { label: 'Help Text', placeholder: 'Enter Text ', type: 'text', key: 'helpText' },
10577
+ { label: '', type: 'toggleGroup' },
10578
+ // errorMessage - Error Msg-follow all element properties
10579
+ { label: 'Error Msg', placeholder: 'Enter Text ', type: 'text', key: 'errorMsg' },
10580
+ { label: 'Font', type: 'select', key: 'font',
10581
+ options: ['Helvetica Neue', 'Arial', 'Times New Roman', 'Roboto'] },
10582
+ { label: 'Weight', type: 'select', key: 'fontWeight',
10583
+ options: [
10584
+ { value: '400', label: '400-Normal' },
10585
+ { value: '500', label: '500-Medium' },
10586
+ { value: '600', label: '600-Semi Bold' },
10587
+ { value: '700', label: '700-Bold' }
10588
+ ] },
10589
+ // { label: 'Size', unit: 'PX', type: 'number', key: 'size' },
10590
+ { label: 'Align', type: 'align', key: 'textAlign',
10591
+ options: [
10592
+ { value: 'left', icon: 'textalign-left' },
10593
+ { value: 'center', icon: 'align-center' },
10594
+ { value: 'right', icon: 'align-right' },
10595
+ { value: 'justifyleft', icon: 'align-justifyleft' },
10596
+ { value: 'justifyright', icon: 'align-justifyright' }
10597
+ ] },
10598
+ { label: 'Style', type: 'style', key: 'styles',
10599
+ options: [
10600
+ { value: 'italic', icon: 'italic' },
10601
+ { value: 'bold', icon: 'bold' },
10602
+ { value: 'underline', icon: 'underline' },
10603
+ { value: 'texticon', icon: 'texticon' },
10604
+ { value: 'capitalize', icon: 'capitalize' },
10605
+ { value: 'resize', icon: 'resize' }
10606
+ ] },
10607
+ { label: 'Field Size', type: 'fieldSize', key: 'fieldSize' }
10608
+ ],
10609
+ fieldProps: [
10610
+ { label: 'Field Required', type: 'radio' },
10611
+ { label: 'Default Value', placeholder: 'Enter Text ', type: 'text', key: 'defaultValue' },
10612
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text' },
10613
+ { label: 'Style', placeholder: 'Style JSON', type: 'text' },
10614
+ { label: 'Sub Text', placeholder: 'Enter Text ', type: 'text' }
10615
+ ]
10616
+ },
10617
+ 'CheckBox': {
10618
+ elementProps: [
10619
+ { label: 'Label', placeholder: 'Enter Text ', type: 'text', key: 'questionText' },
10620
+ { label: 'Place Holder', placeholder: 'Enter Text ', type: 'text', key: 'question' },
10621
+ { label: 'Help Text', placeholder: 'Enter Text ', type: 'text', key: 'helpText' },
10622
+ { label: '', type: 'toggleGroup' },
10623
+ { label: 'Field Size', type: 'fieldSize', key: 'fieldSize' },
10624
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMsg' },
10625
+ ],
10626
+ fieldProps: [
10627
+ { label: 'Field Required', type: 'radio' },
10628
+ { label: 'Default Value', placeholder: 'Enter Text', type: 'text' },
10629
+ {
10630
+ label: 'Chk Options',
10631
+ type: 'optionsGroup',
10632
+ key: 'chkOptions',
10633
+ options: [
10634
+ { label: 'Option 1', value: '', type: 'text', key: 'option1' },
10635
+ ],
10636
+ addOptionLabel: 'Add Variant', // Text for the plus icon
10637
+ icon: 'plus' // Icon for adding options
10638
+ },
10639
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text' },
10640
+ { label: 'Style', placeholder: 'Style JSON', type: 'text' },
10641
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text' }
10642
+ ]
10643
+ },
10644
+ 'Calendar': {
10645
+ elementProps: [
10646
+ { label: 'Label', placeholder: 'Enter Text', type: 'text', key: 'questionText' },
10647
+ { label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'question' },
10648
+ { label: 'Help Text', placeholder: 'Enter Text', type: 'text', key: 'helpText' },
10649
+ { label: '', type: 'toggleGroup' },
10650
+ { label: 'Field Size', type: 'fieldSize', key: 'fieldSize' },
10651
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMsg' },
10652
+ ],
10653
+ fieldProps: [
10654
+ { label: 'Field Required', type: 'radio' },
10655
+ { label: 'Default Value', placeholder: 'Enter Text', type: 'text' },
10656
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text' },
10657
+ { label: 'Style', placeholder: 'Style JSON', type: 'text' },
10658
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text' }
10659
+ ]
10660
+ },
10661
+ 'Time': {
10662
+ elementProps: [
10663
+ { label: 'Label', placeholder: 'Enter Text', type: 'text', key: 'label' },
10664
+ { label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'placeholder' },
10665
+ { label: 'Help Text', placeholder: 'Enter Text', type: 'text', key: 'helpText' },
10666
+ { label: '', type: 'toggleGroup' },
10667
+ { label: 'Field Size', type: 'fieldSize', key: 'fieldSize' },
10668
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMsg' },
10669
+ ],
10670
+ fieldProps: [
10671
+ { label: 'Field Required', type: 'radio' },
10672
+ { label: 'Default Value', placeholder: 'Enter Text', type: 'text' },
10673
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text' },
10674
+ { label: 'Style', placeholder: 'Style JSON', type: 'text' },
10675
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text' }
10676
+ ]
10677
+ },
10678
+ 'Email': {
10679
+ elementProps: [
10680
+ { label: 'Label', placeholder: 'Enter Text', type: 'text', key: 'questionText' },
10681
+ { label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'question' },
10682
+ { label: 'Help Text', placeholder: 'Enter Text', type: 'text', key: 'helpText' },
10683
+ { label: '', type: 'toggleGroup' },
10684
+ { label: 'Field Size', type: 'fieldSize', key: 'fieldSize' },
10685
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMsg' },
10686
+ ],
10687
+ fieldProps: [
10688
+ { label: 'Field Required', type: 'radio' },
10689
+ { label: 'Default Value', placeholder: 'Enter Text', type: 'text' },
10690
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text' },
10691
+ { label: 'Style', placeholder: 'Style JSON', type: 'text' },
10692
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text' }
10693
+ ]
10694
+ },
10695
+ 'File': {
10696
+ elementProps: [
10697
+ { label: 'Label', placeholder: 'Enter Text', type: 'text', key: 'questionText' },
10698
+ { label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'question' },
10699
+ { label: 'Help Text', placeholder: 'Enter Text', type: 'text', key: 'helpText' },
10700
+ { label: 'Support Type', type: 'select', key: 'supportType', options: [
10701
+ { label: 'Images (JPEG, PNG, GIF)', value: 'image/*', extensions: ['.jpg', '.jpeg', '.png', '.gif'] },
10702
+ { label: 'Audio (MP3, WAV, AIFF)', value: 'audio/*', extensions: ['.mp3', '.wav', '.aiff'] },
10703
+ { label: 'Video (MP4, AVI, HEVC)', value: 'video/*', extensions: ['.mp4', '.avi', '.hevc'] },
10704
+ { label: 'Documents (DOC, DOCX, PPT, PDF)', value: 'application/pdf,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/vnd.ms-powerpoint', extensions: ['.doc', '.docx', '.ppt', '.pdf'] },
10705
+ { label: 'Executables (EXE, BAD, SH)', value: 'application/x-msdownload,application/x-sh', extensions: ['.exe', '.bad', '.sh'] },
10706
+ { label: 'Archives (ZIP, RAR, Git-hub)', value: 'application/zip,application/x-rar-compressed,application/x-git', extensions: ['.zip', '.rar', '.git'] }
10707
+ ] },
10708
+ { label: '', type: 'toggleGroup' },
10709
+ { label: 'Field Size', type: 'fieldSize', key: 'fieldSize' },
10710
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMsg' },
10711
+ ],
10712
+ fieldProps: [
10713
+ { label: 'Field Required', type: 'radio' },
10714
+ { label: 'Default Value', placeholder: 'Enter Text', type: 'text' },
10715
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text' },
10716
+ { label: 'Style', placeholder: 'Style JSON', type: 'text' },
10717
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text' }
10718
+ ]
10719
+ },
10720
+ 'List': {
10721
+ elementProps: [
10722
+ { label: 'Label', placeholder: 'Enter Text', type: 'text', key: 'questionText' },
10723
+ { label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'question' },
10724
+ { label: 'Help Text', placeholder: 'Enter Text', type: 'text', key: 'helpText' },
10725
+ { label: '', type: 'toggleGroup' },
10726
+ { label: 'Field Size', type: 'fieldSize', key: 'fieldSize' },
10727
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMsg' },
10728
+ ],
10729
+ fieldProps: [
10730
+ { label: 'Field Required', type: 'radio' },
10731
+ { label: 'Default Value', placeholder: 'Enter Text', type: 'text' },
10732
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text' },
10733
+ { label: 'Style', placeholder: 'Style JSON', type: 'text' },
10734
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text' }
10735
+ ]
10736
+ }, 'TextArea': {
10737
+ elementProps: [
10738
+ { label: 'Label', placeholder: 'Enter Text', type: 'text', key: 'questionText' },
10739
+ { label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'question' },
10740
+ { label: 'Help Text', placeholder: 'Enter Text', type: 'text', key: 'helpText' },
10741
+ { label: '', type: 'toggleGroup' },
10742
+ { label: 'Field Size', type: 'fieldSize', key: 'fieldSize' },
10743
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMsg' },
10744
+ ],
10745
+ fieldProps: [
10746
+ { label: 'Field Required', type: 'radio', key: 'required' },
10747
+ { label: 'Default Value', placeholder: 'Enter Text', type: 'text', key: 'defaultValue' },
10748
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text' },
10749
+ { label: 'Style', placeholder: 'Style JSON', type: 'text' },
10750
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text' }
10751
+ ]
10752
+ }, 'Numbers': {
10753
+ elementProps: [
10754
+ { label: 'Label', placeholder: 'Enter Text', type: 'text', key: 'questionText' },
10755
+ { label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'question' },
10756
+ { label: 'Help Text', placeholder: 'Enter Text', type: 'text', key: 'helpText' },
10757
+ { label: '', type: 'toggleGroup' },
10758
+ { label: 'Field Size', type: 'fieldSize', key: 'fieldSize' },
10759
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMsg' },
10760
+ ],
10761
+ fieldProps: [
10762
+ { label: 'Field Required', type: 'radio' },
10763
+ { label: 'Default Value', placeholder: 'Enter Text', type: 'text' },
10764
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text' },
10765
+ { label: 'Style', placeholder: 'Style JSON', type: 'text' },
10766
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text' }
10767
+ ]
10768
+ }, 'Dropdown': {
10769
+ elementProps: [
10770
+ { label: 'Label', placeholder: 'Enter Text', type: 'text', key: 'questionText' },
10771
+ { label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'question' },
10772
+ { label: 'Help Text', placeholder: 'Enter Text', type: 'text', key: 'helpText' },
10773
+ { label: '', type: 'toggleGroup' },
10774
+ { label: 'Field Size', type: 'fieldSize', key: 'fieldSize' },
10775
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMsg' },
10776
+ ],
10777
+ fieldProps: [
10778
+ { label: 'Field Required', type: 'radio' },
10779
+ { label: 'Default Value', placeholder: 'Enter Text', type: 'text' },
10780
+ {
10781
+ label: 'Chk Options',
10782
+ type: 'optionsGroup',
10783
+ key: 'chkOptions',
10784
+ options: [
10785
+ { label: 'Option 1', value: '', type: 'text', key: 'option1' },
10786
+ ],
10787
+ addOptionLabel: 'Add Variant', // Text for the plus icon
10788
+ icon: 'plus' // Icon for adding options
10789
+ },
10790
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text' },
10791
+ { label: 'Style', placeholder: 'Style JSON', type: 'text' },
10792
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text' },
10793
+ ]
10794
+ }, 'Image': {
10795
+ elementProps: [
10796
+ { label: 'Label', placeholder: 'Enter Text', type: 'text', key: 'questionText' },
10797
+ { label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'question' },
10798
+ { label: 'Help Text', placeholder: 'Enter Text', type: 'text', key: 'helpText' },
10799
+ { label: '', type: 'toggleGroup' },
10800
+ { label: 'Field Size', type: 'fieldSize', key: 'fieldSize' },
10801
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMsg' },
10802
+ ],
10803
+ fieldProps: [
10804
+ { label: 'Field Required', type: 'radio' },
10805
+ { label: 'Default Value', placeholder: 'Enter Text', type: 'text' },
10806
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text' },
10807
+ { label: 'Style', placeholder: 'Style JSON', type: 'text' },
10808
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text' }
10809
+ ]
10810
+ }, 'Radio': {
10811
+ elementProps: [
10812
+ { label: 'Label', placeholder: 'Enter Text', type: 'text', key: 'questionText' },
10813
+ { label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'question' },
10814
+ { label: 'Help Text', placeholder: 'Enter Text', type: 'text', key: 'helpText' },
10815
+ { label: '', type: 'toggleGroup' },
10816
+ { label: 'Field Size', type: 'fieldSize', key: 'fieldSize' },
10817
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMsg' },
10818
+ ],
10819
+ fieldProps: [
10820
+ { label: 'Field Required', type: 'radio' },
10821
+ { label: 'Default Value', placeholder: 'Enter Text', type: 'text' },
10822
+ {
10823
+ label: 'Radio Options', // Updated label to reflect radio context
10824
+ type: 'optionsGroup',
10825
+ key: 'radioOptions', // Updated key for radio context
10826
+ options: [
10827
+ { label: 'Option 1', value: '', type: 'text', key: 'option1' },
10828
+ { label: 'Option 2', value: '', type: 'text', key: 'option2' },
10829
+ ],
10830
+ addOptionLabel: 'Add Option', // Updated label for add button
10831
+ icon: 'plus', // Icon for adding options
10832
+ },
10833
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text' },
10834
+ { label: 'Style', placeholder: 'Style JSON', type: 'text' },
10835
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text' },
10836
+ ]
10837
+ },
10838
+ 'Book': {
10839
+ elementProps: [
10840
+ { label: 'Label', placeholder: 'Enter Text', type: 'text', key: 'questionText' },
10841
+ { label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'question' },
10842
+ { label: 'Help Text', placeholder: 'Enter Text', type: 'text', key: 'helpText' },
10843
+ { label: '', type: 'toggleGroup' },
10844
+ { label: 'Field Size', type: 'fieldSize', key: 'fieldSize' },
10845
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMsg' },
10846
+ ],
10847
+ fieldProps: [
10848
+ { label: 'Field Required', type: 'radio' },
10849
+ { label: 'Default Value', placeholder: 'Enter Text', type: 'text' },
10850
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text' },
10851
+ { label: 'Style', placeholder: 'Style JSON', type: 'text' },
10852
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text' }
10853
+ ]
10854
+ }, 'Button': {
10855
+ elementProps: [
10856
+ { label: 'Label', placeholder: 'Enter Text', type: 'text', key: 'questionText' },
10857
+ { label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'question' },
10858
+ { label: 'Help Text', placeholder: 'Enter Text', type: 'text', key: 'helpText' },
10859
+ { label: '', type: 'toggleGroup' },
10860
+ { label: 'Field Size', type: 'fieldSize', key: 'fieldSize' },
10861
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMsg' },
10862
+ ],
10863
+ fieldProps: [
10864
+ { label: 'Field Required', type: 'radio' },
10865
+ { label: 'Default Value', placeholder: 'Enter Text', type: 'text' },
10866
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text' },
10867
+ { label: 'Style', placeholder: 'Style JSON', type: 'text' },
10868
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text' }
10869
+ ]
10870
+ },
10871
+ };
10872
+ constructor(http, formBuilderService) {
10873
+ this.http = http;
10874
+ this.formBuilderService = formBuilderService;
10875
+ }
10876
+ ngOnInit() {
10877
+ this.formBuilderService.selectedElement$.subscribe(index => {
10878
+ this.selectedElementIndex = index;
10879
+ if (index >= 0) {
10880
+ const elements = this.formBuilderService.getElements();
10881
+ console.log('Selected element:', elements);
10882
+ this.selectedElement = elements[index];
10883
+ }
10884
+ });
10885
+ }
10886
+ validateInput(value, type) {
10887
+ if (type === 'label' || type === 'placeholder') {
10888
+ const regex = /^[a-zA-Z0-9\s]*$/;
10889
+ if (!regex.test(value)) {
10890
+ this.errorMessage = 'Only letters and numbers are allowed';
10891
+ return false;
10892
+ }
10893
+ }
10894
+ this.errorMessage = '';
10895
+ return true;
10896
+ }
10897
+ updateProperty(key, value) {
10898
+ if (this.selectedElementIndex >= 0) {
10899
+ if (key === 'questionText' || key === 'question') {
10900
+ if (!this.validateInput(value, key)) {
10901
+ return;
10902
+ }
10903
+ }
10904
+ if (key === 'fontWeight') {
10905
+ // Extract just the number value from the option
10906
+ value = value.split('-')[0];
10907
+ }
10908
+ if (key === 'styles') {
10909
+ const currentStyles = this.selectedElement.styles || [];
10910
+ if (value === 'capitalize' || value === 'lowercase') {
10911
+ // Remove the opposite case if it exists
10912
+ const oppositeStyle = value === 'capitalize' ? 'lowercase' : 'capitalize';
10913
+ const filteredStyles = currentStyles.filter(s => s !== oppositeStyle);
10914
+ value = currentStyles.includes(value)
10915
+ ? filteredStyles.filter(s => s !== value)
10916
+ : [...filteredStyles, value];
10917
+ }
10918
+ else {
10919
+ // Toggle other styles
10920
+ value = currentStyles.includes(value)
10921
+ ? currentStyles.filter(s => s !== value)
10922
+ : [...currentStyles, value];
10923
+ }
10924
+ }
10925
+ const update = { [key]: value };
10926
+ this.formBuilderService.updateElement(this.selectedElementIndex, update);
10927
+ // Special handling for font and font weight
10928
+ if (key === 'font') {
10929
+ this.selectedElement.font = value; // Directly update the selected element's font property
10930
+ }
10931
+ }
10932
+ }
10933
+ onRequiredChange(value) {
10934
+ if (this.selectedElement) {
10935
+ // Remove any existing asterisks first
10936
+ let label = this.selectedElement.label.replace(/\s*\*+$/, '');
10937
+ if (value) {
10938
+ label = `${label} *`; // Add single asterisk
10939
+ }
10940
+ this.updateProperty('label', label);
10941
+ this.updateProperty('required', value);
10942
+ }
10943
+ }
10944
+ getProperties() {
10945
+ if (!this.selectedElement)
10946
+ return null;
10947
+ return this.elementProperties[this.selectedElement.type];
10948
+ }
10949
+ // openColorPicker(propertyKey: string) {
10950
+ // // If you want to use the browser's native color picker:
10951
+ // const input = document.createElement('input');
10952
+ // input.type = 'color';
10953
+ // input.value = this.selectedElement[propertyKey];
10954
+ // input.addEventListener('change', (e: any) => {
10955
+ // this.updateProperty(propertyKey, e.target.value);
10956
+ // });
10957
+ // input.click();
10958
+ // }
10959
+ // Function to add a new option to prop options
10960
+ addOption(options) {
10961
+ options.push({ label: '', value: '' });
10962
+ }
10963
+ // Function to remove an option from prop options
10964
+ removeOption(options, index) {
10965
+ options.splice(index, 1);
10966
+ }
10967
+ download() {
10968
+ console.log('Question Book:', this.formBuilderService.downloadElement());
10969
+ }
10970
+ save() {
10971
+ const apiURL = 'https://dev-api.rangerfusion.com/nxt/';
10972
+ this.http.post(apiURL, this.formBuilderService.downloadElement()).subscribe((response) => {
10973
+ console.log('Response:', response);
10974
+ }, (error) => {
10975
+ console.error('Error:', error);
10976
+ });
10977
+ }
10978
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PropertiesComponent, deps: [{ token: i1$1.HttpClient }, { token: FormBuilderService }], target: i0.ɵɵFactoryTarget.Component });
10979
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: PropertiesComponent, selector: "app-properties", inputs: { selectedElementType: "selectedElementType" }, viewQueries: [{ propertyName: "colorWheel", first: true, predicate: ["colorWheel"], descendants: true }], ngImport: i0, template: "<!-- AP 22JAN25 - Field and Element Properties -->\r\n<!-- properties.component.html -->\r\n<div class=\"container\">\r\n <link href=\"https://fonts.googleapis.com/css?family=Roboto:300,400,500&display=swap\" rel=\"stylesheet\">\r\n<!-- Design Header Section -->\r\n<div class=\"design-header\">\r\n <h1 class=\"header-title\">Element Properties</h1>\r\n <div class=\"menu-container\">\r\n <div class=\"menu-item\" (click)=\"download()\">\r\n <span >Download</span>\r\n </div>\r\n <div class=\"menu-item\">\r\n <span>Start</span>\r\n </div>\r\n <div class=\"menu-item\">\r\n <span>Path</span>\r\n </div>\r\n <div class=\"menu-item\">\r\n <span>Clone</span>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- properties.component.html -->\r\n<div class=\"all-properties\">\r\n <div *ngIf=\"errorMessage\" class=\"error-message\">\r\n {{ errorMessage }}\r\n </div>\r\n <!-- Element Properties -->\r\n <details class=\"first-properties\" open>\r\n <summary class=\"text-sm \">Elements Properties</summary>\r\n <div class=\"inner-content\" *ngIf=\"getProperties()\">\r\n <ng-container *ngFor=\"let prop of getProperties().elementProps\">\r\n <div class=\"flex-items-center\">\r\n <label class=\"text-sm\">{{ prop.label }}</label>\r\n <div class=\"label-properties\">\r\n <!-- Text Input -->\r\n <input *ngIf=\"prop.type === 'text'\"\r\n type=\"text\"\r\n [placeholder]=\"prop.placeholder\"\r\n [value]=\"selectedElement[prop.key]\"\r\n (input)=\"updateProperty(prop.key, $event.target.value)\"\r\n [class.read-only]=\"selectedElement.readOnly\"\r\n [readonly]=\"selectedElement.readOnly\"\r\n class=\"text-sm1 \"\r\n />\r\n <div *ngIf=\"prop.key === 'helpText' && selectedElement.helpText\" class=\"help-text\">\r\n {{ selectedElement.helpText }}\r\n </div>\r\n\r\n\r\n <!-- Font Selection -->\r\n<div *ngIf=\"prop.key === 'font'\" class=\"font-selection\">\r\n <!-- <label>{{ prop.label }}</label> -->\r\n <select\r\n *ngIf=\"prop.type === 'select' && prop.key === 'font'\"\r\n class=\"font-selection1\"\r\n [value]=\"selectedElement?.font\"\r\n (change)=\"updateProperty('font', $event.target.value)\">\r\n <option *ngFor=\"let option of prop.options\" [value]=\"option\">\r\n {{ option }}\r\n </option>\r\n </select>\r\n</div>\r\n\r\n<!-- file -->\r\n<!-- Add this inside the elementProps loop where other inputs are rendered -->\r\n<select *ngIf=\"prop.type === 'select' && prop.key === 'supportType'\"\r\n class=\"file \"\r\n[value]=\"selectedElement[prop.key]\"\r\n(change)=\"updateProperty(prop.key, $event.target.value)\">\r\n<option value=\"\">Select file category</option>\r\n<option *ngFor=\"let option of prop.options\" [value]=\"option.value\">\r\n{{ option.label }}\r\n</option>\r\n</select>\r\n\r\n<!-- Font Weight Selection -->\r\n<div *ngIf=\"prop.key === 'fontWeight'\" class=\"font-weight\">\r\n <!-- <label>{{ prop.label }}</label> -->\r\n <select\r\n *ngIf=\"prop.type === 'select' && prop.key === 'fontWeight'\"\r\n class=\"font-weight1 \"\r\n [value]=\"selectedElement?.fontWeight\"\r\n (change)=\"updateProperty('fontWeight', $event.target.value)\">\r\n <option *ngFor=\"let option of prop.options\" [value]=\"option.value\">\r\n {{ option.label }}\r\n </option>\r\n </select>\r\n</div>\r\n\r\n <!-- Number Input with Unit -->\r\n <div *ngIf=\"prop.type === 'number'\" class=\"size-controls\">\r\n <div class=\"size-input-group\">\r\n <input\r\n type=\"number\"\r\n [value]=\"selectedElement[prop.key]\"\r\n (input)=\"updateProperty(prop.key, $event.target.value)\"\r\n [min]=\"prop.min || 1\"\r\n [max]=\"prop.max || 999999\"\r\n class=\"size-value\"\r\n />\r\n <span class=\"size-unit\">{{ prop.unit }}</span>\r\n </div>\r\n </div>\r\n\r\n <!-- Toggle Group -->\r\n<!-- Toggle Group -->\r\n<div *ngIf=\"prop.type === 'toggleGroup'\" class=\"toggle-group\">\r\n<div class=\"toggle-item1\">\r\n <span class=\"toggle-label\">Read Only</span>\r\n <label class=\"switch\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"selectedElement?.readOnly\"\r\n (change)=\"onToggleChange('readOnly', $event)\"\r\n />\r\n <span class=\"slider\"></span>\r\n </label>\r\n</div>\r\n\r\n<div class=\"toggle-item2\">\r\n <span class=\"toggle-label\">Is Hide</span>\r\n <label class=\"switch\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"selectedElement?.isHide\"\r\n (change)=\"onToggleChange('isHide', $event)\"\r\n />\r\n <span class=\"slider\"></span>\r\n </label>\r\n</div>\r\n</div>\r\n\r\n <!-- Text Align Buttons -->\r\n <div *ngIf=\"prop.type === 'align'\"class=\"font-align\">\r\n <button\r\n *ngFor=\"let option of prop.options\"\r\n (click)=\"onAlignSelect(option.value)\"\r\n [class.active]=\"selectedElement?.textAlign === option.value\"\r\n class=\"align-btn\"\r\n [title]=\"option.value\"\r\n >\r\n <img\r\n [src]=\"'../assets/icons/' + option.icon + '.svg'\"\r\n [alt]=\"option.value\"\r\n class=\"icon-size\"\r\n />\r\n </button>\r\n </div>\r\n\r\n\r\n <div *ngIf=\"prop.key === 'size'\" class=\"size-controls\">\r\n <label>{{ prop.label }}</label>\r\n <input\r\n type=\"number\"\r\n [value]=\"selectedElement[prop.key]\"\r\n (input)=\"updateProperty(prop.key, $event.target.value)\"\r\n class=\"size-input\"\r\n />\r\n <span class=\"size-unit\">{{ prop.unit }}</span>\r\n </div>\r\n\r\n\r\n <div *ngIf=\"prop.type === 'style'\" class=\"font-style\">\r\n <button\r\n *ngFor=\"let option of prop.options\"\r\n (click)=\"onStyleSelect(option.value)\"\r\n [class.active]=\"isStyleActive(option.value)\"\r\n class=\"style-btn\"\r\n [title]=\"option.value\"\r\n >\r\n <img\r\n [src]=\"'../assets/icons/' + option.icon + '.svg'\"\r\n [alt]=\"option.value\"\r\n class=\"icon-size\"\r\n />\r\n </button>\r\n </div>\r\n\r\n<!-- Field Size Controls -->\r\n<div *ngIf=\"prop.key === 'fieldSize'\" class=\"field-size-controls\">\r\n <div class=\"size-group\">\r\n <label class=\"size-label\">Width</label>\r\n <div class=\"value-container\">\r\n <input\r\n type=\"number\"\r\n [value]=\"selectedElement?.width\"\r\n (input)=\"updateProperty('width', $event.target.value)\"\r\n class=\"size-input\"\r\n\r\n />\r\n <span class=\"unit\">PX</span>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"prop.key === 'fieldSize'\" class=\"field-size-controls\">\r\n <div class=\"size-group\">\r\n <label class=\"size-label\">Height</label>\r\n <div class=\"value-container\">\r\n <input\r\n type=\"number\"\r\n [value]=\"selectedElement?.height\"\r\n (input)=\"updateProperty('height', $event.target.value)\"\r\n class=\"size-input\"\r\n />\r\n <span class=\"unit\">PX</span>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </details>\r\n\r\n <!-- Field Elements Properties -->\r\n<details class=\"second-property\">\r\n <summary class=\"text-font-medium\">Field Elements Properties</summary>\r\n <div class=\"space-y-4\" *ngIf=\"getProperties()\">\r\n <ng-container *ngFor=\"let prop of getProperties().fieldProps\">\r\n <div class=\"flex-items-center \">\r\n <label class=\"text-sm\">{{ prop.label }}</label>\r\n <div class=\"input-box-field\">\r\n <!-- Input Box -->\r\n <input\r\n *ngIf=\"prop.type === 'text'\"\r\n type=\"text\"\r\n [placeholder]=\"prop.placeholder\"\r\n class=\"field-input\"\r\n />\r\n <!-- Radio Group -->\r\n<div *ngIf=\"prop.type === 'radio'\" class=\"radio-item\">\r\n\r\n\r\n <div class=\"sizes\">\r\n <div class=\"flex-gap\">\r\n <div class=\"flex-items\">\r\n <input\r\n type=\"radio\"\r\n [checked]=\"selectedElement.required\"\r\n (change)=\"onRequiredChange(true)\"\r\n name=\"required\"\r\n class=\"radio-input\"\r\n />\r\n <label\r\n class=\"text-label\"\r\n >\r\n Required\r\n </label>\r\n </div>\r\n <div class=\"flex-items\">\r\n <input\r\n type=\"radio\"\r\n [checked]=\"!selectedElement.required\"\r\n (change)=\"onRequiredChange(false)\"\r\n name=\"required\"\r\n class=\"radio-input\"\r\n />\r\n <label\r\n class=\"text-sm text-gray-400\"\r\n >\r\n Not Required\r\n </label>\r\n </div>\r\n </div>\r\n</div>\r\n</div>\r\n <!-- Chk Options Group -->\r\n <div *ngIf=\"prop.type === 'optionsGroup'\" class=\"options-container\">\r\n <div\r\n *ngFor=\"let option of prop.options; let i = index\"\r\n class=\"option-items\"\r\n >\r\n <!-- Option Input -->\r\n <input\r\n type=\"text\"\r\n [(ngModel)]=\"prop.options[i].label\"\r\n placeholder=\"Option {{ i + 1 }}\"\r\n class=\"options\"\r\n />\r\n <input\r\n type=\"text\"\r\n [(ngModel)]=\"prop.options[i].value\"\r\n placeholder=\"Value\"\r\n class=\"values\"\r\n />\r\n <!-- Remove Button -->\r\n <div class=\"remove\">\r\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeOption(prop.options, i)\"></div>\r\n </div>\r\n <!-- Add Button -->\r\n <button\r\n type=\"button\"\r\n class=\"add-btn\"\r\n (click)=\"addOption(prop.options)\"\r\n >\r\n <div class=\"add-varient\">\r\n <span class=\"text-lg\">+</span>\r\n <span>Add Variants</span></div>\r\n </button>\r\n</div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"design-footer\">\r\n <button class=\"btn\">Cancel</button>\r\n <button class=\"btn\" (click)=\"save()\">Save</button>\r\n </div>\r\n</details>\r\n</div>\r\n\r\n\r\n</div>\r\n", styles: [".container{position:absolute;right:0;width:25%;top:70px}.all-properties{padding:0;margin:-32px -13px 0 0;background-color:#f8fafc;position:relative;top:3px;max-height:549px;overflow-y:auto}.first-properties{padding-top:16px;padding-left:15px}details summary{font-weight:700;color:#1b1b43;cursor:pointer}details[open] summary{padding-bottom:5px;margin-bottom:1rem}label{flex:0 0 120px;color:#b8b8b8;font-size:.875rem;font-weight:500;margin:0;padding:0}input,select{flex:1;background-color:#eaedf1;color:#bebfbf;border-radius:.375rem;padding:.5rem;font-size:.875rem;width:100%;box-sizing:border-box;transition:border-color .2s}input:focus,select:focus{border-color:#1b1b43;outline:none}button{background-color:#eaedf1;color:#6b7280;border:1px solid #D1D5DB;border-radius:.375rem;padding:.5rem;cursor:pointer;transition:all .2s}button:hover{background-color:#e5e7eb}button.selected{background-color:#0b1f34;color:#fff;border-color:#1e90ff}.color-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:50px;height:50px;background-color:transparent;border:none;cursor:pointer}.color-input::-webkit-color-swatch,.color-input::-moz-color-swatch{border-radius:5px;border:none}.inner-content{position:relative;left:30px;width:90%}.label-properties{position:relative;top:-12px;left:-37px}.required-indicator{color:red;margin-left:4px}.toggle-item1{position:relative;left:-94px;width:124px;color:#b8b8b8}.toggle-item2{width:100px;position:relative;top:-24px;left:84px;color:#b8b8b8}.flex-gap-1{display:flex;grid-template-columns:repeat(4,auto)}.help-text,.error-message{font-size:12px;margin-top:4px}.help-text{color:#666}.error-message{color:#ef4444}.read-only{background-color:#f5f5f5;cursor:not-allowed}.font-selection,.font-weight{width:190px}.design-header{padding:17px;background-color:#fff;margin-bottom:2rem}.header-title{font-size:16px;font-weight:500;text-align:center;margin:0 0 20px 5px}.menu-container{display:flex;justify-content:space-between;max-width:800px;margin:0 auto;background-color:#f8f9fa;border-radius:8px}.menu-item{flex:1;text-align:center;padding:7px;cursor:pointer;transition:all .3s ease;border-right:2px solid #e9ecef}.menu-item span{color:#656f7b;font-size:1rem}.menu-container{display:flex;justify-content:space-between;max-width:800px;margin:0 auto;background-color:#f8f9fa;border-radius:8px;padding:.5rem}.menu-item{flex:1;text-align:center;padding:m;cursor:pointer;transition:all .3s ease;border-right:1px solid #e9ecef}.menu-item:last-child{border-right:none}.menu-item:hover{background-color:#e9ecef;border-radius:4px}.menu-item span{color:#495057;font-size:1rem}.switch{position:relative;display:inline-block;width:40px;height:24px;right:-20px;margin:0 8px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background-color:#ccc;transition:.4s;border-radius:24px}.slider:before{position:absolute;content:\"\";height:16px;width:16px;left:4px;bottom:4px;background-color:#fff;transition:.4s;border-radius:50%}input:checked+.slider{background-color:#2196f3}input:checked+.slider:before{transform:translate(16px)}.font-align{display:flex;gap:2px}.align-btn,.style-btn{width:36px;height:36px;background:#f3f4f6;border:1px solid #e5e7eb;border-radius:4px;cursor:pointer;transition:all .2s}.align-btn:hover,.style-btn:hover{background:#e5e7eb}.align-btn.active,.style-btn.active{background:#202e3a;color:#fff;border-color:#4b5563}.align-btn.active img,.style-btn.active img{filter:brightness(0) invert(1)}.icon-size{width:16px;height:16px}.button-group{display:flex;gap:4px;padding:4px;background:#f9fafb;border-radius:6px}.field-size-controls{display:flex;flex-direction:row;position:relative;gap:13px;font-family:Arial,sans-serif}.size-group{display:flex;align-items:center}.size-label{font-size:15px;color:#000}.value-container{display:flex;height:43px;align-items:center;background-color:#f5f5f5;border-radius:11px;position:relative;right:74px}.font-style{display:flex;gap:1px}.size-input{font-size:15px;border:none;background:transparent;width:46px;text-align:center;outline:none}.size-input:focus{outline:none}.unit{font-size:13px;width:22px;color:#00000080}.file-upload-container{position:relative;margin-bottom:1rem}.file-upload-container input[type=file]{margin-top:.5rem}.text-font-medium{padding-left:15px;padding-bottom:20px}.options-container{display:flex;flex-direction:column;gap:.5rem}.option-item{display:flex;align-items:center;gap:1rem}.option-items{display:flex;gap:20px}.options{width:69px}.values{width:49px}.remove{width:34px;border-radius:50px;height:35px;background-color:#f7eff0}.remove img{position:relative;top:6px;left:9px}.add-btn{background:none;border:none;font-size:1rem;cursor:pointer;display:flex;align-items:center;width:328px;position:relative;right:123px;background-color:#f1f4f7}.add-btn:hover{color:#3182ce}.text-lg{border:1px solid gray;width:22px;border-radius:5px}.add-varient{display:flex;gap:13px;position:relative;left:101px}input{border:1px solid #ccc;padding:.5rem;border-radius:.25rem;width:100%}.space-y-4{position:relative;left:28px}.flex-items-center{display:flex;position:relative;top:2px;margin-bottom:28px}.input-box-field{width:207px}.text-sm{height:30px}.radio-item{position:relative;left:-5px}.flex-gap{display:flex;gap:18px}.design-footer{display:flex;justify-content:center;gap:30px;background-color:#f1f4f7}.btn{width:110px;color:#fff;margin-top:20px;margin-bottom:20px;background-color:#a5adbc}.btn:hover{background-color:#2196f3;color:#fff}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
10980
+ }
10981
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PropertiesComponent, decorators: [{
10982
+ type: Component,
10983
+ args: [{ selector: 'app-properties', template: "<!-- AP 22JAN25 - Field and Element Properties -->\r\n<!-- properties.component.html -->\r\n<div class=\"container\">\r\n <link href=\"https://fonts.googleapis.com/css?family=Roboto:300,400,500&display=swap\" rel=\"stylesheet\">\r\n<!-- Design Header Section -->\r\n<div class=\"design-header\">\r\n <h1 class=\"header-title\">Element Properties</h1>\r\n <div class=\"menu-container\">\r\n <div class=\"menu-item\" (click)=\"download()\">\r\n <span >Download</span>\r\n </div>\r\n <div class=\"menu-item\">\r\n <span>Start</span>\r\n </div>\r\n <div class=\"menu-item\">\r\n <span>Path</span>\r\n </div>\r\n <div class=\"menu-item\">\r\n <span>Clone</span>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- properties.component.html -->\r\n<div class=\"all-properties\">\r\n <div *ngIf=\"errorMessage\" class=\"error-message\">\r\n {{ errorMessage }}\r\n </div>\r\n <!-- Element Properties -->\r\n <details class=\"first-properties\" open>\r\n <summary class=\"text-sm \">Elements Properties</summary>\r\n <div class=\"inner-content\" *ngIf=\"getProperties()\">\r\n <ng-container *ngFor=\"let prop of getProperties().elementProps\">\r\n <div class=\"flex-items-center\">\r\n <label class=\"text-sm\">{{ prop.label }}</label>\r\n <div class=\"label-properties\">\r\n <!-- Text Input -->\r\n <input *ngIf=\"prop.type === 'text'\"\r\n type=\"text\"\r\n [placeholder]=\"prop.placeholder\"\r\n [value]=\"selectedElement[prop.key]\"\r\n (input)=\"updateProperty(prop.key, $event.target.value)\"\r\n [class.read-only]=\"selectedElement.readOnly\"\r\n [readonly]=\"selectedElement.readOnly\"\r\n class=\"text-sm1 \"\r\n />\r\n <div *ngIf=\"prop.key === 'helpText' && selectedElement.helpText\" class=\"help-text\">\r\n {{ selectedElement.helpText }}\r\n </div>\r\n\r\n\r\n <!-- Font Selection -->\r\n<div *ngIf=\"prop.key === 'font'\" class=\"font-selection\">\r\n <!-- <label>{{ prop.label }}</label> -->\r\n <select\r\n *ngIf=\"prop.type === 'select' && prop.key === 'font'\"\r\n class=\"font-selection1\"\r\n [value]=\"selectedElement?.font\"\r\n (change)=\"updateProperty('font', $event.target.value)\">\r\n <option *ngFor=\"let option of prop.options\" [value]=\"option\">\r\n {{ option }}\r\n </option>\r\n </select>\r\n</div>\r\n\r\n<!-- file -->\r\n<!-- Add this inside the elementProps loop where other inputs are rendered -->\r\n<select *ngIf=\"prop.type === 'select' && prop.key === 'supportType'\"\r\n class=\"file \"\r\n[value]=\"selectedElement[prop.key]\"\r\n(change)=\"updateProperty(prop.key, $event.target.value)\">\r\n<option value=\"\">Select file category</option>\r\n<option *ngFor=\"let option of prop.options\" [value]=\"option.value\">\r\n{{ option.label }}\r\n</option>\r\n</select>\r\n\r\n<!-- Font Weight Selection -->\r\n<div *ngIf=\"prop.key === 'fontWeight'\" class=\"font-weight\">\r\n <!-- <label>{{ prop.label }}</label> -->\r\n <select\r\n *ngIf=\"prop.type === 'select' && prop.key === 'fontWeight'\"\r\n class=\"font-weight1 \"\r\n [value]=\"selectedElement?.fontWeight\"\r\n (change)=\"updateProperty('fontWeight', $event.target.value)\">\r\n <option *ngFor=\"let option of prop.options\" [value]=\"option.value\">\r\n {{ option.label }}\r\n </option>\r\n </select>\r\n</div>\r\n\r\n <!-- Number Input with Unit -->\r\n <div *ngIf=\"prop.type === 'number'\" class=\"size-controls\">\r\n <div class=\"size-input-group\">\r\n <input\r\n type=\"number\"\r\n [value]=\"selectedElement[prop.key]\"\r\n (input)=\"updateProperty(prop.key, $event.target.value)\"\r\n [min]=\"prop.min || 1\"\r\n [max]=\"prop.max || 999999\"\r\n class=\"size-value\"\r\n />\r\n <span class=\"size-unit\">{{ prop.unit }}</span>\r\n </div>\r\n </div>\r\n\r\n <!-- Toggle Group -->\r\n<!-- Toggle Group -->\r\n<div *ngIf=\"prop.type === 'toggleGroup'\" class=\"toggle-group\">\r\n<div class=\"toggle-item1\">\r\n <span class=\"toggle-label\">Read Only</span>\r\n <label class=\"switch\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"selectedElement?.readOnly\"\r\n (change)=\"onToggleChange('readOnly', $event)\"\r\n />\r\n <span class=\"slider\"></span>\r\n </label>\r\n</div>\r\n\r\n<div class=\"toggle-item2\">\r\n <span class=\"toggle-label\">Is Hide</span>\r\n <label class=\"switch\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"selectedElement?.isHide\"\r\n (change)=\"onToggleChange('isHide', $event)\"\r\n />\r\n <span class=\"slider\"></span>\r\n </label>\r\n</div>\r\n</div>\r\n\r\n <!-- Text Align Buttons -->\r\n <div *ngIf=\"prop.type === 'align'\"class=\"font-align\">\r\n <button\r\n *ngFor=\"let option of prop.options\"\r\n (click)=\"onAlignSelect(option.value)\"\r\n [class.active]=\"selectedElement?.textAlign === option.value\"\r\n class=\"align-btn\"\r\n [title]=\"option.value\"\r\n >\r\n <img\r\n [src]=\"'../assets/icons/' + option.icon + '.svg'\"\r\n [alt]=\"option.value\"\r\n class=\"icon-size\"\r\n />\r\n </button>\r\n </div>\r\n\r\n\r\n <div *ngIf=\"prop.key === 'size'\" class=\"size-controls\">\r\n <label>{{ prop.label }}</label>\r\n <input\r\n type=\"number\"\r\n [value]=\"selectedElement[prop.key]\"\r\n (input)=\"updateProperty(prop.key, $event.target.value)\"\r\n class=\"size-input\"\r\n />\r\n <span class=\"size-unit\">{{ prop.unit }}</span>\r\n </div>\r\n\r\n\r\n <div *ngIf=\"prop.type === 'style'\" class=\"font-style\">\r\n <button\r\n *ngFor=\"let option of prop.options\"\r\n (click)=\"onStyleSelect(option.value)\"\r\n [class.active]=\"isStyleActive(option.value)\"\r\n class=\"style-btn\"\r\n [title]=\"option.value\"\r\n >\r\n <img\r\n [src]=\"'../assets/icons/' + option.icon + '.svg'\"\r\n [alt]=\"option.value\"\r\n class=\"icon-size\"\r\n />\r\n </button>\r\n </div>\r\n\r\n<!-- Field Size Controls -->\r\n<div *ngIf=\"prop.key === 'fieldSize'\" class=\"field-size-controls\">\r\n <div class=\"size-group\">\r\n <label class=\"size-label\">Width</label>\r\n <div class=\"value-container\">\r\n <input\r\n type=\"number\"\r\n [value]=\"selectedElement?.width\"\r\n (input)=\"updateProperty('width', $event.target.value)\"\r\n class=\"size-input\"\r\n\r\n />\r\n <span class=\"unit\">PX</span>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"prop.key === 'fieldSize'\" class=\"field-size-controls\">\r\n <div class=\"size-group\">\r\n <label class=\"size-label\">Height</label>\r\n <div class=\"value-container\">\r\n <input\r\n type=\"number\"\r\n [value]=\"selectedElement?.height\"\r\n (input)=\"updateProperty('height', $event.target.value)\"\r\n class=\"size-input\"\r\n />\r\n <span class=\"unit\">PX</span>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </details>\r\n\r\n <!-- Field Elements Properties -->\r\n<details class=\"second-property\">\r\n <summary class=\"text-font-medium\">Field Elements Properties</summary>\r\n <div class=\"space-y-4\" *ngIf=\"getProperties()\">\r\n <ng-container *ngFor=\"let prop of getProperties().fieldProps\">\r\n <div class=\"flex-items-center \">\r\n <label class=\"text-sm\">{{ prop.label }}</label>\r\n <div class=\"input-box-field\">\r\n <!-- Input Box -->\r\n <input\r\n *ngIf=\"prop.type === 'text'\"\r\n type=\"text\"\r\n [placeholder]=\"prop.placeholder\"\r\n class=\"field-input\"\r\n />\r\n <!-- Radio Group -->\r\n<div *ngIf=\"prop.type === 'radio'\" class=\"radio-item\">\r\n\r\n\r\n <div class=\"sizes\">\r\n <div class=\"flex-gap\">\r\n <div class=\"flex-items\">\r\n <input\r\n type=\"radio\"\r\n [checked]=\"selectedElement.required\"\r\n (change)=\"onRequiredChange(true)\"\r\n name=\"required\"\r\n class=\"radio-input\"\r\n />\r\n <label\r\n class=\"text-label\"\r\n >\r\n Required\r\n </label>\r\n </div>\r\n <div class=\"flex-items\">\r\n <input\r\n type=\"radio\"\r\n [checked]=\"!selectedElement.required\"\r\n (change)=\"onRequiredChange(false)\"\r\n name=\"required\"\r\n class=\"radio-input\"\r\n />\r\n <label\r\n class=\"text-sm text-gray-400\"\r\n >\r\n Not Required\r\n </label>\r\n </div>\r\n </div>\r\n</div>\r\n</div>\r\n <!-- Chk Options Group -->\r\n <div *ngIf=\"prop.type === 'optionsGroup'\" class=\"options-container\">\r\n <div\r\n *ngFor=\"let option of prop.options; let i = index\"\r\n class=\"option-items\"\r\n >\r\n <!-- Option Input -->\r\n <input\r\n type=\"text\"\r\n [(ngModel)]=\"prop.options[i].label\"\r\n placeholder=\"Option {{ i + 1 }}\"\r\n class=\"options\"\r\n />\r\n <input\r\n type=\"text\"\r\n [(ngModel)]=\"prop.options[i].value\"\r\n placeholder=\"Value\"\r\n class=\"values\"\r\n />\r\n <!-- Remove Button -->\r\n <div class=\"remove\">\r\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeOption(prop.options, i)\"></div>\r\n </div>\r\n <!-- Add Button -->\r\n <button\r\n type=\"button\"\r\n class=\"add-btn\"\r\n (click)=\"addOption(prop.options)\"\r\n >\r\n <div class=\"add-varient\">\r\n <span class=\"text-lg\">+</span>\r\n <span>Add Variants</span></div>\r\n </button>\r\n</div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"design-footer\">\r\n <button class=\"btn\">Cancel</button>\r\n <button class=\"btn\" (click)=\"save()\">Save</button>\r\n </div>\r\n</details>\r\n</div>\r\n\r\n\r\n</div>\r\n", styles: [".container{position:absolute;right:0;width:25%;top:70px}.all-properties{padding:0;margin:-32px -13px 0 0;background-color:#f8fafc;position:relative;top:3px;max-height:549px;overflow-y:auto}.first-properties{padding-top:16px;padding-left:15px}details summary{font-weight:700;color:#1b1b43;cursor:pointer}details[open] summary{padding-bottom:5px;margin-bottom:1rem}label{flex:0 0 120px;color:#b8b8b8;font-size:.875rem;font-weight:500;margin:0;padding:0}input,select{flex:1;background-color:#eaedf1;color:#bebfbf;border-radius:.375rem;padding:.5rem;font-size:.875rem;width:100%;box-sizing:border-box;transition:border-color .2s}input:focus,select:focus{border-color:#1b1b43;outline:none}button{background-color:#eaedf1;color:#6b7280;border:1px solid #D1D5DB;border-radius:.375rem;padding:.5rem;cursor:pointer;transition:all .2s}button:hover{background-color:#e5e7eb}button.selected{background-color:#0b1f34;color:#fff;border-color:#1e90ff}.color-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:50px;height:50px;background-color:transparent;border:none;cursor:pointer}.color-input::-webkit-color-swatch,.color-input::-moz-color-swatch{border-radius:5px;border:none}.inner-content{position:relative;left:30px;width:90%}.label-properties{position:relative;top:-12px;left:-37px}.required-indicator{color:red;margin-left:4px}.toggle-item1{position:relative;left:-94px;width:124px;color:#b8b8b8}.toggle-item2{width:100px;position:relative;top:-24px;left:84px;color:#b8b8b8}.flex-gap-1{display:flex;grid-template-columns:repeat(4,auto)}.help-text,.error-message{font-size:12px;margin-top:4px}.help-text{color:#666}.error-message{color:#ef4444}.read-only{background-color:#f5f5f5;cursor:not-allowed}.font-selection,.font-weight{width:190px}.design-header{padding:17px;background-color:#fff;margin-bottom:2rem}.header-title{font-size:16px;font-weight:500;text-align:center;margin:0 0 20px 5px}.menu-container{display:flex;justify-content:space-between;max-width:800px;margin:0 auto;background-color:#f8f9fa;border-radius:8px}.menu-item{flex:1;text-align:center;padding:7px;cursor:pointer;transition:all .3s ease;border-right:2px solid #e9ecef}.menu-item span{color:#656f7b;font-size:1rem}.menu-container{display:flex;justify-content:space-between;max-width:800px;margin:0 auto;background-color:#f8f9fa;border-radius:8px;padding:.5rem}.menu-item{flex:1;text-align:center;padding:m;cursor:pointer;transition:all .3s ease;border-right:1px solid #e9ecef}.menu-item:last-child{border-right:none}.menu-item:hover{background-color:#e9ecef;border-radius:4px}.menu-item span{color:#495057;font-size:1rem}.switch{position:relative;display:inline-block;width:40px;height:24px;right:-20px;margin:0 8px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background-color:#ccc;transition:.4s;border-radius:24px}.slider:before{position:absolute;content:\"\";height:16px;width:16px;left:4px;bottom:4px;background-color:#fff;transition:.4s;border-radius:50%}input:checked+.slider{background-color:#2196f3}input:checked+.slider:before{transform:translate(16px)}.font-align{display:flex;gap:2px}.align-btn,.style-btn{width:36px;height:36px;background:#f3f4f6;border:1px solid #e5e7eb;border-radius:4px;cursor:pointer;transition:all .2s}.align-btn:hover,.style-btn:hover{background:#e5e7eb}.align-btn.active,.style-btn.active{background:#202e3a;color:#fff;border-color:#4b5563}.align-btn.active img,.style-btn.active img{filter:brightness(0) invert(1)}.icon-size{width:16px;height:16px}.button-group{display:flex;gap:4px;padding:4px;background:#f9fafb;border-radius:6px}.field-size-controls{display:flex;flex-direction:row;position:relative;gap:13px;font-family:Arial,sans-serif}.size-group{display:flex;align-items:center}.size-label{font-size:15px;color:#000}.value-container{display:flex;height:43px;align-items:center;background-color:#f5f5f5;border-radius:11px;position:relative;right:74px}.font-style{display:flex;gap:1px}.size-input{font-size:15px;border:none;background:transparent;width:46px;text-align:center;outline:none}.size-input:focus{outline:none}.unit{font-size:13px;width:22px;color:#00000080}.file-upload-container{position:relative;margin-bottom:1rem}.file-upload-container input[type=file]{margin-top:.5rem}.text-font-medium{padding-left:15px;padding-bottom:20px}.options-container{display:flex;flex-direction:column;gap:.5rem}.option-item{display:flex;align-items:center;gap:1rem}.option-items{display:flex;gap:20px}.options{width:69px}.values{width:49px}.remove{width:34px;border-radius:50px;height:35px;background-color:#f7eff0}.remove img{position:relative;top:6px;left:9px}.add-btn{background:none;border:none;font-size:1rem;cursor:pointer;display:flex;align-items:center;width:328px;position:relative;right:123px;background-color:#f1f4f7}.add-btn:hover{color:#3182ce}.text-lg{border:1px solid gray;width:22px;border-radius:5px}.add-varient{display:flex;gap:13px;position:relative;left:101px}input{border:1px solid #ccc;padding:.5rem;border-radius:.25rem;width:100%}.space-y-4{position:relative;left:28px}.flex-items-center{display:flex;position:relative;top:2px;margin-bottom:28px}.input-box-field{width:207px}.text-sm{height:30px}.radio-item{position:relative;left:-5px}.flex-gap{display:flex;gap:18px}.design-footer{display:flex;justify-content:center;gap:30px;background-color:#f1f4f7}.btn{width:110px;color:#fff;margin-top:20px;margin-bottom:20px;background-color:#a5adbc}.btn:hover{background-color:#2196f3;color:#fff}\n"] }]
10984
+ }], ctorParameters: () => [{ type: i1$1.HttpClient }, { type: FormBuilderService }], propDecorators: { colorWheel: [{
10985
+ type: ViewChild,
10986
+ args: ['colorWheel']
10987
+ }], selectedElementType: [{
10988
+ type: Input
10989
+ }] } });
10990
+
10991
+ // AP 22JAN25
10992
+ class MenuComponent {
10993
+ activeIndex = 0;
10994
+ menuItems = [
10995
+ { icon: '../assets/icons/Related.svg' },
10996
+ { icon: '../assets/icons/TextColumns.svg' },
10997
+ { icon: '../assets/icons/Monotone.svg' },
10998
+ { icon: '../assets/icons/Preview1.svg' },
10999
+ { icon: '../assets/icons/Website.svg' },
11000
+ { icon: '../assets/icons/Preview2.svg' },
11001
+ { icon: '../assets/icons/pdf.svg' },
11002
+ { icon: '../assets/icons/Setting.svg' }
11003
+ // { icon: '../assets/icons/ProfileImage.svg' }
11004
+ ];
11005
+ setActiveMenu(index) {
11006
+ this.activeIndex = index;
11007
+ }
11008
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
11009
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MenuComponent, selector: "app-menu", ngImport: i0, template: "<!-- AP 22JAN25 - Top menu ,Left side menu -->\r\n<!-- menu.component.html -->\r\n<div class=\"top-bar\">\r\n <button class=\"button share-button\">Share</button>\r\n <button class=\"button publish-button\">Publish</button>\r\n</div>\r\n<div class=\"menu-sidebar\">\r\n <!-- Logo Section -->\r\n <div class=\"menu-logo\">\r\n <img src=\"../assets/Nxt.png\">\r\n </div>\r\n\r\n <!-- Menu Items -->\r\n <ul class=\"menu-list\">\r\n <li\r\n *ngFor=\"let item of menuItems; let i = index\"\r\n class=\"menu-item\"\r\n [class.active]=\"activeIndex === i\"\r\n (click)=\"setActiveMenu(i)\"\r\n [attr.aria-label]=\"item.label\"\r\n >\r\n <!-- Dynamic Icon -->\r\n <img [src]=\"item.icon\" alt=\"Menu Icon\" class=\"menu-icon\" />\r\n </li>\r\n </ul>\r\n\r\n <!-- Profile Section -->\r\n <div class=\"menu-profile\">\r\n <img src=\"../assets/icons/ProfileImage.svg\" />\r\n </div>\r\n</div>\r\n\r\n", styles: [".top-bar{display:flex;justify-content:flex-end;padding:15px;background-color:#fff;border-bottom:1px solid #ccc;width:100%;position:absolute;top:-3px}.button{padding:10px 20px;margin-left:10px;font-size:1rem;border:none;border-radius:5px;cursor:pointer;transition:background-color .3s ease}.share-button{background-color:#e5e8ed;color:#384652}.share-button:hover,.publish-button{background-color:#3374f2;color:#fff}.publish-button:hover{background-color:#005f73}.menu-sidebar{width:74px;height:100vh;background-color:#fff;color:#94a3b8;display:flex;flex-direction:column;align-items:center;position:absolute;top:0;box-shadow:2px 0 5px #0000001a}.menu-logo img{width:40px;margin:20px 0}.menu-list{list-style-type:none;padding:0;margin-top:48px;flex:1}.menu-item{width:50px;height:50px;display:flex;justify-content:center;align-items:center;margin:10px 0;cursor:pointer;border-radius:8px;transition:background .3s ease}.menu-item.active,.menu-item:hover{background-color:#ffb300;border-radius:50px;color:#fff}.icon{font-size:20px}.menu-profile img{width:40px;border-radius:50%;margin-bottom:20px}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
11010
+ }
11011
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MenuComponent, decorators: [{
11012
+ type: Component,
11013
+ args: [{ selector: 'app-menu', template: "<!-- AP 22JAN25 - Top menu ,Left side menu -->\r\n<!-- menu.component.html -->\r\n<div class=\"top-bar\">\r\n <button class=\"button share-button\">Share</button>\r\n <button class=\"button publish-button\">Publish</button>\r\n</div>\r\n<div class=\"menu-sidebar\">\r\n <!-- Logo Section -->\r\n <div class=\"menu-logo\">\r\n <img src=\"../assets/Nxt.png\">\r\n </div>\r\n\r\n <!-- Menu Items -->\r\n <ul class=\"menu-list\">\r\n <li\r\n *ngFor=\"let item of menuItems; let i = index\"\r\n class=\"menu-item\"\r\n [class.active]=\"activeIndex === i\"\r\n (click)=\"setActiveMenu(i)\"\r\n [attr.aria-label]=\"item.label\"\r\n >\r\n <!-- Dynamic Icon -->\r\n <img [src]=\"item.icon\" alt=\"Menu Icon\" class=\"menu-icon\" />\r\n </li>\r\n </ul>\r\n\r\n <!-- Profile Section -->\r\n <div class=\"menu-profile\">\r\n <img src=\"../assets/icons/ProfileImage.svg\" />\r\n </div>\r\n</div>\r\n\r\n", styles: [".top-bar{display:flex;justify-content:flex-end;padding:15px;background-color:#fff;border-bottom:1px solid #ccc;width:100%;position:absolute;top:-3px}.button{padding:10px 20px;margin-left:10px;font-size:1rem;border:none;border-radius:5px;cursor:pointer;transition:background-color .3s ease}.share-button{background-color:#e5e8ed;color:#384652}.share-button:hover,.publish-button{background-color:#3374f2;color:#fff}.publish-button:hover{background-color:#005f73}.menu-sidebar{width:74px;height:100vh;background-color:#fff;color:#94a3b8;display:flex;flex-direction:column;align-items:center;position:absolute;top:0;box-shadow:2px 0 5px #0000001a}.menu-logo img{width:40px;margin:20px 0}.menu-list{list-style-type:none;padding:0;margin-top:48px;flex:1}.menu-item{width:50px;height:50px;display:flex;justify-content:center;align-items:center;margin:10px 0;cursor:pointer;border-radius:8px;transition:background .3s ease}.menu-item.active,.menu-item:hover{background-color:#ffb300;border-radius:50px;color:#fff}.icon{font-size:20px}.menu-profile img{width:40px;border-radius:50%;margin-bottom:20px}\n"] }]
11014
+ }] });
11015
+
10195
11016
  // export const MY_CUSTOM_FORMATS = {
10196
11017
  // fullPickerInput: 'DD/MM/YYYY HH:mm:ss',
10197
11018
  // useUtc: true,
@@ -10205,7 +11026,7 @@ const languages = [
10205
11026
  ];
10206
11027
  class NxtAppModule {
10207
11028
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NxtAppModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
10208
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: NxtAppModule, declarations: [NxtAppComponent,
11029
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: NxtAppModule, bootstrap: [NxtAppComponent], declarations: [NxtAppComponent,
10209
11030
  QuestionnaireComponent,
10210
11031
  PickLocationComponent,
10211
11032
  CustomInputComponent,
@@ -10232,7 +11053,11 @@ class NxtAppModule {
10232
11053
  I18nComponent,
10233
11054
  I18nPipe,
10234
11055
  CustomImageComponent,
10235
- CustomRadioComponent], imports: [i1$2.QuillModule, // RS 06JAN2025 Initializes the QuillModule with default settings for integrating the Quill editor.
11056
+ CustomRadioComponent,
11057
+ //AP 22JAN2025 Added the below components
11058
+ ElementComponent,
11059
+ PropertiesComponent,
11060
+ MenuComponent], imports: [i1$2.QuillModule, // RS 06JAN2025 Initializes the QuillModule with default settings for integrating the Quill editor.
10236
11061
  CustomRichTextComponent,
10237
11062
  CommonModule, FormsModule,
10238
11063
  // BrowserModule,
@@ -10245,6 +11070,7 @@ class NxtAppModule {
10245
11070
  NgSelectModule,
10246
11071
  GoogleMapsModule,
10247
11072
  MatTooltipModule,
11073
+ DragDropModule, //AP 22JAN25 Added the DragDropModule
10248
11074
  //AgmCoreModule.forRoot({
10249
11075
  // apiKey: GOOGLE_MAP_API_KEY,
10250
11076
  // libraries: ['geometry', 'places', 'visualization', 'drawing']
@@ -10254,10 +11080,16 @@ class NxtAppModule {
10254
11080
  BookletComponent,
10255
11081
  SummaryPageComponent,
10256
11082
  I18nPipe,
10257
- I18nComponent] });
11083
+ I18nComponent,
11084
+ ElementComponent,
11085
+ PropertiesComponent,
11086
+ MenuComponent
11087
+ // CustomRichTextComponent
11088
+ ] });
10258
11089
  static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NxtAppModule, providers: [
10259
11090
  I18nService,
10260
- I18nPipe
11091
+ I18nPipe,
11092
+ FormBuilderService //AP 22JAN2025 Added the FormBuilderService
10261
11093
  ], imports: [QuillModule.forRoot(), // RS 06JAN2025 Initializes the QuillModule with default settings for integrating the Quill editor.
10262
11094
  CustomRichTextComponent,
10263
11095
  CommonModule, FormsModule,
@@ -10269,6 +11101,7 @@ class NxtAppModule {
10269
11101
  NgSelectModule,
10270
11102
  GoogleMapsModule,
10271
11103
  MatTooltipModule,
11104
+ DragDropModule, //AP 22JAN25 Added the DragDropModule
10272
11105
  //AgmCoreModule.forRoot({
10273
11106
  // apiKey: GOOGLE_MAP_API_KEY,
10274
11107
  // libraries: ['geometry', 'places', 'visualization', 'drawing']
@@ -10288,7 +11121,7 @@ class NxtAppModule {
10288
11121
  "backgroundGradientStopColor": "#dd2e13",
10289
11122
  "backgroundStroke": "#d3cfcf",
10290
11123
  "title": [
10291
-
11124
+
10292
11125
  "%"
10293
11126
  ],
10294
11127
  // titleFontSize: 12,
@@ -10313,7 +11146,7 @@ class NxtAppModule {
10313
11146
  "outerStrokeLinecap": "inherit",
10314
11147
  "innerStrokeColor": "#f6dfdf",
10315
11148
  "title": [
10316
-
11149
+
10317
11150
  "%"
10318
11151
  ],
10319
11152
  "titleColor": "#e7d9d9",
@@ -10383,7 +11216,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
10383
11216
  I18nComponent,
10384
11217
  I18nPipe,
10385
11218
  CustomImageComponent,
10386
- CustomRadioComponent
11219
+ CustomRadioComponent,
11220
+ //AP 22JAN2025 Added the below components
11221
+ ElementComponent,
11222
+ PropertiesComponent,
11223
+ MenuComponent
10387
11224
  ],
10388
11225
  imports: [
10389
11226
  QuillModule.forRoot(), // RS 06JAN2025 Initializes the QuillModule with default settings for integrating the Quill editor.
@@ -10399,6 +11236,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
10399
11236
  NgSelectModule,
10400
11237
  GoogleMapsModule,
10401
11238
  MatTooltipModule,
11239
+ DragDropModule, //AP 22JAN25 Added the DragDropModule
10402
11240
  //AgmCoreModule.forRoot({
10403
11241
  // apiKey: GOOGLE_MAP_API_KEY,
10404
11242
  // libraries: ['geometry', 'places', 'visualization', 'drawing']
@@ -10418,7 +11256,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
10418
11256
  "backgroundGradientStopColor": "#dd2e13",
10419
11257
  "backgroundStroke": "#d3cfcf",
10420
11258
  "title": [
10421
-
11259
+
10422
11260
  "%"
10423
11261
  ],
10424
11262
  // titleFontSize: 12,
@@ -10443,7 +11281,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
10443
11281
  "outerStrokeLinecap": "inherit",
10444
11282
  "innerStrokeColor": "#f6dfdf",
10445
11283
  "title": [
10446
-
11284
+
10447
11285
  "%"
10448
11286
  ],
10449
11287
  "titleColor": "#e7d9d9",
@@ -10483,6 +11321,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
10483
11321
  "showSubtitle": false
10484
11322
  })
10485
11323
  ],
11324
+ bootstrap: [NxtAppComponent],
10486
11325
  schemas: [CUSTOM_ELEMENTS_SCHEMA],
10487
11326
  exports: [NxtAppComponent,
10488
11327
  QuestionnaireComponent,
@@ -10490,11 +11329,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
10490
11329
  SummaryPageComponent,
10491
11330
  I18nPipe,
10492
11331
  I18nComponent,
11332
+ ElementComponent,
11333
+ PropertiesComponent,
11334
+ MenuComponent
10493
11335
  // CustomRichTextComponent
10494
11336
  ],
10495
11337
  providers: [
10496
11338
  I18nService,
10497
- I18nPipe
11339
+ I18nPipe,
11340
+ FormBuilderService //AP 22JAN2025 Added the FormBuilderService
10498
11341
  ]
10499
11342
  // providers: [
10500
11343
  // { provide: OWL_MOMENT_DATE_TIME_ADAPTER_OPTIONS, useValue: { useUtc: false } },
@@ -10511,5 +11354,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
10511
11354
  * Generated bundle index. Do not edit.
10512
11355
  */
10513
11356
 
10514
- export { BookletComponent, I18nComponent, I18nPipe, NxtAppComponent, NxtAppModule, NxtAppService, QuestionbookComponent, QuestionnaireComponent, SalesforceService, SummaryPageComponent };
11357
+ export { BookletComponent, ElementComponent, I18nComponent, I18nPipe, MenuComponent, NxtAppComponent, NxtAppModule, NxtAppService, PropertiesComponent, QuestionbookComponent, QuestionnaireComponent, SalesforceService, SummaryPageComponent };
10515
11358
  //# sourceMappingURL=rangertechnologies-ngnxt.mjs.map