/** * Academy Dashboard charts and datatable */ 'use strict'; // Hour pie chart document.addEventListener('DOMContentLoaded', function (e) { let labelColor, headingColor, borderColor, fontFamily; labelColor = config.colors.textMuted; headingColor = config.colors.headingColor; borderColor = config.colors.borderColor; fontFamily = config.fontFamily; // Donut Chart Colors const chartColors = { donut: { series1: 'color-mix(in sRGB, ' + config.colors.success + ' 80%, ' + config.colors.black + ')', series2: 'color-mix(in sRGB, ' + config.colors.success + ' 90%, ' + config.colors.black + ')', series3: config.colors.success, series4: 'color-mix(in sRGB, ' + config.colors.success + ' 80%, ' + config.colors.cardColor + ')', series5: 'color-mix(in sRGB, ' + config.colors.success + ' 60%, ' + config.colors.cardColor + ')', series6: 'color-mix(in sRGB, ' + config.colors.success + ' 40%, ' + config.colors.cardColor + ')' } }; const leadsReportChartEl = document.querySelector('#leadsReportChart'), leadsReportChartConfig = { chart: { height: 170, width: 150, parentHeightOffset: 0, type: 'donut' }, labels: ['36h', '56h', '16h', '32h', '56h', '16h'], series: [23, 35, 10, 20, 35, 23], colors: [ chartColors.donut.series1, chartColors.donut.series2, chartColors.donut.series3, chartColors.donut.series4, chartColors.donut.series5, chartColors.donut.series6 ], stroke: { width: 0 }, dataLabels: { enabled: false, formatter: function (val, opt) { return parseInt(val) + '%'; } }, legend: { show: false }, tooltip: { theme: false }, grid: { padding: { top: 0 } }, plotOptions: { pie: { donut: { size: '70%', labels: { show: true, value: { fontSize: '1.125rem', fontFamily: fontFamily, color: headingColor, fontWeight: 500, offsetY: -20, formatter: function (val) { return parseInt(val) + '%'; } }, name: { offsetY: 20, fontFamily: fontFamily }, total: { show: true, fontSize: '.9375rem', label: 'Total', color: labelColor, formatter: function (w) { return '231h'; } } } } } } }; if (typeof leadsReportChartEl !== undefined && leadsReportChartEl !== null) { const leadsReportChart = new ApexCharts(leadsReportChartEl, leadsReportChartConfig); leadsReportChart.render(); } // datatbale bar chart const horizontalBarChartEl = document.querySelector('#horizontalBarChart'), horizontalBarChartConfig = { chart: { height: 300, type: 'bar', toolbar: { show: false } }, plotOptions: { bar: { horizontal: true, barHeight: '60%', distributed: true, startingShape: 'rounded', borderRadiusApplication: 'end', borderRadius: 7 } }, grid: { strokeDashArray: 10, borderColor: borderColor, xaxis: { lines: { show: true } }, yaxis: { lines: { show: false } }, padding: { top: -35, bottom: -12 } }, colors: [ config.colors.primary, config.colors.info, config.colors.success, config.colors.secondary, config.colors.danger, config.colors.warning ], fill: { opacity: [1, 1, 1, 1, 1, 1] }, dataLabels: { enabled: true, style: { colors: [config.colors.white], fontWeight: 400, fontSize: '13px', fontFamily: fontFamily }, formatter: function (val, opts) { return horizontalBarChartConfig.labels[opts.dataPointIndex]; }, offsetX: 0, dropShadow: { enabled: false } }, labels: ['UI Design', 'UX Design', 'Music', 'Animation', 'React', 'SEO'], series: [ { data: [35, 20, 14, 12, 10, 9] } ], xaxis: { categories: ['6', '5', '4', '3', '2', '1'], axisBorder: { show: false }, axisTicks: { show: false }, labels: { style: { colors: labelColor, fontFamily: fontFamily, fontSize: '13px' }, formatter: function (val) { return `${val}%`; } } }, yaxis: { max: 35, labels: { style: { colors: [labelColor], fontFamily: fontFamily, fontSize: '13px' } } }, tooltip: { enabled: true, style: { fontSize: '12px' }, onDatasetHover: { highlightDataSeries: false }, custom: function ({ series, seriesIndex, dataPointIndex, w }) { return '
' + '' + series[seriesIndex][dataPointIndex] + '%' + '
'; } }, legend: { show: false } }; if (typeof horizontalBarChartEl !== undefined && horizontalBarChartEl !== null) { const horizontalBarChart = new ApexCharts(horizontalBarChartEl, horizontalBarChartConfig); horizontalBarChart.render(); } //radial Barchart // Radial bar chart functions function radialBarChart(color, value, show) { const radialBarChartOpt = { chart: { height: show == 'true' ? 58 : 48, width: show == 'true' ? 58 : 38, type: 'radialBar' }, plotOptions: { radialBar: { hollow: { size: show == 'true' ? '50%' : '25%' }, dataLabels: { show: show == 'true' ? true : false, value: { offsetY: -10, fontSize: '15px', fontWeight: 500, fontFamily: fontFamily, color: headingColor } }, track: { background: config.colors_label.secondary } } }, stroke: { lineCap: 'round' }, colors: [color], grid: { padding: { top: show == 'true' ? -12 : -15, bottom: show == 'true' ? -17 : -15, left: show == 'true' ? -17 : -5, right: -15 } }, series: [value], labels: show == 'true' ? [''] : ['Progress'] }; return radialBarChartOpt; } const chartProgressList = document.querySelectorAll('.chart-progress'); if (chartProgressList) { chartProgressList.forEach(function (chartProgressEl) { const color = config.colors[chartProgressEl.dataset.color], series = chartProgressEl.dataset.series; const progress_variant = chartProgressEl.dataset.progress_variant; const optionsBundle = radialBarChart(color, series, progress_variant); const chart = new ApexCharts(chartProgressEl, optionsBundle); chart.render(); }); } // datatable // Variable declaration for table const dt_academy_course = document.querySelector('.datatables-academy-course'), logoObj = { angular: '', figma: '', react: '', art: '', fundamentals: '' }; if (dt_academy_course) { let tableTitle = document.createElement('h5'); tableTitle.classList.add('card-title', 'mb-0', 'text-nowrap', 'text-md-start', 'text-center'); tableTitle.innerHTML = 'Course you are taking'; let dt_course = new DataTable(dt_academy_course, { ajax: assetsPath + 'json/app-academy-dashboard.json', columns: [ // columns according to JSON { data: 'id' }, { data: 'id', orderable: false, render: DataTable.render.select() }, { data: 'course name' }, { data: 'time' }, { data: 'progress' }, { data: 'status' } ], columnDefs: [ { // For Responsive className: 'control', searchable: false, orderable: false, responsivePriority: 2, targets: 0, render: function (data, type, full, meta) { return ''; } }, { // For Checkboxes targets: 1, orderable: false, searchable: false, responsivePriority: 3, checkboxes: true, render: function () { return ''; }, checkboxes: { selectAllRender: '' } }, { targets: 2, responsivePriority: 2, render: (data, type, full) => { const { logo, course, user, image } = full; const output = image ? `Avatar` : (() => { // Generate initials and random state for badge const states = ['success', 'danger', 'warning', 'info', 'dark', 'primary', 'secondary']; const state = states[Math.floor(Math.random() * states.length)]; const initials = (user.match(/\b\w/g) || []).reduce((acc, char) => acc + char.toUpperCase(), ''); return `${initials}`; })(); // Create full row output return `
${logoObj[logo]}
${course}
${output}
${user}
`; } }, { targets: 3, responsivePriority: 3, render: data => { const duration = moment.duration(data); const hours = Math.floor(duration.asHours()); const minutes = Math.floor(duration.asMinutes()) - hours * 60; const formattedTime = `${hours}h ${minutes}m`; return `${formattedTime}`; } }, { targets: 4, render: (data, type, full) => { const { status: statusNumber, number: averageNumber } = full; return `

