UNPKG

@alauda-fe/common

Version:

Alauda frontend team common codes.

117 lines 15.6 kB
import dayjs from 'dayjs'; import { get } from 'lodash-es'; export var ScaleType; (function (ScaleType) { ScaleType["TIME"] = "time"; ScaleType["LINEAR"] = "linear"; ScaleType["ORDINAL"] = "ordinal"; })(ScaleType || (ScaleType = {})); export function getYDomain(data) { return getMaxMinValue(data); } export function getXDomain(data, scaleType) { if ([ScaleType.TIME, ScaleType.LINEAR].includes(scaleType)) { return getMaxMinValue(data); } return data; } function getMaxMinValue(data) { return data.reduce((acc, pre) => { const value = +pre || 0; return [ acc[0] < +value ? acc[0] : +value, acc[1] > +value ? acc[1] : +value, ]; }, [+data[0], +data[0]]); } export function getScaleType(values) { const allDates = values?.every(value => value instanceof Date || dayjs(value).isValid()); if (allDates) { return ScaleType.TIME; } const allNumbers = values?.every(value => typeof value === 'number'); if (allNumbers) { return ScaleType.LINEAR; } return ScaleType.ORDINAL; } export function reduceTicks(ticks, maxTicks) { if (ticks.length > maxTicks) { const modulus = Math.floor(ticks.length / maxTicks); return ticks.reduce((acc, _tick, i) => { if (i % modulus === 0) { return [...acc, ticks[i]]; } return acc; }, []); } return ticks; } /** * Generates a short id. * http://stackoverflow.com/questions/6248666/how-to-generate-short-uid-like-ax4j9z-in-js */ export function generateUID() { const newId = ('0000' + Math.trunc(Math.random() * Math.pow(36, 4)).toString(36)).slice(-4); // append a 'a' because neo gets mad return `a${newId}`; } export function calculateViewDimensions({ width, height, margin, showXLabel, showYLabel, }) { let chartWidth = width - margin.left - margin.right; let chartHeight = height - margin.top - margin.bottom; let xOffset = margin.left; if (showYLabel) { const xLabelOffset = 30; chartWidth -= xLabelOffset; xOffset += xLabelOffset; } if (showXLabel) { chartHeight -= 20; } return { width: chartWidth, height: chartHeight - 18, xOffset, margin, }; } export function defaultXAccessor(d) { return get(d, [0], 0) * 1000; } export function defaultYAccessor(d) { return +get(d, [1], 0); } export function findClosestPointIndex(xPos, context) { const count = context.chartData?.[0].values.length; return Math.floor((xPos * count) / context.chartView.width); } export function getXPos(e, context, rectDom) { const svgE = e.target; const { scrollLeft, scrollTop } = document.documentElement; return context.horizontal ? e.pageY - ((rectDom || svgE).getBoundingClientRect().top + scrollTop) : e.pageX - ((rectDom || svgE).getBoundingClientRect().left + scrollLeft); } export function getMouseXPoint(e, contextService, rectDom) { const xPos = getXPos(e, contextService, rectDom); const closestIndex = findClosestPointIndex(xPos, contextService); const xValue = contextService.xSeriesValue[closestIndex]; return { xValue, xPoint: contextService.x(xValue), }; } export function minimumFormat(value) { return value > 0 && value < 0.01 ? '<0.01' : value; } export function tooltipSuffixFormat(value) { return value === '%' ? value : ` ${value}`; } const NULL_TYPE = new Set([null, undefined]); export function defined(d) { return !(NULL_TYPE.has(d.x) || NULL_TYPE.has(d.y)); } export function integerTooltipFormat({ y }) { return Math.floor(y); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvY2hhcnQvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFRaEMsTUFBTSxDQUFOLElBQVksU0FJWDtBQUpELFdBQVksU0FBUztJQUNuQiwwQkFBZSxDQUFBO0lBQ2YsOEJBQW1CLENBQUE7SUFDbkIsZ0NBQXFCLENBQUE7QUFDdkIsQ0FBQyxFQUpXLFNBQVMsS0FBVCxTQUFTLFFBSXBCO0FBRUQsTUFBTSxVQUFVLFVBQVUsQ0FBQyxJQUFlO0lBQ3hDLE9BQU8sY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzlCLENBQUM7QUFFRCxNQUFNLFVBQVUsVUFBVSxDQUFDLElBQWUsRUFBRSxTQUFvQjtJQUM5RCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDM0QsT0FBTyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFDLElBQWU7SUFDckMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUNoQixDQUFDLEdBQWEsRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUNyQixNQUFNLEtBQUssR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDeEIsT0FBTztZQUNMLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUs7WUFDakMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FB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RCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBkYXlqcyBmcm9tICdkYXlqcyc7XG5pbXBvcnQgeyBnZXQgfSBmcm9tICdsb2Rhc2gtZXMnO1xuXG5pbXBvcnQgeyBDaGFydERhdGFJdGVtIH0gZnJvbSAnLi4vdmlldy1jaGFydC90eXBlcyc7XG5cbmltcG9ydCB7IENvbnRleHRDaGFydFNlcnZpY2UgfSBmcm9tICcuL2NoYXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29udGV4dEl0ZW0gfSBmcm9tICcuL2NvbW1vbi9wdWJsaWMtYXBpJztcbmltcG9ydCB7IFRpY2tWYWx1ZSwgVmlld09wdGlvbnMgfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGVudW0gU2NhbGVUeXBlIHtcbiAgJ1RJTUUnID0gJ3RpbWUnLFxuICAnTElORUFSJyA9ICdsaW5lYXInLFxuICAnT1JESU5BTCcgPSAnb3JkaW5hbCcsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRZRG9tYWluKGRhdGE6IHVua25vd25bXSkge1xuICByZXR1cm4gZ2V0TWF4TWluVmFsdWUoZGF0YSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRYRG9tYWluKGRhdGE6IHVua25vd25bXSwgc2NhbGVUeXBlOiBTY2FsZVR5cGUpIHtcbiAgaWYgKFtTY2FsZVR5cGUuVElNRSwgU2NhbGVUeXBlLkxJTkVBUl0uaW5jbHVkZXMoc2NhbGVUeXBlKSkge1xuICAgIHJldHVybiBnZXRNYXhNaW5WYWx1ZShkYXRhKTtcbiAgfVxuICByZXR1cm4gZGF0YTtcbn1cblxuZnVuY3Rpb24gZ2V0TWF4TWluVmFsdWUoZGF0YTogdW5rbm93bltdKTogW251bWJlciwgbnVtYmVyXSB7XG4gIHJldHVybiBkYXRhLnJlZHVjZShcbiAgICAoYWNjOiBudW1iZXJbXSwgcHJlKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9ICtwcmUgfHwgMDtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIGFjY1swXSA8ICt2YWx1ZSA/IGFjY1swXSA6ICt2YWx1ZSxcbiAgICAgICAgYWNjWzFdID4gK3ZhbHVlID8gYWNjWzFdIDogK3ZhbHVlLFxuICAgICAgXTtcbiAgICB9LFxuICAgIFsrZGF0YVswXSwgK2RhdGFbMF1dLFxuICApIGFzIFtudW1iZXIsIG51bWJlcl07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY2FsZVR5cGUodmFsdWVzOiBBcnJheTxzdHJpbmcgfCBudW1iZXIgfCBEYXRlPik6IFNjYWxlVHlwZSB7XG4gIGNvbnN0IGFsbERhdGVzID0gdmFsdWVzPy5ldmVyeShcbiAgICB2YWx1ZSA9PiB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgfHwgZGF5anModmFsdWUpLmlzVmFsaWQoKSxcbiAgKTtcbiAgaWYgKGFsbERhdGVzKSB7XG4gICAgcmV0dXJuIFNjYWxlVHlwZS5USU1FO1xuICB9XG4gIGNvbnN0IGFsbE51bWJlcnMgPSB2YWx1ZXM/LmV2ZXJ5KHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpO1xuICBpZiAoYWxsTnVtYmVycykge1xuICAgIHJldHVybiBTY2FsZVR5cGUuTElORUFSO1xuICB9XG4gIHJldHVybiBTY2FsZVR5cGUuT1JESU5BTDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZHVjZVRpY2tzKHRpY2tzOiB1bmtub3duW10sIG1heFRpY2tzOiBudW1iZXIpIHtcbiAgaWYgKHRpY2tzLmxlbmd0aCA+IG1heFRpY2tzKSB7XG4gICAgY29uc3QgbW9kdWx1cyA9IE1hdGguZmxvb3IodGlja3MubGVuZ3RoIC8gbWF4VGlja3MpO1xuICAgIHJldHVybiB0aWNrcy5yZWR1Y2UoKGFjYzogdW5rbm93bltdLCBfdGljaywgaSkgPT4ge1xuICAgICAgaWYgKGkgJSBtb2R1bHVzID09PSAwKSB7XG4gICAgICAgIHJldHVybiBbLi4uYWNjLCB0aWNrc1tpXV07XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIFtdKSBhcyB1bmtub3duW107XG4gIH1cbiAgcmV0dXJuIHRpY2tzO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHNob3J0IGlkLlxuICogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy82MjQ4NjY2L2hvdy10by1nZW5lcmF0ZS1zaG9ydC11aWQtbGlrZS1heDRqOXotaW4tanNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlVUlEKCk6IHN0cmluZyB7XG4gIGNvbnN0IG5ld0lkID0gKFxuICAgICcwMDAwJyArIE1hdGgudHJ1bmMoTWF0aC5yYW5kb20oKSAqIE1hdGgucG93KDM2LCA0KSkudG9TdHJpbmcoMzYpXG4gICkuc2xpY2UoLTQpO1xuICAvLyBhcHBlbmQgYSAnYScgYmVjYXVzZSBuZW8gZ2V0cyBtYWRcbiAgcmV0dXJuIGBhJHtuZXdJZH1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlVmlld0RpbWVuc2lvbnMoe1xuICB3aWR0aCxcbiAgaGVpZ2h0LFxuICBtYXJnaW4sXG4gIHNob3dYTGFiZWwsXG4gIHNob3dZTGFiZWwsXG59OiBWaWV3T3B0aW9ucykge1xuICBsZXQgY2hhcnRXaWR0aCA9IHdpZHRoIC0gbWFyZ2luLmxlZnQgLSBtYXJnaW4ucmlnaHQ7XG4gIGxldCBjaGFydEhlaWdodCA9IGhlaWdodCAtIG1hcmdpbi50b3AgLSBtYXJnaW4uYm90dG9tO1xuICBsZXQgeE9mZnNldCA9IG1hcmdpbi5sZWZ0O1xuICBpZiAoc2hvd1lMYWJlbCkge1xuICAgIGNvbnN0IHhMYWJlbE9mZnNldCA9IDMwO1xuICAgIGNoYXJ0V2lkdGggLT0geExhYmVsT2Zmc2V0O1xuICAgIHhPZmZzZXQgKz0geExhYmVsT2Zmc2V0O1xuICB9XG4gIGlmIChzaG93WExhYmVsKSB7XG4gICAgY2hhcnRIZWlnaHQgLT0gMjA7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogY2hhcnRXaWR0aCxcbiAgICBoZWlnaHQ6IGNoYXJ0SGVpZ2h0IC0gMTgsXG4gICAgeE9mZnNldCxcbiAgICBtYXJnaW4sXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0WEFjY2Vzc29yKGQ6IHVua25vd24pIHtcbiAgcmV0dXJuIGdldChkLCBbMF0sIDApICogMTAwMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRZQWNjZXNzb3IoZDogdW5rbm93bikge1xuICByZXR1cm4gK2dldChkLCBbMV0sIDApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZENsb3Nlc3RQb2ludEluZGV4KFxuICB4UG9zOiBudW1iZXIsXG4gIGNvbnRleHQ6IENvbnRleHRDaGFydFNlcnZpY2UsXG4pIHtcbiAgY29uc3QgY291bnQgPSBjb250ZXh0LmNoYXJ0RGF0YT8uWzBdLnZhbHVlcy5sZW5ndGg7XG4gIHJldHVybiBNYXRoLmZsb29yKCh4UG9zICogY291bnQpIC8gY29udGV4dC5jaGFydFZpZXcud2lkdGgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0WFBvcyhcbiAgZTogTW91c2VFdmVudCxcbiAgY29udGV4dDogQ29udGV4dENoYXJ0U2VydmljZSxcbiAgcmVjdERvbT86IEhUTUxFbGVtZW50LFxuKSB7XG4gIGNvbnN0IHN2Z0UgPSBlLnRhcmdldCBhcyBTVkdSZWN0RWxlbWVudDtcbiAgY29uc3QgeyBzY3JvbGxMZWZ0LCBzY3JvbGxUb3AgfSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgcmV0dXJuIGNvbnRleHQuaG9yaXpvbnRhbFxuICAgID8gZS5wYWdlWSAtICgocmVjdERvbSB8fCBzdmdFKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyBzY3JvbGxUb3ApXG4gICAgOiBlLnBhZ2VYIC0gKChyZWN0RG9tIHx8IHN2Z0UpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgKyBzY3JvbGxMZWZ0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1vdXNlWFBvaW50KFxuICBlOiBNb3VzZUV2ZW50LFxuICBjb250ZXh0U2VydmljZTogQ29udGV4dENoYXJ0U2VydmljZSxcbiAgcmVjdERvbT86IEhUTUxFbGVtZW50LFxuKSB7XG4gIGNvbnN0IHhQb3MgPSBnZXRYUG9zKGUsIGNvbnRleHRTZXJ2aWNlLCByZWN0RG9tKTtcbiAgY29uc3QgY2xvc2VzdEluZGV4ID0gZmluZENsb3Nlc3RQb2ludEluZGV4KHhQb3MsIGNvbnRleHRTZXJ2aWNlKTtcbiAgY29uc3QgeFZhbHVlID0gY29udGV4dFNlcnZpY2UueFNlcmllc1ZhbHVlW2Nsb3Nlc3RJbmRleF0gYXMgVGlja1ZhbHVlO1xuICByZXR1cm4ge1xuICAgIHhWYWx1ZSxcbiAgICB4UG9pbnQ6IGNvbnRleHRTZXJ2aWNlLngoeFZhbHVlKSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1pbmltdW1Gb3JtYXQodmFsdWU6IG51bWJlcikge1xuICByZXR1cm4gdmFsdWUgPiAwICYmIHZhbHVlIDwgMC4wMSA/ICc8MC4wMScgOiB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvb2x0aXBTdWZmaXhGb3JtYXQodmFsdWU6IHN0cmluZykge1xuICByZXR1cm4gdmFsdWUgPT09ICclJyA/IHZhbHVlIDogYCAke3ZhbHVlfWA7XG59XG5cbmNvbnN0IE5VTExfVFlQRTogU2V0PHVua25vd24+ID0gbmV3IFNldChbbnVsbCwgdW5kZWZpbmVkXSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVkKGQ6IENoYXJ0RGF0YUl0ZW0pIHtcbiAgcmV0dXJuICEoTlVMTF9UWVBFLmhhcyhkLngpIHx8IE5VTExfVFlQRS5oYXMoZC55KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnRlZ2VyVG9vbHRpcEZvcm1hdCh7IHkgfTogQ29udGV4dEl0ZW0pIHtcbiAgcmV0dXJuIE1hdGguZmxvb3IoeSk7XG59XG4iXX0=