@rangertechnologies/ngnxt
Version:
This library was used for creating dymanic UI based on the input JSON/data
371 lines • 70.1 kB
JavaScript
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { CommonModule } from '@angular/common';
import * as i0 from "@angular/core";
import * as i1 from "../../services/change.service";
import * as i2 from "@angular/common";
export class CustomCalendarComponent {
changeService;
eventSelected = new EventEmitter();
// VD 06Sep24 calendar changes
dateSelected = new EventEmitter();
openModal = new EventEmitter();
closeModal = new EventEmitter();
allEvents = [];
question;
nxtId;
//@ViewChild(ComponenthostDirective, { static: true }) dynamicHost: ComponenthostDirective;
entries = [];
referenceQuestions = [];
qbRefrenceBook;
calendarQuestion = [];
calendar = {};
currentDate = new Date();
calendarDays = [];
daysOfWeek = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
newEventTitle = '';
newEventTime = '';
newDescription = '';
newLink = '';
selectedDay = null;
isModalOpen = false;
modalTitle = 'Custom Modal';
modalSize = 'large';
saveButtonValue = 'Save';
modalFooter = true;
editingEventId;
editingEntryGroup;
showAppoinmentSection = true;
subscription;
constructor(changeService) {
this.changeService = changeService;
}
ngOnInit() {
if (this.question?.input) {
this.allEvents = this.question.input;
}
this.processQuestion();
this.generateCalendar();
this.subscription = this.changeService.customChange$.subscribe((changeValue) => {
if (changeValue == 'calendar-modal-save') {
this.onSave();
}
if (changeValue == 'dataBind') {
if (this.question?.input) {
this.allEvents = this.question.input;
}
this.processQuestion();
this.generateCalendar();
}
});
// this.dateSelected.emit(this.calendar);
//this.eventSelected.emit(this.allEvents);
}
// RS 09DEC24 Changed keys
processQuestion() {
// SKS20MAR25 check if question fieldsmeta is string
this.entries = typeof this.question['fieldsMeta'] === 'object' ? this.question['fieldsMeta'] || [] : JSON.parse(this.question['fieldsMeta']);
this.qbRefrenceBook = typeof this.question['qbReferenceQuestions'] === 'object' ? this.question['qbReferenceQuestions'] : JSON.parse(this.question['qbReferenceQuestions']);
let title = this.qbRefrenceBook?.questionbook?.title;
this.modalTitle = title;
this.referenceQuestions = [];
if (this.entries.length > 0) {
this.entries.forEach(element => {
if (element.questionReference) {
let qReference = JSON.parse(element.questionReference);
this.referenceQuestions.push(qReference?.question);
}
});
}
console.log('entries-->');
console.log('question-->');
console.log(this.entries);
console.log(this.referenceQuestions);
}
// sunday comment
// openQuestionBookModal() {
// const viewContainerRef = this.dynamicHost.viewContainerRef;
// viewContainerRef.clear();
// const componentRef = viewContainerRef.createComponent(QuestionbookComponent);
// componentRef.instance.qbItem = this.qbRefrenceBook;
// componentRef.instance.questions = this.referenceQuestions;
// componentRef.instance.handleQuestion.subscribe((event: any) => this.handleQuestionEvent(event));
// }
generateCalendar() {
const year = this.currentDate.getFullYear();
const month = this.currentDate.getMonth();
const startOfMonth = new Date(year, month, 1);
const endOfMonth = new Date(year, month + 1, 0);
const startDayOfWeek = startOfMonth.getDay();
const endDayOfWeek = endOfMonth.getDay();
const startDate = new Date(startOfMonth);
startDate.setDate(startDate.getDate() - startDayOfWeek);
const endDate = new Date(endOfMonth);
endDate.setDate(endDate.getDate() + (6 - endDayOfWeek));
const today = new Date(new Date().setHours(0, 0, 0, 0));
this.calendarDays = [];
for (let d = new Date(startDate); d <= endDate; d.setDate(d.getDate() + 1)) {
const date = new Date(d);
this.calendarDays.push({
date: date,
events: [],
isCurrentMonth: d.getMonth() === month,
isPast: date < today,
isToday: date.getTime() === today.getTime(),
isFuture: date > today,
});
}
// Populate calendar with events from allEvents array
this.calendarDays.forEach(day => {
day.events = this.allEvents?.filter(event => event?.date?.toDateString() === day.date.toDateString());
});
// VD 06Sep24 calendar changes
let cal = {};
cal['year'] = year;
cal['month'] = month + 1;
this.calendar = cal;
}
selectDay(day) {
console.log(day);
// VD 06Sep24 calendar changes
this.showAppoinmentSection = true;
this.selectedDay = day;
// this.eventSelected.emit(day?.events);
const previouslySelectedDay = this.calendarDays.find(d => d.isSelected);
if (previouslySelectedDay) {
previouslySelectedDay.isSelected = false;
}
// Select the clicked day
day.isSelected = true;
// VD 09Sep24- setup the query param data for api call
let referenceData = [];
this.referenceQuestions.forEach(ques => {
// VD 09-09-24 get the selected date
// need to add in the document
// RS 09DEC24 Changed keys
if (ques.referenceField == 'selectedDate') {
ques.input = day.date.toISOString();
console.log(ques.input);
}
// VD 09-09-24 get the query refrence field data to pass the queryParam for api
ques['subText'] = typeof ques?.subText === 'object' ? ques?.subText : JSON.parse(ques['subText'] || {});
if (ques.subText) {
let subText = ques.subText;
if (subText.queryField && subText.queryValueReference) {
let currentQues = ques;
let queryReferences = subText.queryValueReference.split(',');
queryReferences.forEach(refField => {
let refQues = this.referenceQuestions.find(q => q.referenceField === refField);
if (refQues) {
referenceData.push(refQues);
}
});
// Add the referenceData array to the current question
currentQues.referenceQueryData = referenceData;
}
}
});
}
previousMonth() {
this.showAppoinmentSection = false;
this.currentDate.setMonth(this.currentDate.getMonth() - 1);
this.currentDate = new Date(this.currentDate); // Ensure the date object is updated
this.generateCalendar();
this.dateSelected.emit(this.calendar);
this.eventSelected.emit(this.allEvents);
}
nextMonth() {
// VD 06Sep24 calendar changes
this.showAppoinmentSection = false;
this.currentDate.setMonth(this.currentDate.getMonth() + 1);
this.currentDate = new Date(this.currentDate); // Ensure the date object is updated
this.generateCalendar();
this.dateSelected.emit(this.calendar);
this.eventSelected.emit(this.allEvents);
}
addAppointment() {
this.isModalOpen = true;
this.calendarQuestion = this.referenceQuestions.map(q => ({ ...q, input: '' }));
this.referenceQuestions.forEach(ques => {
// clear the input
if (ques.referenceField != 'selectedDate') {
if (ques.type == 'Dropdown') {
delete ques.input;
delete ques.selectedValue;
// VD 06Sep24 calendar changes
}
else {
delete ques.input;
}
}
});
console.log(this.referenceQuestions);
this.editingEventId = null;
this.calendarQuestion = this.referenceQuestions;
this.openBookModel();
// sunday comment
//this.openQuestionBookModal();
}
openBookModel() {
this.openModal.emit({
qbRefrenceBook: this.qbRefrenceBook,
referenceQuestions: this.referenceQuestions,
modalTitle: this.modalTitle,
modalSize: this.modalSize,
saveButtonValue: this.saveButtonValue,
modalFooter: this.modalFooter,
});
}
closeCalendarModal() {
this.isModalOpen = false;
this.closeModal.emit(true);
}
// VD 06Sep24 calendar changes
editEvent(event, entryGroup) {
this.isModalOpen = true;
this.referenceQuestions = Object.values(entryGroup);
this.calendarQuestion = [...this.referenceQuestions]; // Make a copy of the current entries to edit
this.editingEventId = event.id;
this.editingEntryGroup = entryGroup; // Store the entry group being edited
this.generateCalendar(); // Regenerate the calendar to reflect changes
this.openBookModel();
// suday comment
// this.openQuestionBookModal();
}
deleteEvent(eventId, entryGroup) {
let event = this.allEvents?.find(e => e?.id === eventId);
if (event) {
// Find the index of the entryGroup to delete
const entryIndex = event.entries.indexOf(entryGroup);
if (entryIndex > -1) {
event.entries.splice(entryIndex, 1); // Remove the specific entry
}
// If the event has no more entries, remove the event entirely
if (event.entries.length === 0) {
const eventIndex = this.allEvents?.indexOf(event);
if (eventIndex > -1) {
this.allEvents?.splice(eventIndex, 1); // Remove the entire event
}
}
}
let eventData = {};
eventData['action'] = "delete";
eventData['data'] = event;
this.eventSelected.emit(eventData);
this.generateCalendar(); // Regenerate the calendar to reflect the changes
}
// VD 06Sep24 calendar changes
addEvent(day, entryQues) {
// Transform new entries into the desired format
const newEntries = entryQues.reduce((acc, q) => {
acc[q.id] = { ...q };
return acc;
}, {});
// Find an existing event for the given date
const existingEvent = day.events?.find(event => event.date === day.date);
if (existingEvent) {
// Merge new entries into the existing event's entries array
// Check if the entries array already contains an object with the same id
const existingEntries = existingEvent.entries.map(entry => ({ ...entry }));
// Append new entries to the existing entries
existingEntries.push(newEntries);
existingEvent.entries = existingEntries;
}
else {
// Create a new event if it doesn't exist for the given date
const newEvent = {
id: this.generateId(),
date: day.date,
entries: [newEntries] // Wrap the new entries in an array
};
day.events = day?.events || [];
day.events.push(newEvent);
this.allEvents?.push(newEvent);
//this.eventSelected.emit(this.allEvents);
let eventData = {};
eventData['action'] = "add";
eventData['data'] = newEvent;
this.eventSelected.emit(eventData);
}
this.generateCalendar();
console.log('allEvents', this.allEvents);
}
// VD 06Sep24 calendar changes
onSave() {
if (this.editingEventId !== null) {
const event = this.allEvents?.find(e => e?.id === this.editingEventId);
if (event && this.editingEntryGroup) {
// Update the specific entry group within the event
const entryIndex = event.entries.findIndex(entryGroup => entryGroup === this.editingEntryGroup);
if (entryIndex > -1) {
event.entries[entryIndex] = this.calendarQuestion.reduce((acc, q) => {
acc[q.id] = { ...q };
return acc;
}, {});
}
}
// this.eventSelected.emit(this.allEvents);
let eventData = {};
eventData['action'] = "edit";
eventData['data'] = event;
this.eventSelected.emit(eventData);
}
else {
if (this.selectedDay) {
this.addEvent(this.selectedDay, this.calendarQuestion);
}
}
this.closeCalendarModal();
this.generateCalendar();
}
// onCancel() {
// console.log('Cancel button clicked');
// this.closeCalendarModal();
// }
//this funtion need to be used
// handleQuestionEvent(ques){
// // Update the questions array with the new question
// const index = this.calendarQuestion.findIndex(q => q.id === ques.id);
// if (index > -1) {
// // If question already exists, update it
// this.calendarQuestion[index] = ques;
// } else {
// // If question doesn't exist, add it to the array
// this.calendarQuestion.push(ques);
// }
// console.log(this.calendarQuestion);
// }
// VD 06Sep24 calendar changes
generateId() {
return '_' + Math.random().toString(36).substr(2, 9);
}
getEntryKeys(entryGroup) {
return Object.keys(entryGroup);
}
removeCharacters(questionText) {
let updatedText = questionText?.replace(/<[^>]*>/g, '');
return updatedText;
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CustomCalendarComponent, deps: [{ token: i1.ChangeService }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CustomCalendarComponent, isStandalone: true, selector: "app-custom-calendar", inputs: { allEvents: "allEvents", question: "question", nxtId: "nxtId" }, outputs: { eventSelected: "eventSelected", dateSelected: "dateSelected", openModal: "openModal", closeModal: "closeModal" }, ngImport: i0, template: "<div class=\"align-calendar\">\n <div class=\"calendar-container\">\n <div class=\"calendar-header\">\n <button (click)=\"previousMonth()\"><< Previous >></button>\n <h3>{{ currentDate | date: 'MMMM yyyy' }}</h3>\n <button (click)=\"nextMonth()\"><< Next >></button>\n </div>\n <div class=\"calendar-grid\">\n <div class=\"day-of-week\" *ngFor=\"let day of daysOfWeek\">{{ day }}</div>\n <div\n class=\"calendar-day\"\n *ngFor=\"let day of calendarDays\"\n [class.not-current-month]=\"!day.isCurrentMonth\"\n [class.past]=\"day.isPast\"\n [class.today]=\"day.isToday\"\n [class.future]=\"day.isFuture\"\n [class.selected]=\"day.isSelected\"\n (click)=\"selectDay(day)\"\n >\n <div class=\"day-number\">{{ day.date.getDate() }}\n <span *ngIf=\"day?.events?.length > 0\" class=\"entry-indicator\" [class.select]=\"day?.isSelected\"></span>\n </div>\n <!-- <div *ngFor=\"let event of day.events\" >\n <div *ngFor=\"let entryGroup of event.entries\" class=\"event\">\n <div *ngFor=\"let key of getEntryKeys(entryGroup)\">\n <div *ngIf=\"entryGroup[key].type == 'Time'\">\n {{ entryGroup[key].input?.value | date: 'shortTime' }}\n </div>\n <div *ngIf=\"entryGroup[key].type != 'Time'\">\n {{ entryGroup[key].input }}\n </div>\n </div>\n </div>\n </div> -->\n </div>\n </div>\n </div>\n <div class=\"appoinappointment\">\n <div class=\"appointments-container\">\n <h4>Add Appointment</h4>\n <button *ngIf=\"selectedDay\" (click)=\"addAppointment()\">Add</button>\n </div>\n <!--VD 06Sep24 calendar updates--> \n <!-- RS 09DEC24 Changed keys--> \n <div *ngIf=\"showAppoinmentSection && selectedDay?.events?.length > 0\" class=\"appointments-container\">\n <h4>Appointments</h4>\n <div *ngFor=\"let event of selectedDay?.events\">\n <div class=\"event\" *ngFor=\"let entryGroup of event.entries\">\n <div class=\"event-info\">\n <div *ngFor=\"let key of getEntryKeys(entryGroup)\" class=\"entry-row\">\n <div *ngIf=\"entryGroup[key].questionText\" class=\"entry-text\">\n {{removeCharacters(entryGroup[key].questionText)}}:\n </div>\n <div class=\"entry-value\">\n <!-- VD 09Sep24- date type and link type updates -->\n <span *ngIf=\"entryGroup[key].type != 'Time' && entryGroup[key].type != 'Link'&& entryGroup[key].type != 'Date'\">{{ entryGroup[key].input }}</span>\n <span *ngIf=\"entryGroup[key].type == 'Time'\">{{ entryGroup[key].input | date: 'shortTime' }}</span>\n <span *ngIf=\"entryGroup[key].type == 'Date'\">{{ entryGroup[key].input | date: 'mediumDate' }}</span>\n <span *ngIf=\"entryGroup[key].type == 'Link'\">\n <a [href]=\"'//'+ entryGroup[key].input\" target=\"_blank\">{{removeCharacters(entryGroup[key].questionText)}}</a>\n </span>\n </div>\n </div>\n <div class=\"event-actions\">\n <button (click)=\"editEvent(event,entryGroup)\">Edit</button>\n <button (click)=\"deleteEvent(event.id,entryGroup)\">Delete</button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<!-- <app-custom-model\n [modalTitle]=\"modalTitle\"\n [isModalOpen]=\"isModalOpen\"\n [modalSize]=\"modalSize\"\n [saveButtonValue]=\"saveButtonValue\"\n [modalFooter]=\"modalFooter\"\n (saveButtonEmit)=\"onSave()\"\n (cancelButtonEmit)=\"onCancel()\"\n>\n<lib-questionbook [qbItem]=\"qbRefrenceBook\" [questions]=\"referenceQuestions\" (handleQuestion)=\"handleQuestionEvent($event)\"></lib-questionbook>\n<ng-template dynamicComponentHost ></ng-template>\n</app-custom-model> -->", styles: [".calendar-container{flex:1}.appoinappointment{flex:1;margin-left:10px}.calendar-header{display:flex;justify-content:space-between;align-items:center}.selected{box-shadow:0 0 5px #00000080;background-color:green!important;color:#fff!important}.calendar-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:5px}.day-of-week{text-align:center;font-weight:700;padding:5px;background-color:#f0f0f0;border:1px solid #ccc}.calendar-day{border:1px solid #ccc;padding:5px;display:flex;flex-direction:column;align-items:flex-start;background-color:#fff;position:relative;cursor:pointer}.calendar-day.not-current-month{background-color:#f0f0f0}.calendar-day.past{color:#aaa}.calendar-day.today{background-color:#e6ffe6;font-weight:700}.calendar-day.future{color:#000}.day-number{font-size:1.2em;margin-bottom:5px}.event{background-color:#d1e7dd;border-left:4px solid #0f5132;margin:5px 0;padding:2px 5px;border-radius:3px}.event-title{font-weight:700}.event-time{font-size:.8em}input[type=text],input[type=time]{width:100%;margin-top:5px;box-sizing:border-box}button{margin-top:5px;align-self:stretch;margin-left:0!important}.calendar-header button{margin-top:5px;align-self:stretch;margin-left:0!important;border:none;background:none}.align-calendar{display:flex;width:100%}.form-group.content-box{padding-bottom:0!important}.entry-indicator{position:absolute;top:5px;right:5px;width:10px;height:10px;background-color:#0f5132;border-radius:50%}.select{background-color:#fff}.entry-row{display:flex;align-items:center;margin-bottom:5px}.entry-text{font-weight:700;margin-right:10px;white-space:nowrap}.entry-value{flex:1;word-break:break-word}.entry-value a{color:#4caf50}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CustomCalendarComponent, decorators: [{
type: Component,
args: [{ selector: 'app-custom-calendar', standalone: true, imports: [
CommonModule,
], template: "<div class=\"align-calendar\">\n <div class=\"calendar-container\">\n <div class=\"calendar-header\">\n <button (click)=\"previousMonth()\"><< Previous >></button>\n <h3>{{ currentDate | date: 'MMMM yyyy' }}</h3>\n <button (click)=\"nextMonth()\"><< Next >></button>\n </div>\n <div class=\"calendar-grid\">\n <div class=\"day-of-week\" *ngFor=\"let day of daysOfWeek\">{{ day }}</div>\n <div\n class=\"calendar-day\"\n *ngFor=\"let day of calendarDays\"\n [class.not-current-month]=\"!day.isCurrentMonth\"\n [class.past]=\"day.isPast\"\n [class.today]=\"day.isToday\"\n [class.future]=\"day.isFuture\"\n [class.selected]=\"day.isSelected\"\n (click)=\"selectDay(day)\"\n >\n <div class=\"day-number\">{{ day.date.getDate() }}\n <span *ngIf=\"day?.events?.length > 0\" class=\"entry-indicator\" [class.select]=\"day?.isSelected\"></span>\n </div>\n <!-- <div *ngFor=\"let event of day.events\" >\n <div *ngFor=\"let entryGroup of event.entries\" class=\"event\">\n <div *ngFor=\"let key of getEntryKeys(entryGroup)\">\n <div *ngIf=\"entryGroup[key].type == 'Time'\">\n {{ entryGroup[key].input?.value | date: 'shortTime' }}\n </div>\n <div *ngIf=\"entryGroup[key].type != 'Time'\">\n {{ entryGroup[key].input }}\n </div>\n </div>\n </div>\n </div> -->\n </div>\n </div>\n </div>\n <div class=\"appoinappointment\">\n <div class=\"appointments-container\">\n <h4>Add Appointment</h4>\n <button *ngIf=\"selectedDay\" (click)=\"addAppointment()\">Add</button>\n </div>\n <!--VD 06Sep24 calendar updates--> \n <!-- RS 09DEC24 Changed keys--> \n <div *ngIf=\"showAppoinmentSection && selectedDay?.events?.length > 0\" class=\"appointments-container\">\n <h4>Appointments</h4>\n <div *ngFor=\"let event of selectedDay?.events\">\n <div class=\"event\" *ngFor=\"let entryGroup of event.entries\">\n <div class=\"event-info\">\n <div *ngFor=\"let key of getEntryKeys(entryGroup)\" class=\"entry-row\">\n <div *ngIf=\"entryGroup[key].questionText\" class=\"entry-text\">\n {{removeCharacters(entryGroup[key].questionText)}}:\n </div>\n <div class=\"entry-value\">\n <!-- VD 09Sep24- date type and link type updates -->\n <span *ngIf=\"entryGroup[key].type != 'Time' && entryGroup[key].type != 'Link'&& entryGroup[key].type != 'Date'\">{{ entryGroup[key].input }}</span>\n <span *ngIf=\"entryGroup[key].type == 'Time'\">{{ entryGroup[key].input | date: 'shortTime' }}</span>\n <span *ngIf=\"entryGroup[key].type == 'Date'\">{{ entryGroup[key].input | date: 'mediumDate' }}</span>\n <span *ngIf=\"entryGroup[key].type == 'Link'\">\n <a [href]=\"'//'+ entryGroup[key].input\" target=\"_blank\">{{removeCharacters(entryGroup[key].questionText)}}</a>\n </span>\n </div>\n </div>\n <div class=\"event-actions\">\n <button (click)=\"editEvent(event,entryGroup)\">Edit</button>\n <button (click)=\"deleteEvent(event.id,entryGroup)\">Delete</button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<!-- <app-custom-model\n [modalTitle]=\"modalTitle\"\n [isModalOpen]=\"isModalOpen\"\n [modalSize]=\"modalSize\"\n [saveButtonValue]=\"saveButtonValue\"\n [modalFooter]=\"modalFooter\"\n (saveButtonEmit)=\"onSave()\"\n (cancelButtonEmit)=\"onCancel()\"\n>\n<lib-questionbook [qbItem]=\"qbRefrenceBook\" [questions]=\"referenceQuestions\" (handleQuestion)=\"handleQuestionEvent($event)\"></lib-questionbook>\n<ng-template dynamicComponentHost ></ng-template>\n</app-custom-model> -->", styles: [".calendar-container{flex:1}.appoinappointment{flex:1;margin-left:10px}.calendar-header{display:flex;justify-content:space-between;align-items:center}.selected{box-shadow:0 0 5px #00000080;background-color:green!important;color:#fff!important}.calendar-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:5px}.day-of-week{text-align:center;font-weight:700;padding:5px;background-color:#f0f0f0;border:1px solid #ccc}.calendar-day{border:1px solid #ccc;padding:5px;display:flex;flex-direction:column;align-items:flex-start;background-color:#fff;position:relative;cursor:pointer}.calendar-day.not-current-month{background-color:#f0f0f0}.calendar-day.past{color:#aaa}.calendar-day.today{background-color:#e6ffe6;font-weight:700}.calendar-day.future{color:#000}.day-number{font-size:1.2em;margin-bottom:5px}.event{background-color:#d1e7dd;border-left:4px solid #0f5132;margin:5px 0;padding:2px 5px;border-radius:3px}.event-title{font-weight:700}.event-time{font-size:.8em}input[type=text],input[type=time]{width:100%;margin-top:5px;box-sizing:border-box}button{margin-top:5px;align-self:stretch;margin-left:0!important}.calendar-header button{margin-top:5px;align-self:stretch;margin-left:0!important;border:none;background:none}.align-calendar{display:flex;width:100%}.form-group.content-box{padding-bottom:0!important}.entry-indicator{position:absolute;top:5px;right:5px;width:10px;height:10px;background-color:#0f5132;border-radius:50%}.select{background-color:#fff}.entry-row{display:flex;align-items:center;margin-bottom:5px}.entry-text{font-weight:700;margin-right:10px;white-space:nowrap}.entry-value{flex:1;word-break:break-word}.entry-value a{color:#4caf50}\n"] }]
}], ctorParameters: () => [{ type: i1.ChangeService }], propDecorators: { eventSelected: [{
type: Output
}], dateSelected: [{
type: Output
}], openModal: [{
type: Output
}], closeModal: [{
type: Output
}], allEvents: [{
type: Input
}], question: [{
type: Input
}], nxtId: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLWNhbGVuZGFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1hcHAvc3JjL2xpYi9jb21wb25lbnRzL2N1c3RvbS1jYWxlbmRhci9jdXN0b20tY2FsZW5kYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnh0LWFwcC9zcmMvbGliL2NvbXBvbmVudHMvY3VzdG9tLWNhbGVuZGFyL2N1c3RvbS1jYWxlbmRhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUE0QixNQUFNLGVBQWUsQ0FBQztBQUtySCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7QUFtQi9DLE1BQU0sT0FBTyx1QkFBdUI7SUFnQ2I7SUEvQlgsYUFBYSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFDbEQsOEJBQThCO0lBQ3BCLFlBQVksR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBQ3ZDLFNBQVMsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBQ3BDLFVBQVUsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBQ3RDLFNBQVMsR0FBVSxFQUFFLENBQUM7SUFDdEIsUUFBUSxDQUFVO0lBQ2xCLEtBQUssQ0FBUztJQUN2QiwyRkFBMkY7SUFDM0YsT0FBTyxHQUFHLEVBQUUsQ0FBQztJQUNiLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztJQUN4QixjQUFjLENBQUs7SUFDbkIsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0lBQ3RCLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDZCxXQUFXLEdBQVMsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUMvQixZQUFZLEdBQWtCLEVBQUUsQ0FBQztJQUNqQyxVQUFVLEdBQWEsQ0FBQyxRQUFRLEVBQUUsUUFB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Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gJy4uLy4uL3dyYXBwZXInO1xuLy9pbXBvcnQgeyBRdWVzdGlvbmJvb2tDb21wb25lbnQgfSBmcm9tICcuLi8uLi9wYWdlcy9xdWVzdGlvbmJvb2svcXVlc3Rpb25ib29rLmNvbXBvbmVudCc7XG4vL2ltcG9ydCB7IENvbXBvbmVudGhvc3REaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2NvbXBvbmVudGhvc3QvY29tcG9uZW50aG9zdC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQ2hhbmdlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NoYW5nZS5zZXJ2aWNlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbnRlcmZhY2UgQ2FsZW5kYXJEYXkge1xuICBkYXRlOiBEYXRlO1xuICBldmVudHM6IGFueVtdO1xuICBpc0N1cnJlbnRNb250aDogYm9vbGVhbjtcbiAgaXNQYXN0OiBib29sZWFuO1xuICBpc1RvZGF5OiBib29sZWFuO1xuICBpc0Z1dHVyZTogYm9vbGVhbjtcbiAgaXNTZWxlY3RlZD86IGJvb2xlYW47XG59XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtY3VzdG9tLWNhbGVuZGFyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2N1c3RvbS1jYWxlbmRhci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2N1c3RvbS1jYWxlbmRhci5jb21wb25lbnQuY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIEN1c3RvbUNhbGVuZGFyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQE91dHB1dCgpIGV2ZW50U2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gVkQgMDZTZXAyNCBjYWxlbmRhciBjaGFuZ2VzXG4gIEBPdXRwdXQoKSBkYXRlU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG9wZW5Nb2RhbCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgY2xvc2VNb2RhbCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBASW5wdXQoKSBhbGxFdmVudHM6IGFueVtdID0gW107IFxuICBASW5wdXQoKSBxdWVzdGlvbjogUXVlc3Rpb25cbiAgQElucHV0KCkgbnh0SWQ6IHN0cmluZztcbiAgLy9AVmlld0NoaWxkKENvbXBvbmVudGhvc3REaXJlY3RpdmUsIHsgc3RhdGljOiB0cnVlIH0pIGR5bmFtaWNIb3N0OiBDb21wb25lbnRob3N0RGlyZWN0aXZlO1xuICBlbnRyaWVzID0gW107XG4gIHJlZmVyZW5jZVF1ZXN0aW9ucyA9IFtdO1xuICBxYlJlZnJlbmNlQm9vazphbnk7XG4gIGNhbGVuZGFyUXVlc3Rpb24gPSBbXTtcbiAgY2FsZW5kYXIgPSB7fTtcbiAgY3VycmVudERhdGU6IERhdGUgPSBuZXcgRGF0ZSgpO1xuICBjYWxlbmRhckRheXM6IENhbGVuZGFyRGF5W10gPSBbXTtcbiAgZGF5c09mV2Vlazogc3RyaW5nW10gPSBbJ1N1bmRheScsICdNb25kYXknLCAnVHVlc2RheScsICdXZWRuZXNkYXknLCAnVGh1cnNkYXknLCAnRnJpZGF5JywgJ1NhdHVyZGF5J107XG4gIG5ld0V2ZW50VGl0bGU6IHN0cmluZyA9ICcnO1xuICBuZXdFdmVudFRpbWU6IHN0cmluZyA9ICcnO1xuICBuZXdEZXNjcmlwdGlvbjogc3RyaW5nID0gJyc7XG4gIG5ld0xpbms6IHN0cmluZyA9ICcnO1xuICBzZWxlY3RlZERheTogQ2FsZW5kYXJEYXkgfCBudWxsID0gbnVsbDtcbiAgaXNNb2RhbE9wZW4gPSBmYWxzZTtcbiAgbW9kYWxUaXRsZSA9ICdDdXN0b20gTW9kYWwnO1xuICBtb2RhbFNpemUgPSAnbGFyZ2UnO1xuICBzYXZlQnV0dG9uVmFsdWUgPSAnU2F2ZSc7XG4gIG1vZGFsRm9vdGVyID0gdHJ1ZTtcbiAgZWRpdGluZ0V2ZW50SWQ6IG51bWJlcjtcbiAgZWRpdGluZ0VudHJ5R3JvdXA6IGFueTtcbiAgc2hvd0FwcG9pbm1lbnRTZWN0aW9uOiBib29sZWFuID0gdHJ1ZTtcbiAgc3Vic2NyaXB0aW9uOiBhbnk7XG4gIGNvbnN0cnVjdG9yKCBwcml2YXRlIGNoYW5nZVNlcnZpY2U6IENoYW5nZVNlcnZpY2UpIHsgfVxuICBuZ09uSW5pdCgpIHtcbiAgICAgaWYodGhpcy5xdWVzdGlvbj8uaW5wdXQpe1xuICAgICAgdGhpcy5hbGxFdmVudHMgPSB0aGlzLnF1ZXN0aW9uLmlucHV0O1xuICAgICB9XG4gICAgdGhpcy5wcm9jZXNzUXVlc3Rpb24oKTtcbiAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHRoaXMuY2hhbmdlU2VydmljZS5jdXN0b21DaGFuZ2UkLnN1YnNjcmliZShcbiAgICAgIChjaGFuZ2VWYWx1ZSkgPT4ge1xuICAgICAgICAgIGlmKGNoYW5nZVZhbHVlID09ICdjYWxlbmRhci1tb2RhbC1zYXZlJykge1xuICAgICAgICAgICAgdGhpcy5vblNhdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYoY2hhbmdlVmFsdWUgPT0gJ2RhdGFCaW5kJykge1xuICAgICAgICAgICAgaWYodGhpcy5xdWVzdGlvbj8uaW5wdXQpe1xuICAgICAgICAgICAgICB0aGlzLmFsbEV2ZW50cyA9IHRoaXMucXVlc3Rpb24uaW5wdXQ7XG4gICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzUXVlc3Rpb24oKTtcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICAgLy8gdGhpcy5kYXRlU2VsZWN0ZWQuZW1pdCh0aGlzLmNhbGVuZGFyKTtcbiAgICAvL3RoaXMuZXZlbnRTZWxlY3RlZC5lbWl0KHRoaXMuYWxsRXZlbnRzKTtcbiAgfVxuICAvLyBSUyAwOURFQzI0IENoYW5nZWQga2V5c1xuICBwcm9jZXNzUXVlc3Rpb24oKXtcbiAgICAvLyBTS1MyME1BUjI1IGNoZWNrIGlmIHF1ZXN0aW9uIGZpZWxkc21ldGEgaXMgc3RyaW5nXG4gICAgdGhpcy5lbnRyaWVzID0gIHR5cGVvZiB0aGlzLnF1ZXN0aW9uWydmaWVsZHNNZXRhJ10gPT09ICdvYmplY3QnICA/ICB0aGlzLnF1ZXN0aW9uWydmaWVsZHNNZXRhJ10gfHwgW10gOiBKU09OLnBhcnNlKCB0aGlzLnF1ZXN0aW9uWydmaWVsZHNNZXRhJ10pIDtcbiAgICB0aGlzLnFiUmVmcmVuY2VCb29rID0gdHlwZW9mIHRoaXMucXVlc3Rpb25bJ3FiUmVmZXJlbmNlUXVlc3Rpb25zJ10gPT09ICdvYmplY3QnICA/ICB0aGlzLnF1ZXN0aW9uWydxYlJlZmVyZW5jZVF1ZXN0aW9ucyddIDogSlNPTi5wYXJzZSggdGhpcy5xdWVzdGlvblsncWJSZWZlcmVuY2VRdWVzdGlvbnMnXSkgO1xuICAgIGxldCB0aXRsZSA9IHRoaXMucWJSZWZyZW5jZUJvb2s/LnF1ZXN0aW9uYm9vaz8udGl0bGU7XG4gICAgdGhpcy5tb2RhbFRpdGxlID0gdGl0bGU7XG4gICAgdGhpcy5yZWZlcmVuY2VRdWVzdGlvbnMgPSBbXTtcbiAgICBpZih0aGlzLmVudHJpZXMubGVuZ3RoID4gMCl7XG4gICAgICAgdGhpcy5lbnRyaWVzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgIGlmKGVsZW1lbnQucXVlc3Rpb25SZWZlcmVuY2Upe1xuICAgICAgICAgICAgIGxldCBxUmVmZXJlbmNlID0gSlNPTi5wYXJzZShlbGVtZW50LnF1ZXN0aW9uUmVmZXJlbmNlKTtcbiAgICAgICAgICAgICB0aGlzLnJlZmVyZW