${statusNumber}

${averageNumber}
`; } }, { targets: 5, render: (data, type, full) => { const { user_number: userNumber, note, view } = full; return `
${userNumber}
${note}
${view}
`; } } ], select: { style: 'multi', selector: 'td:nth-child(2)' }, order: [[2, 'desc']], layout: { topStart: { rowClass: 'row card-header border-bottom mx-0 px-3 py-0', features: [tableTitle] }, topEnd: { search: { placeholder: 'Search Course', text: '_INPUT_' } }, bottomStart: { rowClass: 'row mx-3 justify-content-between', features: ['info'] }, bottomEnd: 'paging' }, lengthMenu: [5], language: { paginate: { next: '', previous: '', first: '', last: '' } }, // For responsive popup responsive: { details: { display: DataTable.Responsive.display.modal({ header: function (row) { const data = row.data(); return 'Details of ' + data['order']; } }), type: 'column', renderer: function (api, rowIdx, columns) { const data = columns .map(function (col) { return col.title !== '' // Do not show row in modal popup if title is blank (for check box) ? ` ${col.title}: ${col.data} ` : ''; }) .join(''); if (data) { const div = document.createElement('div'); div.classList.add('table-responsive'); const table = document.createElement('table'); div.appendChild(table); table.classList.add('table'); table.classList.add('datatables-basic'); const tbody = document.createElement('tbody'); tbody.innerHTML = data; table.appendChild(tbody); return div; } return false; } } } }); } // Filter form control to default size // ? setTimeout used for data-table initialization setTimeout(() => { const elementsToModify = [ { selector: '.dt-search .form-control', classToRemove: 'form-control-sm' }, { selector: '.dt-length .form-select', classToRemove: 'form-select-sm' }, { selector: '.dt-layout-table', classToRemove: 'row mt-2' }, { selector: '.dt-layout-full', classToRemove: 'col-md col-12', classToAdd: 'table-responsive' } ]; // Delete record elementsToModify.forEach(({ selector, classToRemove, classToAdd }) => { document.querySelectorAll(selector).forEach(element => { classToRemove.split(' ').forEach(className => element.classList.remove(className)); if (classToAdd) { element.classList.add(classToAdd); } }); }); }, 100); });