@bnsights/bbsf-controls 1.0.30 → 1.0.33

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 (44) hide show
  1. package/README.md +11 -3
  2. package/bnsights-bbsf-controls-1.0.33.tgz +0 -0
  3. package/bnsights-bbsf-controls.metadata.json +1 -1
  4. package/bundles/bnsights-bbsf-controls.umd.js +357 -79
  5. package/bundles/bnsights-bbsf-controls.umd.js.map +1 -1
  6. package/esm2015/lib/Shared/Models/MultiLingualTextAreaOptions.js +1 -1
  7. package/esm2015/lib/Shared/Models/MultilingualTextBoxOptions.js +1 -1
  8. package/esm2015/lib/Shared/Models/RepeaterOptions.js +1 -2
  9. package/esm2015/lib/Shared/Models/TextAreaOptions.js +1 -1
  10. package/esm2015/lib/Shared/Models/TextBoxOptions.js +1 -1
  11. package/esm2015/lib/Shared/Models/datePickerOptions.js +3 -1
  12. package/esm2015/lib/Shared/config/environment.js +2 -2
  13. package/esm2015/lib/Shared/services/ControlUtility.js +24 -1
  14. package/esm2015/lib/Shared/services/GlobalSettings.service.js +9 -1
  15. package/esm2015/lib/Shared/services/validationErrorMassage.service.js +16 -1
  16. package/esm2015/lib/controls/AutocompleteTextBox/AutocompleteTextBox.component.js +1 -2
  17. package/esm2015/lib/controls/DateTimePicker/DateTimePicker.component.js +49 -3
  18. package/esm2015/lib/controls/FileUplaod/FileUplaod.component.js +1 -3
  19. package/esm2015/lib/controls/Form/Form.component.js +2 -18
  20. package/esm2015/lib/controls/ImageUpload/ImageUpload.component.js +7 -4
  21. package/esm2015/lib/controls/MultiLingualTextArea/MultiLingualTextArea.component.js +79 -8
  22. package/esm2015/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.js +79 -16
  23. package/esm2015/lib/controls/Paging/Paging.component.js +1 -3
  24. package/esm2015/lib/controls/Repeater/repeater-table/repeater-table.component.js +2 -2
  25. package/esm2015/lib/controls/TextArea/TextArea.component.js +43 -4
  26. package/esm2015/lib/controls/TextBox/TextBox.component.js +49 -19
  27. package/esm2015/lib/controls/bbsf-controls.module.js +1 -3
  28. package/fesm2015/bnsights-bbsf-controls.js +351 -75
  29. package/fesm2015/bnsights-bbsf-controls.js.map +1 -1
  30. package/lib/Shared/Models/MultiLingualTextAreaOptions.d.ts +1 -0
  31. package/lib/Shared/Models/MultilingualTextBoxOptions.d.ts +1 -0
  32. package/lib/Shared/Models/TextAreaOptions.d.ts +1 -0
  33. package/lib/Shared/Models/TextBoxOptions.d.ts +1 -0
  34. package/lib/Shared/Models/datePickerOptions.d.ts +2 -0
  35. package/lib/Shared/services/ControlUtility.d.ts +1 -0
  36. package/lib/Shared/services/GlobalSettings.service.d.ts +4 -0
  37. package/lib/controls/DateTimePicker/DateTimePicker.component.d.ts +9 -0
  38. package/lib/controls/MultiLingualTextArea/MultiLingualTextArea.component.d.ts +13 -2
  39. package/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.d.ts +13 -2
  40. package/lib/controls/TextArea/TextArea.component.d.ts +7 -1
  41. package/lib/controls/TextBox/TextBox.component.d.ts +8 -3
  42. package/package.json +2 -3
  43. package/src/lib/assets/Style.css +5 -1
  44. package/bnsights-bbsf-controls-1.0.30.tgz +0 -0
@@ -1,8 +1,8 @@
1
1
  (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/angular'), require('@fullcalendar/daygrid'), require('@fullcalendar/timegrid'), require('@fullcalendar/list'), require('@fullcalendar/interaction'), require('@angular/core'), require('ng-block-ui'), require('@angular/forms'), require('@angular/http'), require('@angular/router'), require('ngx-toastr'), require('ngx-permissions'), require('@angular/cdk/overlay'), require('@ngrx/store-devtools'), require('@angular/common'), require('ngx-intl-tel-input'), require('@bnsights/bbsf-utilities'), require('ngx-bootstrap/datepicker'), require('rxjs'), require('ng-pick-datetime'), require('ng2-file-upload'), require('class-transformer'), require('ng-multiselect-dropdown'), require('angular2-multiselect-dropdown'), require('ngx-summernote'), require('ngx-mask'), require('@syncfusion/ej2-angular-popups'), require('ngx-dropzone'), require('angular-cropperjs'), require('ngx-image-cropper'), require('@ng-bootstrap/ng-bootstrap'), require('@ngx-translate/core'), require('@angular/common/http'), require('ngx-typeahead'), require('rxjs/operators'), require('ngx-tags-input'), require('@ng-select/ng-select'), require('ngx-infinite-scroll'), require('@agm/core'), require('@angular-material-extensions/google-maps-autocomplete'), require('@fullcalendar/core/locales/en-gb'), require('@fullcalendar/core/locales/ar'), require('ngx-bootstrap/typeahead'), require('@angular/material/slide-toggle'), require('@kolkov/angular-editor'), require('angular-ng-autocomplete'), require('ng-inline-svg'), require('sweetalert2'), require('@sweetalert2/ngx-sweetalert2')) :
3
- typeof define === 'function' && define.amd ? define('@bnsights/bbsf-controls', ['exports', '@fullcalendar/angular', '@fullcalendar/daygrid', '@fullcalendar/timegrid', '@fullcalendar/list', '@fullcalendar/interaction', '@angular/core', 'ng-block-ui', '@angular/forms', '@angular/http', '@angular/router', 'ngx-toastr', 'ngx-permissions', '@angular/cdk/overlay', '@ngrx/store-devtools', '@angular/common', 'ngx-intl-tel-input', '@bnsights/bbsf-utilities', 'ngx-bootstrap/datepicker', 'rxjs', 'ng-pick-datetime', 'ng2-file-upload', 'class-transformer', 'ng-multiselect-dropdown', 'angular2-multiselect-dropdown', 'ngx-summernote', 'ngx-mask', '@syncfusion/ej2-angular-popups', 'ngx-dropzone', 'angular-cropperjs', 'ngx-image-cropper', '@ng-bootstrap/ng-bootstrap', '@ngx-translate/core', '@angular/common/http', 'ngx-typeahead', 'rxjs/operators', 'ngx-tags-input', '@ng-select/ng-select', 'ngx-infinite-scroll', '@agm/core', '@angular-material-extensions/google-maps-autocomplete', '@fullcalendar/core/locales/en-gb', '@fullcalendar/core/locales/ar', 'ngx-bootstrap/typeahead', '@angular/material/slide-toggle', '@kolkov/angular-editor', 'angular-ng-autocomplete', 'ng-inline-svg', 'sweetalert2', '@sweetalert2/ngx-sweetalert2'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global.bnsights = global.bnsights || {}, global.bnsights["bbsf-controls"] = {}), global.angular, global.dayGridPlugin, global.timeGridPlugin, global.listPlugin, global.interactionPlugin, global.ng.core, global.ngBlockUi, global.ng.forms, global.ng.http, global.ng.router, global.ngxToastr, global.ngxPermissions, global.ng.cdk.overlay, global.storeDevtools, global.ng.common, global.ngxIntlTelInput, global.bbsfUtilities, global.datepicker, global.rxjs, global.ngPickDatetime, global.ng2FileUpload, global.classTransformer, global.ngMultiselectDropdown, global.angular2MultiselectDropdown, global.ngxSummernote, global.ngxMask, global.ej2AngularPopups, global.ngxDropzone, global.angularCropperjs, global.ngxImageCropper, global.ngBootstrap, global.core$1, global.ng.common.http, global.ngxTypeahead, global.rxjs.operators, global.ngxTagsInput, global.ngSelect, global.ngxInfiniteScroll, global.core, global.googleMapsAutocomplete, global.enGbLocale, global.ArLocale, global.typeahead, global.ng.material.slideToggle, global.angularEditor, global.angularNgAutocomplete, global.ngInlineSvg, global.Swal, global.ngxSweetalert2));
5
- })(this, (function (exports, angular, dayGridPlugin, timeGridPlugin, listPlugin, interactionPlugin, i0, ngBlockUi, forms, http, router, ngxToastr, ngxPermissions, overlay, storeDevtools, common, ngxIntlTelInput, bbsfUtilities, datepicker, rxjs, ngPickDatetime, ng2FileUpload, classTransformer, ngMultiselectDropdown, angular2MultiselectDropdown, ngxSummernote, ngxMask, ej2AngularPopups, ngxDropzone, angularCropperjs, ngxImageCropper, ngBootstrap, core$1, http$1, ngxTypeahead, operators, ngxTagsInput, ngSelect, ngxInfiniteScroll, core, googleMapsAutocomplete, enGbLocale, ArLocale, typeahead, slideToggle, angularEditor, angularNgAutocomplete, ngInlineSvg, Swal, ngxSweetalert2) { 'use strict';
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/angular'), require('@fullcalendar/daygrid'), require('@fullcalendar/timegrid'), require('@fullcalendar/list'), require('@fullcalendar/interaction'), require('@angular/core'), require('ng-block-ui'), require('@angular/forms'), require('@angular/http'), require('@angular/router'), require('ngx-toastr'), require('ngx-permissions'), require('@angular/cdk/overlay'), require('@ngrx/store-devtools'), require('@angular/common'), require('ngx-intl-tel-input'), require('@bnsights/bbsf-utilities'), require('ngx-bootstrap/datepicker'), require('rxjs'), require('ng-pick-datetime'), require('ng2-file-upload'), require('class-transformer'), require('ng-multiselect-dropdown'), require('angular2-multiselect-dropdown'), require('ngx-summernote'), require('ngx-mask'), require('@syncfusion/ej2-angular-popups'), require('ngx-dropzone'), require('angular-cropperjs'), require('ngx-image-cropper'), require('@ng-bootstrap/ng-bootstrap'), require('@ngx-translate/core'), require('@angular/common/http'), require('ngx-typeahead'), require('rxjs/operators'), require('ngx-tags-input'), require('@ng-select/ng-select'), require('ngx-infinite-scroll'), require('@agm/core'), require('@angular-material-extensions/google-maps-autocomplete'), require('@fullcalendar/core/locales/en-gb'), require('@fullcalendar/core/locales/ar'), require('ngx-bootstrap/typeahead'), require('@angular/material/slide-toggle'), require('@kolkov/angular-editor'), require('ng-inline-svg'), require('sweetalert2'), require('@sweetalert2/ngx-sweetalert2')) :
3
+ typeof define === 'function' && define.amd ? define('@bnsights/bbsf-controls', ['exports', '@fullcalendar/angular', '@fullcalendar/daygrid', '@fullcalendar/timegrid', '@fullcalendar/list', '@fullcalendar/interaction', '@angular/core', 'ng-block-ui', '@angular/forms', '@angular/http', '@angular/router', 'ngx-toastr', 'ngx-permissions', '@angular/cdk/overlay', '@ngrx/store-devtools', '@angular/common', 'ngx-intl-tel-input', '@bnsights/bbsf-utilities', 'ngx-bootstrap/datepicker', 'rxjs', 'ng-pick-datetime', 'ng2-file-upload', 'class-transformer', 'ng-multiselect-dropdown', 'angular2-multiselect-dropdown', 'ngx-summernote', 'ngx-mask', '@syncfusion/ej2-angular-popups', 'ngx-dropzone', 'angular-cropperjs', 'ngx-image-cropper', '@ng-bootstrap/ng-bootstrap', '@ngx-translate/core', '@angular/common/http', 'ngx-typeahead', 'rxjs/operators', 'ngx-tags-input', '@ng-select/ng-select', 'ngx-infinite-scroll', '@agm/core', '@angular-material-extensions/google-maps-autocomplete', '@fullcalendar/core/locales/en-gb', '@fullcalendar/core/locales/ar', 'ngx-bootstrap/typeahead', '@angular/material/slide-toggle', '@kolkov/angular-editor', 'ng-inline-svg', 'sweetalert2', '@sweetalert2/ngx-sweetalert2'], factory) :
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global.bnsights = global.bnsights || {}, global.bnsights["bbsf-controls"] = {}), global.angular, global.dayGridPlugin, global.timeGridPlugin, global.listPlugin, global.interactionPlugin, global.ng.core, global.ngBlockUi, global.ng.forms, global.ng.http, global.ng.router, global.ngxToastr, global.ngxPermissions, global.ng.cdk.overlay, global.storeDevtools, global.ng.common, global.ngxIntlTelInput, global.bbsfUtilities, global.datepicker, global.rxjs, global.ngPickDatetime, global.ng2FileUpload, global.classTransformer, global.ngMultiselectDropdown, global.angular2MultiselectDropdown, global.ngxSummernote, global.ngxMask, global.ej2AngularPopups, global.ngxDropzone, global.angularCropperjs, global.ngxImageCropper, global.ngBootstrap, global.core$1, global.ng.common.http, global.ngxTypeahead, global.rxjs.operators, global.ngxTagsInput, global.ngSelect, global.ngxInfiniteScroll, global.core, global.googleMapsAutocomplete, global.enGbLocale, global.ArLocale, global.typeahead, global.ng.material.slideToggle, global.angularEditor, global.ngInlineSvg, global.Swal, global.ngxSweetalert2));
5
+ })(this, (function (exports, angular, dayGridPlugin, timeGridPlugin, listPlugin, interactionPlugin, i0, ngBlockUi, forms, http, router, ngxToastr, ngxPermissions, overlay, storeDevtools, common, ngxIntlTelInput, bbsfUtilities, datepicker, rxjs, ngPickDatetime, ng2FileUpload, classTransformer, ngMultiselectDropdown, angular2MultiselectDropdown, ngxSummernote, ngxMask, ej2AngularPopups, ngxDropzone, angularCropperjs, ngxImageCropper, ngBootstrap, core$1, http$1, ngxTypeahead, operators, ngxTagsInput, ngSelect, ngxInfiniteScroll, core, googleMapsAutocomplete, enGbLocale, ArLocale, typeahead, slideToggle, angularEditor, ngInlineSvg, Swal, ngxSweetalert2) { 'use strict';
6
6
 
7
7
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
8
8
 
@@ -90,6 +90,12 @@
90
90
  case "max":
91
91
  result = this.utilityService.getResourceValue("MaxValueValidationKey") + " " + error.value.max;
92
92
  break;
93
+ case "IntegerNumberValidationKey":
94
+ result = this.utilityService.getResourceValue("IntegerNumberValidationKey");
95
+ break;
96
+ case "PositiveNumberValidationKey":
97
+ result = this.utilityService.getResourceValue("PositiveNumberValidationKey");
98
+ break;
93
99
  case "validatePhoneNumber":
94
100
  result = this.utilityService.getResourceValue("PhoneNumberValidationKey");
95
101
  break;
@@ -105,6 +111,9 @@
105
111
  case "EnglishLetterOnly":
106
112
  result = this.utilityService.getResourceValue("EnglishLetterOnly");
107
113
  break;
114
+ case "ArabicIsRequiredAndOnly50CharactersEnglish":
115
+ result = this.utilityService.getResourceValue("ArabicIsRequiredAndOnly50CharactersEnglish");
116
+ break;
108
117
  case "PasswordComplexityHasCapitalLetter":
109
118
  result = this.utilityService.getResourceValue("PasswordComplexityHasCapitalLetter");
110
119
  break;
@@ -135,6 +144,12 @@
135
144
  case "ToolTipTypeError":
136
145
  result = this.utilityService.getResourceValue("ToolTipTypeError") + " " + error.value;
137
146
  break;
147
+ case "InvalidEndDate":
148
+ result = this.utilityService.getResourceValue("InvalidEndDate");
149
+ break;
150
+ case "InvalidStartDate":
151
+ result = this.utilityService.getResourceValue("InvalidStartDate");
152
+ break;
138
153
  default:
139
154
  break;
140
155
  }
@@ -197,6 +212,29 @@
197
212
  return valid ? null : error;
198
213
  };
199
214
  };
