;(function() { var AJAX_URL = '/job/' var tablesTypes = { RUNNING: 'running', PENDING: 'pending', FINISHED: 'finished', DELETED: 'deleted' } var actionsTypes = { DELETE: 'delete', CANCEL: 'cancel', RESTART: 'restart', EDIT: 'edit', ACTIVATE: 'activate', RUN: 'run' } var templetes = { pending: function(data) { return ` <tr id="${data.id}"> <td data-col="job">${data.name}</td> <td data-col="spider">${data.spider}</td> <td data-col="created-date">${new Date(data.create_time).format('dd.mm.yyyy HH:MM')}</td> <td data-col="status" class="text-success">${data.status}</td> <td data-col="action"> <button class="btn btn-sm btn-primary" data-loading="loading" data-action="run" data-loading-text="Running..." data-text="Run">Run</button> <button class="btn btn-sm btn-danger" data-action="delete" data-loading-text="Deleting..." data-text="Delete">Delete</button> <button class="btn btn-sm btn-secondary" data-loading-text="<i class='fa fa-cog fa-spin' aria-hidden='true'></i>" data-action="edit" data-text="<i class='fa fa-cog' aria-hidden='true'></i>"> <i class="fa fa-cog" aria-hidden="true"></i> </button> </td> </tr> ` }, running: function(data) { return ` <tr id="${data.id}"> <td data-col="job">${data.name}</td> <td data-col="spider">${data.spider}</td> <td data-col="created-date">${data.create_time ? new Date(data.create_time).format('dd.mm.yyyy HH:MM') : 'No date'}</td> <td data-col="start-date">${data.start_time ? new Date(data.start_time).format('dd.mm.yyyy HH:MM') : 'No date'}</td> <td data-col="status" class="text-success">${data.status}</td> <td data-col="log"><button data-action="log" class="btn btn-sm btn-secondary" data-loading-text="Creating log..." data-text="Get log">Get log</button></td> <td data-col="action"> <button class="btn btn-sm btn-primary" data-action="cancel" data-loading-text="Cancelling..." data-text="Cancel">Cancel</button> <button class="btn btn-sm btn-danger" data-action="delete" data-loading-text="Deleting..." data-text="Delete">Delete</button> </td> </tr> ` }, deleted: function(data) { return ` <tr id="${data.id}"> <td data-col="job">${data.name}</td> <td data-col="spider">${data.spider}</td> <td data-col="created-date">${data.create_time ? new Date(data.create_time).format('dd.mm.yyyy HH:MM') : 'No date'}</td> <td data-col="start-date">${data.start_time ? new Date(data.start_time).format('dd.mm.yyyy HH:MM') : 'No date'}</td> <td data-col="finished-date">${data.end_time ? new Date(data.end_time).format('dd.mm.yyyy HH:MM') : 'No date'}</td> <td data-col="status" class="text-danger">${data.status}</td> <td data-col="log"><button data-action="log" class="btn btn-sm btn-secondary" data-loading-text="Creating log..." data-text="Get log">Get log</button></td> <td data-col="action"> <button class="btn btn-sm btn-success" data-action='activate' data-loading-text="Activating..." data-text="Activate">Activate</button> </td> </tr> ` }, finished: function(data) { return ` <tr id="${data.id}"> <td data-col="job">${data.name}</td> <td data-col="spider">${data.spider}</td> <td data-col="created-date">${new Date(data.create_time).format('dd.mm.yyyy HH:MM')}</td> <td data-col="start-date">${new Date(data.create_time).format('dd.mm.yyyy HH:MM')}</td> <td data-col="finished-date">${new Date(data.create_time).format('dd.mm.yyyy HH:MM')}</td> <td data-col="status" class="text-success">${data.status}</td> <td data-col="log"><button data-action="log" class="btn btn-sm btn-secondary" data-loading-text="Creating log..." data-text="Get log">Get log</button></td> <td data-col="action"> <button class="btn btn-sm btn-primary" data-action="restart" data-loading-text="Restarting..." data-text="Restart">Restart</button> <button class="btn btn-sm btn-danger" data-action="delete" data-loading-text="Deleting..." data-text="Delete">Delete</button> </td> </tr> ` } } // ------------------------------ // Instance // ------------------------------ var tables = { btnAction: "button[data-action]", btnCancel: "button[data-action='cancel']", btnDelete: "button[data-action='delete']", btnRun: "button[data-action='run']", btnRestart: "button[data-action='restart']", btnActivate: "button[data-action='activate']", btnOption: "button[data-action='edit']", btnLog: "button[data-action='log']", btnTryAgain: '.close-loading', updateHightlight: function() { $('code').each(function(i, block) { hljs.highlightBlock(block); }); }, init: function () { hljs.initHighlightingOnLoad(); var self = this; $('#log-modal').on('hidden.bs.modal', function() { $('body').css('padding-right', '0px'); self.setNormalButton(self.btnAction); }); $(document).on('click', this.btnTryAgain, function() { self.tryAgain(self) }); $(document).on('click', this.btnDelete, function() {self.action(self, this, tablesTypes.DELETED)}); $(document).on('click', this.btnRun, function() {self.action(self, this, tablesTypes.RUNNING)}); $(document).on('click', this.btnRestart, function() {self.action(self, this, tablesTypes.RUNNING)}); $(document).on('click', this.btnCancel, function() {self.action(self, this, tablesTypes.FINISHED)}); $(document).on('click', this.btnActivate, function() {self.action(self, this, tablesTypes.PENDING)}); $(document).on('click', this.btnOption, function() {self.actionEdit(self, this)}); $(document).on('click', this.btnLog, function() {self.actionLog(self, this)}); }, action: function(vm, button, toTable) { var itemRoot = $(button).closest('tr'); var dataAjax = vm.getItemAjaxData(button); vm.setLoadingButton(button); vm.showLoading(); // ------------------------------ // AJAX // ------------------------------ vm.sendData(dataAjax, function(response) { vm.loadingOnSuccess(); // Delete old row itemRoot.remove(); // Create new row var item = vm.createItem(dataAjax.action, response); // Append new row vm.moveItem(item, toTable); // Hide loading vm.hideLoading(); }, function(error) { vm.loadingOnError(error); }); }, actionLog: function(vm, button) { var dataAjax = vm.getItemAjaxData(button); vm.loadingOnSuccess(); vm.setLoadingButton(button); vm.showLoading(); // ------------------------------ // AJAX // ------------------------------ vm.sendData(dataAjax, function(response) { $('.modal-body .js').empty().html(response); $('#log-modal').modal(); vm.setLoadingButton(button) vm.hideLoading(); vm.updateHightlight(); }, function(error) { vm.loadingOnError(error); }); }, actionEdit: function(vm, button) { var dataAjax = vm.getItemAjaxData(button); vm.setLoadingButton(button); // ------------------------------ // AJAX // ------------------------------ vm.sendData(dataAjax, function(response) { console.log(response); }, function() { vm.setNormalButton(button); }); }, createItem (action, data) { if (action === actionsTypes.ACTIVATE) { return templetes.pending(data); } if (action === actionsTypes.RESTART || action === actionsTypes.RUN) { return templetes.running(data); } if (action === actionsTypes.DELETE) { return templetes.deleted(data); } if (action === actionsTypes.CANCEL) { return templetes.finished(data); } return "Sorry no have related types or actions..." }, // ------------------------------ // Additional functions // ------------------------------ sendData: function(data, success, error) { $.ajax({ method: "POST", url: AJAX_URL, cache: false, headers: { 'X-CSRFToken': $.cookie('csrftoken') }, data: data, success: success, error: error }); }, setNormalButton(button) { $(button).each(function(index, item) { $(item).html($(item).data('text')) .prop('disabled', false) .attr('aria-pressed', false); }); }, setLoadingButton(button) { if($(button).attr('aria-pressed') === false) { $(button).html($(button).data('text')) .prop('disabled', false) .attr('aria-pressed', true); } else { $(button).html($(button).data('loading-text')) .prop('disabled', true) .attr('aria-pressed', true); } }, getItemAjaxData(button) { return { table: $(button).closest('.table').data('table'), id: $(button).closest('tr').prop('id'), action: $(button).data('action') } }, moveItem: function (item, table) { var $table = $("[data-table=" + table + "]"); var $tbody = $table.find('tbody'); // Append item $table.find('tbody').append(item); }, tryAgain (vm) { vm.hideLoading(); vm.setNormalButton(vm.btnAction); }, showLoading() { $('.loading').show(); $('body').addClass('modal-open').css('padding-right', '17px'); }, hideLoading(vm) { $('.loading').hide(); $('body').removeClass('modal-open').css('padding-right', '0px'); }, loadingOnSuccess() { $('.loading-content').empty().append("<i class='fa fa-refresh fa-spin'></i>"); }, loadingOnError(error) { $('.loading-content').empty().append("<code>Try again later... <br> Error status: " + error.status + "<br> Error status text: " + error.statusText + "<br><button class='btn btn-sm mt-4 close-loading btn-secondary'>Try again</button></code>"); } } // ------------------------------ // Initialization // ------------------------------ tables.init(); })();