ngx-surveys
Version:
Angular 18+ survey / form builder
245 lines (244 loc) • 62.7 kB
JavaScript
import { Component, Input, Output, EventEmitter, ViewChildren } from '@angular/core';
import { moveItemInArray } from '@angular/cdk/drag-drop';
import * as _ from 'lodash';
import * as moment from 'moment';
import { DialogSectionEdit, DialogItemEdit, DialogItemVisibility } from '../dialogs/index';
import { buildField } from '../form-item/index';
import * as i0 from "@angular/core";
import * as i1 from "../ngx-survey.service";
import * as i2 from "@angular/material/dialog";
import * as i3 from "@angular/common";
import * as i4 from "@angular/forms";
import * as i5 from "@angular/material/button";
import * as i6 from "@angular/material/tooltip";
import * as i7 from "@angular/material/icon";
import * as i8 from "@angular/material/card";
import * as i9 from "@angular/cdk/drag-drop";
import * as i10 from "../form-item/form-item.component";
export class FormBuilderComponent {
set form(form) {
this._form = this.service.initForm(form, this.formValues);
//console.log(this._form);
}
;
get form() {
return this._form;
}
onSectionDropped(event) {
const previousIndex = this.form.findIndex(row => event.item && row === event.item.data);
moveItemInArray(this.form, previousIndex, event.currentIndex);
this.form = this.form.slice();
this.changes.emit(this.form);
}
onItemDropped(event, section) {
const previousIndex = (section.items || []).findIndex(row => event.item && row === event.item.data);
moveItemInArray((section.items || []), previousIndex, event.currentIndex);
section.items = (section.items || []).slice();
this.changes.emit(this.form);
}
constructor(service, dialog) {
this.service = service;
this.dialog = dialog;
this.changes = new EventEmitter();
this.onFieldAdded = new EventEmitter();
this.allowMultiChoiseFieldsOnly = false;
this.enableEditFieldValues = true;
this.showFieldNames = true;
this.readOnly = false;
this.formValues = {};
this.sortableSectionOptions = {
onUpdate: (event) => {
//event;
//console.log(event);
this.changes.emit(this.form);
},
//handle: '.sortable-handle'
};
this.sortableItemOptions = {
onUpdate: (event) => {
//event;
//console.log(event);
this.changes.emit(this.form);
},
handle: '.form-item'
};
}
openSectionDialog(section) {
const dialogRef = this.dialog.open(DialogSectionEdit, {
minWidth: '450px',
data: {
params: {
readOnly: this.readOnly,
},
section: section
},
});
dialogRef.afterClosed().subscribe(result => {
console.log('The dialog was closed', result);
if (result && !this.readOnly) {
section = _.extend(section, result);
this.changes.emit(this.form);
}
});
}
openItemDialog(item, section) {
const dialogRef = this.dialog.open(DialogItemEdit, {
minWidth: '450px',
data: {
params: {
multiChoiseFieldsOnly: this.allowMultiChoiseFieldsOnly,
customFieldNamesAllowed: this.showFieldNames,
readOnly: this.readOnly,
},
item: _.cloneDeep(item)
},
});
dialogRef.afterClosed().subscribe(result => {
console.log('The dialog was closed', result, section);
if (result && !this.readOnly) {
item = _.extend(item, result);
const itemComponent = this.formItemElements.find(el => el.item === item);
if (section && !this.showFieldNames) {
item.name = _.camelCase((section.name || '') + ' ' + item.name);
}
if (item.justAdded) {
this.onFieldAdded.emit(item);
}
item.justAdded = false;
this.changes.emit(this.form);
if (itemComponent) {
itemComponent.loadComponent();
}
}
else if (section && item.justAdded) {
this.removeField(item, section);
}
});
}
getSectionValueItemsForItem(item, section) {
return (section.items || []).filter(sItem => sItem.actionUpdatesSectionValue && sItem.name !== item.name);
}
openItemVisibilityDialog(item, section) {
const sectionValueItems = this.getSectionValueItemsForItem(item, section);
const dialogRef = this.dialog.open(DialogItemVisibility, {
width: '450px',
data: {
sectionItems: sectionValueItems,
visibility: item.visibilityValuesInSection || [],
readOnly: this.readOnly,
}
});
dialogRef.afterClosed().subscribe(result => {
console.log('The dialog was closed', result);
if (result && !this.readOnly) {
item.visibilityValuesInSection = [];
sectionValueItems.forEach(sItem => {
if (result[sItem.name]) {
item.visibilityValuesInSection.push(result[sItem.name]);
}
});
console.log(item);
this.changes.emit(this.form);
}
/*
if (result){
item=_.extend(item, result);
this.changes.emit(this.form);
}
else if(section && item.justAdded) {
this.removeField(item, section);
}*/
});
}
ngOnInit() {
}
getDateStr(time) {
time = time / 1000000;
return moment.utc(time).format("MM/DD/YYYY");
}
;
getDateValue(str) {
var dt = new Date(str);
dt.setMinutes(dt.getMinutes() - dt.getTimezoneOffset());
return dt;
}
;
/*
setItemValue(item, value) {
item.value = item.multiple ? _.contains(item.value || [], value) ? _.without(item.value, value) : _.union(item.value || [], [value]) : value;
};
isSelected(item, value) {
return item.multiple ? _.contains(item.value || [], value) : item.value === value;
};
*/
onItemChanges(item) {
item.errors = this.service.getErrors(item);
this.changes.emit(this.form);
}
removeField(item, section) {
section.items = (section.items || []).filter((op, index) => index !== (section.items || []).indexOf(item));
this.changes.emit(this.form);
}
cloneItem(item, section) {
//section.items=(section.items || []).filter((op, index)=>index!==(section.items || []).indexOf(item));
//console.log(item);
if (this.readOnly) {
return;
}
const newItem = _.cloneDeep(item);
let newName = newItem.name + '_clone';
if (section.items?.find(item => item.name === newName)) {
const index = section.items?.filter(item => item.name.indexOf(newName) >= 0).length;
newName += '_' + index;
}
newItem.name = newName;
newItem.actionUpdatesSectionValue = false;
section.items?.splice(section.items?.indexOf(item) + 1, 0, newItem);
this.changes.emit(this.form);
}
clearValue(item, section) {
item.value = '';
this.changes.emit(this.form);
}
addFeild(section) {
if (!section.items) {
section.items = [];
}
const field = this.allowMultiChoiseFieldsOnly ? buildField('radio', { name: "", label: "", items: [], style: "list" }, true) : buildField('string', { name: "", label: "" });
field.justAdded = true;
section.items.push(field);
this.openItemDialog(field, section);
}
removeSection(section) {
this.form = this.form.filter((op, index) => index !== this.form.indexOf(section));
this.changes.emit(this.form);
}
addSection() {
this.form.push({});
this.changes.emit(this.form);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: FormBuilderComponent, deps: [{ token: i1.NgxSurveyService }, { token: i2.MatDialog }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: FormBuilderComponent, selector: "ngx-survey-form-builder", inputs: { form: "form", allowMultiChoiseFieldsOnly: "allowMultiChoiseFieldsOnly", enableEditFieldValues: "enableEditFieldValues", showFieldNames: "showFieldNames", readOnly: "readOnly" }, outputs: { changes: "changes", onFieldAdded: "onFieldAdded" }, viewQueries: [{ propertyName: "formItemElements", predicate: ["formFieldItem"], descendants: true }], ngImport: i0, template: "<form name=\"surveyForm\"\n cdkDropList\n [cdkDropListData]=\"form\"\n (cdkDropListDropped)=\"onSectionDropped($event)\"\n [cdkDropListDisabled]=\"readOnly\"\n>\n <mat-card *ngFor=\"let section of form\"\n cdkDrag\n [cdkDragData]=section\n >\n <div class=\"section-drag-placeholder\" *cdkDragPlaceholder></div>\n <div class=\"example-custom-placeholder\" *cdkDragPlaceholder></div>\n <mat-card-header class=\"section-header\">\n <mat-card-title class=\"section-title\">\n <div class=\"section-title-text\">\n <span [ngClass]=\"'section-style-'+section.sectionStyle\" [innerHtml]=\"section.title\"></span>\n </div>\n\n <button mat-icon-button class=\"form-item-actions-button\" aria-label=\"Toggle menu\"\n matTooltip=\"Edit Section\"\n matTooltipPosition=\"above\"\n (click)=\"openSectionDialog(section)\"\n >\n <mat-icon>edit</mat-icon>\n </button>\n <button mat-icon-button class=\"form-item-actions-button \" aria-label=\"Toggle menu\"\n matTooltip=\"Delete Section\"\n matTooltipPosition=\"above\"\n (click)=\"removeSection(section)\"\n [disabled]=\"readOnly\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n <!--\n <button mat-icon-button class=\"more-button\" [matMenuTriggerFor]=\"menu\" aria-label=\"Toggle menu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\" xPosition=\"before\">\n <button mat-menu-item (click)=\"openSectionDialog(section)\">Edit Section</button>\n <button mat-menu-item (click)=\"removeSection(section)\">Remove</button>\n </mat-menu>\n -->\n\n </mat-card-title>\n <mat-card-subtitle>\n <span *ngIf=\"section.subtitle\"><small [innerHtml]=\"section.subtitle\"></small></span>\n </mat-card-subtitle>\n </mat-card-header>\n <mat-card-content>\n <div *ngIf=\"service.isSectionVisible(form, section)\">\n <div cdkDropList\n [cdkDropListData]=\"section.items\"\n (cdkDropListDropped)=\"onItemDropped($event, section)\"\n [cdkDropListDisabled]=\"readOnly\"\n class=\"form-items-list\"\n >\n <div *ngFor=\"let item of section.items\" [attr.id]=\"'form_item_'+item.name\" class=\"form-item\"\n cdkDrag\n [cdkDragData]=item\n >\n <div class=\"item-drag-placeholder\" *cdkDragPlaceholder></div>\n <div class=\"form-item-actions\">\n <div class=\"form-item-var-name\">\n <small *ngIf=\"showFieldNames\">{{item.name}}</small>\n </div>\n <button mat-icon-button class=\"form-item-actions-button\" aria-label=\"Visibility\" *ngIf=\"getSectionValueItemsForItem(item, section).length\"\n matTooltip=\"Visibility\"\n matTooltipPosition=\"above\"\n (click)=\"openItemVisibilityDialog(item, section)\"\n >\n <mat-icon\n [color]=\"item.visibilityValuesInSection && item.visibilityValuesInSection.length ? 'primary' : 'disabled'\"\n >visibility</mat-icon>\n </button>\n <button mat-icon-button class=\"form-item-actions-button\" aria-label=\"Toggle menu\" *ngIf=\"!readOnly\"\n matTooltip=\"Clone\"\n matTooltipPosition=\"above\"\n (click)=\"cloneItem(item, section)\"\n >\n <mat-icon>filter_none</mat-icon>\n </button>\n <button mat-icon-button class=\"form-item-actions-button\" aria-label=\"Toggle menu\"\n matTooltip=\"Edit Field\"\n matTooltipPosition=\"above\"\n (click)=\"openItemDialog(item, section)\"\n >\n <mat-icon>edit</mat-icon>\n </button>\n <!--\n <button mat-icon-button class=\"form-item-actions-button\" aria-label=\"Toggle menu\" *ngIf=\"item.value && !readOnly\"\n matTooltip=\"Clear field value\"\n matTooltipPosition=\"above\"\n (click)=\"clearValue(item, section)\"\n >\n <mat-icon>cancel_presentation</mat-icon>\n </button>\n -->\n\n <button mat-icon-button class=\"form-item-actions-button\" aria-label=\"Toggle menu\" [disabled]=\"readOnly\"\n matTooltip=\"Delete Field\"\n matTooltipPosition=\"above\"\n (click)=\"removeField(item, section)\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n\n </div>\n <ngx-survey-form-item\n [type]=\"item.type\"\n [item]=\"item\"\n [editable]=\"enableEditFieldValues && !readOnly\"\n (changes)=\"onItemChanges($event)\"\n #formFieldItem\n ></ngx-survey-form-item>\n </div>\n </div>\n </div>\n <div class=\"add-item-button\"\n >\n <button mat-stroked-button color=\"primary\" (click)=\"addFeild(section)\" [disabled]=\"readOnly\">Add Field</button>\n </div>\n <!--\n <button mat-icon-button class=\"add-item-button\" aria-label=\"Toggle menu\">\n <mat-icon>add_circle</mat-icon>\n </button>\n -->\n </mat-card-content>\n </mat-card>\n <div class=\"add-item-button\"\n matTooltip=\"Add Section\"\n matTooltipPosition=\"above\"\n >\n <button mat-mini-fab color=\"primary\" aria-label=\"Add Section\" (click)=\"addSection()\" [disabled]=\"readOnly\">\n <mat-icon>add</mat-icon>\n </button>\n </div>\n</form>\n", styles: [".more-button{position:absolute;top:5px;right:10px}.add-item-button{text-align:center}.add-item-button .mat-stroked-button{width:100%;margin-top:20px}::ng-deep .mat-card{margin-bottom:10px}::ng-deep .mat-card:hover .add-item-button{display:block}::ng-deep .mat-card .mat-card-header-text{width:100%;margin-right:0}::ng-deep .mat-card .mat-card-header-text .section-title{align-content:center;align-items:center;display:flex;justify-content:center}::ng-deep .mat-card .mat-card-header-text .section-title .section-title-text{flex:1 1 auto}.form-item{border:dotted 3px #fff}.form-item .form-item-actions{height:20px;align-content:center;align-items:center;display:flex;justify-content:center}.form-item .form-item-actions .form-item-var-name{overflow:hidden;flex:1 1 auto}.form-item .form-item-actions .form-item-var-name small{display:none}.form-item .form-item-actions .mat-icon{font-size:16px}.form-item .form-item-actions .mat-icon-button{height:20px;width:20px;line-height:20px}.form-item:hover{background:#ccc;border-color:#999;min-height:60px;transition:transform .25s cubic-bezier(0,0,.2,1);cursor:move}.form-item:hover .form-item-actions .form-item-var-name small{display:inline}.example-list{min-height:60px}.cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.form-items-list.cdk-drop-list-dragging .form-item:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.item-drag-placeholder{background:#ccc;border:dotted 3px #999;min-height:83px;transition:transform .25s cubic-bezier(0,0,.2,1)}.section-drag-placeholder{background:#ccc;border:dotted 3px #999;min-height:150px;transition:transform .25s cubic-bezier(0,0,.2,1)}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i5.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i5.MatMiniFabButton, selector: "button[mat-mini-fab]", exportAs: ["matButton"] }, { kind: "directive", type: i6.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i8.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i8.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i8.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i8.MatCardSubtitle, selector: "mat-card-subtitle, [mat-card-subtitle], [matCardSubtitle]" }, { kind: "directive", type: i8.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "directive", type: i9.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i9.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i9.CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }, { kind: "component", type: i10.FormItemComponent, selector: "ngx-survey-form-item", inputs: ["type", "item", "editable", "isMobile", "id"], outputs: ["changes"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: FormBuilderComponent, decorators: [{
type: Component,
args: [{ selector: 'ngx-survey-form-builder', template: "<form name=\"surveyForm\"\n cdkDropList\n [cdkDropListData]=\"form\"\n (cdkDropListDropped)=\"onSectionDropped($event)\"\n [cdkDropListDisabled]=\"readOnly\"\n>\n <mat-card *ngFor=\"let section of form\"\n cdkDrag\n [cdkDragData]=section\n >\n <div class=\"section-drag-placeholder\" *cdkDragPlaceholder></div>\n <div class=\"example-custom-placeholder\" *cdkDragPlaceholder></div>\n <mat-card-header class=\"section-header\">\n <mat-card-title class=\"section-title\">\n <div class=\"section-title-text\">\n <span [ngClass]=\"'section-style-'+section.sectionStyle\" [innerHtml]=\"section.title\"></span>\n </div>\n\n <button mat-icon-button class=\"form-item-actions-button\" aria-label=\"Toggle menu\"\n matTooltip=\"Edit Section\"\n matTooltipPosition=\"above\"\n (click)=\"openSectionDialog(section)\"\n >\n <mat-icon>edit</mat-icon>\n </button>\n <button mat-icon-button class=\"form-item-actions-button \" aria-label=\"Toggle menu\"\n matTooltip=\"Delete Section\"\n matTooltipPosition=\"above\"\n (click)=\"removeSection(section)\"\n [disabled]=\"readOnly\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n <!--\n <button mat-icon-button class=\"more-button\" [matMenuTriggerFor]=\"menu\" aria-label=\"Toggle menu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\" xPosition=\"before\">\n <button mat-menu-item (click)=\"openSectionDialog(section)\">Edit Section</button>\n <button mat-menu-item (click)=\"removeSection(section)\">Remove</button>\n </mat-menu>\n -->\n\n </mat-card-title>\n <mat-card-subtitle>\n <span *ngIf=\"section.subtitle\"><small [innerHtml]=\"section.subtitle\"></small></span>\n </mat-card-subtitle>\n </mat-card-header>\n <mat-card-content>\n <div *ngIf=\"service.isSectionVisible(form, section)\">\n <div cdkDropList\n [cdkDropListData]=\"section.items\"\n (cdkDropListDropped)=\"onItemDropped($event, section)\"\n [cdkDropListDisabled]=\"readOnly\"\n class=\"form-items-list\"\n >\n <div *ngFor=\"let item of section.items\" [attr.id]=\"'form_item_'+item.name\" class=\"form-item\"\n cdkDrag\n [cdkDragData]=item\n >\n <div class=\"item-drag-placeholder\" *cdkDragPlaceholder></div>\n <div class=\"form-item-actions\">\n <div class=\"form-item-var-name\">\n <small *ngIf=\"showFieldNames\">{{item.name}}</small>\n </div>\n <button mat-icon-button class=\"form-item-actions-button\" aria-label=\"Visibility\" *ngIf=\"getSectionValueItemsForItem(item, section).length\"\n matTooltip=\"Visibility\"\n matTooltipPosition=\"above\"\n (click)=\"openItemVisibilityDialog(item, section)\"\n >\n <mat-icon\n [color]=\"item.visibilityValuesInSection && item.visibilityValuesInSection.length ? 'primary' : 'disabled'\"\n >visibility</mat-icon>\n </button>\n <button mat-icon-button class=\"form-item-actions-button\" aria-label=\"Toggle menu\" *ngIf=\"!readOnly\"\n matTooltip=\"Clone\"\n matTooltipPosition=\"above\"\n (click)=\"cloneItem(item, section)\"\n >\n <mat-icon>filter_none</mat-icon>\n </button>\n <button mat-icon-button class=\"form-item-actions-button\" aria-label=\"Toggle menu\"\n matTooltip=\"Edit Field\"\n matTooltipPosition=\"above\"\n (click)=\"openItemDialog(item, section)\"\n >\n <mat-icon>edit</mat-icon>\n </button>\n <!--\n <button mat-icon-button class=\"form-item-actions-button\" aria-label=\"Toggle menu\" *ngIf=\"item.value && !readOnly\"\n matTooltip=\"Clear field value\"\n matTooltipPosition=\"above\"\n (click)=\"clearValue(item, section)\"\n >\n <mat-icon>cancel_presentation</mat-icon>\n </button>\n -->\n\n <button mat-icon-button class=\"form-item-actions-button\" aria-label=\"Toggle menu\" [disabled]=\"readOnly\"\n matTooltip=\"Delete Field\"\n matTooltipPosition=\"above\"\n (click)=\"removeField(item, section)\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n\n </div>\n <ngx-survey-form-item\n [type]=\"item.type\"\n [item]=\"item\"\n [editable]=\"enableEditFieldValues && !readOnly\"\n (changes)=\"onItemChanges($event)\"\n #formFieldItem\n ></ngx-survey-form-item>\n </div>\n </div>\n </div>\n <div class=\"add-item-button\"\n >\n <button mat-stroked-button color=\"primary\" (click)=\"addFeild(section)\" [disabled]=\"readOnly\">Add Field</button>\n </div>\n <!--\n <button mat-icon-button class=\"add-item-button\" aria-label=\"Toggle menu\">\n <mat-icon>add_circle</mat-icon>\n </button>\n -->\n </mat-card-content>\n </mat-card>\n <div class=\"add-item-button\"\n matTooltip=\"Add Section\"\n matTooltipPosition=\"above\"\n >\n <button mat-mini-fab color=\"primary\" aria-label=\"Add Section\" (click)=\"addSection()\" [disabled]=\"readOnly\">\n <mat-icon>add</mat-icon>\n </button>\n </div>\n</form>\n", styles: [".more-button{position:absolute;top:5px;right:10px}.add-item-button{text-align:center}.add-item-button .mat-stroked-button{width:100%;margin-top:20px}::ng-deep .mat-card{margin-bottom:10px}::ng-deep .mat-card:hover .add-item-button{display:block}::ng-deep .mat-card .mat-card-header-text{width:100%;margin-right:0}::ng-deep .mat-card .mat-card-header-text .section-title{align-content:center;align-items:center;display:flex;justify-content:center}::ng-deep .mat-card .mat-card-header-text .section-title .section-title-text{flex:1 1 auto}.form-item{border:dotted 3px #fff}.form-item .form-item-actions{height:20px;align-content:center;align-items:center;display:flex;justify-content:center}.form-item .form-item-actions .form-item-var-name{overflow:hidden;flex:1 1 auto}.form-item .form-item-actions .form-item-var-name small{display:none}.form-item .form-item-actions .mat-icon{font-size:16px}.form-item .form-item-actions .mat-icon-button{height:20px;width:20px;line-height:20px}.form-item:hover{background:#ccc;border-color:#999;min-height:60px;transition:transform .25s cubic-bezier(0,0,.2,1);cursor:move}.form-item:hover .form-item-actions .form-item-var-name small{display:inline}.example-list{min-height:60px}.cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.form-items-list.cdk-drop-list-dragging .form-item:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.item-drag-placeholder{background:#ccc;border:dotted 3px #999;min-height:83px;transition:transform .25s cubic-bezier(0,0,.2,1)}.section-drag-placeholder{background:#ccc;border:dotted 3px #999;min-height:150px;transition:transform .25s cubic-bezier(0,0,.2,1)}\n"] }]
}], ctorParameters: () => [{ type: i1.NgxSurveyService }, { type: i2.MatDialog }], propDecorators: { changes: [{
type: Output
}], onFieldAdded: [{
type: Output
}], form: [{
type: Input
}], allowMultiChoiseFieldsOnly: [{
type: Input
}], enableEditFieldValues: [{
type: Input
}], showFieldNames: [{
type: Input
}], readOnly: [{
type: Input
}], formItemElements: [{
type: ViewChildren,
args: ['formFieldItem']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1idWlsZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zdXJ2ZXlzL3NyYy9saWIvZm9ybS1idWlsZGVyL2Zvcm0tYnVpbGRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc3VydmV5cy9zcmMvbGliL2Zvcm0tYnVpbGRlci9mb3JtLWJ1aWxkZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFFeEcsT0FBTyxFQUFlLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RFLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBSWpDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMzRixPQUFPLEVBQXlCLFVBQVUsRUFBcUIsTUFBTSxvQkFBb0IsQ0FBQzs7Ozs7Ozs7Ozs7O0FBUTFGLE1BQU0sT0FBTyxvQkFBb0I7SUFLN0IsSUFBYSxJQUFJLENBQUMsSUFBbUI7UUFDakMsSUFBSSxDQUFDLEtBQUssR0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3hELDBCQUEwQjtJQUM5QixDQUFDO0lBQUEsQ0FBQztJQUVGLElBQUksSUFBSTtRQUNKLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBcUJELGdCQUFnQixDQUFDLEtBQThCO1FBQzNDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcs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dCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBWaWV3Q2hpbGRyZW4sIFF1ZXJ5TGlzdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmd4U3VydmV5U2VydmljZSB9IGZyb20gJy4uL25neC1zdXJ2ZXkuc2VydmljZSc7XG5pbXBvcnQgeyBDZGtEcmFnRHJvcCwgbW92ZUl0ZW1JbkFycmF5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgKiBhcyBtb21lbnQgZnJvbSAnbW9tZW50JztcblxuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcblxuaW1wb3J0IHsgRGlhbG9nU2VjdGlvbkVkaXQsIERpYWxvZ0l0ZW1FZGl0LCBEaWFsb2dJdGVtVmlzaWJpbGl0eSB9IGZyb20gJy4uL2RpYWxvZ3MvaW5kZXgnO1xuaW1wb3J0IHsgRm9ybUl0ZW0sIEZvcm1TZWN0aW9uLCBidWlsZEZpZWxkLCBGb3JtSXRlbUNvbXBvbmVudCB9IGZyb20gJy4uL2Zvcm0taXRlbS9pbmRleCc7XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LXN1cnZleS1mb3JtLWJ1aWxkZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybS1idWlsZGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZm9ybS1idWlsZGVyLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRm9ybUJ1aWxkZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gICAgQE91dHB1dCgpIGNoYW5nZXMgPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdPigpO1xuICAgIEBPdXRwdXQoKSBvbkZpZWxkQWRkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEZvcm1JdGVtPigpO1xuXG4gICAgQElucHV0KCkgc2V0IGZvcm0oZm9ybTogRm9ybVNlY3Rpb25bXSl7XG4gICAgICAgIHRoaXMuX2Zvcm09dGhpcy5zZXJ2aWNlLmluaXRGb3JtKGZvcm0sIHRoaXMuZm9ybVZhbHVlcyk7XG4gICAgICAgIC8vY29uc29sZS5sb2codGhpcy5fZm9ybSk7XG4gICAgfTtcblxuICAgIGdldCBmb3JtKCkgOiBGb3JtU2VjdGlvbltdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm07XG4gICAgfVxuXG4gICAgQElucHV0KCkgYWxsb3dNdWx0aUNob2lzZUZpZWxkc09ubHk6Ym9vbGVhbj1mYWxzZTtcbiAgICBASW5wdXQoKSBlbmFibGVFZGl0RmllbGRWYWx1ZXM6Ym9vbGVhbj10cnVlO1xuICAgIEBJbnB1dCgpIHNob3dGaWVsZE5hbWVzOmJvb2xlYW49dHJ1ZTtcbiAgICBASW5wdXQoKSByZWFkT25seTpib29sZWFuPWZhbHNlO1xuXG4gICAgQFZpZXdDaGlsZHJlbignZm9ybUZpZWxkSXRlbScpIGZvcm1JdGVtRWxlbWVudHM6IFF1ZXJ5TGlzdDxGb3JtSXRlbUNvbXBvbmVudD5cblxuICAgIHByaXZhdGUgX2Zvcm07XG4gICAgcHVibGljIGZvcm1WYWx1ZXM6YW55PXt9O1xuXG4gICAgcHVibGljIHNvcnRhYmxlU2VjdGlvbk9wdGlvbnM6YW55PXtcbiAgICAgICAgb25VcGRhdGU6IChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgICAvL2V2ZW50O1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhldmVudCk7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZXMuZW1pdCh0aGlzLmZvcm0pO1xuICAgICAgICB9LFxuICAgICAgICAvL2hhbmRsZTogJy5zb3J0YWJsZS1oYW5kbGUnXG4gICAgfVxuXG4gICAgb25TZWN0aW9uRHJvcHBlZChldmVudDogQ2RrRHJhZ0Ryb3A8Rm9ybUl0ZW1bXT4pe1xuICAgICAgICBjb25zdCBwcmV2aW91c0luZGV4ID0gdGhpcy5mb3JtLmZpbmRJbmRleChyb3cgPT4gZXZlbnQuaXRlbSAmJiByb3cgPT09IGV2ZW50Lml0ZW0uZGF0YSk7XG4gICAgICAgIG1vdmVJdGVtSW5BcnJheSh0aGlzLmZvcm0scHJldmlvdXNJbmRleCwgZXZlbnQuY3VycmVudEluZGV4KTtcbiAgICAgICAgdGhpcy5mb3JtID0gdGhpcy5mb3JtLnNsaWNlKCk7XG4gICAgICAgIHRoaXMuY2hhbmdlcy5lbWl0KHRoaXMuZm9ybSk7XG4gICAgfVxuXG4gICAgb25JdGVtRHJvcHBlZChldmVudDogQ2RrRHJhZ0Ryb3A8Rm9ybUl0ZW1bXT4sIHNlY3Rpb246IEZvcm1TZWN0aW9uKXtcbiAgICAgICAgY29uc3QgcHJldmlvdXNJbmRleCA9IChzZWN0aW9uLml0ZW1zIHx8IFtdKS5maW5kSW5kZXgocm93ID0+IGV2ZW50Lml0ZW0gJiYgcm93ID09PSBldmVudC5pdGVtLmRhdGEpO1xuICAgICAgICBtb3ZlSXRlbUluQXJyYXkoKHNlY3Rpb24uaXRlbXMgfHwgW10pLHByZXZpb3VzSW5kZXgsIGV2ZW50LmN1cnJlbnRJbmRleCk7XG4gICAgICAgIHNlY3Rpb24uaXRlbXMgPSAoc2VjdGlvbi5pdGVtcyB8fCBbXSkuc2xpY2UoKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VzLmVtaXQodGhpcy5mb3JtKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc29ydGFibGVJdGVtT3B0aW9uczphbnk9e1xuICAgICAgICBvblVwZGF0ZTogKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgIC8vZXZlbnQ7XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKGV2ZW50KTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlcy5lbWl0KHRoaXMuZm9ybSk7XG4gICAgICAgIH0sXG4gICAgICAgIGhhbmRsZTogJy5mb3JtLWl0ZW0nXG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBzZXJ2aWNlOiBOZ3hTdXJ2ZXlTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgKSB7IH1cblxuXG4gICAgb3BlblNlY3Rpb25EaWFsb2coc2VjdGlvbjogRm9ybVNlY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihEaWFsb2dTZWN0aW9uRWRpdCwge1xuICAgICAgICAgICAgbWluV2lkdGg6ICc0NTBweCcsXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0aGlzLnJlYWRPbmx5LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2VjdGlvbjogc2VjdGlvblxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnVGhlIGRpYWxvZyB3YXMgY2xvc2VkJywgcmVzdWx0KTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgJiYgIXRoaXMucmVhZE9ubHkpe1xuICAgICAgICAgICAgICAgIHNlY3Rpb249Xy5leHRlbmQoc2VjdGlvbiwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZXMuZW1pdCh0aGlzLmZvcm0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9wZW5JdGVtRGlhbG9nKGl0ZW06IEZvcm1JdGVtLCBzZWN0aW9uPzogRm9ybVNlY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihEaWFsb2dJdGVtRWRpdCwge1xuICAgICAgICAgICAgbWluV2lkdGg6ICc0NTBweCcsXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICAgIG11bHRpQ2hvaXNlRmllbGRzT25seTogdGhpcy5hbGxvd011bHRpQ2hvaXNlRmllbGRzT25seSxcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tRmllbGROYW1lc0FsbG93ZWQ6IHRoaXMuc2hvd0ZpZWxkTmFtZXMsXG4gICAgICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0aGlzLnJlYWRPbmx5LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaXRlbTogXy5jbG9uZURlZXAoaXRlbSlcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1RoZSBkaWFsb2cgd2FzIGNsb3NlZCcsIHJlc3VsdCwgc2VjdGlvbik7XG4gICAgICAgICAgICBpZiAocmVzdWx0ICYmICF0aGlzLnJlYWRPbmx5KXtcbiAgICAgICAgICAgICAgICBpdGVtPV8uZXh0ZW5kKGl0ZW0sIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbUNvbXBvbmVudD10aGlzLmZvcm1JdGVtRWxlbWVudHMuZmluZChlbD0+ZWwuaXRlbT09PWl0ZW0pO1xuICAgICAgICAgICAgICAgIGlmIChzZWN0aW9uICYmICF0aGlzLnNob3dGaWVsZE5hbWVzKXtcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5uYW1lPV8uY2FtZWxDYXNlKChzZWN0aW9uLm5hbWUgfHwgJycpKycgJytpdGVtLm5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5qdXN0QWRkZWQpe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uRmllbGRBZGRlZC5lbWl0KGl0ZW0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGl0ZW0uanVzdEFkZGVkPWZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlcy5lbWl0KHRoaXMuZm9ybSk7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1Db21wb25lbnQpe1xuICAgICAgICAgICAgICAgICAgICBpdGVtQ29tcG9uZW50LmxvYWRDb21wb25lbnQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmKHNlY3Rpb24gJiYgaXRlbS5qdXN0QWRkZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUZpZWxkKGl0ZW0sIHNlY3Rpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRTZWN0aW9uVmFsdWVJdGVtc0Zvckl0ZW0oaXRlbTogRm9ybUl0ZW0sIHNlY3Rpb246IEZvcm1TZWN0aW9uKXtcbiAgICAgICAgcmV0dXJuIChzZWN0aW9uLml0ZW1zIHx8IFtdKS5maWx0ZXIoc0l0ZW09PnNJdGVtLmFjdGlvblVwZGF0ZXNTZWN0aW9uVmFsdWUgJiYgc0l0ZW0ubmFtZSE9PWl0ZW0ubmFtZSk7XG4gICAgfVxuXG4gICAgb3Blbkl0ZW1WaXNpYmlsaXR5RGlhbG9nKGl0ZW06IEZvcm1JdGVtLCBzZWN0aW9uOiBGb3JtU2VjdGlvbik6IHZvaWQge1xuXG4gICAgICAgIGNvbnN0IHNlY3Rpb25WYWx1ZUl0ZW1zPXRoaXMuZ2V0U2VjdGlvblZhbHVlSXRlbXNGb3JJdGVtKGl0ZW0sIHNlY3Rpb24pO1xuXG4gICAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oRGlhbG9nSXRlbVZpc2liaWxpdHksIHtcbiAgICAgICAgICAgIHdpZHRoOiAnNDUwcHgnLFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIHNlY3Rpb25JdGVtczogc2VjdGlvblZhbHVlSXRlbXMsXG4gICAgICAgICAgICAgICAgdmlzaWJpbGl0eTogaXRlbS52aXNpYmlsaXR5VmFsdWVzSW5TZWN0aW9uIHx8IFtdLFxuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0aGlzLnJlYWRPbmx5LFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdUaGUgZGlhbG9nIHdhcyBjbG9zZWQnLCByZXN1bHQpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCAmJiAhdGhpcy5yZWFkT25seSl7XG4gICAgICAgICAgICAgICAgaXRlbS52aXNpYmlsaXR5VmFsdWVzSW5TZWN0aW9uPVtdO1xuICAgICAgICAgICAgICAgIHNlY3Rpb25WYWx1ZUl0ZW1zLmZvckVhY2goc0l0ZW09PntcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdFtzSXRlbS5uYW1lXSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnZpc2liaWxpdHlWYWx1ZXNJblNlY3Rpb24ucHVzaChyZXN1bHRbc0l0ZW0ubmFtZV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coaXRlbSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VzLmVtaXQodGhpcy5mb3JtKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLypcbiAgICAgICAgICAgIGlmIChyZXN1bHQpe1xuICAgICAgICAgICAgICAgIGl0ZW09Xy5leHRlbmQoaXRlbSwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZXMuZW1pdCh0aGlzLmZvcm0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZihzZWN0aW9uICYmIGl0ZW0uanVzdEFkZGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVGaWVsZChpdGVtLCBzZWN0aW9uKTtcbiAgICAgICAgICAgIH0qL1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uSW