@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
140 lines • 16.1 kB
JavaScript
import { EventEmitter } from '@angular/core';
export class AssetSelectorBase {
constructor(groupNodeService, inventory, assetSelectorService) {
this.groupNodeService = groupNodeService;
this.inventory = inventory;
this.assetSelectorService = assetSelectorService;
/**
* Config object containing all options for the asset selector.
*/
this.config = {};
/**
* The loading state of the current node.
*/
this.isLoading = false;
/**
* Emit the selected asset or assets.
*/
this.onSelected = new EventEmitter();
/**
* Emits if the currently selected asset is cleared.
*/
this.onClearSelected = new EventEmitter();
}
/**
* @ignore
*/
validate(control) {
if (this.config.required && (!control.value || control.value.length === 0)) {
return { required: true };
}
return null;
}
/**
* @ignore
*/
writeValue(obj) {
this.selected = this.assetSelectorService.normalizeValue(obj, this.config.modelMode);
}
/**
* @ignore
*/
registerOnChange(fn) {
this.onChange = fn;
}
/**
* @ignore
*/
registerOnTouched(fn) {
this.onTouched = fn;
}
/**
* @ignore
*/
doBlur() {
if (this.onTouched) {
this.onTouched();
}
}
/**
* Deselects all expect the given one.
* @param selectedMo The selected asset (optional, if empty -> just deselect all).
*/
deselectAll(selectedMo) {
this.selected = [];
if (selectedMo) {
this.selected = [this.assetSelectorService.simplifyModel(selectedMo, this.config.modelMode)];
}
this.emitChange(this.selected, selectedMo, !!selectedMo);
this.doBlur();
}
/**
* Adds an managed object to the selected array and emits the change.
* @param selectedMo The selected asset.
*/
select(selectedMo) {
if (!this.config.multi) {
this.selected = [];
}
const index = this.getIndexOfSelected(this.selected, selectedMo);
if (index === -1) {
this.selected.push(this.assetSelectorService.simplifyModel(selectedMo, this.config.modelMode));
}
this.emitChange(this.selected, selectedMo, true);
this.doBlur();
}
/**
* Removes a managed object from the selected array and emits the change.
* @param selectedMo The selected asset.
*/
deselect(selectedMo) {
const index = this.getIndexOfSelected(this.selected, selectedMo);
if (index > -1) {
this.selected.splice(index, 1);
}
this.emitChange(this.selected, selectedMo, false);
this.doBlur();
}
/**
* Returns the index of the currently selected item.
* @param selected All selected items
* @param selectedMo The new selected item-
* @returns An index, or -1 if not found.
*/
getIndexOfSelected(selected, selectedMo) {
return selected.findIndex(mo => mo.id === selectedMo.id);
}
emitChange(selected, item, isSelected) {
const changes = this.config.multi ? selected : selected[0];
if (this.onChange) {
this.onChange(changes);
}
this.onSelected.emit({ items: changes, change: { item, isSelected } });
}
createDefaultRootNode() {
return this.groupNodeService.createGroupNode({
root: true,
groupsSelectable: this.config.groupsSelectable,
groupsOnly: this.config.groupsOnly,
showChildDevices: this.config.showChildDevices
});
}
async createManagedObjectRootNode(asset) {
if (asset.id) {
return this.groupNodeService.createGroupNode({
mo: asset,
groupsSelectable: this.config.groupsSelectable,
groupsOnly: this.config.groupsOnly,
showChildDevices: this.config.showChildDevices
});
}
const { data: mo } = await this.inventory.detail(asset);
return this.groupNodeService.createGroupNode({
mo,
groupsSelectable: this.config.groupsSelectable,
groupsOnly: this.config.groupsOnly,
showChildDevices: this.config.showChildDevices
});
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXQtc2VsZWN0b3ItYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2Fzc2V0cy1uYXZpZ2F0b3IvYXNzZXQtc2VsZWN0b3IvYXNzZXQtc2VsZWN0b3ItYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBTzdDLE1BQU0sT0FBTyxpQkFBaUI7SUF5QjVCLFlBQ1ksZ0JBQWtDLEVBQ2xDLFNBQTJCLEVBQzNCLG9CQUEwQztRQUYxQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQzNCLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUEzQnREOztXQUVHO1FBQ0gsV0FBTSxHQUF5QixFQUFFLENBQUM7UUFLbEM7O1dBRUc7UUFDSCxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xCOztXQUVHO1FBQ0gsZUFBVSxHQUFHLElBQUksWUFBWSxFQUE2QixDQUFDO1FBQzNEOztXQUVHO1FBQ0gsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0lBU3hDLENBQUM7SUFFSjs7T0FFRztJQUNILFFBQVEsQ0FBQyxPQUF3QjtRQUMvQixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDM0UsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUM1QixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVLENBQUMsR0FBUTtRQUNqQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMs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VSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTtZQUNsQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQjtTQUMvQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElJZGVudGlmaWVkLCBJTWFuYWdlZE9iamVjdCwgSW52ZW50b3J5U2VydmljZSB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IEdyb3VwTm9kZVNlcnZpY2UgfSBmcm9tICcuL2dyb3VwLW5vZGUuc2VydmljZSc7XG5pbXBvcnQgeyBBc3NldFNlbGVjdG9yU2VydmljZSB9IGZyb20gJy4vYXNzZXQtc2VsZWN0b3Iuc2VydmljZSc7XG5pbXBvcnQgeyBBc3NldFNlbGVjdGlvbkNoYW5nZUV2ZW50LCBBc3NldFNlbGVjdG9yT3B0aW9ucyB9IGZyb20gJy4vYXNzZXQtc2VsZWN0b3IubW9kZWwnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBWYWxpZGF0aW9uRXJyb3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5leHBvcnQgY2xhc3MgQXNzZXRTZWxlY3RvckJhc2Uge1xuICAvKipcbiAgICogQ29uZmlnIG9iamVjdCBjb250YWluaW5nIGFsbCBvcHRpb25zIGZvciB0aGUgYXNzZXQgc2VsZWN0b3IuXG4gICAqL1xuICBjb25maWc6IEFzc2V0U2VsZWN0b3JPcHRpb25zID0ge307XG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiBwcmVkZWZpbmVkIG5vZGVzLlxuICAgKi9cbiAgc2VsZWN0ZWQ6IEFycmF5PFBhcnRpYWw8SU1hbmFnZWRPYmplY3Q+PiB8IElJZGVudGlmaWVkW10gfCBJSWRlbnRpZmllZDtcbiAgLyoqXG4gICAqIFRoZSBsb2FkaW5nIHN0YXRlIG9mIHRoZSBjdXJyZW50IG5vZGUuXG4gICAqL1xuICBpc0xvYWRpbmcgPSBmYWxzZTtcbiAgLyoqXG4gICAqIEVtaXQgdGhlIHNlbGVjdGVkIGFzc2V0IG9yIGFzc2V0cy5cbiAgICovXG4gIG9uU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEFzc2V0U2VsZWN0aW9uQ2hhbmdlRXZlbnQ+KCk7XG4gIC8qKlxuICAgKiBFbWl0cyBpZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGFzc2V0IGlzIGNsZWFyZWQuXG4gICAqL1xuICBvbkNsZWFyU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSBvbkNoYW5nZTogKG1vOiBJSWRlbnRpZmllZFtdIHwgSUlkZW50aWZpZWQpID0+IHZvaWQ7XG4gIHByaXZhdGUgb25Ub3VjaGVkOiAoKSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBncm91cE5vZGVTZXJ2aWNlOiBHcm91cE5vZGVTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBpbnZlbnRvcnk6IEludmVudG9yeVNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGFzc2V0U2VsZWN0b3JTZXJ2aWNlOiBBc3NldFNlbGVjdG9yU2VydmljZVxuICApIHt9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIHZhbGlkYXRlKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMge1xuICAgIGlmICh0aGlzLmNvbmZpZy5yZXF1aXJlZCAmJiAoIWNvbnRyb2wudmFsdWUgfHwgY29udHJvbC52YWx1ZS5sZW5ndGggPT09IDApKSB7XG4gICAgICByZXR1cm4geyByZXF1aXJlZDogdHJ1ZSB9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICB3cml0ZVZhbHVlKG9iajogYW55KTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZCA9IHRoaXMuYXNzZXRTZWxlY3RvclNlcnZpY2Uubm9ybWFsaXplVmFsdWUob2JqLCB0aGlzLmNvbmZpZy5tb2RlbE1vZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBkb0JsdXIoKSB7XG4gICAgaWYgKHRoaXMub25Ub3VjaGVkKSB7XG4gICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlbGVjdHMgYWxsIGV4cGVjdCB0aGUgZ2l2ZW4gb25lLlxuICAgKiBAcGFyYW0gc2VsZWN0ZWRNbyBUaGUgc2VsZWN0ZWQgYXNzZXQgKG9wdGlvbmFsLCBpZiBlbXB0eSAtPiBqdXN0IGRlc2VsZWN0IGFsbCkuXG4gICAqL1xuICBkZXNlbGVjdEFsbChzZWxlY3RlZE1vPzogSU1hbmFnZWRPYmplY3QpIHtcbiAgICB0aGlzLnNlbGVjdGVkID0gW107XG4gICAgaWYgKHNlbGVjdGVkTW8pIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWQgPSBbdGhpcy5hc3NldFNlbGVjdG9yU2VydmljZS5zaW1wbGlmeU1vZGVsKHNlbGVjdGVkTW8sIHRoaXMuY29uZmlnLm1vZGVsTW9kZSldO1xuICAgIH1cbiAgICB0aGlzLmVtaXRDaGFuZ2UodGhpcy5zZWxlY3RlZCwgc2VsZWN0ZWRNbywgISFzZWxlY3RlZE1vKTtcbiAgICB0aGlzLmRvQmx1cigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gbWFuYWdlZCBvYmplY3QgdG8gdGhlIHNlbGVjdGVkIGFycmF5IGFuZCBlbWl0cyB0aGUgY2hhbmdlLlxuICAgKiBAcGFyYW0gc2VsZWN0ZWRNbyBUaGUgc2VsZWN0ZWQgYXNzZXQuXG4gICAqL1xuICBzZWxlY3Qoc2VsZWN0ZWRNbzogSU1hbmFnZWRPYmplY3QpIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLm11bHRpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkID0gW107XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5nZXRJbmRleE9mU2VsZWN0ZWQodGhpcy5zZWxlY3RlZCwgc2VsZWN0ZWRNbyk7XG4gICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgdGhpcy5zZWxlY3RlZC5wdXNoKFxuICAgICAgICB0aGlzLmFzc2V0U2VsZWN0b3JTZXJ2aWNlLnNpbXBsaWZ5TW9kZWwoc2VsZWN0ZWRNbywgdGhpcy5jb25maWcubW9kZWxNb2RlKVxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5lbWl0Q2hhbmdlKHRoaXMuc2VsZWN0ZWQsIHNlbGVjdGVkTW8sIHRydWUpO1xuICAgIHRoaXMuZG9CbHVyKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIG1hbmFnZWQgb2JqZWN0IGZyb20gdGhlIHNlbGVjdGVkIGFycmF5IGFuZCBlbWl0cyB0aGUgY2hhbmdlLlxuICAgKiBAcGFyYW0gc2VsZWN0ZWRNbyBUaGUgc2VsZWN0ZWQgYXNzZXQuXG4gICAqL1xuICBkZXNlbGVjdChzZWxlY3RlZE1vOiBJTWFuYWdlZE9iamVjdCkge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5nZXRJbmRleE9mU2VsZWN0ZWQodGhpcy5zZWxlY3RlZCwgc2VsZWN0ZWRNbyk7XG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWQuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gICAgdGhpcy5lbWl0Q2hhbmdlKHRoaXMuc2VsZWN0ZWQsIHNlbGVjdGVkTW8sIGZhbHNlKTtcbiAgICB0aGlzLmRvQmx1cigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbS5cbiAgICogQHBhcmFtIHNlbGVjdGVkIEFsbCBzZWxlY3RlZCBpdGVtc1xuICAgKiBAcGFyYW0gc2VsZWN0ZWRNbyBUaGUgbmV3IHNlbGVjdGVkIGl0ZW0tXG4gICAqIEByZXR1cm5zIEFuIGluZGV4LCBvciAtMSBpZiBub3QgZm91bmQuXG4gICAqL1xuICBnZXRJbmRleE9mU2VsZWN0ZWQoXG4gICAgc2VsZWN0ZWQ6IEFycmF5PFBhcnRpYWw8SUlkZW50aWZpZWQ+PiB8IFBhcnRpYWw8SUlkZW50aWZpZWQ+LFxuICAgIHNlbGVjdGVkTW86IElJZGVudGlmaWVkXG4gICkge1xuICAgIHJldHVybiBzZWxlY3RlZC5maW5kSW5kZXgobW8gPT4gbW8uaWQgPT09IHNlbGVjdGVkTW8uaWQpO1xuICB9XG5cbiAgZW1pdENoYW5nZShzZWxlY3RlZDogSUlkZW50aWZpZWQgfCBJSWRlbnRpZmllZFtdLCBpdGVtOiBJTWFuYWdlZE9iamVjdCwgaXNTZWxlY3RlZDogYm9vbGVhbikge1xuICAgIGNvbnN0IGNoYW5nZXMgPSB0aGlzLmNvbmZpZy5tdWx0aSA/IHNlbGVjdGVkIDogc2VsZWN0ZWRbMF07XG4gICAgaWYgKHRoaXMub25DaGFuZ2UpIHtcbiAgICAgIHRoaXMub25DaGFuZ2UoY2hhbmdlcyk7XG4gICAgfVxuICAgIHRoaXMub25TZWxlY3RlZC5lbWl0KHsgaXRlbXM6IGNoYW5nZXMsIGNoYW5nZTogeyBpdGVtLCBpc1NlbGVjdGVkIH0gfSk7XG4gIH1cblxuICBjcmVhdGVEZWZhdWx0Um9vdE5vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ3JvdXBOb2RlU2VydmljZS5jcmVhdGVHcm91cE5vZGUoe1xuICAgICAgcm9vdDogdHJ1ZSxcbiAgICAgIGdyb3Vwc1NlbGVjdGFibGU6IHRoaXMuY29uZmlnLmdyb3Vwc1NlbGVjdGFibGUsXG4gICAgICBncm91cHNPbmx5OiB0aGlzLmNvbmZpZy5ncm91cHNPbmx5LFxuICAgICAgc2hvd0NoaWxkRGV2aWNlczogdGhpcy5jb25maWcuc2hvd0NoaWxkRGV2aWNlc1xuICAgIH0pO1xuICB9XG4gIGFzeW5jIGNyZWF0ZU1hbmFnZWRPYmplY3RSb290Tm9kZShhc3NldDogSUlkZW50aWZpZWQpIHtcbiAgICBpZiAoKGFzc2V0IGFzIElJZGVudGlmaWVkKS5pZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBOb2RlU2VydmljZS5jcmVhdGVHcm91cE5vZGUoe1xuICAgICAgICBtbzogYXNzZXQgYXMgSU1hbmFnZWRPYmplY3QsXG4gICAgICAgIGdyb3Vwc1NlbGVjdGFibGU6IHRoaXMuY29uZmlnLmdyb3Vwc1NlbGVjdGFibGUsXG4gICAgICAgIGdyb3Vwc09ubHk6IHRoaXMuY29uZmlnLmdyb3Vwc09ubHksXG4gICAgICAgIHNob3dDaGlsZERldmljZXM6IHRoaXMuY29uZmlnLnNob3dDaGlsZERldmljZXNcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCB7IGRhdGE6IG1vIH0gPSBhd2FpdCB0aGlzLmludmVudG9yeS5kZXRhaWwoYXNzZXQpO1xuICAgIHJldHVybiB0aGlzLmdyb3VwTm9kZVNlcnZpY2UuY3JlYXRlR3JvdXBOb2RlKHtcbiAgICAgIG1vLFxuICAgICAgZ3JvdXBzU2VsZWN0YWJsZTogdGhpcy5jb25maWcuZ3JvdXBzU2VsZWN0YWJsZSxcbiAgICAgIGdyb3Vwc09ubHk6IHRoaXMuY29uZmlnLmdyb3Vwc09ubHksXG4gICAgICBzaG93Q2hpbGREZXZpY2VzOiB0aGlzLmNvbmZpZy5zaG93Q2hpbGREZXZpY2VzXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==