@rangertechnologies/ngnxt 2.1.279 → 2.1.281

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.
@@ -24,7 +24,6 @@ import { SelectionModel } from '@angular/cdk/collections';
24
24
  import * as i2 from '@angular/google-maps';
25
25
  import { GoogleMapsModule } from '@angular/google-maps';
26
26
  import * as i1$2 from '@angular/platform-browser';
27
- import { BrowserModule } from '@angular/platform-browser';
28
27
  import * as i9 from '@angular/cdk/bidi';
29
28
  import * as i1$3 from '@angular/router';
30
29
  import * as i8 from 'ngx-device-detector';
@@ -315,7 +314,7 @@ class CustomDatepickerComponent {
315
314
  onMonthSelect() {
316
315
  this.modelChange.emit({
317
316
  from: this.languageCode === 'ar' ? 'gregorianAr' : 'gregorian',
318
- date: { year: this.monthYear.year, month: this.monthYear.month }
317
+ date: { year: this.monthYear.year, month: (this.monthYear.month).toString().padStart(2, '0') }
319
318
  });
320
319
  }
321
320
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: CustomDatepickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
@@ -50755,6 +50754,7 @@ class NxtDatatable {
50755
50754
  }
50756
50755
  }
50757
50756
  }
50757
+ this.computeSummaryColumns();
50758
50758
  this.cdRef.markForCheck();
50759
50759
  }
50760
50760
  }