215
+ ControlUtility.prototype.arabicValidator = function (error) {
216
+ return function (control) {
217
+ if (control.value.match('[\u0600-\u06FF]')) {
218
+ if (control.value.match('[A-Za-z]') != null) {
219
+ //FOUND ENGLISH CHARS
220
+ var length = control.value.replace(/\W/g, '').replace(/[0-9]/g, '').length;
221
+ if (length > 50) {
222
+ return error;
223
+ }
224
+ else {
225
+ return null;
226
+ }
227
+ }
228
+ else {
229
+ //NO ENGLISH CHARACTERS AT ALL
230
+ return null;
231
+ }
232
+ }
233
+ else {
234
+ return error;
235
+ }
236
+ };
237
+ };
200
238
  ControlUtility.prototype.getInputType = function (type) {
201
239
  return exports.InputType[type];
202
240
  };
@@ -344,9 +382,37 @@
344
382
  this.markAllAsTouched = false;
345
383
  this.validationRules = [];
346
384
  this.validationRulesasync = [];
385
+ this.comparedControl = null;
386
+ this.dateError = false;
347
387
  this.resetError = function () {
348
388
  _this.controlValidationService.RemoveGlobalError();
349
389
  };
390
+ this.checkIfEndDateAfterStartDate = function () {
391
+ if (!_this.comparedControl.value || !_this.group.get(_this.options.Name).value) {
392
+ return null;
393
+ }
394
+ if (new Date(_this.comparedControl.value) < new Date(_this.group.get(_this.options.Name).value)) {
395
+ _this.comparedControl.setErrors(null);
396
+ return null;
397
+ }
398
+ else {
399
+ _this.comparedControl.setErrors(null);
400
+ return { InvalidEndDate: true };
401
+ }
402
+ };
403
+ this.checkIfStartDateBeForEndDate = function () {
404
+ if (!_this.comparedControl.value || !_this.group.get(_this.options.Name).value) {
405
+ return null;
406
+ }
407
+ if (new Date(_this.comparedControl.value) < new Date(_this.group.get(_this.options.Name).value)) {
408
+ _this.group.get(_this.options.Name).setErrors(null);
409
+ return null;
410
+ }
411
+ else {
412
+ _this.group.get(_this.options.Name).setErrors(null);
413
+ return { InvalidStartDate: true };
414
+ }
415
+ };
350
416
  //External Method
351
417
  this.RemoveRequiredValidation = function () {
352
418
  _this.controlUtility.RemoveRequiredValidation(_this.DatePickerFormControl, _this.validationRules, _this.options);
@@ -389,11 +455,17 @@
389
455
  }
390
456
  if (this.options.LabelKey != null && this.options.LabelKey != "")
391
457
  this.options.LabelValue = this.UtilityService.getResourceValue(this.options.LabelKey);
392
- this.DatePickerFormControl.setValidators(this.validationRules);
393
- this.DatePickerFormControl.setAsyncValidators(this.validationRulesasync);
394
458
  if (this.options.IsDisabled) {
395
459
  this.DatePickerFormControl.disable();
396
460
  }
461
+ if (this.options.StartControlToCompareWith) {
462
+ if (this.group.get(this.options.StartControlToCompareWith)) {
463
+ this.comparedControl = this.group.get(this.options.StartControlToCompareWith);
464
+ this.subscribeDateChanges();
465
+ }
466
+ }
467
+ this.DatePickerFormControl.setValidators(this.validationRules);
468
+ this.DatePickerFormControl.setAsyncValidators(this.validationRulesasync);
397
469
  this.DateInputControlHost.ngSubmit.subscribe(function (value) {
398
470
  _this.group.markAllAsTouched();
399
471
  _this.markAllAsTouched = true;
@@ -447,6 +519,19 @@
447
519
  this.onChangeService.ChangeValue(this.options.Name);
448
520
  this.OnChange.emit(DateValue);
449
521
  };
522
+ DateInputComponent.prototype.subscribeDateChanges = function () {
523
+ var _this = this;
524
+ var startDateChanges = this.comparedControl.valueChanges;
525
+ var endDateChanges = this.group.get(this.options.Name).valueChanges;
526
+ startDateChanges.subscribe(function (start) {
527
+ _this.comparedControl.addValidators(_this.checkIfStartDateBeForEndDate);
528
+ _this.comparedControl.updateValueAndValidity();
529
+ });
530
+ endDateChanges.subscribe(function (end) {
531
+ _this.DatePickerFormControl.addValidators(_this.checkIfEndDateAfterStartDate);
532
+ _this.DatePickerFormControl.updateValueAndValidity();
533
+ });
534
+ };
450
535
  return DateInputComponent;
451
536
  }());
452
537
  DateInputComponent.controlContainerstatic = null;
@@ -517,6 +602,14 @@
517
602
  /**To Set LanguageMode To MultipleLanguageText */
518
603
  this.LanguageMode = exports.LanguageMode.Both_Languages_are_visible;
519
604
  this.HideAstericsWhenRequired = false;
605
+ //**To set maxlength warning message when equals limit
606
+ this.MaxLengthWarningLimit = 10;
607
+ //**Set any texbox maxlength default value
608
+ this.MaxLengthTextBox = 255;
609
+ //**Set any textArea maxlength default value
610
+ this.MaxLengthTextArea = 1000;
611
+ //**Set default image source
612
+ this.DefaultImageSrc = "./src/assets/images/uploadimg.png";
520
613
  }
521
614
  return GlobalSettings;
522
615
  }());
@@ -738,7 +831,6 @@
738
831
  this_1.uploader.queue = [];
739
832
  return { value: void 0 };
740
833
  }
741
- debugger;
742
834
  var reader_1 = new FileReader();
743
835
  var fileObject = file.rawFile;
744
836
  reader_1.readAsDataURL(fileObject);
@@ -779,7 +871,6 @@
779
871
  }
780
872
  };
