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;