UNPKG

ontotext-reusable-ui-components

Version:

Unified reusable UI components designed for the Ontotext ecosystem.

111 lines 15.4 kB
import { Component, Input, ViewChild } from '@angular/core'; export class RangeHistogramComponent { ngAfterViewInit() { this.histogramModel = this.data.histogramConfiguration; this.init(); // An observer that monitors the resizing of the canvas element, causing it to redraw on changes. // @ts-ignore const observer = new ResizeObserver(() => { this.init(); }); observer.observe(this.canvas.nativeElement); } ngOnChanges(changes) { var _a; if ((_a = changes.data) === null || _a === void 0 ? void 0 : _a.currentValue) { this.histogramModel = this.data.histogramConfiguration; this.init(); } } init() { if (!this.canvas) { return; } this.fitToContainer(this.canvas.nativeElement); this.ctx = this.canvas.nativeElement.getContext('2d'); const data = [...this.data.facetGroupData]; data.sort((a, b) => { return this.parseInt(a.label) - this.parseInt(b.label); }); this.drawHistogram(this.fillEmptyValues(data)); } drawHistogram(data) { var _a, _b, _c; this.ctx.clearRect(0, 0, this.canvas.nativeElement.getBoundingClientRect().width, this.canvas.nativeElement.getBoundingClientRect().height); this.ctx.save(); const canvasWidth = this.canvas.nativeElement.getBoundingClientRect().width; const width = canvasWidth / data.length; const scale = ((_a = this.histogramModel) === null || _a === void 0 ? void 0 : _a.scale) || 0.5; const baseYPos = ((_b = this.histogramModel) === null || _b === void 0 ? void 0 : _b.baseYPos) || 100; const fillStyle = ((_c = this.histogramModel) === null || _c === void 0 ? void 0 : _c.fillStyle) || 'rgba(200, 200, 200, 0.2)'; let posX = 0; let posY = 0; for (let i = 0; i < data.length; i++) { if (data[i].count > 0) { const height = this.parseInt(data[i].count) * scale; posX = i * width; posY = baseYPos - height; this.ctx.beginPath(); this.ctx.arc(posX, posY, data[i].count * scale, 0, 2 * Math.PI); this.ctx.fillStyle = fillStyle; this.ctx.fill(); this.ctx.restore(); } } this.ctx.restore(); } fitToContainer(canvas) { // Make it visually fill the positioned parent canvas.style.width = '100%'; canvas.style.height = '100%'; // then set the internal size to match canvas.width = canvas.offsetWidth; canvas.height = canvas.offsetHeight; } compare(a, b) { const parsedA = this.parseInt(a.label); const parsedB = this.parseInt(b.label); if (parsedA < parsedB) { return -1; } if (parsedA > parsedB) { return 1; } return 0; } fillEmptyValues(data) { const empty = { label: '0', count: 0 }; const filledArray = []; data.forEach((value, index) => { filledArray.push(value); if (data[index + 1]) { let emptyValuesCount = this.parseInt(data[index + 1].label) - this.parseInt(data[index].label); while (emptyValuesCount > 1) { filledArray.push(empty); emptyValuesCount--; } } }); return filledArray; } parseInt(value) { try { return parseInt(value); } catch (e) { throw new Error(`Parsing ${value} to number failed! ` + e.message); } } } RangeHistogramComponent.decorators = [ { type: Component, args: [{ selector: 'onto-range-histogram', template: "<div class=\"range-histogram\">\n <canvas id=\"range-histogram-canvas\" #rangeHistogramCanvas>\n {{\"ONTO_RANGE_FACET.NO_CANVAS_SUPPORT\" | transloco}}\n </canvas>\n</div>\n", styles: [".range-histogram{align-items:center;display:flex;flex-direction:row;height:100px;margin-bottom:10px;place-content:center}"] },] } ]; RangeHistogramComponent.propDecorators = { data: [{ type: Input }], canvas: [{ type: ViewChild, args: ['rangeHistogramCanvas',] }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UtaGlzdG9ncmFtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIvb3B0L2plbmtpbnNfam9icy93b3Jrc3BhY2UvcmV1c2FibGUtdWktY29tcG9uZW50cy1yZWxlYXNlL3Byb2plY3RzL29udG8tc2VhcmNoL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9vbnRvLXNlYXJjaC1mYWNldC9yYW5nZS1mYWNldC9yYW5nZS1oaXN0b2dyYW0vcmFuZ2UtaGlzdG9ncmFtLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUVULEtBQUssRUFHTCxTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFVdkIsTUFBTSxPQUFPLHVCQUF1QjtJQWEzQixlQUFlO1FBQ3BCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztRQUN2RCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFWixpR0FBaUc7UUFDakcsYUFBYTtRQUNiLE1BQU0sUUFBUSxHQUFHLElBQUksY0FBYyxDQUFDLEdBQUcsRUFBRTtZQUN2QyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztRQUVILFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCOztRQUNoQyxVQUFJLE9BQU8sQ0FBQyxJQUFJLDBDQUFFLFlBQVksRUFBRTtZQUM5QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUM7WUFDdkQsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ2I7SUFDSCxDQUFDO0lBRUQsSUFBSTtRQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2hCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxD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QUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMvRixPQUFPLGdCQUFnQixHQUFHLENBQUMsRUFBRTtvQkFDM0IsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDeEIsZ0JBQWdCLEVBQUUsQ0FBQztpQkFDcEI7YUFDRjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUVPLFFBQVEsQ0FBQyxLQUFhO1FBQzVCLElBQUk7WUFDRixPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN4QjtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyxXQUFXLEtBQUsscUJBQXFCLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3BFO0lBQ0gsQ0FBQzs7O1lBbElGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsc0JBQXNCO2dCQUNoQyw4TEFBK0M7O2FBRWhEOzs7bUJBS0UsS0FBSztxQkFHTCxTQUFTLFNBQUMsc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1NlYXJjaEZhY2V0TW9kZWx9IGZyb20gJy4uLy4uL21vZGVscy9zZWFyY2gtZmFjZXQtbW9kZWwnO1xuaW1wb3J0IHtIaXN0b2dyYW1Nb2RlbH0gZnJvbSAnLi4vbW9kZWxzL2hpc3RvZ3JhbS1tb2RlbCc7XG5pbXBvcnQge1NlYXJjaFJhbmdlRmFjZXRHcm91cE1vZGVsfSBmcm9tICcuLi9tb2RlbHMvc2VhcmNoLXJhbmdlLWZhY2V0LWdyb3VwLW1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnb250by1yYW5nZS1oaXN0b2dyYW0nLFxuICB0ZW1wbGF0ZVVybDogJy4vcmFuZ2UtaGlzdG9ncmFtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcmFuZ2UtaGlzdG9ncmFtLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgUmFuZ2VIaXN0b2dyYW1Db21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMge1xuICAvKipcbiAgICogRmFjZXQgZGF0YSBob2xkZXIuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZGF0YTogU2VhcmNoUmFuZ2VGYWNldEdyb3VwTW9kZWw7XG5cbiAgQFZpZXdDaGlsZCgncmFuZ2VIaXN0b2dyYW1DYW52YXMnKVxuICBwcml2YXRlIGNhbnZhczogRWxlbWVudFJlZjtcblxuICBwcml2YXRlIGN0eDtcbiAgcHJpdmF0ZSBoaXN0b2dyYW1Nb2RlbDogSGlzdG9ncmFtTW9kZWw7XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmhpc3RvZ3JhbU1vZGVsID0gdGhpcy5kYXRhLmhpc3RvZ3JhbUNvbmZpZ3VyYXRpb247XG4gICAgdGhpcy5pbml0KCk7XG5cbiAgICAvLyBBbiBvYnNlcnZlciB0aGF0IG1vbml0b3JzIHRoZSByZXNpemluZyBvZiB0aGUgY2FudmFzIGVsZW1lbnQsIGNhdXNpbmcgaXQgdG8gcmVkcmF3IG9uIGNoYW5nZXMuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHtcbiAgICAgIHRoaXMuaW5pdCgpO1xuICAgIH0pO1xuXG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmNhbnZhcy5uYXRpdmVFbGVtZW50KTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlcy5kYXRhPy5jdXJyZW50VmFsdWUpIHtcbiAgICAgIHRoaXMuaGlzdG9ncmFtTW9kZWwgPSB0aGlzLmRhdGEuaGlzdG9ncmFtQ29uZmlndXJhdGlvbjtcbiAgICAgIHRoaXMuaW5pdCgpO1xuICAgIH1cbiAgfVxuXG4gIGluaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNhbnZhcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmZpdFRvQ29udGFpbmVyKHRoaXMuY2FudmFzLm5hdGl2ZUVsZW1lbnQpO1xuICAgIHRoaXMuY3R4ID0gdGhpcy5jYW52YXMubmF0aXZlRWxlbWVudC5nZXRDb250ZXh0KCcyZCcpO1xuXG4gICAgY29uc3QgZGF0YTogU2VhcmNoRmFjZXRNb2RlbFtdID0gWy4uLnRoaXMuZGF0YS5mYWNldEdyb3VwRGF0YV07XG5cbiAgICBkYXRhLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlSW50KGEubGFiZWwpIC0gdGhpcy5wYXJzZUludChiLmxhYmVsKTtcbiAgICB9KTtcbiAgICB0aGlzLmRyYXdIaXN0b2dyYW0odGhpcy5maWxsRW1wdHlWYWx1ZXMoZGF0YSkpO1xuICB9XG5cbiAgZHJhd0hpc3RvZ3JhbShkYXRhKTogdm9pZCB7XG4gICAgdGhpcy5jdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMuY2FudmFzLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgsIHRoaXMuY2FudmFzLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0KTtcblxuICAgIHRoaXMuY3R4LnNhdmUoKTtcblxuICAgIGNvbnN0IGNhbnZhc1dpZHRoID0gdGhpcy5jYW52YXMubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcblxuICAgIGNvbnN0IHdpZHRoID0gY2FudmFzV2lkdGggLyBkYXRhLmxlbmd0aDtcbiAgICBjb25zdCBzY2FsZSA9IHRoaXMuaGlzdG9ncmFtTW9kZWw/LnNjYWxlIHx8IDAuNTtcbiAgICBjb25zdCBiYXNlWVBvcyA9IHRoaXMuaGlzdG9ncmFtTW9kZWw/LmJhc2VZUG9zIHx8IDEwMDtcbiAgICBjb25zdCBmaWxsU3R5bGUgPSB0aGlzLmhpc3RvZ3JhbU1vZGVsPy5maWxsU3R5bGUgfHwgJ3JnYmEoMjAwLCAyMDAsIDIwMCwgMC4yKSc7XG5cbiAgICBsZXQgcG9zWCA9IDA7XG4gICAgbGV0IHBvc1kgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGRhdGFbaV0uY291bnQgPiAwKSB7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHRoaXMucGFyc2VJbnQoZGF0YVtpXS5jb3VudCkgKiBzY2FsZTtcbiAgICAgICAgcG9zWCA9IGkgKiB3aWR0aDtcbiAgICAgICAgcG9zWSA9IGJhc2VZUG9zIC0gaGVpZ2h0O1xuICAgICAgICB0aGlzLmN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgdGhpcy5jdHguYXJjKHBvc1gsIHBvc1ksIGRhdGFbaV0uY291bnQgKiBzY2FsZSwgMCwgMiAqIE1hdGguUEkpO1xuICAgICAgICB0aGlzLmN0eC5maWxsU3R5bGUgPSBmaWxsU3R5bGU7XG4gICAgICAgIHRoaXMuY3R4LmZpbGwoKTtcbiAgICAgICAgdGhpcy5jdHgucmVzdG9yZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcbiAgfVxuXG4gIGZpdFRvQ29udGFpbmVyKGNhbnZhczogYW55KTogdm9pZCB7XG4gICAgLy8gTWFrZSBpdCB2aXN1YWxseSBmaWxsIHRoZSBwb3NpdGlvbmVkIHBhcmVudFxuICAgIGNhbnZhcy5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gJzEwMCUnO1xuXG4gICAgLy8gdGhlbiBzZXQgdGhlIGludGVybmFsIHNpemUgdG8gbWF0Y2hcbiAgICBjYW52YXMud2lkdGggPSBjYW52YXMub2Zmc2V0V2lkdGg7XG4gICAgY2FudmFzLmhlaWdodCA9IGNhbnZhcy5vZmZzZXRIZWlnaHQ7XG4gIH1cblxuICBjb21wYXJlKGE6IFNlYXJjaEZhY2V0TW9kZWwsIGI6IFNlYXJjaEZhY2V0TW9kZWwpOiBudW1iZXIge1xuICAgIGNvbnN0IHBhcnNlZEEgPSB0aGlzLnBhcnNlSW50KGEubGFiZWwpO1xuICAgIGNvbnN0IHBhcnNlZEIgPSB0aGlzLnBhcnNlSW50KGIubGFiZWwpO1xuICAgIGlmIChwYXJzZWRBIDwgcGFyc2VkQikge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgICBpZiAocGFyc2VkQSA+IHBhcnNlZEIpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHByaXZhdGUgZmlsbEVtcHR5VmFsdWVzKGRhdGE6IFNlYXJjaEZhY2V0TW9kZWxbXSk6IFNlYXJjaEZhY2V0TW9kZWxbXSB7XG4gICAgY29uc3QgZW1wdHkgPSB7bGFiZWw6ICcwJywgY291bnQ6IDB9O1xuICAgIGNvbnN0IGZpbGxlZEFycmF5ID0gW107XG5cbiAgICBkYXRhLmZvckVhY2goKHZhbHVlOiBTZWFyY2hGYWNldE1vZGVsLCBpbmRleCkgPT4ge1xuICAgICAgZmlsbGVkQXJyYXkucHVzaCh2YWx1ZSk7XG5cbiAgICAgIGlmIChkYXRhW2luZGV4ICsgMV0pIHtcbiAgICAgICAgbGV0IGVtcHR5VmFsdWVzQ291bnQgPSB0aGlzLnBhcnNlSW50KGRhdGFbaW5kZXggKyAxXS5sYWJlbCkgLSB0aGlzLnBhcnNlSW50KGRhdGFbaW5kZXhdLmxhYmVsKTtcbiAgICAgICAgd2hpbGUgKGVtcHR5VmFsdWVzQ291bnQgPiAxKSB7XG4gICAgICAgICAgZmlsbGVkQXJyYXkucHVzaChlbXB0eSk7XG4gICAgICAgICAgZW1wdHlWYWx1ZXNDb3VudC0tO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmlsbGVkQXJyYXk7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlSW50KHZhbHVlOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gcGFyc2VJbnQodmFsdWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUGFyc2luZyAke3ZhbHVlfSB0byBudW1iZXIgZmFpbGVkISBgICsgZS5tZXNzYWdlKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==