781
873
  FileUploadComponent.prototype.removeFromControlValue = function (item) {
782
- debugger;
783
874
  if (this.options.IsMultipleFile == false) {
784
875
  this.fileUploadModel = null;
785
876
  if (this.options.IsRequired == true) {
@@ -1205,6 +1296,16 @@
1205
1296
  this.markAllAsTouched = false;
1206
1297
  this.ArabicLetterOnly = "";
1207
1298
  this.EnglishLetterOnly = "";
1299
+ //For Show warning message of max length limit
1300
+ this.minCharsLimit = -1; //To disable chars limit feature by default
1301
+ this.englishCurrentCharsCount = 0;
1302
+ this.arabicCurrentCharsCount = 0;
1303
+ this.showEnglishCharsLimitMsg = false;
1304
+ this.showArabicCharsLimitMsg = false;
1305
+ this.hasEnglishCharsLimitValidationError = false;
1306
+ this.hasArabicCharsLimitValidationError = false;
1307
+ this.englishMaxLimitWarningMsg = "";
1308
+ this.arabicMaxLimitWarningMsg = "";
1208
1309
  //External Method
1209
1310
  this.RemoveRequiredValidation = function () {
1210
1311
  _this.controlUtility.RemoveRequiredValidation(_this.ArabicFormControl, _this.EnglishValidationRules, _this.options);
@@ -1234,12 +1335,12 @@
1234
1335
  this.CurrentLanguage = translate.currentLang != undefined ? translate.currentLang : translate.defaultLang;
1235
1336
  }
1236
1337
  MultiLingualTextBoxComponent.prototype.getCustomErrorsMassages = function () {
1237
- this.ArabicLetterOnly = this.UtilityService.getResourceValue("ArabicLetterOnly");
1338
+ this.ArabicLetterOnly = this.UtilityService.getResourceValue("ArabicIsRequiredAndOnly50CharactersEnglish");
1238
1339
  this.EnglishLetterOnly = this.UtilityService.getResourceValue("EnglishLetterOnly");
1239
1340
  };
1240
1341
  MultiLingualTextBoxComponent.prototype.ngOnInit = function () {
1241
1342
  return __awaiter(this, void 0, void 0, function () {
1242
- var _a, Validations, index, Validation, Validations, index, Validation;
1343
+ var _a, Validations, index, Validation;
1243
1344
  var _this = this;
1244
1345
  return __generator(this, function (_b) {
1245
1346
  switch (_b.label) {
@@ -1267,6 +1368,8 @@
1267
1368
  this.options.LanguageMode = this.globalSettings.LanguageMode;
1268
1369
  if (!this.options.MultiControlPlacementType)
1269
1370
  this.options.MultiControlPlacementType = this.globalSettings.MultiControlPlacementType;
1371
+ if (!this.options.MaxLength)
1372
+ this.options.MaxLength = this.globalSettings.MaxLengthTextBox;
1270
1373
  if (this.options.ArabicLabelKey != null && this.options.ArabicLabelKey != "")
1271
1374
  this.options.ArabicLabelValue = this.UtilityService.getResourceValue(this.options.ArabicLabelKey);
1272
1375
  if (this.options.EnglishLabelKey != null && this.options.EnglishLabelKey != "")
@@ -1279,14 +1382,6 @@
1279
1382
  this.ArabicValidationRules.push(Validation.functionBody);
1280
1383
  }
1281
1384
  }
1282
- if (this.options.CustomValidation.length > 0) {
1283
- Validations = this.options.CustomValidation;
1284
- for (index = 0; index < Validations.length; index++) {
1285
- Validation = Validations[index];
1286
- this.EnglishValidationRules.push(Validation.functionBody);
1287
- this.ArabicValidationRules.push(Validation.functionBody);
1288
- }
1289
- }
1290
1385
  if (this.options.MinLength > 0) {
1291
1386
  this.ArabicValidationRules.push(forms.Validators.minLength(this.options.MinLength));
1292
1387
  this.EnglishValidationRules.push(forms.Validators.minLength(this.options.MinLength));
@@ -1294,10 +1389,13 @@
1294
1389
  if (this.options.MaxLength > 0) {
1295
1390
  this.EnglishValidationRules.push(forms.Validators.maxLength(this.options.MaxLength));
1296
1391
  this.ArabicValidationRules.push(forms.Validators.maxLength(this.options.MaxLength));
1392
+ if (!this.options.MaxLengthWarningLimit)
1393
+ this.options.MaxLengthWarningLimit = this.globalSettings.MaxLengthWarningLimit;
1394
+ this.minCharsLimit = this.options.MaxLength - this.options.MaxLengthWarningLimit;
1297
1395
  }
1298
1396
  this.showInputUsingLanguageMode();
1299
1397
  this.ArabicValidationRules.push(forms.Validators.compose([
1300
- this.controlUtility.patternValidator(/^[^A-Za-z]*$/, { ArabicLetterOnly: this.ArabicLetterOnly }),
1398
+ this.controlUtility.arabicValidator({ ArabicIsRequiredAndOnly50CharactersEnglish: this.ArabicLetterOnly }),
1301
1399
  ]));
1302
1400
  this.EnglishValidationRules.push(forms.Validators.compose([
1303
1401
  this.controlUtility.patternValidator(/^[\x00-\x7F]*$/, { EnglishLetterOnly: this.EnglishLetterOnly }),
@@ -1346,6 +1444,27 @@
1346
1444
  englishValue = this.EnglishFormControl.value;
1347
1445
  }
1348
1446
  }
1447
+ //Check for maxlength limit count
1448
+ //MaxLength should be gretaer than or equals chars limit so that minCharsLimit would be >= 0
1449
+ if (this.options.MaxLength && this.minCharsLimit >= 0) {
1450
+ this.englishCurrentCharsCount = this.EnglishFormControl.value.length;
1451
+ if (this.englishCurrentCharsCount >= this.minCharsLimit) {
1452
+ this.showEnglishCharsLimitMsg = true;
1453
+ this.hasEnglishCharsLimitValidationError = true;
1454
+ if (this.englishCurrentCharsCount == this.options.MaxLength)
1455
+ this.englishCharsLimitMsgClass = "danger";
1456
+ else
1457
+ this.englishCharsLimitMsgClass = "warning";
1458
+ }
1459
+ else {
1460
+ this.showEnglishCharsLimitMsg = false;
1461
+ this.hasEnglishCharsLimitValidationError = false;
1462
+ }
1463
+ var max = this.options.MaxLength;
1464
+ var current = this.englishCurrentCharsCount;
1465
+ var resource = this.UtilityService.getResourceValue("MaxLengthLimitWarning");
1466
+ this.englishMaxLimitWarningMsg = eval('`' + resource + '`');
1467
+ }
1349
1468
  }
1350
1469
  if (this.ArabicFormControl.value == "") {
1351
1470
  this.ArabicWordCountArray = 0;
@@ -1367,6 +1486,27 @@
1367
1486
  arabicValue = this.ArabicFormControl.value;
1368
1487
  }
1369
1488
  }
1489
+ //Check for maxlength limit count
1490
+ //MaxLength should be gretaer than or equals chars limit so that minCharsLimit would be >= 0
1491
+ if (this.options.MaxLength && this.minCharsLimit >= 0) {
1492
+ this.arabicCurrentCharsCount = this.ArabicFormControl.value.length;
1493
+ if (this.arabicCurrentCharsCount >= this.minCharsLimit) {
1494
+ this.showArabicCharsLimitMsg = true;
1495
+ this.hasArabicCharsLimitValidationError = true;
1496
+ if (this.arabicCurrentCharsCount == this.options.MaxLength)
1497
+ this.arabicCharsLimitMsgClass = "danger";
1498
+ else
1499
+ this.arabicCharsLimitMsgClass = "warning";
1500
+ }
1501
+ else {
1502
+ this.showArabicCharsLimitMsg = false;
1503
+ this.hasArabicCharsLimitValidationError = false;
1504
+ }
1505
+ var max = this.options.MaxLength;
1506
+ var current = this.arabicCurrentCharsCount;
1507
+ var resource = this.UtilityService.getResourceValue("MaxLengthLimitWarning");
1508
+ this.arabicMaxLimitWarningMsg = eval('`' + resource + '`');
1509
+ }
1370
1510
  }
1371
1511
  var mulitLangModel = new EnglishArabicDTO();
1372
1512
  mulitLangModel.Arabic = arabicValue;
@@ -1486,11 +1626,25 @@
1486
1626
  this.ArabicFormControl.updateValueAndValidity();
1487
1627
  this.EnglishFormControl.updateValueAndValidity();
1488
1628
  };
1489
- MultiLingualTextBoxComponent.prototype.showArabicWordCount = function (value) {
1490
- this.IsShowArabicWordCount = value;
1629
+ MultiLingualTextBoxComponent.prototype.onArabicFocus = function (isFocus) {
1630
+ this.IsShowArabicWordCount = isFocus;
1631
+ //onFocus
1632
+ if (isFocus) {
1633
+ if (this.hasArabicCharsLimitValidationError) //check if there was previous validation error
1634
+ this.showArabicCharsLimitMsg = true;
1635
+ }
1636
+ else //onFocusOut
1637
+ this.showArabicCharsLimitMsg = false;
1491
1638
  };
1492
- MultiLingualTextBoxComponent.prototype.showEnglishWordCount = function (value) {
1493
- this.IsShowEnglishWordCount = value;
1639
+ MultiLingualTextBoxComponent.prototype.onEnglishFocus = function (isFocus) {
1640
+ this.IsShowEnglishWordCount = isFocus;
1641
+ //onFocus
1642
+ if (isFocus) {
1643
+ if (this.hasEnglishCharsLimitValidationError) //check if there was previous validation error
1644
+ this.showEnglishCharsLimitMsg = true;
1645
+ }
1646
+ else //onFocusOut
1647
+ this.showEnglishCharsLimitMsg = false;
1494
1648
  };
1495
1649
  return MultiLingualTextBoxComponent;
1496
1650
  }());
@@ -1498,7 +1652,7 @@
1498
1652
  MultiLingualTextBoxComponent.decorators = [
1499
1653
  { type: i0.Component, args: [{
1500
1654
  selector: 'BBSF-MultiLingualTextBox',
1501
- template: "<div class=\"b-control b-multilangual-textbox\">\r\n <div class=\"form-group validate is-invalid\" [formGroup]=\"group\">\r\n\r\n <div class=\"form-group row\" [formGroup]=\"MultiLanguagegroup\">\r\n <div [ngClass]=\"(options.MultiControlPlacementType==1)?'col-md-12':'col-md-6'\">\r\n <div class=\"row\" *ngIf=\"ShowEnglishTextBox\">\r\n <label class=\"b-label col-form-label col-sm-12\"\r\n [ngClass]=\"(options.ViewType==1)?'col-md-9':'col-md-3'\" [hidden]=\"options.IsHideEnglishLabel\">\r\n {{(options.EnglishLabelValue!=null&&options.EnglishLabelValue!=\"\")?options.EnglishLabelValue:options.LabelValue}}\r\n <span *ngIf=\"(options.ShowAsterisk&&options.IsRequired)||(options.IsRequired)\"\r\n class=\"text-danger Required-text\" aria-required=\"true\">*</span>\r\n </label>\r\n\r\n <div class=\"col-sm-12\" [ngClass]=\"(options.ViewType==1)?'':'col-md-9'\">\r\n <div class=\"input-group align-items-center\">\r\n <div class=\"svg svg-icon-grey\" [ngClass]=\"(options.IconPositionEN==1)?'left-icon':'right-icon'\" *ngIf=\"options.Icon!=null\">\r\n <span [inlineSVG]=\"options.Icon\"></span>\r\n </div>\r\n <input class=\"form-control bnsights-control\"\r\n (focus)=\"showEnglishWordCount(true)\" (focusout)=\"showEnglishWordCount(false)\"\r\n aria-describedby=\"email-error\" aria-invalid=\"true\" formControlName=\"English\"\r\n [hidden]=\"options.IsHideEnglishFields\" maxlength=\"{{options.MaxLength}}\" minlength=\"{{options.MinLength}}\"\r\n [class.is-invalid]=\"EnglishFormControl.invalid && EnglishFormControl.touched\"\r\n placeholder=\"{{options.EnglishPlaceholder}}\" (change)=\"trimControlValue('En')\"\r\n (keyup)=\"onTextChange()\"\r\n (keydown)=\"EnglishWordCountArray>options.MaxWordCount&&$event.keyCode !=8?$event.preventDefault():null\"\r\n #userinputEnglish>\r\n <div class=\"input-group-append\" [hidden]=\"options.IsHideEnglishFields\" *ngIf=\"options.EnableCopyToClipboard\">\r\n <span class=\"input-group-text\" (click)=\"copyInputMessage(userinputEnglish)\">\r\n <i class=\"fas fa-copy\"></i>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"text-muted font-weight-500 word-count float-end\" *ngIf=\"options.MaxWordCount>0&&IsShowEnglishWordCount\">{{EnglishWordCount}}/{{options.MaxWordCount}}</div>\r\n <div class=\"text-danger Required-text\" *ngIf=\"(EnglishFormControl.invalid && EnglishFormControl.touched)\">\r\n {{getErrorValidation(EnglishFormControl.errors|keyvalue)}}\r\n </div>\r\n\r\n <div class=\"control-desc\" *ngIf=\"(options.LabelDescription!=null&&options.LabelDescription!='') ||(options.EnglishLabelDescription!=null&&options.EnglishLabelDescription!='')\">\r\n {{(options.EnglishLabelDescription!=null&&options.EnglishLabelDescription!=\"\")?options.EnglishLabelDescription:options.LabelDescription}}\r\n </div>\r\n <!-- <div *ngIf=\"EnglishFormControl.valid\">{{resetError()}}</div> -->\r\n <div *ngIf=\"group.valid\">{{resetError()}}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div [ngClass]=\"(options.MultiControlPlacementType==1)?'col-md-12':'col-md-6'\">\r\n <div class=\"row\" *ngIf=\"ShowArabicTextBox\">\r\n <label class=\"b-label col-form-label col-sm-12\"\r\n [ngClass]=\"(options.ViewType==1)?'col-md-12':'col-md-3'\" [hidden]=\"options.IsHideArabicLabel\">\r\n {{(options.ArabicLabelValue!=null&&options.ArabicLabelValue!=\"\")?options.ArabicLabelValue:options.LabelValue}}\r\n <span *ngIf=\"(options.ShowAsterisk&&options.IsRequired)||(options.IsRequired)\" class=\"text-danger Required-text\" aria-required=\"true\">*</span>\r\n </label>\r\n <div class=\" col-sm-12\" [ngClass]=\"(options.ViewType==1)?'':'col-md-9'\">\r\n <div class=\"input-group align-items-center\">\r\n <div class=\"svg svg-icon-grey\" [ngClass]=\"(options.IconPositionEN==1)?'right-icon':'left-icon'\" *ngIf=\"options.Icon!=null\">\r\n <span [inlineSVG]=\"options.Icon\"></span>\r\n </div>\r\n <input class=\"form-control bnsights-control\" dir=\"rtl\"\r\n (focus)=\"showArabicWordCount(true)\" (focusout)=\"showArabicWordCount(false)\"\r\n [hidden]=\"options.IsHideArabicFields\" aria-describedby=\"email-error\" aria-invalid=\"true\"\r\n formControlName=\"Arabic\" maxlength=\"{{options.MaxLength}}\" minlength=\"{{options.MinLength}}\"\r\n [class.is-invalid]=\"ArabicFormControl.invalid && ArabicFormControl.touched\"\r\n placeholder=\"{{options.ArabicPlaceholder}}\" (keyup)=\"onTextChange()\"\r\n (keydown)=\"ArabicWordCountArray>options.MaxWordCount&&$event.keyCode !=8?$event.preventDefault():null\"\r\n (change)=\"trimControlValue('Ar')\" #userinputArabic>\r\n\r\n <div class=\"input-group-append\" [hidden]=\"options.IsHideArabicFields\" *ngIf=\"options.EnableCopyToClipboard\">\r\n <span class=\"input-group-text\" (click)=\"copyInputMessage(userinputArabic)\">\r\n <i class=\"fas fa-copy\"></i>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"text-muted font-weight-500 float-end word-count\" *ngIf=\"options.MaxWordCount>0&&IsShowArabicWordCount\">{{ArabicWordCount}}/{{options.MaxWordCount}}</div>\r\n <div class=\"text-danger Required-text\" *ngIf=\"(ArabicFormControl.invalid && ArabicFormControl.touched)\">\r\n {{getErrorValidation(ArabicFormControl.errors|keyvalue)}}\r\n </div>\r\n <div class=\"control-desc\" *ngIf=\"(options.LabelDescription!=null&&options.LabelDescription!='')||(options.ArabicLabelDescription!=null&&options.ArabicLabelDescription!='')\">\r\n {{(options.ArabicLabelDescription!=null&&options.ArabicLabelDescription!=\"\")?options.ArabicLabelDescription:options.LabelDescription}}\r\n </div>\r\n <!-- <div *ngIf=\"ArabicFormControl.valid\">{{resetError()}}</div> -->\r\n <div *ngIf=\"group.valid\">{{resetError()}}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</div>\r\n",
1655
+ template: "<div class=\"b-control b-multilangual-textbox\">\r\n <div class=\"form-group validate is-invalid\" [formGroup]=\"group\">\r\n\r\n <div class=\"form-group row\" [formGroup]=\"MultiLanguagegroup\">\r\n <div [ngClass]=\"(options.MultiControlPlacementType==1)?'col-md-12':'col-md-6'\">\r\n <div class=\"row\" *ngIf=\"ShowEnglishTextBox\">\r\n <label class=\"b-label col-form-label col-sm-12\"\r\n [ngClass]=\"(options.ViewType==1)?'col-md-9':'col-md-3'\" [hidden]=\"options.IsHideEnglishLabel\">\r\n {{(options.EnglishLabelValue!=null&&options.EnglishLabelValue!=\"\")?options.EnglishLabelValue:options.LabelValue}}\r\n <span *ngIf=\"(options.ShowAsterisk&&options.IsRequired)||(options.IsRequired)\"\r\n class=\"text-danger Required-text\" aria-required=\"true\">*</span>\r\n </label>\r\n\r\n <div class=\"col-sm-12\" [ngClass]=\"(options.ViewType==1)?'':'col-md-9'\">\r\n <div class=\"input-group align-items-center\">\r\n <div class=\"svg svg-icon-grey\" [ngClass]=\"(options.IconPositionEN==1)?'left-icon':'right-icon'\" *ngIf=\"options.Icon!=null\">\r\n <span [inlineSVG]=\"options.Icon\"></span>\r\n </div>\r\n <input class=\"form-control bnsights-control\"\r\n (focus)=\"onEnglishFocus(true)\" (focusout)=\"onEnglishFocus(false)\"\r\n aria-describedby=\"email-error\" aria-invalid=\"true\" formControlName=\"English\"\r\n [hidden]=\"options.IsHideEnglishFields\" maxlength=\"{{options.MaxLength}}\" minlength=\"{{options.MinLength}}\"\r\n [class.is-invalid]=\"EnglishFormControl.invalid && EnglishFormControl.touched\"\r\n placeholder=\"{{options.EnglishPlaceholder}}\" (change)=\"trimControlValue('En')\"\r\n (keyup)=\"onTextChange()\"\r\n (keydown)=\"EnglishWordCountArray>options.MaxWordCount&&$event.keyCode !=8?$event.preventDefault():null\"\r\n #userinputEnglish>\r\n <div class=\"input-group-append\" [hidden]=\"options.IsHideEnglishFields\" *ngIf=\"options.EnableCopyToClipboard\">\r\n <span class=\"input-group-text\" (click)=\"copyInputMessage(userinputEnglish)\">\r\n <i class=\"fas fa-copy\"></i>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"text-muted font-weight-500 word-count float-end\" *ngIf=\"options.MaxWordCount>0&&IsShowEnglishWordCount\">{{EnglishWordCount}}/{{options.MaxWordCount}}</div>\r\n <div class=\"text-danger Required-text\" *ngIf=\"(EnglishFormControl.invalid && EnglishFormControl.touched)\">\r\n {{getErrorValidation(EnglishFormControl.errors|keyvalue)}}\r\n </div>\r\n <div *ngIf=\"showEnglishCharsLimitMsg\">\r\n <span class=\"badge b-character-warning float-end\" [ngClass]=\"{'badge-light-warning': englishCharsLimitMsgClass === 'warning', 'badge-light-danger' : englishCharsLimitMsgClass === 'danger' }\">\r\n {{englishMaxLimitWarningMsg}}\r\n </span>\r\n </div>\r\n <div class=\"control-desc\" *ngIf=\"(options.LabelDescription!=null&&options.LabelDescription!='') ||(options.EnglishLabelDescription!=null&&options.EnglishLabelDescription!='')\">\r\n {{(options.EnglishLabelDescription!=null&&options.EnglishLabelDescription!=\"\")?options.EnglishLabelDescription:options.LabelDescription}}\r\n </div>\r\n <!-- <div *ngIf=\"EnglishFormControl.valid\">{{resetError()}}</div> -->\r\n <div *ngIf=\"group.valid\">{{resetError()}}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div [ngClass]=\"(options.MultiControlPlacementType==1)?'col-md-12':'col-md-6'\">\r\n <div class=\"row\" *ngIf=\"ShowArabicTextBox\">\r\n <label class=\"b-label col-form-label col-sm-12\"\r\n [ngClass]=\"(options.ViewType==1)?'col-md-12':'col-md-3'\" [hidden]=\"options.IsHideArabicLabel\">\r\n {{(options.ArabicLabelValue!=null&&options.ArabicLabelValue!=\"\")?options.ArabicLabelValue:options.LabelValue}}\r\n <span *ngIf=\"(options.ShowAsterisk&&options.IsRequired)||(options.IsRequired)\" class=\"text-danger Required-text\" aria-required=\"true\">*</span>\r\n </label>\r\n <div class=\" col-sm-12\" [ngClass]=\"(options.ViewType==1)?'':'col-md-9'\">\r\n <div class=\"input-group align-items-center\">\r\n <div class=\"svg svg-icon-grey\" [ngClass]=\"(options.IconPositionEN==1)?'right-icon':'left-icon'\" *ngIf=\"options.Icon!=null\">\r\n <span [inlineSVG]=\"options.Icon\"></span>\r\n </div>\r\n <input class=\"form-control bnsights-control\" dir=\"rtl\"\r\n (focus)=\"onArabicFocus(true)\" (focusout)=\"onArabicFocus(false)\"\r\n [hidden]=\"options.IsHideArabicFields\" aria-describedby=\"email-error\" aria-invalid=\"true\"\r\n formControlName=\"Arabic\" maxlength=\"{{options.MaxLength}}\" minlength=\"{{options.MinLength}}\"\r\n [class.is-invalid]=\"ArabicFormControl.invalid && ArabicFormControl.touched\"\r\n placeholder=\"{{options.ArabicPlaceholder}}\" (keyup)=\"onTextChange()\"\r\n (keydown)=\"ArabicWordCountArray>options.MaxWordCount&&$event.keyCode !=8?$event.preventDefault():null\"\r\n (change)=\"trimControlValue('Ar')\" #userinputArabic>\r\n\r\n <div class=\"input-group-append\" [hidden]=\"options.IsHideArabicFields\" *ngIf=\"options.EnableCopyToClipboard\">\r\n <span class=\"input-group-text\" (click)=\"copyInputMessage(userinputArabic)\">\r\n <i class=\"fas fa-copy\"></i>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"text-muted font-weight-500 float-end word-count\" *ngIf=\"options.MaxWordCount>0&&IsShowArabicWordCount\">{{ArabicWordCount}}/{{options.MaxWordCount}}</div>\r\n <div class=\"text-danger Required-text\" *ngIf=\"(ArabicFormControl.invalid && ArabicFormControl.touched)\">\r\n {{getErrorValidation(ArabicFormControl.errors|keyvalue)}}\r\n </div>\r\n <div *ngIf=\"showArabicCharsLimitMsg\">\r\n <span class=\"badge b-character-warning float-end\" [ngClass]=\"{'badge-light-warning': arabicCharsLimitMsgClass === 'warning', 'badge-light-danger' : arabicCharsLimitMsgClass === 'danger' }\">\r\n {{arabicMaxLimitWarningMsg}}\r\n </span>\r\n </div>\r\n <div class=\"control-desc\" *ngIf=\"(options.LabelDescription!=null&&options.LabelDescription!='')||(options.ArabicLabelDescription!=null&&options.ArabicLabelDescription!='')\">\r\n {{(options.ArabicLabelDescription!=null&&options.ArabicLabelDescription!=\"\")?options.ArabicLabelDescription:options.LabelDescription}}\r\n </div>\r\n <!-- <div *ngIf=\"ArabicFormControl.valid\">{{resetError()}}</div> -->\r\n <div *ngIf=\"group.valid\">{{resetError()}}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</div>\r\n",
1502
1656
  styles: [".example-form{min-width:150px;max-width:500px;width:100%}.example-full-width{width:100%}\n"]
1503
1657
  },] }
1504
1658
  ];
@@ -1533,6 +1687,12 @@
1533
1687
  this.markAllAsTouched = false;
1534
1688
  this.validationRules = [];
1535
1689
  this.validationRulesasync = [];
1690
+ //For Show warning message of max length limit
1691
+ this.currentCharsCount = 0;
1692
+ this.showCharsLimitMsg = false;
1693
+ this.hasCharsLimitValidationError = false;
1694
+ this.minCharsLimit = -1; //To disable chars limit feature by default
1695
+ this.maxLimitWarningMsg = "";
1536
1696
  this.resetError = function () {
1537
1697
  _this.controlValidationService.RemoveGlobalError();
1538
1698
  };
@@ -1563,6 +1723,8 @@
1563
1723
  this.controlValidationService.isCreatedBefor = false;
1564
1724
  this.group.addControl(this.options.Name, new forms.FormControl(''));
1565
1725
  this.TextAreaFormControl = this.group.controls[this.options.Name]; // new FormControl('',validationRules);
1726
+ if (!this.options.MaxLength)
1727
+ this.options.MaxLength = this.globalSettings.MaxLengthTextArea;
1566
1728
  if (!this.options.ViewType)
1567
1729
  this.options.ViewType = this.globalSettings.ViewType;
1568
1730
  if (this.options.LabelKey != null && this.options.LabelKey != "")
@@ -1580,6 +1742,9 @@
1580
1742
  }
1581
1743
  if (this.options.MaxLength > 0) {
1582
1744
  this.validationRules.push(forms.Validators.maxLength(this.options.MaxLength));
1745
+ if (!this.options.MaxLengthWarningLimit)
1746
+ this.options.MaxLengthWarningLimit = this.globalSettings.MaxLengthWarningLimit;
1747
+ this.minCharsLimit = this.options.MaxLength - this.options.MaxLengthWarningLimit;
1583
1748
  }
1584
1749
  if (this.options.IsRequired) {
1585
1750
  this.validationRules.push(forms.Validators.required);
@@ -1636,10 +1801,38 @@
1636
1801
  }
1637
1802
  }
1638
1803
  }
1804
+ //Check for maxlength limit count
1805
+ //MaxLength should be gretaer than or equals chars limit so that minCharsLimit would be >= 0
1806
+ if (this.options.MaxLength && this.minCharsLimit >= 0) {
1807
+ this.currentCharsCount = this.TextAreaFormControl.value.length;
1808
+ if (this.currentCharsCount >= this.minCharsLimit) {
1809
+ this.showCharsLimitMsg = true;
1810
+ this.hasCharsLimitValidationError = true;
1811
+ if (this.currentCharsCount == this.options.MaxLength)
1812
+ this.charsLimitMsgClass = "danger";
1813
+ else
1814
+ this.charsLimitMsgClass = "warning";
1815
+ }
1816
+ else {
1817
+ this.showCharsLimitMsg = false;
1818
+ this.hasCharsLimitValidationError = false;
1819
+ }
1820
+ var max = this.options.MaxLength;
1821
+ var current = this.currentCharsCount;
1822
+ var resource = this.UtilityService.getResourceValue("MaxLengthLimitWarning");
1823
+ this.maxLimitWarningMsg = eval('`' + resource + '`');
1824
+ }
1639
1825
  this.OnChange.emit(this.TextAreaFormControl.value);
1640
1826
  };
1641
- TextAreaComponent.prototype.showWordCount = function (value) {
1642
- this.IsShowWordCount = value;
1827
+ TextAreaComponent.prototype.onFocus = function (isFocus) {
1828
+ this.IsShowWordCount = isFocus;
1829
+ //onFocus
1830
+ if (isFocus) {
1831
+ if (this.hasCharsLimitValidationError) //check if there was previous validation error
1832
+ this.showCharsLimitMsg = true;
1833
+ }
1834
+ else //onFocusOut
1835
+ this.showCharsLimitMsg = false;
1643
1836
  };
1644
1837
  return TextAreaComponent;
1645
1838
  }());
