From 1c9edc7eb50d367c377704c3c01b7117ce56c55d Mon Sep 17 00:00:00 2001 From: Catherine Liu Date: Thu, 13 Sep 2018 22:57:27 -0700 Subject: [PATCH] Adds progress function and elements Added progress elements Added progress view Added unit tests for progress common function Fixed prop type in toggle arg Renamed vert -> vertical and horiz -> horizontal Adjusted progress element dimensions Removed check for null context in progress function Refactored progress shapes Added unicorn shape Adds labelPosition arg Added tests for labelPosition --- .../horizontal_progress_bar/header.png | Bin 0 -> 11665 bytes .../elements/horizontal_progress_bar/index.js | 24 +++ .../canvas_plugin_src/elements/index.js | 8 + .../elements/progress_gauge/header.png | Bin 0 -> 26807 bytes .../elements/progress_gauge/index.js | 24 +++ .../elements/progress_wheel/header.png | Bin 0 -> 36389 bytes .../elements/progress_wheel/index.js | 24 +++ .../elements/vertical_progress_bar/header.png | Bin 0 -> 13851 bytes .../elements/vertical_progress_bar/index.js | 24 +++ .../functions/common/__tests__/progress.js | 190 ++++++++++++++++++ .../functions/common/index.js | 2 + .../functions/common/progress.js | 98 +++++++++ .../canvas_plugin_src/renderers/index.js | 2 + .../renderers/progress/index.js | 7 + .../renderers/progress/progress.js | 156 ++++++++++++++ .../renderers/progress/shapes/gauge.js | 22 ++ .../progress/shapes/horizontal_bar.js | 21 ++ .../renderers/progress/shapes/index.js | 18 ++ .../renderers/progress/shapes/unicorn.js | 23 +++ .../renderers/progress/shapes/vertical_bar.js | 22 ++ .../renderers/progress/shapes/wheel.js | 22 ++ .../canvas_plugin_src/uis/arguments/toggle.js | 7 +- .../canvas_plugin_src/uis/views/index.js | 6 +- .../canvas_plugin_src/uis/views/progress.js | 88 ++++++++ 24 files changed, 783 insertions(+), 5 deletions(-) create mode 100644 x-pack/plugins/canvas/canvas_plugin_src/elements/horizontal_progress_bar/header.png create mode 100644 x-pack/plugins/canvas/canvas_plugin_src/elements/horizontal_progress_bar/index.js create mode 100644 x-pack/plugins/canvas/canvas_plugin_src/elements/progress_gauge/header.png create mode 100644 x-pack/plugins/canvas/canvas_plugin_src/elements/progress_gauge/index.js create mode 100644 x-pack/plugins/canvas/canvas_plugin_src/elements/progress_wheel/header.png create mode 100644 x-pack/plugins/canvas/canvas_plugin_src/elements/progress_wheel/index.js create mode 100644 x-pack/plugins/canvas/canvas_plugin_src/elements/vertical_progress_bar/header.png create mode 100644 x-pack/plugins/canvas/canvas_plugin_src/elements/vertical_progress_bar/index.js create mode 100644 x-pack/plugins/canvas/canvas_plugin_src/functions/common/__tests__/progress.js create mode 100644 x-pack/plugins/canvas/canvas_plugin_src/functions/common/progress.js create mode 100644 x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/index.js create mode 100644 x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/progress.js create mode 100644 x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/shapes/gauge.js create mode 100644 x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/shapes/horizontal_bar.js create mode 100644 x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/shapes/index.js create mode 100644 x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/shapes/unicorn.js create mode 100644 x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/shapes/vertical_bar.js create mode 100644 x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/shapes/wheel.js create mode 100644 x-pack/plugins/canvas/canvas_plugin_src/uis/views/progress.js diff --git a/x-pack/plugins/canvas/canvas_plugin_src/elements/horizontal_progress_bar/header.png b/x-pack/plugins/canvas/canvas_plugin_src/elements/horizontal_progress_bar/header.png new file mode 100644 index 0000000000000000000000000000000000000000..cb7047045891285cdc411c28eeb6920c184741cb GIT binary patch literal 11665 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 literal 0 HcmV?d00001 diff --git a/x-pack/plugins/canvas/canvas_plugin_src/elements/horizontal_progress_bar/index.js b/x-pack/plugins/canvas/canvas_plugin_src/elements/horizontal_progress_bar/index.js new file mode 100644 index 0000000000000..b5839f3f34980 --- /dev/null +++ b/x-pack/plugins/canvas/canvas_plugin_src/elements/horizontal_progress_bar/index.js @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { openSans } from '../../../common/lib/fonts'; +import header from './header.png'; + +export const horizontalProgressBar = () => ({ + name: 'horizontalProgressBar', + displayName: 'Horizontal Progress Bar', + help: 'Displays progress as a portion of a horizontal bar', + width: 200, + height: 50, + image: header, + expression: `filters +| demodata +| math "sum(min(cost) / max(cost))" +| progress shape="horizontalBar" label={formatnumber 0%} font={font size=24 family="${ + openSans.value + }" color="#000000" align=center} +| render`, +}); diff --git a/x-pack/plugins/canvas/canvas_plugin_src/elements/index.js b/x-pack/plugins/canvas/canvas_plugin_src/elements/index.js index 15d98394e0475..0ba7fcc27e37d 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/elements/index.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/elements/index.js @@ -11,11 +11,14 @@ import { donut } from './donut'; import { dropdownFilter } from './dropdown_filter'; import { image } from './image'; import { horizontalBarChart } from './horiz_bar_chart'; +import { horizontalProgressBar } from './horizontal_progress_bar'; import { lineChart } from './line_chart'; import { markdown } from './markdown'; import { metric } from './metric'; import { pie } from './pie'; import { plot } from './plot'; +import { progressGauge } from './progress_gauge'; +import { progressWheel } from './progress_wheel'; import { repeatImage } from './repeatImage'; import { revealImage } from './revealImage'; import { shape } from './shape'; @@ -23,6 +26,7 @@ import { table } from './table'; import { tiltedPie } from './tilted_pie'; import { timeFilter } from './time_filter'; import { verticalBarChart } from './vert_bar_chart'; +import { verticalProgressBar } from './vertical_progress_bar'; export const elementSpecs = [ areaChart, @@ -32,11 +36,14 @@ export const elementSpecs = [ dropdownFilter, image, horizontalBarChart, + horizontalProgressBar, lineChart, markdown, metric, pie, plot, + progressGauge, + progressWheel, repeatImage, revealImage, shape, @@ -44,4 +51,5 @@ export const elementSpecs = [ tiltedPie, timeFilter, verticalBarChart, + verticalProgressBar, ]; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/elements/progress_gauge/header.png b/x-pack/plugins/canvas/canvas_plugin_src/elements/progress_gauge/header.png new file mode 100644 index 0000000000000000000000000000000000000000..082a2fcfa31a75edd9d2e4ba229bf0f0d59607b5 GIT binary patch literal 26807 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 It6By94>Haa`2YX_ literal 0 HcmV?d00001 diff --git a/x-pack/plugins/canvas/canvas_plugin_src/elements/progress_gauge/index.js b/x-pack/plugins/canvas/canvas_plugin_src/elements/progress_gauge/index.js new file mode 100644 index 0000000000000..de38c385d8533 --- /dev/null +++ b/x-pack/plugins/canvas/canvas_plugin_src/elements/progress_gauge/index.js @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { openSans } from '../../../common/lib/fonts'; +import header from './header.png'; + +export const progressGauge = () => ({ + name: 'progressGauge', + displayName: 'Progress Gauge', + help: 'Displays progress as a portion of a gauge', + width: 200, + height: 200, + image: header, + expression: `filters +| demodata +| math "sum(min(cost) / max(cost))" +| progress shape="gauge" label={formatnumber 0%} font={font size=24 family="${ + openSans.value + }" color="#000000" align=center} +| render`, +}); diff --git a/x-pack/plugins/canvas/canvas_plugin_src/elements/progress_wheel/header.png b/x-pack/plugins/canvas/canvas_plugin_src/elements/progress_wheel/header.png new file mode 100644 index 0000000000000000000000000000000000000000..3a78068312186fe6318554bce28a2144575c289c GIT binary patch literal 36389 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%0DLMpmc?so-2&)D&1W;du`9!Y~=WcH~=-MgB&0 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 Dl{Y4G literal 0 HcmV?d00001 diff --git a/x-pack/plugins/canvas/canvas_plugin_src/elements/progress_wheel/index.js b/x-pack/plugins/canvas/canvas_plugin_src/elements/progress_wheel/index.js new file mode 100644 index 0000000000000..d692dda47635c --- /dev/null +++ b/x-pack/plugins/canvas/canvas_plugin_src/elements/progress_wheel/index.js @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { openSans } from '../../../common/lib/fonts'; +import header from './header.png'; + +export const progressWheel = () => ({ + name: 'progressWheel', + displayName: 'Progress Wheel', + help: 'Displays progress as a portion of a wheel', + width: 200, + height: 200, + image: header, + expression: `filters +| demodata +| math "sum(min(cost) / max(cost))" +| progress shape="wheel" label={formatnumber 0%} font={font size=24 family="${ + openSans.value + }" color="#000000" align=center} +| render`, +}); diff --git a/x-pack/plugins/canvas/canvas_plugin_src/elements/vertical_progress_bar/header.png b/x-pack/plugins/canvas/canvas_plugin_src/elements/vertical_progress_bar/header.png new file mode 100644 index 0000000000000000000000000000000000000000..6bb1394b8cac87166d3177d908352871c6a6d65f GIT binary patch literal 13851 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 literal 0 HcmV?d00001 diff --git a/x-pack/plugins/canvas/canvas_plugin_src/elements/vertical_progress_bar/index.js b/x-pack/plugins/canvas/canvas_plugin_src/elements/vertical_progress_bar/index.js new file mode 100644 index 0000000000000..6ae8f1d293c88 --- /dev/null +++ b/x-pack/plugins/canvas/canvas_plugin_src/elements/vertical_progress_bar/index.js @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { openSans } from '../../../common/lib/fonts'; +import header from './header.png'; + +export const verticalProgressBar = () => ({ + name: 'verticalProgressBar', + displayName: 'Vertical Progress Bar', + help: 'Displays progress as a portion of a vertical bar', + width: 50, + height: 200, + image: header, + expression: `filters +| demodata +| math "sum(min(cost) / max(cost))" +| progress shape="verticalBar" label={formatnumber 0%} font={font size=24 family="${ + openSans.value + }" color="#000000" align=center} +| render`, +}); diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/__tests__/progress.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/__tests__/progress.js new file mode 100644 index 0000000000000..ed1d9306179c3 --- /dev/null +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/__tests__/progress.js @@ -0,0 +1,190 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from 'expect.js'; +import { progress } from '../progress'; +import { functionWrapper } from '../../../../__tests__/helpers/function_wrapper'; +import { fontStyle } from './fixtures/test_styles'; + +describe('progress', () => { + const fn = functionWrapper(progress); + const value = 0.33; + + it('returns a render as progress', () => { + const result = fn(0.2); + expect(result) + .to.have.property('type', 'render') + .and.to.have.property('as', 'progress'); + }); + + it('sets the progress to context', () => { + const result = fn(0.58); + expect(result.value).to.have.property('value', 0.58); + }); + + it(`throws when context is outside of the valid range`, () => { + expect(fn) + .withArgs(3) + .to.throwException(e => { + expect(e.message).to.be('Context must be between 0 and 1'); + }); + }); + + describe('args', () => { + describe('shape', () => { + it('sets the progress element shape', () => { + const result = fn(value, { + shape: 'wheel', + }); + expect(result.value).to.have.property('shape', 'wheel'); + }); + + it(`defaults to 'gauge'`, () => { + const result = fn(value); + expect(result.value).to.have.property('shape', 'gauge'); + }); + }); + + describe('max', () => { + it('sets the maximum value', () => { + const result = fn(value, { + max: 2, + }); + expect(result.value).to.have.property('max', 2); + }); + + it('defaults to 1', () => { + const result = fn(value); + expect(result.value).to.have.property('max', 1); + }); + + it('throws if max <= 0', () => { + expect(fn) + .withArgs(value, { max: -0.5 }) + .to.throwException(e => { + expect(e.message).to.be(`'max' must be greater than 0`); + }); + }); + }); + + describe('valueColor', () => { + it('sets the color of the progress bar', () => { + const result = fn(value, { + valueColor: '#000000', + }); + expect(result.value).to.have.property('valueColor', '#000000'); + }); + + it(`defaults to '#1785b0'`, () => { + const result = fn(value); + expect(result.value).to.have.property('valueColor', '#1785b0'); + }); + }); + + describe('barColor', () => { + it('sets the color of the background bar', () => { + const result = fn(value, { + barColor: '#FFFFFF', + }); + expect(result.value).to.have.property('barColor', '#FFFFFF'); + }); + + it(`defaults to '#f0f0f0'`, () => { + const result = fn(value); + expect(result.value).to.have.property('barColor', '#f0f0f0'); + }); + }); + + describe('weight', () => { + it('sets the thickness of the bars', () => { + const result = fn(value, { + weight: 100, + }); + + expect(result.value).to.have.property('weight', 100); + }); + + it(`defaults to 20`, () => { + const result = fn(value); + expect(result.value).to.have.property('weight', 20); + }); + }); + + describe('label', () => { + it('sets the label of the progress', () => { + const result = fn(value, { label: 'foo' }); + + expect(result.value).to.have.property('label', 'foo'); + }); + + it('hides the label if false', () => { + const result = fn(value, { + label: false, + }); + expect(result.value).to.have.property('label', ''); + }); + + it('defaults to true which sets the context as the label', () => { + const result = fn(value); + expect(result.value).to.have.property('label', '0.33'); + }); + }); + + describe('labelPosition', () => { + it('sets the position of the label', () => { + let result = fn(value, { labelPosition: 'center' }); + expect(result.value).to.have.property('labelPosition', 'center'); + + result = fn(value, { labelPosition: 'above' }); + expect(result.value).to.have.property('labelPosition', 'above'); + + result = fn(value, { labelPosition: 'below' }); + expect(result.value).to.have.property('labelPosition', 'below'); + + result = fn(value, { labelPosition: 'left' }); + expect(result.value).to.have.property('labelPosition', 'left'); + + result = fn(value, { labelPosition: 'right' }); + expect(result.value).to.have.property('labelPosition', 'right'); + }); + + it(`defaults to 'center'`, () => { + const result = fn(value); + expect(result.value).to.have.property('labelPosition', 'center'); + }); + + it('throws if given an invalid position', () => { + expect(fn) + .withArgs(value, { labelPosition: 'foo' }) + .to.throwException(e => { + expect(e.message).to.be(`'labelPosition' must be center, above, below, left, or right`); + }); + }); + }); + + describe('font', () => { + it('sets the font style for the label', () => { + const result = fn(value, { + font: fontStyle, + }); + + expect(result.value).to.have.property('font'); + expect(result.value.font).to.have.keys(Object.keys(fontStyle)); + expect(result.value.font.spec).to.have.keys(Object.keys(fontStyle.spec)); + }); + + it('sets fill to color', () => { + const result = fn(value, { + font: fontStyle, + }); + expect(result.value.font.spec).to.have.property('fill', fontStyle.spec.color); + }); + + // TODO: write test when using an instance of the interpreter + // it("sets a default style for the label when not provided", () => {}); + }); + }); +}); diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/index.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/index.js index afc9ba665c09b..410dbc60db952 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/index.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/index.js @@ -40,6 +40,7 @@ import { palette } from './palette'; import { pie } from './pie'; import { plot } from './plot'; import { ply } from './ply'; +import { progress } from './progress'; import { render } from './render'; import { replace } from './replace'; import { rounddate } from './rounddate'; @@ -95,6 +96,7 @@ export const functions = [ pie, plot, ply, + progress, render, repeatImage, replace, diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/progress.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/progress.js new file mode 100644 index 0000000000000..40d29591783a3 --- /dev/null +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/progress.js @@ -0,0 +1,98 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { get } from 'lodash'; +import { openSans } from '../../../common/lib/fonts'; +import { shapes } from '../../renderers/progress/shapes'; + +export const progress = () => ({ + name: 'progress', + aliases: [], + type: 'render', + help: 'Configure a progress element', + context: { + types: ['number'], + }, + args: { + shape: { + type: ['string'], + alias: ['_'], + help: `Select ${Object.keys(shapes) + .map((key, i, src) => (i === src.length - 1 ? `or ${shapes[key].name}` : shapes[key].name)) + .join(', ')}`, + default: 'gauge', + }, + max: { + type: ['number'], + help: 'Maximum value of the progress element', + default: 1, + }, + valueColor: { + type: ['string'], + help: 'Color of the progress bar', + default: `#1785b0`, + }, + barColor: { + type: ['string'], + help: 'Color of the background bar', + default: `#f0f0f0`, + }, + weight: { + type: ['number'], + help: 'Thickness of the bar in pixels', + default: 20, + }, + label: { + type: ['boolean', 'string'], + help: `Set true/false to show/hide label or provide a string to display as the label`, + default: true, + }, + labelPosition: { + type: ['string'], + help: 'Set the position of the label in respect to the shape', + default: 'center', + }, + font: { + types: ['style'], + help: 'Font settings for the label. Technically you can stick other styles in here too!', + default: `{font size=24 family="${openSans.value}" color="#000000" align=center}`, + }, + }, + fn: (value, args) => { + const labelPositions = ['center', 'above', 'below', 'left', 'right']; + if (args.max <= 0) throw new Error(`'max' must be greater than 0`); + if (value > args.max || value < 0) throw new Error(`Context must be between 0 and ${args.max}`); + + if (args.labelPosition && !labelPositions.includes(args.labelPosition)) { + throw new Error( + `'labelPosition' must be ${labelPositions + .map((position, i) => (i === labelPositions.length - 1 ? `or ${position}` : position)) + .join(', ')}` + ); + } + + let label = ''; + if (args.label) label = typeof args.label === 'string' ? args.label : `${value}`; + + let font = {}; + + if (get(args, 'font.spec')) { + font = { ...args.font }; + font.spec.fill = args.font.spec.color; // SVG uses fill for font color + } + + return { + type: 'render', + as: 'progress', + value: { + value, + ...args, + label, + font, + }, + }; + }, +}); diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/index.js b/x-pack/plugins/canvas/canvas_plugin_src/renderers/index.js index dadabdfc6bca3..ec2e863669093 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/index.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/index.js @@ -15,6 +15,7 @@ import { markdown } from './markdown'; import { metric } from './metric'; import { pie } from './pie'; import { plot } from './plot'; +import { progress } from './progress'; import { shape } from './shape'; import { table } from './table'; import { timeFilter } from './time_filter'; @@ -32,6 +33,7 @@ export const renderFunctions = [ metric, pie, plot, + progress, shape, table, timeFilter, diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/index.js b/x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/index.js new file mode 100644 index 0000000000000..0fb58fda8e7aa --- /dev/null +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/index.js @@ -0,0 +1,7 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export { progress } from './progress'; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/progress.js b/x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/progress.js new file mode 100644 index 0000000000000..df5b4cfbc7c2d --- /dev/null +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/progress.js @@ -0,0 +1,156 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { getId } from '../../../public/lib/get_id'; +import { shapes } from './shapes'; + +export const progress = () => ({ + name: 'progress', + displayName: 'Progress', + help: 'Reveal a percentage of an element', + reuseDomNode: true, + render(domNode, config, handlers) { + const { shape, value, max, valueColor, barColor, weight, label, labelPosition, font } = config; + const percent = value / max; + const shapeDef = shapes[shape]; + + if (shapeDef) { + const { path, getViewBox, width, height } = shapeDef; + let { minX, minY, offsetWidth, offsetHeight } = getViewBox(weight); + + const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); + svg.setAttribute('className', 'canvasProgress'); + svg.setAttribute('width', '100%'); + svg.setAttribute('height', '100%'); + + const svgId = getId('svg'); + svg.id = svgId; + + const bar = document.createElementNS('http://www.w3.org/2000/svg', 'path'); + bar.setAttribute('className', 'canvasProgress__background'); + bar.setAttribute('fill', 'none'); + bar.setAttribute('stroke', barColor); + bar.setAttribute('stroke-width', `${weight}px`); + bar.setAttribute('d', path); + + const value = bar.cloneNode(true); + value.setAttribute('className', 'canvasProgress__value'); + value.setAttribute('stroke', valueColor); + + const length = value.getTotalLength(); + const to = length * (1 - percent); + value.setAttribute('stroke-dasharray', length); + value.setAttribute('stroke-dashoffset', Math.max(0, to)); + + svg.appendChild(bar); + svg.appendChild(value); + + if (label) { + const labelText = document.createTextNode(label); + const text = document.createElementNS('http://www.w3.org/2000/svg', 'text'); + text.setAttribute('className', 'canvasProgress__label'); + Object.assign(text.style, font.spec); + + text.appendChild(labelText); + svg.appendChild(text); + + domNode.appendChild(svg); + + const { width: labelWidth, height: labelHeight } = document + .getElementById(svgId) + .lastChild.getBBox(); + + let labelX; + let labelY; + let textAnchor; + let dominantBaseline; + + switch (labelPosition) { + case 'center': + textAnchor = 'middle'; + dominantBaseline = 'central'; + labelX = width / 2; + labelY = height / 2; + + if (labelWidth > offsetWidth) { + minX = -labelWidth / 2; + offsetWidth = labelWidth; + } + break; + case 'above': + textAnchor = 'middle'; + dominantBaseline = 'text-after-edge'; + labelX = width / 2; + labelY = shape === 'verticalBar' ? 0 : -weight / 2; + minY -= labelHeight; + offsetHeight += labelHeight; + + if (labelWidth > offsetWidth) { + minX = -labelWidth / 2; + offsetWidth = labelWidth; + } + break; + case 'below': + textAnchor = 'middle'; + dominantBaseline = 'text-before-edge'; + labelX = width / 2; + labelY = shape === 'verticalBar' ? height : height + weight / 2; + offsetHeight += labelHeight; + + if (labelWidth > offsetWidth) { + minX = -labelWidth / 2; + offsetWidth = labelWidth; + } + break; + case 'left': + textAnchor = 'end'; + dominantBaseline = 'central'; + labelX = shape === 'horizontalBar' ? 0 : -weight / 2; + labelY = height / 2; + minX -= labelWidth; + offsetWidth += labelWidth; + + if (labelHeight > offsetHeight) { + minY = -labelHeight / 2; + offsetHeight = labelHeight; + } + break; + case 'right': + textAnchor = 'start'; + dominantBaseline = 'central'; + labelX = shape === 'horizontalBar' ? width : width + weight / 2; + labelY = labelY = height / 2; + offsetWidth += labelWidth; + + if (labelHeight > offsetHeight) { + minY = -labelHeight / 2; + offsetHeight = labelHeight; + } + break; + } + + text.setAttribute('text-anchor', textAnchor); + text.setAttribute('dominant-baseline', dominantBaseline); + text.setAttribute('x', labelX); + text.setAttribute('y', labelY); + } + + svg.setAttribute('viewBox', [minX, minY, offsetWidth, offsetHeight].join(' ')); + svg.setAttribute('width', domNode.offsetWidth); + svg.setAttribute('height', domNode.offsetHeight); + + if (domNode.firstChild) domNode.removeChild(domNode.firstChild); + domNode.appendChild(svg); + + handlers.onResize(() => { + svg.setAttribute('width', domNode.offsetWidth); + svg.setAttribute('height', domNode.offsetHeight); + }); + } + + handlers.done(); + }, +}); diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/shapes/gauge.js b/x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/shapes/gauge.js new file mode 100644 index 0000000000000..3e9fa2d0f2644 --- /dev/null +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/shapes/gauge.js @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +const width = 200; +const height = 166; + +export const gauge = { + name: 'gauge', + displayName: 'Gauge', + path: 'M 25 166 A 100 100 0 1 1 175 166', + width, + height, + getViewBox: weight => ({ + minX: -weight / 2, + minY: -weight / 2, + offsetWidth: width + weight, + offsetHeight: height + (weight * 66) / 76, + }), +}; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/shapes/horizontal_bar.js b/x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/shapes/horizontal_bar.js new file mode 100644 index 0000000000000..adea6e35d6f7c --- /dev/null +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/shapes/horizontal_bar.js @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +const width = 200; +const height = 1; +export const horizontalBar = { + name: 'horizontalBar', + displayName: 'Horizontal bar', + path: 'M 0 1 L 200 1', + width, + height, + getViewBox: weight => ({ + minX: 0, + minY: -weight / 2, + offsetWidth: width, + offsetHeight: height + weight, + }), +}; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/shapes/index.js b/x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/shapes/index.js new file mode 100644 index 0000000000000..6d4b7b467c7c1 --- /dev/null +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/shapes/index.js @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { gauge } from './gauge'; +import { horizontalBar } from './horizontal_bar'; +import { unicorn } from './unicorn'; +import { verticalBar } from './vertical_bar'; +import { wheel } from './wheel'; +export const shapes = { + gauge, + horizontalBar, + unicorn, + verticalBar, + wheel, +}; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/shapes/unicorn.js b/x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/shapes/unicorn.js new file mode 100644 index 0000000000000..6a776801a0e36 --- /dev/null +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/shapes/unicorn.js @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +const width = 200; +const height = width; + +export const unicorn = { + name: 'unicorn', + displayName: 'Unicorn', + path: + 'M 123 189 C 93 141 129 126 102 96 L 78 102 L 48 117 L 42 129 Q 30 132 21 126 L 18 114 L 27 90 L 42 72 L 48 57 L 3 6 L 57 42 L 63 33 L 60 15 L 69 27 L 69 15 L 84 27 Q 162 36 195 108 Q 174 159 123 189 Z', + width: 200, + height: 200, + getViewBox: weight => ({ + minX: -weight / 2, + minY: -weight / 2, + offsetWidth: width + weight, + offsetHeight: height + weight, + }), +}; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/shapes/vertical_bar.js b/x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/shapes/vertical_bar.js new file mode 100644 index 0000000000000..9dc3dca9d544b --- /dev/null +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/shapes/vertical_bar.js @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +const width = 1; +const height = 200; + +export const verticalBar = { + name: 'verticalBar', + displayName: 'Vertical bar', + path: 'M 1 200 L 1 0 ', + width, + height, + getViewBox: weight => ({ + minX: -weight / 2, + minY: 0, + offsetWidth: width + weight, + offsetHeight: height, + }), +}; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/shapes/wheel.js b/x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/shapes/wheel.js new file mode 100644 index 0000000000000..99ffd2bdf6082 --- /dev/null +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/shapes/wheel.js @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +const width = 200; +const height = width; + +export const wheel = { + name: 'wheel', + displayName: 'Wheel', + path: 'M 100 0 A 100 100 0 1 1 100 200 A 100 100 0 1 1 100 0 Z', + width, + height, + getViewBox: weight => ({ + minX: -weight / 2, + minY: -weight / 2, + offsetWidth: width + weight, + offsetHeight: height + weight, + }), +}; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/uis/arguments/toggle.js b/x-pack/plugins/canvas/canvas_plugin_src/uis/arguments/toggle.js index 15a9b8c7ce347..30092cd7bd56c 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/uis/arguments/toggle.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/uis/arguments/toggle.js @@ -9,16 +9,17 @@ import PropTypes from 'prop-types'; import { EuiSwitch } from '@elastic/eui'; import { templateFromReactComponent } from '../../../public/lib/template_from_react_component'; -const ToggleArgInput = ({ onValueChange, argValue, argId }) => { +const ToggleArgInput = ({ onValueChange, argValue, argId, renderError }) => { const handleChange = () => onValueChange(!argValue); - + if (typeof argValue !== 'boolean') renderError(); return ; }; ToggleArgInput.propTypes = { onValueChange: PropTypes.func.isRequired, - argValue: PropTypes.bool.isRequired, + argValue: PropTypes.oneOfType([PropTypes.bool, PropTypes.string, PropTypes.object]).isRequired, argId: PropTypes.string.isRequired, + renderError: PropTypes.func.isRequired, }; export const toggle = () => ({ diff --git a/x-pack/plugins/canvas/canvas_plugin_src/uis/views/index.js b/x-pack/plugins/canvas/canvas_plugin_src/uis/views/index.js index 7215030a8a001..6e2685dcb9893 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/uis/views/index.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/uis/views/index.js @@ -5,12 +5,13 @@ */ import { dropdownControl } from './dropdownControl'; +import { getCell } from './getCell'; import { image } from './image'; import { markdown } from './markdown'; import { metric } from './metric'; import { pie } from './pie'; import { plot } from './plot'; -import { getCell } from './getCell'; +import { progress } from './progress'; import { repeatImage } from './repeatImage'; import { revealImage } from './revealImage'; import { render } from './render'; @@ -20,12 +21,13 @@ import { timefilterControl } from './timefilterControl'; export const viewSpecs = [ dropdownControl, + getCell, image, markdown, metric, pie, plot, - getCell, + progress, repeatImage, revealImage, render, diff --git a/x-pack/plugins/canvas/canvas_plugin_src/uis/views/progress.js b/x-pack/plugins/canvas/canvas_plugin_src/uis/views/progress.js new file mode 100644 index 0000000000000..adf1033e7a771 --- /dev/null +++ b/x-pack/plugins/canvas/canvas_plugin_src/uis/views/progress.js @@ -0,0 +1,88 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { values } from 'lodash'; +import { openSans } from '../../../common/lib/fonts'; +import { shapes } from '../../renderers/progress/shapes'; + +export const progress = () => ({ + name: 'progress', + displayName: 'Progress', + modelArgs: [['_', { label: 'Value' }]], + requiresContext: false, + args: [ + { + name: 'shape', + displayName: 'Shape', + help: 'Shape of the element, e.g. gauge, bar, etc ', + argType: 'select', + options: { + choices: values(shapes).map(({ name, displayName }) => ({ + value: name, + name: displayName, + })), + }, + }, + { + name: 'max', + displayName: 'Maximum value', + help: 'Maximum value of the progress element', + argType: 'number', + default: '1', + }, + { + name: 'valueColor', + displayName: 'Progress Color', + help: 'Color of the progress bar', + argType: 'color', + default: `#1785b0`, + }, + { + name: 'barColor', + displayName: 'Background Color', + help: 'Color of the background bar', + argType: 'color', + default: `#f0f0f0`, + }, + { + name: 'weight', + displayName: 'Weight', + help: 'Thickness of the bar in pixels', + argType: 'number', + default: '20', + }, + { + name: 'label', + displayName: 'Label', + help: `Set true/false to show/hide label or provide a string to display as the label`, + argType: 'toggle', + default: 'true', + }, + { + name: 'labelPosition', + displayName: 'Label Position', + help: `Set the position of the label`, + argType: 'select', + default: 'center', + options: { + choices: [ + { value: 'center', name: 'Center' }, + { value: 'above', name: 'Above' }, + { value: 'below', name: 'Below' }, + { value: 'left', name: 'On the left' }, + { value: 'right', name: 'On the right' }, + ], + }, + }, + { + name: 'font', + displayName: 'Label Settings', + help: 'Font settings for the label. Technically you can stick other styles in here too!', + argType: 'font', + default: `{font size=24 family="${openSans.value}" color="#000000" align=center}`, + }, + ], +});