123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263/** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */import {isValue, isDefined, isObjectType, isNumber} from "../../module/util";
type AxisOption = { x?: number | false; y?: number | false; y2?: number | false;} | number | false;
type RangeAxisOption = { min? : AxisOption; max?: AxisOption;};
/** * Set the min/max value * @param {Chart} $$ Chart instance * @param {string} type Set type 'min' or 'max' * @param {object} value Value to be set * @private */function setMinMax($$, type: "min" | "max", value: AxisOption): void { const {config} = $$; const helper = (key, value) => { const v = isNumber(value) ? value : ( value === false ? undefined : null );
if (v !== null) { config[`axis_${key}_${type}`] = v; } };
if (isDefined(value)) { if (isObjectType(value)) { Object.keys(value).forEach(key => { helper(key, value[key]); }); } else if (isNumber(value) || value === false) { // shorthand values affects only y and y2. ["y", "y2"].forEach(key => { helper(key, value); }); }
$$.redraw({ withUpdateOrgXDomain: true, withUpdateXDomain: true }); }}
/** * Get the min/max value * @param {Chart} $$ Chart instance * @param {string} type Set type 'min' or 'max' * @returns {{x, y, y2}} * @private */function getMinMax($$, type: "min" | "max"): {x: number, y: number, y2: number} { const {config} = $$;
return { x: config[`axis_x_${type}`], y: config[`axis_y_${type}`], y2: config[`axis_y2_${type}`] };}
/** * Define axis * @ignore */const axis = { /** * Get and set axis labels. * @function axis․labels * @instance * @memberof Chart * @param {object} labels specified axis' label to be updated. * @param {string} [labels.x] x Axis string * @param {string} [labels.y] y Axis string * @param {string} [labels.y2] y2 Axis string * @returns {object|undefined} axis labels text object * @example * // Update axis' label * chart.axis.labels({ * x: "New X Axis Label", * y: "New Y Axis Label", * y2: "New Y2 Axis Label" * }); * * chart.axis.labels(); * // --> { * // x: "New X Axis Label", * // y: "New Y Axis Label", * // y2: "New Y2 Axis Label" * // } */ labels: function<T>(labels?: {x?: string, y?: string, y2?: string}): T | undefined { const $$ = this.internal; let labelText;
if (labels) { Object.keys(labels).forEach(axisId => { $$.axis.setLabelText(axisId, labels[axisId]); });
$$.axis.updateLabels(); }
["x", "y", "y2"].forEach(v => { const text = $$.axis.getLabelText(v);
if (text) { !labelText && (labelText = {}); labelText[v] = text; } });
return <T>labelText; },
/** * Get and set axis min value. * @function axis․min * @instance * @memberof Chart * @param {object} min If min is given, specified axis' min value will be updated.<br> * If no argument is given, the min values set on generating option for each axis will be returned. * If not set any min values on generation, it will return `undefined`.<br> * To unset specific axis max, set `false` to each of them. * @returns {object|undefined} * @example * // Update axis' min * chart.axis.min({ * x: -10, * y: 1000, * y2: 100 * }); * * // To unset specific axis min, set false to each of them. * chart.axis.min({ * x: false, * y: false, * y2: false * }); * * // shorthand (only affects y and y2 axis) * chart.axis.min(-50); * chart.axis.min(false); */ min: function(min?: AxisOption): object|void { const $$ = this.internal;
return isValue(min) || min === false ? setMinMax($$, "min", min as AxisOption) : getMinMax($$, "min"); },
/** * Get and set axis max value. * @function axis․max * @instance * @memberof Chart * @param {object} max If max is given, specified axis' max value will be updated.<br> * If no argument is given, the max values set on generating option for each axis will be returned. * If not set any max values on generation, it will return `undefined`.<br> * To unset specific axis max, set `false` to each of them. * @returns {object|undefined} * @example * // Update axis' label * chart.axis.max({ * x: 100, * y: 1000, * y2: 10000 * }); * * // To unset specific axis max, set false to each of them. * chart.axis.max({ * x: false, * y: false, * y2: false * }); * * // shorthand (only affects y and y2 axis) * chart.axis.max(10); * chart.axis.max(false); */ max: function(max?: AxisOption): object|void { const $$ = this.internal;
return isValue(max) || max === false ? setMinMax($$, "max", max as AxisOption) : getMinMax($$, "max"); },
/** * Get and set axis min and max value. * @function axis․range * @instance * @memberof Chart * @param {object} range If range is given, specified axis' min and max value will be updated. * If no argument is given, the current min and max values for each axis will be returned.<br> * To unset specific axis max, set `false` to each of them. * @returns {object|undefined} * @example * // Update axis' label * chart.axis.range({ * min: { * x: -10, * y: -1000, * y2: -10000 * }, * max: { * x: 100, * y: 1000, * y2: 10000 * }, * }); * * // To unset specific axis max, set false to each of them. * chart.axis.range({ * min: { * x: false, * y: false, * y2: false * }, * max: { * x: false, * y: false, * y2: false * }, * }); * * // shorthand (only affects y and y2 axis) * chart.axis.range({ min: -50, max: 1000 }); * chart.axis.range({ min: false, max: false }); */ range: function(range: RangeAxisOption): object|void { const {axis} = this;
if (arguments.length) { const {min, max} = range;
isDefined(max) && axis.max(max); isDefined(min) && axis.min(min); } else { return { max: axis.max(), min: axis.min() }; }
return undefined; }};
export default {axis};