@rangertechnologies/ngnxt 2.1.104 → 2.1.106

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.
Files changed (143) hide show
  1. package/package.json +5 -1
  2. package/esm2022/lib/ar.i18n.mjs +0 -29
  3. package/esm2022/lib/components/button/nxt-button.component.mjs +0 -130
  4. package/esm2022/lib/components/custom-button/custom-button.component.mjs +0 -39
  5. package/esm2022/lib/components/custom-calendar/custom-calendar.component.mjs +0 -366
  6. package/esm2022/lib/components/custom-date/custom-date.component.mjs +0 -47
  7. package/esm2022/lib/components/custom-date-picker/custom-date-picker.component.mjs +0 -48
  8. package/esm2022/lib/components/custom-dropdown/custom-dropdown.component.mjs +0 -219
  9. package/esm2022/lib/components/custom-image/custom-image.component.mjs +0 -34
  10. package/esm2022/lib/components/custom-input/custom-input.component.mjs +0 -93
  11. package/esm2022/lib/components/custom-label/custom-label.component.mjs +0 -21
  12. package/esm2022/lib/components/custom-model/custom-model.component.mjs +0 -48
  13. package/esm2022/lib/components/custom-radio/custom-radio.component.mjs +0 -115
  14. package/esm2022/lib/components/custom-rich-text/custom-rich-text.component.mjs +0 -186
  15. package/esm2022/lib/components/custom-table/custom-table.component.mjs +0 -347
  16. package/esm2022/lib/components/custom-text-area/custom-text-area.component.mjs +0 -65
  17. package/esm2022/lib/components/custom-time/custom-time.component.mjs +0 -61
  18. package/esm2022/lib/components/datatable/datatable.component.mjs +0 -801
  19. package/esm2022/lib/components/dependent-table/dependent-table.component.mjs +0 -42
  20. package/esm2022/lib/components/dropdown-with-flag/dropdown-with-flag.component.mjs +0 -39
  21. package/esm2022/lib/components/file-upload/file-upload.component.mjs +0 -279
  22. package/esm2022/lib/components/file-view/file-view.component.mjs +0 -46
  23. package/esm2022/lib/components/loader/loader.component.mjs +0 -23
  24. package/esm2022/lib/components/pagination/pagination.component.mjs +0 -100
  25. package/esm2022/lib/components/pick-location/pick-location.component.mjs +0 -216
  26. package/esm2022/lib/components/search-box/search-box.component.mjs +0 -202
  27. package/esm2022/lib/components/table-appendix/table-appendix.component.mjs +0 -123
  28. package/esm2022/lib/directives/componenthost/componenthost.directive.mjs +0 -19
  29. package/esm2022/lib/en.i18n.mjs +0 -29
  30. package/esm2022/lib/i18n-config.service.mjs +0 -4
  31. package/esm2022/lib/i18n.component.mjs +0 -47
  32. package/esm2022/lib/i18n.module.mjs +0 -38
  33. package/esm2022/lib/i18n.pipe.mjs +0 -25
  34. package/esm2022/lib/i18n.service.mjs +0 -56
  35. package/esm2022/lib/interfaces/actionMeta.mjs +0 -2
  36. package/esm2022/lib/interfaces/apimeta.mjs +0 -2
  37. package/esm2022/lib/interfaces/dependencyMeta.mjs +0 -2
  38. package/esm2022/lib/model/bookletWrapper.mjs +0 -9
  39. package/esm2022/lib/model/changeWrapper.mjs +0 -11
  40. package/esm2022/lib/model/errorWrapper.mjs +0 -6
  41. package/esm2022/lib/model/tableWrapper.mjs +0 -20
  42. package/esm2022/lib/nxt-app.component.mjs +0 -22
  43. package/esm2022/lib/nxt-app.module.mjs +0 -399
  44. package/esm2022/lib/nxt-app.service.mjs +0 -14
  45. package/esm2022/lib/pages/booklet/booklet.component.mjs +0 -541
  46. package/esm2022/lib/pages/builder/element/element.component.mjs +0 -174
  47. package/esm2022/lib/pages/builder/form/form.component.mjs +0 -34
  48. package/esm2022/lib/pages/builder/menu/menu.component.mjs +0 -28
  49. package/esm2022/lib/pages/builder/properties/properties.component.mjs +0 -462
  50. package/esm2022/lib/pages/questionbook/questionbook.component.mjs +0 -458
  51. package/esm2022/lib/pages/questionnaire/questionnaire.component.mjs +0 -2387
  52. package/esm2022/lib/pages/summary-page/summary-page.component.mjs +0 -76
  53. package/esm2022/lib/pipe/date/date.pipe.mjs +0 -28
  54. package/esm2022/lib/pipe/editColumnCheck/edit-column-check.pipe.mjs +0 -28
  55. package/esm2022/lib/pipe/editColumnDropdown/edit-column-dropdown.pipe.mjs +0 -20
  56. package/esm2022/lib/pipe/editColumnType/edit-column-type.pipe.mjs +0 -20
  57. package/esm2022/lib/pipe/get-value.pipe.mjs +0 -50
  58. package/esm2022/lib/pipe/search-filter/search-filter.pipe.mjs +0 -39
  59. package/esm2022/lib/pipe/time/time.pipe.mjs +0 -26
  60. package/esm2022/lib/sample.mjs +0 -3715
  61. package/esm2022/lib/services/change.service.mjs +0 -53
  62. package/esm2022/lib/services/data.service.mjs +0 -80
  63. package/esm2022/lib/services/form-builder.service.mjs +0 -160
  64. package/esm2022/lib/services/salesforce.service.mjs +0 -46
  65. package/esm2022/lib/services/shared.service.mjs +0 -100
  66. package/esm2022/lib/services/storage.service.mjs +0 -44
  67. package/esm2022/lib/tam.i18n.mjs +0 -29
  68. package/esm2022/lib/wrapper.mjs +0 -175
  69. package/esm2022/public-api.mjs +0 -22
  70. package/esm2022/rangertechnologies-ngnxt.mjs +0 -5
  71. package/fesm2022/rangertechnologies-ngnxt.mjs +0 -12833
  72. package/fesm2022/rangertechnologies-ngnxt.mjs.map +0 -1
  73. package/index.d.ts +0 -5
  74. package/lib/ar.i18n.d.ts +0 -24
  75. package/lib/components/button/nxt-button.component.d.ts +0 -38
  76. package/lib/components/custom-button/custom-button.component.d.ts +0 -16
  77. package/lib/components/custom-calendar/custom-calendar.component.d.ts +0 -65
  78. package/lib/components/custom-date/custom-date.component.d.ts +0 -18
  79. package/lib/components/custom-date-picker/custom-date-picker.component.d.ts +0 -19
  80. package/lib/components/custom-dropdown/custom-dropdown.component.d.ts +0 -39
  81. package/lib/components/custom-image/custom-image.component.d.ts +0 -13
  82. package/lib/components/custom-input/custom-input.component.d.ts +0 -31
  83. package/lib/components/custom-label/custom-label.component.d.ts +0 -10
  84. package/lib/components/custom-model/custom-model.component.d.ts +0 -19
  85. package/lib/components/custom-radio/custom-radio.component.d.ts +0 -33
  86. package/lib/components/custom-rich-text/custom-rich-text.component.d.ts +0 -29
  87. package/lib/components/custom-table/custom-table.component.d.ts +0 -65
  88. package/lib/components/custom-text-area/custom-text-area.component.d.ts +0 -22
  89. package/lib/components/custom-time/custom-time.component.d.ts +0 -18
  90. package/lib/components/datatable/datatable.component.d.ts +0 -126
  91. package/lib/components/dependent-table/dependent-table.component.d.ts +0 -15
  92. package/lib/components/dropdown-with-flag/dropdown-with-flag.component.d.ts +0 -16
  93. package/lib/components/file-upload/file-upload.component.d.ts +0 -47
  94. package/lib/components/file-view/file-view.component.d.ts +0 -16
  95. package/lib/components/loader/loader.component.d.ts +0 -11
  96. package/lib/components/pagination/pagination.component.d.ts +0 -36
  97. package/lib/components/pick-location/pick-location.component.d.ts +0 -44
  98. package/lib/components/search-box/search-box.component.d.ts +0 -43
  99. package/lib/components/table-appendix/table-appendix.component.d.ts +0 -30
  100. package/lib/directives/componenthost/componenthost.directive.d.ts +0 -8
  101. package/lib/en.i18n.d.ts +0 -24
  102. package/lib/i18n-config.service.d.ts +0 -2
  103. package/lib/i18n.component.d.ts +0 -11
  104. package/lib/i18n.module.d.ts +0 -9
  105. package/lib/i18n.pipe.d.ts +0 -10
  106. package/lib/i18n.service.d.ts +0 -14
  107. package/lib/interfaces/actionMeta.d.ts +0 -5
  108. package/lib/interfaces/apimeta.d.ts +0 -15
  109. package/lib/interfaces/dependencyMeta.d.ts +0 -8
  110. package/lib/model/bookletWrapper.d.ts +0 -5
  111. package/lib/model/changeWrapper.d.ts +0 -10
  112. package/lib/model/errorWrapper.d.ts +0 -5
  113. package/lib/model/tableWrapper.d.ts +0 -18
  114. package/lib/nxt-app.component.d.ts +0 -8
  115. package/lib/nxt-app.module.d.ts +0 -52
  116. package/lib/nxt-app.service.d.ts +0 -6
  117. package/lib/pages/booklet/booklet.component.d.ts +0 -68
  118. package/lib/pages/builder/element/element.component.d.ts +0 -25
  119. package/lib/pages/builder/form/form.component.d.ts +0 -11
  120. package/lib/pages/builder/menu/menu.component.d.ts +0 -10
  121. package/lib/pages/builder/properties/properties.component.d.ts +0 -527
  122. package/lib/pages/questionbook/questionbook.component.d.ts +0 -68
  123. package/lib/pages/questionnaire/questionnaire.component.d.ts +0 -220
  124. package/lib/pages/summary-page/summary-page.component.d.ts +0 -20
  125. package/lib/pipe/date/date.pipe.d.ts +0 -7
  126. package/lib/pipe/editColumnCheck/edit-column-check.pipe.d.ts +0 -7
  127. package/lib/pipe/editColumnDropdown/edit-column-dropdown.pipe.d.ts +0 -7
  128. package/lib/pipe/editColumnType/edit-column-type.pipe.d.ts +0 -7
  129. package/lib/pipe/get-value.pipe.d.ts +0 -7
  130. package/lib/pipe/search-filter/search-filter.pipe.d.ts +0 -8
  131. package/lib/pipe/time/time.pipe.d.ts +0 -7
  132. package/lib/sample.d.ts +0 -11
  133. package/lib/services/change.service.d.ts +0 -22
  134. package/lib/services/data.service.d.ts +0 -13
  135. package/lib/services/form-builder.service.d.ts +0 -75
  136. package/lib/services/salesforce.service.d.ts +0 -11
  137. package/lib/services/shared.service.d.ts +0 -15
  138. package/lib/services/storage.service.d.ts +0 -13
  139. package/lib/tam.i18n.d.ts +0 -24
  140. package/lib/wrapper.d.ts +0 -203
  141. package/public-api.d.ts +0 -15
  142. package/rangertechnologies-ngnxt-2.1.104.tgz +0 -0
  143. package/src/lib/style.css +0 -1817
