@pacem/pacem-charts 1.0.0-abel
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +191 -0
- package/NOTICE +4 -0
- package/dist/browser/pacem-charts.js +1623 -0
- package/dist/browser/pacem-charts.js.map +1 -0
- package/dist/browser/pacem-charts.min.js +2 -0
- package/dist/browser/pacem-charts.min.js.map +1 -0
- package/dist/bundle/pacem-charts.min.mjs +1 -0
- package/dist/bundle/pacem-charts.mjs +1462 -0
- package/dist/bundle/pacem-charts.mjs.map +7 -0
- package/dist/esm/column.js +357 -0
- package/dist/esm/generic.js +437 -0
- package/dist/esm/index-components-charts.js +4 -0
- package/dist/esm/index-components.js +1 -0
- package/dist/esm/index-iife.js +3 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/pie.js +306 -0
- package/dist/esm/types.js +504 -0
- package/package.json +38 -0
- package/typings/index.d.ts +239 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../esm/index-components.js", "../esm/index-components-charts.js", "../esm/types.js", "../esm/generic.js", "../esm/column.js", "../esm/pie.js"],
|
|
4
|
+
"sourcesContent": ["export * as Charts from './index-components-charts';\n", "export * from './types';\nexport * from './generic';\nexport * from './column';\nexport * from './pie';\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, Watch, PropertyConverters, P, PCSS, Components, CustomUIEvent, CustomElementUtils, Utils, Throttle, PropertyChangeEventName } from '@pacem/pacem-core';\n//namespace Pacem.Components.Charts {\nexport const MANAGED_EVENTS = ['keydown', 'keyup', 'click', 'dblclick', 'mouseover', 'mouseout', 'mouseenter', 'mouseleave', 'mousedown', 'mouseup', 'mousemove', 'contextmenu'];\n;\n//function logN(N, x) {\n// return Math.log10(x) / Math.log10(N);\n//}\nconst MSECS_PER_DAY = 1000 * 60 * 60 * 24;\nconst MAX_X_LABELS = 10;\nconst MAX_Y_LABELS = 10;\nconst SERIES_DATAITEM = 'pacem:chart-series:dataitem';\nconst SERIES_SERIES = 'pacem:chart-series:series';\nfunction getEvenlySpaced(items, type, min, max, formatOrLang, labels = MAX_X_LABELS) {\n const length = (type === 'number' || type === 'date') ? (max - min) : Math.max(1, items.length - 1);\n const gaps = labels - 1;\n var retval = [];\n var step = 1;\n for (var l = gaps; l > 1; l--) {\n if ((length % l) === 0) {\n step = length / l;\n break;\n }\n }\n if (step === 1 /* coprime number? */ && length > labels) {\n step = length;\n }\n const fnDate = typeof formatOrLang === 'function' ? formatOrLang : (step >= MSECS_PER_DAY ? ((d) => d.toLocaleDateString(formatOrLang)) : ((d) => d.toLocaleTimeString(formatOrLang)));\n const fnDateFirst = typeof formatOrLang === 'function' ? formatOrLang : (step < MSECS_PER_DAY ? ((d) => d.toLocaleString(formatOrLang)) : fnDate);\n const fnNum = typeof formatOrLang === 'function' ? formatOrLang : (n) => n.toLocaleString(formatOrLang);\n for (var j = 0; j <= length; j += step) {\n let label;\n switch (type) {\n case 'string':\n if (j >= items.length) {\n continue;\n }\n label = items[j].label;\n break;\n case 'number':\n label = fnNum(min + j);\n break;\n case 'date':\n let date = Utils.parseDate(min + j);\n let fn = (j == 0) ? fnDateFirst : fnDate;\n label = fn(date);\n break;\n default:\n throw 'Not supported.';\n }\n retval.push(label);\n }\n return retval;\n}\nfunction getRoundedBoundaries(min, max, desiredSteps) {\n desiredSteps ??= Math.min(bestGuessedDensity(min, max), MAX_Y_LABELS);\n const roughStep = (max - min) / desiredSteps;\n const magnitude = Math.pow(10, Math.floor(Math.log10(roughStep)));\n const step = [1, 2, 5, 10].map(n => n * magnitude).filter(s => s >= roughStep).reduce((min, s) => Math.min(min, s), Number.POSITIVE_INFINITY);\n return {\n min: Math.floor(min / step) * step,\n max: Math.ceil(max / step) * step,\n round: step\n };\n}\n// Deprecated\n//function getRoundedBoundariesOld(a0: number, a1: number, steps?: number) {\n// if (!(steps > 0)) {\n// steps = bestGuessedDensity(a0, a1);\n// }\n// const magn = logN(steps, a1 - a0),\n// exp = magn % 1 == 0 ? magn - 1 : magn,\n// rounder = Math.pow(steps, Math.floor(exp));\n// return {\n// min: Math.floor(a0 / rounder) * rounder,\n// max: Math.ceil(a1 / rounder) * rounder,\n// round: rounder\n// };\n//}\nfunction bestGuessedDensity(min, max) {\n const delta = max - min;\n if (!(delta > 0)) {\n return 2;\n }\n const oom = Math.floor(Math.log10(delta));\n const exp = Math.pow(10, -oom);\n // bring everything to a single digit format\n if (oom != 0) {\n return bestGuessedDensity(min * exp, max * exp);\n }\n const capFn = (n) => {\n const norm = Math.floor(Math.abs(n) * 10), limit = norm + 10 - (norm % 10);\n return limit.roundoff();\n };\n const b = capFn(delta);\n let a = 10;\n if (min !== 0) {\n a = capFn(Math.abs(max));\n }\n const ret = gcd(a, b);\n return ret === 1 ? b : Math.max(ret, 10 - ret);\n}\nfunction gcd(a, b) {\n if (a <= 0) {\n return b;\n }\n return gcd(b % a, a);\n}\nexport class ChartEvent extends CustomUIEvent {\n constructor(type, eventInit, originalEvent) {\n super(type, eventInit, originalEvent);\n }\n}\nlet PacemChartSeriesElement = class PacemChartSeriesElement extends Components.PacemItemElement {\n get values() {\n return this.datasource;\n }\n};\n__decorate([\n Watch({ emit: true, converter: PropertyConverters.Json })\n], PacemChartSeriesElement.prototype, \"datasource\", void 0);\n__decorate([\n Watch({ emit: true, converter: PropertyConverters.String })\n], PacemChartSeriesElement.prototype, \"label\", void 0);\n__decorate([\n Watch({ emit: true, converter: PropertyConverters.String })\n], PacemChartSeriesElement.prototype, \"color\", void 0);\n__decorate([\n Watch({ emit: true, converter: PropertyConverters.Boolean })\n], PacemChartSeriesElement.prototype, \"datapoints\", void 0);\n__decorate([\n Watch( /* to be set programmatically (internally) */)\n], PacemChartSeriesElement.prototype, \"_uiElements\", void 0);\nPacemChartSeriesElement = __decorate([\n CustomElement({ tagName: P + '-chart-series' })\n], PacemChartSeriesElement);\nexport { PacemChartSeriesElement };\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\nexport class PacemSeriesChartElement extends Components.PacemItemsContainerElement {\n constructor() {\n super();\n this._itemPropertyChangedCallback = (evt) => {\n const propName = evt.detail.propertyName;\n if (propName === 'datasource'\n || propName === 'label'\n || propName === 'datapoints'\n || propName === 'cssClass'\n || propName === 'color') {\n this.draw();\n }\n };\n this._series = [];\n this._resizeHandler = (evt) => {\n this._size = evt.detail;\n this.draw();\n };\n // #endregion\n this._broadcastHandler = (e) => {\n /* Don't mess with the events:\n * keep the original (trusted) events with their well-known names\n * and provide a method to retrieve the 'ChartDataItem' based on the the eventTarget. */\n const element = e.currentTarget;\n const dataItem = CustomElementUtils.getAttachedPropertyValue(element, SERIES_DATAITEM);\n if (Utils.isNull(dataItem)) {\n return;\n }\n const chart = this, anchorPoint = chart.getAnchorPoint(element);\n const evt = new ChartEvent('item' + e.type, { detail: { dataItem, anchorPoint } }, e);\n const series = CustomElementUtils.getAttachedPropertyValue(element, SERIES_SERIES);\n if (series instanceof PacemChartSeriesElement) {\n series.dispatchEvent(evt);\n }\n chart.dispatchEvent(evt);\n };\n this._key = Utils.uniqueCode();\n }\n validate(item) {\n return item instanceof PacemChartSeriesElement;\n }\n register(item) {\n if (super.register(item)) {\n item.addEventListener(PropertyChangeEventName, this._itemPropertyChangedCallback, false);\n return true;\n }\n return false;\n }\n unregister(item) {\n if (super.unregister(item)) {\n item.removeEventListener(PropertyChangeEventName, this._itemPropertyChangedCallback, false);\n return true;\n }\n return false;\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (name === 'target') {\n if (this._div != old) {\n this._div && this._div.remove();\n }\n // reset\n this._div = null;\n this._body = null; // <- get checked on next draw\n const eold = old;\n if (eold) {\n eold.classList.remove(PCSS + '-chart-area');\n eold.innerHTML = '';\n }\n this._ensureResizer();\n this.draw();\n }\n else if (!first) {\n switch (name) {\n case 'items':\n this._databindAndDrawDebounced();\n break;\n case 'datasource':\n this._databind();\n // fall down to draw() call.\n case 'yAxisDensity':\n case 'xAxisDensity':\n case 'xAxisType':\n case 'yAxisMax':\n case 'xAxisPosition':\n case 'yAxisFormat':\n this.draw();\n break;\n }\n }\n }\n _databindAndDrawDebounced() {\n cancelAnimationFrame(this._handle);\n this._handle = requestAnimationFrame(() => {\n this._databind();\n this.draw();\n });\n }\n _databind() {\n this._datasource = Utils.isNullOrEmpty(this.datasource) ? this.items : this.datasource;\n }\n disconnectedCallback() {\n this._div && this._div.remove();\n const resizer = this._resizer;\n if (!Utils.isNull(resizer)) {\n resizer.removeEventListener(Components.ResizeEventName, this._resizeHandler, false);\n resizer.remove();\n this._resizer = null;\n }\n super.disconnectedCallback();\n }\n viewActivatedCallback() {\n super.viewActivatedCallback();\n this._ensureResizer();\n this._databind();\n this.draw();\n }\n _ensureResizer(target = this.target || this._div) {\n if (Utils.isNull(this._resizer)) {\n const shell = CustomElementUtils.findAncestorShell(this);\n const resizer = this._resizer = shell.appendChild(new Components.PacemResizeElement());\n resizer.addEventListener(Components.ResizeEventName, this._resizeHandler, false);\n }\n this._resizer.target = target;\n }\n // #region OO-scoped props\n get chartSize() {\n return this._size;\n }\n get chartSeries() {\n return this._series;\n }\n get chartBody() {\n return this._body;\n }\n get chartGrid() {\n return this._grid;\n }\n get chartMask() {\n return this._mask;\n }\n get chartKey() {\n return this._key;\n }\n get chartContainer() {\n return this._div;\n }\n assignUiBehaviors(ui, series, data, color) {\n const alreadyRegistered = !Utils.isNull(CustomElementUtils.getAttachedPropertyValue(ui, SERIES_DATAITEM));\n const item = Utils.extend({ series: series.label, color: color || series.color }, data);\n CustomElementUtils.setAttachedPropertyValue(ui, SERIES_DATAITEM, item);\n CustomElementUtils.setAttachedPropertyValue(ui, SERIES_SERIES, series);\n if (!alreadyRegistered) {\n MANAGED_EVENTS.forEach(type => {\n ui.addEventListener(type, this._broadcastHandler);\n });\n }\n }\n disposeUiBehaviors(ui) {\n CustomElementUtils.deleteAttachedPropertyValue(ui, SERIES_DATAITEM);\n CustomElementUtils.deleteAttachedPropertyValue(ui, SERIES_SERIES);\n MANAGED_EVENTS.forEach(type => {\n ui.removeEventListener(type, this._broadcastHandler);\n });\n }\n ensureChartContainer() {\n if (Utils.isNull(this._div)) {\n let div = this._div = this.target || document.createElement('div');\n div.classList.add(PCSS + '-chart-area');\n if (div != this.target) {\n this.parentElement.insertBefore(div, this);\n }\n }\n return this._div;\n }\n ensureChartBody(type, w, h) {\n if (Utils.isNull(this._body)) {\n let svg = this._body = document.createElementNS(SVG_NS, 'svg');\n svg.setAttribute('pacem', '');\n svg.setAttribute('class', PCSS + '-' + type + '-chart');\n svg.setAttribute('preserveAspectRatio', 'xMinYMax slice');\n const g = this._grid = document.createElementNS(SVG_NS, 'svg');\n g.setAttribute('pacem', '');\n g.setAttribute('class', 'chart-grid');\n // put mask on series\n let defs = document.createElementNS(SVG_NS, 'defs');\n let mask = this._mask = document.createElementNS(SVG_NS, 'mask');\n // black (hides)\n let rect = document.createElementNS(SVG_NS, 'rect');\n rect.setAttribute('x', '0');\n rect.setAttribute('y', '0');\n rect.setAttribute('width', '100%');\n rect.setAttribute('height', '100%');\n // white (shows)\n let rect0 = document.createElementNS(SVG_NS, 'rect');\n rect0.setAttribute('y', '0');\n rect0.setAttribute('width', '100%');\n rect0.setAttribute('fill', '#fff');\n mask.id = 'gnrc_mask_' + this._key;\n mask.appendChild(rect);\n mask.appendChild(rect0);\n // place mask on series so that lines won't be rendered outside the grid borders\n //g2.setAttribute('mask', 'url(#' + mask.id + ')');\n defs.appendChild(mask);\n svg.appendChild(defs);\n svg.appendChild(g);\n this._div.appendChild(svg);\n }\n return this._body;\n }\n chartDataItemToPoint(input, source) {\n switch (this.xAxisType || 'string') {\n case 'number':\n return { x: parseFloat(input.label), y: input.value };\n case 'date':\n return { x: Utils.parseDate(input.label).valueOf(), y: input.value };\n case 'string':\n return { x: source.findIndex(e => e.label == input.label), y: input.value };\n default:\n throw 'Not supported.';\n }\n }\n getVirtualGrid(items, minX, maxX, minY, maxY, xAxisType = this.xAxisType, steps, labels) {\n const rangeY = getRoundedBoundaries(minY, maxY, steps), stepY = rangeY.round;\n // fill y-axis array\n var y = [];\n for (let j = rangeY.min; j <= rangeY.max; j += stepY) {\n y.push(j.roundoff());\n }\n // fill x-axis array;\n let lang = Utils.lang(this);\n let format = null;\n const intl = this.xAxisFormat;\n if (!Utils.isNullOrEmpty(intl)) {\n switch (xAxisType) {\n case 'number':\n format = (n) => Intl.NumberFormat(lang, intl).format(n);\n break;\n case 'date':\n format = (n) => Intl.DateTimeFormat(lang, intl).format(Utils.parseDate(n));\n break;\n }\n }\n const x = getEvenlySpaced(items, xAxisType, minX, maxX, format ?? lang, labels);\n return { x, y };\n }\n wipeOut(series = this._series, startIndex = 0) {\n for (var j = series.length - 1; j >= startIndex; j--) {\n series[j].remove();\n }\n series.splice(startIndex);\n }\n buildLinearGradient(seriesIndex, invert = false) {\n const grad = document.createElementNS(SVG_NS, 'linearGradient');\n grad.id = this.chartKey + '_grad' + seriesIndex + (invert ? '_inverted' : '');\n if (invert) {\n Utils.addClass(grad, 'bottom-up');\n }\n grad.setAttribute('x1', '0%');\n grad.setAttribute('x2', '0%');\n grad.setAttribute('y1', '0%');\n grad.setAttribute('y2', '100%');\n grad.setAttribute('spreadMethod', 'pad');\n const stop1 = document.createElementNS(SVG_NS, 'stop');\n stop1.setAttribute('offset', '0%');\n const stop2 = document.createElementNS(SVG_NS, 'stop');\n stop2.setAttribute('offset', '100%');\n grad.appendChild(stop1);\n grad.appendChild(stop2);\n return grad;\n }\n setGradientColor(grad, color) {\n for (let j = 0; j < grad.children.length; j++) {\n const stop = grad.children.item(j);\n if (stop instanceof SVGStopElement) {\n stop.style.stopColor = color;\n }\n }\n }\n estimateYAxisLabelWidth(max) {\n const txt = this.formatYAxisLabel(max);\n return this.estimateLabelWidth(txt);\n }\n estimateLabelWidth(txt) {\n const grid = this._grid;\n if (Utils.isNull(grid)) {\n throw new Error('Unable to estimate label without an underlying grid available.');\n }\n const lbl = document.createElementNS(SVG_NS, 'text');\n lbl.textContent = txt;\n grid.appendChild(lbl);\n const size = Utils.offset(lbl);\n lbl.remove();\n return size.width;\n }\n formatYAxisLabel(y) {\n const intl = this.yAxisFormat;\n return Utils.isNullOrEmpty(intl) ? y.toString() : Intl.NumberFormat(Utils.lang(this), intl).format(y);\n }\n estimateXAxisLabelWidth(max) {\n const txt = this.formatXAxisLabel(max);\n return this.estimateLabelWidth(txt);\n }\n formatXAxisLabel(x) {\n const intl = this.xAxisFormat, lang = Utils.lang(this);\n switch (this.xAxisType) {\n case 'date':\n const date = Utils.Dates.parse(x);\n return Utils.isNullOrEmpty(intl) ? date.toLocaleString(lang) : Intl.DateTimeFormat(lang, intl).format(date);\n case 'number':\n const num = x;\n return Utils.isNullOrEmpty(intl) ? num.toLocaleString(lang) : Intl.NumberFormat(lang, intl).format(num);\n default:\n return x;\n }\n }\n draw() {\n this.drawSeries(this._datasource);\n }\n /**\n * Default implementation.\n * @param element\n */\n getAnchorPoint(element) {\n const rect = Utils.offset(element);\n return { x: rect.left + rect.width * .5, y: rect.top + rect.height * .5 };\n }\n}\n__decorate([\n Watch({ converter: PropertyConverters.Element })\n], PacemSeriesChartElement.prototype, \"target\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], PacemSeriesChartElement.prototype, \"xAxisType\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], PacemSeriesChartElement.prototype, \"xAxisPosition\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Json })\n], PacemSeriesChartElement.prototype, \"datasource\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemSeriesChartElement.prototype, \"yAxisDensity\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemSeriesChartElement.prototype, \"xAxisDensity\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemSeriesChartElement.prototype, \"yAxisMin\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemSeriesChartElement.prototype, \"yAxisMax\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Json })\n], PacemSeriesChartElement.prototype, \"yAxisFormat\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Json })\n], PacemSeriesChartElement.prototype, \"xAxisFormat\", void 0);\n__decorate([\n Throttle(true)\n], PacemSeriesChartElement.prototype, \"draw\", null);\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, Watch, PropertyConverters, P, PCSS, Utils, CustomElementUtils, Logging } from '@pacem/pacem-core';\nimport { PacemSeriesChartElement } from './types';\n//namespace Pacem.Components.Charts {\n/**\n * Returns the anchor points for a B\u00E9zier curve.\n * @param p The actual point.\n * @param p0 The previous point, if any.\n * @param p1 The next point, if any.\n */\nfunction getSplineCtrlPoints(p, p0, p1) {\n let c0 = p, c1 = p;\n const p0Null = Utils.isNull(p0), p1Null = Utils.isNull(p1);\n if (!(p0Null && p1Null)) {\n const portion = 3;\n let m0, m1;\n if (!p0Null) {\n m0 = (p.y - p0.y) / (p.x - p0.x);\n }\n if (!p1Null) {\n m1 = (p1.y - p.y) / (p1.x - p.x);\n }\n // average slope\n const m = ((m1 || (m0 || 0)) + (m0 || (m1 || 0))) / 2;\n const dx0 = p0Null ? 0 : (p.x - p0.x) / portion;\n const dx1 = p1Null ? 0 : (p1.x - p.x) / portion;\n c0 = { x: p.x - dx0, y: p.y - dx0 * m };\n c1 = { x: p.x + dx1, y: p.y + dx1 * m };\n }\n return { c0: c0, c1: c1 };\n}\nconst GET_VAL = CustomElementUtils.getAttachedPropertyValue;\nconst SET_VAL = CustomElementUtils.setAttachedPropertyValue;\nconst DEL_VAL = CustomElementUtils.deleteAttachedPropertyValue;\nconst PADDING_PIXELS = 24;\nconst SERIES_MAGNITUDE = 'pacem:chart-series:area';\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\nlet PacemChartElement = class PacemChartElement extends PacemSeriesChartElement {\n constructor() {\n super(...arguments);\n this.#hover = false;\n this._enterHandler = (evt) => {\n this.#hover = true;\n };\n this._leaveHandler = (evt) => {\n this.#hover = false;\n };\n this._moveHandler = (evt) => {\n if (!this.#hover) {\n return;\n }\n };\n this._chartFillSeries = [];\n }\n // TODO: implement\n // @Watch({ converter: PropertyConverters.String }) hoverMode: 'abscissa' | 'point'; // 'point' assumed as default\n _getVirtualGrid(items, minX, maxX, minY, maxY, xAxisType = this.xAxisType, steps, labels) {\n return super.getVirtualGrid(items, minX, maxX, minY, maxY, xAxisType, steps, labels);\n }\n _wipe(series = this.chartSeries, startIndex = 0) {\n super.wipeOut(series, startIndex);\n }\n viewActivatedCallback() {\n super.viewActivatedCallback();\n this._setupBehavior();\n }\n disconnectedCallback() {\n this._dismantleBehavior();\n super.disconnectedCallback();\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'type':\n case 'aspectRatio':\n this.draw();\n break;\n }\n }\n _setupBehavior() {\n this.addEventListener('mouseenter', this._enterHandler, false);\n this.addEventListener('mouseleave', this._enterHandler, false);\n this.addEventListener('mousemove', this._moveHandler, false);\n }\n _dismantleBehavior() {\n this.removeEventListener('mouseenter', this._enterHandler, false);\n this.removeEventListener('mouseleave', this._leaveHandler, false);\n this.removeEventListener('mousemove', this._moveHandler, false);\n }\n #hover;\n _buildLinearGradient(seriesIndex) {\n return super.buildLinearGradient(seriesIndex);\n }\n _setGradientColor(grad, color) {\n super.setGradientColor(grad, color);\n }\n drawSeries(datasource) {\n if (!this.isReady || Utils.isNull(this.chartSize)) {\n return;\n }\n this.ensureChartContainer();\n const type = this.type || 'line';\n const padding = PADDING_PIXELS;\n // resize all\n var size = this.chartSize;\n if (size.height <= padding || size.width <= padding) {\n return;\n }\n // items && labels?\n if (Utils.isNullOrEmpty(datasource) || datasource.every(i => Utils.isNullOrEmpty(i.values))) {\n this._wipe();\n return;\n }\n const body = this.ensureChartBody('line', size.width, size.height);\n // from now on, drawing...\n this.log(Logging.LogLevel.Debug, `Drawing ${type} chart.`);\n // #region computations\n const xAxisType = this.xAxisType || 'string';\n let minY = this.yAxisMin ?? Number.NaN, maxY = this.yAxisMax ?? Number.NaN, minX = Number.NaN, maxX = Number.NaN;\n let stretch = 1;\n // individuate the min/max x & y in order correctly apply aspect ratio...\n for (let series of datasource) {\n let data = series.values;\n if (data && data.length) {\n let j = 0;\n for (let item of data) {\n let pt = this.chartDataItemToPoint(item, data);\n if (Utils.isNull(this.yAxisMin)) {\n minY = isNaN(minY) ? pt.y : Math.min(minY, pt.y);\n }\n if (Utils.isNull(this.yAxisMax)) {\n maxY = isNaN(maxY) ? pt.y : Math.max(maxY, pt.y);\n }\n if (j === 0)\n minX = isNaN(minX) ? pt.x : Math.min(minX, pt.x);\n else if (j === data.length - 1)\n maxX = isNaN(maxX) ? pt.x : Math.max(maxX, pt.x);\n j++;\n }\n }\n }\n /** virtual grid made of x- and y-axis labels */\n const withValues = datasource.find(i => !Utils.isNullOrEmpty(i.values));\n const grid = this._getVirtualGrid(withValues.values, minX, maxX, minY, maxY, xAxisType, this.yAxisDensity, this.xAxisDensity);\n const topGrid = grid.y[grid.y.length - 1], bottomGrid = grid.y[0];\n if (topGrid === bottomGrid)\n return;\n // estimate y-axis max width\n const halfPad = padding * .5;\n const maxYLabelLength = grid.y.reduce((max, i) => Math.max(max, this.estimateYAxisLabelWidth(i) + halfPad), padding);\n const maxXLabelHalfLength = grid.x.reduce((max, i) => Math.max(max, this.estimateXAxisLabelWidth(i)), padding) * .5;\n const paddingYAxis = Math.max(maxXLabelHalfLength, maxYLabelLength), paddingYAxisEnd = maxXLabelHalfLength; // Math.max(padding, this.estimateXAxisLabelWidth(minX) * .5 + PADDING_PIXELS);\n /** width of the WHOLE series dedicated area */\n const seriesWidth = size.width - paddingYAxis - paddingYAxisEnd;\n /** height of the WHOLE series dedicated area */\n const gridHeight = (size.height - 2 * padding);\n const seriesHeight = gridHeight * (1 - (topGrid - bottomGrid - (maxY - minY)) / (topGrid - bottomGrid));\n const seriesY = gridHeight * (topGrid - maxY) / (topGrid - bottomGrid);\n // const seriesY2 = gridHeight * (minY - bottomGrid) / (topGrid - bottomGrid);\n // if not a `graph`\n if (xAxisType !== 'number' || (this.aspectRatio !== 'monometric' && this.aspectRatio !== 'logaritmic')) {\n // consider padding\n stretch = seriesWidth / seriesHeight;\n body.setAttribute('height', size.height.toString());\n body.setAttribute('width', size.width.toString());\n }\n body.setAttribute('viewBox', `0 0 ${size.width} ${size.height}`);\n // #endregion\n // #region render series\n let iter = 0;\n // normalize\n const spanX = maxX - minX, spanY = maxY - minY;\n const normX = 100 * stretch / spanX, normY = 100 / spanY;\n const normPadding = 100 * padding / seriesHeight;\n const buildPoint = (it, series) => {\n let p = this.chartDataItemToPoint(it, series);\n //pt.x *= normX;\n p.y *= normY;\n // Limit as much as possible the magnitude of a number inclued in the svg.\n // Big numbers \"overflow the renderer\".\n p.x = (p.x - minX) * normX;\n //pt.y = (pt.y - minY) * normY;\n return p;\n };\n const chartSeries = this.chartSeries;\n const chartFillSeries = this._chartFillSeries;\n const chartGrid = this.chartGrid;\n const splineHere = type === 'spline' || type === 'splinearea';\n for (let series of datasource) {\n // does the series svg exist?\n let svg, svgFill;\n let grad;\n if (chartSeries.length > iter) {\n svg = chartSeries[iter];\n svgFill = chartFillSeries[iter];\n grad = svgFill.firstElementChild.firstElementChild;\n }\n else {\n svg = document.createElementNS(SVG_NS, 'svg');\n svg.setAttribute('pacem', '');\n body.appendChild(svg);\n svgFill = document.createElementNS(SVG_NS, 'svg');\n svgFill.setAttribute('pacem', '');\n body.insertBefore(svgFill, body.children.item(iter + /* <defs> should remain the very first child and 'grid' the very second */ 2));\n // 1st child - defs (gradient)\n const defs = document.createElementNS(SVG_NS, 'defs');\n defs.appendChild(grad = this._buildLinearGradient(iter));\n svgFill.appendChild(defs);\n // 2nd child - fill path\n svgFill.appendChild(document.createElementNS(SVG_NS, 'path'));\n chartFillSeries.push(svgFill);\n // 1st child stroke path\n svg.appendChild(document.createElementNS(SVG_NS, 'path'));\n // 2nd + nth+1 child will be point circles\n chartSeries.push(svg);\n }\n // series positioning:\n /*\n --------------------------------------\n | |--------------------------------|\n |pad| series here |\n | |--------------------------------|\n --------------------------------------\n | | pad |\n --------------------------------------\n */\n let className = 'chart-series';\n const fill = type === 'area' || type === 'splinearea';\n if (!Utils.isNullOrEmpty(series.className)) {\n className += ' ' + series.className;\n }\n [svg, svgFill].forEach(s => {\n s.setAttribute('class', className);\n s.setAttribute('x', paddingYAxis.toString());\n s.setAttribute('y', seriesY.toString());\n s.setAttribute('width', seriesWidth.toString());\n s.setAttribute('height', (seriesHeight + 2 * padding).toString());\n });\n Utils.addClass(svgFill, PCSS + '-inert');\n // pick path as single child element for the series.\n let pathFill = svgFill.children.item(1);\n let path = svg.firstElementChild;\n path.style.stroke = series.color;\n pathFill.style.stroke =\n path.style.fill = 'none';\n this._setGradientColor(grad, series.color);\n pathFill.style.fill = `url(#${grad.id})`;\n pathFill.style.display = fill ? '' : 'none';\n let d = '';\n let data = series.values;\n if (data && data.length) {\n const addInteractivePoint = (center, j, series, dataItem, color) => {\n const ndx = j + /* count the <path> child */ 1;\n let circle;\n if (svg.children.length > ndx) {\n circle = svg.children.item(ndx);\n }\n else {\n circle = document.createElementNS(SVG_NS, 'line');\n circle.setAttribute('class', 'circle');\n svg.appendChild(circle);\n }\n const x1 = center.x.toString(), y1 = (-center.y).toString();\n circle.setAttribute('x1', x1);\n circle.setAttribute('y1', y1);\n circle.setAttribute('x2', x1);\n circle.setAttribute('y2', y1);\n circle.style.stroke = color;\n this.assignUiBehaviors(circle, series, dataItem, color);\n };\n const wipeExceedingPoints = () => {\n const remaining = series.datapoints ? (data.length + 1) : 1;\n for (let k = svg.children.length - 1; k >= remaining; k--) {\n var circle = svg.children.item(k);\n this.disposeUiBehaviors(circle);\n circle.remove();\n }\n };\n if (splineHere) {\n // #region SPLINE\n let pt0, pt, c0;\n for (let j = 0; j < data.length; j++) {\n const item = data[j];\n if (isNaN(item.value)) {\n continue;\n }\n if (!pt) {\n pt = buildPoint(item, data);\n }\n let pt1;\n if (splineHere && j < (data.length - 1)) {\n pt1 = buildPoint(data[j + 1], data);\n }\n // accumulate `area` for sorting\n let areaSoFar = GET_VAL(series, SERIES_MAGNITUDE, 0);\n areaSoFar += item.value;\n SET_VAL(series, SERIES_MAGNITUDE, areaSoFar);\n var c = getSplineCtrlPoints(pt, pt0, pt1);\n d += Utils.isNullOrEmpty(d) ? `M${pt.x},${-pt.y} ` : `C${c0.x},${-c0.y} ${c.c0.x},${-c.c0.y} ${pt.x},${-pt.y} `;\n if (series.datapoints) {\n addInteractivePoint(pt, j, series, item, series.color);\n }\n // step next\n pt0 = pt;\n pt = pt1, c0 = c.c1;\n }\n // #endregion\n }\n else {\n // #region LINE\n let j = 0;\n for (let item of data) {\n if (isNaN(item.value)) {\n continue;\n }\n const pt = buildPoint(item, data);\n // accumulate `area` for sorting\n let areaSoFar = GET_VAL(series, SERIES_MAGNITUDE, 0);\n areaSoFar += item.value;\n SET_VAL(series, SERIES_MAGNITUDE, areaSoFar);\n d += Utils.isNullOrEmpty(d) ? `M${pt.x},${-pt.y} ` : `L${pt.x},${-pt.y} `;\n if (series.datapoints) {\n addInteractivePoint(pt, j, series, item, series.color);\n }\n j++;\n }\n // #endregion\n }\n wipeExceedingPoints();\n }\n path.setAttribute('d', d);\n pathFill.setAttribute('d', d + `V${(-minY * normY)} H0 Z`);\n // tick\n iter++;\n }\n // remove exceeding series\n this._wipe(chartFillSeries, iter);\n this._wipe(chartSeries, iter);\n const w0 = 100 * stretch, h0 = 100 + 2 * normPadding, x0 = 0, //minX * normX,\n y0 = maxY * normY + normPadding;\n const svbox = `${x0} ${-y0} ${w0} ${h0}`;\n for (var svg of chartSeries.concat(chartFillSeries)) {\n svg.setAttribute('viewBox', svbox);\n }\n const chartMask = this.chartMask;\n let mask = chartMask.children.item(1);\n mask.setAttribute('x', x0.toString());\n mask.setAttribute('height', (size.height - padding).toString());\n // #endregion\n // #region grid\n chartGrid.setAttribute('viewBox', `0 0 ${size.width} ${size.height}`);\n if (grid.x.length <= 1 || grid.y.length <= 1) {\n for (let j = chartGrid.children.length - 1; j >= 0; j--) {\n chartGrid.children.item(j).remove();\n }\n return;\n }\n let pgrid;\n if (chartGrid.children.length > 0) {\n pgrid = chartGrid.children.item(0);\n }\n else {\n pgrid = document.createElementNS(SVG_NS, 'path');\n chartGrid.appendChild(pgrid);\n }\n const tick = padding * .25;\n let lblCounter = 0;\n let ensureLabel = (index, x, y, txt) => {\n const ndx = index + /* <path> is the first child element */ 1;\n let lbl;\n if (chartGrid.children.length <= ndx) {\n lbl = document.createElementNS(SVG_NS, 'text');\n chartGrid.appendChild(lbl);\n }\n else {\n lbl = chartGrid.children.item(ndx);\n }\n lbl.textContent = txt;\n lbl.setAttribute('x', x.toString());\n lbl.setAttribute('y', y.toString());\n return lbl;\n };\n let dgrid = `M${paddingYAxis},${padding} v${gridHeight}`; //H${w}\n // x\n let j = 0;\n const xincr = seriesWidth / (grid.x.length - 1), yincr = gridHeight / (grid.y.length - 1);\n if (this.xAxisPosition !== 'none') {\n for (var x of grid.x) {\n const xcoord = paddingYAxis + j * xincr;\n if (this.xAxisPosition === 'top') {\n dgrid += ` M${xcoord},${padding} v${-tick}`;\n let lbl = ensureLabel(lblCounter++, xcoord, 0, x);\n lbl.setAttribute('text-anchor', 'middle');\n lbl.setAttribute('alignment-baseline', 'hanging');\n }\n else {\n let ycoord = gridHeight + padding;\n dgrid += ` M${xcoord},${ycoord} v${tick}`;\n ensureLabel(lblCounter++, xcoord, ycoord + padding, x).setAttribute('text-anchor', 'middle');\n }\n j++;\n }\n }\n // y\n j = 0;\n for (var y of grid.y) {\n const ycoord = gridHeight + padding - j * yincr, xcoord = paddingYAxis - tick;\n dgrid += ` M${xcoord},${ycoord} H${(seriesWidth + paddingYAxis)}`;\n let txt = this.formatYAxisLabel(y);\n ensureLabel(lblCounter++, xcoord - tick, ycoord, txt).setAttribute('text-anchor', 'end');\n j++;\n }\n pgrid.setAttribute('d', dgrid);\n // exceeding labels?\n for (let j = chartGrid.children.length - 1; j > lblCounter; j--) {\n chartGrid.children.item(j).remove();\n }\n // #endregion\n // #region abscissa cursor\n // #endregion\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], PacemChartElement.prototype, \"type\", void 0);\n__decorate([\n Watch({ converter: PropertyConverters.String })\n], PacemChartElement.prototype, \"aspectRatio\", void 0);\nPacemChartElement = __decorate([\n CustomElement({ tagName: P + '-chart' })\n], PacemChartElement);\nexport { PacemChartElement };\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, Watch, PropertyConverters, P, Utils, Logging } from '@pacem/pacem-core';\nimport { PacemSeriesChartElement } from './types';\n//namespace Pacem.Components.Charts {\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\nconst PADDING_PIXELS = 24;\nlet PacemColumnChartElement = class PacemColumnChartElement extends PacemSeriesChartElement {\n constructor() {\n super(...arguments);\n /** Set a value between 0 and 1, for the columns' stack/cluster horizontal size (percentage of the available space). */\n this.groupWidth = .0;\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (name === 'type' || name === 'groupWidth') {\n this.draw();\n }\n }\n _safen(w = this.groupWidth) {\n return Math.min(1, Math.max(w || .75, 0));\n }\n drawSeries(datasource) {\n if (!this.isReady || Utils.isNull(this.chartSize)) {\n return;\n }\n const div = this.ensureChartContainer();\n const type = this.type || 'cluster';\n const padding = PADDING_PIXELS;\n // resize all\n var size = this.chartSize;\n if (size.height <= padding || size.width <= padding) {\n return;\n }\n // items && labels?\n if (Utils.isNullOrEmpty(datasource) || datasource.every(i => Utils.isNullOrEmpty(i.values))) {\n this.wipeOut();\n return;\n }\n const body = this.ensureChartBody('column', size.width, size.height);\n // from now on, drawing...\n this.log(Logging.LogLevel.Debug, `Drawing ${type} chart.`);\n // #region computations\n const xAxisType = this.xAxisType || 'string';\n let minY = this.yAxisMin ?? 0, maxY = this.yAxisMax ?? 0, minX = 0, maxX = 0, maxCount = 0;\n let stretch = 1;\n const accumulator = { negative: [], positive: [] };\n // individuate the min/max x & y in order correctly apply aspect ratio...\n for (let series of datasource) {\n let data = series.values;\n if (!Utils.isNullOrEmpty(data)) {\n let j = 0;\n for (let item of data) {\n accumulator.positive[j] = accumulator.positive[j] || 0;\n accumulator.negative[j] = accumulator.negative[j] || 0;\n let pt = this.chartDataItemToPoint(item, data);\n if (Utils.isNull(this.yAxisMin)) {\n minY = Math.min(minY, pt.y);\n }\n if (Utils.isNull(this.yAxisMax)) {\n maxY = Math.max(maxY, pt.y);\n }\n minX = Math.min(minX, pt.x);\n maxX = Math.max(maxX, pt.x);\n if (pt.y > 0) {\n accumulator.positive[j] += pt.y;\n }\n else if (pt.y < 0) {\n accumulator.negative[j] += pt.y;\n }\n j++;\n }\n maxCount = Math.max(maxCount, data.length);\n }\n }\n const stacked = type === 'stack';\n if (stacked) {\n if (Utils.isNull(this.yAxisMin))\n minY = Math.min.apply(null, accumulator.negative);\n if (Utils.isNull(this.yAxisMax))\n maxY = Math.max.apply(null, accumulator.positive);\n }\n if (maxX === 0 && maxX === minX) {\n maxX = 1;\n }\n // add \"1 slot\" (half at the beginning and half after the end)\n const slot = (maxX - minX) / maxCount, halfSlot = slot * .5, \n // the following are usefule during the very rendering\n availSlot = slot * this._safen(this.groupWidth), halfAvailSlot = availSlot * .5;\n /** virtual grid made of x- and y-axis labels */\n const withValues = datasource.find(i => !Utils.isNullOrEmpty(i.values));\n const grid = this.getVirtualGrid(withValues.values, minX - halfSlot, maxX + halfSlot, minY, maxY, xAxisType, this.yAxisDensity, this.xAxisDensity);\n const topGrid = grid.y[grid.y.length - 1], bottomGrid = grid.y[0];\n if (topGrid === bottomGrid) {\n return;\n }\n // estimate y-axis max width\n const halfPad = PADDING_PIXELS * .5;\n const paddingYAxis = grid.y.reduce((max, i) => Math.max(max, this.estimateYAxisLabelWidth(i) + halfPad), padding);\n /** width of the WHOLE series dedicated area */\n const seriesWidth = size.width - paddingYAxis - padding;\n /** height of the WHOLE series dedicated area */\n const gridHeight = (size.height - 2 * padding);\n const seriesHeight = gridHeight * (1 - (topGrid - bottomGrid - (maxY - minY)) / (topGrid - bottomGrid));\n const seriesY = gridHeight * (topGrid - maxY) / (topGrid - bottomGrid);\n // consider padding\n stretch = seriesWidth / seriesHeight;\n body.setAttribute('height', size.height.toString());\n body.setAttribute('width', size.width.toString());\n body.setAttribute('viewBox', `0 0 ${size.width} ${size.height}`);\n // #endregion\n // #region render series\n let iter = 0;\n // normalize\n const spanX = maxX - minX, spanY = maxY - minY;\n const normX = 100 * stretch / spanX, normY = 100 / spanY;\n const normPadding = 100 * padding / seriesHeight;\n const chartSeries = this.chartSeries;\n const chartGrid = this.chartGrid;\n const xPad = (halfSlot - minX) * normX;\n const buildPoint = (it, series) => {\n const p = this.chartDataItemToPoint(it, series);\n return {\n x: xPad + p.x * 2 * xPad,\n y: p.y * normY\n };\n };\n var accumulators = new Array(maxCount);\n for (let series of datasource) {\n // does the series svg exist?\n let svg;\n let grad;\n let gradInv;\n let g;\n if (chartSeries.length > iter) {\n svg = chartSeries[iter];\n grad = svg.firstElementChild.firstElementChild;\n gradInv = svg.firstElementChild.lastElementChild;\n g = svg.lastElementChild;\n }\n else {\n svg = document.createElementNS(SVG_NS, 'svg');\n svg.setAttribute('pacem', '');\n chartGrid.insertAdjacentElement('afterend', svg);\n const defs = document.createElementNS(SVG_NS, 'defs');\n defs.appendChild(grad = this.buildLinearGradient(iter));\n defs.appendChild(gradInv = this.buildLinearGradient(iter, true));\n svg.appendChild(defs);\n svg.appendChild(g = document.createElementNS(SVG_NS, 'g'));\n chartSeries.push(svg);\n }\n // series positioning:\n /*\n --------------------------------------\n | |--------------------------------|\n |pad| series here |\n | |--------------------------------|\n --------------------------------------\n | | pad |\n --------------------------------------\n */\n var className = 'chart-series series-fill';\n if (!Utils.isNullOrEmpty(series.className)) {\n className += ' ' + series.className;\n }\n svg.setAttribute('class', className);\n svg.setAttribute('x', paddingYAxis.toString());\n svg.setAttribute('y', seriesY.toString());\n svg.setAttribute('width', seriesWidth.toString());\n svg.setAttribute('height', (seriesHeight + 2 * padding).toString());\n const data = series.values;\n const spinRect = (index) => {\n while (index >= g.children.length) {\n g.appendChild(document.createElementNS(SVG_NS, 'rect'));\n }\n const rect = g.children.item(index);\n rect.style.stroke = series.color;\n const gradient = data[index].value < 0 ? gradInv : grad;\n this.setGradientColor(gradient, series.color);\n rect.style.fill = `url(#${gradient.id})`;\n return rect;\n };\n // fix 0 y\n const precision = 10;\n const assignVerticalCoordsCoords = (rect, pt0, pt, pt0Start = pt0) => {\n const y = -Math.max(pt0.y, pt.y), h = Math.abs(pt.y - pt0.y);\n const fnAssign = () => {\n rect.setAttribute('y', y.toFixed(precision));\n rect.setAttribute('height', h.toFixed(precision));\n };\n if (!rect.hasAttribute('y')) {\n // boostrap easing animated transition\n rect.setAttribute('y', '-' + pt0Start.y.toFixed(precision));\n rect.setAttribute('height', '0');\n requestAnimationFrame(fnAssign);\n }\n else {\n fnAssign();\n }\n };\n if (!Utils.isNullOrEmpty(data)) {\n ;\n const pt00 = buildPoint({ value: 0, label: data[0].label }, data);\n if (stacked) {\n // #region STACK\n const iHalfAvailSlot = halfAvailSlot * normX, iAvailSlotAttr = (availSlot * normX).toFixed(precision);\n for (let j = 0; j < data.length; j++) {\n const item = data[j];\n if (Utils.isNullOrEmpty(accumulators[j])) {\n accumulators[j] = { positive: 0, negative: 0 };\n }\n const accumulator = accumulators[j];\n let posCursor = accumulator.positive, negCursor = accumulator.negative;\n const neg = item.value < 0, y = neg ? negCursor : (posCursor + item.value), y0 = neg ? (negCursor + item.value) : posCursor;\n const pt = buildPoint({ label: item.label, value: y }, data);\n const pt0 = buildPoint({ label: item.label, value: y0 }, data);\n const x = pt.x - iHalfAvailSlot;\n const rect = spinRect(j);\n this.assignUiBehaviors(rect, series, item);\n rect.setAttribute('x', x.toFixed(precision));\n rect.setAttribute('width', iAvailSlotAttr);\n assignVerticalCoordsCoords(rect, pt0, pt, pt00);\n if (neg) {\n accumulator.negative = y0;\n }\n else {\n accumulator.positive = y;\n }\n }\n // #endregion\n }\n else {\n // #region CLUSTER\n const iHalfAvailSlot = halfAvailSlot * normX, iSlot = (iHalfAvailSlot * 2) / datasource.length, //,\n iSlotAttr = iSlot.toFixed(precision);\n for (let j = 0; j < data.length; j++) {\n // looping through the series-data\n const item = data[j];\n const pt = buildPoint(item, data);\n const x = pt.x - iHalfAvailSlot + iSlot * iter;\n const rect = spinRect(j);\n this.assignUiBehaviors(rect, series, item);\n rect.setAttribute('x', x.toFixed(precision));\n rect.setAttribute('width', iSlotAttr);\n assignVerticalCoordsCoords(rect, pt00, pt);\n }\n // #endregion\n }\n }\n // cleanup exceeding rects\n for (let j = g.children.length - 1; j >= data?.length || 0; j--) {\n const rect = g.children.item(j);\n this.disposeUiBehaviors(rect);\n rect.remove();\n }\n // tick\n iter++;\n }\n // remove exceeding series\n this.wipeOut(chartSeries, iter);\n const w0 = 100 * stretch, h0 = 100 + 2 * normPadding, x0 = 0, //minX * normX,\n y0 = maxY * normY + normPadding;\n const svbox = `${x0} ${-y0} ${w0} ${h0}`;\n for (var svg of chartSeries) {\n svg.setAttribute('viewBox', svbox);\n }\n const chartMask = this.chartMask;\n let mask = chartMask.children.item(1);\n mask.setAttribute('x', x0.toString());\n mask.setAttribute('height', (size.height - padding).toString());\n // #endregion\n // #region grid\n chartGrid.setAttribute('viewBox', `0 0 ${size.width} ${size.height}`);\n if (grid.x.length < 1 || grid.y.length <= 1) {\n for (let j = chartGrid.children.length - 1; j >= 0; j--) {\n chartGrid.children.item(j).remove();\n }\n return;\n }\n let pgrid;\n if (chartGrid.children.length > 0) {\n pgrid = chartGrid.children.item(0);\n }\n else {\n pgrid = document.createElementNS(SVG_NS, 'path');\n chartGrid.appendChild(pgrid);\n }\n const tick = PADDING_PIXELS * .25;\n let lblCounter = 0;\n let ensureLabel = (index, x, y, txt) => {\n const ndx = index + /* <path> is the first child element */ 1;\n let lbl;\n if (chartGrid.children.length <= ndx) {\n lbl = document.createElementNS(SVG_NS, 'text');\n chartGrid.appendChild(lbl);\n }\n else {\n lbl = chartGrid.children.item(ndx);\n }\n lbl.textContent = txt;\n lbl.setAttribute('x', x.toString());\n lbl.setAttribute('y', y.toString());\n return lbl;\n };\n let dgrid = `M${paddingYAxis},${padding} v${gridHeight}`; //H${w}\n // x\n let j = 0;\n const xincr = seriesWidth / (grid.x.length /*- 1 consider the extra slot */), yincr = gridHeight / (grid.y.length - 1);\n if (this.xAxisPosition !== 'none') {\n const paddingX = xincr * .5 + paddingYAxis;\n for (var x of grid.x) {\n let xcoord = paddingX + j * xincr;\n if (this.xAxisPosition === 'top') {\n dgrid += ` M${xcoord},${padding} v${-tick}`;\n let lbl = ensureLabel(lblCounter++, xcoord, 0, x);\n lbl.setAttribute('text-anchor', 'middle');\n lbl.setAttribute('alignment-baseline', 'hanging');\n }\n else {\n let ycoord = gridHeight + padding;\n dgrid += ` M${xcoord},${ycoord} v${tick}`;\n ensureLabel(lblCounter++, xcoord, ycoord + padding, x).setAttribute('text-anchor', 'middle');\n }\n j++;\n }\n }\n // y\n j = 0;\n for (var y of grid.y) {\n const ycoord = gridHeight + padding - j * yincr, xcoord = paddingYAxis - tick;\n dgrid += ` M${xcoord},${ycoord} H${(seriesWidth + paddingYAxis)}`;\n let txt = this.formatYAxisLabel(y);\n ensureLabel(lblCounter++, xcoord - tick, ycoord, txt).setAttribute('text-anchor', 'end');\n j++;\n }\n pgrid.setAttribute('d', dgrid);\n // exceeding labels?\n for (let j = chartGrid.children.length - 1; j > lblCounter; j--) {\n chartGrid.children.item(j).remove();\n }\n // #endregion\n }\n};\n__decorate([\n Watch({ converter: PropertyConverters.String })\n], PacemColumnChartElement.prototype, \"type\", void 0);\n__decorate([\n Watch({ converter: PropertyConverters.Number })\n], PacemColumnChartElement.prototype, \"groupWidth\", void 0);\nPacemColumnChartElement = __decorate([\n CustomElement({ tagName: P + '-column-chart' })\n], PacemColumnChartElement);\nexport { PacemColumnChartElement };\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, Watch, PropertyConverters, P, PCSS, Components, Utils, CustomElementUtils, Debounce } from '@pacem/pacem-core';\nimport { MANAGED_EVENTS } from './types';\n//namespace Pacem.Components.Charts {\nlet PacemPieSliceElement = class PacemPieSliceElement extends Components.PacemItemElement {\n constructor() {\n super(...arguments);\n this._broadcastHandler = (e) => {\n this.emit(e);\n };\n }\n findContainer() {\n return CustomElementUtils.findAncestorOfType(this, PacemPieChartElement);\n }\n get chart() {\n return this.container;\n }\n /** Returns the center of mass (point) of this pie/doughnut slice, in absolute coords (pixels). */\n getCenterOfMass() {\n const area = this.chart && this.chart.area;\n if (Utils.isNull(area)) {\n return null;\n }\n const rect = Utils.offset(area), center = { x: rect.width / 2 + rect.left, y: rect.top + rect.height / 2 }, r = Math.min(rect.width, rect.height) * .5;\n const pos = this.normalizedPolarCoords, angle = PI1_2 - pos.angle;\n return {\n y: center.y - r * pos.radius * Math.sin(angle),\n x: center.x + r * pos.radius * Math.cos(angle)\n };\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (!first && this.chart && name != 'normalizedPolarCoords')\n this.chart.draw();\n }\n /** @internal */\n _assignUi(el) {\n const ui = this._ui = el;\n MANAGED_EVENTS.forEach(type => {\n ui.addEventListener(type, this._broadcastHandler);\n });\n }\n /** @internal */\n _disposeUi() {\n if (!Utils.isNull(this._ui)) {\n MANAGED_EVENTS.forEach(type => {\n this._ui.removeEventListener(type, this._broadcastHandler);\n });\n }\n }\n};\n__decorate([\n Watch({ converter: PropertyConverters.Number })\n], PacemPieSliceElement.prototype, \"value\", void 0);\n__decorate([\n Watch({ converter: PropertyConverters.String })\n], PacemPieSliceElement.prototype, \"label\", void 0);\n__decorate([\n Watch({ converter: PropertyConverters.String })\n], PacemPieSliceElement.prototype, \"color\", void 0);\n__decorate([\n Watch({ converter: PropertyConverters.Json })\n], PacemPieSliceElement.prototype, \"normalizedPolarCoords\", void 0);\nPacemPieSliceElement = __decorate([\n CustomElement({ tagName: P + '-pie-slice' })\n], PacemPieSliceElement);\nexport { PacemPieSliceElement };\nconst TWO_PI = Math.PI * 2;\nconst PI1_2 = Math.PI * .5;\nlet PacemPieChartElement = class PacemPieChartElement extends Components.PacemItemsContainerElement {\n constructor() {\n super();\n /** Set a value between 0 and 1, for doughnut appearance. */\n this.cutout = .0;\n /** Distance between two consecutive slices, in pixels. */\n this.slicePadding = .0;\n this._slices = new WeakMap();\n this._key = Utils.uniqueCode();\n }\n validate(item) {\n return item instanceof PacemPieSliceElement;\n }\n viewActivatedCallback() {\n super.viewActivatedCallback();\n this.draw();\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (name === 'target') {\n this._g = null;\n this._div && this._div.remove();\n const eold = old;\n if (eold) {\n eold.classList.remove(PCSS + '-chart-area');\n eold.innerHTML = '';\n }\n this.draw();\n }\n else if (!first && (name === 'cutout' || name === 'items' || name === 'slicePadding'))\n this.draw();\n }\n get area() {\n return this._svg;\n }\n disconnectedCallback() {\n this._div && this._div.remove();\n super.disconnectedCallback();\n }\n _ensureArea() {\n if (Utils.isNull(this._g)) {\n let div = this.target || (this._div = document.createElement('div'));\n div.classList.add(PCSS + '-chart-area');\n let svg = this._svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttribute('pacem', '');\n svg.setAttribute('preserveAspectRatio', 'xMidYMid meet');\n svg.setAttribute('viewBox', '0 0 100 100');\n //svg.style.height =\n // svg.style.width = '100%';\n svg.classList.add(PCSS + '-pie-chart');\n let defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');\n let g = this._g = document.createElementNS('http://www.w3.org/2000/svg', 'g');\n svg.appendChild(defs);\n svg.appendChild(g);\n div.appendChild(svg);\n this._div &&\n this.parentElement.insertBefore(div, this);\n }\n if (this.maskBasedRendering) {\n if (Utils.isNull(this._mask)) {\n let mask = document.createElementNS('http://www.w3.org/2000/svg', 'mask');\n mask.id = 'pie_mask_' + this._key;\n let rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n rect.setAttribute('x', '0');\n rect.setAttribute('y', '0');\n rect.setAttribute('width', '100');\n rect.setAttribute('height', '100');\n rect.setAttribute('fill', '#fff');\n let circle = this._mask = document.createElementNS('http://www.w3.org/2000/svg', 'circle');\n circle.setAttribute('cx', '50');\n circle.setAttribute('cy', '50');\n const defs = this._svg.firstElementChild;\n mask.appendChild(rect);\n mask.appendChild(circle);\n defs.appendChild(mask);\n this._g.setAttribute('mask', `url(#${mask.id})`);\n }\n const cutout = 50.0 * this._safeCutout;\n this._mask.setAttribute('r', `${cutout}`);\n }\n else {\n if (!Utils.isNull(this._mask)) {\n this._svg.firstElementChild.innerHTML = '';\n this._mask = null;\n this._g.removeAttribute('mask');\n }\n }\n // has padded slices?\n const paddingPixels = this._safeSlicePaddingPixels;\n if (paddingPixels > 0) {\n const matrix = this._svg.getCTM();\n const paddingUnits = (paddingPixels / matrix.a).roundoff();\n const maskId = this._sliceMaskId;\n const defs = this._svg.firstElementChild;\n let mask = defs.querySelector(`#${maskId}`);\n if (Utils.isNull(mask)) {\n mask = document.createElementNS('http://www.w3.org/2000/svg', 'mask');\n mask.id = maskId;\n defs.appendChild(mask);\n }\n else {\n mask.innerHTML = '';\n }\n const maskPath = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n const d = `M${(50 + paddingUnits)},0 H100 V100 H0 V0 H50 V50 h${paddingUnits} Z`;\n maskPath.setAttribute('d', d);\n maskPath.setAttribute('fill', '#fff');\n mask.appendChild(maskPath);\n }\n return this._g;\n }\n get _sliceMaskId() {\n return 'pieslice_mask_' + this._key;\n }\n get _safeCutout() {\n return Math.min(1, Math.max(0, this.cutout)) || .0;\n }\n get _safeSlicePaddingPixels() {\n return Math.max(0, this.slicePadding ?? 0);\n }\n _drawSlice(path, slice, whole, partial) {\n const largeFlag = slice.value > .5 * whole ? 1 : 0;\n const angle = TWO_PI * slice.value / whole;\n const rot = 360.0 * partial / whole;\n const x = (slice.value >= whole) ? /* handling single slice */ 49.9 : 50 * (1 + Math.sin(angle));\n const y = 50 * (1 - Math.cos(angle));\n // set geometry data\n const c = this._safeCutout, r = c * 50.0;\n path.style.fill = slice.color; //.setAttribute('fill', slice.color || (path.getAttribute('fill') || '#000'));\n //path.setAttribute('transform', `rotate(${rot} 50 50)`);\n path.style.transform = `rotate(${rot}deg)`;\n path.style.transformOrigin = '50% 50%';\n const d = this.maskBasedRendering ?\n `M50,50 V0 A50,50 0 ${largeFlag} 1 ${x} ${y} L50,50 Z` :\n `M50,0 A50,50 0 ${largeFlag} 1 ${x} ${y} l${(50 - x) * (1.0 - c)},${(50 - y) * (1.0 - c)} A${r},${r} 0 ${largeFlag} 0 50,${(50 - r)} Z`;\n path.setAttribute('d', d);\n slice.normalizedPolarCoords = { radius: c + Math.SQRT1_2 * (1.0 - c), angle: /* deg to rad */ Math.PI * rot / 180.0 + angle / 2 };\n }\n _isSliceOk(slice) {\n return !slice.disabled //&& slice.value > 0\n ;\n }\n _padSlice(path) {\n const paddingPixels = this._safeSlicePaddingPixels;\n if (paddingPixels > 0) {\n path.setAttribute('mask', `url(#${this._sliceMaskId})`);\n }\n else {\n path.removeAttribute('mask');\n }\n }\n draw() {\n const g = this._ensureArea(), pCount = g.children.length, chartArea = this._svg.parentElement;\n let ndx = 0, sum = .0, progress = .0;\n if (Utils.isNullOrEmpty(this.items)) {\n g.innerHTML = '';\n Utils.removeClass(chartArea, 'chart-has-data');\n }\n else {\n Utils.addClass(chartArea, 'chart-has-data');\n for (let slice of this.items) {\n if (!this._isSliceOk(slice)) {\n continue;\n }\n sum += slice.value;\n }\n if (sum <= 0) {\n g.innerHTML = '';\n Utils.removeClass(chartArea, 'chart-has-data');\n }\n else {\n for (let slice of this.items) {\n if (!this._isSliceOk(slice)) {\n continue;\n }\n let p;\n if (ndx >= pCount) {\n const g_n = document.createElementNS('http://www.w3.org/2000/svg', 'g');\n g_n.setAttribute('class', 'chart-series ' + PCSS + '-pie-slice' + (Utils.isNullOrEmpty(slice.className) ? '' : (' ' + slice.className)));\n p = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n g_n.appendChild(p);\n g.appendChild(g_n);\n // add listeners (click, mouse-..., touch-...)\n slice._assignUi(g_n);\n this._slices.set(g_n, slice);\n }\n else {\n p = g.children.item(ndx).firstElementChild;\n }\n if (slice.value > 0) {\n this._drawSlice(p, slice, sum, progress);\n this._padSlice(p);\n progress += slice.value;\n p.removeAttribute('display');\n }\n else {\n p.setAttribute('display', 'none');\n }\n ndx++;\n }\n }\n }\n while (ndx < g.children.length) {\n const slices = this._slices, g_n = g.children.item(ndx);\n // remove listeners\n if (slices.has(g_n)) {\n slices.get(g_n)._disposeUi();\n slices.delete(g_n);\n }\n g.removeChild(g_n);\n }\n }\n};\n__decorate([\n Watch({ converter: PropertyConverters.Number })\n], PacemPieChartElement.prototype, \"cutout\", void 0);\n__decorate([\n Watch({ converter: PropertyConverters.Element })\n], PacemPieChartElement.prototype, \"target\", void 0);\n__decorate([\n Watch({ converter: PropertyConverters.Boolean })\n], PacemPieChartElement.prototype, \"maskBasedRendering\", void 0);\n__decorate([\n Watch({ converter: PropertyConverters.Number })\n], PacemPieChartElement.prototype, \"slicePadding\", void 0);\n__decorate([\n Debounce(true)\n], PacemPieChartElement.prototype, \"draw\", null);\nPacemPieChartElement = __decorate([\n CustomElement({ tagName: P + '-pie-chart' })\n], PacemPieChartElement);\nexport { PacemPieChartElement };\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["min", "PacemChartSeriesElement", "CustomElement", "Watch", "PropertyConverters", "P", "PCSS", "Utils", "CustomElementUtils", "__decorate", "Utils", "CustomElementUtils", "SVG_NS", "PacemChartElement", "j", "svg", "PCSS", "series", "x", "y", "Watch", "PropertyConverters", "CustomElement", "P", "CustomElement", "Watch", "PropertyConverters", "P", "Utils", "Logging", "__decorate", "SVG_NS", "PADDING_PIXELS", "PacemColumnChartElement", "Utils", "Logging", "j", "svg", "y", "accumulator", "y0", "x", "Watch", "PropertyConverters", "CustomElement", "P", "CustomElement", "Watch", "PropertyConverters", "P", "PCSS", "Components", "Utils", "CustomElementUtils", "__decorate", "PacemPieSliceElement", "Components", "CustomElementUtils", "Utils", "Watch", "PropertyConverters", "CustomElement", "P", "PacemPieChartElement", "Components", "Utils", "PCSS", "__decorate", "Watch", "PropertyConverters", "CustomElement", "P"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { CustomElement, Watch, PropertyConverters, P, Utils, Logging } from '@pacem/pacem-core';
|
|
8
|
+
import { PacemSeriesChartElement } from './types';
|
|
9
|
+
//namespace Pacem.Components.Charts {
|
|
10
|
+
const SVG_NS = "http://www.w3.org/2000/svg";
|
|
11
|
+
const PADDING_PIXELS = 24;
|
|
12
|
+
let PacemColumnChartElement = class PacemColumnChartElement extends PacemSeriesChartElement {
|
|
13
|
+
constructor() {
|
|
14
|
+
super(...arguments);
|
|
15
|
+
/** Set a value between 0 and 1, for the columns' stack/cluster horizontal size (percentage of the available space). */
|
|
16
|
+
this.groupWidth = .0;
|
|
17
|
+
}
|
|
18
|
+
propertyChangedCallback(name, old, val, first) {
|
|
19
|
+
super.propertyChangedCallback(name, old, val, first);
|
|
20
|
+
if (name === 'type' || name === 'groupWidth') {
|
|
21
|
+
this.draw();
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
_safen(w = this.groupWidth) {
|
|
25
|
+
return Math.min(1, Math.max(w || .75, 0));
|
|
26
|
+
}
|
|
27
|
+
drawSeries(datasource) {
|
|
28
|
+
if (!this.isReady || Utils.isNull(this.chartSize)) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const div = this.ensureChartContainer();
|
|
32
|
+
const type = this.type || 'cluster';
|
|
33
|
+
const padding = PADDING_PIXELS;
|
|
34
|
+
// resize all
|
|
35
|
+
var size = this.chartSize;
|
|
36
|
+
if (size.height <= padding || size.width <= padding) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
// items && labels?
|
|
40
|
+
if (Utils.isNullOrEmpty(datasource) || datasource.every(i => Utils.isNullOrEmpty(i.values))) {
|
|
41
|
+
this.wipeOut();
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const body = this.ensureChartBody('column', size.width, size.height);
|
|
45
|
+
// from now on, drawing...
|
|
46
|
+
this.log(Logging.LogLevel.Debug, `Drawing ${type} chart.`);
|
|
47
|
+
// #region computations
|
|
48
|
+
const xAxisType = this.xAxisType || 'string';
|
|
49
|
+
let minY = this.yAxisMin ?? 0, maxY = this.yAxisMax ?? 0, minX = 0, maxX = 0, maxCount = 0;
|
|
50
|
+
let stretch = 1;
|
|
51
|
+
const accumulator = { negative: [], positive: [] };
|
|
52
|
+
// individuate the min/max x & y in order correctly apply aspect ratio...
|
|
53
|
+
for (let series of datasource) {
|
|
54
|
+
let data = series.values;
|
|
55
|
+
if (!Utils.isNullOrEmpty(data)) {
|
|
56
|
+
let j = 0;
|
|
57
|
+
for (let item of data) {
|
|
58
|
+
accumulator.positive[j] = accumulator.positive[j] || 0;
|
|
59
|
+
accumulator.negative[j] = accumulator.negative[j] || 0;
|
|
60
|
+
let pt = this.chartDataItemToPoint(item, data);
|
|
61
|
+
if (Utils.isNull(this.yAxisMin)) {
|
|
62
|
+
minY = Math.min(minY, pt.y);
|
|
63
|
+
}
|
|
64
|
+
if (Utils.isNull(this.yAxisMax)) {
|
|
65
|
+
maxY = Math.max(maxY, pt.y);
|
|
66
|
+
}
|
|
67
|
+
minX = Math.min(minX, pt.x);
|
|
68
|
+
maxX = Math.max(maxX, pt.x);
|
|
69
|
+
if (pt.y > 0) {
|
|
70
|
+
accumulator.positive[j] += pt.y;
|
|
71
|
+
}
|
|
72
|
+
else if (pt.y < 0) {
|
|
73
|
+
accumulator.negative[j] += pt.y;
|
|
74
|
+
}
|
|
75
|
+
j++;
|
|
76
|
+
}
|
|
77
|
+
maxCount = Math.max(maxCount, data.length);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
const stacked = type === 'stack';
|
|
81
|
+
if (stacked) {
|
|
82
|
+
if (Utils.isNull(this.yAxisMin))
|
|
83
|
+
minY = Math.min.apply(null, accumulator.negative);
|
|
84
|
+
if (Utils.isNull(this.yAxisMax))
|
|
85
|
+
maxY = Math.max.apply(null, accumulator.positive);
|
|
86
|
+
}
|
|
87
|
+
if (maxX === 0 && maxX === minX) {
|
|
88
|
+
maxX = 1;
|
|
89
|
+
}
|
|
90
|
+
// add "1 slot" (half at the beginning and half after the end)
|
|
91
|
+
const slot = (maxX - minX) / maxCount, halfSlot = slot * .5,
|
|
92
|
+
// the following are usefule during the very rendering
|
|
93
|
+
availSlot = slot * this._safen(this.groupWidth), halfAvailSlot = availSlot * .5;
|
|
94
|
+
/** virtual grid made of x- and y-axis labels */
|
|
95
|
+
const withValues = datasource.find(i => !Utils.isNullOrEmpty(i.values));
|
|
96
|
+
const grid = this.getVirtualGrid(withValues.values, minX - halfSlot, maxX + halfSlot, minY, maxY, xAxisType, this.yAxisDensity, this.xAxisDensity);
|
|
97
|
+
const topGrid = grid.y[grid.y.length - 1], bottomGrid = grid.y[0];
|
|
98
|
+
if (topGrid === bottomGrid) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
// estimate y-axis max width
|
|
102
|
+
const halfPad = PADDING_PIXELS * .5;
|
|
103
|
+
const paddingYAxis = grid.y.reduce((max, i) => Math.max(max, this.estimateYAxisLabelWidth(i) + halfPad), padding);
|
|
104
|
+
/** width of the WHOLE series dedicated area */
|
|
105
|
+
const seriesWidth = size.width - paddingYAxis - padding;
|
|
106
|
+
/** height of the WHOLE series dedicated area */
|
|
107
|
+
const gridHeight = (size.height - 2 * padding);
|
|
108
|
+
const seriesHeight = gridHeight * (1 - (topGrid - bottomGrid - (maxY - minY)) / (topGrid - bottomGrid));
|
|
109
|
+
const seriesY = gridHeight * (topGrid - maxY) / (topGrid - bottomGrid);
|
|
110
|
+
// consider padding
|
|
111
|
+
stretch = seriesWidth / seriesHeight;
|
|
112
|
+
body.setAttribute('height', size.height.toString());
|
|
113
|
+
body.setAttribute('width', size.width.toString());
|
|
114
|
+
body.setAttribute('viewBox', `0 0 ${size.width} ${size.height}`);
|
|
115
|
+
// #endregion
|
|
116
|
+
// #region render series
|
|
117
|
+
let iter = 0;
|
|
118
|
+
// normalize
|
|
119
|
+
const spanX = maxX - minX, spanY = maxY - minY;
|
|
120
|
+
const normX = 100 * stretch / spanX, normY = 100 / spanY;
|
|
121
|
+
const normPadding = 100 * padding / seriesHeight;
|
|
122
|
+
const chartSeries = this.chartSeries;
|
|
123
|
+
const chartGrid = this.chartGrid;
|
|
124
|
+
const xPad = (halfSlot - minX) * normX;
|
|
125
|
+
const buildPoint = (it, series) => {
|
|
126
|
+
const p = this.chartDataItemToPoint(it, series);
|
|
127
|
+
return {
|
|
128
|
+
x: xPad + p.x * 2 * xPad,
|
|
129
|
+
y: p.y * normY
|
|
130
|
+
};
|
|
131
|
+
};
|
|
132
|
+
var accumulators = new Array(maxCount);
|
|
133
|
+
for (let series of datasource) {
|
|
134
|
+
// does the series svg exist?
|
|
135
|
+
let svg;
|
|
136
|
+
let grad;
|
|
137
|
+
let gradInv;
|
|
138
|
+
let g;
|
|
139
|
+
if (chartSeries.length > iter) {
|
|
140
|
+
svg = chartSeries[iter];
|
|
141
|
+
grad = svg.firstElementChild.firstElementChild;
|
|
142
|
+
gradInv = svg.firstElementChild.lastElementChild;
|
|
143
|
+
g = svg.lastElementChild;
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
svg = document.createElementNS(SVG_NS, 'svg');
|
|
147
|
+
svg.setAttribute('pacem', '');
|
|
148
|
+
chartGrid.insertAdjacentElement('afterend', svg);
|
|
149
|
+
const defs = document.createElementNS(SVG_NS, 'defs');
|
|
150
|
+
defs.appendChild(grad = this.buildLinearGradient(iter));
|
|
151
|
+
defs.appendChild(gradInv = this.buildLinearGradient(iter, true));
|
|
152
|
+
svg.appendChild(defs);
|
|
153
|
+
svg.appendChild(g = document.createElementNS(SVG_NS, 'g'));
|
|
154
|
+
chartSeries.push(svg);
|
|
155
|
+
}
|
|
156
|
+
// series positioning:
|
|
157
|
+
/*
|
|
158
|
+
--------------------------------------
|
|
159
|
+
| |--------------------------------|
|
|
160
|
+
|pad| series here |
|
|
161
|
+
| |--------------------------------|
|
|
162
|
+
--------------------------------------
|
|
163
|
+
| | pad |
|
|
164
|
+
--------------------------------------
|
|
165
|
+
*/
|
|
166
|
+
var className = 'chart-series series-fill';
|
|
167
|
+
if (!Utils.isNullOrEmpty(series.className)) {
|
|
168
|
+
className += ' ' + series.className;
|
|
169
|
+
}
|
|
170
|
+
svg.setAttribute('class', className);
|
|
171
|
+
svg.setAttribute('x', paddingYAxis.toString());
|
|
172
|
+
svg.setAttribute('y', seriesY.toString());
|
|
173
|
+
svg.setAttribute('width', seriesWidth.toString());
|
|
174
|
+
svg.setAttribute('height', (seriesHeight + 2 * padding).toString());
|
|
175
|
+
const data = series.values;
|
|
176
|
+
const spinRect = (index) => {
|
|
177
|
+
while (index >= g.children.length) {
|
|
178
|
+
g.appendChild(document.createElementNS(SVG_NS, 'rect'));
|
|
179
|
+
}
|
|
180
|
+
const rect = g.children.item(index);
|
|
181
|
+
rect.style.stroke = series.color;
|
|
182
|
+
const gradient = data[index].value < 0 ? gradInv : grad;
|
|
183
|
+
this.setGradientColor(gradient, series.color);
|
|
184
|
+
rect.style.fill = `url(#${gradient.id})`;
|
|
185
|
+
return rect;
|
|
186
|
+
};
|
|
187
|
+
// fix 0 y
|
|
188
|
+
const precision = 10;
|
|
189
|
+
const assignVerticalCoordsCoords = (rect, pt0, pt, pt0Start = pt0) => {
|
|
190
|
+
const y = -Math.max(pt0.y, pt.y), h = Math.abs(pt.y - pt0.y);
|
|
191
|
+
const fnAssign = () => {
|
|
192
|
+
rect.setAttribute('y', y.toFixed(precision));
|
|
193
|
+
rect.setAttribute('height', h.toFixed(precision));
|
|
194
|
+
};
|
|
195
|
+
if (!rect.hasAttribute('y')) {
|
|
196
|
+
// boostrap easing animated transition
|
|
197
|
+
rect.setAttribute('y', '-' + pt0Start.y.toFixed(precision));
|
|
198
|
+
rect.setAttribute('height', '0');
|
|
199
|
+
requestAnimationFrame(fnAssign);
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
fnAssign();
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
if (!Utils.isNullOrEmpty(data)) {
|
|
206
|
+
;
|
|
207
|
+
const pt00 = buildPoint({ value: 0, label: data[0].label }, data);
|
|
208
|
+
if (stacked) {
|
|
209
|
+
// #region STACK
|
|
210
|
+
const iHalfAvailSlot = halfAvailSlot * normX, iAvailSlotAttr = (availSlot * normX).toFixed(precision);
|
|
211
|
+
for (let j = 0; j < data.length; j++) {
|
|
212
|
+
const item = data[j];
|
|
213
|
+
if (Utils.isNullOrEmpty(accumulators[j])) {
|
|
214
|
+
accumulators[j] = { positive: 0, negative: 0 };
|
|
215
|
+
}
|
|
216
|
+
const accumulator = accumulators[j];
|
|
217
|
+
let posCursor = accumulator.positive, negCursor = accumulator.negative;
|
|
218
|
+
const neg = item.value < 0, y = neg ? negCursor : (posCursor + item.value), y0 = neg ? (negCursor + item.value) : posCursor;
|
|
219
|
+
const pt = buildPoint({ label: item.label, value: y }, data);
|
|
220
|
+
const pt0 = buildPoint({ label: item.label, value: y0 }, data);
|
|
221
|
+
const x = pt.x - iHalfAvailSlot;
|
|
222
|
+
const rect = spinRect(j);
|
|
223
|
+
this.assignUiBehaviors(rect, series, item);
|
|
224
|
+
rect.setAttribute('x', x.toFixed(precision));
|
|
225
|
+
rect.setAttribute('width', iAvailSlotAttr);
|
|
226
|
+
assignVerticalCoordsCoords(rect, pt0, pt, pt00);
|
|
227
|
+
if (neg) {
|
|
228
|
+
accumulator.negative = y0;
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
accumulator.positive = y;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// #endregion
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
// #region CLUSTER
|
|
238
|
+
const iHalfAvailSlot = halfAvailSlot * normX, iSlot = (iHalfAvailSlot * 2) / datasource.length, //,
|
|
239
|
+
iSlotAttr = iSlot.toFixed(precision);
|
|
240
|
+
for (let j = 0; j < data.length; j++) {
|
|
241
|
+
// looping through the series-data
|
|
242
|
+
const item = data[j];
|
|
243
|
+
const pt = buildPoint(item, data);
|
|
244
|
+
const x = pt.x - iHalfAvailSlot + iSlot * iter;
|
|
245
|
+
const rect = spinRect(j);
|
|
246
|
+
this.assignUiBehaviors(rect, series, item);
|
|
247
|
+
rect.setAttribute('x', x.toFixed(precision));
|
|
248
|
+
rect.setAttribute('width', iSlotAttr);
|
|
249
|
+
assignVerticalCoordsCoords(rect, pt00, pt);
|
|
250
|
+
}
|
|
251
|
+
// #endregion
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
// cleanup exceeding rects
|
|
255
|
+
for (let j = g.children.length - 1; j >= data?.length || 0; j--) {
|
|
256
|
+
const rect = g.children.item(j);
|
|
257
|
+
this.disposeUiBehaviors(rect);
|
|
258
|
+
rect.remove();
|
|
259
|
+
}
|
|
260
|
+
// tick
|
|
261
|
+
iter++;
|
|
262
|
+
}
|
|
263
|
+
// remove exceeding series
|
|
264
|
+
this.wipeOut(chartSeries, iter);
|
|
265
|
+
const w0 = 100 * stretch, h0 = 100 + 2 * normPadding, x0 = 0, //minX * normX,
|
|
266
|
+
y0 = maxY * normY + normPadding;
|
|
267
|
+
const svbox = `${x0} ${-y0} ${w0} ${h0}`;
|
|
268
|
+
for (var svg of chartSeries) {
|
|
269
|
+
svg.setAttribute('viewBox', svbox);
|
|
270
|
+
}
|
|
271
|
+
const chartMask = this.chartMask;
|
|
272
|
+
let mask = chartMask.children.item(1);
|
|
273
|
+
mask.setAttribute('x', x0.toString());
|
|
274
|
+
mask.setAttribute('height', (size.height - padding).toString());
|
|
275
|
+
// #endregion
|
|
276
|
+
// #region grid
|
|
277
|
+
chartGrid.setAttribute('viewBox', `0 0 ${size.width} ${size.height}`);
|
|
278
|
+
if (grid.x.length < 1 || grid.y.length <= 1) {
|
|
279
|
+
for (let j = chartGrid.children.length - 1; j >= 0; j--) {
|
|
280
|
+
chartGrid.children.item(j).remove();
|
|
281
|
+
}
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
let pgrid;
|
|
285
|
+
if (chartGrid.children.length > 0) {
|
|
286
|
+
pgrid = chartGrid.children.item(0);
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
pgrid = document.createElementNS(SVG_NS, 'path');
|
|
290
|
+
chartGrid.appendChild(pgrid);
|
|
291
|
+
}
|
|
292
|
+
const tick = PADDING_PIXELS * .25;
|
|
293
|
+
let lblCounter = 0;
|
|
294
|
+
let ensureLabel = (index, x, y, txt) => {
|
|
295
|
+
const ndx = index + /* <path> is the first child element */ 1;
|
|
296
|
+
let lbl;
|
|
297
|
+
if (chartGrid.children.length <= ndx) {
|
|
298
|
+
lbl = document.createElementNS(SVG_NS, 'text');
|
|
299
|
+
chartGrid.appendChild(lbl);
|
|
300
|
+
}
|
|
301
|
+
else {
|
|
302
|
+
lbl = chartGrid.children.item(ndx);
|
|
303
|
+
}
|
|
304
|
+
lbl.textContent = txt;
|
|
305
|
+
lbl.setAttribute('x', x.toString());
|
|
306
|
+
lbl.setAttribute('y', y.toString());
|
|
307
|
+
return lbl;
|
|
308
|
+
};
|
|
309
|
+
let dgrid = `M${paddingYAxis},${padding} v${gridHeight}`; //H${w}
|
|
310
|
+
// x
|
|
311
|
+
let j = 0;
|
|
312
|
+
const xincr = seriesWidth / (grid.x.length /*- 1 consider the extra slot */), yincr = gridHeight / (grid.y.length - 1);
|
|
313
|
+
if (this.xAxisPosition !== 'none') {
|
|
314
|
+
const paddingX = xincr * .5 + paddingYAxis;
|
|
315
|
+
for (var x of grid.x) {
|
|
316
|
+
let xcoord = paddingX + j * xincr;
|
|
317
|
+
if (this.xAxisPosition === 'top') {
|
|
318
|
+
dgrid += ` M${xcoord},${padding} v${-tick}`;
|
|
319
|
+
let lbl = ensureLabel(lblCounter++, xcoord, 0, x);
|
|
320
|
+
lbl.setAttribute('text-anchor', 'middle');
|
|
321
|
+
lbl.setAttribute('alignment-baseline', 'hanging');
|
|
322
|
+
}
|
|
323
|
+
else {
|
|
324
|
+
let ycoord = gridHeight + padding;
|
|
325
|
+
dgrid += ` M${xcoord},${ycoord} v${tick}`;
|
|
326
|
+
ensureLabel(lblCounter++, xcoord, ycoord + padding, x).setAttribute('text-anchor', 'middle');
|
|
327
|
+
}
|
|
328
|
+
j++;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
// y
|
|
332
|
+
j = 0;
|
|
333
|
+
for (var y of grid.y) {
|
|
334
|
+
const ycoord = gridHeight + padding - j * yincr, xcoord = paddingYAxis - tick;
|
|
335
|
+
dgrid += ` M${xcoord},${ycoord} H${(seriesWidth + paddingYAxis)}`;
|
|
336
|
+
let txt = this.formatYAxisLabel(y);
|
|
337
|
+
ensureLabel(lblCounter++, xcoord - tick, ycoord, txt).setAttribute('text-anchor', 'end');
|
|
338
|
+
j++;
|
|
339
|
+
}
|
|
340
|
+
pgrid.setAttribute('d', dgrid);
|
|
341
|
+
// exceeding labels?
|
|
342
|
+
for (let j = chartGrid.children.length - 1; j > lblCounter; j--) {
|
|
343
|
+
chartGrid.children.item(j).remove();
|
|
344
|
+
}
|
|
345
|
+
// #endregion
|
|
346
|
+
}
|
|
347
|
+
};
|
|
348
|
+
__decorate([
|
|
349
|
+
Watch({ converter: PropertyConverters.String })
|
|
350
|
+
], PacemColumnChartElement.prototype, "type", void 0);
|
|
351
|
+
__decorate([
|
|
352
|
+
Watch({ converter: PropertyConverters.Number })
|
|
353
|
+
], PacemColumnChartElement.prototype, "groupWidth", void 0);
|
|
354
|
+
PacemColumnChartElement = __decorate([
|
|
355
|
+
CustomElement({ tagName: P + '-column-chart' })
|
|
356
|
+
], PacemColumnChartElement);
|
|
357
|
+
export { PacemColumnChartElement };
|