ng-ipa-library 0.7.11 → 1.1.0

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 (61) hide show
  1. package/{esm2015/lib/core/components/loading/loading.component.js → esm2020/lib/core/components/loading/loading.component.mjs} +5 -9
  2. package/esm2020/lib/core/interceptors/error.interceptor.mjs +46 -0
  3. package/{esm2015/lib/core/interceptors/loading.interceptor.js → esm2020/lib/core/interceptors/loading.interceptor.mjs} +3 -3
  4. package/esm2020/lib/core/interceptors/token.interceptor.mjs +74 -0
  5. package/esm2020/lib/core/services/auth.service.mjs +47 -0
  6. package/{esm2015/lib/core/services/error.service.js → esm2020/lib/core/services/error.service.mjs} +3 -3
  7. package/{esm2015/lib/core/services/loader.service.js → esm2020/lib/core/services/loader.service.mjs} +3 -3
  8. package/esm2020/lib/generate-form/generate-form.component.mjs +116 -0
  9. package/esm2020/lib/ipa-form/datepicker/datepicker.component.mjs +66 -0
  10. package/esm2020/lib/ipa-form/datepicker/gregorian-datepicker/gregorian-datepicker.component.mjs +23 -0
  11. package/{esm2015/lib/ipa-form/datepicker/gregorian-datepicker/gregorian18n.js → esm2020/lib/ipa-form/datepicker/gregorian-datepicker/gregorian18n.mjs} +3 -3
  12. package/{esm2015/lib/ipa-form/datepicker/hijri-datepicker/IslamicI18n.js → esm2020/lib/ipa-form/datepicker/hijri-datepicker/IslamicI18n.mjs} +3 -3
  13. package/esm2020/lib/ipa-form/datepicker/hijri-datepicker/hijri-datepicker.component.mjs +23 -0
  14. package/esm2020/lib/ipa-form/dropdown-input/dropdown-input.component.mjs +77 -0
  15. package/{esm2015/lib/ipa-form/file-upload/file-upload.component.js → esm2020/lib/ipa-form/file-upload/file-upload.component.mjs} +5 -9
  16. package/esm2020/lib/ipa-form/ipa-form.service.mjs +254 -0
  17. package/esm2020/lib/ipa-form/recaptcha/recaptcha.component.mjs +55 -0
  18. package/esm2020/lib/ipa-form/text-input/text-input.component.mjs +86 -0
  19. package/esm2020/lib/ipa-form/textarea-input/textarea-input.component.mjs +69 -0
  20. package/{esm2015/lib/models/apiException.js → esm2020/lib/models/apiException.mjs} +0 -0
  21. package/{esm2015/lib/models/apiResponse.js → esm2020/lib/models/apiResponse.mjs} +0 -0
  22. package/{esm2015/lib/models/breadcrumbs.model.js → esm2020/lib/models/breadcrumbs.model.mjs} +0 -0
  23. package/{esm2015/lib/models/decodedToken.model.js → esm2020/lib/models/decodedToken.model.mjs} +0 -0
  24. package/{esm2015/lib/models/exceptionUrl.model.js → esm2020/lib/models/exceptionUrl.model.mjs} +0 -0
  25. package/{esm2015/lib/models/generateForm.model.js → esm2020/lib/models/generateForm.model.mjs} +0 -0
  26. package/{esm2015/lib/models/pagedResult.js → esm2020/lib/models/pagedResult.mjs} +0 -0
  27. package/{esm2015/lib/models/user.model.js → esm2020/lib/models/user.model.mjs} +0 -0
  28. package/{esm2015/lib/ng-ipa-library.module.js → esm2020/lib/ng-ipa-library.module.mjs} +4 -4
  29. package/{esm2015/lib/pipes/hijri-date.pipe.js → esm2020/lib/pipes/hijri-date.pipe.mjs} +3 -3
  30. package/{esm2015/lib/pipes/pipes.module.js → esm2020/lib/pipes/pipes.module.mjs} +4 -4
  31. package/esm2020/lib/services/breadcrumbs.service.mjs +149 -0
  32. package/esm2020/lib/services/common.service.mjs +65 -0
  33. package/{esm2015/lib/share-button/share-button.component.js → esm2020/lib/share-button/share-button.component.mjs} +5 -9
  34. package/{esm2015/lib/share-button/share-button.module.js → esm2020/lib/share-button/share-button.module.mjs} +4 -4
  35. package/{esm2015/ng-ipa-library.js → esm2020/ng-ipa-library.mjs} +0 -0
  36. package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
  37. package/fesm2015/{ng-ipa-library.js → ng-ipa-library.mjs} +143 -160
  38. package/fesm2015/ng-ipa-library.mjs.map +1 -0
  39. package/fesm2020/ng-ipa-library.mjs +1601 -0
  40. package/fesm2020/ng-ipa-library.mjs.map +1 -0
  41. package/lib/core/interceptors/token.interceptor.d.ts +3 -1
  42. package/lib/ipa-form/text-input/text-input.component.d.ts +3 -1
  43. package/package.json +32 -19
  44. package/src/lib/assets/ngIPAStyle.scss +2 -1
  45. package/bundles/ng-ipa-library.umd.js +0 -2098
  46. package/bundles/ng-ipa-library.umd.js.map +0 -1
  47. package/esm2015/lib/core/interceptors/error.interceptor.js +0 -46
  48. package/esm2015/lib/core/interceptors/token.interceptor.js +0 -69
  49. package/esm2015/lib/core/services/auth.service.js +0 -48
  50. package/esm2015/lib/generate-form/generate-form.component.js +0 -120
  51. package/esm2015/lib/ipa-form/datepicker/datepicker.component.js +0 -70
  52. package/esm2015/lib/ipa-form/datepicker/gregorian-datepicker/gregorian-datepicker.component.js +0 -28
  53. package/esm2015/lib/ipa-form/datepicker/hijri-datepicker/hijri-datepicker.component.js +0 -28
  54. package/esm2015/lib/ipa-form/dropdown-input/dropdown-input.component.js +0 -81
  55. package/esm2015/lib/ipa-form/ipa-form.service.js +0 -251
  56. package/esm2015/lib/ipa-form/recaptcha/recaptcha.component.js +0 -59
  57. package/esm2015/lib/ipa-form/text-input/text-input.component.js +0 -76
  58. package/esm2015/lib/ipa-form/textarea-input/textarea-input.component.js +0 -73
  59. package/esm2015/lib/services/breadcrumbs.service.js +0 -151
  60. package/esm2015/lib/services/common.service.js +0 -66
  61. package/fesm2015/ng-ipa-library.js.map +0 -1
