
From: chandrureddy <chandra@linux.vnet.ibm.com> --- src/wok/plugins/gingerbase/ui/js/Makefile.am | 27 + .../plugins/gingerbase/ui/js/src/gingerbase.api.js | 371 +++++++++ .../gingerbase/ui/js/src/gingerbase.host.js | 859 +++++++++++++++++++++ .../gingerbase/ui/js/src/gingerbase.main.js | 26 + .../ui/js/src/gingerbase.report_add_main.js | 72 ++ .../ui/js/src/gingerbase.report_rename_main.js | 66 ++ .../ui/js/src/gingerbase.repository_add_main.js | 96 +++ .../ui/js/src/gingerbase.repository_edit_main.js | 74 ++ src/wok/plugins/kimchi/ui/js/src/kimchi.host.js | 858 -------------------- .../kimchi/ui/js/src/kimchi.report_add_main.js | 72 -- .../kimchi/ui/js/src/kimchi.report_rename_main.js | 66 -- .../kimchi/ui/js/src/kimchi.repository_add_main.js | 96 --- .../ui/js/src/kimchi.repository_edit_main.js | 74 -- 13 files changed, 1591 insertions(+), 1166 deletions(-) create mode 100644 src/wok/plugins/gingerbase/ui/js/Makefile.am create mode 100644 src/wok/plugins/gingerbase/ui/js/src/gingerbase.api.js create mode 100644 src/wok/plugins/gingerbase/ui/js/src/gingerbase.host.js create mode 100644 src/wok/plugins/gingerbase/ui/js/src/gingerbase.main.js create mode 100644 src/wok/plugins/gingerbase/ui/js/src/gingerbase.report_add_main.js create mode 100644 src/wok/plugins/gingerbase/ui/js/src/gingerbase.report_rename_main.js create mode 100644 src/wok/plugins/gingerbase/ui/js/src/gingerbase.repository_add_main.js create mode 100644 src/wok/plugins/gingerbase/ui/js/src/gingerbase.repository_edit_main.js delete mode 100644 src/wok/plugins/kimchi/ui/js/src/kimchi.host.js delete mode 100644 src/wok/plugins/kimchi/ui/js/src/kimchi.report_add_main.js delete mode 100644 src/wok/plugins/kimchi/ui/js/src/kimchi.report_rename_main.js delete mode 100644 src/wok/plugins/kimchi/ui/js/src/kimchi.repository_add_main.js delete mode 100644 src/wok/plugins/kimchi/ui/js/src/kimchi.repository_edit_main.js diff --git a/src/wok/plugins/gingerbase/ui/js/Makefile.am b/src/wok/plugins/gingerbase/ui/js/Makefile.am new file mode 100644 index 0000000..fa7f3cf --- /dev/null +++ b/src/wok/plugins/gingerbase/ui/js/Makefile.am @@ -0,0 +1,27 @@ +# +# Ginger Base +# +# Copyright IBM, Corp. 2015 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +EXTRA_DIST = src + +jsdir = $(datadir)/wok/plugins/gingerbase/ui/js + +dist_js_DATA = gingerbase.min.js $(filter-out gingerbase.min.js, $(wildcard *.js)) + +gingerbase.min.js: src/*.js + cat $(sort $^) > $@ + +CLEANFILES = gingerbase.min.js diff --git a/src/wok/plugins/gingerbase/ui/js/src/gingerbase.api.js b/src/wok/plugins/gingerbase/ui/js/src/gingerbase.api.js new file mode 100644 index 0000000..a3aca4a --- /dev/null +++ b/src/wok/plugins/gingerbase/ui/js/src/gingerbase.api.js @@ -0,0 +1,371 @@ +/* + * Project Ginger Base + * + * Copyright IBM, Corp. 2013-2015 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var kimchi = { + + widget: {}, + + trackingTasks: [], + + /** + * + * Get host capabilities + * suc: callback if succeed err: callback if failed + */ + getCapabilities : function(suc, err, done) { + done = typeof done !== 'undefined' ? done: function(){}; + wok.requestJSON({ + url : "plugins/gingerbase/host/capabilities", + type : "GET", + contentType : "application/json", + dataType : "json", + success: suc, + error: err, + complete: done + }); + }, + + /** + * Get the i18 strings. + */ + getI18n: function(suc, err, url, sync) { + wok.requestJSON({ + url : url ? url : 'plugins/gingerbase/i18n.json', + type : 'GET', + resend: true, + dataType : 'json', + async : !sync, + success : suc, + error: err + }); + }, + + /** + * Get the host static information. + */ + getHost: function(suc, err) { + wok.requestJSON({ + url : 'plugins/gingerbase/host', + type : 'GET', + resend: true, + contentType : 'application/json', + dataType : 'json', + success : suc, + error: err + }); + }, + + /** + * Get the dynamic host stats (usually used for monitoring). + */ + getHostStats : function(suc, err) { + wok.requestJSON({ + url : 'plugins/gingerbase/host/stats', + type : 'GET', + contentType : 'application/json', + headers: {'Wok-Robot': 'wok-robot'}, + dataType : 'json', + success : suc, + error: err + }); + }, + + /** + * Get the historic host stats. + */ + getHostStatsHistory : function(suc, err) { + wok.requestJSON({ + url : 'plugins/gingerbase/host/stats/history', + type : 'GET', + resend: true, + contentType : 'application/json', + headers: {'Wok-Robot': 'wok-robot'}, + dataType : 'json', + success : suc, + error: err + }); + }, + + getTask : function(taskId, suc, err) { + wok.requestJSON({ + url : 'plugins/gingerbase/tasks/' + encodeURIComponent(taskId), + type : 'GET', + contentType : 'application/json', + dataType : 'json', + success : suc, + error : err + }); + }, + + getTasksByFilter : function(filter, suc, err, sync) { + wok.requestJSON({ + url : 'plugins/gingerbase/tasks?' + filter, + type : 'GET', + contentType : 'application/json', + dataType : 'json', + async : !sync, + success : suc, + error : err + }); + }, + + listReports : function(suc, err) { + wok.requestJSON({ + url : 'plugins/gingerbase/debugreports', + type : 'GET', + contentType : 'application/json', + dataType : 'json', + resend: true, + success : suc, + error : err + }); + }, + + trackTask : function(taskID, suc, err, progress) { + var onTaskResponse = function(result) { + var taskStatus = result['status']; + switch(taskStatus) { + case 'running': + progress && progress(result); + setTimeout(function() { + kimchi.trackTask(taskID, suc, err, progress); + }, 2000); + break; + case 'finished': + suc && suc(result); + break; + case 'failed': + err && err(result); + break; + default: + break; + } + }; + + kimchi.getTask(taskID, onTaskResponse, err); + if(kimchi.trackingTasks.indexOf(taskID) < 0) + kimchi.trackingTasks.push(taskID); + }, + + createReport: function(settings, suc, err, progress) { + var onResponse = function(data) { + taskID = data['id']; + kimchi.trackTask(taskID, suc, err, progress); + }; + + wok.requestJSON({ + url : 'plugins/gingerbase/debugreports', + type : "POST", + contentType : "application/json", + data : JSON.stringify(settings), + dataType : "json", + success : onResponse, + error : err + }); + }, + + renameReport : function(name, settings, suc, err) { + $.ajax({ + url : "plugins/gingerbase/debugreports/" + encodeURIComponent(name), + type : 'PUT', + contentType : 'application/json', + data : JSON.stringify(settings), + dataType : 'json', + success: suc, + error: err + }); + }, + + deleteReport: function(settings, suc, err) { + var reportName = encodeURIComponent(settings['name']); + wok.requestJSON({ + url : 'plugins/gingerbase/debugreports/' + reportName, + type : 'DELETE', + contentType : 'application/json', + dataType : 'json', + success : suc, + error : err + }); + }, + + downloadReport: function(settings, suc, err) { + window.open(settings['file']); + }, + + shutdown: function(settings, suc, err) { + var reboot = settings && settings['reboot'] === true; + var url = 'plugins/gingerbase/host/' + (reboot ? 'reboot' : 'shutdown'); + wok.requestJSON({ + url : url, + type : 'POST', + contentType : 'application/json', + dataType : 'json', + success : suc, + error : err + }); + }, + + listHostPartitions : function(suc, err) { + wok.requestJSON({ + url : 'plugins/gingerbase/host/partitions', + type : 'GET', + contentType : 'application/json', + dataType : 'json', + success : suc, + error : err + }); + }, + + listSoftwareUpdates : function(suc, err) { + wok.requestJSON({ + url : 'plugins/gingerbase/host/packagesupdate', + type : 'GET', + contentType : 'application/json', + dataType : 'json', + resend: true, + success : suc, + error : err + }); + }, + + updateSoftware : function(suc, err, progress) { + var taskID = -1; + var onResponse = function(data) { + taskID = data['id']; + trackTask(); + }; + + var trackTask = function() { + kimchi.getTask(taskID, onTaskResponse, err); + }; + + var onTaskResponse = function(result) { + var taskStatus = result['status']; + switch(taskStatus) { + case 'running': + progress && progress(result); + setTimeout(function() { + trackTask(); + }, 200); + break; + case 'finished': + case 'failed': + suc(result); + break; + default: + break; + } + }; + + wok.requestJSON({ + url : 'plugins/gingerbase/host/swupdate', + type : "POST", + contentType : "application/json", + dataType : "json", + success : onResponse, + error : err + }); + }, + + createRepository : function(settings, suc, err) { + wok.requestJSON({ + url : "plugins/gingerbase/host/repositories", + type : "POST", + contentType : "application/json", + data : JSON.stringify(settings), + dataType : "json", + success: suc, + error: err + }); + }, + + retrieveRepository : function(repository, suc, err) { + var reposID = encodeURIComponent(repository); + wok.requestJSON({ + url : "plugins/gingerbase/host/repositories/" + reposID, + type : 'GET', + contentType : 'application/json', + dataType : 'json', + success : suc, + error : err + }); + }, + + updateRepository : function(name, settings, suc, err) { + var reposID = encodeURIComponent(name); + $.ajax({ + url : "plugins/gingerbase/host/repositories/" + reposID, + type : 'PUT', + contentType : 'application/json', + data : JSON.stringify(settings), + dataType : 'json', + success : suc, + error : err + }); + }, + + enableRepository : function(name, enable, suc, err) { + var reposID = encodeURIComponent(name); + $.ajax({ + url : "plugins/gingerbase/host/repositories/" + reposID + + '/' + (enable === true ? 'enable' : 'disable'), + type : 'POST', + contentType : 'application/json', + dataType : 'json', + success : suc, + error : err + }); + }, + + deleteRepository : function(repository, suc, err) { + var reposID = encodeURIComponent(repository); + wok.requestJSON({ + url : 'plugins/gingerbase/host/repositories/' + reposID, + type : 'DELETE', + contentType : 'application/json', + dataType : 'json', + success : suc, + error : err + }); + }, + + listRepositories : function(suc, err) { + wok.requestJSON({ + url : 'plugins/gingerbase/host/repositories', + type : 'GET', + contentType : 'application/json', + dataType : 'json', + resend: true, + success : suc, + error : err + }); + }, + + getCPUInfo : function(suc, err) { + wok.requestJSON({ + url : 'plugins/gingerbase/host/cpuinfo', + type : 'GET', + contentType : 'application/json', + dataType : 'json', + resend : true, + success : suc, + error : err ? err : function(data) { + wok.message.error(data.responseJSON.reason); + } + }); + } +}; diff --git a/src/wok/plugins/gingerbase/ui/js/src/gingerbase.host.js b/src/wok/plugins/gingerbase/ui/js/src/gingerbase.host.js new file mode 100644 index 0000000..8808e17 --- /dev/null +++ b/src/wok/plugins/gingerbase/ui/js/src/gingerbase.host.js @@ -0,0 +1,859 @@ +/* + * Project Ginger Base + * + * Copyright IBM, Corp. 2013-2015 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +kimchi.host={}; + +kimchi.host_main = function() { + var expand = function(header, toExpand) { + var controlledNode = $(header).attr('aria-controls'); + $('#' + controlledNode)[toExpand ? 'removeClass' : 'addClass']('hidden'); + $(header).attr('aria-expanded', toExpand ? 'true' : 'false'); + }; + + var repositoriesGrid = null; + var initRepositoriesGrid = function(repo_type) { + var gridFields=[]; + if (repo_type == "yum") { + gridFields=[{ + name: 'repo_id', + label: i18n['GGBREPO6004M'], + 'class': 'repository-id' + }, { + name: 'config[repo_name]', + label: i18n['GGBREPO6005M'], + 'class': 'repository-name' + }, { + name: 'enabled', + label: i18n['GGBREPO6009M'], + 'class': 'repository-enabled' + }]; + } + else if (repo_type == "deb") { + gridFields=[{ + name: 'baseurl', + label: i18n['GGBREPO6006M'], + makeTitle: true, + 'class': 'repository-baseurl deb' + }, { + name: 'enabled', + label: i18n['GGBREPO6009M'], + 'class': 'repository-enabled deb' + }, { + name: 'config[dist]', + label: "dist", + 'class': 'repository-gpgcheck deb' + }, { + name: 'config[comps]', + label: "comps", + 'class': 'repository-gpgcheck deb' + }]; + } + else { + gridFields=[{ + name: 'repo_id', + label: i18n['GGBREPO6004M'], + 'class': 'repository-id' + }, { + name: 'enabled', + label: i18n['GGBREPO6009M'], + 'class': 'repository-enabled' + }, { + name: 'baseurl', + label: i18n['GGBREPO6006M'], + makeTitle: true, + 'class': 'repository-baseurl' + }]; + } + repositoriesGrid = new wok.widget.Grid({ + container: 'repositories-grid-container', + id: 'repositories-grid', + title: i18n['GGBREPO6003M'], + toolbarButtons: [{ + id: 'repositories-grid-add-button', + label: i18n['GGBREPO6012M'], + onClick: function(event) { + wok.window.open({url:'plugins/gingerbase/repository-add.html', + class: repo_type}); + } + }, { + id: 'repositories-grid-enable-button', + label: i18n['GGBREPO6016M'], + disabled: true, + onClick: function(event) { + var repository = repositoriesGrid.getSelected(); + if(!repository) { + return; + } + var name = repository['repo_id']; + var enable = !repository['enabled']; + $(this).prop('disabled', true); + kimchi.enableRepository(name, enable, function() { + wok.topic('kimchi/repositoryUpdated').publish(); + }); + } + }, { + id: 'repositories-grid-edit-button', + label: i18n['GGBREPO6013M'], + disabled: true, + onClick: function(event) { + var repository = repositoriesGrid.getSelected(); + if(!repository) { + return; + } + kimchi.selectedRepository = repository['repo_id']; + wok.window.open({url:'plugins/gingerbase/repository-edit.html', + class: repo_type}); + } + }, { + id: 'repositories-grid-remove-button', + label: i18n['GGBREPO6014M'], + disabled: true, + onClick: function(event) { + var repository = repositoriesGrid.getSelected(); + if(!repository) { + return; + } + + var settings = { + title : i18n['GGBREPO6001M'], + content : i18n['GGBREPO6002M'], + confirm : i18n['GGBAPI6004M'], + cancel : i18n['GGBAPI6003M'] + }; + + wok.confirm(settings, function() { + kimchi.deleteRepository( + repository['repo_id'], + function(result) { + wok.topic('kimchi/repositoryDeleted').publish(result); + }, function(error) { + } + ); + }); + } + }], + onRowSelected: function(row) { + var repository = repositoriesGrid.getSelected(); + if(!repository) { + return; + } + $('#repositories-grid-remove-button').prop('disabled', false); + $('#repositories-grid-edit-button').prop('disabled', false); + var enabled = repository['enabled']; + $('#repositories-grid-enable-button') + .text(i18n[enabled ? 'GGBREPO6017M' : 'GGBREPO6016M']) + .prop('disabled', false); + }, + frozenFields: [], + fields: gridFields, + data: listRepositories + }); + }; + + var listRepositories = function(gridCallback) { + kimchi.listRepositories(function(repositories) { + if($.isFunction(gridCallback)) { + gridCallback(repositories); + } + else { + if(repositoriesGrid) { + repositoriesGrid.setData(repositories); + } + else { + initRepositoriesGrid(); + repositoriesGrid.setData(repositories); + } + } + }, + function(error) { + var message = error && error['responseJSON'] && error['responseJSON']['reason']; + + if($.isFunction(gridCallback)) { + gridCallback([]); + } + repositoriesGrid && + repositoriesGrid.showMessage(message || i18n['GGBUPD6008M']); + }); + + $('#repositories-grid-remove-button').prop('disabled', true); + $('#repositories-grid-edit-button').prop('disabled', true); + $('#repositories-grid-enable-button').prop('disabled', true); + }; + + var softwareUpdatesGridID = 'software-updates-grid'; + var softwareUpdatesGrid = null; + var progressAreaID = 'software-updates-progress-textarea'; + var reloadProgressArea = function(result) { + var progressArea = $('#' + progressAreaID)[0]; + $(progressArea).text(result['message']); + var scrollTop = $(progressArea).prop('scrollHeight'); + $(progressArea).prop('scrollTop', scrollTop); + }; + + var initSoftwareUpdatesGrid = function(softwareUpdates) { + softwareUpdatesGrid = new wok.widget.Grid({ + container: 'software-updates-grid-container', + id: softwareUpdatesGridID, + title: i18n['GGBUPD6001M'], + rowSelection: 'disabled', + toolbarButtons: [{ + id: softwareUpdatesGridID + '-update-button', + label: i18n['GGBUPD6006M'], + disabled: true, + onClick: function(event) { + var updateButton = $(this); + var progressArea = $('#' + progressAreaID)[0]; + $('#software-updates-progress-container').removeClass('hidden'); + $(progressArea).text(''); + !wok.isElementInViewport(progressArea) && + progressArea.scrollIntoView(); + $(updateButton).text(i18n['GGBUPD6007M']).prop('disabled', true); + + kimchi.updateSoftware(function(result) { + reloadProgressArea(result); + $(updateButton).text(i18n['GGBUPD6006M']).prop('disabled', false); + wok.topic('kimchi/softwareUpdated').publish({ + result: result + }); + }, function(error) { + var message = error && error['responseJSON'] && error['responseJSON']['reason']; + wok.message.error(message || i18n['GGBUPD6009M']); + $(updateButton).text(i18n['GGBUPD6006M']).prop('disabled', false); + }, reloadProgressArea); + } + }], + frozenFields: [], + fields: [{ + name: 'package_name', + label: i18n['GGBUPD6002M'], + 'class': 'software-update-name' + }, { + name: 'version', + label: i18n['GGBUPD6003M'], + 'class': 'software-update-version' + }, { + name: 'arch', + label: i18n['GGBUPD6004M'], + 'class': 'software-update-arch' + }, { + name: 'repository', + label: i18n['GGBUPD6005M'], + 'class': 'software-update-repos' + }], + data: listSoftwareUpdates + }); + }; + + var listSoftwareUpdates = function(gridCallback) { + kimchi.listSoftwareUpdates(function(softwareUpdates) { + if($.isFunction(gridCallback)) { + gridCallback(softwareUpdates); + } + else { + if(softwareUpdatesGrid) { + softwareUpdatesGrid.setData(softwareUpdates); + } + else { + initSoftwareUpdatesGrid(softwareUpdates); + } + } + + var updateButton = $('#' + softwareUpdatesGridID + '-update-button'); + $(updateButton).prop('disabled', softwareUpdates.length === 0); + }, function(error) { + var message = error && error['responseJSON'] && error['responseJSON']['reason']; + if($.isFunction(gridCallback)) { + gridCallback([]); + } + softwareUpdatesGrid && + softwareUpdatesGrid.showMessage(message || i18n['GGBUPD6008M']); + }); + }; + + var reportGridID = 'available-reports-grid'; + var reportGrid = null; + var enableReportButtons = function(toEnable) { + var buttonID = '#{grid}-{btn}-button'; + $.each(['rename', 'remove', 'download'], function(i, n) { + $(wok.substitute(buttonID, { + grid: reportGridID, + btn: n + })).prop('disabled', !toEnable); + }); + }; + var initReportGrid = function(reports) { + reportGrid = new wok.widget.Grid({ + container: 'available-reports-grid-container', + id: reportGridID, + title: i18n['GGBDR6002M'], + toolbarButtons: [{ + id: reportGridID + '-generate-button', + label: i18n['GGBDR6006M'], + onClick: function(event) { + wok.window.open('plugins/gingerbase/report-add.html'); + } + }, { + id: reportGridID + '-rename-button', + label: i18n['GGBDR6008M'], + disabled: true, + onClick: function(event) { + var report = reportGrid.getSelected(); + if(!report) { + return; + } + + kimchi.selectedReport = report['name']; + wok.window.open('plugins/gingerbase/report-rename.html'); + } + }, { + id: reportGridID + '-remove-button', + label: i18n['GGBDR6009M'], + disabled: true, + onClick: function(event) { + var report = reportGrid.getSelected(); + if(!report) { + return; + } + + var settings = { + title : i18n['GGBAPI6004M'], + content : i18n['GGBDR6001M'], + confirm : i18n['GGBAPI6002M'], + cancel : i18n['GGBAPI6003M'] + }; + + wok.confirm(settings, function() { + kimchi.deleteReport({ + name: report['name'] + }, function(result) { + listDebugReports(); + }, function(error) { + wok.message.error(error.responseJSON.reason); + }); + }); + } + }, { + id: reportGridID + '-download-button', + label: i18n['GGBDR6010M'], + disabled: true, + onClick: function(event) { + var report = reportGrid.getSelected(); + if(!report) { + return; + } + + kimchi.downloadReport({ + file: report['uri'] + }); + } + }], + onRowSelected: function(row) { + var report = reportGrid.getSelected(); + // Only enable report buttons if the selected line is not a + // pending report + if (report['time'] == i18n['GGBDR6007M']) { + var gridElement = $('#'+ reportGridID); + var row = $('tr:contains(' + report['name'] + ')', gridElement); + enableReportButtons(false); + row.attr('class', ''); + } + else { + enableReportButtons(true); + } + }, + frozenFields: [], + fields: [{ + name: 'name', + label: i18n['GGBDR6003M'], + 'class': 'debug-report-name' + }, { + name: 'time', + label: i18n['GGBDR6005M'], + 'class': 'debug-report-time' + }], + data: reports + }); + }; + + var getPendingReports = function() { + var reports = [] + var filter = 'status=running&target_uri=' + encodeURIComponent('^/plugins/gingerbase/debugreports/*') + + kimchi.getTasksByFilter(filter, function(tasks) { + for(var i = 0; i < tasks.length; i++) { + reportName = tasks[i].target_uri.replace(/^\/plugins\/gingerbase\/debugreports\//, '') || i18n['GGBDR6012M']; + reports.push({'name': reportName, 'time': i18n['GGBDR6007M']}) + + if(kimchi.trackingTasks.indexOf(tasks[i].id) >= 0) { + continue; + } + + kimchi.trackTask(tasks[i].id, function(result) { + wok.topic('kimchi/debugReportAdded').publish(); + }, function(result) { + // Error message from Async Task status + if (result['message']) { + var errText = result['message']; + } + // Error message from standard kimchi exception + else { + var errText = result['responseJSON']['reason']; + } + result && wok.message.error(errText); + wok.topic('kimchi/debugReportAdded').publish(); + }, null); + } + }, null, true); + + return reports; + }; + + var listDebugReports = function() { + kimchi.listReports(function(reports) { + pendingReports = getPendingReports(); + allReports = pendingReports.concat(reports); + $('#debug-report-section').removeClass('hidden'); + + // Row selection will be cleared so disable buttons here + enableReportButtons(false); + + if(reportGrid) { + reportGrid.setData(allReports); + } + else { + initReportGrid(allReports); + } + + // Set id-debug-img to pending reports + // It will display a loading icon + var gridElement = $('#' + reportGridID); + $.each($('td:contains(' + i18n['GGBDR6007M'] + ')', gridElement), function(index, row) { + $(row).parent().addClass('no-hover'); + $(row).attr('id', 'id-debug-img'); + }); + }, function(error) { + if(error['status'] == 403) { + $('#debug-report-section').addClass('hidden'); + return; + } + $('#debug-report-section').removeClass('hidden'); + }); + }; + + var shutdownButtonID = '#host-button-shutdown'; + var restartButtonID = '#host-button-restart'; + var shutdownHost = function(params) { + var settings = { + title : i18n['GGBAPI6004M'], + content : i18n['GGBHOST6008M'], + confirm : i18n['GGBAPI6002M'], + cancel : i18n['GGBAPI6003M'] + }; + + wok.confirm(settings, function() { + kimchi.shutdown(params); + $(shutdownButtonID).prop('disabled', true); + $(restartButtonID).prop('disabled', true); + // Check if there is any VM is running. + // FIXME : Find alternative way to figure out if any vms running + // kimchi.listVMs(function(vms) { + // for(var i = 0; i < vms.length; i++) { + // if(vms[i]['state'] === 'running') { + // wok.message.error.code('GGBHOST6001E'); + // $(shutdownButtonID).prop('disabled', false); + // $(restartButtonID).prop('disabled', false); + // return; + // } + // } + // + // }); + }, function() { + }); + }; + + var initPage = function() { + $('#host-info-container .section-header').each(function(i, header) { + $('<span class="arrow"></span>').prependTo(header); + var toExpand = $(header).attr('aria-expanded') !== 'false'; + expand(header, toExpand); + }); + + $('#host-info-container').on('click', '.section-header', function(event) { + var toExpand = $(this).attr('aria-expanded') === 'false'; + expand(this, toExpand); + }); + + $('#host-button-shutdown').on('click', function(event) { + shutdownHost(null); + }); + + $('#host-button-restart').on('click', function(event) { + shutdownHost({ + reboot: true + }); + }); + + var setupUI = function() { + if (kimchi.capabilities == undefined) { + setTimeout(setupUI, 2000); + return; + } + + if((kimchi.capabilities['repo_mngt_tool']) && (kimchi.capabilities['repo_mngt_tool']!="None")) { + initRepositoriesGrid(kimchi.capabilities['repo_mngt_tool']); + $('#repositories-section').switchClass('hidden', kimchi.capabilities['repo_mngt_tool']); + wok.topic('kimchi/repositoryAdded') + .subscribe(listRepositories); + wok.topic('kimchi/repositoryUpdated') + .subscribe(listRepositories); + wok.topic('kimchi/repositoryDeleted') + .subscribe(listRepositories); + } + + if(kimchi.capabilities['update_tool']) { + $('#software-update-section').removeClass('hidden'); + initSoftwareUpdatesGrid(); + wok.topic('kimchi/softwareUpdated') + .subscribe(listSoftwareUpdates); + $('#software-updates-progress-container').accordion({ + collapsible: true + }); + } + + if(kimchi.capabilities['system_report_tool']) { + listDebugReports(); + wok.topic('kimchi/debugReportAdded') + .subscribe(listDebugReports); + wok.topic('kimchi/debugReportRenamed') + .subscribe(listDebugReports); + } + }; + setupUI(); + }; + + kimchi.getHost(function(data) { + var htmlTmpl = $('#host-tmpl').html(); + data['logo'] = data['logo'] || ''; + data['memory'] = wok.formatMeasurement(data['memory'], { + fixed: 2 + }); + var templated = wok.substitute(htmlTmpl, data); + $('#host-content-container').html(templated); + + initPage(); + initTracker(); + }); + + var StatsMgr = function() { + var statsArray = { + cpu: { + u: { + type: 'percent', + legend: i18n['GGBHOST6002M'], + points: [] + } + }, + memory: { + u: { + type: 'value', + base: 2, + fixed: 2, + legend: i18n['GGBHOST6003M'], + points: [] + } + }, + diskIO: { + r: { + type: 'value', + base: 2, + fixed: 2, + unit: 'B/s', + legend: i18n['GGBHOST6004M'], + points: [] + }, + w: { + type: 'value', + base: 2, + fixed: 2, + unit: 'B/s', + legend: i18n['GGBHOST6005M'], + 'class': 'disk-write', + points: [] + } + }, + networkIO: { + r: { + type: 'value', + base: 2, + fixed: 2, + unit: 'B/s', + legend: i18n['GGBHOST6006M'], + points: [] + }, + s: { + type: 'value', + base: 2, + fixed: 2, + unit: 'B/s', + legend: i18n['GGBHOST6007M'], + 'class': 'network-sent', + points: [] + } + } + }; + var SIZE = 20; + var cursor = SIZE; + + var add = function(stats) { + for(var key in stats) { + var item = stats[key]; + for(var metrics in item) { + var value = item[metrics]['v']; + var max = item[metrics]['max']; + var unifiedMetrics = statsArray[key][metrics]; + var ps = unifiedMetrics['points']; + if(!Array.isArray(value)){ + ps.push(value); + if(ps.length > SIZE + 1) { + ps.shift(); + } + } + else{ + ps=ps.concat(value); + ps.splice(0, ps.length-SIZE-1); + unifiedMetrics['points']=ps; + } + if(max !== undefined) { + unifiedMetrics['max'] = max; + } + else { + if(unifiedMetrics['type'] !== 'value') { + continue; + } + max = -Infinity; + $.each(ps, function(i, value) { + if(value > max) { + max = value; + } + }); + if(max === 0) { + ++max; + } + max *= 1.1; + unifiedMetrics['max'] = max; + } + } + } + cursor++; + }; + + var get = function(which) { + var stats = statsArray[which]; + var lines = []; + for(var k in stats) { + var obj = stats[k]; + var line = { + type: obj['type'], + base: obj['base'], + unit: obj['unit'], + fixed: obj['fixed'], + legend: obj['legend'] + }; + if(obj['max']) { + line['max'] = obj['max']; + } + if(obj['class']) { + line['class'] = obj['class']; + } + var ps = obj['points']; + var numStats = ps.length; + var unifiedPoints = []; + $.each(ps, function(i, value) { + unifiedPoints.push({ + x: cursor - numStats + i, + y: value + }); + }); + line['points'] = unifiedPoints; + lines.push(line); + } + return lines; + }; + + return { + add: add, + get: get + }; + }; + + var Tracker = function(charts) { + var charts = charts; + var timer = null; + var statsPool = new StatsMgr(); + var setCharts = function(newCharts) { + charts = newCharts; + for(var key in charts) { + var chart = charts[key]; + chart.updateUI(statsPool.get(key)); + } + }; + + var self = this; + + var UnifyStats = function(stats) { + var result= { + cpu: { + u: { + v: stats['cpu_utilization'] + } + }, + memory: { + u: { + } + }, + diskIO: { + r: { + v: stats['disk_read_rate'] + }, + w: { + v: stats['disk_write_rate'] + } + }, + networkIO: { + r: { + v: stats['net_recv_rate'] + }, + s: { + v: stats['net_sent_rate'] + } + } + }; + if(Array.isArray(stats['memory'])){ + result.memory.u['v']=[]; + result.memory.u['max']=-Infinity; + for(var i=0;i<stats['memory'].length;i++){ + result.memory.u['v'].push(stats['memory'][i]['avail']); + result.memory.u['max']=Math.max(result.memory.u['max'],stats['memory'][i]['total']); + } + } + else { + result.memory.u['v']=stats['memory']['avail'], + result.memory.u['max']=stats['memory']['total'] + } + return(result); + }; + + + var statsCallback = function(stats) { + var unifiedStats = UnifyStats(stats); + statsPool.add(unifiedStats); + for(var key in charts) { + var chart = charts[key]; + chart.updateUI(statsPool.get(key)); + } + timer = setTimeout(function() { + continueTrack(); + }, 1000); + }; + + var track = function() { + kimchi.getHostStatsHistory(statsCallback, + function() { + continueTrack(); + }); + }; + + var continueTrack = function() { + kimchi.getHostStats(statsCallback, + function() { + continueTrack(); + }); + }; + + var destroy = function() { + timer && clearTimeout(timer); + timer = null; + }; + + return { + setCharts: setCharts, + start: track, + stop: destroy + }; + }; + + var initTracker = function() { + // TODO: Extend tabs with onUnload event to unregister timers. + if(kimchi.hostTimer) { + kimchi.hostTimer.stop(); + delete kimchi.hostTimer; + } + + var trackedCharts = { + cpu: new wok.widget.LineChart({ + id: 'chart-cpu', + node: 'container-chart-cpu', + type: 'percent' + }), + memory: new wok.widget.LineChart({ + id: 'chart-memory', + node: 'container-chart-memory', + type: 'value' + }), + diskIO: new wok.widget.LineChart({ + id: 'chart-disk-io', + node: 'container-chart-disk-io', + type: 'value' + }), + networkIO: new wok.widget.LineChart({ + id: 'chart-network-io', + node: 'container-chart-network-io', + type: 'value' + }) + }; + + if(kimchi.hostTimer) { + kimchi.hostTimer.setCharts(trackedCharts); + } + else { + kimchi.hostTimer = new Tracker(trackedCharts); + kimchi.hostTimer.start(); + } + }; + + $('#host-root-container').on('remove', function() { + if(kimchi.hostTimer) { + kimchi.hostTimer.stop(); + delete kimchi.hostTimer; + } + + repositoriesGrid && repositoriesGrid.destroy(); + wok.topic('kimchi/repositoryAdded') + .unsubscribe(listRepositories); + wok.topic('kimchi/repositoryUpdated') + .unsubscribe(listRepositories); + wok.topic('kimchi/repositoryDeleted') + .unsubscribe(listRepositories); + + softwareUpdatesGrid && softwareUpdatesGrid.destroy(); + wok.topic('kimchi/softwareUpdated').unsubscribe(listSoftwareUpdates); + + reportGrid && reportGrid.destroy(); + wok.topic('kimchi/debugReportAdded').unsubscribe(listDebugReports); + wok.topic('kimchi/debugReportRenamed').unsubscribe(listDebugReports); + }); +}; diff --git a/src/wok/plugins/gingerbase/ui/js/src/gingerbase.main.js b/src/wok/plugins/gingerbase/ui/js/src/gingerbase.main.js new file mode 100644 index 0000000..824673d --- /dev/null +++ b/src/wok/plugins/gingerbase/ui/js/src/gingerbase.main.js @@ -0,0 +1,26 @@ +/* + * Project Ginger Base + * + * Copyright IBM, Corp. 2013-2015 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +kimchi.capabilities = undefined; +kimchi.getCapabilities(function(result) { + kimchi.capabilities = result; + + if(kimchi.capabilities.federation=="on") + $('#peers').removeClass('hide-content'); +}, function() { + kimchi.capabilities = {}; +}); diff --git a/src/wok/plugins/gingerbase/ui/js/src/gingerbase.report_add_main.js b/src/wok/plugins/gingerbase/ui/js/src/gingerbase.report_add_main.js new file mode 100644 index 0000000..e8a2f4d --- /dev/null +++ b/src/wok/plugins/gingerbase/ui/js/src/gingerbase.report_add_main.js @@ -0,0 +1,72 @@ +/* + * Project Ginger Base + * + * Copyright IBM, Corp. 2013-2015 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +kimchi.report_add_main = function() { + var reportGridID = 'available-reports-grid'; + var addReportForm = $('#form-report-add'); + var submitButton = $('#button-report-add'); + var nameTextbox = $('input[name="name"]', addReportForm); + nameTextbox.select(); + + var submitForm = function(event) { + if(submitButton.prop('disabled')) { + return false; + } + var reportName = nameTextbox.val(); + var validator = RegExp("^[_A-Za-z0-9-]*$"); + if (!validator.test(reportName)) { + wok.message.error.code('GGBDR6011M'); + return false; + } + var formData = addReportForm.serializeObject(); + var taskAccepted = false; + var onTaskAccepted = function() { + if(taskAccepted) { + return; + } + taskAccepted = true; + wok.window.close(); + wok.topic('kimchi/debugReportAdded').publish(); + }; + + kimchi.createReport(formData, function(result) { + onTaskAccepted(); + wok.topic('kimchi/debugReportAdded').publish(); + }, function(result) { + // Error message from Async Task status + if (result['message']) { + var errText = result['message']; + } + // Error message from standard kimchi exception + else { + var errText = result['responseJSON']['reason']; + } + result && wok.message.error(errText); + + taskAccepted && + $('.grid-body-view table tr:first-child', + '#' + reportGridID).remove(); + submitButton.prop('disabled', false); + nameTextbox.select(); + }, onTaskAccepted); + + event.preventDefault(); + }; + + addReportForm.on('submit', submitForm); + submitButton.on('click', submitForm); +}; diff --git a/src/wok/plugins/gingerbase/ui/js/src/gingerbase.report_rename_main.js b/src/wok/plugins/gingerbase/ui/js/src/gingerbase.report_rename_main.js new file mode 100644 index 0000000..b107ce5 --- /dev/null +++ b/src/wok/plugins/gingerbase/ui/js/src/gingerbase.report_rename_main.js @@ -0,0 +1,66 @@ +/* + * Project Ginger Base + * + * Copyright IBM, Corp. 2015 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +kimchi.report_rename_main = function() { + var renameReportForm = $('#form-report-rename'); + var submitButton = $('#button-report-rename'); + var nameTextbox = $('input[name="name"]', renameReportForm); + var submitForm = function(event) { + if(submitButton.prop('disabled')) { + return false; + } + var reportName = nameTextbox.val(); + + // if the user hasn't changed the report's name, + // nothing should be done. + if (reportName == kimchi.selectedReport) { + wok.message.error.code('GGBDR6013M'); + return false; + } + + var validator = RegExp("^[A-Za-z0-9-]*$"); + if (!validator.test(reportName)) { + wok.message.error.code('GGBDR6011M'); + return false; + } + var formData = renameReportForm.serializeObject(); + submitButton.prop('disabled', true); + nameTextbox.prop('disabled', true); + kimchi.renameReport(kimchi.selectedReport, formData, function(result) { + submitButton.prop('disabled', false); + nameTextbox.prop('disabled', false); + wok.window.close(); + wok.topic('kimchi/debugReportRenamed').publish({ + result: result + }); + }, function(result) { + var errText = result && + result['responseJSON'] && + result['responseJSON']['reason']; + wok.message.error(errText); + submitButton.prop('disabled', false); + nameTextbox.prop('disabled', false).focus(); + }); + + event.preventDefault(); + }; + + renameReportForm.on('submit', submitForm); + submitButton.on('click', submitForm); + + nameTextbox.val(kimchi.selectedReport).select(); +}; diff --git a/src/wok/plugins/gingerbase/ui/js/src/gingerbase.repository_add_main.js b/src/wok/plugins/gingerbase/ui/js/src/gingerbase.repository_add_main.js new file mode 100644 index 0000000..e612cdf --- /dev/null +++ b/src/wok/plugins/gingerbase/ui/js/src/gingerbase.repository_add_main.js @@ -0,0 +1,96 @@ +/* + * Project Ginger Base + * + * Copyright IBM, Corp. 2015 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +kimchi.repository_add_main = function() { + + var addForm = $('#form-repository-add'); + var addButton = $('#button-repository-add'); + + var validateField = function(event) { + var valid=($(this).val()!==''); + $(addButton).prop('disabled', !valid); + return(valid); + }; + + var validateForm = function(event) { + var valid=false; + addForm.find('input.required').each( function() { + valid=($(this).val()!==''); + return(!valid); + }); + return(valid); + } + + addForm.find('input.required').on('input propertychange', validateField); + + var weedObject = function(obj) { + for (var key in obj) { + if (obj.hasOwnProperty(key)) { + if((typeof(obj[key])==="object") && !Array.isArray(obj[key])) { + weedObject(obj[key]); + } + else if(obj[key] == '') { + delete obj[key]; + } + } + } + } + + var addRepository = function(event) { + var valid = validateForm(); + if(!valid) { + return false; + } + + var formData = $(addForm).serializeObject(); + + if (formData && formData.isMirror!=undefined) { + formData.isMirror=(String(formData.isMirror).toLowerCase() === 'true'); + } + if(formData.isMirror) { + if(formData.config==undefined) { + formData.config=new Object(); + } + formData.config.mirrorlist=formData.baseurl; + delete formData.baseurl; + delete formData.isMirror; + } + weedObject(formData); + if(formData.config && formData.config.comps) { + formData.config.comps=formData.config.comps.split(/[,\s]/); + for(var i=0; i>formData.config.comps.length; i++) { + formData.config.comps[i]=formData.config.comps[i].trim(); + } + for (var j=formData.config.comps.indexOf(""); j!=-1; j=formData.config.comps.indexOf("")) { + formData.config.comps.splice(j, 1); + } + } + + kimchi.createRepository(formData, function() { + wok.topic('kimchi/repositoryAdded').publish(); + wok.window.close(); + }, function(jqXHR, textStatus, errorThrown) { + var reason = jqXHR && + jqXHR['responseJSON'] && + jqXHR['responseJSON']['reason']; + wok.message.error(reason); + }); + return false; + }; + + $(addForm).on('submit', addRepository); +}; diff --git a/src/wok/plugins/gingerbase/ui/js/src/gingerbase.repository_edit_main.js b/src/wok/plugins/gingerbase/ui/js/src/gingerbase.repository_edit_main.js new file mode 100644 index 0000000..a6e0371 --- /dev/null +++ b/src/wok/plugins/gingerbase/ui/js/src/gingerbase.repository_edit_main.js @@ -0,0 +1,74 @@ +/* + * Project Ginger Base + * + * Copyright IBM, Corp. 2015 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +kimchi.repository_edit_main = function() { + + var editForm = $('#form-repository-edit'); + + var saveButton = $('#repository-edit-button-save'); + + if(kimchi.capabilities['repo_mngt_tool']=="yum") { + editForm.find('input.deb').prop('disabled', true); + } + else if(kimchi.capabilities['repo_mngt_tool']=="deb") { + editForm.find('input.yum').prop('disabled', true); + } + + kimchi.retrieveRepository(kimchi.selectedRepository, function(repository) { + editForm.fillWithObject(repository); + + $('input', editForm).on('input propertychange', function(event) { + if($(this).val() !== '') { + $(saveButton).prop('disabled', false); + } + }); + }); + + + var editRepository = function(event) { + var formData = $(editForm).serializeObject(); + + if (formData && formData.config) { + formData.config.gpgcheck=(String(formData.config.gpgcheck).toLowerCase() === 'true'); + } + + if(formData.config && formData.config.comps) { + formData.config.comps=formData.config.comps.split(/[,\s]/); + for(var i=0; i>formData.config.comps.length; i++) { + formData.config.comps[i]=formData.config.comps[i].trim(); + } + for (var j=formData.config.comps.indexOf(""); j!=-1; j=formData.config.comps.indexOf("")) { + formData.config.comps.splice(j, 1); + } + } + + kimchi.updateRepository(kimchi.selectedRepository, formData, function() { + wok.topic('kimchi/repositoryUpdated').publish(); + wok.window.close(); + }, function(jqXHR, textStatus, errorThrown) { + var reason = jqXHR && + jqXHR['responseJSON'] && + jqXHR['responseJSON']['reason']; + wok.message.error(reason); + }); + + return false; + }; + + $(editForm).on('submit', editRepository); + $(saveButton).on('click', editRepository); +}; diff --git a/src/wok/plugins/kimchi/ui/js/src/kimchi.host.js b/src/wok/plugins/kimchi/ui/js/src/kimchi.host.js deleted file mode 100644 index c3765dc..0000000 --- a/src/wok/plugins/kimchi/ui/js/src/kimchi.host.js +++ /dev/null @@ -1,858 +0,0 @@ -/* - * Project Kimchi - * - * Copyright IBM, Corp. 2013-2015 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -kimchi.host={}; - -kimchi.host_main = function() { - var expand = function(header, toExpand) { - var controlledNode = $(header).attr('aria-controls'); - $('#' + controlledNode)[toExpand ? 'removeClass' : 'addClass']('hidden'); - $(header).attr('aria-expanded', toExpand ? 'true' : 'false'); - }; - - var repositoriesGrid = null; - var initRepositoriesGrid = function(repo_type) { - var gridFields=[]; - if (repo_type == "yum") { - gridFields=[{ - name: 'repo_id', - label: i18n['KCHREPO6004M'], - 'class': 'repository-id' - }, { - name: 'config[display_repo_name]', - label: i18n['KCHREPO6005M'], - 'class': 'repository-name' - }, { - name: 'enabled', - label: i18n['KCHREPO6009M'], - 'class': 'repository-enabled' - }]; - } - else if (repo_type == "deb") { - gridFields=[{ - name: 'baseurl', - label: i18n['KCHREPO6006M'], - makeTitle: true, - 'class': 'repository-baseurl deb' - }, { - name: 'enabled', - label: i18n['KCHREPO6009M'], - 'class': 'repository-enabled deb' - }, { - name: 'config[dist]', - label: "dist", - 'class': 'repository-gpgcheck deb' - }, { - name: 'config[comps]', - label: "comps", - 'class': 'repository-gpgcheck deb' - }]; - } - else { - gridFields=[{ - name: 'repo_id', - label: i18n['KCHREPO6004M'], - 'class': 'repository-id' - }, { - name: 'enabled', - label: i18n['KCHREPO6009M'], - 'class': 'repository-enabled' - }, { - name: 'baseurl', - label: i18n['KCHREPO6006M'], - makeTitle: true, - 'class': 'repository-baseurl' - }]; - } - repositoriesGrid = new wok.widget.Grid({ - container: 'repositories-grid-container', - id: 'repositories-grid', - title: i18n['KCHREPO6003M'], - toolbarButtons: [{ - id: 'repositories-grid-add-button', - label: i18n['KCHREPO6012M'], - onClick: function(event) { - wok.window.open({url:'plugins/kimchi/repository-add.html', - class: repo_type}); - } - }, { - id: 'repositories-grid-enable-button', - label: i18n['KCHREPO6016M'], - disabled: true, - onClick: function(event) { - var repository = repositoriesGrid.getSelected(); - if(!repository) { - return; - } - var name = repository['repo_id']; - var enable = !repository['enabled']; - $(this).prop('disabled', true); - kimchi.enableRepository(name, enable, function() { - wok.topic('kimchi/repositoryUpdated').publish(); - }); - } - }, { - id: 'repositories-grid-edit-button', - label: i18n['KCHREPO6013M'], - disabled: true, - onClick: function(event) { - var repository = repositoriesGrid.getSelected(); - if(!repository) { - return; - } - kimchi.selectedRepository = repository['repo_id']; - wok.window.open({url:'plugins/kimchi/repository-edit.html', - class: repo_type}); - } - }, { - id: 'repositories-grid-remove-button', - label: i18n['KCHREPO6014M'], - disabled: true, - onClick: function(event) { - var repository = repositoriesGrid.getSelected(); - if(!repository) { - return; - } - - var settings = { - title : i18n['KCHREPO6001M'], - content : i18n['KCHREPO6002M'], - confirm : i18n['KCHAPI6004M'], - cancel : i18n['KCHAPI6003M'] - }; - - wok.confirm(settings, function() { - kimchi.deleteRepository( - repository['repo_id'], - function(result) { - wok.topic('kimchi/repositoryDeleted').publish(result); - }, function(error) { - } - ); - }); - } - }], - onRowSelected: function(row) { - var repository = repositoriesGrid.getSelected(); - if(!repository) { - return; - } - $('#repositories-grid-remove-button').prop('disabled', false); - $('#repositories-grid-edit-button').prop('disabled', false); - var enabled = repository['enabled']; - $('#repositories-grid-enable-button') - .text(i18n[enabled ? 'KCHREPO6017M' : 'KCHREPO6016M']) - .prop('disabled', false); - }, - frozenFields: [], - fields: gridFields, - data: listRepositories - }); - }; - - var listRepositories = function(gridCallback) { - kimchi.listRepositories(function(repositories) { - if($.isFunction(gridCallback)) { - gridCallback(repositories); - } - else { - if(repositoriesGrid) { - repositoriesGrid.setData(repositories); - } - else { - initRepositoriesGrid(); - repositoriesGrid.setData(repositories); - } - } - }, - function(error) { - var message = error && error['responseJSON'] && error['responseJSON']['reason']; - - if($.isFunction(gridCallback)) { - gridCallback([]); - } - repositoriesGrid && - repositoriesGrid.showMessage(message || i18n['KCHUPD6008M']); - }); - - $('#repositories-grid-remove-button').prop('disabled', true); - $('#repositories-grid-edit-button').prop('disabled', true); - $('#repositories-grid-enable-button').prop('disabled', true); - }; - - var softwareUpdatesGridID = 'software-updates-grid'; - var softwareUpdatesGrid = null; - var progressAreaID = 'software-updates-progress-textarea'; - var reloadProgressArea = function(result) { - var progressArea = $('#' + progressAreaID)[0]; - $(progressArea).text(result['message']); - var scrollTop = $(progressArea).prop('scrollHeight'); - $(progressArea).prop('scrollTop', scrollTop); - }; - - var initSoftwareUpdatesGrid = function(softwareUpdates) { - softwareUpdatesGrid = new wok.widget.Grid({ - container: 'software-updates-grid-container', - id: softwareUpdatesGridID, - title: i18n['KCHUPD6001M'], - rowSelection: 'disabled', - toolbarButtons: [{ - id: softwareUpdatesGridID + '-update-button', - label: i18n['KCHUPD6006M'], - disabled: true, - onClick: function(event) { - var updateButton = $(this); - var progressArea = $('#' + progressAreaID)[0]; - $('#software-updates-progress-container').removeClass('hidden'); - $(progressArea).text(''); - !wok.isElementInViewport(progressArea) && - progressArea.scrollIntoView(); - $(updateButton).text(i18n['KCHUPD6007M']).prop('disabled', true); - - kimchi.updateSoftware(function(result) { - reloadProgressArea(result); - $(updateButton).text(i18n['KCHUPD6006M']).prop('disabled', false); - wok.topic('kimchi/softwareUpdated').publish({ - result: result - }); - }, function(error) { - var message = error && error['responseJSON'] && error['responseJSON']['reason']; - wok.message.error(message || i18n['KCHUPD6009M']); - $(updateButton).text(i18n['KCHUPD6006M']).prop('disabled', false); - }, reloadProgressArea); - } - }], - frozenFields: [], - fields: [{ - name: 'package_name', - label: i18n['KCHUPD6002M'], - 'class': 'software-update-name' - }, { - name: 'version', - label: i18n['KCHUPD6003M'], - 'class': 'software-update-version' - }, { - name: 'arch', - label: i18n['KCHUPD6004M'], - 'class': 'software-update-arch' - }, { - name: 'repository', - label: i18n['KCHUPD6005M'], - 'class': 'software-update-repos' - }], - data: listSoftwareUpdates - }); - }; - - var listSoftwareUpdates = function(gridCallback) { - kimchi.listSoftwareUpdates(function(softwareUpdates) { - if($.isFunction(gridCallback)) { - gridCallback(softwareUpdates); - } - else { - if(softwareUpdatesGrid) { - softwareUpdatesGrid.setData(softwareUpdates); - } - else { - initSoftwareUpdatesGrid(softwareUpdates); - } - } - - var updateButton = $('#' + softwareUpdatesGridID + '-update-button'); - $(updateButton).prop('disabled', softwareUpdates.length === 0); - }, function(error) { - var message = error && error['responseJSON'] && error['responseJSON']['reason']; - if($.isFunction(gridCallback)) { - gridCallback([]); - } - softwareUpdatesGrid && - softwareUpdatesGrid.showMessage(message || i18n['KCHUPD6008M']); - }); - }; - - var reportGridID = 'available-reports-grid'; - var reportGrid = null; - var enableReportButtons = function(toEnable) { - var buttonID = '#{grid}-{btn}-button'; - $.each(['rename', 'remove', 'download'], function(i, n) { - $(wok.substitute(buttonID, { - grid: reportGridID, - btn: n - })).prop('disabled', !toEnable); - }); - }; - var initReportGrid = function(reports) { - reportGrid = new wok.widget.Grid({ - container: 'available-reports-grid-container', - id: reportGridID, - title: i18n['KCHDR6002M'], - toolbarButtons: [{ - id: reportGridID + '-generate-button', - label: i18n['KCHDR6006M'], - onClick: function(event) { - wok.window.open('plugins/kimchi/report-add.html'); - } - }, { - id: reportGridID + '-rename-button', - label: i18n['KCHDR6008M'], - disabled: true, - onClick: function(event) { - var report = reportGrid.getSelected(); - if(!report) { - return; - } - - kimchi.selectedReport = report['name']; - wok.window.open('plugins/kimchi/report-rename.html'); - } - }, { - id: reportGridID + '-remove-button', - label: i18n['KCHDR6009M'], - disabled: true, - onClick: function(event) { - var report = reportGrid.getSelected(); - if(!report) { - return; - } - - var settings = { - title : i18n['KCHAPI6004M'], - content : i18n['KCHDR6001M'], - confirm : i18n['KCHAPI6002M'], - cancel : i18n['KCHAPI6003M'] - }; - - wok.confirm(settings, function() { - kimchi.deleteReport({ - name: report['name'] - }, function(result) { - listDebugReports(); - }, function(error) { - wok.message.error(error.responseJSON.reason); - }); - }); - } - }, { - id: reportGridID + '-download-button', - label: i18n['KCHDR6010M'], - disabled: true, - onClick: function(event) { - var report = reportGrid.getSelected(); - if(!report) { - return; - } - - kimchi.downloadReport({ - file: report['uri'] - }); - } - }], - onRowSelected: function(row) { - var report = reportGrid.getSelected(); - // Only enable report buttons if the selected line is not a - // pending report - if (report['time'] == i18n['KCHDR6007M']) { - var gridElement = $('#'+ reportGridID); - var row = $('tr:contains(' + report['name'] + ')', gridElement); - enableReportButtons(false); - row.attr('class', ''); - } - else { - enableReportButtons(true); - } - }, - frozenFields: [], - fields: [{ - name: 'name', - label: i18n['KCHDR6003M'], - 'class': 'debug-report-name' - }, { - name: 'time', - label: i18n['KCHDR6005M'], - 'class': 'debug-report-time' - }], - data: reports - }); - }; - - var getPendingReports = function() { - var reports = [] - var filter = 'status=running&target_uri=' + encodeURIComponent('^/plugins/kimchi/debugreports/*') - - kimchi.getTasksByFilter(filter, function(tasks) { - for(var i = 0; i < tasks.length; i++) { - reportName = tasks[i].target_uri.replace(/^\/plugins\/kimchi\/debugreports\//, '') || i18n['KCHDR6012M']; - reports.push({'name': reportName, 'time': i18n['KCHDR6007M']}) - - if(kimchi.trackingTasks.indexOf(tasks[i].id) >= 0) { - continue; - } - - kimchi.trackTask(tasks[i].id, function(result) { - wok.topic('kimchi/debugReportAdded').publish(); - }, function(result) { - // Error message from Async Task status - if (result['message']) { - var errText = result['message']; - } - // Error message from standard kimchi exception - else { - var errText = result['responseJSON']['reason']; - } - result && wok.message.error(errText); - wok.topic('kimchi/debugReportAdded').publish(); - }, null); - } - }, null, true); - - return reports; - }; - - var listDebugReports = function() { - kimchi.listReports(function(reports) { - pendingReports = getPendingReports(); - allReports = pendingReports.concat(reports); - $('#debug-report-section').removeClass('hidden'); - - // Row selection will be cleared so disable buttons here - enableReportButtons(false); - - if(reportGrid) { - reportGrid.setData(allReports); - } - else { - initReportGrid(allReports); - } - - // Set id-debug-img to pending reports - // It will display a loading icon - var gridElement = $('#' + reportGridID); - $.each($('td:contains(' + i18n['KCHDR6007M'] + ')', gridElement), function(index, row) { - $(row).parent().addClass('no-hover'); - $(row).attr('id', 'id-debug-img'); - }); - }, function(error) { - if(error['status'] == 403) { - $('#debug-report-section').addClass('hidden'); - return; - } - $('#debug-report-section').removeClass('hidden'); - }); - }; - - var shutdownButtonID = '#host-button-shutdown'; - var restartButtonID = '#host-button-restart'; - var shutdownHost = function(params) { - var settings = { - title : i18n['KCHAPI6004M'], - content : i18n['KCHHOST6008M'], - confirm : i18n['KCHAPI6002M'], - cancel : i18n['KCHAPI6003M'] - }; - - wok.confirm(settings, function() { - kimchi.shutdown(params); - $(shutdownButtonID).prop('disabled', true); - $(restartButtonID).prop('disabled', true); - // Check if there is any VM is running. - kimchi.listVMs(function(vms) { - for(var i = 0; i < vms.length; i++) { - if(vms[i]['state'] === 'running') { - wok.message.error.code('KCHHOST6001E'); - $(shutdownButtonID).prop('disabled', false); - $(restartButtonID).prop('disabled', false); - return; - } - } - - }); - }, function() { - }); - }; - - var initPage = function() { - $('#host-info-container .section-header').each(function(i, header) { - $('<span class="arrow"></span>').prependTo(header); - var toExpand = $(header).attr('aria-expanded') !== 'false'; - expand(header, toExpand); - }); - - $('#host-info-container').on('click', '.section-header', function(event) { - var toExpand = $(this).attr('aria-expanded') === 'false'; - expand(this, toExpand); - }); - - $('#host-button-shutdown').on('click', function(event) { - shutdownHost(null); - }); - - $('#host-button-restart').on('click', function(event) { - shutdownHost({ - reboot: true - }); - }); - - var setupUI = function() { - if (kimchi.capabilities == undefined) { - setTimeout(setupUI, 2000); - return; - } - - if((kimchi.capabilities['repo_mngt_tool']) && (kimchi.capabilities['repo_mngt_tool']!="None")) { - initRepositoriesGrid(kimchi.capabilities['repo_mngt_tool']); - $('#repositories-section').switchClass('hidden', kimchi.capabilities['repo_mngt_tool']); - wok.topic('kimchi/repositoryAdded') - .subscribe(listRepositories); - wok.topic('kimchi/repositoryUpdated') - .subscribe(listRepositories); - wok.topic('kimchi/repositoryDeleted') - .subscribe(listRepositories); - } - - if(kimchi.capabilities['update_tool']) { - $('#software-update-section').removeClass('hidden'); - initSoftwareUpdatesGrid(); - wok.topic('kimchi/softwareUpdated') - .subscribe(listSoftwareUpdates); - $('#software-updates-progress-container').accordion({ - collapsible: true - }); - } - - if(kimchi.capabilities['system_report_tool']) { - listDebugReports(); - wok.topic('kimchi/debugReportAdded') - .subscribe(listDebugReports); - wok.topic('kimchi/debugReportRenamed') - .subscribe(listDebugReports); - } - }; - setupUI(); - }; - - kimchi.getHost(function(data) { - var htmlTmpl = $('#host-tmpl').html(); - data['logo'] = data['logo'] || ''; - data['memory'] = wok.formatMeasurement(data['memory'], { - fixed: 2 - }); - var templated = wok.substitute(htmlTmpl, data); - $('#host-content-container').html(templated); - - initPage(); - initTracker(); - }); - - var StatsMgr = function() { - var statsArray = { - cpu: { - u: { - type: 'percent', - legend: i18n['KCHHOST6002M'], - points: [] - } - }, - memory: { - u: { - type: 'value', - base: 2, - fixed: 2, - legend: i18n['KCHHOST6003M'], - points: [] - } - }, - diskIO: { - r: { - type: 'value', - base: 2, - fixed: 2, - unit: 'B/s', - legend: i18n['KCHHOST6004M'], - points: [] - }, - w: { - type: 'value', - base: 2, - fixed: 2, - unit: 'B/s', - legend: i18n['KCHHOST6005M'], - 'class': 'disk-write', - points: [] - } - }, - networkIO: { - r: { - type: 'value', - base: 2, - fixed: 2, - unit: 'B/s', - legend: i18n['KCHHOST6006M'], - points: [] - }, - s: { - type: 'value', - base: 2, - fixed: 2, - unit: 'B/s', - legend: i18n['KCHHOST6007M'], - 'class': 'network-sent', - points: [] - } - } - }; - var SIZE = 20; - var cursor = SIZE; - - var add = function(stats) { - for(var key in stats) { - var item = stats[key]; - for(var metrics in item) { - var value = item[metrics]['v']; - var max = item[metrics]['max']; - var unifiedMetrics = statsArray[key][metrics]; - var ps = unifiedMetrics['points']; - if(!Array.isArray(value)){ - ps.push(value); - if(ps.length > SIZE + 1) { - ps.shift(); - } - } - else{ - ps=ps.concat(value); - ps.splice(0, ps.length-SIZE-1); - unifiedMetrics['points']=ps; - } - if(max !== undefined) { - unifiedMetrics['max'] = max; - } - else { - if(unifiedMetrics['type'] !== 'value') { - continue; - } - max = -Infinity; - $.each(ps, function(i, value) { - if(value > max) { - max = value; - } - }); - if(max === 0) { - ++max; - } - max *= 1.1; - unifiedMetrics['max'] = max; - } - } - } - cursor++; - }; - - var get = function(which) { - var stats = statsArray[which]; - var lines = []; - for(var k in stats) { - var obj = stats[k]; - var line = { - type: obj['type'], - base: obj['base'], - unit: obj['unit'], - fixed: obj['fixed'], - legend: obj['legend'] - }; - if(obj['max']) { - line['max'] = obj['max']; - } - if(obj['class']) { - line['class'] = obj['class']; - } - var ps = obj['points']; - var numStats = ps.length; - var unifiedPoints = []; - $.each(ps, function(i, value) { - unifiedPoints.push({ - x: cursor - numStats + i, - y: value - }); - }); - line['points'] = unifiedPoints; - lines.push(line); - } - return lines; - }; - - return { - add: add, - get: get - }; - }; - - var Tracker = function(charts) { - var charts = charts; - var timer = null; - var statsPool = new StatsMgr(); - var setCharts = function(newCharts) { - charts = newCharts; - for(var key in charts) { - var chart = charts[key]; - chart.updateUI(statsPool.get(key)); - } - }; - - var self = this; - - var UnifyStats = function(stats) { - var result= { - cpu: { - u: { - v: stats['cpu_utilization'] - } - }, - memory: { - u: { - } - }, - diskIO: { - r: { - v: stats['disk_read_rate'] - }, - w: { - v: stats['disk_write_rate'] - } - }, - networkIO: { - r: { - v: stats['net_recv_rate'] - }, - s: { - v: stats['net_sent_rate'] - } - } - }; - if(Array.isArray(stats['memory'])){ - result.memory.u['v']=[]; - result.memory.u['max']=-Infinity; - for(var i=0;i<stats['memory'].length;i++){ - result.memory.u['v'].push(stats['memory'][i]['avail']); - result.memory.u['max']=Math.max(result.memory.u['max'],stats['memory'][i]['total']); - } - } - else { - result.memory.u['v']=stats['memory']['avail'], - result.memory.u['max']=stats['memory']['total'] - } - return(result); - }; - - - var statsCallback = function(stats) { - var unifiedStats = UnifyStats(stats); - statsPool.add(unifiedStats); - for(var key in charts) { - var chart = charts[key]; - chart.updateUI(statsPool.get(key)); - } - timer = setTimeout(function() { - continueTrack(); - }, 1000); - }; - - var track = function() { - kimchi.getHostStatsHistory(statsCallback, - function() { - continueTrack(); - }); - }; - - var continueTrack = function() { - kimchi.getHostStats(statsCallback, - function() { - continueTrack(); - }); - }; - - var destroy = function() { - timer && clearTimeout(timer); - timer = null; - }; - - return { - setCharts: setCharts, - start: track, - stop: destroy - }; - }; - - var initTracker = function() { - // TODO: Extend tabs with onUnload event to unregister timers. - if(kimchi.hostTimer) { - kimchi.hostTimer.stop(); - delete kimchi.hostTimer; - } - - var trackedCharts = { - cpu: new wok.widget.LineChart({ - id: 'chart-cpu', - node: 'container-chart-cpu', - type: 'percent' - }), - memory: new wok.widget.LineChart({ - id: 'chart-memory', - node: 'container-chart-memory', - type: 'value' - }), - diskIO: new wok.widget.LineChart({ - id: 'chart-disk-io', - node: 'container-chart-disk-io', - type: 'value' - }), - networkIO: new wok.widget.LineChart({ - id: 'chart-network-io', - node: 'container-chart-network-io', - type: 'value' - }) - }; - - if(kimchi.hostTimer) { - kimchi.hostTimer.setCharts(trackedCharts); - } - else { - kimchi.hostTimer = new Tracker(trackedCharts); - kimchi.hostTimer.start(); - } - }; - - $('#host-root-container').on('remove', function() { - if(kimchi.hostTimer) { - kimchi.hostTimer.stop(); - delete kimchi.hostTimer; - } - - repositoriesGrid && repositoriesGrid.destroy(); - wok.topic('kimchi/repositoryAdded') - .unsubscribe(listRepositories); - wok.topic('kimchi/repositoryUpdated') - .unsubscribe(listRepositories); - wok.topic('kimchi/repositoryDeleted') - .unsubscribe(listRepositories); - - softwareUpdatesGrid && softwareUpdatesGrid.destroy(); - wok.topic('kimchi/softwareUpdated').unsubscribe(listSoftwareUpdates); - - reportGrid && reportGrid.destroy(); - wok.topic('kimchi/debugReportAdded').unsubscribe(listDebugReports); - wok.topic('kimchi/debugReportRenamed').unsubscribe(listDebugReports); - }); -}; diff --git a/src/wok/plugins/kimchi/ui/js/src/kimchi.report_add_main.js b/src/wok/plugins/kimchi/ui/js/src/kimchi.report_add_main.js deleted file mode 100644 index 5f098d3..0000000 --- a/src/wok/plugins/kimchi/ui/js/src/kimchi.report_add_main.js +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Project Kimchi - * - * Copyright IBM, Corp. 2013-2014 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -kimchi.report_add_main = function() { - var reportGridID = 'available-reports-grid'; - var addReportForm = $('#form-report-add'); - var submitButton = $('#button-report-add'); - var nameTextbox = $('input[name="name"]', addReportForm); - nameTextbox.select(); - - var submitForm = function(event) { - if(submitButton.prop('disabled')) { - return false; - } - var reportName = nameTextbox.val(); - var validator = RegExp("^[_A-Za-z0-9-]*$"); - if (!validator.test(reportName)) { - wok.message.error.code('KCHDR6011M'); - return false; - } - var formData = addReportForm.serializeObject(); - var taskAccepted = false; - var onTaskAccepted = function() { - if(taskAccepted) { - return; - } - taskAccepted = true; - wok.window.close(); - wok.topic('kimchi/debugReportAdded').publish(); - }; - - kimchi.createReport(formData, function(result) { - onTaskAccepted(); - wok.topic('kimchi/debugReportAdded').publish(); - }, function(result) { - // Error message from Async Task status - if (result['message']) { - var errText = result['message']; - } - // Error message from standard kimchi exception - else { - var errText = result['responseJSON']['reason']; - } - result && wok.message.error(errText); - - taskAccepted && - $('.grid-body-view table tr:first-child', - '#' + reportGridID).remove(); - submitButton.prop('disabled', false); - nameTextbox.select(); - }, onTaskAccepted); - - event.preventDefault(); - }; - - addReportForm.on('submit', submitForm); - submitButton.on('click', submitForm); -}; diff --git a/src/wok/plugins/kimchi/ui/js/src/kimchi.report_rename_main.js b/src/wok/plugins/kimchi/ui/js/src/kimchi.report_rename_main.js deleted file mode 100644 index 1bdb8d9..0000000 --- a/src/wok/plugins/kimchi/ui/js/src/kimchi.report_rename_main.js +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Project Kimchi - * - * Copyright IBM, Corp. 2014 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -kimchi.report_rename_main = function() { - var renameReportForm = $('#form-report-rename'); - var submitButton = $('#button-report-rename'); - var nameTextbox = $('input[name="name"]', renameReportForm); - var submitForm = function(event) { - if(submitButton.prop('disabled')) { - return false; - } - var reportName = nameTextbox.val(); - - // if the user hasn't changed the report's name, - // nothing should be done. - if (reportName == kimchi.selectedReport) { - wok.message.error.code('KCHDR6013M'); - return false; - } - - var validator = RegExp("^[A-Za-z0-9-]*$"); - if (!validator.test(reportName)) { - wok.message.error.code('KCHDR6011M'); - return false; - } - var formData = renameReportForm.serializeObject(); - submitButton.prop('disabled', true); - nameTextbox.prop('disabled', true); - kimchi.renameReport(kimchi.selectedReport, formData, function(result) { - submitButton.prop('disabled', false); - nameTextbox.prop('disabled', false); - wok.window.close(); - wok.topic('kimchi/debugReportRenamed').publish({ - result: result - }); - }, function(result) { - var errText = result && - result['responseJSON'] && - result['responseJSON']['reason']; - wok.message.error(errText); - submitButton.prop('disabled', false); - nameTextbox.prop('disabled', false).focus(); - }); - - event.preventDefault(); - }; - - renameReportForm.on('submit', submitForm); - submitButton.on('click', submitForm); - - nameTextbox.val(kimchi.selectedReport).select(); -}; diff --git a/src/wok/plugins/kimchi/ui/js/src/kimchi.repository_add_main.js b/src/wok/plugins/kimchi/ui/js/src/kimchi.repository_add_main.js deleted file mode 100644 index 656306b..0000000 --- a/src/wok/plugins/kimchi/ui/js/src/kimchi.repository_add_main.js +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Project Kimchi - * - * Copyright IBM, Corp. 2014 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -kimchi.repository_add_main = function() { - - var addForm = $('#form-repository-add'); - var addButton = $('#button-repository-add'); - - var validateField = function(event) { - var valid=($(this).val()!==''); - $(addButton).prop('disabled', !valid); - return(valid); - }; - - var validateForm = function(event) { - var valid=false; - addForm.find('input.required').each( function() { - valid=($(this).val()!==''); - return(!valid); - }); - return(valid); - } - - addForm.find('input.required').on('input propertychange', validateField); - - var weedObject = function(obj) { - for (var key in obj) { - if (obj.hasOwnProperty(key)) { - if((typeof(obj[key])==="object") && !Array.isArray(obj[key])) { - weedObject(obj[key]); - } - else if(obj[key] == '') { - delete obj[key]; - } - } - } - } - - var addRepository = function(event) { - var valid = validateForm(); - if(!valid) { - return false; - } - - var formData = $(addForm).serializeObject(); - - if (formData && formData.isMirror!=undefined) { - formData.isMirror=(String(formData.isMirror).toLowerCase() === 'true'); - } - if(formData.isMirror) { - if(formData.config==undefined) { - formData.config=new Object(); - } - formData.config.mirrorlist=formData.baseurl; - delete formData.baseurl; - delete formData.isMirror; - } - weedObject(formData); - if(formData.config && formData.config.comps) { - formData.config.comps=formData.config.comps.split(/[,\s]/); - for(var i=0; i>formData.config.comps.length; i++) { - formData.config.comps[i]=formData.config.comps[i].trim(); - } - for (var j=formData.config.comps.indexOf(""); j!=-1; j=formData.config.comps.indexOf("")) { - formData.config.comps.splice(j, 1); - } - } - - kimchi.createRepository(formData, function() { - wok.topic('kimchi/repositoryAdded').publish(); - wok.window.close(); - }, function(jqXHR, textStatus, errorThrown) { - var reason = jqXHR && - jqXHR['responseJSON'] && - jqXHR['responseJSON']['reason']; - wok.message.error(reason); - }); - return false; - }; - - $(addForm).on('submit', addRepository); -}; diff --git a/src/wok/plugins/kimchi/ui/js/src/kimchi.repository_edit_main.js b/src/wok/plugins/kimchi/ui/js/src/kimchi.repository_edit_main.js deleted file mode 100644 index 5bfc51e..0000000 --- a/src/wok/plugins/kimchi/ui/js/src/kimchi.repository_edit_main.js +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Project Kimchi - * - * Copyright IBM, Corp. 2014 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -kimchi.repository_edit_main = function() { - - var editForm = $('#form-repository-edit'); - - var saveButton = $('#repository-edit-button-save'); - - if(kimchi.capabilities['repo_mngt_tool']=="yum") { - editForm.find('input.deb').prop('disabled', true); - } - else if(kimchi.capabilities['repo_mngt_tool']=="deb") { - editForm.find('input.yum').prop('disabled', true); - } - - kimchi.retrieveRepository(kimchi.selectedRepository, function(repository) { - editForm.fillWithObject(repository); - - $('input', editForm).on('input propertychange', function(event) { - if($(this).val() !== '') { - $(saveButton).prop('disabled', false); - } - }); - }); - - - var editRepository = function(event) { - var formData = $(editForm).serializeObject(); - - if (formData && formData.config) { - formData.config.gpgcheck=(String(formData.config.gpgcheck).toLowerCase() === 'true'); - } - - if(formData.config && formData.config.comps) { - formData.config.comps=formData.config.comps.split(/[,\s]/); - for(var i=0; i>formData.config.comps.length; i++) { - formData.config.comps[i]=formData.config.comps[i].trim(); - } - for (var j=formData.config.comps.indexOf(""); j!=-1; j=formData.config.comps.indexOf("")) { - formData.config.comps.splice(j, 1); - } - } - - kimchi.updateRepository(kimchi.selectedRepository, formData, function() { - wok.topic('kimchi/repositoryUpdated').publish(); - wok.window.close(); - }, function(jqXHR, textStatus, errorThrown) { - var reason = jqXHR && - jqXHR['responseJSON'] && - jqXHR['responseJSON']['reason']; - wok.message.error(reason); - }); - - return false; - }; - - $(editForm).on('submit', editRepository); - $(saveButton).on('click', editRepository); -}; -- 2.1.0