@yomotech/view-toolkit 0.0.31 → 0.0.32

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 (72) hide show
  1. package/ng-package.json +7 -0
  2. package/package.json +38 -49
  3. package/src/lib/app-version.ts +2 -0
  4. package/src/lib/components/autocomplete/autocomplete.css +0 -0
  5. package/src/lib/components/autocomplete/autocomplete.html +23 -0
  6. package/src/lib/components/autocomplete/autocomplete.ts +71 -0
  7. package/src/lib/components/button/button.css +0 -0
  8. package/src/lib/components/button/button.html +1 -0
  9. package/src/lib/components/button/button.ts +11 -0
  10. package/src/lib/components/date/date.css +0 -0
  11. package/src/lib/components/date/date.html +1 -0
  12. package/src/lib/components/date/date.ts +11 -0
  13. package/src/lib/components/dropdown/dropdown.css +0 -0
  14. package/src/lib/components/dropdown/dropdown.html +1 -0
  15. package/src/lib/components/dropdown/dropdown.ts +11 -0
  16. package/src/lib/components/error-message/error-message.css +0 -0
  17. package/src/lib/components/error-message/error-message.html +1 -0
  18. package/src/lib/components/error-message/error-message.ts +11 -0
  19. package/src/lib/components/label/label.css +0 -0
  20. package/src/lib/components/label/label.html +7 -0
  21. package/src/lib/components/label/label.ts +33 -0
  22. package/src/lib/components/string/string.css +0 -0
  23. package/src/lib/components/string/string.html +4 -0
  24. package/src/lib/components/string/string.ts +22 -0
  25. package/src/lib/components/textbox/textbox.css +0 -0
  26. package/src/lib/components/textbox/textbox.html +7 -0
  27. package/src/lib/components/textbox/textbox.ts +33 -0
  28. package/src/lib/components/time/time.css +0 -0
  29. package/src/lib/components/time/time.html +1 -0
  30. package/src/lib/components/time/time.ts +11 -0
  31. package/src/lib/containers/card/card.component.css +0 -0
  32. package/src/lib/containers/card/card.component.html +450 -0
  33. package/src/lib/containers/card/card.component.ts +474 -0
  34. package/src/lib/containers/form/form.component.css +101 -0
  35. package/src/lib/containers/form/form.component.html +305 -0
  36. package/src/lib/containers/form/form.component.ts +333 -0
  37. package/src/lib/containers/grid/grid.component.css +0 -0
  38. package/src/lib/containers/grid/grid.component.html +212 -0
  39. package/src/lib/containers/grid/grid.component.ts +228 -0
  40. package/src/lib/containers/header-menu/header-menu.component.css +0 -0
  41. package/src/lib/containers/header-menu/header-menu.component.html +72 -0
  42. package/src/lib/containers/header-menu/header-menu.component.ts +105 -0
  43. package/src/lib/containers/logs/logs.component.css +160 -0
  44. package/src/lib/containers/logs/logs.component.html +89 -0
  45. package/src/lib/containers/logs/logs.component.ts +29 -0
  46. package/src/lib/containers/model/model.component.css +0 -0
  47. package/src/lib/containers/model/model.component.html +351 -0
  48. package/src/lib/containers/model/model.component.ts +436 -0
  49. package/src/lib/containers/pagination/pagination.component.css +0 -0
  50. package/src/lib/containers/pagination/pagination.component.html +41 -0
  51. package/src/lib/containers/pagination/pagination.component.ts +100 -0
  52. package/src/lib/containers/side-menu/side-menu.component.css +173 -0
  53. package/src/lib/containers/side-menu/side-menu.component.html +126 -0
  54. package/src/lib/containers/side-menu/side-menu.component.ts +458 -0
  55. package/src/lib/services/app-version-reset.service.ts +59 -0
  56. package/src/lib/services/config.service.ts +144 -0
  57. package/src/lib/services/couchdb.ts +275 -0
  58. package/src/lib/services/mobile-keycloak.service.ts +116 -0
  59. package/src/lib/services/network-log.service.ts +27 -0
  60. package/src/lib/services/notification.service.ts +26 -0
  61. package/src/lib/services/request.service.ts +125 -0
  62. package/src/lib/services/utility.service.ts +600 -0
  63. package/src/lib/view-toolkit.module.ts +57 -0
  64. package/src/lib/view-toolkit.spec.ts +23 -0
  65. package/src/lib/view-toolkit.ts +15 -0
  66. package/src/public-api.ts +25 -0
  67. package/tsconfig.lib.json +17 -0
  68. package/tsconfig.lib.prod.json +11 -0
  69. package/tsconfig.spec.json +15 -0
  70. package/fesm2022/yomotech-view-toolkit.mjs +0 -3597
  71. package/fesm2022/yomotech-view-toolkit.mjs.map +0 -1
  72. package/types/yomotech-view-toolkit.d.ts +0 -648