@@ -1647,7 +1840,7 @@
1647
1840
  TextAreaComponent.decorators = [
1648
1841
  { type: i0.Component, args: [{
1649
1842
  selector: 'BBSF-TextArea',
1650
- template: "<div class=\"b-control b-textarea\">\r\n <div class=\"form-group row validate is-invalid\" [formGroup]=\"group\">\r\n <label class=\"b-label col-form-label col-sm-12 \" [ngClass]=\"(options.ViewType==1)?'col-md-12':'col-md-3'\"\r\n *ngIf=\"!options.HideLabel\">\r\n {{options.LabelValue}}\r\n <span *ngIf=\"(options.ShowAsterisk&&options.IsRequired)||(options.IsRequired)\" class=\"text-danger Required-text\"\r\n aria-required=\"true\">*</span>\r\n </label>\r\n\r\n <div class=\"col-sm-12\" [ngClass]=\"(options.ViewType==1)?'': ((options.HideLabel)?'col-md-12':'col-md-9')\">\r\n <div class=\"input-group\">\r\n <textarea class=\"form-control bnsights-control {{options.ExtraClasses}}\"\r\n (focus)=\"showWordCount(true)\" (focusout)=\"showWordCount(false)\"\r\n dir=\"{{options.ForceDirection==2?'rtl':''}}\" aria-describedby=\"email-error\"\r\n aria-invalid=\"true\" formControlName=\"{{options.Name}}\"\r\n [class.is-invalid]=\"TextAreaFormControl.invalid && TextAreaFormControl.touched\"\r\n placeholder=\"{{options.Placeholder}}\" id=\"{{options.Name}}\" autocomplete=\"{{options.AutoComplete}}\"\r\n (change)=\"trimControlValue()\" rows=\"{{options.Rows}}\" (keyup)=\"onTextChange()\" cols=\"{{options.Cols}}\"\r\n maxlength=\"{{options.MaxLength}}\" minlength=\"{{options.MinLength}}\"\r\n (keydown)=\"WordCountArray>options.MaxWordCount&&$event.keyCode !=8?$event.preventDefault():null\"\r\n #TextAreainput></textarea>\r\n <div class=\"input-group-append\" *ngIf=\"options.EnableCopyToClipboard\">\r\n <span class=\"input-group-text\" (click)=\"copyInputMessage(TextAreainput)\">\r\n <i class=\"fas fa-copy\"></i>\r\n </span>\r\n </div>\r\n <div class=\"text-muted font-weight-500 word-count float-end\" *ngIf=\"options.MaxWordCount>0&&IsShowWordCount\">{{WordCount}}/{{options.MaxWordCount}} words</div>\r\n </div>\r\n <div class=\"text-danger Required-text\"\r\n *ngIf=\"(TextAreaFormControl.invalid && TextAreaFormControl.touched)\">\r\n {{getErrorValidation(TextAreaFormControl.errors|keyvalue)}}\r\n </div>\r\n <div class=\"control-desc text-dark\" *ngIf=\"options.LabelDescription!=null\">{{options.LabelDescription}}</div>\r\n <!-- <div *ngIf=\"TextAreaFormControl.valid\">{{resetError()}}</div> -->\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty) \">{{resetError()}}</div>\r\n\r\n </div>\r\n </div>\r\n</div>\r\n",
1843
+ template: "<div class=\"b-control b-textarea\">\r\n <div class=\"form-group row validate is-invalid\" [formGroup]=\"group\">\r\n <label class=\"b-label col-form-label col-sm-12 \" [ngClass]=\"(options.ViewType==1)?'col-md-12':'col-md-3'\"\r\n *ngIf=\"!options.HideLabel\">\r\n {{options.LabelValue}}\r\n <span *ngIf=\"(options.ShowAsterisk&&options.IsRequired)||(options.IsRequired)\" class=\"text-danger Required-text\"\r\n aria-required=\"true\">*</span>\r\n </label>\r\n\r\n <div class=\"col-sm-12\" [ngClass]=\"(options.ViewType==1)?'': ((options.HideLabel)?'col-md-12':'col-md-9')\">\r\n <div class=\"input-group\">\r\n <textarea class=\"form-control bnsights-control {{options.ExtraClasses}}\"\r\n (focus)=\"onFocus(true)\" (focusout)=\"onFocus(false)\"\r\n dir=\"{{options.ForceDirection==2?'rtl':''}}\" aria-describedby=\"email-error\"\r\n aria-invalid=\"true\" formControlName=\"{{options.Name}}\"\r\n [class.is-invalid]=\"TextAreaFormControl.invalid && TextAreaFormControl.touched\"\r\n placeholder=\"{{options.Placeholder}}\" id=\"{{options.Name}}\" autocomplete=\"{{options.AutoComplete}}\"\r\n (change)=\"trimControlValue()\" rows=\"{{options.Rows}}\" (keyup)=\"onTextChange()\" cols=\"{{options.Cols}}\"\r\n maxlength=\"{{options.MaxLength}}\" minlength=\"{{options.MinLength}}\"\r\n (keydown)=\"WordCountArray>options.MaxWordCount&&$event.keyCode !=8?$event.preventDefault():null\"\r\n #TextAreainput></textarea>\r\n <div class=\"input-group-append\" *ngIf=\"options.EnableCopyToClipboard\">\r\n <span class=\"input-group-text\" (click)=\"copyInputMessage(TextAreainput)\">\r\n <i class=\"fas fa-copy\"></i>\r\n </span>\r\n </div>\r\n <div class=\"text-muted font-weight-500 word-count float-end\" *ngIf=\"options.MaxWordCount>0&&IsShowWordCount\">{{WordCount}}/{{options.MaxWordCount}} words</div>\r\n </div>\r\n <div class=\"text-danger Required-text\"\r\n *ngIf=\"(TextAreaFormControl.invalid && TextAreaFormControl.touched)\">\r\n {{getErrorValidation(TextAreaFormControl.errors|keyvalue)}}\r\n </div>\r\n <div *ngIf=\"showCharsLimitMsg\">\r\n <span class=\"badge b-character-warning float-end\" [ngClass]=\"{'badge-light-warning': charsLimitMsgClass === 'warning', 'badge-light-danger' : charsLimitMsgClass === 'danger' }\">\r\n {{maxLimitWarningMsg}}\r\n </span>\r\n </div>\r\n <div class=\"control-desc text-dark\" *ngIf=\"options.LabelDescription!=null\">{{options.LabelDescription}}</div>\r\n <!-- <div *ngIf=\"TextAreaFormControl.valid\">{{resetError()}}</div> -->\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty) \">{{resetError()}}</div>\r\n\r\n </div>\r\n </div>\r\n</div>\r\n",
1651
1844
  styles: [".example-form{min-width:150px;max-width:500px;width:100%}.example-full-width{width:100%}.flip_V{transform:scaleY(-1)}\n"]
1652
1845
  },] }
1653
1846
  ];
