UNPKG

@skireal/form-builder

Version:
426 lines 78.3 kB
import { __decorate } from "tslib"; import { Component, EventEmitter, Input, Output } from '@angular/core'; import { moveItemInArray } from '@angular/cdk/drag-drop'; import { FormFieldType, defaultConditionalLogicBlock, fieldTypesNames, uniqueFieldTypes } from '../../constants/ui-constants'; import { UiFormService } from '../../services/ui-form.service'; import { FormDataService } from '../../services/form-data.service'; import { ConfirmationService } from '../../services/confirmation.service'; import { LocaleService } from '../../services/locale.service'; let UIComponent = class UIComponent { constructor(uiFormService, formDataService, confirmationService, localeService) { this.uiFormService = uiFormService; this.formDataService = formDataService; this.confirmationService = confirmationService; this.localeService = localeService; this.enableGeneralFields = true; this.enableConditionalLogicBlocks = false; this.isSurvey = true; this.incomingFormData = { formData: { steps: [], generalFields: [] }, options: { name: '', type: '', country: '' }, uniqueFormData: [] }; this.enableSetValidationOptions = false; this.locale = {}; this.saveClicked = new EventEmitter(); this.formFieldType = FormFieldType; this.formData = { formData: { steps: [], generalFields: [] }, options: { name: '', type: '', country: '' }, uniqueFormData: [] }; this.addedFields = []; this.generalFields = []; this.conditionalLogicBlocks = []; this.fieldLabels = fieldTypesNames; this.currentStep = 0; this.usedFieldTypes = []; this.isSidebarOpen = false; this.isFieldsInsertingOpen = false; this.isFieldPropertiesOpen = false; this.isGeneral = false; this.fieldToEdit = { id: '', name: '' }; this.hasFeedBackText = false; this.editedFieldId = null; } ngOnInit() { this.insertFormData(); this.createForm(); this.initializeUsedFieldTypes(this.addedFields); this.updateSpecialFieldStates(); if (this.locale) { this.localeService.setLocale(this.locale); } } ngOnChanges(changes) { if (changes['locale'] && this.locale) { this.localeService.setLocale(this.locale); } } createForm() { this.dynamicForm = this.uiFormService.createFormGroup(this.addedFields); if (this.enableGeneralFields) { this.generalForm = this.uiFormService.createFormGroup(this.generalFields); } } removeField(field, isGeneral) { let fieldsArray; let formGroup; if (isGeneral) { fieldsArray = this.generalFields; formGroup = this.generalForm; } else { fieldsArray = this.addedFields; formGroup = this.dynamicForm; } const index = fieldsArray.indexOf(field); if (index !== -1) { fieldsArray.splice(index, 1); formGroup.removeControl(field.id); } if (this.isFieldUnique(field.type)) { const typeIndex = this.usedFieldTypes.indexOf(field.type); if (typeIndex !== -1) { this.usedFieldTypes.splice(typeIndex, 1); } } this.saveCurrentStepData(); } copyField(field, isGeneral) { let fieldsArray; let formGroup; if (isGeneral) { fieldsArray = this.generalFields; formGroup = this.generalForm; } else { fieldsArray = this.addedFields; formGroup = this.dynamicForm; } const copiedField = Object.assign({}, field); copiedField.id = this.uiFormService.generateUniqueId(); if (copiedField.feedBackText) { copiedField.feedBackText = false; } const originalFieldIndex = fieldsArray.indexOf(field); fieldsArray.splice(originalFieldIndex + 1, 0, copiedField); const newFormControl = this.uiFormService.createControl(); formGroup.addControl(copiedField.id, newFormControl); this.saveCurrentStepData(); } insertConditionalLogicBlock() { const newBlock = defaultConditionalLogicBlock; this.conditionalLogicBlocks.push(newBlock); this.saveCurrentStepData(); } removeConditionalLogicBlock(index) { this.conditionalLogicBlocks.splice(index, 1); this.saveCurrentStepData(); } goToStep(step) { this.currentStep = step; if (!this.formData.formData.steps[this.currentStep]) { this.formData.formData.steps[this.currentStep] = { addedFields: [], conditionalLogicBlocks: [] }; } this.updateStep(); } goToNextStep() { if (this.addedFields.length === 0) { return; } this.saveCurrentStepData(); this.currentStep++; this.goToStep(this.currentStep); } goToPreviousStep() { if (this.currentStep > 0) { this.saveCurrentStepData(); this.currentStep--; this.goToStep(this.currentStep); } } saveCurrentStepData() { this.formData.formData.generalFields = [...this.generalFields]; this.formData.formData.steps[this.currentStep] = { addedFields: [...this.addedFields], conditionalLogicBlocks: [...this.conditionalLogicBlocks] }; this.updateSpecialFieldStates(); } updateSpecialFieldStates() { var _a; const needContactField = this.findFieldInSteps(FormFieldType.NeedContact); this.needContactDefaultValue = (_a = needContactField) === null || _a === void 0 ? void 0 : _a.defaultValue; if (needContactField && needContactField.defaultValue !== undefined && !this.enableSetValidationOptions) { this.updateRequiredFields(needContactField.defaultValue); } this.updateFeedBackTextFields(); } updateFeedBackTextFields() { this.hasFeedBackText = false; for (const step of this.formData.formData.steps) { for (const field of step.addedFields) { if (field.type && [FormFieldType.Text, FormFieldType.Textarea].includes(field.type) && field.feedBackText) { this.hasFeedBackText = true; break; } } if (this.hasFeedBackText) break; } } findFieldInSteps(fieldType) { for (const step of this.formData.formData.steps) { const field = step.addedFields.find((f) => f.type === fieldType); if (field) { return field; } } return undefined; } updateRequiredFields(value) { const isRequired = value === '1'; for (const step of this.formData.formData.steps) { step.addedFields.forEach((field) => { if (field.type && [ FormFieldType.ContactName, FormFieldType.ContactSurname, FormFieldType.ContactEmail ].includes(field.type)) { field.required = isRequired; } }); } } insertFormData() { var _a, _b, _c, _d, _e; const incomingFormData = this.incomingFormData; if (incomingFormData) { this.formData = incomingFormData; } else { this.formData = { formData: { steps: [], generalFields: [] }, options: { name: '', type: '', country: '' }, uniqueFormData: [] }; } this.addedFields = (_b = (_a = this.formData.formData.steps[this.currentStep]) === null || _a === void 0 ? void 0 : _a.addedFields, (_b !== null && _b !== void 0 ? _b : [])); this.generalFields = (_c = this.formData.formData.generalFields, (_c !== null && _c !== void 0 ? _c : [])); this.conditionalLogicBlocks = (_e = (_d = this.formData.formData.steps[this.currentStep]) === null || _d === void 0 ? void 0 : _d.conditionalLogicBlocks, (_e !== null && _e !== void 0 ? _e : [])); } saveForm() { this.saveCurrentStepData(); const payload = this.formDataService.prepareFormData(this.formData); this.formDataService.setFormData(payload); this.saveClicked.emit(payload); } preventDefault(event) { event.preventDefault(); } onDrop(event) { const formArray = event.container.data; moveItemInArray(formArray, event.previousIndex, event.currentIndex); this.saveCurrentStepData(); } copyStep(index) { if (this.addedFields.length === 0) { return; } const copiedStep = Object.assign({}, this.formData.formData.steps[index]); copiedStep.addedFields = copiedStep.addedFields.map((field) => (Object.assign(Object.assign({}, field), { id: this.uiFormService.generateUniqueId() }))); this.formData.formData.steps.splice(index + 1, 0, copiedStep); this.goToStep(index + 1); this.saveCurrentStepData(); } moveStep(index, direction) { if (direction === 'next') { [this.formData.formData.steps[index], this.formData.formData.steps[index + 1]] = [ this.formData.formData.steps[index + 1], this.formData.formData.steps[index] ]; } else if (direction === 'prev') { [this.formData.formData.steps[index], this.formData.formData.steps[index - 1]] = [ this.formData.formData.steps[index - 1], this.formData.formData.steps[index] ]; } this.goToStep(index); this.saveCurrentStepData(); } deleteStepConfirmation(index) { const localizedMessage = this.localeService.getCurrentLocale()['Are you sure you want to delete this step?'] || 'Are you sure you want to delete this step?'; this.confirmationService.open(localizedMessage).then((result) => { if (result) { this.deleteStep(index); } }); } deleteStep(index) { this.formData.formData.steps.splice(index, 1); if (this.currentStep >= index) { this.currentStep = this.currentStep > 0 ? this.currentStep - 1 : 0; } if (this.formData.formData.steps.length > 0) { this.updateStep(); } else { this.addedFields = []; this.conditionalLogicBlocks = []; this.createForm(); } this.saveCurrentStepData(); } updateStep() { this.addedFields = this.formData.formData.steps[this.currentStep].addedFields; this.conditionalLogicBlocks = this.formData.formData.steps[this.currentStep].conditionalLogicBlocks; this.createForm(); } isFieldUnique(fieldType) { return uniqueFieldTypes.includes(fieldType); } toggleSidebar() { this.isSidebarOpen = this.isFieldsInsertingOpen || this.isFieldPropertiesOpen; } toggleFieldsInsertingSidebar(isGeneral = false) { this.isFieldsInsertingOpen = !this.isFieldsInsertingOpen; this.isFieldPropertiesOpen = false; this.isGeneral = isGeneral; this.toggleSidebar(); } toggleFieldPropertiesSidebar(field, isGeneral) { this.isFieldPropertiesOpen = !this.isFieldPropertiesOpen; this.isFieldsInsertingOpen = false; this.toggleSidebar(); this.fieldToEdit = field; this.isGeneral = isGeneral; this.editedFieldId = this.isFieldPropertiesOpen ? field.id : null; if (!this.isSidebarOpen) { this.editedFieldId = null; } } onPropertiesSave(selectedField) { if (selectedField) { const newFormControl = this.uiFormService.createControl(selectedField.defaultValue); if (this.isGeneral) { this.generalFields.push(selectedField); this.generalForm.addControl(selectedField.id, newFormControl); } else { this.addedFields.push(selectedField); this.dynamicForm.addControl(selectedField.id, newFormControl); } this.addUsedFieldType(selectedField.type); this.saveCurrentStepData(); } } onPropertiesSaveAfterEdit(updatedField) { if (updatedField) { let fieldsArray; if (this.isGeneral) { fieldsArray = this.generalFields; } else { fieldsArray = this.addedFields; } const index = fieldsArray.indexOf(this.fieldToEdit); if (index !== -1) { if (updatedField.step !== this.currentStep) { fieldsArray.splice(index, 1); const newStepIndex = updatedField.step; const targetStep = this.formData.formData.steps[newStepIndex]; targetStep.addedFields.push(updatedField); } else { fieldsArray[index] = updatedField; } } if (updatedField.defaultValue !== undefined) { const formControl = this.dynamicForm.get(updatedField.id); if (formControl) { formControl.setValue(updatedField.defaultValue); } } this.saveCurrentStepData(); } } addUsedFieldType(type) { if (this.isFieldUnique(type) && !this.usedFieldTypes.includes(type)) { this.usedFieldTypes.push(type); } } initializeUsedFieldTypes(fields) { fields.forEach((field) => { this.addUsedFieldType(field.type); }); } }; UIComponent.ctorParameters = () => [ { type: UiFormService }, { type: FormDataService }, { type: ConfirmationService }, { type: LocaleService } ]; __decorate([ Input() ], UIComponent.prototype, "enableGeneralFields", void 0); __decorate([ Input() ], UIComponent.prototype, "enableConditionalLogicBlocks", void 0); __decorate([ Input() ], UIComponent.prototype, "isSurvey", void 0); __decorate([ Input() ], UIComponent.prototype, "incomingFormData", void 0); __decorate([ Input() ], UIComponent.prototype, "enableSetValidationOptions", void 0); __decorate([ Input() ], UIComponent.prototype, "locale", void 0); __decorate([ Output() ], UIComponent.prototype, "saveClicked", void 0); UIComponent = __decorate([ Component({ selector: 'app-ui', template: "<div class=\"form-builder__test-form\">\r\n <div class=\"form-builder__test-form__main\" [ngClass]=\"{ collapsed: isSidebarOpen }\">\r\n <div class=\"form-builder__test-form__body\">\r\n <form\r\n *ngIf=\"enableGeneralFields === true\"\r\n [formGroup]=\"generalForm\"\r\n cdkDropList\r\n [cdkDropListData]=\"generalFields\"\r\n (cdkDropListDropped)=\"onDrop($event)\">\r\n <h3 *ngIf=\"generalFields.length\" class=\"form-builder__test-form__step\">\r\n {{ \"General Fields\" | localized }}\r\n </h3>\r\n <ng-container *ngFor=\"let field of generalFields\">\r\n <div\r\n class=\"form-builder__test-form__block\"\r\n [class.form-builder__test-form__block--editing]=\"field.id === editedFieldId\"\r\n cdkDrag>\r\n <div class=\"form-builder__test-form__label\">\r\n <label class=\"form-builder__form-label\">{{ field.title }}</label>\r\n </div>\r\n <div class=\"form-builder__test-form__field\" [ngSwitch]=\"field.type\">\r\n <div class=\"form-builder__test-form__field-label\">\r\n <span>{{ fieldLabels[field.type] | localized }}</span>\r\n </div>\r\n <div class=\"form-builder__test-form__field-toolbar\">\r\n <span\r\n class=\"form-builder__test-form__field-toolbar-icon\"\r\n [attr.data-tooltip]=\"'Delete' | localized\"\r\n (click)=\"removeField(field, true)\"\r\n ><i class=\"form-builder__bi form-builder__bi-trash\"></i\r\n ></span>\r\n <span\r\n class=\"form-builder__test-form__field-toolbar-icon\"\r\n [attr.data-tooltip]=\"'Edit' | localized\"\r\n (click)=\"toggleFieldPropertiesSidebar(field, true)\"\r\n ><i class=\"form-builder__bi form-builder__bi-pencil\"></i\r\n ></span>\r\n <span\r\n class=\"form-builder__test-form__field-toolbar-icon\"\r\n [attr.data-tooltip]=\"'Copy' | localized\"\r\n (click)=\"copyField(field, true)\"\r\n ><i class=\"form-builder__bi form-builder__bi-files\"></i\r\n ></span>\r\n <span\r\n class=\"form-builder__test-form__field-toolbar-icon form-builder__test-form__field-toolbar-icon--move\"\r\n [attr.data-tooltip]=\"'Move' | localized\"\r\n cdkDragHandle>\r\n <i class=\"form-builder__bi form-builder__bi-arrows-move\"></i>\r\n </span>\r\n </div>\r\n\r\n <ng-container *ngSwitchCase=\"formFieldType.Select\">\r\n <select\r\n [id]=\"field.id\"\r\n [formControlName]=\"field.id\"\r\n (mousedown)=\"preventDefault($event)\"\r\n class=\"form-builder__form-select\">\r\n <option value=\"\">{{ field.placeholder }}</option>\r\n <option *ngFor=\"let option of field.options\" [value]=\"option.value\">\r\n {{ option.label }}\r\n </option>\r\n </select>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"formFieldType.Checkbox\">\r\n <input\r\n [id]=\"field.id\"\r\n type=\"checkbox\"\r\n [formControlName]=\"field.id\"\r\n class=\"form-builder__form-check-input\" />\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchDefault>\r\n <input\r\n [id]=\"field.id\"\r\n [type]=\"field.type\"\r\n [formControlName]=\"field.id\"\r\n class=\"form-builder__form-control\"\r\n (mousedown)=\"preventDefault($event)\"\r\n (click)=\"preventDefault($event)\" />\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </form>\r\n <form\r\n [formGroup]=\"dynamicForm\"\r\n cdkDropList\r\n [cdkDropListData]=\"addedFields\"\r\n (cdkDropListDropped)=\"onDrop($event)\">\r\n <h3 class=\"form-builder__test-form__step\">\r\n {{ \"Step\" | localized }} {{ currentStep + 1 }}\r\n </h3>\r\n <ng-container *ngFor=\"let field of addedFields\">\r\n <div\r\n class=\"form-builder__test-form__block\"\r\n [class.form-builder__test-form__block--editing]=\"field.id === editedFieldId\"\r\n cdkDrag>\r\n <div\r\n class=\"form-builder__test-form__label\"\r\n *ngIf=\"\r\n field.type !== formFieldType.Likert &&\r\n field.type !== formFieldType.Csat &&\r\n field.type !== formFieldType.CES &&\r\n field.type !== formFieldType.QE &&\r\n field.type !== formFieldType.NPS\r\n \">\r\n <label class=\"form-builder__form-label\">{{ field.title }}</label>\r\n </div>\r\n <div class=\"form-builder__test-form__field\" [ngSwitch]=\"field.type\">\r\n <div class=\"form-builder__test-form__field-label\">\r\n <span\r\n *ngIf=\"field.feedBackText\"\r\n class=\"form-builder__field-label form-builder__field-label--feedback\"\r\n >{{ \"Feedback\" | localized }}</span\r\n >\r\n <span\r\n *ngIf=\"field.required\"\r\n class=\"form-builder__field-label form-builder__field-label--required\"\r\n >{{ \"Required\" | localized }}</span\r\n >\r\n <span\r\n *ngIf=\"field.active\"\r\n class=\"form-builder__field-label form-builder__field-label--active\"\r\n >{{ \"Active\" | localized }}</span\r\n >\r\n <span\r\n *ngIf=\"field.hasOther\"\r\n class=\"form-builder__field-label form-builder__field-label--other\"\r\n >{{ \"Has Other\" | localized }}</span\r\n >\r\n <span\r\n *ngIf=\"field.hasNA\"\r\n class=\"form-builder__field-label form-builder__field-label--na\"\r\n >{{ \"Has NA\" | localized }}</span\r\n >\r\n <span class=\"form-builder__field-label form-builder__field-label--title\">{{\r\n fieldLabels[field.type] | localized\r\n }}</span>\r\n </div>\r\n <div class=\"form-builder__test-form__field-toolbar\">\r\n <span\r\n class=\"form-builder__test-form__field-toolbar-icon\"\r\n [attr.data-tooltip]=\"'Delete' | localized\"\r\n (click)=\"removeField(field, false)\"\r\n ><i class=\"form-builder__bi form-builder__bi-trash\"></i\r\n ></span>\r\n <span\r\n class=\"form-builder__test-form__field-toolbar-icon\"\r\n [attr.data-tooltip]=\"'Edit' | localized\"\r\n (click)=\"toggleFieldPropertiesSidebar(field, false)\"\r\n ><i class=\"form-builder__bi form-builder__bi-pencil\"></i\r\n ></span>\r\n <span\r\n *ngIf=\"!(field.type | isFieldUnique)\"\r\n class=\"form-builder__test-form__field-toolbar-icon\"\r\n [attr.data-tooltip]=\"'Copy' | localized\"\r\n (click)=\"copyField(field, false)\"\r\n ><i class=\"form-builder__bi form-builder__bi-files\"></i\r\n ></span>\r\n <span\r\n class=\"form-builder__test-form__field-toolbar-icon form-builder__test-form__field-toolbar-icon--move\"\r\n [attr.data-tooltip]=\"'Move' | localized\"\r\n cdkDragHandle>\r\n <i class=\"form-builder__bi form-builder__bi-arrows-move\"></i>\r\n </span>\r\n </div>\r\n <ng-container *ngSwitchCase=\"formFieldType.Textarea\">\r\n <app-textarea [field]=\"field\"></app-textarea>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"formFieldType.Select\">\r\n <app-select [field]=\"field\" [hasOptions]=\"true\"></app-select>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"formFieldType.CountryDropdown\">\r\n <app-select [field]=\"field\" [hasOptions]=\"false\"></app-select>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"formFieldType.CheckboxGroup\">\r\n <app-checkbox-group [field]=\"field\"></app-checkbox-group>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"formFieldType.Checkbox\">\r\n <app-checkbox [field]=\"field\"></app-checkbox>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"formFieldType.Radio\">\r\n <app-radio [field]=\"field\" [formGroup]=\"dynamicForm\"></app-radio>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"formFieldType.NeedContact\">\r\n <app-radio [field]=\"field\" [formGroup]=\"dynamicForm\"></app-radio>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"formFieldType.Likert\">\r\n <app-likert [field]=\"field\" \u0432></app-likert>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"formFieldType.Csat\">\r\n <app-csat [field]=\"field\"></app-csat>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"formFieldType.CES\">\r\n <app-csat [field]=\"field\" [isCes]=\"true\"></app-csat>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"formFieldType.NPS\">\r\n <app-nps [field]=\"field\"></app-nps>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"formFieldType.QE\">\r\n <app-qe [field]=\"field\"></app-qe>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <app-text [field]=\"field\"></app-text>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </form>\r\n <ng-container *ngIf=\"enableConditionalLogicBlocks\">\r\n <ng-container *ngFor=\"let block of conditionalLogicBlocks; let i = index\">\r\n <app-conditional-logic-block\r\n [block]=\"block\"\r\n [addedFields]=\"addedFields\"\r\n (remove)=\"removeConditionalLogicBlock(i)\">\r\n </app-conditional-logic-block>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n <div class=\"form-builder__test-form__footer\">\r\n <div class=\"form-builder__test-form__buttons\">\r\n <button\r\n class=\"form-builder__btn form-builder__btn-primary\"\r\n (click)=\"toggleFieldsInsertingSidebar(false)\">\r\n {{ \"Insert Field\" | localized }}\r\n </button>\r\n <ng-container *ngIf=\"enableGeneralFields\">\r\n <button\r\n class=\"form-builder__btn form-builder__btn-primary\"\r\n (click)=\"toggleFieldsInsertingSidebar(true)\">\r\n {{ \"Insert General Field\" | localized }}\r\n </button>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"enableConditionalLogicBlocks\">\r\n <button\r\n class=\"form-builder__btn form-builder__btn-primary\"\r\n (click)=\"insertConditionalLogicBlock()\">\r\n {{ \"Insert Conditional Logic Block\" | localized }}\r\n </button>\r\n <button\r\n class=\"form-builder__btn form-builder__btn-primary\"\r\n (click)=\"saveCurrentStepData()\"\r\n [disabled]=\"!conditionalLogicBlocks.length\">\r\n {{ \"Save Conditional Logic Blocks Data\" | localized }}\r\n </button>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"form-builder__test-form__buttons\">\r\n <button\r\n *ngIf=\"currentStep > 0\"\r\n class=\"form-builder__btn form-builder__btn-primary\"\r\n (click)=\"goToPreviousStep()\">\r\n {{ \"Previous Step\" | localized }}\r\n </button>\r\n <button class=\"form-builder__btn form-builder__btn-primary\" (click)=\"goToNextStep()\">\r\n {{ \"Next Step\" | localized }}\r\n </button>\r\n <button class=\"form-builder__btn form-builder__btn-success\" (click)=\"saveForm()\">\r\n {{ \"Save\" | localized }}\r\n </button>\r\n </div>\r\n\r\n <ng-container *ngIf=\"formData.formData.steps as steps\">\r\n <ng-container *ngIf=\"steps.length > 0\">\r\n <span>{{ \"Go to\" | localized }}:</span>\r\n </ng-container>\r\n <div class=\"form-builder__test-form__stepButtons\">\r\n <div\r\n class=\"form-builder__test-form__stepButton form-builder__stepButton\"\r\n [ngClass]=\"{ 'form-builder__stepButton--active': i === currentStep }\"\r\n *ngFor=\"let step of steps; let i = index\">\r\n <div class=\"form-builder__stepButton__toolbar\">\r\n <span\r\n class=\"form-builder__stepButton__toolbar-icon\"\r\n [attr.data-tooltip]=\"'Move step' | localized\"\r\n (click)=\"moveStep(i, 'prev')\"\r\n [ngClass]=\"{ 'form-builder__stepButton__toolbar-icon--disabled': i === 0 }\"\r\n ><i class=\"form-builder__bi form-builder__bi-arrow-left\"></i\r\n ></span>\r\n <span\r\n class=\"form-builder__stepButton__toolbar-icon\"\r\n [attr.data-tooltip]=\"'Move step' | localized\"\r\n (click)=\"moveStep(i, 'next')\"\r\n [ngClass]=\"{\r\n 'form-builder__stepButton__toolbar-icon--disabled': i === steps.length - 1\r\n }\"\r\n ><i class=\"form-builder__bi form-builder__bi-arrow-right\"></i\r\n ></span>\r\n <span\r\n class=\"form-builder__stepButton__toolbar-icon\"\r\n [attr.data-tooltip]=\"'Copy step' | localized\"\r\n (click)=\"copyStep(i)\"\r\n ><i class=\"form-builder__bi form-builder__bi-files\"></i\r\n ></span>\r\n <span\r\n class=\"form-builder__stepButton__toolbar-icon\"\r\n [attr.data-tooltip]=\"'Delete step' | localized\"\r\n (click)=\"deleteStepConfirmation(i)\"\r\n [ngClass]=\"{\r\n 'form-builder__stepButton__toolbar-icon--disabled': steps.length === 1\r\n }\"\r\n ><i class=\"form-builder__bi form-builder__bi-trash\"></i\r\n ></span>\r\n </div>\r\n <button class=\"form-builder__btn form-builder__btn-secondary\" (click)=\"goToStep(i)\">\r\n {{ \"Step\" | localized }} {{ i + 1 }}\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"form-builder__test-form__sidebar\"\r\n [ngClass]=\"{ 'form-builder__opened': isSidebarOpen }\">\r\n <app-ui-fields-inserting\r\n *ngIf=\"isFieldsInsertingOpen\"\r\n [isGeneral]=\"isGeneral\"\r\n [enableSetValidationOptions]=\"enableSetValidationOptions\"\r\n [isSurvey]=\"isSurvey\"\r\n [usedFieldTypes]=\"usedFieldTypes\"\r\n [needContactDefaultValue]=\"needContactDefaultValue\"\r\n [hasFeedBackText]=\"hasFeedBackText\"\r\n (propertiesSaved)=\"onPropertiesSave($event)\"\r\n (sidebarClosed)=\"toggleFieldsInsertingSidebar()\">\r\n </app-ui-fields-inserting>\r\n <app-ui-field-properties\r\n *ngIf=\"isFieldPropertiesOpen\"\r\n [field]=\"fieldToEdit\"\r\n [enableSetValidationOptions]=\"enableSetValidationOptions\"\r\n [isSurvey]=\"isSurvey\"\r\n [currentStep]=\"currentStep\"\r\n [stepsLength]=\"formData.formData.steps.length\"\r\n [needContactDefaultValue]=\"needContactDefaultValue\"\r\n [hasFeedBackText]=\"hasFeedBackText\"\r\n (propertiesSaved)=\"onPropertiesSaveAfterEdit($event)\"\r\n (sidebarClosed)=\"toggleFieldPropertiesSidebar()\">\r\n </app-ui-field-properties>\r\n </div>\r\n</div>\r\n", styles: ["@charset \"UTF-8\";.form-builder__bi::before,[class*=\" form-builder__bi-\"]::before,[class^=form-builder__bi-]::before{display:inline-block;font-family:bootstrap-icons!important;font-style:normal;font-weight:400!important;font-variant:normal;text-transform:none;line-height:1;vertical-align:-.125em;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.form-builder__bi-arrow-right::before{content:\"\uF138\"}.form-builder__bi-pencil::before{content:\"\uF4CB\"}.form-builder__bi-trash::before{content:\"\uF5DE\"}.form-builder__bi-files::before{content:\"\uF3C2\"}.form-builder__bi-arrows-move::before{content:\"\uF14E\"}.form-builder__bi-arrow-left::before{content:\"\uF12F\"}.form-builder__btn{display:inline-block;box-sizing:border-box;align-items:flex-start;padding:6px 12px;font-weight:400;text-align:center;-webkit-text-decoration:none #fff solid auto;text-decoration:none #fff solid auto;text-indent:0;text-shadow:none;text-transform:none;vertical-align:middle;word-spacing:normal;letter-spacing:normal;line-height:18px;color:#fff;background-color:rgba(169,157,184,.8);border:.8px solid rgba(169,157,184,.8);border-radius:6px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:auto;text-rendering:auto;-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}.form-builder__btn-sm{padding:3px 10px;font-size:.75rem}.form-builder__btn-primary{background-color:rgba(169,157,184,.8);border-color:rgba(169,157,184,.8)}.form-builder__btn-primary:active,.form-builder__btn-primary:hover{background-color:#a99db8;border-color:#a99db8}.form-builder__btn-secondary{background-color:rgba(148,169,160,.8);border-color:rgba(148,169,160,.8)}.form-builder__btn-secondary:active,.form-builder__btn-secondary:hover{background-color:#94a9a0;border-color:#94a9a0}.form-builder__btn-danger{background-color:rgba(230,88,88,.8);border-color:rgba(230,88,88,.8)}.form-builder__btn-danger:active,.form-builder__btn-danger:hover{background-color:#e65858;border-color:#e65858}.form-builder__btn-success{background-color:rgba(81,167,76,.8);border-color:rgba(81,167,76,.8)}.form-builder__btn-success:active,.form-builder__btn-success:hover{background-color:#51a74c;border-color:#51a74c}.form-builder__test-form{display:flex;align-items:flex-start;justify-content:space-between;overflow:hidden;position:relative;padding-bottom:50px}.form-builder__test-form__header{padding-top:10px;padding-bottom:10px;margin-bottom:40px}.form-builder__test-form__main{flex-shrink:0;width:100%;transition:.3s}.form-builder__test-form__main.collapsed{flex-shrink:1;width:55%}.form-builder__test-form__main.collapsed .form-builder__field-label:not(.form-builder__field-label--title){font-size:0;width:16px;padding:0;height:16px;margin-right:2px}.form-builder__test-form__sidebar{background-color:#f7f7f7;padding:25px;position:fixed;width:45%;top:0;right:0;height:100%;visibility:hidden;transform:translateX(100%);transition:transform .3s;box-shadow:-2px 0 5px rgba(0,0,0,.2);z-index:500;min-height:100%;box-sizing:border-box;overflow-y:auto}@media screen and (max-width:1000px){.form-builder__test-form__main.collapsed,.form-builder__test-form__sidebar{width:100%}}@media screen and (max-width:450px){.form-builder__test-form__sidebar{padding:15px}}.form-builder__test-form__sidebar.form-builder__opened{visibility:visible;transform:translateX(0)}.form-builder__test-form__title{text-align:center;font-size:3rem;margin-bottom:10px;margin-top:10px}.form-builder__test-form__step{text-align:center;text-transform:uppercase;margin-bottom:25px}.form-builder__test-form__body{min-height:200px;padding-left:20px;padding-right:20px}.form-builder__test-form__footer{padding-left:20px;padding-right:20px}.form-builder__test-form__block{background-color:rgba(148,169,160,.15);padding-bottom:40px;padding-top:33px;position:relative;margin-bottom:20px;border:1px solid #e5e7ebba;border-radius:5px}.form-builder__test-form__block:hover{background-color:rgba(148,169,160,.08)}.form-builder__test-form__block:hover .form-builder__test-form__field-toolbar{opacity:1}.form-builder__test-form__block--editing,.form-builder__test-form__block--editing:hover{background-color:rgba(169,157,184,.5)}.form-builder__test-form__field{padding-left:60px;padding-right:60px}@media screen and (max-width:768px){.form-builder__test-form__field{padding-left:20px;padding-right:20px}}.form-builder__test-form__field-label{position:absolute;right:10px;top:5px;display:flex;align-items:flex-start}.form-builder__test-form__field-toolbar{opacity:0;transition:.2s;position:absolute;left:10px;top:7px;display:flex}.form-builder__test-form__field-toolbar-icon{display:block;margin-right:5px;cursor:pointer;position:relative;padding:2px}.form-builder__test-form__field-toolbar-icon:before{content:attr(data-tooltip);position:absolute;left:50%;transform:translate(-50%,-100%);top:0;background:rgba(0,0,0,.8);color:#fff;padding:4px 8px;border-radius:4px;font-size:14px;white-space:nowrap;visibility:hidden;opacity:0;transition:opacity .3s,visibility .3s;z-index:1}.form-builder__test-form__field-toolbar-icon:hover:before{visibility:visible;opacity:1}.form-builder__test-form__field-toolbar-icon:last-child{margin-right:0}.form-builder__test-form__field-toolbar-icon .form-builder__bi:before{font-size:16px}.form-builder__test-form__field-toolbar-icon--move{cursor:move}.form-builder__test-form__label{padding-left:60px;padding-right:60px}@media screen and (max-width:768px){.form-builder__test-form__label{padding-left:20px;padding-right:20px}}.form-builder__test-form__buttons{display:flex;margin-bottom:30px;justify-content:flex-start;flex-wrap:wrap;gap:10px}.form-builder__test-form__buttons .form-builder__btn:last-child{margin-right:0}.form-builder__test-form__stepButtons{display:flex;flex-wrap:wrap;gap:10px;margin-bottom:30px}.form-builder__test-form__stepButton:last-child{margin-right:0}.form-builder__test-form .form-builder__form-check-label{pointer-events:none}.form-builder__test-form .form-builder__form-check{background-color:#fff}.form-builder__test-form .form-builder__form-check input{pointer-events:none}.cdk-drop-list-dragging .cdk-drag{transition:transform 250ms cubic-bezier(0,0,.2,1)}.cdk-drag-animating{transition:transform .1s cubic-bezier(0,0,.2,1)}.cdk-drag-placeholder{opacity:0}.cdk-drag-preview{background-color:#fff;transition:transform 250ms cubic-bezier(0,0,.2,1)}.form-builder__test-form__block.cdk-drag-preview{box-sizing:border-box;background-color:rgba(148,169,160,.7)}.form-builder__stepButton{position:relative}.form-builder__stepButton:hover .form-builder__stepButton__toolbar{opacity:.8;pointer-events:auto}.form-builder__stepButton__toolbar{display:grid;grid-template-columns:repeat(2,.4fr);grid-gap:5px;justify-content:center;position:absolute;left:0;top:100%;opacity:0;transition:.2s;z-index:1;width:100%;margin-right:-5px;pointer-events:none;background-color:#fff}.form-builder__stepButton__toolbar-icon{display:flex;justify-content:center;align-items:center;cursor:pointer;position:relative;padding:2px}.form-builder__stepButton__toolbar-icon:before{content:attr(data-tooltip);position:absolute;left:50%;transform:translate(-50%,0);top:100%;background:rgba(0,0,0,.8);color:#fff;padding:4px 8px;border-radius:4px;font-size:14px;white-space:nowrap;visibility:hidden;opacity:0;transition:opacity .3s,visibility .3s;z-index:1;pointer-events:none}.form-builder__stepButton__toolbar-icon:hover:before{visibility:visible;opacity:1}.form-builder__stepButton__toolbar-icon .form-builder__bi:before{font-size:16px}.form-builder__stepButton__toolbar-icon--disabled{opacity:.5;pointer-events:none}.form-builder__stepButton--active .form-builder__btn-secondary{background-color:#94a9a0;border-color:#94a9a0}.form-builder__qe-scale__container h3{font-size:1.1em}.form-builder__qe-scale__child h3{font-size:1em}.form-builder__field-label{padding:2px 6px;font-size:12px;border-radius:4px;margin-right:6px;color:#fff;white-space:nowrap;display:flex;align-items:center;justify-content:center}@media screen and (max-width:450px){.form-builder__field-label:not(.form-builder__field-label--title){font-size:0;width:16px;padding:0;height:16px;margin-right:2px}}.form-builder__field-label:last-child{margin-right:0}.form-builder__field-label--required{background-color:#d9534f}.form-builder__field-label--active{background-color:#5cb85c}.form-builder__field-label--other{background-color:#0275d8}.form-builder__field-label--na{background-color:#ce9229}.form-builder__field-label--feedback{background-color:#19a99d}.form-builder__field-label--title{background:rgba(0,0,0,.8);padding:4px 8px;font-size:14px}"] }) ], UIComponent); export { UIComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHNraXJlYWwvZm9ybS1idWlsZGVyLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvdWkvdWkuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUU5RixPQUFPLEVBQWUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFNdEUsT0FBTyxFQUVMLGFBQWEsRUFDYiw0QkFBNEIsRUFDNUIsZUFBZSxFQUNmLGdCQUFnQixFQUNqQixNQUFNLDhCQUE4QixDQUFDO0FBQ3RDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDbkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDMUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBTzlELElBQWEsV0FBVyxHQUF4QixNQUFhLFdBQVc7SUFtRHRCLFlBQ1UsYUFBNEIsRUFDNUIsZUFBZ0MsRUFDaEMsbUJBQXdDLEVBQ3hDLGFBQTRCO1FBSDVCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBdEQ3Qix3QkFBbUIsR0FBRyxJQUFJLENBQUM7UUFDM0IsaUNBQTRCLEdBQUcsS0FBSyxDQUFDO1FBQ3JDLGFBQVEsR0FBRyxJQUFJLENBQUM7UUFDaEIscUJBQWdCLEdBQW9CO1lBQzNDLFFBQVEsRUFBRTtnQkFDUixLQUFLLEVBQUUsRUFBRTtnQkFDVCxhQUFhLEVBQUUsRUFBRTthQUNsQjtZQUNELE9BQU8sRUFB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