@@ -0,0 +1,160 @@
1
+ /* ===============================
2
+ LAYOUT
3
+ =============================== */
4
+
5
+ .network-log-wrapper {
6
+ padding: 12px;
7
+ }
8
+
9
+ .network-log-table {
10
+ width: 100%;
11
+ overflow-x: auto;
12
+ }
13
+
14
+ /* ===============================
15
+ TABLE
16
+ =============================== */
17
+
18
+ table {
19
+ width: 100%;
20
+ border-collapse: collapse;
21
+ font-size: 13px;
22
+ min-width: 900px;
23
+ }
24
+
25
+ thead th {
26
+ background: #06b6d4;
27
+ color: #fff;
28
+ padding: 8px;
29
+ text-align: left;
30
+ position: sticky;
31
+ top: 0;
32
+ z-index: 2;
33
+ }
34
+
35
+ tbody td {
36
+ padding: 8px;
37
+ border-bottom: 1px solid #e5e7eb;
38
+ }
39
+
40
+ /* ===============================
41
+ ROW STATES
42
+ =============================== */
43
+
44
+ .log-row {
45
+ cursor: pointer;
46
+ }
47
+
48
+ .log-row:hover {
49
+ background: #f1f5f9;
50
+ }
51
+
52
+ .details-row {
53
+ background: #f8fafc;
54
+ }
55
+
56
+ /* ===============================
57
+ METHOD TAGS
58
+ =============================== */
59
+
60
+ .method {
61
+ padding: 2px 8px;
62
+ border-radius: 4px;
63
+ font-weight: 600;
64
+ font-size: 11px;
65
+ color: #fff;
66
+ }
67
+
68
+ .method.get {
69
+ background: #16a34a;
70
+ }
71
+
72
+ .method.post {
73
+ background: #2563eb;
74
+ }
75
+
76
+ .method.put {
77
+ background: #d97706;
78
+ }
79
+
80
+ .method.delete {
81
+ background: #dc2626;
82
+ }
83
+
84
+ /* ===============================
85
+ STATUS
86
+ =============================== */
87
+
88
+ td.error {
89
+ color: #dc2626;
90
+ font-weight: 700;
91
+ }
92
+
93
+ /* ===============================
94
+ ELLIPSIS
95
+ =============================== */
96
+
97
+ .ellipsis {
98
+ max-width: 320px;
99
+ white-space: nowrap;
100
+ overflow: hidden;
101
+ text-overflow: ellipsis;
102
+ }
103
+
104
+ /* ===============================
105
+ DETAILS GRID
106
+ =============================== */
107
+
108
+ .details-container {
109
+ display: grid;
110
+ grid-template-columns: repeat(2, minmax(0, 1fr));
111
+ gap: 16px;
112
+ }
113
+
114
+ .detail-block {
115
+ background: #ffffff;
116
+ border: 1px solid #e5e7eb;
117
+ border-radius: 6px;
118
+ padding: 10px;
119
+ }
120
+
121
+ .detail-block h4 {
122
+ margin: 0 0 6px;
123
+ font-size: 14px;
124
+ color: #0f172a;
125
+ }
126
+
127
+ pre {
128
+ background: #020617;
129
+ color: #e5e7eb;
130
+ padding: 8px;
131
+ border-radius: 6px;
132
+ max-height: 260px;
133
+ overflow: auto;
134
+ font-size: 12px;
135
+ white-space: pre-wrap;
136
+ word-break: break-word;
137
+ }
138
+
139
+ /* ===============================
140
+ MOBILE
141
+ =============================== */
142
+
143
+ @media (max-width: 768px) {
144
+ table {
145
+ min-width: 100%;
146
+ font-size: 12px;
147
+ }
148
+
149
+ .ellipsis {
150
+ max-width: 140px;
151
+ }
152
+
153
+ .details-container {
154
+ grid-template-columns: 1fr;
155
+ }
156
+
157
+ pre {
158
+ max-height: 200px;
159
+ }
160
+ }
@@ -0,0 +1,89 @@
1
+ <div class="network-log-wrapper">
2
+
3
+ <div class="network-log-table">
4
+ <table>
5
+ <thead>
6
+ <tr>
7
+ <th>#</th>
8
+ <th>Time</th>
9
+ <th>Method</th>
10
+ <th>URL</th>
11
+ <th>Status</th>
12
+ <th>Duration (ms)</th>
13
+ <th>Size (KB)</th>
14
+ </tr>
15
+ </thead>
16
+
17
+ <tbody>
18
+ <ng-container *ngFor="let log of logs; let i = index">
19
+
20
+ <!-- MAIN ROW -->
21
+ <tr class="log-row" (click)="toggleRow(i)">
22
+ <td>{{ i + 1 }}</td>
23
+ <td>{{ log.time }}</td>
24
+
25
+ <td>
26
+ <span class="method" [class.get]="log.method === 'GET'" [class.post]="log.method === 'POST'"
27
+ [class.put]="log.method === 'PUT'" [class.delete]="log.method === 'DELETE'">
28
+ {{ log.method }}
29
+ </span>
30
+ </td>
31
+
32
+ <td class="ellipsis" [title]="log.url">
33
+ {{ log.url }}
34
+ </td>
35
+
36
+ <td [class.error]="log.status >= 400">
37
+ {{ log.status }}
38
+ </td>
39
+
40
+ <td>{{ log.duration }}</td>
41
+
42
+ <td>{{ log.size | number:'1.0-2' }}</td>
43
+ </tr>
44
+
45
+ <!-- DETAILS ROW -->
46
+ <tr *ngIf="expandedRow === i" class="details-row">
47
+ <td colspan="7">
48
+ <div class="details-container">
49
+
50
+ <!-- META -->
51
+ <div class="detail-block">
52
+ <h4>Meta</h4>
53
+ <p><strong>Date:</strong> {{ log.date }}</p>
54
+ <p><strong>Type:</strong> {{ log.type }}</p>
55
+ </div>
56
+
57
+ <!-- REQUEST -->
58
+ <div class="detail-block">
59
+ <h4>Request</h4>
60
+ <p><strong>Headers</strong></p>
61
+ <pre>{{ log.requestHeaders | json }}</pre>
62
+
63
+ <p><strong>Body</strong></p>
64
+ <pre>{{ log.requestBody | json }}</pre>
65
+ </div>
66
+
67
+ <!-- RESPONSE -->
68
+ <div class="detail-block">
69
+ <h4>Response</h4>
70
+ <pre>{{ log.responseBody | json }}</pre>
71
+ </div>
72
+
73
+ <!-- PERFORMANCE -->
74
+ <div class="detail-block">
75
+ <h4>Performance</h4>
76
+ <p><strong>Duration:</strong> {{ log.duration }} ms</p>
77
+ <p><strong>Size:</strong> {{ log.size | number:'1.0-2' }} KB</p>
78
+ </div>
79
+
80
+ </div>
81
+ </td>
82
+ </tr>
83
+
84
+ </ng-container>
85
+ </tbody>
86
+ </table>
87
+ </div>
88
+
89
+ </div>
@@ -0,0 +1,29 @@
1
+ import { Component } from '@angular/core';
2
+ import { NetworkLogService } from '../../services/network-log.service';
3
+ import { CommonModule } from '@angular/common';
4
+
5
+ @Component({
6
+ standalone: true,
7
+ imports: [
8
+ CommonModule
9
+ ],
10
+ selector: 'vl-logs',
11
+ templateUrl: './logs.component.html',
12
+ styleUrl: './logs.component.css'
13
+ })
14
+ export class LogsComponent {
15
+ logs: any[] = [];
16
+ expandedRow: number | null = null;
17
+
18
+ constructor(private logService: NetworkLogService) {}
19
+
20
+ ngOnInit() {
21
+ const today = new Date().toISOString().split('T')[0];
22
+ this.logs = this.logService.getLogsByDate(today);
23
+ console.log('this.logs: ', this.logs);
24
+ }
25
+
26
+ toggleRow(index: number) {
27
+ this.expandedRow = this.expandedRow === index ? null : index;
28
+ }
29
+ }
File without changes
@@ -0,0 +1,351 @@
1
+ <nz-modal [nzTitle]="modalItemInfo?.modalTitle" nzCentered [(nzVisible)]="isModalShow" [nzFooter]="null"
2
+ (nzOnCancel)="onCancel()">
3
+ <!-- Loader Spinner -->
4
+ <div *ngIf="isLoading" class="loader-overlay">
5
+ <div class="spinner"></div>
6
+ </div>
7
+ <ng-container *nzModalContent>
8
+ <div [style]="getStyleWithoutClasses(modalItemInfo?.layoutSchema?.style).style"
9
+ [class]="modalItemInfo?.layoutSchema?.style?.classes[0]">
10
+ <form #dynamicForm="ngForm" *ngIf="modalItemInfo?.layoutSchema?.formSections?.length > 0"
11
+ (submit)="$event.preventDefault()">
12
+ <div *ngFor="let formSection of modalItemInfo?.layoutSchema?.formSections">
13
+ <div *ngIf="formSection?.label?.caption" [class]="formSection?.label?.style?.classes[0]"
14
+ [style]="getStyleWithoutClasses(formSection?.label?.style).style">
15
+ {{formSection.label.caption}}
16
+ </div>
17
+ <div [class]="formSection?.style?.classes[0]"
18
+ [style]="getStyleWithoutClasses(formSection?.style).style"
19
+ *ngIf="formSection.formFields?.length > 0">
20
+ <div *ngFor="let formField of formSection.formFields">
21
+ <div
22
+ [ngSwitch]="formField?.scope?.reference && modalItemInfo.propertySchema[getScope(formField.scope?.reference)] ?
23
+ modalItemInfo.propertySchema[getScope(formField.scope?.reference)][formField.scope?.reference.split('/').pop()]?.type : 'default'">
24
+
25
+ <!-- image control -->
26
+ <div *ngSwitchCase="'image'" [style]="getStyleWithoutClasses(formField?.style).style"
27
+ [class]="formField.style?.classes[0]">
28
+ <img [src]="formField.option.src" [alt]="'img'" />
29
+ </div>
30
+
31
+ <!-- credit card control -->
32
+ <div *ngSwitchCase="'carditCard'"
33
+ [style]="getStyleWithoutClasses(formField?.style).style"
34
+ [class]="formField.style?.classes[0]">
35
+ <div id="card-element">
36
+ <!-- a Stripe element will be inserted here -->
37
+ </div>
38
+ <!-- Used to display form errors -->
39
+ <div id="card-errors"
40
+ class="displayError.textContent!=='': 'alert alert-danger mt-1'"></div>
41
+ </div>
42
+
43
+ <!-- string control -->
44
+ <div *ngSwitchCase="'string'" class="form-group mb-3">
45
+ <span *ngIf="formField.option.protected"
46
+ [style]="getStyleWithoutClasses(formField?.label?.style).style"
47
+ [class]="formField?.label?.style?.classes[0]">
48
+ <vl-string [formField]="formField" [modalItemInfo]="modalItemInfo">
49
+ </vl-string>
50
+ </span>
51
+ <div *ngIf="!formField.option.protected">
52
+ <div [class]="formField?.layout == 'horizontal' ? 'horizontal-layout' : 'row'">
53
+ <vl-label [formField]="formField" [modalItemInfo]="modalItemInfo">
54
+ </vl-label>
55
+ <vl-textbox [formField]="formField"
56
+ [modalItemInfo]="modalItemInfo"></vl-textbox>
57
+ </div>
58
+ <!-- Error Message -->
59
+ <!-- <div *ngIf="inputField?.touched && inputField?.invalid"
60
+ [style]="getStyleWithoutClasses(formField?.validation?.style).style">
61
+ <p class="text-danger" *ngIf="inputField?.errors?.['required']">
62
+ {{setErroMessage(formField, errorMessages, "required")}}</p>
63
+ <p class="text-danger" *ngIf="inputField?.errors?.['email']">
64
+ {{(formField.label?.value ?
65
+ formField.label?.value :
66
+ modalItemInfo.propertySchema[getScope(formField.scope?.reference)][formField.scope?.reference.split('/').pop()]?.caption)
67
+ +
68
+ ' ' + errorMessages.pattern}}</p>
69
+ </div> -->
70
+ </div>
71
+ </div>
72
+
73
+ <!-- number control -->
74
+ <div *ngSwitchCase="'number'" class="form-group mb-3">
75
+ <span *ngIf="formField.option.protected"
76
+ [style]="getStyleWithoutClasses(formField?.label?.style).style"
77
+ [class]="formField?.label?.style?.classes[0]">
78
+ <h5>{{
79
+ modalItemInfo.propertySchema[getScope(formField.scope?.reference)][formField.scope?.reference.split('/').pop()]?.caption
80
+ }} {{
81
+ modalItemInfo.propertySchema[getScope(formField.scope?.reference)][formField.scope?.reference.split('/').pop()]?.value
82
+ |
83
+ currency:formField.option.currency :true: formField.option?.decimalPoint}}
84
+ </h5>
85
+ </span>
86
+ <span *ngIf="!formField.option.protected">
87
+ <div [class]="formField?.layout == 'horizontal' ? 'horizontal-layout' : 'row'">
88
+ <label [style]="getStyleWithoutClasses(formField?.label?.style).style"
89
+ [class]="formField?.label?.style?.classes[0]">{{ formField.label?.value
90
+ ?
91
+ formField.label?.value :
92
+ modalItemInfo.propertySchema[getScope(formField.scope?.reference)][formField.scope?.reference.split('/').pop()]?.caption
93
+ }}</label>
94
+ <input type="number" [class]="formField.style?.classes[0]"
95
+ [style]="getStyleWithoutClasses(formField?.style).style"
96
+ [(ngModel)]="modalItemInfo.propertySchema[getScope(formField.scope?.reference)][formField.scope?.reference.split('/').pop()].value"
97
+ [name]="formField.scope?.reference"
98
+ [placeholder]="modalItemInfo.propertySchema[getScope(formField.scope?.reference)][formField.scope?.reference.split('/').pop()]?.placeholder" />
99
+ </div>
100
+ </span>
101
+ </div>
102
+
103
+ <!-- DateRange control -->
104
+ <div *ngSwitchCase="'dateRange'" class="form-group mb-3">
105
+ <span *ngIf="formField.option.protected"
106
+ [style]="getStyleWithoutClasses(formField?.label?.style).style"
107
+ [class]="formField?.label?.style?.classes[0]">
108
+ <vl-string [formField]="formField" [modalItemInfo]="modalItemInfo">
109
+ </vl-string>
110
+ </span>
111
+ <div *ngIf="!formField.option.protected">
112
+ <div [class]="formField?.layout == 'horizontal' ? 'horizontal-layout' : 'row'">
113
+ <label [style]="getStyleWithoutClasses(formField?.label?.style).style"
114
+ [class]="formField?.label?.style?.classes[0]">{{ formField.label?.value
115
+ ?
116
+ formField.label?.value :
117
+ modalItemInfo.propertySchema[getScope(formField.scope?.reference)][formField.scope?.reference.split('/').pop()]?.caption
118
+ }}</label>
119
+ <nz-range-picker #dateRangeField="ngModel"
120
+ [required]="formField.option.required"
121
+ [name]="formField.scope?.reference"
122
+ [style]="getStyleWithoutClasses(formField?.style).style"
123
+ [(ngModel)]="modalItemInfo.propertySchema[getScope(formField.scope?.reference)][formField.scope?.reference.split('/').pop()].value"></nz-range-picker>
124
+ </div>
125
+ <!-- Error Message -->
126
+ <div *ngIf="dateRangeField?.touched && dateRangeField?.invalid"
127
+ [style]="getStyleWithoutClasses(formField?.validation?.style).style">
128
+ <p class="text-danger" *ngIf="dateRangeField?.errors?.['required']">
129
+ {{formField.label?.value ?
130
+ formField.label?.value :
131
+ modalItemInfo.propertySchema[getScope(formField.scope?.reference)][formField.scope?.reference.split('/').pop()]?.caption
132
+ +
133
+ ' ' + errorMessages.required}}</p>
134
+ <p class="text-danger" *ngIf="dateRangeField?.errors?.['email']">
135
+ {{(formField.label?.value ?
136
+ formField.label?.value :
137
+ modalItemInfo.propertySchema[getScope(formField.scope?.reference)][formField.scope?.reference.split('/').pop()]?.caption)
138
+ +
139
+ ' ' + errorMessages.pattern}}</p>
140
+ </div>
141
+ </div>
142
+ </div>
143
+
144
+ <!-- Date control -->
145
+ <div *ngSwitchCase="'date'" class="form-group mb-3">
146
+ <span *ngIf="formField.option.protected"
147
+ [style]="getStyleWithoutClasses(formField?.label?.style).style"
148
+ [class]="formField?.label?.style?.classes[0]">
149
+ <vl-string [formField]="formField" [modalItemInfo]="modalItemInfo">
150
+ </vl-string>
151
+ </span>
152
+ <div *ngIf="!formField.option.protected">
153
+ <div [class]="formField?.layout == 'horizontal' ? 'horizontal-layout' : 'row'">
154
+ <label [style]="getStyleWithoutClasses(formField?.label?.style).style"
155
+ [class]="formField?.label?.style?.classes[0]">{{ formField.label?.value
156
+ ?
157
+ formField.label?.value : formField.label?.caption ?
158
+ formField.label?.caption :
159
+ modalItemInfo.propertySchema[getScope(formField.scope?.reference)][formField.scope?.reference.split('/').pop()]?.caption
160
+ }}</label>
161
+
162
+ <p-datepicker #dateField="ngModel" [required]="formField.option.required"
163
+ [name]="formField.scope?.reference" type="number" inputmode="numeric"
164
+ [disabled]="formField?.option?.disabled" [showIcon]="true"
165
+ (ngModelChange)="dateChangeEvent(formField, $event)"
166
+ (onInput)="onDateTyping($event)"
167
+ (onFocus)="forceNumericKeyboard($event)"
168
+ [dateFormat]="modalItemInfo.propertySchema[getScope(formField.scope?.reference)][formField.scope?.reference.split('/').pop()]?.format ? modalItemInfo.propertySchema[getScope(formField.scope?.reference)][formField.scope?.reference.split('/').pop()]?.format : 'yy-mm-dd'"
169
+ [(ngModel)]="modalItemInfo.propertySchema[getScope(formField.scope?.reference)][formField.scope?.reference.split('/').pop()].value"
170
+ appendTo="body" [class]="formField?.scope?.style?.classes[0]"
171
+ [style]="getStyleWithoutClasses(formField?.scope?.style).style">
172
+ </p-datepicker>
173
+ </div>
174
+ <!-- Error Message -->
175
+ <div *ngIf="dateField?.touched && dateField?.invalid"
176
+ [style]="getStyleWithoutClasses(formField?.validation?.style).style">
177
+ <p class="text-danger" *ngIf="dateField?.errors?.['required']">
178
+ {{setErroMessage(formField, errorMessages, "required")}}</p>
179
+ <p class="text-danger" *ngIf="dateField?.errors?.['email']">
180
+ {{(formField.label?.value ?
181
+ formField.label?.value :
182
+ modalItemInfo.propertySchema[getScope(formField.scope?.reference)][formField.scope?.reference.split('/').pop()]?.caption)
183
+ +
184
+ ' ' + errorMessages.pattern}}</p>
185
+ </div>
186
+ </div>
187
+ </div>
188
+
189
+ <!-- Time control -->
190
+ <div *ngSwitchCase="'time'" class="form-group mb-3">
191
+ <span *ngIf="formField.option.protected"
192
+ [style]="getStyleWithoutClasses(formField?.label?.style).style"
193
+ [class]="formField?.label?.style?.classes[0]">
194
+ <vl-string [formField]="formField" [modalItemInfo]="modalItemInfo">
195
+ </vl-string>
196
+ </span>
197
+ <div *ngIf="!formField.option.protected">
198
+ <div [class]="formField?.layout == 'horizontal' ? 'horizontal-layout' : 'row'">
199
+ <label [style]="getStyleWithoutClasses(formField?.label?.style).style"
200
+ [class]="formField?.label?.style?.classes[0]">{{ formField.label?.value
201
+ ?
202
+ formField.label?.value : formField.label?.caption ?
203
+ formField.label?.caption :
204
+ modalItemInfo.propertySchema[getScope(formField.scope?.reference)][formField.scope?.reference.split('/').pop()]?.caption
205
+ }}</label>
206
+ <p-datepicker #timeField="ngModel" [required]="formField.option.required"
207
+ [name]="formField.scope?.reference" [timeOnly]="true" hourFormat="24"
208
+ [disabled]="formField?.option?.disabled"
209
+ (onFocus)="forceNumericKeyboard($event)"
210
+ (onInput)="onTimeTyping($event)"
211
+ (ngModelChange)="timeChangeEvent(formField, $event)"
212
+ [(ngModel)]="modalItemInfo.propertySchema[getScope(formField.scope?.reference)][formField.scope?.reference.split('/').pop()].value"
213
+ appendTo="body" [class]="formField?.scope?.style?.classes[0]"
214
+ [style]="getStyleWithoutClasses(formField?.style).style">
215
+ </p-datepicker>
216
+
217
+ </div>
218
+ <!-- Error Message -->
219
+ <div *ngIf="timeField?.touched && timeField?.invalid"
220
+ [style]="getStyleWithoutClasses(formField?.validation?.style).style">
221
+ <p class="text-danger" *ngIf="timeField?.errors?.['required']">
222
+ {{setErroMessage(formField, errorMessages, "required")}}</p>
223
+ <p class="text-danger" *ngIf="timeField?.errors?.['email']">
224
+ {{(formField.label?.value ?
225
+ formField.label?.value :
226
+ modalItemInfo.propertySchema[getScope(formField.scope?.reference)][formField.scope?.reference.split('/').pop()]?.caption)
227
+ +
228
+ ' ' + errorMessages.pattern}}</p>
229
+ </div>
230
+ </div>
231
+ </div>
232
+
233
+ <!-- Autocomplete control -->
234
+ <div *ngSwitchCase="'autocomplete'" class="form-group mb-3">
235
+ <span *ngIf="formField.option.protected"
236
+ [style]="getStyleWithoutClasses(formField?.label?.style).style"
237
+ [class]="formField?.label?.style?.classes[0]">
238
+ <vl-string [formField]="formField" [modalItemInfo]="modalItemInfo">
239
+ </vl-string>
240
+ </span>
241
+ <div *ngIf="!formField.option.protected">
242
+ <div [class]="formField?.layout == 'horizontal' ? 'horizontal-layout' : 'row'">
243
+ <vl-label [formField]="formField" [modalItemInfo]="modalItemInfo">
244
+ </vl-label>
245
+
246
+ <vl-autocomplete [formField]="formField" [modalItemInfo]="modalItemInfo"
247
+ [matchData]="matchData" [selectedLanguageInfo]="selectedLanguageInfo"
248
+ [errorMessages]="errorMessages"
249
+ (autocompSelectEvent)="autocompSelectEvent($event)"
250
+ (autocompChange)="autocompChangeEvent($event)"
251
+ (autocompFocusOut)="autocompFocusOutEvent($event)">
252
+ </vl-autocomplete>
253
+ </div>
254
+ </div>
255
+ </div>
256
+
257
+ <!-- checkBox control -->
258
+ <div *ngSwitchCase="'checkbox'" class="form-group mb-3"
259
+ [style]="getStyleWithoutClasses(formField?.style).style"
260
+ [class]="formField.style?.classes[0]">
261
+ <span *ngIf="formField.option?.postfixCaption">
262
+ <label class="form-check-label"><input type="checkbox" class="form-check-input"
263
+ [(ngModel)]="modalItemInfo.propertySchema[getScope(formField.scope?.reference)][formField.scope?.reference.split('/').pop()].value"
264
+ [name]="formField.scope?.reference"
265
+ (ngModelChange)="invokeSetformData()" />{{
266
+ modalItemInfo.propertySchema[getScope(formField.scope?.reference)][formField.scope?.reference.split('/').pop()]?.caption
267
+ }}</label>
268
+ </span>
269
+ <div *ngIf="!formField.option?.postfixCaption"
270
+ [class]="formField?.layout == 'horizontal' ? 'horizontal-layout' : 'row'">
271
+ <label class="form-check-label">{{
272
+ modalItemInfo.propertySchema[getScope(formField.scope?.reference)][formField.scope?.reference.split('/').pop()]?.caption
273
+ }}
274
+ <input type="checkbox" class="form-check-input"
275
+ [(ngModel)]="modalItemInfo.propertySchema[getScope(formField.scope?.reference)][formField.scope?.reference.split('/').pop()].value"
276
+ [name]="formField.scope?.reference" /></label>
277
+ </div>
278
+ </div>
279
+
280
+ <!-- dropdown control -->
281
+ <div *ngSwitchCase="'dropdown'" class="form-group mb-3"
282
+ [style]="getStyleWithoutClasses(formField?.style).style"
283
+ [class]="formField.style?.classes[0]">
284
+ <span *ngIf="formField.option?.postfixCaption">
285
+ <select id="dynamic-dropdown" [class]="formField.style?.classes[0]"
286
+ #dropdownField="ngModel"
287
+ [style]="getStyleWithoutClasses(formField?.style).style"
288
+ [name]="formField.scope?.reference"
289
+ [(ngModel)]="modalItemInfo.propertySchema[getScope(formField.scope?.reference)][formField.scope?.reference.split('/').pop()].value">
290
+ <option
291
+ *ngFor="let item of modalItemInfo.propertySchema[getScope(formField.scope?.reference)][formField.scope?.reference.split('/').pop()]?.data"
292
+ [value]="formField.option.optionValue"> {{
293
+ formField.option.optionLabel}}</option>
294
+ </select>
295
+ <label
296
+ [style]="getStyleWithoutClasses(formField?.label?.style).style">{{modalItemInfo.propertySchema[getScope(formField.scope)][formField.scope?.reference.split('/').pop()]?.caption
297
+ }}</label>
298
+ </span>
299
+ <div *ngIf="!formField.option?.postfixCaption">
300
+ <div [class]="formField?.layout == 'horizontal' ? 'horizontal-layout' : 'row'">
301
+ <label
302
+ [style]="getStyleWithoutClasses(formField?.label?.style).style">{{modalItemInfo.propertySchema[getScope(formField.scope?.reference)][formField.scope?.reference.split('/').pop()]?.caption
303
+ }}</label>
304
+
305
+ <nz-select nzShowSearch nzAllowClear nzPlaceHolder="Select"
306
+ #dropdownField="ngModel" [required]="formField.option.required"
307
+ [class]="formField.style?.classes[0]"
308
+ [style]="getStyleWithoutClasses(formField?.style).style"
309
+ [name]="formField.scope?.reference"
310
+ [(ngModel)]="modalItemInfo.propertySchema[getScope(formField.scope?.reference)][formField.scope?.reference.split('/').pop()].value">
311
+ <nz-option
312
+ *ngFor="let item of modalItemInfo.propertySchema[getScope(formField.scope?.reference)][formField.scope?.reference.split('/').pop()]?.data"
313
+ [nzLabel]="item[formField.option.optionLabel]"
314
+ [nzValue]="item[formField.option.optionValue]"></nz-option>
315
+ </nz-select>
316
+ </div>
317
+ <!-- Error Message -->
318
+ <div *ngIf="dropdownField?.touched && dropdownField?.invalid"
319
+ [style]="getStyleWithoutClasses(formField?.validation?.style).style">
320
+ <p class="text-danger" *ngIf="dropdownField?.errors?.['required']">
321
+ {{formField.label?.value ?
322
+ formField.label?.value :
323
+ modalItemInfo.propertySchema[getScope(formField.scope?.reference)][formField.scope?.reference.split('/').pop()]?.caption
324
+ +
325
+ ' ' + errorMessages.required}}</p>
326
+ <p class="text-danger" *ngIf="dropdownField?.errors?.['email']">
327
+ {{(formField.label?.value ?
328
+ formField.label?.value :
329
+ modalItemInfo.propertySchema[getScope(formField.scope?.reference)][formField.scope?.reference.split('/').pop()]?.caption)
330
+ +
331
+ ' ' + errorMessages.pattern}}</p>
332
+ </div>
333
+ </div>
334
+ </div>
335
+
336
+ <!-- button control -->
337
+ <div *ngSwitchCase="'default'">
338
+ <button type="button" [style]="getStyleWithoutClasses(formField.style).style"
339
+ (click)="invokeFormBtnClick(formField.option, modalItemInfo.propertySchema, dynamicForm)"
340
+ class="btn btn-primary btn-block">
341
+ {{ formField.label?.caption }}
342
+ </button>
343
+ </div>
344
+ </div>
345
+ </div>
346
+ </div>
347
+ </div>
348
+ </form>
349
+ </div>
350
+ </ng-container>
351
+ </nz-modal>