@@ -1691,6 +1884,16 @@
1691
1884
  this.markAllAsTouched = false;
1692
1885
  this.ArabicLetterOnly = "";
1693
1886
  this.EnglishLetterOnly = "";
1887
+ //For Show warning message of max length limit
1888
+ this.minCharsLimit = -1; //To disable chars limit feature by default
1889
+ this.englishCurrentCharsCount = 0;
1890
+ this.arabicCurrentCharsCount = 0;
1891
+ this.showEnglishCharsLimitMsg = false;
1892
+ this.showArabicCharsLimitMsg = false;
1893
+ this.hasEnglishCharsLimitValidationError = false;
1894
+ this.hasArabicCharsLimitValidationError = false;
1895
+ this.englishMaxLimitWarningMsg = "";
1896
+ this.arabicMaxLimitWarningMsg = "";
1694
1897
  this.resetError = function () {
1695
1898
  _this.controlValidationService.RemoveGlobalError();
1696
1899
  };
@@ -1722,7 +1925,7 @@
1722
1925
  MultiLingualTextAreaComponent.controlContainerstatic = this.controlContainer;
1723
1926
  }
1724
1927
  MultiLingualTextAreaComponent.prototype.getCustomErrorsMassages = function () {
1725
- this.ArabicLetterOnly = this.UtilityService.getResourceValue("ArabicLetterOnly");
1928
+ this.ArabicLetterOnly = this.UtilityService.getResourceValue("ArabicIsRequiredAndOnly50CharactersEnglish");
1726
1929
  this.EnglishLetterOnly = this.UtilityService.getResourceValue("EnglishLetterOnly");
1727
1930
  };
1728
1931
  MultiLingualTextAreaComponent.prototype.ngOnInit = function () {
@@ -1747,6 +1950,8 @@
1747
1950
  this.options.LanguageMode = this.globalSettings.LanguageMode;
1748
1951
  if (!this.options.MultiControlPlacementType)
1749
1952
  this.options.MultiControlPlacementType = this.globalSettings.MultiControlPlacementType;
1953
+ if (!this.options.MaxLength)
1954
+ this.options.MaxLength = this.globalSettings.MaxLengthTextArea;
1750
1955
  if (this.options.ArabicLabelKey != null && this.options.ArabicLabelKey != "")
1751
1956
  this.options.ArabicLabelValue = this.UtilityService.getResourceValue(this.options.ArabicLabelKey);
1752
1957
  if (this.options.EnglishLabelKey != null && this.options.EnglishLabelKey != "")
@@ -1787,10 +1992,13 @@
1787
1992
  if (this.options.MaxLength > 0) {
1788
1993
  this.EnglishValidationRules.push(forms.Validators.maxLength(this.options.MaxLength));
1789
1994
  this.ArabicValidationRules.push(forms.Validators.maxLength(this.options.MaxLength));
1995
+ if (!this.options.MaxLengthWarningLimit)
1996
+ this.options.MaxLengthWarningLimit = this.globalSettings.MaxLengthWarningLimit;
1997
+ this.minCharsLimit = this.options.MaxLength - this.options.MaxLengthWarningLimit;
1790
1998
  }
1791
1999
  this.showInputUsingLanguageMode();
1792
2000
  this.ArabicValidationRules.push(forms.Validators.compose([
1793
- this.controlUtility.patternValidator(/^[^A-Za-z]*$/, { ArabicLetterOnly: this.ArabicLetterOnly }),
2001
+ this.controlUtility.arabicValidator({ ArabicIsRequiredAndOnly50CharactersEnglish: this.ArabicLetterOnly }),
1794
2002
  ]));
1795
2003
  this.EnglishValidationRules.push(forms.Validators.compose([
1796
2004
  this.controlUtility.patternValidator(/^[\x00-\x7F]*$/, { EnglishLetterOnly: this.EnglishLetterOnly }),
@@ -1837,6 +2045,27 @@
1837
2045
  englishValue = this.EnglishTextAreaFormControl.value;
1838
2046
  }
1839
2047
  }
2048
+ //Check for maxlength limit count
2049
+ //MaxLength should be gretaer than or equals chars limit so that minCharsLimit would be >= 0
2050
+ if (this.options.MaxLength && this.minCharsLimit >= 0) {
2051
+ this.englishCurrentCharsCount = this.EnglishTextAreaFormControl.value.length;
2052
+ if (this.englishCurrentCharsCount >= this.minCharsLimit) {
2053
+ this.showEnglishCharsLimitMsg = true;
2054
+ this.hasEnglishCharsLimitValidationError = true;
2055
+ if (this.englishCurrentCharsCount == this.options.MaxLength)
2056
+ this.englishCharsLimitMsgClass = "danger";
2057
+ else
2058
+ this.englishCharsLimitMsgClass = "warning";
2059
+ }
2060
+ else {
2061
+ this.showEnglishCharsLimitMsg = false;
2062
+ this.hasEnglishCharsLimitValidationError = false;
2063
+ }
2064
+ var max = this.options.MaxLength;
2065
+ var current = this.englishCurrentCharsCount;
2066
+ var resource = this.UtilityService.getResourceValue("MaxLengthLimitWarning");
2067
+ this.englishMaxLimitWarningMsg = eval('`' + resource + '`');
2068
+ }
1840
2069
  }
1841
2070
  if (this.ArabicTextAreaFormControl.value == "") {
1842
2071
  this.ArabicWordCountArray = 0;
@@ -1858,6 +2087,27 @@
1858
2087
  arabicValue = this.ArabicTextAreaFormControl.value;
1859
2088
  }
1860
2089
  }
2090
+ //Check for maxlength limit count
2091
+ //MaxLength should be gretaer than or equals chars limit so that minCharsLimit would be >= 0
2092
+ if (this.options.MaxLength && this.minCharsLimit >= 0) {
2093
+ this.arabicCurrentCharsCount = this.ArabicTextAreaFormControl.value.length;
2094
+ if (this.arabicCurrentCharsCount >= this.minCharsLimit) {
2095
+ this.showArabicCharsLimitMsg = true;
2096
+ this.hasArabicCharsLimitValidationError = true;
2097
+ if (this.arabicCurrentCharsCount == this.options.MaxLength)
2098
+ this.arabicCharsLimitMsgClass = "danger";
2099
+ else
2100
+ this.arabicCharsLimitMsgClass = "warning";
2101
+ }
2102
+ else {
2103
+ this.showArabicCharsLimitMsg = false;
2104
+ this.hasArabicCharsLimitValidationError = false;
2105
+ }
2106
+ var max = this.options.MaxLength;
2107
+ var current = this.arabicCurrentCharsCount;
2108
+ var resource = this.UtilityService.getResourceValue("MaxLengthLimitWarning");
2109
+ this.arabicMaxLimitWarningMsg = eval('`' + resource + '`');
2110
+ }
1861
2111
  }
1862
2112
  var mulitLangModel = new EnglishArabicDTO();
1863
2113
  mulitLangModel.Arabic = arabicValue;
@@ -1968,11 +2218,25 @@
1968
2218
  this.ArabicTextAreaFormControl.updateValueAndValidity();
1969
2219
  this.EnglishTextAreaFormControl.updateValueAndValidity();
1970
2220
  };
1971
- MultiLingualTextAreaComponent.prototype.showArabicWordCount = function (value) {
1972
- this.IsShowArabicWordCount = value;
2221
+ MultiLingualTextAreaComponent.prototype.onArabicFocus = function (isFocus) {
2222
+ this.IsShowArabicWordCount = isFocus;
2223
+ //onFocus
2224
+ if (isFocus) {
2225
+ if (this.hasArabicCharsLimitValidationError) //check if there was previous validation error
2226
+ this.showArabicCharsLimitMsg = true;
2227
+ }
2228
+ else //onFocusOut
2229
+ this.showArabicCharsLimitMsg = false;
1973
2230
  };
1974
- MultiLingualTextAreaComponent.prototype.showEnglishWordCount = function (value) {
1975
- this.IsShowEnglishWordCount = value;
2231
+ MultiLingualTextAreaComponent.prototype.onEnglishFocus = function (isFocus) {
2232
+ this.IsShowEnglishWordCount = isFocus;
2233
+ //onFocus
2234
+ if (isFocus) {
2235
+ if (this.hasEnglishCharsLimitValidationError) //check if there was previous validation error
2236
+ this.showEnglishCharsLimitMsg = true;
2237
+ }
2238
+ else //onFocusOut
2239
+ this.showEnglishCharsLimitMsg = false;
1976
2240
  };
1977
2241
  return MultiLingualTextAreaComponent;
1978
2242
  }());
