Vue.component('grid', { computed: { gridRows: function() { var lefts = $(this.markup).find('div.slick-pane-left:not(.slick-pane-header)').not('[style*="display: none"]').find('div.slick-row').get(); var rights = $(this.markup).find('div.slick-pane-right:not(.slick-pane-header)').not('[style*="display: none"]').find('div.slick-row').get(); var rows = []; do { var row = []; row.push(lefts.shift()); row.push(rights.shift()); rows.push(row); } while (lefts.length); return rows; }, headersArray: function() { return $(this.markup).find('div.slick-header-columns div[role="columnheader"] > span:not(.slick-sort-indicator)'); } }, created: function() { var $this = this; this.headersArray.each(function(index, header) { $this.headers.push($(header).text().trim()); }); $.each(this.gridRows, function(rowIndex, row) { var columns = []; $this.gridColumns(row).each(function(colIndex, column) { if ($this.table.length == 0) { $this.columnOrder.push(colIndex); } columns.push($this.gridColumnData(column)); }); $this.table.push(columns); $this.originalTable.push(columns); }); }, data: function() { return { columnOrder: [], headers: [], hidden: [], originalTable: [], sortColumn: { index : -1, direction: -1 }, table: [] } }, methods: { getSortIcon: function(index) { if (index != this.sortColumn.index) { return 'fa-sort grayed-out'; } return this.sortColumn.direction == 1 ? 'fa-sort-amount-asc' : 'fa-sort-amount-desc'; }, gridColumnData: function(gridColumn) { var child = $(gridColumn).find(':first'); if ($(child).hasClass('ui-text')) { return $(child).find('span') ? $(child).text().trim() : $(child).attr('title'); } if ($(child).hasClass('ui-checkbox')) { return ''; } if ($(child).hasClass('editor-text')) { return $(child).val(); } if ($(child).hasClass('ui-buttoninput')) { return $(child).find('input:first-child').val(); } if ($(child).hasClass('ui-combobox')) { return $(child).find('select option[value="' + $(child).find('input').val() + '"]').text().trim(); } return ''; }, gridColumns: function(gridRow) { return $(gridRow).find('div[role="gridcell"]'); }, isHidden: function(index) { return this.hidden.indexOf(index) != -1; }, moveColumn: function(index, direction) { var curr = this.columnOrder.indexOf(index); this.$set(this.columnOrder, curr, this.columnOrder[curr + direction]); this.$set(this.columnOrder, curr + direction, index); }, sortRows: function() { var $this = this; this.table = this.table.sort(function(a, b) { var index = $this.sortColumn.index; var x = a; var y = b; if ($this.sortColumn.direction == 2) { x = b; y = a; } if (x[index] > y[index]) { return 1; } if (x[index] < y[index]) { return -1; } return 0; }); }, toggleHidden: function(index) { if (this.isHidden(index)) { this.hidden.splice(this.hidden.indexOf(index), 1); } else { this.hidden.push(index); } }, toggleSortColumn: function(index) { if (this.sortColumn.index != index) { this.sortColumn.index = index; this.sortColumn.direction = 1; this.sortRows(); } else if (this.sortColumn.direction == 1) { this.sortColumn.direction = 2; this.sortRows(); } else { this.sortColumn.index = -1; this.sortColumn.direction = -1; this.table = this.originalTable.slice(0); } }, $: $ }, props: ['markup'], template: "
\n

14\" class=\"no-print\">\n <\/i>\n \n The grid below has {{ columnOrder.length }} columns. You might consider hiding some columns, printing this in landscape mode, or using the Scale feature.\n <\/span>\n \n The grid below has {{ columnOrder.length }} columns. You might consider hiding some columns or using the Scale feature when printing.\n <\/span>\n <\/h4>\n \n \n \n \n \n
\n {{ headers[columnIndex] }}\n
\n <\/i>\n 2\" class=\"action fa\" :class=\"getSortIcon(columnIndex)\" @click=\"toggleSortColumn(columnIndex)\" title=\"Change Column Sort\"><\/i>\n <\/i>\n <\/i>\n <\/div>\n <\/th>\n <\/tr>\n <\/thead>\n
<\/td>\n <\/tr>\n <\/tbody>\n <\/table>\n<\/div>" }); Vue.component('presentation', { computed: { hasLegend: function() { return $(this.markup).closest('fieldset').length > 0; }, legend: function() { return $(this.markup).closest('fieldset').find('legend').text().trim(); }, rows: function() { return $(this.markup).find('tr'); } }, created: function() { var $this = this; this.rows.each(function(index, row) { var actualRow = []; $this.columns(row).each(function(index, column) { var actualColumn = ''; switch (true) { case $this.isHidden(column): break; case $this.isSimple(column): actualColumn = $this.getText(column); break; case $this.isGroup(column): actualColumn = '' + $this.getGroupLabel(column) + ': ' + $this.getOptionList(column); break; case $this.isComplex(column): var that = $this; var added = []; $this.complex(column).each(function(index, complexity) { var label = that.getNonEmptyLabel(complexity); if (added.indexOf(label) == -1) { actualColumn += label + ' ' + that.getData(column, $(complexity)) + ''; added.push(label); } }); break; case $this.isLabeled(column): actualColumn = $this.getLabel(column) + ' ' + $this.getData(column, $this.getLabelEl(column)) + ' ' + $this.getDescriptor(column); break; case $this.isTextField(column): actualColumn = '' + $(column).find('label').text().trim() + ': ' + $(column).find('span').text().trim(); break; } actualRow.push(actualColumn); }); $this.table.push(actualRow); }); var maxColumns = 0; $.each(this.table, function(index, row) { maxColumns = Math.max(maxColumns, row.length); }); $.each(this.table, function(index, row) { while (row.length < maxColumns) { $this.table[index].push(''); } }); }, data: function() { return { hidden: false, table: [] } }, methods: { columnHasData: function(index) { var hasData = false; $.each(this.table, function(rowIndex, row) { $.each(row, function (columnIndex, column) { if (columnIndex == index && column.length) { hasData = true; } }); }); return hasData; }, columns: function(row) { return $(row).find('td'); }, complex: function(column) { return this.getLabelEl(column); }, getData: function(column, label) { if (label.length == 0) { return ''; } var data = $(column).find('input[name="' + label.attr('for').substr(1) + '"]').attr('title'); if (data) { return data; } data = $(column).find('input[id="' + label.attr('for') + '"]').attr('title'); if (data) { return data; } if (label.attr('for').match(/_btn$/)) { return ''; } return ''; }, getDescriptor: function(column) { var descriptor = $(column).find('div[data-widget="textfield"]'); return descriptor.length ? '' + $(descriptor).find('span').text().trim() + '' : ''; }, getGroupLabel: function(column) { return $(column).find('div[data-widget="component"] > label:first-child').text().trim(); }, getLabel: function(column) { return this.getNonEmptyLabel(this.getLabelEl(column)); }, getLabelEl: function(column) { return $(column).find('label[for]'); }, getNonEmptyLabel: function(label) { label = $(label).text().trim(); return label ? '' + label + ':' : ''; }, getOptionList: function(column) { var options = this.options(column); var list = []; options.each(function(index, option) { list.push( ' ' + $(option).find('label').text().trim() + ''); }); return list.join(' '); }, getText: function(column) { return $(column).find('div[data-widget="text"]').text().trim(); }, isComplex: function(column) { return this.getLabelEl(column).length > 1; }, isGroup: function(column) { return $(column).find('div[data-widget="radiogroup"]').length > 0; }, isHidden: function(column) { return $(column).find('div[style*="display: none"]').length > 0; }, isLabeled: function(column) { return this.getLabelEl(column).length > 0; }, isSimple: function(column) { return $(column).find('div[data-widget="text"]').length > 0; }, isTextField: function(column) { return $(column).find('div[data-widget="textfield"]').length > 0; }, options: function(column) { return $(column).find('div[data-widget="radiobox"]'); }, rowHasData: function(r) { return r.join('').length; }, $: $ }, props: ['markup'], template: "
\n
\n

\n {{ legend }}\n <\/i>\n <\/h3>\n <\/div>\n \n \n \n
<\/td>\n <\/tr>\n <\/tbody>\n <\/table>\n<\/div>\n" }); Vue.component('banner-printer', { created: function() { this.message = this.messageTemplate; }, computed: { activities: function() { var activities = []; var pieces = $(this.footer).find('div[id^="activity"][style!="display: none;"]'); pieces.each(function(index, piece) { if ($(piece).find('label').length && $(piece).find('span').length) { activities.push(piece); } }); return activities; }, criteria: function() { var criteria = {}; var pieces = $(this.doc).find('div.layout-row label').not('.empty'); pieces.each(function(index, piece) { if ($(piece).parent().css('display') == 'none') { return; } var value = ''; var data = $(piece).closest('div[data-widget="component"]').find('span.ui-widget-content'); if (!data.length) { data = $(piece).closest('div[data-widget="datefield"]').find('span.ui-widget-content'); } if (!data.length) { data = $(piece).closest('div[data-widget="textinput"]').find('span.ui-widget-content'); } if (!data.length) { data = $(piece).closest('div[data-widget="combobox"]').find('span.ui-widget-content'); } data.each(function(index, datum) { value += ' ' + $(datum).text().trim(); }); if (!data.length) { data = $(piece).closest('div[data-widget="component"]').find('div[data-widget="checkbox"] > button'); if (data.length) { value = '' } } criteria[$(piece).text().trim()] = value; }); return criteria; }, messageTemplate: function() { return "ENTER DETAILS HERE\n(missing/wrong data, malformed tables, etc.)"; }, sections: function() { var sections = []; var pieces = $(this.doc).find('div[data-widget="collapsiblepanel"] h3.ui-collapsiblepanel-header'); pieces.each(function(index, piece) { if ($(piece).closest('div.ui-tabs-hide').length == 0) { sections.push(piece); } }); pieces = $(this.doc).find('div[data-widget="accordion"] h3.ui-accordion-header'); pieces.each(function(index, piece) { if ($(piece).closest('div.ui-tabs-hide').length == 0) { sections.push(piece); } }); return sections; } }, data: function() { return { b9Form: this.title, buttonLabel: 'Report a problem', contact: '', doc: markup, error: '', footer: footer, message: '', success: '' }; }, methods: { done: function(response) { this.buttonLabel = 'Report a problem'; if (response.error != undefined) { this.error = response.error; } else if (response.success != undefined) { this.success = response.success; } else { this.error = 'There was an error submitting the report. Please try again.'; } }, fail: function(response) { this.buttonLabel = 'Report a problem'; if (response.error != undefined) { this.error = response.error; } else { this.error = 'There was an error submitting the report. Please try again.'; } }, grids: function(section) { return $(section).parent().find('div[data-widget="datagrid"]').get(); }, resetResult: function() { this.error = ''; this.success = ''; }, reportProblem: function() { this.buttonLabel = 'Sending...'; $.ajax({ type: 'POST', url: 'https://banner9printer.apps.wayne.edu/report', data: { b9Form: this.b9Form, contact: this.contact, message: this.message, _token: 'pSTykxNI3g6g7U5nFr329csiGIXSy5heWVrtjBuP' } }) .done(this.done) .fail(this.fail); }, sectionTitle: function(section) { var titleDiv = $(section).find('div.ui-accordion-title'); if (titleDiv.length) { return titleDiv.text().trim(); } titleDiv = $(section).find('div.ui-collapsiblepanel-title'); if (titleDiv.length) { return titleDiv.text().trim(); } return $(section).text().trim(); }, tables: function(section) { return $(section).parent().find('table[role="presentation"]').filter(function(index, table) { return $(table).closest('div[style*="display: none"]').length == 0; }).get(); }, $ : $ }, props: ['stats', 'title'], template: "
\n
\n