(function (factory) { typeof define === 'function' && define.amd ? define(factory) : factory(); })((function () { 'use strict'; // import * as echarts from 'echarts'; const { merge } = window._; // form config.js const echartSetOption = ( chart, userOptions, getDefaultOptions, responsiveOptions ) => { const { breakpoints, resize } = window.phoenix.utils; const handleResize = options => { Object.keys(options).forEach(item => { if (window.innerWidth > breakpoints[item]) { chart.setOption(options[item]); } }); }; const themeController = document.body; // Merge user options with lodash chart.setOption(merge(getDefaultOptions(), userOptions)); const navbarVerticalToggle = document.querySelector( '.navbar-vertical-toggle' ); if (navbarVerticalToggle) { navbarVerticalToggle.addEventListener('navbar.vertical.toggle', () => { chart.resize(); if (responsiveOptions) { handleResize(responsiveOptions); } }); } resize(() => { chart.resize(); if (responsiveOptions) { handleResize(responsiveOptions); } }); if (responsiveOptions) { handleResize(responsiveOptions); } themeController.addEventListener( 'clickControl', ({ detail: { control } }) => { if (control === 'phoenixTheme') { chart.setOption(window._.merge(getDefaultOptions(), userOptions)); } if (responsiveOptions) { handleResize(responsiveOptions); } } ); }; // -------------------end config.js-------------------- const echartTabs = document.querySelectorAll('[data-tab-has-echarts]'); if (echartTabs) { echartTabs.forEach(tab => { tab.addEventListener('shown.bs.tab', e => { const el = e.target; const { hash } = el; const id = hash || el.dataset.bsTarget; const content = document.getElementById(id.substring(1)); const chart = content?.querySelector('[data-echart-tab]'); if (chart) { window.echarts.init(chart).resize(); } }); }); } const tooltipFormatter = (params, dateFormatter = 'MMM DD') => { let tooltipItem = ``; params.forEach(el => { tooltipItem += `
${el.seriesName} : ${ typeof el.value === 'object' ? el.value[1] : el.value }
`; }); return `

${ window.dayjs(params[0].axisValue).isValid() ? window.dayjs(params[0].axisValue).format(dateFormatter) : params[0].axisValue }

${tooltipItem}
`; }; const handleTooltipPosition = ([pos, , dom, , size]) => { // only for mobile device if (window.innerWidth <= 540) { const tooltipHeight = dom.offsetHeight; const obj = { top: pos[1] - tooltipHeight - 20 }; obj[pos[0] < size.viewSize[0] / 2 ? 'left' : 'right'] = 5; return obj; } return null; // else default behaviour }; // dayjs.extend(advancedFormat); /* -------------------------------------------------------------------------- */ /* Echarts Total Sales */ /* -------------------------------------------------------------------------- */ // dayjs.extend(advancedFormat); /* -------------------------------------------------------------------------- */ /* Echarts Total Sales */ /* -------------------------------------------------------------------------- */ const contactsCreatedChartInit = () => { const { getColor, getData, getPastDates } = window.phoenix.utils; const $chartEl = document.querySelector('.echart-contacts-created'); const dates = getPastDates(9); const data1 = [24, 14, 30, 24, 32, 32, 18, 12, 32]; const data2 = [36, 28, 36, 39, 54, 38, 22, 34, 52]; if ($chartEl) { const userOptions = getData($chartEl, 'echarts'); const chart = window.echarts.init($chartEl); const getDefaultOptions = () => ({ color: [getColor('primary'), getColor('tertiary-bg')], tooltip: { trigger: 'axis', padding: [7, 10], backgroundColor: getColor('body-highlight-bg'), borderColor: getColor('border-color'), textStyle: { color: getColor('light-text-emphasis') }, borderWidth: 1, transitionDuration: 0, axisPointer: { type: 'none' }, formatter: params => tooltipFormatter(params), extraCssText: 'z-index: 1000' }, xAxis: { type: 'category', // boundaryGap: false, axisLabel: { color: getColor('secondary-color'), formatter: value => window.dayjs(value).format('D MMM, YY'), fontFamily: 'Nunito Sans', fontWeight: 600, fontSize: 10.24, padding: [0, 0, 0, 20] }, splitLine: { show: true, interval: '10', lineStyle: { color: getColor('tertiary-bg') } }, show: true, interval: 10, data: dates, axisLine: { lineStyle: { color: getColor('tertiary-bg') } }, axisTick: false }, yAxis: { axisPointer: { type: 'none' }, position: 'right', axisTick: 'none', splitLine: { interval: 5, lineStyle: { color: getColor('secondary-bg') } }, axisLine: { show: false }, axisLabel: { fontFamily: 'Nunito Sans', fontWeight: 700, fontSize: 12.8, color: getColor('body-color'), margin: 20, verticalAlign: 'top', formatter: value => `${value.toLocaleString()}` } }, series: [ { name: 'Actual revenue', type: 'bar', data: data1, barWidth: '4px', barGap: '3', label: { show: true, position: 'top', color: getColor('body-color'), fontWeight: 'bold', fontSize: '10.24px' }, z: 10, itemStyle: { borderRadius: [2, 2, 0, 0], color: getColor('tertiary-bg') } }, { name: 'Projected revenue', type: 'bar', barWidth: '4px', data: data2, label: { show: true, position: 'top', color: getColor('primary'), fontWeight: 'bold', fontSize: '10.24px' }, itemStyle: { borderRadius: [2, 2, 0, 0], color: getColor('primary') } } ], grid: { right: 3, left: 6, bottom: 0, top: '5%', containLabel: true }, animation: false }); const responsiveOptions = { xs: { series: [ { label: { show: false } }, { label: { show: false } } ] } }; echartSetOption(chart, userOptions, getDefaultOptions, responsiveOptions); } }; /* -------------------------------------------------------------------------- */ /* Echart Bar Member info */ /* -------------------------------------------------------------------------- */ const newUsersChartsInit = () => { const { getColor, getData, getPastDates, rgbaColor } = window.phoenix.utils; const $echartnewUsersCharts = document.querySelector('.echarts-new-users'); const tooltipFormatter = params => { const currentDate = window.dayjs(params[0].axisValue); const prevDate = window.dayjs(params[0].axisValue).subtract(1, 'month'); const result = params.map((param, index) => ({ value: param.value, date: index > 0 ? prevDate : currentDate, color: param.color })); let tooltipItem = ``; result.forEach((el, index) => { tooltipItem += `
${el.date.format('MMM DD')} : ${el.value}
`; }); return `
${tooltipItem}
`; }; if ($echartnewUsersCharts) { const userOptions = getData($echartnewUsersCharts, 'echarts'); const chart = window.echarts.init($echartnewUsersCharts); const dates = getPastDates(12); const getDefaultOptions = () => ({ tooltip: { trigger: 'axis', padding: 10, backgroundColor: getColor('body-highlight-bg'), borderColor: getColor('border-color'), textStyle: { color: getColor('light-text-emphasis') }, borderWidth: 1, transitionDuration: 0, axisPointer: { type: 'none' }, formatter: tooltipFormatter, extraCssText: 'z-index: 1000' }, xAxis: [ { type: 'category', data: dates, show: true, boundaryGap: false, axisLine: { show: false }, axisTick: { show: false }, axisLabel: { formatter: value => window.dayjs(value).format('DD MMM, YY'), showMinLabel: true, showMaxLabel: false, color: getColor('secondary-color'), align: 'left', interval: 5, fontFamily: 'Nunito Sans', fontWeight: 600, fontSize: 12.8 } }, { type: 'category', position: 'bottom', show: true, data: dates, axisLabel: { formatter: value => window.dayjs(value).format('DD MMM, YY'), interval: 130, showMaxLabel: true, showMinLabel: false, color: getColor('secondary-color'), align: 'right', fontFamily: 'Nunito Sans', fontWeight: 600, fontSize: 12.8 }, axisLine: { show: false }, axisTick: { show: false }, splitLine: { show: false }, boundaryGap: false } ], yAxis: { show: false, type: 'value', boundaryGap: false }, series: [ { type: 'line', data: [220, 220, 150, 150, 150, 250, 250, 400, 400, 400, 300, 300], lineStyle: { width: 2, color: getColor('info') }, areaStyle: { color: { type: 'linear', x: 0, y: 0, x2: 0, y2: 1, colorStops: [ { offset: 0, color: rgbaColor(getColor('info'), 0.2) }, { offset: 1, color: rgbaColor(getColor('info'), 0) } ] } }, showSymbol: false, symbol: 'circle', zlevel: 1 } ], grid: { left: 0, right: 0, top: 5, bottom: 20 } }); echartSetOption(chart, userOptions, getDefaultOptions); } }; /* -------------------------------------------------------------------------- */ /* Echart Bar Member info */ /* -------------------------------------------------------------------------- */ const newLeadsChartsInit = () => { const { getColor, getData, getPastDates, rgbaColor } = window.phoenix.utils; const $echartnewLeadsCharts = document.querySelector('.echarts-new-leads'); const tooltipFormatter = params => { const currentDate = window.dayjs(params[0].axisValue); const prevDate = window.dayjs(params[0].axisValue).subtract(1, 'month'); const result = params.map((param, index) => ({ value: param.value, date: index > 0 ? prevDate : currentDate, color: param.color })); let tooltipItem = ``; result.forEach((el, index) => { tooltipItem += `
${el.date.format('MMM DD')} : ${el.value}
`; }); return `
${tooltipItem}
`; }; if ($echartnewLeadsCharts) { const userOptions = getData($echartnewLeadsCharts, 'echarts'); const chart = window.echarts.init($echartnewLeadsCharts); const dates = getPastDates(11); const getDefaultOptions = () => ({ tooltip: { trigger: 'axis', padding: 10, backgroundColor: getColor('body-highlight-bg'), borderColor: getColor('border-color'), textStyle: { color: getColor('light-text-emphasis') }, borderWidth: 1, transitionDuration: 0, axisPointer: { type: 'none' }, formatter: tooltipFormatter, extraCssText: 'z-index: 1000' }, xAxis: [ { type: 'category', data: dates, show: true, boundaryGap: false, axisLine: { show: false }, axisTick: { show: false }, axisLabel: { formatter: value => window.dayjs(value).format('DD MMM, YY'), showMinLabel: true, showMaxLabel: false, color: getColor('secondary-color'), align: 'left', interval: 5, fontFamily: 'Nunito Sans', fontWeight: 600, fontSize: 12.8 } }, { type: 'category', position: 'bottom', show: true, data: dates, axisLabel: { formatter: value => window.dayjs(value).format('DD MMM, YY'), interval: 130, showMaxLabel: true, showMinLabel: false, color: getColor('secondary-color'), align: 'right', fontFamily: 'Nunito Sans', fontWeight: 600, fontSize: 12.8 }, axisLine: { show: false }, axisTick: { show: false }, splitLine: { show: false }, boundaryGap: false } ], yAxis: { show: false, type: 'value', boundaryGap: false }, series: [ { type: 'line', data: [100, 100, 260, 250, 270, 160, 190, 180, 260, 200, 220], lineStyle: { width: 2, color: getColor('primary') }, areaStyle: { color: { type: 'linear', x: 0, y: 0, x2: 0, y2: 1, colorStops: [ { offset: 0, color: rgbaColor(getColor('primary'), 0.2) }, { offset: 1, color: rgbaColor(getColor('primary'), 0) } ] } }, showSymbol: false, symbol: 'circle', zlevel: 1 } ], grid: { left: 0, right: 0, top: 5, bottom: 20 } }); echartSetOption(chart, userOptions, getDefaultOptions); } }; /* -------------------------------------------------------------------------- */ /* Echarts Total Sales */ /* -------------------------------------------------------------------------- */ const addClicksChartInit = () => { const { getColor, getData, getPastDates, getItemFromStore } = window.phoenix.utils; const $addClicksChart = document.querySelector('.echart-add-clicks-chart'); // getItemFromStore('phoenixTheme') const dates = getPastDates(11); const currentMonthData = [ 2000, 2250, 1070, 1200, 1000, 1450, 3100, 2900, 1800, 1450, 1700 ]; const prevMonthData = [ 1100, 1200, 2700, 1700, 2100, 2000, 2300, 1200, 2600, 2900, 1900 ]; const tooltipFormatter = params => { const currentDate = window.dayjs(params[0].axisValue); const prevDate = window.dayjs(params[0].axisValue).subtract(1, 'month'); const result = params.map((param, index) => ({ value: param.value, date: index > 0 ? prevDate : currentDate, color: param.color })); let tooltipItem = ``; result.forEach((el, index) => { tooltipItem += `
${el.date.format('MMM DD')} : ${el.value}
`; }); return `
${tooltipItem}
`; }; if ($addClicksChart) { const userOptions = getData($addClicksChart, 'echarts'); const chart = window.echarts.init($addClicksChart); const getDefaultOptions = () => ({ // color: [getColor('primary'), getColor('info')], tooltip: { trigger: 'axis', padding: 10, backgroundColor: getColor('body-highlight-bg'), borderColor: getColor('border-color'), textStyle: { color: getColor('light-text-emphasis') }, borderWidth: 1, transitionDuration: 0, axisPointer: { type: 'none' }, formatter: tooltipFormatter, extraCssText: 'z-index: 1000' }, xAxis: [ { type: 'category', data: dates, axisLabel: { formatter: value => window.dayjs(value).format('DD MMM, YY'), interval: 3, showMinLabel: true, showMaxLabel: false, color: getColor('secondary-color'), align: 'left', fontFamily: 'Nunito Sans', fontWeight: 700, fontSize: 12.8, margin: 15 }, axisLine: { show: true, lineStyle: { color: getColor('tertiary-bg') } }, axisTick: { show: true, interval: 5 }, boundaryGap: false }, { type: 'category', position: 'bottom', data: dates, axisLabel: { formatter: value => window.dayjs(value).format('DD MMM, YY'), interval: 130, showMaxLabel: true, showMinLabel: false, color: getColor('body-color'), align: 'right', fontFamily: 'Nunito Sans', fontWeight: 700, fontSize: 12.8, margin: 15 }, axisLine: { show: true, lineStyle: { color: getColor('tertiary-bg') } }, axisTick: { show: true }, splitLine: { show: false }, boundaryGap: false } ], yAxis: { axisPointer: { type: 'none' }, axisTick: 'none', splitLine: { show: true, lineStyle: { color: getItemFromStore('phoenixTheme') === 'dark' ? getColor('body-highlight-bg') : getColor('secondary-bg') } }, axisLine: { show: false }, axisLabel: { show: true, fontFamily: 'Nunito Sans', fontWeight: 700, fontSize: 12.8, color: getColor('body-color'), margin: 25, // verticalAlign: 'bottom', formatter: value => `${value / 1000}k` } // axisLabel: { show: true } }, series: [ { name: 'e', type: 'line', data: prevMonthData, // symbol: 'none', lineStyle: { type: 'line', width: 3, color: getColor('info-lighter') }, showSymbol: false, symbol: 'emptyCircle', symbolSize: 6, itemStyle: { color: getColor('info-lighter'), borderWidth: 3 }, zlevel: 2 }, { name: 'd', type: 'line', data: currentMonthData, showSymbol: false, symbol: 'emptyCircle', symbolSize: 6, itemStyle: { color: getColor('primary'), borderWidth: 3 }, lineStyle: { type: 'line', width: 3, color: getColor('primary') }, zlevel: 1 } ], grid: { right: 2, left: 5, bottom: '10px', top: '2%', containLabel: true }, animation: false }); echartSetOption(chart, userOptions, getDefaultOptions); } }; // dayjs.extend(advancedFormat); /* -------------------------------------------------------------------------- */ /* Echarts Total Sales */ /* -------------------------------------------------------------------------- */ const echartsLeadConversiontInit = () => { const { getColor, getData, getPastDates, toggleColor } = window.phoenix.utils; const $leadConversionChartEl = document.querySelector( '.echart-lead-conversion' ); const dates = getPastDates(4); const tooltipFormatter = params => { let tooltipItem = ``; params.forEach(el => { tooltipItem += `
${el.axisValue} : ${el.value}
`; }); return `
${tooltipItem}
`; }; if ($leadConversionChartEl) { const userOptions = getData($leadConversionChartEl, 'echarts'); const chart = window.echarts.init($leadConversionChartEl); const getDefaultOptions = () => ({ color: [getColor('primary'), getColor('tertiary-bg')], tooltip: { trigger: 'axis', padding: [7, 10], backgroundColor: getColor('body-highlight-bg'), borderColor: getColor('border-color'), textStyle: { color: getColor('light-text-emphasis') }, borderWidth: 1, transitionDuration: 0, axisPointer: { type: 'none' }, formatter: params => tooltipFormatter(params), extraCssText: 'z-index: 1000' }, xAxis: { type: 'value', inverse: true, axisLabel: { show: false }, show: false, data: dates, axisLine: { lineStyle: { color: getColor('tertiary-bg') } }, axisTick: false }, yAxis: { data: ['Closed Won', 'Objection', 'Offer', 'Qualify Lead', 'Created'], type: 'category', axisPointer: { type: 'none' }, axisTick: 'none', splitLine: { interval: 5, lineStyle: { color: getColor('secondary-bg') } }, axisLine: { show: false }, axisLabel: { show: true, align: 'left', margin: 100, color: getColor('body-color') } }, series: { name: 'Lead Conversion', type: 'bar', barWidth: '20px', showBackground: true, backgroundStyle: { borderRadius: [4, 0, 0, 4] }, data: [ { value: 1060, itemStyle: { color: toggleColor( getColor('success-lighter'), getColor('success-dark') ), borderRadius: [4, 0, 0, 4] }, emphasis: { itemStyle: { color: toggleColor( getColor('success-light'), getColor('success-dark') ) }, label: { formatter: () => `{b| 53% }`, rich: { b: { color: getColor('white') } } } }, label: { show: true, position: 'inside', formatter: () => `{b| 53%}`, rich: { b: { color: toggleColor( getColor('success-dark'), getColor('success-subtle') ), fontWeight: 500, padding: [0, 5, 0, 0] } } } }, // -- { value: 1200, itemStyle: { color: toggleColor( getColor('info-lighter'), getColor('info-dark') ), borderRadius: [4, 0, 0, 4] }, emphasis: { itemStyle: { color: toggleColor( getColor('info-light'), getColor('info-dark') ) }, label: { formatter: () => `{b| 60% }`, rich: { b: { color: getColor('white') } } } }, label: { show: true, position: 'inside', formatter: () => `{b| 60%}`, rich: { b: { color: toggleColor( getColor('info-dark'), getColor('info-bg-subtle') ), fontWeight: 500, padding: [0, 5, 0, 0] } } } }, { value: 1600, itemStyle: { color: toggleColor( getColor('primary-lighter'), getColor('primary-dark') ), borderRadius: [4, 0, 0, 4] }, emphasis: { itemStyle: { color: toggleColor( getColor('primary-light'), getColor('primary-dark') ) }, label: { formatter: () => `{b| 80% }`, rich: { b: { color: getColor('white') } } } }, label: { show: true, position: 'inside', formatter: () => `{b| 80% }`, rich: { b: { color: toggleColor( getColor('primary-dark'), getColor('primary-bg-subtle') ), fontWeight: 500, padding: [0, 5, 0, 0] } } } }, { value: 1800, itemStyle: { color: toggleColor( getColor('warning-lighter'), getColor('warning-dark') ), borderRadius: [4, 0, 0, 4] }, emphasis: { itemStyle: { color: toggleColor( getColor('warning-light'), getColor('warning-dark') ) }, label: { formatter: () => `{b| 90% }`, rich: { b: { color: getColor('white') } } } }, label: { show: true, position: 'inside', formatter: () => `{b|90%}`, rich: { b: { color: toggleColor( getColor('warning-dark'), getColor('warning-bg-subtle') ), fontWeight: 500, padding: [0, 5, 0, 0] } } } }, { value: 2000, itemStyle: { color: toggleColor( getColor('danger-lighter'), getColor('danger-dark') ), borderRadius: [4, 0, 0, 4] }, emphasis: { itemStyle: { color: toggleColor( getColor('danger-light'), getColor('danger-dark') ) }, label: { formatter: () => `{a|100%}`, rich: { a: { color: getColor('white') } } } }, label: { show: true, position: 'inside', formatter: () => `{a|100%}`, rich: { a: { color: toggleColor( getColor('danger-dark'), getColor('danger-bg-subtle') ), fontWeight: 500 } } } } ], barGap: '50%' }, grid: { right: 5, left: 100, bottom: 0, top: '5%', containLabel: false }, animation: false }); const responsiveOptions = { xs: { yAxis: { show: false }, grid: { left: 0 } }, sm: { yAxis: { show: true }, grid: { left: 100 } } }; echartSetOption(chart, userOptions, getDefaultOptions, responsiveOptions); } }; // dayjs.extend(advancedFormat); /* -------------------------------------------------------------------------- */ /* Echarts Total Sales */ /* -------------------------------------------------------------------------- */ const echartsRevenueTargetInit = () => { const { getColor, getData } = window.phoenix.utils; const $leadConversionChartEl = document.querySelector( '.echart-revenue-target-conversion' ); const tooltipFormatter = (params = 'MMM DD') => { let tooltipItem = ``; params.forEach(el => { tooltipItem += `
${el.seriesName} : $${el.value.toLocaleString()}
`; }); return `

${params[0].axisValue}

${tooltipItem}
`; }; const data1 = [42000, 35000, 35000, 40000]; const data2 = [30644, 33644, 28644, 38644]; if ($leadConversionChartEl) { const userOptions = getData($leadConversionChartEl, 'echarts'); const chart = window.echarts.init($leadConversionChartEl); const getDefaultOptions = () => ({ color: [getColor('primary'), getColor('tertiary-bg')], tooltip: { trigger: 'axis', padding: [7, 10], backgroundColor: getColor('body-highlight-bg'), borderColor: getColor('border-color'), textStyle: { color: getColor('light-text-emphasis') }, borderWidth: 1, transitionDuration: 0, axisPointer: { type: 'none' }, formatter: params => tooltipFormatter(params), extraCssText: 'z-index: 1000' }, xAxis: { type: 'value', axisLabel: { show: true, interval: 3, showMinLabel: true, showMaxLabel: false, color: getColor('quaternary-color'), align: 'left', fontFamily: 'Nunito Sans', fontWeight: 400, fontSize: 12.8, margin: 10, formatter: value => `${value / 1000}k` }, show: true, axisLine: { lineStyle: { color: getColor('tertiary-bg') } }, axisTick: false, splitLine: { show: false } }, yAxis: { data: ['Luxemburg', 'Canada', 'Australia', 'India'], type: 'category', axisPointer: { type: 'none' }, axisTick: 'none', splitLine: { interval: 5, lineStyle: { color: getColor('secondary-bg') } }, axisLine: { show: false }, axisLabel: { show: true, margin: 21, color: getColor('body-color') } }, series: [ { name: 'Target', type: 'bar', label: { show: false }, emphasis: { disabled: true }, showBackground: true, backgroundStyle: { color: getColor('body-highlight-bg') }, barWidth: '30px', barGap: '-100%', data: data1, itemStyle: { borderWidth: 4, color: getColor('secondary-bg'), borderColor: getColor('secondary-bg') } }, { name: 'Gained', type: 'bar', emphasis: { disabled: true }, label: { show: true, color: getColor('white'), fontWeight: 700, fontFamily: 'Nunito Sans', fontSize: 12.8, formatter: value => `$${value.value.toLocaleString()}` }, // showBackground: true, backgroundStyle: { color: getColor('body-highlight-bg') }, barWidth: '30px', data: data2, itemStyle: { borderWidth: 4, color: getColor('primary-light'), borderColor: getColor('secondary-bg') } } ], grid: { right: 0, left: 0, bottom: 8, top: 0, containLabel: true }, animation: false }); echartSetOption(chart, userOptions, getDefaultOptions); } }; const { docReady } = window.phoenix.utils; docReady(contactsCreatedChartInit); docReady(newUsersChartsInit); docReady(newLeadsChartsInit); docReady(addClicksChartInit); docReady(echartsLeadConversiontInit); docReady(echartsRevenueTargetInit); })); //# sourceMappingURL=crm-dashboard.js.map