@@ -51042,7 +51042,10 @@ class NxtDatatable {
51042
51042
  if (summaryCol.formula) {
51043
51043
  // SKS16SEP25 Replace [fieldName] with actual row values
51044
51044
  let expression = summaryCol.formula.replace(/\[([^\]]+)\]/g, (_, fieldName) => {
51045
- return Number(newRow[fieldName]) || 0;
51045
+ if (this.currentColumns.some(col => col.fieldName === fieldName)) {
51046
+ return Number(newRow[fieldName]) || 0;
51047
+ }
51048
+ return 0;
51046
51049
  });
51047
51050
  try {
51048
51051
  // SKS16SEP25 Safely evaluate expression (BODMAS handled automatically)
@@ -51702,7 +51705,7 @@ class NxtDatatable {
51702
51705
  }
51703
51706
  updateEdit(index, value, element, column, type) {
51704
51707
  if (type === 'list') {
51705
- value = (value.valueObj && typeof value.valueObj === 'object' && !Array.isArray(value.valueObj)) ? this.dataService.getValue(value?.valueObj, value?.field) : value.valueObj;
51708
+ value = (value.valueObj && typeof value.valueObj === 'object' && !Array.isArray(value.valueObj)) ? value.isObject ? value?.valueObj : this.dataService.getValue(value?.valueObj, value?.field) : value.valueObj;
51706
51709
  }
51707
51710
  else {
51708
51711
  value = value.valueObj ? value.valueObj : value;
@@ -57453,7 +57456,7 @@ class BookletComponent {
57453
57456
  this.isEdit = true;
57454
57457
  }
57455
57458
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: BookletComponent, deps: [{ token: SalesforceService }, { token: DataService }, { token: StorageService }, { token: i1$2.DomSanitizer }, { token: ChangeService }, { token: i1$1.HttpClient }, { token: TranslationService }], target: i0.ɵɵFactoryTarget.Component });
57456
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.15", type: BookletComponent, isStandalone: true, selector: "lib-booklet", inputs: { bookletId: "bookletId", serv: "serv", tkn: "tkn", bookletJSON: "bookletJSON", allIcons: "allIcons", themeColor: "themeColor", cdnIconURL: "cdnIconURL", dropdownDependentData: "dropdownDependentData", labelValue: "labelValue", token: "token", languageCode: "languageCode", fieldRestrictions: "fieldRestrictions", from: "from", apiUrl: "apiUrl", isEdit: "isEdit", direction: "direction", isLoading: "isLoading", dataBind: "dataBind" }, outputs: { handleBookletActionEvent: "handleBookletActionEvent", handlePage: "handlePage", hadleDropDownDependent: "hadleDropDownDependent", handleCalendarDate: "handleCalendarDate", handleCalendarEvent: "handleCalendarEvent" }, viewQueries: [{ propertyName: "questionbookComponent", first: true, predicate: ["questionbook"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!-- Booklet Handling-->\n<!-- HA 19DEC23 For Direction -->\n<div *ngFor=\"let qb of booklet\" [dir]=\"direction\">\n <!-- MR Commented below code to ensure single JSON for UNCONDITIONAL Booklets -->\n <!-- RS 09DEC24 Changed keys-->\n <!-- <lib-questionnaire [serv]=\"serv\" [qbId]=\"qb.id\" [tkn]=\"tkn\"></lib-questionnaire> -->\n <!-- HA 28DEC23 Below If logic is to load from booklet -->\n <div *ngIf=\"qb.subQuestions; else elseBlock\">\n <div *ngFor=\"let ques of qb.subQuestions\" class=\"questiondiv1\">\n <div>\n <!-- HA 17JAN24 - Is title is enabled so that based on the boolean div will be visible -->\n <div *ngIf=\"ques.isTitle\" [class]=\"qb.isShengel ? 'header-style' : 'question-f-size additional'\">\n <!-- VD 08NOV23 - showing label when its available-->\n <div [innerHTML]=\"getText(ques?.questionText)\" *ngIf=\"ques?.questionText && ques?.style?.showLabel !== false\" >\n {{ (ques.id+'.questionText') | nxtCustomTranslate : ques?.questionText }}\n </div>\n </div> <!-- VD 19JAN24 - getting token as input --> <!--VD 11Jun24 - translation changes-->\n <!--VD 06Sep24 calendar changes-->\n <!-- AP-14MAY25 - Added [dataBind] input binding -->\n <!-- AP-19MAY25 - Added [isEdit] binding --> \n <!-- //MSM10JUL25 allIcons, themeColor, cdnIconURL added for icon-selector-->\n <lib-questionbook [qbItem]=\"qb\" [token]=\"token\"\n [direction] = \"direction\"\n [labelValue]=\"labelValue\"\n [questionItem]=\"ques\"\n [questions]=\"bookQuestionsMap?.get(qb.id)?.subQuestions\"\n (handleDropDown)=\"getDropDown($event)\"\n (handleCalendarDate)=\"getCalendarDate($event)\"\n (handleCalendarEvent)=\"getCalendarEvent($event)\"\n (singleFieldChangeEmit) ='singleFieldChange($event)'\n [dataBind]=\"dataBind\"\n [isEdit]=\"isEdit\" \n [allIcons]=\"allIcons\"\n [themeColor]=\"themeColor\"\n [cdnIconURL]=\"cdnIconURL\"\n [languageCode]=\"languageCode\"\n ></lib-questionbook>\n </div>\n </div>\n </div>\n <!-- HA 28DEC23 Below else logic is to load from books or questions -->\n <ng-template #elseBlock>\n <div class=\"questiondiv1\">\n <div>\n <div *ngIf=\"!qb.isTitle\" [class]=\"qb.isShengel ? 'header-style' : 'question-f-size additional'\">\n <!-- VD 08NOV23 - showing label when its available-->\n <div [innerHTML]=\"getText(qb?.questionText)\" *ngIf=\"qb?.questionText && qb?.style?.showLabel !== false\" >\n {{ (qb.id+'.questionText') | nxtCustomTranslate : qb?.questionText}}\n {{ qb?.title }}\n </div>\n </div> <!-- VD 19JAN24 - getting token as input --> <!-- // VD 11Jun24 - translation changes-->\n <lib-questionbook [qbItem]=\"qb\" [token]=\"token\" [labelValue]=\"labelValue\" [questionItem]=\"qb\" [questions]=\"bookQuestionsMap?.get(qb.id)?.subQuestions\" (handleDropDown)=\"getDropDown($event)\" [languageCode]=\"languageCode\"></lib-questionbook>\n </div>\n </div>\n </ng-template>\n\n <!-- RS 09DEC24 Changed keys-->\n <!-- Group Actions -->\n <!-- HA 19DEC23 For Direction -->\n <!-- AP 23MAY25 - Action Buttons: Dynamically positioned buttons with JSON-configured styles -->\n <div class=\"align-submit-row\" *ngIf=\"abItem?.status != 'Completed'\" [dir]=\"direction\"> <!-- position-relative removed in this tag-->\n <ng-container *ngFor=\"let action of actions; let i = index\">\n <div class=\"action-wrapper\"\n style=\"margin-right: 10px;\"> <!-- style=\"position: absolute; [style.left.%]=\"action.positionPercent || 0\" removed in this tag -->\n @if(!isEdit && action.name === 'Save'){\n <nxt-button\n (buttonClickEmit)=\"editChangeClick(action)\"\n [buttonValue]=\"'EDIT' | nxtCustomTranslate : 'Edit'\"\n [btnBgColor]=\"action.bgColor\"\n [btnTextColor]=\"action.textColor\"\n [btnBorder]=\"action.borderSize\"\n [btnBorderColor]=\"action.borderColor\"\n [btnBorderRadius]=\"action.borderRadius || 4\"\n [btnWidth]=\"action.width || 100\"\n [buttonType]=\"'custom-btn'\"\n [buttonConfig]=\"action?.buttonConfig\" [type]=\"action?.type\"\n [btnIconLeftSrc]=\"action?.btnIconLeftSrc\" [isImageSvg]=\"action?.isImageSvg\"\n >\n </nxt-button>\n }\n @else {\n <nxt-button\n (buttonClickEmit)=\"handleBookletActionClick(action)\" \n [isLoading]=\"isLoading?.includes(action.id)\"\n [buttonValue]=\"(action.id+'.name') | nxtCustomTranslate : action?.name\"\n [btnBgColor]=\"action.bgColor\"\n [btnTextColor]=\"action.textColor\"\n [btnBorder]=\"action.borderSize\"\n [btnBorderColor]=\"action.borderColor\"\n [btnBorderRadius]=\"action.borderRadius || 4\"\n [btnWidth]=\"action.width || 100\"\n [buttonType]=\"'custom-btn'\"\n [buttonConfig]=\"action?.buttonConfig\" [type]=\"action?.type\"\n [btnIconLeftSrc]=\"action?.btnIconLeftSrc\" [isImageSvg]=\"action?.isImageSvg\"\n >\n </nxt-button>\n }\n </div>\n </ng-container>\n </div>\n</div>", styles: [".align-submit-row{display:flex}.header-style{padding:15px;background:#f8f8f8;color:#898989;border:1px solid #e8e8e8;border-top-left-radius:5px;border-top-right-radius:5px;margin-left:0;justify-content:left;font-size:15px}.rtl{flex-direction:row-reverse}.action-btn{width:100%;height:40px;transition:all .3s ease}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: QuestionbookComponent, selector: "lib-questionbook", inputs: ["qbItem", "questionItem", "questions", "errorFieldId", "labelValue", "token", "isEdit", "dropDownData", "dataBind", "allIcons", "themeColor", "cdnIconURL", "direction", "languageCode"], outputs: ["handleDropDown", "handleQuestion", "singleFieldChangeEmit", "hadleDropDownDependent", "handleCalendarDate", "handleCalendarEvent"] }, { kind: "pipe", type: NxtCustomTranslatePipe, name: "nxtCustomTranslate" }, { kind: "component", type: NxtButtonComponent, selector: "nxt-button", inputs: ["buttonValue", "buttonType", "type", "buttonDisable", "btnBgColor", "btnBorder", "btnBorderRadius", "btnBorderColor", "btnTextColor", "btnHeight", "btnWidth", "btnIconLeftSrc", "btnIconRightSrc", "btnHoverBgColor", "btnHoverTextColor", "btnId", "dataDismiss", "modalToTrigger", "isImageSvg", "tabIndex", "buttonConfig", "mode", "languageCode", "isLoading"], outputs: ["buttonClickEmit"] }] });
57459
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.15", type: BookletComponent, isStandalone: true, selector: "lib-booklet", inputs: { bookletId: "bookletId", serv: "serv", tkn: "tkn", bookletJSON: "bookletJSON", allIcons: "allIcons", themeColor: "themeColor", cdnIconURL: "cdnIconURL", dropdownDependentData: "dropdownDependentData", labelValue: "labelValue", token: "token", languageCode: "languageCode", fieldRestrictions: "fieldRestrictions", from: "from", apiUrl: "apiUrl", isEdit: "isEdit", direction: "direction", isLoading: "isLoading", dataBind: "dataBind" }, outputs: { handleBookletActionEvent: "handleBookletActionEvent", handlePage: "handlePage", hadleDropDownDependent: "hadleDropDownDependent", handleCalendarDate: "handleCalendarDate", handleCalendarEvent: "handleCalendarEvent" }, viewQueries: [{ propertyName: "questionbookComponent", first: true, predicate: ["questionbook"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!-- Booklet Handling-->\n<!-- HA 19DEC23 For Direction -->\n<div *ngFor=\"let qb of booklet\" [dir]=\"direction\">\n <!-- MR Commented below code to ensure single JSON for UNCONDITIONAL Booklets -->\n <!-- RS 09DEC24 Changed keys-->\n <!-- <lib-questionnaire [serv]=\"serv\" [qbId]=\"qb.id\" [tkn]=\"tkn\"></lib-questionnaire> -->\n <!-- HA 28DEC23 Below If logic is to load from booklet -->\n <div *ngIf=\"qb.subQuestions; else elseBlock\">\n <div *ngFor=\"let ques of qb.subQuestions\" class=\"questiondiv1\">\n <div>\n <!-- HA 17JAN24 - Is title is enabled so that based on the boolean div will be visible -->\n <div *ngIf=\"ques.isTitle\" [class]=\"qb.isShengel ? 'header-style' : 'question-f-size additional'\">\n <!-- VD 08NOV23 - showing label when its available-->\n <div [innerHTML]=\"getText(ques?.questionText)\" *ngIf=\"ques?.questionText && ques?.style?.showLabel !== false\" >\n {{ (ques.id+'.questionText') | nxtCustomTranslate : ques?.questionText }}\n </div>\n </div> <!-- VD 19JAN24 - getting token as input --> <!--VD 11Jun24 - translation changes-->\n <!--VD 06Sep24 calendar changes-->\n <!-- AP-14MAY25 - Added [dataBind] input binding -->\n <!-- AP-19MAY25 - Added [isEdit] binding --> \n <!-- //MSM10JUL25 allIcons, themeColor, cdnIconURL added for icon-selector-->\n <lib-questionbook [qbItem]=\"qb\" [token]=\"token\"\n [direction] = \"direction\"\n [labelValue]=\"labelValue\"\n [questionItem]=\"ques\"\n [questions]=\"bookQuestionsMap?.get(qb.id)?.subQuestions\"\n (handleDropDown)=\"getDropDown($event)\"\n (handleCalendarDate)=\"getCalendarDate($event)\"\n (handleCalendarEvent)=\"getCalendarEvent($event)\"\n (singleFieldChangeEmit) ='singleFieldChange($event)'\n [dataBind]=\"dataBind\"\n [isEdit]=\"isEdit\" \n [allIcons]=\"allIcons\"\n [themeColor]=\"themeColor\"\n [cdnIconURL]=\"cdnIconURL\"\n [languageCode]=\"languageCode\"\n >\n </lib-questionbook>\n </div>\n </div>\n </div>\n <!-- HA 28DEC23 Below else logic is to load from books or questions -->\n <ng-template #elseBlock>\n <div class=\"questiondiv1\">\n <div>\n <div *ngIf=\"!qb.isTitle\" [class]=\"qb.isShengel ? 'header-style' : 'question-f-size additional'\">\n <!-- VD 08NOV23 - showing label when its available-->\n <div [innerHTML]=\"getText(qb?.questionText)\" *ngIf=\"qb?.questionText && qb?.style?.showLabel !== false\" >\n {{ (qb.id+'.questionText') | nxtCustomTranslate : qb?.questionText}}\n {{ qb?.title }}\n </div>\n </div> <!-- VD 19JAN24 - getting token as input --> <!-- // VD 11Jun24 - translation changes-->\n <lib-questionbook [qbItem]=\"qb\" [token]=\"token\" [labelValue]=\"labelValue\" [questionItem]=\"qb\" [questions]=\"bookQuestionsMap?.get(qb.id)?.subQuestions\" (handleDropDown)=\"getDropDown($event)\" [languageCode]=\"languageCode\"></lib-questionbook>\n </div>\n </div>\n </ng-template>\n\n <!-- RS 09DEC24 Changed keys-->\n <!-- Group Actions -->\n <!-- HA 19DEC23 For Direction -->\n <!-- AP 23MAY25 - Action Buttons: Dynamically positioned buttons with JSON-configured styles -->\n <div class=\"align-submit-row\" *ngIf=\"abItem?.status != 'Completed'\" [dir]=\"direction\"> <!-- position-relative removed in this tag-->\n <ng-container *ngFor=\"let action of actions; let i = index\">\n <div class=\"action-wrapper\"\n style=\"margin-right: 10px;\"> <!-- style=\"position: absolute; [style.left.%]=\"action.positionPercent || 0\" removed in this tag -->\n @if(!isEdit && action.name === 'Save'){\n <nxt-button\n (buttonClickEmit)=\"editChangeClick(action)\"\n [buttonValue]=\"'EDIT' | nxtCustomTranslate : 'Edit'\"\n [btnBgColor]=\"action.bgColor\"\n [btnTextColor]=\"action.textColor\"\n [btnBorder]=\"action.borderSize\"\n [btnBorderColor]=\"action.borderColor\"\n [btnBorderRadius]=\"action.borderRadius || 4\"\n [btnWidth]=\"action.width || 100\"\n [buttonType]=\"'custom-btn'\"\n [buttonConfig]=\"action?.buttonConfig\" [type]=\"action?.type\"\n [btnIconLeftSrc]=\"action?.btnIconLeftSrc\" [isImageSvg]=\"action?.isImageSvg\"\n >\n </nxt-button>\n }\n @else {\n <nxt-button\n (buttonClickEmit)=\"handleBookletActionClick(action)\" \n [isLoading]=\"isLoading?.includes(action.id)\"\n [buttonValue]=\"(action.id+'.name') | nxtCustomTranslate : action?.name\"\n [btnBgColor]=\"action.bgColor\"\n [btnTextColor]=\"action.textColor\"\n [btnBorder]=\"action.borderSize\"\n [btnBorderColor]=\"action.borderColor\"\n [btnBorderRadius]=\"action.borderRadius || 4\"\n [btnWidth]=\"action.width || 100\"\n [buttonType]=\"'custom-btn'\"\n [buttonConfig]=\"action?.buttonConfig\" [type]=\"action?.type\"\n [btnIconLeftSrc]=\"action?.btnIconLeftSrc\" [isImageSvg]=\"action?.isImageSvg\"\n >\n </nxt-button>\n }\n </div>\n </ng-container>\n </div>\n</div>", styles: [".align-submit-row{display:flex}.header-style{padding:15px;background:#f8f8f8;color:#898989;border:1px solid #e8e8e8;border-top-left-radius:5px;border-top-right-radius:5px;margin-left:0;justify-content:left;font-size:15px}.rtl{flex-direction:row-reverse}.action-btn{width:100%;height:40px;transition:all .3s ease}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: QuestionbookComponent, selector: "lib-questionbook", inputs: ["qbItem", "questionItem", "questions", "errorFieldId", "labelValue", "token", "isEdit", "dropDownData", "dataBind", "allIcons", "themeColor", "cdnIconURL", "direction", "languageCode"], outputs: ["handleDropDown", "handleQuestion", "singleFieldChangeEmit", "hadleDropDownDependent", "handleCalendarDate", "handleCalendarEvent"] }, { kind: "pipe", type: NxtCustomTranslatePipe, name: "nxtCustomTranslate" }, { kind: "component", type: NxtButtonComponent, selector: "nxt-button", inputs: ["buttonValue", "buttonType", "type", "buttonDisable", "btnBgColor", "btnBorder", "btnBorderRadius", "btnBorderColor", "btnTextColor", "btnHeight", "btnWidth", "btnIconLeftSrc", "btnIconRightSrc", "btnHoverBgColor", "btnHoverTextColor", "btnId", "dataDismiss", "modalToTrigger", "isImageSvg", "tabIndex", "buttonConfig", "mode", "languageCode", "isLoading"], outputs: ["buttonClickEmit"] }] });
57457
57460
  }
57458
57461
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: BookletComponent, decorators: [{
57459
57462
  type: Component,
@@ -57463,7 +57466,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
57463
57466
  QuestionbookComponent,
57464
57467
  NxtCustomTranslatePipe,
57465
57468
  NxtButtonComponent
57466
- ], template: "<!-- Booklet Handling-->\n<!-- HA 19DEC23 For Direction -->\n<div *ngFor=\"let qb of booklet\" [dir]=\"direction\">\n <!-- MR Commented below code to ensure single JSON for UNCONDITIONAL Booklets -->\n <!-- RS 09DEC24 Changed keys-->\n <!-- <lib-questionnaire [serv]=\"serv\" [qbId]=\"qb.id\" [tkn]=\"tkn\"></lib-questionnaire> -->\n <!-- HA 28DEC23 Below If logic is to load from booklet -->\n <div *ngIf=\"qb.subQuestions; else elseBlock\">\n <div *ngFor=\"let ques of qb.subQuestions\" class=\"questiondiv1\">\n <div>\n <!-- HA 17JAN24 - Is title is enabled so that based on the boolean div will be visible -->\n <div *ngIf=\"ques.isTitle\" [class]=\"qb.isShengel ? 'header-style' : 'question-f-size additional'\">\n <!-- VD 08NOV23 - showing label when its available-->\n <div [innerHTML]=\"getText(ques?.questionText)\" *ngIf=\"ques?.questionText && ques?.style?.showLabel !== false\" >\n {{ (ques.id+'.questionText') | nxtCustomTranslate : ques?.questionText }}\n </div>\n </div> <!-- VD 19JAN24 - getting token as input --> <!--VD 11Jun24 - translation changes-->\n <!--VD 06Sep24 calendar changes-->\n <!-- AP-14MAY25 - Added [dataBind] input binding -->\n <!-- AP-19MAY25 - Added [isEdit] binding --> \n <!-- //MSM10JUL25 allIcons, themeColor, cdnIconURL added for icon-selector-->\n <lib-questionbook [qbItem]=\"qb\" [token]=\"token\"\n [direction] = \"direction\"\n [labelValue]=\"labelValue\"\n [questionItem]=\"ques\"\n [questions]=\"bookQuestionsMap?.get(qb.id)?.subQuestions\"\n (handleDropDown)=\"getDropDown($event)\"\n (handleCalendarDate)=\"getCalendarDate($event)\"\n (handleCalendarEvent)=\"getCalendarEvent($event)\"\n (singleFieldChangeEmit) ='singleFieldChange($event)'\n [dataBind]=\"dataBind\"\n [isEdit]=\"isEdit\" \n [allIcons]=\"allIcons\"\n [themeColor]=\"themeColor\"\n [cdnIconURL]=\"cdnIconURL\"\n [languageCode]=\"languageCode\"\n ></lib-questionbook>\n </div>\n </div>\n </div>\n <!-- HA 28DEC23 Below else logic is to load from books or questions -->\n <ng-template #elseBlock>\n <div class=\"questiondiv1\">\n <div>\n <div *ngIf=\"!qb.isTitle\" [class]=\"qb.isShengel ? 'header-style' : 'question-f-size additional'\">\n <!-- VD 08NOV23 - showing label when its available-->\n <div [innerHTML]=\"getText(qb?.questionText)\" *ngIf=\"qb?.questionText && qb?.style?.showLabel !== false\" >\n {{ (qb.id+'.questionText') | nxtCustomTranslate : qb?.questionText}}\n {{ qb?.title }}\n </div>\n </div> <!-- VD 19JAN24 - getting token as input --> <!-- // VD 11Jun24 - translation changes-->\n <lib-questionbook [qbItem]=\"qb\" [token]=\"token\" [labelValue]=\"labelValue\" [questionItem]=\"qb\" [questions]=\"bookQuestionsMap?.get(qb.id)?.subQuestions\" (handleDropDown)=\"getDropDown($event)\" [languageCode]=\"languageCode\"></lib-questionbook>\n </div>\n </div>\n </ng-template>\n\n <!-- RS 09DEC24 Changed keys-->\n <!-- Group Actions -->\n <!-- HA 19DEC23 For Direction -->\n <!-- AP 23MAY25 - Action Buttons: Dynamically positioned buttons with JSON-configured styles -->\n <div class=\"align-submit-row\" *ngIf=\"abItem?.status != 'Completed'\" [dir]=\"direction\"> <!-- position-relative removed in this tag-->\n <ng-container *ngFor=\"let action of actions; let i = index\">\n <div class=\"action-wrapper\"\n style=\"margin-right: 10px;\"> <!-- style=\"position: absolute; [style.left.%]=\"action.positionPercent || 0\" removed in this tag -->\n @if(!isEdit && action.name === 'Save'){\n <nxt-button\n (buttonClickEmit)=\"editChangeClick(action)\"\n [buttonValue]=\"'EDIT' | nxtCustomTranslate : 'Edit'\"\n [btnBgColor]=\"action.bgColor\"\n [btnTextColor]=\"action.textColor\"\n [btnBorder]=\"action.borderSize\"\n [btnBorderColor]=\"action.borderColor\"\n [btnBorderRadius]=\"action.borderRadius || 4\"\n [btnWidth]=\"action.width || 100\"\n [buttonType]=\"'custom-btn'\"\n [buttonConfig]=\"action?.buttonConfig\" [type]=\"action?.type\"\n [btnIconLeftSrc]=\"action?.btnIconLeftSrc\" [isImageSvg]=\"action?.isImageSvg\"\n >\n </nxt-button>\n }\n @else {\n <nxt-button\n (buttonClickEmit)=\"handleBookletActionClick(action)\" \n [isLoading]=\"isLoading?.includes(action.id)\"\n [buttonValue]=\"(action.id+'.name') | nxtCustomTranslate : action?.name\"\n [btnBgColor]=\"action.bgColor\"\n [btnTextColor]=\"action.textColor\"\n [btnBorder]=\"action.borderSize\"\n [btnBorderColor]=\"action.borderColor\"\n [btnBorderRadius]=\"action.borderRadius || 4\"\n [btnWidth]=\"action.width || 100\"\n [buttonType]=\"'custom-btn'\"\n [buttonConfig]=\"action?.buttonConfig\" [type]=\"action?.type\"\n [btnIconLeftSrc]=\"action?.btnIconLeftSrc\" [isImageSvg]=\"action?.isImageSvg\"\n >\n </nxt-button>\n }\n </div>\n </ng-container>\n </div>\n</div>", styles: [".align-submit-row{display:flex}.header-style{padding:15px;background:#f8f8f8;color:#898989;border:1px solid #e8e8e8;border-top-left-radius:5px;border-top-right-radius:5px;margin-left:0;justify-content:left;font-size:15px}.rtl{flex-direction:row-reverse}.action-btn{width:100%;height:40px;transition:all .3s ease}\n"] }]
57469
+ ], template: "<!-- Booklet Handling-->\n<!-- HA 19DEC23 For Direction -->\n<div *ngFor=\"let qb of booklet\" [dir]=\"direction\">\n <!-- MR Commented below code to ensure single JSON for UNCONDITIONAL Booklets -->\n <!-- RS 09DEC24 Changed keys-->\n <!-- <lib-questionnaire [serv]=\"serv\" [qbId]=\"qb.id\" [tkn]=\"tkn\"></lib-questionnaire> -->\n <!-- HA 28DEC23 Below If logic is to load from booklet -->\n <div *ngIf=\"qb.subQuestions; else elseBlock\">\n <div *ngFor=\"let ques of qb.subQuestions\" class=\"questiondiv1\">\n <div>\n <!-- HA 17JAN24 - Is title is enabled so that based on the boolean div will be visible -->\n <div *ngIf=\"ques.isTitle\" [class]=\"qb.isShengel ? 'header-style' : 'question-f-size additional'\">\n <!-- VD 08NOV23 - showing label when its available-->\n <div [innerHTML]=\"getText(ques?.questionText)\" *ngIf=\"ques?.questionText && ques?.style?.showLabel !== false\" >\n {{ (ques.id+'.questionText') | nxtCustomTranslate : ques?.questionText }}\n </div>\n </div> <!-- VD 19JAN24 - getting token as input --> <!--VD 11Jun24 - translation changes-->\n <!--VD 06Sep24 calendar changes-->\n <!-- AP-14MAY25 - Added [dataBind] input binding -->\n <!-- AP-19MAY25 - Added [isEdit] binding --> \n <!-- //MSM10JUL25 allIcons, themeColor, cdnIconURL added for icon-selector-->\n <lib-questionbook [qbItem]=\"qb\" [token]=\"token\"\n [direction] = \"direction\"\n [labelValue]=\"labelValue\"\n [questionItem]=\"ques\"\n [questions]=\"bookQuestionsMap?.get(qb.id)?.subQuestions\"\n (handleDropDown)=\"getDropDown($event)\"\n (handleCalendarDate)=\"getCalendarDate($event)\"\n (handleCalendarEvent)=\"getCalendarEvent($event)\"\n (singleFieldChangeEmit) ='singleFieldChange($event)'\n [dataBind]=\"dataBind\"\n [isEdit]=\"isEdit\" \n [allIcons]=\"allIcons\"\n [themeColor]=\"themeColor\"\n [cdnIconURL]=\"cdnIconURL\"\n [languageCode]=\"languageCode\"\n >\n </lib-questionbook>\n </div>\n </div>\n </div>\n <!-- HA 28DEC23 Below else logic is to load from books or questions -->\n <ng-template #elseBlock>\n <div class=\"questiondiv1\">\n <div>\n <div *ngIf=\"!qb.isTitle\" [class]=\"qb.isShengel ? 'header-style' : 'question-f-size additional'\">\n <!-- VD 08NOV23 - showing label when its available-->\n <div [innerHTML]=\"getText(qb?.questionText)\" *ngIf=\"qb?.questionText && qb?.style?.showLabel !== false\" >\n {{ (qb.id+'.questionText') | nxtCustomTranslate : qb?.questionText}}\n {{ qb?.title }}\n </div>\n </div> <!-- VD 19JAN24 - getting token as input --> <!-- // VD 11Jun24 - translation changes-->\n <lib-questionbook [qbItem]=\"qb\" [token]=\"token\" [labelValue]=\"labelValue\" [questionItem]=\"qb\" [questions]=\"bookQuestionsMap?.get(qb.id)?.subQuestions\" (handleDropDown)=\"getDropDown($event)\" [languageCode]=\"languageCode\"></lib-questionbook>\n </div>\n </div>\n </ng-template>\n\n <!-- RS 09DEC24 Changed keys-->\n <!-- Group Actions -->\n <!-- HA 19DEC23 For Direction -->\n <!-- AP 23MAY25 - Action Buttons: Dynamically positioned buttons with JSON-configured styles -->\n <div class=\"align-submit-row\" *ngIf=\"abItem?.status != 'Completed'\" [dir]=\"direction\"> <!-- position-relative removed in this tag-->\n <ng-container *ngFor=\"let action of actions; let i = index\">\n <div class=\"action-wrapper\"\n style=\"margin-right: 10px;\"> <!-- style=\"position: absolute; [style.left.%]=\"action.positionPercent || 0\" removed in this tag -->\n @if(!isEdit && action.name === 'Save'){\n <nxt-button\n (buttonClickEmit)=\"editChangeClick(action)\"\n [buttonValue]=\"'EDIT' | nxtCustomTranslate : 'Edit'\"\n [btnBgColor]=\"action.bgColor\"\n [btnTextColor]=\"action.textColor\"\n [btnBorder]=\"action.borderSize\"\n [btnBorderColor]=\"action.borderColor\"\n [btnBorderRadius]=\"action.borderRadius || 4\"\n [btnWidth]=\"action.width || 100\"\n [buttonType]=\"'custom-btn'\"\n [buttonConfig]=\"action?.buttonConfig\" [type]=\"action?.type\"\n [btnIconLeftSrc]=\"action?.btnIconLeftSrc\" [isImageSvg]=\"action?.isImageSvg\"\n >\n </nxt-button>\n }\n @else {\n <nxt-button\n (buttonClickEmit)=\"handleBookletActionClick(action)\" \n [isLoading]=\"isLoading?.includes(action.id)\"\n [buttonValue]=\"(action.id+'.name') | nxtCustomTranslate : action?.name\"\n [btnBgColor]=\"action.bgColor\"\n [btnTextColor]=\"action.textColor\"\n [btnBorder]=\"action.borderSize\"\n [btnBorderColor]=\"action.borderColor\"\n [btnBorderRadius]=\"action.borderRadius || 4\"\n [btnWidth]=\"action.width || 100\"\n [buttonType]=\"'custom-btn'\"\n [buttonConfig]=\"action?.buttonConfig\" [type]=\"action?.type\"\n [btnIconLeftSrc]=\"action?.btnIconLeftSrc\" [isImageSvg]=\"action?.isImageSvg\"\n >\n </nxt-button>\n }\n </div>\n </ng-container>\n </div>\n</div>", styles: [".align-submit-row{display:flex}.header-style{padding:15px;background:#f8f8f8;color:#898989;border:1px solid #e8e8e8;border-top-left-radius:5px;border-top-right-radius:5px;margin-left:0;justify-content:left;font-size:15px}.rtl{flex-direction:row-reverse}.action-btn{width:100%;height:40px;transition:all .3s ease}\n"] }]
57467
57470
  }], ctorParameters: () => [{ type: SalesforceService }, { type: DataService }, { type: StorageService }, { type: i1$2.DomSanitizer }, { type: ChangeService }, { type: i1$1.HttpClient }, { type: TranslationService }], propDecorators: { bookletId: [{
57468
57471
  type: Input
57469
57472
  }], serv: [{
@@ -57526,7 +57529,7 @@ const VERSION = {
57526
57529
  "semver": null,
57527
57530
  "suffix": "09440148-dirty",
57528
57531
  "semverString": null,
57529
- "version": "2.1.279"
57532
+ "version": "2.1.281"
57530
57533
  };
57531
57534
  /* tslint:enable */
57532
57535
 
@@ -57760,11 +57763,11 @@ class FormulaInputComponent {
57760
57763
  }
57761
57764
  }
57762
57765
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: FormulaInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
57763
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.15", type: FormulaInputComponent, isStandalone: true, selector: "app-formula-input", inputs: { attributes: "attributes", initialFormula: "initialFormula" }, outputs: { formulaChange: "formulaChange", formulaValidation: "formulaValidation" }, viewQueries: [{ propertyName: "formulaInputRef", first: true, predicate: ["formulaInput"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"risk-formula-builder\">\n <!--SKS16SEP25 Formula Input Area -->\n <div class=\"formula-container\">\n <div class=\"formula-input-area\" [class.has-content]=\"formulaTokens.length > 0\">\n <div class=\"formula-tokens\" #formulaDisplay (click)=\"focusInput()\">\n <div class=\"token\" \n *ngFor=\"let token of formulaTokens; let i = index\"\n [class.attribute]=\"token.type === 'attribute'\"\n [class.operation]=\"token.type === 'operation'\"\n [class.text]=\"token.type === 'text'\">\n <span class=\"token-content\">{{ token.label || token.value }}</span>\n <button class=\"token-remove\" \n (click)=\"removeToken(i)\" \n *ngIf=\"token.type === 'attribute'\">\n <span class=\"remove-icon\">\u00D7</span>\n </button>\n </div>\n <!--SKS16SEP25 Hidden input to capture numbers -->\n <input #formulaInput \n class=\"hidden-input\"\n [(ngModel)]=\"currentInput\"\n (keydown)=\"onKeyDown($event)\"\n (blur)=\"commitNumber()\"\n placeholder=\"Start typing or click attributes below...\">\n </div>\n </div>\n\n <!-- SKS16SEP25 Action Buttons -->\n <div class=\"action-buttons\">\n <button class=\"btn btn-secondary\" (click)=\"resetFormula()\">Reset</button>\n <!-- <button class=\"btn btn-primary\" (click)=\"validateFormula()\" [disabled]=\"formulaTokens.length === 0\">\n VALIDATE\n </button> -->\n </div>\n </div>\n <!-- SKS16SEP25 Content Area -->\n <div class=\"content-area\">\n <!-- Attributes Section -->\n <div class=\"attributes-section\">\n <h4>Attributes <span class=\"required\">*</span></h4>\n <div class=\"attributes-list\">\n <div class=\"attribute-item\" \n *ngFor=\"let attribute of attributes\"\n (click)=\"addAttribute(attribute)\">\n <span class=\"attribute-apiName\">{{ attribute.label }}</span>\n <span class=\"attribute-type\" *ngIf=\"attribute.type\">({{ attribute.type }})</span>\n </div>\n </div>\n </div>\n\n <!-- SKS16SEP25 Operations Section -->\n <div class=\"operations-section\">\n <h4>Operation</h4>\n <div class=\"operations-grid\">\n <button class=\"operation-btn\" \n *ngFor=\"let operation of operations\"\n (click)=\"addOperation(operation)\"\n [title]=\"operation.title\">\n {{ operation.symbol }}\n </button>\n </div>\n </div>\n </div>\n\n <!-- Validation Message -->\n <div class=\"validation-message\" *ngIf=\"validationMessage\" [class.error]=\"isValidationError\">\n {{ validationMessage }}\n </div>\n </div>", styles: [".risk-formula-builder{width:100%;max-width:1200px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;background:#fff;border-radius:8px;padding:5px;box-shadow:0 2px 8px #0000001a}.required{color:#e74c3c}.subtitle{margin:0;font-size:14px;color:#666;line-height:1.4}.formula-container{position:relative;margin-bottom:5px}.formula-input-area{border:2px solid #e1e5e9;border-radius:6px;padding:5px;background:#fff;position:relative;cursor:text;transition:border-color .2s ease}.formula-input-area:hover{border-color:#c1c7cd}.formula-input-area:focus-within{border-color:#4a90e2;box-shadow:0 0 0 3px #4a90e21a}.formula-tokens{display:flex;flex-wrap:wrap;align-items:center;gap:8px;min-height:24px}.token{display:inline-flex;align-items:center;border-radius:20px;padding:5px;font-size:14px;position:relative;transition:all .2s ease}.token.attribute{background-color:#f0f4f8;color:#2d3748;border:1px solid #cbd5e0;padding-right:8px}.token.operation{color:#4a5568;font-weight:600;padding:0;text-align:center;justify-content:center}.token.text{color:#4a5568;background:transparent;padding:4px 0}.token-content{display:inline-block}.token-remove{background:none;border:none;color:#a0aec0;cursor:pointer;padding:0;margin-left:6px;width:18px;height:18px;border-radius:50%;display:flex;align-items:center;justify-content:center;transition:all .2s ease}.token-remove:hover{background-color:#e53e3e;color:#fff}.remove-icon{font-size:14px;line-height:1}.hidden-input{border:none;outline:none;background:transparent;font-size:14px;color:#4a5568;min-width:200px;padding:4px 0}.hidden-input::placeholder{color:#a0aec0}.btn{padding:5px;border-radius:2px;font-size:10px;font-weight:400;cursor:pointer;transition:all .2s ease;border:1px solid}.btn:disabled{opacity:.6;cursor:not-allowed}.btn-secondary{background:#fff;color:#718096;border-color:#e2e8f0}.btn-secondary:hover:not(:disabled){background-color:#f7fafc;border-color:#cbd5e0}.btn-primary{background:#4a90e2;color:#fff;border-color:#4a90e2}.btn-primary:hover:not(:disabled){background:#357abd;border-color:#357abd}.content-area{display:grid;grid-template-columns:1fr 1fr;gap:5px}.attributes-section h4,.operations-section h4{margin:0 0 5px;font-size:16px;font-weight:600;color:#2d3748}.attributes-list{display:flex;flex-direction:column;gap:5px;overflow-y:auto;height:150px}.attribute-item{padding:5px;border:1px solid #e2e8f0;border-radius:6px;cursor:pointer;transition:all .2s ease;background:#fff;display:flex;align-items:center;justify-content:space-between}.attribute-item:hover:not(.disabled){border-color:#4a90e2;box-shadow:0 2px 4px #4a90e21a;transform:translateY(-1px)}.attribute-item.disabled{opacity:.5;cursor:not-allowed;background-color:#f7fafc}.attribute-name{font-size:14px;color:#2d3748;font-weight:500}.attribute-type{font-size:12px;color:#718096}.operations-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:5px}.operation-btn{border:1px solid #e2e8f0;border-radius:6px;background:#fff;color:#2d3748;font-size:14px;cursor:pointer;transition:all .2s ease;display:flex;align-items:center;justify-content:center}.operation-btn:hover{border-color:#4a90e2;box-shadow:0 2px 4px #4a90e226;transform:translateY(-1px)}.operation-btn:active{transform:translateY(0)}.validation-message{margin-top:16px;padding:12px 16px;border-radius:6px;font-size:14px;font-weight:500;background-color:#f0fff4;color:#38a169;border:1px solid #9ae6b4}.validation-message.error{background-color:#fed7d7;color:#e53e3e;border-color:#feb2b2}.action-buttons{display:flex;justify-content:end;gap:5px;padding-top:5px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: BrowserModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
57766
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.15", type: FormulaInputComponent, isStandalone: true, selector: "app-formula-input", inputs: { attributes: "attributes", initialFormula: "initialFormula" }, outputs: { formulaChange: "formulaChange", formulaValidation: "formulaValidation" }, viewQueries: [{ propertyName: "formulaInputRef", first: true, predicate: ["formulaInput"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"risk-formula-builder\">\n <!--SKS16SEP25 Formula Input Area -->\n <div class=\"formula-container\">\n <div class=\"formula-input-area\" [class.has-content]=\"formulaTokens.length > 0\">\n <div class=\"formula-tokens\" #formulaDisplay (click)=\"focusInput()\">\n <div class=\"token\" \n *ngFor=\"let token of formulaTokens; let i = index\"\n [class.attribute]=\"token.type === 'attribute'\"\n [class.operation]=\"token.type === 'operation'\"\n [class.text]=\"token.type === 'text'\">\n <span class=\"token-content\">{{ token.label || token.value }}</span>\n <button class=\"token-remove\" \n (click)=\"removeToken(i)\" \n *ngIf=\"token.type === 'attribute'\">\n <span class=\"remove-icon\">\u00D7</span>\n </button>\n </div>\n <!--SKS16SEP25 Hidden input to capture numbers -->\n <input #formulaInput \n class=\"hidden-input\"\n [(ngModel)]=\"currentInput\"\n (keydown)=\"onKeyDown($event)\"\n (blur)=\"commitNumber()\"\n placeholder=\"Start typing or click attributes below...\">\n </div>\n </div>\n\n <!-- SKS16SEP25 Action Buttons -->\n <div class=\"action-buttons\">\n <button class=\"btn btn-secondary\" (click)=\"resetFormula()\">Reset</button>\n <!-- <button class=\"btn btn-primary\" (click)=\"validateFormula()\" [disabled]=\"formulaTokens.length === 0\">\n VALIDATE\n </button> -->\n </div>\n </div>\n <!-- SKS16SEP25 Content Area -->\n <div class=\"content-area\">\n <!-- Attributes Section -->\n <div class=\"attributes-section\">\n <h4>Attributes <span class=\"required\">*</span></h4>\n <div class=\"attributes-list\">\n <div class=\"attribute-item\" \n *ngFor=\"let attribute of attributes\"\n (click)=\"addAttribute(attribute)\">\n <span class=\"attribute-apiName\">{{ attribute.label }}</span>\n <span class=\"attribute-type\" *ngIf=\"attribute.type\">({{ attribute.type }})</span>\n </div>\n </div>\n </div>\n\n <!-- SKS16SEP25 Operations Section -->\n <div class=\"operations-section\">\n <h4>Operation</h4>\n <div class=\"operations-grid\">\n <button class=\"operation-btn\" \n *ngFor=\"let operation of operations\"\n (click)=\"addOperation(operation)\"\n [title]=\"operation.title\">\n {{ operation.symbol }}\n </button>\n </div>\n </div>\n </div>\n\n <!-- Validation Message -->\n <div class=\"validation-message\" *ngIf=\"validationMessage\" [class.error]=\"isValidationError\">\n {{ validationMessage }}\n </div>\n </div>", styles: [".risk-formula-builder{width:100%;max-width:1200px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;background:#fff;border-radius:8px;padding:5px;box-shadow:0 2px 8px #0000001a}.required{color:#e74c3c}.subtitle{margin:0;font-size:14px;color:#666;line-height:1.4}.formula-container{position:relative;margin-bottom:5px}.formula-input-area{border:2px solid #e1e5e9;border-radius:6px;padding:5px;background:#fff;position:relative;cursor:text;transition:border-color .2s ease}.formula-input-area:hover{border-color:#c1c7cd}.formula-input-area:focus-within{border-color:#4a90e2;box-shadow:0 0 0 3px #4a90e21a}.formula-tokens{display:flex;flex-wrap:wrap;align-items:center;gap:8px;min-height:24px}.token{display:inline-flex;align-items:center;border-radius:20px;padding:5px;font-size:14px;position:relative;transition:all .2s ease}.token.attribute{background-color:#f0f4f8;color:#2d3748;border:1px solid #cbd5e0;padding-right:8px}.token.operation{color:#4a5568;font-weight:600;padding:0;text-align:center;justify-content:center}.token.text{color:#4a5568;background:transparent;padding:4px 0}.token-content{display:inline-block}.token-remove{background:none;border:none;color:#a0aec0;cursor:pointer;padding:0;margin-left:6px;width:18px;height:18px;border-radius:50%;display:flex;align-items:center;justify-content:center;transition:all .2s ease}.token-remove:hover{background-color:#e53e3e;color:#fff}.remove-icon{font-size:14px;line-height:1}.hidden-input{border:none;outline:none;background:transparent;font-size:14px;color:#4a5568;min-width:200px;padding:4px 0}.hidden-input::placeholder{color:#a0aec0}.btn{padding:5px;border-radius:2px;font-size:10px;font-weight:400;cursor:pointer;transition:all .2s ease;border:1px solid}.btn:disabled{opacity:.6;cursor:not-allowed}.btn-secondary{background:#fff;color:#718096;border-color:#e2e8f0}.btn-secondary:hover:not(:disabled){background-color:#f7fafc;border-color:#cbd5e0}.btn-primary{background:#4a90e2;color:#fff;border-color:#4a90e2}.btn-primary:hover:not(:disabled){background:#357abd;border-color:#357abd}.content-area{display:grid;grid-template-columns:1fr 1fr;gap:5px}.attributes-section h4,.operations-section h4{margin:0 0 5px;font-size:16px;font-weight:600;color:#2d3748}.attributes-list{display:flex;flex-direction:column;gap:5px;overflow-y:auto;height:150px}.attribute-item{padding:5px;border:1px solid #e2e8f0;border-radius:6px;cursor:pointer;transition:all .2s ease;background:#fff;display:flex;align-items:center;justify-content:space-between}.attribute-item:hover:not(.disabled){border-color:#4a90e2;box-shadow:0 2px 4px #4a90e21a;transform:translateY(-1px)}.attribute-item.disabled{opacity:.5;cursor:not-allowed;background-color:#f7fafc}.attribute-name{font-size:14px;color:#2d3748;font-weight:500}.attribute-type{font-size:12px;color:#718096}.operations-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:5px}.operation-btn{border:1px solid #e2e8f0;border-radius:6px;background:#fff;color:#2d3748;font-size:14px;cursor:pointer;transition:all .2s ease;display:flex;align-items:center;justify-content:center}.operation-btn:hover{border-color:#4a90e2;box-shadow:0 2px 4px #4a90e226;transform:translateY(-1px)}.operation-btn:active{transform:translateY(0)}.validation-message{margin-top:16px;padding:12px 16px;border-radius:6px;font-size:14px;font-weight:500;background-color:#f0fff4;color:#38a169;border:1px solid #9ae6b4}.validation-message.error{background-color:#fed7d7;color:#e53e3e;border-color:#feb2b2}.action-buttons{display:flex;justify-content:end;gap:5px;padding-top:5px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
57764
57767
  }
57765
57768
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: FormulaInputComponent, decorators: [{
57766
57769
  type: Component,
57767
- args: [{ selector: 'app-formula-input', imports: [CommonModule, BrowserModule, FormsModule], template: "<div class=\"risk-formula-builder\">\n <!--SKS16SEP25 Formula Input Area -->\n <div class=\"formula-container\">\n <div class=\"formula-input-area\" [class.has-content]=\"formulaTokens.length > 0\">\n <div class=\"formula-tokens\" #formulaDisplay (click)=\"focusInput()\">\n <div class=\"token\" \n *ngFor=\"let token of formulaTokens; let i = index\"\n [class.attribute]=\"token.type === 'attribute'\"\n [class.operation]=\"token.type === 'operation'\"\n [class.text]=\"token.type === 'text'\">\n <span class=\"token-content\">{{ token.label || token.value }}</span>\n <button class=\"token-remove\" \n (click)=\"removeToken(i)\" \n *ngIf=\"token.type === 'attribute'\">\n <span class=\"remove-icon\">\u00D7</span>\n </button>\n </div>\n <!--SKS16SEP25 Hidden input to capture numbers -->\n <input #formulaInput \n class=\"hidden-input\"\n [(ngModel)]=\"currentInput\"\n (keydown)=\"onKeyDown($event)\"\n (blur)=\"commitNumber()\"\n placeholder=\"Start typing or click attributes below...\">\n </div>\n </div>\n\n <!-- SKS16SEP25 Action Buttons -->\n <div class=\"action-buttons\">\n <button class=\"btn btn-secondary\" (click)=\"resetFormula()\">Reset</button>\n <!-- <button class=\"btn btn-primary\" (click)=\"validateFormula()\" [disabled]=\"formulaTokens.length === 0\">\n VALIDATE\n </button> -->\n </div>\n </div>\n <!-- SKS16SEP25 Content Area -->\n <div class=\"content-area\">\n <!-- Attributes Section -->\n <div class=\"attributes-section\">\n <h4>Attributes <span class=\"required\">*</span></h4>\n <div class=\"attributes-list\">\n <div class=\"attribute-item\" \n *ngFor=\"let attribute of attributes\"\n (click)=\"addAttribute(attribute)\">\n <span class=\"attribute-apiName\">{{ attribute.label }}</span>\n <span class=\"attribute-type\" *ngIf=\"attribute.type\">({{ attribute.type }})</span>\n </div>\n </div>\n </div>\n\n <!-- SKS16SEP25 Operations Section -->\n <div class=\"operations-section\">\n <h4>Operation</h4>\n <div class=\"operations-grid\">\n <button class=\"operation-btn\" \n *ngFor=\"let operation of operations\"\n (click)=\"addOperation(operation)\"\n [title]=\"operation.title\">\n {{ operation.symbol }}\n </button>\n </div>\n </div>\n </div>\n\n <!-- Validation Message -->\n <div class=\"validation-message\" *ngIf=\"validationMessage\" [class.error]=\"isValidationError\">\n {{ validationMessage }}\n </div>\n </div>", styles: [".risk-formula-builder{width:100%;max-width:1200px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;background:#fff;border-radius:8px;padding:5px;box-shadow:0 2px 8px #0000001a}.required{color:#e74c3c}.subtitle{margin:0;font-size:14px;color:#666;line-height:1.4}.formula-container{position:relative;margin-bottom:5px}.formula-input-area{border:2px solid #e1e5e9;border-radius:6px;padding:5px;background:#fff;position:relative;cursor:text;transition:border-color .2s ease}.formula-input-area:hover{border-color:#c1c7cd}.formula-input-area:focus-within{border-color:#4a90e2;box-shadow:0 0 0 3px #4a90e21a}.formula-tokens{display:flex;flex-wrap:wrap;align-items:center;gap:8px;min-height:24px}.token{display:inline-flex;align-items:center;border-radius:20px;padding:5px;font-size:14px;position:relative;transition:all .2s ease}.token.attribute{background-color:#f0f4f8;color:#2d3748;border:1px solid #cbd5e0;padding-right:8px}.token.operation{color:#4a5568;font-weight:600;padding:0;text-align:center;justify-content:center}.token.text{color:#4a5568;background:transparent;padding:4px 0}.token-content{display:inline-block}.token-remove{background:none;border:none;color:#a0aec0;cursor:pointer;padding:0;margin-left:6px;width:18px;height:18px;border-radius:50%;display:flex;align-items:center;justify-content:center;transition:all .2s ease}.token-remove:hover{background-color:#e53e3e;color:#fff}.remove-icon{font-size:14px;line-height:1}.hidden-input{border:none;outline:none;background:transparent;font-size:14px;color:#4a5568;min-width:200px;padding:4px 0}.hidden-input::placeholder{color:#a0aec0}.btn{padding:5px;border-radius:2px;font-size:10px;font-weight:400;cursor:pointer;transition:all .2s ease;border:1px solid}.btn:disabled{opacity:.6;cursor:not-allowed}.btn-secondary{background:#fff;color:#718096;border-color:#e2e8f0}.btn-secondary:hover:not(:disabled){background-color:#f7fafc;border-color:#cbd5e0}.btn-primary{background:#4a90e2;color:#fff;border-color:#4a90e2}.btn-primary:hover:not(:disabled){background:#357abd;border-color:#357abd}.content-area{display:grid;grid-template-columns:1fr 1fr;gap:5px}.attributes-section h4,.operations-section h4{margin:0 0 5px;font-size:16px;font-weight:600;color:#2d3748}.attributes-list{display:flex;flex-direction:column;gap:5px;overflow-y:auto;height:150px}.attribute-item{padding:5px;border:1px solid #e2e8f0;border-radius:6px;cursor:pointer;transition:all .2s ease;background:#fff;display:flex;align-items:center;justify-content:space-between}.attribute-item:hover:not(.disabled){border-color:#4a90e2;box-shadow:0 2px 4px #4a90e21a;transform:translateY(-1px)}.attribute-item.disabled{opacity:.5;cursor:not-allowed;background-color:#f7fafc}.attribute-name{font-size:14px;color:#2d3748;font-weight:500}.attribute-type{font-size:12px;color:#718096}.operations-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:5px}.operation-btn{border:1px solid #e2e8f0;border-radius:6px;background:#fff;color:#2d3748;font-size:14px;cursor:pointer;transition:all .2s ease;display:flex;align-items:center;justify-content:center}.operation-btn:hover{border-color:#4a90e2;box-shadow:0 2px 4px #4a90e226;transform:translateY(-1px)}.operation-btn:active{transform:translateY(0)}.validation-message{margin-top:16px;padding:12px 16px;border-radius:6px;font-size:14px;font-weight:500;background-color:#f0fff4;color:#38a169;border:1px solid #9ae6b4}.validation-message.error{background-color:#fed7d7;color:#e53e3e;border-color:#feb2b2}.action-buttons{display:flex;justify-content:end;gap:5px;padding-top:5px}\n"] }]
57770
+ args: [{ selector: 'app-formula-input', imports: [CommonModule, FormsModule], template: "<div class=\"risk-formula-builder\">\n <!--SKS16SEP25 Formula Input Area -->\n <div class=\"formula-container\">\n <div class=\"formula-input-area\" [class.has-content]=\"formulaTokens.length > 0\">\n <div class=\"formula-tokens\" #formulaDisplay (click)=\"focusInput()\">\n <div class=\"token\" \n *ngFor=\"let token of formulaTokens; let i = index\"\n [class.attribute]=\"token.type === 'attribute'\"\n [class.operation]=\"token.type === 'operation'\"\n [class.text]=\"token.type === 'text'\">\n <span class=\"token-content\">{{ token.label || token.value }}</span>\n <button class=\"token-remove\" \n (click)=\"removeToken(i)\" \n *ngIf=\"token.type === 'attribute'\">\n <span class=\"remove-icon\">\u00D7</span>\n </button>\n </div>\n <!--SKS16SEP25 Hidden input to capture numbers -->\n <input #formulaInput \n class=\"hidden-input\"\n [(ngModel)]=\"currentInput\"\n (keydown)=\"onKeyDown($event)\"\n (blur)=\"commitNumber()\"\n placeholder=\"Start typing or click attributes below...\">\n </div>\n </div>\n\n <!-- SKS16SEP25 Action Buttons -->\n <div class=\"action-buttons\">\n <button class=\"btn btn-secondary\" (click)=\"resetFormula()\">Reset</button>\n <!-- <button class=\"btn btn-primary\" (click)=\"validateFormula()\" [disabled]=\"formulaTokens.length === 0\">\n VALIDATE\n </button> -->\n </div>\n </div>\n <!-- SKS16SEP25 Content Area -->\n <div class=\"content-area\">\n <!-- Attributes Section -->\n <div class=\"attributes-section\">\n <h4>Attributes <span class=\"required\">*</span></h4>\n <div class=\"attributes-list\">\n <div class=\"attribute-item\" \n *ngFor=\"let attribute of attributes\"\n (click)=\"addAttribute(attribute)\">\n <span class=\"attribute-apiName\">{{ attribute.label }}</span>\n <span class=\"attribute-type\" *ngIf=\"attribute.type\">({{ attribute.type }})</span>\n </div>\n </div>\n </div>\n\n <!-- SKS16SEP25 Operations Section -->\n <div class=\"operations-section\">\n <h4>Operation</h4>\n <div class=\"operations-grid\">\n <button class=\"operation-btn\" \n *ngFor=\"let operation of operations\"\n (click)=\"addOperation(operation)\"\n [title]=\"operation.title\">\n {{ operation.symbol }}\n </button>\n </div>\n </div>\n </div>\n\n <!-- Validation Message -->\n <div class=\"validation-message\" *ngIf=\"validationMessage\" [class.error]=\"isValidationError\">\n {{ validationMessage }}\n </div>\n </div>", styles: [".risk-formula-builder{width:100%;max-width:1200px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;background:#fff;border-radius:8px;padding:5px;box-shadow:0 2px 8px #0000001a}.required{color:#e74c3c}.subtitle{margin:0;font-size:14px;color:#666;line-height:1.4}.formula-container{position:relative;margin-bottom:5px}.formula-input-area{border:2px solid #e1e5e9;border-radius:6px;padding:5px;background:#fff;position:relative;cursor:text;transition:border-color .2s ease}.formula-input-area:hover{border-color:#c1c7cd}.formula-input-area:focus-within{border-color:#4a90e2;box-shadow:0 0 0 3px #4a90e21a}.formula-tokens{display:flex;flex-wrap:wrap;align-items:center;gap:8px;min-height:24px}.token{display:inline-flex;align-items:center;border-radius:20px;padding:5px;font-size:14px;position:relative;transition:all .2s ease}.token.attribute{background-color:#f0f4f8;color:#2d3748;border:1px solid #cbd5e0;padding-right:8px}.token.operation{color:#4a5568;font-weight:600;padding:0;text-align:center;justify-content:center}.token.text{color:#4a5568;background:transparent;padding:4px 0}.token-content{display:inline-block}.token-remove{background:none;border:none;color:#a0aec0;cursor:pointer;padding:0;margin-left:6px;width:18px;height:18px;border-radius:50%;display:flex;align-items:center;justify-content:center;transition:all .2s ease}.token-remove:hover{background-color:#e53e3e;color:#fff}.remove-icon{font-size:14px;line-height:1}.hidden-input{border:none;outline:none;background:transparent;font-size:14px;color:#4a5568;min-width:200px;padding:4px 0}.hidden-input::placeholder{color:#a0aec0}.btn{padding:5px;border-radius:2px;font-size:10px;font-weight:400;cursor:pointer;transition:all .2s ease;border:1px solid}.btn:disabled{opacity:.6;cursor:not-allowed}.btn-secondary{background:#fff;color:#718096;border-color:#e2e8f0}.btn-secondary:hover:not(:disabled){background-color:#f7fafc;border-color:#cbd5e0}.btn-primary{background:#4a90e2;color:#fff;border-color:#4a90e2}.btn-primary:hover:not(:disabled){background:#357abd;border-color:#357abd}.content-area{display:grid;grid-template-columns:1fr 1fr;gap:5px}.attributes-section h4,.operations-section h4{margin:0 0 5px;font-size:16px;font-weight:600;color:#2d3748}.attributes-list{display:flex;flex-direction:column;gap:5px;overflow-y:auto;height:150px}.attribute-item{padding:5px;border:1px solid #e2e8f0;border-radius:6px;cursor:pointer;transition:all .2s ease;background:#fff;display:flex;align-items:center;justify-content:space-between}.attribute-item:hover:not(.disabled){border-color:#4a90e2;box-shadow:0 2px 4px #4a90e21a;transform:translateY(-1px)}.attribute-item.disabled{opacity:.5;cursor:not-allowed;background-color:#f7fafc}.attribute-name{font-size:14px;color:#2d3748;font-weight:500}.attribute-type{font-size:12px;color:#718096}.operations-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:5px}.operation-btn{border:1px solid #e2e8f0;border-radius:6px;background:#fff;color:#2d3748;font-size:14px;cursor:pointer;transition:all .2s ease;display:flex;align-items:center;justify-content:center}.operation-btn:hover{border-color:#4a90e2;box-shadow:0 2px 4px #4a90e226;transform:translateY(-1px)}.operation-btn:active{transform:translateY(0)}.validation-message{margin-top:16px;padding:12px 16px;border-radius:6px;font-size:14px;font-weight:500;background-color:#f0fff4;color:#38a169;border:1px solid #9ae6b4}.validation-message.error{background-color:#fed7d7;color:#e53e3e;border-color:#feb2b2}.action-buttons{display:flex;justify-content:end;gap:5px;padding-top:5px}\n"] }]
57768
57771
  }], propDecorators: { attributes: [{
57769
57772
  type: Input
57770
57773
  }], initialFormula: [{