@@ -1,174 +0,0 @@
1
- // AP 22JAN25 - form preview and All form elements
2
- import { Component, Input } from '@angular/core';
3
- import { moveItemInArray } from '@angular/cdk/drag-drop';
4
- import { v4 as uuidv4 } from 'uuid';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "../../../services/form-builder.service";
7
- import * as i2 from "@angular/common";
8
- import * as i3 from "@angular/forms";
9
- import * as i4 from "@angular/cdk/drag-drop";
10
- export class ElementComponent {
11
- formBuilderService;
12
- //@Output() elementButtonClicked = new EventEmitter<string>();
13
- bookletJSON;
14
- bookletId;
15
- field;
16
- formElements = [];
17
- elements = [];
18
- bookId;
19
- //subscription: any;
20
- constructor(formBuilderService) {
21
- this.formBuilderService = formBuilderService;
22
- }
23
- ngOnInit() {
24
- this.elements = [
25
- { "type": "Calendar", "img": "Calendar", "label": "Calendar" },
26
- { "type": "CheckBox", "img": "CheckBox", "label": "CheckBox" },
27
- { "type": "Email", "img": "Email", "label": "Email" },
28
- { "type": "File", "img": "File", "label": "File" },
29
- { "type": "Image", "img": "Image", "label": "Image" },
30
- { "type": "Number", "img": "Number", "label": "Number" },
31
- { "type": "List", "img": "List", "label": "List" },
32
- { "type": "Radio", "img": "Radio", "label": "Radio" },
33
- { "type": "Text", "img": "Text", "label": "Text" },
34
- { "type": "Tables", "img": "Table", "label": "Table" },
35
- { "type": "Dropdown", "img": "Drop", "label": "Dropdown" },
36
- { "type": "TextArea", "img": "TextArea", "label": "TextArea" },
37
- { "type": "Label", "img": "Label", "label": "Label" },
38
- { "type": "Book", "img": "Book", "label": "Book" },
39
- { "type": "Button", "img": "Button", "label": "Button" }
40
- ];
41
- this.formBuilderService.formElements$.subscribe((elements) => {
42
- this.formElements = elements;
43
- });
44
- if (this.bookletJSON) {
45
- this.initializeForm();
46
- }
47
- else {
48
- localStorage.setItem('status', "new");
49
- }
50
- }
51
- // AP - 26FEB25 - Added ngOnChanges to handle changes in bookletJSON
52
- ngOnChanges(changes) {
53
- if (changes['bookletJSON'] && changes['bookletJSON'].currentValue) {
54
- this.initializeForm();
55
- console.log('changes', changes);
56
- }
57
- }
58
- initializeForm() {
59
- if (!this.bookletJSON || !this.bookletJSON.bookQuestionsMap) {
60
- console.warn("Invalid bookletJSON structure");
61
- return;
62
- }
63
- localStorage.setItem('status', "edit");
64
- localStorage.setItem('unique_id', this.bookletId);
65
- this.formElements = [];
66
- this.formBuilderService.clearElements();
67
- const bookQuestionsMapKeys = Object.keys(this.bookletJSON.bookQuestionsMap);
68
- if (bookQuestionsMapKeys.length === 0)
69
- return;
70
- this.bookId = bookQuestionsMapKeys[0];
71
- this.bookletJSON.bookQuestionsMap[this.bookId]?.subQuestions?.forEach(newElement => {
72
- if (this.bookletJSON.sqOptions?.[newElement.id]) {
73
- newElement.options = this.bookletJSON.sqOptions[newElement.id].options;
74
- }
75
- this.formBuilderService.addElement(newElement);
76
- });
77
- this.formElements = this.formBuilderService.getElements();
78
- }
79
- // ngOnDestroy() {
80
- // this.subscription.unsubscribe();
81
- // }
82
- drop(event) {
83
- moveItemInArray(this.formElements, event.previousIndex, event.currentIndex);
84
- }
85
- // Add this method to handle element selection
86
- selectElement(index) {
87
- this.selectedFieldIndex = index; // element is selected
88
- this.formBuilderService.setSelectedElement(index);
89
- //const element = this.formElements[index];
90
- // this.elementButtonClicked.emit(element.type);
91
- }
92
- //selectedIndex: number | null = null;
93
- selectedFieldIndex = null; // element is cleared
94
- addElement(type) {
95
- const unique_id = uuidv4();
96
- const newElement = {
97
- id: unique_id,
98
- uid: unique_id,
99
- type,
100
- name: '',
101
- questionText: '',
102
- question: '',
103
- helpText: '',
104
- errorMessage: '',
105
- isReadOnly: false,
106
- isHidden: false,
107
- required: false,
108
- subText: '',
109
- referenceField: '',
110
- additionalRichContent: '',
111
- groupName: '',
112
- isDateBackward: false,
113
- title: '',
114
- subTitle: '',
115
- isDateForward: false,
116
- isOptional: false,
117
- isTitle: false,
118
- nextQuestion: '',
119
- allowedFileExtensions: '',
120
- questionNumber: this.formBuilderService.getElements().length + 1,
121
- questionBookId: '',
122
- parentQuestion: '',
123
- fieldsMeta: '',
124
- recordTypeName: '',
125
- recordTypeId: '',
126
- trackingId: '',
127
- dateText: '',
128
- timeText: '',
129
- recordId: '',
130
- qbReference: '',
131
- qbReferenceQuestions: '',
132
- questionBookSubTitle: '',
133
- style: '',
134
- options: type === 'Dropdown' || type === 'Radio' || type === 'CheckBox' ? [] : null,
135
- };
136
- this.formBuilderService.addElement(newElement);
137
- this.formElements = this.formBuilderService.getElements();
138
- }
139
- // Remove an element by index
140
- removeElement(field, index) {
141
- this.formBuilderService.removeElementComponent(field.id);
142
- this.formElements = this.formBuilderService.getElements();
143
- }
144
- getFontStyles(field) {
145
- const styles = {
146
- 'font-family': field.font || 'Helvetica Neue',
147
- 'font-weight': field.fontWeight || '400',
148
- 'width': field.size ? `${(field.size / 12) * 100}%` : '100%',
149
- 'min-height': field.height ? `${field.height}px` : 'auto',
150
- 'text-align': field.textAlign || 'left',
151
- 'border-radius': '5px',
152
- 'margin-bottom': '10px'
153
- };
154
- // if (Array.isArray(field.styles)) {
155
- // styles['font-weight'] = field.styles.includes('bold') ? '700' : styles['font-weight'];
156
- // styles['font-style'] = field.styles.includes('italic') ? 'italic' : undefined;
157
- // styles['text-decoration'] = field.styles.includes('underline') ? 'underline' : undefined;
158
- // styles['text-transform'] = field.styles.includes('capitalize') ? 'capitalize' :
159
- // field.styles.includes('lowercase') ? 'lowercase' : undefined;
160
- // }
161
- return styles;
162
- }
163
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ElementComponent, deps: [{ token: i1.FormBuilderService }], target: i0.ɵɵFactoryTarget.Component });
164
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ElementComponent, selector: "app-element", inputs: { bookletJSON: "bookletJSON", bookletId: "bookletId" }, usesOnChanges: true, ngImport: i0, template: "<!-- AP 22JAN25 - form preview and All form elements -->\n <!-- AP 25FEB25 - All elements update -->\n<div class=\"center-frame\">\n <link href=\"https://fonts.googleapis.com/css?family=Roboto:300,400,500&display=swap\" rel=\"stylesheet\">\n\n<!-- Form Builder Section All Elements -->\n<div class=\"form-builder\">\n <ng-container *ngFor=\"let element of elements\">\n <div class=\"element\" (click)=\"addElement(element.type)\">\n <img src=\"../assets/icons/{{ element.img }}.svg\">\n <div class=\"hover-label\">{{ element.label }}</div>\n </div>\n </ng-container>\n</div>\n \n<div class=\"form-preview\" cdkDropList [cdkDropListData]=\"formElements\" (cdkDropListDropped)=\"drop($event)\">\n<ng-container *ngFor=\"let field of formElements; let i = index\" getProperties().elementProps>\n\n<!-- TextBox -->\n<div *ngIf=\"field.type === 'Text'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\" \n [class.highlight]=\"selectedFieldIndex === i\" cdkDrag> \n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <label [class.required]=\"field.isRequired\">{{ field.questionText ? field.questionText : 'Label' }}</label>\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div> \n <input type=\"text\" class=\"custom-input\" [placeholder]=\"field.question || 'Enter text'\" [readonly]=\"field.isReadOnly\" \n [class.hidden]=\"field.isHidden\" />\n </div>\n </div>\n</div>\n\n<!-- Calendar -->\n<div *ngIf=\"field.type === 'Calendar'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\" \n [class.highlight]=\"selectedFieldIndex === i\" cdkDrag>\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <label [class.required]=\"field.isRequired\">{{ field.questionText ? field.questionText : 'Select Date' }}</label>\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n <input type=\"date\" class=\"custom-input\" [readonly]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\"/>\n </div>\n </div>\n</div>\n\n<!-- Email -->\n<div *ngIf=\"field.type === 'Email'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\" \n[class.highlight]=\"selectedFieldIndex === i\" cdkDrag>\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <label [class.required]=\"field.isRequired\"> {{ field.questionText ? field.questionText : 'Label' }} </label>\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div> \n <input type=\"email\" class=\"custom-input\" [placeholder]=\"field.question || 'Enter email'\" [readonly]=\"field.isReadOnly\" \n [class.hidden]=\"field.isHidden\" />\n </div>\n </div>\n</div>\n\n<!-- Numbers -->\n<div *ngIf=\"field.type === 'Number'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\" \n [class.highlight]=\"selectedFieldIndex === i\" cdkDrag> \n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <label [class.required]=\"field.isRequired\">{{ field.questionText ? field.questionText : 'Label' }}</label>\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div> \n <input type=\"number\" class=\"custom-input\" [placeholder]=\"field.question || 'Enter number'\" [readonly]=\"field.isReadOnly\" \n [class.hidden]=\"field.isHidden\"/>\n </div>\n </div>\n</div>\n \n<!-- TextArea -->\n<div *ngIf=\"field.type === 'TextArea'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\" \n [class.highlight]=\"selectedFieldIndex === i\" cdkDrag>\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <label [class.required]=\"field.isRequired\">{{ field.questionText ? field.questionText : 'Enter your text' }}\n <span *ngIf=\"field.required\" class=\"text-red-500\">*</span>\n </label>\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div> \n <textarea class=\"custom-textarea\" [placeholder]=\"field.question || 'Enter detailed text here...'\" [style.height.px]=\"field.size || 100\"\n [readonly]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\">\n </textarea>\n </div>\n </div>\n</div>\n\n<!-- Label -->\n<div *ngIf=\"field.type === 'Label'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\"\n[class.highlight]=\"selectedFieldIndex === i\" cdkDrag>\n<div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <label [class.required]=\"field.isRequired\">{{ field.questionText ? field.questionText : 'Label' }}</label>\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\"/>\n </div>\n </div>\n </div>\n</div>\n\n<!-- Image -->\n<div *ngIf=\"field.type === 'Image'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\" \n[class.highlight]=\"selectedFieldIndex === i\" cdkDrag>\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <label [class.required]=\"field.isRequired\"> {{ field.questionText ? field.questionText : 'Upload Image' }} </label>\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" />\n </div>\n <input type=\"file\" accept=\"image/*\" class=\"custom-input\" [readonly]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\"/>\n </div>\n </div>\n</div>\n\n <!-- File -->\n<div *ngIf=\"field.type === 'File'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\" \n [class.highlight]=\"selectedFieldIndex === i\" cdkDrag>\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <label [class.required]=\"field.isRequired\">{{ field.questionText ? field.questionText : 'Upload File' }}</label>\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n <input type=\"file\" class=\"custom-input\" [readonly]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\"/>\n </div>\n </div>\n</div>\n \n<!-- CheckBox -->\n<div *ngIf=\"field.type === 'CheckBox'\" class=\"checkbox-field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\" \n[ class.highlight]=\"selectedFieldIndex === i\" cdkDrag>\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\"> \n <label [class.required]=\"field.isRequired\">{{ field.questionText ? field.questionText : 'Label' }}</label>\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n <div class=\"checkbox-options-container\">\n <div *ngFor=\"let option of field.options\" class=\"checkbox-option\">\n <input type=\"checkbox\" [id]=\"option.value + i\" [name]=\"field.id\" [value]=\"option.label\" class=\"checkbox-input\"[readonly]=\"field.isReadOnly\" \n [class.hidden]=\"field.isHidden\">\n <label [for]=\"option.value + i\" class=\"checkbox-label\">{{ option.value }}</label>\n </div>\n </div>\n </div>\n </div>\n</div> \n\n<!-- Radio -->\n<div *ngIf=\"field.type === 'Radio'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\" \n[class.highlight]=\"selectedFieldIndex === i\" cdkDrag>\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\"> \n <label [class.required]=\"field.isRequired\">{{ field.questionText ? field.questionText : 'Label' }}</label>\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n <div class=\"radio-options-container\">\n <div *ngFor=\"let option of field.options; let j = index\" class=\"radio-option\">\n <input type=\"radio\" [id]=\"'radio-' + field.id + '-' + j\" [name]=\"'radio-group-' + field.id\" [value]=\"option.value\"\n [(ngModel)]=\"field.selectedValue\" class=\"radio-input\" [readonly]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\">\n <label [for]=\"'radio-' + field.id + '-' + j\" class=\"radio-label\"> {{ option.value }}</label>\n </div>\n </div>\n </div>\n </div>\n</div>\n \n<!-- Dropdown -->\n<div *ngIf=\"field.type === 'Dropdown'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\" \n[class.highlight]=\"selectedFieldIndex === i\" cdkDrag>\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\"> \n <label [class.required]=\"field.isRequired\">{{ field.questionText ? field.questionText : 'Label' }}</label>\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n <select id=\"options\" class=\"dropdown\"[disabled]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\" >\n <option *ngFor=\"let option of field.options\" [value]=\"option.value\"> {{ option.value }} </option>\n </select>\n </div>\n </div>\n</div>\n \n<!-- Tables -->\n<!-- <div *ngIf=\"field.type === 'Tables'\" class=\"table-container\" cdkDrag (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\">\n <label>{{ field.questionText }}</label>\n <table [style.width.px]=\"field.colWidth\" [style.height.%]=\"field.rowHeight\">\n <thead><tr><th *ngFor=\"let header of field.headers\" [style.width.px]=\"field.colWidth / field.colNos\">{{ header }}</th></tr></thead>\n <tbody><tr *ngFor=\"let row of field.rows\"><td *ngFor=\"let cell of row\">{{ cell }}</td></tr></tbody>\n </table>\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" />\n</div> -->\n\n <!-- Book -->\n<!-- <div *ngIf=\"field.type === 'Book'\" style=\"padding: 10px; background-color: whitesmoke;\" (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\" cdkDrag>\n <div class=\"flex\" style=\"display: flex;\">\n <div class=\"all-dots\"><div *ngFor=\"let _ of [1,2,3,4,5,6,7,8]\"></div></div>\n <div style=\"width: 97%;\">\n <div class=\"flex lab-conatiner\">\n <label [class.required]=\"field.required\">{{ field.questionText ? field.questionText : 'Book Title' }}</label>\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" />\n </div>\n </div>\n </div>\n</div> -->\n\n<!-- List -->\n<!-- <div *ngIf=\"field.type === 'List'\" class=\"list-container\" cdkDrag (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\">\n <label>{{ field.questionText }}</label>\n <ul><li *ngFor=\"let item of field.items\">{{ item }}</li></ul>\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" />\n </div> -->\n \n<!-- Button -->\n<!-- <div *ngIf=\"field.type === 'Button'\" class=\"button-container\" cdkDrag (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\">\n <button>{{ field.questionText }}</button>\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" />\n </div> -->\n\n</ng-container>\n</div>\n</div>\n\n\n\n\n", styles: [".center-frame{display:flex;border:10px solid #86A8CD;border-right-width:0}.form-builder{width:25%;height:100vh;overflow-y:auto;background-color:#fff;padding:10px;border-radius:10px;box-shadow:2px 2px 10px #0000001a}.form-builder .element{display:flex;align-items:center;gap:15px;margin-top:10px;padding:10px;border-radius:5px;background:#e9ecef;cursor:pointer;transition:background .3s ease,color .3s ease;color:#000}.form-builder .element:hover{background:#0250d9;color:#fff}.form-builder .element img{width:20px;height:20px;transition:filter .3s ease}.form-builder .element:hover img{filter:invert(1)}.form-builder .hover-label{font-size:14px;font-weight:500;color:#000;transition:color .3s ease}.form-builder .element:hover .hover-label{color:#fff}.form-builder .section-title{font-weight:700;font-size:16px;margin-top:10px;padding:5px;border-bottom:1px solid #ddd;color:#000}.form-builder .section-title:after{content:\"\\25bc\";float:right;font-size:12px;color:#555}.form-builder .section{margin-bottom:10px}.field-container{padding-right:5px;padding-left:5px}.field-wrapper{background-color:#eff8ff;border:1px solid #E6F3FF;border-radius:5px;padding:10px}.required:after{content:\"*\";color:red;margin-left:5px}.custom-input{width:100%;padding:8px;border:1px solid #DDDBDA;background-color:#fff;border-radius:5px;outline:none}.custom-input:focus{border-color:#00008b;box-shadow:0 0 5px #0000ff80}.delete-icon{width:20px;height:20px;cursor:pointer;opacity:0;visibility:hidden;transition:opacity .1s ease-in-out}.label-container:hover .delete-icon{opacity:1;visibility:visible}.form-preview{width:100%;height:100vh;overflow-y:auto;display:flex;flex-wrap:wrap;align-items:flex-start;padding:10px;height:fit-content;max-height:100vh}.field-content{display:flex;flex-direction:column;gap:5px}.label-container{display:flex;justify-content:space-between;align-items:center}.custom-input,.custom-textarea,.dropdown,.checkbox-options-container,.radio-options-container{width:100%}.dropdown{width:100%;padding:8px;border:1px solid #ccc;border-radius:4px;background-color:#fff;font-size:14px;color:#333;outline:none;cursor:pointer}.dropdown:focus{border-color:#007bff;box-shadow:0 0 5px #007bff80}.checkbox-field-container:hover{box-shadow:0 2px 8px #0000001a}.checkbox-options-container{display:flex;flex-direction:column;gap:5px;padding:8px;min-height:38px;border:1px solid #DDDBDA;background-color:#fff;outline:none;border-radius:6px}.checkbox-option,.radio-option{display:flex;align-items:center;gap:8px;padding:8px;background-color:#fff;border-radius:4px;transition:background-color .2s ease}.checkbox-option:hover{background-color:#f1f3f5}.checkbox-input,.radio-input{width:18px;height:18px;accent-color:#4dabf7;cursor:pointer}.checkbox-label,.radio-label{font-size:14px;color:#495057;cursor:pointer;-webkit-user-select:none;user-select:none}.label-container label{font-size:16px;font-weight:600}.required:after{content:\" *\";color:red}.radio-options-container{display:flex;flex-direction:column;gap:5px;padding:8px;min-height:38px;border:1px solid #DDDBDA;background-color:#fff;outline:none;border-radius:6px}.radio-input:checked{border-color:#007bff;background-color:#007bff}.radio-input:checked:after{content:\"\";width:8px;height:8px;background:#fff;border-radius:50%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.custom-textarea{width:100%;min-height:100px;border:1px solid #ccc;border-radius:4px;padding:8px;resize:vertical}.highlight{border:2px solid blue;background-color:#0000ff1a}\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.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { 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.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.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"] }] });
165
- }
166
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ElementComponent, decorators: [{
167
- type: Component,
168
- args: [{ selector: 'app-element', template: "<!-- AP 22JAN25 - form preview and All form elements -->\n <!-- AP 25FEB25 - All elements update -->\n<div class=\"center-frame\">\n <link href=\"https://fonts.googleapis.com/css?family=Roboto:300,400,500&display=swap\" rel=\"stylesheet\">\n\n<!-- Form Builder Section All Elements -->\n<div class=\"form-builder\">\n <ng-container *ngFor=\"let element of elements\">\n <div class=\"element\" (click)=\"addElement(element.type)\">\n <img src=\"../assets/icons/{{ element.img }}.svg\">\n <div class=\"hover-label\">{{ element.label }}</div>\n </div>\n </ng-container>\n</div>\n \n<div class=\"form-preview\" cdkDropList [cdkDropListData]=\"formElements\" (cdkDropListDropped)=\"drop($event)\">\n<ng-container *ngFor=\"let field of formElements; let i = index\" getProperties().elementProps>\n\n<!-- TextBox -->\n<div *ngIf=\"field.type === 'Text'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\" \n [class.highlight]=\"selectedFieldIndex === i\" cdkDrag> \n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <label [class.required]=\"field.isRequired\">{{ field.questionText ? field.questionText : 'Label' }}</label>\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div> \n <input type=\"text\" class=\"custom-input\" [placeholder]=\"field.question || 'Enter text'\" [readonly]=\"field.isReadOnly\" \n [class.hidden]=\"field.isHidden\" />\n </div>\n </div>\n</div>\n\n<!-- Calendar -->\n<div *ngIf=\"field.type === 'Calendar'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\" \n [class.highlight]=\"selectedFieldIndex === i\" cdkDrag>\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <label [class.required]=\"field.isRequired\">{{ field.questionText ? field.questionText : 'Select Date' }}</label>\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n <input type=\"date\" class=\"custom-input\" [readonly]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\"/>\n </div>\n </div>\n</div>\n\n<!-- Email -->\n<div *ngIf=\"field.type === 'Email'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\" \n[class.highlight]=\"selectedFieldIndex === i\" cdkDrag>\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <label [class.required]=\"field.isRequired\"> {{ field.questionText ? field.questionText : 'Label' }} </label>\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div> \n <input type=\"email\" class=\"custom-input\" [placeholder]=\"field.question || 'Enter email'\" [readonly]=\"field.isReadOnly\" \n [class.hidden]=\"field.isHidden\" />\n </div>\n </div>\n</div>\n\n<!-- Numbers -->\n<div *ngIf=\"field.type === 'Number'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\" \n [class.highlight]=\"selectedFieldIndex === i\" cdkDrag> \n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <label [class.required]=\"field.isRequired\">{{ field.questionText ? field.questionText : 'Label' }}</label>\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div> \n <input type=\"number\" class=\"custom-input\" [placeholder]=\"field.question || 'Enter number'\" [readonly]=\"field.isReadOnly\" \n [class.hidden]=\"field.isHidden\"/>\n </div>\n </div>\n</div>\n \n<!-- TextArea -->\n<div *ngIf=\"field.type === 'TextArea'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\" \n [class.highlight]=\"selectedFieldIndex === i\" cdkDrag>\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <label [class.required]=\"field.isRequired\">{{ field.questionText ? field.questionText : 'Enter your text' }}\n <span *ngIf=\"field.required\" class=\"text-red-500\">*</span>\n </label>\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div> \n <textarea class=\"custom-textarea\" [placeholder]=\"field.question || 'Enter detailed text here...'\" [style.height.px]=\"field.size || 100\"\n [readonly]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\">\n </textarea>\n </div>\n </div>\n</div>\n\n<!-- Label -->\n<div *ngIf=\"field.type === 'Label'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\"\n[class.highlight]=\"selectedFieldIndex === i\" cdkDrag>\n<div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <label [class.required]=\"field.isRequired\">{{ field.questionText ? field.questionText : 'Label' }}</label>\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\"/>\n </div>\n </div>\n </div>\n</div>\n\n<!-- Image -->\n<div *ngIf=\"field.type === 'Image'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\" \n[class.highlight]=\"selectedFieldIndex === i\" cdkDrag>\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <label [class.required]=\"field.isRequired\"> {{ field.questionText ? field.questionText : 'Upload Image' }} </label>\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" />\n </div>\n <input type=\"file\" accept=\"image/*\" class=\"custom-input\" [readonly]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\"/>\n </div>\n </div>\n</div>\n\n <!-- File -->\n<div *ngIf=\"field.type === 'File'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\" \n [class.highlight]=\"selectedFieldIndex === i\" cdkDrag>\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <label [class.required]=\"field.isRequired\">{{ field.questionText ? field.questionText : 'Upload File' }}</label>\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n <input type=\"file\" class=\"custom-input\" [readonly]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\"/>\n </div>\n </div>\n</div>\n \n<!-- CheckBox -->\n<div *ngIf=\"field.type === 'CheckBox'\" class=\"checkbox-field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\" \n[ class.highlight]=\"selectedFieldIndex === i\" cdkDrag>\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\"> \n <label [class.required]=\"field.isRequired\">{{ field.questionText ? field.questionText : 'Label' }}</label>\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n <div class=\"checkbox-options-container\">\n <div *ngFor=\"let option of field.options\" class=\"checkbox-option\">\n <input type=\"checkbox\" [id]=\"option.value + i\" [name]=\"field.id\" [value]=\"option.label\" class=\"checkbox-input\"[readonly]=\"field.isReadOnly\" \n [class.hidden]=\"field.isHidden\">\n <label [for]=\"option.value + i\" class=\"checkbox-label\">{{ option.value }}</label>\n </div>\n </div>\n </div>\n </div>\n</div> \n\n<!-- Radio -->\n<div *ngIf=\"field.type === 'Radio'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\" \n[class.highlight]=\"selectedFieldIndex === i\" cdkDrag>\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\"> \n <label [class.required]=\"field.isRequired\">{{ field.questionText ? field.questionText : 'Label' }}</label>\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n <div class=\"radio-options-container\">\n <div *ngFor=\"let option of field.options; let j = index\" class=\"radio-option\">\n <input type=\"radio\" [id]=\"'radio-' + field.id + '-' + j\" [name]=\"'radio-group-' + field.id\" [value]=\"option.value\"\n [(ngModel)]=\"field.selectedValue\" class=\"radio-input\" [readonly]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\">\n <label [for]=\"'radio-' + field.id + '-' + j\" class=\"radio-label\"> {{ option.value }}</label>\n </div>\n </div>\n </div>\n </div>\n</div>\n \n<!-- Dropdown -->\n<div *ngIf=\"field.type === 'Dropdown'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\" \n[class.highlight]=\"selectedFieldIndex === i\" cdkDrag>\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\"> \n <label [class.required]=\"field.isRequired\">{{ field.questionText ? field.questionText : 'Label' }}</label>\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n <select id=\"options\" class=\"dropdown\"[disabled]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\" >\n <option *ngFor=\"let option of field.options\" [value]=\"option.value\"> {{ option.value }} </option>\n </select>\n </div>\n </div>\n</div>\n \n<!-- Tables -->\n<!-- <div *ngIf=\"field.type === 'Tables'\" class=\"table-container\" cdkDrag (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\">\n <label>{{ field.questionText }}</label>\n <table [style.width.px]=\"field.colWidth\" [style.height.%]=\"field.rowHeight\">\n <thead><tr><th *ngFor=\"let header of field.headers\" [style.width.px]=\"field.colWidth / field.colNos\">{{ header }}</th></tr></thead>\n <tbody><tr *ngFor=\"let row of field.rows\"><td *ngFor=\"let cell of row\">{{ cell }}</td></tr></tbody>\n </table>\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" />\n</div> -->\n\n <!-- Book -->\n<!-- <div *ngIf=\"field.type === 'Book'\" style=\"padding: 10px; background-color: whitesmoke;\" (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\" cdkDrag>\n <div class=\"flex\" style=\"display: flex;\">\n <div class=\"all-dots\"><div *ngFor=\"let _ of [1,2,3,4,5,6,7,8]\"></div></div>\n <div style=\"width: 97%;\">\n <div class=\"flex lab-conatiner\">\n <label [class.required]=\"field.required\">{{ field.questionText ? field.questionText : 'Book Title' }}</label>\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" />\n </div>\n </div>\n </div>\n</div> -->\n\n<!-- List -->\n<!-- <div *ngIf=\"field.type === 'List'\" class=\"list-container\" cdkDrag (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\">\n <label>{{ field.questionText }}</label>\n <ul><li *ngFor=\"let item of field.items\">{{ item }}</li></ul>\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" />\n </div> -->\n \n<!-- Button -->\n<!-- <div *ngIf=\"field.type === 'Button'\" class=\"button-container\" cdkDrag (click)=\"selectElement(i)\" [ngStyle]=\"getFontStyles(field)\">\n <button>{{ field.questionText }}</button>\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" />\n </div> -->\n\n</ng-container>\n</div>\n</div>\n\n\n\n\n", styles: [".center-frame{display:flex;border:10px solid #86A8CD;border-right-width:0}.form-builder{width:25%;height:100vh;overflow-y:auto;background-color:#fff;padding:10px;border-radius:10px;box-shadow:2px 2px 10px #0000001a}.form-builder .element{display:flex;align-items:center;gap:15px;margin-top:10px;padding:10px;border-radius:5px;background:#e9ecef;cursor:pointer;transition:background .3s ease,color .3s ease;color:#000}.form-builder .element:hover{background:#0250d9;color:#fff}.form-builder .element img{width:20px;height:20px;transition:filter .3s ease}.form-builder .element:hover img{filter:invert(1)}.form-builder .hover-label{font-size:14px;font-weight:500;color:#000;transition:color .3s ease}.form-builder .element:hover .hover-label{color:#fff}.form-builder .section-title{font-weight:700;font-size:16px;margin-top:10px;padding:5px;border-bottom:1px solid #ddd;color:#000}.form-builder .section-title:after{content:\"\\25bc\";float:right;font-size:12px;color:#555}.form-builder .section{margin-bottom:10px}.field-container{padding-right:5px;padding-left:5px}.field-wrapper{background-color:#eff8ff;border:1px solid #E6F3FF;border-radius:5px;padding:10px}.required:after{content:\"*\";color:red;margin-left:5px}.custom-input{width:100%;padding:8px;border:1px solid #DDDBDA;background-color:#fff;border-radius:5px;outline:none}.custom-input:focus{border-color:#00008b;box-shadow:0 0 5px #0000ff80}.delete-icon{width:20px;height:20px;cursor:pointer;opacity:0;visibility:hidden;transition:opacity .1s ease-in-out}.label-container:hover .delete-icon{opacity:1;visibility:visible}.form-preview{width:100%;height:100vh;overflow-y:auto;display:flex;flex-wrap:wrap;align-items:flex-start;padding:10px;height:fit-content;max-height:100vh}.field-content{display:flex;flex-direction:column;gap:5px}.label-container{display:flex;justify-content:space-between;align-items:center}.custom-input,.custom-textarea,.dropdown,.checkbox-options-container,.radio-options-container{width:100%}.dropdown{width:100%;padding:8px;border:1px solid #ccc;border-radius:4px;background-color:#fff;font-size:14px;color:#333;outline:none;cursor:pointer}.dropdown:focus{border-color:#007bff;box-shadow:0 0 5px #007bff80}.checkbox-field-container:hover{box-shadow:0 2px 8px #0000001a}.checkbox-options-container{display:flex;flex-direction:column;gap:5px;padding:8px;min-height:38px;border:1px solid #DDDBDA;background-color:#fff;outline:none;border-radius:6px}.checkbox-option,.radio-option{display:flex;align-items:center;gap:8px;padding:8px;background-color:#fff;border-radius:4px;transition:background-color .2s ease}.checkbox-option:hover{background-color:#f1f3f5}.checkbox-input,.radio-input{width:18px;height:18px;accent-color:#4dabf7;cursor:pointer}.checkbox-label,.radio-label{font-size:14px;color:#495057;cursor:pointer;-webkit-user-select:none;user-select:none}.label-container label{font-size:16px;font-weight:600}.required:after{content:\" *\";color:red}.radio-options-container{display:flex;flex-direction:column;gap:5px;padding:8px;min-height:38px;border:1px solid #DDDBDA;background-color:#fff;outline:none;border-radius:6px}.radio-input:checked{border-color:#007bff;background-color:#007bff}.radio-input:checked:after{content:\"\";width:8px;height:8px;background:#fff;border-radius:50%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.custom-textarea{width:100%;min-height:100px;border:1px solid #ccc;border-radius:4px;padding:8px;resize:vertical}.highlight{border:2px solid blue;background-color:#0000ff1a}\n"] }]
169
- }], ctorParameters: () => [{ type: i1.FormBuilderService }], propDecorators: { bookletJSON: [{
170
- type: Input
171
- }], bookletId: [{
172
- type: Input
173
- }] } });
174
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxlbWVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtYXBwL3NyYy9saWIvcGFnZXMvYnVpbGRlci9lbGVtZW50L2VsZW1lbnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnh0LWFwcC9zcmMvbGliL3BhZ2VzL2J1aWxkZXIvZWxlbWVudC9lbGVtZW50LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGtEQUFrRDtBQUNsRCxPQUFPLEVBQUMsU0FBUyxFQUFnQixLQUFLLEVBQXdCLE1BQU0sZUFBZSxDQUFDO0FBQ3BGLE9BQU8sRUFBZSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV0RSxPQUFPLEVBQUUsRUFBRSxJQUFJLE1BQU0sRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7O0FBUXBDLE1BQU0sT0FBTyxnQkFBZ0I7SUFVUDtJQVJwQiw4REFBOEQ7SUFDckQsV0FBVyxDQUFNO0lBQ2pCLFNBQVMsQ0FBTTtJQUN4QixLQUFLLENBQU07SUFDWCxZQUFZLEdBQVUsRUFBRSxDQUFDO0lBQ3pCLFFBQVEsR0FBVSxFQUFFLENBQUM7SUFDckIsTUFBTSxDQUFTO0lBQ2Ysb0JBQW9CO0lBQ3BCLFlBQW9CLGtCQUFzQztRQUF0Qyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO0lBQzFELENBQUM7SUFFSCxRQUFRO1FBQ04sSUFBSSxDQUFDLFFBQVEsR0FBRztZQUNkLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUU7WUFDOUQsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRTtZQUM5RCxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxP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QUFzRjtRQUN0RiwrRkFBK0Y7UUFDL0YsSUFBSTtRQUVKLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7d0dBdEtZLGdCQUFnQjs0RkFBaEIsZ0JBQWdCLHdJQ1o3QixpN1hBMk9BOzs0RkQvTmEsZ0JBQWdCO2tCQU41QixTQUFTOytCQUNFLGFBQWE7dUZBUWQsV0FBVztzQkFBbkIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQVAgMjJKQU4yNSAtIGZvcm0gcHJldmlldyBhbmQgQWxsIGZvcm0gZWxlbWVudHNcbmltcG9ydCB7Q29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXN9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2RrRHJhZ0Ryb3AsIG1vdmVJdGVtSW5BcnJheSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZm9ybS1idWlsZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1lbGVtZW50JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2VsZW1lbnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9lbGVtZW50LmNvbXBvbmVudC5jc3MnXSxcbn0pXG5cbmV4cG9ydCBjbGFzcyBFbGVtZW50Q29tcG9uZW50IHtcblxuICAvL0BPdXRwdXQoKSBlbGVtZW50QnV0dG9uQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBASW5wdXQoKSBib29rbGV0SlNPTjogYW55O1xuICBASW5wdXQoKSBib29rbGV0SWQ6IGFueTtcbiAgZmllbGQ6IGFueTtcbiAgZm9ybUVsZW1lbnRzOiBhbnlbXSA9IFtdO1xuICBlbGVtZW50czogYW55W10gPSBbXTtcbiAgYm9va0lkOiBzdHJpbmc7XG4gIC8vc3Vic2NyaXB0aW9uOiBhbnk7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZm9ybUJ1aWxkZXJTZXJ2aWNlOiBGb3JtQnVpbGRlclNlcnZpY2UpIHtcbiAgfVxuIFxubmdPbkluaXQoKSB7XG4gIHRoaXMuZWxlbWVudHMgPSBbXG4gICAgeyBcInR5cGVcIjogXCJDYWxlbmRhclwiLCBcImltZ1wiOiBcIkNhbGVuZGFyXCIsIFwibGFiZWxcIjogXCJDYWxlbmRhclwiIH0sXG4gICAgeyBcInR5cGVcIjogXCJDaGVja0JveFwiLCBcImltZ1wiOiBcIkNoZWNrQm94XCIsIFwibGFiZWxcIjogXCJDaGVja0JveFwiIH0sXG4gICAgeyBcInR5cGVcIjogXCJFbWFpbFwiLCBcImltZ1wiOiBcIkVtYWlsXCIsIFwibGFiZWxcIjogXCJFbWFpbFwiIH0sXG4gICAgeyBcInR5cGVcIjogXCJGaWxlXCIsIFwiaW1nXCI6IFwiRmlsZVwiLCBcImxhYmVsXCI6IFwiRmlsZVwiIH0sXG4gICAgeyBcInR5cGVcIjogXCJJbWFnZVwiLCBcImltZ1wiOiBcIkltYWdlXCIsIFwibGFiZWxcIjogXCJJbWFnZVwiIH0sXG4gICAgeyBcInR5cGVcIjogXCJOdW1iZXJcIiwgXCJpbWdcIjogXCJOdW1iZXJcIiwgXCJsYWJlbFwiOiBcIk51bWJlclwiIH0sXG4gICAgeyBcInR5cGVcIjogXCJMaXN0XCIsIFwiaW1nXCI6IFwiTGlzdFwiLCBcImxhYmVsXCI6IFwiTGlzdFwiIH0sXG4gICAgeyBcInR5cGVcIjogXCJSYWRpb1wiLCBcImltZ1wiOiBcIlJhZGlvXCIsIFwibGFiZWxcIjogXCJSYWRpb1wiIH0sXG4gICAgeyBcInR5cGVcIjogXCJUZXh0XCIsIFwiaW1nXCI6IFwiVGV4dFwiLCBcImxhYmVsXCI6IFwiVGV4dFwiIH0sXG4gICAgeyBcInR5cGVcIjogXCJUYWJsZXNcIiwgXCJpbWdcIjogXCJUYWJsZVwiLCBcImxhYmVsXCI6IFwiVGFibGVcIiB9LFxuICAgIHsgXCJ0eXBlXCI6IFwiRHJvcGRvd25cIiwgXCJpbWdcIjogXCJEcm9wXCIsIFwibGFiZWxcIjogXCJEcm9wZG93blwiIH0sXG4gICAgeyBcInR5cGVcIjogXCJUZXh0QXJlYVwiLCBcImltZ1wiOiBcIlRleHRBcmVhXCIsIFwibGFiZWxcIjogXCJUZXh0QXJlYVwiIH0sXG4gICAgeyBcInR5cGVcIjogXCJMYWJlbFwiLCBcImltZ1wiOiBcIkxhYmVsXCIsIFwibGFiZWxcIjogXCJMYWJlbFwiIH0sXG4gICAgeyBcInR5cGVcIjogXCJCb29rXCIsIFwiaW1nXCI6IFwiQm9va1wiLCBcImxhYmVsXCI6IFwiQm9va1wiIH0sXG4gICAgeyBcInR5cGVcIjogXCJCdXR0b25cIiwgXCJpbWdcIjogXCJCdXR0b25cIiwgXCJsYWJlbFwiOiBcIkJ1dHRvblwiIH1cbiAgXTtcbiAgdGhpcy5mb3JtQnVpbGRlclNlcnZpY2UuZm9ybUVsZW1lbnRzJC5zdWJzY3JpYmUoKGVsZW1lbnRzKSA9PiB7XG4gICAgIHRoaXMuZm9ybUVsZW1lbnRzID0gZWxlbWVudHM7XG4gfSk7XG4gaWYgKHRoaXMuYm9va2xldEpTT04pIHtcbiAgdGhpcy5pbml0aWFsaXplRm9ybSgpO1xufSBlbHNlIHtcbiAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3N0YXR1cycsIFwibmV3XCIpO1xufVxufVxuXG4vLyBBUCAtIDI2RkVCMjUgLSBBZGRlZCBuZ09uQ2hhbmdlcyB0byBoYW5kbGUgY2hhbmdlcyBpbiBib29rbGV0SlNPTlxubmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICBpZiAoY2hhbmdlc1snYm9va2xldEpTT04nXSAmJiBjaGFuZ2VzWydib29rbGV0SlNPTiddLmN1cnJlbnRWYWx1ZSkge1xuICAgIHRoaXMuaW5pdGlhbGl6ZUZvcm0oKTtcbiAgICBjb25zb2xlLmxvZygnY2hhbmdlcycsIGNoYW5nZXMpO1xuICB9XG59XG5cbnByaXZhdGUgaW5pdGlhbGl6ZUZvcm0oKSB7XG4gIGlmICghdGhpcy5ib29rbGV0SlNPTiB8fCAhdGhpcy5ib29rbGV0SlNPTi5ib29rUXVlc3Rpb25zTWFwKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJJbnZhbGlkIGJvb2tsZXRKU09OIHN0cnVjdHVyZVwiKTtcbiAgICAgIHJldHVybjtcbiAgfVxuXG4gIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdzdGF0dXMnLCBcImVkaXRcIik7XG4gIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd1bmlxdWVfaWQnLCB0aGlzLmJvb2tsZXRJZCk7XG4gIHRoaXMuZm9ybUVsZW1lbnRzID0gW107XG4gIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmNsZWFyRWxlbWVudHMoKTtcblxuICBjb25zdCBib29rUXVlc3Rpb25zTWFwS2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuYm9va2xldEpTT04uYm9va1F1ZXN0aW9uc01hcCk7XG4gIGlmIChib29rUXVlc3Rpb25zTWFwS2V5cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICB0aGlzLmJvb2tJZCA9IGJvb2tRdWVzdGlvbnNNYXBLZXlzWzBdO1xuXG4gIHRoaXMuYm9va2xldEpTT04uYm9va1F1ZXN0aW9uc01hcFt0aGlzLmJvb2tJZF0/LnN1YlF1ZXN0aW9ucz8uZm9yRWFjaChuZXdFbGVtZW50ID0+IHtcbiAgICAgIGlmICh0aGlzLmJvb2tsZXRKU09OLnNxT3B0aW9ucz8uW25ld0VsZW1lbnQuaWRdKSB7XG4gICAgICAgICAgbmV3RWxlbWVudC5vcHRpb25zID0gdGhpcy5ib29rbGV0SlNPTi5zcU9wdGlvbnNbbmV3RWxlbWVudC5pZF0ub3B0aW9ucztcbiAgICAgIH1cbiAgICAgIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmFkZEVsZW1lbnQobmV3RWxlbWVudCk7XG4gIH0pO1xuXG4gIHRoaXMuZm9ybUVsZW1lbnRzID0gdGhpcy5mb3JtQnVpbGRlclNlcnZpY2UuZ2V0RWxlbWVudHMoKTtcbn1cblxuLy8gbmdPbkRlc3Ryb3koKSB7XG4vLyAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4vLyB9XG5cbmRyb3AoZXZlbnQ6IENka0RyYWdEcm9wPHN0cmluZ1tdPikge1xuICAgIG1vdmVJdGVtSW5BcnJheSh0aGlzLmZvcm1FbGVtZW50cywgZXZlbnQucHJldmlvdXNJbmRleCwgZXZlbnQuY3VycmVudEluZGV4KTtcbn1cblxuLy8gQWRkIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBlbGVtZW50IHNlbGVjdGlvblxuc2VsZWN0RWxlbWVudChpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZWxlY3RlZEZpZWxkSW5kZXggPSBpbmRleDsgLy8gZWxlbWVudCBpcyBzZWxlY3RlZFxuICAgIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLnNldFNlbGVjdGVkRWxlbWVudChpbmRleCk7XG4gICAgLy9jb25zdCBlbGVtZW50ID0gdGhpcy5mb3JtRWxlbWVudHNbaW5kZXhdO1xuICAgIC8vIHRoaXMuZWxlbWVudEJ1dHRvbkNsaWNrZWQuZW1pdChlbGVtZW50LnR5cGUpOyAgXG59XG4vL3NlbGVjdGVkSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuc2VsZWN0ZWRGaWVsZEluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDsgLy8gZWxlbWVudCBpcyBjbGVhcmVkXG5cbmFkZEVsZW1lbnQodHlwZTogc3RyaW5nKTogdm9pZCB7XG4gICBjb25zdCB1bmlxdWVfaWQgPSB1dWlkdjQoKTtcbiAgICBjb25zdCBuZXdFbGVtZW50ID0ge1xuICAgICAgaWQ6IHVuaXF1ZV9pZCxcbiAgICAgIHVpZDogdW5pcXVlX2lkLFxuICAgICAgdHlwZSxcbiAgICAgIG5hbWU6ICcnLFxuICAgICAgcXVlc3Rpb25UZXh0OiAnJyxcbiAgICAgIHF1ZXN0aW9uOiAnJyxcbiAgICAgIGhlbHBUZXh0OiAnJyxcbiAgICAgIGVycm9yTWVzc2FnZTogJycsXG4gICAgICBpc1JlYWRPbmx5OiBmYWxzZSxcbiAgICAgIGlzSGlkZGVuOiBmYWxzZSxcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIHN1YlRleHQ6ICcnLFxuICAgICAgcmVmZXJlbmNlRmllbGQ6ICcnLFxuICAgICAgYWRkaXRpb25hbFJpY2hDb250ZW50OiAnJyxcbiAgICAgIGdyb3VwTmFtZTogJycsXG4gICAgICBpc0RhdGVCYWNrd2FyZDogZmFsc2UsXG4gICAgICB0aXRsZTogJycsXG4gICAgICBzdWJUaXRsZTogJycsXG4gICAgICBpc0RhdGVGb3J3YXJkOiBmYWxzZSxcbiAgICAgIGlzT3B0aW9uYWw6IGZhbHNlLFxuICAgICAgaXNUaXRsZTogZmFsc2UsXG4gICAgICBuZXh0UXVlc3Rpb246ICcnLFxuICAgICAgYWxsb3dlZEZpbGVFeHRlbnNpb25zOiAnJyxcbiAgICAgIHF1ZXN0aW9uTnVtYmVyOiB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5nZXRFbGVtZW50cygpLmxlbmd0aCArIDEsXG4gICAgICBxdWVzdGlvbkJvb2tJZDogJycsXG4gICAgICBwYXJlbnRRdWVzdGlvbjogJycsXG4gICAgICBmaWVsZHNNZXRhOiAnJyxcbiAgICAgIHJlY29yZFR5cGVOYW1lOiAnJyxcbiAgICAgIHJlY29yZFR5cGVJZDogJycsXG4gICAgICB0cmFja2luZ0lkOiAnJyxcbiAgICAgIGRhdGVUZXh0OiAnJyxcbiAgICAgIHRpbWVUZXh0OiAnJyxcbiAgICAgIHJlY29yZElkOiAnJyxcbiAgICAgIHFiUmVmZXJlbmNlOiAnJyxcbiAgICAgIHFiUmVmZXJlbmNlUXVlc3Rpb25zOiAnJyxcbiAgICAgIHF1ZXN0aW9uQm9va1N1YlRpdGxlOiAnJyxcbiAgICAgIHN0eWxlOiAnJyxcbiAgICAgIG9wdGlvbnM6IHR5cGUgPT09ICdEcm9wZG93bicgfHwgdHlwZSA9PT0gJ1JhZGlvJyB8fCB0eXBlID09PSAnQ2hlY2tCb3gnID8gW10gOiBudWxsLFxuICAgIFxuICAgIH07XG4gICAgdGhpcy5mb3JtQnVpbGRlclNlcnZpY2UuYWRkRWxlbWVudChuZXdFbGVtZW50KTtcbiAgICB0aGlzLmZvcm1FbGVtZW50cyA9IHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmdldEVsZW1lbnRzKCk7XG59XG5cbi8vIFJlbW92ZSBhbiBlbGVtZW50IGJ5IGluZGV4XG5yZW1vdmVFbGVtZW50KGZpZWxkOiBhbnksaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLnJlbW92ZUVsZW1lbnRDb21wb25lbnQoZmllbGQuaWQpO1xuICAgIHRoaXMuZm9ybUVsZW1lbnRzPXRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmdldEVsZW1lbnRzKCk7XG59XG4gIFxuZ2V0Rm9udFN0eWxlcyhmaWVsZDogYW55KTogYW55IHtcbiAgY29uc3Qgc3R5bGVzOiBhbnkgPSB7XG4gICAgICAnZm9udC1mYW1pbHknOiBmaWVsZC5mb250IHx8ICdIZWx2ZXRpY2EgTmV1ZScsXG4gICAgICAnZm9udC13ZWlnaHQnOiBmaWVsZC5mb250V2VpZ2h0IHx8ICc0MDAnLFxuICAgICAgJ3dpZHRoJzogZmllbGQuc2l6ZSA/IGAkeyhmaWVsZC5zaXplIC8gMTIpICogMTAwfSVgIDogJzEwMCUnLFxuICAgICAgJ21pbi1oZWlnaHQnOiBmaWVsZC5oZWlnaHQgPyBgJHtmaWVsZC5oZWlnaHR9cHhgIDogJ2F1dG8nLFxuICAgICAgJ3RleHQtYWxpZ24nOiBmaWVsZC50ZXh0QWxpZ24gfHwgJ2xlZnQnLFxuICAgICAgJ2JvcmRlci1yYWRpdXMnOiAnNXB4JyxcbiAgICAgICdtYXJnaW4tYm90dG9tJzogJzEwcHgnXG4gIH07XG5cbiAgLy8gaWYgKEFycmF5LmlzQXJyYXkoZmllbGQuc3R5bGVzKSkge1xuICAvLyAgICAgc3R5bGVzWydmb250LXdlaWdodCddID0gZmllbGQuc3R5bGVzLmluY2x1ZGVzKCdib2xkJykgPyAnNzAwJyA6IHN0eWxlc1snZm9udC13ZWlnaHQnXTtcbiAgLy8gICAgIHN0eWxlc1snZm9udC1zdHlsZSddID0gZmllbGQuc3R5bGVzLmluY2x1ZGVzKCdpdGFsaWMnKSA/ICdpdGFsaWMnIDogdW5kZWZpbmVkO1xuICAvLyAgICAgc3R5bGVzWyd0ZXh0LWRlY29yYXRpb24nXSA9IGZpZWxkLnN0eWxlcy5pbmNsdWRlcygndW5kZXJsaW5lJykgPyAndW5kZXJsaW5lJyA6IHVuZGVmaW5lZDtcbiAgLy8gICAgIHN0eWxlc1sndGV4dC10cmFuc2Zvcm0nXSA9IGZpZWxkLnN0eWxlcy5pbmNsdWRlcygnY2FwaXRhbGl6ZScpID8gJ2NhcGl0YWxpemUnIDpcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnN0eWxlcy5pbmNsdWRlcygnbG93ZXJjYXNlJykgPyAnbG93ZXJjYXNlJyA6IHVuZGVmaW5lZDtcbiAgLy8gfVxuXG4gIHJldHVybiBzdHlsZXM7XG59XG5cbn1cblxuXG4iLCI8IS0tIEFQIDIySkFOMjUgLSBmb3JtIHByZXZpZXcgYW5kIEFsbCBmb3JtIGVsZW1lbnRzIC0tPlxuIDwhLS0gQVAgMjVGRUIyNSAtIEFsbCBlbGVtZW50cyB1cGRhdGUgLS0+XG48ZGl2IGNsYXNzPVwiY2VudGVyLWZyYW1lXCI+XG4gIDxsaW5rIGhyZWY9XCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9Um9ib3RvOjMwMCw0MDAsNTAwJmRpc3BsYXk9c3dhcFwiIHJlbD1cInN0eWxlc2hlZXRcIj5cblxuPCEtLSBGb3JtIEJ1aWxkZXIgU2VjdGlvbiBBbGwgRWxlbWVudHMgLS0+XG48ZGl2IGNsYXNzPVwiZm9ybS1idWlsZGVyXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZWxlbWVudCBvZiBlbGVtZW50c1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImVsZW1lbnRcIiAoY2xpY2spPVwiYWRkRWxlbWVudChlbGVtZW50LnR5cGUpXCI+XG4gICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL3t7IGVsZW1lbnQuaW1nIH19LnN2Z1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaG92ZXItbGFiZWxcIj57eyBlbGVtZW50LmxhYmVsIH19PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuICBcbjxkaXYgY2xhc3M9XCJmb3JtLXByZXZpZXdcIiBjZGtEcm9wTGlzdCBbY2RrRHJvcExpc3REYXRhXT1cImZvcm1FbGVtZW50c1wiIChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcCgkZXZlbnQpXCI+XG48bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBmb3JtRWxlbWVudHM7IGxldCBpID0gaW5kZXhcIiBnZXRQcm9wZXJ0aWVzKCkuZWxlbWVudFByb3BzPlxuXG48IS0tIFRleHRCb3ggLS0+XG48ZGl2ICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ1RleHQnXCIgY2xhc3M9XCJmaWVsZC1jb250YWluZXJcIiAoY2xpY2spPVwic2VsZWN0RWxlbWVudChpKVwiIFtuZ1N0eWxlXT1cImdldEZvbnRTdHlsZXMoZmllbGQpXCIgXG4gIFtjbGFzcy5oaWdobGlnaHRdPVwic2VsZWN0ZWRGaWVsZEluZGV4ID09PSBpXCIgY2RrRHJhZz4gIFxuICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiPlxuICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1jb250ZW50XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtY29udGFpbmVyXCI+XG4gICAgICAgIDxsYWJlbCBbY2xhc3MucmVxdWlyZWRdPVwiZmllbGQuaXNSZXF1aXJlZFwiPnt7IGZpZWxkLnF1ZXN0aW9uVGV4dCA/IGZpZWxkLnF1ZXN0aW9uVGV4dCA6ICdMYWJlbCcgfX08L2xhYmVsPlxuICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9UcmFzaC5zdmdcIiAoY2xpY2spPVwicmVtb3ZlRWxlbWVudChmaWVsZCwgaSlcIiBjbGFzcz1cImRlbGV0ZS1pY29uXCIgLz5cbiAgICAgIDwvZGl2PiAgICBcbiAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiY3VzdG9tLWlucHV0XCIgW3BsYWNlaG9sZGVyXT1cImZpZWxkLnF1ZXN0aW9uIHx8ICdFbnRlciB0ZXh0J1wiIFtyZWFkb25seV09XCJmaWVsZC5pc1JlYWRPbmx5XCIgXG4gICAgICBbY2xhc3MuaGlkZGVuXT1cImZpZWxkLmlzSGlkZGVuXCIgLz5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPCEtLSBDYWxlbmRhciAtLT5cbjxkaXYgKm5nSWY9XCJmaWVsZC50eXBlID09PSAnQ2FsZW5kYXInXCIgY2xhc3M9XCJmaWVsZC1jb250YWluZXJcIiAoY2xpY2spPVwic2VsZWN0RWxlbWVudChpKVwiIFtuZ1N0eWxlXT1cImdldEZvbnRTdHlsZXMoZmllbGQpXCIgXG4gIFtjbGFzcy5oaWdobGlnaHRdPVwic2VsZWN0ZWRGaWVsZEluZGV4ID09PSBpXCIgY2RrRHJhZz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxsYWJlbCBbY2xhc3MucmVxdWlyZWRdPVwiZmllbGQuaXNSZXF1aXJlZFwiPnt7IGZpZWxkLnF1ZXN0aW9uVGV4dCA/IGZpZWxkLnF1ZXN0aW9uVGV4dCA6ICdTZWxlY3QgRGF0ZScgfX08L2xhYmVsPlxuICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL1RyYXNoLnN2Z1wiIChjbGljayk9XCJyZW1vdmVFbGVtZW50KGZpZWxkLCBpKVwiICBjbGFzcz1cImRlbGV0ZS1pY29uXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwiZGF0ZVwiIGNsYXNzPVwiY3VzdG9tLWlucHV0XCIgW3JlYWRvbmx5XT1cImZpZWxkLmlzUmVhZE9ubHlcIiBbY2xhc3MuaGlkZGVuXT1cImZpZWxkLmlzSGlkZGVuXCIvPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cblxuPCEtLSBFbWFpbCAtLT5cbjxkaXYgKm5nSWY9XCJmaWVsZC50eXBlID09PSAnRW1haWwnXCIgY2xhc3M9XCJmaWVsZC1jb250YWluZXJcIiAoY2xpY2spPVwic2VsZWN0RWxlbWVudChpKVwiIFtuZ1N0eWxlXT1cImdldEZvbnRTdHlsZXMoZmllbGQpXCIgXG5bY2xhc3MuaGlnaGxpZ2h0XT1cInNlbGVjdGVkRmllbGRJbmRleCA9PT0gaVwiIGNka0RyYWc+XG4gICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtY29udGVudFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxsYWJlbCBbY2xhc3MucmVxdWlyZWRdPVwiZmllbGQuaXNSZXF1aXJlZFwiPiB7eyBmaWVsZC5xdWVzdGlvblRleHQgPyBmaWVsZC5xdWVzdGlvblRleHQgOiAnTGFiZWwnIH19IDwvbGFiZWw+XG4gICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9UcmFzaC5zdmdcIiAoY2xpY2spPVwicmVtb3ZlRWxlbWVudChmaWVsZCwgaSlcIiBjbGFzcz1cImRlbGV0ZS1pY29uXCIgLz5cbiAgICAgICAgICA8L2Rpdj4gICAgICAgIFxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZW1haWxcIiBjbGFzcz1cImN1c3RvbS1pbnB1dFwiIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5xdWVzdGlvbiB8fCAnRW50ZXIgZW1haWwnXCIgW3JlYWRvbmx5XT1cImZpZWxkLmlzUmVhZE9ubHlcIiBcbiAgICAgICAgICAgICAgICAgW2NsYXNzLmhpZGRlbl09XCJmaWVsZC5pc0hpZGRlblwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG48L2Rpdj5cblxuPCEtLSBOdW1iZXJzIC0tPlxuPGRpdiAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICdOdW1iZXInXCIgY2xhc3M9XCJmaWVsZC1jb250YWluZXJcIiAoY2xpY2spPVwic2VsZWN0RWxlbWVudChpKVwiIFtuZ1N0eWxlXT1cImdldEZvbnRTdHlsZXMoZmllbGQpXCIgXG4gW2NsYXNzLmhpZ2hsaWdodF09XCJzZWxlY3RlZEZpZWxkSW5kZXggPT09IGlcIiBjZGtEcmFnPiBcbiAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXdyYXBwZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtY29udGVudFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICA8bGFiZWwgW2NsYXNzLnJlcXVpcmVkXT1cImZpZWxkLmlzUmVxdWlyZWRcIj57eyBmaWVsZC5xdWVzdGlvblRleHQgPyBmaWVsZC5xdWVzdGlvblRleHQgOiAnTGFiZWwnIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvVHJhc2guc3ZnXCIgKGNsaWNrKT1cInJlbW92ZUVsZW1lbnQoZmllbGQsIGkpXCIgY2xhc3M9XCJkZWxldGUtaWNvblwiIC8+XG4gICAgICAgICAgICA8L2Rpdj4gICAgICAgICAgXG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGNsYXNzPVwiY3VzdG9tLWlucHV0XCIgW3BsYWNlaG9sZGVyXT1cImZpZWxkLnF1ZXN0aW9uIHx8ICdFbnRlciBudW1iZXInXCIgW3JlYWRvbmx5XT1cImZpZWxkLmlzUmVhZE9ubHlcIiBcbiAgICAgICAgICAgICAgICAgICBbY2xhc3MuaGlkZGVuXT1cImZpZWxkLmlzSGlkZGVuXCIvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbjwvZGl2PlxuICAgICAgXG48IS0tIFRleHRBcmVhIC0tPlxuPGRpdiAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICdUZXh0QXJlYSdcIiBjbGFzcz1cImZpZWxkLWNvbnRhaW5lclwiIChjbGljayk9XCJzZWxlY3RFbGVtZW50KGkpXCIgW25nU3R5bGVdPVwiZ2V0Rm9udFN0eWxlcyhmaWVsZClcIiBcbiBbY2xhc3MuaGlnaGxpZ2h0XT1cInNlbGVjdGVkRmllbGRJbmRleCA9PT0gaVwiIGNka0RyYWc+XG4gICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiPlxuICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtY29udGVudFwiPlxuICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1jb250YWluZXJcIj5cbiAgICAgICAgIDxsYWJlbCBbY2xhc3MucmVxdWlyZWRdPVwiZmllbGQuaXNSZXF1aXJlZFwiPnt7IGZpZWxkLnF1ZXN0aW9uVGV4dCA/IGZpZWxkLnF1ZXN0aW9uVGV4dCA6ICdFbnRlciB5b3VyIHRleHQnIH19XG4gICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZmllbGQucmVxdWlyZWRcIiBjbGFzcz1cInRleHQtcmVkLTUwMFwiPio8L3NwYW4+XG4gICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvVHJhc2guc3ZnXCIgKGNsaWNrKT1cInJlbW92ZUVsZW1lbnQoZmllbGQsIGkpXCIgY2xhc3M9XCJkZWxldGUtaWNvblwiIC8+XG4gICAgICAgPC9kaXY+ICAgIFxuICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cImN1c3RvbS10ZXh0YXJlYVwiIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5xdWVzdGlvbiB8fCAnRW50ZXIgZGV0YWlsZWQgdGV4dCBoZXJlLi4uJ1wiIFtzdHlsZS5oZWlnaHQucHhdPVwiZmllbGQuc2l6ZSB8fCAxMDBcIlxuICAgICAgIFtyZWFkb25seV09XCJmaWVsZC5pc1JlYWRPbmx5XCIgW2NsYXNzLmhpZGRlbl09XCJmaWVsZC5pc0hpZGRlblwiPlxuICAgICAgIDwvdGV4dGFyZWE+XG4gICAgIDwvZGl2PlxuICAgPC9kaXY+XG48L2Rpdj5cblxuPCEtLSBMYWJlbCAtLT5cbjxkaXYgKm5nSWY9XCJmaWVsZC50eXBlID09PSAnTGFiZWwnXCIgY2xhc3M9XCJmaWVsZC1jb250YWluZXJcIiAoY2xpY2spPVwic2VsZWN0RWxlbWVudChpKVwiIFtuZ1N0eWxlXT1cImdldEZvbnRTdHlsZXMoZmllbGQpXCJcbltjbGFzcy5oaWdobGlnaHRdPVwic2VsZWN0ZWRGaWVsZEluZGV4ID09PSBpXCIgY2RrRHJhZz5cbjxkaXYgY2xhc3M9XCJmaWVsZC13cmFwcGVyXCI+XG4gPGRpdiBjbGFzcz1cImZpZWxkLWNvbnRlbnRcIj5cbiAgIDxkaXYgY2xhc3M9XCJsYWJlbC1jb250YWluZXJcIj5cbiAgICAgICAgPGxhYmVsIFtjbGFzcy5yZXF1aXJlZF09XCJmaWVsZC5pc1JlcXVpcmVkXCI+e3sgZmllbGQucXVlc3Rpb25UZXh0ID8gZmllbGQucXVlc3Rpb25UZXh0IDogJ0xhYmVsJyB9fTwvbGFiZWw+XG4gICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL1RyYXNoLnN2Z1wiIChjbGljayk9XCJyZW1vdmVFbGVtZW50KGZpZWxkLCBpKVwiIGNsYXNzPVwiZGVsZXRlLWljb25cIi8+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPCEtLSBJbWFnZSAtLT5cbjxkaXYgKm5nSWY9XCJmaWVsZC50eXBlID09PSAnSW1hZ2UnXCIgY2xhc3M9XCJmaWVsZC1jb250YWluZXJcIiAoY2xpY2spPVwic2VsZWN0RWxlbWVudChpKVwiIFtuZ1N0eWxlXT1cImdldEZvbnRTdHlsZXMoZmllbGQpXCIgXG5bY2xhc3MuaGlnaGxpZ2h0XT1cInNlbGVjdGVkRmllbGRJbmRleCA9PT0gaVwiIGNka0RyYWc+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiPlxuICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1jb250ZW50XCI+XG4gICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtY29udGFpbmVyXCI+XG4gICAgICAgIDxsYWJlbCBbY2xhc3MucmVxdWlyZWRdPVwiZmllbGQuaXNSZXF1aXJlZFwiPiB7eyBmaWVsZC5xdWVzdGlvblRleHQgPyBmaWVsZC5xdWVzdGlvblRleHQgOiAnVXBsb2FkIEltYWdlJyB9fSA8L2xhYmVsPlxuICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9UcmFzaC5zdmdcIiAoY2xpY2spPVwicmVtb3ZlRWxlbWVudChmaWVsZCwgaSlcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBhY2NlcHQ9XCJpbWFnZS8qXCIgY2xhc3M9XCJjdXN0b20taW5wdXRcIiBbcmVhZG9ubHldPVwiZmllbGQuaXNSZWFkT25seVwiIFtjbGFzcy5oaWRkZW5dPVwiZmllbGQuaXNIaWRkZW5cIi8+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbiA8IS0tIEZpbGUgLS0+XG48ZGl2ICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ0ZpbGUnXCIgY2xhc3M9XCJmaWVsZC1jb250YWluZXJcIiAoY2xpY2spPVwic2VsZWN0RWxlbWVudChpKVwiIFtuZ1N0eWxlXT1cImdldEZvbnRTdHlsZXMoZmllbGQpXCIgXG4gIFtjbGFzcy5oaWdobGlnaHRdPVwic2VsZWN0ZWRGaWVsZEluZGV4ID09PSBpXCIgY2RrRHJhZz5cbiAgICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWNvbnRlbnRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLWNvbnRhaW5lclwiPlxuICAgICA8bGFiZWwgW2NsYXNzLnJlcXVpcmVkXT1cImZpZWxkLmlzUmVxdWlyZWRcIj57eyBmaWVsZC5xdWVzdGlvblRleHQgPyBmaWVsZC5xdWVzdGlvblRleHQgOiAnVXBsb2FkIEZpbGUnIH19PC9sYWJlbD5cbiAgICAgPGltZyAgc3JjPVwiLi4vYXNzZXRzL2ljb25zL1RyYXNoLnN2Z1wiIChjbGljayk9XCJyZW1vdmVFbGVtZW50KGZpZWxkLCBpKVwiIGNsYXNzPVwiZGVsZXRlLWljb25cIiAvPlxuICAgPC9kaXY+XG4gICA8aW5wdXQgdHlwZT1cImZpbGVcIiBjbGFzcz1cImN1c3RvbS1pbnB1dFwiIFtyZWFkb25seV09XCJmaWVsZC5pc1JlYWRPbmx5XCIgW2NsYXNzLmhpZGRlbl09XCJmaWVsZC5pc0hpZGRlblwiLz5cbiAgICA8L2Rpdj5cbiAgIDwvZGl2PlxuPC9kaXY+XG4gIFxuPCEtLSBDaGVja0JveCAtLT5cbjxkaXYgKm5nSWY9XCJmaWVsZC50eXBlID09PSAnQ2hlY2tCb3gnXCIgY2xhc3M9XCJjaGVja2JveC1maWVsZC1jb250YWluZXJcIiAoY2xpY2spPVwic2VsZWN0RWxlbWVudChpKVwiIFtuZ1N0eWxlXT1cImdldEZvbnRTdHlsZXMoZmllbGQpXCIgXG5bICAgICBjbGFzcy5oaWdobGlnaHRdPVwic2VsZWN0ZWRGaWVsZEluZGV4ID09PSBpXCIgY2RrRHJhZz5cbiAgICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWNvbnRlbnRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLWNvbnRhaW5lclwiPiAgIFxuICAgICAgICAgIDxsYWJlbCBbY2xhc3MucmVxdWlyZWRdPVwiZmllbGQuaXNSZXF1aXJlZFwiPnt7IGZpZWxkLnF1ZXN0aW9uVGV4dCA/IGZpZWxkLnF1ZXN0aW9uVGV4dCA6ICdMYWJlbCcgfX08L2xhYmVsPlxuICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL1RyYXNoLnN2Z1wiIChjbGljayk9XCJyZW1vdmVFbGVtZW50KGZpZWxkLCBpKVwiIGNsYXNzPVwiZGVsZXRlLWljb25cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94LW9wdGlvbnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGZpZWxkLm9wdGlvbnNcIiBjbGFzcz1cImNoZWNrYm94LW9wdGlvblwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtpZF09XCJvcHRpb24udmFsdWUgKyBpXCIgW25hbWVdPVwiZmllbGQuaWRcIiBbdmFsdWVdPVwib3B0aW9uLmxhYmVsXCIgY2xhc3M9XCJjaGVja2JveC1pbnB1dFwiW3JlYWRvbmx5XT1cImZpZWxkLmlzUmVhZE9ubHlcIiBcbiAgICAgICAgICAgIFtjbGFzcy5oaWRkZW5dPVwiZmllbGQuaXNIaWRkZW5cIj5cbiAgICAgICAgICAgIDxsYWJlbCBbZm9yXT1cIm9wdGlvbi52YWx1ZSArIGlcIiBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCI+e3sgb3B0aW9uLnZhbHVlIH19PC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PiAgXG5cbjwhLS0gUmFkaW8gLS0+XG48ZGl2ICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ1JhZGlvJ1wiIGNsYXNzPVwiZmllbGQtY29udGFpbmVyXCIgKGNsaWNrKT1cInNlbGVjdEVsZW1lbnQoaSlcIiBbbmdTdHlsZV09XCJnZXRGb250U3R5bGVzKGZpZWxkKVwiIFxuW2NsYXNzLmhpZ2hsaWdodF09XCJzZWxlY3RlZEZpZWxkSW5kZXggPT09IGlcIiBjZGtEcmFnPlxuICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiPlxuICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1jb250ZW50XCI+XG4gICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLWNvbnRhaW5lclwiPiAgIFxuICAgICAgICAgICAgICAgIDxsYWJlbCBbY2xhc3MucmVxdWlyZWRdPVwiZmllbGQuaXNSZXF1aXJlZFwiPnt7IGZpZWxkLnF1ZXN0aW9uVGV4dCA/IGZpZWxkLnF1ZXN0aW9uVGV4dCA6ICdMYWJlbCcgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL1RyYXNoLnN2Z1wiIChjbGljayk9XCJyZW1vdmVFbGVtZW50KGZpZWxkLCBpKVwiIGNsYXNzPVwiZGVsZXRlLWljb25cIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFkaW8tb3B0aW9ucy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZmllbGQub3B0aW9uczsgbGV0IGogPSBpbmRleFwiIGNsYXNzPVwicmFkaW8tb3B0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBbaWRdPVwiJ3JhZGlvLScgKyBmaWVsZC5pZCArICctJyArIGpcIiBbbmFtZV09XCIncmFkaW8tZ3JvdXAtJyArIGZpZWxkLmlkXCIgIFt2YWx1ZV09XCJvcHRpb24udmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmaWVsZC5zZWxlY3RlZFZhbHVlXCIgY2xhc3M9XCJyYWRpby1pbnB1dFwiIFtyZWFkb25seV09XCJmaWVsZC5pc1JlYWRPbmx5XCIgW2NsYXNzLmhpZGRlbl09XCJmaWVsZC5pc0hpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgW2Zvcl09XCIncmFkaW8tJyArIGZpZWxkLmlkICsgJy0nICsgalwiIGNsYXNzPVwicmFkaW8tbGFiZWxcIj4ge3sgb3B0aW9uLnZhbHVlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuIFxuPCEtLSBEcm9wZG93biAtLT5cbjxkaXYgKm5nSWY9XCJmaWVsZC50eXBlID09PSAnRHJvcGRvd24nXCIgY2xhc3M9XCJmaWVsZC1jb250YWluZXJcIiAoY2xpY2spPVwic2VsZWN0RWxlbWVudChpKVwiIFtuZ1N0eWxlXT1cImdldEZvbnRTdHlsZXMoZmllbGQpXCIgXG5bY2xhc3MuaGlnaGxpZ2h0XT1cInNlbGVjdGVkRmllbGRJbmRleCA9PT0gaVwiIGNka0RyYWc+XG4gICAgPGRpdiBjbGFzcz1cImZpZWxkLXdyYXBwZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1jb250ZW50XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1jb250YWluZXJcIj4gICBcbiAgICAgICAgICA8bGFiZWwgW2NsYXNzLnJlcXVpcmVkXT1cImZpZWxkLmlzUmVxdWlyZWRcIj57eyBmaWVsZC5xdWVzdGlvblRleHQgPyBmaWVsZC5xdWVzdGlvblRleHQgOiAnTGFiZWwnIH19PC9sYWJlbD5cbiAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9UcmFzaC5zdmdcIiAoY2xpY2spPVwicmVtb3ZlRWxlbWVudChmaWVsZCwgaSlcIiBjbGFzcz1cImRlbGV0ZS1pY29uXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzZWxlY3QgaWQ9XCJvcHRpb25zXCIgY2xhc3M9XCJkcm9wZG93blwiW2Rpc2FibGVkXT1cImZpZWxkLmlzUmVhZE9ubHlcIiBbY2xhc3MuaGlkZGVuXT1cImZpZWxkLmlzSGlkZGVuXCIgPlxuICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWVsZC5vcHRpb25zXCIgW3ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiPiB7eyBvcHRpb24udmFsdWUgfX0gPC9vcHRpb24+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cbiAgICBcbjwhLS0gVGFibGVzIC0tPlxuPCEtLSA8ZGl2ICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ1RhYmxlcydcIiBjbGFzcz1cInRhYmxlLWNvbnRhaW5lclwiIGNka0RyYWcgKGNsaWNrKT1cInNlbGVjdEVsZW1lbnQoaSlcIiBbbmdTdHlsZV09XCJnZXRGb250U3R5bGVzKGZpZWxkKVwiPlxuICA8bGFiZWw+e3sgZmllbGQucXVlc3Rpb25UZXh0IH19PC9sYWJlbD5cbiAgPHRhYmxlIFtzdHlsZS53aWR0aC5weF09XCJmaWVsZC5jb2xXaWR0aFwiIFtzdHlsZS5oZWlnaHQuJV09XCJmaWVsZC5yb3dIZWlnaHRcIj5cbiAgICA8dGhlYWQ+PHRyPjx0aCAqbmdGb3I9XCJsZXQgaGVhZGVyIG9mIGZpZWxkLmhlYWRlcnNcIiBbc3R5bGUud2lkdGgucHhdPVwiZmllbGQuY29sV2lkdGggLyBmaWVsZC5jb2xOb3NcIj57eyBoZWFkZXIgfX08L3RoPjwvdHI+PC90aGVhZD5cbiAgICA8dGJvZHk+PHRyICpuZ0Zvcj1cImxldCByb3cgb2YgZmllbGQucm93c1wiPjx0ZCAqbmdGb3I9XCJsZXQgY2VsbCBvZiByb3dcIj57eyBjZWxsIH19PC90ZD48L3RyPjwvdGJvZHk+XG4gIDwvdGFibGU+XG4gIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL1RyYXNoLnN2Z1wiIChjbGljayk9XCJyZW1vdmVFbGVtZW50KGZpZWxkLCBpKVwiIC8+XG48L2Rpdj4gLS0+XG5cbiAgPCEtLSBCb29rIC0tPlxuPCEtLSA8ZGl2ICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ0Jvb2snXCIgIHN0eWxlPVwicGFkZGluZzogMTBweDsgYmFja2dyb3VuZC1jb2xvcjogd2hpdGVzbW9rZTtcIiAoY2xpY2spPVwic2VsZWN0RWxlbWVudChpKVwiIFtuZ1N0eWxlXT1cImdldEZvbnRTdHlsZXMoZmllbGQpXCIgY2RrRHJhZz5cbiAgPGRpdiBjbGFzcz1cImZsZXhcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7XCI+XG4gICAgPGRpdiBjbGFzcz1cImFsbC1kb3RzXCI+PGRpdiAqbmdGb3I9XCJsZXQgXyBvZiBbMSwyLDMsNCw1LDYsNyw4XVwiPjwvZGl2PjwvZGl2PlxuICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogOTclO1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggbGFiLWNvbmF0aW5lclwiPlxuICAgICAgICA8bGFiZWwgW2NsYXNzLnJlcXVpcmVkXT1cImZpZWxkLnJlcXVpcmVkXCI+e3sgZmllbGQucXVlc3Rpb25UZXh0ID8gZmllbGQucXVlc3Rpb25UZXh0IDogJ0Jvb2sgVGl0bGUnIH19PC9sYWJlbD5cbiAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvVHJhc2guc3ZnXCIgKGNsaWNrKT1cInJlbW92ZUVsZW1lbnQoZmllbGQsIGkpXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PiAtLT5cblxuPCEtLSBMaXN0IC0tPlxuPCEtLSA8ZGl2ICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ0xpc3QnXCIgY2xhc3M9XCJsaXN0LWNvbnRhaW5lclwiIGNka0RyYWcgKGNsaWNrKT1cInNlbGVjdEVsZW1lbnQoaSlcIiBbbmdTdHlsZV09XCJnZXRGb250U3R5bGVzKGZpZWxkKVwiPlxuICAgICAgICAgICAgPGxhYmVsPnt7IGZpZWxkLnF1ZXN0aW9uVGV4dCB9fTwvbGFiZWw+XG4gICAgICA8dWw+PGxpICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZpZWxkLml0ZW1zXCI+e3sgaXRlbSB9fTwvbGk+PC91bD5cbiAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL1RyYXNoLnN2Z1wiIChjbGljayk9XCJyZW1vdmVFbGVtZW50KGZpZWxkLCBpKVwiIC8+XG4gICAgICAgICAgPC9kaXY+IC0tPlxuICBcbjwhLS0gQnV0dG9uIC0tPlxuPCEtLSA8ZGl2ICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ0J1dHRvbidcIiBjbGFzcz1cImJ1dHRvbi1jb250YWluZXJcIiBjZGtEcmFnIChjbGljayk9XCJzZWxlY3RFbGVtZW50KGkpXCIgW25nU3R5bGVdPVwiZ2V0Rm9udFN0eWxlcyhmaWVsZClcIj5cbiAgICAgICAgICAgIDxidXR0b24+e3sgZmllbGQucXVlc3Rpb25UZXh0IH19PC9idXR0b24+XG4gICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9UcmFzaC5zdmdcIiAoY2xpY2spPVwicmVtb3ZlRWxlbWVudChmaWVsZCwgaSlcIiAvPlxuICAgICAgICAgIDwvZGl2PiAtLT5cblxuPC9uZy1jb250YWluZXI+XG48L2Rpdj5cbjwvZGl2PlxuXG5cblxuXG4iXX0=
@@ -1,34 +0,0 @@
1
- // AP-29JAN25
2
- import { Component, EventEmitter, Input, Output } from '@angular/core';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "../element/element.component";
5
- import * as i2 from "../properties/properties.component";
6
- export class FormComponent {
7
- // Input data for app-element
8
- // bookletJson: any = {}; // Replace with your actual JSON object
9
- // bookletId: string = '123'; // Replace with your actual booklet ID
10
- bookletJSON;
11
- bookletId;
12
- formButtonHandler = new EventEmitter();
13
- // Input data for app-properties
14
- // api: string = 'https://example.com/api'; // Replace with your actual API endpoint
15
- // apiMethod: string = 'GET'; // Replace with your actual API method
16
- selectedElementType = 'button'; // Replace with the default selected element type
17
- // Event handler for app-element
18
- formButtonHandlerClick(event) {
19
- this.formButtonHandler.emit(event);
20
- }
21
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
22
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FormComponent, selector: "app-form-builder", inputs: { bookletJSON: "bookletJSON", bookletId: "bookletId" }, outputs: { formButtonHandler: "formButtonHandler" }, ngImport: i0, template: "<!-- AP-29JAN25 -->\n<div class=\"form-container \">\n <!-- app-element Component -->\n <app-element [bookletJSON]=\"bookletJSON\" [bookletId]=\"bookletId\"></app-element>\n \n <!-- app-properties Component -->\n <app-properties (formButtonHandler)=\"formButtonHandlerClick($event)\"></app-properties>\n </div>\n ", styles: [".form-container{display:flex;flex-wrap:wrap;width:100%;height:100vh}app-element{width:75%}app-properties{width:25%;overflow-y:auto;border:10px solid #86A8CD}\n"], dependencies: [{ kind: "component", type: i1.ElementComponent, selector: "app-element", inputs: ["bookletJSON", "bookletId"] }, { kind: "component", type: i2.PropertiesComponent, selector: "app-properties", inputs: ["selectedElementType"], outputs: ["formButtonHandler"] }] });
23
- }
24
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormComponent, decorators: [{
25
- type: Component,
26
- args: [{ selector: 'app-form-builder', template: "<!-- AP-29JAN25 -->\n<div class=\"form-container \">\n <!-- app-element Component -->\n <app-element [bookletJSON]=\"bookletJSON\" [bookletId]=\"bookletId\"></app-element>\n \n <!-- app-properties Component -->\n <app-properties (formButtonHandler)=\"formButtonHandlerClick($event)\"></app-properties>\n </div>\n ", styles: [".form-container{display:flex;flex-wrap:wrap;width:100%;height:100vh}app-element{width:75%}app-properties{width:25%;overflow-y:auto;border:10px solid #86A8CD}\n"] }]
27
- }], propDecorators: { bookletJSON: [{
28
- type: Input
29
- }], bookletId: [{
30
- type: Input
31
- }], formButtonHandler: [{
32
- type: Output
33
- }] } });
34
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtYXBwL3NyYy9saWIvcGFnZXMvYnVpbGRlci9mb3JtL2Zvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnh0LWFwcC9zcmMvbGliL3BhZ2VzL2J1aWxkZXIvZm9ybS9mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWM7QUFDZCxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7O0FBT3ZFLE1BQU0sT0FBTyxhQUFhO0lBQ3hCLDZCQUE2QjtJQUM3QixpRUFBaUU7SUFDakUsb0VBQW9FO0lBQ3pELFdBQVcsQ0FBTTtJQUNqQixTQUFTLENBQU07SUFDZCxpQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO0lBRTNELGdDQUFnQztJQUNoQyxvRkFBb0Y7SUFDcEYsb0VBQW9FO0lBQ3BFLG1CQUFtQixHQUFXLFFBQVEsQ0FBQyxDQUFDLGlEQUFpRDtJQUV6RixnQ0FBZ0M7SUFDaEMsc0JBQXNCLENBQUMsS0FBSztRQUMxQixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLENBQUM7d0dBaEJVLGFBQWE7NEZBQWIsYUFBYSw2S0NSMUIsMFVBUUU7OzRGREFXLGFBQWE7a0JBTHpCLFNBQVM7K0JBQ0Usa0JBQWtCOzhCQVFqQixXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0ksaUJBQWlCO3NCQUExQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQVAtMjlKQU4yNSBcbmltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1mb3JtLWJ1aWxkZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Zvcm0uY29tcG9uZW50LmNzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBGb3JtQ29tcG9uZW50IHtcbiAgLy8gSW5wdXQgZGF0YSBmb3IgYXBwLWVsZW1lbnRcbiAgLy8gYm9va2xldEpzb246IGFueSA9IHt9OyAvLyBSZXBsYWNlIHdpdGggeW91ciBhY3R1YWwgSlNPTiBvYmplY3RcbiAgLy8gYm9va2xldElkOiBzdHJpbmcgPSAnMTIzJzsgLy8gUmVwbGFjZSB3aXRoIHlvdXIgYWN0dWFsIGJvb2tsZXQgSURcbiAgICBASW5wdXQoKSBib29rbGV0SlNPTjogYW55O1xuICAgIEBJbnB1dCgpIGJvb2tsZXRJZDogYW55O1xuICAgIEBPdXRwdXQoKSBmb3JtQnV0dG9uSGFuZGxlciA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIC8vIElucHV0IGRhdGEgZm9yIGFwcC1wcm9wZXJ0aWVzXG4gIC8vIGFwaTogc3RyaW5nID0gJ2h0dHBzOi8vZXhhbXBsZS5jb20vYXBpJzsgLy8gUmVwbGFjZSB3aXRoIHlvdXIgYWN0dWFsIEFQSSBlbmRwb2ludFxuICAvLyBhcGlNZXRob2Q6IHN0cmluZyA9ICdHRVQnOyAvLyBSZXBsYWNlIHdpdGggeW91ciBhY3R1YWwgQVBJIG1ldGhvZFxuICBzZWxlY3RlZEVsZW1lbnRUeXBlOiBzdHJpbmcgPSAnYnV0dG9uJzsgLy8gUmVwbGFjZSB3aXRoIHRoZSBkZWZhdWx0IHNlbGVjdGVkIGVsZW1lbnQgdHlwZVxuXG4gIC8vIEV2ZW50IGhhbmRsZXIgZm9yIGFwcC1lbGVtZW50XG4gIGZvcm1CdXR0b25IYW5kbGVyQ2xpY2soZXZlbnQpe1xuICAgIHRoaXMuZm9ybUJ1dHRvbkhhbmRsZXIuZW1pdChldmVudCk7XG4gIH1cbn1cbiIsIjwhLS0gQVAtMjlKQU4yNSAtLT5cbjxkaXYgY2xhc3M9XCJmb3JtLWNvbnRhaW5lciBcIj5cbiAgICA8IS0tIGFwcC1lbGVtZW50IENvbXBvbmVudCAtLT5cbiAgICA8YXBwLWVsZW1lbnQgW2Jvb2tsZXRKU09OXT1cImJvb2tsZXRKU09OXCIgW2Jvb2tsZXRJZF09XCJib29rbGV0SWRcIj48L2FwcC1lbGVtZW50PlxuICBcbiAgICA8IS0tIGFwcC1wcm9wZXJ0aWVzIENvbXBvbmVudCAtLT5cbiAgICA8YXBwLXByb3BlcnRpZXMgKGZvcm1CdXR0b25IYW5kbGVyKT1cImZvcm1CdXR0b25IYW5kbGVyQ2xpY2soJGV2ZW50KVwiPjwvYXBwLXByb3BlcnRpZXM+XG4gIDwvZGl2PlxuICAiXX0=
@@ -1,28 +0,0 @@
1
- // AP 22JAN25
2
- import { Component } from '@angular/core';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "@angular/common";
5
- export class MenuComponent {
6
- activeIndex = 0;
7
- menuItems = [
8
- { icon: '../assets/icons/Related.svg' },
9
- { icon: '../assets/icons/TextColumns.svg' },
10
- { icon: '../assets/icons/Monotone.svg' },
11
- { icon: '../assets/icons/Preview1.svg' },
12
- { icon: '../assets/icons/Website.svg' },
13
- { icon: '../assets/icons/Preview2.svg' },
14
- { icon: '../assets/icons/pdf.svg' },
15
- { icon: '../assets/icons/Setting.svg' }
16
- // { icon: '../assets/icons/ProfileImage.svg' }
17
- ];
18
- setActiveMenu(index) {
19
- this.activeIndex = index;
20
- }
21
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
22
- 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 -->\n<!-- menu.component.html -->\n<div class=\"top-bar\">\n <button class=\"button share-button\">Share</button>\n <button class=\"button publish-button\">Publish</button>\n</div>\n<div class=\"menu-sidebar\">\n <!-- Logo Section -->\n <div class=\"menu-logo\">\n <img src=\"../assets/Nxt.png\">\n </div>\n\n <!-- Menu Items -->\n <ul class=\"menu-list\">\n <li\n *ngFor=\"let item of menuItems; let i = index\"\n class=\"menu-item\"\n [class.active]=\"activeIndex === i\"\n (click)=\"setActiveMenu(i)\"\n [attr.aria-label]=\"item.label\"\n >\n <!-- Dynamic Icon -->\n <img [src]=\"item.icon\" alt=\"Menu Icon\" class=\"menu-icon\" />\n </li>\n </ul>\n\n <!-- Profile Section -->\n <div class=\"menu-profile\">\n <img src=\"../assets/icons/ProfileImage.svg\" />\n </div>\n</div>\n\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: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
23
- }
24
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MenuComponent, decorators: [{
25
- type: Component,
26
- args: [{ selector: 'app-menu', template: "<!-- AP 22JAN25 - Top menu ,Left side menu -->\n<!-- menu.component.html -->\n<div class=\"top-bar\">\n <button class=\"button share-button\">Share</button>\n <button class=\"button publish-button\">Publish</button>\n</div>\n<div class=\"menu-sidebar\">\n <!-- Logo Section -->\n <div class=\"menu-logo\">\n <img src=\"../assets/Nxt.png\">\n </div>\n\n <!-- Menu Items -->\n <ul class=\"menu-list\">\n <li\n *ngFor=\"let item of menuItems; let i = index\"\n class=\"menu-item\"\n [class.active]=\"activeIndex === i\"\n (click)=\"setActiveMenu(i)\"\n [attr.aria-label]=\"item.label\"\n >\n <!-- Dynamic Icon -->\n <img [src]=\"item.icon\" alt=\"Menu Icon\" class=\"menu-icon\" />\n </li>\n </ul>\n\n <!-- Profile Section -->\n <div class=\"menu-profile\">\n <img src=\"../assets/icons/ProfileImage.svg\" />\n </div>\n</div>\n\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"] }]
27
- }] });
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtYXBwL3NyYy9saWIvcGFnZXMvYnVpbGRlci9tZW51L21lbnUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnh0LWFwcC9zcmMvbGliL3BhZ2VzL2J1aWxkZXIvbWVudS9tZW51LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGFBQWE7QUFDYixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFPMUMsTUFBTSxPQUFPLGFBQWE7SUFDeEIsV0FBVyxHQUFXLENBQUMsQ0FBQztJQUV4QixTQUFTLEdBQUc7UUFDVixFQUFFLElBQUksRUFBRSw2QkFBNkIsRUFBRTtRQUN2QyxFQUFFLElBQUksRUFBRSxpQ0FBaUMsRUFBRTtRQUMzQyxFQUFFLElBQUksRUFBRSw4QkFBOEIsRUFBRTtRQUN4QyxFQUFFLElBQUksRUFBRSw4QkFBOEIsRUFBRTtRQUN4QyxFQUFFLElBQUksRUFBRSw2QkFBNkIsRUFBRTtRQUN2QyxFQUFFLElBQUksRUFBRSw4QkFBOEIsRUFBRTtRQUN4QyxFQUFFLElBQUksRUFBRSx5QkFBeUIsRUFBRTtRQUNuQyxFQUFFLElBQUksRUFBRSw2QkFBNkIsRUFBRTtRQUN2QywrQ0FBK0M7S0FDaEQsQ0FBQztJQUVGLGFBQWEsQ0FBQyxLQUFhO1FBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQzNCLENBQUM7d0dBakJVLGFBQWE7NEZBQWIsYUFBYSxnRENSMUIsODNCQWdDQTs7NEZEeEJhLGFBQWE7a0JBTHpCLFNBQVM7K0JBQ0UsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFQIDIySkFOMjVcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtbWVudScsXG4gIHRlbXBsYXRlVXJsOiAnLi9tZW51LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbWVudS5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgTWVudUNvbXBvbmVudCB7XG4gIGFjdGl2ZUluZGV4OiBudW1iZXIgPSAwO1xuXG4gIG1lbnVJdGVtcyA9IFtcbiAgICB7IGljb246ICcuLi9hc3NldHMvaWNvbnMvUmVsYXRlZC5zdmcnIH0sXG4gICAgeyBpY29uOiAnLi4vYXNzZXRzL2ljb25zL1RleHRDb2x1bW5zLnN2ZycgfSxcbiAgICB7IGljb246ICcuLi9hc3NldHMvaWNvbnMvTW9ub3RvbmUuc3ZnJyB9LFxuICAgIHsgaWNvbjogJy4uL2Fzc2V0cy9pY29ucy9QcmV2aWV3MS5zdmcnIH0sXG4gICAgeyBpY29uOiAnLi4vYXNzZXRzL2ljb25zL1dlYnNpdGUuc3ZnJyB9LFxuICAgIHsgaWNvbjogJy4uL2Fzc2V0cy9pY29ucy9QcmV2aWV3Mi5zdmcnIH0sXG4gICAgeyBpY29uOiAnLi4vYXNzZXRzL2ljb25zL3BkZi5zdmcnIH0sXG4gICAgeyBpY29uOiAnLi4vYXNzZXRzL2ljb25zL1NldHRpbmcuc3ZnJyB9XG4gICAgLy8geyBpY29uOiAnLi4vYXNzZXRzL2ljb25zL1Byb2ZpbGVJbWFnZS5zdmcnIH1cbiAgXTtcblxuICBzZXRBY3RpdmVNZW51KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2ZUluZGV4ID0gaW5kZXg7XG4gIH1cbn1cbiIsIjwhLS0gQVAgMjJKQU4yNSAtIFRvcCBtZW51ICxMZWZ0IHNpZGUgbWVudSAgLS0+XG48IS0tIG1lbnUuY29tcG9uZW50Lmh0bWwgLS0+XG48ZGl2IGNsYXNzPVwidG9wLWJhclwiPlxuICAgIDxidXR0b24gY2xhc3M9XCJidXR0b24gc2hhcmUtYnV0dG9uXCI+U2hhcmU8L2J1dHRvbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIHB1Ymxpc2gtYnV0dG9uXCI+UHVibGlzaDwvYnV0dG9uPlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwibWVudS1zaWRlYmFyXCI+XG4gIDwhLS0gTG9nbyBTZWN0aW9uIC0tPlxuICA8ZGl2IGNsYXNzPVwibWVudS1sb2dvXCI+XG4gICAgPGltZyBzcmM9XCIuLi9hc3NldHMvTnh0LnBuZ1wiPlxuICA8L2Rpdj5cblxuICA8IS0tIE1lbnUgSXRlbXMgLS0+XG4gIDx1bCBjbGFzcz1cIm1lbnUtbGlzdFwiPlxuICAgIDxsaVxuICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgbWVudUl0ZW1zOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgIGNsYXNzPVwibWVudS1pdGVtXCJcbiAgICAgIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlSW5kZXggPT09IGlcIlxuICAgICAgKGNsaWNrKT1cInNldEFjdGl2ZU1lbnUoaSlcIlxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJpdGVtLmxhYmVsXCJcbiAgICA+XG4gICAgICA8IS0tIER5bmFtaWMgSWNvbiAtLT5cbiAgICAgIDxpbWcgW3NyY109XCJpdGVtLmljb25cIiBhbHQ9XCJNZW51IEljb25cIiBjbGFzcz1cIm1lbnUtaWNvblwiIC8+XG4gICAgPC9saT5cbiAgPC91bD5cblxuICA8IS0tIFByb2ZpbGUgU2VjdGlvbiAtLT5cbiAgPGRpdiBjbGFzcz1cIm1lbnUtcHJvZmlsZVwiPlxuICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL1Byb2ZpbGVJbWFnZS5zdmdcIiAvPlxuICA8L2Rpdj5cbjwvZGl2PlxuXG4iXX0=