@@ -1980,7 +2244,7 @@
1980
2244
  MultiLingualTextAreaComponent.decorators = [
1981
2245
  { type: i0.Component, args: [{
1982
2246
  selector: 'BBSF-MultiLingualTextArea',
1983
- template: "<div class=\"b-control b-multilangual-textarea\">\r\n <div class=\"form-group validate is-invalid\" [formGroup]=\"group\">\r\n\r\n <div class=\"form-group row\" [formGroup]=\"MultiLanguageTextAreagroup\">\r\n <div [ngClass]=\"(options.MultiControlPlacementType==1)?'col-md-12':'col-md-6'\">\r\n <div class=\"row\" *ngIf=\"ShowEngishTextArea\">\r\n <label class=\"b-label col-form-label col-sm-12 \"\r\n [ngClass]=\"(options.ViewType==1)?'col-md-9':'col-md-3'\" [hidden]=\"options.IsHideEnglishLabel\">\r\n {{(options.EnglishLabelValue!=null&&options.EnglishLabelValue!=\"\")?options.EnglishLabelValue:options.LabelValue+\"in English\"}}\r\n <span *ngIf=\"(options.ShowAsterisk&&options.IsRequired)||(options.IsRequired)\"\r\n class=\"text-danger Required-text\" aria-required=\"true\">*</span>\r\n </label>\r\n\r\n <div class=\"col-sm-12\" [ngClass]=\"(options.ViewType==1)?'':'col-md-9'\">\r\n <div class=\"input-group\">\r\n <textarea class=\"form-control bnsights-control\" rows=\"{{options.Rows}}\" cols=\"{{options.Cols}}\"\r\n (focus)=\"showEnglishWordCount(true)\" (focusout)=\"showEnglishWordCount(false)\"\r\n maxlength=\"{{options.MaxLength}}\" minlength=\"{{options.MinLength}}\"\r\n aria-describedby=\"email-error\" aria-invalid=\"true\"\r\n formControlName=\"English\" [hidden]=\"options.IsHideEnglishFields\"\r\n [class.is-invalid]=\"EnglishTextAreaFormControl.invalid && EnglishTextAreaFormControl.touched\"\r\n placeholder=\"{{options.EnglishPlaceholder}}\" (change)=\"trimControlValue('En')\"\r\n \r\n (keyup)=\"onTextChange()\"\r\n (keydown)=\"EnglishWordCountArray>options.MaxWordCount&&$event.keyCode !=8?$event.preventDefault():null\"\r\n #userinputTextAreaEnglish>\r\n </textarea>\r\n <div class=\"input-group-append\" [hidden]=\"options.IsHideEnglishFields\" *ngIf=\"options.EnableCopyToClipboard\">\r\n <span class=\"input-group-text\" (click)=\"copyInputMessage(userinputTextAreaEnglish)\">\r\n <i class=\"fas fa-copy\"></i>\r\n </span>\r\n </div>\r\n\r\n\r\n </div>\r\n <div class=\"text-muted font-weight-500 float-end word-count\" *ngIf=\"options.MaxWordCount>0&&IsShowEnglishWordCount\">{{EnglishWordCount}}/{{options.MaxWordCount}}</div>\r\n <div class=\"text-danger Required-text\"\r\n *ngIf=\"(EnglishTextAreaFormControl.invalid && EnglishTextAreaFormControl.touched)\">\r\n {{getErrorValidation(EnglishTextAreaFormControl.errors|keyvalue)}}\r\n </div>\r\n <div class=\"control-desc\" *ngIf=\"(options.LabelDescription!=null&&options.LabelDescription!='') ||(options.EnglishLabelDescription!=null&&options.EnglishLabelDescription!='')\">\r\n {{(options.EnglishLabelDescription!=null&&options.EnglishLabelDescription!=\"\")?options.EnglishLabelDescription:options.LabelDescription}}\r\n </div>\r\n\r\n <!-- <div *ngIf=\"EnglishTextAreaFormControl.valid\">{{resetError()}}</div> -->\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty) \">{{resetError()}}</div>\r\n\r\n\r\n </div>\r\n </div>\r\n </div>\r\n <div [ngClass]=\"(options.MultiControlPlacementType==1)?'col-md-12':'col-md-6'\">\r\n <div class=\"row\" *ngIf=\"ShowArabicTextArea\">\r\n\r\n <label class=\"b-label col-form-label col-sm-12 \"\r\n [ngClass]=\"(options.ViewType==1)?'col-md-12':'col-md-3'\" [hidden]=\"options.IsHideArabicLable\">\r\n {{(options.ArabicLabelValue!=null&&options.ArabicLabelValue!=\"\")?options.ArabicLabelValue:options.LabelValue+\"in Arabic\"}}\r\n <span *ngIf=\"(options.ShowAsterisk&&options.IsRequired)||(options.IsRequired)\"\r\n class=\"text-danger Required-text\" aria-required=\"true\">*</span>\r\n </label>\r\n <div class=\" col-sm-12\" [ngClass]=\"(options.ViewType==1)?'':'col-md-9'\">\r\n <div class=\"input-group\">\r\n <textarea class=\"form-control bnsights-control\" dir=\"rtl\" rows=\"{{options.Rows}}\" cols=\"{{options.Cols}}\"\r\n (focus)=\"showArabicWordCount(true)\" (focusout)=\"showArabicWordCount(false)\"\r\n [hidden]=\"options.IsHideArabicFields\"\r\n aria-describedby=\"email-error\" aria-invalid=\"true\"\r\n formControlName=\"Arabic\" rows=\"{{options.Rows}}\"\r\n maxlength=\"{{options.MaxLength}}\" minlength=\"{{options.MinLength}}\"\r\n [class.is-invalid]=\"ArabicTextAreaFormControl.invalid && ArabicTextAreaFormControl.touched\"\r\n placeholder=\"{{options.ArabicPlaceholder}}\" (change)=\"trimControlValue('Ar')\"\r\n (keyup)=\"onTextChange()\"\r\n (keydown)=\"ArabicWordCountArray>options.MaxWordCount&&$event.keyCode !=8?$event.preventDefault():null\"\r\n #userinputTextAreaArabic>\r\n </textarea>\r\n <div class=\"input-group-append\" [hidden]=\"options.IsHideArabicFields\" *ngIf=\"options.EnableCopyToClipboard\">\r\n <span class=\"input-group-text\" (click)=\"copyInputMessage(userinputTextAreaArabic)\">\r\n <i class=\"fas fa-copy\"></i>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"text-muted font-weight-500 float-end word-count\" *ngIf=\"options.MaxWordCount>0&&IsShowArabicWordCount\">{{ArabicWordCount}}/{{options.MaxWordCount}}</div>\r\n <div class=\"text-danger Required-text\"\r\n *ngIf=\"(ArabicTextAreaFormControl.invalid && ArabicTextAreaFormControl.touched)\">\r\n {{getErrorValidation(ArabicTextAreaFormControl.errors|keyvalue)}}\r\n </div>\r\n <div class=\"control-desc\" *ngIf=\"(options.LabelDescription!=null&&options.LabelDescription!='')||(options.ArabicLabelDescription!=null&&options.ArabicLabelDescription!='')\">\r\n {{(options.ArabicLabelDescription!=null&&options.ArabicLabelDescription!=\"\")?options.ArabicLabelDescription:options.LabelDescription}}\r\n </div>\r\n <!-- <div *ngIf=\"ArabicTextAreaFormControl.valid\">{{resetError()}}</div> -->\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty) \">{{resetError()}}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n",
2247
+ template: "<div class=\"b-control b-multilangual-textarea\">\r\n <div class=\"form-group validate is-invalid\" [formGroup]=\"group\">\r\n\r\n <div class=\"form-group row\" [formGroup]=\"MultiLanguageTextAreagroup\">\r\n <div [ngClass]=\"(options.MultiControlPlacementType==1)?'col-md-12':'col-md-6'\">\r\n <div class=\"row\" *ngIf=\"ShowEngishTextArea\">\r\n <label class=\"b-label col-form-label col-sm-12 \"\r\n [ngClass]=\"(options.ViewType==1)?'col-md-9':'col-md-3'\" [hidden]=\"options.IsHideEnglishLabel\">\r\n {{(options.EnglishLabelValue!=null&&options.EnglishLabelValue!=\"\")?options.EnglishLabelValue:options.LabelValue+\"in English\"}}\r\n <span *ngIf=\"(options.ShowAsterisk&&options.IsRequired)||(options.IsRequired)\"\r\n class=\"text-danger Required-text\" aria-required=\"true\">*</span>\r\n </label>\r\n\r\n <div class=\"col-sm-12\" [ngClass]=\"(options.ViewType==1)?'':'col-md-9'\">\r\n <div class=\"input-group\">\r\n <textarea class=\"form-control bnsights-control\" rows=\"{{options.Rows}}\" cols=\"{{options.Cols}}\"\r\n (focus)=\"onEnglishFocus(true)\" (focusout)=\"onEnglishFocus(false)\"\r\n maxlength=\"{{options.MaxLength}}\" minlength=\"{{options.MinLength}}\"\r\n aria-describedby=\"email-error\" aria-invalid=\"true\"\r\n formControlName=\"English\" [hidden]=\"options.IsHideEnglishFields\"\r\n [class.is-invalid]=\"EnglishTextAreaFormControl.invalid && EnglishTextAreaFormControl.touched\"\r\n placeholder=\"{{options.EnglishPlaceholder}}\" (change)=\"trimControlValue('En')\"\r\n (keyup)=\"onTextChange()\"\r\n (keydown)=\"EnglishWordCountArray>options.MaxWordCount&&$event.keyCode !=8?$event.preventDefault():null\"\r\n #userinputTextAreaEnglish>\r\n </textarea>\r\n <div class=\"input-group-append\" [hidden]=\"options.IsHideEnglishFields\" *ngIf=\"options.EnableCopyToClipboard\">\r\n <span class=\"input-group-text\" (click)=\"copyInputMessage(userinputTextAreaEnglish)\">\r\n <i class=\"fas fa-copy\"></i>\r\n </span>\r\n </div>\r\n\r\n\r\n </div>\r\n <div class=\"text-muted font-weight-500 float-end word-count\" *ngIf=\"options.MaxWordCount>0&&IsShowEnglishWordCount\">{{EnglishWordCount}}/{{options.MaxWordCount}}</div>\r\n <div class=\"text-danger Required-text\"\r\n *ngIf=\"(EnglishTextAreaFormControl.invalid && EnglishTextAreaFormControl.touched)\">\r\n {{getErrorValidation(EnglishTextAreaFormControl.errors|keyvalue)}}\r\n </div>\r\n <div *ngIf=\"showEnglishCharsLimitMsg\">\r\n <span class=\"badge b-character-warning float-end\" [ngClass]=\"{'badge-light-warning': englishCharsLimitMsgClass === 'warning', 'badge-light-danger' : englishCharsLimitMsgClass === 'danger' }\">\r\n {{englishMaxLimitWarningMsg}}\r\n </span>\r\n </div>\r\n <div class=\"control-desc\" *ngIf=\"(options.LabelDescription!=null&&options.LabelDescription!='') ||(options.EnglishLabelDescription!=null&&options.EnglishLabelDescription!='')\">\r\n {{(options.EnglishLabelDescription!=null&&options.EnglishLabelDescription!=\"\")?options.EnglishLabelDescription:options.LabelDescription}}\r\n </div>\r\n\r\n <!-- <div *ngIf=\"EnglishTextAreaFormControl.valid\">{{resetError()}}</div> -->\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty) \">{{resetError()}}</div>\r\n\r\n\r\n </div>\r\n </div>\r\n </div>\r\n <div [ngClass]=\"(options.MultiControlPlacementType==1)?'col-md-12':'col-md-6'\">\r\n <div class=\"row\" *ngIf=\"ShowArabicTextArea\">\r\n\r\n <label class=\"b-label col-form-label col-sm-12 \"\r\n [ngClass]=\"(options.ViewType==1)?'col-md-12':'col-md-3'\" [hidden]=\"options.IsHideArabicLable\">\r\n {{(options.ArabicLabelValue!=null&&options.ArabicLabelValue!=\"\")?options.ArabicLabelValue:options.LabelValue+\"in Arabic\"}}\r\n <span *ngIf=\"(options.ShowAsterisk&&options.IsRequired)||(options.IsRequired)\"\r\n class=\"text-danger Required-text\" aria-required=\"true\">*</span>\r\n </label>\r\n <div class=\" col-sm-12\" [ngClass]=\"(options.ViewType==1)?'':'col-md-9'\">\r\n <div class=\"input-group\">\r\n <textarea class=\"form-control bnsights-control\" dir=\"rtl\" rows=\"{{options.Rows}}\" cols=\"{{options.Cols}}\"\r\n (focus)=\"onArabicFocus(true)\" (focusout)=\"onArabicFocus(false)\"\r\n [hidden]=\"options.IsHideArabicFields\"\r\n aria-describedby=\"email-error\" aria-invalid=\"true\"\r\n formControlName=\"Arabic\" rows=\"{{options.Rows}}\"\r\n maxlength=\"{{options.MaxLength}}\" minlength=\"{{options.MinLength}}\"\r\n [class.is-invalid]=\"ArabicTextAreaFormControl.invalid && ArabicTextAreaFormControl.touched\"\r\n placeholder=\"{{options.ArabicPlaceholder}}\" (change)=\"trimControlValue('Ar')\"\r\n (keyup)=\"onTextChange()\"\r\n (keydown)=\"ArabicWordCountArray>options.MaxWordCount&&$event.keyCode !=8?$event.preventDefault():null\"\r\n #userinputTextAreaArabic>\r\n </textarea>\r\n <div class=\"input-group-append\" [hidden]=\"options.IsHideArabicFields\" *ngIf=\"options.EnableCopyToClipboard\">\r\n <span class=\"input-group-text\" (click)=\"copyInputMessage(userinputTextAreaArabic)\">\r\n <i class=\"fas fa-copy\"></i>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"text-muted font-weight-500 float-end word-count\" *ngIf=\"options.MaxWordCount>0&&IsShowArabicWordCount\">{{ArabicWordCount}}/{{options.MaxWordCount}}</div>\r\n <div class=\"text-danger Required-text\"\r\n *ngIf=\"(ArabicTextAreaFormControl.invalid && ArabicTextAreaFormControl.touched)\">\r\n {{getErrorValidation(ArabicTextAreaFormControl.errors|keyvalue)}}\r\n </div>\r\n <div *ngIf=\"showArabicCharsLimitMsg\">\r\n <span class=\"badge b-character-warning float-end\" [ngClass]=\"{'badge-light-warning': arabicCharsLimitMsgClass === 'warning', 'badge-light-danger' : arabicCharsLimitMsgClass === 'danger' }\">\r\n {{arabicMaxLimitWarningMsg}}\r\n </span>\r\n </div>\r\n <div class=\"control-desc\" *ngIf=\"(options.LabelDescription!=null&&options.LabelDescription!='')||(options.ArabicLabelDescription!=null&&options.ArabicLabelDescription!='')\">\r\n {{(options.ArabicLabelDescription!=null&&options.ArabicLabelDescription!=\"\")?options.ArabicLabelDescription:options.LabelDescription}}\r\n </div>\r\n <!-- <div *ngIf=\"ArabicTextAreaFormControl.valid\">{{resetError()}}</div> -->\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty) \">{{resetError()}}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n",
1984
2248
  styles: [".example-form{min-width:150px;max-width:500px;width:100%}.example-full-width{width:100%}\n"]
1985
2249
  },] }
1986
2250
  ];