@@ -0,0 +1,1601 @@
1
+ import * as i3$1 from '@angular/common';
2
+ import { CommonModule } from '@angular/common';
3
+ import * as i0 from '@angular/core';
4
+ import { Pipe, NgModule, Injectable, Component, Self, ViewChild, Input, ElementRef, EventEmitter, Output } from '@angular/core';
5
+ import * as i2$1 from '@angular/forms';
6
+ import { FormControl, Validators, FormArray, FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';
7
+ import * as i1 from 'ngx-toastr';
8
+ import { ToastrModule } from 'ngx-toastr';
9
+ export * from 'ngx-toastr';
10
+ import * as i2$2 from 'ngx-dropzone-wrapper';
11
+ import { DropzoneDirective, DropzoneModule } from 'ngx-dropzone-wrapper';
12
+ import * as i2$3 from 'ngx-captcha';
13
+ import { NgxCaptchaModule } from 'ngx-captcha';
14
+ import momentHijri from 'moment-hijri';
15
+ import * as i2 from '@ng-bootstrap/ng-bootstrap';
16
+ import { NgbDatepickerI18n, NgbCalendar, NgbCalendarIslamicUmalqura, NgbCalendarGregorian, NgbDatepickerModule } from '@ng-bootstrap/ng-bootstrap';
17
+ import * as i3 from '@ng-select/ng-select';
18
+ import { NgSelectModule } from '@ng-select/ng-select';
19
+ export * from '@ng-select/ng-select';
20
+ import * as i5 from '@angular/cdk/bidi';
21
+ import { BehaviorSubject, Observable, throwError } from 'rxjs';
22
+ import { OverlayModule } from '@angular/cdk/overlay';
23
+ import * as i1$2 from '@fortawesome/angular-fontawesome';
24
+ import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
25
+ import { fas } from '@fortawesome/free-solid-svg-icons';
26
+ import { ShareIconsModule } from 'ngx-sharebuttons/icons';
27
+ import * as i1$1 from 'ngx-sharebuttons/popup';
28
+ import { ShareButtonsPopupModule } from 'ngx-sharebuttons/popup';
29
+ import * as i2$4 from '@angular/common/http';
30
+ import { HttpResponse } from '@angular/common/http';
31
+ import { catchError } from 'rxjs/operators';
32
+
33
+ class HijriDatePipe {
34
+ transform(date, format = 'iYYYY-iMM-iDD', lang = 'en') {
35
+ momentHijri.locale(lang);
36
+ return momentHijri(date).format(format);
37
+ }
38
+ }
39
+ HijriDatePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: HijriDatePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
40
+ HijriDatePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: HijriDatePipe, name: "hijriDate" });
41
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: HijriDatePipe, decorators: [{
42
+ type: Pipe,
43
+ args: [{
44
+ name: 'hijriDate',
45
+ }]
46
+ }] });
47
+
48
+ class PipesModule {
49
+ }
50
+ PipesModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: PipesModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
51
+ PipesModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: PipesModule, declarations: [HijriDatePipe], exports: [HijriDatePipe] });
52
+ PipesModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: PipesModule });
53
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: PipesModule, decorators: [{
54
+ type: NgModule,
55
+ args: [{
56
+ declarations: [HijriDatePipe],
57
+ exports: [HijriDatePipe],
58
+ }]
59
+ }] });
60
+
61
+ class IPAFormService {
62
+ constructor(parserFormatter) {
63
+ this.parserFormatter = parserFormatter;
64
+ }
65
+ /**
66
+ * check link is valid.
67
+ */
68
+ static linkValidation(control) {
69
+ const isValidLink = /^((https?:\/\/)[\w-]+(\.[a-z-]+)+\.?(:\d+)?(\/\S*)?)$/.test(control.value);
70
+ return isValidLink || !control.value ? null : { link: true };
71
+ }
72
+ /**
73
+ * check mp4 link is valid.
74
+ */
75
+ static mp4LinkValidation(control) {
76
+ const isValidLink = /^((https?:\/\/)[\w-]+(\.[a-z-]+)+\.?(:\d+)?(\/\S*)?(\/[\w\u0600-\u06FF]+\.mp4))$/.test(control.value);
77
+ return isValidLink || !control.value ? null : { linkMP4: true };
78
+ }
79
+ /**
80
+ * check mobile number is valid.
81
+ */
82
+ static mobileNo(control) {
83
+ const isValidLink = /^05\d{8}$/.test(control.value);
84
+ return isValidLink || !control.value ? null : { mobileNo: true };
85
+ }
86
+ /**
87
+ * check email is valid.
88
+ */
89
+ static email(control) {
90
+ const isValidLink = /^(([^<>()[\]\.,;:\s@\"]+(\.[^<>()[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/.test(control.value);
91
+ return isValidLink || !control.value ? null : { Email: true };
92
+ }
93
+ /**
94
+ * check national ID or iqama ID is valid.
95
+ */
96
+ static checkID(control) {
97
+ let isValid = false;
98
+ const value = control.value;
99
+ if (IPAFormService.nationalIdValidate(value) ||
100
+ IPAFormService.iqamaIdValidate(value)) {
101
+ isValid = true;
102
+ }
103
+ else {
104
+ isValid = false;
105
+ }
106
+ return isValid || !value ? null : { checkId: true };
107
+ }
108
+ getErrorMessage(control, patternErrorMsg = '') {
109
+ for (const propertyName in control?.errors) {
110
+ if (control?.errors.hasOwnProperty(propertyName) &&
111
+ (control.touched || control.dirty)) {
112
+ return this.getValidatorErrorMessage(propertyName, control.errors[propertyName], patternErrorMsg);
113
+ }
114
+ }
115
+ return null;
116
+ }
117
+ /**
118
+ * convert gregorian date to hijri date (Based on Umm al-Qura calculations).
119
+ * @param date: gregorian date
120
+ * @param format: iDD => day: ١٥, iMM => month: ٠٤, iMMM => month: ربيع ٢,
121
+ * iMMMM => ربيع الثاني, iYY => year: ٤٢, iYYYY => year: ١٤٤٢,
122
+ * dd => ن, ddd => إثنين, dddd => الإثنين
123
+ * @example 'iYYYY/iM/iDهـ الموافق YYYY/M/Dم'
124
+ * '١٤٤٢/٠٤/١٥هـ الموافق ٢٠٢٠/١١/٣٠'
125
+ */
126
+ convertToHijriDate(date, format = 'iYYYY-iMM-iDD', lang = 'ar-SA') {
127
+ momentHijri.locale(lang);
128
+ return momentHijri(date).format(format);
129
+ }
130
+ convertToGregorianDate(date, format = 'YYYY-MM-DD', lang = 'en') {
131
+ momentHijri.locale(lang);
132
+ const m = momentHijri.iConvert.toGregorian(date.year(), date.month(), date.date());
133
+ return momentHijri(new Date(m.gy, m.gm, m.gd)).format(format);
134
+ }
135
+ getCurrentHijriDate() {
136
+ momentHijri.locale('en');
137
+ return momentHijri().format('iYYYY/iMM/iDD');
138
+ }
139
+ getValidatorErrorMessage(validatorName, validatorValue, patternErrorMsg) {
140
+ if (validatorName === 'pattern') {
141
+ validatorValue = this.addPatternMsg(validatorValue, patternErrorMsg);
142
+ }
143
+ const config = {
144
+ required: 'هذا الحقل مطلوب',
145
+ pattern: `${validatorValue.message}`,
146
+ Email: 'خطأ في البريد الالكتروني (example@ipa.edu.sa)',
147
+ maxlength: `تجاوز عدد الحقل المسموح بها (${validatorValue.requiredLength}) حرف`,
148
+ minlength: `على الأقل عدد ${validatorValue.requiredLength} حرف.`,
149
+ min: `رقم اكبر من أو يساوي ${validatorValue.min}`,
150
+ max: `رقم اصغر من أو يساوي ${validatorValue.max}`,
151
+ ngbDate: this.getNgbDatepickerErrorMsg(validatorValue),
152
+ checkId: 'رقم الهوية أو الاقامة غير صحيح',
153
+ link: 'الرابط غير صحيح (http://google.com)',
154
+ linkMP4: 'الرابط غير صحيح (http://example.com/a.mp4)',
155
+ mobileNo: 'خطأ في رقم الجوال (05xxxxxxxx)',
156
+ };
157
+ return config[validatorName];
158
+ }
159
+ addPatternMsg(validatorValue, patternErrorMsg) {
160
+ let pattern = {
161
+ ...validatorValue,
162
+ message: patternErrorMsg,
163
+ };
164
+ return pattern;
165
+ }
166
+ getNgbDatepickerErrorMsg(validatorValue) {
167
+ let msg = '';
168
+ if (validatorValue.maxDate) {
169
+ msg = `التاريخ المدخل "${this.parserFormatter.format(validatorValue.maxDate.actual)}" اكبر من تاريخ اليوم "${this.parserFormatter.format(validatorValue.maxDate.maxDate)}"`;
170
+ }
171
+ else if (validatorValue.minDate) {
172
+ msg = `التاريخ المدخل "${this.parserFormatter.format(validatorValue.minDate.actual)}" يجب ان يكون اكبر من أو يساوي تاريخ البداية "${this.parserFormatter.format(validatorValue.minDate.minDate)}"`;
173
+ }
174
+ else if (validatorValue.invalid) {
175
+ msg = `التاريخ المدخل غير صحيح ${validatorValue.invalid}.`;
176
+ }
177
+ return msg;
178
+ }
179
+ static convertToEn(value) {
180
+ let newValue = '';
181
+ for (let i = 0; i < value.length; i++) {
182
+ let ch = value.charCodeAt(i);
183
+ if (ch >= 1584 && ch <= 1650) {
184
+ let newChar = ch - 1584;
185
+ newValue = newValue + String.fromCharCode(newChar);
186
+ }
187
+ else {
188
+ newValue = newValue + String.fromCharCode(ch);
189
+ }
190
+ }
191
+ return newValue;
192
+ }
193
+ static nationalIdValidate(civilId) {
194
+ if (civilId) {
195
+ let strID = this.convertToEn(civilId);
196
+ let digits = '';
197
+ let counter = 0;
198
+ while (counter < 9) {
199
+ if ((counter + 1) % 2 == 0) {
200
+ digits = digits + strID.substring(counter, counter + 1);
201
+ }
202
+ else {
203
+ digits =
204
+ digits + (+strID.substring(counter, counter + 1) * 2).toString();
205
+ }
206
+ counter++;
207
+ }
208
+ let intSum = 0;
209
+ let intSumTemp = 0;
210
+ let strSum;
211
+ let intOddSumDigit;
212
+ let CheckDigit;
213
+ counter = 0;
214
+ while (counter < digits.length) {
215
+ intSumTemp = +digits.charAt(counter) * 1;
216
+ intSum += intSumTemp;
217
+ counter++;
218
+ }
219
+ strSum = intSum.toString();
220
+ if (strSum.length == 1) {
221
+ intOddSumDigit = intSum;
222
+ }
223
+ else {
224
+ intOddSumDigit = strSum.substring(strSum.length, strSum.length - 1);
225
+ }
226
+ if (intOddSumDigit == 0) {
227
+ CheckDigit = 0;
228
+ }
229
+ else {
230
+ CheckDigit = (10 - +intOddSumDigit).toString();
231
+ }
232
+ let PublicID = this.convertToEn(civilId);
233
+ if (CheckDigit ==
234
+ PublicID.substring(PublicID.length - 1, PublicID.length) &&
235
+ strID.length == 10 &&
236
+ strID.substring(0, 1) == '1') {
237
+ return true;
238
+ }
239
+ else {
240
+ return false;
241
+ }
242
+ }
243
+ else {
244
+ return false;
245
+ }
246
+ }
247
+ static iqamaIdValidate(civilId) {
248
+ if (civilId) {
249
+ let strID = this.convertToEn(civilId);
250
+ let digits = '';
251
+ let counter = 0;
252
+ while (counter < 9) {
253
+ if ((counter + 1) % 2 == 0) {
254
+ digits = digits + strID.substring(counter, counter + 1);
255
+ }
256
+ else {
257
+ digits =
258
+ digits + (+strID.substring(counter, counter + 1) * 2).toString();
259
+ }
260
+ counter++;
261
+ }
262
+ let intSum = 0;
263
+ let intSumTemp = 0;
264
+ let strSum;
265
+ let intOddSumDigit;
266
+ let CheckDigit;
267
+ counter = 0;
268
+ while (counter < digits.length) {
269
+ intSumTemp = +digits.charAt(counter) * 1;
270
+ intSum += intSumTemp;
271
+ counter++;
272
+ }
273
+ strSum = intSum.toString();
274
+ if (strSum.length == 1) {
275
+ intOddSumDigit = intSum;
276
+ }
277
+ else {
278
+ intOddSumDigit = strSum.substring(strSum.length, strSum.length - 1);
279
+ }
280
+ if (intOddSumDigit == 0) {
281
+ CheckDigit = 0;
282
+ }
283
+ else {
284
+ CheckDigit = (10 - +intOddSumDigit).toString();
285
+ }
286
+ let PublicID = this.convertToEn(civilId);
287
+ if (CheckDigit ==
288
+ PublicID.substring(PublicID.length - 1, PublicID.length) &&
289
+ strID.length == 10 &&
290
+ strID.substring(0, 1) == '2') {
291
+ return true;
292
+ }
293
+ else {
294
+ return false;
295
+ }
296
+ }
297
+ else {
298
+ return false;
299
+ }
300
+ }
301
+ }
302
+ IPAFormService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: IPAFormService, deps: [{ token: i2.NgbDateParserFormatter }], target: i0.ɵɵFactoryTarget.Injectable });
303
+ IPAFormService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: IPAFormService, providedIn: 'root' });
304
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: IPAFormService, decorators: [{
305
+ type: Injectable,
306
+ args: [{
307
+ providedIn: 'root',
308
+ }]
309
+ }], ctorParameters: function () { return [{ type: i2.NgbDateParserFormatter }]; } });
310
+
311
+ class TextInputComponent {
312
+ constructor(validationService, controlDir) {
313
+ this.validationService = validationService;
314
+ this.controlDir = controlDir;
315
+ this.type = 'text';
316
+ this.placeholder = 'please enter text';
317
+ this.label = 'text input';
318
+ this.required = false;
319
+ this.patternErrorMsg = 'invalid pattern';
320
+ this.onlyNumber = false;
321
+ this.pattern = '';
322
+ this.formControl = new FormControl('');
323
+ this.controlDir.valueAccessor = this;
324
+ }
325
+ ngOnInit() {
326
+ const control = this.controlDir.control;
327
+ const validators = control?.validator ? [control.validator] : [];
328
+ control?.setValidators(validators);
329
+ control?.updateValueAndValidity();
330
+ this.formControl = control;
331
+ }
332
+ onChange(event) { }
333
+ onTouched() { }
334
+ writeValue(obj) {
335
+ this.input.nativeElement.value = obj || '';
336
+ }
337
+ registerOnChange(fn) {
338
+ this.onChange = fn;
339
+ }
340
+ registerOnTouched(fn) {
341
+ this.onTouched = fn;
342
+ }
343
+ checkIsNumber(event) {
344
+ if (this.onlyNumber) {
345
+ const initialValue = this.formControl.value;
346
+ const newValue = initialValue.replace(/[^0-9]*/g, '');
347
+ this.formControl.patchValue(newValue);
348
+ this.formControl.markAsPristine();
349
+ if (initialValue !== this.formControl.value) {
350
+ event.stopPropagation();
351
+ }
352
+ }
353
+ }
354
+ get errorMessage() {
355
+ this.errorMsg = this.validationService.getErrorMessage(this.formControl, this.patternErrorMsg);
356
+ return this.errorMsg;
357
+ }
358
+ }
359
+ TextInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: TextInputComponent, deps: [{ token: IPAFormService }, { token: i2$1.NgControl, self: true }], target: i0.ɵɵFactoryTarget.Component });
360
+ TextInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.2", type: TextInputComponent, selector: "ipa-text-input", inputs: { id: "id", type: "type", placeholder: "placeholder", label: "label", required: "required", patternErrorMsg: "patternErrorMsg", onlyNumber: "onlyNumber", pattern: "pattern", classes: "classes", containerClasses: "containerClasses" }, viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"form-floating {{containerClasses}}\">\r\n <input #input id=\"{{id}}\" class=\"form-control {{classes}}\" [type]=\"type\" [required]=\"required\" pattern=\"{{pattern}}\"\r\n placeholder=\"{{placeholder}}\" [formControl]=\"formControl\" (input)=\"onChange(controlDir.control?.value)\"\r\n (blur)=\"onTouched()\" (input)=\"checkIsNumber($event)\"\r\n [ngClass]=\"{'is-invalid is-invalid:focus': (controlDir.control?.invalid && (controlDir.control?.dirty || controlDir.control?.touched)) && errorMsg,'is-valid is-valid:focus': (controlDir.control?.valid && (controlDir.control?.dirty || controlDir.control?.touched) && (errorMsg || controlDir.value))}\">\r\n <label for=\"{{id}}\">{{label}}</label>\r\n <div class=\"invalid-feedback\" *ngIf=\"errorMessage !== null\">\r\n {{errorMsg}}\r\n </div>\r\n</div>", styles: [""], directives: [{ type: i2$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i2$1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i2$1.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i3$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i3$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
361
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: TextInputComponent, decorators: [{
362
+ type: Component,
363
+ args: [{ selector: 'ipa-text-input', template: "<div class=\"form-floating {{containerClasses}}\">\r\n <input #input id=\"{{id}}\" class=\"form-control {{classes}}\" [type]=\"type\" [required]=\"required\" pattern=\"{{pattern}}\"\r\n placeholder=\"{{placeholder}}\" [formControl]=\"formControl\" (input)=\"onChange(controlDir.control?.value)\"\r\n (blur)=\"onTouched()\" (input)=\"checkIsNumber($event)\"\r\n [ngClass]=\"{'is-invalid is-invalid:focus': (controlDir.control?.invalid && (controlDir.control?.dirty || controlDir.control?.touched)) && errorMsg,'is-valid is-valid:focus': (controlDir.control?.valid && (controlDir.control?.dirty || controlDir.control?.touched) && (errorMsg || controlDir.value))}\">\r\n <label for=\"{{id}}\">{{label}}</label>\r\n <div class=\"invalid-feedback\" *ngIf=\"errorMessage !== null\">\r\n {{errorMsg}}\r\n </div>\r\n</div>", styles: [""] }]
364
+ }], ctorParameters: function () { return [{ type: IPAFormService }, { type: i2$1.NgControl, decorators: [{
365
+ type: Self
366
+ }] }]; }, propDecorators: { input: [{
367
+ type: ViewChild,
368
+ args: ['input', { static: true }]
369
+ }], id: [{
370
+ type: Input
371
+ }], type: [{
372
+ type: Input
373
+ }], placeholder: [{
374
+ type: Input
375
+ }], label: [{
376
+ type: Input
377
+ }], required: [{
378
+ type: Input
379
+ }], patternErrorMsg: [{
380
+ type: Input
381
+ }], onlyNumber: [{
382
+ type: Input
383
+ }], pattern: [{
384
+ type: Input
385
+ }], classes: [{
386
+ type: Input
387
+ }], containerClasses: [{
388
+ type: Input
389
+ }] } });
390
+
391
+ class TextareaInputComponent {
392
+ constructor(validationService, controlDir) {
393
+ this.validationService = validationService;
394
+ this.controlDir = controlDir;
395
+ this.input = new ElementRef(null);
396
+ this.placeholder = 'please enter text';
397
+ this.label = 'textarea input';
398
+ this.required = false;
399
+ this.patternErrorMsg = 'invalid pattern';
400
+ this.formControl = new FormControl('');
401
+ this.controlDir.valueAccessor = this;
402
+ }
403
+ ngOnInit() {
404
+ const control = this.controlDir.control;
405
+ const validators = control?.validator ? [control.validator] : [];
406
+ control?.setValidators(validators);
407
+ control?.updateValueAndValidity();
408
+ this.formControl = control;
409
+ }
410
+ onChange(event) { }
411
+ onTouched() { }
412
+ writeValue(obj) {
413
+ this.input.nativeElement.value = obj || '';
414
+ }
415
+ registerOnChange(fn) {
416
+ this.onChange = fn;
417
+ }
418
+ registerOnTouched(fn) {
419
+ this.onTouched = fn;
420
+ }
421
+ get errorMessage() {
422
+ this.errorMsg = this.validationService.getErrorMessage(this.formControl, this.patternErrorMsg);
423
+ return this.errorMsg;
424
+ }
425
+ }
426
+ TextareaInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: TextareaInputComponent, deps: [{ token: IPAFormService }, { token: i2$1.NgControl, self: true }], target: i0.ɵɵFactoryTarget.Component });
427
+ TextareaInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.2", type: TextareaInputComponent, selector: "ipa-textarea-input", inputs: { id: "id", placeholder: "placeholder", label: "label", required: "required", patternErrorMsg: "patternErrorMsg", pattern: "pattern", classes: "classes", containerClasses: "containerClasses" }, viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"form-floating {{containerClasses}}\">\r\n <textarea #input id=\"{{id}}\" class=\"form-control {{classes}}\" [required]=\"required\" pattern=\"{{pattern}}\"\r\n placeholder=\"{{placeholder}}\" [formControl]=\"formControl\" (input)=\"onChange(controlDir.control?.value)\"\r\n (blur)=\"onTouched()\"\r\n [ngClass]=\"{'is-invalid is-invalid:focus': (controlDir.control?.invalid && (controlDir.control?.dirty || controlDir.control?.touched)) && errorMsg,'is-valid is-valid:focus': (controlDir.control?.valid && (controlDir.control?.dirty || controlDir.control?.touched) && (errorMsg || controlDir.value))}\">\r\n </textarea>\r\n <label for=\"{{id}}\">{{label}}</label>\r\n <div class=\"invalid-feedback\" *ngIf=\"errorMessage !== null\">\r\n {{errorMsg}}\r\n </div>\r\n</div>", styles: [""], directives: [{ type: i2$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i2$1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i2$1.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i3$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i3$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
428
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: TextareaInputComponent, decorators: [{
429
+ type: Component,
430
+ args: [{ selector: 'ipa-textarea-input', template: "<div class=\"form-floating {{containerClasses}}\">\r\n <textarea #input id=\"{{id}}\" class=\"form-control {{classes}}\" [required]=\"required\" pattern=\"{{pattern}}\"\r\n placeholder=\"{{placeholder}}\" [formControl]=\"formControl\" (input)=\"onChange(controlDir.control?.value)\"\r\n (blur)=\"onTouched()\"\r\n [ngClass]=\"{'is-invalid is-invalid:focus': (controlDir.control?.invalid && (controlDir.control?.dirty || controlDir.control?.touched)) && errorMsg,'is-valid is-valid:focus': (controlDir.control?.valid && (controlDir.control?.dirty || controlDir.control?.touched) && (errorMsg || controlDir.value))}\">\r\n </textarea>\r\n <label for=\"{{id}}\">{{label}}</label>\r\n <div class=\"invalid-feedback\" *ngIf=\"errorMessage !== null\">\r\n {{errorMsg}}\r\n </div>\r\n</div>", styles: [""] }]
431
+ }], ctorParameters: function () { return [{ type: IPAFormService }, { type: i2$1.NgControl, decorators: [{
432
+ type: Self
433
+ }] }]; }, propDecorators: { input: [{
434
+ type: ViewChild,
435
+ args: ['input', { static: true }]
436
+ }], id: [{
437
+ type: Input
438
+ }], placeholder: [{
439
+ type: Input
440
+ }], label: [{
441
+ type: Input
442
+ }], required: [{
443
+ type: Input
444
+ }], patternErrorMsg: [{
445
+ type: Input
446
+ }], pattern: [{
447
+ type: Input
448
+ }], classes: [{
449
+ type: Input
450
+ }], containerClasses: [{
451
+ type: Input
452
+ }] } });
453
+
454
+ class DropdownInputComponent {
455
+ constructor(validationService, controlDir) {
456
+ this.validationService = validationService;
457
+ this.controlDir = controlDir;
458
+ this.label = 'text input';
459
+ this.items = [];
460
+ this.required = false;
461
+ this.searchable = false;
462
+ this.notFoundText = 'لا يوجد بيانات';
463
+ this.formControl = new FormControl('');
464
+ this.controlDir.valueAccessor = this;
465
+ }
466
+ ngOnInit() {
467
+ const control = this.controlDir.control;
468
+ const validators = control?.validator ? [control.validator] : [];
469
+ control?.setValidators(validators);
470
+ control?.updateValueAndValidity();
471
+ this.formControl = control;
472
+ this.formControl.patchValue(null);
473
+ }
474
+ onChange(event) { }
475
+ onTouched() { }
476
+ writeValue(obj) {
477
+ if (this.input)
478
+ this.input.value = obj || '';
479
+ }
480
+ registerOnChange(fn) {
481
+ this.onChange = fn;
482
+ }
483
+ registerOnTouched(fn) {
484
+ this.onTouched = fn;
485
+ }
486
+ get errorMessage() {
487
+ this.errorMsg = this.validationService.getErrorMessage(this.formControl);
488
+ return this.errorMsg;
489
+ }
490
+ }
491
+ DropdownInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: DropdownInputComponent, deps: [{ token: IPAFormService }, { token: i2$1.NgControl, self: true }], target: i0.ɵɵFactoryTarget.Component });
492
+ DropdownInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.2", type: DropdownInputComponent, selector: "ipa-dropdown-input", inputs: { id: "id", label: "label", items: "items", textField: "textField", valueField: "valueField", required: "required", searchable: "searchable", notFoundText: "notFoundText", classes: "classes", containerClasses: "containerClasses" }, viewQueries: [{ propertyName: "input", first: true, predicate: ["select"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"form-floating {{containerClasses}}\"\r\n [ngClass]=\"{'was-validated': (controlDir.control?.dirty || controlDir.control?.touched) && required}\">\r\n\r\n <!-- searchable is false -->\r\n <ng-container *ngIf=\"!searchable\">\r\n <select #select id=\"{{id}}\" class=\"form-select {{classes}}\" [required]=\"required\" [formControl]=\"formControl\">\r\n <option *ngFor=\"let item of items\" [value]=\"valueField ? item[valueField] : item\">\r\n {{textField ? item[textField] : item}}</option>\r\n </select>\r\n <label for=\"{{id}}\">{{label}}</label>\r\n </ng-container>\r\n\r\n <!-- searchable is true -->\r\n <ng-select *ngIf=\"searchable\" #select dir=\"rtl\" class=\"{{classes}}\" [formControl]=\"formControl\" [items]=\"items\"\r\n [placeholder]=\"label\" [notFoundText]=\"notFoundText\" [required]=\"required\" [bindValue]=\"valueField\"\r\n [bindLabel]=\"textField\"\r\n [ngClass]=\"{'is-invalid is-invalid:focus': (controlDir.control?.invalid && (controlDir.control?.dirty || controlDir.control?.touched)) && errorMsg,'is-valid is-valid:focus': (controlDir.control?.valid && (controlDir.control?.dirty || controlDir.control?.touched) && (errorMsg || controlDir.value))}\">\r\n </ng-select>\r\n <div class=\"invalid-feedback\" *ngIf=\"errorMessage !== null\">\r\n {{errorMsg}}\r\n </div>\r\n</div>", styles: [""], components: [{ type: i3.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "markFirst", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }], directives: [{ type: i3$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i3$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2$1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i2$1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i3$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2$1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i2$1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i5.Dir, selector: "[dir]", inputs: ["dir"], outputs: ["dirChange"], exportAs: ["dir"] }] });
493
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: DropdownInputComponent, decorators: [{
494
+ type: Component,
495
+ args: [{ selector: 'ipa-dropdown-input', template: "<div class=\"form-floating {{containerClasses}}\"\r\n [ngClass]=\"{'was-validated': (controlDir.control?.dirty || controlDir.control?.touched) && required}\">\r\n\r\n <!-- searchable is false -->\r\n <ng-container *ngIf=\"!searchable\">\r\n <select #select id=\"{{id}}\" class=\"form-select {{classes}}\" [required]=\"required\" [formControl]=\"formControl\">\r\n <option *ngFor=\"let item of items\" [value]=\"valueField ? item[valueField] : item\">\r\n {{textField ? item[textField] : item}}</option>\r\n </select>\r\n <label for=\"{{id}}\">{{label}}</label>\r\n </ng-container>\r\n\r\n <!-- searchable is true -->\r\n <ng-select *ngIf=\"searchable\" #select dir=\"rtl\" class=\"{{classes}}\" [formControl]=\"formControl\" [items]=\"items\"\r\n [placeholder]=\"label\" [notFoundText]=\"notFoundText\" [required]=\"required\" [bindValue]=\"valueField\"\r\n [bindLabel]=\"textField\"\r\n [ngClass]=\"{'is-invalid is-invalid:focus': (controlDir.control?.invalid && (controlDir.control?.dirty || controlDir.control?.touched)) && errorMsg,'is-valid is-valid:focus': (controlDir.control?.valid && (controlDir.control?.dirty || controlDir.control?.touched) && (errorMsg || controlDir.value))}\">\r\n </ng-select>\r\n <div class=\"invalid-feedback\" *ngIf=\"errorMessage !== null\">\r\n {{errorMsg}}\r\n </div>\r\n</div>", styles: [""] }]
496
+ }], ctorParameters: function () { return [{ type: IPAFormService }, { type: i2$1.NgControl, decorators: [{
497
+ type: Self
498
+ }] }]; }, propDecorators: { input: [{
499
+ type: ViewChild,
500
+ args: ['select', { static: true }]
501
+ }], id: [{
502
+ type: Input
503
+ }], label: [{
504
+ type: Input
505
+ }], items: [{
506
+ type: Input
507
+ }], textField: [{
508
+ type: Input
509
+ }], valueField: [{
510
+ type: Input
511
+ }], required: [{
512
+ type: Input
513
+ }], searchable: [{
514
+ type: Input
515
+ }], notFoundText: [{
516
+ type: Input
517
+ }], classes: [{
518
+ type: Input
519
+ }], containerClasses: [{
520
+ type: Input
521
+ }] } });
522
+
523
+ class LoaderService {
524
+ constructor() {
525
+ this.isLoading = new BehaviorSubject(false);
526
+ this.urls = [];
527
+ }
528
+ setExceptionUrls(urls) {
529
+ this.urls = urls;
530
+ }
531
+ addExceptionUrl(url) {
532
+ this.urls.push(url);
533
+ }
534
+ }
535
+ LoaderService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: LoaderService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
536
+ LoaderService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: LoaderService, providedIn: 'root' });
537
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: LoaderService, decorators: [{
538
+ type: Injectable,
539
+ args: [{
540
+ providedIn: 'root',
541
+ }]
542
+ }], ctorParameters: function () { return []; } });
543
+
544
+ class LoaderComponent {
545
+ constructor(loaderService, cdr) {
546
+ this.loaderService = loaderService;
547
+ this.cdr = cdr;
548
+ }
549
+ ngAfterViewInit() {
550
+ this.loaderService.isLoading.subscribe((v) => {
551
+ this.loading = v;
552
+ this.cdr.detectChanges();
553
+ });
554
+ }
555
+ }
556
+ LoaderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: LoaderComponent, deps: [{ token: LoaderService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
557
+ LoaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.2", type: LoaderComponent, selector: "ipa-loader", ngImport: i0, template: "<div id=\"cover-spin\" *ngIf=\"loading\">\r\n <div class=\"spinner\"></div>\r\n</div>\r\n", styles: ["#cover-spin{display:flex}\n"], directives: [{ type: i3$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
558
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: LoaderComponent, decorators: [{
559
+ type: Component,
560
+ args: [{ selector: 'ipa-loader', template: "<div id=\"cover-spin\" *ngIf=\"loading\">\r\n <div class=\"spinner\"></div>\r\n</div>\r\n", styles: ["#cover-spin{display:flex}\n"] }]
561
+ }], ctorParameters: function () { return [{ type: LoaderService }, { type: i0.ChangeDetectorRef }]; } });
562
+
563
+ class FileUploadComponent {
564
+ constructor(
565
+ // private authService: AuthService,
566
+ toastrService) {
567
+ this.toastrService = toastrService;
568
+ this.label = '';
569
+ this.required = false;
570
+ this.acceptedFiles = '';
571
+ this.multiple = 1; // set maxFiles (NOT uploadMultiple)in the config object,
572
+ this.maxFileSize = 2;
573
+ this.method = 'POST';
574
+ this.autoUpload = false;
575
+ this.apiUrl = 'apiUrl';
576
+ this.successUpload = new EventEmitter();
577
+ this.fileAdded = new EventEmitter();
578
+ this.fileDeleted = new EventEmitter();
579
+ this.dragEnter = false;
580
+ this.errors = [];
581
+ this.filesAdded = [];
582
+ this.currentFiles = [];
583
+ }
584
+ ngOnInit() {
585
+ this.label = 'رفع ' + this.label;
586
+ this.config = {
587
+ url: this.apiUrl,
588
+ method: this.method,
589
+ headers: {
590
+ Authorization: 'Bearer ' + this.authorization,
591
+ },
592
+ maxFilesize: this.maxFileSize,
593
+ maxFiles: this.multiple,
594
+ uploadMultiple: this.multiple > 1,
595
+ dictInvalidFileType: 'صيغة الملف غير مسموح بها',
596
+ dictFileTooBig: 'الحجم تجاوز الحد المسموح',
597
+ dictMaxFilesExceeded: 'الرجاء حذف الملفات الموجودة حاليا لتتمكن من رفع هذا الملف',
598
+ acceptedFiles: this.acceptedFiles,
599
+ autoProcessQueue: this.autoUpload,
600
+ previewTemplate: '<span></span>',
601
+ };
602
+ }
603
+ operationCompleted(e) {
604
+ if (this.filesAdded.length > 0) {
605
+ this.successUpload.emit(this.filesAdded);
606
+ this.filesAdded = [];
607
+ }
608
+ this.dropzoneDir.reset();
609
+ }
610
+ onUploadSuccess(e) {
611
+ const file = e[0];
612
+ if (file.status === 'success') {
613
+ this.filesAdded.push(file);
614
+ }
615
+ this.toastrService.success('تم تحميل المرفقات بنجاح');
616
+ }
617
+ onUploadError(e) {
618
+ if (e[1]) {
619
+ this.errors = [];
620
+ this.errors.push(`${e[1]} (${e[0].name})`);
621
+ }
622
+ }
623
+ fileWasAdded(e) {
624
+ const myDropzone = this.dropzoneDir.dropzone();
625
+ if (this.multiple === 1) {
626
+ this.currentFiles = [];
627
+ this.filesAdded = [];
628
+ this.errors = [];
629
+ const files = myDropzone.files;
630
+ if (files.length > 1) {
631
+ myDropzone.removeFile(files[0]);
632
+ }
633
+ }
634
+ this.currentFiles.push(e);
635
+ this.fileAdded.emit(e);
636
+ }
637
+ sending(e) {
638
+ this.errors = [];
639
+ }
640
+ reset(e) { }
641
+ deleteFile(file) {
642
+ this.currentFiles = this.currentFiles.filter((x) => x.name !== file.name && x.size !== file.size);
643
+ this.errors = [];
644
+ this.fileDeleted.emit();
645
+ }
646
+ }
647
+ FileUploadComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: FileUploadComponent, deps: [{ token: i1.ToastrService }], target: i0.ɵɵFactoryTarget.Component });
648
+ FileUploadComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.2", type: FileUploadComponent, selector: "ipa-file-upload", inputs: { label: "label", required: "required", acceptedFiles: "acceptedFiles", multiple: "multiple", maxFileSize: "maxFileSize", method: "method", autoUpload: "autoUpload", apiUrl: "apiUrl", authorization: "authorization" }, outputs: { successUpload: "successUpload", fileAdded: "fileAdded", fileDeleted: "fileDeleted" }, viewQueries: [{ propertyName: "dropzoneDir", first: true, predicate: DropzoneDirective, descendants: true }], ngImport: i0, template: "<div class=\"file-upload\">\r\n <div class=\"upload-overlay\" [dropzone]=\"config\" (error)=\"onUploadError($event)\"\r\n (queueComplete)=\"operationCompleted($event)\" (success)=\"onUploadSuccess($event)\" (dragenter)=\"dragEnter = true\"\r\n (dragLeave)=\"dragEnter = false\" (drop)=\"dragEnter = false\" (dragEnd)=\"dragEnter = false\"\r\n [class.active-border]=\"dragEnter\" (sending)=\"sending($event)\" (reset)=\"reset($event)\"\r\n (addedFile)=\"fileWasAdded($event)\">\r\n </div>\r\n <div class=\"upload-btn-wrapper\">\r\n <div>\r\n <div class=\"subtitle mb-2\">\r\n {{label}}\r\n <span *ngIf=\"required\" class=\"required\">*</span>\r\n </div>\r\n <hr>\r\n <span style=\"font-size: 12px;\">\u0642\u0645 \u0628\u0633\u062D\u0628 \u0627\u0644\u0645\u0644\u0641 \u0623\u0648 \u0627\u0636\u063A\u0637 \u0647\u0646\u0627</span>\r\n <i class=\"fas fa-upload upload-icon mr-2\"></i>\r\n </div>\r\n <div *ngIf=\"acceptedFiles.length > 0\" class=\"allowed-extensions\">\r\n \u0627\u0644\u0635\u064A\u063A\u0629 \u0627\u0644\u0645\u0633\u0645\u0648\u062D \u0628\u0647\u0627:\r\n <span class=\"extensions\">{{ acceptedFiles }}</span>\r\n </div>\r\n <div class=\"allowed-extensions\">\r\n \u0627\u0642\u0635\u0649 \u062D\u062C\u0645 \u0644\u0644\u0645\u0631\u0641\u0642:\r\n <span class=\"extensions\">{{ maxFileSize }} MB</span>\r\n </div>\r\n </div>\r\n</div>\r\n<div id=\"attachment-status\" style=\"text-align: center; margin-top:10px;\">\r\n <span style=\"font-size: 14px; margin: auto; font-weight:bold;\" *ngFor=\"let file of currentFiles\">\r\n {{ file.name }} <i (click)=\"deleteFile(file)\" class=\"fas fa-trash\"\r\n style=\"color:firebrick; cursor: pointer;\"></i>\r\n <br>\r\n </span>\r\n <ul class=\"list-unstyled\">\r\n <li class=\"text-danger\" style=\"font-size: 12px;\" *ngFor=\"let error of errors\">{{error}}</li>\r\n </ul>\r\n</div>", styles: [".subtitle{border-bottom:none;display:block;line-height:2}.file-upload{border:dashed 1px #ccc;display:block;min-height:150px;border-radius:15px;width:350px;cursor:pointer;position:relative;margin:auto}.upload-overlay{position:absolute;width:100%;height:100%}.upload-btn-wrapper{text-align:center}.upload-icon{margin-right:5px}.list-unstyled{margin:10px!important;padding:14px!important;list-style:none}.allowed-extensions{color:#4d7297}.required{color:#dc3545;font-size:20px}\n"], directives: [{ type: i2$2.DropzoneDirective, selector: "[dropzone]", inputs: ["disabled", "dropzone"], outputs: ["init", "error", "success", "sending", "canceled", "complete", "processing", "drop", "dragStart", "dragEnd", "dragEnter", "dragOver", "dragLeave", "thumbnail", "addedFile", "addedFiles", "removedFile", "uploadProgress", "maxFilesReached", "maxFilesExceeded", "errorMultiple", "successMultiple", "sendingMultiple", "canceledMultiple", "completeMultiple", "processingMultiple", "reset", "queueComplete", "totalUploadProgress"], exportAs: ["ngxDropzone"] }, { type: i3$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
649
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: FileUploadComponent, decorators: [{
650
+ type: Component,
651
+ args: [{ selector: 'ipa-file-upload', template: "<div class=\"file-upload\">\r\n <div class=\"upload-overlay\" [dropzone]=\"config\" (error)=\"onUploadError($event)\"\r\n (queueComplete)=\"operationCompleted($event)\" (success)=\"onUploadSuccess($event)\" (dragenter)=\"dragEnter = true\"\r\n (dragLeave)=\"dragEnter = false\" (drop)=\"dragEnter = false\" (dragEnd)=\"dragEnter = false\"\r\n [class.active-border]=\"dragEnter\" (sending)=\"sending($event)\" (reset)=\"reset($event)\"\r\n (addedFile)=\"fileWasAdded($event)\">\r\n </div>\r\n <div class=\"upload-btn-wrapper\">\r\n <div>\r\n <div class=\"subtitle mb-2\">\r\n {{label}}\r\n <span *ngIf=\"required\" class=\"required\">*</span>\r\n </div>\r\n <hr>\r\n <span style=\"font-size: 12px;\">\u0642\u0645 \u0628\u0633\u062D\u0628 \u0627\u0644\u0645\u0644\u0641 \u0623\u0648 \u0627\u0636\u063A\u0637 \u0647\u0646\u0627</span>\r\n <i class=\"fas fa-upload upload-icon mr-2\"></i>\r\n </div>\r\n <div *ngIf=\"acceptedFiles.length > 0\" class=\"allowed-extensions\">\r\n \u0627\u0644\u0635\u064A\u063A\u0629 \u0627\u0644\u0645\u0633\u0645\u0648\u062D \u0628\u0647\u0627:\r\n <span class=\"extensions\">{{ acceptedFiles }}</span>\r\n </div>\r\n <div class=\"allowed-extensions\">\r\n \u0627\u0642\u0635\u0649 \u062D\u062C\u0645 \u0644\u0644\u0645\u0631\u0641\u0642:\r\n <span class=\"extensions\">{{ maxFileSize }} MB</span>\r\n </div>\r\n </div>\r\n</div>\r\n<div id=\"attachment-status\" style=\"text-align: center; margin-top:10px;\">\r\n <span style=\"font-size: 14px; margin: auto; font-weight:bold;\" *ngFor=\"let file of currentFiles\">\r\n {{ file.name }} <i (click)=\"deleteFile(file)\" class=\"fas fa-trash\"\r\n style=\"color:firebrick; cursor: pointer;\"></i>\r\n <br>\r\n </span>\r\n <ul class=\"list-unstyled\">\r\n <li class=\"text-danger\" style=\"font-size: 12px;\" *ngFor=\"let error of errors\">{{error}}</li>\r\n </ul>\r\n</div>", styles: [".subtitle{border-bottom:none;display:block;line-height:2}.file-upload{border:dashed 1px #ccc;display:block;min-height:150px;border-radius:15px;width:350px;cursor:pointer;position:relative;margin:auto}.upload-overlay{position:absolute;width:100%;height:100%}.upload-btn-wrapper{text-align:center}.upload-icon{margin-right:5px}.list-unstyled{margin:10px!important;padding:14px!important;list-style:none}.allowed-extensions{color:#4d7297}.required{color:#dc3545;font-size:20px}\n"] }]
652
+ }], ctorParameters: function () { return [{ type: i1.ToastrService }]; }, propDecorators: { dropzoneDir: [{
653
+ type: ViewChild,
654
+ args: [DropzoneDirective, { static: false }]
655
+ }], label: [{
656
+ type: Input
657
+ }], required: [{
658
+ type: Input
659
+ }], acceptedFiles: [{
660
+ type: Input
661
+ }], multiple: [{
662
+ type: Input
663
+ }], maxFileSize: [{
664
+ type: Input
665
+ }], method: [{
666
+ type: Input
667
+ }], autoUpload: [{
668
+ type: Input
669
+ }], apiUrl: [{
670
+ type: Input
671
+ }], authorization: [{
672
+ type: Input
673
+ }], successUpload: [{
674
+ type: Output
675
+ }], fileAdded: [{
676
+ type: Output
677
+ }], fileDeleted: [{
678
+ type: Output
679
+ }] } });
680
+
681
+ class RecaptchaComponent {
682
+ constructor(controlDir) {
683
+ this.controlDir = controlDir;
684
+ this.siteKey = '6LefJQYdAAAAAIlxmfkjNlWidMk8VukIZcs6lO5e';
685
+ this.recaptchaSize = 'normal';
686
+ this.lang = 'ar';
687
+ this.recaptchaType = 'image';
688
+ this.theme = 'light';
689
+ this.useGlobalDomain = true;
690
+ this.formControl = new FormControl('');
691
+ this.controlDir.valueAccessor = this;
692
+ }
693
+ ngOnInit() {
694
+ const control = this.controlDir.control;
695
+ const validators = control?.validator ? [control.validator] : [];
696
+ control?.setValidators(validators);
697
+ control?.updateValueAndValidity();
698
+ this.formControl = control;
699
+ }
700
+ onChange(event) { }
701
+ onTouched() { }
702
+ writeValue(obj) { }
703
+ registerOnChange(fn) {
704
+ this.onChange = fn;
705
+ }
706
+ registerOnTouched(fn) {
707
+ this.onTouched = fn;
708
+ }
709
+ }
710
+ RecaptchaComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: RecaptchaComponent, deps: [{ token: i2$1.NgControl, self: true }], target: i0.ɵɵFactoryTarget.Component });
711
+ RecaptchaComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.2", type: RecaptchaComponent, selector: "ipa-recaptcha", inputs: { siteKey: "siteKey", recaptchaSize: "recaptchaSize", lang: "lang", recaptchaType: "recaptchaType", theme: "theme", useGlobalDomain: "useGlobalDomain" }, ngImport: i0, template: "<ngx-recaptcha2 [siteKey]=\"siteKey\" [size]=\"recaptchaSize\" [hl]=\"lang\" [theme]=\"theme\" [type]=\"recaptchaType\"\n [useGlobalDomain]=\"useGlobalDomain\" [formControl]=\"formControl\">\n</ngx-recaptcha2>", styles: [""], components: [{ type: i2$3.ReCaptcha2Component, selector: "ngx-recaptcha2", inputs: ["theme", "size", "hl"] }], directives: [{ type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] });
712
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: RecaptchaComponent, decorators: [{
713
+ type: Component,
714
+ args: [{ selector: 'ipa-recaptcha', template: "<ngx-recaptcha2 [siteKey]=\"siteKey\" [size]=\"recaptchaSize\" [hl]=\"lang\" [theme]=\"theme\" [type]=\"recaptchaType\"\n [useGlobalDomain]=\"useGlobalDomain\" [formControl]=\"formControl\">\n</ngx-recaptcha2>", styles: [""] }]
715
+ }], ctorParameters: function () { return [{ type: i2$1.NgControl, decorators: [{
716
+ type: Self
717
+ }] }]; }, propDecorators: { siteKey: [{
718
+ type: Input
719
+ }], recaptchaSize: [{
720
+ type: Input
721
+ }], lang: [{
722
+ type: Input
723
+ }], recaptchaType: [{
724
+ type: Input
725
+ }], theme: [{
726
+ type: Input
727
+ }], useGlobalDomain: [{
728
+ type: Input
729
+ }] } });
730
+
731
+ class GenerateFormComponent {
732
+ constructor(validationService) {
733
+ this.validationService = validationService;
734
+ this.recaptchaSize = 'normal';
735
+ this.lang = 'ar';
736
+ this.recaptchaType = 'image';
737
+ this.theme = 'light';
738
+ this.useGlobalDomain = true;
739
+ // file upload outputs
740
+ this.successUpload = new EventEmitter();
741
+ this.fileAdded = new EventEmitter();
742
+ this.fileDeleted = new EventEmitter();
743
+ }
744
+ ngOnInit() {
745
+ this.createForm();
746
+ }
747
+ get formControls() {
748
+ return this.generateForm.get('items');
749
+ }
750
+ getErrorMessage(formControlName) {
751
+ const formControl = this.generateForm.controls[formControlName];
752
+ this.errorMsg = this.validationService.getErrorMessage(formControl);
753
+ return this.errorMsg;
754
+ }
755
+ SuccessUpload(event) {
756
+ this.successUpload.emit(event);
757
+ }
758
+ FileAdded(file, formControlName) {
759
+ this.generateForm.controls[formControlName].patchValue(file);
760
+ this.fileAdded.emit(file);
761
+ }
762
+ FileDeleted(event, formControlName) {
763
+ this.generateForm.controls[formControlName].patchValue(null);
764
+ this.fileDeleted.emit(event);
765
+ }
766
+ createForm() {
767
+ this.form.columns.forEach((column) => {
768
+ if (column.type === 'checkbox') {
769
+ this.addCheckboxControl(column);
770
+ }
771
+ else {
772
+ this.generateForm.addControl(column.englishName, new FormControl(null, [
773
+ column.required ? Validators.required : Validators.nullValidator,
774
+ Validators.maxLength(column.size),
775
+ column.type === 'number'
776
+ ? Validators.min(1)
777
+ : Validators.nullValidator,
778
+ ]));
779
+ }
780
+ });
781
+ }
782
+ addCheckboxControl(column) {
783
+ let checkboxGroup = new FormArray(column.data.map((item) => {
784
+ return new FormGroup({
785
+ [column.valueField]: new FormControl(item[column.valueField]),
786
+ [column.textField]: new FormControl(item[column.textField]),
787
+ checkbox: new FormControl(false, Validators.required),
788
+ });
789
+ }));
790
+ this.generateForm.addControl(column.englishName, new FormControl(null, column.required ? Validators.required : Validators.nullValidator));
791
+ this.generateForm.addControl('items', checkboxGroup);
792
+ checkboxGroup.valueChanges.subscribe((value) => {
793
+ if (this.getCheckboxSelectedValues(value)) {
794
+ this.generateForm.controls[column.englishName].patchValue(value);
795
+ }
796
+ else {
797
+ this.generateForm.controls[column.englishName].patchValue(null);
798
+ this.generateForm.controls[column.englishName].markAsTouched();
799
+ }
800
+ });
801
+ }
802
+ getCheckboxSelectedValues(items) {
803
+ let selectedItems = items.filter((item) => item.checkbox);
804
+ return selectedItems.length > 0 ? selectedItems : null;
805
+ }
806
+ }
807
+ GenerateFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: GenerateFormComponent, deps: [{ token: IPAFormService }], target: i0.ɵɵFactoryTarget.Component });
808
+ GenerateFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.2", type: GenerateFormComponent, selector: "ipa-generate-form", inputs: { generateForm: "generateForm", form: "form", siteKey: "siteKey", recaptchaSize: "recaptchaSize", lang: "lang", recaptchaType: "recaptchaType", theme: "theme", useGlobalDomain: "useGlobalDomain" }, outputs: { successUpload: "successUpload", fileAdded: "fileAdded", fileDeleted: "fileDeleted" }, ngImport: i0, template: "<form [formGroup]=\"generateForm\">\r\n <ng-container *ngFor=\"let column of form.columns\">\r\n <div [ngSwitch]=\"column.type\">\r\n <!-- TEXTAREA -->\r\n <div *ngSwitchCase=\"'textArea'\">\r\n <ipa-textarea-input [formControlName]=\"column.englishName\" [id]=\"column.englishName\"\r\n [label]=\"column.arabicLabel\" [required]=\"column.required\" [pattern]=\"column.validationPattern!\"\r\n [patternErrorMsg]=\"column.patternErrorMsg!\" [classes]=\"column.inputClasses!\"\r\n [containerClasses]=\"column.containerClasses!\"></ipa-textarea-input>\r\n </div>\r\n\r\n <!-- DROP DOWN LIST -->\r\n <div *ngSwitchCase=\"'select'\">\r\n <ipa-dropdown-input [formControlName]=\"column.englishName\" [id]=\"column.englishName\"\r\n [label]=\"column.arabicLabel\" [items]=\"column.data!\" [valueField]=\"column.valueField!\"\r\n [textField]=\"column.textField!\" [required]=\"column.required\" [searchable]=\"column.searchable\"\r\n [notFoundText]=\"column.notFoundText\" [classes]=\"column.inputClasses!\"\r\n [containerClasses]=\"column.containerClasses!\">\r\n </ipa-dropdown-input>\r\n </div>\r\n\r\n <!-- CHECKBOX -->\r\n <div *ngSwitchCase=\"'checkbox'\">\r\n <label [for]=\"column.englishName\">{{column.arabicLabel}}</label>\r\n <div [formArrayName]=\"'items'\" *ngFor=\"let control of formControls.controls; let i = index\">\r\n <div [formGroupName]=\"i\" [id]=\"column.englishName\">\r\n <div class=\"form-check\">\r\n <input [id]=\"column.englishName+control.value[column.valueField!]\" class=\"form-check-input\"\r\n type=\"checkbox\" formControlName=\"checkbox\">\r\n <label class=\"form-check-label\"\r\n [for]=\"column.englishName+control.value[column.valueField!]\">\r\n {{control.value[column.textField!]}}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"invalid-feedback\" style=\"display: block !important;\"\r\n *ngIf=\"getErrorMessage(column.englishName) !== null\">\r\n {{errorMsg}}\r\n </div>\r\n </div>\r\n\r\n <!-- RADIO -->\r\n <div *ngSwitchCase=\"'radio'\">\r\n <label [for]=\"column.englishName\">{{column.arabicLabel}}</label>\r\n <div *ngFor=\"let item of column.data; let i = index\" [id]=\"column.englishName\">\r\n <div class=\"form-check\">\r\n <input [id]=\"column.englishName+item[column.valueField!]\" class=\"form-check-input\" type=\"radio\"\r\n [formControlName]=\"column.englishName\" [value]=\"item[column.valueField!]\">\r\n <label class=\"form-check-label\" [for]=\"column.englishName+item[column.valueField!]\">\r\n {{item[column.textField!]}}\r\n </label>\r\n </div>\r\n </div>\r\n <div class=\"invalid-feedback\" style=\"display: block !important;\"\r\n *ngIf=\"getErrorMessage(column.englishName) !== null\">\r\n {{errorMsg}}\r\n </div>\r\n </div>\r\n\r\n <!-- FILE UPLOAD -->\r\n <div *ngSwitchCase=\"'file'\">\r\n <ipa-file-upload [label]=\"column.arabicLabel\" [acceptedFiles]=\"column.acceptedFiles!\"\r\n [multiple]=\"column.multipleFile!\" [maxFileSize]=\"column.size!\" [method]=\"column.apiURlMethod!\"\r\n [autoUpload]=\"column.autoUploadFile!\" [apiUrl]=\"column.apiUrl?? 'apiUrl' \"\r\n [authorization]=\"column.authorization!\" ngDefaultControl [formControlName]=\"column.englishName\"\r\n (successUpload)=\"SuccessUpload($event)\" (fileAdded)=\"FileAdded($event, column.englishName)\"\r\n (fileDeleted)=\"FileDeleted($event, column.englishName)\"></ipa-file-upload>\r\n </div>\r\n\r\n <!-- recaptcha -->\r\n <div *ngSwitchCase=\"'recaptcha'\">\r\n <ipa-recaptcha [recaptchaSize]=\"recaptchaSize\" [lang]=\"lang\" [theme]=\"theme\"\r\n [recaptchaType]=\"recaptchaType\" [useGlobalDomain]=\"useGlobalDomain\"\r\n formControlName=\"{{column.englishName}}\"></ipa-recaptcha>\r\n </div>\r\n\r\n <!-- DEFAULT -->\r\n <div *ngSwitchDefault>\r\n <ipa-text-input [formControlName]=\"column.englishName\" [id]=\"column.englishName\" [type]=\"column.type\"\r\n [label]=\"column.arabicLabel\" [required]=\"column.required\" [pattern]=\"column.validationPattern!\"\r\n [patternErrorMsg]=\"column.patternErrorMsg!\" [classes]=\"column.inputClasses!\"\r\n [containerClasses]=\"column.containerClasses!\"></ipa-text-input>\r\n </div>\r\n </div>\r\n </ng-container>\r\n</form>", styles: [""], components: [{ type: TextareaInputComponent, selector: "ipa-textarea-input", inputs: ["id", "placeholder", "label", "required", "patternErrorMsg", "pattern", "classes", "containerClasses"] }, { type: DropdownInputComponent, selector: "ipa-dropdown-input", inputs: ["id", "label", "items", "textField", "valueField", "required", "searchable", "notFoundText", "classes", "containerClasses"] }, { type: FileUploadComponent, selector: "ipa-file-upload", inputs: ["label", "required", "acceptedFiles", "multiple", "maxFileSize", "method", "autoUpload", "apiUrl", "authorization"], outputs: ["successUpload", "fileAdded", "fileDeleted"] }, { type: RecaptchaComponent, selector: "ipa-recaptcha", inputs: ["siteKey", "recaptchaSize", "lang", "recaptchaType", "theme", "useGlobalDomain"] }, { type: TextInputComponent, selector: "ipa-text-input", inputs: ["id", "type", "placeholder", "label", "required", "patternErrorMsg", "onlyNumber", "pattern", "classes", "containerClasses"] }], directives: [{ type: i2$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i2$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i2$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i3$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3$1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i3$1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i2$1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i2$1.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { type: i2$1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { type: i2$1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { type: i2$1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i3$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2$1.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { type: i2$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i3$1.NgSwitchDefault, selector: "[ngSwitchDefault]" }] });
809
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: GenerateFormComponent, decorators: [{
810
+ type: Component,
811
+ args: [{ selector: 'ipa-generate-form', template: "<form [formGroup]=\"generateForm\">\r\n <ng-container *ngFor=\"let column of form.columns\">\r\n <div [ngSwitch]=\"column.type\">\r\n <!-- TEXTAREA -->\r\n <div *ngSwitchCase=\"'textArea'\">\r\n <ipa-textarea-input [formControlName]=\"column.englishName\" [id]=\"column.englishName\"\r\n [label]=\"column.arabicLabel\" [required]=\"column.required\" [pattern]=\"column.validationPattern!\"\r\n [patternErrorMsg]=\"column.patternErrorMsg!\" [classes]=\"column.inputClasses!\"\r\n [containerClasses]=\"column.containerClasses!\"></ipa-textarea-input>\r\n </div>\r\n\r\n <!-- DROP DOWN LIST -->\r\n <div *ngSwitchCase=\"'select'\">\r\n <ipa-dropdown-input [formControlName]=\"column.englishName\" [id]=\"column.englishName\"\r\n [label]=\"column.arabicLabel\" [items]=\"column.data!\" [valueField]=\"column.valueField!\"\r\n [textField]=\"column.textField!\" [required]=\"column.required\" [searchable]=\"column.searchable\"\r\n [notFoundText]=\"column.notFoundText\" [classes]=\"column.inputClasses!\"\r\n [containerClasses]=\"column.containerClasses!\">\r\n </ipa-dropdown-input>\r\n </div>\r\n\r\n <!-- CHECKBOX -->\r\n <div *ngSwitchCase=\"'checkbox'\">\r\n <label [for]=\"column.englishName\">{{column.arabicLabel}}</label>\r\n <div [formArrayName]=\"'items'\" *ngFor=\"let control of formControls.controls; let i = index\">\r\n <div [formGroupName]=\"i\" [id]=\"column.englishName\">\r\n <div class=\"form-check\">\r\n <input [id]=\"column.englishName+control.value[column.valueField!]\" class=\"form-check-input\"\r\n type=\"checkbox\" formControlName=\"checkbox\">\r\n <label class=\"form-check-label\"\r\n [for]=\"column.englishName+control.value[column.valueField!]\">\r\n {{control.value[column.textField!]}}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"invalid-feedback\" style=\"display: block !important;\"\r\n *ngIf=\"getErrorMessage(column.englishName) !== null\">\r\n {{errorMsg}}\r\n </div>\r\n </div>\r\n\r\n <!-- RADIO -->\r\n <div *ngSwitchCase=\"'radio'\">\r\n <label [for]=\"column.englishName\">{{column.arabicLabel}}</label>\r\n <div *ngFor=\"let item of column.data; let i = index\" [id]=\"column.englishName\">\r\n <div class=\"form-check\">\r\n <input [id]=\"column.englishName+item[column.valueField!]\" class=\"form-check-input\" type=\"radio\"\r\n [formControlName]=\"column.englishName\" [value]=\"item[column.valueField!]\">\r\n <label class=\"form-check-label\" [for]=\"column.englishName+item[column.valueField!]\">\r\n {{item[column.textField!]}}\r\n </label>\r\n </div>\r\n </div>\r\n <div class=\"invalid-feedback\" style=\"display: block !important;\"\r\n *ngIf=\"getErrorMessage(column.englishName) !== null\">\r\n {{errorMsg}}\r\n </div>\r\n </div>\r\n\r\n <!-- FILE UPLOAD -->\r\n <div *ngSwitchCase=\"'file'\">\r\n <ipa-file-upload [label]=\"column.arabicLabel\" [acceptedFiles]=\"column.acceptedFiles!\"\r\n [multiple]=\"column.multipleFile!\" [maxFileSize]=\"column.size!\" [method]=\"column.apiURlMethod!\"\r\n [autoUpload]=\"column.autoUploadFile!\" [apiUrl]=\"column.apiUrl?? 'apiUrl' \"\r\n [authorization]=\"column.authorization!\" ngDefaultControl [formControlName]=\"column.englishName\"\r\n (successUpload)=\"SuccessUpload($event)\" (fileAdded)=\"FileAdded($event, column.englishName)\"\r\n (fileDeleted)=\"FileDeleted($event, column.englishName)\"></ipa-file-upload>\r\n </div>\r\n\r\n <!-- recaptcha -->\r\n <div *ngSwitchCase=\"'recaptcha'\">\r\n <ipa-recaptcha [recaptchaSize]=\"recaptchaSize\" [lang]=\"lang\" [theme]=\"theme\"\r\n [recaptchaType]=\"recaptchaType\" [useGlobalDomain]=\"useGlobalDomain\"\r\n formControlName=\"{{column.englishName}}\"></ipa-recaptcha>\r\n </div>\r\n\r\n <!-- DEFAULT -->\r\n <div *ngSwitchDefault>\r\n <ipa-text-input [formControlName]=\"column.englishName\" [id]=\"column.englishName\" [type]=\"column.type\"\r\n [label]=\"column.arabicLabel\" [required]=\"column.required\" [pattern]=\"column.validationPattern!\"\r\n [patternErrorMsg]=\"column.patternErrorMsg!\" [classes]=\"column.inputClasses!\"\r\n [containerClasses]=\"column.containerClasses!\"></ipa-text-input>\r\n </div>\r\n </div>\r\n </ng-container>\r\n</form>", styles: [""] }]
812
+ }], ctorParameters: function () { return [{ type: IPAFormService }]; }, propDecorators: { generateForm: [{
813
+ type: Input
814
+ }], form: [{
815
+ type: Input
816
+ }], siteKey: [{
817
+ type: Input
818
+ }], recaptchaSize: [{
819
+ type: Input
820
+ }], lang: [{
821
+ type: Input
822
+ }], recaptchaType: [{
823
+ type: Input
824
+ }], theme: [{
825
+ type: Input
826
+ }], useGlobalDomain: [{
827
+ type: Input
828
+ }], successUpload: [{
829
+ type: Output
830
+ }], fileAdded: [{
831
+ type: Output
832
+ }], fileDeleted: [{
833
+ type: Output
834
+ }] } });
835
+
836
+ class DatepickerComponent {
837
+ constructor(ipaFormService, calendar, controlDir, config) {
838
+ this.ipaFormService = ipaFormService;
839
+ this.calendar = calendar;
840
+ this.controlDir = controlDir;
841
+ this.label = 'datepicker';
842
+ this.patternErrorMsg = 'invalid pattern';
843
+ this.required = false;
844
+ this.today = this.calendar.getToday();
845
+ this.formControl = new FormControl('');
846
+ this.controlDir.valueAccessor = this;
847
+ config.container = 'body';
848
+ }
849
+ ngOnInit() {
850
+ const control = this.controlDir.control;
851
+ const validators = control?.validator ? [control.validator] : [];
852
+ control?.setValidators(validators);
853
+ control?.updateValueAndValidity();
854
+ this.formControl = control;
855
+ }
856
+ onChange(event) { }
857
+ onTouched() { }
858
+ writeValue(obj) { }
859
+ registerOnChange(fn) {
860
+ this.onChange = fn;
861
+ }
862
+ registerOnTouched(fn) {
863
+ this.onTouched = fn;
864
+ }
865
+ get errorMessage() {
866
+ this.errorMsg = this.ipaFormService.getErrorMessage(this.formControl, this.patternErrorMsg);
867
+ return this.errorMsg;
868
+ }
869
+ }
870
+ DatepickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: DatepickerComponent, deps: [{ token: IPAFormService }, { token: i2.NgbCalendar }, { token: i2$1.NgControl, self: true }, { token: i2.NgbInputDatepickerConfig }], target: i0.ɵɵFactoryTarget.Component });
871
+ DatepickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.2", type: DatepickerComponent, selector: "ipa-datepicker", inputs: { id: "id", label: "label", patternErrorMsg: "patternErrorMsg", required: "required", maxDate: "maxDate", minDate: "minDate", classes: "classes", containerClasses: "containerClasses" }, ngImport: i0, template: "<div class=\"form-floating input-group {{containerClasses}}\">\r\n <input id=\"{{id}}\"\r\n [ngClass]=\"{'is-invalid is-invalid:focus': (controlDir.control?.invalid && (controlDir.control?.dirty || controlDir.control?.touched)) && errorMsg,'is-valid is-valid:focus': (controlDir.control?.valid && (controlDir.control?.dirty || controlDir.control?.touched) && (errorMsg || controlDir.value))}\"\r\n class=\"form-control {{classes}}\" [formControl]=\"formControl\" [firstDayOfWeek]=\"7\" ngbDatepicker\r\n #d=\"ngbDatepicker\" [maxDate]=\"maxDate\" [minDate]=\"minDate\" [footerTemplate]=\"footerTemplate\"\r\n [required]=\"required\" style=\"outline: unset; z-index: unset !important;\" autocomplete=\"off\" (blur)=\"onTouched()\" title=\"{{label}}\">\r\n <label for=\"{{id}}\">{{label}}</label>\r\n <span class=\"input-group-text calenderBtn\" (click)=\"d.toggle()\">\r\n <i class=\"far fa-calendar-alt fa-lg\"></i>\r\n </span>\r\n <div class=\"invalid-feedback\" *ngIf=\"errorMessage !== null\">\r\n {{errorMsg}}\r\n </div>\r\n <ng-template #footerTemplate style=\"text-align: center;\">\r\n <hr>\r\n <button type=\"button\" class=\"btn btn-primary btn-sm m-2 \" style=\"width: auto; float: right;\"\r\n (click)=\"formControl.patchValue(today);d.navigateTo(today);\">\u0627\u0644\u064A\u0648\u0645</button>\r\n <button type=\"button\" class=\"btn btn-secondary btn-sm m-2\" style=\"width: auto; float: left;\"\r\n (click)=\"formControl.patchValue(null);d.close()\">\u0645\u0633\u062D</button>\r\n </ng-template>\r\n</div>", styles: [".calenderBtn{cursor:pointer;background-color:transparent;color:#6c757d;border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.calenderBtn:hover{color:#fff;background-color:#6c757d;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}\n"], directives: [{ type: i2.NgbInputDatepicker, selector: "input[ngbDatepicker]", inputs: ["autoClose", "datepickerClass", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "minDate", "maxDate", "navigation", "outsideDays", "placement", "restoreFocus", "showWeekNumbers", "startDate", "container", "positionTarget", "weekdays", "disabled"], outputs: ["dateSelect", "navigate", "closed"], exportAs: ["ngbDatepicker"] }, { type: i2$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i3$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i2$1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i3$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
872
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: DatepickerComponent, decorators: [{
873
+ type: Component,
874
+ args: [{ selector: 'ipa-datepicker', template: "<div class=\"form-floating input-group {{containerClasses}}\">\r\n <input id=\"{{id}}\"\r\n [ngClass]=\"{'is-invalid is-invalid:focus': (controlDir.control?.invalid && (controlDir.control?.dirty || controlDir.control?.touched)) && errorMsg,'is-valid is-valid:focus': (controlDir.control?.valid && (controlDir.control?.dirty || controlDir.control?.touched) && (errorMsg || controlDir.value))}\"\r\n class=\"form-control {{classes}}\" [formControl]=\"formControl\" [firstDayOfWeek]=\"7\" ngbDatepicker\r\n #d=\"ngbDatepicker\" [maxDate]=\"maxDate\" [minDate]=\"minDate\" [footerTemplate]=\"footerTemplate\"\r\n [required]=\"required\" style=\"outline: unset; z-index: unset !important;\" autocomplete=\"off\" (blur)=\"onTouched()\" title=\"{{label}}\">\r\n <label for=\"{{id}}\">{{label}}</label>\r\n <span class=\"input-group-text calenderBtn\" (click)=\"d.toggle()\">\r\n <i class=\"far fa-calendar-alt fa-lg\"></i>\r\n </span>\r\n <div class=\"invalid-feedback\" *ngIf=\"errorMessage !== null\">\r\n {{errorMsg}}\r\n </div>\r\n <ng-template #footerTemplate style=\"text-align: center;\">\r\n <hr>\r\n <button type=\"button\" class=\"btn btn-primary btn-sm m-2 \" style=\"width: auto; float: right;\"\r\n (click)=\"formControl.patchValue(today);d.navigateTo(today);\">\u0627\u0644\u064A\u0648\u0645</button>\r\n <button type=\"button\" class=\"btn btn-secondary btn-sm m-2\" style=\"width: auto; float: left;\"\r\n (click)=\"formControl.patchValue(null);d.close()\">\u0645\u0633\u062D</button>\r\n </ng-template>\r\n</div>", styles: [".calenderBtn{cursor:pointer;background-color:transparent;color:#6c757d;border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.calenderBtn:hover{color:#fff;background-color:#6c757d;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}\n"] }]
875
+ }], ctorParameters: function () { return [{ type: IPAFormService }, { type: i2.NgbCalendar }, { type: i2$1.NgControl, decorators: [{
876
+ type: Self
877
+ }] }, { type: i2.NgbInputDatepickerConfig }]; }, propDecorators: { id: [{
878
+ type: Input
879
+ }], label: [{
880
+ type: Input
881
+ }], patternErrorMsg: [{
882
+ type: Input
883
+ }], required: [{
884
+ type: Input
885
+ }], maxDate: [{
886
+ type: Input
887
+ }], minDate: [{
888
+ type: Input
889
+ }], classes: [{
890
+ type: Input
891
+ }], containerClasses: [{
892
+ type: Input
893
+ }] } });
894
+
895
+ const WEEKDAYS$1 = ['ن', 'ث', 'ر', 'خ', 'ج', 'س', 'ح'];
896
+ const MONTHS$1 = [
897
+ 'محرم',
898
+ 'صفر',
899
+ 'ربيع الأول',
900
+ 'ربيع الآخر',
901
+ 'جمادى الأولى',
902
+ 'جمادى الآخرة',
903
+ 'رجب',
904
+ 'شعبان',
905
+ 'رمضان',
906
+ 'شوال',
907
+ 'ذو القعدة',
908
+ 'ذو الحجة',
909
+ ];
910
+ class IslamicI18n extends NgbDatepickerI18n {
911
+ getMonthShortName(month) {
912
+ return MONTHS$1[month - 1];
913
+ }
914
+ getMonthFullName(month) {
915
+ return MONTHS$1[month - 1];
916
+ }
917
+ getWeekdayLabel(weekday, width) {
918
+ return WEEKDAYS$1[weekday - 1];
919
+ }
920
+ getDayAriaLabel(date) {
921
+ return `${date.day}-${date.month}-${date.year}`;
922
+ }
923
+ }
924
+ IslamicI18n.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: IslamicI18n, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
925
+ IslamicI18n.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: IslamicI18n });
926
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: IslamicI18n, decorators: [{
927
+ type: Injectable
928
+ }] });
929
+
930
+ class HijriDatepickerComponent extends DatepickerComponent {
931
+ }
932
+ HijriDatepickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: HijriDatepickerComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
933
+ HijriDatepickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.2", type: HijriDatepickerComponent, selector: "ipa-hijri-datepicker", providers: [
934
+ { provide: NgbCalendar, useClass: NgbCalendarIslamicUmalqura },
935
+ { provide: NgbDatepickerI18n, useClass: IslamicI18n },
936
+ ], usesInheritance: true, ngImport: i0, template: "<div class=\"form-floating input-group {{containerClasses}}\">\r\n <input id=\"{{id}}\"\r\n [ngClass]=\"{'is-invalid is-invalid:focus': (controlDir.control?.invalid && (controlDir.control?.dirty || controlDir.control?.touched)) && errorMsg,'is-valid is-valid:focus': (controlDir.control?.valid && (controlDir.control?.dirty || controlDir.control?.touched) && (errorMsg || controlDir.value))}\"\r\n class=\"form-control {{classes}}\" [formControl]=\"formControl\" [firstDayOfWeek]=\"7\" ngbDatepicker\r\n #d=\"ngbDatepicker\" [maxDate]=\"maxDate\" [minDate]=\"minDate\" [footerTemplate]=\"footerTemplate\"\r\n [required]=\"required\" style=\"outline: unset; z-index: unset !important;\" autocomplete=\"off\" (blur)=\"onTouched()\" title=\"{{label}}\">\r\n <label for=\"{{id}}\">{{label}}</label>\r\n <span class=\"input-group-text calenderBtn\" (click)=\"d.toggle()\">\r\n <i class=\"far fa-calendar-alt fa-lg\"></i>\r\n </span>\r\n <div class=\"invalid-feedback\" *ngIf=\"errorMessage !== null\">\r\n {{errorMsg}}\r\n </div>\r\n <ng-template #footerTemplate style=\"text-align: center;\">\r\n <hr>\r\n <button type=\"button\" class=\"btn btn-primary btn-sm m-2 \" style=\"width: auto; float: right;\"\r\n (click)=\"formControl.patchValue(today);d.navigateTo(today);\">\u0627\u0644\u064A\u0648\u0645</button>\r\n <button type=\"button\" class=\"btn btn-secondary btn-sm m-2\" style=\"width: auto; float: left;\"\r\n (click)=\"formControl.patchValue(null);d.close()\">\u0645\u0633\u062D</button>\r\n </ng-template>\r\n</div>", styles: [".calenderBtn{cursor:pointer;background-color:transparent;color:#6c757d;border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.calenderBtn:hover{color:#fff;background-color:#6c757d;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}\n"], directives: [{ type: i2.NgbInputDatepicker, selector: "input[ngbDatepicker]", inputs: ["autoClose", "datepickerClass", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "minDate", "maxDate", "navigation", "outsideDays", "placement", "restoreFocus", "showWeekNumbers", "startDate", "container", "positionTarget", "weekdays", "disabled"], outputs: ["dateSelect", "navigate", "closed"], exportAs: ["ngbDatepicker"] }, { type: i2$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i3$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i2$1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i3$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
937
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: HijriDatepickerComponent, decorators: [{
938
+ type: Component,
939
+ args: [{ selector: 'ipa-hijri-datepicker', providers: [
940
+ { provide: NgbCalendar, useClass: NgbCalendarIslamicUmalqura },
941
+ { provide: NgbDatepickerI18n, useClass: IslamicI18n },
942
+ ], template: "<div class=\"form-floating input-group {{containerClasses}}\">\r\n <input id=\"{{id}}\"\r\n [ngClass]=\"{'is-invalid is-invalid:focus': (controlDir.control?.invalid && (controlDir.control?.dirty || controlDir.control?.touched)) && errorMsg,'is-valid is-valid:focus': (controlDir.control?.valid && (controlDir.control?.dirty || controlDir.control?.touched) && (errorMsg || controlDir.value))}\"\r\n class=\"form-control {{classes}}\" [formControl]=\"formControl\" [firstDayOfWeek]=\"7\" ngbDatepicker\r\n #d=\"ngbDatepicker\" [maxDate]=\"maxDate\" [minDate]=\"minDate\" [footerTemplate]=\"footerTemplate\"\r\n [required]=\"required\" style=\"outline: unset; z-index: unset !important;\" autocomplete=\"off\" (blur)=\"onTouched()\" title=\"{{label}}\">\r\n <label for=\"{{id}}\">{{label}}</label>\r\n <span class=\"input-group-text calenderBtn\" (click)=\"d.toggle()\">\r\n <i class=\"far fa-calendar-alt fa-lg\"></i>\r\n </span>\r\n <div class=\"invalid-feedback\" *ngIf=\"errorMessage !== null\">\r\n {{errorMsg}}\r\n </div>\r\n <ng-template #footerTemplate style=\"text-align: center;\">\r\n <hr>\r\n <button type=\"button\" class=\"btn btn-primary btn-sm m-2 \" style=\"width: auto; float: right;\"\r\n (click)=\"formControl.patchValue(today);d.navigateTo(today);\">\u0627\u0644\u064A\u0648\u0645</button>\r\n <button type=\"button\" class=\"btn btn-secondary btn-sm m-2\" style=\"width: auto; float: left;\"\r\n (click)=\"formControl.patchValue(null);d.close()\">\u0645\u0633\u062D</button>\r\n </ng-template>\r\n</div>", styles: [".calenderBtn{cursor:pointer;background-color:transparent;color:#6c757d;border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.calenderBtn:hover{color:#fff;background-color:#6c757d;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}\n"] }]
943
+ }] });
944
+
945
+ const WEEKDAYS = ['ن', 'ث', 'ر', 'خ', 'ج', 'س', 'ح'];
946
+ const MONTHS = [
947
+ 'يناير',
948
+ 'فبراير',
949
+ 'مارس',
950
+ 'أبريل',
951
+ 'مايو',
952
+ 'يونيو',
953
+ 'يوليو',
954
+ 'اغسطس',
955
+ 'سبتمبر',
956
+ 'أكتوبر',
957
+ 'نوفمبر',
958
+ 'ديسمبر',
959
+ ];
960
+ class Gregorian18n extends NgbDatepickerI18n {
961
+ getMonthShortName(month) {
962
+ return MONTHS[month - 1];
963
+ }
964
+ getMonthFullName(month) {
965
+ return MONTHS[month - 1];
966
+ }
967
+ getWeekdayLabel(weekday, width) {
968
+ return WEEKDAYS[weekday - 1];
969
+ }
970
+ getDayAriaLabel(date) {
971
+ return `${date.day}-${date.month}-${date.year}`;
972
+ }
973
+ }
974
+ Gregorian18n.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: Gregorian18n, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
975
+ Gregorian18n.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: Gregorian18n });
976
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: Gregorian18n, decorators: [{
977
+ type: Injectable
978
+ }] });
979
+
980
+ class GregorianDatepickerComponent extends DatepickerComponent {
981
+ }
982
+ GregorianDatepickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: GregorianDatepickerComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
983
+ GregorianDatepickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.2", type: GregorianDatepickerComponent, selector: "ipa-gregorian-datepicker", providers: [
984
+ { provide: NgbCalendar, useClass: NgbCalendarGregorian },
985
+ { provide: NgbDatepickerI18n, useClass: Gregorian18n },
986
+ ], usesInheritance: true, ngImport: i0, template: "<div class=\"form-floating input-group {{containerClasses}}\">\r\n <input id=\"{{id}}\"\r\n [ngClass]=\"{'is-invalid is-invalid:focus': (controlDir.control?.invalid && (controlDir.control?.dirty || controlDir.control?.touched)) && errorMsg,'is-valid is-valid:focus': (controlDir.control?.valid && (controlDir.control?.dirty || controlDir.control?.touched) && (errorMsg || controlDir.value))}\"\r\n class=\"form-control {{classes}}\" [formControl]=\"formControl\" [firstDayOfWeek]=\"7\" ngbDatepicker\r\n #d=\"ngbDatepicker\" [maxDate]=\"maxDate\" [minDate]=\"minDate\" [footerTemplate]=\"footerTemplate\"\r\n [required]=\"required\" style=\"outline: unset; z-index: unset !important;\" autocomplete=\"off\" (blur)=\"onTouched()\" title=\"{{label}}\">\r\n <label for=\"{{id}}\">{{label}}</label>\r\n <span class=\"input-group-text calenderBtn\" (click)=\"d.toggle()\">\r\n <i class=\"far fa-calendar-alt fa-lg\"></i>\r\n </span>\r\n <div class=\"invalid-feedback\" *ngIf=\"errorMessage !== null\">\r\n {{errorMsg}}\r\n </div>\r\n <ng-template #footerTemplate style=\"text-align: center;\">\r\n <hr>\r\n <button type=\"button\" class=\"btn btn-primary btn-sm m-2 \" style=\"width: auto; float: right;\"\r\n (click)=\"formControl.patchValue(today);d.navigateTo(today);\">\u0627\u0644\u064A\u0648\u0645</button>\r\n <button type=\"button\" class=\"btn btn-secondary btn-sm m-2\" style=\"width: auto; float: left;\"\r\n (click)=\"formControl.patchValue(null);d.close()\">\u0645\u0633\u062D</button>\r\n </ng-template>\r\n</div>", styles: [".calenderBtn{cursor:pointer;background-color:transparent;color:#6c757d;border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.calenderBtn:hover{color:#fff;background-color:#6c757d;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}\n"], directives: [{ type: i2.NgbInputDatepicker, selector: "input[ngbDatepicker]", inputs: ["autoClose", "datepickerClass", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "minDate", "maxDate", "navigation", "outsideDays", "placement", "restoreFocus", "showWeekNumbers", "startDate", "container", "positionTarget", "weekdays", "disabled"], outputs: ["dateSelect", "navigate", "closed"], exportAs: ["ngbDatepicker"] }, { type: i2$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i3$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i2$1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i3$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
987
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: GregorianDatepickerComponent, decorators: [{
988
+ type: Component,
989
+ args: [{ selector: 'ipa-gregorian-datepicker', providers: [
990
+ { provide: NgbCalendar, useClass: NgbCalendarGregorian },
991
+ { provide: NgbDatepickerI18n, useClass: Gregorian18n },
992
+ ], template: "<div class=\"form-floating input-group {{containerClasses}}\">\r\n <input id=\"{{id}}\"\r\n [ngClass]=\"{'is-invalid is-invalid:focus': (controlDir.control?.invalid && (controlDir.control?.dirty || controlDir.control?.touched)) && errorMsg,'is-valid is-valid:focus': (controlDir.control?.valid && (controlDir.control?.dirty || controlDir.control?.touched) && (errorMsg || controlDir.value))}\"\r\n class=\"form-control {{classes}}\" [formControl]=\"formControl\" [firstDayOfWeek]=\"7\" ngbDatepicker\r\n #d=\"ngbDatepicker\" [maxDate]=\"maxDate\" [minDate]=\"minDate\" [footerTemplate]=\"footerTemplate\"\r\n [required]=\"required\" style=\"outline: unset; z-index: unset !important;\" autocomplete=\"off\" (blur)=\"onTouched()\" title=\"{{label}}\">\r\n <label for=\"{{id}}\">{{label}}</label>\r\n <span class=\"input-group-text calenderBtn\" (click)=\"d.toggle()\">\r\n <i class=\"far fa-calendar-alt fa-lg\"></i>\r\n </span>\r\n <div class=\"invalid-feedback\" *ngIf=\"errorMessage !== null\">\r\n {{errorMsg}}\r\n </div>\r\n <ng-template #footerTemplate style=\"text-align: center;\">\r\n <hr>\r\n <button type=\"button\" class=\"btn btn-primary btn-sm m-2 \" style=\"width: auto; float: right;\"\r\n (click)=\"formControl.patchValue(today);d.navigateTo(today);\">\u0627\u0644\u064A\u0648\u0645</button>\r\n <button type=\"button\" class=\"btn btn-secondary btn-sm m-2\" style=\"width: auto; float: left;\"\r\n (click)=\"formControl.patchValue(null);d.close()\">\u0645\u0633\u062D</button>\r\n </ng-template>\r\n</div>", styles: [".calenderBtn{cursor:pointer;background-color:transparent;color:#6c757d;border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.calenderBtn:hover{color:#fff;background-color:#6c757d;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}\n"] }]
993
+ }] });
994
+
995
+ class ShareButtonComponent {
996
+ constructor() {
997
+ this.title = '';
998
+ this.description = '';
999
+ this.btnLabel = '';
1000
+ }
1001
+ ngAfterViewInit() {
1002
+ const elements = document.getElementsByClassName('sb-show-icon');
1003
+ elements[0].setAttribute('type', 'button');
1004
+ elements[0].setAttribute('id', 'IPAShareBtn');
1005
+ const label = document.createElement('label');
1006
+ label.innerHTML = this.btnLabel;
1007
+ label.classList.add('sm-share-title');
1008
+ label.classList.add('me-1');
1009
+ elements[0].before(label);
1010
+ }
1011
+ }
1012
+ ShareButtonComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: ShareButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1013
+ ShareButtonComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.2", type: ShareButtonComponent, selector: "ipa-share-button", inputs: { title: "title", description: "description", btnLabel: "btnLabel" }, ngImport: i0, template: "<share-popup-button [title]=\"title\" [description]=\"description\" [icon]=\"'share-alt'\"\r\n [include]=\"['facebook','twitter','linkedin','telegram','whatsapp','email','copy']\">\r\n</share-popup-button>", styles: [""], components: [{ type: i1$1.SharePopupComponent, selector: "share-popup-button", inputs: ["theme", "icon", "text", "include", "exclude", "closeIcon", "url", "title", "description", "image", "tags", "autoSetMeta", "show", "showIcon", "showText", "disabled", "hasBackdrop", "backdropClass"], outputs: ["opened", "closed", "popupClosed"] }] });
1014
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: ShareButtonComponent, decorators: [{
1015
+ type: Component,
1016
+ args: [{ selector: 'ipa-share-button', template: "<share-popup-button [title]=\"title\" [description]=\"description\" [icon]=\"'share-alt'\"\r\n [include]=\"['facebook','twitter','linkedin','telegram','whatsapp','email','copy']\">\r\n</share-popup-button>", styles: [""] }]
1017
+ }], ctorParameters: function () { return []; }, propDecorators: { title: [{
1018
+ type: Input
1019
+ }], description: [{
1020
+ type: Input
1021
+ }], btnLabel: [{
1022
+ type: Input
1023
+ }] } });
1024
+
1025
+ class ShareButtonModule {
1026
+ constructor(library) {
1027
+ library.addIconPacks(fas);
1028
+ }
1029
+ }
1030
+ ShareButtonModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: ShareButtonModule, deps: [{ token: i1$2.FaIconLibrary }], target: i0.ɵɵFactoryTarget.NgModule });
1031
+ ShareButtonModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: ShareButtonModule, declarations: [ShareButtonComponent], imports: [ShareIconsModule,
1032
+ ShareButtonsPopupModule,
1033
+ OverlayModule,
1034
+ FontAwesomeModule], exports: [ShareButtonComponent,
1035
+ ShareIconsModule,
1036
+ ShareButtonsPopupModule,
1037
+ OverlayModule,
1038
+ FontAwesomeModule] });
1039
+ ShareButtonModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: ShareButtonModule, imports: [[
1040
+ ShareIconsModule,
1041
+ ShareButtonsPopupModule,
1042
+ OverlayModule,
1043
+ FontAwesomeModule,
1044
+ ], ShareIconsModule,
1045
+ ShareButtonsPopupModule,
1046
+ OverlayModule,
1047
+ FontAwesomeModule] });
1048
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: ShareButtonModule, decorators: [{
1049
+ type: NgModule,
1050
+ args: [{
1051
+ declarations: [ShareButtonComponent],
1052
+ imports: [
1053
+ ShareIconsModule,
1054
+ ShareButtonsPopupModule,
1055
+ OverlayModule,
1056
+ FontAwesomeModule,
1057
+ ],
1058
+ exports: [
1059
+ ShareButtonComponent,
1060
+ ShareIconsModule,
1061
+ ShareButtonsPopupModule,
1062
+ OverlayModule,
1063
+ FontAwesomeModule,
1064
+ ]
1065
+ }]
1066
+ }], ctorParameters: function () { return [{ type: i1$2.FaIconLibrary }]; } });
1067
+
1068
+ class NgIPALibraryModule {
1069
+ }
1070
+ NgIPALibraryModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: NgIPALibraryModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
1071
+ NgIPALibraryModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: NgIPALibraryModule, declarations: [TextInputComponent,
1072
+ TextareaInputComponent,
1073
+ DropdownInputComponent,
1074
+ LoaderComponent,
1075
+ GenerateFormComponent,
1076
+ FileUploadComponent,
1077
+ DatepickerComponent,
1078
+ HijriDatepickerComponent,
1079
+ GregorianDatepickerComponent,
1080
+ RecaptchaComponent], imports: [CommonModule,
1081
+ FormsModule,
1082
+ ReactiveFormsModule,
1083
+ ToastrModule,
1084
+ DropzoneModule,
1085
+ NgxCaptchaModule,
1086
+ PipesModule,
1087
+ NgbDatepickerModule,
1088
+ ShareButtonModule,
1089
+ NgSelectModule], exports: [TextInputComponent,
1090
+ TextareaInputComponent,
1091
+ DropdownInputComponent,
1092
+ LoaderComponent,
1093
+ GenerateFormComponent,
1094
+ FileUploadComponent,
1095
+ PipesModule,
1096
+ HijriDatepickerComponent,
1097
+ GregorianDatepickerComponent,
1098
+ ShareButtonModule,
1099
+ RecaptchaComponent] });
1100
+ NgIPALibraryModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: NgIPALibraryModule, imports: [[
1101
+ CommonModule,
1102
+ FormsModule,
1103
+ ReactiveFormsModule,
1104
+ ToastrModule,
1105
+ DropzoneModule,
1106
+ NgxCaptchaModule,
1107
+ PipesModule,
1108
+ NgbDatepickerModule,
1109
+ ShareButtonModule,
1110
+ NgSelectModule,
1111
+ ], PipesModule,
1112
+ ShareButtonModule] });
1113
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: NgIPALibraryModule, decorators: [{
1114
+ type: NgModule,
1115
+ args: [{
1116
+ declarations: [
1117
+ TextInputComponent,
1118
+ TextareaInputComponent,
1119
+ DropdownInputComponent,
1120
+ LoaderComponent,
1121
+ GenerateFormComponent,
1122
+ FileUploadComponent,
1123
+ DatepickerComponent,
1124
+ HijriDatepickerComponent,
1125
+ GregorianDatepickerComponent,
1126
+ RecaptchaComponent,
1127
+ ],
1128
+ imports: [
1129
+ CommonModule,
1130
+ FormsModule,
1131
+ ReactiveFormsModule,
1132
+ ToastrModule,
1133
+ DropzoneModule,
1134
+ NgxCaptchaModule,
1135
+ PipesModule,
1136
+ NgbDatepickerModule,
1137
+ ShareButtonModule,
1138
+ NgSelectModule,
1139
+ ],
1140
+ exports: [
1141
+ TextInputComponent,
1142
+ TextareaInputComponent,
1143
+ DropdownInputComponent,
1144
+ LoaderComponent,
1145
+ GenerateFormComponent,
1146
+ FileUploadComponent,
1147
+ PipesModule,
1148
+ HijriDatepickerComponent,
1149
+ GregorianDatepickerComponent,
1150
+ ShareButtonModule,
1151
+ RecaptchaComponent,
1152
+ ],
1153
+ }]
1154
+ }] });
1155
+
1156
+ class LoadingInterceptor {
1157
+ constructor(loaderService) {
1158
+ this.loaderService = loaderService;
1159
+ this.requests = [];
1160
+ }
1161
+ removeRequest(req) {
1162
+ const i = this.requests.indexOf(req);
1163
+ if (i >= 0) {
1164
+ this.requests.splice(i, 1);
1165
+ }
1166
+ this.loaderService.isLoading.next(this.requests.length > 0);
1167
+ }
1168
+ intercept(req, next) {
1169
+ if (this.isException(req)) {
1170
+ return next.handle(req);
1171
+ }
1172
+ this.requests.push(req);
1173
+ this.loaderService.isLoading.next(true);
1174
+ return new Observable((observer) => {
1175
+ const subscription = next.handle(req).subscribe((event) => {
1176
+ if (event instanceof HttpResponse) {
1177
+ this.removeRequest(req);
1178
+ observer.next(event);
1179
+ }
1180
+ }, (err) => {
1181
+ this.removeRequest(req);
1182
+ observer.error(err);
1183
+ }, () => {
1184
+ this.removeRequest(req);
1185
+ observer.complete();
1186
+ });
1187
+ // remove request from queue when cancelled
1188
+ return () => {
1189
+ this.removeRequest(req);
1190
+ subscription.unsubscribe();
1191
+ };
1192
+ });
1193
+ }
1194
+ isException(req) {
1195
+ for (const url of this.loaderService.urls) {
1196
+ if (req.url.includes(url.path) && req.method === url.method) {
1197
+ return true;
1198
+ }
1199
+ }
1200
+ return false;
1201
+ }
1202
+ }
1203
+ LoadingInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: LoadingInterceptor, deps: [{ token: LoaderService }], target: i0.ɵɵFactoryTarget.Injectable });
1204
+ LoadingInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: LoadingInterceptor });
1205
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: LoadingInterceptor, decorators: [{
1206
+ type: Injectable
1207
+ }], ctorParameters: function () { return [{ type: LoaderService }]; } });
1208
+
1209
+ class ErrorService {
1210
+ constructor() {
1211
+ this.urls = [];
1212
+ }
1213
+ setExceptionUrls(urls) {
1214
+ this.urls = urls;
1215
+ }
1216
+ addExceptionUrl(url) {
1217
+ this.urls.push(url);
1218
+ }
1219
+ }
1220
+ ErrorService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: ErrorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1221
+ ErrorService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: ErrorService, providedIn: 'root' });
1222
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: ErrorService, decorators: [{
1223
+ type: Injectable,
1224
+ args: [{
1225
+ providedIn: 'root'
1226
+ }]
1227
+ }], ctorParameters: function () { return []; } });
1228
+
1229
+ class ErrorInterceptor {
1230
+ constructor(errorService, toastrService) {
1231
+ this.errorService = errorService;
1232
+ this.toastrService = toastrService;
1233
+ }
1234
+ intercept(req, next) {
1235
+ if (this.isException(req)) {
1236
+ return next.handle(req);
1237
+ }
1238
+ return next.handle(req).pipe(catchError((error) => {
1239
+ const response = error.error;
1240
+ const toastrConfig = {
1241
+ disableTimeOut: true,
1242
+ };
1243
+ switch (response.statusCode) {
1244
+ case 500:
1245
+ this.toastrService.error(response?.innerException + ' ' + response?.stackTrace, response.message, toastrConfig);
1246
+ break;
1247
+ default:
1248
+ this.toastrService.error(response.message, '', toastrConfig);
1249
+ break;
1250
+ }
1251
+ return throwError(error);
1252
+ }));
1253
+ }
1254
+ isException(req) {
1255
+ for (const url of this.errorService.urls) {
1256
+ if (req.url.includes(url.path) && req.method === url.method) {
1257
+ return true;
1258
+ }
1259
+ }
1260
+ return false;
1261
+ }
1262
+ }
1263
+ ErrorInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: ErrorInterceptor, deps: [{ token: ErrorService }, { token: i1.ToastrService }], target: i0.ɵɵFactoryTarget.Injectable });
1264
+ ErrorInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: ErrorInterceptor });
1265
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: ErrorInterceptor, decorators: [{
1266
+ type: Injectable
1267
+ }], ctorParameters: function () { return [{ type: ErrorService }, { type: i1.ToastrService }]; } });
1268
+
1269
+ class AuthService {
1270
+ constructor() {
1271
+ this.currentUser = new BehaviorSubject({ exp: 0 });
1272
+ this.currentUserUrl = '';
1273
+ }
1274
+ getToken() {
1275
+ return localStorage.getItem('token') ?? '';
1276
+ }
1277
+ getDecodedToken() {
1278
+ return this.decodeJwt(this.getToken());
1279
+ }
1280
+ setCurrentUser() {
1281
+ const decodedToken = this.getDecodedToken();
1282
+ this.currentUser.next({
1283
+ nameid: decodedToken.nameid,
1284
+ email: decodedToken.email,
1285
+ given_name: decodedToken.given_name,
1286
+ exp: decodedToken.exp,
1287
+ });
1288
+ }
1289
+ setCurrentUserUrl(url) {
1290
+ this.currentUserUrl = url;
1291
+ }
1292
+ decodeJwt(token) {
1293
+ const base64Url = token.split('.')[1];
1294
+ const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
1295
+ const jsonPayload = decodeURIComponent(atob(base64)
1296
+ .split('')
1297
+ .map((c) => {
1298
+ return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
1299
+ })
1300
+ .join(''));
1301
+ return JSON.parse(jsonPayload);
1302
+ }
1303
+ }
1304
+ AuthService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: AuthService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1305
+ AuthService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: AuthService, providedIn: 'root' });
1306
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: AuthService, decorators: [{
1307
+ type: Injectable,
1308
+ args: [{
1309
+ providedIn: 'root',
1310
+ }]
1311
+ }], ctorParameters: function () { return []; } });
1312
+
1313
+ class TokenInterceptor {
1314
+ constructor(authService, http, loaderService) {
1315
+ this.authService = authService;
1316
+ this.http = http;
1317
+ this.loaderService = loaderService;
1318
+ this.refresh = true;
1319
+ this.loaderService.addExceptionUrl({
1320
+ path: '/api/users?refresh',
1321
+ method: 'GET',
1322
+ });
1323
+ }
1324
+ intercept(request, next) {
1325
+ if (this.isException(request)) {
1326
+ return next.handle(request);
1327
+ }
1328
+ const token = this.authService.getToken();
1329
+ if (token) {
1330
+ this.isTokenExpired(token);
1331
+ request = request.clone({
1332
+ setHeaders: {
1333
+ Authorization: `Bearer ${token}`,
1334
+ },
1335
+ });
1336
+ }
1337
+ return next.handle(request);
1338
+ }
1339
+ isTokenExpired(token) {
1340
+ const redirectPath = location.pathname;
1341
+ const decodedToken = this.authService.getDecodedToken();
1342
+ const expDate = new Date((decodedToken.exp ?? 0) * 1000);
1343
+ if (expDate < new Date()) {
1344
+ location.replace('/ar/login?redirect=' + redirectPath);
1345
+ return;
1346
+ }
1347
+ else {
1348
+ if (this.authService.currentUserUrl) {
1349
+ if (this.refresh) {
1350
+ this.http
1351
+ .get(this.authService.currentUserUrl + `/api/users?refresh`, {
1352
+ headers: { Authorization: `Bearer ${token}` },
1353
+ })
1354
+ .subscribe((user) => {
1355
+ localStorage.setItem('token', user.token);
1356
+ this.refresh = false;
1357
+ setTimeout(() => {
1358
+ this.refresh = true;
1359
+ }, 60 * 1000);
1360
+ });
1361
+ }
1362
+ }
1363
+ else {
1364
+ throw new Error("provide current base user api url using this function authService.setCurrentUserUrl('https://...')");
1365
+ }
1366
+ }
1367
+ }
1368
+ isException(request) {
1369
+ if (request.url.includes('/api/users?refresh') &&
1370
+ request.method === 'GET') {
1371
+ return true;
1372
+ }
1373
+ return false;
1374
+ }
1375
+ }
1376
+ TokenInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: TokenInterceptor, deps: [{ token: AuthService }, { token: i2$4.HttpClient }, { token: LoaderService }], target: i0.ɵɵFactoryTarget.Injectable });
1377
+ TokenInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: TokenInterceptor });
1378
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: TokenInterceptor, decorators: [{
1379
+ type: Injectable
1380
+ }], ctorParameters: function () { return [{ type: AuthService }, { type: i2$4.HttpClient }, { type: LoaderService }]; } });
1381
+
1382
+ class BreadcrumbsService {
1383
+ constructor() { }
1384
+ setPageTitle(text) {
1385
+ const titleEl = document.querySelector('.sub-section-title');
1386
+ if (titleEl) {
1387
+ titleEl.textContent = text;
1388
+ }
1389
+ }
1390
+ setMainPageTitle(text, url) {
1391
+ const div = document.getElementsByClassName('main-section-title');
1392
+ if (div && div.length > 0) {
1393
+ div[0].innerHTML = `<a id="site-url" href="${url}">${text}</a>`;
1394
+ }
1395
+ }
1396
+ addBreadcrumb(nodeName, spanClasses = 'bc-current', linkClasses = 'bc-node') {
1397
+ const spans = document.getElementById('ctl00_path')?.children;
1398
+ //get last child
1399
+ const lastIndex = spans?.item(spans.length - 1);
1400
+ const innerHTML = lastIndex.innerHTML;
1401
+ lastIndex.innerHTML = '';
1402
+ lastIndex.classList.remove(...['bc-current']);
1403
+ //add new link
1404
+ lastIndex.appendChild(this.createLink(innerHTML, location.pathname, linkClasses));
1405
+ //add new span and empty span
1406
+ const newSpan = this.createSpan(nodeName, spanClasses);
1407
+ const emptySpan = document.createElement('span');
1408
+ lastIndex.after(...[emptySpan, newSpan]);
1409
+ }
1410
+ addBreadcrumbList(nodeList, spanClasses = 'bc-current', linkClasses = 'bc-node') {
1411
+ const spans = document.getElementById('ctl00_path')?.childNodes;
1412
+ //get last child
1413
+ const lastSpan = spans?.item(spans.length - 1);
1414
+ const innerHTML = lastSpan.innerHTML;
1415
+ lastSpan.classList.remove(...[spanClasses]);
1416
+ lastSpan.innerHTML = '';
1417
+ //add new link
1418
+ lastSpan.appendChild(this.createLink(innerHTML, location.pathname, linkClasses));
1419
+ for (let i = 0; i < nodeList.length; i++) {
1420
+ const lastIndex = spans?.item(spans.length - 1);
1421
+ if (nodeList[i].nodeUrl) {
1422
+ const newSpan = document.createElement('span');
1423
+ newSpan.appendChild(this.createLink(nodeList[i].nodeName, nodeList[i].nodeUrl, linkClasses));
1424
+ const emptySpan = document.createElement('span');
1425
+ lastIndex.after(...[emptySpan, newSpan]);
1426
+ }
1427
+ else {
1428
+ const newSpan = this.createSpan(nodeList[i].nodeName, spanClasses);
1429
+ const emptySpan = document.createElement('span');
1430
+ lastIndex.after(...[emptySpan, newSpan]);
1431
+ }
1432
+ }
1433
+ }
1434
+ createBreadcrumbs(nodeList, spanClasses = 'bc-current', linkClasses = 'bc-node') {
1435
+ const currentSpan = document.getElementById('ctl00_path');
1436
+ currentSpan.innerHTML = '';
1437
+ const newSpan = document.createElement('span');
1438
+ currentSpan?.appendChild(newSpan);
1439
+ newSpan.appendChild(this.createLink(nodeList[0].nodeName, nodeList[0].nodeUrl, linkClasses));
1440
+ const spans = currentSpan?.children;
1441
+ for (let i = 1; i < nodeList.length; i++) {
1442
+ const lastIndex = spans?.item(spans.length - 1);
1443
+ if (nodeList[i].nodeUrl) {
1444
+ const newSpan = document.createElement('span');
1445
+ newSpan.appendChild(this.createLink(nodeList[i].nodeName, nodeList[i].nodeUrl, linkClasses));
1446
+ const emptySpan = document.createElement('span');
1447
+ lastIndex?.after(...[emptySpan, newSpan]);
1448
+ }
1449
+ else {
1450
+ const newSpan = this.createSpan(nodeList[i].nodeName, spanClasses);
1451
+ const emptySpan = document.createElement('span');
1452
+ lastIndex.after(...[emptySpan, newSpan]);
1453
+ }
1454
+ }
1455
+ }
1456
+ removeLastBreadcrumb() {
1457
+ const spans = document.getElementById('ctl00_path')?.children;
1458
+ spans?.item(spans.length - 1)?.remove();
1459
+ spans?.item(spans.length - 1)?.remove();
1460
+ this.setCurrentNode(spans);
1461
+ }
1462
+ removeBreadcrumbByNodeName(nodeName) {
1463
+ const spans = document.getElementById('ctl00_path')
1464
+ ?.children;
1465
+ let index = -1;
1466
+ for (let i = 0; i < spans.length; i++) {
1467
+ const span = spans.item(i);
1468
+ if (span?.textContent?.trim() === nodeName) {
1469
+ index = i;
1470
+ break;
1471
+ }
1472
+ }
1473
+ const lastNode = spans.length - 1 === index;
1474
+ if (index !== -1 && !lastNode) {
1475
+ spans?.item(index)?.remove();
1476
+ spans?.item(index)?.remove();
1477
+ }
1478
+ else {
1479
+ spans?.item(index)?.remove();
1480
+ spans?.item(index - 1)?.remove();
1481
+ }
1482
+ if (lastNode) {
1483
+ this.setCurrentNode(spans);
1484
+ }
1485
+ }
1486
+ removeLastBreadcrumbsByLength(length) {
1487
+ const spans = document.getElementById('ctl00_path')
1488
+ ?.children;
1489
+ while (length > 0) {
1490
+ spans?.item(spans.length - 1)?.remove();
1491
+ spans?.item(spans.length - 1)?.remove();
1492
+ length--;
1493
+ }
1494
+ if (spans.length > 0) {
1495
+ this.setCurrentNode(spans);
1496
+ }
1497
+ }
1498
+ createLink(innerHTML, href, classes) {
1499
+ const link = document.createElement('a');
1500
+ link.innerHTML = ' ' + innerHTML;
1501
+ link.href = href ?? '';
1502
+ link.classList.add(...[classes]);
1503
+ return link;
1504
+ }
1505
+ createSpan(innerHTML, classes) {
1506
+ const span = document.createElement('span');
1507
+ span.classList.add(...[classes]);
1508
+ span.innerHTML = ' ' + innerHTML;
1509
+ return span;
1510
+ }
1511
+ setCurrentNode(spans) {
1512
+ const lastSpan = spans?.item(spans.length - 1);
1513
+ const lastSpanLink = spans
1514
+ ?.item(spans.length - 1)
1515
+ ?.children.item(0);
1516
+ lastSpan?.classList.add(...['bc-current']);
1517
+ lastSpan.innerHTML = lastSpanLink.innerHTML;
1518
+ }
1519
+ }
1520
+ BreadcrumbsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: BreadcrumbsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1521
+ BreadcrumbsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: BreadcrumbsService, providedIn: 'root' });
1522
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: BreadcrumbsService, decorators: [{
1523
+ type: Injectable,
1524
+ args: [{
1525
+ providedIn: 'root',
1526
+ }]
1527
+ }], ctorParameters: function () { return []; } });
1528
+
1529
+ class CommonService {
1530
+ constructor() { }
1531
+ print(element, title, classes) {
1532
+ const styles = this.getElementTag('style');
1533
+ const linkes = this.getElementTag('link');
1534
+ const scripts = this.getElementTag('script');
1535
+ const printContents = document.getElementById(element)?.innerHTML;
1536
+ const popupWin = window.open('', '', 'top=0,left=0,height=100%,width=auto');
1537
+ const data = `
1538
+ <!DOCTYPE html>
1539
+ <head>
1540
+ <title> ${title} </title>
1541
+ <meta charset="utf-8">
1542
+ ${linkes}
1543
+ ${styles}
1544
+ <style>
1545
+ @media print {
1546
+ .noPrint{
1547
+ display: none !important;
1548
+ }
1549
+ body {
1550
+ direction: rtl;
1551
+ }
1552
+ }
1553
+ </style>
1554
+ </head>
1555
+ <body class="${classes}">
1556
+ ${printContents}
1557
+ ${scripts}
1558
+ </body>
1559
+
1560
+ </html>`;
1561
+ popupWin?.document.open();
1562
+ popupWin?.document.write(data);
1563
+ popupWin?.document.close();
1564
+ popupWin?.focus();
1565
+ popupWin?.addEventListener('focus', () => {
1566
+ setTimeout(() => {
1567
+ if (popupWin.document.hasFocus()) {
1568
+ popupWin.print();
1569
+ popupWin.close();
1570
+ }
1571
+ }, 1000);
1572
+ });
1573
+ }
1574
+ getElementTag(tag) {
1575
+ const html = [];
1576
+ const elements = document.getElementsByTagName(tag);
1577
+ for (let index = 0; index < elements.length; index++) {
1578
+ html.push(elements[index].outerHTML);
1579
+ }
1580
+ return html.join('\r\n');
1581
+ }
1582
+ }
1583
+ CommonService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: CommonService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1584
+ CommonService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: CommonService, providedIn: 'root' });
1585
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: CommonService, decorators: [{
1586
+ type: Injectable,
1587
+ args: [{
1588
+ providedIn: 'root',
1589
+ }]
1590
+ }], ctorParameters: function () { return []; } });
1591
+
1592
+ /*
1593
+ * Public API Surface of ipa-library
1594
+ */
1595
+
1596
+ /**
1597
+ * Generated bundle index. Do not edit.
1598
+ */
1599
+
1600
+ export { AuthService, BreadcrumbsService, CommonService, DropdownInputComponent, ErrorInterceptor, ErrorService, FileUploadComponent, GenerateFormComponent, GregorianDatepickerComponent, HijriDatePipe, HijriDatepickerComponent, IPAFormService, LoaderComponent, LoaderService, LoadingInterceptor, NgIPALibraryModule, PipesModule, RecaptchaComponent, ShareButtonComponent, ShareButtonModule, TextInputComponent, TextareaInputComponent, TokenInterceptor };
1601
+ //# sourceMappingURL=ng-ipa-library.mjs.map