@junte/ui
Version:
Quality Angular UI components kit
135 lines • 17.8 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { Component, ContentChildren, forwardRef, HostBinding, HostListener, Input, QueryList } from '@angular/core';
import { ControlValueAccessor, FormBuilder, FormControl, NG_VALUE_ACCESSOR } from '@angular/forms';
import { NGXLogger } from 'ngx-logger';
import { distinctUntilChanged, map } from 'rxjs/operators';
import { PropertyApi } from '../../../core/decorators/api';
import { Size } from '../../../core/enums/size';
import { UI } from '../../../core/enums/ui';
import { isEqual } from '../../../core/utils/equal';
import { CheckboxComponent } from '../checkbox.component';
var CheckboxGroupComponent = /** @class */ (function () {
function CheckboxGroupComponent(fb, logger) {
var _this = this;
this.fb = fb;
this.logger = logger;
this.ui = UI;
this.host = 'jnt-checkbox-group-host';
this._size = Size.normal;
this.selectedItems = [];
this.checkboxesControl = this.fb.array([]);
this.form = this.fb.group({
checkboxes: this.checkboxesControl
});
this.cols = 1;
this.onChange = function () { return _this.logger.error('value accessor is not registered'); };
this.onTouched = function () { return _this.logger.error('value accessor is not registered'); };
this.registerOnChange = function (fn) { return _this.onChange = fn; };
this.registerOnTouched = function (fn) { return _this.onTouched = fn; };
this.onBlur = function () { return _this.onTouched(); };
}
CheckboxGroupComponent_1 = CheckboxGroupComponent;
Object.defineProperty(CheckboxGroupComponent.prototype, "size", {
get: function () {
return this._size;
},
set: function (size) {
this._size = size || Size.normal;
},
enumerable: true,
configurable: true
});
CheckboxGroupComponent.prototype.ngAfterViewInit = function () {
var _this = this;
this.update();
this.checkboxes.changes.subscribe(function () { return _this.update(); });
this.checkboxesControl.valueChanges.pipe(map(function (checkboxes) { return _this.checkboxes
.filter(function (_, i) { return checkboxes[i]; })
.map(function (checkbox) { return checkbox.value; }); }), distinctUntilChanged(function (a, b) { return isEqual(a, b); })).subscribe(function (selectedItems) {
_this.selectedItems = selectedItems;
_this.onChange(selectedItems);
});
};
CheckboxGroupComponent.prototype.update = function () {
var _this = this;
if (!!this.checkboxes) {
this.checkboxesControl.reset([], { emitEvent: false });
this.checkboxes.forEach(function (checkbox, i) {
var control = _this.checkboxesControl.get(i.toString());
if (!!control) {
control.setValue(_this.selectedItems.includes(checkbox.value), { emitEvent: false });
}
else {
_this.checkboxesControl.push(new FormControl(_this.selectedItems.includes(checkbox.value)));
}
});
}
};
CheckboxGroupComponent.prototype.writeValue = function (value) {
var selectedItems = [];
if (!!value) {
selectedItems = Array.isArray(value) ? value : [value];
}
this.selectedItems = selectedItems;
this.update();
};
CheckboxGroupComponent.prototype.setDisabledState = function (isDisabled) {
isDisabled ? this.checkboxesControl.disable({ emitEvent: false })
: this.checkboxesControl.enable({ emitEvent: false });
};
var CheckboxGroupComponent_1;
CheckboxGroupComponent.ctorParameters = function () { return [
{ type: FormBuilder },
{ type: NGXLogger }
]; };
__decorate([
HostBinding('attr.host'),
__metadata("design:type", Object)
], CheckboxGroupComponent.prototype, "host", void 0);
__decorate([
PropertyApi({
description: 'Count of cols in checkbox group',
type: 'number',
default: 1
}),
Input(),
__metadata("design:type", Object)
], CheckboxGroupComponent.prototype, "cols", void 0);
__decorate([
PropertyApi({
description: 'Size for checkbox in checkbox group',
path: 'ui.size',
options: [Size.tiny, Size.small, Size.normal, Size.large],
default: Size.normal
}),
Input(),
__metadata("design:type", String),
__metadata("design:paramtypes", [String])
], CheckboxGroupComponent.prototype, "size", null);
__decorate([
ContentChildren(CheckboxComponent),
__metadata("design:type", QueryList)
], CheckboxGroupComponent.prototype, "checkboxes", void 0);
__decorate([
HostListener('blur'),
__metadata("design:type", Object)
], CheckboxGroupComponent.prototype, "onBlur", void 0);
CheckboxGroupComponent = CheckboxGroupComponent_1 = __decorate([
Component({
selector: 'jnt-checkbox-group',
template: "<form child-of=\"jnt-checkbox-group-host\" [formGroup]=\"form\">\n <ng-container formArrayName=\"checkboxes\">\n <ng-container *ngIf=\"!!checkboxesControl.length\">\n <ng-container *ngIf=\"cols <= 1; else colTemplate\">\n <jnt-stack child-of=\"jnt-checkbox-group-host\" [gutter]=\"ui.gutter.small\" [align]=\"ui.align.stretch\">\n <jnt-checkbox child-of=\"jnt-checkbox-group-host\" *ngFor=\"let item of checkboxes; let i = index\"\n [formControlName]=\"i\"\n [size]=\"size\"\n [label]=\"item.label\"\n [value]=\"item.value\">\n <ng-template *ngIf=\"!!item.labelTemplate\" #checkboxLabelTemplate>\n <ng-container *ngTemplateOutlet=\"item.labelTemplate\"></ng-container>\n </ng-template>\n </jnt-checkbox>\n </jnt-stack>\n </ng-container>\n <ng-template #colTemplate>\n <jnt-row child-of=\"jnt-checkbox-group-host\" >\n <jnt-col child-of=\"jnt-checkbox-group-host\" *ngFor=\"let item of checkboxes; let i = index\" [tablet]=\"(12 / cols) | trunc\">\n <jnt-checkbox child-of=\"jnt-checkbox-group-host\" [formControlName]=\"i\"\n [size]=\"size\"\n [label]=\"item.label\"\n [value]=\"item.value\">\n <ng-template *ngIf=\"!!item.labelTemplate\" #checkboxLabelTemplate>\n <ng-container *ngTemplateOutlet=\"item.labelTemplate\"></ng-container>\n </ng-template>\n </jnt-checkbox>\n </jnt-col>\n </jnt-row>\n </ng-template>\n </ng-container>\n </ng-container>\n</form>",
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(function () { return CheckboxGroupComponent_1; }),
multi: true
}
]
}),
__metadata("design:paramtypes", [FormBuilder,
NGXLogger])
], CheckboxGroupComponent);
return CheckboxGroupComponent;
}());
export { CheckboxGroupComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tib3gtZ3JvdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGp1bnRlL3VpLyIsInNvdXJjZXMiOlsibGliL2Zvcm1zL2NoZWNrYm94L2NoZWNrYm94LWdyb3VwL2NoZWNrYm94LWdyb3VwLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUVMLFNBQVMsRUFDVCxlQUFlLEVBQ2YsVUFBVSxFQUNWLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUNMLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25HLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDdkMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDaEQsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzVDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQWMxRDtJQStDRSxnQ0FBb0IsRUFBZSxFQUNmLE1BQWlCO1FBRHJDLGlCQUVDO1FBRm1CLE9BQUUsR0FBRixFQUFFLENBQWE7UUFDZixXQUFNLEdBQU4sTUFBTSxDQUFXO1FBOUNyQyxPQUFFLEdBQUcsRUFBRSxDQUFDO1FBR0MsU0FBSSxHQUFHLHlCQUF5QixDQUFDO1FBRWxDLFVBQUssR0FBUyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzFCLGtCQUFhLEdBQUcsRUFBRSxDQUFDO1FBRTNCLHNCQUFpQixH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QUFxQztZQUNsRCxJQUFJLEVBQUUsU0FBUztZQUNmLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDekQsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNO1NBQ3JCLENBQUM7UUFDRCxLQUFLLEVBQUU7OztzREFHUDtJQU9EO1FBREMsZUFBZSxDQUFDLGlCQUFpQixDQUFDO2tDQUN2QixTQUFTOzhEQUFvQjtJQU1uQjtRQUFyQixZQUFZLENBQUMsTUFBTSxDQUFDOzswREFBaUM7SUE3QzNDLHNCQUFzQjtRQVpsQyxTQUFTLENBQUM7WUFDVCxRQUFRLEVBQUUsb0JBQW9CO1lBQzlCLCtyREFBaUQ7WUFDakQsU0FBUyxFQUFFO2dCQUNUO29CQUNFLE9BQU8sRUFBRSxpQkFBaUI7b0JBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsY0FBTSxPQUFBLHdCQUFzQixFQUF0QixDQUFzQixDQUFDO29CQUNyRCxLQUFLLEVBQUUsSUFBSTtpQkFDWjthQUNGO1NBQ0YsQ0FBQzt5Q0FpRHdCLFdBQVc7WUFDUCxTQUFTO09BaEQxQixzQkFBc0IsQ0E2RmxDO0lBQUQsNkJBQUM7Q0FBQSxBQTdGRCxJQTZGQztTQTdGWSxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgZm9yd2FyZFJlZixcbiAgSG9zdEJpbmRpbmcsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIFF1ZXJ5TGlzdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTkdYTG9nZ2VyIH0gZnJvbSAnbmd4LWxvZ2dlcic7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgUHJvcGVydHlBcGkgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2RlY29yYXRvcnMvYXBpJztcbmltcG9ydCB7IFNpemUgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VudW1zL3NpemUnO1xuaW1wb3J0IHsgVUkgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VudW1zL3VpJztcbmltcG9ydCB7IGlzRXF1YWwgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3V0aWxzL2VxdWFsJztcbmltcG9ydCB7IENoZWNrYm94Q29tcG9uZW50IH0gZnJvbSAnLi4vY2hlY2tib3guY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnam50LWNoZWNrYm94LWdyb3VwJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NoZWNrYm94LWdyb3VwLmVuY2Fwc3VsYXRlZC5odG1sJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDaGVja2JveEdyb3VwQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuXG5leHBvcnQgY2xhc3MgQ2hlY2tib3hHcm91cENvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBBZnRlclZpZXdJbml0IHtcblxuICB1aSA9IFVJO1xuXG4gIEBIb3N0QmluZGluZygnYXR0ci5ob3N0JylcbiAgcmVhZG9ubHkgaG9zdCA9ICdqbnQtY2hlY2tib3gtZ3JvdXAtaG9zdCc7XG5cbiAgcHJpdmF0ZSBfc2l6ZTogU2l6ZSA9IFNpemUubm9ybWFsO1xuICBwcml2YXRlIHNlbGVjdGVkSXRlbXMgPSBbXTtcblxuICBjaGVja2JveGVzQ29udHJvbCA9IHRoaXMuZmIuYXJyYXkoW10pO1xuICBmb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgY2hlY2tib3hlczogdGhpcy5jaGVja2JveGVzQ29udHJvbFxuICB9KTtcblxuICBAUHJvcGVydHlBcGkoe1xuICAgIGRlc2NyaXB0aW9uOiAnQ291bnQgb2YgY29scyBpbiBjaGVja2JveCBncm91cCcsXG4gICAgdHlwZTogJ251bWJlcicsXG4gICAgZGVmYXVsdDogMVxuICB9KVxuICBASW5wdXQoKVxuICBjb2xzID0gMTtcblxuICBAUHJvcGVydHlBcGkoe1xuICAgIGRlc2NyaXB0aW9uOiAnU2l6ZSBmb3IgY2hlY2tib3ggaW4gY2hlY2tib3ggZ3JvdXAnLFxuICAgIHBhdGg6ICd1aS5zaXplJyxcbiAgICBvcHRpb25zOiBbU2l6ZS50aW55LCBTaXplLnNtYWxsLCBTaXplLm5vcm1hbCwgU2l6ZS5sYXJnZV0sXG4gICAgZGVmYXVsdDogU2l6ZS5ub3JtYWxcbiAgfSlcbiAgQElucHV0KClcbiAgc2V0IHNpemUoc2l6ZTogU2l6ZSkge1xuICAgIHRoaXMuX3NpemUgPSBzaXplIHx8IFNpemUubm9ybWFsO1xuICB9XG5cbiAgZ2V0IHNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gIH1cblxuICBAQ29udGVudENoaWxkcmVuKENoZWNrYm94Q29tcG9uZW50KVxuICBjaGVja2JveGVzOiBRdWVyeUxpc3Q8Q2hlY2tib3hDb21wb25lbnQ+O1xuXG4gIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4gdm9pZCA9ICgpID0+IHRoaXMubG9nZ2VyLmVycm9yKCd2YWx1ZSBhY2Nlc3NvciBpcyBub3QgcmVnaXN0ZXJlZCcpO1xuICBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB0aGlzLmxvZ2dlci5lcnJvcigndmFsdWUgYWNjZXNzb3IgaXMgbm90IHJlZ2lzdGVyZWQnKTtcbiAgcmVnaXN0ZXJPbkNoYW5nZSA9IGZuID0+IHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgcmVnaXN0ZXJPblRvdWNoZWQgPSBmbiA9PiB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICBASG9zdExpc3RlbmVyKCdibHVyJykgb25CbHVyID0gKCkgPT4gdGhpcy5vblRvdWNoZWQoKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBsb2dnZXI6IE5HWExvZ2dlcikge1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMudXBkYXRlKCk7XG4gICAgdGhpcy5jaGVja2JveGVzLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHRoaXMudXBkYXRlKCkpO1xuXG4gICAgdGhpcy5jaGVja2JveGVzQ29udHJvbC52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgIG1hcChjaGVja2JveGVzID0+IHRoaXMuY2hlY2tib3hlc1xuICAgICAgICAuZmlsdGVyKChfLCBpKSA9PiBjaGVja2JveGVzW2ldKVxuICAgICAgICAubWFwKGNoZWNrYm94ID0+IGNoZWNrYm94LnZhbHVlKSksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgoYSwgYikgPT4gaXNFcXVhbChhLCBiKSlcbiAgICApLnN1YnNjcmliZShzZWxlY3RlZEl0ZW1zID0+IHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IHNlbGVjdGVkSXRlbXM7XG4gICAgICB0aGlzLm9uQ2hhbmdlKHNlbGVjdGVkSXRlbXMpO1xuICAgIH0pO1xuICB9XG5cbiAgdXBkYXRlKCkge1xuICAgIGlmICghIXRoaXMuY2hlY2tib3hlcykge1xuICAgICAgdGhpcy5jaGVja2JveGVzQ29udHJvbC5yZXNldChbXSwge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICAgIHRoaXMuY2hlY2tib3hlcy5mb3JFYWNoKChjaGVja2JveCwgaSkgPT4ge1xuICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5jaGVja2JveGVzQ29udHJvbC5nZXQoaS50b1N0cmluZygpKTtcbiAgICAgICAgaWYgKCEhY29udHJvbCkge1xuICAgICAgICAgIGNvbnRyb2wuc2V0VmFsdWUodGhpcy5zZWxlY3RlZEl0ZW1zLmluY2x1ZGVzKGNoZWNrYm94LnZhbHVlKSwge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNoZWNrYm94ZXNDb250cm9sLnB1c2gobmV3IEZvcm1Db250cm9sKHRoaXMuc2VsZWN0ZWRJdGVtcy5pbmNsdWRlcyhjaGVja2JveC52YWx1ZSkpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgbGV0IHNlbGVjdGVkSXRlbXMgPSBbXTtcbiAgICBpZiAoISF2YWx1ZSkge1xuICAgICAgc2VsZWN0ZWRJdGVtcyA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSBzZWxlY3RlZEl0ZW1zO1xuICAgIHRoaXMudXBkYXRlKCk7XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICBpc0Rpc2FibGVkID8gdGhpcy5jaGVja2JveGVzQ29udHJvbC5kaXNhYmxlKHtlbWl0RXZlbnQ6IGZhbHNlfSlcbiAgICAgIDogdGhpcy5jaGVja2JveGVzQ29udHJvbC5lbmFibGUoe2VtaXRFdmVudDogZmFsc2V9KTtcbiAgfVxufVxuIl19