diff --git a/src/sunstone/public/app/app.js b/src/sunstone/public/app/app.js index 41581a1b21..3f87a78db8 100644 --- a/src/sunstone/public/app/app.js +++ b/src/sunstone/public/app/app.js @@ -10,17 +10,18 @@ define(function(require) { require('tabs/vdcs-tab'), require('tabs/acls-tab'), require('tabs/vresources-tab'), + require('tabs/vms-tab'), require('tabs/templates-tab'), require('tabs/images-tab'), require('tabs/files-tab'), - require('tabs/vms-tab'), require('tabs/infra-tab'), require('tabs/clusters-tab'), require('tabs/hosts-tab'), require('tabs/datastores-tab'), require('tabs/vnets-tab'), require('tabs/secgroups-tab'), - require('tabs/zones-tab') + require('tabs/zones-tab'), + require('tabs/marketplace-tab') ]; var _commonDialogs = [ diff --git a/src/sunstone/public/app/opennebula/marketplace.js b/src/sunstone/public/app/opennebula/marketplace.js index 4781430618..ae18945b1b 100644 --- a/src/sunstone/public/app/opennebula/marketplace.js +++ b/src/sunstone/public/app/opennebula/marketplace.js @@ -1,6 +1,7 @@ define(function(require) { var OpenNebulaAction = require('./action'); var OpenNebulaError = require('./error'); + var OpenNebulaHelper = require('./helper'); var RESOURCE = "MARKETPLACE"; @@ -8,7 +9,7 @@ define(function(require) { "resource": RESOURCE, "show" : function(params) { params.error = function() { - return notifyError("Cannot connect to OpenNebula Marketplace") + return notifyError(Locale.tr("Cannot connect to OpenNebula Marketplace")); }; OpenNebulaAction.show(params, RESOURCE); }, @@ -18,7 +19,7 @@ define(function(require) { var callback = params.success; var callback_error = params.error; var timeout = params.timeout || false; - var request = OpenNebula.Helper.request('MARKETPLACE', 'list'); + var request = OpenNebulaHelper.request('MARKETPLACE', 'list'); $.ajax({ url: 'marketplace', @@ -35,7 +36,7 @@ define(function(require) { } }); } - } + }; return Marketplace; -}) +}); \ No newline at end of file diff --git a/src/sunstone/public/app/tabs/marketplace-tab.js b/src/sunstone/public/app/tabs/marketplace-tab.js new file mode 100644 index 0000000000..ccfd454c1c --- /dev/null +++ b/src/sunstone/public/app/tabs/marketplace-tab.js @@ -0,0 +1,41 @@ +define(function(require) { + var Locale = require('utils/locale'); + var Buttons = require('./marketplace-tab/buttons'); + var Actions = require('./marketplace-tab/actions'); + var Table = require('./marketplace-tab/datatable'); + + var TAB_ID = require('./marketplace-tab/tabId'); + var DATATABLE_ID = "dataTableMarketplace"; + + var _dialogs = [ + ]; + + var _panels = [ + //require('./marketplace-tab/panels/info') + ]; + + var _formPanels = [ + ]; + + var Tab = { + tabId: TAB_ID, + title: ' ' + Locale.tr("Marketplace"), + listHeader: ' '+Locale.tr("OpenNebula Marketplace"), + infoHeader: ' '+Locale.tr("Appliance"), + subheader: '  ', + resource: 'Marketplace', + content: '', + buttons: Buttons, + actions: Actions, + dataTable: new Table(DATATABLE_ID, {actions: true, info: true}), + panels: _panels, + formPanels: _formPanels, + dialogs: _dialogs + }; + + return Tab; +}); diff --git a/src/sunstone/public/app/tabs/marketplace-tab/actions.js b/src/sunstone/public/app/tabs/marketplace-tab/actions.js new file mode 100644 index 0000000000..332b935390 --- /dev/null +++ b/src/sunstone/public/app/tabs/marketplace-tab/actions.js @@ -0,0 +1,51 @@ +define(function(require) { + var Sunstone = require('sunstone'); + var Notifier = require('utils/notifier'); + var Locale = require('utils/locale'); + var DataTable = require('./datatable'); + var OpenNebulaResource = require('opennebula/marketplace'); + + var RESOURCE = "Marketplace"; + var TAB_ID = require('./tabId'); + //var IMPORT_DIALOG_ID = require('./dialogs/import/dialogId'); + + var _actions = { + "Marketplace.list" : { + type: "list", + call: OpenNebulaResource.list, + callback: function(request, response) { + Sunstone.getDataTable(TAB_ID).updateView(request, response.appliances); + } + }, + + "Marketplace.refresh" : { + type: "custom", + call: function() { + var tab = $('#' + TAB_ID); + if (Sunstone.rightInfoVisible(tab)) { + Sunstone.runAction(RESOURCE+".show", Sunstone.rightInfoResourceId(tab)); + } else { + Sunstone.getDataTable(TAB_ID).waitingNodes(); + Sunstone.runAction(RESOURCE+".list", {force: true}); + } + }, + }, + + "Marketplace.import" : { + // TODO + }, + + "Marketplace.show" : { + type: "single", + call: OpenNebulaResource.show, + callback: function(request, response) { + if (Sunstone.rightInfoVisible($('#'+TAB_ID))) { + Sunstone.insertPanels(TAB_ID, response); + } + }, + error: Notifier.onError + } + }; + + return _actions; +}); diff --git a/src/sunstone/public/app/tabs/marketplace-tab/buttons.js b/src/sunstone/public/app/tabs/marketplace-tab/buttons.js new file mode 100644 index 0000000000..4c187d135e --- /dev/null +++ b/src/sunstone/public/app/tabs/marketplace-tab/buttons.js @@ -0,0 +1,18 @@ +define(function(require) { + var Locale = require('utils/locale'); + + var Buttons = { + "Marketplace.refresh" : { + type: "action", + layout: "refresh", + alwaysActive: true + }, + "Marketplace.import" : { + type: "action", + layout: "main", + text: Locale.tr('Import') + } + }; + + return Buttons; +}); \ No newline at end of file diff --git a/src/sunstone/public/app/tabs/marketplace-tab/datatable.js b/src/sunstone/public/app/tabs/marketplace-tab/datatable.js new file mode 100644 index 0000000000..f42c695f8c --- /dev/null +++ b/src/sunstone/public/app/tabs/marketplace-tab/datatable.js @@ -0,0 +1,110 @@ +define(function(require) { + /* + DEPENDENCIES + */ + + var TabDataTable = require('utils/tab-datatable'); + var SunstoneConfig = require('sunstone-config'); + var Locale = require('utils/locale'); + + /* + CONSTANTS + */ + + var RESOURCE = "Marketplace"; + //var XML_ROOT = ""; + var TAB_NAME = require('./tabId'); + + /* + CONSTRUCTOR + */ + + function Table(dataTableId, conf) { + this.conf = conf || {}; + this.tabId = TAB_NAME; + this.dataTableId = dataTableId; + this.resource = RESOURCE; + //this.xmlRoot = XML_ROOT; + + this.dataTableOptions = { + "bAutoWidth": false, + "bSortClasses" : false, + "bDeferRender": true, + "aoColumnDefs": [ + {"bSortable": false, "aTargets": ["check"]}, + {"sWidth": "35px", "aTargets": [0]}, + {"bVisible": true, "aTargets": SunstoneConfig.tabTableColumns(TAB_NAME)}, + {"bVisible": false, "aTargets": ['_all']} + ] + }; + + this.columns = [ + Locale.tr("ID"), + Locale.tr("Name"), + Locale.tr("Publisher"), + Locale.tr("Hypervisor"), + Locale.tr("Arch"), + Locale.tr("Format"), + Locale.tr("Tags") + ]; + /* + this.selectOptions = { + }; + */ + TabDataTable.call(this); + } + + Table.prototype = Object.create(TabDataTable.prototype); + Table.prototype.constructor = Table; + Table.prototype.elementArray = _elementArray; + + return Table; + + /* + FUNCTION DEFINITIONS + */ + + function _elementArray(element) { + var publisher = '-'; + var hypervisor = '-'; + var arch = '-'; + var format = '-'; + var tags = '-'; + + if(element.publisher != undefined){ + publisher = element.publisher; + } + + if(element.files != undefined && element.files.length > 0){ + if(element.files[0]["hypervisor"] != undefined){ + hypervisor = element.files[0]["hypervisor"]; + } + + if(element.files[0]["os-arch"] != undefined){ + arch = element.files[0]["os-arch"]; + } + + if(element.files[0]["format"] != undefined){ + format = element.files[0]["format"]; + } + } + + if(element.tags != undefined){ + tags = element.tags; + } + + return [ + '', + element._id.$oid, + element.name, + publisher, + hypervisor, + arch, + format, + tags + ]; + } +}); diff --git a/src/sunstone/public/app/tabs/marketplace-tab/tabId.js b/src/sunstone/public/app/tabs/marketplace-tab/tabId.js new file mode 100644 index 0000000000..d9272fdf92 --- /dev/null +++ b/src/sunstone/public/app/tabs/marketplace-tab/tabId.js @@ -0,0 +1,3 @@ +define(function(require){ + return 'marketplace-tab'; +}); \ No newline at end of file