survey-angular-ui
Version:
A free MIT-licensed Angular UI component that renders dynamic, interactive JSON-based forms and surveys. You can use it to collect responses from users and send them to your own database.
128 lines • 16.3 kB
JavaScript
import { Component } from "@angular/core";
import { EmbeddedViewContentComponent } from "./embedded-view-content.component";
import * as i0 from "@angular/core";
export class BaseAngular extends EmbeddedViewContentComponent {
constructor(changeDetectorRef, viewContainerRef) {
super(viewContainerRef);
this.changeDetectorRef = changeDetectorRef;
this.isModelSubsribed = false;
this.isDestroyed = false;
this.onArrayChangedCallback = (stateElement, options) => {
this.update(options.name);
};
this.onPropertyChangedCallback = (stateElement, options) => {
this.update(options.name);
};
this.isUpdatesBlocked = false;
}
get surveyModel() {
return this.getModel().getSurvey();
}
ngDoCheck() {
super.ngDoCheck();
if (this.previousModel !== this.getModel()) {
this.unMakeBaseElementAngular(this.previousModel);
this.makeBaseElementAngular(this.getModel());
this.onModelChanged();
this.previousModel = this.getModel();
}
this.setIsModelRendering(true);
}
onModelChanged() { }
setIsModelRendering(val) {
const model = this.getModel();
if (!!model) {
model.isRendering = val;
}
}
getIsModelRendering(stateElement) {
const model = stateElement !== null && stateElement !== void 0 ? stateElement : this.getModel();
return !!model && !!model.isRendering;
}
ngOnDestroy() {
this.isDestroyed = true;
this.unMakeBaseElementAngular(this.getModel());
this.previousModel = undefined;
}
isBaseElementSubsribed(stateElement) {
var _a;
return ((_a = stateElement.__ngImplementedCount) !== null && _a !== void 0 ? _a : 0) > 0;
}
makeBaseElementAngular(stateElement) {
var _a;
if (!!stateElement && !this.getIsModelRendering(stateElement)) {
this.isModelSubsribed = true;
stateElement.addOnArrayChangedCallback(this.onArrayChangedCallback);
stateElement.addOnPropertyValueChangedCallback(this.onPropertyChangedCallback);
stateElement.enableOnElementRerenderedEvent();
stateElement.__ngImplementedCount = ((_a = stateElement.__ngImplementedCount) !== null && _a !== void 0 ? _a : 0) + 1;
}
}
unMakeBaseElementAngular(stateElement) {
var _a;
if (!!stateElement && this.isModelSubsribed) {
this.isModelSubsribed = false;
stateElement.removeOnPropertyValueChangedCallback(this.onPropertyChangedCallback);
stateElement.removeOnArrayChangedCallback(this.onArrayChangedCallback);
stateElement.disableOnElementRerenderedEvent();
if (((_a = stateElement.__ngImplementedCount) !== null && _a !== void 0 ? _a : 0) - 1 <= 0) {
delete stateElement.__ngImplementedCount;
}
}
}
update(key) {
if (this.getIsModelRendering() || this.isUpdatesBlocked)
return;
if (key && this.getPropertiesToUpdateSync().indexOf(key) > -1) {
this.beforeUpdate();
this.detectChanges();
this.afterUpdate(true);
}
else {
this.isUpdatesBlocked = true;
queueMicrotask(() => {
if (!this.isDestroyed) {
this.isUpdatesBlocked = false;
this.beforeUpdate();
this.detectChanges();
this.afterUpdate();
}
});
}
}
getChangeDetectorRef() {
return this.embeddedView ? this.embeddedView : this.changeDetectorRef;
}
getPropertiesToUpdateSync() {
return [];
}
detectChanges() {
this.getChangeDetectorRef().detectChanges();
}
getShouldReattachChangeDetector() {
return true;
}
beforeUpdate() {
this.setIsModelRendering(true);
}
afterUpdate(isSync = false) {
this.setIsModelRendering(false);
const model = this.getModel();
if (model && !this.isDestroyed) {
model.afterRerender();
}
}
ngAfterViewChecked() {
super.ngAfterViewChecked();
this.setIsModelRendering(false);
}
}
BaseAngular.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: BaseAngular, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component });
BaseAngular.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: BaseAngular, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "", isInline: true });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: BaseAngular, decorators: [{
type: Component,
args: [{
template: ""
}]
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ViewContainerRef }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1hbmd1bGFyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jhc2UtYW5ndWxhci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBd0MsTUFBTSxlQUFlLENBQUM7QUFFbkcsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sbUNBQW1DLENBQUM7O0FBTWpGLE1BQU0sT0FBZ0IsV0FBbUMsU0FBUSw0QkFBNEI7SUFDM0YsWUFBc0IsaUJBQW9DLEVBQUUsZ0JBQW1DO1FBQzdGLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBREosc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQVFsRCxxQkFBZ0IsR0FBWSxLQUFLLENBQUM7UUF5QmxDLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBUzdCLDJCQUFzQixHQUFHLENBQUMsWUFBa0IsRUFBRSxPQUF3QyxFQUFFLEVBQUU7WUFDaEcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUIsQ0FBQyxDQUFDO1FBQ00sOEJBQXlCLEdBQUcsQ0FBQyxZQUFrQixFQUFFLE9BQW1DLEVBQUUsRUFBRTtZQUM5RixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QixDQUFDLENBQUM7UUFxQk0scUJBQWdCLEdBQVksS0FBSyxDQUFDO0lBbEUxQyxDQUFDO0lBQ0QsSUFBYyxXQUFXO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFLZSxTQUFTO1FBQ3ZCLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNsQixJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQzFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDbEQsSUFB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QUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLENBQUM7O3lHQXBIbUIsV0FBVzs2RkFBWCxXQUFXLDJFQUZyQixFQUFFOzRGQUVRLFdBQVc7a0JBSGhDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLEVBQUU7aUJBQ2IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBEb0NoZWNrLCBPbkRlc3Ryb3ksIFZpZXdDb250YWluZXJSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQmFzZSwgSVByb3BlcnR5QXJyYXlWYWx1ZUNoYW5nZWRFdmVudCwgSVN1cnZleSB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgRW1iZWRkZWRWaWV3Q29udGVudENvbXBvbmVudCB9IGZyb20gXCIuL2VtYmVkZGVkLXZpZXctY29udGVudC5jb21wb25lbnRcIjtcbmltcG9ydCB7IElQcm9wZXJ0eVZhbHVlQ2hhbmdlZEV2ZW50IH0gZnJvbSBcInN1cnZleS1jb3JlL3R5cGluZ3Mvc3JjL2Jhc2VcIjtcblxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlOiBcIlwiXG59KVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VBbmd1bGFyPFQgZXh0ZW5kcyBCYXNlID0gQmFzZT4gZXh0ZW5kcyBFbWJlZGRlZFZpZXdDb250ZW50Q29tcG9uZW50IGltcGxlbWVudHMgRG9DaGVjaywgT25EZXN0cm95IHtcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZiwgdmlld0NvbnRhaW5lclJlZj86IFZpZXdDb250YWluZXJSZWYpIHtcbiAgICBzdXBlcih2aWV3Q29udGFpbmVyUmVmKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IHN1cnZleU1vZGVsKCk6IElTdXJ2ZXkge1xuICAgIHJldHVybiB0aGlzLmdldE1vZGVsKCkuZ2V0U3VydmV5KCk7XG4gIH1cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldE1vZGVsKCk6IFQ7XG4gIHByb3RlY3RlZCBwcmV2aW91c01vZGVsPzogVDtcbiAgcHJpdmF0ZSBpc01vZGVsU3Vic3JpYmVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHVibGljIG92ZXJyaWRlIG5nRG9DaGVjaygpOiB2b2lkIHtcbiAgICBzdXBlci5uZ0RvQ2hlY2soKTtcbiAgICBpZiAodGhpcy5wcmV2aW91c01vZGVsICE9PSB0aGlzLmdldE1vZGVsKCkpIHtcbiAgICAgIHRoaXMudW5NYWtlQmFzZUVsZW1lbnRBbmd1bGFyKHRoaXMucHJldmlvdXNNb2RlbCk7XG4gICAgICB0aGlzLm1ha2VCYXNlRWxlbWVudEFuZ3VsYXIodGhpcy5nZXRNb2RlbCgpKTtcbiAgICAgIHRoaXMub25Nb2RlbENoYW5nZWQoKTtcbiAgICAgIHRoaXMucHJldmlvdXNNb2RlbCA9IHRoaXMuZ2V0TW9kZWwoKTtcbiAgICB9XG4gICAgdGhpcy5zZXRJc01vZGVsUmVuZGVyaW5nKHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uTW9kZWxDaGFuZ2VkKCkgeyB9XG5cbiAgcHJpdmF0ZSBzZXRJc01vZGVsUmVuZGVyaW5nKHZhbDogYm9vbGVhbikge1xuICAgIGNvbnN0IG1vZGVsID0gdGhpcy5nZXRNb2RlbCgpO1xuICAgIGlmICghIW1vZGVsKSB7XG4gICAgICAoPGFueT5tb2RlbCkuaXNSZW5kZXJpbmcgPSB2YWw7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZ2V0SXNNb2RlbFJlbmRlcmluZyhzdGF0ZUVsZW1lbnQ/OiBCYXNlKSB7XG4gICAgY29uc3QgbW9kZWwgPSBzdGF0ZUVsZW1lbnQgPz8gdGhpcy5nZXRNb2RlbCgpO1xuICAgIHJldHVybiAhIW1vZGVsICYmICEhKDxhbnk+bW9kZWwpLmlzUmVuZGVyaW5nO1xuICB9XG4gIHByaXZhdGUgaXNEZXN0cm95ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5pc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgdGhpcy51bk1ha2VCYXNlRWxlbWVudEFuZ3VsYXIodGhpcy5nZXRNb2RlbCgpKTtcbiAgICB0aGlzLnByZXZpb3VzTW9kZWwgPSB1bmRlZmluZWQ7XG4gIH1cbiAgcHJvdGVjdGVkIGlzQmFzZUVsZW1lbnRTdWJzcmliZWQoc3RhdGVFbGVtZW50OiBCYXNlKSB7XG4gICAgcmV0dXJuICgoPGFueT5zdGF0ZUVsZW1lbnQpLl9fbmdJbXBsZW1lbnRlZENvdW50ID8/IDApID4gMDtcbiAgfVxuICBwcml2YXRlIG9uQXJyYXlDaGFuZ2VkQ2FsbGJhY2sgPSAoc3RhdGVFbGVtZW50OiBCYXNlLCBvcHRpb25zOiBJUHJvcGVydHlBcnJheVZhbHVlQ2hhbmdlZEV2ZW50KSA9PiB7XG4gICAgdGhpcy51cGRhdGUob3B0aW9ucy5uYW1lKTtcbiAgfTtcbiAgcHJpdmF0ZSBvblByb3BlcnR5Q2hhbmdlZENhbGxiYWNrID0gKHN0YXRlRWxlbWVudDogQmFzZSwgb3B0aW9uczogSVByb3BlcnR5VmFsdWVDaGFuZ2VkRXZlbnQpID0+IHtcbiAgICB0aGlzLnVwZGF0ZShvcHRpb25zLm5hbWUpO1xuICB9O1xuICBwcml2YXRlIG1ha2VCYXNlRWxlbWVudEFuZ3VsYXIoc3RhdGVFbGVtZW50OiBUKSB7XG4gICAgaWYgKCEhc3RhdGVFbGVtZW50ICYmICF0aGlzLmdldElzTW9kZWxSZW5kZXJpbmcoc3RhdGVFbGVtZW50KSkge1xuICAgICAgdGhpcy5pc01vZGVsU3Vic3JpYmVkID0gdHJ1ZTtcbiAgICAgIHN0YXRlRWxlbWVudC5hZGRPbkFycmF5Q2hhbmdlZENhbGxiYWNrKHRoaXMub25BcnJheUNoYW5nZWRDYWxsYmFjayk7XG4gICAgICBzdGF0ZUVsZW1lbnQuYWRkT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZENhbGxiYWNrKHRoaXMub25Qcm9wZXJ0eUNoYW5nZWRDYWxsYmFjayk7XG4gICAgICBzdGF0ZUVsZW1lbnQuZW5hYmxlT25FbGVtZW50UmVyZW5kZXJlZEV2ZW50KCk7XG4gICAgICAoPGFueT5zdGF0ZUVsZW1lbnQpLl9fbmdJbXBsZW1lbnRlZENvdW50ID0gKCg8YW55PnN0YXRlRWxlbWVudCkuX19uZ0ltcGxlbWVudGVkQ291bnQgPz8gMCkgKyAxO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHVuTWFrZUJhc2VFbGVtZW50QW5ndWxhcihzdGF0ZUVsZW1lbnQ/OiBCYXNlKSB7XG4gICAgaWYgKCEhc3RhdGVFbGVtZW50ICYmIHRoaXMuaXNNb2RlbFN1YnNyaWJlZCkge1xuICAgICAgdGhpcy5pc01vZGVsU3Vic3JpYmVkID0gZmFsc2U7XG4gICAgICBzdGF0ZUVsZW1lbnQucmVtb3ZlT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZENhbGxiYWNrKHRoaXMub25Qcm9wZXJ0eUNoYW5nZWRDYWxsYmFjayk7XG4gICAgICBzdGF0ZUVsZW1lbnQucmVtb3ZlT25BcnJheUNoYW5nZWRDYWxsYmFjayh0aGlzLm9uQXJyYXlDaGFuZ2VkQ2FsbGJhY2spO1xuICAgICAgc3RhdGVFbGVtZW50LmRpc2FibGVPbkVsZW1lbnRSZXJlbmRlcmVkRXZlbnQoKTtcbiAgICAgIGlmICgoKDxhbnk+c3RhdGVFbGVtZW50KS5fX25nSW1wbGVtZW50ZWRDb3VudCA/PyAwKSAtIDEgPD0gMCkge1xuICAgICAgICBkZWxldGUgKDxhbnk+c3RhdGVFbGVtZW50KS5fX25nSW1wbGVtZW50ZWRDb3VudDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBpc1VwZGF0ZXNCbG9ja2VkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZShrZXk/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5nZXRJc01vZGVsUmVuZGVyaW5nKCkgfHwgdGhpcy5pc1VwZGF0ZXNCbG9ja2VkKSByZXR1cm47XG4gICAgaWYgKGtleSAmJiB0aGlzLmdldFByb3BlcnRpZXNUb1VwZGF0ZVN5bmMoKS5pbmRleE9mKGtleSkgPiAtMSkge1xuICAgICAgdGhpcy5iZWZvcmVVcGRhdGUoKTtcbiAgICAgIHRoaXMuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgdGhpcy5hZnRlclVwZGF0ZSh0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pc1VwZGF0ZXNCbG9ja2VkID0gdHJ1ZTtcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRGVzdHJveWVkKSB7XG4gICAgICAgICAgdGhpcy5pc1VwZGF0ZXNCbG9ja2VkID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5iZWZvcmVVcGRhdGUoKTtcbiAgICAgICAgICB0aGlzLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB0aGlzLmFmdGVyVXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGdldENoYW5nZURldGVjdG9yUmVmKCkge1xuICAgIHJldHVybiB0aGlzLmVtYmVkZGVkVmlldyA/IHRoaXMuZW1iZWRkZWRWaWV3IDogdGhpcy5jaGFuZ2VEZXRlY3RvclJlZjtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0UHJvcGVydGllc1RvVXBkYXRlU3luYygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgcHJvdGVjdGVkIGRldGVjdENoYW5nZXMoKSB7XG4gICAgdGhpcy5nZXRDaGFuZ2VEZXRlY3RvclJlZigpLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRTaG91bGRSZWF0dGFjaENoYW5nZURldGVjdG9yKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGJlZm9yZVVwZGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnNldElzTW9kZWxSZW5kZXJpbmcodHJ1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGFmdGVyVXBkYXRlKGlzU3luYzogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5zZXRJc01vZGVsUmVuZGVyaW5nKGZhbHNlKTtcbiAgICBjb25zdCBtb2RlbCA9IHRoaXMuZ2V0TW9kZWwoKTtcbiAgICBpZiAobW9kZWwgJiYgIXRoaXMuaXNEZXN0cm95ZWQpIHtcbiAgICAgIG1vZGVsLmFmdGVyUmVyZW5kZXIoKTtcbiAgICB9XG4gIH1cbiAgb3ZlcnJpZGUgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xuICAgIHN1cGVyLm5nQWZ0ZXJWaWV3Q2hlY2tlZCgpO1xuICAgIHRoaXMuc2V0SXNNb2RlbFJlbmRlcmluZyhmYWxzZSk7XG4gIH1cbn0iXX0=