import * as i0 from '@angular/core'; import { PLATFORM_ID, Component, ViewEncapsulation, Inject, Input, ViewChild, HostBinding, HostListener, Injectable, ChangeDetectionStrategy, EventEmitter, Output, Directive, NgModule, ContentChild } from '@angular/core'; import * as i2 from '@angular/common'; import { isPlatformBrowser, isPlatformServer, CommonModule } from '@angular/common'; import { __decorate } from 'tslib'; import { DomPortalOutlet, ComponentPortal } from '@angular/cdk/portal'; import { fromEvent } from 'rxjs'; import { debounceTime } from 'rxjs/operators'; import { trigger, transition, style, animate } from '@angular/animations'; import { select } from 'd3-selection'; import { brushX } from 'd3-brush'; import { scaleTime, scaleLinear, scalePoint, scaleOrdinal, scaleQuantile, scaleBand } from 'd3-scale'; import { area, curveLinear, line, arc, lineRadial, curveCardinalClosed, pie } from 'd3-shape'; import { range, min, max, quantile } from 'd3-array'; import { interpolate } from 'd3-interpolate'; import { easeSinInOut } from 'd3-ease'; import rfdc from 'rfdc'; import { format } from 'd3-format'; import * as d3_color from 'd3-color'; import { treemap, stratify } from 'd3-hierarchy'; import { sankey, sankeyLeft, sankeyLinkHorizontal } from 'd3-sankey'; import { timeFormat } from 'd3-time-format'; /** * Throttle a function * */ function throttle(func, wait, options) { options = options || {}; let context; let args; let result; let timeout = null; let previous = 0; function later() { previous = options.leading === false ? 0 : +new Date(); timeout = null; result = func.apply(context, args); } return function () { const now = +new Date(); if (!previous && options.leading === false) { previous = now; } const remaining = wait - (now - previous); context = this; // eslint-disable-next-line prefer-rest-params args = arguments; if (remaining <= 0) { clearTimeout(timeout); timeout = null; previous = now; result = func.apply(context, args); } else if (!timeout && options.trailing !== false) { timeout = setTimeout(later, remaining); } return result; }; } /** * Throttle decorator * * class MyClass { * throttleable(10) * myFn() { ... } * } */ function throttleable(duration, options) { return function innerDecorator(target, key, descriptor) { return { configurable: true, enumerable: descriptor.enumerable, get: function getter() { Object.defineProperty(this, key, { configurable: true, enumerable: descriptor.enumerable, value: throttle(descriptor.value, duration, options) }); return this[key]; } }; }; } var PlacementTypes; (function (PlacementTypes) { PlacementTypes["Top"] = "top"; PlacementTypes["Bottom"] = "bottom"; PlacementTypes["Left"] = "left"; PlacementTypes["Right"] = "right"; PlacementTypes["Center"] = "center"; })(PlacementTypes || (PlacementTypes = {})); const caretOffset = 7; function verticalPosition(elDimensions, popoverDimensions, alignment) { if (alignment === PlacementTypes.Top) { return elDimensions.top - caretOffset; } if (alignment === PlacementTypes.Bottom) { return elDimensions.top + elDimensions.height - popoverDimensions.height + caretOffset; } if (alignment === PlacementTypes.Center) { return elDimensions.top + elDimensions.height / 2 - popoverDimensions.height / 2; } return undefined; } function horizontalPosition(elDimensions, popoverDimensions, alignment) { if (alignment === PlacementTypes.Left) { return elDimensions.left - caretOffset; } if (alignment === PlacementTypes.Right) { return elDimensions.left + elDimensions.width - popoverDimensions.width + caretOffset; } if (alignment === PlacementTypes.Center) { return elDimensions.left + elDimensions.width / 2 - popoverDimensions.width / 2; } return undefined; } /** * Position helper for the popover directive. * * @export */ class PositionHelper { /** * Calculate vertical alignment position * * @memberOf PositionHelper */ static calculateVerticalAlignment(elDimensions, popoverDimensions, alignment) { let result = verticalPosition(elDimensions, popoverDimensions, alignment); if (result + popoverDimensions.height > window.innerHeight) { result = window.innerHeight - popoverDimensions.height; } return result; } /** * Calculate vertical caret position * * @memberOf PositionHelper */ static calculateVerticalCaret(elDimensions, popoverDimensions, caretDimensions, alignment) { let result; if (alignment === PlacementTypes.Top) { result = elDimensions.height / 2 - caretDimensions.height / 2 + caretOffset; } if (alignment === PlacementTypes.Bottom) { result = popoverDimensions.height - elDimensions.height / 2 - caretDimensions.height / 2 - caretOffset; } if (alignment === PlacementTypes.Center) { result = popoverDimensions.height / 2 - caretDimensions.height / 2; } const popoverPosition = verticalPosition(elDimensions, popoverDimensions, alignment); if (popoverPosition + popoverDimensions.height > window.innerHeight) { result += popoverPosition + popoverDimensions.height - window.innerHeight; } return result; } /** * Calculate horz alignment position * * @memberOf PositionHelper */ static calculateHorizontalAlignment(elDimensions, popoverDimensions, alignment) { let result = horizontalPosition(elDimensions, popoverDimensions, alignment); if (result + popoverDimensions.width > window.innerWidth) { result = window.innerWidth - popoverDimensions.width; } return result; } /** * Calculate horz caret position * * @memberOf PositionHelper */ static calculateHorizontalCaret(elDimensions, popoverDimensions, caretDimensions, alignment) { let result; if (alignment === PlacementTypes.Left) { result = elDimensions.width / 2 - caretDimensions.width / 2 + caretOffset; } if (alignment === PlacementTypes.Right) { result = popoverDimensions.width - elDimensions.width / 2 - caretDimensions.width / 2 - caretOffset; } if (alignment === PlacementTypes.Center) { result = popoverDimensions.width / 2 - caretDimensions.width / 2; } const popoverPosition = horizontalPosition(elDimensions, popoverDimensions, alignment); if (popoverPosition + popoverDimensions.width > window.innerWidth) { result += popoverPosition + popoverDimensions.width - window.innerWidth; } return result; } /** * Checks if the element's position should be flipped * * @memberOf PositionHelper */ static shouldFlip(elDimensions, popoverDimensions, placement, spacing) { let flip = false; if (placement === PlacementTypes.Right) { if (elDimensions.left + elDimensions.width + popoverDimensions.width + spacing > window.innerWidth) { flip = true; } } if (placement === PlacementTypes.Left) { if (elDimensions.left - popoverDimensions.width - spacing < 0) { flip = true; } } if (placement === PlacementTypes.Top) { if (elDimensions.top - popoverDimensions.height - spacing < 0) { flip = true; } } if (placement === PlacementTypes.Bottom) { if (elDimensions.top + elDimensions.height + popoverDimensions.height + spacing > window.innerHeight) { flip = true; } } return flip; } /** * Position caret * * @memberOf PositionHelper */ static positionCaret(placement, elmDim, hostDim, caretDimensions, alignment) { let top = 0; let left = 0; if (placement === PlacementTypes.Right) { left = -7; top = PositionHelper.calculateVerticalCaret(hostDim, elmDim, caretDimensions, alignment); } else if (placement === PlacementTypes.Left) { left = elmDim.width; top = PositionHelper.calculateVerticalCaret(hostDim, elmDim, caretDimensions, alignment); } else if (placement === PlacementTypes.Top) { top = elmDim.height; left = PositionHelper.calculateHorizontalCaret(hostDim, elmDim, caretDimensions, alignment); } else if (placement === PlacementTypes.Bottom) { top = -7; left = PositionHelper.calculateHorizontalCaret(hostDim, elmDim, caretDimensions, alignment); } return { top, left }; } /** * Position content * * @memberOf PositionHelper */ static positionContent(placement, elmDim, hostDim, spacing, alignment) { let top = 0; let left = 0; if (placement === PlacementTypes.Right) { left = hostDim.left + hostDim.width + spacing; top = PositionHelper.calculateVerticalAlignment(hostDim, elmDim, alignment); } else if (placement === PlacementTypes.Left) { left = hostDim.left - elmDim.width - spacing; top = PositionHelper.calculateVerticalAlignment(hostDim, elmDim, alignment); } else if (placement === PlacementTypes.Top) { top = hostDim.top - elmDim.height - spacing; left = PositionHelper.calculateHorizontalAlignment(hostDim, elmDim, alignment); } else if (placement === PlacementTypes.Bottom) { top = hostDim.top + hostDim.height + spacing; left = PositionHelper.calculateHorizontalAlignment(hostDim, elmDim, alignment); } return { top, left }; } /** * Determine placement based on flip * * @memberOf PositionHelper */ static determinePlacement(placement, elmDim, hostDim, spacing) { const shouldFlip = PositionHelper.shouldFlip(hostDim, elmDim, placement, spacing); if (shouldFlip) { if (placement === PlacementTypes.Right) { return PlacementTypes.Left; } else if (placement === PlacementTypes.Left) { return PlacementTypes.Right; } else if (placement === PlacementTypes.Top) { return PlacementTypes.Bottom; } else if (placement === PlacementTypes.Bottom) { return PlacementTypes.Top; } } return placement; } } class TooltipContentComponent { constructor(element, renderer, platformId) { this.element = element; this.renderer = renderer; this.platformId = platformId; } get cssClasses() { let clz = 'ngx-charts-tooltip-content'; clz += ` position-${this.placement}`; clz += ` type-${this.type}`; clz += ` ${this.cssClass}`; return clz; } ngAfterViewInit() { setTimeout(this.position.bind(this)); } position() { if (!isPlatformBrowser(this.platformId)) { return; } const nativeElm = this.element.nativeElement; const hostDim = this.host.nativeElement.getBoundingClientRect(); // if no dims were found, never show if (!hostDim.height && !hostDim.width) return; const elmDim = nativeElm.getBoundingClientRect(); this.checkFlip(hostDim, elmDim); this.positionContent(nativeElm, hostDim, elmDim); if (this.showCaret) { this.positionCaret(hostDim, elmDim); } // animate its entry setTimeout(() => this.renderer.addClass(nativeElm, 'animate'), 1); } positionContent(nativeElm, hostDim, elmDim) { const { top, left } = PositionHelper.positionContent(this.placement, elmDim, hostDim, this.spacing, this.alignment); this.renderer.setStyle(nativeElm, 'top', `${top}px`); this.renderer.setStyle(nativeElm, 'left', `${left}px`); } positionCaret(hostDim, elmDim) { const caretElm = this.caretElm.nativeElement; const caretDimensions = caretElm.getBoundingClientRect(); const { top, left } = PositionHelper.positionCaret(this.placement, elmDim, hostDim, caretDimensions, this.alignment); this.renderer.setStyle(caretElm, 'top', `${top}px`); this.renderer.setStyle(caretElm, 'left', `${left}px`); } checkFlip(hostDim, elmDim) { this.placement = PositionHelper.determinePlacement(this.placement, elmDim, hostDim, this.spacing); } onWindowResize() { this.position(); } } TooltipContentComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: TooltipContentComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component }); TooltipContentComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: TooltipContentComponent, selector: "ngx-tooltip-content", inputs: { host: "host", showCaret: "showCaret", type: "type", placement: "placement", alignment: "alignment", spacing: "spacing", cssClass: "cssClass", title: "title", template: "template", context: "context" }, host: { listeners: { "window:resize": "onWindowResize()" }, properties: { "class": "this.cssClasses" } }, viewQueries: [{ propertyName: "caretElm", first: true, predicate: ["caretElm"], descendants: true }], ngImport: i0, template: `
`, isInline: true, styles: [".ngx-charts-tooltip-content{position:fixed;border-radius:3px;z-index:5000;display:block;font-weight:400;opacity:0;pointer-events:none!important}.ngx-charts-tooltip-content.type-popover{background:#fff;color:#060709;border:1px solid #72809b;box-shadow:0 1px 3px #0003,0 1px 1px #00000024,0 2px 1px -1px #0000001f;font-size:13px;padding:4px}.ngx-charts-tooltip-content.type-popover .tooltip-caret{position:absolute;z-index:5001;width:0;height:0}.ngx-charts-tooltip-content.type-popover .tooltip-caret.position-left{border-top:7px solid transparent;border-bottom:7px solid transparent;border-left:7px solid #fff}.ngx-charts-tooltip-content.type-popover .tooltip-caret.position-top{border-left:7px solid transparent;border-right:7px solid transparent;border-top:7px solid #fff}.ngx-charts-tooltip-content.type-popover .tooltip-caret.position-right{border-top:7px solid transparent;border-bottom:7px solid transparent;border-right:7px solid #fff}.ngx-charts-tooltip-content.type-popover .tooltip-caret.position-bottom{border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #fff}.ngx-charts-tooltip-content.type-tooltip{color:#fff;background:rgba(0,0,0,.75);font-size:12px;padding:0 10px;text-align:center;pointer-events:auto}.ngx-charts-tooltip-content.type-tooltip .tooltip-caret.position-left{border-top:7px solid transparent;border-bottom:7px solid transparent;border-left:7px solid rgba(0,0,0,.75)}.ngx-charts-tooltip-content.type-tooltip .tooltip-caret.position-top{border-left:7px solid transparent;border-right:7px solid transparent;border-top:7px solid rgba(0,0,0,.75)}.ngx-charts-tooltip-content.type-tooltip .tooltip-caret.position-right{border-top:7px solid transparent;border-bottom:7px solid transparent;border-right:7px solid rgba(0,0,0,.75)}.ngx-charts-tooltip-content.type-tooltip .tooltip-caret.position-bottom{border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid rgba(0,0,0,.75)}.ngx-charts-tooltip-content .tooltip-label{display:block;line-height:1em;padding:8px 5px 5px;font-size:1em}.ngx-charts-tooltip-content .tooltip-val{display:block;font-size:1.3em;line-height:1em;padding:0 5px 8px}.ngx-charts-tooltip-content .tooltip-caret{position:absolute;z-index:5001;width:0;height:0}.ngx-charts-tooltip-content.position-right{transform:translate(10px)}.ngx-charts-tooltip-content.position-left{transform:translate(-10px)}.ngx-charts-tooltip-content.position-top{transform:translateY(-10px)}.ngx-charts-tooltip-content.position-bottom{transform:translateY(10px)}.ngx-charts-tooltip-content.animate{opacity:1;transition:opacity .3s,transform .3s;transform:translate(0);pointer-events:auto}.area-tooltip-container{padding:5px 0;pointer-events:none}.tooltip-item{text-align:left;line-height:1.2em;padding:5px 0}.tooltip-item .tooltip-item-color{display:inline-block;height:12px;width:12px;margin-right:5px;color:#5b646b;border-radius:3px}\n"], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], encapsulation: i0.ViewEncapsulation.None }); __decorate([ throttleable(100) ], TooltipContentComponent.prototype, "onWindowResize", null); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: TooltipContentComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-tooltip-content', template: `
`, encapsulation: ViewEncapsulation.None, styles: [".ngx-charts-tooltip-content{position:fixed;border-radius:3px;z-index:5000;display:block;font-weight:400;opacity:0;pointer-events:none!important}.ngx-charts-tooltip-content.type-popover{background:#fff;color:#060709;border:1px solid #72809b;box-shadow:0 1px 3px #0003,0 1px 1px #00000024,0 2px 1px -1px #0000001f;font-size:13px;padding:4px}.ngx-charts-tooltip-content.type-popover .tooltip-caret{position:absolute;z-index:5001;width:0;height:0}.ngx-charts-tooltip-content.type-popover .tooltip-caret.position-left{border-top:7px solid transparent;border-bottom:7px solid transparent;border-left:7px solid #fff}.ngx-charts-tooltip-content.type-popover .tooltip-caret.position-top{border-left:7px solid transparent;border-right:7px solid transparent;border-top:7px solid #fff}.ngx-charts-tooltip-content.type-popover .tooltip-caret.position-right{border-top:7px solid transparent;border-bottom:7px solid transparent;border-right:7px solid #fff}.ngx-charts-tooltip-content.type-popover .tooltip-caret.position-bottom{border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #fff}.ngx-charts-tooltip-content.type-tooltip{color:#fff;background:rgba(0,0,0,.75);font-size:12px;padding:0 10px;text-align:center;pointer-events:auto}.ngx-charts-tooltip-content.type-tooltip .tooltip-caret.position-left{border-top:7px solid transparent;border-bottom:7px solid transparent;border-left:7px solid rgba(0,0,0,.75)}.ngx-charts-tooltip-content.type-tooltip .tooltip-caret.position-top{border-left:7px solid transparent;border-right:7px solid transparent;border-top:7px solid rgba(0,0,0,.75)}.ngx-charts-tooltip-content.type-tooltip .tooltip-caret.position-right{border-top:7px solid transparent;border-bottom:7px solid transparent;border-right:7px solid rgba(0,0,0,.75)}.ngx-charts-tooltip-content.type-tooltip .tooltip-caret.position-bottom{border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid rgba(0,0,0,.75)}.ngx-charts-tooltip-content .tooltip-label{display:block;line-height:1em;padding:8px 5px 5px;font-size:1em}.ngx-charts-tooltip-content .tooltip-val{display:block;font-size:1.3em;line-height:1em;padding:0 5px 8px}.ngx-charts-tooltip-content .tooltip-caret{position:absolute;z-index:5001;width:0;height:0}.ngx-charts-tooltip-content.position-right{transform:translate(10px)}.ngx-charts-tooltip-content.position-left{transform:translate(-10px)}.ngx-charts-tooltip-content.position-top{transform:translateY(-10px)}.ngx-charts-tooltip-content.position-bottom{transform:translateY(10px)}.ngx-charts-tooltip-content.animate{opacity:1;transition:opacity .3s,transform .3s;transform:translate(0);pointer-events:auto}.area-tooltip-container{padding:5px 0;pointer-events:none}.tooltip-item{text-align:left;line-height:1.2em;padding:5px 0}.tooltip-item .tooltip-item-color{display:inline-block;height:12px;width:12px;margin-right:5px;color:#5b646b;border-radius:3px}\n"] }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: undefined, decorators: [{ type: Inject, args: [PLATFORM_ID] }] }]; }, propDecorators: { host: [{ type: Input }], showCaret: [{ type: Input }], type: [{ type: Input }], placement: [{ type: Input }], alignment: [{ type: Input }], spacing: [{ type: Input }], cssClass: [{ type: Input }], title: [{ type: Input }], template: [{ type: Input }], context: [{ type: Input }], caretElm: [{ type: ViewChild, args: ['caretElm'] }], cssClasses: [{ type: HostBinding, args: ['class'] }], onWindowResize: [{ type: HostListener, args: ['window:resize'] }] } }); class InjectionRegisteryService { constructor(injectionService) { this.injectionService = injectionService; this.defaults = {}; this.components = new Map(); } getByType(type = this.type) { return this.components.get(type); } create(bindings) { return this.createByType(this.type, bindings); } createByType(type, bindings) { bindings = this.assignDefaults(bindings); const component = this.injectComponent(type, bindings); this.register(type, component); return component; } destroy(instance) { const compsByType = this.components.get(instance.componentType); if (compsByType && compsByType.length) { const idx = compsByType.indexOf(instance); if (idx > -1) { const component = compsByType[idx]; component.destroy(); compsByType.splice(idx, 1); } } } destroyAll() { this.destroyByType(this.type); } destroyByType(type) { const comps = this.components.get(type); if (comps && comps.length) { let i = comps.length - 1; while (i >= 0) { this.destroy(comps[i--]); } } } injectComponent(type, bindings) { return this.injectionService.appendComponent(type, bindings); } assignDefaults(bindings) { const inputs = { ...this.defaults.inputs }; const outputs = { ...this.defaults.outputs }; if (!bindings.inputs && !bindings.outputs) { bindings = { inputs: bindings }; } if (inputs) { bindings.inputs = { ...inputs, ...bindings.inputs }; } if (outputs) { bindings.outputs = { ...outputs, ...bindings.outputs }; } return bindings; } register(type, component) { if (!this.components.has(type)) { this.components.set(type, []); } const types = this.components.get(type); types.push(component); } } function isViewContainerRef(x) { return x.element; } /** * Injection service is a helper to append components * dynamically to a known location in the DOM, most * noteably for dialogs/tooltips appending to body. * * @export */ class InjectionService { constructor(applicationRef, componentFactoryResolver, injector) { this.applicationRef = applicationRef; this.componentFactoryResolver = componentFactoryResolver; this.injector = injector; } /** * Sets a default global root view container. This is useful for * things like ngUpgrade that doesn't have a ApplicationRef root. * * @param container */ static setGlobalRootViewContainer(container) { InjectionService.globalRootViewContainer = container; } /** * Gets the root view container to inject the component to. * * @memberOf InjectionService */ getRootViewContainer() { if (this._container) return this._container; if (InjectionService.globalRootViewContainer) return InjectionService.globalRootViewContainer; if (this.applicationRef.components.length) return this.applicationRef.components[0]; throw new Error('View Container not found! ngUpgrade needs to manually set this via setRootViewContainer or setGlobalRootViewContainer.'); } /** * Overrides the default root view container. This is useful for * things like ngUpgrade that doesn't have a ApplicationRef root. * * @param container * * @memberOf InjectionService */ setRootViewContainer(container) { this._container = container; } /** * Gets the html element for a component ref. * * @param componentRef * * @memberOf InjectionService */ getComponentRootNode(component) { if (isViewContainerRef(component)) { return component.element.nativeElement; } if (component.hostView && component.hostView.rootNodes.length > 0) { return component.hostView.rootNodes[0]; } // the top most component root node has no `hostView` return component.location.nativeElement; } /** * Gets the root component container html element. * * @memberOf InjectionService */ getRootViewContainerNode(component) { return this.getComponentRootNode(component); } /** * Projects the bindings onto the component * * @param component * @param options * * @memberOf InjectionService */ projectComponentBindings(component, bindings) { if (bindings) { if (bindings.inputs !== undefined) { const bindingKeys = Object.getOwnPropertyNames(bindings.inputs); for (const bindingName of bindingKeys) { component.instance[bindingName] = bindings.inputs[bindingName]; } } if (bindings.outputs !== undefined) { const eventKeys = Object.getOwnPropertyNames(bindings.outputs); for (const eventName of eventKeys) { component.instance[eventName] = bindings.outputs[eventName]; } } } return component; } /** * Appends a component to a adjacent location * * @param componentClass * @param [options={}] * @param [location] * * @memberOf InjectionService */ appendComponent(componentClass, bindings = {}, location) { if (!location) location = this.getRootViewContainer(); const appendLocation = this.getComponentRootNode(location); const portalHost = new DomPortalOutlet(appendLocation, this.componentFactoryResolver, this.applicationRef, this.injector); const portal = new ComponentPortal(componentClass); const componentRef = portalHost.attach(portal); this.projectComponentBindings(componentRef, bindings); return componentRef; } } InjectionService.globalRootViewContainer = null; InjectionService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: InjectionService, deps: [{ token: i0.ApplicationRef }, { token: i0.ComponentFactoryResolver }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); InjectionService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: InjectionService }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: InjectionService, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: i0.ApplicationRef }, { type: i0.ComponentFactoryResolver }, { type: i0.Injector }]; } }); class TooltipService extends InjectionRegisteryService { constructor(injectionService) { super(injectionService); this.type = TooltipContentComponent; } } TooltipService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: TooltipService, deps: [{ token: InjectionService }], target: i0.ɵɵFactoryTarget.Injectable }); TooltipService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: TooltipService }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: TooltipService, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: InjectionService }]; } }); var LegendPosition; (function (LegendPosition) { LegendPosition["Right"] = "right"; LegendPosition["Below"] = "below"; })(LegendPosition || (LegendPosition = {})); var LegendType; (function (LegendType) { LegendType["ScaleLegend"] = "scaleLegend"; LegendType["Legend"] = "legend"; })(LegendType || (LegendType = {})); var ScaleType; (function (ScaleType) { ScaleType["Time"] = "time"; ScaleType["Linear"] = "linear"; ScaleType["Ordinal"] = "ordinal"; ScaleType["Quantile"] = "quantile"; })(ScaleType || (ScaleType = {})); class ScaleLegendComponent { constructor() { this.horizontal = false; } ngOnChanges(changes) { const gradientValues = this.gradientString(this.colors.range(), this.colors.domain()); const direction = this.horizontal ? 'right' : 'bottom'; this.gradient = `linear-gradient(to ${direction}, ${gradientValues})`; } /** * Generates the string used in the gradient stylesheet properties * @param colors array of colors * @param splits array of splits on a scale of (0, 1) */ gradientString(colors, splits) { // add the 100% splits.push(1); const pairs = []; colors.reverse().forEach((c, i) => { pairs.push(`${c} ${Math.round(splits[i] * 100)}%`); }); return pairs.join(', '); } } ScaleLegendComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: ScaleLegendComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); ScaleLegendComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: ScaleLegendComponent, selector: "ngx-charts-scale-legend", inputs: { valueRange: "valueRange", colors: "colors", height: "height", width: "width", horizontal: "horizontal" }, usesOnChanges: true, ngImport: i0, template: `
{{ valueRange[1].toLocaleString() }}
{{ valueRange[0].toLocaleString() }}
`, isInline: true, styles: [".chart-legend{display:inline-block;padding:0;width:auto!important}.chart-legend .scale-legend{text-align:center;display:flex;flex-direction:column}.chart-legend .scale-legend-wrap{display:inline-block;flex:1;width:30px;border-radius:5px;margin:0 auto}.chart-legend .scale-legend-label{font-size:12px}.chart-legend .horizontal-legend.scale-legend{flex-direction:row}.chart-legend .horizontal-legend .scale-legend-wrap{width:auto;height:30px;margin:0 16px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: ScaleLegendComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-charts-scale-legend', template: `
{{ valueRange[1].toLocaleString() }}
{{ valueRange[0].toLocaleString() }}
`, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".chart-legend{display:inline-block;padding:0;width:auto!important}.chart-legend .scale-legend{text-align:center;display:flex;flex-direction:column}.chart-legend .scale-legend-wrap{display:inline-block;flex:1;width:30px;border-radius:5px;margin:0 auto}.chart-legend .scale-legend-label{font-size:12px}.chart-legend .horizontal-legend.scale-legend{flex-direction:row}.chart-legend .horizontal-legend .scale-legend-wrap{width:auto;height:30px;margin:0 16px}\n"] }] }], propDecorators: { valueRange: [{ type: Input }], colors: [{ type: Input }], height: [{ type: Input }], width: [{ type: Input }], horizontal: [{ type: Input }] } }); /** * Formats a label given a date, number or string. * * @export */ function formatLabel(label) { if (label instanceof Date) { label = label.toLocaleDateString(); } else { label = label.toLocaleString(); } return label; } /** * Escapes a label. * * @export */ function escapeLabel(label) { return label.toLocaleString().replace(/[&'`"<>]/g, match => { return { '&': '&', // tslint:disable-next-line: quotemark "'": ''', '`': '`', '"': '"', '<': '<', '>': '>' }[match]; }); } class LegendEntryComponent { constructor() { this.isActive = false; this.select = new EventEmitter(); this.activate = new EventEmitter(); this.deactivate = new EventEmitter(); this.toggle = new EventEmitter(); } get trimmedLabel() { return this.formattedLabel || '(empty)'; } onMouseEnter() { this.activate.emit({ name: this.label }); } onMouseLeave() { this.deactivate.emit({ name: this.label }); } } LegendEntryComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: LegendEntryComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); LegendEntryComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: LegendEntryComponent, selector: "ngx-charts-legend-entry", inputs: { color: "color", label: "label", formattedLabel: "formattedLabel", isActive: "isActive" }, outputs: { select: "select", activate: "activate", deactivate: "deactivate", toggle: "toggle" }, host: { listeners: { "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()" } }, ngImport: i0, template: ` {{ trimmedLabel }} `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: LegendEntryComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-charts-legend-entry', template: ` {{ trimmedLabel }} `, changeDetection: ChangeDetectionStrategy.OnPush }] }], propDecorators: { color: [{ type: Input }], label: [{ type: Input }], formattedLabel: [{ type: Input }], isActive: [{ type: Input }], select: [{ type: Output }], activate: [{ type: Output }], deactivate: [{ type: Output }], toggle: [{ type: Output }], onMouseEnter: [{ type: HostListener, args: ['mouseenter'] }], onMouseLeave: [{ type: HostListener, args: ['mouseleave'] }] } }); class LegendComponent { constructor(cd) { this.cd = cd; this.horizontal = false; this.labelClick = new EventEmitter(); this.labelActivate = new EventEmitter(); this.labelDeactivate = new EventEmitter(); this.legendEntries = []; } ngOnChanges(changes) { this.update(); } update() { this.cd.markForCheck(); this.legendEntries = this.getLegendEntries(); } getLegendEntries() { const items = []; for (const label of this.data) { const formattedLabel = formatLabel(label); const idx = items.findIndex(i => { return i.label === formattedLabel; }); if (idx === -1) { items.push({ label, formattedLabel, color: this.colors.getColor(label) }); } } return items; } isActive(entry) { if (!this.activeEntries) return false; const item = this.activeEntries.find(d => { return entry.label === d.name; }); return item !== undefined; } activate(item) { this.labelActivate.emit(item); } deactivate(item) { this.labelDeactivate.emit(item); } trackBy(index, item) { return item.label; } } LegendComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: LegendComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); LegendComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: LegendComponent, selector: "ngx-charts-legend", inputs: { data: "data", title: "title", colors: "colors", height: "height", width: "width", activeEntries: "activeEntries", horizontal: "horizontal" }, outputs: { labelClick: "labelClick", labelActivate: "labelActivate", labelDeactivate: "labelDeactivate" }, usesOnChanges: true, ngImport: i0, template: `
{{ title }}
`, isInline: true, styles: [".chart-legend{display:inline-block;padding:0;width:auto!important}.chart-legend .legend-title{white-space:nowrap;overflow:hidden;margin-left:10px;margin-bottom:5px;font-size:14px;font-weight:700}.chart-legend ul,.chart-legend li{padding:0;margin:0;list-style:none}.chart-legend .horizontal-legend li{display:inline-block}.chart-legend .legend-wrap{width:calc(100% - 10px)}.chart-legend .legend-labels{line-height:85%;list-style:none;text-align:left;float:left;width:100%;border-radius:3px;overflow-y:auto;overflow-x:hidden;white-space:nowrap;background:rgba(0,0,0,.05)}.chart-legend .legend-label{cursor:pointer;font-size:90%;margin:8px;color:#afb7c8}.chart-legend .legend-label:hover{color:#000;transition:.2s}.chart-legend .legend-label .active .legend-label-text{color:#000}.chart-legend .legend-label-color{display:inline-block;height:15px;width:15px;margin-right:5px;color:#5b646b;border-radius:3px}.chart-legend .legend-label-text{display:inline-block;vertical-align:top;line-height:15px;font-size:12px;width:calc(100% - 20px);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.chart-legend .legend-title-text{vertical-align:bottom;display:inline-block;line-height:16px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}\n"], components: [{ type: LegendEntryComponent, selector: "ngx-charts-legend-entry", inputs: ["color", "label", "formattedLabel", "isActive"], outputs: ["select", "activate", "deactivate", "toggle"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: LegendComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-charts-legend', template: `
{{ title }}
`, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".chart-legend{display:inline-block;padding:0;width:auto!important}.chart-legend .legend-title{white-space:nowrap;overflow:hidden;margin-left:10px;margin-bottom:5px;font-size:14px;font-weight:700}.chart-legend ul,.chart-legend li{padding:0;margin:0;list-style:none}.chart-legend .horizontal-legend li{display:inline-block}.chart-legend .legend-wrap{width:calc(100% - 10px)}.chart-legend .legend-labels{line-height:85%;list-style:none;text-align:left;float:left;width:100%;border-radius:3px;overflow-y:auto;overflow-x:hidden;white-space:nowrap;background:rgba(0,0,0,.05)}.chart-legend .legend-label{cursor:pointer;font-size:90%;margin:8px;color:#afb7c8}.chart-legend .legend-label:hover{color:#000;transition:.2s}.chart-legend .legend-label .active .legend-label-text{color:#000}.chart-legend .legend-label-color{display:inline-block;height:15px;width:15px;margin-right:5px;color:#5b646b;border-radius:3px}.chart-legend .legend-label-text{display:inline-block;vertical-align:top;line-height:15px;font-size:12px;width:calc(100% - 20px);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.chart-legend .legend-title-text{vertical-align:bottom;display:inline-block;line-height:16px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}\n"] }] }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { data: [{ type: Input }], title: [{ type: Input }], colors: [{ type: Input }], height: [{ type: Input }], width: [{ type: Input }], activeEntries: [{ type: Input }], horizontal: [{ type: Input }], labelClick: [{ type: Output }], labelActivate: [{ type: Output }], labelDeactivate: [{ type: Output }] } }); class ChartComponent { constructor() { this.showLegend = false; this.animations = true; this.legendLabelClick = new EventEmitter(); this.legendLabelActivate = new EventEmitter(); this.legendLabelDeactivate = new EventEmitter(); this.LegendPosition = LegendPosition; this.LegendType = LegendType; } ngOnChanges(changes) { this.update(); } update() { let legendColumns = 0; if (this.showLegend) { this.legendType = this.getLegendType(); if (!this.legendOptions || this.legendOptions.position === LegendPosition.Right) { if (this.legendType === LegendType.ScaleLegend) { legendColumns = 1; } else { legendColumns = 2; } } } const chartColumns = 12 - legendColumns; this.chartWidth = Math.floor((this.view[0] * chartColumns) / 12.0); this.legendWidth = !this.legendOptions || this.legendOptions.position === LegendPosition.Right ? Math.floor((this.view[0] * legendColumns) / 12.0) : this.chartWidth; } getLegendType() { return this.legendOptions.scaleType === ScaleType.Linear ? LegendType.ScaleLegend : LegendType.Legend; } } ChartComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: ChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); ChartComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: ChartComponent, selector: "ngx-charts-chart", inputs: { view: "view", showLegend: "showLegend", legendOptions: "legendOptions", legendType: "legendType", activeEntries: "activeEntries", animations: "animations" }, outputs: { legendLabelClick: "legendLabelClick", legendLabelActivate: "legendLabelActivate", legendLabelDeactivate: "legendLabelDeactivate" }, providers: [TooltipService], usesOnChanges: true, ngImport: i0, template: `
`, isInline: true, components: [{ type: ScaleLegendComponent, selector: "ngx-charts-scale-legend", inputs: ["valueRange", "colors", "height", "width", "horizontal"] }, { type: LegendComponent, selector: "ngx-charts-legend", inputs: ["data", "title", "colors", "height", "width", "activeEntries", "horizontal"], outputs: ["labelClick", "labelActivate", "labelDeactivate"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: ChartComponent, decorators: [{ type: Component, args: [{ providers: [TooltipService], selector: 'ngx-charts-chart', template: `
`, changeDetection: ChangeDetectionStrategy.OnPush }] }], propDecorators: { view: [{ type: Input }], showLegend: [{ type: Input }], legendOptions: [{ type: Input }], legendType: [{ type: Input }], activeEntries: [{ type: Input }], animations: [{ type: Input }], legendLabelClick: [{ type: Output }], legendLabelActivate: [{ type: Output }], legendLabelDeactivate: [{ type: Output }] } }); /** * Visibility Observer */ class VisibilityObserver { constructor(element, zone) { this.element = element; this.zone = zone; this.visible = new EventEmitter(); this.isVisible = false; this.runCheck(); } destroy() { clearTimeout(this.timeout); } onVisibilityChange() { // trigger zone recalc for columns this.zone.run(() => { this.isVisible = true; this.visible.emit(true); }); } runCheck() { const check = () => { if (!this.element) { return; } // https://davidwalsh.name/offsetheight-visibility const { offsetHeight, offsetWidth } = this.element.nativeElement; if (offsetHeight && offsetWidth) { clearTimeout(this.timeout); this.onVisibilityChange(); } else { clearTimeout(this.timeout); this.zone.runOutsideAngular(() => { this.timeout = setTimeout(() => check(), 100); }); } }; this.zone.runOutsideAngular(() => { this.timeout = setTimeout(() => check()); }); } } VisibilityObserver.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: VisibilityObserver, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive }); VisibilityObserver.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.1.0", type: VisibilityObserver, selector: "visibility-observer", outputs: { visible: "visible" }, ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: VisibilityObserver, decorators: [{ type: Directive, args: [{ selector: 'visibility-observer' }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }]; }, propDecorators: { visible: [{ type: Output }] } }); function isDate(value) { return toString.call(value) === '[object Date]'; } function isNumber(value) { return typeof value === 'number'; } class BaseChartComponent { constructor(chartElement, zone, cd, platformId) { this.chartElement = chartElement; this.zone = zone; this.cd = cd; this.platformId = platformId; this.scheme = 'cool'; this.schemeType = ScaleType.Ordinal; this.animations = true; this.select = new EventEmitter(); } ngOnInit() { if (isPlatformServer(this.platformId)) { this.animations = false; } } ngAfterViewInit() { this.bindWindowResizeEvent(); // listen for visibility of the element for hidden by default scenario this.visibilityObserver = new VisibilityObserver(this.chartElement, this.zone); this.visibilityObserver.visible.subscribe(this.update.bind(this)); } ngOnDestroy() { this.unbindEvents(); if (this.visibilityObserver) { this.visibilityObserver.visible.unsubscribe(); this.visibilityObserver.destroy(); } } ngOnChanges(changes) { this.update(); } update() { if (this.results) { this.results = this.cloneData(this.results); } else { this.results = []; } if (this.view) { this.width = this.view[0]; this.height = this.view[1]; } else { const dims = this.getContainerDims(); if (dims) { this.width = dims.width; this.height = dims.height; } } // default values if width or height are 0 or undefined if (!this.width) { this.width = 600; } if (!this.height) { this.height = 400; } this.width = Math.floor(this.width); this.height = Math.floor(this.height); if (this.cd) { this.cd.markForCheck(); } } getContainerDims() { let width; let height; const hostElem = this.chartElement.nativeElement; if (isPlatformBrowser(this.platformId) && hostElem.parentNode !== null) { // Get the container dimensions const dims = hostElem.parentNode.getBoundingClientRect(); width = dims.width; height = dims.height; } if (width && height) { return { width, height }; } return null; } /** * Converts all date objects that appear as name * into formatted date strings */ formatDates() { for (let i = 0; i < this.results.length; i++) { const g = this.results[i]; g.label = g.name; if (isDate(g.label)) { g.label = g.label.toLocaleDateString(); } if (g.series) { for (let j = 0; j < g.series.length; j++) { const d = g.series[j]; d.label = d.name; if (isDate(d.label)) { d.label = d.label.toLocaleDateString(); } } } } } unbindEvents() { if (this.resizeSubscription) { this.resizeSubscription.unsubscribe(); } } bindWindowResizeEvent() { if (!isPlatformBrowser(this.platformId)) { return; } const source = fromEvent(window, 'resize'); const subscription = source.pipe(debounceTime(200)).subscribe(e => { this.update(); if (this.cd) { this.cd.markForCheck(); } }); this.resizeSubscription = subscription; } /** * Clones the data into a new object * * @memberOf BaseChart */ cloneData(data) { const results = []; for (const item of data) { const copy = {}; if (item['name'] !== undefined) { copy['name'] = item['name']; } if (item['value'] !== undefined) { copy['value'] = item['value']; } if (item['series'] !== undefined) { copy['series'] = []; for (const seriesItem of item['series']) { const seriesItemCopy = Object.assign({}, seriesItem); copy['series'].push(seriesItemCopy); } } if (item['extra'] !== undefined) { copy['extra'] = JSON.parse(JSON.stringify(item['extra'])); } if (item['source'] !== undefined) { copy['source'] = item['source']; } if (item['target'] !== undefined) { copy['target'] = item['target']; } results.push(copy); } return results; } } BaseChartComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BaseChartComponent, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component }); BaseChartComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: BaseChartComponent, selector: "base-chart", inputs: { results: "results", view: "view", scheme: "scheme", schemeType: "schemeType", customColors: "customColors", animations: "animations" }, outputs: { select: "select" }, usesOnChanges: true, ngImport: i0, template: `
`, isInline: true }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BaseChartComponent, decorators: [{ type: Component, args: [{ selector: 'base-chart', template: `
` }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{ type: Inject, args: [PLATFORM_ID] }] }]; }, propDecorators: { results: [{ type: Input }], view: [{ type: Input }], scheme: [{ type: Input }], schemeType: [{ type: Input }], customColors: [{ type: Input }], animations: [{ type: Input }], select: [{ type: Output }] } }); var Orientation; (function (Orientation) { Orientation["Top"] = "top"; Orientation["Bottom"] = "bottom"; Orientation["Left"] = "left"; Orientation["Right"] = "right"; })(Orientation || (Orientation = {})); class AxisLabelComponent { constructor(element) { this.textHeight = 25; this.margin = 5; this.element = element.nativeElement; } ngOnChanges(changes) { this.update(); } update() { this.strokeWidth = '0.01'; this.textAnchor = 'middle'; this.transform = ''; switch (this.orient) { case Orientation.Top: this.y = this.offset; this.x = this.width / 2; break; case Orientation.Bottom: this.y = this.offset; this.x = this.width / 2; break; case Orientation.Left: this.y = -(this.offset + this.textHeight + this.margin); this.x = -this.height / 2; this.transform = 'rotate(270)'; break; case Orientation.Right: this.y = this.offset + this.margin; this.x = -this.height / 2; this.transform = 'rotate(270)'; break; default: } } } AxisLabelComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: AxisLabelComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); AxisLabelComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: AxisLabelComponent, selector: "g[ngx-charts-axis-label]", inputs: { orient: "orient", label: "label", offset: "offset", width: "width", height: "height" }, usesOnChanges: true, ngImport: i0, template: ` {{ label }} `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: AxisLabelComponent, decorators: [{ type: Component, args: [{ selector: 'g[ngx-charts-axis-label]', template: ` {{ label }} `, changeDetection: ChangeDetectionStrategy.OnPush }] }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { orient: [{ type: Input }], label: [{ type: Input }], offset: [{ type: Input }], width: [{ type: Input }], height: [{ type: Input }] } }); function trimLabel(s, max = 16) { if (typeof s !== 'string') { if (typeof s === 'number') { return s + ''; } else { return ''; } } s = s.trim(); if (s.length <= max) { return s; } else { return `${s.slice(0, max)}...`; } } function reduceTicks(ticks, maxTicks) { if (ticks.length > maxTicks) { const reduced = []; const modulus = Math.floor(ticks.length / maxTicks); for (let i = 0; i < ticks.length; i++) { if (i % modulus === 0) { reduced.push(ticks[i]); } } ticks = reduced; } return ticks; } function getTickLines(label, maxLength, maxLines) { const labelString = (label || '').toString(); let totalLines = []; if (/\s/.test(labelString)) { totalLines = labelString.split(/\s+/).reduce((lines, line) => { const last = (lines.pop() || '') + ' '; return last.length + line.length > maxLength ? [...lines, last.trim(), line.trim()] : [...lines, last + line]; }, []); } else { let startIndex = 0; while (startIndex < labelString.length) { totalLines.push(labelString.substring(startIndex, startIndex + maxLength)); startIndex += maxLength; } } if (totalLines.length > maxLines) { totalLines = totalLines.splice(0, maxLines); totalLines[totalLines.length - 1] += '...'; } return totalLines; } var TextAnchor; (function (TextAnchor) { TextAnchor["Start"] = "start"; TextAnchor["Middle"] = "middle"; TextAnchor["End"] = "end"; })(TextAnchor || (TextAnchor = {})); class XAxisTicksComponent { constructor(platformId) { this.platformId = platformId; this.tickArguments = [5]; this.tickStroke = '#ccc'; this.trimTicks = true; this.maxTickLength = 16; this.showGridLines = false; this.rotateTicks = true; this.wrapTicks = false; this.dimensionsChanged = new EventEmitter(); this.verticalSpacing = 20; this.rotateLabels = false; this.innerTickSize = 6; this.outerTickSize = 6; this.tickPadding = 3; this.textAnchor = TextAnchor.Middle; this.maxTicksLength = 0; this.maxAllowedLength = 16; this.height = 0; this.approxHeight = 10; this.maxPossibleLengthForTickIfWrapped = 16; } get isWrapTicksSupported() { return this.wrapTicks && this.scale.step; } ngOnChanges(changes) { this.update(); } ngAfterViewInit() { setTimeout(() => this.updateDims()); } updateDims() { if (!isPlatformBrowser(this.platformId)) { // for SSR, use approximate value instead of measured this.dimensionsChanged.emit({ height: this.approxHeight }); return; } const height = parseInt(this.ticksElement.nativeElement.getBoundingClientRect().height, 10); if (height !== this.height) { this.height = height; this.dimensionsChanged.emit({ height: this.height }); setTimeout(() => this.updateDims()); } } update() { const scale = this.scale; this.ticks = this.getTicks(); if (this.tickFormatting) { this.tickFormat = this.tickFormatting; } else if (scale.tickFormat) { // eslint-disable-next-line prefer-spread this.tickFormat = scale.tickFormat.apply(scale, this.tickArguments); } else { this.tickFormat = function (d) { if (d.constructor.name === 'Date') { return d.toLocaleDateString(); } return d.toLocaleString(); }; } const angle = this.rotateTicks ? this.getRotationAngle(this.ticks) : null; this.adjustedScale = this.scale.bandwidth ? function (d) { return this.scale(d) + this.scale.bandwidth() * 0.5; } : this.scale; this.textTransform = ''; if (angle && angle !== 0) { this.textTransform = `rotate(${angle})`; this.textAnchor = TextAnchor.End; this.verticalSpacing = 10; } else { this.textAnchor = TextAnchor.Middle; } setTimeout(() => this.updateDims()); } getRotationAngle(ticks) { let angle = 0; this.maxTicksLength = 0; for (let i = 0; i < ticks.length; i++) { const tick = this.tickFormat(ticks[i]).toString(); let tickLength = tick.length; if (this.trimTicks) { tickLength = this.tickTrim(tick).length; } if (tickLength > this.maxTicksLength) { this.maxTicksLength = tickLength; } } const len = Math.min(this.maxTicksLength, this.maxAllowedLength); const charWidth = 7; // need to measure this const wordWidth = len * charWidth; let baseWidth = wordWidth; const maxBaseWidth = Math.floor(this.width / ticks.length); // calculate optimal angle while (baseWidth > maxBaseWidth && angle > -90) { angle -= 30; baseWidth = Math.cos(angle * (Math.PI / 180)) * wordWidth; } let labelHeight = 14; if (this.isWrapTicksSupported) { const longestTick = this.ticks.reduce((earlier, current) => (current.length > earlier.length ? current : earlier), ''); const tickLines = this.tickChunks(longestTick); labelHeight = 14 * (tickLines.length || 1); this.maxPossibleLengthForTickIfWrapped = this.getMaxPossibleLengthForTick(longestTick); } const requiredHeight = angle !== 0 ? Math.max(Math.abs(Math.sin((angle * Math.PI) / 180)) * this.maxTickLength * charWidth, 10) : labelHeight; this.approxHeight = Math.min(requiredHeight, 200); return angle; } getTicks() { let ticks; const maxTicks = this.getMaxTicks(20); const maxScaleTicks = this.getMaxTicks(100); if (this.tickValues) { ticks = this.tickValues; } else if (this.scale.ticks) { ticks = this.scale.ticks.apply(this.scale, [maxScaleTicks]); } else { ticks = this.scale.domain(); ticks = reduceTicks(ticks, maxTicks); } return ticks; } getMaxTicks(tickWidth) { return Math.floor(this.width / tickWidth); } tickTransform(tick) { return 'translate(' + this.adjustedScale(tick) + ',' + this.verticalSpacing + ')'; } gridLineTransform() { return `translate(0,${-this.verticalSpacing - 5})`; } tickTrim(label) { return this.trimTicks ? trimLabel(label, this.maxTickLength) : label; } getMaxPossibleLengthForTick(longestLabel) { if (this.scale.bandwidth) { const averageCharacterWidth = 7; // approximate char width const maxCharacters = Math.floor(this.scale.bandwidth() / averageCharacterWidth); const truncatedText = longestLabel.slice(0, maxCharacters); return Math.max(truncatedText.length, this.maxTickLength); } return this.maxTickLength; } tickChunks(label) { if (label.toString().length > this.maxTickLength && this.scale.bandwidth) { const maxAllowedLines = 5; let maxLines = this.rotateTicks ? Math.floor(this.scale.step() / 14) : maxAllowedLines; if (maxLines <= 1) { return [this.tickTrim(label)]; } let possibleStringLength = Math.max(this.maxPossibleLengthForTickIfWrapped, this.maxTickLength); if (!isPlatformBrowser(this.platformId)) { possibleStringLength = Math.floor(Math.min(this.approxHeight / maxAllowedLines, Math.max(this.maxPossibleLengthForTickIfWrapped, this.maxTickLength))); } maxLines = Math.min(maxLines, maxAllowedLines); const lines = getTickLines(label, possibleStringLength, maxLines < 1 ? 1 : maxLines); return lines; } return [this.tickTrim(label)]; } } XAxisTicksComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: XAxisTicksComponent, deps: [{ token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component }); XAxisTicksComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: XAxisTicksComponent, selector: "g[ngx-charts-x-axis-ticks]", inputs: { scale: "scale", orient: "orient", tickArguments: "tickArguments", tickValues: "tickValues", tickStroke: "tickStroke", trimTicks: "trimTicks", maxTickLength: "maxTickLength", tickFormatting: "tickFormatting", showGridLines: "showGridLines", gridLineHeight: "gridLineHeight", width: "width", rotateTicks: "rotateTicks", wrapTicks: "wrapTicks" }, outputs: { dimensionsChanged: "dimensionsChanged" }, viewQueries: [{ propertyName: "ticksElement", first: true, predicate: ["ticksel"], descendants: true }], usesOnChanges: true, ngImport: i0, template: ` {{ tickFormatted }} {{ tickLine }} {{ tickTrim(tickFormatted) }} `, isInline: true, directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: XAxisTicksComponent, decorators: [{ type: Component, args: [{ selector: 'g[ngx-charts-x-axis-ticks]', template: ` {{ tickFormatted }} {{ tickLine }} {{ tickTrim(tickFormatted) }} `, changeDetection: ChangeDetectionStrategy.OnPush }] }], ctorParameters: function () { return [{ type: undefined, decorators: [{ type: Inject, args: [PLATFORM_ID] }] }]; }, propDecorators: { scale: [{ type: Input }], orient: [{ type: Input }], tickArguments: [{ type: Input }], tickValues: [{ type: Input }], tickStroke: [{ type: Input }], trimTicks: [{ type: Input }], maxTickLength: [{ type: Input }], tickFormatting: [{ type: Input }], showGridLines: [{ type: Input }], gridLineHeight: [{ type: Input }], width: [{ type: Input }], rotateTicks: [{ type: Input }], wrapTicks: [{ type: Input }], dimensionsChanged: [{ type: Output }], ticksElement: [{ type: ViewChild, args: ['ticksel'] }] } }); class XAxisComponent { constructor() { this.rotateTicks = true; this.showGridLines = false; this.xOrient = Orientation.Bottom; this.xAxisOffset = 0; this.wrapTicks = false; this.dimensionsChanged = new EventEmitter(); this.xAxisClassName = 'x axis'; this.labelOffset = 0; this.fill = 'none'; this.stroke = 'stroke'; this.tickStroke = '#ccc'; this.strokeWidth = 'none'; this.padding = 5; this.orientation = Orientation; } ngOnChanges(changes) { this.update(); } update() { this.transform = `translate(0,${this.xAxisOffset + this.padding + this.dims.height})`; if (typeof this.xAxisTickCount !== 'undefined') { this.tickArguments = [this.xAxisTickCount]; } } emitTicksHeight({ height }) { const newLabelOffset = height + 25 + 5; if (newLabelOffset !== this.labelOffset) { this.labelOffset = newLabelOffset; setTimeout(() => { this.dimensionsChanged.emit({ height }); }, 0); } } } XAxisComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: XAxisComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); XAxisComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: XAxisComponent, selector: "g[ngx-charts-x-axis]", inputs: { xScale: "xScale", dims: "dims", trimTicks: "trimTicks", rotateTicks: "rotateTicks", maxTickLength: "maxTickLength", tickFormatting: "tickFormatting", showGridLines: "showGridLines", showLabel: "showLabel", labelText: "labelText", ticks: "ticks", xAxisTickCount: "xAxisTickCount", xOrient: "xOrient", xAxisOffset: "xAxisOffset", wrapTicks: "wrapTicks" }, outputs: { dimensionsChanged: "dimensionsChanged" }, viewQueries: [{ propertyName: "ticksComponent", first: true, predicate: XAxisTicksComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: ` `, isInline: true, components: [{ type: XAxisTicksComponent, selector: "g[ngx-charts-x-axis-ticks]", inputs: ["scale", "orient", "tickArguments", "tickValues", "tickStroke", "trimTicks", "maxTickLength", "tickFormatting", "showGridLines", "gridLineHeight", "width", "rotateTicks", "wrapTicks"], outputs: ["dimensionsChanged"] }, { type: AxisLabelComponent, selector: "g[ngx-charts-axis-label]", inputs: ["orient", "label", "offset", "width", "height"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: XAxisComponent, decorators: [{ type: Component, args: [{ selector: 'g[ngx-charts-x-axis]', template: ` `, changeDetection: ChangeDetectionStrategy.OnPush }] }], propDecorators: { xScale: [{ type: Input }], dims: [{ type: Input }], trimTicks: [{ type: Input }], rotateTicks: [{ type: Input }], maxTickLength: [{ type: Input }], tickFormatting: [{ type: Input }], showGridLines: [{ type: Input }], showLabel: [{ type: Input }], labelText: [{ type: Input }], ticks: [{ type: Input }], xAxisTickCount: [{ type: Input }], xOrient: [{ type: Input }], xAxisOffset: [{ type: Input }], wrapTicks: [{ type: Input }], dimensionsChanged: [{ type: Output }], ticksComponent: [{ type: ViewChild, args: [XAxisTicksComponent] }] } }); /** * Generates a rounded rectanglar path * * @export * @param x, y, w, h, r, tl, tr, bl, br */ function roundedRect(x, y, w, h, r, [tl, tr, bl, br]) { let retval = ''; w = Math.floor(w); h = Math.floor(h); w = w === 0 ? 1 : w; h = h === 0 ? 1 : h; retval = `M${[x + r, y]}`; retval += `h${w - 2 * r}`; if (tr) { retval += `a${[r, r]} 0 0 1 ${[r, r]}`; } else { retval += `h${r}v${r}`; } retval += `v${h - 2 * r}`; if (br) { retval += `a${[r, r]} 0 0 1 ${[-r, r]}`; } else { retval += `v${r}h${-r}`; } retval += `h${2 * r - w}`; if (bl) { retval += `a${[r, r]} 0 0 1 ${[-r, -r]}`; } else { retval += `h${-r}v${-r}`; } retval += `v${2 * r - h}`; if (tl) { retval += `a${[r, r]} 0 0 1 ${[r, -r]}`; } else { retval += `v${-r}h${r}`; } retval += `z`; return retval; } class YAxisTicksComponent { constructor(platformId) { this.platformId = platformId; this.tickArguments = [5]; this.tickStroke = '#ccc'; this.trimTicks = true; this.maxTickLength = 16; this.showGridLines = false; this.showRefLabels = false; this.showRefLines = false; this.wrapTicks = false; this.dimensionsChanged = new EventEmitter(); this.innerTickSize = 6; this.tickPadding = 3; this.verticalSpacing = 20; this.textAnchor = TextAnchor.Middle; this.width = 0; this.outerTickSize = 6; this.rotateLabels = false; this.referenceLineLength = 0; this.Orientation = Orientation; } ngOnChanges(changes) { this.update(); } ngAfterViewInit() { setTimeout(() => this.updateDims()); } updateDims() { if (!isPlatformBrowser(this.platformId)) { // for SSR, use approximate value instead of measured this.width = this.getApproximateAxisWidth(); this.dimensionsChanged.emit({ width: this.width }); return; } const width = parseInt(this.ticksElement.nativeElement.getBoundingClientRect().width, 10); if (width !== this.width) { this.width = width; this.dimensionsChanged.emit({ width }); setTimeout(() => this.updateDims()); } } update() { const scale = this.scale; const sign = this.orient === Orientation.Top || this.orient === Orientation.Right ? -1 : 1; this.tickSpacing = Math.max(this.innerTickSize, 0) + this.tickPadding; this.ticks = this.getTicks(); if (this.tickFormatting) { this.tickFormat = this.tickFormatting; } else if (scale.tickFormat) { // eslint-disable-next-line prefer-spread this.tickFormat = scale.tickFormat.apply(scale, this.tickArguments); } else { this.tickFormat = function (d) { if (d.constructor.name === 'Date') { return d.toLocaleDateString(); } return d.toLocaleString(); }; } this.adjustedScale = scale.bandwidth ? d => { // position the tick to middle considering number of lines of the tick const positionMiddle = scale(d) + scale.bandwidth() * 0.5; if (this.wrapTicks && d.toString().length > this.maxTickLength) { const chunksLength = this.tickChunks(d).length; if (chunksLength === 1) { return positionMiddle; } const bandWidth = scale.bandwidth(); const heightOfLines = chunksLength * 8; const availableFreeSpace = bandWidth * 0.5 - heightOfLines * 0.5; return scale(d) + availableFreeSpace; } return positionMiddle; } : scale; if (this.showRefLines && this.referenceLines) { this.setReferencelines(); } switch (this.orient) { case Orientation.Top: this.transform = function (tick) { return 'translate(' + this.adjustedScale(tick) + ',0)'; }; this.textAnchor = TextAnchor.Middle; this.y2 = this.innerTickSize * sign; this.y1 = this.tickSpacing * sign; this.dy = sign < 0 ? '0em' : '.71em'; break; case Orientation.Bottom: this.transform = function (tick) { return 'translate(' + this.adjustedScale(tick) + ',0)'; }; this.textAnchor = TextAnchor.Middle; this.y2 = this.innerTickSize * sign; this.y1 = this.tickSpacing * sign; this.dy = sign < 0 ? '0em' : '.71em'; break; case Orientation.Left: this.transform = function (tick) { return 'translate(0,' + this.adjustedScale(tick) + ')'; }; this.textAnchor = TextAnchor.End; this.x2 = this.innerTickSize * -sign; this.x1 = this.tickSpacing * -sign; this.dy = '.32em'; break; case Orientation.Right: this.transform = function (tick) { return 'translate(0,' + this.adjustedScale(tick) + ')'; }; this.textAnchor = TextAnchor.Start; this.x2 = this.innerTickSize * -sign; this.x1 = this.tickSpacing * -sign; this.dy = '.32em'; break; default: } setTimeout(() => this.updateDims()); } setReferencelines() { this.refMin = this.adjustedScale(Math.min.apply(null, this.referenceLines.map(item => item.value))); this.refMax = this.adjustedScale(Math.max.apply(null, this.referenceLines.map(item => item.value))); this.referenceLineLength = this.referenceLines.length; this.referenceAreaPath = roundedRect(0, this.refMax, this.gridLineWidth, this.refMin - this.refMax, 0, [ false, false, false, false ]); } getTicks() { let ticks; const maxTicks = this.getMaxTicks(20); const maxScaleTicks = this.getMaxTicks(50); if (this.tickValues) { ticks = this.tickValues; } else if (this.scale.ticks) { ticks = this.scale.ticks.apply(this.scale, [maxScaleTicks]); } else { ticks = this.scale.domain(); ticks = reduceTicks(ticks, maxTicks); } return ticks; } getMaxTicks(tickHeight) { return Math.floor(this.height / tickHeight); } tickTransform(tick) { return `translate(${this.adjustedScale(tick)},${this.verticalSpacing})`; } gridLineTransform() { return `translate(5,0)`; } tickTrim(label) { return this.trimTicks ? trimLabel(label, this.maxTickLength) : label; } getApproximateAxisWidth() { const maxChars = Math.max(...this.ticks.map(t => this.tickTrim(this.tickFormat(t)).length)); const charWidth = 7; return maxChars * charWidth; } tickChunks(label) { if (label.toString().length > this.maxTickLength && this.scale.bandwidth) { // for y-axis the width of the tick is fixed const preferredWidth = this.maxTickLength; const maxLines = Math.floor(this.scale.bandwidth() / 15); if (maxLines <= 1) { return [this.tickTrim(label)]; } return getTickLines(label, preferredWidth, Math.min(maxLines, 5)); } return [this.tickFormat(label)]; } } YAxisTicksComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: YAxisTicksComponent, deps: [{ token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component }); YAxisTicksComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: YAxisTicksComponent, selector: "g[ngx-charts-y-axis-ticks]", inputs: { scale: "scale", orient: "orient", tickArguments: "tickArguments", tickValues: "tickValues", tickStroke: "tickStroke", trimTicks: "trimTicks", maxTickLength: "maxTickLength", tickFormatting: "tickFormatting", showGridLines: "showGridLines", gridLineWidth: "gridLineWidth", height: "height", referenceLines: "referenceLines", showRefLabels: "showRefLabels", showRefLines: "showRefLines", wrapTicks: "wrapTicks" }, outputs: { dimensionsChanged: "dimensionsChanged" }, viewQueries: [{ propertyName: "ticksElement", first: true, predicate: ["ticksel"], descendants: true }], usesOnChanges: true, ngImport: i0, template: ` {{ tickFormatted }} {{ tickLine }} {{ tickTrim(tickFormatted) }} {{ tickTrim(tickFormat(refLine.value)) }} {{ refLine.name }} `, isInline: true, directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: YAxisTicksComponent, decorators: [{ type: Component, args: [{ selector: 'g[ngx-charts-y-axis-ticks]', template: ` {{ tickFormatted }} {{ tickLine }} {{ tickTrim(tickFormatted) }} {{ tickTrim(tickFormat(refLine.value)) }} {{ refLine.name }} `, changeDetection: ChangeDetectionStrategy.OnPush }] }], ctorParameters: function () { return [{ type: undefined, decorators: [{ type: Inject, args: [PLATFORM_ID] }] }]; }, propDecorators: { scale: [{ type: Input }], orient: [{ type: Input }], tickArguments: [{ type: Input }], tickValues: [{ type: Input }], tickStroke: [{ type: Input }], trimTicks: [{ type: Input }], maxTickLength: [{ type: Input }], tickFormatting: [{ type: Input }], showGridLines: [{ type: Input }], gridLineWidth: [{ type: Input }], height: [{ type: Input }], referenceLines: [{ type: Input }], showRefLabels: [{ type: Input }], showRefLines: [{ type: Input }], wrapTicks: [{ type: Input }], dimensionsChanged: [{ type: Output }], ticksElement: [{ type: ViewChild, args: ['ticksel'] }] } }); class YAxisComponent { constructor() { this.showGridLines = false; this.yOrient = Orientation.Left; this.yAxisOffset = 0; this.wrapTicks = false; this.dimensionsChanged = new EventEmitter(); this.yAxisClassName = 'y axis'; this.labelOffset = 15; this.fill = 'none'; this.stroke = '#CCC'; this.tickStroke = '#CCC'; this.strokeWidth = 1; this.padding = 5; } ngOnChanges(changes) { this.update(); } update() { this.offset = -(this.yAxisOffset + this.padding); if (this.yOrient === Orientation.Right) { this.labelOffset = 65; this.transform = `translate(${this.offset + this.dims.width} , 0)`; } else { this.transform = `translate(${this.offset} , 0)`; } if (this.yAxisTickCount !== undefined) { this.tickArguments = [this.yAxisTickCount]; } } emitTicksWidth({ width }) { if (width !== this.labelOffset && this.yOrient === Orientation.Right) { this.labelOffset = width + this.labelOffset; setTimeout(() => { this.dimensionsChanged.emit({ width }); }, 0); } else if (width !== this.labelOffset) { this.labelOffset = width; setTimeout(() => { this.dimensionsChanged.emit({ width }); }, 0); } } } YAxisComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: YAxisComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); YAxisComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: YAxisComponent, selector: "g[ngx-charts-y-axis]", inputs: { yScale: "yScale", dims: "dims", trimTicks: "trimTicks", maxTickLength: "maxTickLength", tickFormatting: "tickFormatting", ticks: "ticks", showGridLines: "showGridLines", showLabel: "showLabel", labelText: "labelText", yAxisTickCount: "yAxisTickCount", yOrient: "yOrient", referenceLines: "referenceLines", showRefLines: "showRefLines", showRefLabels: "showRefLabels", yAxisOffset: "yAxisOffset", wrapTicks: "wrapTicks" }, outputs: { dimensionsChanged: "dimensionsChanged" }, viewQueries: [{ propertyName: "ticksComponent", first: true, predicate: YAxisTicksComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: ` `, isInline: true, components: [{ type: YAxisTicksComponent, selector: "g[ngx-charts-y-axis-ticks]", inputs: ["scale", "orient", "tickArguments", "tickValues", "tickStroke", "trimTicks", "maxTickLength", "tickFormatting", "showGridLines", "gridLineWidth", "height", "referenceLines", "showRefLabels", "showRefLines", "wrapTicks"], outputs: ["dimensionsChanged"] }, { type: AxisLabelComponent, selector: "g[ngx-charts-axis-label]", inputs: ["orient", "label", "offset", "width", "height"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: YAxisComponent, decorators: [{ type: Component, args: [{ selector: 'g[ngx-charts-y-axis]', template: ` `, changeDetection: ChangeDetectionStrategy.OnPush }] }], propDecorators: { yScale: [{ type: Input }], dims: [{ type: Input }], trimTicks: [{ type: Input }], maxTickLength: [{ type: Input }], tickFormatting: [{ type: Input }], ticks: [{ type: Input }], showGridLines: [{ type: Input }], showLabel: [{ type: Input }], labelText: [{ type: Input }], yAxisTickCount: [{ type: Input }], yOrient: [{ type: Input }], referenceLines: [{ type: Input }], showRefLines: [{ type: Input }], showRefLabels: [{ type: Input }], yAxisOffset: [{ type: Input }], wrapTicks: [{ type: Input }], dimensionsChanged: [{ type: Output }], ticksComponent: [{ type: ViewChild, args: [YAxisTicksComponent] }] } }); class AxesModule { } AxesModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: AxesModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); AxesModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: AxesModule, declarations: [AxisLabelComponent, XAxisComponent, XAxisTicksComponent, YAxisComponent, YAxisTicksComponent], imports: [CommonModule], exports: [AxisLabelComponent, XAxisComponent, XAxisTicksComponent, YAxisComponent, YAxisTicksComponent] }); AxesModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: AxesModule, imports: [[CommonModule]] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: AxesModule, decorators: [{ type: NgModule, args: [{ imports: [CommonModule], declarations: [AxisLabelComponent, XAxisComponent, XAxisTicksComponent, YAxisComponent, YAxisTicksComponent], exports: [AxisLabelComponent, XAxisComponent, XAxisTicksComponent, YAxisComponent, YAxisTicksComponent] }] }] }); var StyleTypes; (function (StyleTypes) { StyleTypes["popover"] = "popover"; StyleTypes["tooltip"] = "tooltip"; })(StyleTypes || (StyleTypes = {})); var ShowTypes; (function (ShowTypes) { ShowTypes[ShowTypes["all"] = 'all'] = "all"; ShowTypes[ShowTypes["focus"] = 'focus'] = "focus"; ShowTypes[ShowTypes["mouseover"] = 'mouseover'] = "mouseover"; })(ShowTypes || (ShowTypes = {})); class TooltipDirective { constructor(tooltipService, viewContainerRef, renderer) { this.tooltipService = tooltipService; this.viewContainerRef = viewContainerRef; this.renderer = renderer; this.tooltipCssClass = ''; this.tooltipAppendToBody = true; this.tooltipSpacing = 10; this.tooltipDisabled = false; this.tooltipShowCaret = true; this.tooltipPlacement = PlacementTypes.Top; this.tooltipAlignment = PlacementTypes.Center; this.tooltipType = StyleTypes.popover; this.tooltipCloseOnClickOutside = true; this.tooltipCloseOnMouseLeave = true; this.tooltipHideTimeout = 300; this.tooltipShowTimeout = 100; this.tooltipShowEvent = ShowTypes.all; this.tooltipImmediateExit = false; this.show = new EventEmitter(); this.hide = new EventEmitter(); } get listensForFocus() { return this.tooltipShowEvent === ShowTypes.all || this.tooltipShowEvent === ShowTypes.focus; } get listensForHover() { return this.tooltipShowEvent === ShowTypes.all || this.tooltipShowEvent === ShowTypes.mouseover; } ngOnDestroy() { this.hideTooltip(true); } onFocus() { if (this.listensForFocus) { this.showTooltip(); } } onBlur() { if (this.listensForFocus) { this.hideTooltip(true); } } onMouseEnter() { if (this.listensForHover) { this.showTooltip(); } } onMouseLeave(target) { if (this.listensForHover && this.tooltipCloseOnMouseLeave) { clearTimeout(this.timeout); if (this.component) { const contentDom = this.component.instance.element.nativeElement; const contains = contentDom.contains(target); if (contains) return; } this.hideTooltip(this.tooltipImmediateExit); } } onMouseClick() { if (this.listensForHover) { this.hideTooltip(true); } } showTooltip(immediate) { if (this.component || this.tooltipDisabled) return; const time = immediate ? 0 : this.tooltipShowTimeout + (navigator.userAgent.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/) ? 400 : 0); clearTimeout(this.timeout); this.timeout = setTimeout(() => { this.tooltipService.destroyAll(); const options = this.createBoundOptions(); this.component = this.tooltipService.create(options); // add a tiny timeout to avoid event re-triggers setTimeout(() => { if (this.component) { this.addHideListeners(this.component.instance.element.nativeElement); } }, 10); this.show.emit(true); }, time); } addHideListeners(tooltip) { // on mouse enter, cancel the hide triggered by the leave this.mouseEnterContentEvent = this.renderer.listen(tooltip, 'mouseenter', () => { clearTimeout(this.timeout); }); // content mouse leave listener if (this.tooltipCloseOnMouseLeave) { this.mouseLeaveContentEvent = this.renderer.listen(tooltip, 'mouseleave', () => { this.hideTooltip(this.tooltipImmediateExit); }); } // content close on click outside if (this.tooltipCloseOnClickOutside) { this.documentClickEvent = this.renderer.listen('window', 'click', event => { const contains = tooltip.contains(event.target); if (!contains) this.hideTooltip(); }); } } hideTooltip(immediate = false) { if (!this.component) return; const destroyFn = () => { // remove events if (this.mouseLeaveContentEvent) this.mouseLeaveContentEvent(); if (this.mouseEnterContentEvent) this.mouseEnterContentEvent(); if (this.documentClickEvent) this.documentClickEvent(); // emit events this.hide.emit(true); // destroy component this.tooltipService.destroy(this.component); this.component = undefined; }; clearTimeout(this.timeout); if (!immediate) { this.timeout = setTimeout(destroyFn, this.tooltipHideTimeout); } else { destroyFn(); } } createBoundOptions() { return { title: this.tooltipTitle, template: this.tooltipTemplate, host: this.viewContainerRef.element, placement: this.tooltipPlacement, alignment: this.tooltipAlignment, type: this.tooltipType, showCaret: this.tooltipShowCaret, cssClass: this.tooltipCssClass, spacing: this.tooltipSpacing, context: this.tooltipContext }; } } TooltipDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: TooltipDirective, deps: [{ token: TooltipService }, { token: i0.ViewContainerRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive }); TooltipDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.1.0", type: TooltipDirective, selector: "[ngx-tooltip]", inputs: { tooltipCssClass: "tooltipCssClass", tooltipTitle: "tooltipTitle", tooltipAppendToBody: "tooltipAppendToBody", tooltipSpacing: "tooltipSpacing", tooltipDisabled: "tooltipDisabled", tooltipShowCaret: "tooltipShowCaret", tooltipPlacement: "tooltipPlacement", tooltipAlignment: "tooltipAlignment", tooltipType: "tooltipType", tooltipCloseOnClickOutside: "tooltipCloseOnClickOutside", tooltipCloseOnMouseLeave: "tooltipCloseOnMouseLeave", tooltipHideTimeout: "tooltipHideTimeout", tooltipShowTimeout: "tooltipShowTimeout", tooltipTemplate: "tooltipTemplate", tooltipShowEvent: "tooltipShowEvent", tooltipContext: "tooltipContext", tooltipImmediateExit: "tooltipImmediateExit" }, outputs: { show: "show", hide: "hide" }, host: { listeners: { "focusin": "onFocus()", "blur": "onBlur()", "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave($event.target)", "click": "onMouseClick()" } }, ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: TooltipDirective, decorators: [{ type: Directive, args: [{ selector: '[ngx-tooltip]' }] }], ctorParameters: function () { return [{ type: TooltipService }, { type: i0.ViewContainerRef }, { type: i0.Renderer2 }]; }, propDecorators: { tooltipCssClass: [{ type: Input }], tooltipTitle: [{ type: Input }], tooltipAppendToBody: [{ type: Input }], tooltipSpacing: [{ type: Input }], tooltipDisabled: [{ type: Input }], tooltipShowCaret: [{ type: Input }], tooltipPlacement: [{ type: Input }], tooltipAlignment: [{ type: Input }], tooltipType: [{ type: Input }], tooltipCloseOnClickOutside: [{ type: Input }], tooltipCloseOnMouseLeave: [{ type: Input }], tooltipHideTimeout: [{ type: Input }], tooltipShowTimeout: [{ type: Input }], tooltipTemplate: [{ type: Input }], tooltipShowEvent: [{ type: Input }], tooltipContext: [{ type: Input }], tooltipImmediateExit: [{ type: Input }], show: [{ type: Output }], hide: [{ type: Output }], onFocus: [{ type: HostListener, args: ['focusin'] }], onBlur: [{ type: HostListener, args: ['blur'] }], onMouseEnter: [{ type: HostListener, args: ['mouseenter'] }], onMouseLeave: [{ type: HostListener, args: ['mouseleave', ['$event.target']] }], onMouseClick: [{ type: HostListener, args: ['click'] }] } }); class TooltipModule { } TooltipModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: TooltipModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); TooltipModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: TooltipModule, declarations: [TooltipContentComponent, TooltipDirective], imports: [CommonModule], exports: [TooltipContentComponent, TooltipDirective] }); TooltipModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: TooltipModule, providers: [InjectionService, TooltipService], imports: [[CommonModule]] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: TooltipModule, decorators: [{ type: NgModule, args: [{ declarations: [TooltipContentComponent, TooltipDirective], providers: [InjectionService, TooltipService], exports: [TooltipContentComponent, TooltipDirective], imports: [CommonModule], entryComponents: [TooltipContentComponent] }] }] }); const cache = {}; /** * Generates a short id. * * Description: * A 4-character alphanumeric sequence (364 = 1.6 million) * This should only be used for JavaScript specific models. * http://stackoverflow.com/questions/6248666/how-to-generate-short-uid-like-ax4j9z-in-js * * Example: `ebgf` */ function id() { let newId = ('0000' + ((Math.random() * Math.pow(36, 4)) << 0).toString(36)).slice(-4); // append a 'a' because neo gets mad newId = `a${newId}`; // ensure not already used if (!cache[newId]) { cache[newId] = true; return newId; } return id(); } var BarOrientation; (function (BarOrientation) { BarOrientation["Vertical"] = "vertical"; BarOrientation["Horizontal"] = "horizontal"; })(BarOrientation || (BarOrientation = {})); class SvgLinearGradientComponent { constructor() { this.orientation = BarOrientation.Vertical; } ngOnChanges(changes) { this.x1 = '0%'; this.x2 = '0%'; this.y1 = '0%'; this.y2 = '0%'; if (this.orientation === BarOrientation.Horizontal) { this.x2 = '100%'; } else if (this.orientation === BarOrientation.Vertical) { this.y1 = '100%'; } } } SvgLinearGradientComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: SvgLinearGradientComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); SvgLinearGradientComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: SvgLinearGradientComponent, selector: "g[ngx-charts-svg-linear-gradient]", inputs: { orientation: "orientation", name: "name", stops: "stops" }, usesOnChanges: true, ngImport: i0, template: ` `, isInline: true, directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: SvgLinearGradientComponent, decorators: [{ type: Component, args: [{ selector: 'g[ngx-charts-svg-linear-gradient]', template: ` `, changeDetection: ChangeDetectionStrategy.OnPush }] }], propDecorators: { orientation: [{ type: Input }], name: [{ type: Input }], stops: [{ type: Input }] } }); class CircleComponent { constructor() { this.select = new EventEmitter(); this.activate = new EventEmitter(); this.deactivate = new EventEmitter(); } onClick() { this.select.emit(this.data); } onMouseEnter() { this.activate.emit(this.data); } onMouseLeave() { this.deactivate.emit(this.data); } ngOnChanges(changes) { this.classNames = Array.isArray(this.classNames) ? this.classNames.join(' ') : ''; this.classNames += 'circle'; } } CircleComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: CircleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); CircleComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: CircleComponent, selector: "g[ngx-charts-circle]", inputs: { cx: "cx", cy: "cy", r: "r", fill: "fill", stroke: "stroke", data: "data", classNames: "classNames", circleOpacity: "circleOpacity", pointerEvents: "pointerEvents" }, outputs: { select: "select", activate: "activate", deactivate: "deactivate" }, host: { listeners: { "click": "onClick()", "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()" } }, usesOnChanges: true, ngImport: i0, template: ` `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: CircleComponent, decorators: [{ type: Component, args: [{ selector: 'g[ngx-charts-circle]', template: ` `, changeDetection: ChangeDetectionStrategy.OnPush }] }], propDecorators: { cx: [{ type: Input }], cy: [{ type: Input }], r: [{ type: Input }], fill: [{ type: Input }], stroke: [{ type: Input }], data: [{ type: Input }], classNames: [{ type: Input }], circleOpacity: [{ type: Input }], pointerEvents: [{ type: Input }], select: [{ type: Output }], activate: [{ type: Output }], deactivate: [{ type: Output }], onClick: [{ type: HostListener, args: ['click'] }], onMouseEnter: [{ type: HostListener, args: ['mouseenter'] }], onMouseLeave: [{ type: HostListener, args: ['mouseleave'] }] } }); var SeriesType; (function (SeriesType) { SeriesType["Standard"] = "standard"; SeriesType["Stacked"] = "stacked"; })(SeriesType || (SeriesType = {})); class CircleSeriesComponent { constructor(platformId) { this.platformId = platformId; this.type = SeriesType.Standard; this.tooltipDisabled = false; this.select = new EventEmitter(); this.activate = new EventEmitter(); this.deactivate = new EventEmitter(); this.barVisible = false; this.barOrientation = BarOrientation; this.placementTypes = PlacementTypes; this.styleTypes = StyleTypes; this.isSSR = false; } ngOnInit() { this.gradientId = 'grad' + id().toString(); this.gradientFill = `url(#${this.gradientId})`; if (isPlatformServer(this.platformId)) { this.isSSR = true; } } ngOnChanges() { this.update(); } update() { this.circle = this.getActiveCircle(); } getActiveCircle() { const indexActiveDataPoint = this.data.series.findIndex(d => { const label = d.name; return label && this.visibleValue && label.toString() === this.visibleValue.toString() && d.value !== undefined; }); if (indexActiveDataPoint === -1) { // No valid point is 'active/hovered over' at this moment. return undefined; } return this.mapDataPointToCircle(this.data.series[indexActiveDataPoint], indexActiveDataPoint); } mapDataPointToCircle(d, i) { const seriesName = this.data.name; const value = d.value; const label = d.name; const tooltipLabel = formatLabel(label); let cx; if (this.scaleType === ScaleType.Time) { cx = this.xScale(label); } else if (this.scaleType === ScaleType.Linear) { cx = this.xScale(Number(label)); } else { cx = this.xScale(label); } const cy = this.yScale(this.type === SeriesType.Standard ? value : d.d1); const radius = 5; const height = this.yScale.range()[0] - cy; const opacity = 1; let color; if (this.colors.scaleType === ScaleType.Linear) { if (this.type === SeriesType.Standard) { color = this.colors.getColor(value); } else { color = this.colors.getColor(d.d1); } } else { color = this.colors.getColor(seriesName); } const data = Object.assign({}, d, { series: seriesName, value, name: label }); return { classNames: [`circle-data-${i}`], value, label, data, cx, cy, radius, height, tooltipLabel, color, opacity, seriesName, gradientStops: this.getGradientStops(color), min: d.min, max: d.max }; } getTooltipText({ tooltipLabel, value, seriesName, min, max }) { return ` ${escapeLabel(seriesName)} • ${escapeLabel(tooltipLabel)} ${value.toLocaleString()}${this.getTooltipMinMaxText(min, max)} `; } getTooltipMinMaxText(min, max) { if (min !== undefined || max !== undefined) { let result = ' ('; if (min !== undefined) { if (max === undefined) { result += '≥'; } result += min.toLocaleString(); if (max !== undefined) { result += ' - '; } } else if (max !== undefined) { result += '≤'; } if (max !== undefined) { result += max.toLocaleString(); } result += ')'; return result; } else { return ''; } } getGradientStops(color) { return [ { offset: 0, color, opacity: 0.2 }, { offset: 100, color, opacity: 1 } ]; } onClick(data) { this.select.emit(data); } isActive(entry) { if (!this.activeEntries) return false; const item = this.activeEntries.find(d => { return entry.name === d.name; }); return item !== undefined; } activateCircle() { this.barVisible = true; this.activate.emit({ name: this.data.name }); } deactivateCircle() { this.barVisible = false; this.circle.opacity = 0; this.deactivate.emit({ name: this.data.name }); } } CircleSeriesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: CircleSeriesComponent, deps: [{ token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component }); CircleSeriesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: CircleSeriesComponent, selector: "g[ngx-charts-circle-series]", inputs: { data: "data", type: "type", xScale: "xScale", yScale: "yScale", colors: "colors", scaleType: "scaleType", visibleValue: "visibleValue", activeEntries: "activeEntries", tooltipDisabled: "tooltipDisabled", tooltipTemplate: "tooltipTemplate" }, outputs: { select: "select", activate: "activate", deactivate: "deactivate" }, usesOnChanges: true, ngImport: i0, template: ` `, isInline: true, components: [{ type: SvgLinearGradientComponent, selector: "g[ngx-charts-svg-linear-gradient]", inputs: ["orientation", "name", "stops"] }, { type: CircleComponent, selector: "g[ngx-charts-circle]", inputs: ["cx", "cy", "r", "fill", "stroke", "data", "classNames", "circleOpacity", "pointerEvents"], outputs: ["select", "activate", "deactivate"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: TooltipDirective, selector: "[ngx-tooltip]", inputs: ["tooltipCssClass", "tooltipTitle", "tooltipAppendToBody", "tooltipSpacing", "tooltipDisabled", "tooltipShowCaret", "tooltipPlacement", "tooltipAlignment", "tooltipType", "tooltipCloseOnClickOutside", "tooltipCloseOnMouseLeave", "tooltipHideTimeout", "tooltipShowTimeout", "tooltipTemplate", "tooltipShowEvent", "tooltipContext", "tooltipImmediateExit"], outputs: ["show", "hide"] }], animations: [ trigger('animationState', [ transition(':enter', [ style({ opacity: 0 }), animate(250, style({ opacity: 1 })) ]) ]) ], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: CircleSeriesComponent, decorators: [{ type: Component, args: [{ selector: 'g[ngx-charts-circle-series]', template: ` `, changeDetection: ChangeDetectionStrategy.OnPush, animations: [ trigger('animationState', [ transition(':enter', [ style({ opacity: 0 }), animate(250, style({ opacity: 1 })) ]) ]) ] }] }], ctorParameters: function () { return [{ type: undefined, decorators: [{ type: Inject, args: [PLATFORM_ID] }] }]; }, propDecorators: { data: [{ type: Input }], type: [{ type: Input }], xScale: [{ type: Input }], yScale: [{ type: Input }], colors: [{ type: Input }], scaleType: [{ type: Input }], visibleValue: [{ type: Input }], activeEntries: [{ type: Input }], tooltipDisabled: [{ type: Input }], tooltipTemplate: [{ type: Input }], select: [{ type: Output }], activate: [{ type: Output }], deactivate: [{ type: Output }] } }); class GridPanelComponent { } GridPanelComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: GridPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); GridPanelComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: GridPanelComponent, selector: "g[ngx-charts-grid-panel]", inputs: { width: "width", height: "height", x: "x", y: "y" }, ngImport: i0, template: ` `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: GridPanelComponent, decorators: [{ type: Component, args: [{ selector: 'g[ngx-charts-grid-panel]', template: ` `, changeDetection: ChangeDetectionStrategy.OnPush }] }], propDecorators: { width: [{ type: Input }], height: [{ type: Input }], x: [{ type: Input }], y: [{ type: Input }] } }); var ClassEnum; (function (ClassEnum) { ClassEnum["Odd"] = "odd"; ClassEnum["Even"] = "even"; })(ClassEnum || (ClassEnum = {})); class GridPanelSeriesComponent { ngOnChanges(changes) { this.update(); } update() { this.gridPanels = this.getGridPanels(); } getGridPanels() { return this.data.map(d => { let offset; let width; let height; let x; let y; let className = ClassEnum.Odd; if (this.orient === BarOrientation.Vertical) { const position = this.xScale(d.name); const positionIndex = Number.parseInt((position / this.xScale.step()).toString(), 10); if (positionIndex % 2 === 1) { className = ClassEnum.Even; } offset = this.xScale.bandwidth() * this.xScale.paddingInner(); width = this.xScale.bandwidth() + offset; height = this.dims.height; x = this.xScale(d.name) - offset / 2; y = 0; } else if (this.orient === BarOrientation.Horizontal) { const position = this.yScale(d.name); const positionIndex = Number.parseInt((position / this.yScale.step()).toString(), 10); if (positionIndex % 2 === 1) { className = ClassEnum.Even; } offset = this.yScale.bandwidth() * this.yScale.paddingInner(); width = this.dims.width; height = this.yScale.bandwidth() + offset; x = 0; y = this.yScale(d.name) - offset / 2; } return { name: d.name, class: className, height, width, x, y }; }); } } GridPanelSeriesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: GridPanelSeriesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); GridPanelSeriesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: GridPanelSeriesComponent, selector: "g[ngx-charts-grid-panel-series]", inputs: { data: "data", dims: "dims", xScale: "xScale", yScale: "yScale", orient: "orient" }, usesOnChanges: true, ngImport: i0, template: ` `, isInline: true, components: [{ type: GridPanelComponent, selector: "g[ngx-charts-grid-panel]", inputs: ["width", "height", "x", "y"] }], directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: GridPanelSeriesComponent, decorators: [{ type: Component, args: [{ selector: 'g[ngx-charts-grid-panel-series]', template: ` `, changeDetection: ChangeDetectionStrategy.OnPush }] }], propDecorators: { data: [{ type: Input }], dims: [{ type: Input }], xScale: [{ type: Input }], yScale: [{ type: Input }], orient: [{ type: Input }] } }); class SvgRadialGradientComponent { constructor() { this.endOpacity = 1; this.cx = 0; this.cy = 0; } get stops() { return this.stopsInput || this.stopsDefault; } set stops(value) { this.stopsInput = value; } ngOnChanges(changes) { this.r = '30%'; if ('color' in changes || 'startOpacity' in changes || 'endOpacity' in changes) { this.stopsDefault = [ { offset: 0, color: this.color, opacity: this.startOpacity }, { offset: 100, color: this.color, opacity: this.endOpacity } ]; } } } SvgRadialGradientComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: SvgRadialGradientComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); SvgRadialGradientComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: SvgRadialGradientComponent, selector: "g[ngx-charts-svg-radial-gradient]", inputs: { color: "color", name: "name", startOpacity: "startOpacity", endOpacity: "endOpacity", cx: "cx", cy: "cy", stops: "stops" }, usesOnChanges: true, ngImport: i0, template: ` `, isInline: true, directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: SvgRadialGradientComponent, decorators: [{ type: Component, args: [{ selector: 'g[ngx-charts-svg-radial-gradient]', template: ` `, changeDetection: ChangeDetectionStrategy.OnPush }] }], propDecorators: { color: [{ type: Input }], name: [{ type: Input }], startOpacity: [{ type: Input }], endOpacity: [{ type: Input }], cx: [{ type: Input }], cy: [{ type: Input }], stops: [{ type: Input }] } }); class AreaComponent { constructor(element) { this.opacity = 1; this.startOpacity = 0.5; this.endOpacity = 1; this.gradient = false; this.animations = true; this.select = new EventEmitter(); this.animationsLoaded = false; this.hasGradient = false; this.barOrientation = BarOrientation; this.element = element.nativeElement; } ngOnChanges() { this.update(); if (!this.animationsLoaded) { this.loadAnimation(); this.animationsLoaded = true; } } update() { this.gradientId = 'grad' + id().toString(); this.gradientFill = `url(#${this.gradientId})`; if (this.gradient || this.stops) { this.gradientStops = this.getGradient(); this.hasGradient = true; } else { this.hasGradient = false; } this.updatePathEl(); } loadAnimation() { this.areaPath = this.startingPath; setTimeout(this.updatePathEl.bind(this), 100); } updatePathEl() { const node = select(this.element).select('.area'); if (this.animations) { node.transition().duration(750).attr('d', this.path); } else { node.attr('d', this.path); } } getGradient() { if (this.stops) { return this.stops; } return [ { offset: 0, color: this.fill, opacity: this.startOpacity }, { offset: 100, color: this.fill, opacity: this.endOpacity } ]; } } AreaComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: AreaComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); AreaComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: AreaComponent, selector: "g[ngx-charts-area]", inputs: { data: "data", path: "path", startingPath: "startingPath", fill: "fill", opacity: "opacity", startOpacity: "startOpacity", endOpacity: "endOpacity", gradient: "gradient", stops: "stops", animations: "animations" }, outputs: { select: "select" }, usesOnChanges: true, ngImport: i0, template: ` `, isInline: true, components: [{ type: SvgLinearGradientComponent, selector: "g[ngx-charts-svg-linear-gradient]", inputs: ["orientation", "name", "stops"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: AreaComponent, decorators: [{ type: Component, args: [{ selector: 'g[ngx-charts-area]', template: ` `, changeDetection: ChangeDetectionStrategy.OnPush }] }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { data: [{ type: Input }], path: [{ type: Input }], startingPath: [{ type: Input }], fill: [{ type: Input }], opacity: [{ type: Input }], startOpacity: [{ type: Input }], endOpacity: [{ type: Input }], gradient: [{ type: Input }], stops: [{ type: Input }], animations: [{ type: Input }], select: [{ type: Output }] } }); // Robert Penner's easeOutExpo function easeOutExpo(t, b, c, d) { return (c * (-Math.pow(2, (-10 * t) / d) + 1) * 1024) / 1023 + b; } /** * Counts from a number to the end incrementally. */ function count(countFrom, countTo, countDecimals, countDuration, callback) { const startVal = Number(countFrom); const endVal = Number(countTo); const countDown = startVal > endVal; const decimals = Math.max(0, countDecimals); const dec = Math.pow(10, decimals); const duration = Number(countDuration) * 1000; let startTime; function runCount(timestamp) { let frameVal; const progress = timestamp - startTime; if (countDown) { frameVal = startVal - easeOutExpo(progress, 0, startVal - endVal, duration); } else { frameVal = easeOutExpo(progress, startVal, endVal - startVal, duration); } if (countDown) { frameVal = frameVal < endVal ? endVal : frameVal; } else { frameVal = frameVal > endVal ? endVal : frameVal; } frameVal = Math.round(frameVal * dec) / dec; const tick = progress < duration; callback({ value: frameVal, progress, timestamp, finished: !tick }); if (tick) { return requestAnimationFrame(val => runCount(val)); } } return requestAnimationFrame(timestamp => { startTime = timestamp; return runCount(timestamp); }); } /** * Determine decimals places * * @export */ function decimalChecker(countTo) { const endVal = Number(countTo); if (endVal % 1 !== 0 && Math.abs(endVal) <= 10) { return 2; } return 0; } /** * Count up component * * Loosely inspired by: * - https://github.com/izupet/angular2-counto * - https://inorganik.github.io/countUp.js/ * * @export */ class CountUpDirective { constructor(cd, element) { this.cd = cd; this.countDuration = 1; this.countPrefix = ''; this.countSuffix = ''; this.countChange = new EventEmitter(); this.countFinish = new EventEmitter(); this.value = ''; this._countDecimals = 0; this._countTo = 0; this._countFrom = 0; this.nativeElement = element.nativeElement; } set countDecimals(val) { this._countDecimals = val; } get countDecimals() { if (this._countDecimals) return this._countDecimals; return decimalChecker(this.countTo); } set countTo(val) { this._countTo = parseFloat(val); this.start(); } get countTo() { return this._countTo; } set countFrom(val) { this._countFrom = parseFloat(val); this.start(); } get countFrom() { return this._countFrom; } ngOnDestroy() { cancelAnimationFrame(this.animationReq); } start() { cancelAnimationFrame(this.animationReq); const valueFormatting = this.valueFormatting || (value => `${this.countPrefix}${value.toLocaleString()}${this.countSuffix}`); const callback = ({ value, progress, finished }) => { this.value = valueFormatting(value); this.cd.markForCheck(); if (!finished) this.countChange.emit({ value: this.value, progress }); if (finished) this.countFinish.emit({ value: this.value, progress }); }; this.animationReq = count(this.countFrom, this.countTo, this.countDecimals, this.countDuration, callback); } } CountUpDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: CountUpDirective, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); CountUpDirective.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: CountUpDirective, selector: "[ngx-charts-count-up]", inputs: { countDuration: "countDuration", countPrefix: "countPrefix", countSuffix: "countSuffix", valueFormatting: "valueFormatting", countDecimals: "countDecimals", countTo: "countTo", countFrom: "countFrom" }, outputs: { countChange: "countChange", countFinish: "countFinish" }, ngImport: i0, template: ` {{ value }} `, isInline: true }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: CountUpDirective, decorators: [{ type: Component, args: [{ selector: '[ngx-charts-count-up]', template: ` {{ value }} ` }] }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }]; }, propDecorators: { countDuration: [{ type: Input }], countPrefix: [{ type: Input }], countSuffix: [{ type: Input }], valueFormatting: [{ type: Input }], countDecimals: [{ type: Input }], countTo: [{ type: Input }], countFrom: [{ type: Input }], countChange: [{ type: Output }], countFinish: [{ type: Output }] } }); // If we don't check whether 'window' and 'global' variables are defined, // code will fail in browser/node with 'variable is undefined' error. let root; if (typeof window !== 'undefined') { root = window; } else if (typeof global !== 'undefined') { root = global; } // tslint:disable-next-line:variable-name const MouseEvent = root.MouseEvent; function createMouseEvent(name, bubbles = false, cancelable = true) { // Calling new of an event does not work correctly on IE. The following is a tested workaround // See https://stackoverflow.com/questions/27176983/dispatchevent-not-working-in-ie11 if (typeof MouseEvent === 'function') { // Sane browsers return new MouseEvent(name, { bubbles, cancelable }); } else { // IE const event = document.createEvent('MouseEvent'); event.initEvent(name, bubbles, cancelable); return event; } } class TooltipArea { constructor(platformId) { this.platformId = platformId; this.anchorOpacity = 0; this.anchorPos = -1; this.anchorValues = []; this.placementTypes = PlacementTypes; this.styleTypes = StyleTypes; this.showPercentage = false; this.tooltipDisabled = false; this.hover = new EventEmitter(); } getValues(xVal) { const results = []; for (const group of this.results) { const item = group.series.find(d => d.name.toString() === xVal.toString()); let groupName = group.name; if (groupName instanceof Date) { groupName = groupName.toLocaleDateString(); } if (item) { const label = item.name; let val = item.value; if (this.showPercentage) { val = (item.d1 - item.d0).toFixed(2) + '%'; } let color; if (this.colors.scaleType === ScaleType.Linear) { let v = val; if (item.d1) { v = item.d1; } color = this.colors.getColor(v); } else { color = this.colors.getColor(group.name); } const data = Object.assign({}, item, { value: val, name: label, series: groupName, min: item.min, max: item.max, color }); results.push(data); } } return results; } mouseMove(event) { if (!isPlatformBrowser(this.platformId)) { return; } const xPos = event.pageX - event.target.getBoundingClientRect().left; const closestIndex = this.findClosestPointIndex(xPos); const closestPoint = this.xSet[closestIndex]; this.anchorPos = this.xScale(closestPoint); this.anchorPos = Math.max(0, this.anchorPos); this.anchorPos = Math.min(this.dims.width, this.anchorPos); this.anchorValues = this.getValues(closestPoint); if (this.anchorPos !== this.lastAnchorPos) { const ev = createMouseEvent('mouseleave'); this.tooltipAnchor.nativeElement.dispatchEvent(ev); this.anchorOpacity = 0.7; this.hover.emit({ value: closestPoint }); this.showTooltip(); this.lastAnchorPos = this.anchorPos; } } findClosestPointIndex(xPos) { let minIndex = 0; let maxIndex = this.xSet.length - 1; let minDiff = Number.MAX_VALUE; let closestIndex = 0; while (minIndex <= maxIndex) { const currentIndex = ((minIndex + maxIndex) / 2) | 0; const currentElement = this.xScale(this.xSet[currentIndex]); const curDiff = Math.abs(currentElement - xPos); if (curDiff < minDiff) { minDiff = curDiff; closestIndex = currentIndex; } if (currentElement < xPos) { minIndex = currentIndex + 1; } else if (currentElement > xPos) { maxIndex = currentIndex - 1; } else { minDiff = 0; closestIndex = currentIndex; break; } } return closestIndex; } showTooltip() { const event = createMouseEvent('mouseenter'); this.tooltipAnchor.nativeElement.dispatchEvent(event); } hideTooltip() { const event = createMouseEvent('mouseleave'); this.tooltipAnchor.nativeElement.dispatchEvent(event); this.anchorOpacity = 0; this.lastAnchorPos = -1; } getToolTipText(tooltipItem) { let result = ''; if (tooltipItem.series !== undefined) { result += tooltipItem.series; } else { result += '???'; } result += ': '; if (tooltipItem.value !== undefined) { result += tooltipItem.value.toLocaleString(); } if (tooltipItem.min !== undefined || tooltipItem.max !== undefined) { result += ' ('; if (tooltipItem.min !== undefined) { if (tooltipItem.max === undefined) { result += '≥'; } result += tooltipItem.min.toLocaleString(); if (tooltipItem.max !== undefined) { result += ' - '; } } else if (tooltipItem.max !== undefined) { result += '≤'; } if (tooltipItem.max !== undefined) { result += tooltipItem.max.toLocaleString(); } result += ')'; } return result; } } TooltipArea.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: TooltipArea, deps: [{ token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component }); TooltipArea.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: TooltipArea, selector: "g[ngx-charts-tooltip-area]", inputs: { dims: "dims", xSet: "xSet", xScale: "xScale", yScale: "yScale", results: "results", colors: "colors", showPercentage: "showPercentage", tooltipDisabled: "tooltipDisabled", tooltipTemplate: "tooltipTemplate" }, outputs: { hover: "hover" }, viewQueries: [{ propertyName: "tooltipAnchor", first: true, predicate: ["tooltipAnchor"], descendants: true }], ngImport: i0, template: ` {{ getToolTipText(tooltipItem) }} `, isInline: true, directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: TooltipDirective, selector: "[ngx-tooltip]", inputs: ["tooltipCssClass", "tooltipTitle", "tooltipAppendToBody", "tooltipSpacing", "tooltipDisabled", "tooltipShowCaret", "tooltipPlacement", "tooltipAlignment", "tooltipType", "tooltipCloseOnClickOutside", "tooltipCloseOnMouseLeave", "tooltipHideTimeout", "tooltipShowTimeout", "tooltipTemplate", "tooltipShowEvent", "tooltipContext", "tooltipImmediateExit"], outputs: ["show", "hide"] }], animations: [ trigger('animationState', [ transition('inactive => active', [ style({ opacity: 0 }), animate(250, style({ opacity: 0.7 })) ]), transition('active => inactive', [ style({ opacity: 0.7 }), animate(250, style({ opacity: 0 })) ]) ]) ], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: TooltipArea, decorators: [{ type: Component, args: [{ selector: 'g[ngx-charts-tooltip-area]', template: ` {{ getToolTipText(tooltipItem) }} `, changeDetection: ChangeDetectionStrategy.OnPush, animations: [ trigger('animationState', [ transition('inactive => active', [ style({ opacity: 0 }), animate(250, style({ opacity: 0.7 })) ]), transition('active => inactive', [ style({ opacity: 0.7 }), animate(250, style({ opacity: 0 })) ]) ]) ] }] }], ctorParameters: function () { return [{ type: undefined, decorators: [{ type: Inject, args: [PLATFORM_ID] }] }]; }, propDecorators: { dims: [{ type: Input }], xSet: [{ type: Input }], xScale: [{ type: Input }], yScale: [{ type: Input }], results: [{ type: Input }], colors: [{ type: Input }], showPercentage: [{ type: Input }], tooltipDisabled: [{ type: Input }], tooltipTemplate: [{ type: Input }], hover: [{ type: Output }], tooltipAnchor: [{ type: ViewChild, args: ['tooltipAnchor', { static: false }] }] } }); class Timeline { constructor(element, cd) { this.cd = cd; this.height = 50; this.select = new EventEmitter(); this.onDomainChange = new EventEmitter(); this.initialized = false; this.element = element.nativeElement; } ngOnChanges(changes) { this.update(); if (!this.initialized) { this.addBrush(); this.initialized = true; } } update() { this.dims = this.getDims(); this.height = this.dims.height; const offsetY = this.view[1] - this.height; this.xDomain = this.getXDomain(); this.xScale = this.getXScale(); if (this.brush) { this.updateBrush(); } this.transform = `translate(0 , ${offsetY})`; this.filterId = 'filter' + id().toString(); this.filter = `url(#${this.filterId})`; this.cd.markForCheck(); } getXDomain() { let values = []; for (const results of this.results) { for (const d of results.series) { if (!values.includes(d.name)) { values.push(d.name); } } } let domain = []; if (this.scaleType === ScaleType.Time) { const min = Math.min(...values); const max = Math.max(...values); domain = [min, max]; } else if (this.scaleType === ScaleType.Linear) { values = values.map(v => Number(v)); const min = Math.min(...values); const max = Math.max(...values); domain = [min, max]; } else { domain = values; } return domain; } getXScale() { let scale; if (this.scaleType === ScaleType.Time) { scale = scaleTime().range([0, this.dims.width]).domain(this.xDomain); } else if (this.scaleType === ScaleType.Linear) { scale = scaleLinear().range([0, this.dims.width]).domain(this.xDomain); } else if (this.scaleType === ScaleType.Ordinal) { scale = scalePoint().range([0, this.dims.width]).padding(0.1).domain(this.xDomain); } return scale; } addBrush() { if (this.brush) return; const height = this.height; const width = this.view[0]; this.brush = brushX() .extent([ [0, 0], [width, height] ]) .on('brush end', ({ selection }) => { const newSelection = selection || this.xScale.range(); const newDomain = newSelection.map(this.xScale.invert); this.onDomainChange.emit(newDomain); this.cd.markForCheck(); }); select(this.element).select('.brush').call(this.brush); } updateBrush() { if (!this.brush) return; const height = this.height; const width = this.view[0]; this.brush.extent([ [0, 0], [width, height] ]); select(this.element).select('.brush').call(this.brush); // clear hardcoded properties so they can be defined by CSS select(this.element) .select('.selection') .attr('fill', undefined) .attr('stroke', undefined) .attr('fill-opacity', undefined); this.cd.markForCheck(); } getDims() { const width = this.view[0]; const dims = { width, height: this.height }; return dims; } } Timeline.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: Timeline, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); Timeline.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: Timeline, selector: "g[ngx-charts-timeline]", inputs: { view: "view", results: "results", scheme: "scheme", customColors: "customColors", legend: "legend", autoScale: "autoScale", scaleType: "scaleType", height: "height" }, outputs: { select: "select", onDomainChange: "onDomainChange" }, usesOnChanges: true, ngImport: i0, template: ` `, isInline: true, styles: [".timeline .brush-background{fill:#0000000d}.timeline .brush .selection{fill:#0000001a;stroke-width:1px;stroke:#888}.timeline .brush .handle{fill-opacity:0}.timeline .embedded-chart{opacity:.6}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: Timeline, decorators: [{ type: Component, args: [{ selector: 'g[ngx-charts-timeline]', template: ` `, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".timeline .brush-background{fill:#0000000d}.timeline .brush .selection{fill:#0000001a;stroke-width:1px;stroke:#888}.timeline .brush .handle{fill-opacity:0}.timeline .embedded-chart{opacity:.6}\n"] }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { view: [{ type: Input }], results: [{ type: Input }], scheme: [{ type: Input }], customColors: [{ type: Input }], legend: [{ type: Input }], autoScale: [{ type: Input }], scaleType: [{ type: Input }], height: [{ type: Input }], select: [{ type: Output }], onDomainChange: [{ type: Output }] } }); class AdvancedLegendComponent { constructor() { this.label = 'Total'; this.animations = true; this.select = new EventEmitter(); this.activate = new EventEmitter(); this.deactivate = new EventEmitter(); this.legendItems = []; this.labelFormatting = label => label; this.percentageFormatting = percentage => percentage; this.defaultValueFormatting = value => value.toLocaleString(); } ngOnChanges(changes) { this.update(); } getTotal() { return this.data.map(d => Number(d.value)).reduce((sum, d) => sum + d, 0); } update() { this.total = this.getTotal(); this.roundedTotal = this.total; this.legendItems = this.getLegendItems(); } getLegendItems() { return this.data.map(d => { const label = formatLabel(d.name); const value = d.value; const color = this.colors.getColor(label); const percentage = this.total > 0 ? (value / this.total) * 100 : 0; const formattedLabel = typeof this.labelFormatting === 'function' ? this.labelFormatting(label) : label; return { _value: value, data: d, value, color, label: formattedLabel, displayLabel: trimLabel(formattedLabel, 20), origialLabel: d.name, percentage: this.percentageFormatting ? this.percentageFormatting(percentage) : percentage.toLocaleString() }; }); } trackBy(index, item) { return item.label; } } AdvancedLegendComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: AdvancedLegendComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); AdvancedLegendComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: AdvancedLegendComponent, selector: "ngx-charts-advanced-legend", inputs: { width: "width", data: "data", colors: "colors", label: "label", animations: "animations", valueFormatting: "valueFormatting", labelFormatting: "labelFormatting", percentageFormatting: "percentageFormatting" }, outputs: { select: "select", activate: "activate", deactivate: "deactivate" }, usesOnChanges: true, ngImport: i0, template: `
{{ valueFormatting ? valueFormatting(roundedTotal) : defaultValueFormatting(roundedTotal) }}
{{ label }}
{{ valueFormatting ? valueFormatting(legendItem.value) : defaultValueFormatting(legendItem.value) }}
{{ legendItem.displayLabel }}
{{ legendItem.percentage.toLocaleString() }}%
`, isInline: true, styles: [".advanced-pie-legend{float:left;position:relative;top:50%;transform:translateY(-50%)}.advanced-pie-legend .total-value{font-size:36px}.advanced-pie-legend .total-label{font-size:24px;margin-bottom:19px}.advanced-pie-legend .legend-items-container{width:100%}.advanced-pie-legend .legend-items-container .legend-items{white-space:nowrap;overflow:auto}.advanced-pie-legend .legend-items-container .legend-items .legend-item{margin-right:20px;display:inline-block;cursor:pointer}.advanced-pie-legend .legend-items-container .legend-items .legend-item:focus{outline:none}.advanced-pie-legend .legend-items-container .legend-items .legend-item:hover{color:#000;transition:.2s}.advanced-pie-legend .legend-items-container .legend-items .legend-item .item-value{font-size:24px;margin-top:-6px;margin-left:11px}.advanced-pie-legend .legend-items-container .legend-items .legend-item .item-label{font-size:14px;opacity:.7;margin-left:11px;margin-top:-6px}.advanced-pie-legend .legend-items-container .legend-items .legend-item .item-percent{font-size:24px;opacity:.7;margin-left:11px}.advanced-pie-legend .legend-items-container .legend-items .legend-item .item-color{border-left:4px solid;width:4px;height:42px;float:left;margin-right:7px}\n"], components: [{ type: CountUpDirective, selector: "[ngx-charts-count-up]", inputs: ["countDuration", "countPrefix", "countSuffix", "valueFormatting", "countDecimals", "countTo", "countFrom"], outputs: ["countChange", "countFinish"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: AdvancedLegendComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-charts-advanced-legend', template: `
{{ valueFormatting ? valueFormatting(roundedTotal) : defaultValueFormatting(roundedTotal) }}
{{ label }}
{{ valueFormatting ? valueFormatting(legendItem.value) : defaultValueFormatting(legendItem.value) }}
{{ legendItem.displayLabel }}
{{ legendItem.percentage.toLocaleString() }}%
`, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".advanced-pie-legend{float:left;position:relative;top:50%;transform:translateY(-50%)}.advanced-pie-legend .total-value{font-size:36px}.advanced-pie-legend .total-label{font-size:24px;margin-bottom:19px}.advanced-pie-legend .legend-items-container{width:100%}.advanced-pie-legend .legend-items-container .legend-items{white-space:nowrap;overflow:auto}.advanced-pie-legend .legend-items-container .legend-items .legend-item{margin-right:20px;display:inline-block;cursor:pointer}.advanced-pie-legend .legend-items-container .legend-items .legend-item:focus{outline:none}.advanced-pie-legend .legend-items-container .legend-items .legend-item:hover{color:#000;transition:.2s}.advanced-pie-legend .legend-items-container .legend-items .legend-item .item-value{font-size:24px;margin-top:-6px;margin-left:11px}.advanced-pie-legend .legend-items-container .legend-items .legend-item .item-label{font-size:14px;opacity:.7;margin-left:11px;margin-top:-6px}.advanced-pie-legend .legend-items-container .legend-items .legend-item .item-percent{font-size:24px;opacity:.7;margin-left:11px}.advanced-pie-legend .legend-items-container .legend-items .legend-item .item-color{border-left:4px solid;width:4px;height:42px;float:left;margin-right:7px}\n"] }] }], propDecorators: { width: [{ type: Input }], data: [{ type: Input }], colors: [{ type: Input }], label: [{ type: Input }], animations: [{ type: Input }], select: [{ type: Output }], activate: [{ type: Output }], deactivate: [{ type: Output }], valueFormatting: [{ type: Input }], labelFormatting: [{ type: Input }], percentageFormatting: [{ type: Input }] } }); const COMPONENTS = [ AreaComponent, BaseChartComponent, CountUpDirective, TooltipArea, ChartComponent, LegendComponent, LegendEntryComponent, ScaleLegendComponent, CircleComponent, CircleSeriesComponent, GridPanelComponent, GridPanelSeriesComponent, SvgLinearGradientComponent, SvgRadialGradientComponent, Timeline, AdvancedLegendComponent ]; class ChartCommonModule { } ChartCommonModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: ChartCommonModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); ChartCommonModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: ChartCommonModule, declarations: [AreaComponent, BaseChartComponent, CountUpDirective, TooltipArea, ChartComponent, LegendComponent, LegendEntryComponent, ScaleLegendComponent, CircleComponent, CircleSeriesComponent, GridPanelComponent, GridPanelSeriesComponent, SvgLinearGradientComponent, SvgRadialGradientComponent, Timeline, AdvancedLegendComponent, VisibilityObserver], imports: [CommonModule, AxesModule, TooltipModule], exports: [CommonModule, AxesModule, TooltipModule, AreaComponent, BaseChartComponent, CountUpDirective, TooltipArea, ChartComponent, LegendComponent, LegendEntryComponent, ScaleLegendComponent, CircleComponent, CircleSeriesComponent, GridPanelComponent, GridPanelSeriesComponent, SvgLinearGradientComponent, SvgRadialGradientComponent, Timeline, AdvancedLegendComponent, VisibilityObserver] }); ChartCommonModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: ChartCommonModule, imports: [[CommonModule, AxesModule, TooltipModule], CommonModule, AxesModule, TooltipModule] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: ChartCommonModule, decorators: [{ type: NgModule, args: [{ imports: [CommonModule, AxesModule, TooltipModule], declarations: [...COMPONENTS, VisibilityObserver], exports: [CommonModule, AxesModule, TooltipModule, ...COMPONENTS, VisibilityObserver] }] }] }); function calculateViewDimensions({ width, height, margins, showXAxis = false, showYAxis = false, xAxisHeight = 0, yAxisWidth = 0, showXLabel = false, showYLabel = false, showLegend = false, legendType = ScaleType.Ordinal, legendPosition = LegendPosition.Right, columns = 12 }) { let xOffset = margins[3]; let chartWidth = width; let chartHeight = height - margins[0] - margins[2]; if (showLegend && legendPosition === LegendPosition.Right) { if (legendType === ScaleType.Ordinal) { columns -= 2; } else { columns -= 1; } } chartWidth = (chartWidth * columns) / 12; chartWidth = chartWidth - margins[1] - margins[3]; if (showXAxis) { chartHeight -= 5; chartHeight -= xAxisHeight; if (showXLabel) { // text height + spacing between axis label and tick labels const offset = 25 + 5; chartHeight -= offset; } } if (showYAxis) { chartWidth -= 5; chartWidth -= yAxisWidth; xOffset += yAxisWidth; xOffset += 10; if (showYLabel) { // text height + spacing between axis label and tick labels const offset = 25 + 5; chartWidth -= offset; xOffset += offset; } } chartWidth = Math.max(0, chartWidth); chartHeight = Math.max(0, chartHeight); return { width: Math.floor(chartWidth), height: Math.floor(chartHeight), xOffset: Math.floor(xOffset) }; } const colorSets = [ { name: 'vivid', selectable: true, group: ScaleType.Ordinal, domain: [ '#647c8a', '#3f51b5', '#2196f3', '#00b862', '#afdf0a', '#a7b61a', '#f3e562', '#ff9800', '#ff5722', '#ff4514' ] }, { name: 'natural', selectable: true, group: ScaleType.Ordinal, domain: [ '#bf9d76', '#e99450', '#d89f59', '#f2dfa7', '#a5d7c6', '#7794b1', '#afafaf', '#707160', '#ba9383', '#d9d5c3' ] }, { name: 'cool', selectable: true, group: ScaleType.Ordinal, domain: [ '#a8385d', '#7aa3e5', '#a27ea8', '#aae3f5', '#adcded', '#a95963', '#8796c0', '#7ed3ed', '#50abcc', '#ad6886' ] }, { name: 'fire', selectable: true, group: ScaleType.Ordinal, domain: ['#ff3d00', '#bf360c', '#ff8f00', '#ff6f00', '#ff5722', '#e65100', '#ffca28', '#ffab00'] }, { name: 'solar', selectable: true, group: ScaleType.Linear, domain: [ '#fff8e1', '#ffecb3', '#ffe082', '#ffd54f', '#ffca28', '#ffc107', '#ffb300', '#ffa000', '#ff8f00', '#ff6f00' ] }, { name: 'air', selectable: true, group: ScaleType.Linear, domain: [ '#e1f5fe', '#b3e5fc', '#81d4fa', '#4fc3f7', '#29b6f6', '#03a9f4', '#039be5', '#0288d1', '#0277bd', '#01579b' ] }, { name: 'aqua', selectable: true, group: ScaleType.Linear, domain: [ '#e0f7fa', '#b2ebf2', '#80deea', '#4dd0e1', '#26c6da', '#00bcd4', '#00acc1', '#0097a7', '#00838f', '#006064' ] }, { name: 'flame', selectable: false, group: ScaleType.Ordinal, domain: [ '#A10A28', '#D3342D', '#EF6D49', '#FAAD67', '#FDDE90', '#DBED91', '#A9D770', '#6CBA67', '#2C9653', '#146738' ] }, { name: 'ocean', selectable: false, group: ScaleType.Ordinal, domain: [ '#1D68FB', '#33C0FC', '#4AFFFE', '#AFFFFF', '#FFFC63', '#FDBD2D', '#FC8A25', '#FA4F1E', '#FA141B', '#BA38D1' ] }, { name: 'forest', selectable: false, group: ScaleType.Ordinal, domain: [ '#55C22D', '#C1F33D', '#3CC099', '#AFFFFF', '#8CFC9D', '#76CFFA', '#BA60FB', '#EE6490', '#C42A1C', '#FC9F32' ] }, { name: 'horizon', selectable: false, group: ScaleType.Ordinal, domain: [ '#2597FB', '#65EBFD', '#99FDD0', '#FCEE4B', '#FEFCFA', '#FDD6E3', '#FCB1A8', '#EF6F7B', '#CB96E8', '#EFDEE0' ] }, { name: 'neons', selectable: false, group: ScaleType.Ordinal, domain: [ '#FF3333', '#FF33FF', '#CC33FF', '#0000FF', '#33CCFF', '#33FFFF', '#33FF66', '#CCFF33', '#FFCC00', '#FF6600' ] }, { name: 'picnic', selectable: false, group: ScaleType.Ordinal, domain: [ '#FAC51D', '#66BD6D', '#FAA026', '#29BB9C', '#E96B56', '#55ACD2', '#B7332F', '#2C83C9', '#9166B8', '#92E7E8' ] }, { name: 'night', selectable: false, group: ScaleType.Ordinal, domain: [ '#2B1B5A', '#501356', '#183356', '#28203F', '#391B3C', '#1E2B3C', '#120634', '#2D0432', '#051932', '#453080', '#75267D', '#2C507D', '#4B3880', '#752F7D', '#35547D' ] }, { name: 'nightLights', selectable: false, group: ScaleType.Ordinal, domain: [ '#4e31a5', '#9c25a7', '#3065ab', '#57468b', '#904497', '#46648b', '#32118d', '#a00fb3', '#1052a2', '#6e51bd', '#b63cc3', '#6c97cb', '#8671c1', '#b455be', '#7496c3' ] } ]; class ColorHelper { constructor(scheme, type, domain, customColors) { if (typeof scheme === 'string') { scheme = colorSets.find(cs => { return cs.name === scheme; }); } this.colorDomain = scheme.domain; this.scaleType = type; this.domain = domain; this.customColors = customColors; this.scale = this.generateColorScheme(scheme, type, this.domain); } generateColorScheme(scheme, type, domain) { if (typeof scheme === 'string') { scheme = colorSets.find(cs => { return cs.name === scheme; }); } let colorScale; switch (type) { case ScaleType.Quantile: colorScale = scaleQuantile() .range(scheme.domain) .domain(domain); break; case ScaleType.Ordinal: colorScale = scaleOrdinal() .range(scheme.domain) .domain(domain); break; case ScaleType.Linear: { const colorDomain = [...scheme.domain]; if (colorDomain.length === 1) { colorDomain.push(colorDomain[0]); this.colorDomain = colorDomain; } const points = range(0, 1, 1.0 / colorDomain.length); colorScale = scaleLinear() .range(colorDomain) .domain(points); } break; default: break; } return colorScale; } getColor(value) { if (value === undefined || value === null) { throw new Error('Value can not be null'); } if (this.scaleType === ScaleType.Linear) { const valueScale = scaleLinear() .domain(this.domain) .range([0, 1]); return this.scale(valueScale(value)); } else { if (typeof this.customColors === 'function') { return this.customColors(value); } const formattedValue = value.toString(); let found; // todo type customColors if (this.customColors && this.customColors.length > 0) { found = this.customColors.find(mapping => { return mapping.name.toLowerCase() === formattedValue.toLowerCase(); }); } if (found) { return found.value; } else { return this.scale(value); } } } getLinearGradientStops(value, start) { if (start === undefined) { start = this.domain[0]; } const valueScale = scaleLinear() .domain(this.domain) .range([0, 1]); const colorValueScale = scaleBand().domain(this.colorDomain).range([0, 1]); const endColor = this.getColor(value); // generate the stops const startVal = valueScale(start); const startColor = this.getColor(start); const endVal = valueScale(value); let i = 1; let currentVal = startVal; const stops = []; stops.push({ color: startColor, offset: startVal, originalOffset: startVal, opacity: 1 }); while (currentVal < endVal && i < this.colorDomain.length) { const color = this.colorDomain[i]; const offset = colorValueScale(color); if (offset <= startVal) { i++; continue; } if (offset.toFixed(4) >= (endVal - colorValueScale.bandwidth()).toFixed(4)) { break; } stops.push({ color, offset, opacity: 1 }); currentVal = offset; i++; } if (stops[stops.length - 1].offset < 100) { stops.push({ color: endColor, offset: endVal, opacity: 1 }); } if (endVal === startVal) { stops[0].offset = 0; stops[1].offset = 100; } else { // normalize the offsets into percentages if (stops[stops.length - 1].offset !== 100) { for (const s of stops) { s.offset = ((s.offset - startVal) / (endVal - startVal)) * 100; } } } return stops; } } /** * Based on the data, return an array with unique values. * * @export * @returns array */ function getUniqueXDomainValues(results) { const valueSet = new Set(); for (const result of results) { for (const d of result.series) { valueSet.add(d.name); } } return Array.from(valueSet); } /** * Get the scaleType of enumerable of values. * @returns 'time', 'linear' or 'ordinal' */ function getScaleType(values, checkDateType = true) { if (checkDateType) { const allDates = values.every(value => value instanceof Date); if (allDates) { return ScaleType.Time; } } const allNumbers = values.every(value => typeof value === 'number'); if (allNumbers) { return ScaleType.Linear; } return ScaleType.Ordinal; } function getXDomainArray(values, xScaleMin, xScaleMax) { const scaleType = getScaleType(values); let xSet = []; let domain = []; if (scaleType === ScaleType.Linear) { values = values.map(v => Number(v)); } let min; let max; if (scaleType === ScaleType.Time || scaleType === ScaleType.Linear) { const mappedValues = values.map(v => Number(v)); min = xScaleMin ? xScaleMin : Math.min(...mappedValues); max = xScaleMax ? xScaleMax : Math.max(...mappedValues); } if (scaleType === ScaleType.Time) { domain = [new Date(min), new Date(max)]; xSet = [...values].sort((a, b) => { const aDate = a.getTime(); const bDate = b.getTime(); if (aDate > bDate) return 1; if (bDate > aDate) return -1; return 0; }); } else if (scaleType === ScaleType.Linear) { domain = [min, max]; // Use compare function to sort numbers numerically xSet = [...values].sort((a, b) => a - b); } else { domain = values; xSet = values; } return { domain, xSet, scaleType }; } function sortLinear(data, property, direction = 'asc') { return data.sort((a, b) => { if (direction === 'asc') { return a[property] - b[property]; } else { return b[property] - a[property]; } }); } function sortByDomain(data, property, direction = 'asc', domain) { return data.sort((a, b) => { const aVal = a[property]; const bVal = b[property]; const aIdx = domain.indexOf(aVal); const bIdx = domain.indexOf(bVal); if (direction === 'asc') { return aIdx - bIdx; } else { return bIdx - aIdx; } }); } function sortByTime(data, property, direction = 'asc') { return data.sort((a, b) => { const aDate = a[property].getTime(); const bDate = b[property].getTime(); if (direction === 'asc') { if (aDate > bDate) return 1; if (bDate > aDate) return -1; return 0; } else { if (aDate > bDate) return -1; if (bDate > aDate) return 1; return 0; } }); } class AreaSeriesComponent { constructor() { this.baseValue = 'auto'; this.stacked = false; this.normalized = false; this.animations = true; this.select = new EventEmitter(); } ngOnChanges(changes) { this.update(); } update() { this.updateGradient(); let currentArea; let startingArea; const xProperty = d => { const label = d.name; return this.xScale(label); }; if (this.stacked || this.normalized) { currentArea = area() .x(xProperty) .y0((d, i) => this.yScale(d.d0)) .y1((d, i) => this.yScale(d.d1)); startingArea = area() .x(xProperty) .y0(d => this.yScale.range()[0]) .y1(d => this.yScale.range()[0]); } else { currentArea = area() .x(xProperty) .y0(() => (this.baseValue === 'auto' ? this.yScale.range()[0] : this.yScale(this.baseValue))) .y1(d => this.yScale(d.value)); startingArea = area() .x(xProperty) .y0(d => (this.baseValue === 'auto' ? this.yScale.range()[0] : this.yScale(this.baseValue))) .y1(d => (this.baseValue === 'auto' ? this.yScale.range()[0] : this.yScale(this.baseValue))); } currentArea.curve(this.curve); startingArea.curve(this.curve); this.opacity = 0.8; let data = this.data.series; if (this.scaleType === ScaleType.Linear) { data = sortLinear(data, 'name'); } else if (this.scaleType === ScaleType.Time) { data = sortByTime(data, 'name'); } else { data = sortByDomain(data, 'name', 'asc', this.xScale.domain()); } this.path = currentArea(data); this.startingPath = startingArea(data); } updateGradient() { if (this.colors.scaleType === ScaleType.Linear) { this.hasGradient = true; if (this.stacked || this.normalized) { const d0values = this.data.series.map(d => d.d0); const d1values = this.data.series.map(d => d.d1); const max = Math.max(...d1values); const min = Math.min(...d0values); this.gradientStops = this.colors.getLinearGradientStops(max, min); } else { const values = this.data.series.map(d => d.value); const max = Math.max(...values); this.gradientStops = this.colors.getLinearGradientStops(max); } } else { this.hasGradient = false; this.gradientStops = undefined; } } isActive(entry) { if (!this.activeEntries) return false; const item = this.activeEntries.find(d => { return entry.name === d.name; }); return item !== undefined; } isInactive(entry) { if (!this.activeEntries || this.activeEntries.length === 0) return false; const item = this.activeEntries.find(d => { return entry.name === d.name; }); return item === undefined; } } AreaSeriesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: AreaSeriesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); AreaSeriesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: AreaSeriesComponent, selector: "g[ngx-charts-area-series]", inputs: { data: "data", xScale: "xScale", yScale: "yScale", baseValue: "baseValue", colors: "colors", scaleType: "scaleType", stacked: "stacked", normalized: "normalized", gradient: "gradient", curve: "curve", activeEntries: "activeEntries", animations: "animations" }, outputs: { select: "select" }, usesOnChanges: true, ngImport: i0, template: ` `, isInline: true, components: [{ type: AreaComponent, selector: "g[ngx-charts-area]", inputs: ["data", "path", "startingPath", "fill", "opacity", "startOpacity", "endOpacity", "gradient", "stops", "animations"], outputs: ["select"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: AreaSeriesComponent, decorators: [{ type: Component, args: [{ selector: 'g[ngx-charts-area-series]', template: ` `, changeDetection: ChangeDetectionStrategy.OnPush }] }], propDecorators: { data: [{ type: Input }], xScale: [{ type: Input }], yScale: [{ type: Input }], baseValue: [{ type: Input }], colors: [{ type: Input }], scaleType: [{ type: Input }], stacked: [{ type: Input }], normalized: [{ type: Input }], gradient: [{ type: Input }], curve: [{ type: Input }], activeEntries: [{ type: Input }], animations: [{ type: Input }], select: [{ type: Output }] } }); class AreaChartComponent extends BaseChartComponent { constructor() { super(...arguments); this.legend = false; this.legendTitle = 'Legend'; this.legendPosition = LegendPosition.Right; this.xAxis = false; this.yAxis = false; this.baseValue = 'auto'; this.autoScale = false; this.timeline = false; this.showGridLines = true; this.curve = curveLinear; this.activeEntries = []; this.trimXAxisTicks = true; this.trimYAxisTicks = true; this.rotateXAxisTicks = true; this.maxXAxisTickLength = 16; this.maxYAxisTickLength = 16; this.roundDomains = false; this.tooltipDisabled = false; this.wrapTicks = false; this.activate = new EventEmitter(); this.deactivate = new EventEmitter(); this.margin = [10, 20, 10, 20]; this.xAxisHeight = 0; this.yAxisWidth = 0; this.timelineHeight = 50; this.timelinePadding = 10; this.trackBy = (index, item) => { return item.name; }; } update() { super.update(); this.dims = calculateViewDimensions({ width: this.width, height: this.height, margins: this.margin, showXAxis: this.xAxis, showYAxis: this.yAxis, xAxisHeight: this.xAxisHeight, yAxisWidth: this.yAxisWidth, showXLabel: this.showXAxisLabel, showYLabel: this.showYAxisLabel, showLegend: this.legend, legendType: this.schemeType, legendPosition: this.legendPosition }); if (this.timeline) { this.dims.height -= this.timelineHeight + this.margin[2] + this.timelinePadding; } this.xDomain = this.getXDomain(); if (this.filteredDomain) { this.xDomain = this.filteredDomain; } this.yDomain = this.getYDomain(); this.seriesDomain = this.getSeriesDomain(); this.xScale = this.getXScale(this.xDomain, this.dims.width); this.yScale = this.getYScale(this.yDomain, this.dims.height); this.updateTimeline(); this.setColors(); this.legendOptions = this.getLegendOptions(); this.transform = `translate(${this.dims.xOffset}, ${this.margin[0]})`; this.clipPathId = 'clip' + id().toString(); this.clipPath = `url(#${this.clipPathId})`; } updateTimeline() { if (this.timeline) { this.timelineWidth = this.dims.width; this.timelineXDomain = this.getXDomain(); this.timelineXScale = this.getXScale(this.timelineXDomain, this.timelineWidth); this.timelineYScale = this.getYScale(this.yDomain, this.timelineHeight); this.timelineTransform = `translate(${this.dims.xOffset}, ${-this.margin[2]})`; } } getXDomain() { let values = getUniqueXDomainValues(this.results); this.scaleType = getScaleType(values); let domain = []; if (this.scaleType === ScaleType.Linear) { values = values.map(v => Number(v)); } let min; let max; if (this.scaleType === ScaleType.Time || this.scaleType === ScaleType.Linear) { min = this.xScaleMin ? this.xScaleMin : Math.min(...values); max = this.xScaleMax ? this.xScaleMax : Math.max(...values); } if (this.scaleType === ScaleType.Time) { domain = [new Date(min), new Date(max)]; this.xSet = [...values].sort((a, b) => { const aDate = a.getTime(); const bDate = b.getTime(); if (aDate > bDate) return 1; if (bDate > aDate) return -1; return 0; }); } else if (this.scaleType === ScaleType.Linear) { domain = [min, max]; // Use compare function to sort numbers numerically this.xSet = [...values].sort((a, b) => a - b); } else { domain = values; this.xSet = values; } return domain; } getYDomain() { const domain = []; for (const results of this.results) { for (const d of results.series) { if (!domain.includes(d.value)) { domain.push(d.value); } } } const values = [...domain]; if (!this.autoScale) { values.push(0); } if (this.baseValue !== 'auto') { values.push(this.baseValue); } const min = this.yScaleMin ? this.yScaleMin : Math.min(...values); const max = this.yScaleMax ? this.yScaleMax : Math.max(...values); return [min, max]; } getSeriesDomain() { return this.results.map(d => d.name); } getXScale(domain, width) { let scale; if (this.scaleType === ScaleType.Time) { scale = scaleTime(); } else if (this.scaleType === ScaleType.Linear) { scale = scaleLinear(); } else if (this.scaleType === ScaleType.Ordinal) { scale = scalePoint().padding(0.1); } scale.range([0, width]).domain(domain); return this.roundDomains ? scale.nice() : scale; } getYScale(domain, height) { const scale = scaleLinear().range([height, 0]).domain(domain); return this.roundDomains ? scale.nice() : scale; } getScaleType(values) { let date = true; let num = true; for (const value of values) { if (isDate(value)) { date = false; } if (isNumber(value)) { num = false; } } if (date) { return ScaleType.Time; } if (num) { return ScaleType.Linear; } return ScaleType.Ordinal; } updateDomain(domain) { this.filteredDomain = domain; this.xDomain = this.filteredDomain; this.xScale = this.getXScale(this.xDomain, this.dims.width); } updateHoveredVertical(item) { this.hoveredVertical = item.value; this.deactivateAll(); } hideCircles() { this.hoveredVertical = null; this.deactivateAll(); } onClick(data, series) { if (series) { data.series = series.name; } this.select.emit(data); } setColors() { let domain; if (this.schemeType === ScaleType.Ordinal) { domain = this.seriesDomain; } else { domain = this.yDomain; } this.colors = new ColorHelper(this.scheme, this.schemeType, domain, this.customColors); } getLegendOptions() { const opts = { scaleType: this.schemeType, colors: undefined, domain: [], title: undefined, position: this.legendPosition }; if (opts.scaleType === ScaleType.Ordinal) { opts.domain = this.seriesDomain; opts.colors = this.colors; opts.title = this.legendTitle; } else { opts.domain = this.yDomain; opts.colors = this.colors.scale; } return opts; } updateYAxisWidth({ width }) { this.yAxisWidth = width; this.update(); } updateXAxisHeight({ height }) { this.xAxisHeight = height; this.update(); } onActivate(item) { const idx = this.activeEntries.findIndex(d => { return d.name === item.name && d.value === item.value; }); if (idx > -1) { return; } this.activeEntries = [item, ...this.activeEntries]; this.activate.emit({ value: item, entries: this.activeEntries }); } onDeactivate(item) { const idx = this.activeEntries.findIndex(d => { return d.name === item.name && d.value === item.value; }); this.activeEntries.splice(idx, 1); this.activeEntries = [...this.activeEntries]; this.deactivate.emit({ value: item, entries: this.activeEntries }); } deactivateAll() { this.activeEntries = [...this.activeEntries]; for (const entry of this.activeEntries) { this.deactivate.emit({ value: entry, entries: [] }); } this.activeEntries = []; } } AreaChartComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: AreaChartComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); AreaChartComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: AreaChartComponent, selector: "ngx-charts-area-chart", inputs: { legend: "legend", legendTitle: "legendTitle", legendPosition: "legendPosition", xAxis: "xAxis", yAxis: "yAxis", baseValue: "baseValue", autoScale: "autoScale", showXAxisLabel: "showXAxisLabel", showYAxisLabel: "showYAxisLabel", xAxisLabel: "xAxisLabel", yAxisLabel: "yAxisLabel", timeline: "timeline", gradient: "gradient", showGridLines: "showGridLines", curve: "curve", activeEntries: "activeEntries", schemeType: "schemeType", trimXAxisTicks: "trimXAxisTicks", trimYAxisTicks: "trimYAxisTicks", rotateXAxisTicks: "rotateXAxisTicks", maxXAxisTickLength: "maxXAxisTickLength", maxYAxisTickLength: "maxYAxisTickLength", xAxisTickFormatting: "xAxisTickFormatting", yAxisTickFormatting: "yAxisTickFormatting", xAxisTicks: "xAxisTicks", yAxisTicks: "yAxisTicks", roundDomains: "roundDomains", tooltipDisabled: "tooltipDisabled", xScaleMin: "xScaleMin", xScaleMax: "xScaleMax", yScaleMin: "yScaleMin", yScaleMax: "yScaleMax", wrapTicks: "wrapTicks" }, outputs: { activate: "activate", deactivate: "deactivate" }, host: { listeners: { "mouseleave": "hideCircles()" } }, queries: [{ propertyName: "tooltipTemplate", first: true, predicate: ["tooltipTemplate"], descendants: true }, { propertyName: "seriesTooltipTemplate", first: true, predicate: ["seriesTooltipTemplate"], descendants: true }], usesInheritance: true, ngImport: i0, template: ` `, isInline: true, styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n"], components: [{ type: ChartComponent, selector: "ngx-charts-chart", inputs: ["view", "showLegend", "legendOptions", "legendType", "activeEntries", "animations"], outputs: ["legendLabelClick", "legendLabelActivate", "legendLabelDeactivate"] }, { type: XAxisComponent, selector: "g[ngx-charts-x-axis]", inputs: ["xScale", "dims", "trimTicks", "rotateTicks", "maxTickLength", "tickFormatting", "showGridLines", "showLabel", "labelText", "ticks", "xAxisTickCount", "xOrient", "xAxisOffset", "wrapTicks"], outputs: ["dimensionsChanged"] }, { type: YAxisComponent, selector: "g[ngx-charts-y-axis]", inputs: ["yScale", "dims", "trimTicks", "maxTickLength", "tickFormatting", "ticks", "showGridLines", "showLabel", "labelText", "yAxisTickCount", "yOrient", "referenceLines", "showRefLines", "showRefLabels", "yAxisOffset", "wrapTicks"], outputs: ["dimensionsChanged"] }, { type: AreaSeriesComponent, selector: "g[ngx-charts-area-series]", inputs: ["data", "xScale", "yScale", "baseValue", "colors", "scaleType", "stacked", "normalized", "gradient", "curve", "activeEntries", "animations"], outputs: ["select"] }, { type: TooltipArea, selector: "g[ngx-charts-tooltip-area]", inputs: ["dims", "xSet", "xScale", "yScale", "results", "colors", "showPercentage", "tooltipDisabled", "tooltipTemplate"], outputs: ["hover"] }, { type: CircleSeriesComponent, selector: "g[ngx-charts-circle-series]", inputs: ["data", "type", "xScale", "yScale", "colors", "scaleType", "visibleValue", "activeEntries", "tooltipDisabled", "tooltipTemplate"], outputs: ["select", "activate", "deactivate"] }, { type: Timeline, selector: "g[ngx-charts-timeline]", inputs: ["view", "results", "scheme", "customColors", "legend", "autoScale", "scaleType", "height"], outputs: ["select", "onDomainChange"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: AreaChartComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-charts-area-chart', template: ` `, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n"] }] }], propDecorators: { legend: [{ type: Input }], legendTitle: [{ type: Input }], legendPosition: [{ type: Input }], xAxis: [{ type: Input }], yAxis: [{ type: Input }], baseValue: [{ type: Input }], autoScale: [{ type: Input }], showXAxisLabel: [{ type: Input }], showYAxisLabel: [{ type: Input }], xAxisLabel: [{ type: Input }], yAxisLabel: [{ type: Input }], timeline: [{ type: Input }], gradient: [{ type: Input }], showGridLines: [{ type: Input }], curve: [{ type: Input }], activeEntries: [{ type: Input }], schemeType: [{ type: Input }], trimXAxisTicks: [{ type: Input }], trimYAxisTicks: [{ type: Input }], rotateXAxisTicks: [{ type: Input }], maxXAxisTickLength: [{ type: Input }], maxYAxisTickLength: [{ type: Input }], xAxisTickFormatting: [{ type: Input }], yAxisTickFormatting: [{ type: Input }], xAxisTicks: [{ type: Input }], yAxisTicks: [{ type: Input }], roundDomains: [{ type: Input }], tooltipDisabled: [{ type: Input }], xScaleMin: [{ type: Input }], xScaleMax: [{ type: Input }], yScaleMin: [{ type: Input }], yScaleMax: [{ type: Input }], wrapTicks: [{ type: Input }], activate: [{ type: Output }], deactivate: [{ type: Output }], tooltipTemplate: [{ type: ContentChild, args: ['tooltipTemplate'] }], seriesTooltipTemplate: [{ type: ContentChild, args: ['seriesTooltipTemplate'] }], hideCircles: [{ type: HostListener, args: ['mouseleave'] }] } }); class AreaChartNormalizedComponent extends BaseChartComponent { constructor() { super(...arguments); this.legend = false; this.legendTitle = 'Legend'; this.legendPosition = LegendPosition.Right; this.showXAxisLabel = false; this.showYAxisLabel = false; this.showGridLines = true; this.curve = curveLinear; this.activeEntries = []; this.trimXAxisTicks = true; this.trimYAxisTicks = true; this.rotateXAxisTicks = true; this.maxXAxisTickLength = 16; this.maxYAxisTickLength = 16; this.roundDomains = false; this.tooltipDisabled = false; this.wrapTicks = false; this.activate = new EventEmitter(); this.deactivate = new EventEmitter(); this.yDomain = [0, 100]; this.margin = [10, 20, 10, 20]; this.xAxisHeight = 0; this.yAxisWidth = 0; this.seriesType = SeriesType; this.timelineHeight = 50; this.timelinePadding = 10; this.trackBy = (index, item) => { return item.name; }; } update() { super.update(); this.dims = calculateViewDimensions({ width: this.width, height: this.height, margins: this.margin, showXAxis: this.xAxis, showYAxis: this.yAxis, xAxisHeight: this.xAxisHeight, yAxisWidth: this.yAxisWidth, showXLabel: this.showXAxisLabel, showYLabel: this.showYAxisLabel, showLegend: this.legend, legendType: this.schemeType, legendPosition: this.legendPosition }); if (this.timeline) { this.dims.height -= this.timelineHeight + this.margin[2] + this.timelinePadding; } this.xDomain = this.getXDomain(); if (this.filteredDomain) { this.xDomain = this.filteredDomain; } this.seriesDomain = this.getSeriesDomain(); this.xScale = this.getXScale(this.xDomain, this.dims.width); this.yScale = this.getYScale(this.yDomain, this.dims.height); for (let i = 0; i < this.xSet.length; i++) { const val = this.xSet[i]; let d0 = 0; let total = 0; for (const group of this.results) { const d = group.series.find(item => { let a = item.name; let b = val; if (this.scaleType === ScaleType.Time) { a = a.valueOf(); b = b.valueOf(); } return a === b; }); if (d) { total += d.value; } } for (const group of this.results) { let d = group.series.find(item => { let a = item.name; let b = val; if (this.scaleType === ScaleType.Time) { a = a.valueOf(); b = b.valueOf(); } return a === b; }); if (d) { d.d0 = d0; d.d1 = d0 + d.value; d0 += d.value; } else { d = { name: val, value: 0, d0, d1: d0 }; group.series.push(d); } if (total > 0) { d.d0 = (d.d0 * 100) / total; d.d1 = (d.d1 * 100) / total; } else { d.d0 = 0; d.d1 = 0; } } } this.updateTimeline(); this.setColors(); this.legendOptions = this.getLegendOptions(); this.transform = `translate(${this.dims.xOffset} , ${this.margin[0]})`; this.clipPathId = 'clip' + id().toString(); this.clipPath = `url(#${this.clipPathId})`; } updateTimeline() { if (this.timeline) { this.timelineWidth = this.dims.width; this.timelineXDomain = this.getXDomain(); this.timelineXScale = this.getXScale(this.timelineXDomain, this.timelineWidth); this.timelineYScale = this.getYScale(this.yDomain, this.timelineHeight); this.timelineTransform = `translate(${this.dims.xOffset}, ${-this.margin[2]})`; } } getXDomain() { let values = getUniqueXDomainValues(this.results); this.scaleType = getScaleType(values); let domain = []; if (this.scaleType === ScaleType.Time) { const min = Math.min(...values); const max = Math.max(...values); domain = [new Date(min), new Date(max)]; this.xSet = [...values].sort((a, b) => { const aDate = a.getTime(); const bDate = b.getTime(); if (aDate > bDate) return 1; if (bDate > aDate) return -1; return 0; }); } else if (this.scaleType === ScaleType.Linear) { values = values.map(v => Number(v)); const min = Math.min(...values); const max = Math.max(...values); domain = [min, max]; // Use compare function to sort numbers numerically this.xSet = [...values].sort((a, b) => a - b); } else { domain = values; this.xSet = values; } return domain; } getSeriesDomain() { return this.results.map(d => d.name); } getXScale(domain, width) { let scale; if (this.scaleType === ScaleType.Time) { scale = scaleTime(); } else if (this.scaleType === ScaleType.Linear) { scale = scaleLinear(); } else if (this.scaleType === ScaleType.Ordinal) { scale = scalePoint().padding(0.1); } scale.range([0, width]).domain(domain); return this.roundDomains ? scale.nice() : scale; } getYScale(domain, height) { const scale = scaleLinear().range([height, 0]).domain(domain); return this.roundDomains ? scale.nice() : scale; } updateDomain(domain) { this.filteredDomain = domain; this.xDomain = this.filteredDomain; this.xScale = this.getXScale(this.xDomain, this.dims.width); } updateHoveredVertical(item) { this.hoveredVertical = item.value; this.deactivateAll(); } hideCircles() { this.hoveredVertical = null; this.deactivateAll(); } onClick(data, series) { if (series) { data.series = series.name; } this.select.emit(data); } setColors() { let domain; if (this.schemeType === ScaleType.Ordinal) { domain = this.seriesDomain; } else { domain = this.yDomain; } this.colors = new ColorHelper(this.scheme, this.schemeType, domain, this.customColors); } getLegendOptions() { const opts = { scaleType: this.schemeType, colors: undefined, domain: [], title: undefined, position: this.legendPosition }; if (opts.scaleType === ScaleType.Ordinal) { opts.domain = this.seriesDomain; opts.colors = this.colors; opts.title = this.legendTitle; } else { opts.domain = this.yDomain; opts.colors = this.colors.scale; } return opts; } updateYAxisWidth({ width }) { this.yAxisWidth = width; this.update(); } updateXAxisHeight({ height }) { this.xAxisHeight = height; this.update(); } onActivate(item) { const idx = this.activeEntries.findIndex(d => { return d.name === item.name && d.value === item.value; }); if (idx > -1) { return; } this.activeEntries = [item, ...this.activeEntries]; this.activate.emit({ value: item, entries: this.activeEntries }); } onDeactivate(item) { const idx = this.activeEntries.findIndex(d => { return d.name === item.name && d.value === item.value; }); this.activeEntries.splice(idx, 1); this.activeEntries = [...this.activeEntries]; this.deactivate.emit({ value: item, entries: this.activeEntries }); } deactivateAll() { this.activeEntries = [...this.activeEntries]; for (const entry of this.activeEntries) { this.deactivate.emit({ value: entry, entries: [] }); } this.activeEntries = []; } } AreaChartNormalizedComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: AreaChartNormalizedComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); AreaChartNormalizedComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: AreaChartNormalizedComponent, selector: "ngx-charts-area-chart-normalized", inputs: { legend: "legend", legendTitle: "legendTitle", legendPosition: "legendPosition", xAxis: "xAxis", yAxis: "yAxis", showXAxisLabel: "showXAxisLabel", showYAxisLabel: "showYAxisLabel", xAxisLabel: "xAxisLabel", yAxisLabel: "yAxisLabel", timeline: "timeline", gradient: "gradient", showGridLines: "showGridLines", curve: "curve", activeEntries: "activeEntries", schemeType: "schemeType", trimXAxisTicks: "trimXAxisTicks", trimYAxisTicks: "trimYAxisTicks", rotateXAxisTicks: "rotateXAxisTicks", maxXAxisTickLength: "maxXAxisTickLength", maxYAxisTickLength: "maxYAxisTickLength", xAxisTickFormatting: "xAxisTickFormatting", yAxisTickFormatting: "yAxisTickFormatting", xAxisTicks: "xAxisTicks", yAxisTicks: "yAxisTicks", roundDomains: "roundDomains", tooltipDisabled: "tooltipDisabled", wrapTicks: "wrapTicks" }, outputs: { activate: "activate", deactivate: "deactivate" }, host: { listeners: { "mouseleave": "hideCircles()" } }, queries: [{ propertyName: "tooltipTemplate", first: true, predicate: ["tooltipTemplate"], descendants: true }, { propertyName: "seriesTooltipTemplate", first: true, predicate: ["seriesTooltipTemplate"], descendants: true }], usesInheritance: true, ngImport: i0, template: ` `, isInline: true, styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n"], components: [{ type: ChartComponent, selector: "ngx-charts-chart", inputs: ["view", "showLegend", "legendOptions", "legendType", "activeEntries", "animations"], outputs: ["legendLabelClick", "legendLabelActivate", "legendLabelDeactivate"] }, { type: XAxisComponent, selector: "g[ngx-charts-x-axis]", inputs: ["xScale", "dims", "trimTicks", "rotateTicks", "maxTickLength", "tickFormatting", "showGridLines", "showLabel", "labelText", "ticks", "xAxisTickCount", "xOrient", "xAxisOffset", "wrapTicks"], outputs: ["dimensionsChanged"] }, { type: YAxisComponent, selector: "g[ngx-charts-y-axis]", inputs: ["yScale", "dims", "trimTicks", "maxTickLength", "tickFormatting", "ticks", "showGridLines", "showLabel", "labelText", "yAxisTickCount", "yOrient", "referenceLines", "showRefLines", "showRefLabels", "yAxisOffset", "wrapTicks"], outputs: ["dimensionsChanged"] }, { type: AreaSeriesComponent, selector: "g[ngx-charts-area-series]", inputs: ["data", "xScale", "yScale", "baseValue", "colors", "scaleType", "stacked", "normalized", "gradient", "curve", "activeEntries", "animations"], outputs: ["select"] }, { type: TooltipArea, selector: "g[ngx-charts-tooltip-area]", inputs: ["dims", "xSet", "xScale", "yScale", "results", "colors", "showPercentage", "tooltipDisabled", "tooltipTemplate"], outputs: ["hover"] }, { type: CircleSeriesComponent, selector: "g[ngx-charts-circle-series]", inputs: ["data", "type", "xScale", "yScale", "colors", "scaleType", "visibleValue", "activeEntries", "tooltipDisabled", "tooltipTemplate"], outputs: ["select", "activate", "deactivate"] }, { type: Timeline, selector: "g[ngx-charts-timeline]", inputs: ["view", "results", "scheme", "customColors", "legend", "autoScale", "scaleType", "height"], outputs: ["select", "onDomainChange"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: AreaChartNormalizedComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-charts-area-chart-normalized', template: ` `, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n"] }] }], propDecorators: { legend: [{ type: Input }], legendTitle: [{ type: Input }], legendPosition: [{ type: Input }], xAxis: [{ type: Input }], yAxis: [{ type: Input }], showXAxisLabel: [{ type: Input }], showYAxisLabel: [{ type: Input }], xAxisLabel: [{ type: Input }], yAxisLabel: [{ type: Input }], timeline: [{ type: Input }], gradient: [{ type: Input }], showGridLines: [{ type: Input }], curve: [{ type: Input }], activeEntries: [{ type: Input }], schemeType: [{ type: Input }], trimXAxisTicks: [{ type: Input }], trimYAxisTicks: [{ type: Input }], rotateXAxisTicks: [{ type: Input }], maxXAxisTickLength: [{ type: Input }], maxYAxisTickLength: [{ type: Input }], xAxisTickFormatting: [{ type: Input }], yAxisTickFormatting: [{ type: Input }], xAxisTicks: [{ type: Input }], yAxisTicks: [{ type: Input }], roundDomains: [{ type: Input }], tooltipDisabled: [{ type: Input }], wrapTicks: [{ type: Input }], activate: [{ type: Output }], deactivate: [{ type: Output }], tooltipTemplate: [{ type: ContentChild, args: ['tooltipTemplate'] }], seriesTooltipTemplate: [{ type: ContentChild, args: ['seriesTooltipTemplate'] }], hideCircles: [{ type: HostListener, args: ['mouseleave'] }] } }); class AreaChartStackedComponent extends BaseChartComponent { constructor() { super(...arguments); this.legend = false; this.legendTitle = 'Legend'; this.legendPosition = LegendPosition.Right; this.xAxis = false; this.yAxis = false; this.timeline = false; this.showGridLines = true; this.curve = curveLinear; this.activeEntries = []; this.trimXAxisTicks = true; this.trimYAxisTicks = true; this.rotateXAxisTicks = true; this.maxXAxisTickLength = 16; this.maxYAxisTickLength = 16; this.roundDomains = false; this.tooltipDisabled = false; this.wrapTicks = false; this.activate = new EventEmitter(); this.deactivate = new EventEmitter(); this.margin = [10, 20, 10, 20]; this.xAxisHeight = 0; this.yAxisWidth = 0; this.timelineHeight = 50; this.timelinePadding = 10; this.seriesType = SeriesType; } update() { super.update(); this.dims = calculateViewDimensions({ width: this.width, height: this.height, margins: this.margin, showXAxis: this.xAxis, showYAxis: this.yAxis, xAxisHeight: this.xAxisHeight, yAxisWidth: this.yAxisWidth, showXLabel: this.showXAxisLabel, showYLabel: this.showYAxisLabel, showLegend: this.legend, legendType: this.schemeType, legendPosition: this.legendPosition }); if (this.timeline) { this.dims.height -= this.timelineHeight + this.margin[2] + this.timelinePadding; } this.xDomain = this.getXDomain(); if (this.filteredDomain) { this.xDomain = this.filteredDomain; } this.yDomain = this.getYDomain(); this.seriesDomain = this.getSeriesDomain(); this.xScale = this.getXScale(this.xDomain, this.dims.width); this.yScale = this.getYScale(this.yDomain, this.dims.height); for (let i = 0; i < this.xSet.length; i++) { const val = this.xSet[i]; let d0 = 0; for (const group of this.results) { let d = group.series.find(item => { let a = item.name; let b = val; if (this.scaleType === ScaleType.Time) { a = a.valueOf(); b = b.valueOf(); } return a === b; }); if (d) { d.d0 = d0; d.d1 = d0 + d.value; d0 += d.value; } else { d = { name: val, value: 0, d0, d1: d0 }; group.series.push(d); } } } this.updateTimeline(); this.setColors(); this.legendOptions = this.getLegendOptions(); this.transform = `translate(${this.dims.xOffset} , ${this.margin[0]})`; this.clipPathId = 'clip' + id().toString(); this.clipPath = `url(#${this.clipPathId})`; } updateTimeline() { if (this.timeline) { this.timelineWidth = this.dims.width; this.timelineXDomain = this.getXDomain(); this.timelineXScale = this.getXScale(this.timelineXDomain, this.timelineWidth); this.timelineYScale = this.getYScale(this.yDomain, this.timelineHeight); this.timelineTransform = `translate(${this.dims.xOffset}, ${-this.margin[2]})`; } } getXDomain() { let values = getUniqueXDomainValues(this.results); this.scaleType = getScaleType(values); let domain = []; if (this.scaleType === ScaleType.Linear) { values = values.map(v => Number(v)); } let min; let max; if (this.scaleType === ScaleType.Time || this.scaleType === ScaleType.Linear) { min = this.xScaleMin ? this.xScaleMin : Math.min(...values); max = this.xScaleMax ? this.xScaleMax : Math.max(...values); } if (this.scaleType === ScaleType.Time) { domain = [new Date(min), new Date(max)]; this.xSet = [...values].sort((a, b) => { const aDate = a.getTime(); const bDate = b.getTime(); if (aDate > bDate) return 1; if (bDate > aDate) return -1; return 0; }); } else if (this.scaleType === ScaleType.Linear) { domain = [min, max]; // Use compare function to sort numbers numerically this.xSet = [...values].sort((a, b) => a - b); } else { domain = values; this.xSet = values; } return domain; } getYDomain() { const domain = []; for (let i = 0; i < this.xSet.length; i++) { const val = this.xSet[i]; let sum = 0; for (const group of this.results) { const d = group.series.find(item => { let a = item.name; let b = val; if (this.scaleType === ScaleType.Time) { a = a.valueOf(); b = b.valueOf(); } return a === b; }); if (d) { sum += d.value; } } domain.push(sum); } const min = this.yScaleMin ? this.yScaleMin : Math.min(0, ...domain); const max = this.yScaleMax ? this.yScaleMax : Math.max(...domain); return [min, max]; } getSeriesDomain() { return this.results.map(d => d.name); } getXScale(domain, width) { let scale; if (this.scaleType === ScaleType.Time) { scale = scaleTime(); } else if (this.scaleType === ScaleType.Linear) { scale = scaleLinear(); } else if (this.scaleType === ScaleType.Ordinal) { scale = scalePoint().padding(0.1); } scale.range([0, width]).domain(domain); return this.roundDomains ? scale.nice() : scale; } getYScale(domain, height) { const scale = scaleLinear().range([height, 0]).domain(domain); return this.roundDomains ? scale.nice() : scale; } updateDomain(domain) { this.filteredDomain = domain; this.xDomain = this.filteredDomain; this.xScale = this.getXScale(this.xDomain, this.dims.width); } updateHoveredVertical(item) { this.hoveredVertical = item.value; this.deactivateAll(); } hideCircles() { this.hoveredVertical = null; this.deactivateAll(); } onClick(data, series) { if (series) { data.series = series.name; } this.select.emit(data); } trackBy(index, item) { return `${item.name}`; } setColors() { let domain; if (this.schemeType === ScaleType.Ordinal) { domain = this.seriesDomain; } else { domain = this.yDomain; } this.colors = new ColorHelper(this.scheme, this.schemeType, domain, this.customColors); } getLegendOptions() { const opts = { scaleType: this.schemeType, colors: undefined, domain: [], title: undefined, position: this.legendPosition }; if (opts.scaleType === ScaleType.Ordinal) { opts.domain = this.seriesDomain; opts.colors = this.colors; opts.title = this.legendTitle; } else { opts.domain = this.yDomain; opts.colors = this.colors.scale; } return opts; } updateYAxisWidth({ width }) { this.yAxisWidth = width; this.update(); } updateXAxisHeight({ height }) { this.xAxisHeight = height; this.update(); } onActivate(item) { const idx = this.activeEntries.findIndex(d => { return d.name === item.name && d.value === item.value; }); if (idx > -1) { return; } this.activeEntries = [item, ...this.activeEntries]; this.activate.emit({ value: item, entries: this.activeEntries }); } onDeactivate(item) { const idx = this.activeEntries.findIndex(d => { return d.name === item.name && d.value === item.value; }); this.activeEntries.splice(idx, 1); this.activeEntries = [...this.activeEntries]; this.deactivate.emit({ value: item, entries: this.activeEntries }); } deactivateAll() { this.activeEntries = [...this.activeEntries]; for (const entry of this.activeEntries) { this.deactivate.emit({ value: entry, entries: [] }); } this.activeEntries = []; } } AreaChartStackedComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: AreaChartStackedComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); AreaChartStackedComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: AreaChartStackedComponent, selector: "ngx-charts-area-chart-stacked", inputs: { legend: "legend", legendTitle: "legendTitle", legendPosition: "legendPosition", xAxis: "xAxis", yAxis: "yAxis", showXAxisLabel: "showXAxisLabel", showYAxisLabel: "showYAxisLabel", xAxisLabel: "xAxisLabel", yAxisLabel: "yAxisLabel", timeline: "timeline", gradient: "gradient", showGridLines: "showGridLines", curve: "curve", activeEntries: "activeEntries", schemeType: "schemeType", trimXAxisTicks: "trimXAxisTicks", trimYAxisTicks: "trimYAxisTicks", rotateXAxisTicks: "rotateXAxisTicks", maxXAxisTickLength: "maxXAxisTickLength", maxYAxisTickLength: "maxYAxisTickLength", xAxisTickFormatting: "xAxisTickFormatting", yAxisTickFormatting: "yAxisTickFormatting", xAxisTicks: "xAxisTicks", yAxisTicks: "yAxisTicks", roundDomains: "roundDomains", tooltipDisabled: "tooltipDisabled", xScaleMin: "xScaleMin", xScaleMax: "xScaleMax", yScaleMin: "yScaleMin", yScaleMax: "yScaleMax", wrapTicks: "wrapTicks" }, outputs: { activate: "activate", deactivate: "deactivate" }, host: { listeners: { "mouseleave": "hideCircles()" } }, queries: [{ propertyName: "tooltipTemplate", first: true, predicate: ["tooltipTemplate"], descendants: true }, { propertyName: "seriesTooltipTemplate", first: true, predicate: ["seriesTooltipTemplate"], descendants: true }], usesInheritance: true, ngImport: i0, template: ` `, isInline: true, styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n"], components: [{ type: ChartComponent, selector: "ngx-charts-chart", inputs: ["view", "showLegend", "legendOptions", "legendType", "activeEntries", "animations"], outputs: ["legendLabelClick", "legendLabelActivate", "legendLabelDeactivate"] }, { type: XAxisComponent, selector: "g[ngx-charts-x-axis]", inputs: ["xScale", "dims", "trimTicks", "rotateTicks", "maxTickLength", "tickFormatting", "showGridLines", "showLabel", "labelText", "ticks", "xAxisTickCount", "xOrient", "xAxisOffset", "wrapTicks"], outputs: ["dimensionsChanged"] }, { type: YAxisComponent, selector: "g[ngx-charts-y-axis]", inputs: ["yScale", "dims", "trimTicks", "maxTickLength", "tickFormatting", "ticks", "showGridLines", "showLabel", "labelText", "yAxisTickCount", "yOrient", "referenceLines", "showRefLines", "showRefLabels", "yAxisOffset", "wrapTicks"], outputs: ["dimensionsChanged"] }, { type: AreaSeriesComponent, selector: "g[ngx-charts-area-series]", inputs: ["data", "xScale", "yScale", "baseValue", "colors", "scaleType", "stacked", "normalized", "gradient", "curve", "activeEntries", "animations"], outputs: ["select"] }, { type: TooltipArea, selector: "g[ngx-charts-tooltip-area]", inputs: ["dims", "xSet", "xScale", "yScale", "results", "colors", "showPercentage", "tooltipDisabled", "tooltipTemplate"], outputs: ["hover"] }, { type: CircleSeriesComponent, selector: "g[ngx-charts-circle-series]", inputs: ["data", "type", "xScale", "yScale", "colors", "scaleType", "visibleValue", "activeEntries", "tooltipDisabled", "tooltipTemplate"], outputs: ["select", "activate", "deactivate"] }, { type: Timeline, selector: "g[ngx-charts-timeline]", inputs: ["view", "results", "scheme", "customColors", "legend", "autoScale", "scaleType", "height"], outputs: ["select", "onDomainChange"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: AreaChartStackedComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-charts-area-chart-stacked', template: ` `, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n"] }] }], propDecorators: { legend: [{ type: Input }], legendTitle: [{ type: Input }], legendPosition: [{ type: Input }], xAxis: [{ type: Input }], yAxis: [{ type: Input }], showXAxisLabel: [{ type: Input }], showYAxisLabel: [{ type: Input }], xAxisLabel: [{ type: Input }], yAxisLabel: [{ type: Input }], timeline: [{ type: Input }], gradient: [{ type: Input }], showGridLines: [{ type: Input }], curve: [{ type: Input }], activeEntries: [{ type: Input }], schemeType: [{ type: Input }], trimXAxisTicks: [{ type: Input }], trimYAxisTicks: [{ type: Input }], rotateXAxisTicks: [{ type: Input }], maxXAxisTickLength: [{ type: Input }], maxYAxisTickLength: [{ type: Input }], xAxisTickFormatting: [{ type: Input }], yAxisTickFormatting: [{ type: Input }], xAxisTicks: [{ type: Input }], yAxisTicks: [{ type: Input }], roundDomains: [{ type: Input }], tooltipDisabled: [{ type: Input }], xScaleMin: [{ type: Input }], xScaleMax: [{ type: Input }], yScaleMin: [{ type: Input }], yScaleMax: [{ type: Input }], wrapTicks: [{ type: Input }], activate: [{ type: Output }], deactivate: [{ type: Output }], tooltipTemplate: [{ type: ContentChild, args: ['tooltipTemplate'] }], seriesTooltipTemplate: [{ type: ContentChild, args: ['seriesTooltipTemplate'] }], hideCircles: [{ type: HostListener, args: ['mouseleave'] }] } }); class AreaChartModule { } AreaChartModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: AreaChartModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); AreaChartModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: AreaChartModule, declarations: [AreaChartComponent, AreaChartNormalizedComponent, AreaChartStackedComponent, AreaSeriesComponent], imports: [ChartCommonModule], exports: [AreaChartComponent, AreaChartNormalizedComponent, AreaChartStackedComponent, AreaSeriesComponent] }); AreaChartModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: AreaChartModule, imports: [[ChartCommonModule]] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: AreaChartModule, decorators: [{ type: NgModule, args: [{ imports: [ChartCommonModule], declarations: [AreaChartComponent, AreaChartNormalizedComponent, AreaChartStackedComponent, AreaSeriesComponent], exports: [AreaChartComponent, AreaChartNormalizedComponent, AreaChartStackedComponent, AreaSeriesComponent] }] }] }); class BarComponent { constructor(element) { this.roundEdges = true; this.gradient = false; this.offset = 0; this.isActive = false; this.animations = true; this.noBarWhenZero = true; this.select = new EventEmitter(); this.activate = new EventEmitter(); this.deactivate = new EventEmitter(); this.hasGradient = false; this.hideBar = false; this.element = element.nativeElement; } ngOnChanges(changes) { if (changes.roundEdges) { this.loadAnimation(); } this.update(); } update() { this.gradientId = 'grad' + id().toString(); this.gradientFill = `url(#${this.gradientId})`; if (this.gradient || this.stops) { this.gradientStops = this.getGradient(); this.hasGradient = true; } else { this.hasGradient = false; } this.updatePathEl(); this.checkToHideBar(); } loadAnimation() { this.path = this.getStartingPath(); setTimeout(this.update.bind(this), 100); } updatePathEl() { const node = select(this.element).select('.bar'); const path = this.getPath(); if (this.animations) { node.transition().duration(500).attr('d', path); } else { node.attr('d', path); } } getGradient() { if (this.stops) { return this.stops; } return [ { offset: 0, color: this.fill, opacity: this.getStartOpacity() }, { offset: 100, color: this.fill, opacity: 1 } ]; } getStartingPath() { if (!this.animations) { return this.getPath(); } let radius = this.getRadius(); let path; if (this.roundEdges) { if (this.orientation === BarOrientation.Vertical) { radius = Math.min(this.height, radius); path = roundedRect(this.x, this.y + this.height, this.width, 1, 0, this.edges); } else if (this.orientation === BarOrientation.Horizontal) { radius = Math.min(this.width, radius); path = roundedRect(this.x, this.y, 1, this.height, 0, this.edges); } } else { if (this.orientation === BarOrientation.Vertical) { path = roundedRect(this.x, this.y + this.height, this.width, 1, 0, this.edges); } else if (this.orientation === BarOrientation.Horizontal) { path = roundedRect(this.x, this.y, 1, this.height, 0, this.edges); } } return path; } getPath() { let radius = this.getRadius(); let path; if (this.roundEdges) { if (this.orientation === BarOrientation.Vertical) { radius = Math.min(this.height, radius); path = roundedRect(this.x, this.y, this.width, this.height, radius, this.edges); } else if (this.orientation === BarOrientation.Horizontal) { radius = Math.min(this.width, radius); path = roundedRect(this.x, this.y, this.width, this.height, radius, this.edges); } } else { path = roundedRect(this.x, this.y, this.width, this.height, radius, this.edges); } return path; } getRadius() { let radius = 0; if (this.roundEdges && this.height > 5 && this.width > 5) { radius = Math.floor(Math.min(5, this.height / 2, this.width / 2)); } return radius; } getStartOpacity() { if (this.roundEdges) { return 0.2; } else { return 0.5; } } get edges() { let edges = [false, false, false, false]; if (this.roundEdges) { if (this.orientation === BarOrientation.Vertical) { if (this.data.value > 0) { edges = [true, true, false, false]; } else { edges = [false, false, true, true]; } } else if (this.orientation === BarOrientation.Horizontal) { if (this.data.value > 0) { edges = [false, true, false, true]; } else { edges = [true, false, true, false]; } } } return edges; } onMouseEnter() { this.activate.emit(this.data); } onMouseLeave() { this.deactivate.emit(this.data); } checkToHideBar() { this.hideBar = this.noBarWhenZero && ((this.orientation === BarOrientation.Vertical && this.height === 0) || (this.orientation === BarOrientation.Horizontal && this.width === 0)); } } BarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BarComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); BarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: BarComponent, selector: "g[ngx-charts-bar]", inputs: { fill: "fill", data: "data", width: "width", height: "height", x: "x", y: "y", orientation: "orientation", roundEdges: "roundEdges", gradient: "gradient", offset: "offset", isActive: "isActive", stops: "stops", animations: "animations", ariaLabel: "ariaLabel", noBarWhenZero: "noBarWhenZero" }, outputs: { select: "select", activate: "activate", deactivate: "deactivate" }, host: { listeners: { "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()" } }, usesOnChanges: true, ngImport: i0, template: ` `, isInline: true, components: [{ type: SvgLinearGradientComponent, selector: "g[ngx-charts-svg-linear-gradient]", inputs: ["orientation", "name", "stops"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BarComponent, decorators: [{ type: Component, args: [{ selector: 'g[ngx-charts-bar]', template: ` `, changeDetection: ChangeDetectionStrategy.OnPush }] }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { fill: [{ type: Input }], data: [{ type: Input }], width: [{ type: Input }], height: [{ type: Input }], x: [{ type: Input }], y: [{ type: Input }], orientation: [{ type: Input }], roundEdges: [{ type: Input }], gradient: [{ type: Input }], offset: [{ type: Input }], isActive: [{ type: Input }], stops: [{ type: Input }], animations: [{ type: Input }], ariaLabel: [{ type: Input }], noBarWhenZero: [{ type: Input }], select: [{ type: Output }], activate: [{ type: Output }], deactivate: [{ type: Output }], onMouseEnter: [{ type: HostListener, args: ['mouseenter'] }], onMouseLeave: [{ type: HostListener, args: ['mouseleave'] }] } }); var BarChartType; (function (BarChartType) { BarChartType["Standard"] = "standard"; BarChartType["Normalized"] = "normalized"; BarChartType["Stacked"] = "stacked"; })(BarChartType || (BarChartType = {})); var D0Types; (function (D0Types) { D0Types["positive"] = "positive"; D0Types["negative"] = "negative"; })(D0Types || (D0Types = {})); class BarLabelComponent { constructor(element) { this.dimensionsChanged = new EventEmitter(); this.horizontalPadding = 2; this.verticalPadding = 5; this.element = element.nativeElement; } ngOnChanges(changes) { this.update(); } getSize() { const h = this.element.getBoundingClientRect().height; const w = this.element.getBoundingClientRect().width; return { height: h, width: w, negative: this.value < 0 }; } ngAfterViewInit() { this.dimensionsChanged.emit(this.getSize()); } update() { if (this.valueFormatting) { this.formatedValue = this.valueFormatting(this.value); } else { this.formatedValue = formatLabel(this.value); } if (this.orientation === 'horizontal') { this.x = this.barX + this.barWidth; // if the value is negative then it's on the left of the x0. // we need to put the data label in front of the bar if (this.value < 0) { this.x = this.x - this.horizontalPadding; this.textAnchor = 'end'; } else { this.x = this.x + this.horizontalPadding; this.textAnchor = 'start'; } this.y = this.barY + this.barHeight / 2; } else { // orientation must be "vertical" this.x = this.barX + this.barWidth / 2; this.y = this.barY + this.barHeight; if (this.value < 0) { this.y = this.y + this.verticalPadding; this.textAnchor = 'end'; } else { this.y = this.y - this.verticalPadding; this.textAnchor = 'start'; } this.transform = `rotate(-45, ${this.x} , ${this.y})`; } } } BarLabelComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BarLabelComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); BarLabelComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: BarLabelComponent, selector: "g[ngx-charts-bar-label]", inputs: { value: "value", valueFormatting: "valueFormatting", barX: "barX", barY: "barY", barWidth: "barWidth", barHeight: "barHeight", orientation: "orientation" }, outputs: { dimensionsChanged: "dimensionsChanged" }, usesOnChanges: true, ngImport: i0, template: ` {{ formatedValue }} `, isInline: true, styles: [".textDataLabel{font-size:11px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BarLabelComponent, decorators: [{ type: Component, args: [{ selector: 'g[ngx-charts-bar-label]', template: ` {{ formatedValue }} `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".textDataLabel{font-size:11px}\n"] }] }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { value: [{ type: Input }], valueFormatting: [{ type: Input }], barX: [{ type: Input }], barY: [{ type: Input }], barWidth: [{ type: Input }], barHeight: [{ type: Input }], orientation: [{ type: Input }], dimensionsChanged: [{ type: Output }] } }); class SeriesHorizontal { constructor() { this.type = BarChartType.Standard; this.tooltipDisabled = false; this.animations = true; this.showDataLabel = false; this.noBarWhenZero = true; this.select = new EventEmitter(); this.activate = new EventEmitter(); this.deactivate = new EventEmitter(); this.dataLabelWidthChanged = new EventEmitter(); this.barsForDataLabels = []; this.barOrientation = BarOrientation; } ngOnChanges(changes) { this.update(); } update() { this.updateTooltipSettings(); const d0 = { [D0Types.positive]: 0, [D0Types.negative]: 0 }; let d0Type; d0Type = D0Types.positive; let total; if (this.type === BarChartType.Normalized) { total = this.series.map(d => d.value).reduce((sum, d) => sum + d, 0); } const xScaleMin = Math.max(this.xScale.domain()[0], 0); this.bars = this.series.map(d => { let value = d.value; const label = this.getLabel(d); const formattedLabel = formatLabel(label); const roundEdges = this.roundEdges; d0Type = value > 0 ? D0Types.positive : D0Types.negative; const bar = { value, label, roundEdges, data: d, formattedLabel }; bar.height = this.yScale.bandwidth(); if (this.type === BarChartType.Standard) { bar.width = Math.abs(this.xScale(value) - this.xScale(xScaleMin)); if (value < 0) { bar.x = this.xScale(value); } else { bar.x = this.xScale(xScaleMin); } bar.y = this.yScale(label); } else if (this.type === BarChartType.Stacked) { const offset0 = d0[d0Type]; const offset1 = offset0 + value; d0[d0Type] += value; bar.width = this.xScale(offset1) - this.xScale(offset0); bar.x = this.xScale(offset0); bar.y = 0; bar.offset0 = offset0; bar.offset1 = offset1; } else if (this.type === BarChartType.Normalized) { let offset0 = d0[d0Type]; let offset1 = offset0 + value; d0[d0Type] += value; if (total > 0) { offset0 = (offset0 * 100) / total; offset1 = (offset1 * 100) / total; } else { offset0 = 0; offset1 = 0; } bar.width = this.xScale(offset1) - this.xScale(offset0); bar.x = this.xScale(offset0); bar.y = 0; bar.offset0 = offset0; bar.offset1 = offset1; value = (offset1 - offset0).toFixed(2) + '%'; } if (this.colors.scaleType === ScaleType.Ordinal) { bar.color = this.colors.getColor(label); } else { if (this.type === BarChartType.Standard) { bar.color = this.colors.getColor(value); bar.gradientStops = this.colors.getLinearGradientStops(value); } else { bar.color = this.colors.getColor(bar.offset1); bar.gradientStops = this.colors.getLinearGradientStops(bar.offset1, bar.offset0); } } let tooltipLabel = formattedLabel; bar.ariaLabel = formattedLabel + ' ' + value.toLocaleString(); if (this.seriesName !== null && this.seriesName !== undefined) { tooltipLabel = `${this.seriesName} • ${formattedLabel}`; bar.data.series = this.seriesName; bar.ariaLabel = this.seriesName + ' ' + bar.ariaLabel; } bar.tooltipText = this.tooltipDisabled ? undefined : ` ${escapeLabel(tooltipLabel)} ${this.dataLabelFormatting ? this.dataLabelFormatting(value) : value.toLocaleString()} `; return bar; }); this.updateDataLabels(); } updateDataLabels() { if (this.type === BarChartType.Stacked) { this.barsForDataLabels = []; const section = {}; section.series = this.seriesName; const totalPositive = this.series.map(d => d.value).reduce((sum, d) => (d > 0 ? sum + d : sum), 0); const totalNegative = this.series.map(d => d.value).reduce((sum, d) => (d < 0 ? sum + d : sum), 0); section.total = totalPositive + totalNegative; section.x = 0; section.y = 0; // if total is positive then we show it on the right, otherwise on the left if (section.total > 0) { section.width = this.xScale(totalPositive); } else { section.width = this.xScale(totalNegative); } section.height = this.yScale.bandwidth(); this.barsForDataLabels.push(section); } else { this.barsForDataLabels = this.series.map(d => { const section = {}; section.series = this.seriesName ?? d.label; section.total = d.value; section.x = this.xScale(0); section.y = this.yScale(d.label); section.width = this.xScale(section.total) - this.xScale(0); section.height = this.yScale.bandwidth(); return section; }); } } updateTooltipSettings() { this.tooltipPlacement = this.tooltipDisabled ? undefined : PlacementTypes.Top; this.tooltipType = this.tooltipDisabled ? undefined : StyleTypes.tooltip; } isActive(entry) { if (!this.activeEntries) return false; const item = this.activeEntries.find(active => { return entry.name === active.name && entry.value === active.value; }); return item !== undefined; } getLabel(dataItem) { if (dataItem.label) { return dataItem.label; } return dataItem.name; } trackBy(index, bar) { return bar.label; } trackDataLabelBy(index, barLabel) { return index + '#' + barLabel.series + '#' + barLabel.total; } click(data) { this.select.emit(data); } } SeriesHorizontal.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: SeriesHorizontal, deps: [], target: i0.ɵɵFactoryTarget.Component }); SeriesHorizontal.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: SeriesHorizontal, selector: "g[ngx-charts-series-horizontal]", inputs: { dims: "dims", type: "type", series: "series", xScale: "xScale", yScale: "yScale", colors: "colors", tooltipDisabled: "tooltipDisabled", gradient: "gradient", activeEntries: "activeEntries", seriesName: "seriesName", tooltipTemplate: "tooltipTemplate", roundEdges: "roundEdges", animations: "animations", showDataLabel: "showDataLabel", dataLabelFormatting: "dataLabelFormatting", noBarWhenZero: "noBarWhenZero" }, outputs: { select: "select", activate: "activate", deactivate: "deactivate", dataLabelWidthChanged: "dataLabelWidthChanged" }, usesOnChanges: true, ngImport: i0, template: ` `, isInline: true, components: [{ type: BarComponent, selector: "g[ngx-charts-bar]", inputs: ["fill", "data", "width", "height", "x", "y", "orientation", "roundEdges", "gradient", "offset", "isActive", "stops", "animations", "ariaLabel", "noBarWhenZero"], outputs: ["select", "activate", "deactivate"] }, { type: BarLabelComponent, selector: "g[ngx-charts-bar-label]", inputs: ["value", "valueFormatting", "barX", "barY", "barWidth", "barHeight", "orientation"], outputs: ["dimensionsChanged"] }], directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: TooltipDirective, selector: "[ngx-tooltip]", inputs: ["tooltipCssClass", "tooltipTitle", "tooltipAppendToBody", "tooltipSpacing", "tooltipDisabled", "tooltipShowCaret", "tooltipPlacement", "tooltipAlignment", "tooltipType", "tooltipCloseOnClickOutside", "tooltipCloseOnMouseLeave", "tooltipHideTimeout", "tooltipShowTimeout", "tooltipTemplate", "tooltipShowEvent", "tooltipContext", "tooltipImmediateExit"], outputs: ["show", "hide"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], animations: [ trigger('animationState', [ transition(':leave', [ style({ opacity: 1 }), animate(500, style({ opacity: 0 })) ]) ]) ], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: SeriesHorizontal, decorators: [{ type: Component, args: [{ selector: 'g[ngx-charts-series-horizontal]', template: ` `, changeDetection: ChangeDetectionStrategy.OnPush, animations: [ trigger('animationState', [ transition(':leave', [ style({ opacity: 1 }), animate(500, style({ opacity: 0 })) ]) ]) ] }] }], propDecorators: { dims: [{ type: Input }], type: [{ type: Input }], series: [{ type: Input }], xScale: [{ type: Input }], yScale: [{ type: Input }], colors: [{ type: Input }], tooltipDisabled: [{ type: Input }], gradient: [{ type: Input }], activeEntries: [{ type: Input }], seriesName: [{ type: Input }], tooltipTemplate: [{ type: Input }], roundEdges: [{ type: Input }], animations: [{ type: Input }], showDataLabel: [{ type: Input }], dataLabelFormatting: [{ type: Input }], noBarWhenZero: [{ type: Input }], select: [{ type: Output }], activate: [{ type: Output }], deactivate: [{ type: Output }], dataLabelWidthChanged: [{ type: Output }] } }); class BarHorizontalComponent extends BaseChartComponent { constructor() { super(...arguments); this.legend = false; this.legendTitle = 'Legend'; this.legendPosition = LegendPosition.Right; this.tooltipDisabled = false; this.showGridLines = true; this.activeEntries = []; this.trimXAxisTicks = true; this.trimYAxisTicks = true; this.rotateXAxisTicks = true; this.maxXAxisTickLength = 16; this.maxYAxisTickLength = 16; this.barPadding = 8; this.roundDomains = false; this.roundEdges = true; this.showDataLabel = false; this.noBarWhenZero = true; this.wrapTicks = false; this.activate = new EventEmitter(); this.deactivate = new EventEmitter(); this.margin = [10, 20, 10, 20]; this.xAxisHeight = 0; this.yAxisWidth = 0; this.dataLabelMaxWidth = { negative: 0, positive: 0 }; } update() { super.update(); if (!this.showDataLabel) { this.dataLabelMaxWidth = { negative: 0, positive: 0 }; } this.margin = [10, 20 + this.dataLabelMaxWidth.positive, 10, 20 + this.dataLabelMaxWidth.negative]; this.dims = calculateViewDimensions({ width: this.width, height: this.height, margins: this.margin, showXAxis: this.xAxis, showYAxis: this.yAxis, xAxisHeight: this.xAxisHeight, yAxisWidth: this.yAxisWidth, showXLabel: this.showXAxisLabel, showYLabel: this.showYAxisLabel, showLegend: this.legend, legendType: this.schemeType, legendPosition: this.legendPosition }); this.formatDates(); this.xScale = this.getXScale(); this.yScale = this.getYScale(); this.setColors(); this.legendOptions = this.getLegendOptions(); this.transform = `translate(${this.dims.xOffset} , ${this.margin[0]})`; } getXScale() { this.xDomain = this.getXDomain(); const scale = scaleLinear().range([0, this.dims.width]).domain(this.xDomain); return this.roundDomains ? scale.nice() : scale; } getYScale() { this.yDomain = this.getYDomain(); const spacing = this.yDomain.length / (this.dims.height / this.barPadding + 1); return scaleBand().rangeRound([0, this.dims.height]).paddingInner(spacing).domain(this.yDomain); } getXDomain() { const values = this.results.map(d => d.value); const min = this.xScaleMin ? Math.min(this.xScaleMin, ...values) : Math.min(0, ...values); const max = this.xScaleMax ? Math.max(this.xScaleMax, ...values) : Math.max(0, ...values); return [min, max]; } getYDomain() { return this.results.map(d => d.label); } onClick(data) { this.select.emit(data); } setColors() { let domain; if (this.schemeType === ScaleType.Ordinal) { domain = this.yDomain; } else { domain = this.xDomain; } this.colors = new ColorHelper(this.scheme, this.schemeType, domain, this.customColors); } getLegendOptions() { const opts = { scaleType: this.schemeType, colors: undefined, domain: [], title: undefined, position: this.legendPosition }; if (opts.scaleType === 'ordinal') { opts.domain = this.yDomain; opts.colors = this.colors; opts.title = this.legendTitle; } else { opts.domain = this.xDomain; opts.colors = this.colors.scale; } return opts; } updateYAxisWidth({ width }) { this.yAxisWidth = width; this.update(); } updateXAxisHeight({ height }) { this.xAxisHeight = height; this.update(); } onDataLabelMaxWidthChanged(event) { if (event.size.negative) { this.dataLabelMaxWidth.negative = Math.max(this.dataLabelMaxWidth.negative, event.size.width); } else { this.dataLabelMaxWidth.positive = Math.max(this.dataLabelMaxWidth.positive, event.size.width); } if (event.index === this.results.length - 1) { setTimeout(() => this.update()); } } onActivate(item, fromLegend = false) { item = this.results.find(d => { if (fromLegend) { return d.label === item.name; } else { return d.name === item.name; } }); const idx = this.activeEntries.findIndex(d => { return d.name === item.name && d.value === item.value && d.series === item.series; }); if (idx > -1) { return; } this.activeEntries = [item, ...this.activeEntries]; this.activate.emit({ value: item, entries: this.activeEntries }); } onDeactivate(item, fromLegend = false) { item = this.results.find(d => { if (fromLegend) { return d.label === item.name; } else { return d.name === item.name; } }); const idx = this.activeEntries.findIndex(d => { return d.name === item.name && d.value === item.value && d.series === item.series; }); this.activeEntries.splice(idx, 1); this.activeEntries = [...this.activeEntries]; this.deactivate.emit({ value: item, entries: this.activeEntries }); } } BarHorizontalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BarHorizontalComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); BarHorizontalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: BarHorizontalComponent, selector: "ngx-charts-bar-horizontal", inputs: { legend: "legend", legendTitle: "legendTitle", legendPosition: "legendPosition", xAxis: "xAxis", yAxis: "yAxis", showXAxisLabel: "showXAxisLabel", showYAxisLabel: "showYAxisLabel", xAxisLabel: "xAxisLabel", yAxisLabel: "yAxisLabel", tooltipDisabled: "tooltipDisabled", gradient: "gradient", showGridLines: "showGridLines", activeEntries: "activeEntries", schemeType: "schemeType", trimXAxisTicks: "trimXAxisTicks", trimYAxisTicks: "trimYAxisTicks", rotateXAxisTicks: "rotateXAxisTicks", maxXAxisTickLength: "maxXAxisTickLength", maxYAxisTickLength: "maxYAxisTickLength", xAxisTickFormatting: "xAxisTickFormatting", yAxisTickFormatting: "yAxisTickFormatting", xAxisTicks: "xAxisTicks", yAxisTicks: "yAxisTicks", barPadding: "barPadding", roundDomains: "roundDomains", roundEdges: "roundEdges", xScaleMax: "xScaleMax", xScaleMin: "xScaleMin", showDataLabel: "showDataLabel", dataLabelFormatting: "dataLabelFormatting", noBarWhenZero: "noBarWhenZero", wrapTicks: "wrapTicks" }, outputs: { activate: "activate", deactivate: "deactivate" }, queries: [{ propertyName: "tooltipTemplate", first: true, predicate: ["tooltipTemplate"], descendants: true }], usesInheritance: true, ngImport: i0, template: ` `, isInline: true, styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n"], components: [{ type: ChartComponent, selector: "ngx-charts-chart", inputs: ["view", "showLegend", "legendOptions", "legendType", "activeEntries", "animations"], outputs: ["legendLabelClick", "legendLabelActivate", "legendLabelDeactivate"] }, { type: XAxisComponent, selector: "g[ngx-charts-x-axis]", inputs: ["xScale", "dims", "trimTicks", "rotateTicks", "maxTickLength", "tickFormatting", "showGridLines", "showLabel", "labelText", "ticks", "xAxisTickCount", "xOrient", "xAxisOffset", "wrapTicks"], outputs: ["dimensionsChanged"] }, { type: YAxisComponent, selector: "g[ngx-charts-y-axis]", inputs: ["yScale", "dims", "trimTicks", "maxTickLength", "tickFormatting", "ticks", "showGridLines", "showLabel", "labelText", "yAxisTickCount", "yOrient", "referenceLines", "showRefLines", "showRefLabels", "yAxisOffset", "wrapTicks"], outputs: ["dimensionsChanged"] }, { type: SeriesHorizontal, selector: "g[ngx-charts-series-horizontal]", inputs: ["dims", "type", "series", "xScale", "yScale", "colors", "tooltipDisabled", "gradient", "activeEntries", "seriesName", "tooltipTemplate", "roundEdges", "animations", "showDataLabel", "dataLabelFormatting", "noBarWhenZero"], outputs: ["select", "activate", "deactivate", "dataLabelWidthChanged"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BarHorizontalComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-charts-bar-horizontal', template: ` `, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n"] }] }], propDecorators: { legend: [{ type: Input }], legendTitle: [{ type: Input }], legendPosition: [{ type: Input }], xAxis: [{ type: Input }], yAxis: [{ type: Input }], showXAxisLabel: [{ type: Input }], showYAxisLabel: [{ type: Input }], xAxisLabel: [{ type: Input }], yAxisLabel: [{ type: Input }], tooltipDisabled: [{ type: Input }], gradient: [{ type: Input }], showGridLines: [{ type: Input }], activeEntries: [{ type: Input }], schemeType: [{ type: Input }], trimXAxisTicks: [{ type: Input }], trimYAxisTicks: [{ type: Input }], rotateXAxisTicks: [{ type: Input }], maxXAxisTickLength: [{ type: Input }], maxYAxisTickLength: [{ type: Input }], xAxisTickFormatting: [{ type: Input }], yAxisTickFormatting: [{ type: Input }], xAxisTicks: [{ type: Input }], yAxisTicks: [{ type: Input }], barPadding: [{ type: Input }], roundDomains: [{ type: Input }], roundEdges: [{ type: Input }], xScaleMax: [{ type: Input }], xScaleMin: [{ type: Input }], showDataLabel: [{ type: Input }], dataLabelFormatting: [{ type: Input }], noBarWhenZero: [{ type: Input }], wrapTicks: [{ type: Input }], activate: [{ type: Output }], deactivate: [{ type: Output }], tooltipTemplate: [{ type: ContentChild, args: ['tooltipTemplate'] }] } }); class BarHorizontal2DComponent extends BaseChartComponent { constructor() { super(...arguments); this.legend = false; this.legendTitle = 'Legend'; this.legendPosition = LegendPosition.Right; this.tooltipDisabled = false; this.showGridLines = true; this.activeEntries = []; this.trimXAxisTicks = true; this.trimYAxisTicks = true; this.rotateXAxisTicks = true; this.maxXAxisTickLength = 16; this.maxYAxisTickLength = 16; this.groupPadding = 16; this.barPadding = 8; this.roundDomains = false; this.roundEdges = true; this.showDataLabel = false; this.noBarWhenZero = true; this.wrapTicks = false; this.activate = new EventEmitter(); this.deactivate = new EventEmitter(); this.margin = [10, 20, 10, 20]; this.xAxisHeight = 0; this.yAxisWidth = 0; this.dataLabelMaxWidth = { negative: 0, positive: 0 }; this.isSSR = false; this.barOrientation = BarOrientation; this.trackBy = (index, item) => { return item.name; }; } ngOnInit() { if (isPlatformServer(this.platformId)) { this.isSSR = true; } } update() { super.update(); if (!this.showDataLabel) { this.dataLabelMaxWidth = { negative: 0, positive: 0 }; } this.margin = [10, 20 + this.dataLabelMaxWidth.positive, 10, 20 + this.dataLabelMaxWidth.negative]; this.dims = calculateViewDimensions({ width: this.width, height: this.height, margins: this.margin, showXAxis: this.xAxis, showYAxis: this.yAxis, xAxisHeight: this.xAxisHeight, yAxisWidth: this.yAxisWidth, showXLabel: this.showXAxisLabel, showYLabel: this.showYAxisLabel, showLegend: this.legend, legendType: this.schemeType, legendPosition: this.legendPosition }); this.formatDates(); this.groupDomain = this.getGroupDomain(); this.innerDomain = this.getInnerDomain(); this.valueDomain = this.getValueDomain(); this.groupScale = this.getGroupScale(); this.innerScale = this.getInnerScale(); this.valueScale = this.getValueScale(); this.setColors(); this.legendOptions = this.getLegendOptions(); this.transform = `translate(${this.dims.xOffset} , ${this.margin[0]})`; } getGroupScale() { const spacing = this.groupDomain.length / (this.dims.height / this.groupPadding + 1); return scaleBand() .rangeRound([0, this.dims.height]) .paddingInner(spacing) .paddingOuter(spacing / 2) .domain(this.groupDomain); } getInnerScale() { const height = this.groupScale.bandwidth(); const spacing = this.innerDomain.length / (height / this.barPadding + 1); return scaleBand().rangeRound([0, height]).paddingInner(spacing).domain(this.innerDomain); } getValueScale() { const scale = scaleLinear().range([0, this.dims.width]).domain(this.valueDomain); return this.roundDomains ? scale.nice() : scale; } getGroupDomain() { const domain = []; for (const group of this.results) { if (!domain.includes(group.label)) { domain.push(group.label); } } return domain; } getInnerDomain() { const domain = []; for (const group of this.results) { for (const d of group.series) { if (!domain.includes(d.label)) { domain.push(d.label); } } } return domain; } getValueDomain() { const domain = []; for (const group of this.results) { for (const d of group.series) { if (!domain.includes(d.value)) { domain.push(d.value); } } } const min = Math.min(0, ...domain); const max = this.xScaleMax ? Math.max(this.xScaleMax, ...domain) : Math.max(0, ...domain); return [min, max]; } groupTransform(group) { return `translate(0, ${this.groupScale(group.label)})`; } onClick(data, group) { if (group) { data.series = group.name; } this.select.emit(data); } setColors() { let domain; if (this.schemeType === ScaleType.Ordinal) { domain = this.innerDomain; } else { domain = this.valueDomain; } this.colors = new ColorHelper(this.scheme, this.schemeType, domain, this.customColors); } getLegendOptions() { const opts = { scaleType: this.schemeType, colors: undefined, domain: [], title: undefined, position: this.legendPosition }; if (opts.scaleType === ScaleType.Ordinal) { opts.domain = this.innerDomain; opts.colors = this.colors; opts.title = this.legendTitle; } else { opts.domain = this.valueDomain; opts.colors = this.colors.scale; } return opts; } updateYAxisWidth({ width }) { this.yAxisWidth = width; this.update(); } updateXAxisHeight({ height }) { this.xAxisHeight = height; this.update(); } onDataLabelMaxWidthChanged(event, groupIndex) { if (event.size.negative) { this.dataLabelMaxWidth.negative = Math.max(this.dataLabelMaxWidth.negative, event.size.width); } else { this.dataLabelMaxWidth.positive = Math.max(this.dataLabelMaxWidth.positive, event.size.width); } if (groupIndex === this.results.length - 1) { setTimeout(() => this.update()); } } onActivate(event, group, fromLegend = false) { const item = Object.assign({}, event); if (group) { item.series = group.name; } const items = this.results .map(g => g.series) .flat() .filter(i => { if (fromLegend) { return i.label === item.name; } else { return i.name === item.name && i.series === item.series; } }); this.activeEntries = [...items]; this.activate.emit({ value: item, entries: this.activeEntries }); } onDeactivate(event, group, fromLegend = false) { const item = Object.assign({}, event); if (group) { item.series = group.name; } this.activeEntries = this.activeEntries.filter(i => { if (fromLegend) { return i.label !== item.name; } else { return !(i.name === item.name && i.series === item.series); } }); this.deactivate.emit({ value: item, entries: this.activeEntries }); } } BarHorizontal2DComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BarHorizontal2DComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); BarHorizontal2DComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: BarHorizontal2DComponent, selector: "ngx-charts-bar-horizontal-2d", inputs: { legend: "legend", legendTitle: "legendTitle", legendPosition: "legendPosition", xAxis: "xAxis", yAxis: "yAxis", showXAxisLabel: "showXAxisLabel", showYAxisLabel: "showYAxisLabel", xAxisLabel: "xAxisLabel", yAxisLabel: "yAxisLabel", tooltipDisabled: "tooltipDisabled", gradient: "gradient", showGridLines: "showGridLines", activeEntries: "activeEntries", schemeType: "schemeType", trimXAxisTicks: "trimXAxisTicks", trimYAxisTicks: "trimYAxisTicks", rotateXAxisTicks: "rotateXAxisTicks", maxXAxisTickLength: "maxXAxisTickLength", maxYAxisTickLength: "maxYAxisTickLength", xAxisTickFormatting: "xAxisTickFormatting", yAxisTickFormatting: "yAxisTickFormatting", xAxisTicks: "xAxisTicks", yAxisTicks: "yAxisTicks", groupPadding: "groupPadding", barPadding: "barPadding", roundDomains: "roundDomains", roundEdges: "roundEdges", xScaleMax: "xScaleMax", showDataLabel: "showDataLabel", dataLabelFormatting: "dataLabelFormatting", noBarWhenZero: "noBarWhenZero", wrapTicks: "wrapTicks" }, outputs: { activate: "activate", deactivate: "deactivate" }, queries: [{ propertyName: "tooltipTemplate", first: true, predicate: ["tooltipTemplate"], descendants: true }], usesInheritance: true, ngImport: i0, template: ` `, isInline: true, styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n"], components: [{ type: ChartComponent, selector: "ngx-charts-chart", inputs: ["view", "showLegend", "legendOptions", "legendType", "activeEntries", "animations"], outputs: ["legendLabelClick", "legendLabelActivate", "legendLabelDeactivate"] }, { type: GridPanelSeriesComponent, selector: "g[ngx-charts-grid-panel-series]", inputs: ["data", "dims", "xScale", "yScale", "orient"] }, { type: XAxisComponent, selector: "g[ngx-charts-x-axis]", inputs: ["xScale", "dims", "trimTicks", "rotateTicks", "maxTickLength", "tickFormatting", "showGridLines", "showLabel", "labelText", "ticks", "xAxisTickCount", "xOrient", "xAxisOffset", "wrapTicks"], outputs: ["dimensionsChanged"] }, { type: YAxisComponent, selector: "g[ngx-charts-y-axis]", inputs: ["yScale", "dims", "trimTicks", "maxTickLength", "tickFormatting", "ticks", "showGridLines", "showLabel", "labelText", "yAxisTickCount", "yOrient", "referenceLines", "showRefLines", "showRefLabels", "yAxisOffset", "wrapTicks"], outputs: ["dimensionsChanged"] }, { type: SeriesHorizontal, selector: "g[ngx-charts-series-horizontal]", inputs: ["dims", "type", "series", "xScale", "yScale", "colors", "tooltipDisabled", "gradient", "activeEntries", "seriesName", "tooltipTemplate", "roundEdges", "animations", "showDataLabel", "dataLabelFormatting", "noBarWhenZero"], outputs: ["select", "activate", "deactivate", "dataLabelWidthChanged"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], animations: [ trigger('animationState', [ transition(':leave', [ style({ opacity: 1, transform: '*' }), animate(500, style({ opacity: 0, transform: 'scale(0)' })) ]) ]) ], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BarHorizontal2DComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-charts-bar-horizontal-2d', template: ` `, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, animations: [ trigger('animationState', [ transition(':leave', [ style({ opacity: 1, transform: '*' }), animate(500, style({ opacity: 0, transform: 'scale(0)' })) ]) ]) ], styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n"] }] }], propDecorators: { legend: [{ type: Input }], legendTitle: [{ type: Input }], legendPosition: [{ type: Input }], xAxis: [{ type: Input }], yAxis: [{ type: Input }], showXAxisLabel: [{ type: Input }], showYAxisLabel: [{ type: Input }], xAxisLabel: [{ type: Input }], yAxisLabel: [{ type: Input }], tooltipDisabled: [{ type: Input }], gradient: [{ type: Input }], showGridLines: [{ type: Input }], activeEntries: [{ type: Input }], schemeType: [{ type: Input }], trimXAxisTicks: [{ type: Input }], trimYAxisTicks: [{ type: Input }], rotateXAxisTicks: [{ type: Input }], maxXAxisTickLength: [{ type: Input }], maxYAxisTickLength: [{ type: Input }], xAxisTickFormatting: [{ type: Input }], yAxisTickFormatting: [{ type: Input }], xAxisTicks: [{ type: Input }], yAxisTicks: [{ type: Input }], groupPadding: [{ type: Input }], barPadding: [{ type: Input }], roundDomains: [{ type: Input }], roundEdges: [{ type: Input }], xScaleMax: [{ type: Input }], showDataLabel: [{ type: Input }], dataLabelFormatting: [{ type: Input }], noBarWhenZero: [{ type: Input }], wrapTicks: [{ type: Input }], activate: [{ type: Output }], deactivate: [{ type: Output }], tooltipTemplate: [{ type: ContentChild, args: ['tooltipTemplate'] }] } }); class BarHorizontalNormalizedComponent extends BaseChartComponent { constructor() { super(...arguments); this.legend = false; this.legendTitle = 'Legend'; this.legendPosition = LegendPosition.Right; this.tooltipDisabled = false; this.showGridLines = true; this.activeEntries = []; this.trimXAxisTicks = true; this.trimYAxisTicks = true; this.rotateXAxisTicks = true; this.maxXAxisTickLength = 16; this.maxYAxisTickLength = 16; this.barPadding = 8; this.roundDomains = false; this.noBarWhenZero = true; this.wrapTicks = false; this.activate = new EventEmitter(); this.deactivate = new EventEmitter(); this.valueDomain = [0, 100]; this.margin = [10, 20, 10, 20]; this.xAxisHeight = 0; this.yAxisWidth = 0; this.barChartType = BarChartType; this.isSSR = false; this.trackBy = (index, item) => { return item.name; }; } ngOnInit() { if (isPlatformServer(this.platformId)) { this.isSSR = true; } } update() { super.update(); this.dims = calculateViewDimensions({ width: this.width, height: this.height, margins: this.margin, showXAxis: this.xAxis, showYAxis: this.yAxis, xAxisHeight: this.xAxisHeight, yAxisWidth: this.yAxisWidth, showXLabel: this.showXAxisLabel, showYLabel: this.showYAxisLabel, showLegend: this.legend, legendType: this.schemeType, legendPosition: this.legendPosition }); this.formatDates(); this.groupDomain = this.getGroupDomain(); this.innerDomain = this.getInnerDomain(); this.xScale = this.getXScale(); this.yScale = this.getYScale(); this.setColors(); this.legendOptions = this.getLegendOptions(); this.transform = `translate(${this.dims.xOffset} , ${this.margin[0]})`; } getGroupDomain() { const domain = []; for (const group of this.results) { if (!domain.includes(group.label)) { domain.push(group.label); } } return domain; } getInnerDomain() { const domain = []; for (const group of this.results) { for (const d of group.series) { if (!domain.includes(d.label)) { domain.push(d.label); } } } return domain; } getYScale() { const spacing = this.groupDomain.length / (this.dims.height / this.barPadding + 1); return scaleBand().rangeRound([0, this.dims.height]).paddingInner(spacing).domain(this.groupDomain); } getXScale() { const scale = scaleLinear().range([0, this.dims.width]).domain(this.valueDomain); return this.roundDomains ? scale.nice() : scale; } groupTransform(group) { return `translate(0, ${this.yScale(group.name)})`; } onClick(data, group) { if (group) { data.series = group.name; } this.select.emit(data); } setColors() { let domain; if (this.schemeType === ScaleType.Ordinal) { domain = this.innerDomain; } else { domain = this.valueDomain; } this.colors = new ColorHelper(this.scheme, this.schemeType, domain, this.customColors); } getLegendOptions() { const opts = { scaleType: this.schemeType, colors: undefined, domain: [], title: undefined, position: this.legendPosition }; if (opts.scaleType === ScaleType.Ordinal) { opts.domain = this.innerDomain; opts.colors = this.colors; opts.title = this.legendTitle; } else { opts.domain = this.valueDomain; opts.colors = this.colors.scale; } return opts; } updateYAxisWidth({ width }) { this.yAxisWidth = width; this.update(); } updateXAxisHeight({ height }) { this.xAxisHeight = height; this.update(); } onActivate(event, group, fromLegend = false) { const item = Object.assign({}, event); if (group) { item.series = group.name; } const items = this.results .map(g => g.series) .flat() .filter(i => { if (fromLegend) { return i.label === item.name; } else { return i.name === item.name && i.series === item.series; } }); this.activeEntries = [...items]; this.activate.emit({ value: item, entries: this.activeEntries }); } onDeactivate(event, group, fromLegend = false) { const item = Object.assign({}, event); if (group) { item.series = group.name; } this.activeEntries = this.activeEntries.filter(i => { if (fromLegend) { return i.label !== item.name; } else { return !(i.name === item.name && i.series === item.series); } }); this.deactivate.emit({ value: item, entries: this.activeEntries }); } } BarHorizontalNormalizedComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BarHorizontalNormalizedComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); BarHorizontalNormalizedComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: BarHorizontalNormalizedComponent, selector: "ngx-charts-bar-horizontal-normalized", inputs: { legend: "legend", legendTitle: "legendTitle", legendPosition: "legendPosition", xAxis: "xAxis", yAxis: "yAxis", showXAxisLabel: "showXAxisLabel", showYAxisLabel: "showYAxisLabel", xAxisLabel: "xAxisLabel", yAxisLabel: "yAxisLabel", tooltipDisabled: "tooltipDisabled", gradient: "gradient", showGridLines: "showGridLines", activeEntries: "activeEntries", schemeType: "schemeType", trimXAxisTicks: "trimXAxisTicks", trimYAxisTicks: "trimYAxisTicks", rotateXAxisTicks: "rotateXAxisTicks", maxXAxisTickLength: "maxXAxisTickLength", maxYAxisTickLength: "maxYAxisTickLength", xAxisTickFormatting: "xAxisTickFormatting", yAxisTickFormatting: "yAxisTickFormatting", xAxisTicks: "xAxisTicks", yAxisTicks: "yAxisTicks", barPadding: "barPadding", roundDomains: "roundDomains", noBarWhenZero: "noBarWhenZero", wrapTicks: "wrapTicks" }, outputs: { activate: "activate", deactivate: "deactivate" }, queries: [{ propertyName: "tooltipTemplate", first: true, predicate: ["tooltipTemplate"], descendants: true }], usesInheritance: true, ngImport: i0, template: ` `, isInline: true, styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n"], components: [{ type: ChartComponent, selector: "ngx-charts-chart", inputs: ["view", "showLegend", "legendOptions", "legendType", "activeEntries", "animations"], outputs: ["legendLabelClick", "legendLabelActivate", "legendLabelDeactivate"] }, { type: XAxisComponent, selector: "g[ngx-charts-x-axis]", inputs: ["xScale", "dims", "trimTicks", "rotateTicks", "maxTickLength", "tickFormatting", "showGridLines", "showLabel", "labelText", "ticks", "xAxisTickCount", "xOrient", "xAxisOffset", "wrapTicks"], outputs: ["dimensionsChanged"] }, { type: YAxisComponent, selector: "g[ngx-charts-y-axis]", inputs: ["yScale", "dims", "trimTicks", "maxTickLength", "tickFormatting", "ticks", "showGridLines", "showLabel", "labelText", "yAxisTickCount", "yOrient", "referenceLines", "showRefLines", "showRefLabels", "yAxisOffset", "wrapTicks"], outputs: ["dimensionsChanged"] }, { type: SeriesHorizontal, selector: "g[ngx-charts-series-horizontal]", inputs: ["dims", "type", "series", "xScale", "yScale", "colors", "tooltipDisabled", "gradient", "activeEntries", "seriesName", "tooltipTemplate", "roundEdges", "animations", "showDataLabel", "dataLabelFormatting", "noBarWhenZero"], outputs: ["select", "activate", "deactivate", "dataLabelWidthChanged"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], animations: [ trigger('animationState', [ transition(':leave', [ style({ opacity: 1, transform: '*' }), animate(500, style({ opacity: 0, transform: 'scale(0)' })) ]) ]) ], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BarHorizontalNormalizedComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-charts-bar-horizontal-normalized', template: ` `, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, animations: [ trigger('animationState', [ transition(':leave', [ style({ opacity: 1, transform: '*' }), animate(500, style({ opacity: 0, transform: 'scale(0)' })) ]) ]) ], styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n"] }] }], propDecorators: { legend: [{ type: Input }], legendTitle: [{ type: Input }], legendPosition: [{ type: Input }], xAxis: [{ type: Input }], yAxis: [{ type: Input }], showXAxisLabel: [{ type: Input }], showYAxisLabel: [{ type: Input }], xAxisLabel: [{ type: Input }], yAxisLabel: [{ type: Input }], tooltipDisabled: [{ type: Input }], gradient: [{ type: Input }], showGridLines: [{ type: Input }], activeEntries: [{ type: Input }], schemeType: [{ type: Input }], trimXAxisTicks: [{ type: Input }], trimYAxisTicks: [{ type: Input }], rotateXAxisTicks: [{ type: Input }], maxXAxisTickLength: [{ type: Input }], maxYAxisTickLength: [{ type: Input }], xAxisTickFormatting: [{ type: Input }], yAxisTickFormatting: [{ type: Input }], xAxisTicks: [{ type: Input }], yAxisTicks: [{ type: Input }], barPadding: [{ type: Input }], roundDomains: [{ type: Input }], noBarWhenZero: [{ type: Input }], wrapTicks: [{ type: Input }], activate: [{ type: Output }], deactivate: [{ type: Output }], tooltipTemplate: [{ type: ContentChild, args: ['tooltipTemplate'] }] } }); class BarHorizontalStackedComponent extends BaseChartComponent { constructor() { super(...arguments); this.legend = false; this.legendTitle = 'Legend'; this.legendPosition = LegendPosition.Right; this.tooltipDisabled = false; this.showGridLines = true; this.activeEntries = []; this.trimXAxisTicks = true; this.trimYAxisTicks = true; this.rotateXAxisTicks = true; this.maxXAxisTickLength = 16; this.maxYAxisTickLength = 16; this.barPadding = 8; this.roundDomains = false; this.showDataLabel = false; this.noBarWhenZero = true; this.wrapTicks = false; this.activate = new EventEmitter(); this.deactivate = new EventEmitter(); this.margin = [10, 20, 10, 20]; this.xAxisHeight = 0; this.yAxisWidth = 0; this.dataLabelMaxWidth = { negative: 0, positive: 0 }; this.barChartType = BarChartType; this.isSSR = false; this.trackBy = (index, item) => { return item.name; }; } ngOnInit() { if (isPlatformServer(this.platformId)) { this.isSSR = true; } } update() { super.update(); if (!this.showDataLabel) { this.dataLabelMaxWidth = { negative: 0, positive: 0 }; } this.margin = [10, 20 + this.dataLabelMaxWidth.positive, 10, 20 + this.dataLabelMaxWidth.negative]; this.dims = calculateViewDimensions({ width: this.width, height: this.height, margins: this.margin, showXAxis: this.xAxis, showYAxis: this.yAxis, xAxisHeight: this.xAxisHeight, yAxisWidth: this.yAxisWidth, showXLabel: this.showXAxisLabel, showYLabel: this.showYAxisLabel, showLegend: this.legend, legendType: this.schemeType, legendPosition: this.legendPosition }); this.formatDates(); this.groupDomain = this.getGroupDomain(); this.innerDomain = this.getInnerDomain(); this.valueDomain = this.getValueDomain(); this.xScale = this.getXScale(); this.yScale = this.getYScale(); this.setColors(); this.legendOptions = this.getLegendOptions(); this.transform = `translate(${this.dims.xOffset} , ${this.margin[0]})`; } getGroupDomain() { const domain = []; for (const group of this.results) { if (!domain.includes(group.label)) { domain.push(group.label); } } return domain; } getInnerDomain() { const domain = []; for (const group of this.results) { for (const d of group.series) { if (!domain.includes(d.label)) { domain.push(d.label); } } } return domain; } getValueDomain() { const domain = []; let smallest = 0; let biggest = 0; for (const group of this.results) { let smallestSum = 0; let biggestSum = 0; for (const d of group.series) { if (d.value < 0) { smallestSum += d.value; } else { biggestSum += d.value; } smallest = d.value < smallest ? d.value : smallest; biggest = d.value > biggest ? d.value : biggest; } domain.push(smallestSum); domain.push(biggestSum); } domain.push(smallest); domain.push(biggest); const min = Math.min(0, ...domain); const max = this.xScaleMax ? Math.max(this.xScaleMax, ...domain) : Math.max(...domain); return [min, max]; } getYScale() { const spacing = this.groupDomain.length / (this.dims.height / this.barPadding + 1); return scaleBand().rangeRound([0, this.dims.height]).paddingInner(spacing).domain(this.groupDomain); } getXScale() { const scale = scaleLinear().range([0, this.dims.width]).domain(this.valueDomain); return this.roundDomains ? scale.nice() : scale; } groupTransform(group) { return `translate(0, ${this.yScale(group.name)})`; } onClick(data, group) { if (group) { data.series = group.name; } this.select.emit(data); } setColors() { let domain; if (this.schemeType === ScaleType.Ordinal) { domain = this.innerDomain; } else { domain = this.valueDomain; } this.colors = new ColorHelper(this.scheme, this.schemeType, domain, this.customColors); } getLegendOptions() { const opts = { scaleType: this.schemeType, colors: undefined, domain: [], title: undefined, position: this.legendPosition }; if (opts.scaleType === ScaleType.Ordinal) { opts.domain = this.innerDomain; opts.colors = this.colors; opts.title = this.legendTitle; } else { opts.domain = this.valueDomain; opts.colors = this.colors.scale; } return opts; } updateYAxisWidth({ width }) { this.yAxisWidth = width; this.update(); } updateXAxisHeight({ height }) { this.xAxisHeight = height; this.update(); } onDataLabelMaxWidthChanged(event, groupIndex) { if (event.size.negative) { this.dataLabelMaxWidth.negative = Math.max(this.dataLabelMaxWidth.negative, event.size.width); } else { this.dataLabelMaxWidth.positive = Math.max(this.dataLabelMaxWidth.positive, event.size.width); } if (groupIndex === this.results.length - 1) { setTimeout(() => this.update()); } } onActivate(event, group, fromLegend = false) { const item = Object.assign({}, event); if (group) { item.series = group.name; } const items = this.results .map(g => g.series) .flat() .filter(i => { if (fromLegend) { return i.label === item.name; } else { return i.name === item.name && i.series === item.series; } }); this.activeEntries = [...items]; this.activate.emit({ value: item, entries: this.activeEntries }); } onDeactivate(event, group, fromLegend = false) { const item = Object.assign({}, event); if (group) { item.series = group.name; } this.activeEntries = this.activeEntries.filter(i => { if (fromLegend) { return i.label !== item.name; } else { return !(i.name === item.name && i.series === item.series); } }); this.deactivate.emit({ value: item, entries: this.activeEntries }); } } BarHorizontalStackedComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BarHorizontalStackedComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); BarHorizontalStackedComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: BarHorizontalStackedComponent, selector: "ngx-charts-bar-horizontal-stacked", inputs: { legend: "legend", legendTitle: "legendTitle", legendPosition: "legendPosition", xAxis: "xAxis", yAxis: "yAxis", showXAxisLabel: "showXAxisLabel", showYAxisLabel: "showYAxisLabel", xAxisLabel: "xAxisLabel", yAxisLabel: "yAxisLabel", tooltipDisabled: "tooltipDisabled", gradient: "gradient", showGridLines: "showGridLines", activeEntries: "activeEntries", schemeType: "schemeType", trimXAxisTicks: "trimXAxisTicks", trimYAxisTicks: "trimYAxisTicks", rotateXAxisTicks: "rotateXAxisTicks", maxXAxisTickLength: "maxXAxisTickLength", maxYAxisTickLength: "maxYAxisTickLength", xAxisTickFormatting: "xAxisTickFormatting", yAxisTickFormatting: "yAxisTickFormatting", xAxisTicks: "xAxisTicks", yAxisTicks: "yAxisTicks", barPadding: "barPadding", roundDomains: "roundDomains", xScaleMax: "xScaleMax", showDataLabel: "showDataLabel", dataLabelFormatting: "dataLabelFormatting", noBarWhenZero: "noBarWhenZero", wrapTicks: "wrapTicks" }, outputs: { activate: "activate", deactivate: "deactivate" }, queries: [{ propertyName: "tooltipTemplate", first: true, predicate: ["tooltipTemplate"], descendants: true }], usesInheritance: true, ngImport: i0, template: ` `, isInline: true, styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n"], components: [{ type: ChartComponent, selector: "ngx-charts-chart", inputs: ["view", "showLegend", "legendOptions", "legendType", "activeEntries", "animations"], outputs: ["legendLabelClick", "legendLabelActivate", "legendLabelDeactivate"] }, { type: XAxisComponent, selector: "g[ngx-charts-x-axis]", inputs: ["xScale", "dims", "trimTicks", "rotateTicks", "maxTickLength", "tickFormatting", "showGridLines", "showLabel", "labelText", "ticks", "xAxisTickCount", "xOrient", "xAxisOffset", "wrapTicks"], outputs: ["dimensionsChanged"] }, { type: YAxisComponent, selector: "g[ngx-charts-y-axis]", inputs: ["yScale", "dims", "trimTicks", "maxTickLength", "tickFormatting", "ticks", "showGridLines", "showLabel", "labelText", "yAxisTickCount", "yOrient", "referenceLines", "showRefLines", "showRefLabels", "yAxisOffset", "wrapTicks"], outputs: ["dimensionsChanged"] }, { type: SeriesHorizontal, selector: "g[ngx-charts-series-horizontal]", inputs: ["dims", "type", "series", "xScale", "yScale", "colors", "tooltipDisabled", "gradient", "activeEntries", "seriesName", "tooltipTemplate", "roundEdges", "animations", "showDataLabel", "dataLabelFormatting", "noBarWhenZero"], outputs: ["select", "activate", "deactivate", "dataLabelWidthChanged"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], animations: [ trigger('animationState', [ transition(':leave', [ style({ opacity: 1, transform: '*' }), animate(500, style({ opacity: 0, transform: 'scale(0)' })) ]) ]) ], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BarHorizontalStackedComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-charts-bar-horizontal-stacked', template: ` `, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, animations: [ trigger('animationState', [ transition(':leave', [ style({ opacity: 1, transform: '*' }), animate(500, style({ opacity: 0, transform: 'scale(0)' })) ]) ]) ], styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n"] }] }], propDecorators: { legend: [{ type: Input }], legendTitle: [{ type: Input }], legendPosition: [{ type: Input }], xAxis: [{ type: Input }], yAxis: [{ type: Input }], showXAxisLabel: [{ type: Input }], showYAxisLabel: [{ type: Input }], xAxisLabel: [{ type: Input }], yAxisLabel: [{ type: Input }], tooltipDisabled: [{ type: Input }], gradient: [{ type: Input }], showGridLines: [{ type: Input }], activeEntries: [{ type: Input }], schemeType: [{ type: Input }], trimXAxisTicks: [{ type: Input }], trimYAxisTicks: [{ type: Input }], rotateXAxisTicks: [{ type: Input }], maxXAxisTickLength: [{ type: Input }], maxYAxisTickLength: [{ type: Input }], xAxisTickFormatting: [{ type: Input }], yAxisTickFormatting: [{ type: Input }], xAxisTicks: [{ type: Input }], yAxisTicks: [{ type: Input }], barPadding: [{ type: Input }], roundDomains: [{ type: Input }], xScaleMax: [{ type: Input }], showDataLabel: [{ type: Input }], dataLabelFormatting: [{ type: Input }], noBarWhenZero: [{ type: Input }], wrapTicks: [{ type: Input }], activate: [{ type: Output }], deactivate: [{ type: Output }], tooltipTemplate: [{ type: ContentChild, args: ['tooltipTemplate'] }] } }); class SeriesVerticalComponent { constructor(platformId) { this.platformId = platformId; this.type = BarChartType.Standard; this.tooltipDisabled = false; this.animations = true; this.showDataLabel = false; this.noBarWhenZero = true; this.select = new EventEmitter(); this.activate = new EventEmitter(); this.deactivate = new EventEmitter(); this.dataLabelHeightChanged = new EventEmitter(); this.barsForDataLabels = []; this.barOrientation = BarOrientation; this.isSSR = false; } ngOnInit() { if (isPlatformServer(this.platformId)) { this.isSSR = true; } } ngOnChanges(changes) { this.update(); } update() { this.updateTooltipSettings(); let width; if (this.series.length) { width = this.xScale.bandwidth(); } width = Math.round(width); const yScaleMin = Math.max(this.yScale.domain()[0], 0); const d0 = { [D0Types.positive]: 0, [D0Types.negative]: 0 }; let d0Type = D0Types.positive; let total; if (this.type === BarChartType.Normalized) { total = this.series.map(d => d.value).reduce((sum, d) => sum + d, 0); } this.bars = this.series.map((d, index) => { let value = d.value; const label = this.getLabel(d); const formattedLabel = formatLabel(label); const roundEdges = this.roundEdges; d0Type = value > 0 ? D0Types.positive : D0Types.negative; const bar = { value, label, roundEdges, data: d, width, formattedLabel, height: 0, x: 0, y: 0 }; if (this.type === BarChartType.Standard) { bar.height = Math.abs(this.yScale(value) - this.yScale(yScaleMin)); bar.x = this.xScale(label); if (value < 0) { bar.y = this.yScale(0); } else { bar.y = this.yScale(value); } } else if (this.type === BarChartType.Stacked) { const offset0 = d0[d0Type]; const offset1 = offset0 + value; d0[d0Type] += value; bar.height = this.yScale(offset0) - this.yScale(offset1); bar.x = 0; bar.y = this.yScale(offset1); bar.offset0 = offset0; bar.offset1 = offset1; } else if (this.type === BarChartType.Normalized) { let offset0 = d0[d0Type]; let offset1 = offset0 + value; d0[d0Type] += value; if (total > 0) { offset0 = (offset0 * 100) / total; offset1 = (offset1 * 100) / total; } else { offset0 = 0; offset1 = 0; } bar.height = this.yScale(offset0) - this.yScale(offset1); bar.x = 0; bar.y = this.yScale(offset1); bar.offset0 = offset0; bar.offset1 = offset1; value = (offset1 - offset0).toFixed(2) + '%'; } if (this.colors.scaleType === ScaleType.Ordinal) { bar.color = this.colors.getColor(label); } else { if (this.type === BarChartType.Standard) { bar.color = this.colors.getColor(value); bar.gradientStops = this.colors.getLinearGradientStops(value); } else { bar.color = this.colors.getColor(bar.offset1); bar.gradientStops = this.colors.getLinearGradientStops(bar.offset1, bar.offset0); } } let tooltipLabel = formattedLabel; bar.ariaLabel = formattedLabel + ' ' + value.toLocaleString(); if (this.seriesName !== null && this.seriesName !== undefined) { tooltipLabel = `${this.seriesName} • ${formattedLabel}`; bar.data.series = this.seriesName; bar.ariaLabel = this.seriesName + ' ' + bar.ariaLabel; } bar.tooltipText = this.tooltipDisabled ? undefined : ` ${escapeLabel(tooltipLabel)} ${this.dataLabelFormatting ? this.dataLabelFormatting(value) : value.toLocaleString()} `; return bar; }); this.updateDataLabels(); } updateDataLabels() { if (this.type === BarChartType.Stacked) { this.barsForDataLabels = []; const section = {}; section.series = this.seriesName; const totalPositive = this.series.map(d => d.value).reduce((sum, d) => (d > 0 ? sum + d : sum), 0); const totalNegative = this.series.map(d => d.value).reduce((sum, d) => (d < 0 ? sum + d : sum), 0); section.total = totalPositive + totalNegative; section.x = 0; section.y = 0; if (section.total > 0) { section.height = this.yScale(totalPositive); } else { section.height = this.yScale(totalNegative); } section.width = this.xScale.bandwidth(); this.barsForDataLabels.push(section); } else { this.barsForDataLabels = this.series.map(d => { const section = {}; section.series = this.seriesName ?? d.label; section.total = d.value; section.x = this.xScale(d.label); section.y = this.yScale(0); section.height = this.yScale(section.total) - this.yScale(0); section.width = this.xScale.bandwidth(); return section; }); } } updateTooltipSettings() { this.tooltipPlacement = this.tooltipDisabled ? undefined : PlacementTypes.Top; this.tooltipType = this.tooltipDisabled ? undefined : StyleTypes.tooltip; } isActive(entry) { if (!this.activeEntries) return false; const item = this.activeEntries.find(active => { return entry.name === active.name && entry.value === active.value; }); return item !== undefined; } onClick(data) { this.select.emit(data); } getLabel(dataItem) { if (dataItem.label) { return dataItem.label; } return dataItem.name; } trackBy(index, bar) { return bar.label; } trackDataLabelBy(index, barLabel) { return index + '#' + barLabel.series + '#' + barLabel.total; } } SeriesVerticalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: SeriesVerticalComponent, deps: [{ token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component }); SeriesVerticalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: SeriesVerticalComponent, selector: "g[ngx-charts-series-vertical]", inputs: { dims: "dims", type: "type", series: "series", xScale: "xScale", yScale: "yScale", colors: "colors", gradient: "gradient", activeEntries: "activeEntries", seriesName: "seriesName", tooltipDisabled: "tooltipDisabled", tooltipTemplate: "tooltipTemplate", roundEdges: "roundEdges", animations: "animations", showDataLabel: "showDataLabel", dataLabelFormatting: "dataLabelFormatting", noBarWhenZero: "noBarWhenZero" }, outputs: { select: "select", activate: "activate", deactivate: "deactivate", dataLabelHeightChanged: "dataLabelHeightChanged" }, usesOnChanges: true, ngImport: i0, template: ` `, isInline: true, components: [{ type: BarComponent, selector: "g[ngx-charts-bar]", inputs: ["fill", "data", "width", "height", "x", "y", "orientation", "roundEdges", "gradient", "offset", "isActive", "stops", "animations", "ariaLabel", "noBarWhenZero"], outputs: ["select", "activate", "deactivate"] }, { type: BarLabelComponent, selector: "g[ngx-charts-bar-label]", inputs: ["value", "valueFormatting", "barX", "barY", "barWidth", "barHeight", "orientation"], outputs: ["dimensionsChanged"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: TooltipDirective, selector: "[ngx-tooltip]", inputs: ["tooltipCssClass", "tooltipTitle", "tooltipAppendToBody", "tooltipSpacing", "tooltipDisabled", "tooltipShowCaret", "tooltipPlacement", "tooltipAlignment", "tooltipType", "tooltipCloseOnClickOutside", "tooltipCloseOnMouseLeave", "tooltipHideTimeout", "tooltipShowTimeout", "tooltipTemplate", "tooltipShowEvent", "tooltipContext", "tooltipImmediateExit"], outputs: ["show", "hide"] }], animations: [ trigger('animationState', [ transition(':leave', [ style({ opacity: 1 }), animate(500, style({ opacity: 0 })) ]) ]) ], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: SeriesVerticalComponent, decorators: [{ type: Component, args: [{ selector: 'g[ngx-charts-series-vertical]', template: ` `, changeDetection: ChangeDetectionStrategy.OnPush, animations: [ trigger('animationState', [ transition(':leave', [ style({ opacity: 1 }), animate(500, style({ opacity: 0 })) ]) ]) ] }] }], ctorParameters: function () { return [{ type: undefined, decorators: [{ type: Inject, args: [PLATFORM_ID] }] }]; }, propDecorators: { dims: [{ type: Input }], type: [{ type: Input }], series: [{ type: Input }], xScale: [{ type: Input }], yScale: [{ type: Input }], colors: [{ type: Input }], gradient: [{ type: Input }], activeEntries: [{ type: Input }], seriesName: [{ type: Input }], tooltipDisabled: [{ type: Input }], tooltipTemplate: [{ type: Input }], roundEdges: [{ type: Input }], animations: [{ type: Input }], showDataLabel: [{ type: Input }], dataLabelFormatting: [{ type: Input }], noBarWhenZero: [{ type: Input }], select: [{ type: Output }], activate: [{ type: Output }], deactivate: [{ type: Output }], dataLabelHeightChanged: [{ type: Output }] } }); class BarVerticalComponent extends BaseChartComponent { constructor() { super(...arguments); this.legend = false; this.legendTitle = 'Legend'; this.legendPosition = LegendPosition.Right; this.tooltipDisabled = false; this.showGridLines = true; this.activeEntries = []; this.trimXAxisTicks = true; this.trimYAxisTicks = true; this.rotateXAxisTicks = true; this.maxXAxisTickLength = 16; this.maxYAxisTickLength = 16; this.barPadding = 8; this.roundDomains = false; this.roundEdges = true; this.showDataLabel = false; this.noBarWhenZero = true; this.wrapTicks = false; this.activate = new EventEmitter(); this.deactivate = new EventEmitter(); this.margin = [10, 20, 10, 20]; this.xAxisHeight = 0; this.yAxisWidth = 0; this.dataLabelMaxHeight = { negative: 0, positive: 0 }; } update() { super.update(); if (!this.showDataLabel) { this.dataLabelMaxHeight = { negative: 0, positive: 0 }; } this.margin = [10 + this.dataLabelMaxHeight.positive, 20, 10 + this.dataLabelMaxHeight.negative, 20]; this.dims = calculateViewDimensions({ width: this.width, height: this.height, margins: this.margin, showXAxis: this.xAxis, showYAxis: this.yAxis, xAxisHeight: this.xAxisHeight, yAxisWidth: this.yAxisWidth, showXLabel: this.showXAxisLabel, showYLabel: this.showYAxisLabel, showLegend: this.legend, legendType: this.schemeType, legendPosition: this.legendPosition }); this.formatDates(); if (this.showDataLabel) { this.dims.height -= this.dataLabelMaxHeight.negative; } this.xScale = this.getXScale(); this.yScale = this.getYScale(); this.setColors(); this.legendOptions = this.getLegendOptions(); this.transform = `translate(${this.dims.xOffset} , ${this.margin[0] + this.dataLabelMaxHeight.negative})`; } getXScale() { this.xDomain = this.getXDomain(); const spacing = this.xDomain.length / (this.dims.width / this.barPadding + 1); return scaleBand().range([0, this.dims.width]).paddingInner(spacing).domain(this.xDomain); } getYScale() { this.yDomain = this.getYDomain(); const scale = scaleLinear().range([this.dims.height, 0]).domain(this.yDomain); return this.roundDomains ? scale.nice() : scale; } getXDomain() { return this.results.map(d => d.label); } getYDomain() { const values = this.results.map(d => d.value); let min = this.yScaleMin ? Math.min(this.yScaleMin, ...values) : Math.min(0, ...values); if (this.yAxisTicks && !this.yAxisTicks.some(isNaN)) { min = Math.min(min, ...this.yAxisTicks); } let max = this.yScaleMax ? Math.max(this.yScaleMax, ...values) : Math.max(0, ...values); if (this.yAxisTicks && !this.yAxisTicks.some(isNaN)) { max = Math.max(max, ...this.yAxisTicks); } return [min, max]; } onClick(data) { this.select.emit(data); } setColors() { let domain; if (this.schemeType === ScaleType.Ordinal) { domain = this.xDomain; } else { domain = this.yDomain; } this.colors = new ColorHelper(this.scheme, this.schemeType, domain, this.customColors); } getLegendOptions() { const opts = { scaleType: this.schemeType, colors: undefined, domain: [], title: undefined, position: this.legendPosition }; if (opts.scaleType === ScaleType.Ordinal) { opts.domain = this.xDomain; opts.colors = this.colors; opts.title = this.legendTitle; } else { opts.domain = this.yDomain; opts.colors = this.colors.scale; } return opts; } updateYAxisWidth({ width }) { this.yAxisWidth = width; this.update(); } updateXAxisHeight({ height }) { this.xAxisHeight = height; this.update(); } onDataLabelMaxHeightChanged(event) { if (event.size.negative) { this.dataLabelMaxHeight.negative = Math.max(this.dataLabelMaxHeight.negative, event.size.height); } else { this.dataLabelMaxHeight.positive = Math.max(this.dataLabelMaxHeight.positive, event.size.height); } if (event.index === this.results.length - 1) { setTimeout(() => this.update()); } } onActivate(item, fromLegend = false) { item = this.results.find(d => { if (fromLegend) { return d.label === item.name; } else { return d.name === item.name; } }); const idx = this.activeEntries.findIndex(d => { return d.name === item.name && d.value === item.value && d.series === item.series; }); if (idx > -1) { return; } this.activeEntries = [item, ...this.activeEntries]; this.activate.emit({ value: item, entries: this.activeEntries }); } onDeactivate(item, fromLegend = false) { item = this.results.find(d => { if (fromLegend) { return d.label === item.name; } else { return d.name === item.name; } }); const idx = this.activeEntries.findIndex(d => { return d.name === item.name && d.value === item.value && d.series === item.series; }); this.activeEntries.splice(idx, 1); this.activeEntries = [...this.activeEntries]; this.deactivate.emit({ value: item, entries: this.activeEntries }); } } BarVerticalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BarVerticalComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); BarVerticalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: BarVerticalComponent, selector: "ngx-charts-bar-vertical", inputs: { legend: "legend", legendTitle: "legendTitle", legendPosition: "legendPosition", xAxis: "xAxis", yAxis: "yAxis", showXAxisLabel: "showXAxisLabel", showYAxisLabel: "showYAxisLabel", xAxisLabel: "xAxisLabel", yAxisLabel: "yAxisLabel", tooltipDisabled: "tooltipDisabled", gradient: "gradient", showGridLines: "showGridLines", activeEntries: "activeEntries", schemeType: "schemeType", trimXAxisTicks: "trimXAxisTicks", trimYAxisTicks: "trimYAxisTicks", rotateXAxisTicks: "rotateXAxisTicks", maxXAxisTickLength: "maxXAxisTickLength", maxYAxisTickLength: "maxYAxisTickLength", xAxisTickFormatting: "xAxisTickFormatting", yAxisTickFormatting: "yAxisTickFormatting", xAxisTicks: "xAxisTicks", yAxisTicks: "yAxisTicks", barPadding: "barPadding", roundDomains: "roundDomains", roundEdges: "roundEdges", yScaleMax: "yScaleMax", yScaleMin: "yScaleMin", showDataLabel: "showDataLabel", dataLabelFormatting: "dataLabelFormatting", noBarWhenZero: "noBarWhenZero", wrapTicks: "wrapTicks" }, outputs: { activate: "activate", deactivate: "deactivate" }, queries: [{ propertyName: "tooltipTemplate", first: true, predicate: ["tooltipTemplate"], descendants: true }], usesInheritance: true, ngImport: i0, template: ` `, isInline: true, styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n"], components: [{ type: ChartComponent, selector: "ngx-charts-chart", inputs: ["view", "showLegend", "legendOptions", "legendType", "activeEntries", "animations"], outputs: ["legendLabelClick", "legendLabelActivate", "legendLabelDeactivate"] }, { type: XAxisComponent, selector: "g[ngx-charts-x-axis]", inputs: ["xScale", "dims", "trimTicks", "rotateTicks", "maxTickLength", "tickFormatting", "showGridLines", "showLabel", "labelText", "ticks", "xAxisTickCount", "xOrient", "xAxisOffset", "wrapTicks"], outputs: ["dimensionsChanged"] }, { type: YAxisComponent, selector: "g[ngx-charts-y-axis]", inputs: ["yScale", "dims", "trimTicks", "maxTickLength", "tickFormatting", "ticks", "showGridLines", "showLabel", "labelText", "yAxisTickCount", "yOrient", "referenceLines", "showRefLines", "showRefLabels", "yAxisOffset", "wrapTicks"], outputs: ["dimensionsChanged"] }, { type: SeriesVerticalComponent, selector: "g[ngx-charts-series-vertical]", inputs: ["dims", "type", "series", "xScale", "yScale", "colors", "gradient", "activeEntries", "seriesName", "tooltipDisabled", "tooltipTemplate", "roundEdges", "animations", "showDataLabel", "dataLabelFormatting", "noBarWhenZero"], outputs: ["select", "activate", "deactivate", "dataLabelHeightChanged"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BarVerticalComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-charts-bar-vertical', template: ` `, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n"] }] }], propDecorators: { legend: [{ type: Input }], legendTitle: [{ type: Input }], legendPosition: [{ type: Input }], xAxis: [{ type: Input }], yAxis: [{ type: Input }], showXAxisLabel: [{ type: Input }], showYAxisLabel: [{ type: Input }], xAxisLabel: [{ type: Input }], yAxisLabel: [{ type: Input }], tooltipDisabled: [{ type: Input }], gradient: [{ type: Input }], showGridLines: [{ type: Input }], activeEntries: [{ type: Input }], schemeType: [{ type: Input }], trimXAxisTicks: [{ type: Input }], trimYAxisTicks: [{ type: Input }], rotateXAxisTicks: [{ type: Input }], maxXAxisTickLength: [{ type: Input }], maxYAxisTickLength: [{ type: Input }], xAxisTickFormatting: [{ type: Input }], yAxisTickFormatting: [{ type: Input }], xAxisTicks: [{ type: Input }], yAxisTicks: [{ type: Input }], barPadding: [{ type: Input }], roundDomains: [{ type: Input }], roundEdges: [{ type: Input }], yScaleMax: [{ type: Input }], yScaleMin: [{ type: Input }], showDataLabel: [{ type: Input }], dataLabelFormatting: [{ type: Input }], noBarWhenZero: [{ type: Input }], wrapTicks: [{ type: Input }], activate: [{ type: Output }], deactivate: [{ type: Output }], tooltipTemplate: [{ type: ContentChild, args: ['tooltipTemplate'] }] } }); class BarVertical2DComponent extends BaseChartComponent { constructor() { super(...arguments); this.legend = false; this.legendTitle = 'Legend'; this.legendPosition = LegendPosition.Right; this.tooltipDisabled = false; this.scaleType = ScaleType.Ordinal; this.showGridLines = true; this.activeEntries = []; this.trimXAxisTicks = true; this.trimYAxisTicks = true; this.rotateXAxisTicks = true; this.maxXAxisTickLength = 16; this.maxYAxisTickLength = 16; this.groupPadding = 16; this.barPadding = 8; this.roundDomains = false; this.roundEdges = true; this.showDataLabel = false; this.noBarWhenZero = true; this.wrapTicks = false; this.activate = new EventEmitter(); this.deactivate = new EventEmitter(); this.margin = [10, 20, 10, 20]; this.xAxisHeight = 0; this.yAxisWidth = 0; this.dataLabelMaxHeight = { negative: 0, positive: 0 }; this.isSSR = false; this.barOrientation = BarOrientation; this.trackBy = (index, item) => { return item.name; }; } ngOnInit() { if (isPlatformServer(this.platformId)) { this.isSSR = true; } } update() { super.update(); if (!this.showDataLabel) { this.dataLabelMaxHeight = { negative: 0, positive: 0 }; } this.margin = [10 + this.dataLabelMaxHeight.positive, 20, 10 + this.dataLabelMaxHeight.negative, 20]; this.dims = calculateViewDimensions({ width: this.width, height: this.height, margins: this.margin, showXAxis: this.xAxis, showYAxis: this.yAxis, xAxisHeight: this.xAxisHeight, yAxisWidth: this.yAxisWidth, showXLabel: this.showXAxisLabel, showYLabel: this.showYAxisLabel, showLegend: this.legend, legendType: this.schemeType, legendPosition: this.legendPosition }); if (this.showDataLabel) { this.dims.height -= this.dataLabelMaxHeight.negative; } this.formatDates(); this.groupDomain = this.getGroupDomain(); this.innerDomain = this.getInnerDomain(); this.valueDomain = this.getValueDomain(); this.groupScale = this.getGroupScale(); this.innerScale = this.getInnerScale(); this.valueScale = this.getValueScale(); this.setColors(); this.legendOptions = this.getLegendOptions(); this.transform = `translate(${this.dims.xOffset} , ${this.margin[0] + this.dataLabelMaxHeight.negative})`; } onDataLabelMaxHeightChanged(event, groupIndex) { if (event.size.negative) { this.dataLabelMaxHeight.negative = Math.max(this.dataLabelMaxHeight.negative, event.size.height); } else { this.dataLabelMaxHeight.positive = Math.max(this.dataLabelMaxHeight.positive, event.size.height); } if (groupIndex === this.results.length - 1) { setTimeout(() => this.update()); } } getGroupScale() { const spacing = this.groupDomain.length / (this.dims.height / this.groupPadding + 1); return scaleBand() .rangeRound([0, this.dims.width]) .paddingInner(spacing) .paddingOuter(spacing / 2) .domain(this.groupDomain); } getInnerScale() { const width = this.groupScale.bandwidth(); const spacing = this.innerDomain.length / (width / this.barPadding + 1); return scaleBand().rangeRound([0, width]).paddingInner(spacing).domain(this.innerDomain); } getValueScale() { const scale = scaleLinear().range([this.dims.height, 0]).domain(this.valueDomain); return this.roundDomains ? scale.nice() : scale; } getGroupDomain() { const domain = []; for (const group of this.results) { if (!domain.includes(group.label)) { domain.push(group.label); } } return domain; } getInnerDomain() { const domain = []; for (const group of this.results) { for (const d of group.series) { if (!domain.includes(d.label)) { domain.push(d.label); } } } return domain; } getValueDomain() { const domain = []; for (const group of this.results) { for (const d of group.series) { if (!domain.includes(d.value)) { domain.push(d.value); } } } const min = Math.min(0, ...domain); const max = this.yScaleMax ? Math.max(this.yScaleMax, ...domain) : Math.max(0, ...domain); return [min, max]; } groupTransform(group) { return `translate(${this.groupScale(group.label)}, 0)`; } onClick(data, group) { if (group) { data.series = group.name; } this.select.emit(data); } setColors() { let domain; if (this.schemeType === ScaleType.Ordinal) { domain = this.innerDomain; } else { domain = this.valueDomain; } this.colors = new ColorHelper(this.scheme, this.schemeType, domain, this.customColors); } getLegendOptions() { const opts = { scaleType: this.schemeType, colors: undefined, domain: [], title: undefined, position: this.legendPosition }; if (opts.scaleType === ScaleType.Ordinal) { opts.domain = this.innerDomain; opts.colors = this.colors; opts.title = this.legendTitle; } else { opts.domain = this.valueDomain; opts.colors = this.colors.scale; } return opts; } updateYAxisWidth({ width }) { this.yAxisWidth = width; this.update(); } updateXAxisHeight({ height }) { this.xAxisHeight = height; this.update(); } onActivate(event, group, fromLegend = false) { const item = Object.assign({}, event); if (group) { item.series = group.name; } const items = this.results .map(g => g.series) .flat() .filter(i => { if (fromLegend) { return i.label === item.name; } else { return i.name === item.name && i.series === item.series; } }); this.activeEntries = [...items]; this.activate.emit({ value: item, entries: this.activeEntries }); } onDeactivate(event, group, fromLegend = false) { const item = Object.assign({}, event); if (group) { item.series = group.name; } this.activeEntries = this.activeEntries.filter(i => { if (fromLegend) { return i.label !== item.name; } else { return !(i.name === item.name && i.series === item.series); } }); this.deactivate.emit({ value: item, entries: this.activeEntries }); } } BarVertical2DComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BarVertical2DComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); BarVertical2DComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: BarVertical2DComponent, selector: "ngx-charts-bar-vertical-2d", inputs: { legend: "legend", legendTitle: "legendTitle", legendPosition: "legendPosition", xAxis: "xAxis", yAxis: "yAxis", showXAxisLabel: "showXAxisLabel", showYAxisLabel: "showYAxisLabel", xAxisLabel: "xAxisLabel", yAxisLabel: "yAxisLabel", tooltipDisabled: "tooltipDisabled", scaleType: "scaleType", gradient: "gradient", showGridLines: "showGridLines", activeEntries: "activeEntries", schemeType: "schemeType", trimXAxisTicks: "trimXAxisTicks", trimYAxisTicks: "trimYAxisTicks", rotateXAxisTicks: "rotateXAxisTicks", maxXAxisTickLength: "maxXAxisTickLength", maxYAxisTickLength: "maxYAxisTickLength", xAxisTickFormatting: "xAxisTickFormatting", yAxisTickFormatting: "yAxisTickFormatting", xAxisTicks: "xAxisTicks", yAxisTicks: "yAxisTicks", groupPadding: "groupPadding", barPadding: "barPadding", roundDomains: "roundDomains", roundEdges: "roundEdges", yScaleMax: "yScaleMax", showDataLabel: "showDataLabel", dataLabelFormatting: "dataLabelFormatting", noBarWhenZero: "noBarWhenZero", wrapTicks: "wrapTicks" }, outputs: { activate: "activate", deactivate: "deactivate" }, queries: [{ propertyName: "tooltipTemplate", first: true, predicate: ["tooltipTemplate"], descendants: true }], usesInheritance: true, ngImport: i0, template: ` `, isInline: true, styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n"], components: [{ type: ChartComponent, selector: "ngx-charts-chart", inputs: ["view", "showLegend", "legendOptions", "legendType", "activeEntries", "animations"], outputs: ["legendLabelClick", "legendLabelActivate", "legendLabelDeactivate"] }, { type: GridPanelSeriesComponent, selector: "g[ngx-charts-grid-panel-series]", inputs: ["data", "dims", "xScale", "yScale", "orient"] }, { type: XAxisComponent, selector: "g[ngx-charts-x-axis]", inputs: ["xScale", "dims", "trimTicks", "rotateTicks", "maxTickLength", "tickFormatting", "showGridLines", "showLabel", "labelText", "ticks", "xAxisTickCount", "xOrient", "xAxisOffset", "wrapTicks"], outputs: ["dimensionsChanged"] }, { type: YAxisComponent, selector: "g[ngx-charts-y-axis]", inputs: ["yScale", "dims", "trimTicks", "maxTickLength", "tickFormatting", "ticks", "showGridLines", "showLabel", "labelText", "yAxisTickCount", "yOrient", "referenceLines", "showRefLines", "showRefLabels", "yAxisOffset", "wrapTicks"], outputs: ["dimensionsChanged"] }, { type: SeriesVerticalComponent, selector: "g[ngx-charts-series-vertical]", inputs: ["dims", "type", "series", "xScale", "yScale", "colors", "gradient", "activeEntries", "seriesName", "tooltipDisabled", "tooltipTemplate", "roundEdges", "animations", "showDataLabel", "dataLabelFormatting", "noBarWhenZero"], outputs: ["select", "activate", "deactivate", "dataLabelHeightChanged"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], animations: [ trigger('animationState', [ transition(':leave', [ style({ opacity: 1, transform: '*' }), animate(500, style({ opacity: 0, transform: 'scale(0)' })) ]) ]) ], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BarVertical2DComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-charts-bar-vertical-2d', template: ` `, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, animations: [ trigger('animationState', [ transition(':leave', [ style({ opacity: 1, transform: '*' }), animate(500, style({ opacity: 0, transform: 'scale(0)' })) ]) ]) ], styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n"] }] }], propDecorators: { legend: [{ type: Input }], legendTitle: [{ type: Input }], legendPosition: [{ type: Input }], xAxis: [{ type: Input }], yAxis: [{ type: Input }], showXAxisLabel: [{ type: Input }], showYAxisLabel: [{ type: Input }], xAxisLabel: [{ type: Input }], yAxisLabel: [{ type: Input }], tooltipDisabled: [{ type: Input }], scaleType: [{ type: Input }], gradient: [{ type: Input }], showGridLines: [{ type: Input }], activeEntries: [{ type: Input }], schemeType: [{ type: Input }], trimXAxisTicks: [{ type: Input }], trimYAxisTicks: [{ type: Input }], rotateXAxisTicks: [{ type: Input }], maxXAxisTickLength: [{ type: Input }], maxYAxisTickLength: [{ type: Input }], xAxisTickFormatting: [{ type: Input }], yAxisTickFormatting: [{ type: Input }], xAxisTicks: [{ type: Input }], yAxisTicks: [{ type: Input }], groupPadding: [{ type: Input }], barPadding: [{ type: Input }], roundDomains: [{ type: Input }], roundEdges: [{ type: Input }], yScaleMax: [{ type: Input }], showDataLabel: [{ type: Input }], dataLabelFormatting: [{ type: Input }], noBarWhenZero: [{ type: Input }], wrapTicks: [{ type: Input }], activate: [{ type: Output }], deactivate: [{ type: Output }], tooltipTemplate: [{ type: ContentChild, args: ['tooltipTemplate'] }] } }); class BarVerticalNormalizedComponent extends BaseChartComponent { constructor() { super(...arguments); this.legend = false; this.legendTitle = 'Legend'; this.legendPosition = LegendPosition.Right; this.tooltipDisabled = false; this.showGridLines = true; this.activeEntries = []; this.trimXAxisTicks = true; this.trimYAxisTicks = true; this.rotateXAxisTicks = true; this.maxXAxisTickLength = 16; this.maxYAxisTickLength = 16; this.barPadding = 8; this.roundDomains = false; this.noBarWhenZero = true; this.wrapTicks = false; this.activate = new EventEmitter(); this.deactivate = new EventEmitter(); this.valueDomain = [0, 100]; this.margin = [10, 20, 10, 20]; this.xAxisHeight = 0; this.yAxisWidth = 0; this.isSSR = false; this.barChartType = BarChartType; this.trackBy = (index, item) => { return item.name; }; } ngOnInit() { if (isPlatformServer(this.platformId)) { this.isSSR = true; } } update() { super.update(); this.dims = calculateViewDimensions({ width: this.width, height: this.height, margins: this.margin, showXAxis: this.xAxis, showYAxis: this.yAxis, xAxisHeight: this.xAxisHeight, yAxisWidth: this.yAxisWidth, showXLabel: this.showXAxisLabel, showYLabel: this.showYAxisLabel, showLegend: this.legend, legendType: this.schemeType, legendPosition: this.legendPosition }); this.formatDates(); this.groupDomain = this.getGroupDomain(); this.innerDomain = this.getInnerDomain(); this.xScale = this.getXScale(); this.yScale = this.getYScale(); this.setColors(); this.legendOptions = this.getLegendOptions(); this.transform = `translate(${this.dims.xOffset} , ${this.margin[0]})`; } getGroupDomain() { const domain = []; for (const group of this.results) { if (!domain.includes(group.label)) { domain.push(group.label); } } return domain; } getInnerDomain() { const domain = []; for (const group of this.results) { for (const d of group.series) { if (!domain.includes(d.label)) { domain.push(d.label); } } } return domain; } getXScale() { const spacing = this.groupDomain.length / (this.dims.width / this.barPadding + 1); return scaleBand().rangeRound([0, this.dims.width]).paddingInner(spacing).domain(this.groupDomain); } getYScale() { const scale = scaleLinear().range([this.dims.height, 0]).domain(this.valueDomain); return this.roundDomains ? scale.nice() : scale; } groupTransform(group) { return `translate(${this.xScale(group.name)}, 0)`; } onClick(data, group) { if (group) { data.series = group.name; } this.select.emit(data); } setColors() { let domain; if (this.schemeType === ScaleType.Ordinal) { domain = this.innerDomain; } else { domain = this.valueDomain; } this.colors = new ColorHelper(this.scheme, this.schemeType, domain, this.customColors); } getLegendOptions() { const opts = { scaleType: this.schemeType, colors: undefined, domain: [], title: undefined, position: this.legendPosition }; if (opts.scaleType === ScaleType.Ordinal) { opts.domain = this.innerDomain; opts.colors = this.colors; opts.title = this.legendTitle; } else { opts.domain = this.valueDomain; opts.colors = this.colors.scale; } return opts; } updateYAxisWidth({ width }) { this.yAxisWidth = width; this.update(); } updateXAxisHeight({ height }) { this.xAxisHeight = height; this.update(); } onActivate(event, group, fromLegend = false) { const item = Object.assign({}, event); if (group) { item.series = group.name; } const items = this.results .map(g => g.series) .flat() .filter(i => { if (fromLegend) { return i.label === item.name; } else { return i.name === item.name && i.series === item.series; } }); this.activeEntries = [...items]; this.activate.emit({ value: item, entries: this.activeEntries }); } onDeactivate(event, group, fromLegend = false) { const item = Object.assign({}, event); if (group) { item.series = group.name; } this.activeEntries = this.activeEntries.filter(i => { if (fromLegend) { return i.label !== item.name; } else { return !(i.name === item.name && i.series === item.series); } }); this.deactivate.emit({ value: item, entries: this.activeEntries }); } } BarVerticalNormalizedComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BarVerticalNormalizedComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); BarVerticalNormalizedComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: BarVerticalNormalizedComponent, selector: "ngx-charts-bar-vertical-normalized", inputs: { legend: "legend", legendTitle: "legendTitle", legendPosition: "legendPosition", xAxis: "xAxis", yAxis: "yAxis", showXAxisLabel: "showXAxisLabel", showYAxisLabel: "showYAxisLabel", xAxisLabel: "xAxisLabel", yAxisLabel: "yAxisLabel", tooltipDisabled: "tooltipDisabled", gradient: "gradient", showGridLines: "showGridLines", activeEntries: "activeEntries", schemeType: "schemeType", trimXAxisTicks: "trimXAxisTicks", trimYAxisTicks: "trimYAxisTicks", rotateXAxisTicks: "rotateXAxisTicks", maxXAxisTickLength: "maxXAxisTickLength", maxYAxisTickLength: "maxYAxisTickLength", xAxisTickFormatting: "xAxisTickFormatting", yAxisTickFormatting: "yAxisTickFormatting", xAxisTicks: "xAxisTicks", yAxisTicks: "yAxisTicks", barPadding: "barPadding", roundDomains: "roundDomains", noBarWhenZero: "noBarWhenZero", wrapTicks: "wrapTicks" }, outputs: { activate: "activate", deactivate: "deactivate" }, queries: [{ propertyName: "tooltipTemplate", first: true, predicate: ["tooltipTemplate"], descendants: true }], usesInheritance: true, ngImport: i0, template: ` `, isInline: true, styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n"], components: [{ type: ChartComponent, selector: "ngx-charts-chart", inputs: ["view", "showLegend", "legendOptions", "legendType", "activeEntries", "animations"], outputs: ["legendLabelClick", "legendLabelActivate", "legendLabelDeactivate"] }, { type: XAxisComponent, selector: "g[ngx-charts-x-axis]", inputs: ["xScale", "dims", "trimTicks", "rotateTicks", "maxTickLength", "tickFormatting", "showGridLines", "showLabel", "labelText", "ticks", "xAxisTickCount", "xOrient", "xAxisOffset", "wrapTicks"], outputs: ["dimensionsChanged"] }, { type: YAxisComponent, selector: "g[ngx-charts-y-axis]", inputs: ["yScale", "dims", "trimTicks", "maxTickLength", "tickFormatting", "ticks", "showGridLines", "showLabel", "labelText", "yAxisTickCount", "yOrient", "referenceLines", "showRefLines", "showRefLabels", "yAxisOffset", "wrapTicks"], outputs: ["dimensionsChanged"] }, { type: SeriesVerticalComponent, selector: "g[ngx-charts-series-vertical]", inputs: ["dims", "type", "series", "xScale", "yScale", "colors", "gradient", "activeEntries", "seriesName", "tooltipDisabled", "tooltipTemplate", "roundEdges", "animations", "showDataLabel", "dataLabelFormatting", "noBarWhenZero"], outputs: ["select", "activate", "deactivate", "dataLabelHeightChanged"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], animations: [ trigger('animationState', [ transition(':leave', [ style({ opacity: 1, transform: '*' }), animate(500, style({ opacity: 0, transform: 'scale(0)' })) ]) ]) ], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BarVerticalNormalizedComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-charts-bar-vertical-normalized', template: ` `, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, animations: [ trigger('animationState', [ transition(':leave', [ style({ opacity: 1, transform: '*' }), animate(500, style({ opacity: 0, transform: 'scale(0)' })) ]) ]) ], styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n"] }] }], propDecorators: { legend: [{ type: Input }], legendTitle: [{ type: Input }], legendPosition: [{ type: Input }], xAxis: [{ type: Input }], yAxis: [{ type: Input }], showXAxisLabel: [{ type: Input }], showYAxisLabel: [{ type: Input }], xAxisLabel: [{ type: Input }], yAxisLabel: [{ type: Input }], tooltipDisabled: [{ type: Input }], gradient: [{ type: Input }], showGridLines: [{ type: Input }], activeEntries: [{ type: Input }], schemeType: [{ type: Input }], trimXAxisTicks: [{ type: Input }], trimYAxisTicks: [{ type: Input }], rotateXAxisTicks: [{ type: Input }], maxXAxisTickLength: [{ type: Input }], maxYAxisTickLength: [{ type: Input }], xAxisTickFormatting: [{ type: Input }], yAxisTickFormatting: [{ type: Input }], xAxisTicks: [{ type: Input }], yAxisTicks: [{ type: Input }], barPadding: [{ type: Input }], roundDomains: [{ type: Input }], noBarWhenZero: [{ type: Input }], wrapTicks: [{ type: Input }], activate: [{ type: Output }], deactivate: [{ type: Output }], tooltipTemplate: [{ type: ContentChild, args: ['tooltipTemplate'] }] } }); class BarVerticalStackedComponent extends BaseChartComponent { constructor() { super(...arguments); this.legend = false; this.legendTitle = 'Legend'; this.legendPosition = LegendPosition.Right; this.tooltipDisabled = false; this.showGridLines = true; this.activeEntries = []; this.trimXAxisTicks = true; this.trimYAxisTicks = true; this.rotateXAxisTicks = true; this.maxXAxisTickLength = 16; this.maxYAxisTickLength = 16; this.barPadding = 8; this.roundDomains = false; this.showDataLabel = false; this.noBarWhenZero = true; this.wrapTicks = false; this.activate = new EventEmitter(); this.deactivate = new EventEmitter(); this.margin = [10, 20, 10, 20]; this.xAxisHeight = 0; this.yAxisWidth = 0; this.dataLabelMaxHeight = { negative: 0, positive: 0 }; this.isSSR = false; this.barChartType = BarChartType; this.trackBy = (index, item) => { return item.name; }; } ngOnInit() { if (isPlatformServer(this.platformId)) { this.isSSR = true; } } update() { super.update(); if (!this.showDataLabel) { this.dataLabelMaxHeight = { negative: 0, positive: 0 }; } this.margin = [10 + this.dataLabelMaxHeight.positive, 20, 10 + this.dataLabelMaxHeight.negative, 20]; this.dims = calculateViewDimensions({ width: this.width, height: this.height, margins: this.margin, showXAxis: this.xAxis, showYAxis: this.yAxis, xAxisHeight: this.xAxisHeight, yAxisWidth: this.yAxisWidth, showXLabel: this.showXAxisLabel, showYLabel: this.showYAxisLabel, showLegend: this.legend, legendType: this.schemeType, legendPosition: this.legendPosition }); if (this.showDataLabel) { this.dims.height -= this.dataLabelMaxHeight.negative; } this.formatDates(); this.groupDomain = this.getGroupDomain(); this.innerDomain = this.getInnerDomain(); this.valueDomain = this.getValueDomain(); this.xScale = this.getXScale(); this.yScale = this.getYScale(); this.setColors(); this.legendOptions = this.getLegendOptions(); this.transform = `translate(${this.dims.xOffset} , ${this.margin[0] + this.dataLabelMaxHeight.negative})`; } getGroupDomain() { const domain = []; for (const group of this.results) { if (!domain.includes(group.label)) { domain.push(group.label); } } return domain; } getInnerDomain() { const domain = []; for (const group of this.results) { for (const d of group.series) { if (!domain.includes(d.label)) { domain.push(d.label); } } } return domain; } getValueDomain() { const domain = []; let smallest = 0; let biggest = 0; for (const group of this.results) { let smallestSum = 0; let biggestSum = 0; for (const d of group.series) { if (d.value < 0) { smallestSum += d.value; } else { biggestSum += d.value; } smallest = d.value < smallest ? d.value : smallest; biggest = d.value > biggest ? d.value : biggest; } domain.push(smallestSum); domain.push(biggestSum); } domain.push(smallest); domain.push(biggest); const min = Math.min(0, ...domain); const max = this.yScaleMax ? Math.max(this.yScaleMax, ...domain) : Math.max(...domain); return [min, max]; } getXScale() { const spacing = this.groupDomain.length / (this.dims.width / this.barPadding + 1); return scaleBand().rangeRound([0, this.dims.width]).paddingInner(spacing).domain(this.groupDomain); } getYScale() { const scale = scaleLinear().range([this.dims.height, 0]).domain(this.valueDomain); return this.roundDomains ? scale.nice() : scale; } onDataLabelMaxHeightChanged(event, groupIndex) { if (event.size.negative) { this.dataLabelMaxHeight.negative = Math.max(this.dataLabelMaxHeight.negative, event.size.height); } else { this.dataLabelMaxHeight.positive = Math.max(this.dataLabelMaxHeight.positive, event.size.height); } if (groupIndex === this.results.length - 1) { setTimeout(() => this.update()); } } groupTransform(group) { return `translate(${this.xScale(group.name) || 0}, 0)`; } onClick(data, group) { if (group) { data.series = group.name; } this.select.emit(data); } setColors() { let domain; if (this.schemeType === ScaleType.Ordinal) { domain = this.innerDomain; } else { domain = this.valueDomain; } this.colors = new ColorHelper(this.scheme, this.schemeType, domain, this.customColors); } getLegendOptions() { const opts = { scaleType: this.schemeType, colors: undefined, domain: [], title: undefined, position: this.legendPosition }; if (opts.scaleType === ScaleType.Ordinal) { opts.domain = this.innerDomain; opts.colors = this.colors; opts.title = this.legendTitle; } else { opts.domain = this.valueDomain; opts.colors = this.colors.scale; } return opts; } updateYAxisWidth({ width }) { this.yAxisWidth = width; this.update(); } updateXAxisHeight({ height }) { this.xAxisHeight = height; this.update(); } onActivate(event, group, fromLegend = false) { const item = Object.assign({}, event); if (group) { item.series = group.name; } const items = this.results .map(g => g.series) .flat() .filter(i => { if (fromLegend) { return i.label === item.name; } else { return i.name === item.name && i.series === item.series; } }); this.activeEntries = [...items]; this.activate.emit({ value: item, entries: this.activeEntries }); } onDeactivate(event, group, fromLegend = false) { const item = Object.assign({}, event); if (group) { item.series = group.name; } this.activeEntries = this.activeEntries.filter(i => { if (fromLegend) { return i.label !== item.name; } else { return !(i.name === item.name && i.series === item.series); } }); this.deactivate.emit({ value: item, entries: this.activeEntries }); } } BarVerticalStackedComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BarVerticalStackedComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); BarVerticalStackedComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: BarVerticalStackedComponent, selector: "ngx-charts-bar-vertical-stacked", inputs: { legend: "legend", legendTitle: "legendTitle", legendPosition: "legendPosition", xAxis: "xAxis", yAxis: "yAxis", showXAxisLabel: "showXAxisLabel", showYAxisLabel: "showYAxisLabel", xAxisLabel: "xAxisLabel", yAxisLabel: "yAxisLabel", tooltipDisabled: "tooltipDisabled", gradient: "gradient", showGridLines: "showGridLines", activeEntries: "activeEntries", schemeType: "schemeType", trimXAxisTicks: "trimXAxisTicks", trimYAxisTicks: "trimYAxisTicks", rotateXAxisTicks: "rotateXAxisTicks", maxXAxisTickLength: "maxXAxisTickLength", maxYAxisTickLength: "maxYAxisTickLength", xAxisTickFormatting: "xAxisTickFormatting", yAxisTickFormatting: "yAxisTickFormatting", xAxisTicks: "xAxisTicks", yAxisTicks: "yAxisTicks", barPadding: "barPadding", roundDomains: "roundDomains", yScaleMax: "yScaleMax", showDataLabel: "showDataLabel", dataLabelFormatting: "dataLabelFormatting", noBarWhenZero: "noBarWhenZero", wrapTicks: "wrapTicks" }, outputs: { activate: "activate", deactivate: "deactivate" }, queries: [{ propertyName: "tooltipTemplate", first: true, predicate: ["tooltipTemplate"], descendants: true }], usesInheritance: true, ngImport: i0, template: ` `, isInline: true, styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n"], components: [{ type: ChartComponent, selector: "ngx-charts-chart", inputs: ["view", "showLegend", "legendOptions", "legendType", "activeEntries", "animations"], outputs: ["legendLabelClick", "legendLabelActivate", "legendLabelDeactivate"] }, { type: XAxisComponent, selector: "g[ngx-charts-x-axis]", inputs: ["xScale", "dims", "trimTicks", "rotateTicks", "maxTickLength", "tickFormatting", "showGridLines", "showLabel", "labelText", "ticks", "xAxisTickCount", "xOrient", "xAxisOffset", "wrapTicks"], outputs: ["dimensionsChanged"] }, { type: YAxisComponent, selector: "g[ngx-charts-y-axis]", inputs: ["yScale", "dims", "trimTicks", "maxTickLength", "tickFormatting", "ticks", "showGridLines", "showLabel", "labelText", "yAxisTickCount", "yOrient", "referenceLines", "showRefLines", "showRefLabels", "yAxisOffset", "wrapTicks"], outputs: ["dimensionsChanged"] }, { type: SeriesVerticalComponent, selector: "g[ngx-charts-series-vertical]", inputs: ["dims", "type", "series", "xScale", "yScale", "colors", "gradient", "activeEntries", "seriesName", "tooltipDisabled", "tooltipTemplate", "roundEdges", "animations", "showDataLabel", "dataLabelFormatting", "noBarWhenZero"], outputs: ["select", "activate", "deactivate", "dataLabelHeightChanged"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], animations: [ trigger('animationState', [ transition(':leave', [ style({ opacity: 1, transform: '*' }), animate(500, style({ opacity: 0, transform: 'scale(0)' })) ]) ]) ], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BarVerticalStackedComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-charts-bar-vertical-stacked', template: ` `, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, animations: [ trigger('animationState', [ transition(':leave', [ style({ opacity: 1, transform: '*' }), animate(500, style({ opacity: 0, transform: 'scale(0)' })) ]) ]) ], styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n"] }] }], propDecorators: { legend: [{ type: Input }], legendTitle: [{ type: Input }], legendPosition: [{ type: Input }], xAxis: [{ type: Input }], yAxis: [{ type: Input }], showXAxisLabel: [{ type: Input }], showYAxisLabel: [{ type: Input }], xAxisLabel: [{ type: Input }], yAxisLabel: [{ type: Input }], tooltipDisabled: [{ type: Input }], gradient: [{ type: Input }], showGridLines: [{ type: Input }], activeEntries: [{ type: Input }], schemeType: [{ type: Input }], trimXAxisTicks: [{ type: Input }], trimYAxisTicks: [{ type: Input }], rotateXAxisTicks: [{ type: Input }], maxXAxisTickLength: [{ type: Input }], maxYAxisTickLength: [{ type: Input }], xAxisTickFormatting: [{ type: Input }], yAxisTickFormatting: [{ type: Input }], xAxisTicks: [{ type: Input }], yAxisTicks: [{ type: Input }], barPadding: [{ type: Input }], roundDomains: [{ type: Input }], yScaleMax: [{ type: Input }], showDataLabel: [{ type: Input }], dataLabelFormatting: [{ type: Input }], noBarWhenZero: [{ type: Input }], wrapTicks: [{ type: Input }], activate: [{ type: Output }], deactivate: [{ type: Output }], tooltipTemplate: [{ type: ContentChild, args: ['tooltipTemplate'] }] } }); class BarChartModule { } BarChartModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BarChartModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); BarChartModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BarChartModule, declarations: [BarComponent, BarHorizontalComponent, BarHorizontal2DComponent, BarHorizontalNormalizedComponent, BarHorizontalStackedComponent, BarVerticalComponent, BarVertical2DComponent, BarVerticalNormalizedComponent, BarVerticalStackedComponent, BarLabelComponent, SeriesHorizontal, SeriesVerticalComponent], imports: [ChartCommonModule], exports: [BarComponent, BarHorizontalComponent, BarHorizontal2DComponent, BarHorizontalNormalizedComponent, BarHorizontalStackedComponent, BarVerticalComponent, BarVertical2DComponent, BarVerticalNormalizedComponent, BarVerticalStackedComponent, BarLabelComponent, SeriesHorizontal, SeriesVerticalComponent] }); BarChartModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BarChartModule, imports: [[ChartCommonModule]] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BarChartModule, decorators: [{ type: NgModule, args: [{ imports: [ChartCommonModule], declarations: [ BarComponent, BarHorizontalComponent, BarHorizontal2DComponent, BarHorizontalNormalizedComponent, BarHorizontalStackedComponent, BarVerticalComponent, BarVertical2DComponent, BarVerticalNormalizedComponent, BarVerticalStackedComponent, BarLabelComponent, SeriesHorizontal, SeriesVerticalComponent ], exports: [ BarComponent, BarHorizontalComponent, BarHorizontal2DComponent, BarHorizontalNormalizedComponent, BarHorizontalStackedComponent, BarVerticalComponent, BarVertical2DComponent, BarVerticalNormalizedComponent, BarVerticalStackedComponent, BarLabelComponent, SeriesHorizontal, SeriesVerticalComponent ] }] }] }); const cloneDeep = rfdc(); class BoxComponent { constructor(element, cd) { this.cd = cd; this.roundEdges = true; this.gradient = false; this.offset = 0; this.isActive = false; this.animations = true; this.noBarWhenZero = true; this.select = new EventEmitter(); this.activate = new EventEmitter(); this.deactivate = new EventEmitter(); this.BarOrientation = BarOrientation; this.initialized = false; this.hasGradient = false; this.hideBar = false; this.nativeElm = element.nativeElement; } ngOnChanges(changes) { if (!this.initialized) { this.loadAnimation(); this.initialized = true; } else { this.update(); } } update() { this.boxStrokeWidth = Math.max(this.strokeWidth, 1); this.whiskerStrokeWidth = Math.max(this.strokeWidth / 2, 1); this.medianLineWidth = 1.5 * this.strokeWidth; this.gradientId = 'grad' + id().toString(); this.gradientFill = `url(#${this.gradientId})`; if (this.gradient) { this.gradientStops = this.getGradient(); this.hasGradient = true; } else { this.hasGradient = false; } this.updateLineEl(); this.updatePathEl(); this.checkToHideBar(); this.maskLineId = 'mask' + id().toString(); this.maskLine = `url(#${this.maskLineId})`; if (this.cd) { this.cd.markForCheck(); } } loadAnimation() { this.boxPath = this.oldPath = this.getStartingPath(); this.oldLineCoordinates = this.getStartingLineCoordinates(); setTimeout(this.update.bind(this), 100); } updatePathEl() { const nodeBar = select(this.nativeElm).selectAll('.bar'); const path = this.getPath(); if (this.animations) { nodeBar .attr('d', this.oldPath) .transition() .ease(easeSinInOut) .duration(500) .attrTween('d', this.pathTween(path, 4)); } else { nodeBar.attr('d', path); } this.oldPath = path; } updateLineEl() { const lineEl = select(this.nativeElm).selectAll('.bar-line'); const lineCoordinates = this.lineCoordinates; const oldLineCoordinates = this.oldLineCoordinates; if (this.animations) { lineEl .attr('x1', (_, index) => oldLineCoordinates[index].v1.x) .attr('y1', (_, index) => oldLineCoordinates[index].v1.y) .attr('x2', (_, index) => oldLineCoordinates[index].v2.x) .attr('y2', (_, index) => oldLineCoordinates[index].v2.y) .transition() .ease(easeSinInOut) .duration(500) .attr('x1', (_, index) => lineCoordinates[index].v1.x) .attr('y1', (_, index) => lineCoordinates[index].v1.y) .attr('x2', (_, index) => lineCoordinates[index].v2.x) .attr('y2', (_, index) => lineCoordinates[index].v2.y); } else { lineEl .attr('x1', (_, index) => lineCoordinates[index].v1.x) .attr('y1', (_, index) => lineCoordinates[index].v1.y) .attr('x2', (_, index) => lineCoordinates[index].v2.x) .attr('y2', (_, index) => lineCoordinates[index].v2.y); } this.oldLineCoordinates = [...lineCoordinates]; } /** * See [D3 Selections](https://www.d3indepth.com/selections/) * @param d The joined data. * @param index The index of the element within the selection * @param node The node element (Line). */ lineTween(attr, d, index, node) { const nodeLineEl = node[index]; return nodeLineEl[attr].baseVal.value; } // TODO: Refactor into another .ts file if https://github.com/swimlane/ngx-charts/pull/1179 gets merged. pathTween(d1, precision) { return function () { // eslint-disable-next-line @typescript-eslint/no-this-alias const path0 = this; const path1 = this.cloneNode(); path1.setAttribute('d', d1); const n0 = path0?.getTotalLength(); const n1 = path1?.getTotalLength(); // Uniform sampling of distance based on specified precision. const distances = [0]; let i = 0; const dt = precision / Math.max(n0, n1); while (i < 1) { distances.push(i); i += dt; } distances.push(1); // Compute point-interpolators at each distance. const points = distances.map((t) => { const p0 = path0.getPointAtLength(t * n0); const p1 = path1.getPointAtLength(t * n1); return interpolate([p0.x, p0.y], [p1.x, p1.y]); }); // 't': T is the fraction of time (between 0 and 1) since the transition began. return (t) => { return t < 1 ? 'M' + points.map((p) => p(t)).join('L') : d1; }; }; } getStartingPath() { if (!this.animations) { return this.getPath(); } const radius = this.roundEdges ? 1 : 0; const { x, y } = this.lineCoordinates[2].v1; return roundedRect(x - this.width, y - 1, this.width, 2, radius, this.edges); } getPath() { const radius = this.getRadius(); let path = ''; path = roundedRect(this.x, this.y, this.width, this.height, Math.min(this.height, radius), this.edges); return path; } getStartingLineCoordinates() { if (!this.animations) { return [...this.lineCoordinates]; } const lineCoordinates = cloneDeep(this.lineCoordinates); lineCoordinates[1].v1.y = lineCoordinates[1].v2.y = lineCoordinates[3].v1.y = lineCoordinates[3].v2.y = lineCoordinates[0].v1.y = lineCoordinates[0].v2.y = lineCoordinates[2].v1.y; return lineCoordinates; } getRadius() { let radius = 0; if (this.roundEdges && this.height > 5 && this.width > 5) { radius = Math.floor(Math.min(5, this.height / 2, this.width / 2)); } return radius; } getGradient() { return [ { offset: 0, color: this.fill, opacity: this.getStartOpacity() }, { offset: 100, color: this.fill, opacity: 1 } ]; } getStartOpacity() { if (this.roundEdges) { return 0.2; } else { return 0.5; } } get edges() { let edges = [false, false, false, false]; if (this.roundEdges) { edges = [true, true, true, true]; } return edges; } onMouseEnter() { this.activate.emit(this.data); } onMouseLeave() { this.deactivate.emit(this.data); } checkToHideBar() { this.hideBar = this.noBarWhenZero && this.height === 0; } } BoxComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BoxComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); BoxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: BoxComponent, selector: "g[ngx-charts-box]", inputs: { strokeColor: "strokeColor", strokeWidth: "strokeWidth", fill: "fill", data: "data", width: "width", height: "height", x: "x", y: "y", lineCoordinates: "lineCoordinates", roundEdges: "roundEdges", gradient: "gradient", gradientStops: "gradientStops", offset: "offset", isActive: "isActive", animations: "animations", ariaLabel: "ariaLabel", noBarWhenZero: "noBarWhenZero" }, outputs: { select: "select", activate: "activate", deactivate: "deactivate" }, host: { listeners: { "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()" } }, usesOnChanges: true, ngImport: i0, template: ` `, isInline: true, components: [{ type: SvgLinearGradientComponent, selector: "g[ngx-charts-svg-linear-gradient]", inputs: ["orientation", "name", "stops"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BoxComponent, decorators: [{ type: Component, args: [{ selector: 'g[ngx-charts-box]', template: ` `, changeDetection: ChangeDetectionStrategy.OnPush }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { strokeColor: [{ type: Input }], strokeWidth: [{ type: Input }], fill: [{ type: Input }], data: [{ type: Input }], width: [{ type: Input }], height: [{ type: Input }], x: [{ type: Input }], y: [{ type: Input }], lineCoordinates: [{ type: Input }], roundEdges: [{ type: Input }], gradient: [{ type: Input }], gradientStops: [{ type: Input }], offset: [{ type: Input }], isActive: [{ type: Input }], animations: [{ type: Input }], ariaLabel: [{ type: Input }], noBarWhenZero: [{ type: Input }], select: [{ type: Output }], activate: [{ type: Output }], deactivate: [{ type: Output }], onMouseEnter: [{ type: HostListener, args: ['mouseenter'] }], onMouseLeave: [{ type: HostListener, args: ['mouseleave'] }] } }); class BoxSeriesComponent { constructor() { this.animations = true; this.tooltipDisabled = false; this.gradient = false; this.select = new EventEmitter(); this.activate = new EventEmitter(); this.deactivate = new EventEmitter(); } ngOnChanges(changes) { this.update(); } onClick(data) { this.select.emit(data); } update() { this.updateTooltipSettings(); const width = this.series && this.series.series.length ? Math.round(this.xScale.bandwidth()) : null; const seriesName = this.series.name; // Calculate Quantile and Whiskers for each box serie. this.counts = this.series.series; const mappedCounts = this.counts.map(serie => Number(serie.value)); this.whiskers = [min(mappedCounts), max(mappedCounts)]; // We get the group count and must sort it in order to retrieve quantiles. const groupCounts = this.counts.map(item => item.value).sort((a, b) => Number(a) - Number(b)); this.quartiles = this.getBoxQuantiles(groupCounts); this.lineCoordinates = this.getLinesCoordinates(seriesName.toString(), this.whiskers, this.quartiles, width); const value = this.quartiles[1]; const formattedLabel = formatLabel(seriesName); const box = { value, data: this.counts, label: seriesName, formattedLabel, width, height: 0, x: 0, y: 0, roundEdges: this.roundEdges, quartiles: this.quartiles, lineCoordinates: this.lineCoordinates }; box.height = Math.abs(this.yScale(this.quartiles[0]) - this.yScale(this.quartiles[2])); box.x = this.xScale(seriesName.toString()); box.y = this.yScale(this.quartiles[2]); box.ariaLabel = formattedLabel + ' - Median: ' + value.toLocaleString(); if (this.colors.scaleType === ScaleType.Ordinal) { box.color = this.colors.getColor(seriesName); } else { box.color = this.colors.getColor(this.quartiles[1]); box.gradientStops = this.colors.getLinearGradientStops(this.quartiles[0], this.quartiles[2]); } const tooltipLabel = formattedLabel; const formattedTooltipLabel = ` ${escapeLabel(tooltipLabel)} • Q1: ${this.quartiles[0]} • Q2: ${this.quartiles[1]} • Q3: ${this.quartiles[2]}
• Min: ${this.whiskers[0]} • Max: ${this.whiskers[1]}
`; box.tooltipText = this.tooltipDisabled ? undefined : formattedTooltipLabel; this.tooltipTitle = this.tooltipDisabled ? undefined : box.tooltipText; this.box = box; } getBoxQuantiles(inputData) { return [quantile(inputData, 0.25), quantile(inputData, 0.5), quantile(inputData, 0.75)]; } getLinesCoordinates(seriesName, whiskers, quartiles, barWidth) { // The X value is not being centered, so had to sum half the width to align it. const commonX = this.xScale(seriesName); const offsetX = commonX + barWidth / 2; const medianLineWidth = Math.max(barWidth + 4 * this.strokeWidth, 1); const whiskerLineWidth = Math.max(barWidth / 3, 1); const whiskerZero = this.yScale(whiskers[0]); const whiskerOne = this.yScale(whiskers[1]); const median = this.yScale(quartiles[1]); const topLine = { v1: { x: offsetX + whiskerLineWidth / 2, y: whiskerZero }, v2: { x: offsetX - whiskerLineWidth / 2, y: whiskerZero } }; const medianLine = { v1: { x: offsetX + medianLineWidth / 2, y: median }, v2: { x: offsetX - medianLineWidth / 2, y: median } }; const bottomLine = { v1: { x: offsetX + whiskerLineWidth / 2, y: whiskerOne }, v2: { x: offsetX - whiskerLineWidth / 2, y: whiskerOne } }; const verticalLine = { v1: { x: offsetX, y: whiskerZero }, v2: { x: offsetX, y: whiskerOne } }; return [verticalLine, topLine, medianLine, bottomLine]; } updateTooltipSettings() { if (this.tooltipDisabled) { this.tooltipPlacement = undefined; this.tooltipType = undefined; } else { if (!this.tooltipPlacement) { this.tooltipPlacement = PlacementTypes.Top; } if (!this.tooltipType) { this.tooltipType = StyleTypes.tooltip; } } } } BoxSeriesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BoxSeriesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); BoxSeriesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: BoxSeriesComponent, selector: "g[ngx-charts-box-series]", inputs: { dims: "dims", series: "series", xScale: "xScale", yScale: "yScale", colors: "colors", animations: "animations", strokeColor: "strokeColor", strokeWidth: "strokeWidth", tooltipDisabled: "tooltipDisabled", tooltipTemplate: "tooltipTemplate", tooltipPlacement: "tooltipPlacement", tooltipType: "tooltipType", roundEdges: "roundEdges", gradient: "gradient" }, outputs: { select: "select", activate: "activate", deactivate: "deactivate" }, usesOnChanges: true, ngImport: i0, template: ` `, isInline: true, components: [{ type: BoxComponent, selector: "g[ngx-charts-box]", inputs: ["strokeColor", "strokeWidth", "fill", "data", "width", "height", "x", "y", "lineCoordinates", "roundEdges", "gradient", "gradientStops", "offset", "isActive", "animations", "ariaLabel", "noBarWhenZero"], outputs: ["select", "activate", "deactivate"] }], directives: [{ type: TooltipDirective, selector: "[ngx-tooltip]", inputs: ["tooltipCssClass", "tooltipTitle", "tooltipAppendToBody", "tooltipSpacing", "tooltipDisabled", "tooltipShowCaret", "tooltipPlacement", "tooltipAlignment", "tooltipType", "tooltipCloseOnClickOutside", "tooltipCloseOnMouseLeave", "tooltipHideTimeout", "tooltipShowTimeout", "tooltipTemplate", "tooltipShowEvent", "tooltipContext", "tooltipImmediateExit"], outputs: ["show", "hide"] }], animations: [ trigger('animationState', [ transition(':leave', [ style({ opacity: 1 }), animate(500, style({ opacity: 0 })) ]) ]) ], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BoxSeriesComponent, decorators: [{ type: Component, args: [{ selector: 'g[ngx-charts-box-series]', template: ` `, changeDetection: ChangeDetectionStrategy.OnPush, animations: [ trigger('animationState', [ transition(':leave', [ style({ opacity: 1 }), animate(500, style({ opacity: 0 })) ]) ]) ] }] }], propDecorators: { dims: [{ type: Input }], series: [{ type: Input }], xScale: [{ type: Input }], yScale: [{ type: Input }], colors: [{ type: Input }], animations: [{ type: Input }], strokeColor: [{ type: Input }], strokeWidth: [{ type: Input }], tooltipDisabled: [{ type: Input }], tooltipTemplate: [{ type: Input }], tooltipPlacement: [{ type: Input }], tooltipType: [{ type: Input }], roundEdges: [{ type: Input }], gradient: [{ type: Input }], select: [{ type: Output }], activate: [{ type: Output }], deactivate: [{ type: Output }] } }); class BoxChartComponent extends BaseChartComponent { constructor() { super(...arguments); /** Show or hide the legend. */ this.legend = false; this.legendPosition = LegendPosition.Right; this.legendTitle = 'Legend'; this.showGridLines = true; this.xAxis = true; this.yAxis = true; this.showXAxisLabel = true; this.showYAxisLabel = true; this.roundDomains = false; this.roundEdges = true; this.strokeColor = '#FFFFFF'; this.strokeWidth = 2; this.tooltipDisabled = false; this.wrapTicks = false; this.select = new EventEmitter(); this.activate = new EventEmitter(); this.deactivate = new EventEmitter(); /** Chart Margins (For each side, counterclock wise). */ this.margin = [10, 20, 10, 20]; /** Chart X axis dimension. */ this.xAxisHeight = 0; /** Chart Y axis dimension. */ this.yAxisWidth = 0; } trackBy(index, item) { return item.name; } update() { super.update(); this.dims = calculateViewDimensions({ width: this.width, height: this.height, margins: this.margin, showXAxis: this.xAxis, showYAxis: this.yAxis, xAxisHeight: this.xAxisHeight, yAxisWidth: this.yAxisWidth, showXLabel: this.showXAxisLabel, showYLabel: this.showYAxisLabel, showLegend: this.legend, legendPosition: this.legendPosition }); this.xDomain = this.getXDomain(); this.yDomain = this.getYDomain(); this.seriesDomain = this.getSeriesDomain(); this.setScales(); this.setColors(); this.legendOptions = this.getLegendOptions(); this.transform = `translate(${this.dims.xOffset} , ${this.margin[0]})`; } setColors() { let domain = []; if (this.schemeType === ScaleType.Ordinal) { domain = this.seriesDomain; } else { domain = this.yDomain; } this.colors = new ColorHelper(this.scheme, this.schemeType, domain, this.customColors); } setScales() { this.xScale = this.getXScale(this.xDomain, this.dims.width); this.yScale = this.getYScale(this.yDomain, this.dims.height); } getXScale(domain, width) { const scale = scaleBand() .domain(domain.map(d => d.toString())) .rangeRound([0, width]) .padding(0.5); return scale; } getYScale(domain, height) { const scale = scaleLinear().domain(domain).range([height, 0]); return this.roundDomains ? scale.nice() : scale; } getUniqueBoxChartXDomainValues(results) { const valueSet = new Set(); for (const result of results) { valueSet.add(result.name); } return Array.from(valueSet); } getXDomain() { let domain = []; const values = this.getUniqueBoxChartXDomainValues(this.results); let min; let max; if (typeof values[0] === 'string') { domain = values.map(val => val.toString()); } else if (typeof values[0] === 'number') { const mappedValues = values.map(v => Number(v)); min = Math.min(...mappedValues); max = Math.max(...mappedValues); domain = [min, max]; } else { const mappedValues = values.map(v => Number(new Date(v))); min = Math.min(...mappedValues); max = Math.max(...mappedValues); domain = [new Date(min), new Date(max)]; } return domain; } getYDomain() { const domain = []; for (const results of this.results) { for (const d of results.series) { if (domain.indexOf(d.value) < 0) { domain.push(d.value); } } } const values = [...domain]; const mappedValues = values.map(v => Number(v)); const min = Math.min(...mappedValues); const max = Math.max(...mappedValues); return [min, max]; } getSeriesDomain() { return this.results.map(d => `${d.name}`); } updateYAxisWidth({ width }) { this.yAxisWidth = width; this.update(); } updateXAxisHeight({ height }) { this.xAxisHeight = height; this.update(); } onClick(data) { this.select.emit(data); } onActivate(data) { this.activate.emit(data); } onDeactivate(data) { this.deactivate.emit(data); } getLegendOptions() { const legendOpts = { scaleType: this.schemeType, colors: this.colors, domain: [], position: this.legendPosition, title: this.legendTitle }; if (this.schemeType === ScaleType.Ordinal) { legendOpts.domain = this.xDomain; legendOpts.colors = this.colors; } else { legendOpts.domain = this.yDomain; legendOpts.colors = this.colors.scale; } return legendOpts; } } BoxChartComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BoxChartComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); BoxChartComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: BoxChartComponent, selector: "ngx-charts-box-chart", inputs: { legend: "legend", legendPosition: "legendPosition", legendTitle: "legendTitle", legendOptionsConfig: "legendOptionsConfig", showGridLines: "showGridLines", xAxis: "xAxis", yAxis: "yAxis", showXAxisLabel: "showXAxisLabel", showYAxisLabel: "showYAxisLabel", roundDomains: "roundDomains", xAxisLabel: "xAxisLabel", yAxisLabel: "yAxisLabel", roundEdges: "roundEdges", strokeColor: "strokeColor", strokeWidth: "strokeWidth", tooltipDisabled: "tooltipDisabled", gradient: "gradient", wrapTicks: "wrapTicks" }, outputs: { select: "select", activate: "activate", deactivate: "deactivate" }, queries: [{ propertyName: "tooltipTemplate", first: true, predicate: ["tooltipTemplate"], descendants: true }], usesInheritance: true, ngImport: i0, template: ` `, isInline: true, styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n"], components: [{ type: ChartComponent, selector: "ngx-charts-chart", inputs: ["view", "showLegend", "legendOptions", "legendType", "activeEntries", "animations"], outputs: ["legendLabelClick", "legendLabelActivate", "legendLabelDeactivate"] }, { type: XAxisComponent, selector: "g[ngx-charts-x-axis]", inputs: ["xScale", "dims", "trimTicks", "rotateTicks", "maxTickLength", "tickFormatting", "showGridLines", "showLabel", "labelText", "ticks", "xAxisTickCount", "xOrient", "xAxisOffset", "wrapTicks"], outputs: ["dimensionsChanged"] }, { type: YAxisComponent, selector: "g[ngx-charts-y-axis]", inputs: ["yScale", "dims", "trimTicks", "maxTickLength", "tickFormatting", "ticks", "showGridLines", "showLabel", "labelText", "yAxisTickCount", "yOrient", "referenceLines", "showRefLines", "showRefLabels", "yAxisOffset", "wrapTicks"], outputs: ["dimensionsChanged"] }, { type: BoxSeriesComponent, selector: "g[ngx-charts-box-series]", inputs: ["dims", "series", "xScale", "yScale", "colors", "animations", "strokeColor", "strokeWidth", "tooltipDisabled", "tooltipTemplate", "tooltipPlacement", "tooltipType", "roundEdges", "gradient"], outputs: ["select", "activate", "deactivate"] }], directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BoxChartComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-charts-box-chart', template: ` `, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n"] }] }], propDecorators: { legend: [{ type: Input }], legendPosition: [{ type: Input }], legendTitle: [{ type: Input }], legendOptionsConfig: [{ type: Input }], showGridLines: [{ type: Input }], xAxis: [{ type: Input }], yAxis: [{ type: Input }], showXAxisLabel: [{ type: Input }], showYAxisLabel: [{ type: Input }], roundDomains: [{ type: Input }], xAxisLabel: [{ type: Input }], yAxisLabel: [{ type: Input }], roundEdges: [{ type: Input }], strokeColor: [{ type: Input }], strokeWidth: [{ type: Input }], tooltipDisabled: [{ type: Input }], gradient: [{ type: Input }], wrapTicks: [{ type: Input }], select: [{ type: Output }], activate: [{ type: Output }], deactivate: [{ type: Output }], tooltipTemplate: [{ type: ContentChild, args: ['tooltipTemplate', { static: false }] }] } }); class BoxChartModule { } BoxChartModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BoxChartModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); BoxChartModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BoxChartModule, declarations: [BoxChartComponent, BoxSeriesComponent, BoxComponent], imports: [ChartCommonModule], exports: [BoxChartComponent, BoxSeriesComponent, BoxComponent] }); BoxChartModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BoxChartModule, imports: [[ChartCommonModule]] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BoxChartModule, decorators: [{ type: NgModule, args: [{ imports: [ChartCommonModule], declarations: [BoxChartComponent, BoxSeriesComponent, BoxComponent], exports: [BoxChartComponent, BoxSeriesComponent, BoxComponent] }] }] }); function getDomain(values, scaleType, autoScale, minVal, maxVal) { let domain = []; if (scaleType === ScaleType.Linear) { values = values.map(v => Number(v)); if (!autoScale) { values.push(0); } } if (scaleType === ScaleType.Time || scaleType === ScaleType.Linear) { const min = minVal || minVal === 0 ? minVal : Math.min(...values); const max = maxVal ? maxVal : Math.max(...values); domain = [min, max]; } else { domain = values; } return domain; } function getScale(domain, range, scaleType, roundDomains) { switch (scaleType) { case ScaleType.Time: return scaleTime().range(range).domain(domain); case ScaleType.Linear: { const scale = scaleLinear().range(range).domain(domain); if (roundDomains) { return scale.nice(); } return scale; } case ScaleType.Ordinal: return scalePoint() .range([range[0], range[1]]) .domain(domain.map(r => r.toString())); default: return undefined; } } class BubbleSeriesComponent { constructor(platformId) { this.platformId = platformId; this.tooltipDisabled = false; this.select = new EventEmitter(); this.activate = new EventEmitter(); this.deactivate = new EventEmitter(); this.placementTypes = PlacementTypes; this.styleTypes = StyleTypes; this.isSSR = false; } ngOnInit() { if (isPlatformServer(this.platformId)) { this.isSSR = true; } } ngOnChanges(changes) { this.update(); } update() { this.circles = this.getCircles(); } getCircles() { const seriesName = this.data.name; return this.data.series .map((d, i) => { if (typeof d.y !== 'undefined' && typeof d.x !== 'undefined') { const y = d.y; const x = d.x; const r = d.r; const radius = this.rScale(r || 1); const tooltipLabel = formatLabel(d.name); const cx = this.xScaleType === ScaleType.Linear ? this.xScale(Number(x)) : this.xScale(x); const cy = this.yScaleType === ScaleType.Linear ? this.yScale(Number(y)) : this.yScale(y); const color = this.colors.scaleType === ScaleType.Linear ? this.colors.getColor(r) : this.colors.getColor(seriesName); const isActive = !this.activeEntries.length ? true : this.isActive({ name: seriesName }); const opacity = isActive ? 1 : 0.3; const data = Object.assign({}, d, { series: seriesName, name: d.name, value: d.y, x: d.x, radius: d.r }); return { data, x, y, r, classNames: [`circle-data-${i}`], value: y, label: x, cx, cy, radius, tooltipLabel, color, opacity, seriesName, isActive, transform: `translate(${cx},${cy})` }; } }) .filter(circle => circle !== undefined); } getTooltipText(circle) { const hasRadius = typeof circle.r !== 'undefined'; const hasTooltipLabel = circle.tooltipLabel && circle.tooltipLabel.length; const hasSeriesName = circle.seriesName && circle.seriesName.length; const radiusValue = hasRadius ? formatLabel(circle.r) : ''; const xAxisLabel = this.xAxisLabel && this.xAxisLabel !== '' ? `${this.xAxisLabel}:` : ''; const yAxisLabel = this.yAxisLabel && this.yAxisLabel !== '' ? `${this.yAxisLabel}:` : ''; const x = formatLabel(circle.x); const y = formatLabel(circle.y); const name = hasSeriesName && hasTooltipLabel ? `${circle.seriesName} • ${circle.tooltipLabel}` : circle.seriesName + circle.tooltipLabel; const tooltipTitle = hasSeriesName || hasTooltipLabel ? `${escapeLabel(name)}` : ''; return ` ${tooltipTitle} ${escapeLabel(x)}
${escapeLabel(y)}
${escapeLabel(radiusValue)} `; } onClick(data) { this.select.emit(data); } isActive(entry) { if (!this.activeEntries) return false; const item = this.activeEntries.find(d => { return entry.name === d.name; }); return item !== undefined; } isVisible(circle) { if (this.activeEntries.length > 0) { return this.isActive({ name: circle.seriesName }); } return circle.opacity !== 0; } activateCircle(circle) { circle.barVisible = true; this.activate.emit({ name: this.data.name }); } deactivateCircle(circle) { circle.barVisible = false; this.deactivate.emit({ name: this.data.name }); } trackBy(index, circle) { return `${circle.data.series} ${circle.data.name}`; } } BubbleSeriesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BubbleSeriesComponent, deps: [{ token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component }); BubbleSeriesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: BubbleSeriesComponent, selector: "g[ngx-charts-bubble-series]", inputs: { data: "data", xScale: "xScale", yScale: "yScale", rScale: "rScale", xScaleType: "xScaleType", yScaleType: "yScaleType", colors: "colors", visibleValue: "visibleValue", activeEntries: "activeEntries", xAxisLabel: "xAxisLabel", yAxisLabel: "yAxisLabel", tooltipDisabled: "tooltipDisabled", tooltipTemplate: "tooltipTemplate" }, outputs: { select: "select", activate: "activate", deactivate: "deactivate" }, usesOnChanges: true, ngImport: i0, template: ` `, isInline: true, components: [{ type: CircleComponent, selector: "g[ngx-charts-circle]", inputs: ["cx", "cy", "r", "fill", "stroke", "data", "classNames", "circleOpacity", "pointerEvents"], outputs: ["select", "activate", "deactivate"] }], directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: TooltipDirective, selector: "[ngx-tooltip]", inputs: ["tooltipCssClass", "tooltipTitle", "tooltipAppendToBody", "tooltipSpacing", "tooltipDisabled", "tooltipShowCaret", "tooltipPlacement", "tooltipAlignment", "tooltipType", "tooltipCloseOnClickOutside", "tooltipCloseOnMouseLeave", "tooltipHideTimeout", "tooltipShowTimeout", "tooltipTemplate", "tooltipShowEvent", "tooltipContext", "tooltipImmediateExit"], outputs: ["show", "hide"] }], animations: [ trigger('animationState', [ transition(':enter', [ style({ opacity: 0, transform: 'scale(0)' }), animate(250, style({ opacity: 1, transform: 'scale(1)' })) ]) ]) ], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BubbleSeriesComponent, decorators: [{ type: Component, args: [{ selector: 'g[ngx-charts-bubble-series]', template: ` `, changeDetection: ChangeDetectionStrategy.OnPush, animations: [ trigger('animationState', [ transition(':enter', [ style({ opacity: 0, transform: 'scale(0)' }), animate(250, style({ opacity: 1, transform: 'scale(1)' })) ]) ]) ] }] }], ctorParameters: function () { return [{ type: undefined, decorators: [{ type: Inject, args: [PLATFORM_ID] }] }]; }, propDecorators: { data: [{ type: Input }], xScale: [{ type: Input }], yScale: [{ type: Input }], rScale: [{ type: Input }], xScaleType: [{ type: Input }], yScaleType: [{ type: Input }], colors: [{ type: Input }], visibleValue: [{ type: Input }], activeEntries: [{ type: Input }], xAxisLabel: [{ type: Input }], yAxisLabel: [{ type: Input }], tooltipDisabled: [{ type: Input }], tooltipTemplate: [{ type: Input }], select: [{ type: Output }], activate: [{ type: Output }], deactivate: [{ type: Output }] } }); class BubbleChartComponent extends BaseChartComponent { constructor() { super(...arguments); this.showGridLines = true; this.legend = false; this.legendTitle = 'Legend'; this.legendPosition = LegendPosition.Right; this.xAxis = true; this.yAxis = true; this.trimXAxisTicks = true; this.trimYAxisTicks = true; this.rotateXAxisTicks = true; this.maxXAxisTickLength = 16; this.maxYAxisTickLength = 16; this.roundDomains = false; this.maxRadius = 10; this.minRadius = 3; this.schemeType = ScaleType.Ordinal; this.tooltipDisabled = false; this.wrapTicks = false; this.activate = new EventEmitter(); this.deactivate = new EventEmitter(); this.scaleType = ScaleType.Linear; this.margin = [10, 20, 10, 20]; this.bubblePadding = [0, 0, 0, 0]; this.xAxisHeight = 0; this.yAxisWidth = 0; this.activeEntries = []; this.isSSR = false; } ngOnInit() { if (isPlatformServer(this.platformId)) { this.isSSR = true; } } update() { super.update(); this.dims = calculateViewDimensions({ width: this.width, height: this.height, margins: this.margin, showXAxis: this.xAxis, showYAxis: this.yAxis, xAxisHeight: this.xAxisHeight, yAxisWidth: this.yAxisWidth, showXLabel: this.showXAxisLabel, showYLabel: this.showYAxisLabel, showLegend: this.legend, legendType: this.schemeType, legendPosition: this.legendPosition }); this.seriesDomain = this.results.map(d => d.name); this.rDomain = this.getRDomain(); this.xDomain = this.getXDomain(); this.yDomain = this.getYDomain(); this.transform = `translate(${this.dims.xOffset},${this.margin[0]})`; const colorDomain = this.schemeType === ScaleType.Ordinal ? this.seriesDomain : this.rDomain; this.colors = new ColorHelper(this.scheme, this.schemeType, colorDomain, this.customColors); this.data = this.results; this.minRadius = Math.max(this.minRadius, 1); this.maxRadius = Math.max(this.maxRadius, 1); this.rScale = this.getRScale(this.rDomain, [this.minRadius, this.maxRadius]); this.bubblePadding = [0, 0, 0, 0]; this.setScales(); this.bubblePadding = this.getBubblePadding(); this.setScales(); this.legendOptions = this.getLegendOptions(); this.clipPathId = 'clip' + id().toString(); this.clipPath = `url(#${this.clipPathId})`; } hideCircles() { this.deactivateAll(); } onClick(data, series) { if (series) { data.series = series.name; } this.select.emit(data); } getBubblePadding() { let yMin = 0; let xMin = 0; let yMax = this.dims.height; let xMax = this.dims.width; for (const s of this.data) { for (const d of s.series) { const r = this.rScale(d.r); const cx = this.xScaleType === ScaleType.Linear ? this.xScale(Number(d.x)) : this.xScale(d.x); const cy = this.yScaleType === ScaleType.Linear ? this.yScale(Number(d.y)) : this.yScale(d.y); xMin = Math.max(r - cx, xMin); yMin = Math.max(r - cy, yMin); yMax = Math.max(cy + r, yMax); xMax = Math.max(cx + r, xMax); } } xMax = Math.max(xMax - this.dims.width, 0); yMax = Math.max(yMax - this.dims.height, 0); return [yMin, xMax, yMax, xMin]; } setScales() { let width = this.dims.width; if (this.xScaleMin === undefined && this.xScaleMax === undefined) { width = width - this.bubblePadding[1]; } let height = this.dims.height; if (this.yScaleMin === undefined && this.yScaleMax === undefined) { height = height - this.bubblePadding[2]; } this.xScale = this.getXScale(this.xDomain, width); this.yScale = this.getYScale(this.yDomain, height); } getYScale(domain, height) { return getScale(domain, [height, this.bubblePadding[0]], this.yScaleType, this.roundDomains); } getXScale(domain, width) { return getScale(domain, [this.bubblePadding[3], width], this.xScaleType, this.roundDomains); } getRScale(domain, range) { const scale = scaleLinear().range(range).domain(domain); return this.roundDomains ? scale.nice() : scale; } getLegendOptions() { const opts = { scaleType: this.schemeType, colors: undefined, domain: [], position: this.legendPosition, title: undefined }; if (opts.scaleType === ScaleType.Ordinal) { opts.domain = this.seriesDomain; opts.colors = this.colors; opts.title = this.legendTitle; } else { opts.domain = this.rDomain; opts.colors = this.colors.scale; } return opts; } getXDomain() { const values = []; for (const results of this.results) { for (const d of results.series) { if (!values.includes(d.x)) { values.push(d.x); } } } this.xScaleType = getScaleType(values); return getDomain(values, this.xScaleType, this.autoScale, this.xScaleMin, this.xScaleMax); } getYDomain() { const values = []; for (const results of this.results) { for (const d of results.series) { if (!values.includes(d.y)) { values.push(d.y); } } } this.yScaleType = getScaleType(values); return getDomain(values, this.yScaleType, this.autoScale, this.yScaleMin, this.yScaleMax); } getRDomain() { let min = Infinity; let max = -Infinity; for (const results of this.results) { for (const d of results.series) { const value = Number(d.r) || 1; min = Math.min(min, value); max = Math.max(max, value); } } return [min, max]; } updateYAxisWidth({ width }) { this.yAxisWidth = width; this.update(); } updateXAxisHeight({ height }) { this.xAxisHeight = height; this.update(); } onActivate(item) { const idx = this.activeEntries.findIndex(d => { return d.name === item.name; }); if (idx > -1) { return; } this.activeEntries = [item, ...this.activeEntries]; this.activate.emit({ value: item, entries: this.activeEntries }); } onDeactivate(item) { const idx = this.activeEntries.findIndex(d => { return d.name === item.name; }); this.activeEntries.splice(idx, 1); this.activeEntries = [...this.activeEntries]; this.deactivate.emit({ value: item, entries: this.activeEntries }); } deactivateAll() { this.activeEntries = [...this.activeEntries]; for (const entry of this.activeEntries) { this.deactivate.emit({ value: entry, entries: [] }); } this.activeEntries = []; } trackBy(index, item) { return `${item.name}`; } } BubbleChartComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BubbleChartComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); BubbleChartComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: BubbleChartComponent, selector: "ngx-charts-bubble-chart", inputs: { showGridLines: "showGridLines", legend: "legend", legendTitle: "legendTitle", legendPosition: "legendPosition", xAxis: "xAxis", yAxis: "yAxis", showXAxisLabel: "showXAxisLabel", showYAxisLabel: "showYAxisLabel", xAxisLabel: "xAxisLabel", yAxisLabel: "yAxisLabel", trimXAxisTicks: "trimXAxisTicks", trimYAxisTicks: "trimYAxisTicks", rotateXAxisTicks: "rotateXAxisTicks", maxXAxisTickLength: "maxXAxisTickLength", maxYAxisTickLength: "maxYAxisTickLength", xAxisTickFormatting: "xAxisTickFormatting", yAxisTickFormatting: "yAxisTickFormatting", xAxisTicks: "xAxisTicks", yAxisTicks: "yAxisTicks", roundDomains: "roundDomains", maxRadius: "maxRadius", minRadius: "minRadius", autoScale: "autoScale", schemeType: "schemeType", tooltipDisabled: "tooltipDisabled", xScaleMin: "xScaleMin", xScaleMax: "xScaleMax", yScaleMin: "yScaleMin", yScaleMax: "yScaleMax", wrapTicks: "wrapTicks" }, outputs: { activate: "activate", deactivate: "deactivate" }, host: { listeners: { "mouseleave": "hideCircles()" } }, queries: [{ propertyName: "tooltipTemplate", first: true, predicate: ["tooltipTemplate"], descendants: true }], usesInheritance: true, ngImport: i0, template: ` `, isInline: true, styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n"], components: [{ type: ChartComponent, selector: "ngx-charts-chart", inputs: ["view", "showLegend", "legendOptions", "legendType", "activeEntries", "animations"], outputs: ["legendLabelClick", "legendLabelActivate", "legendLabelDeactivate"] }, { type: XAxisComponent, selector: "g[ngx-charts-x-axis]", inputs: ["xScale", "dims", "trimTicks", "rotateTicks", "maxTickLength", "tickFormatting", "showGridLines", "showLabel", "labelText", "ticks", "xAxisTickCount", "xOrient", "xAxisOffset", "wrapTicks"], outputs: ["dimensionsChanged"] }, { type: YAxisComponent, selector: "g[ngx-charts-y-axis]", inputs: ["yScale", "dims", "trimTicks", "maxTickLength", "tickFormatting", "ticks", "showGridLines", "showLabel", "labelText", "yAxisTickCount", "yOrient", "referenceLines", "showRefLines", "showRefLabels", "yAxisOffset", "wrapTicks"], outputs: ["dimensionsChanged"] }, { type: BubbleSeriesComponent, selector: "g[ngx-charts-bubble-series]", inputs: ["data", "xScale", "yScale", "rScale", "xScaleType", "yScaleType", "colors", "visibleValue", "activeEntries", "xAxisLabel", "yAxisLabel", "tooltipDisabled", "tooltipTemplate"], outputs: ["select", "activate", "deactivate"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], animations: [ trigger('animationState', [ transition(':leave', [ style({ opacity: 1 }), animate(500, style({ opacity: 0 })) ]) ]) ], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BubbleChartComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-charts-bubble-chart', template: ` `, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, animations: [ trigger('animationState', [ transition(':leave', [ style({ opacity: 1 }), animate(500, style({ opacity: 0 })) ]) ]) ], styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n"] }] }], propDecorators: { showGridLines: [{ type: Input }], legend: [{ type: Input }], legendTitle: [{ type: Input }], legendPosition: [{ type: Input }], xAxis: [{ type: Input }], yAxis: [{ type: Input }], showXAxisLabel: [{ type: Input }], showYAxisLabel: [{ type: Input }], xAxisLabel: [{ type: Input }], yAxisLabel: [{ type: Input }], trimXAxisTicks: [{ type: Input }], trimYAxisTicks: [{ type: Input }], rotateXAxisTicks: [{ type: Input }], maxXAxisTickLength: [{ type: Input }], maxYAxisTickLength: [{ type: Input }], xAxisTickFormatting: [{ type: Input }], yAxisTickFormatting: [{ type: Input }], xAxisTicks: [{ type: Input }], yAxisTicks: [{ type: Input }], roundDomains: [{ type: Input }], maxRadius: [{ type: Input }], minRadius: [{ type: Input }], autoScale: [{ type: Input }], schemeType: [{ type: Input }], tooltipDisabled: [{ type: Input }], xScaleMin: [{ type: Input }], xScaleMax: [{ type: Input }], yScaleMin: [{ type: Input }], yScaleMax: [{ type: Input }], wrapTicks: [{ type: Input }], activate: [{ type: Output }], deactivate: [{ type: Output }], tooltipTemplate: [{ type: ContentChild, args: ['tooltipTemplate'] }], hideCircles: [{ type: HostListener, args: ['mouseleave'] }] } }); class BubbleChartModule { } BubbleChartModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BubbleChartModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); BubbleChartModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BubbleChartModule, declarations: [BubbleChartComponent, BubbleSeriesComponent], imports: [ChartCommonModule], exports: [BubbleChartComponent, BubbleSeriesComponent] }); BubbleChartModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BubbleChartModule, imports: [[ChartCommonModule]] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BubbleChartModule, decorators: [{ type: NgModule, args: [{ imports: [ChartCommonModule], declarations: [BubbleChartComponent, BubbleSeriesComponent], exports: [BubbleChartComponent, BubbleSeriesComponent] }] }] }); class HeatMapCellComponent { constructor(element) { this.gradient = false; this.animations = true; this.select = new EventEmitter(); this.activate = new EventEmitter(); this.deactivate = new EventEmitter(); this.barOrientation = BarOrientation; this.element = element.nativeElement; } ngOnChanges(changes) { this.transform = `translate(${this.x} , ${this.y})`; this.startOpacity = 0.3; this.gradientId = 'grad' + id().toString(); this.gradientUrl = `url(#${this.gradientId})`; this.gradientStops = this.getGradientStops(); if (this.animations) { this.loadAnimation(); } } getGradientStops() { return [ { offset: 0, color: this.fill, opacity: this.startOpacity }, { offset: 100, color: this.fill, opacity: 1 } ]; } loadAnimation() { const node = select(this.element).select('.cell'); node.attr('opacity', 0); this.animateToCurrentForm(); } animateToCurrentForm() { const node = select(this.element).select('.cell'); node.transition().duration(750).attr('opacity', 1); } onClick() { this.select.emit(this.data); } onMouseEnter() { this.activate.emit(this.data); } onMouseLeave() { this.deactivate.emit(this.data); } } HeatMapCellComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: HeatMapCellComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); HeatMapCellComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: HeatMapCellComponent, selector: "g[ngx-charts-heat-map-cell]", inputs: { fill: "fill", x: "x", y: "y", width: "width", height: "height", data: "data", gradient: "gradient", animations: "animations" }, outputs: { select: "select", activate: "activate", deactivate: "deactivate" }, host: { listeners: { "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()" } }, usesOnChanges: true, ngImport: i0, template: ` `, isInline: true, components: [{ type: SvgLinearGradientComponent, selector: "g[ngx-charts-svg-linear-gradient]", inputs: ["orientation", "name", "stops"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: HeatMapCellComponent, decorators: [{ type: Component, args: [{ selector: 'g[ngx-charts-heat-map-cell]', template: ` `, changeDetection: ChangeDetectionStrategy.OnPush }] }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { fill: [{ type: Input }], x: [{ type: Input }], y: [{ type: Input }], width: [{ type: Input }], height: [{ type: Input }], data: [{ type: Input }], gradient: [{ type: Input }], animations: [{ type: Input }], select: [{ type: Output }], activate: [{ type: Output }], deactivate: [{ type: Output }], onMouseEnter: [{ type: HostListener, args: ['mouseenter'] }], onMouseLeave: [{ type: HostListener, args: ['mouseleave'] }] } }); class HeatCellSeriesComponent { constructor() { this.tooltipDisabled = false; this.animations = true; this.select = new EventEmitter(); this.activate = new EventEmitter(); this.deactivate = new EventEmitter(); this.placementTypes = PlacementTypes; this.styleTypes = StyleTypes; } ngOnInit() { if (!this.tooltipText) { this.tooltipText = this.getTooltipText; } } ngOnChanges(changes) { this.update(); } update() { this.cells = this.getCells(); } getCells() { const cells = []; this.data.map(row => { row.series.map(cell => { const value = cell.value; cell.series = row.name; cells.push({ row, cell, x: this.xScale(row.name), y: this.yScale(cell.name), width: this.xScale.bandwidth(), height: this.yScale.bandwidth(), fill: this.colors.getColor(value), data: value, label: formatLabel(cell.name), series: row.name }); }); }); return cells; } getTooltipText({ label, data, series }) { return ` ${escapeLabel(series)} • ${escapeLabel(label)} ${data.toLocaleString()} `; } trackBy(index, item) { return item.label; } onClick(data) { this.select.emit(data); } } HeatCellSeriesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: HeatCellSeriesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); HeatCellSeriesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: HeatCellSeriesComponent, selector: "g[ngx-charts-heat-map-cell-series]", inputs: { data: "data", colors: "colors", xScale: "xScale", yScale: "yScale", gradient: "gradient", tooltipDisabled: "tooltipDisabled", tooltipText: "tooltipText", tooltipTemplate: "tooltipTemplate", animations: "animations" }, outputs: { select: "select", activate: "activate", deactivate: "deactivate" }, usesOnChanges: true, ngImport: i0, template: ` `, isInline: true, components: [{ type: HeatMapCellComponent, selector: "g[ngx-charts-heat-map-cell]", inputs: ["fill", "x", "y", "width", "height", "data", "gradient", "animations"], outputs: ["select", "activate", "deactivate"] }], directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: TooltipDirective, selector: "[ngx-tooltip]", inputs: ["tooltipCssClass", "tooltipTitle", "tooltipAppendToBody", "tooltipSpacing", "tooltipDisabled", "tooltipShowCaret", "tooltipPlacement", "tooltipAlignment", "tooltipType", "tooltipCloseOnClickOutside", "tooltipCloseOnMouseLeave", "tooltipHideTimeout", "tooltipShowTimeout", "tooltipTemplate", "tooltipShowEvent", "tooltipContext", "tooltipImmediateExit"], outputs: ["show", "hide"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: HeatCellSeriesComponent, decorators: [{ type: Component, args: [{ selector: 'g[ngx-charts-heat-map-cell-series]', template: ` `, changeDetection: ChangeDetectionStrategy.OnPush }] }], propDecorators: { data: [{ type: Input }], colors: [{ type: Input }], xScale: [{ type: Input }], yScale: [{ type: Input }], gradient: [{ type: Input }], tooltipDisabled: [{ type: Input }], tooltipText: [{ type: Input }], tooltipTemplate: [{ type: Input }], animations: [{ type: Input }], select: [{ type: Output }], activate: [{ type: Output }], deactivate: [{ type: Output }] } }); class HeatMapComponent extends BaseChartComponent { constructor() { super(...arguments); this.legendTitle = 'Legend'; this.legendPosition = LegendPosition.Right; this.innerPadding = 8; this.trimXAxisTicks = true; this.trimYAxisTicks = true; this.rotateXAxisTicks = true; this.maxXAxisTickLength = 16; this.maxYAxisTickLength = 16; this.tooltipDisabled = false; this.activeEntries = []; this.wrapTicks = false; this.activate = new EventEmitter(); this.deactivate = new EventEmitter(); this.margin = [10, 20, 10, 20]; this.xAxisHeight = 0; this.yAxisWidth = 0; this.scaleType = ScaleType.Linear; } update() { super.update(); this.formatDates(); this.xDomain = this.getXDomain(); this.yDomain = this.getYDomain(); this.valueDomain = this.getValueDomain(); this.scaleType = getScaleType(this.valueDomain, false); this.dims = calculateViewDimensions({ width: this.width, height: this.height, margins: this.margin, showXAxis: this.xAxis, showYAxis: this.yAxis, xAxisHeight: this.xAxisHeight, yAxisWidth: this.yAxisWidth, showXLabel: this.showXAxisLabel, showYLabel: this.showYAxisLabel, showLegend: this.legend, legendType: this.scaleType, legendPosition: this.legendPosition }); if (this.scaleType === ScaleType.Linear) { let min = this.min; let max = this.max; if (!this.min) { min = Math.min(0, ...this.valueDomain); } if (!this.max) { max = Math.max(...this.valueDomain); } this.valueDomain = [min, max]; } this.xScale = this.getXScale(); this.yScale = this.getYScale(); this.setColors(); this.legendOptions = this.getLegendOptions(); this.transform = `translate(${this.dims.xOffset} , ${this.margin[0]})`; this.rects = this.getRects(); } getXDomain() { const domain = []; for (const group of this.results) { if (!domain.includes(group.name)) { domain.push(group.name); } } return domain; } getYDomain() { const domain = []; for (const group of this.results) { for (const d of group.series) { if (!domain.includes(d.name)) { domain.push(d.name); } } } return domain; } getValueDomain() { const domain = []; for (const group of this.results) { for (const d of group.series) { if (!domain.includes(d.value)) { domain.push(d.value); } } } return domain; } /** * Converts the input to gap paddingInner in fraction * Supports the following inputs: * Numbers: 8 * Strings: "8", "8px", "8%" * Arrays: [8,2], "8,2", "[8,2]" * Mixed: [8,"2%"], ["8px","2%"], "8,2%", "[8,2%]" * * @memberOf HeatMapComponent */ getDimension(value, index = 0, N, L) { if (typeof value === 'string') { value = value .replace('[', '') .replace(']', '') .replace('px', '') // tslint:disable-next-line: quotemark .replace("'", ''); if (value.includes(',')) { value = value.split(','); } } if (Array.isArray(value) && typeof index === 'number') { return this.getDimension(value[index], null, N, L); } if (typeof value === 'string' && value.includes('%')) { return +value.replace('%', '') / 100; } return N / (L / +value + 1); } getXScale() { const f = this.getDimension(this.innerPadding, 0, this.xDomain.length, this.dims.width); return scaleBand().rangeRound([0, this.dims.width]).domain(this.xDomain).paddingInner(f); } getYScale() { const f = this.getDimension(this.innerPadding, 1, this.yDomain.length, this.dims.height); return scaleBand().rangeRound([this.dims.height, 0]).domain(this.yDomain).paddingInner(f); } getRects() { const rects = []; this.xDomain.map(xVal => { this.yDomain.map(yVal => { rects.push({ x: this.xScale(xVal), y: this.yScale(yVal), rx: 3, width: this.xScale.bandwidth(), height: this.yScale.bandwidth(), fill: 'rgba(200,200,200,0.03)' }); }); }); return rects; } onClick(data) { this.select.emit(data); } setColors() { this.colors = new ColorHelper(this.scheme, this.scaleType, this.valueDomain); } getLegendOptions() { return { scaleType: this.scaleType, domain: this.valueDomain, colors: this.scaleType === ScaleType.Ordinal ? this.colors : this.colors.scale, title: this.scaleType === ScaleType.Ordinal ? this.legendTitle : undefined, position: this.legendPosition }; } updateYAxisWidth({ width }) { this.yAxisWidth = width; this.update(); } updateXAxisHeight({ height }) { this.xAxisHeight = height; this.update(); } onActivate(event, group, fromLegend = false) { const item = Object.assign({}, event); if (group) { item.series = group.name; } const items = this.results .map(g => g.series) .flat() .filter(i => { if (fromLegend) { return i.label === item.name; } else { return i.name === item.name && i.series === item.series; } }); this.activeEntries = [...items]; this.activate.emit({ value: item, entries: this.activeEntries }); } onDeactivate(event, group, fromLegend = false) { const item = Object.assign({}, event); if (group) { item.series = group.name; } this.activeEntries = this.activeEntries.filter(i => { if (fromLegend) { return i.label !== item.name; } else { return !(i.name === item.name && i.series === item.series); } }); this.deactivate.emit({ value: item, entries: this.activeEntries }); } } HeatMapComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: HeatMapComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); HeatMapComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: HeatMapComponent, selector: "ngx-charts-heat-map", inputs: { legend: "legend", legendTitle: "legendTitle", legendPosition: "legendPosition", xAxis: "xAxis", yAxis: "yAxis", showXAxisLabel: "showXAxisLabel", showYAxisLabel: "showYAxisLabel", xAxisLabel: "xAxisLabel", yAxisLabel: "yAxisLabel", gradient: "gradient", innerPadding: "innerPadding", trimXAxisTicks: "trimXAxisTicks", trimYAxisTicks: "trimYAxisTicks", rotateXAxisTicks: "rotateXAxisTicks", maxXAxisTickLength: "maxXAxisTickLength", maxYAxisTickLength: "maxYAxisTickLength", xAxisTickFormatting: "xAxisTickFormatting", yAxisTickFormatting: "yAxisTickFormatting", xAxisTicks: "xAxisTicks", yAxisTicks: "yAxisTicks", tooltipDisabled: "tooltipDisabled", tooltipText: "tooltipText", min: "min", max: "max", activeEntries: "activeEntries", wrapTicks: "wrapTicks" }, outputs: { activate: "activate", deactivate: "deactivate" }, queries: [{ propertyName: "tooltipTemplate", first: true, predicate: ["tooltipTemplate"], descendants: true }], usesInheritance: true, ngImport: i0, template: ` `, isInline: true, styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n"], components: [{ type: ChartComponent, selector: "ngx-charts-chart", inputs: ["view", "showLegend", "legendOptions", "legendType", "activeEntries", "animations"], outputs: ["legendLabelClick", "legendLabelActivate", "legendLabelDeactivate"] }, { type: XAxisComponent, selector: "g[ngx-charts-x-axis]", inputs: ["xScale", "dims", "trimTicks", "rotateTicks", "maxTickLength", "tickFormatting", "showGridLines", "showLabel", "labelText", "ticks", "xAxisTickCount", "xOrient", "xAxisOffset", "wrapTicks"], outputs: ["dimensionsChanged"] }, { type: YAxisComponent, selector: "g[ngx-charts-y-axis]", inputs: ["yScale", "dims", "trimTicks", "maxTickLength", "tickFormatting", "ticks", "showGridLines", "showLabel", "labelText", "yAxisTickCount", "yOrient", "referenceLines", "showRefLines", "showRefLabels", "yAxisOffset", "wrapTicks"], outputs: ["dimensionsChanged"] }, { type: HeatCellSeriesComponent, selector: "g[ngx-charts-heat-map-cell-series]", inputs: ["data", "colors", "xScale", "yScale", "gradient", "tooltipDisabled", "tooltipText", "tooltipTemplate", "animations"], outputs: ["select", "activate", "deactivate"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: HeatMapComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-charts-heat-map', template: ` `, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n"] }] }], propDecorators: { legend: [{ type: Input }], legendTitle: [{ type: Input }], legendPosition: [{ type: Input }], xAxis: [{ type: Input }], yAxis: [{ type: Input }], showXAxisLabel: [{ type: Input }], showYAxisLabel: [{ type: Input }], xAxisLabel: [{ type: Input }], yAxisLabel: [{ type: Input }], gradient: [{ type: Input }], innerPadding: [{ type: Input }], trimXAxisTicks: [{ type: Input }], trimYAxisTicks: [{ type: Input }], rotateXAxisTicks: [{ type: Input }], maxXAxisTickLength: [{ type: Input }], maxYAxisTickLength: [{ type: Input }], xAxisTickFormatting: [{ type: Input }], yAxisTickFormatting: [{ type: Input }], xAxisTicks: [{ type: Input }], yAxisTicks: [{ type: Input }], tooltipDisabled: [{ type: Input }], tooltipText: [{ type: Input }], min: [{ type: Input }], max: [{ type: Input }], activeEntries: [{ type: Input }], wrapTicks: [{ type: Input }], activate: [{ type: Output }], deactivate: [{ type: Output }], tooltipTemplate: [{ type: ContentChild, args: ['tooltipTemplate'] }] } }); class HeatMapModule { } HeatMapModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: HeatMapModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); HeatMapModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: HeatMapModule, declarations: [HeatMapCellComponent, HeatCellSeriesComponent, HeatMapComponent], imports: [ChartCommonModule], exports: [HeatMapCellComponent, HeatCellSeriesComponent, HeatMapComponent] }); HeatMapModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: HeatMapModule, imports: [[ChartCommonModule]] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: HeatMapModule, decorators: [{ type: NgModule, args: [{ imports: [ChartCommonModule], declarations: [HeatMapCellComponent, HeatCellSeriesComponent, HeatMapComponent], exports: [HeatMapCellComponent, HeatCellSeriesComponent, HeatMapComponent] }] }] }); class LineComponent { constructor(element, platformId) { this.element = element; this.platformId = platformId; this.fill = 'none'; this.animations = true; // @Output() select = new EventEmitter(); this.initialized = false; this.isSSR = false; } ngOnInit() { if (isPlatformServer(this.platformId)) { this.isSSR = true; } } ngOnChanges(changes) { if (!this.initialized) { this.initialized = true; this.initialPath = this.path; } else { this.updatePathEl(); } } updatePathEl() { const node = select(this.element.nativeElement).select('.line'); if (this.animations) { node.transition().duration(750).attr('d', this.path); } else { node.attr('d', this.path); } } } LineComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: LineComponent, deps: [{ token: i0.ElementRef }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component }); LineComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: LineComponent, selector: "g[ngx-charts-line]", inputs: { path: "path", stroke: "stroke", data: "data", fill: "fill", animations: "animations" }, usesOnChanges: true, ngImport: i0, template: ` `, isInline: true, directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], animations: [ trigger('animationState', [ transition(':enter', [ style({ strokeDasharray: 2000, strokeDashoffset: 2000 }), animate(1000, style({ strokeDashoffset: 0 })) ]) ]) ], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: LineComponent, decorators: [{ type: Component, args: [{ selector: 'g[ngx-charts-line]', template: ` `, changeDetection: ChangeDetectionStrategy.OnPush, animations: [ trigger('animationState', [ transition(':enter', [ style({ strokeDasharray: 2000, strokeDashoffset: 2000 }), animate(1000, style({ strokeDashoffset: 0 })) ]) ]) ] }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: undefined, decorators: [{ type: Inject, args: [PLATFORM_ID] }] }]; }, propDecorators: { path: [{ type: Input }], stroke: [{ type: Input }], data: [{ type: Input }], fill: [{ type: Input }], animations: [{ type: Input }] } }); class LineSeriesComponent { constructor() { this.animations = true; this.barOrientation = BarOrientation; } ngOnChanges(changes) { this.update(); } update() { this.updateGradients(); const data = this.sortData(this.data.series); const lineGen = this.getLineGenerator(); this.path = lineGen(data) || ''; const areaGen = this.getAreaGenerator(); this.areaPath = areaGen(data) || ''; if (this.hasRange) { const range = this.getRangeGenerator(); this.outerPath = range(data) || ''; } if (this.hasGradient) { this.stroke = this.gradientUrl; const values = this.data.series.map(d => d.value); const max = Math.max(...values); const min = Math.min(...values); if (max === min) { this.stroke = this.colors.getColor(max); } } else { this.stroke = this.colors.getColor(this.data.name); } } getLineGenerator() { return line() .x(d => { const label = d.name; let value; if (this.scaleType === ScaleType.Time) { value = this.xScale(label); } else if (this.scaleType === ScaleType.Linear) { value = this.xScale(Number(label)); } else { value = this.xScale(label); } return value; }) .y(d => this.yScale(d.value)) .curve(this.curve); } getRangeGenerator() { return area() .x(d => { const label = d.name; let value; if (this.scaleType === ScaleType.Time) { value = this.xScale(label); } else if (this.scaleType === ScaleType.Linear) { value = this.xScale(Number(label)); } else { value = this.xScale(label); } return value; }) .y0(d => this.yScale(typeof d.min === 'number' ? d.min : d.value)) .y1(d => this.yScale(typeof d.max === 'number' ? d.max : d.value)) .curve(this.curve); } getAreaGenerator() { const xProperty = d => { const label = d.name; return this.xScale(label); }; return area() .x(xProperty) .y0(() => this.yScale.range()[0]) .y1(d => this.yScale(d.value)) .curve(this.curve); } sortData(data) { if (this.scaleType === ScaleType.Linear) { data = sortLinear(data, 'name'); } else if (this.scaleType === ScaleType.Time) { data = sortByTime(data, 'name'); } else { data = sortByDomain(data, 'name', 'asc', this.xScale.domain()); } return data; } updateGradients() { if (this.colors.scaleType === ScaleType.Linear) { this.hasGradient = true; this.gradientId = 'grad' + id().toString(); this.gradientUrl = `url(#${this.gradientId})`; const values = this.data.series.map(d => d.value); const max = Math.max(...values); const min = Math.min(...values); this.gradientStops = this.colors.getLinearGradientStops(max, min); this.areaGradientStops = this.colors.getLinearGradientStops(max); } else { this.hasGradient = false; this.gradientStops = undefined; this.areaGradientStops = undefined; } } isActive(entry) { if (!this.activeEntries) return false; const item = this.activeEntries.find(d => { return entry.name === d.name; }); return item !== undefined; } isInactive(entry) { if (!this.activeEntries || this.activeEntries.length === 0) return false; const item = this.activeEntries.find(d => { return entry.name === d.name; }); return item === undefined; } } LineSeriesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: LineSeriesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); LineSeriesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: LineSeriesComponent, selector: "g[ngx-charts-line-series]", inputs: { data: "data", xScale: "xScale", yScale: "yScale", colors: "colors", scaleType: "scaleType", curve: "curve", activeEntries: "activeEntries", rangeFillOpacity: "rangeFillOpacity", hasRange: "hasRange", animations: "animations" }, usesOnChanges: true, ngImport: i0, template: ` `, isInline: true, components: [{ type: SvgLinearGradientComponent, selector: "g[ngx-charts-svg-linear-gradient]", inputs: ["orientation", "name", "stops"] }, { type: AreaComponent, selector: "g[ngx-charts-area]", inputs: ["data", "path", "startingPath", "fill", "opacity", "startOpacity", "endOpacity", "gradient", "stops", "animations"], outputs: ["select"] }, { type: LineComponent, selector: "g[ngx-charts-line]", inputs: ["path", "stroke", "data", "fill", "animations"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: LineSeriesComponent, decorators: [{ type: Component, args: [{ selector: 'g[ngx-charts-line-series]', template: ` `, changeDetection: ChangeDetectionStrategy.OnPush }] }], propDecorators: { data: [{ type: Input }], xScale: [{ type: Input }], yScale: [{ type: Input }], colors: [{ type: Input }], scaleType: [{ type: Input }], curve: [{ type: Input }], activeEntries: [{ type: Input }], rangeFillOpacity: [{ type: Input }], hasRange: [{ type: Input }], animations: [{ type: Input }] } }); class LineChartComponent extends BaseChartComponent { constructor() { super(...arguments); this.legendTitle = 'Legend'; this.legendPosition = LegendPosition.Right; this.showGridLines = true; this.curve = curveLinear; this.activeEntries = []; this.trimXAxisTicks = true; this.trimYAxisTicks = true; this.rotateXAxisTicks = true; this.maxXAxisTickLength = 16; this.maxYAxisTickLength = 16; this.roundDomains = false; this.tooltipDisabled = false; this.showRefLines = false; this.showRefLabels = true; this.wrapTicks = false; this.activate = new EventEmitter(); this.deactivate = new EventEmitter(); this.margin = [10, 20, 10, 20]; this.xAxisHeight = 0; this.yAxisWidth = 0; this.timelineHeight = 50; this.timelinePadding = 10; this.isSSR = false; } ngOnInit() { if (isPlatformServer(this.platformId)) { this.isSSR = true; } } update() { super.update(); this.dims = calculateViewDimensions({ width: this.width, height: this.height, margins: this.margin, showXAxis: this.xAxis, showYAxis: this.yAxis, xAxisHeight: this.xAxisHeight, yAxisWidth: this.yAxisWidth, showXLabel: this.showXAxisLabel, showYLabel: this.showYAxisLabel, showLegend: this.legend, legendType: this.schemeType, legendPosition: this.legendPosition }); if (this.timeline) { this.dims.height -= this.timelineHeight + this.margin[2] + this.timelinePadding; } this.xDomain = this.getXDomain(); if (this.filteredDomain) { this.xDomain = this.filteredDomain; } this.yDomain = this.getYDomain(); this.seriesDomain = this.getSeriesDomain(); this.xScale = this.getXScale(this.xDomain, this.dims.width); this.yScale = this.getYScale(this.yDomain, this.dims.height); this.updateTimeline(); this.setColors(); this.legendOptions = this.getLegendOptions(); this.transform = `translate(${this.dims.xOffset} , ${this.margin[0]})`; this.clipPathId = 'clip' + id().toString(); this.clipPath = `url(#${this.clipPathId})`; } updateTimeline() { if (this.timeline) { this.timelineWidth = this.dims.width; this.timelineXDomain = this.getXDomain(); this.timelineXScale = this.getXScale(this.timelineXDomain, this.timelineWidth); this.timelineYScale = this.getYScale(this.yDomain, this.timelineHeight); this.timelineTransform = `translate(${this.dims.xOffset}, ${-this.margin[2]})`; } } getXDomain() { let values = getUniqueXDomainValues(this.results); this.scaleType = getScaleType(values); let domain = []; if (this.scaleType === ScaleType.Linear) { values = values.map(v => Number(v)); } let min; let max; if (this.scaleType === ScaleType.Time || this.scaleType === ScaleType.Linear) { min = this.xScaleMin ? this.xScaleMin : Math.min(...values); max = this.xScaleMax ? this.xScaleMax : Math.max(...values); } if (this.scaleType === ScaleType.Time) { domain = [new Date(min), new Date(max)]; this.xSet = [...values].sort((a, b) => { const aDate = a.getTime(); const bDate = b.getTime(); if (aDate > bDate) return 1; if (bDate > aDate) return -1; return 0; }); } else if (this.scaleType === ScaleType.Linear) { domain = [min, max]; // Use compare function to sort numbers numerically this.xSet = [...values].sort((a, b) => a - b); } else { domain = values; this.xSet = values; } return domain; } getYDomain() { const domain = []; for (const results of this.results) { for (const d of results.series) { if (domain.indexOf(d.value) < 0) { domain.push(d.value); } if (d.min !== undefined) { this.hasRange = true; if (domain.indexOf(d.min) < 0) { domain.push(d.min); } } if (d.max !== undefined) { this.hasRange = true; if (domain.indexOf(d.max) < 0) { domain.push(d.max); } } } } const values = [...domain]; if (!this.autoScale) { values.push(0); } const min = this.yScaleMin ? this.yScaleMin : Math.min(...values); const max = this.yScaleMax ? this.yScaleMax : Math.max(...values); return [min, max]; } getSeriesDomain() { return this.results.map(d => d.name); } getXScale(domain, width) { let scale; if (this.scaleType === ScaleType.Time) { scale = scaleTime().range([0, width]).domain(domain); } else if (this.scaleType === ScaleType.Linear) { scale = scaleLinear().range([0, width]).domain(domain); if (this.roundDomains) { scale = scale.nice(); } } else if (this.scaleType === ScaleType.Ordinal) { scale = scalePoint().range([0, width]).padding(0.1).domain(domain); } return scale; } getYScale(domain, height) { const scale = scaleLinear().range([height, 0]).domain(domain); return this.roundDomains ? scale.nice() : scale; } updateDomain(domain) { this.filteredDomain = domain; this.xDomain = this.filteredDomain; this.xScale = this.getXScale(this.xDomain, this.dims.width); } updateHoveredVertical(item) { this.hoveredVertical = item.value; this.deactivateAll(); } hideCircles() { this.hoveredVertical = null; this.deactivateAll(); } onClick(data) { this.select.emit(data); } trackBy(index, item) { return `${item.name}`; } setColors() { let domain; if (this.schemeType === ScaleType.Ordinal) { domain = this.seriesDomain; } else { domain = this.yDomain; } this.colors = new ColorHelper(this.scheme, this.schemeType, domain, this.customColors); } getLegendOptions() { const opts = { scaleType: this.schemeType, colors: undefined, domain: [], title: undefined, position: this.legendPosition }; if (opts.scaleType === ScaleType.Ordinal) { opts.domain = this.seriesDomain; opts.colors = this.colors; opts.title = this.legendTitle; } else { opts.domain = this.yDomain; opts.colors = this.colors.scale; } return opts; } updateYAxisWidth({ width }) { this.yAxisWidth = width; this.update(); } updateXAxisHeight({ height }) { this.xAxisHeight = height; this.update(); } onActivate(item) { this.deactivateAll(); const idx = this.activeEntries.findIndex(d => { return d.name === item.name && d.value === item.value; }); if (idx > -1) { return; } this.activeEntries = [item]; this.activate.emit({ value: item, entries: this.activeEntries }); } onDeactivate(item) { const idx = this.activeEntries.findIndex(d => { return d.name === item.name && d.value === item.value; }); this.activeEntries.splice(idx, 1); this.activeEntries = [...this.activeEntries]; this.deactivate.emit({ value: item, entries: this.activeEntries }); } deactivateAll() { this.activeEntries = [...this.activeEntries]; for (const entry of this.activeEntries) { this.deactivate.emit({ value: entry, entries: [] }); } this.activeEntries = []; } } LineChartComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: LineChartComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); LineChartComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: LineChartComponent, selector: "ngx-charts-line-chart", inputs: { legend: "legend", legendTitle: "legendTitle", legendPosition: "legendPosition", xAxis: "xAxis", yAxis: "yAxis", showXAxisLabel: "showXAxisLabel", showYAxisLabel: "showYAxisLabel", xAxisLabel: "xAxisLabel", yAxisLabel: "yAxisLabel", autoScale: "autoScale", timeline: "timeline", gradient: "gradient", showGridLines: "showGridLines", curve: "curve", activeEntries: "activeEntries", schemeType: "schemeType", rangeFillOpacity: "rangeFillOpacity", trimXAxisTicks: "trimXAxisTicks", trimYAxisTicks: "trimYAxisTicks", rotateXAxisTicks: "rotateXAxisTicks", maxXAxisTickLength: "maxXAxisTickLength", maxYAxisTickLength: "maxYAxisTickLength", xAxisTickFormatting: "xAxisTickFormatting", yAxisTickFormatting: "yAxisTickFormatting", xAxisTicks: "xAxisTicks", yAxisTicks: "yAxisTicks", roundDomains: "roundDomains", tooltipDisabled: "tooltipDisabled", showRefLines: "showRefLines", referenceLines: "referenceLines", showRefLabels: "showRefLabels", xScaleMin: "xScaleMin", xScaleMax: "xScaleMax", yScaleMin: "yScaleMin", yScaleMax: "yScaleMax", wrapTicks: "wrapTicks" }, outputs: { activate: "activate", deactivate: "deactivate" }, host: { listeners: { "mouseleave": "hideCircles()" } }, queries: [{ propertyName: "tooltipTemplate", first: true, predicate: ["tooltipTemplate"], descendants: true }, { propertyName: "seriesTooltipTemplate", first: true, predicate: ["seriesTooltipTemplate"], descendants: true }], usesInheritance: true, ngImport: i0, template: ` `, isInline: true, styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n"], components: [{ type: ChartComponent, selector: "ngx-charts-chart", inputs: ["view", "showLegend", "legendOptions", "legendType", "activeEntries", "animations"], outputs: ["legendLabelClick", "legendLabelActivate", "legendLabelDeactivate"] }, { type: XAxisComponent, selector: "g[ngx-charts-x-axis]", inputs: ["xScale", "dims", "trimTicks", "rotateTicks", "maxTickLength", "tickFormatting", "showGridLines", "showLabel", "labelText", "ticks", "xAxisTickCount", "xOrient", "xAxisOffset", "wrapTicks"], outputs: ["dimensionsChanged"] }, { type: YAxisComponent, selector: "g[ngx-charts-y-axis]", inputs: ["yScale", "dims", "trimTicks", "maxTickLength", "tickFormatting", "ticks", "showGridLines", "showLabel", "labelText", "yAxisTickCount", "yOrient", "referenceLines", "showRefLines", "showRefLabels", "yAxisOffset", "wrapTicks"], outputs: ["dimensionsChanged"] }, { type: LineSeriesComponent, selector: "g[ngx-charts-line-series]", inputs: ["data", "xScale", "yScale", "colors", "scaleType", "curve", "activeEntries", "rangeFillOpacity", "hasRange", "animations"] }, { type: TooltipArea, selector: "g[ngx-charts-tooltip-area]", inputs: ["dims", "xSet", "xScale", "yScale", "results", "colors", "showPercentage", "tooltipDisabled", "tooltipTemplate"], outputs: ["hover"] }, { type: CircleSeriesComponent, selector: "g[ngx-charts-circle-series]", inputs: ["data", "type", "xScale", "yScale", "colors", "scaleType", "visibleValue", "activeEntries", "tooltipDisabled", "tooltipTemplate"], outputs: ["select", "activate", "deactivate"] }, { type: Timeline, selector: "g[ngx-charts-timeline]", inputs: ["view", "results", "scheme", "customColors", "legend", "autoScale", "scaleType", "height"], outputs: ["select", "onDomainChange"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], animations: [ trigger('animationState', [ transition(':leave', [ style({ opacity: 1 }), animate(500, style({ opacity: 0 })) ]) ]) ], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: LineChartComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-charts-line-chart', template: ` `, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, animations: [ trigger('animationState', [ transition(':leave', [ style({ opacity: 1 }), animate(500, style({ opacity: 0 })) ]) ]) ], styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n"] }] }], propDecorators: { legend: [{ type: Input }], legendTitle: [{ type: Input }], legendPosition: [{ type: Input }], xAxis: [{ type: Input }], yAxis: [{ type: Input }], showXAxisLabel: [{ type: Input }], showYAxisLabel: [{ type: Input }], xAxisLabel: [{ type: Input }], yAxisLabel: [{ type: Input }], autoScale: [{ type: Input }], timeline: [{ type: Input }], gradient: [{ type: Input }], showGridLines: [{ type: Input }], curve: [{ type: Input }], activeEntries: [{ type: Input }], schemeType: [{ type: Input }], rangeFillOpacity: [{ type: Input }], trimXAxisTicks: [{ type: Input }], trimYAxisTicks: [{ type: Input }], rotateXAxisTicks: [{ type: Input }], maxXAxisTickLength: [{ type: Input }], maxYAxisTickLength: [{ type: Input }], xAxisTickFormatting: [{ type: Input }], yAxisTickFormatting: [{ type: Input }], xAxisTicks: [{ type: Input }], yAxisTicks: [{ type: Input }], roundDomains: [{ type: Input }], tooltipDisabled: [{ type: Input }], showRefLines: [{ type: Input }], referenceLines: [{ type: Input }], showRefLabels: [{ type: Input }], xScaleMin: [{ type: Input }], xScaleMax: [{ type: Input }], yScaleMin: [{ type: Input }], yScaleMax: [{ type: Input }], wrapTicks: [{ type: Input }], activate: [{ type: Output }], deactivate: [{ type: Output }], tooltipTemplate: [{ type: ContentChild, args: ['tooltipTemplate'] }], seriesTooltipTemplate: [{ type: ContentChild, args: ['seriesTooltipTemplate'] }], hideCircles: [{ type: HostListener, args: ['mouseleave'] }] } }); class LineChartModule { } LineChartModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: LineChartModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); LineChartModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: LineChartModule, declarations: [LineComponent, LineChartComponent, LineSeriesComponent], imports: [ChartCommonModule], exports: [LineComponent, LineChartComponent, LineSeriesComponent] }); LineChartModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: LineChartModule, imports: [[ChartCommonModule]] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: LineChartModule, decorators: [{ type: NgModule, args: [{ imports: [ChartCommonModule], declarations: [LineComponent, LineChartComponent, LineSeriesComponent], exports: [LineComponent, LineChartComponent, LineSeriesComponent] }] }] }); class PieLabelComponent { constructor(platformId) { this.platformId = platformId; this.animations = true; this.labelTrim = true; this.labelTrimSize = 10; this.trimLabel = trimLabel; } ngOnChanges(changes) { this.setTransforms(); this.update(); } setTransforms() { if (isPlatformServer(this.platformId)) { this.styleTransform = `translate3d(${this.textX}px,${this.textY}px, 0)`; this.attrTransform = `translate(${this.textX},${this.textY})`; this.textTransition = !this.animations ? null : 'transform 0.75s'; } else { const isIE = /(edge|msie|trident)/i.test(navigator.userAgent); this.styleTransform = isIE ? null : `translate3d(${this.textX}px,${this.textY}px, 0)`; this.attrTransform = !isIE ? null : `translate(${this.textX},${this.textY})`; this.textTransition = isIE || !this.animations ? null : 'transform 0.75s'; } } update() { let startRadius = this.radius; if (this.explodeSlices) { startRadius = (this.radius * this.value) / this.max; } const innerArc = arc().innerRadius(startRadius).outerRadius(startRadius); // Calculate innerPos then scale outer position to match label position const innerPos = innerArc.centroid(this.data); let scale = this.data.pos[1] / innerPos[1]; if (this.data.pos[1] === 0 || innerPos[1] === 0) { scale = 1; } const outerPos = [scale * innerPos[0], scale * innerPos[1]]; this.line = `M${innerPos}L${outerPos}L${this.data.pos}`; } get textX() { return this.data.pos[0]; } get textY() { return this.data.pos[1]; } textAnchor() { return this.midAngle(this.data) < Math.PI ? TextAnchor.Start : TextAnchor.End; } midAngle(d) { return d.startAngle + (d.endAngle - d.startAngle) / 2; } } PieLabelComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: PieLabelComponent, deps: [{ token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component }); PieLabelComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: PieLabelComponent, selector: "g[ngx-charts-pie-label]", inputs: { data: "data", radius: "radius", label: "label", color: "color", max: "max", value: "value", explodeSlices: "explodeSlices", animations: "animations", labelTrim: "labelTrim", labelTrimSize: "labelTrimSize" }, usesOnChanges: true, ngImport: i0, template: ` {{ label }} {{ labelTrim ? trimLabel(label, labelTrimSize) : label }} `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: PieLabelComponent, decorators: [{ type: Component, args: [{ selector: 'g[ngx-charts-pie-label]', template: ` {{ label }} {{ labelTrim ? trimLabel(label, labelTrimSize) : label }} `, changeDetection: ChangeDetectionStrategy.OnPush }] }], ctorParameters: function () { return [{ type: undefined, decorators: [{ type: Inject, args: [PLATFORM_ID] }] }]; }, propDecorators: { data: [{ type: Input }], radius: [{ type: Input }], label: [{ type: Input }], color: [{ type: Input }], max: [{ type: Input }], value: [{ type: Input }], explodeSlices: [{ type: Input }], animations: [{ type: Input }], labelTrim: [{ type: Input }], labelTrimSize: [{ type: Input }] } }); class PolarSeriesComponent { constructor() { this.tooltipDisabled = false; this.gradient = false; this.animations = true; this.select = new EventEmitter(); this.activate = new EventEmitter(); this.deactivate = new EventEmitter(); this.circleRadius = 3; this.barOrientation = BarOrientation; this.placementTypes = PlacementTypes; this.styleTypes = StyleTypes; } ngOnChanges(changes) { this.update(); } update() { this.updateGradients(); const line = this.getLineGenerator(); const data = this.sortData(this.data.series); const seriesName = this.data.name; const linearScaleType = this.colors.scaleType === ScaleType.Linear; const min = this.yScale.domain()[0]; this.seriesColor = this.colors.getColor(linearScaleType ? min : seriesName); this.path = line(data) || ''; this.circles = data.map(d => { const a = this.getAngle(d); const r = this.getRadius(d); const value = d.value; const color = this.colors.getColor(linearScaleType ? Math.abs(value) : seriesName); const cData = Object.assign({}, d, { series: seriesName, value, name: d.name }); return { data: cData, cx: r * Math.sin(a), cy: -r * Math.cos(a), value, color, label: d.name }; }); this.active = this.isActive(this.data); this.inactive = this.isInactive(this.data); this.tooltipText = this.tooltipText || (c => this.defaultTooltipText(c)); } getAngle(d) { const label = d.name; if (this.scaleType === ScaleType.Time) { return this.xScale(label); } else if (this.scaleType === ScaleType.Linear) { return this.xScale(Number(label)); } return this.xScale(label); } getRadius(d) { return this.yScale(d.value); } getLineGenerator() { return lineRadial() .angle(d => this.getAngle(d)) .radius(d => this.getRadius(d)) .curve(this.curve); } sortData(data) { if (this.scaleType === ScaleType.Linear) { return sortLinear(data, 'name'); } else if (this.scaleType === ScaleType.Time) { return sortByTime(data, 'name'); } return sortByDomain(data, 'name', 'asc', this.xScale.domain()); } isActive(entry) { if (!this.activeEntries) return false; const item = this.activeEntries.find(d => { return entry.name === d.name; }); return item !== undefined; } isInactive(entry) { if (!this.activeEntries || this.activeEntries.length === 0) return false; const item = this.activeEntries.find(d => { return entry.name === d.name; }); return item === undefined; } defaultTooltipText({ label, value }) { return ` ${escapeLabel(this.data.name)} • ${escapeLabel(label)} ${value.toLocaleString()} `; } updateGradients() { this.hasGradient = this.gradient || this.colors.scaleType === ScaleType.Linear; if (!this.hasGradient) { return; } this.gradientId = 'grad' + id().toString(); this.gradientUrl = `url(#${this.gradientId})`; if (this.colors.scaleType === ScaleType.Linear) { const values = this.data.series.map(d => d.value); const max = Math.max(...values); const min = Math.min(...values); this.gradientStops = this.colors.getLinearGradientStops(max, min); } else { this.gradientStops = undefined; } } } PolarSeriesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: PolarSeriesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); PolarSeriesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: PolarSeriesComponent, selector: "g[ngx-charts-polar-series]", inputs: { name: "name", data: "data", xScale: "xScale", yScale: "yScale", colors: "colors", scaleType: "scaleType", curve: "curve", activeEntries: "activeEntries", rangeFillOpacity: "rangeFillOpacity", tooltipDisabled: "tooltipDisabled", tooltipText: "tooltipText", gradient: "gradient", tooltipTemplate: "tooltipTemplate", animations: "animations" }, outputs: { select: "select", activate: "activate", deactivate: "deactivate" }, usesOnChanges: true, ngImport: i0, template: ` `, isInline: true, components: [{ type: SvgRadialGradientComponent, selector: "g[ngx-charts-svg-radial-gradient]", inputs: ["color", "name", "startOpacity", "endOpacity", "cx", "cy", "stops"] }, { type: LineComponent, selector: "g[ngx-charts-line]", inputs: ["path", "stroke", "data", "fill", "animations"] }, { type: CircleComponent, selector: "g[ngx-charts-circle]", inputs: ["cx", "cy", "r", "fill", "stroke", "data", "classNames", "circleOpacity", "pointerEvents"], outputs: ["select", "activate", "deactivate"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: TooltipDirective, selector: "[ngx-tooltip]", inputs: ["tooltipCssClass", "tooltipTitle", "tooltipAppendToBody", "tooltipSpacing", "tooltipDisabled", "tooltipShowCaret", "tooltipPlacement", "tooltipAlignment", "tooltipType", "tooltipCloseOnClickOutside", "tooltipCloseOnMouseLeave", "tooltipHideTimeout", "tooltipShowTimeout", "tooltipTemplate", "tooltipShowEvent", "tooltipContext", "tooltipImmediateExit"], outputs: ["show", "hide"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: PolarSeriesComponent, decorators: [{ type: Component, args: [{ selector: 'g[ngx-charts-polar-series]', template: ` `, changeDetection: ChangeDetectionStrategy.OnPush }] }], propDecorators: { name: [{ type: Input }], data: [{ type: Input }], xScale: [{ type: Input }], yScale: [{ type: Input }], colors: [{ type: Input }], scaleType: [{ type: Input }], curve: [{ type: Input }], activeEntries: [{ type: Input }], rangeFillOpacity: [{ type: Input }], tooltipDisabled: [{ type: Input }], tooltipText: [{ type: Input }], gradient: [{ type: Input }], tooltipTemplate: [{ type: Input }], animations: [{ type: Input }], select: [{ type: Output }], activate: [{ type: Output }], deactivate: [{ type: Output }] } }); const twoPI = 2 * Math.PI; class PolarChartComponent extends BaseChartComponent { constructor() { super(...arguments); this.legendTitle = 'Legend'; this.legendPosition = LegendPosition.Right; this.showGridLines = true; this.curve = curveCardinalClosed; this.activeEntries = []; this.rangeFillOpacity = 0.15; this.trimYAxisTicks = true; this.maxYAxisTickLength = 16; this.roundDomains = false; this.tooltipDisabled = false; this.showSeriesOnHover = true; this.gradient = false; this.yAxisMinScale = 0; this.labelTrim = true; this.labelTrimSize = 10; this.wrapTicks = false; this.activate = new EventEmitter(); this.deactivate = new EventEmitter(); // series: any; // ??? this.margin = [10, 20, 10, 20]; this.xAxisHeight = 0; this.yAxisWidth = 0; this.orientation = Orientation; this.isSSR = false; } ngOnInit() { if (isPlatformServer(this.platformId)) { this.isSSR = true; } } update() { super.update(); this.setDims(); this.setScales(); this.setColors(); this.legendOptions = this.getLegendOptions(); this.setTicks(); } setDims() { this.dims = calculateViewDimensions({ width: this.width, height: this.height, margins: this.margin, showXAxis: this.xAxis, showYAxis: this.yAxis, xAxisHeight: this.xAxisHeight, yAxisWidth: this.yAxisWidth, showXLabel: this.showXAxisLabel, showYLabel: this.showYAxisLabel, showLegend: this.legend, legendType: this.schemeType, legendPosition: this.legendPosition }); const halfWidth = Math.floor(this.dims.width / 2); const halfHeight = Math.floor(this.dims.height / 2); const outerRadius = (this.outerRadius = Math.min(halfHeight / 1.5, halfWidth / 1.5)); const yOffset = Math.max(0, halfHeight - outerRadius); this.yAxisDims = { ...this.dims, width: halfWidth }; this.transform = `translate(${this.dims.xOffset}, ${this.margin[0]})`; this.transformYAxis = `translate(0, ${yOffset})`; this.labelOffset = this.dims.height + 40; this.transformPlot = `translate(${halfWidth}, ${halfHeight})`; } setScales() { const xValues = this.getXValues(); this.scaleType = getScaleType(xValues); this.xDomain = this.filteredDomain || this.getXDomain(xValues); this.yDomain = this.getYDomain(); this.seriesDomain = this.getSeriesDomain(); this.xScale = this.getXScale(this.xDomain, twoPI); this.yScale = this.getYScale(this.yDomain, this.outerRadius); this.yAxisScale = this.getYScale(this.yDomain.reverse(), this.outerRadius); } setTicks() { let tickFormat; if (this.xAxisTickFormatting) { tickFormat = this.xAxisTickFormatting; } else if (this.xScale.tickFormat) { tickFormat = this.xScale.tickFormat.apply(this.xScale, [5]); } else { tickFormat = d => { if (isDate(d)) { return d.toLocaleDateString(); } return d.toLocaleString(); }; } const outerRadius = this.outerRadius; const s = 1.1; this.thetaTicks = this.xDomain.map(d => { const startAngle = this.xScale(d); const dd = s * outerRadius * (startAngle > Math.PI ? -1 : 1); const label = tickFormat(d); const startPos = [outerRadius * Math.sin(startAngle), -outerRadius * Math.cos(startAngle)]; const pos = [dd, s * startPos[1]]; return { innerRadius: 0, outerRadius, startAngle, endAngle: startAngle, value: outerRadius, label, startPos, pos }; }); const minDistance = 10; /* from pie chart, abstract out -*/ for (let i = 0; i < this.thetaTicks.length - 1; i++) { const a = this.thetaTicks[i]; for (let j = i + 1; j < this.thetaTicks.length; j++) { const b = this.thetaTicks[j]; // if they're on the same side if (b.pos[0] * a.pos[0] > 0) { // if they're overlapping const o = minDistance - Math.abs(b.pos[1] - a.pos[1]); if (o > 0) { // push the second up or down b.pos[1] += Math.sign(b.pos[0]) * o; } } } } this.radiusTicks = this.yAxisScale.ticks(Math.floor(this.dims.height / 50)).map(d => this.yScale(d)); } getXValues() { const values = []; for (const results of this.results) { for (const d of results.series) { if (!values.includes(d.name)) { values.push(d.name); } } } return values; } getXDomain(values = this.getXValues()) { if (this.scaleType === ScaleType.Time) { const min = Math.min(...values); const max = Math.max(...values); return [min, max]; } else if (this.scaleType === ScaleType.Linear) { values = values.map(v => Number(v)); const min = Math.min(...values); const max = Math.max(...values); return [min, max]; } return values; } getYValues() { const domain = []; for (const results of this.results) { for (const d of results.series) { if (domain.indexOf(d.value) < 0) { domain.push(d.value); } if (d.min !== undefined) { if (domain.indexOf(d.min) < 0) { domain.push(d.min); } } if (d.max !== undefined) { if (domain.indexOf(d.max) < 0) { domain.push(d.max); } } } } return domain; } getYDomain(domain = this.getYValues()) { let min = Math.min(...domain); const max = Math.max(this.yAxisMinScale, ...domain); min = Math.max(0, min); if (!this.autoScale) { min = Math.min(0, min); } return [min, max]; } getSeriesDomain() { return this.results.map(d => d.name); } getXScale(domain, width) { switch (this.scaleType) { case ScaleType.Time: return scaleTime().range([0, width]).domain(domain); case ScaleType.Linear: { const scale = scaleLinear().range([0, width]).domain(domain); return this.roundDomains ? scale.nice() : scale; } default: return scalePoint() .range([0, width - twoPI / domain.length]) .padding(0) .domain(domain); } } getYScale(domain, height) { const scale = scaleLinear().range([0, height]).domain(domain); return this.roundDomains ? scale.nice() : scale; } onClick(data, series) { if (series) { data.series = series.name; } this.select.emit(data); } setColors() { const domain = this.schemeType === ScaleType.Ordinal ? this.seriesDomain : this.yDomain.reverse(); this.colors = new ColorHelper(this.scheme, this.schemeType, domain, this.customColors); } getLegendOptions() { if (this.schemeType === ScaleType.Ordinal) { return { scaleType: this.schemeType, colors: this.colors, domain: this.seriesDomain, title: this.legendTitle, position: this.legendPosition }; } return { scaleType: this.schemeType, colors: this.colors.scale, domain: this.yDomain, title: undefined, position: this.legendPosition }; } updateYAxisWidth({ width }) { this.yAxisWidth = width; this.update(); } updateXAxisHeight({ height }) { this.xAxisHeight = height; this.update(); } onActivate(item) { const idx = this.activeEntries.findIndex(d => { return d.name === item.name && d.value === item.value; }); if (idx > -1) { return; } this.activeEntries = this.showSeriesOnHover ? [item, ...this.activeEntries] : this.activeEntries; this.activate.emit({ value: item, entries: this.activeEntries }); } onDeactivate(item) { const idx = this.activeEntries.findIndex(d => { return d.name === item.name && d.value === item.value; }); this.activeEntries.splice(idx, 1); this.activeEntries = [...this.activeEntries]; this.deactivate.emit({ value: item, entries: this.activeEntries }); } deactivateAll() { this.activeEntries = [...this.activeEntries]; for (const entry of this.activeEntries) { this.deactivate.emit({ value: entry, entries: [] }); } this.activeEntries = []; } trackBy(index, item) { return `${item.name}`; } } PolarChartComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: PolarChartComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); PolarChartComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: PolarChartComponent, selector: "ngx-charts-polar-chart", inputs: { legend: "legend", legendTitle: "legendTitle", legendPosition: "legendPosition", xAxis: "xAxis", yAxis: "yAxis", showXAxisLabel: "showXAxisLabel", showYAxisLabel: "showYAxisLabel", xAxisLabel: "xAxisLabel", yAxisLabel: "yAxisLabel", autoScale: "autoScale", showGridLines: "showGridLines", curve: "curve", activeEntries: "activeEntries", schemeType: "schemeType", rangeFillOpacity: "rangeFillOpacity", trimYAxisTicks: "trimYAxisTicks", maxYAxisTickLength: "maxYAxisTickLength", xAxisTickFormatting: "xAxisTickFormatting", yAxisTickFormatting: "yAxisTickFormatting", roundDomains: "roundDomains", tooltipDisabled: "tooltipDisabled", showSeriesOnHover: "showSeriesOnHover", gradient: "gradient", yAxisMinScale: "yAxisMinScale", labelTrim: "labelTrim", labelTrimSize: "labelTrimSize", wrapTicks: "wrapTicks" }, outputs: { activate: "activate", deactivate: "deactivate" }, queries: [{ propertyName: "tooltipTemplate", first: true, predicate: ["tooltipTemplate"], descendants: true }], usesInheritance: true, ngImport: i0, template: ` `, isInline: true, styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n", ".pie-label{font-size:11px}.pie-label.animation{animation:.75s ease-in fadeIn}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.pie-label-line{stroke-dasharray:100%}.pie-label-line.animation{animation:3s linear drawOut;transition:d .75s}@keyframes drawOut{0%{stroke-dashoffset:100%}to{stroke-dashoffset:0}}\n", ".polar-chart .polar-chart-background{fill:none}.polar-chart .radial-gridline-path{stroke-dasharray:10 10;fill:none}.polar-chart .pie-label-line{stroke:#2f3646}.polar-charts-series .polar-series-area,.polar-series-path{pointer-events:none}\n"], components: [{ type: ChartComponent, selector: "ngx-charts-chart", inputs: ["view", "showLegend", "legendOptions", "legendType", "activeEntries", "animations"], outputs: ["legendLabelClick", "legendLabelActivate", "legendLabelDeactivate"] }, { type: PieLabelComponent, selector: "g[ngx-charts-pie-label]", inputs: ["data", "radius", "label", "color", "max", "value", "explodeSlices", "animations", "labelTrim", "labelTrimSize"] }, { type: YAxisComponent, selector: "g[ngx-charts-y-axis]", inputs: ["yScale", "dims", "trimTicks", "maxTickLength", "tickFormatting", "ticks", "showGridLines", "showLabel", "labelText", "yAxisTickCount", "yOrient", "referenceLines", "showRefLines", "showRefLabels", "yAxisOffset", "wrapTicks"], outputs: ["dimensionsChanged"] }, { type: AxisLabelComponent, selector: "g[ngx-charts-axis-label]", inputs: ["orient", "label", "offset", "width", "height"] }, { type: PolarSeriesComponent, selector: "g[ngx-charts-polar-series]", inputs: ["name", "data", "xScale", "yScale", "colors", "scaleType", "curve", "activeEntries", "rangeFillOpacity", "tooltipDisabled", "tooltipText", "gradient", "tooltipTemplate", "animations"], outputs: ["select", "activate", "deactivate"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], animations: [ trigger('animationState', [ transition(':leave', [ style({ opacity: 1 }), animate(500, style({ opacity: 0 })) ]) ]) ], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: PolarChartComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-charts-polar-chart', template: ` `, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, animations: [ trigger('animationState', [ transition(':leave', [ style({ opacity: 1 }), animate(500, style({ opacity: 0 })) ]) ]) ], styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n", ".pie-label{font-size:11px}.pie-label.animation{animation:.75s ease-in fadeIn}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.pie-label-line{stroke-dasharray:100%}.pie-label-line.animation{animation:3s linear drawOut;transition:d .75s}@keyframes drawOut{0%{stroke-dashoffset:100%}to{stroke-dashoffset:0}}\n", ".polar-chart .polar-chart-background{fill:none}.polar-chart .radial-gridline-path{stroke-dasharray:10 10;fill:none}.polar-chart .pie-label-line{stroke:#2f3646}.polar-charts-series .polar-series-area,.polar-series-path{pointer-events:none}\n"] }] }], propDecorators: { legend: [{ type: Input }], legendTitle: [{ type: Input }], legendPosition: [{ type: Input }], xAxis: [{ type: Input }], yAxis: [{ type: Input }], showXAxisLabel: [{ type: Input }], showYAxisLabel: [{ type: Input }], xAxisLabel: [{ type: Input }], yAxisLabel: [{ type: Input }], autoScale: [{ type: Input }], showGridLines: [{ type: Input }], curve: [{ type: Input }], activeEntries: [{ type: Input }], schemeType: [{ type: Input }], rangeFillOpacity: [{ type: Input }], trimYAxisTicks: [{ type: Input }], maxYAxisTickLength: [{ type: Input }], xAxisTickFormatting: [{ type: Input }], yAxisTickFormatting: [{ type: Input }], roundDomains: [{ type: Input }], tooltipDisabled: [{ type: Input }], showSeriesOnHover: [{ type: Input }], gradient: [{ type: Input }], yAxisMinScale: [{ type: Input }], labelTrim: [{ type: Input }], labelTrimSize: [{ type: Input }], wrapTicks: [{ type: Input }], activate: [{ type: Output }], deactivate: [{ type: Output }], tooltipTemplate: [{ type: ContentChild, args: ['tooltipTemplate'] }] } }); class PieArcComponent { constructor(element) { this.startAngle = 0; this.endAngle = Math.PI * 2; this.cornerRadius = 0; this.explodeSlices = false; this.gradient = false; this.animate = true; this.pointerEvents = true; this.isActive = false; this.select = new EventEmitter(); this.activate = new EventEmitter(); this.deactivate = new EventEmitter(); this.dblclick = new EventEmitter(); this.barOrientation = BarOrientation; this.initialized = false; this.element = element.nativeElement; } ngOnChanges(changes) { this.update(); } getGradient() { return this.gradient ? this.gradientFill : this.fill; } getPointerEvents() { return this.pointerEvents ? 'auto' : 'none'; } update() { const calc = this.calculateArc(); this.startOpacity = 0.5; this.radialGradientId = 'linearGrad' + id().toString(); this.gradientFill = `url(#${this.radialGradientId})`; if (this.animate) { if (this.initialized) { this.updateAnimation(); } else { this.loadAnimation(); this.initialized = true; } } else { this.path = calc.startAngle(this.startAngle).endAngle(this.endAngle)(); } } calculateArc() { let outerRadius = this.outerRadius; if (this.explodeSlices && this.innerRadius === 0) { outerRadius = (this.outerRadius * this.value) / this.max; } return arc().innerRadius(this.innerRadius).outerRadius(outerRadius).cornerRadius(this.cornerRadius); } loadAnimation() { const node = select(this.element) .selectAll('.arc') .data([{ startAngle: this.startAngle, endAngle: this.endAngle }]); const calc = this.calculateArc(); node .transition() .attrTween('d', function (d) { this._current = this._current || d; const copyOfD = Object.assign({}, d); copyOfD.endAngle = copyOfD.startAngle; const interpolater = interpolate(copyOfD, copyOfD); this._current = interpolater(0); return function (t) { return calc(interpolater(t)); }; }) .transition() .duration(750) .attrTween('d', function (d) { this._current = this._current || d; const interpolater = interpolate(this._current, d); this._current = interpolater(0); return function (t) { return calc(interpolater(t)); }; }); } updateAnimation() { const node = select(this.element) .selectAll('.arc') .data([{ startAngle: this.startAngle, endAngle: this.endAngle }]); const calc = this.calculateArc(); node .transition() .duration(750) .attrTween('d', function (d) { this._current = this._current || d; const interpolater = interpolate(this._current, d); this._current = interpolater(0); return function (t) { return calc(interpolater(t)); }; }); } onClick() { clearTimeout(this._timeout); this._timeout = setTimeout(() => this.select.emit(this.data), 200); } onDblClick(event) { event.preventDefault(); event.stopPropagation(); clearTimeout(this._timeout); this.dblclick.emit({ data: this.data, nativeEvent: event }); } } PieArcComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: PieArcComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); PieArcComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: PieArcComponent, selector: "g[ngx-charts-pie-arc]", inputs: { fill: "fill", startAngle: "startAngle", endAngle: "endAngle", innerRadius: "innerRadius", outerRadius: "outerRadius", cornerRadius: "cornerRadius", value: "value", max: "max", data: "data", explodeSlices: "explodeSlices", gradient: "gradient", animate: "animate", pointerEvents: "pointerEvents", isActive: "isActive" }, outputs: { select: "select", activate: "activate", deactivate: "deactivate", dblclick: "dblclick" }, usesOnChanges: true, ngImport: i0, template: ` `, isInline: true, components: [{ type: SvgRadialGradientComponent, selector: "g[ngx-charts-svg-radial-gradient]", inputs: ["color", "name", "startOpacity", "endOpacity", "cx", "cy", "stops"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: PieArcComponent, decorators: [{ type: Component, args: [{ selector: 'g[ngx-charts-pie-arc]', template: ` `, changeDetection: ChangeDetectionStrategy.OnPush }] }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { fill: [{ type: Input }], startAngle: [{ type: Input }], endAngle: [{ type: Input }], innerRadius: [{ type: Input }], outerRadius: [{ type: Input }], cornerRadius: [{ type: Input }], value: [{ type: Input }], max: [{ type: Input }], data: [{ type: Input }], explodeSlices: [{ type: Input }], gradient: [{ type: Input }], animate: [{ type: Input }], pointerEvents: [{ type: Input }], isActive: [{ type: Input }], select: [{ type: Output }], activate: [{ type: Output }], deactivate: [{ type: Output }], dblclick: [{ type: Output }] } }); class PieSeriesComponent { constructor() { this.series = []; this.innerRadius = 60; this.outerRadius = 80; this.trimLabels = true; this.maxLabelLength = 10; this.tooltipDisabled = false; this.animations = true; this.select = new EventEmitter(); this.activate = new EventEmitter(); this.deactivate = new EventEmitter(); this.dblclick = new EventEmitter(); this.placementTypes = PlacementTypes; this.styleTypes = StyleTypes; } ngOnChanges(changes) { this.update(); } update() { const pieGenerator = pie() .value(d => d.value) .sort(null); const arcData = pieGenerator(this.series); this.max = max(arcData, d => { return d.value; }); this.data = this.calculateLabelPositions(arcData); this.tooltipText = this.tooltipText || this.defaultTooltipText; } midAngle(d) { return d.startAngle + (d.endAngle - d.startAngle) / 2; } outerArc() { const factor = 1.5; return arc() .innerRadius(this.outerRadius * factor) .outerRadius(this.outerRadius * factor); } calculateLabelPositions(pieData) { const factor = 1.5; const minDistance = 10; const labelPositions = pieData; labelPositions.forEach(d => { d.pos = this.outerArc().centroid(d); d.pos[0] = factor * this.outerRadius * (this.midAngle(d) < Math.PI ? 1 : -1); }); for (let i = 0; i < labelPositions.length - 1; i++) { const a = labelPositions[i]; if (!this.labelVisible(a)) { continue; } for (let j = i + 1; j < labelPositions.length; j++) { const b = labelPositions[j]; if (!this.labelVisible(b)) { continue; } // if they're on the same side if (b.pos[0] * a.pos[0] > 0) { // if they're overlapping const o = minDistance - Math.abs(b.pos[1] - a.pos[1]); if (o > 0) { // push the second up or down b.pos[1] += Math.sign(b.pos[0]) * o; } } } } return labelPositions; } labelVisible(myArc) { return this.showLabels && myArc.endAngle - myArc.startAngle > Math.PI / 30; } getTooltipTitle(a) { return this.tooltipTemplate ? undefined : this.tooltipText(a); } labelText(myArc) { if (this.labelFormatting) { return this.labelFormatting(myArc.data.name); } return this.label(myArc); } label(myArc) { return formatLabel(myArc.data.name); } defaultTooltipText(myArc) { const label = this.label(myArc); const val = formatLabel(myArc.data.value); return ` ${escapeLabel(label)} ${val} `; } color(myArc) { return this.colors.getColor(this.label(myArc)); } trackBy(index, item) { return item.data.name; } onClick(data) { this.select.emit(data); } isActive(entry) { if (!this.activeEntries) return false; const item = this.activeEntries.find(d => { return entry.name === d.name && entry.series === d.series; }); return item !== undefined; } } PieSeriesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: PieSeriesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); PieSeriesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: PieSeriesComponent, selector: "g[ngx-charts-pie-series]", inputs: { colors: "colors", series: "series", dims: "dims", innerRadius: "innerRadius", outerRadius: "outerRadius", explodeSlices: "explodeSlices", showLabels: "showLabels", gradient: "gradient", activeEntries: "activeEntries", labelFormatting: "labelFormatting", trimLabels: "trimLabels", maxLabelLength: "maxLabelLength", tooltipText: "tooltipText", tooltipDisabled: "tooltipDisabled", tooltipTemplate: "tooltipTemplate", animations: "animations" }, outputs: { select: "select", activate: "activate", deactivate: "deactivate", dblclick: "dblclick" }, usesOnChanges: true, ngImport: i0, template: ` `, isInline: true, components: [{ type: PieLabelComponent, selector: "g[ngx-charts-pie-label]", inputs: ["data", "radius", "label", "color", "max", "value", "explodeSlices", "animations", "labelTrim", "labelTrimSize"] }, { type: PieArcComponent, selector: "g[ngx-charts-pie-arc]", inputs: ["fill", "startAngle", "endAngle", "innerRadius", "outerRadius", "cornerRadius", "value", "max", "data", "explodeSlices", "gradient", "animate", "pointerEvents", "isActive"], outputs: ["select", "activate", "deactivate", "dblclick"] }], directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: TooltipDirective, selector: "[ngx-tooltip]", inputs: ["tooltipCssClass", "tooltipTitle", "tooltipAppendToBody", "tooltipSpacing", "tooltipDisabled", "tooltipShowCaret", "tooltipPlacement", "tooltipAlignment", "tooltipType", "tooltipCloseOnClickOutside", "tooltipCloseOnMouseLeave", "tooltipHideTimeout", "tooltipShowTimeout", "tooltipTemplate", "tooltipShowEvent", "tooltipContext", "tooltipImmediateExit"], outputs: ["show", "hide"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: PieSeriesComponent, decorators: [{ type: Component, args: [{ selector: 'g[ngx-charts-pie-series]', template: ` `, changeDetection: ChangeDetectionStrategy.OnPush }] }], propDecorators: { colors: [{ type: Input }], series: [{ type: Input }], dims: [{ type: Input }], innerRadius: [{ type: Input }], outerRadius: [{ type: Input }], explodeSlices: [{ type: Input }], showLabels: [{ type: Input }], gradient: [{ type: Input }], activeEntries: [{ type: Input }], labelFormatting: [{ type: Input }], trimLabels: [{ type: Input }], maxLabelLength: [{ type: Input }], tooltipText: [{ type: Input }], tooltipDisabled: [{ type: Input }], tooltipTemplate: [{ type: Input }], animations: [{ type: Input }], select: [{ type: Output }], activate: [{ type: Output }], deactivate: [{ type: Output }], dblclick: [{ type: Output }] } }); class AdvancedPieChartComponent extends BaseChartComponent { constructor() { super(...arguments); this.activeEntries = []; this.tooltipDisabled = false; this.label = 'Total'; this.activate = new EventEmitter(); this.deactivate = new EventEmitter(); this.margin = [20, 20, 20, 20]; } update() { super.update(); this.dims = calculateViewDimensions({ width: (this.width * 4) / 12.0, height: this.height, margins: this.margin }); this.formatDates(); this.domain = this.getDomain(); this.setColors(); const xOffset = this.dims.width / 2; const yOffset = this.margin[0] + this.dims.height / 2; this.legendWidth = this.width - this.dims.width - this.margin[1]; this.outerRadius = Math.min(this.dims.width, this.dims.height) / 2.5; this.innerRadius = this.outerRadius * 0.75; this.transform = `translate(${xOffset} , ${yOffset})`; } getDomain() { return this.results.map(d => d.label); } onClick(data) { this.select.emit(data); } setColors() { this.colors = new ColorHelper(this.scheme, ScaleType.Ordinal, this.domain, this.customColors); } onActivate(item, fromLegend = false) { item = this.results.find(d => { if (fromLegend) { return d.label === item.name; } else { return d.name === item.name; } }); const idx = this.activeEntries.findIndex(d => { return d.name === item.name && d.value === item.value && d.series === item.series; }); if (idx > -1) { return; } this.activeEntries = [item, ...this.activeEntries]; this.activate.emit({ value: item, entries: this.activeEntries }); } onDeactivate(item, fromLegend = false) { item = this.results.find(d => { if (fromLegend) { return d.label === item.name; } else { return d.name === item.name; } }); const idx = this.activeEntries.findIndex(d => { return d.name === item.name && d.value === item.value && d.series === item.series; }); this.activeEntries.splice(idx, 1); this.activeEntries = [...this.activeEntries]; this.deactivate.emit({ value: item, entries: this.activeEntries }); } } AdvancedPieChartComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: AdvancedPieChartComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); AdvancedPieChartComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: AdvancedPieChartComponent, selector: "ngx-charts-advanced-pie-chart", inputs: { gradient: "gradient", activeEntries: "activeEntries", tooltipDisabled: "tooltipDisabled", tooltipText: "tooltipText", label: "label", valueFormatting: "valueFormatting", nameFormatting: "nameFormatting", percentageFormatting: "percentageFormatting" }, outputs: { activate: "activate", deactivate: "deactivate" }, queries: [{ propertyName: "tooltipTemplate", first: true, predicate: ["tooltipTemplate"], descendants: true }], usesInheritance: true, ngImport: i0, template: `
`, isInline: true, styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n", ".advanced-pie{display:inline-block;float:left}.advanced-pie-legend-wrapper{display:inline-block}\n"], components: [{ type: ChartComponent, selector: "ngx-charts-chart", inputs: ["view", "showLegend", "legendOptions", "legendType", "activeEntries", "animations"], outputs: ["legendLabelClick", "legendLabelActivate", "legendLabelDeactivate"] }, { type: PieSeriesComponent, selector: "g[ngx-charts-pie-series]", inputs: ["colors", "series", "dims", "innerRadius", "outerRadius", "explodeSlices", "showLabels", "gradient", "activeEntries", "labelFormatting", "trimLabels", "maxLabelLength", "tooltipText", "tooltipDisabled", "tooltipTemplate", "animations"], outputs: ["select", "activate", "deactivate", "dblclick"] }, { type: AdvancedLegendComponent, selector: "ngx-charts-advanced-legend", inputs: ["width", "data", "colors", "label", "animations", "valueFormatting", "labelFormatting", "percentageFormatting"], outputs: ["select", "activate", "deactivate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: AdvancedPieChartComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-charts-advanced-pie-chart', template: `
`, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n", ".advanced-pie{display:inline-block;float:left}.advanced-pie-legend-wrapper{display:inline-block}\n"] }] }], propDecorators: { gradient: [{ type: Input }], activeEntries: [{ type: Input }], tooltipDisabled: [{ type: Input }], tooltipText: [{ type: Input }], label: [{ type: Input }], activate: [{ type: Output }], deactivate: [{ type: Output }], tooltipTemplate: [{ type: ContentChild, args: ['tooltipTemplate'] }], valueFormatting: [{ type: Input }], nameFormatting: [{ type: Input }], percentageFormatting: [{ type: Input }] } }); class PieChartComponent extends BaseChartComponent { constructor() { super(...arguments); this.labels = false; this.legend = false; this.legendTitle = 'Legend'; this.legendPosition = LegendPosition.Right; this.explodeSlices = false; this.doughnut = false; this.arcWidth = 0.25; this.activeEntries = []; this.tooltipDisabled = false; this.trimLabels = true; this.maxLabelLength = 10; this.dblclick = new EventEmitter(); this.select = new EventEmitter(); this.activate = new EventEmitter(); this.deactivate = new EventEmitter(); } update() { super.update(); if (this.labels && this.hasNoOptionalMarginsSet()) { this.margins = [30, 80, 30, 80]; } else if (!this.labels && this.hasNoOptionalMarginsSet()) { // default value for margins this.margins = [20, 20, 20, 20]; } this.dims = calculateViewDimensions({ width: this.width, height: this.height, margins: this.margins, showLegend: this.legend, legendPosition: this.legendPosition }); this.formatDates(); const xOffset = this.margins[3] + this.dims.width / 2; const yOffset = this.margins[0] + this.dims.height / 2; this.translation = `translate(${xOffset}, ${yOffset})`; this.outerRadius = Math.min(this.dims.width, this.dims.height); if (this.labels) { // make room for labels this.outerRadius /= 3; } else { this.outerRadius /= 2; } this.innerRadius = 0; if (this.doughnut) { this.innerRadius = this.outerRadius * (1 - this.arcWidth); } this.domain = this.getDomain(); // sort data according to domain this.data = this.results.sort((a, b) => { return this.domain.indexOf(a.name) - this.domain.indexOf(b.name); }); this.setColors(); this.legendOptions = this.getLegendOptions(); } getDomain() { return this.results.map(d => d.label); } onClick(data) { this.select.emit(data); } setColors() { this.colors = new ColorHelper(this.scheme, ScaleType.Ordinal, this.domain, this.customColors); } getLegendOptions() { return { scaleType: ScaleType.Ordinal, domain: this.domain, colors: this.colors, title: this.legendTitle, position: this.legendPosition }; } onActivate(item, fromLegend = false) { item = this.results.find(d => { if (fromLegend) { return d.label === item.name; } else { return d.name === item.name; } }); const idx = this.activeEntries.findIndex(d => { return d.name === item.name && d.value === item.value && d.series === item.series; }); if (idx > -1) { return; } this.activeEntries = [item, ...this.activeEntries]; this.activate.emit({ value: item, entries: this.activeEntries }); } onDeactivate(item, fromLegend = false) { item = this.results.find(d => { if (fromLegend) { return d.label === item.name; } else { return d.name === item.name; } }); const idx = this.activeEntries.findIndex(d => { return d.name === item.name && d.value === item.value && d.series === item.series; }); this.activeEntries.splice(idx, 1); this.activeEntries = [...this.activeEntries]; this.deactivate.emit({ value: item, entries: this.activeEntries }); } hasNoOptionalMarginsSet() { return !this.margins || this.margins.length <= 0; } } PieChartComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: PieChartComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); PieChartComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: PieChartComponent, selector: "ngx-charts-pie-chart", inputs: { labels: "labels", legend: "legend", legendTitle: "legendTitle", legendPosition: "legendPosition", explodeSlices: "explodeSlices", doughnut: "doughnut", arcWidth: "arcWidth", gradient: "gradient", activeEntries: "activeEntries", tooltipDisabled: "tooltipDisabled", labelFormatting: "labelFormatting", trimLabels: "trimLabels", maxLabelLength: "maxLabelLength", tooltipText: "tooltipText", margins: "margins" }, outputs: { dblclick: "dblclick", select: "select", activate: "activate", deactivate: "deactivate" }, queries: [{ propertyName: "tooltipTemplate", first: true, predicate: ["tooltipTemplate"], descendants: true }], usesInheritance: true, ngImport: i0, template: ` `, isInline: true, styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n", ".pie-label{font-size:11px}.pie-label.animation{animation:.75s ease-in fadeIn}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.pie-label-line{stroke-dasharray:100%}.pie-label-line.animation{animation:3s linear drawOut;transition:d .75s}@keyframes drawOut{0%{stroke-dashoffset:100%}to{stroke-dashoffset:0}}\n"], components: [{ type: ChartComponent, selector: "ngx-charts-chart", inputs: ["view", "showLegend", "legendOptions", "legendType", "activeEntries", "animations"], outputs: ["legendLabelClick", "legendLabelActivate", "legendLabelDeactivate"] }, { type: PieSeriesComponent, selector: "g[ngx-charts-pie-series]", inputs: ["colors", "series", "dims", "innerRadius", "outerRadius", "explodeSlices", "showLabels", "gradient", "activeEntries", "labelFormatting", "trimLabels", "maxLabelLength", "tooltipText", "tooltipDisabled", "tooltipTemplate", "animations"], outputs: ["select", "activate", "deactivate", "dblclick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: PieChartComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-charts-pie-chart', template: ` `, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n", ".pie-label{font-size:11px}.pie-label.animation{animation:.75s ease-in fadeIn}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.pie-label-line{stroke-dasharray:100%}.pie-label-line.animation{animation:3s linear drawOut;transition:d .75s}@keyframes drawOut{0%{stroke-dashoffset:100%}to{stroke-dashoffset:0}}\n"] }] }], propDecorators: { labels: [{ type: Input }], legend: [{ type: Input }], legendTitle: [{ type: Input }], legendPosition: [{ type: Input }], explodeSlices: [{ type: Input }], doughnut: [{ type: Input }], arcWidth: [{ type: Input }], gradient: [{ type: Input }], activeEntries: [{ type: Input }], tooltipDisabled: [{ type: Input }], labelFormatting: [{ type: Input }], trimLabels: [{ type: Input }], maxLabelLength: [{ type: Input }], tooltipText: [{ type: Input }], dblclick: [{ type: Output }], margins: [{ type: Input }], select: [{ type: Output }], activate: [{ type: Output }], deactivate: [{ type: Output }], tooltipTemplate: [{ type: ContentChild, args: ['tooltipTemplate'] }] } }); function gridSize(dims, len, minWidth) { let rows = 1; let cols = len; const width = dims.width; if (width > minWidth) { while (width / cols < minWidth) { rows += 1; cols = Math.ceil(len / rows); } } return [cols, rows]; } function gridLayout(dims, data, minWidth, designatedTotal) { const xScale = scaleBand(); const yScale = scaleBand(); const width = dims.width; const height = dims.height; const [columns, rows] = gridSize(dims, data.length, minWidth); const xDomain = []; const yDomain = []; for (let i = 0; i < rows; i++) { yDomain.push(i); } for (let i = 0; i < columns; i++) { xDomain.push(i); } xScale.domain(xDomain); yScale.domain(yDomain); xScale.rangeRound([0, width], 0.1); yScale.rangeRound([0, height], 0.1); const res = []; const total = designatedTotal ? designatedTotal : getTotal(data); const cardWidth = xScale.bandwidth(); const cardHeight = yScale.bandwidth(); for (let i = 0; i < data.length; i++) { res[i] = {}; res[i].data = { name: data[i] ? data[i].name : '', value: data[i] ? data[i].value : undefined, extra: data[i] ? data[i].extra : undefined, label: data[i] ? data[i].label : '' }; res[i].x = xScale(i % columns); res[i].y = yScale(Math.floor(i / columns)); res[i].width = cardWidth; res[i].height = cardHeight; res[i].data.percent = total > 0 ? res[i].data.value / total : 0; res[i].data.total = total; } return res; } function getTotal(results) { return results.map(d => (d ? d.value : 0)).reduce((sum, val) => sum + val, 0); } class PieGridSeriesComponent { constructor(element) { this.innerRadius = 70; this.outerRadius = 80; this.animations = true; this.select = new EventEmitter(); this.activate = new EventEmitter(); this.deactivate = new EventEmitter(); this.element = element.nativeElement; } ngOnChanges(changes) { this.update(); } update() { this.layout = pie() .value(d => d.data.value) .sort(null); this.arcs = this.getArcs(); } getArcs() { return this.layout(this.data).map((arc, index) => { const label = arc.data.data.name; const other = arc.data.data.other; if (index === 0) { arc.startAngle = 0; } const color = this.colors(label); return { data: arc.data.data, class: 'arc ' + 'arc' + index, fill: color, startAngle: other ? 0 : arc.startAngle, endAngle: arc.endAngle, animate: this.animations && !other, pointerEvents: !other }; }); } onClick(data) { this.select.emit(this.data[0].data); } trackBy(index, item) { return item.data.name; } label(arc) { return arc.data.name; } color(arc) { return this.colors(this.label(arc)); } } PieGridSeriesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: PieGridSeriesComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); PieGridSeriesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: PieGridSeriesComponent, selector: "g[ngx-charts-pie-grid-series]", inputs: { colors: "colors", data: "data", innerRadius: "innerRadius", outerRadius: "outerRadius", animations: "animations" }, outputs: { select: "select", activate: "activate", deactivate: "deactivate" }, usesOnChanges: true, ngImport: i0, template: ` `, isInline: true, components: [{ type: PieArcComponent, selector: "g[ngx-charts-pie-arc]", inputs: ["fill", "startAngle", "endAngle", "innerRadius", "outerRadius", "cornerRadius", "value", "max", "data", "explodeSlices", "gradient", "animate", "pointerEvents", "isActive"], outputs: ["select", "activate", "deactivate", "dblclick"] }], directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: PieGridSeriesComponent, decorators: [{ type: Component, args: [{ selector: 'g[ngx-charts-pie-grid-series]', template: ` `, changeDetection: ChangeDetectionStrategy.OnPush }] }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { colors: [{ type: Input }], data: [{ type: Input }], innerRadius: [{ type: Input }], outerRadius: [{ type: Input }], animations: [{ type: Input }], select: [{ type: Output }], activate: [{ type: Output }], deactivate: [{ type: Output }] } }); class PieGridComponent extends BaseChartComponent { constructor() { super(...arguments); this.tooltipDisabled = false; this.label = 'Total'; this.minWidth = 150; this.activeEntries = []; this.activate = new EventEmitter(); this.deactivate = new EventEmitter(); this.margin = [20, 20, 20, 20]; this.placementTypes = PlacementTypes; this.styleTypes = StyleTypes; } update() { super.update(); this.dims = calculateViewDimensions({ width: this.width, height: this.height, margins: this.margin }); this.formatDates(); this.domain = this.getDomain(); this.data = gridLayout(this.dims, this.results, this.minWidth, this.designatedTotal); this.transform = `translate(${this.margin[3]} , ${this.margin[0]})`; this.series = this.getSeries(); this.setColors(); this.tooltipText = this.tooltipText || this.defaultTooltipText; } defaultTooltipText({ data }) { const label = trimLabel(formatLabel(data.name)); const val = data.value.toLocaleString(); return ` ${label} ${val} `; } getDomain() { return this.results.map(d => d.label); } getSeries() { const total = this.designatedTotal ? this.designatedTotal : this.getTotal(); return this.data.map(d => { const baselineLabelHeight = 20; const padding = 10; const name = d.data.name; const label = formatLabel(name); const value = d.data.value; const radius = min([d.width - padding, d.height - baselineLabelHeight]) / 2 - 5; const innerRadius = radius * 0.9; let count = 0; const colors = () => { count += 1; if (count === 1) { return 'rgba(100,100,100,0.3)'; } else { return this.colorScale.getColor(label); } }; const xPos = d.x + (d.width - padding) / 2; const yPos = d.y + (d.height - baselineLabelHeight) / 2; return { transform: `translate(${xPos}, ${yPos})`, colors, innerRadius, outerRadius: radius, name, label: trimLabel(label), total: value, value, percent: format('.1%')(d.data.percent), data: [ d, { data: { other: true, value: total - value, name: d.data.name } } ] }; }); } getTotal() { return this.results.map(d => d.value).reduce((sum, d) => sum + d, 0); } onClick(data) { this.select.emit(data); } setColors() { this.colorScale = new ColorHelper(this.scheme, ScaleType.Ordinal, this.domain, this.customColors); } onActivate(item, fromLegend = false) { item = this.results.find(d => { if (fromLegend) { return d.label === item.name; } else { return d.name === item.name; } }); const idx = this.activeEntries.findIndex(d => { return d.name === item.name && d.value === item.value && d.series === item.series; }); if (idx > -1) { return; } this.activeEntries = [item, ...this.activeEntries]; this.activate.emit({ value: item, entries: this.activeEntries }); } onDeactivate(item, fromLegend = false) { item = this.results.find(d => { if (fromLegend) { return d.label === item.name; } else { return d.name === item.name; } }); const idx = this.activeEntries.findIndex(d => { return d.name === item.name && d.value === item.value && d.series === item.series; }); this.activeEntries.splice(idx, 1); this.activeEntries = [...this.activeEntries]; this.deactivate.emit({ value: item, entries: this.activeEntries }); } } PieGridComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: PieGridComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); PieGridComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: PieGridComponent, selector: "ngx-charts-pie-grid", inputs: { designatedTotal: "designatedTotal", tooltipDisabled: "tooltipDisabled", tooltipText: "tooltipText", label: "label", minWidth: "minWidth", activeEntries: "activeEntries" }, outputs: { activate: "activate", deactivate: "deactivate" }, queries: [{ propertyName: "tooltipTemplate", first: true, predicate: ["tooltipTemplate"], descendants: true }], usesInheritance: true, ngImport: i0, template: ` {{ series.percent.toLocaleString() }} {{ series.label }} {{ label }}: {{ series.total.toLocaleString() }} `, isInline: true, styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n", ".pie-grid .arc1{opacity:.4}.pie-grid .percent-label{font-size:16px;font-weight:400}\n"], components: [{ type: ChartComponent, selector: "ngx-charts-chart", inputs: ["view", "showLegend", "legendOptions", "legendType", "activeEntries", "animations"], outputs: ["legendLabelClick", "legendLabelActivate", "legendLabelDeactivate"] }, { type: PieGridSeriesComponent, selector: "g[ngx-charts-pie-grid-series]", inputs: ["colors", "data", "innerRadius", "outerRadius", "animations"], outputs: ["select", "activate", "deactivate"] }, { type: CountUpDirective, selector: "[ngx-charts-count-up]", inputs: ["countDuration", "countPrefix", "countSuffix", "valueFormatting", "countDecimals", "countTo", "countFrom"], outputs: ["countChange", "countFinish"] }], directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: TooltipDirective, selector: "[ngx-tooltip]", inputs: ["tooltipCssClass", "tooltipTitle", "tooltipAppendToBody", "tooltipSpacing", "tooltipDisabled", "tooltipShowCaret", "tooltipPlacement", "tooltipAlignment", "tooltipType", "tooltipCloseOnClickOutside", "tooltipCloseOnMouseLeave", "tooltipHideTimeout", "tooltipShowTimeout", "tooltipTemplate", "tooltipShowEvent", "tooltipContext", "tooltipImmediateExit"], outputs: ["show", "hide"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: PieGridComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-charts-pie-grid', template: ` {{ series.percent.toLocaleString() }} {{ series.label }} {{ label }}: {{ series.total.toLocaleString() }} `, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n", ".pie-grid .arc1{opacity:.4}.pie-grid .percent-label{font-size:16px;font-weight:400}\n"] }] }], propDecorators: { designatedTotal: [{ type: Input }], tooltipDisabled: [{ type: Input }], tooltipText: [{ type: Input }], label: [{ type: Input }], minWidth: [{ type: Input }], activeEntries: [{ type: Input }], activate: [{ type: Output }], deactivate: [{ type: Output }], tooltipTemplate: [{ type: ContentChild, args: ['tooltipTemplate'] }] } }); class PieChartModule { } PieChartModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: PieChartModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); PieChartModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: PieChartModule, declarations: [AdvancedPieChartComponent, PieLabelComponent, PieArcComponent, PieChartComponent, PieGridComponent, PieGridSeriesComponent, PieSeriesComponent], imports: [ChartCommonModule], exports: [AdvancedPieChartComponent, PieLabelComponent, PieArcComponent, PieChartComponent, PieGridComponent, PieGridSeriesComponent, PieSeriesComponent] }); PieChartModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: PieChartModule, imports: [[ChartCommonModule]] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: PieChartModule, decorators: [{ type: NgModule, args: [{ imports: [ChartCommonModule], declarations: [ AdvancedPieChartComponent, PieLabelComponent, PieArcComponent, PieChartComponent, PieGridComponent, PieGridSeriesComponent, PieSeriesComponent ], exports: [ AdvancedPieChartComponent, PieLabelComponent, PieArcComponent, PieChartComponent, PieGridComponent, PieGridSeriesComponent, PieSeriesComponent ] }] }] }); class PolarChartModule { } PolarChartModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: PolarChartModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); PolarChartModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: PolarChartModule, declarations: [PolarChartComponent, PolarSeriesComponent], imports: [ChartCommonModule, PieChartModule, LineChartModule], exports: [PolarChartComponent, PolarSeriesComponent] }); PolarChartModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: PolarChartModule, imports: [[ChartCommonModule, PieChartModule, LineChartModule]] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: PolarChartModule, decorators: [{ type: NgModule, args: [{ imports: [ChartCommonModule, PieChartModule, LineChartModule], declarations: [PolarChartComponent, PolarSeriesComponent], exports: [PolarChartComponent, PolarSeriesComponent] }] }] }); function calculateTextWidth(fontFamilyKey, text, defaultWidth = 8) { return text.split('').reduce((acc, curr) => { const width = fontFamilyKey[curr] || defaultWidth; return acc + width; }, 0); } const VERDANA_FONT_WIDTHS_16_PX = { '0': 10, '1': 10, '2': 10, '3': 10, '4': 10, '5': 10, '6': 10, '7': 10, '8': 10, '9': 10, A: 11, B: 11, C: 11, D: 12, E: 10, F: 9, G: 12, H: 12, I: 7, J: 7, K: 11, L: 9, M: 13, N: 12, O: 13, P: 10, Q: 13, R: 11, S: 11, T: 10, U: 12, V: 11, W: 16, X: 11, Y: 10, Z: 11, a: 10, b: 10, c: 8, d: 10, e: 10, f: 6, g: 10, h: 10, i: 4, j: 6, k: 9, l: 4, m: 16, n: 10, o: 10, p: 10, q: 10, r: 7, s: 8, t: 6, u: 10, v: 9, w: 13, x: 9, y: 9, z: 8, '!': 6, '@': 16, '#': 13, $: 10, '%': 17, '^': 13, '&': 12, '*': 10, '(': 7, ')': 7, _: 10, '-': 7, '+': 13, '=': 13, ',': 6, '.': 6, '/': 7, "'": 4, ':': 7, '|': 7, '?': 9, ';': 7, '<': 13, '>': 13 }; class CardComponent { constructor(element, cd, zone, platformId) { this.cd = cd; this.zone = zone; this.platformId = platformId; this.animations = true; this.select = new EventEmitter(); this.value = ''; this.textFontSize = 12; this.textTransform = ''; this.initialized = false; this.bandHeight = 10; this.textPadding = [10, 20, 5, 20]; this.labelFontSize = 15; this.element = element.nativeElement; } ngOnChanges(changes) { this.update(); } ngOnInit() { if (isPlatformServer(this.platformId)) { this.scaleTextSSR(); } } ngOnDestroy() { if (isPlatformBrowser(this.platformId)) { cancelAnimationFrame(this.animationReq); } } update() { this.zone.run(() => { const hasValue = this.data && typeof this.data.value !== 'undefined'; const valueFormatting = this.valueFormatting || (card => card.value.toLocaleString()); const labelFormatting = this.labelFormatting || (card => escapeLabel(trimLabel(card.label, 55))); this.transform = `translate(${this.x} , ${this.y})`; this.textWidth = Math.max(0, this.width) - this.textPadding[1] - this.textPadding[3]; this.cardWidth = Math.max(0, this.width); this.cardHeight = Math.max(0, this.height); this.label = this.label ? this.label : this.data.name; const cardData = { label: this.label, data: this.data, value: this.data.value }; this.formattedLabel = labelFormatting(cardData); this.transformBand = `translate(0 , ${this.cardHeight - this.bandHeight})`; const value = hasValue ? valueFormatting(cardData) : ''; this.value = this.paddedValue(value); this.setPadding(); this.bandPath = roundedRect(0, 0, this.cardWidth, this.bandHeight, 3, [false, false, true, true]); setTimeout(() => { if (isPlatformBrowser(this.platformId)) { this.scaleText(); } this.value = value; if (hasValue && !this.initialized) { setTimeout(() => this.startCount(), 20); } }, 8); }); } paddedValue(value) { if (this.medianSize && this.medianSize > value.length) { value += '\u2007'.repeat(this.medianSize - value.length); } return value; } startCount() { if (!this.initialized && this.animations) { cancelAnimationFrame(this.animationReq); const val = this.data.value; const decs = decimalChecker(val); const valueFormatting = this.valueFormatting || (card => card.value.toLocaleString()); const callback = ({ value, finished }) => { this.zone.run(() => { value = finished ? val : value; this.value = valueFormatting({ label: this.label, data: this.data, value }); if (!finished) { this.value = this.paddedValue(this.value); } this.cd.markForCheck(); }); }; this.animationReq = count(0, val, decs, 1, callback); this.initialized = true; } } scaleText() { this.zone.run(() => { const { width, height } = this.textEl.nativeElement.getBoundingClientRect(); if (width === 0 || height === 0) { return; } const textPadding = (this.textPadding[1] = this.textPadding[3] = this.cardWidth / 8); const availableWidth = this.cardWidth - 2 * textPadding; const availableHeight = this.cardHeight / 3; const resizeScale = Math.min(availableWidth / width, availableHeight / height); this.textFontSize = Math.floor(this.textFontSize * resizeScale); this.labelFontSize = Math.min(this.textFontSize, 15); this.setPadding(); this.cd.markForCheck(); }); } scaleTextSSR() { const width = calculateTextWidth(VERDANA_FONT_WIDTHS_16_PX, this.value, 10); const height = 18; const textPadding = (this.textPadding[1] = this.textPadding[3] = this.cardWidth / 8); const availableWidth = this.cardWidth - 2 * textPadding; const availableHeight = this.cardHeight / 3; const resizeScale = Math.min(availableWidth / width, availableHeight / height); this.textFontSize = Math.floor(this.textFontSize * resizeScale); this.labelFontSize = Math.min(this.textFontSize, 15); this.setPadding(); } setPadding() { this.textPadding[1] = this.textPadding[3] = this.cardWidth / 8; const padding = this.cardHeight / 2; this.textPadding[0] = padding - this.textFontSize - this.labelFontSize / 2; this.textPadding[2] = padding - this.labelFontSize; } onClick() { this.select.emit(this.data); } } CardComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: CardComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component }); CardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: CardComponent, selector: "g[ngx-charts-card]", inputs: { color: "color", bandColor: "bandColor", textColor: "textColor", x: "x", y: "y", width: "width", height: "height", label: "label", data: "data", medianSize: "medianSize", valueFormatting: "valueFormatting", labelFormatting: "labelFormatting", animations: "animations" }, outputs: { select: "select" }, viewQueries: [{ propertyName: "textEl", first: true, predicate: ["textEl"], descendants: true }], usesOnChanges: true, ngImport: i0, template: ` {{ label }} {{ value }} `, isInline: true, directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: CardComponent, decorators: [{ type: Component, args: [{ selector: 'g[ngx-charts-card]', template: ` {{ label }} {{ value }} `, changeDetection: ChangeDetectionStrategy.OnPush }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: undefined, decorators: [{ type: Inject, args: [PLATFORM_ID] }] }]; }, propDecorators: { color: [{ type: Input }], bandColor: [{ type: Input }], textColor: [{ type: Input }], x: [{ type: Input }], y: [{ type: Input }], width: [{ type: Input }], height: [{ type: Input }], label: [{ type: Input }], data: [{ type: Input }], medianSize: [{ type: Input }], valueFormatting: [{ type: Input }], labelFormatting: [{ type: Input }], animations: [{ type: Input }], select: [{ type: Output }], textEl: [{ type: ViewChild, args: ['textEl', { static: false }] }] } }); /** * Converts a hex to RGB * * @export */ function hexToRgb(value) { // deprecated, use d3.color() return d3_color.rgb(value); } /** * Accepts a color (string) and returns a inverted hex color (string) * http://stackoverflow.com/questions/9600295/automatically-change-text-color-to-assure-readability * * @export */ function invertColor(value) { const color = d3_color.rgb(value); const { r, g, b, opacity } = color; if (opacity === 0) { return color.toString(); } const yiq = (r * 299 + g * 587 + b * 114) / 1000; const depth = yiq >= 128 ? -0.8 : 0.8; return shadeRGBColor(color, depth); } /** * Given a rgb, it will darken/lighten * http://stackoverflow.com/questions/5560248/programmatically-lighten-or-darken-a-hex-color-or-rgb-and-blend-colors * * @export * @param \{ r, g, b } */ function shadeRGBColor({ r, g, b }, percent) { const t = percent < 0 ? 0 : 255; const p = percent < 0 ? percent * -1 : percent; r = Math.round((t - r) * p) + r; g = Math.round((t - g) * p) + g; b = Math.round((t - b) * p) + b; return `rgb(${r}, ${g}, ${b})`; } class CardSeriesComponent { constructor() { this.innerPadding = 15; this.emptyColor = 'rgba(0, 0, 0, 0)'; this.animations = true; this.select = new EventEmitter(); } ngOnChanges(changes) { this.update(); } update() { if (this.data.length > 2) { const valueFormatting = this.valueFormatting || (card => card.value.toLocaleString()); const sortedLengths = this.data .map(d => { const hasValue = d && d.data && typeof d.data.value !== 'undefined' && d.data.value !== null; return hasValue ? valueFormatting({ data: d.data, label: d ? d.data.name : '', value: d && d.data ? d.data.value : '' }).length : 0; }) .sort((a, b) => b - a); const idx = Math.ceil(this.data.length / 2); this.medianSize = sortedLengths[idx]; } const cards = this.getCards(); this.cards = cards.filter(d => d.data.value !== null); this.emptySlots = cards.filter(d => d.data.value === null); } getCards() { const yPadding = typeof this.innerPadding === 'number' ? this.innerPadding : this.innerPadding[0] + this.innerPadding[2]; const xPadding = typeof this.innerPadding === 'number' ? this.innerPadding : this.innerPadding[1] + this.innerPadding[3]; return this.data.map((d, index) => { let label = d.data.name; if (label && label.constructor.name === 'Date') { label = label.toLocaleDateString(); } else { label = label ? label.toLocaleString() : label; } const value = d.data.value; const valueColor = label ? this.colors.getColor(label) : this.emptyColor; const color = this.cardColor || valueColor || '#000'; return { x: d.x, y: d.y, width: d.width - xPadding, height: d.height - yPadding, color, bandColor: this.bandColor || valueColor, textColor: this.textColor || invertColor(color), label, data: d.data, tooltipText: `${label}: ${value}` }; }); } trackBy(index, card) { return card.label; } onClick(data) { this.select.emit(data); } } CardSeriesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: CardSeriesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); CardSeriesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: CardSeriesComponent, selector: "g[ngx-charts-card-series]", inputs: { data: "data", dims: "dims", colors: "colors", innerPadding: "innerPadding", cardColor: "cardColor", bandColor: "bandColor", emptyColor: "emptyColor", textColor: "textColor", valueFormatting: "valueFormatting", labelFormatting: "labelFormatting", animations: "animations" }, outputs: { select: "select" }, usesOnChanges: true, ngImport: i0, template: ` `, isInline: true, components: [{ type: CardComponent, selector: "g[ngx-charts-card]", inputs: ["color", "bandColor", "textColor", "x", "y", "width", "height", "label", "data", "medianSize", "valueFormatting", "labelFormatting", "animations"], outputs: ["select"] }], directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: CardSeriesComponent, decorators: [{ type: Component, args: [{ selector: 'g[ngx-charts-card-series]', template: ` `, changeDetection: ChangeDetectionStrategy.OnPush }] }], propDecorators: { data: [{ type: Input }], dims: [{ type: Input }], colors: [{ type: Input }], innerPadding: [{ type: Input }], cardColor: [{ type: Input }], bandColor: [{ type: Input }], emptyColor: [{ type: Input }], textColor: [{ type: Input }], valueFormatting: [{ type: Input }], labelFormatting: [{ type: Input }], animations: [{ type: Input }], select: [{ type: Output }] } }); class NumberCardComponent extends BaseChartComponent { constructor() { super(...arguments); this.emptyColor = 'rgba(0, 0, 0, 0)'; this.innerPadding = 15; this.margin = [10, 10, 10, 10]; } get clickable() { return !!this.select.observers.length; } update() { super.update(); this.dims = calculateViewDimensions({ width: this.width, height: this.height, margins: this.margin }); this.formatDates(); this.domain = this.getDomain(); this.setColors(); this.transform = `translate(${this.dims.xOffset} , ${this.margin[0]})`; const size = gridSize(this.dims, this.results.length, 150); const N = size[0] * size[1]; const data = this.results.slice(); while (data.length < N) { data.push({ value: null }); } this.data = gridLayout(this.dims, data, 150, this.designatedTotal); } getDomain() { return this.results.map(d => d.label); } onClick(data) { this.select.emit(data); } setColors() { this.colors = new ColorHelper(this.scheme, ScaleType.Ordinal, this.domain, this.customColors); } } NumberCardComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: NumberCardComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); NumberCardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: NumberCardComponent, selector: "ngx-charts-number-card", inputs: { cardColor: "cardColor", bandColor: "bandColor", emptyColor: "emptyColor", innerPadding: "innerPadding", textColor: "textColor", valueFormatting: "valueFormatting", labelFormatting: "labelFormatting", designatedTotal: "designatedTotal" }, usesInheritance: true, ngImport: i0, template: ` `, isInline: true, styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n", "ngx-charts-number-card .cell .trimmed-label{font-size:12px;pointer-events:none;overflow:hidden;text-align:left;line-height:1em}ngx-charts-number-card .cell .trimmed-label p{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;width:100%;padding:0;margin:0}ngx-charts-number-card .cell .value-text{pointer-events:none}ngx-charts-number-card .number-card.clickable .cell .card,ngx-charts-number-card .number-card.clickable .cell .card-band{cursor:pointer}\n"], components: [{ type: ChartComponent, selector: "ngx-charts-chart", inputs: ["view", "showLegend", "legendOptions", "legendType", "activeEntries", "animations"], outputs: ["legendLabelClick", "legendLabelActivate", "legendLabelDeactivate"] }, { type: CardSeriesComponent, selector: "g[ngx-charts-card-series]", inputs: ["data", "dims", "colors", "innerPadding", "cardColor", "bandColor", "emptyColor", "textColor", "valueFormatting", "labelFormatting", "animations"], outputs: ["select"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: NumberCardComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-charts-number-card', template: ` `, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n", "ngx-charts-number-card .cell .trimmed-label{font-size:12px;pointer-events:none;overflow:hidden;text-align:left;line-height:1em}ngx-charts-number-card .cell .trimmed-label p{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;width:100%;padding:0;margin:0}ngx-charts-number-card .cell .value-text{pointer-events:none}ngx-charts-number-card .number-card.clickable .cell .card,ngx-charts-number-card .number-card.clickable .cell .card-band{cursor:pointer}\n"] }] }], propDecorators: { cardColor: [{ type: Input }], bandColor: [{ type: Input }], emptyColor: [{ type: Input }], innerPadding: [{ type: Input }], textColor: [{ type: Input }], valueFormatting: [{ type: Input }], labelFormatting: [{ type: Input }], designatedTotal: [{ type: Input }] } }); class NumberCardModule { } NumberCardModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: NumberCardModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); NumberCardModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: NumberCardModule, declarations: [CardComponent, CardSeriesComponent, NumberCardComponent], imports: [ChartCommonModule], exports: [CardComponent, CardSeriesComponent, NumberCardComponent] }); NumberCardModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: NumberCardModule, imports: [[ChartCommonModule]] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: NumberCardModule, decorators: [{ type: NgModule, args: [{ imports: [ChartCommonModule], declarations: [CardComponent, CardSeriesComponent, NumberCardComponent], exports: [CardComponent, CardSeriesComponent, NumberCardComponent] }] }] }); class TreeMapCellComponent { constructor(element) { this.gradient = false; this.animations = true; this.select = new EventEmitter(); this.initialized = false; this.orientation = BarOrientation; this.element = element.nativeElement; } ngOnChanges() { this.update(); this.valueFormatting = this.valueFormatting || (value => value.toLocaleString()); const labelFormatting = this.labelFormatting || (cell => escapeLabel(trimLabel(cell.label, 55))); const cellData = { data: this.data, label: this.label, value: this.value }; this.formattedValue = this.valueFormatting(cellData.value); this.formattedLabel = labelFormatting(cellData); this.gradientId = 'grad' + id().toString(); this.gradientUrl = `url(#${this.gradientId})`; this.gradientStops = this.getGradientStops(); } update() { if (this.initialized) { this.animateToCurrentForm(); } else { if (this.animations) { this.loadAnimation(); } this.initialized = true; } } loadAnimation() { const node = select(this.element).select('.cell'); node.attr('opacity', 0).attr('x', this.x).attr('y', this.y); this.animateToCurrentForm(); } getTextColor() { return invertColor(this.fill); } animateToCurrentForm() { const node = select(this.element).select('.cell'); if (this.animations) { node .transition() .duration(750) .attr('opacity', 1) .attr('x', this.x) .attr('y', this.y) .attr('width', this.width) .attr('height', this.height); } else { node.attr('opacity', 1).attr('x', this.x).attr('y', this.y).attr('width', this.width).attr('height', this.height); } } onClick() { this.select.emit(this.data); } getGradientStops() { return [ { offset: 0, color: this.fill, opacity: 0.3 }, { offset: 100, color: this.fill, opacity: 1 } ]; } } TreeMapCellComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: TreeMapCellComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); TreeMapCellComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: TreeMapCellComponent, selector: "g[ngx-charts-tree-map-cell]", inputs: { data: "data", fill: "fill", x: "x", y: "y", width: "width", height: "height", label: "label", value: "value", valueFormatting: "valueFormatting", labelFormatting: "labelFormatting", gradient: "gradient", animations: "animations" }, outputs: { select: "select" }, usesOnChanges: true, ngImport: i0, template: ` {{ formattedValue }} `, isInline: true, components: [{ type: SvgLinearGradientComponent, selector: "g[ngx-charts-svg-linear-gradient]", inputs: ["orientation", "name", "stops"] }, { type: CountUpDirective, selector: "[ngx-charts-count-up]", inputs: ["countDuration", "countPrefix", "countSuffix", "valueFormatting", "countDecimals", "countTo", "countFrom"], outputs: ["countChange", "countFinish"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: TreeMapCellComponent, decorators: [{ type: Component, args: [{ selector: 'g[ngx-charts-tree-map-cell]', template: ` {{ formattedValue }} `, changeDetection: ChangeDetectionStrategy.OnPush }] }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { data: [{ type: Input }], fill: [{ type: Input }], x: [{ type: Input }], y: [{ type: Input }], width: [{ type: Input }], height: [{ type: Input }], label: [{ type: Input }], value: [{ type: Input }], valueFormatting: [{ type: Input }], labelFormatting: [{ type: Input }], gradient: [{ type: Input }], animations: [{ type: Input }], select: [{ type: Output }] } }); class TreeMapCellSeriesComponent { constructor() { this.gradient = false; this.tooltipDisabled = false; this.animations = true; this.select = new EventEmitter(); this.styleTypes = StyleTypes; this.placementTypes = PlacementTypes; } ngOnChanges(changes) { this.cells = this.getCells(); } getCells() { return this.data.children .filter(d => { return d.depth === 1; }) .map((d, index) => { const label = d.id; return { data: d.data, x: d.x0, y: d.y0, width: d.x1 - d.x0, height: d.y1 - d.y0, fill: this.colors.getColor(label), label, value: d.value }; }); } getTooltipText({ label, value }) { return ` ${escapeLabel(label)} ${value.toLocaleString()} `; } onClick(data) { this.select.emit(data); } trackBy(index, item) { return item.label; } } TreeMapCellSeriesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: TreeMapCellSeriesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); TreeMapCellSeriesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: TreeMapCellSeriesComponent, selector: "g[ngx-charts-tree-map-cell-series]", inputs: { data: "data", dims: "dims", colors: "colors", valueFormatting: "valueFormatting", labelFormatting: "labelFormatting", gradient: "gradient", tooltipDisabled: "tooltipDisabled", tooltipTemplate: "tooltipTemplate", animations: "animations" }, outputs: { select: "select" }, usesOnChanges: true, ngImport: i0, template: ` `, isInline: true, components: [{ type: TreeMapCellComponent, selector: "g[ngx-charts-tree-map-cell]", inputs: ["data", "fill", "x", "y", "width", "height", "label", "value", "valueFormatting", "labelFormatting", "gradient", "animations"], outputs: ["select"] }], directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: TooltipDirective, selector: "[ngx-tooltip]", inputs: ["tooltipCssClass", "tooltipTitle", "tooltipAppendToBody", "tooltipSpacing", "tooltipDisabled", "tooltipShowCaret", "tooltipPlacement", "tooltipAlignment", "tooltipType", "tooltipCloseOnClickOutside", "tooltipCloseOnMouseLeave", "tooltipHideTimeout", "tooltipShowTimeout", "tooltipTemplate", "tooltipShowEvent", "tooltipContext", "tooltipImmediateExit"], outputs: ["show", "hide"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: TreeMapCellSeriesComponent, decorators: [{ type: Component, args: [{ selector: 'g[ngx-charts-tree-map-cell-series]', template: ` `, changeDetection: ChangeDetectionStrategy.OnPush }] }], propDecorators: { data: [{ type: Input }], dims: [{ type: Input }], colors: [{ type: Input }], valueFormatting: [{ type: Input }], labelFormatting: [{ type: Input }], gradient: [{ type: Input }], tooltipDisabled: [{ type: Input }], tooltipTemplate: [{ type: Input }], animations: [{ type: Input }], select: [{ type: Output }] } }); class TreeMapComponent extends BaseChartComponent { constructor() { super(...arguments); this.tooltipDisabled = false; this.gradient = false; this.select = new EventEmitter(); this.margin = [10, 10, 10, 10]; } update() { super.update(); this.dims = calculateViewDimensions({ width: this.width, height: this.height, margins: this.margin }); this.domain = this.getDomain(); this.treemap = treemap().size([this.dims.width, this.dims.height]); const rootNode = { name: 'root', value: 0, isRoot: true }; const root = stratify() .id(d => { let label = d.name; if (label.constructor.name === 'Date') { label = label.toLocaleDateString(); } else { label = label.toLocaleString(); } return label; }) .parentId(d => (d.isRoot ? null : 'root'))([rootNode, ...this.results]) .sum(d => d.value); this.data = this.treemap(root); this.setColors(); this.transform = `translate(${this.dims.xOffset} , ${this.margin[0]})`; } getDomain() { return this.results.map(d => d.name); } onClick(data) { this.select.emit(data); } setColors() { this.colors = new ColorHelper(this.scheme, ScaleType.Ordinal, this.domain, this.customColors); } } TreeMapComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: TreeMapComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); TreeMapComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: TreeMapComponent, selector: "ngx-charts-tree-map", inputs: { results: "results", tooltipDisabled: "tooltipDisabled", valueFormatting: "valueFormatting", labelFormatting: "labelFormatting", gradient: "gradient" }, outputs: { select: "select" }, queries: [{ propertyName: "tooltipTemplate", first: true, predicate: ["tooltipTemplate"], descendants: true }], usesInheritance: true, ngImport: i0, template: ` `, isInline: true, styles: [".tree-map .treemap-val{font-size:1.3em;padding-top:5px;display:inline-block}.tree-map .treemap-label p{display:table-cell;text-align:center;line-height:1.2em;vertical-align:middle}\n"], components: [{ type: ChartComponent, selector: "ngx-charts-chart", inputs: ["view", "showLegend", "legendOptions", "legendType", "activeEntries", "animations"], outputs: ["legendLabelClick", "legendLabelActivate", "legendLabelDeactivate"] }, { type: TreeMapCellSeriesComponent, selector: "g[ngx-charts-tree-map-cell-series]", inputs: ["data", "dims", "colors", "valueFormatting", "labelFormatting", "gradient", "tooltipDisabled", "tooltipTemplate", "animations"], outputs: ["select"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: TreeMapComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-charts-tree-map', template: ` `, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".tree-map .treemap-val{font-size:1.3em;padding-top:5px;display:inline-block}.tree-map .treemap-label p{display:table-cell;text-align:center;line-height:1.2em;vertical-align:middle}\n"] }] }], propDecorators: { results: [{ type: Input }], tooltipDisabled: [{ type: Input }], valueFormatting: [{ type: Input }], labelFormatting: [{ type: Input }], gradient: [{ type: Input }], select: [{ type: Output }], tooltipTemplate: [{ type: ContentChild, args: ['tooltipTemplate'] }] } }); class TreeMapModule { } TreeMapModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: TreeMapModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); TreeMapModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: TreeMapModule, declarations: [TreeMapCellComponent, TreeMapCellSeriesComponent, TreeMapComponent], imports: [ChartCommonModule], exports: [TreeMapCellComponent, TreeMapCellSeriesComponent, TreeMapComponent] }); TreeMapModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: TreeMapModule, imports: [[ChartCommonModule]] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: TreeMapModule, decorators: [{ type: NgModule, args: [{ imports: [ChartCommonModule], declarations: [TreeMapCellComponent, TreeMapCellSeriesComponent, TreeMapComponent], exports: [TreeMapCellComponent, TreeMapCellSeriesComponent, TreeMapComponent] }] }] }); var ElementType; (function (ElementType) { ElementType["Value"] = "value"; ElementType["Units"] = "units"; })(ElementType || (ElementType = {})); class LinearGaugeComponent extends BaseChartComponent { constructor() { super(...arguments); this.min = 0; this.max = 100; this.value = 0; this.margin = [10, 20, 10, 20]; this.valueResizeScale = 1; this.unitsResizeScale = 1; this.valueTextTransform = ''; this.valueTranslate = ''; this.unitsTextTransform = ''; this.unitsTranslate = ''; this.barOrientation = BarOrientation; } ngAfterViewInit() { super.ngAfterViewInit(); setTimeout(() => { this.scaleText(ElementType.Value); this.scaleText(ElementType.Units); }); } update() { super.update(); this.hasPreviousValue = this.previousValue !== undefined; this.max = Math.max(this.max, this.value); this.min = Math.min(this.min, this.value); if (this.hasPreviousValue) { this.max = Math.max(this.max, this.previousValue); this.min = Math.min(this.min, this.previousValue); } this.dims = calculateViewDimensions({ width: this.width, height: this.height, margins: this.margin }); this.valueDomain = this.getValueDomain(); this.valueScale = this.getValueScale(); this.displayValue = this.getDisplayValue(); this.setColors(); const xOffset = this.margin[3] + this.dims.width / 2; const yOffset = this.margin[0] + this.dims.height / 2; this.transform = `translate(${xOffset}, ${yOffset})`; this.transformLine = `translate(${this.margin[3] + this.valueScale(this.previousValue)}, ${yOffset})`; this.valueTranslate = `translate(0, -15)`; this.unitsTranslate = `translate(0, 15)`; if (isPlatformServer(this.platformId)) { this.scaleTextSSR('value'); this.scaleTextSSR('units'); } else { setTimeout(() => this.scaleText(ElementType.Value), 50); setTimeout(() => this.scaleText(ElementType.Units), 50); } } getValueDomain() { return [this.min, this.max]; } getValueScale() { return scaleLinear().range([0, this.dims.width]).domain(this.valueDomain); } getDisplayValue() { if (this.valueFormatting) { return this.valueFormatting(this.value); } return this.value.toLocaleString(); } scaleText(element, repeat = true) { let el; let resizeScale; if (element === ElementType.Value) { el = this.valueTextEl; resizeScale = this.valueResizeScale; } else { el = this.unitsTextEl; resizeScale = this.unitsResizeScale; } const { width, height } = el.nativeElement.getBoundingClientRect(); if (width === 0 || height === 0) return; const oldScale = resizeScale; const availableWidth = this.dims.width; const availableHeight = Math.max(this.dims.height / 2 - 15, 0); const resizeScaleWidth = Math.floor((availableWidth / (width / resizeScale)) * 100) / 100; const resizeScaleHeight = Math.floor((availableHeight / (height / resizeScale)) * 100) / 100; resizeScale = Math.min(resizeScaleHeight, resizeScaleWidth); if (resizeScale !== oldScale) { if (element === ElementType.Value) { this.valueResizeScale = resizeScale; this.valueTextTransform = `scale(${resizeScale}, ${resizeScale})`; } else { this.unitsResizeScale = resizeScale; this.unitsTextTransform = `scale(${resizeScale}, ${resizeScale})`; } this.cd.markForCheck(); if (repeat && isPlatformBrowser(this.platformId)) { setTimeout(() => { this.scaleText(element, false); }, 50); } } } scaleTextSSR(element) { let resizeScale = 1; const value = element === 'value' ? this.displayValue : this.units; const width = calculateTextWidth(VERDANA_FONT_WIDTHS_16_PX, value, 10); const height = 25; const availableWidth = this.dims.width; const availableHeight = Math.max(this.dims.height / 2 - 15, 0); const resizeScaleWidth = Math.floor((availableWidth / (width / resizeScale)) * 100) / 100; const resizeScaleHeight = Math.floor((availableHeight / (height / resizeScale)) * 100) / 100; resizeScale = Math.min(resizeScaleHeight, resizeScaleWidth); if (element === 'value') { this.valueResizeScale = resizeScale; this.valueTextTransform = `scale(${resizeScale}, ${resizeScale})`; } else { this.unitsResizeScale = resizeScale; this.unitsTextTransform = `scale(${resizeScale}, ${resizeScale})`; } this.cd.markForCheck(); } onClick() { this.select.emit({ name: 'Value', value: this.value }); } setColors() { this.colors = new ColorHelper(this.scheme, ScaleType.Ordinal, [this.value], this.customColors); } } LinearGaugeComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: LinearGaugeComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); LinearGaugeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: LinearGaugeComponent, selector: "ngx-charts-linear-gauge", inputs: { min: "min", max: "max", value: "value", units: "units", previousValue: "previousValue", valueFormatting: "valueFormatting" }, viewQueries: [{ propertyName: "valueTextEl", first: true, predicate: ["valueTextEl"], descendants: true }, { propertyName: "unitsTextEl", first: true, predicate: ["unitsTextEl"], descendants: true }], usesInheritance: true, ngImport: i0, template: ` {{ displayValue }} {{ units }} `, isInline: true, styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n", ".linear-gauge{cursor:pointer}.linear-gauge .background-bar path{fill:#0000000d}.linear-gauge .units{fill:#666}\n"], components: [{ type: ChartComponent, selector: "ngx-charts-chart", inputs: ["view", "showLegend", "legendOptions", "legendType", "activeEntries", "animations"], outputs: ["legendLabelClick", "legendLabelActivate", "legendLabelDeactivate"] }, { type: BarComponent, selector: "g[ngx-charts-bar]", inputs: ["fill", "data", "width", "height", "x", "y", "orientation", "roundEdges", "gradient", "offset", "isActive", "stops", "animations", "ariaLabel", "noBarWhenZero"], outputs: ["select", "activate", "deactivate"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: LinearGaugeComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-charts-linear-gauge', template: ` {{ displayValue }} {{ units }} `, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n", ".linear-gauge{cursor:pointer}.linear-gauge .background-bar path{fill:#0000000d}.linear-gauge .units{fill:#666}\n"] }] }], propDecorators: { min: [{ type: Input }], max: [{ type: Input }], value: [{ type: Input }], units: [{ type: Input }], previousValue: [{ type: Input }], valueFormatting: [{ type: Input }], valueTextEl: [{ type: ViewChild, args: ['valueTextEl'] }], unitsTextEl: [{ type: ViewChild, args: ['unitsTextEl'] }] } }); class GaugeArcComponent { constructor() { this.isActive = false; this.tooltipDisabled = false; this.animations = true; this.select = new EventEmitter(); this.activate = new EventEmitter(); this.deactivate = new EventEmitter(); this.placementTypes = PlacementTypes; this.styleTypes = StyleTypes; } tooltipText(arc) { const label = formatLabel(arc.data.name); let val; if (this.valueFormatting) { val = this.valueFormatting(arc.data.value); } else { val = formatLabel(arc.data.value); } return ` ${escapeLabel(label)} ${val} `; } } GaugeArcComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: GaugeArcComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); GaugeArcComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: GaugeArcComponent, selector: "g[ngx-charts-gauge-arc]", inputs: { backgroundArc: "backgroundArc", valueArc: "valueArc", cornerRadius: "cornerRadius", colors: "colors", isActive: "isActive", tooltipDisabled: "tooltipDisabled", valueFormatting: "valueFormatting", tooltipTemplate: "tooltipTemplate", animations: "animations" }, outputs: { select: "select", activate: "activate", deactivate: "deactivate" }, ngImport: i0, template: ` `, isInline: true, components: [{ type: PieArcComponent, selector: "g[ngx-charts-pie-arc]", inputs: ["fill", "startAngle", "endAngle", "innerRadius", "outerRadius", "cornerRadius", "value", "max", "data", "explodeSlices", "gradient", "animate", "pointerEvents", "isActive"], outputs: ["select", "activate", "deactivate", "dblclick"] }], directives: [{ type: TooltipDirective, selector: "[ngx-tooltip]", inputs: ["tooltipCssClass", "tooltipTitle", "tooltipAppendToBody", "tooltipSpacing", "tooltipDisabled", "tooltipShowCaret", "tooltipPlacement", "tooltipAlignment", "tooltipType", "tooltipCloseOnClickOutside", "tooltipCloseOnMouseLeave", "tooltipHideTimeout", "tooltipShowTimeout", "tooltipTemplate", "tooltipShowEvent", "tooltipContext", "tooltipImmediateExit"], outputs: ["show", "hide"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: GaugeArcComponent, decorators: [{ type: Component, args: [{ selector: 'g[ngx-charts-gauge-arc]', template: ` `, changeDetection: ChangeDetectionStrategy.OnPush }] }], propDecorators: { backgroundArc: [{ type: Input }], valueArc: [{ type: Input }], cornerRadius: [{ type: Input }], colors: [{ type: Input }], isActive: [{ type: Input }], tooltipDisabled: [{ type: Input }], valueFormatting: [{ type: Input }], tooltipTemplate: [{ type: Input }], animations: [{ type: Input }], select: [{ type: Output }], activate: [{ type: Output }], deactivate: [{ type: Output }] } }); class GaugeAxisComponent { constructor() { this.rotate = ''; } ngOnChanges(changes) { this.update(); } update() { this.rotationAngle = -90 + this.startAngle; this.rotate = `rotate(${this.rotationAngle})`; this.ticks = this.getTicks(); } getTicks() { const bigTickSegment = this.angleSpan / this.bigSegments; const smallTickSegment = bigTickSegment / this.smallSegments; const tickLength = 20; const ticks = { big: [], small: [] }; const startDistance = this.radius + 10; const textDist = startDistance + tickLength + 10; for (let i = 0; i <= this.bigSegments; i++) { const angleDeg = i * bigTickSegment; const angle = (angleDeg * Math.PI) / 180; const textAnchor = this.getTextAnchor(angleDeg); let skip = false; if (i === 0 && this.angleSpan === 360) { skip = true; } if (!skip) { let text = Number.parseFloat(this.valueScale.invert(angleDeg).toString()).toLocaleString(); if (this.tickFormatting) { text = this.tickFormatting(text); } ticks.big.push({ line: this.getTickPath(startDistance, tickLength, angle), textAnchor, text, textTransform: ` translate(${textDist * Math.cos(angle)}, ${textDist * Math.sin(angle)}) rotate(${-this.rotationAngle}) ` }); } if (i === this.bigSegments) { continue; } for (let j = 1; j <= this.smallSegments; j++) { const smallAngleDeg = angleDeg + j * smallTickSegment; const smallAngle = (smallAngleDeg * Math.PI) / 180; ticks.small.push({ line: this.getTickPath(startDistance, tickLength / 2, smallAngle) }); } } return ticks; } getTextAnchor(angle) { // [0, 45] = 'middle'; // [46, 135] = 'start'; // [136, 225] = 'middle'; // [226, 315] = 'end'; angle = (this.startAngle + angle) % 360; let textAnchor = TextAnchor.Middle; if (angle > 45 && angle <= 135) { textAnchor = TextAnchor.Start; } else if (angle > 225 && angle <= 315) { textAnchor = TextAnchor.End; } return textAnchor; } getTickPath(startDistance, tickLength, angle) { const y1 = startDistance * Math.sin(angle); const y2 = (startDistance + tickLength) * Math.sin(angle); const x1 = startDistance * Math.cos(angle); const x2 = (startDistance + tickLength) * Math.cos(angle); const points = [ { x: x1, y: y1 }, { x: x2, y: y2 } ]; const lineGenerator = line() .x(d => d.x) .y(d => d.y); return lineGenerator(points); } } GaugeAxisComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: GaugeAxisComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); GaugeAxisComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: GaugeAxisComponent, selector: "g[ngx-charts-gauge-axis]", inputs: { bigSegments: "bigSegments", smallSegments: "smallSegments", min: "min", max: "max", angleSpan: "angleSpan", startAngle: "startAngle", radius: "radius", valueScale: "valueScale", tickFormatting: "tickFormatting" }, usesOnChanges: true, ngImport: i0, template: ` {{ tick.text }} `, isInline: true, directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: GaugeAxisComponent, decorators: [{ type: Component, args: [{ selector: 'g[ngx-charts-gauge-axis]', template: ` {{ tick.text }} `, changeDetection: ChangeDetectionStrategy.OnPush }] }], propDecorators: { bigSegments: [{ type: Input }], smallSegments: [{ type: Input }], min: [{ type: Input }], max: [{ type: Input }], angleSpan: [{ type: Input }], startAngle: [{ type: Input }], radius: [{ type: Input }], valueScale: [{ type: Input }], tickFormatting: [{ type: Input }] } }); class GaugeComponent extends BaseChartComponent { constructor() { super(...arguments); this.legend = false; this.legendTitle = 'Legend'; this.legendPosition = LegendPosition.Right; this.min = 0; this.max = 100; this.bigSegments = 10; this.smallSegments = 5; this.showAxis = true; this.startAngle = -120; this.angleSpan = 240; this.activeEntries = []; this.tooltipDisabled = false; this.showText = true; this.activate = new EventEmitter(); this.deactivate = new EventEmitter(); this.resizeScale = 1; this.rotation = ''; this.textTransform = 'scale(1, 1)'; this.cornerRadius = 10; } ngAfterViewInit() { super.ngAfterViewInit(); setTimeout(() => this.scaleText()); } update() { super.update(); if (!this.showAxis) { if (!this.margin) { this.margin = [10, 20, 10, 20]; } } else { if (!this.margin) { this.margin = [60, 100, 60, 100]; } } // make the starting angle positive if (this.startAngle < 0) { this.startAngle = (this.startAngle % 360) + 360; } this.angleSpan = Math.min(this.angleSpan, 360); this.dims = calculateViewDimensions({ width: this.width, height: this.height, margins: this.margin, showLegend: this.legend, legendPosition: this.legendPosition }); this.domain = this.getDomain(); this.valueDomain = this.getValueDomain(); this.valueScale = this.getValueScale(); this.displayValue = this.getDisplayValue(); this.outerRadius = Math.min(this.dims.width, this.dims.height) / 2; this.arcs = this.getArcs(); this.setColors(); this.legendOptions = this.getLegendOptions(); const xOffset = this.margin[3] + this.dims.width / 2; const yOffset = this.margin[0] + this.dims.height / 2; this.transform = `translate(${xOffset}, ${yOffset})`; this.rotation = `rotate(${this.startAngle})`; setTimeout(() => this.scaleText(), 50); } getArcs() { const arcs = []; const availableRadius = this.outerRadius * 0.7; const radiusPerArc = Math.min(availableRadius / this.results.length, 10); const arcWidth = radiusPerArc * 0.7; this.textRadius = this.outerRadius - this.results.length * radiusPerArc; this.cornerRadius = Math.floor(arcWidth / 2); let i = 0; for (const d of this.results) { const outerRadius = this.outerRadius - i * radiusPerArc; const innerRadius = outerRadius - arcWidth; const backgroundArc = { endAngle: (this.angleSpan * Math.PI) / 180, innerRadius, outerRadius, data: { value: this.max, name: d.name } }; const valueArc = { endAngle: (Math.min(this.valueScale(d.value), this.angleSpan) * Math.PI) / 180, innerRadius, outerRadius, data: { value: d.value, name: d.name } }; const arc = { backgroundArc, valueArc }; arcs.push(arc); i++; } return arcs; } getDomain() { return this.results.map(d => d.name); } getValueDomain() { const values = this.results.map(d => d.value); const dataMin = Math.min(...values); const dataMax = Math.max(...values); if (this.min !== undefined) { this.min = Math.min(this.min, dataMin); } else { this.min = dataMin; } if (this.max !== undefined) { this.max = Math.max(this.max, dataMax); } else { this.max = dataMax; } return [this.min, this.max]; } getValueScale() { return scaleLinear().range([0, this.angleSpan]).nice().domain(this.valueDomain); } getDisplayValue() { const value = this.results.map(d => d.value).reduce((a, b) => a + b, 0); if (this.textValue && 0 !== this.textValue.length) { return this.textValue.toLocaleString(); } if (this.valueFormatting) { return this.valueFormatting(value); } return value.toLocaleString(); } scaleText(repeat = true) { if (!this.showText) { return; } const { width } = this.textEl.nativeElement.getBoundingClientRect(); const oldScale = this.resizeScale; if (width === 0) { this.resizeScale = 1; } else { const availableSpace = this.textRadius; this.resizeScale = Math.floor((availableSpace / (width / this.resizeScale)) * 100) / 100; } if (this.resizeScale !== oldScale) { this.textTransform = `scale(${this.resizeScale}, ${this.resizeScale})`; this.cd.markForCheck(); if (repeat) { setTimeout(() => this.scaleText(false), 50); } } } onClick(data) { this.select.emit(data); } getLegendOptions() { return { scaleType: ScaleType.Ordinal, colors: this.colors, domain: this.domain, title: this.legendTitle, position: this.legendPosition }; } setColors() { this.colors = new ColorHelper(this.scheme, ScaleType.Ordinal, this.domain, this.customColors); } onActivate(item) { const idx = this.activeEntries.findIndex(d => { return d.name === item.name && d.value === item.value; }); if (idx > -1) { return; } this.activeEntries = [item, ...this.activeEntries]; this.activate.emit({ value: item, entries: this.activeEntries }); } onDeactivate(item) { const idx = this.activeEntries.findIndex(d => { return d.name === item.name && d.value === item.value; }); this.activeEntries.splice(idx, 1); this.activeEntries = [...this.activeEntries]; this.deactivate.emit({ value: item, entries: this.activeEntries }); } isActive(entry) { if (!this.activeEntries) return false; const item = this.activeEntries.find(d => { return entry.name === d.name && entry.series === d.series; }); return item !== undefined; } trackBy(index, item) { return item.valueArc.data.name; } } GaugeComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: GaugeComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); GaugeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: GaugeComponent, selector: "ngx-charts-gauge", inputs: { legend: "legend", legendTitle: "legendTitle", legendPosition: "legendPosition", min: "min", max: "max", textValue: "textValue", units: "units", bigSegments: "bigSegments", smallSegments: "smallSegments", results: "results", showAxis: "showAxis", startAngle: "startAngle", angleSpan: "angleSpan", activeEntries: "activeEntries", axisTickFormatting: "axisTickFormatting", tooltipDisabled: "tooltipDisabled", valueFormatting: "valueFormatting", showText: "showText", margin: "margin" }, outputs: { activate: "activate", deactivate: "deactivate" }, queries: [{ propertyName: "tooltipTemplate", first: true, predicate: ["tooltipTemplate"], descendants: true }], viewQueries: [{ propertyName: "textEl", first: true, predicate: ["textEl"], descendants: true }], usesInheritance: true, ngImport: i0, template: ` {{ displayValue }} {{ units }} `, isInline: true, styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n", ".gauge .background-arc path{fill:#0000000d}.gauge .gauge-tick path{stroke:#666}.gauge .gauge-tick text{font-size:12px;fill:#666;font-weight:700}.gauge .gauge-tick-large path{stroke-width:2px}.gauge .gauge-tick-small path{stroke-width:1px}\n"], components: [{ type: ChartComponent, selector: "ngx-charts-chart", inputs: ["view", "showLegend", "legendOptions", "legendType", "activeEntries", "animations"], outputs: ["legendLabelClick", "legendLabelActivate", "legendLabelDeactivate"] }, { type: GaugeArcComponent, selector: "g[ngx-charts-gauge-arc]", inputs: ["backgroundArc", "valueArc", "cornerRadius", "colors", "isActive", "tooltipDisabled", "valueFormatting", "tooltipTemplate", "animations"], outputs: ["select", "activate", "deactivate"] }, { type: GaugeAxisComponent, selector: "g[ngx-charts-gauge-axis]", inputs: ["bigSegments", "smallSegments", "min", "max", "angleSpan", "startAngle", "radius", "valueScale", "tickFormatting"] }], directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: GaugeComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-charts-gauge', template: ` {{ displayValue }} {{ units }} `, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n", ".gauge .background-arc path{fill:#0000000d}.gauge .gauge-tick path{stroke:#666}.gauge .gauge-tick text{font-size:12px;fill:#666;font-weight:700}.gauge .gauge-tick-large path{stroke-width:2px}.gauge .gauge-tick-small path{stroke-width:1px}\n"] }] }], propDecorators: { legend: [{ type: Input }], legendTitle: [{ type: Input }], legendPosition: [{ type: Input }], min: [{ type: Input }], max: [{ type: Input }], textValue: [{ type: Input }], units: [{ type: Input }], bigSegments: [{ type: Input }], smallSegments: [{ type: Input }], results: [{ type: Input }], showAxis: [{ type: Input }], startAngle: [{ type: Input }], angleSpan: [{ type: Input }], activeEntries: [{ type: Input }], axisTickFormatting: [{ type: Input }], tooltipDisabled: [{ type: Input }], valueFormatting: [{ type: Input }], showText: [{ type: Input }], margin: [{ type: Input }], activate: [{ type: Output }], deactivate: [{ type: Output }], tooltipTemplate: [{ type: ContentChild, args: ['tooltipTemplate'] }], textEl: [{ type: ViewChild, args: ['textEl'] }] } }); class GaugeModule { } GaugeModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: GaugeModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); GaugeModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: GaugeModule, declarations: [LinearGaugeComponent, GaugeComponent, GaugeArcComponent, GaugeAxisComponent], imports: [ChartCommonModule, PieChartModule, BarChartModule], exports: [LinearGaugeComponent, GaugeComponent, GaugeArcComponent, GaugeAxisComponent] }); GaugeModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: GaugeModule, imports: [[ChartCommonModule, PieChartModule, BarChartModule]] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: GaugeModule, decorators: [{ type: NgModule, args: [{ imports: [ChartCommonModule, PieChartModule, BarChartModule], declarations: [LinearGaugeComponent, GaugeComponent, GaugeArcComponent, GaugeAxisComponent], exports: [LinearGaugeComponent, GaugeComponent, GaugeArcComponent, GaugeAxisComponent] }] }] }); // The export is needed here to generate a valid polyfills.metadata.json file function ngxChartsPolyfills() { // IE11 fix // Ref: https://github.com/swimlane/ngx-charts/issues/386 if (typeof SVGElement !== 'undefined' && typeof SVGElement.prototype.contains === 'undefined') { SVGElement.prototype.contains = HTMLDivElement.prototype.contains; } } class SankeyComponent extends BaseChartComponent { constructor() { super(...arguments); this.showLabels = true; this.tooltipDisabled = false; this.activeEntries = []; this.activate = new EventEmitter(); this.deactivate = new EventEmitter(); this.margin = [10, 10, 10, 10]; this.scaleType = ScaleType.Ordinal; this.styleTypes = StyleTypes; } update() { super.update(); this.dims = calculateViewDimensions({ width: this.width, height: this.height, margins: this.margin, legendType: this.scaleType }); const linkDefs = this.results; const nodeDefs = Array.from(new Set(linkDefs.flatMap(l => [l.source, l.target])), (name) => ({ name, value: linkDefs.filter(l => l.source === name).reduce((acc, l) => acc + l.value, 0) })); // Configure generator const sankeyGenerator = sankey() .nodeId(d => d.name) .nodeAlign(sankeyLeft) .nodeWidth(15) .nodePadding(10) .extent([ [1, 5], [this.dims.width - 1, this.dims.height - 5] ]); // Generate links and nodes const data = sankeyGenerator({ nodes: nodeDefs.map(d => Object.assign({}, d)), links: linkDefs.map(d => Object.assign({}, d)) }); this.valueDomain = this.getValueDomain(data.nodes); this.setColors(); this.nodeRects = data.nodes.map(node => { const rect = { x: node.x0, y: node.y0, height: node.y1 - node.y0, width: node.x1 - node.x0, fill: this.colors.getColor(node.name), tooltip: this.getNodeTooltipText(node), rx: 5, data: { name: node.name, value: node.value }, transform: '', label: this.labelFormatting ? this.labelFormatting(node.name) : node.name, labelAnchor: TextAnchor.Start }; rect.labelAnchor = this.getTextAnchor(node); rect.transform = `translate(${rect.x},${rect.y})`; return rect; }); this.linkPaths = data.links.map(link => { const gradientId = 'mask' + id().toString(); const linkPath = { path: sankeyLinkHorizontal()(link), strokeWidth: Math.max(1, link.width), tooltip: this.getLinkTooltipText(link.source, link.target, link.value), id: gradientId, gradientFill: `url(#${gradientId})`, source: link.source, target: link.target, startColor: this.colors.getColor(link.source.name), endColor: this.colors.getColor(link.target.name), data: { source: link.source.name, target: link.target.name, value: link.value } }; return linkPath; }); this.transform = `translate(${this.dims.xOffset} , ${this.margin[0]})`; } getNodeTooltipText(node) { return ` ${escapeLabel(node.name)} ${node.value.toLocaleString()} `; } getLinkTooltipText(sourceNode, targetNode, value) { return ` ${escapeLabel(sourceNode.name)} • ${escapeLabel(targetNode.name)} ${value.toLocaleString()} (${(value / sourceNode.value).toLocaleString(undefined, { style: 'percent', maximumFractionDigits: 2 })}) `; } getTextAnchor(node) { if (node.layer === 0) { return TextAnchor.Start; } else { return TextAnchor.End; } } onClick(data) { this.select.emit(data); } setColors() { this.colors = new ColorHelper(this.scheme, this.scaleType, this.valueDomain); } getValueDomain(nodes) { return nodes.map(n => n.name); } } SankeyComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: SankeyComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); SankeyComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: SankeyComponent, selector: "ngx-charts-sankey", inputs: { showLabels: "showLabels", gradient: "gradient", tooltipDisabled: "tooltipDisabled", activeEntries: "activeEntries", labelFormatting: "labelFormatting" }, outputs: { activate: "activate", deactivate: "deactivate" }, queries: [{ propertyName: "tooltipTemplate", first: true, predicate: ["tooltipTemplate"], descendants: true }], usesInheritance: true, ngImport: i0, template: ` {{ rect.label }} `, isInline: true, styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n"], components: [{ type: ChartComponent, selector: "ngx-charts-chart", inputs: ["view", "showLegend", "legendOptions", "legendType", "activeEntries", "animations"], outputs: ["legendLabelClick", "legendLabelActivate", "legendLabelDeactivate"] }], directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: TooltipDirective, selector: "[ngx-tooltip]", inputs: ["tooltipCssClass", "tooltipTitle", "tooltipAppendToBody", "tooltipSpacing", "tooltipDisabled", "tooltipShowCaret", "tooltipPlacement", "tooltipAlignment", "tooltipType", "tooltipCloseOnClickOutside", "tooltipCloseOnMouseLeave", "tooltipHideTimeout", "tooltipShowTimeout", "tooltipTemplate", "tooltipShowEvent", "tooltipContext", "tooltipImmediateExit"], outputs: ["show", "hide"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: SankeyComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-charts-sankey', template: ` {{ rect.label }} `, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, styles: [".ngx-charts-outer{animation:chartFadeIn linear .6s}@keyframes chartFadeIn{0%{opacity:0}20%{opacity:0}to{opacity:1}}.ngx-charts{float:left;overflow:visible}.ngx-charts .circle,.ngx-charts .cell,.ngx-charts .bar,.ngx-charts .node,.ngx-charts .link,.ngx-charts .arc{cursor:pointer}.ngx-charts .bar.active,.ngx-charts .bar:hover,.ngx-charts .cell.active,.ngx-charts .cell:hover,.ngx-charts .arc.active,.ngx-charts .arc:hover,.ngx-charts .node.active,.ngx-charts .node:hover,.ngx-charts .link.active,.ngx-charts .link:hover,.ngx-charts .card.active,.ngx-charts .card:hover{opacity:.8;transition:opacity .1s ease-in-out}.ngx-charts .bar:focus,.ngx-charts .cell:focus,.ngx-charts .arc:focus,.ngx-charts .node:focus,.ngx-charts .link:focus,.ngx-charts .card:focus{outline:none}.ngx-charts .bar.hidden,.ngx-charts .cell.hidden,.ngx-charts .arc.hidden,.ngx-charts .node.hidden,.ngx-charts .link.hidden,.ngx-charts .card.hidden{display:none}.ngx-charts g:focus{outline:none}.ngx-charts .line-series.inactive,.ngx-charts .line-series-range.inactive,.ngx-charts .polar-series-path.inactive,.ngx-charts .polar-series-area.inactive,.ngx-charts .area-series.inactive{transition:opacity .1s ease-in-out;opacity:.2}.ngx-charts .line-highlight{display:none}.ngx-charts .line-highlight.active{display:block}.ngx-charts .area{opacity:.6}.ngx-charts .circle:hover{cursor:pointer}.ngx-charts .label{font-size:12px;font-weight:400}.ngx-charts .tooltip-anchor{fill:#000}.ngx-charts .gridline-path{stroke:#ddd;stroke-width:1;fill:none}.ngx-charts .refline-path{stroke:#a8b2c7;stroke-width:1;stroke-dasharray:5;stroke-dashoffset:5}.ngx-charts .refline-label{font-size:9px}.ngx-charts .reference-area{fill-opacity:.05;fill:#000}.ngx-charts .gridline-path-dotted{stroke:#ddd;stroke-width:1;fill:none;stroke-dasharray:1,20;stroke-dashoffset:3}.ngx-charts .grid-panel rect{fill:none}.ngx-charts .grid-panel.odd rect{fill:#0000000d}\n"] }] }], propDecorators: { showLabels: [{ type: Input }], gradient: [{ type: Input }], tooltipDisabled: [{ type: Input }], activeEntries: [{ type: Input }], labelFormatting: [{ type: Input }], activate: [{ type: Output }], deactivate: [{ type: Output }], tooltipTemplate: [{ type: ContentChild, args: ['tooltipTemplate'] }] } }); class SankeyModule { } SankeyModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: SankeyModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); SankeyModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: SankeyModule, declarations: [SankeyComponent], imports: [ChartCommonModule], exports: [SankeyComponent] }); SankeyModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: SankeyModule, imports: [[ChartCommonModule]] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: SankeyModule, decorators: [{ type: NgModule, args: [{ imports: [ChartCommonModule], declarations: [SankeyComponent], exports: [SankeyComponent] }] }] }); class NgxChartsModule { constructor() { ngxChartsPolyfills(); } } NgxChartsModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: NgxChartsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); NgxChartsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: NgxChartsModule, exports: [ChartCommonModule, AreaChartModule, BarChartModule, BoxChartModule, BubbleChartModule, HeatMapModule, SankeyModule, LineChartModule, PolarChartModule, NumberCardModule, PieChartModule, TreeMapModule, GaugeModule] }); NgxChartsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: NgxChartsModule, imports: [ChartCommonModule, AreaChartModule, BarChartModule, BoxChartModule, BubbleChartModule, HeatMapModule, SankeyModule, LineChartModule, PolarChartModule, NumberCardModule, PieChartModule, TreeMapModule, GaugeModule] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: NgxChartsModule, decorators: [{ type: NgModule, args: [{ exports: [ ChartCommonModule, AreaChartModule, BarChartModule, BoxChartModule, BubbleChartModule, HeatMapModule, SankeyModule, LineChartModule, PolarChartModule, NumberCardModule, PieChartModule, TreeMapModule, GaugeModule ] }] }], ctorParameters: function () { return []; } }); function tickFormat(fieldType, groupByType) { return function (label) { if (label === 'No Value' || label === 'Other') { return label; } if (fieldType === 'date' && groupByType === 'groupBy') { const formatter = timeFormat('MM/DD/YYYY'); return formatter(label); } return label.toString(); }; } /* eslint-disable @typescript-eslint/no-empty-interface */ /* * Public API Surface of ngx-charts */ /** * Generated bundle index. Do not edit. */ export { AdvancedLegendComponent, AdvancedPieChartComponent, AreaChartComponent, AreaChartModule, AreaChartNormalizedComponent, AreaChartStackedComponent, AreaComponent, AreaSeriesComponent, AxesModule, AxisLabelComponent, BarChartModule, BarChartType, BarComponent, BarHorizontal2DComponent, BarHorizontalComponent, BarHorizontalNormalizedComponent, BarHorizontalStackedComponent, BarLabelComponent, BarOrientation, BarVertical2DComponent, BarVerticalComponent, BarVerticalNormalizedComponent, BarVerticalStackedComponent, BaseChartComponent, BoxChartComponent, BoxChartModule, BoxComponent, BoxSeriesComponent, BubbleChartComponent, BubbleChartModule, BubbleSeriesComponent, CardComponent, CardSeriesComponent, ChartCommonModule, ChartComponent, CircleComponent, CircleSeriesComponent, ColorHelper, CountUpDirective, D0Types, GaugeArcComponent, GaugeAxisComponent, GaugeComponent, GaugeModule, GridPanelComponent, GridPanelSeriesComponent, HeatCellSeriesComponent, HeatMapCellComponent, HeatMapComponent, HeatMapModule, LegendComponent, LegendEntryComponent, LegendPosition, LegendType, LineChartComponent, LineChartModule, LineComponent, LineSeriesComponent, LinearGaugeComponent, NgxChartsModule, NumberCardComponent, NumberCardModule, Orientation, PieArcComponent, PieChartComponent, PieChartModule, PieGridComponent, PieGridSeriesComponent, PieLabelComponent, PieSeriesComponent, PlacementTypes, PolarChartComponent, PolarChartModule, PolarSeriesComponent, SankeyComponent, SankeyModule, ScaleLegendComponent, ScaleType, SeriesHorizontal, SeriesType, SeriesVerticalComponent, ShowTypes, StyleTypes, SvgLinearGradientComponent, SvgRadialGradientComponent, TextAnchor, Timeline, TooltipArea, TooltipContentComponent, TooltipDirective, TooltipModule, TooltipService, TreeMapCellComponent, TreeMapCellSeriesComponent, TreeMapComponent, TreeMapModule, VisibilityObserver, XAxisComponent, XAxisTicksComponent, YAxisComponent, YAxisTicksComponent, calculateViewDimensions, colorSets, count, decimalChecker, escapeLabel, formatLabel, getDomain, getScale, getScaleType, getTickLines, getUniqueXDomainValues, getXDomainArray, gridLayout, gridSize, hexToRgb, id, invertColor, reduceTicks, shadeRGBColor, sortByDomain, sortByTime, sortLinear, throttle, throttleable, tickFormat, trimLabel }; //# sourceMappingURL=swimlane-ngx-charts.mjs.map