import Controller from '@ember/controller'; import { scheduleOnce } from '@ember/runloop'; import { computed } from '@ember/object'; import $ from 'jquery'; let currentLeft; let currentRight; let leftSelected; let rightSelected; let chartData = []; let schemaData = []; let skipChangeEvent = false; export default Controller.extend({ schemaName: '', instance: jsondiffpatch.create({ objectHash: function(obj, index) { if (typeof obj._id !== 'undefined') { return obj._id; } if (typeof obj.id !== 'undefined') { return obj.id; } if (typeof obj.name !== 'undefined') { return obj.name; } return '$$index:' + index; } }), actions: { onSelect: function(dataset, data) { this.highlightRow(dataset, data, false); if (dataset && dataset.id != 0) { this.updateTimeLine(dataset.id, false); } } }, previousPage: computed('model.data.page', function() { var model = this.get('model'); if (model && model.data && model.data.page) { var currentPage = model.data.page; if (currentPage <= 1) { return currentPage; } else { return currentPage - 1; } } else { return 1; } }), nextPage: computed('model.data.page', function() { var model = this.get('model'); if (model && model.data && model.data.page) { var currentPage = model.data.page; var totalPages = model.data.totalPages; if (currentPage >= totalPages) { return totalPages; } else { return currentPage + 1; } } else { return 1; } }), first: computed('model.data.page', function() { var model = this.get('model'); if (model && model.data && model.data.page) { var currentPage = model.data.page; if (currentPage <= 1) { return true; } else { return false; } } else { return false; } }), last: computed('model.data.page', function() { var model = this.get('model'); if (model && model.data && model.data.page) { var currentPage = model.data.page; var totalPages = model.data.totalPages; if (currentPage >= totalPages) { return true; } else { return false; } } else { return false; } }), updateSchemas(page, datasetId) { let url; if (!this.schemaName) { url = '/api/v1/schemaHistory/datasets?size=10&page=' + page; } else { url = '/api/v1/schemaHistory/datasets?name=' + this.schemaName + '&size=10&page=' + page; } if (datasetId && datasetId > 0) { url += '&datasetId=' + datasetId; } $.get(url, data => { if (data && data.status == 'ok') { this.set('model', data); if (data.data && data.data.datasets && data.data.datasets.length > 0) { this.updateTimeLine(data.data.datasets[0].id, true); } } }); }, updateTimeLine(id, highlightFirstRow) { var historyUrl = '/api/v1/schemaHistory/historyData/' + id; $.get(historyUrl, data => { if (data && data.status == 'ok') { $('#historytabs a:first').tab('show'); if (highlightFirstRow) { this.highlightRow(null, null, true); } schemaData = data.data; currentRight = JSON.parse(schemaData[schemaData.length - 1].schema); currentLeft = {}; rightSelected = schemaData[schemaData.length - 1]; leftSelected = null; this.updateDiffView(); chartData = []; $('#leftSchemaSelector').html(''); $('#leftSchemaSelector').append(new Option('-- choose a date --', 'na')); $('#rightSchemaSelector').html(''); $('#rightSchemaSelector').append(new Option('-- choose a date --', 'na')); for (var i = 0; i < schemaData.length; i++) { var modified = data.data[i].modified; $('#leftSchemaSelector').append(new Option(modified, i)); $('#rightSchemaSelector').append(new Option(modified, i)); var fields = parseInt(schemaData[i].fieldCount); var dateArray = modified.split('-'); if (dateArray && dateArray.length == 3) { chartData.push([Date.UTC(dateArray[0], dateArray[1] - 1, dateArray[2]), fields]); } } $('#leftSchemaSelector').change(() => { if (skipChangeEvent) { return; } var selected = $('#leftSchemaSelector').val(); if (selected == 'na') { currentLeft = {}; } else { var index = parseInt(selected); var left = JSON.parse(schemaData[selected].schema); currentLeft = left; } scheduleOnce('afterRender', this, 'updateDiffView'); }); $('#rightSchemaSelector').change(() => { if (skipChangeEvent) { return; } var selected = $('#rightSchemaSelector').val(); if (selected == 'na') { currentRight = {}; } else { var index = parseInt(selected); var right = JSON.parse(schemaData[selected].schema); currentRight = right; } updateDiffView(); }); $('#rightSchemaSelector').val((schemaData.length - 1).toString()); $('#leftSchemaSelector').val('na'); $('#timeline').highcharts({ title: { text: 'Schema History', x: -20 //center }, xAxis: { type: 'datetime', dateTimeLabelFormats: { // don't display the dummy year month: '%b %Y', year: '%Y' } }, yAxis: { labels: { enabled: true }, title: { text: 'Column number' } }, plotOptions: { series: { cursor: 'pointer', events: { click: event => { skipChangeEvent = true; if (event && event.point) { var index = event.point.index; if (index) { $('#rightSchemaSelector').val(index.toString()); if (index > 0) { $('#leftSchemaSelector').val((index - 1).toString()); } currentRight = JSON.parse(schemaData[index].schema); currentLeft = JSON.parse(schemaData[index - 1].schema); this.updateDiffView(); } else if (index == 0) { $('#rightSchemaSelector').val(index.toString()); $('#leftSchemaSelector').val('na'); currentRight = JSON.parse(schemaData[index].schema); currentLeft = {}; this.updateDiffView(); } } skipChangeEvent = false; $('#historytabs a:last').tab('show'); } } } }, tooltip: { formatter: function() { var index = this.point.index; var changed = 0; var text = '' + Highcharts.dateFormat('%b %e %Y', this.point.x) + '
'; if (index == 0) { text += 'since last change
'; text += 'Click the node to view schema'; return text; } else { changed = schemaData[index].fieldCount - schemaData[index - 1].fieldCount; } if (changed == 0) { text += 'No'; } else { text += Math.abs(changed); } if (changed == 1 || changed == -1) { text += ' column has been '; } else { text += ' columns has been '; } if (changed == 0) { text += ' added/removed '; } else if (changed > 0) { text += ' added '; } else { text += ' removed '; } text += 'since last change
'; text += 'Click the node to view diff'; return text; } }, credits: { enabled: false }, legend: { layout: 'vertical', align: 'right', verticalAlign: 'middle', borderWidth: 0 }, series: [ { showInLegend: false, data: chartData } ] }); } }); }, updateDiffView() { var delta = this.get('instance').diff(currentLeft, currentRight); $('#schemaContent').html(jsondiffpatch.formatters.html.format(delta, currentLeft)); jsondiffpatch.formatters.html.hideUnchanged(); }, highlightRow(dataset, data, firstRow) { var rows = $('.schema-row'); if (rows) { if (firstRow) { $(rows[0]).addClass('highlight'); return; } for (var index = 0; index < data.data.datasets.length; index++) { if (dataset == data.data.datasets[index]) { $(rows[index]) .addClass('highlight') .siblings() .removeClass('highlight'); break; } } } } });