UNPKG

@rangertechnologies/ngnxt

Version:

This library was used for creating dymanic UI based on the input JSON/data

677 lines 126 kB
import { Component, Input, Output, EventEmitter, ViewChild, } from "@angular/core"; import { QuestionbookComponent } from "../questionbook/questionbook.component"; import { CommonModule } from "@angular/common"; import { FormsModule } from "@angular/forms"; import * as i0 from "@angular/core"; import * as i1 from "../../services/salesforce.service"; import * as i2 from "../../services/data.service"; import * as i3 from "../../services/storage.service"; import * as i4 from "@angular/platform-browser"; import * as i5 from "../../services/change.service"; import * as i6 from "@angular/common/http"; import * as i7 from "@angular/common"; export class BookletComponent { sfService; dataService; storageService; sanitizer; changeService; http; bookletId; serv; tkn; bookletJSON; allIcons; //MSM10JUL25 icon selector component input themeColor; //MSM10JUL25 icon selector component input cdnIconURL; //MSM10JUL25 icon selector component input dropdownDependentData; labelValue; token; languageCode; // VD 11Jun24 - translation changes fieldRestrictions; // VD 12Jun24 - field permission change from; // Form Builder dependent change apiUrl; // AP-16APR25 Input property to receive the API URL from the parent component isEdit; // AP-19MAY25 - Added isEdit input handleBookletActionEvent = new EventEmitter(); handlePage = new EventEmitter(); hadleDropDownDependent = new EventEmitter(); // VD 06Sep24 calendar changes handleCalendarDate = new EventEmitter(); handleCalendarEvent = new EventEmitter(); nxtBooklet; booklet = []; abItem = {}; actions = []; bookQuestionsMap = new Map(); translateMap = new Map(); // VD 11Jun24 - translation changes sqOptions = new Map(); isAnswerFlag = false; spinnerName; spinnerType; // HA 19DEC23 langDirection variable is created to assign the direction as class langDirection = 'ltr'; // HA 28DEC23 making ltr as default direction answerList = []; // HA 11-JAN-24 Answerlist to store the minimal value dataBind; // HA 18-JAN-24 To insert the endpoint value to the question allEvents = []; // VD 06Sep24 calendar changes //AP-19MAY25 - Accessing the QuestionbookComponent instance using ViewChild reference questionbookComponent; constructor(sfService, dataService, storageService, sanitizer, changeService, http) { this.sfService = sfService; this.dataService = dataService; this.storageService = storageService; this.sanitizer = sanitizer; this.changeService = changeService; this.http = http; this.spinnerName = "sp1"; this.spinnerType = "ball-spin-clockwise"; } ngOnInit() { this.processBooklet(); //AP-16APR25 // Get the dynamic API URL and pass it to the service method let apidata = this.apiUrl; this.dataService.apikey(apidata); } // VD NOV23 - update the json data when bookletId and bookletJSON changes ngOnChanges(simplechanges) { // HA 23JAN24 To avoid undefined error if (simplechanges['bookletId'] || (simplechanges['bookletJSON'] && simplechanges['bookletJSON'].currentValue != null) || (simplechanges['dataBind'] && simplechanges['dataBind'].currentValue != null)) { this.allEvents = []; this.processBooklet(); } //AP-19MAY25 - If bookletJSON input changes, trigger processData on QuestionbookComponent if (simplechanges['bookletJSON']) { const currentValue = simplechanges['bookletJSON'].currentValue; //AP-28MAY25 - If the action is a string, upgrade it to the new action model (array of objects) if (currentValue?.questionbook?.action && typeof currentValue.questionbook.action === 'string') { currentValue.questionbook.action = this.upgradeActions(currentValue.questionbook.action); } if (this.questionbookComponent) { this.questionbookComponent.processData(); } } } // AP-28MAY25 - Converts old action string (JSON) into a new model (array of action objects) upgradeActions(actionString) { try { // Try to parse the action string to JSON const parsed = JSON.parse(actionString); // AP-28MAY25 If parsed result is an array, apply default styles and adjust position if (Array.isArray(parsed)) { return parsed.map((item, index) => ({ ...item, positionPercent: item.name === 'Cancel' ? 3 : 14, // Set position based on action name width: 100, textColor: '#ffffff', borderRadius: 6, id: index })); } } catch (e) { console.error("Invalid JSON action format", e); } return []; } processBooklet() { if (this.bookletId) { if (this.bookletId.length == 18) { this.readBooklet(this.bookletId); } } else if (this.bookletJSON) { // Try to pass a value from Backend to differentiate the QuestionBook Read and AnswerBook Read this.isAnswerFlag = true; if (this.bookletJSON != null && this.bookletJSON != undefined && this.bookletJSON?.bookQuestionsMap) { // SKS28MAR25 get the nested reference qb let tempbook = this.bookletJSON?.bookQuestionsMap[Object.keys(this.bookletJSON?.bookQuestionsMap)[0]].subQuestions; tempbook.forEach((element) => { if (element.type === "book" && element?.qbReference) { this.getRefQbData(element?.qbReference).subscribe((response) => { element['qbReferenceQuestions'] = response; // Assign response to qbReferenceQuestions }, (error) => { console.error("API Error:", error); }); } }); this.bookletJSON['bookQuestionsMap'][Object.keys(this.bookletJSON?.bookQuestionsMap)[0]].subQuestions = tempbook; // Storing the API response for future use this.storageService.save(this.bookletJSON); } // Process the Sub Question Options - This should be merged with bookQuestionsMap in future for (var sq in this.bookletJSON?.sqOptions) { this.sqOptions.set(sq, this.bookletJSON?.sqOptions[sq]); } // Process the Questions // HA 28DEC23 this applies for booklet // HA 17JAN24 Added ternary operator to avoid undefined scenario // HA 09FEB24 Adding condition to avoid undefined error if (this.bookletJSON?.bookQuestionsMap && Object.keys(this.bookletJSON?.bookQuestionsMap).length > 0) { for (var value in this.bookletJSON?.bookQuestionsMap) { this.bookQuestionsMap.set(value, this.bookletJSON?.bookQuestionsMap[value]); } } // HA 28DEC23 this applies for book or questions else if (this.bookletJSON?.records) { var value = ''; // HA 09FEB24 Added ternary // RS 09DEC24 Changed keys value = this.bookletJSON?.records[0]?.id; this.bookQuestionsMap.set(value, this.bookletJSON?.questionbook); } // VD 20Jun24 - translation changes for (var value in this.bookletJSON?.translationMap) { this.translateMap.set(value, this.bookletJSON?.translationMap[value]); } // AP 23MAY25 - supports both stringified and object formats if (this.bookletJSON?.questionbook?.action != undefined && this.bookletJSON?.questionbook?.action != '') { this.actions = typeof this.bookletJSON?.questionbook.action === 'string' ? JSON.parse(this.bookletJSON?.questionbook.action) : this.bookletJSON?.questionbook.action; } } // HA 19DEC23 langDirection variable value assigning // RS 09DEC24 Changed keys if (this.bookletJSON?.questionbook?.style) { var style = typeof this.bookletJSON?.questionbook?.style === 'object' ? this.bookletJSON?.questionbook?.style : JSON.parse(this.bookletJSON?.questionbook?.style); this.langDirection = style?.direction; } else if (this.bookletJSON?.records && this.bookletJSON?.records[0]?.style) { var style = typeof this.bookletJSON?.records[0]?.style === 'object' ? this.bookletJSON?.records[0]?.style : JSON.parse(this.bookletJSON?.records[0]?.style); this.langDirection = style?.direction; } // HA 18-JAN-24 The condition is used for Bind-In Logic this.handleCompleteBooklet(this.bookletJSON); this.booklet = this.bookletJSON?.records; this.abItem = this.bookletJSON?.answerbook; } // VD 12Jun24 - translation changes readBooklet = (uuid) => { if (this.serv == "api") { this.dataService.getAPIData(this.tkn, ["Booklet", "read", uuid, this.languageCode], this.successReadBooklet, this.failureReadBooklet); } else { // VD 31NOV24 param changes with new method let paramMap = { createAnswerBookFlag: false }; paramMap['c__qb_id'] = ''; paramMap["c__record_id"] = ''; let para = { dataType: "Booklet", operation: "read", param1: uuid, paramJSON: JSON.stringify(paramMap), languageCode: this.languageCode }; this.sfService.remoteAction("NxtController.processData", [JSON.stringify(para)], this.successReadBooklet, this.failureReadBooklet); } }; successReadBooklet = (response) => { console.log('Inside the successReadBooklet'); if (response != null || response != undefined) { // Storing the API response for future use this.storageService.save(response); // Try to pass a value from Backend to differentiate the QuestionBook Read and AnswerBook Read // this.isAnswerFlag = true; this.booklet = response.records; this.abItem = response.answerbook; // Process the Sub Question Options - This should be merged with bookQuestionsMap in future for (var sq in response.sqOptions) { this.sqOptions.set(sq, response.sqOptions[sq]); } // Process the Questions for (var value in response.bookQuestionsMap) { this.bookQuestionsMap.set(value, response.bookQuestionsMap[value]); } // VD 11Jun24 - translation changes for (var value in response.translationMap) { this.translateMap.set(value, response.translationMap[value]); } // VD 31NOV24 wrapper changes if (response.questionbook?.action != undefined) { this.actions = typeof response.questionbook?.action === 'string' ? JSON.parse(response.questionbook?.action) : response.questionbook?.action; } } // HA 19DEC23 langDirection variable value assigning if (response?.questionbook?.style) { var style = typeof response?.questionbook?.style === 'object' ? response?.questionbook?.style : JSON.parse(response?.questionbook?.style); this.langDirection = style?.direction; } else if (response?.records[0]?.style) { var style = typeof response?.records[0]?.style === 'object' ? response?.records[0]?.style : JSON.parse(response?.records[0]?.style); this.langDirection = style?.direction; } }; failureReadBooklet = (response) => { }; //SKS28MAR25 Function to fetch refqb data getRefQbData(refqbid) { return this.http.get(`https://dev-api.valarhr.com/nxt?name=${refqbid}`); } singleFieldChange(event) { console.log("single FieldChange", event); let actionButton; this.actions.forEach(action => { if (action.eventtoemit === 'submit') { actionButton = action; } }); this.handleBookletActionClick(actionButton, event); } handleBookletActionClick(action, ques) { // HA 19JAN24 Action changes // RS 09DEC24 Changed keys this.answerList = []; this.dataBind = []; // HA 12FEB24 Clearing dataBind upon button action so that dataBind value will not override the changed value let dataToParent = {}; let validForm = true; // VD 01Aug24 - validation change let isPrimaryKey = false; let primaryKeyElement; let dependentElementArray = []; // HA 22JAN24 this change to make close event work dataToParent['action'] = action.eventtoemit; if (!(action.eventtoemit === 'close' || action.eventtoemit === 'print')) { // HA 18-JAN-24 Sending the complete json data also dataToParent['jsonBook'] = this.storageService.get(); // HA 17JAN24 nxtId to dataParent object if (this.bookletJSON) { dataToParent['nxtId'] = Object.keys(this.bookletJSON?.bookQuestionsMap)[0]; } // HA 11-JAN-24 Minimizing the value which has to be passed to the server this.handleCompleteBooklet(dataToParent['jsonBook']); dataToParent['data'] = this.answerList ? this.answerList : dataToParent['data']; // when clicking the submit button validating the required fields for (let key in dataToParent['jsonBook'].bookQuestionsMap) { const currentBook = dataToParent['jsonBook'].bookQuestionsMap[key]; currentBook.subQuestions.forEach(element => { if (!isPrimaryKey) { if (element?.primaryKey === true && element?.input !== undefined && element?.input !== '' && element?.input !== null) { isPrimaryKey = true; primaryKeyElement = element; } } // VD 01Aug24 - validation change if (element.isOptional && dataToParent['action'] == 'submit' && (!element.input || (Array.isArray(element.input) && element.input.length === 0)) && !element.isHidden && element.type != 'Label' && element.type != 'Image') { //SKS5NOV25 element.error = true; validForm = false; this.changeService.submitChange(element.id); } // VD 02Aug24 - clear action changes if (dataToParent['action'] == 'clear') { if (element.type == 'Dropdown' || element.type == 'Location' || element.type == 'Radio') { element.selectedValue = undefined; } else if (element.type == 'File') { element.input = []; } else if (element.type === "Boolean") { // SKS23JUN25 defaultly set value false element.input = false; } else { element.input = ''; } } }); if (ques?.subText?.sourceQuestionId !== undefined && ques?.subText?.sourceQuestionId !== null && ques?.subText?.sourceQuestionId !== '' && !ques?.subText?.isDependentField) { } else if (ques?.subText?.sourceQuestionId !== undefined && ques?.subText?.sourceQuestionId !== null && ques?.subText?.sourceQuestionId !== '' && ques?.subText?.isDependentField) { } else { currentBook.subQuestions.forEach(ele => { if (ques?.id && ques?.id === ele?.subText?.sourceQuestionId) { dependentElementArray.push(ele.id); } }); } } } // VD 13MAY24 - print QR button changes if (action.eventtoemit === 'print') { dataToParent['actionData'] = action['data']; } // MSM 17JUN25 - Close button event changes if (action.eventtoemit === 'close' && this.isEdit) { this.isEdit = false; } // HA 23JAN24 To call the action on any event // VD 01Aug24 - validation change if (validForm) { // SKS13JUN25 single field change emit if (ques && ques.singleFieldChange) { dataToParent.data = dataToParent.data.filter((inputData) => inputData.id === ques.id || inputData.id === primaryKeyElement?.id || dependentElementArray.includes(inputData.id)); } if (isPrimaryKey) { dataToParent.action = 'save'; } this.handleBookletActionEvent.emit(dataToParent); } else { dataToParent['action'] = 'error'; this.handleBookletActionEvent.emit(dataToParent); } } // HA 18-JAN-24 handleCompleteBooklet is to simplify the logic handleCompleteBooklet(completeBooklet) { if (Object.keys(completeBooklet?.bookQuestionsMap ?? {}).length === 0) { // HA 11-JAN-24 If condition to load booklet this.handleBook(completeBooklet?.questionbook?.subQuestions); } else { // HA 11-JAN-24 To load book questions for (const key in completeBooklet.bookQuestionsMap) { const val = completeBooklet.bookQuestionsMap[key]; if (val.type === 'Book') { this.handleBook(val.subQuestions); } else { this.handleQues(val); } } } } // HA 11-JAN-24 handleBook loads the Book // RS 09DEC24 Changed keys handleBook(quesList) { quesList?.forEach(element => { if (element.type === 'Book' && element.qbReferenceQuestions) { // HA 24JAN24 Fetching from QB reference var book = typeof element.qbReferenceQuestions === 'object' ? element.qbReferenceQuestions : JSON.parse(element.qbReferenceQuestions); const firstKey = Object.keys(book?.bookQuestionsMap || {})[0]; book?.bookQuestionsMap[firstKey]?.subQuestions?.forEach(ques => { this.handleQues(ques); }); } else { this.handleQues(element); } }); // VD 13Sep24 - databind changes // VD 23 Oct24 - file type changes if (this.dataBind && Object.keys(this.dataBind).length > 0) { this.changeService.dataChanges('dataBind'); } } // SKS20MAR25 flattening nested objects, mapping values using referenceField flattenObject(obj, parentKey = '', includeObjects = true) { let result = []; for (let [key, val] of Object.entries(obj)) { let newKey = parentKey ? `${parentKey}.${key}` : key; if (Array.isArray(val)) { result.push([newKey, val]); // Include full array val.forEach((item, index) => { if (typeof item === 'object' && item !== null) { result.push(...this.flattenObject(item, `${newKey}[${index}]`, false)); // Flatten objects in arrays } else { result.push([`${newKey}[${index}]`, item]); // Store primitive values in arrays } }); } else if (typeof val === 'object' && val !== null) { if (includeObjects) { result.push([newKey, val]); // Include full object } result.push(...this.flattenObject(val, newKey, false)); // Flatten nested objects } else { result.push([newKey, val]); // Store key-value pairs } } return result; } // SKS20MAR25 referenceField set like this // name --> normal // items[0].name --> value in a array set like this // addresses.line2 ---> if value in a json set like this // addresses.line4.dd ---> if value in a nested json set like this // HA 11-JAN-24 handleQues to load question // VD 06Sep24 calendar changes handleQues(ques) { // HA 19-JAN-24 If condition is for bind-in, correction // HA 09FEB24 Adding condition to avoid undefined error if (this.dataBind && Object.keys(this.dataBind).length > 0) { let result = this.flattenObject(this.dataBind); let found = false; for (let [key, val] of result) { let value = val; if (ques.referenceField === key) { found = true; if (ques.type === 'Dropdown' || ques.type === 'Radio') { this.sqOptions.forEach(element => { if (element['referenceField'] === key) { element['input'] = ques.input = value || ques.defaultValue; element['selectedValue'] = ques.selectedValue = value || ques.defaultValue; } }); } // HA 24JAN24 To bind-in Date and DateTime else if (ques.type === 'Date' || ques.type == 'DateTime') { ques.input = new Date(value?.toString()) || ques.defaultValue; } // HA 12FEB24 To bind-in Location Type else if (ques.type === 'Location') { ques.input = value || ques.defaultValue; ques.selectedValue = value['address'] ? value['address'] : value || ques.defaultValue; } // VD 06Sep24 calendar changes for data bindIn else if (ques.type === 'Calendar') { let entries = typeof ques['fieldsMeta'] === 'object' ? ques['fieldsMeta'] : JSON.parse(ques['fieldsMeta']); if (entries) { let referenceQuestions = []; if (entries.length > 0) { entries.forEach(element => { if (element.questionReference) { let qReference = JSON.parse(element.questionReference); referenceQuestions.push(qReference?.question); } }); } if (referenceQuestions.length > 0) { value?.forEach(calendarArray => { let date = new Date(calendarArray.date); calendarArray.entries.forEach(inputEntry => { for (let [k, v] of Object.entries(inputEntry)) { referenceQuestions.forEach(field => { if (field.referenceField == k) { if (field.type === 'Date' || field.type == 'DateTime' || field.type == 'Time') { field.input = new Date(v?.toString()) || ques.defaultValue; } if (field.type === 'Dropdown' || field.type === 'Radio') { field.selectedValue = v; field.input = v || ques.defaultValue; } else { field.input = v || ques.defaultValue; } } }); } this.addEvent(date, referenceQuestions); //SKS 27SEP24 each event added to allEvents array }); // this.addEvent(date,referenceQuestions); //this is only last event added to allEvents array }); } } ques.input = this.allEvents.length > 0 ? this.allEvents : ''; } // VD 23 Oct24 - file type changes else if (ques.type === 'File') { ques.input = []; ques.input = value; } else if (ques.type === "Boolean") { // SKS23JUN25 defaultly set value false ques.input = typeof value !== 'undefined' ? value === true || value === 'true' : typeof ques.defaultValue !== 'undefined' ? ques.defaultValue === true || ques.defaultValue === 'true' : false; } else { ques.input = value || ques.defaultValue; } this.answerList.push(ques); // HA 12FEB24 To give the value for data break; // AP-03JUN25 - Match found and value bound; no need to continue the loop } } if (!found) { ques.type === 'Boolean' ? ques.input = false : ques.input = null; // SKS23JUN25 defaultly set value false } } else { const question = {}; question['id'] = ques.id; question['input'] = ques.input || ques.defaultValue || null; // HA 12FEB24 To bind-out Location Type if (ques.type === 'Location') { question['input'] = ques.input ? ques.input : ques.selectedValue || null; } else if (ques.type == 'File') { // VD 23 Oct24 - file type changes question['input'] = ques.input ? ques.input : ques.defaultValue || []; } else if (ques.type === "Boolean") { // SKS23JUN25 defaultly set value false question['input'] = typeof ques.input !== 'undefined' ? ques.input === true || ques.input === 'true' : typeof ques.defaultValue !== 'undefined' ? ques.defaultValue === true || ques.defaultValue === 'true' : false; } question['type'] = ques.type; question['questionNumber'] = ques.questionNumber; question['referenceField'] = ques?.referenceField; question['selectedValue'] = ques?.selectedValue; // MR 31JAN24 Need to pass the selected value too this.answerList.push(question); } } // VD 06Sep24 calendar changes for data bindIn addEvent(day, entryQues) { // Transform new entries into the desired format const newEntries = entryQues.reduce((acc, q) => { acc[q.id] = { ...q }; return acc; }, {}); // Find if an event already exists for the given date const existingEvent = this.allEvents.find(event => event.date.toDateString() === day.toDateString()); if (existingEvent) { // If the event exists, push the new entries to the existing entries const existingEntries = existingEvent.entries.map(entry => ({ ...entry })); existingEntries.push(newEntries); existingEvent.entries = existingEntries; } else { // Create a new event if it doesn't exist for the given date const newEvent = { id: '_' + Math.random().toString(36).substr(2, 9), date: day, entries: [newEntries] // Wrap the new entries in an array }; this.allEvents.push(newEvent); } } readQuestions(qbId) { let questions = []; // HA 31-JAN-24 Added ternary to avoid undefined for (var sq in this.bookQuestionsMap?.get(qbId)?.subQuestions) { // AP-14MAY25 Extracted question from subQuestions into variable 'q' let q = this.bookQuestionsMap?.get(qbId).subQuestions[sq]; // HA 09FEB24 if question is there process if (q) { if ((q.type == 'Dropdown' || q.type == 'Radio') && this.sqOptions.get(q.id)) { questions.push(this.sqOptions.get(q.id)); } else { questions.push(q); } } } // VD 12Jun24 field permisision changes if (this.fieldRestrictions) { const fieldRestrictions = new Map(Object.entries(this.fieldRestrictions.fields)); questions.forEach(ques => { const restriction = fieldRestrictions.get(ques.uniqueIdentifier); if (restriction) { ques.isReadOnly = restriction === 'readOnly'; ques.isHidden = restriction === 'hide'; } }); } return questions; } // VD 11Jun24 - translation changes readTransQuestions(qbId) { let record = []; let translateRecord = this.translateMap.get(qbId); if (translateRecord && translateRecord.length > 0) { translateRecord.forEach(lanRec => { if (lanRec.languageCode == this.languageCode) { record = lanRec.fields; } }); } return record; } getText(value) { var doc = new DOMParser().parseFromString(value, "text/html"); return this.sanitizer.bypassSecurityTrustHtml(doc.documentElement.textContent); } getDropDown(event) { this.hadleDropDownDependent.emit(event); } // VD 06Sep24 calendar changes getCalendarDate(event) { this.handleCalendarDate.emit(event); } getCalendarEvent(event) { event["nxtId"] = Object.keys(this.bookletJSON?.bookQuestionsMap)[0]; this.handleCalendarEvent.emit(event); } editChangeClick(action) { this.isEdit = true; } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BookletComponent, deps: [{ token: i1.SalesforceService }, { token: i2.DataService }, { token: i3.StorageService }, { token: i4.DomSanitizer }, { token: i5.ChangeService }, { token: i6.HttpClient }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", 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", 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\" [ngClass]=\"langDirection\">\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?.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 [labelValue]=\"labelValue\"\n [questionItem]=\"ques\"\n [translatedQuestions]=\"readTransQuestions(qb.id)\"\n [questions]=\"readQuestions(qb.id)\"\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 ></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?.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\" [translatedQuestions]=\"readTransQuestions(qb.id)\" [questions]=\"readQuestions(qb.id)\" (handleDropDown)=\"getDropDown($event)\"></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'\" [ngClass]=\"langDirection\"> <!-- position-relative removed in this tag-->\n <ng-container *ngFor=\"let action of actions; let i = index\">\n <div class=\"action-wrapper\"\n [style.width.px]=\"action.width || 100\"\n style=\"margin-right: 10px;\"> <!-- style=\"position: absolute; [style.left.%]=\"action.positionPercent || 0\" removed in this tag -->\n @if(!isEdit && action.eventtoemit === 'submit'){\n <button \n (click)=\"editChangeClick(action)\" \n class=\"btn btn-primary fc-button nxtButton action-btn\"\n [style.--btn-bg]=\"action.bgColor\"\n [style.background-color]=\"action.bgColor || ''\"\n [style.color]=\"action.textColor || ''\"\n [style.border-radius.px]=\"action.borderRadius || 4\"\n style=\"width: 100%;\">\n Edit\n </button>\n }\n @else {\n <button \n (click)=\"handleBookletActionClick(action)\" \n class=\"btn btn-primary fc-button nxtButton action-btn\"\n [style.--btn-bg]=\"action.bgColor\"\n [style.background-color]=\"action.bgColor || ''\"\n [style.color]=\"action.textColor || ''\"\n [style.border-radius.px]=\"action.borderRadius || 4\"\n style=\"width: 100%;\">\n {{ action.name }}\n </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: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: QuestionbookComponent, selector: "lib-questionbook", inputs: ["qbItem", "questionItem", "translatedQuestions", "questions", "errorFieldId", "labelValue", "token", "isEdit", "dropDownData", "dataBind", "allIcons", "themeColor", "cdnIconURL"], outputs: ["handleDropDown", "handleQuestion", "singleFieldChangeEmit", "hadleDropDownDependent", "handleCalendarDate", "handleCalendarEvent"] }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BookletComponent, decorators: [{ type: Component, args: [{ selector: 'lib-booklet', standalone: true, imports: [ CommonModule, FormsModule, QuestionbookComponent ], template: "<!-- Booklet Handling-->\n<!-- HA 19DEC23 For Direction -->\n<div *ngFor=\"let qb of booklet\" [ngClass]=\"langDirection\">\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?.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 [labelValue]=\"labelValue\"\n [questionItem]=\"ques\"\n [translatedQuestions]=\"readTransQuestions(qb.id)\"\n [questions]=\"readQuestions(qb.id)\"\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 ></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?.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\" [translatedQuestions]=\"readTransQuestions(qb.id)\" [questions]=\"readQuestions(qb.id)\" (handleDropDown)=\"getDropDown($event)\"></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'\" [ngClass]=\"langDirection\"> <!-- position-relative removed in this tag-->\n <ng-container *ngFor=\"let action of actions; let i = index\">\n <div class=\"action-wrapper\"\n [style.width.px]=\"action.width || 100\"\n style=\"margin-right: 10px;\"> <!-- style=\"position: absolute; [style.left.%]=\"action.positionPercent || 0\" removed in this tag -->\n @if(!isEdit && action.eventtoemit === 'submit'){\n <button \n (click)=\"editChangeClick(action)\" \n class=\"btn btn-primary fc-button nxtButton action-btn\"\n [style.--btn-bg]=\"action.bgColor\"\n [style.background-color]=\"action.bgColor || ''\"\n [style.color]=\"action.textColor || ''\"\n [style.border-radius.px]=\"action.borderRadius || 4\"\n style=\"width: 100%;\">\n Edit\n </button>\n }\n @else {\n <button \n (click)=\"handleBookletActionClick(action)\" \n class=\"btn btn-primary fc-button nxtButton action-btn\"\n [style.--btn-bg]=\"action.bgColor\"\n [style.background-color]=\"action.bgColor || ''\"\n [style.color]=\"action.textColor || ''\"\n [style.border-radius.px]=\"action.borderRadius || 4\"\n style=\"width: 100%;\">\n {{ action.name }}\n </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"] }] }], ctorParameters: () => [{ type: i1.SalesforceService }, { type: i2.DataService }, { type: i3.StorageService }, { type: i4.DomSanitizer }, { type: i5.ChangeService }, { type: i6.HttpClient }], propDecorators: { bookletId: [{ type: Input }], serv: [{ type: Input }], tkn: [{ type: Input }], bookletJSON: [{ type: Input }], allIcons: [{ type: Input }], themeColor: [{ type: Input }], cdnIconURL: [{ type: Input }], dropdownDependentData: [{ type: Input }], labelValue: [{ type: Input }], token: [{ type: Input }], languageCode: [{ type: Input }], fieldRestrictions: [{ type: Input }], from: [{ type: Input }], apiUrl: [{ type: Input }], isEdit: [{ type: Input }], handleBookletActionEvent: [{ type: Output }], handlePage: [{ type: Output }], hadleDropDownDependent: [{ type: Output }], handleCalendarDate: [{ type: Output }], handleCalendarEvent: [{ type: Output }], dataBind: [{ type: Input }], questionbookComponent: [{ type: ViewChild, args: ['questionbook'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9va2xldC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtYXBwL3NyYy9saWIvcGFnZXMvYm9va2xldC9ib29rbGV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1hcHAvc3JjL2xpYi9wYWdlcy9ib29rbGV0L2Jvb2tsZXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFJVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFJWixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFZdkIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDL0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7O0FBYTdDLE1BQU0sT0FBTyxnQkFBZ0I7SUE0Q2pCO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQWhERCxTQUFTLENBQVM7SUFDbEIsSUFBSSxDQUFTO0lBQ2IsR0FBRyxDQUFTO0lBQ1osV0FBVyxDQUFNO0lBQ2pCLFFBQVEsQ0FBTSxDQUFDLDBDQUEwQztJQUN6RCxVQUFVLENBQVMsQ0FBQywwQ0FBMEM7SUFDOUQsVUFBVSxDQUFTLENBQUMsMENBQTBDO0lBQzlELHFCQUFxQixDQUFNO0lBQzNCLFVBQVUsQ0FBUztJQUNuQixLQUFLLENBQVM7SUFDZCxZQUFZLENBQVMsQ0FBRSxtQ0FBbUM7SUFDMUQsaUJBQWlCLENBQU0sQ0FBQyx1Q0FBdUM7SUFDL0QsSUFBSSxDQUFNLENBQUMsZ0NBQWdDO0lBQzNDLE1BQU0sQ0FBTSxDQUFDLDZFQUE2RTtJQUMxRixNQUFNLENBQVcsQ0FBQyxrQ0FBa0M7SUFFbkQsd0JBQXdCLEdBQXNCLElBQUksWUFBWSxFQUFF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