@@ -3091,7 +3355,6 @@
3091
3355
  this.controlValidationService = controlValidationService;
3092
3356
  this.globalSettings = globalSettings;
3093
3357
  this.files = [];
3094
- this.ImageSource = "./src/assets/images/uploadimg.png";
3095
3358
  this.OnChange = new i0.EventEmitter();
3096
3359
  this.ValidationMessage = "";
3097
3360
  this.AcceptedType = "";
@@ -3139,8 +3402,10 @@
3139
3402
  this.controlValidationService.isCreatedBefor = false;
3140
3403
  if (!this.options.ViewType)
3141
3404
  this.options.ViewType = this.globalSettings.ViewType;
3142
- if (this.options.DefaultImageSrc != null && this.options.DefaultImageSrc != "")
3143
- this.ImageSource = this.options.DefaultImageSrc;
3405
+ if (!this.options.DefaultImageSrc)
3406
+ this.options.DefaultImageSrc = this.globalSettings.DefaultImageSrc;
3407
+ //Set img src by default value
3408
+ this.ImageSource = this.options.DefaultImageSrc;
3144
3409
  if (this.options.AllowImageCropper) {
3145
3410
  this.config = {
3146
3411
  aspectRatio: this.options.ImageCropperWidth / this.options.ImageCropperHeight,
@@ -3314,6 +3579,8 @@
3314
3579
  var ItemList = this.group.get(this.options.Name).value;
3315
3580
  this.files = [];
3316
3581
  ItemList = null;
3582
+ //Set Img src by default image (upload)
3583
+ this.ImageSource = this.options.DefaultImageSrc;
3317
3584
  if ((this.files.length == 0) && this.options.IsRequired) {
3318
3585
  this.ImageUploadFormControl.markAsTouched();
3319
3586
  this.ImageUploadFormControl.setErrors(forms.Validators.required);
@@ -3942,7 +4209,6 @@
3942
4209
  return __generator(this, function (_a) {
3943
4210
  switch (_a.label) {
3944
4211
  case 0:
3945
- debugger;
3946
4212
  this.Search = search;
3947
4213
  this.SelectedValue = "";
3948
4214
  return [4 /*yield*/, this.suggestions$.subscribe(function (result) {
@@ -4411,7 +4677,6 @@
4411
4677
  }
4412
4678
  this.requestHandlerService.post(this.options.ActionPostURL, pagingDTO, null, params, null)
4413
4679
  .subscribe(function (responseData) {
4414
- debugger;
4415
4680
  _this.result = responseData.items; //this.castItems(responseData.items);
4416
4681
  var castedResult = classTransformer.plainToClass(_this.options.TypeOfResponse, _this.result, { excludeExtraneousValues: true });
4417
4682
  _this.Items.emit(castedResult);
@@ -4427,7 +4692,6 @@
4427
4692
  });
4428
4693
  };
4429
4694
  PagingComponent.prototype.castItems = function (objectArr) {
4430
- debugger;
4431
4695
  var originalArray = [];
4432
4696
  for (var index = 0; index < objectArr.length; index++) {
4433
4697
  var element = objectArr[index];
@@ -4700,7 +4964,12 @@
4700
4964
  this.markAllAsTouched = false;
4701
4965
  this.validationRules = [];
4702
4966
  this.validationRulesasync = [];
4703
- this.currentLanguage = "";
4967
+ //For Show warning message of max length limit
4968
+ this.currentCharsCount = 0;
4969
+ this.showCharsLimitMsg = false;
4970
+ this.hasCharsLimitValidationError = false;
4971
+ this.minCharsLimit = -1; //To disable chars limit feature by default
4972
+ this.maxLimitWarningMsg = "";
4704
4973
  this.resetError = function () {
4705
4974
  _this.controlValidationService.RemoveGlobalError();
4706
4975
  };
@@ -4726,22 +4995,11 @@
4726
4995
  };
4727
4996
  TextboxComponent.controlContainerstatic = this.controlContainer;
4728
4997
  }
4729
- // static showErrorOfInputs(errors: any) {
4730
- // const controlContainerstatic = TextboxComponent.controlContainerstatic;
4731
- // const formGroup = controlContainerstatic.control as FormGroup;
4732
- // for (const key in errors) {
4733
- // if (errors.hasOwnProperty(key)) {
4734
- // for (const iterator of errors[key]) {
4735
- // const formControl = formGroup.get(key) as FormControl;
4736
- // formControl.setErrors({ "FluentApi": iterator });
4737
- // formControl.markAsTouched();
4738
- // }
4739
- // }
4740
- // }
4741
- // }
4742
4998
  TextboxComponent.prototype.ngOnInit = function () {
4743
4999
  var _this = this;
4744
5000
  this.controlValidationService.isCreatedBefor = false;
5001
+ if (!this.options.MaxLength)
5002
+ this.options.MaxLength = this.globalSettings.MaxLengthTextBox;
4745
5003
  if (!this.options.ViewType)
4746
5004
  this.options.ViewType = this.globalSettings.ViewType;
4747
5005
  if (this.options.MaskPattern != null && this.options.MaskPattern != "") {
@@ -4765,7 +5023,12 @@
4765
5023
  this.options.Placeholder = this.MaskPattern;
4766
5024
  break;
4767
5025
  case exports.InputType.Number:
4768
- this.validationRules.push(forms.Validators.pattern('^[0-9]+(\.?[0-9]+)?$'));
5026
+ this.validationRules.push(forms.Validators.compose([
5027
+ this.controlUtility.patternValidator(/^[0-9]*$/, { IntegerNumberValidationKey: "" }),
5028
+ ]));
5029
+ this.validationRules.push(forms.Validators.compose([
5030
+ this.controlUtility.patternValidator(/^[+]?([.]\d+|\d+[.]?\d*)$/, { PositiveNumberValidationKey: "" }),
5031
+ ]));
4769
5032
  if (this.options.NumberRange != null) {
4770
5033
  this.validationRules.push(forms.Validators.min(this.options.NumberRange.From));
4771
5034
  this.validationRules.push(forms.Validators.max(this.options.NumberRange.To));
@@ -4807,6 +5070,9 @@
4807
5070
  }
4808
5071
  if (this.options.MaxLength > 0) {
4809
5072
  this.validationRules.push(forms.Validators.maxLength(this.options.MaxLength));
5073
+ if (!this.options.MaxLengthWarningLimit)
5074
+ this.options.MaxLengthWarningLimit = this.globalSettings.MaxLengthWarningLimit;
5075
+ this.minCharsLimit = this.options.MaxLength - this.options.MaxLengthWarningLimit;
4810
5076
  }
4811
5077
  if (this.options.IsRequired) {
4812
5078
  this.validationRules.push(forms.Validators.required);
@@ -4873,11 +5139,39 @@
4873
5139
  this.WordCount = this.WordCountArray;
4874
5140
  }
4875
5141
  }
5142
+ //Check for maxlength limit count
5143
+ //MaxLength should be gretaer than or equals chars limit so that minCharsLimit would be >= 0
5144
+ if (this.options.MaxLength && this.minCharsLimit >= 0) {
5145
+ this.currentCharsCount = this.TextBoxFormControl.value.length;
5146
+ if (this.currentCharsCount >= this.minCharsLimit) {
5147
+ this.showCharsLimitMsg = true;
5148
+ this.hasCharsLimitValidationError = true;
5149
+ if (this.currentCharsCount == this.options.MaxLength)
5150
+ this.charsLimitMsgClass = "danger";
5151
+ else
5152
+ this.charsLimitMsgClass = "warning";
5153
+ }
5154
+ else {
5155
+ this.showCharsLimitMsg = false;
5156
+ this.hasCharsLimitValidationError = false;
5157
+ }
5158
+ var max = this.options.MaxLength;
5159
+ var current = this.currentCharsCount;
5160
+ var resource = this.UtilityService.getResourceValue("MaxLengthLimitWarning");
5161
+ this.maxLimitWarningMsg = eval('`' + resource + '`');
5162
+ }
4876
5163
  }
4877
5164
  this.OnChange.emit(this.TextBoxFormControl.value);
4878
5165
  };
4879
- TextboxComponent.prototype.showWordCount = function (value) {
4880
- this.IsShowWordCount = value;
5166
+ TextboxComponent.prototype.onFocus = function (isFocus) {
5167
+ this.IsShowWordCount = isFocus;
5168
+ //onFocus
5169
+ if (isFocus) {
5170
+ if (this.hasCharsLimitValidationError) //check if there was previous validation error
5171
+ this.showCharsLimitMsg = true;
5172
+ }
5173
+ else //onFocusOut
5174
+ this.showCharsLimitMsg = false;
4881
5175
  };
4882
5176
  return TextboxComponent;
4883
5177
  }());
@@ -4885,7 +5179,7 @@
4885
5179
  TextboxComponent.decorators = [
4886
5180
  { type: i0.Component, args: [{
4887
5181
  selector: 'BBSF-TextBox',
4888
- template: "<div class=\"b-control b-textbox\">\r\n <div class=\"form-group row validate is-invalid\" [formGroup]=\"group\" [ngClass]=\"(options.NoMargin==true)?'':'NoMargin'\">\r\n <label class=\"b-label col-form-label col-sm-12 \" [ngClass]=\"(options.ViewType==1)?'col-md-12':'col-md-3'\" *ngIf=\"!options.HideLabel\">\r\n {{options.LabelValue}}\r\n <span *ngIf=\"(options.ShowAsterisk&&options.IsRequired)||(options.IsRequired)\" class=\"text-danger Required-text\"\r\n aria-required=\"true\">*</span>\r\n </label>\r\n\r\n <div class=\"col-sm-12\" [ngClass]=\"(options.ViewType==1)?'': ((options.HideLabel)?'col-md-12':'col-md-9')\">\r\n <div class=\"input-group align-items-center\" *ngIf=\"MaskPattern!=null&&MaskPattern!=''\">\r\n <div class=\"svg svg-icon-grey\" [ngClass]=\"(options.IconPosition==1)?'left-icon':'right-icon'\" *ngIf=\"options.Icon!=null\">\r\n <span [inlineSVG]=\"options.Icon\"></span>\r\n </div>\r\n <input [mask]=\"MaskPattern\" placeHolderCharacter=\" \" [showMaskTyped]=\"true\" [validation]=\"true\"\r\n class=\"form-control bnsights-control {{options.ExtraClasses}}\"\r\n dir=\"{{options.ForceDirection==2?'rtl':''}}\"\r\n aria-describedby=\"email-error\" aria-invalid=\"true\" formControlName=\"{{options.Name}}\"\r\n type=\"{{getInputType(options.Type)}}\"\r\n [class.is-invalid]=\"TextBoxFormControl.invalid && TextBoxFormControl.touched\"\r\n placeholder=\"{{options.Placeholder}}\" id=\"{{options.Name}}\" autocomplete=\"{{options.AutoComplete}}\"\r\n (change)=\"trimControlValue()\" (keyup)=\"onTextChange()\"\r\n (keydown)=\"WordCountArray>options.MaxWordCount&&$event.keyCode !=8?$event.preventDefault():null\"\r\n #userinput>\r\n <div class=\"input-group-append\">\r\n <span class=\"input-group-text\" *ngIf=\"options.EnableCopyToClipboard\" (click)=\"copyInputMessage(userinput)\">\r\n <i class=\"fas fa-copy\"></i>\r\n </span>\r\n </div>\r\n <div class=\"text-muted font-weight-500 word-count\" *ngIf=\"options.MaxWordCount>0&&IsShowWordCount\">{{WordCount}}/{{options.MaxWordCount}} Words</div>\r\n </div>\r\n\r\n <div class=\"input-group align-items-center\" *ngIf=\"MaskPattern==null||MaskPattern==''\">\r\n <div class=\"svg svg-icon-grey\" [ngClass]=\"(options.IconPosition==1)?'left-icon':'right-icon'\" *ngIf=\"options.Icon!=null\">\r\n <span [inlineSVG]=\"options.Icon\"></span>\r\n </div>\r\n <input class=\"form-control bnsights-control {{options.ExtraClasses}} \"\r\n dir=\"{{options.ForceDirection==2?'rtl':''}}\"\r\n (focus)=\"showWordCount(true)\" (focusout)=\"showWordCount(false)\"\r\n maxlength=\"{{options.MaxLength}}\" minlength=\"{{options.MinLength}}\"\r\n aria-describedby=\"email-error\"\r\n aria-invalid=\"true\" formControlName=\"{{options.Name}}\" type=\"{{getInputType(options.Type)}}\"\r\n [class.is-invalid]=\"TextBoxFormControl.invalid && TextBoxFormControl.touched\"\r\n placeholder=\"{{options.Placeholder}}\" id=\"{{options.Name}}\" autocomplete=\"{{options.AutoComplete}}\"\r\n (change)=\"trimControlValue()\" (keyup)=\"onTextChange()\"\r\n (keydown)=\"WordCountArray>options.MaxWordCount&&$event.keyCode !=8?$event.preventDefault():null\"\r\n #userinput>\r\n <div class=\"input-group-append\" *ngIf=\"options.EnableCopyToClipboard\">\r\n <span class=\"input-group-text\" (click)=\"copyInputMessage(userinput)\">\r\n <i class=\"fas fa-copy\"></i>\r\n </span>\r\n </div>\r\n <div class=\"text-muted font-weight-500 word-count float-end\" *ngIf=\"options.MaxWordCount>0&&IsShowWordCount\">{{WordCount}}/{{options.MaxWordCount}} Words</div>\r\n </div>\r\n <div class=\"text-danger Required-text\" dir=\"{{options.ForceDirection==2?'rtl':''}}\"\r\n *ngIf=\"(TextBoxFormControl.invalid && TextBoxFormControl.touched)\">\r\n {{getErrorValidation(TextBoxFormControl.errors|keyvalue)}}\r\n </div>\r\n <div class=\"control-desc\" *ngIf=\"options.LabelDescription!=null\">{{options.LabelDescription}}</div>\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty) \">{{resetError()}}</div>\r\n </div>\r\n </div>\r\n</div>\r\n",
5182
+ template: "<div class=\"b-control b-textbox\">\r\n <div class=\"form-group row validate is-invalid\" [formGroup]=\"group\" [ngClass]=\"(options.NoMargin==true)?'':'NoMargin'\">\r\n <label class=\"b-label col-form-label col-sm-12 \" [ngClass]=\"(options.ViewType==1)?'col-md-12':'col-md-3'\" *ngIf=\"!options.HideLabel\">\r\n {{options.LabelValue}}\r\n <span *ngIf=\"(options.ShowAsterisk&&options.IsRequired)||(options.IsRequired)\" class=\"text-danger Required-text\"\r\n aria-required=\"true\">*</span>\r\n </label>\r\n\r\n <div class=\"col-sm-12\" [ngClass]=\"(options.ViewType==1)?'': ((options.HideLabel)?'col-md-12':'col-md-9')\">\r\n <div class=\"input-group align-items-center\" *ngIf=\"MaskPattern!=null&&MaskPattern!=''\">\r\n <div class=\"svg svg-icon-grey\" [ngClass]=\"(options.IconPosition==1)?'left-icon':'right-icon'\" *ngIf=\"options.Icon!=null\">\r\n <span [inlineSVG]=\"options.Icon\"></span>\r\n </div>\r\n <input [mask]=\"MaskPattern\" placeHolderCharacter=\" \" [showMaskTyped]=\"true\" [validation]=\"true\"\r\n class=\"form-control bnsights-control {{options.ExtraClasses}}\"\r\n dir=\"{{options.ForceDirection==2?'rtl':''}}\"\r\n aria-describedby=\"email-error\" aria-invalid=\"true\" formControlName=\"{{options.Name}}\"\r\n type=\"{{getInputType(options.Type)}}\"\r\n [class.is-invalid]=\"TextBoxFormControl.invalid && TextBoxFormControl.touched\"\r\n placeholder=\"{{options.Placeholder}}\" id=\"{{options.Name}}\" autocomplete=\"{{options.AutoComplete}}\"\r\n (change)=\"trimControlValue()\" (keyup)=\"onTextChange()\"\r\n (keydown)=\"WordCountArray>options.MaxWordCount&&$event.keyCode !=8?$event.preventDefault():null\"\r\n #userinput>\r\n <div class=\"input-group-append\">\r\n <span class=\"input-group-text\" *ngIf=\"options.EnableCopyToClipboard\" (click)=\"copyInputMessage(userinput)\">\r\n <i class=\"fas fa-copy\"></i>\r\n </span>\r\n </div>\r\n <div class=\"text-muted font-weight-500 word-count\" *ngIf=\"options.MaxWordCount>0&&IsShowWordCount\">{{WordCount}}/{{options.MaxWordCount}} Words</div>\r\n\r\n </div>\r\n\r\n <div class=\"input-group align-items-center\" *ngIf=\"MaskPattern==null||MaskPattern==''\">\r\n <div class=\"svg svg-icon-grey\" [ngClass]=\"(options.IconPosition==1)?'left-icon':'right-icon'\" *ngIf=\"options.Icon!=null\">\r\n <span [inlineSVG]=\"options.Icon\"></span>\r\n </div>\r\n <input class=\"form-control bnsights-control {{options.ExtraClasses}} \"\r\n dir=\"{{options.ForceDirection==2?'rtl':''}}\"\r\n (focus)=\"onFocus(true)\" (focusout)=\"onFocus(false)\"\r\n maxlength=\"{{options.MaxLength}}\" minlength=\"{{options.MinLength}}\"\r\n aria-describedby=\"email-error\"\r\n aria-invalid=\"true\" formControlName=\"{{options.Name}}\" type=\"{{getInputType(options.Type)}}\"\r\n [class.is-invalid]=\"TextBoxFormControl.invalid && TextBoxFormControl.touched\"\r\n placeholder=\"{{options.Placeholder}}\" id=\"{{options.Name}}\" autocomplete=\"{{options.AutoComplete}}\"\r\n (change)=\"trimControlValue()\" (keyup)=\"onTextChange()\"\r\n (keydown)=\"WordCountArray>options.MaxWordCount&&$event.keyCode !=8?$event.preventDefault():null\"\r\n #userinput>\r\n <div class=\"input-group-append\" *ngIf=\"options.EnableCopyToClipboard\">\r\n <span class=\"input-group-text\" (click)=\"copyInputMessage(userinput)\">\r\n <i class=\"fas fa-copy\"></i>\r\n </span>\r\n </div>\r\n <div class=\"text-muted font-weight-500 word-count float-end\" *ngIf=\"options.MaxWordCount>0&&IsShowWordCount\">{{WordCount}}/{{options.MaxWordCount}} Words</div>\r\n </div>\r\n <div class=\"text-danger Required-text\" dir=\"{{options.ForceDirection==2?'rtl':''}}\"\r\n *ngIf=\"(TextBoxFormControl.invalid && TextBoxFormControl.touched)\">\r\n {{getErrorValidation(TextBoxFormControl.errors|keyvalue)}}\r\n </div>\r\n <div *ngIf=\"showCharsLimitMsg\">\r\n <span class=\"badge b-character-warning float-end\" [ngClass]=\"{'badge-light-warning': charsLimitMsgClass === 'warning', 'badge-light-danger' : charsLimitMsgClass === 'danger' }\">\r\n {{maxLimitWarningMsg}}\r\n </span>\r\n </div>\r\n <div class=\"control-desc\" *ngIf=\"options.LabelDescription!=null\">{{options.LabelDescription}}</div>\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty) \">{{resetError()}}</div>\r\n </div>\r\n </div>\r\n</div>\r\n",
4889
5183
  styles: [".example-form{min-width:150px;max-width:500px;width:100%}.example-full-width{width:100%}.flip_V{transform:scaleY(-1)}\n"]
4890
5184
  },] }
4891
5185
  ];
@@ -5434,23 +5728,7 @@
5434
5728
  this.utilityService.notifyErrorMessage();
5435
5729
  }
5436
5730
  else {
5437
- debugger;
5438
- if (err.status == 400) {
5439
- this.controlValidationService.renderServerErrors(this.options.FormGroup, err, new bbsfUtilities.RequestOptionsModel(), this.fromName);
5440
- }
5441
- else if (err.status == 401) {
5442
- this.router.navigate(["/Admin/account/login"]);
5443
- }
5444
- else if (err.status == 510) {
5445
- errorMessage = this.utilityService.getCurrentLanguage() == "en" ? "Can not delete this item as it is related to others" : "لا يمكن حذف هذا العنصر لأنه مرتبط بعناصر أخرى";
5446
- if (!this.options.DisableErrorNotification)
5447
- this.utilityService.notifyErrorMessage(errorMessage);
5448
- }
5449
- else {
5450
- errorMessage = "error message is: " + (err.error ? err.error.Message : err.message);
5451
- if (!this.options.DisableErrorNotification)
5452
- this.utilityService.notifyErrorMessage(errorMessage);
5453
- }
5731
+ this.controlValidationService.renderServerErrors(this.options.FormGroup, err, new bbsfUtilities.RequestOptionsModel(), this.fromName);
5454
5732
  }
5455
5733
  if (!this.options.DisableBlockUI)
5456
5734
  this.utilityService.stopBlockUI();
@@ -5830,6 +6108,8 @@
5830
6108
  /**To set SelectMode to DatePicker is Single or Range */
5831
6109
  this.SelectMode = exports.SelectMode.Single;
5832
6110
  this.ForceDirection = exports.ForceDirection.English;
6111
+ /**Name of DatePicker control to compare value with it */
6112
+ this.StartControlToCompareWith = null;
5833
6113
  }
5834
6114
  return DatePickerOptions;
5835
6115
  }());
@@ -6850,7 +7130,7 @@
6850
7130
  RepeaterTableComponent.decorators = [
6851
7131
  { type: i0.Component, args: [{
6852
7132
  selector: 'BBSF-repeater-table',
6853
- template: "<div class=\"b-control b-repeater-table\">\r\n <table class=\"{{options.RepeaterTableExtraClasses}}\">\r\n <thead>\r\n <tr class=\"{{options.RepeaterTableRowExtraClasses}}\">\r\n <th *ngFor=\"let item of options.RepeaterStructure\" class=\"min-w-150px\">{{item.HeaderTitle}}</th>\r\n <th>{{utilityService.getResourceValue(options.ActionLabelKey)}}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of items ; index as i\">\r\n <td *ngFor=\"let RepeaterField of options.RepeaterStructure ; index as r\">\r\n <repeater-field-builder [RepeaterField]=\"RepeaterField\" [itemNumber]=\"i\"\r\n [itemsValue]=\"originalItems\" [controlNumber]=\"r\" [group]=\"repeaterGroup\">\r\n </repeater-field-builder>\r\n </td>\r\n <td>\r\n <button class=\"{{options.DeleteButtonExtraClasses}}\" type=\"button\" (click)=\"deleteItem(i)\"\r\n [disabled]=\"(items.length ==options.MinRequiredItems&&options.IsRequired) ||(originalItems.length-1>=i)\">\r\n <span [innerHTML]=\"options.DeleteButtonText\"></span></button>\r\n </td>\r\n </tr>\r\n </tbody>\r\n <tfoot>\r\n <tr>\r\n <td colspan=\"3\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12 d-grid gap-2\"> \r\n <button class=\"{{options.AddButtonExtraClasses}}\" type=\"button\" (click)=\"addItem()\"><span\r\n [innerHTML]=\"options.AddButtonText\"></span></button>\r\n </div>\r\n </div>\r\n </td>\r\n </tr>\r\n </tfoot>\r\n </table>\r\n</div>"
7133
+ template: "<div class=\"b-control b-repeater-table\">\r\n <table class=\"{{options.RepeaterTableExtraClasses}}\">\r\n <thead>\r\n <tr class=\"{{options.RepeaterTableRowExtraClasses}}\">\r\n <th *ngFor=\"let item of options.RepeaterStructure\" class=\"min-w-150px\">{{item.HeaderTitle}}</th>\r\n <th>{{utilityService.getResourceValue(options.ActionLabelKey)}}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of items ; index as i\">\r\n <td *ngFor=\"let RepeaterField of options.RepeaterStructure ; index as r\">\r\n <repeater-field-builder [RepeaterField]=\"RepeaterField\" [itemNumber]=\"i\"\r\n [itemsValue]=\"originalItems\" [controlNumber]=\"r\" [group]=\"repeaterGroup\">\r\n </repeater-field-builder>\r\n </td>\r\n <td class=\"d-flex align-items-center\">\r\n <button class=\"{{options.DeleteButtonExtraClasses}}\" type=\"button\" (click)=\"deleteItem(i)\"\r\n [disabled]=\"(items.length ==options.MinRequiredItems&&options.IsRequired) ||(originalItems.length-1>=i)\">\r\n <span [innerHTML]=\"options.DeleteButtonText\"></span></button>\r\n </td>\r\n </tr>\r\n </tbody>\r\n <tfoot>\r\n <tr>\r\n <td colspan=\"4\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12 d-grid gap-2\"> \r\n <button class=\"{{options.AddButtonExtraClasses}}\" type=\"button\" (click)=\"addItem()\"><span\r\n [innerHTML]=\"options.AddButtonText\"></span></button>\r\n </div>\r\n </div>\r\n </td>\r\n </tr>\r\n </tfoot>\r\n </table>\r\n</div>"
6854
7134
  },] }
6855
7135
  ];
6856
7136
  RepeaterTableComponent.ctorParameters = function () { return [
@@ -6955,7 +7235,6 @@
6955
7235
  angular.FullCalendarModule,
6956
7236
  typeahead.TypeaheadModule.forRoot(),
6957
7237
  angularEditor.AngularEditorModule,
6958
- angularNgAutocomplete.AutocompleteLibModule,
6959
7238
  bbsfUtilities.BBSFUtilitiesModule,
6960
7239
  ngInlineSvg.InlineSVGModule.forRoot(),
6961
7240
  ngxSweetalert2.SweetAlert2Module
@@ -7016,7 +7295,7 @@
7016
7295
  // This file can be replaced during build by using the `fileReplacements` array.
7017
7296
  // `ng build ---prod` replaces `environment.ts` with `environment.prod.ts`.
7018
7297
  // The list of file replacements can be found in `angular.json`.
7019
- var environment = Object.assign({}, window.Envirnment);
7298
+ var environment = Object.assign({}, window.Environment);
7020
7299
  /*
7021
7300
  * In development mode, to ignore zone related error stack frames such as
7022
7301
  * `zone.run`, `zoneDelegate.invokeTask` for easier debugging, you can
@@ -7409,7 +7688,6 @@
7409
7688
 
7410
7689
  var RepeaterOptions = /** @class */ (function () {
7411
7690
  function RepeaterOptions() {
7412
- this.MinRequiredItems = 1;
7413
7691
  this.ActionLabelKey = "";
7414
7692
  this.AddButtonText = "Add";
7415
7693
  this.DeleteButtonText = "Delete";