diff --git a/src/sunstone/public/app/opennebula/marketplaceapp.js b/src/sunstone/public/app/opennebula/marketplaceapp.js index b9ec96041c..507d75b1d9 100644 --- a/src/sunstone/public/app/opennebula/marketplaceapp.js +++ b/src/sunstone/public/app/opennebula/marketplaceapp.js @@ -43,6 +43,11 @@ define(function(require) { DISABLED : 4 }; + var BUTTON_DEPENDENT_STATES = [ + STATES.INIT, + STATES.READY, + ]; + var TYPES = { UNKNOWN : 0, IMAGE : 1, @@ -56,6 +61,7 @@ define(function(require) { return STATES_STR[stateId]; }, "STATES": STATES, + "BUTTON_DEPENDENT_STATES": BUTTON_DEPENDENT_STATES, "typeStr": function(typeId) { return TYPES_STR[typeId]; }, diff --git a/src/sunstone/public/app/tabs/marketplaceapps-tab/actions.js b/src/sunstone/public/app/tabs/marketplaceapps-tab/actions.js index 950e0cd563..99c22b3482 100644 --- a/src/sunstone/public/app/tabs/marketplaceapps-tab/actions.js +++ b/src/sunstone/public/app/tabs/marketplaceapps-tab/actions.js @@ -120,8 +120,33 @@ define(function(require) { }, error: Notifier.onError }, - "MarketPlaceApp.list" : _commonActions.list(), - "MarketPlaceApp.show" : _commonActions.show(), + "MarketPlaceApp.list" : { + type: "list", + call: OpenNebulaResource.list, + callback: function(request, response) { + var datatable = Sunstone.getDataTable(TAB_ID); + if (datatable){ + datatable.updateView(request, response); + datatable.updateStateActions(); + } + }, + error: Notifier.onError + }, + "MarketPlaceApp.show" : { + type: "single", + call: OpenNebulaResource.show, + callback: function(request, response) { + var datatable = Sunstone.getDataTable(TAB_ID); + if (datatable){ + datatable.updateElement(request, response); + datatable.updateStateActions(response); + if (Sunstone.rightInfoVisible($('#' + TAB_ID))) { + Sunstone.insertPanels(TAB_ID, response); + } + } + }, + error: Notifier.onError + }, "MarketPlaceApp.refresh" : _commonActions.refresh(), "MarketPlaceApp.delete" : { diff --git a/src/sunstone/public/app/tabs/marketplaceapps-tab/buttons.js b/src/sunstone/public/app/tabs/marketplaceapps-tab/buttons.js index d5f197955b..ca362a1108 100644 --- a/src/sunstone/public/app/tabs/marketplaceapps-tab/buttons.js +++ b/src/sunstone/public/app/tabs/marketplaceapps-tab/buttons.js @@ -31,12 +31,14 @@ define(function(require) { "MarketPlaceApp.download_opennebula_dialog" : { type: "action", text: '', - tip: Locale.tr('Import into Datastore') + tip: Locale.tr('Import into Datastore'), + custom_classes : "state-dependent" }, "MarketPlaceApp.download_local" : { type: "action", text: '', - tip: Locale.tr('Download to your desktop') + tip: Locale.tr('Download to your desktop'), + custom_classes : "state-dependent" }, "MarketPlaceApp.chown" : { type: "confirm_with_select", diff --git a/src/sunstone/public/app/tabs/marketplaceapps-tab/datatable.js b/src/sunstone/public/app/tabs/marketplaceapps-tab/datatable.js index 15a4698a66..8a4b5315fa 100644 --- a/src/sunstone/public/app/tabs/marketplaceapps-tab/datatable.js +++ b/src/sunstone/public/app/tabs/marketplaceapps-tab/datatable.js @@ -20,11 +20,12 @@ define(function(require) { */ var TabDataTable = require('utils/tab-datatable'); + var Sunstone = require('sunstone'); var SunstoneConfig = require('sunstone-config'); var Locale = require('utils/locale'); var OpenNebulaMarketPlaceApp = require('opennebula/marketplaceapp'); - var OpenNebulaMarketPlace = require('opennebula/marketplace'); var OpenNebulaZone = require('opennebula/zone'); + var StateActions = require('./utils/state-actions'); var LabelsUtils = require('utils/labels/utils'); var Humanize = require('utils/humanize'); var SearchDropdown = require('hbs!./datatable/search'); @@ -118,9 +119,11 @@ define(function(require) { Table.prototype = Object.create(TabDataTable.prototype); Table.prototype.constructor = Table; + Table.prototype.initialize = _initialize; Table.prototype.elementArray = _elementArray; Table.prototype.preUpdateView = _preUpdateView; Table.prototype.postUpdateView = _postUpdateView; + Table.prototype.updateStateActions = _updateStateActions; return Table; @@ -128,6 +131,13 @@ define(function(require) { FUNCTION DEFINITIONS */ + function _initialize(opts) { + var that = this; + + TabDataTable.prototype.initialize.call(this, opts); + _updateStateActions(); + } + function _elementArray(element_json) { var element = element_json[XML_ROOT]; @@ -152,7 +162,12 @@ define(function(require) { var color_html = Status.state_lock_to_color("MARKETPLACEAPP",state, element_json[XML_ROOT]["LOCK"]); return [ - ''+color_html, + ''+color_html, element.ID, element.NAME, element.UNAME, @@ -169,16 +184,6 @@ define(function(require) { ]; } - function _lengthOf(ids){ - var l = 0; - if ($.isArray(ids)) - l = ids.length; - else if (!$.isEmptyObject(ids)) - l = 1; - - return l; - } - function _preUpdateView() { this.totalApps = 0; } @@ -186,4 +191,27 @@ define(function(require) { function _postUpdateView() { $(".total_apps").text(this.totalApps); } + + function _updateStateActions(response) { + if (response) { + var app = response.MARKETPLACEAPP; + + app && app.STATE && OpenNebulaMarketPlaceApp.BUTTON_DEPENDENT_STATES[app.STATE] + ? StateActions.enableAllStateActions() + : StateActions.disableAllStateActions(); + } + else { + $('#' + this.dataTableId).on("change", 'tbody input.check_item', function() { + var dataTable = Sunstone.getDataTable(TAB_NAME); + + // make sure if all checked inputs are available + $(dataTable.elements()).filter(function() { + var appState = $("input.check_item[value='"+this+"']", dataTable.dataTable).attr("state"); + return OpenNebulaMarketPlaceApp.BUTTON_DEPENDENT_STATES[appState]; + }).length === dataTable.elements().length && dataTable.elements().length > 0 + ? StateActions.enableAllStateActions() + : StateActions.disableAllStateActions(); + }); + } + } }); diff --git a/src/sunstone/public/app/tabs/marketplaceapps-tab/form-panels/create.js b/src/sunstone/public/app/tabs/marketplaceapps-tab/form-panels/create.js index f9f3570d64..02c818e3ab 100644 --- a/src/sunstone/public/app/tabs/marketplaceapps-tab/form-panels/create.js +++ b/src/sunstone/public/app/tabs/marketplaceapps-tab/form-panels/create.js @@ -82,16 +82,10 @@ define(function(require) { var valid = market.ZONE_ID == config.zone_id; if (valid){ - var create_support = false; - - $.each(config.oned_conf.MARKET_MAD_CONF, function(){ - if (this.NAME == market.MARKET_MAD){ - create_support = this.APP_ACTIONS.split(',').includes("create"); - return false; //break - } - }); - - valid = create_support; + valid = $(config.oned_conf.MARKET_MAD_CONF) + .filter(function(_, marketMad){ + return marketMad.NAME == market.MARKET_MAD && marketMad.APP_ACTIONS.indexOf('create') !== -1; + }).length > 0; } return valid; diff --git a/src/sunstone/public/app/tabs/marketplaceapps-tab/utils/state-actions.js b/src/sunstone/public/app/tabs/marketplaceapps-tab/utils/state-actions.js new file mode 100644 index 0000000000..bd3ede4b4e --- /dev/null +++ b/src/sunstone/public/app/tabs/marketplaceapps-tab/utils/state-actions.js @@ -0,0 +1,36 @@ +/* -------------------------------------------------------------------------- */ +/* Copyright 2002-2020, OpenNebula Project, OpenNebula Systems */ +/* */ +/* 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. */ +/* -------------------------------------------------------------------------- */ + +define(function() { + return { + 'disableAllStateActions': disableAllStateActions, + 'enableAllStateActions': enableAllStateActions + }; + + function disableAllStateActions() { + $(".state-dependent").prop("disabled", true) + .removeClass("action-enabled") + .addClass("action-disabled") + .on("click.stateaction", function(e) { return false; }); + } + + function enableAllStateActions() { + $(".state-dependent").removeAttr("disabled") + .addClass("action-enabled") + .removeClass("action-disabled") + .off("click.stateaction"); + } +}); diff --git a/src/sunstone/public/app/tabs/vms-tab/utils/state-actions.js b/src/sunstone/public/app/tabs/vms-tab/utils/state-actions.js index 97463296db..bfac04ca5c 100644 --- a/src/sunstone/public/app/tabs/vms-tab/utils/state-actions.js +++ b/src/sunstone/public/app/tabs/vms-tab/utils/state-actions.js @@ -134,22 +134,22 @@ define(function(require) { function disableAllStateActions() { $(".state-dependent").prop("disabled", true). - removeClass("vm-action-enabled"). - addClass("vm-action-disabled"). + removeClass("action-enabled"). + addClass("action-disabled"). on("click.stateaction", function(e) { return false; }); } function resetStateButtons() { $(".state-dependent"). - addClass("vm-action-enabled"). - removeClass("vm-action-disabled"). + addClass("action-enabled"). + removeClass("action-disabled"). off("click.stateaction"); } function enableStateButton(button_action) { $(".state-dependent[href='" + button_action + "']").removeAttr("disabled"). - addClass("vm-action-enabled"). - removeClass("vm-action-disabled"). + addClass("action-enabled"). + removeClass("action-disabled"). off("click.stateaction"); } diff --git a/src/sunstone/public/scss/_layout.scss b/src/sunstone/public/scss/_layout.scss index 6790c45887..794501a025 100644 --- a/src/sunstone/public/scss/_layout.scss +++ b/src/sunstone/public/scss/_layout.scss @@ -109,7 +109,7 @@ } } -.vm-action-disabled { +.action-disabled { //color: #cfcfcf !important; cursor: default !important; opacity: 0.25;