From 7c12321d187ce5919ea5e443612321b404be8cab Mon Sep 17 00:00:00 2001
From: Ondrej Mular <omular@redhat.com>
Date: Tue, 15 Sep 2015 11:03:59 +0200
Subject: [PATCH] web UI: fixes in nodes, resources, fence devices
- fix creating disabled resource
- add sorting for cluster list, resource list and fence device list
- hide resource (fence device) details when there is no resource (fence device)
- in resource list color of resource name depends on its status
- fix group selector
- disabled autocorrect for ordering set constraints
- fix status detection of master/slave resources
---
pcsd/cluster_entity.rb | 2 +-
pcsd/pcsd.rb | 2 +-
pcsd/public/css/style.css | 8 +++++++
pcsd/public/js/nodes-ember.js | 56 +++++++++++++++++++++++++++++++------------
pcsd/public/js/pcsd.js | 5 +++-
pcsd/views/main.erb | 4 +++-
6 files changed, 58 insertions(+), 19 deletions(-)
diff --git a/pcsd/cluster_entity.rb b/pcsd/cluster_entity.rb
index b5d2719..8f29a40 100644
--- a/pcsd/cluster_entity.rb
+++ b/pcsd/cluster_entity.rb
@@ -914,7 +914,7 @@ module ClusterEntity
end
@masters, @slaves = get_masters_slaves(primitive_list)
if (@masters.empty? and
- @member.status != ClusterEntity::ResourceStatus.new(:disabled)
+ @member.status == ClusterEntity::ResourceStatus.new(:running)
)
@status = ClusterEntity::ResourceStatus.new(:partially_running)
end
diff --git a/pcsd/pcsd.rb b/pcsd/pcsd.rb
index 9a07ee8..b7c2a49 100644
--- a/pcsd/pcsd.rb
+++ b/pcsd/pcsd.rb
@@ -178,7 +178,7 @@ helpers do
param_line << "#{myparam}=#{val}"
end
if param == "disabled"
- meta_options << "meta target-role=Stopped"
+ meta_options << 'meta' << 'target-role=Stopped'
end
}
return param_line + meta_options
diff --git a/pcsd/public/css/style.css b/pcsd/public/css/style.css
index a3f6638..1c003bd 100644
--- a/pcsd/public/css/style.css
+++ b/pcsd/public/css/style.css
@@ -778,3 +778,11 @@ li.menuheader {
.issue_table {
margin-top: 1.5em;
}
+
+.status-error {
+ color: red;
+}
+
+.status-warning {
+ color: #ff6600;
+}
diff --git a/pcsd/public/js/nodes-ember.js b/pcsd/public/js/nodes-ember.js
index bbeed55..1e00a94 100644
--- a/pcsd/public/js/nodes-ember.js
+++ b/pcsd/public/js/nodes-ember.js
@@ -147,8 +147,10 @@ Pcs = Ember.Application.createWithMixins({
} else {
if (self.get('fence_list').length > 0) {
cur_fence = self.get('fence_list')[0];
- fence_change = true;
+ } else {
+ cur_fence = null;
}
+ fence_change = true;
}
if (cur_resource && cur_resource.get('id') in resource_map) {
@@ -158,22 +160,28 @@ Pcs = Ember.Application.createWithMixins({
} else {
if (self.get('resource_list').length > 0) {
cur_resource = self.get('resource_list')[0];
- resource_change = true;
+ } else {
+ cur_resource = null;
}
+ resource_change = true;
}
self.set('cur_fence', cur_fence);
self.set('cur_resource', cur_resource);
Ember.run.scheduleOnce('afterRender', Pcs, function () {
- if (fence_change)
- tree_view_onclick(self.get('cur_fence').get('id'), true);
- if (resource_change)
- tree_view_onclick(self.get('cur_resource').get('id'), true);
- if (!fence_change && self.get('cur_fence'))
- tree_view_select(self.get('cur_fence').get('id'));
- if (!resource_change && self.get('cur_resource'))
- tree_view_select(self.get('cur_resource').get('id'));
+ if (self.get('cur_fence')) {
+ if (fence_change)
+ tree_view_onclick(self.get('cur_fence').get('id'), true);
+ else
+ tree_view_select(self.get('cur_fence').get('id'));
+ }
+ if (self.get('cur_resource')) {
+ if (resource_change)
+ tree_view_onclick(self.get('cur_resource').get('id'), true);
+ else
+ tree_view_select(self.get('cur_resource').get('id'));
+ }
Pcs.selectedNodeController.reset();
disable_checkbox_clicks();
});
@@ -546,6 +554,11 @@ Pcs.resourcesContainer = Ember.Object.create({
}
});
});
+ $.each(resource_map, function(resource_id, resource_obj) {
+ resource_obj.set('group_list', self.get('group_list'));
+ });
+ self.set('resource_list', Ember.copy(self.get('resource_list')).sort(function(a,b){return a.get('id').localeCompare(b.get('id'))}));
+ self.set('fence_list', Ember.copy(self.get('fence_list')).sort(function(a,b){return a.get('id').localeCompare(b.get('id'))}));
}
});
@@ -565,6 +578,7 @@ Pcs.ResourceObj = Ember.Object.extend({
disabled: false,
error_list: [],
warning_list: [],
+ group_list: [],
get_group_id: function() {
var self = this;
var p = self.get('parent');
@@ -577,7 +591,7 @@ Pcs.ResourceObj = Ember.Object.extend({
var self = this;
var cur_group = self.get('get_group_id');
var html = '<select>\n<option value="">None</option>\n';
- $.each(Pcs.resourcesContainer.get('group_list'), function(_, group) {
+ $.each(self.get('group_list'), function(_, group) {
html += '<option value="' + group + '"';
if (cur_group === group) {
html += 'selected';
@@ -586,7 +600,7 @@ Pcs.ResourceObj = Ember.Object.extend({
});
html += '</select><input type="button" value="Change group" onclick="resource_change_group(curResource(), $(this).prev().prop(\'value\'));">';
return html;
- }.property('Pcs.resourceContainer.group_list', 'get_group_id'),
+ }.property('group_list', 'get_group_id'),
status: "unknown",
class_type: null, // property to determine type of the resource
resource_type: function() { // this property is just for displaying resource type in GUI
@@ -641,6 +655,17 @@ Pcs.ResourceObj = Ember.Object.extend({
}
return out;
}.property("error_list.@each", "warning_list.@each"),
+ span_class: function() {
+ switch (this.get("status_val")) {
+ case get_status_value("failed"):
+ return "status-error";
+ case get_status_value("warning"):
+ case get_status_value("disabled"):
+ return "status-warning";
+ default:
+ return "";
+ }
+ }.property("status_val"),
location_constraints: [],
ordering_constraints: [],
@@ -1265,9 +1290,9 @@ Pcs.Cluster = Ember.Object.extend({
Pcs.clusterController = Ember.Object.create({
cluster_list: Ember.ArrayController.create({
- content: Ember.A(), sortProperties: ['status', 'name'],
- sortAscending: true,
- sortFunction: function(a,b){return status_comparator(a,b);}
+ content: Ember.A(),
+ sortProperties: ['name'],
+ sortAscending: true
}),
cur_cluster: null,
show_all_nodes: false,
@@ -1779,6 +1804,7 @@ Pcs.nodesController = Ember.ArrayController.createWithMixins({
$.each(nodesToRemove, function(k,v) {
self.content.removeObject(v);
});
+ self.set('content', Ember.copy(self.get('content').sort(function(a,b){return a.get('name').localeCompare(b.get('name'))})));
}
});
diff --git a/pcsd/public/js/pcsd.js b/pcsd/public/js/pcsd.js
index 84db292..23fd316 100644
--- a/pcsd/public/js/pcsd.js
+++ b/pcsd/public/js/pcsd.js
@@ -1526,7 +1526,10 @@ function add_constraint(parent_id, c_type, force) {
}
function add_constraint_set(parent_id, c_type, force) {
- var data = {'resources': []};
+ var data = {
+ resources: [],
+ disable_autocorrect: true
+ };
$(parent_id + " input[name='resource_ids[]']").each(function(index, element) {
var resources = element.value.trim();
if (resources.length > 0) {
diff --git a/pcsd/views/main.erb b/pcsd/views/main.erb
index b24c74a..e7e611d 100644
--- a/pcsd/views/main.erb
+++ b/pcsd/views/main.erb
@@ -105,7 +105,9 @@
<input type="checkbox" onchange="tree_view_checkbox_onchange(this)">
</td>
<td style="width:18px;" class="node_list_sprite">{{{node.status_icon}}}</td>
- <td class="resource_name" nowrap {{bind-attr node=node.style}}>{{node._id}}</td>
+ <td class="resource_name" nowrap {{bind-attr node=node.style}}>
+ <span {{bind-attr class=node.span_class}}>{{node._id}}</span>
+ </td>
<td style="width:200px;" class="resource_type" {{bind-attr style=node.style}}>{{node.resource_type}}</td>
<td style="width:18px;">
<div style="display: none;" class="arrow sprites"></div>
--
1.9.1