summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimo Sorce <simo@redhat.com>2014-11-06 14:01:04 -0500
committerPatrick Uiterwijk <puiterwijk@redhat.com>2014-11-12 23:48:02 +0100
commitdc9f4a30a47cdce1e0070c18398351ea6c307305 (patch)
tree19ddbaa13ca9903098e48a8b9a7157ba3e0497e3
parent0034ad1215de99fc13e9dc57bc652cfb8eeb58ae (diff)
downloadipsilon-dc9f4a30a47cdce1e0070c18398351ea6c307305.tar.gz
ipsilon-dc9f4a30a47cdce1e0070c18398351ea6c307305.tar.xz
ipsilon-dc9f4a30a47cdce1e0070c18398351ea6c307305.zip
Add visual cues to configuration panels
Make it easier to recognize which plugins are enabled and which are disabled. Also make it easier to recognize when a plugin has just changed state, by flashing its row (help also realize it may have moved up/down) Based on concept work by Petr Vobornik Signed-off-by: Simo Sorce <simo@redhat.com> Reviewed-by: Patrick Uiterwijk <puiterwijk@redhat.com>
-rwxr-xr-xipsilon/admin/common.py31
-rw-r--r--less/admin.less8
-rw-r--r--less/admin/variables.less9
-rw-r--r--less/admin/widgets.less86
-rw-r--r--templates/admin/plugins.html33
-rw-r--r--templates/admin/providers.html62
-rw-r--r--ui/css/admin.css59
7 files changed, 227 insertions, 61 deletions
diff --git a/ipsilon/admin/common.py b/ipsilon/admin/common.py
index af315ff..2b83314 100755
--- a/ipsilon/admin/common.py
+++ b/ipsilon/admin/common.py
@@ -141,13 +141,6 @@ class AdminPluginsOrder(AdminPage):
def GET(self, *args, **kwargs):
return self.parent.root_with_msg()
- def _get_enabled_list(self):
- cur = list()
- for p in self._site[self.facility].available.values():
- if p.is_enabled:
- cur.append(p.name)
- return cur
-
@admin_protect
def POST(self, *args, **kwargs):
@@ -158,7 +151,8 @@ class AdminPluginsOrder(AdminPage):
message = "Nothing was modified."
message_type = "info"
- cur_enabled = self._get_enabled_list()
+ changed = None
+ cur_enabled = self._site[self.facility].enabled
if 'order' in kwargs:
order = kwargs['order'].split(',')
@@ -185,6 +179,12 @@ class AdminPluginsOrder(AdminPage):
message = "New configuration saved."
message_type = ADMIN_STATUS_OK
+ changed = dict()
+ self.debug('%s -> %s' % (cur_enabled, new_order))
+ for i in range(0, len(cur_enabled)):
+ if cur_enabled[i] != new_order[i]:
+ changed[cur_enabled[i]] = 'reordered'
+
except ValueError, e:
message = str(e)
message_type = ADMIN_STATUS_ERROR
@@ -194,7 +194,8 @@ class AdminPluginsOrder(AdminPage):
message_type = ADMIN_STATUS_ERROR
return self.parent.root_with_msg(message=message,
- message_type=message_type)
+ message_type=message_type,
+ changed=changed)
class AdminPlugins(AdminPage):
@@ -223,15 +224,19 @@ class AdminPlugins(AdminPage):
def save_enabled_plugins(self, names):
self._site[self.facility].save_enabled(names)
- def root_with_msg(self, message=None, message_type=None):
+ def root_with_msg(self, message=None, message_type=None, changed=None):
plugins = self._site[self.facility]
+ if changed is None:
+ changed = dict()
+
targs = {'title': self.title,
'menu': self._master.menu,
'message': message,
'message_type': message_type,
'available': plugins.available,
'enabled': plugins.enabled,
+ 'changed': changed,
'baseurl': self.url,
'newurl': self.url}
if self.order:
@@ -269,7 +274,8 @@ class AdminPlugins(AdminPage):
obj.enable()
obj.save_enabled_state()
msg = "Plugin %s enabled" % obj.name
- return self.root_with_msg(msg, ADMIN_STATUS_OK)
+ return self.root_with_msg(msg, ADMIN_STATUS_OK,
+ changed={obj.name: 'enabled'})
enable.public_function = True
@admin_protect
@@ -283,7 +289,8 @@ class AdminPlugins(AdminPage):
obj.disable()
obj.save_enabled_state()
msg = "Plugin %s disabled" % obj.name
- return self.root_with_msg(msg, ADMIN_STATUS_OK)
+ return self.root_with_msg(msg, ADMIN_STATUS_OK,
+ changed={obj.name: 'disabled'})
disable.public_function = True
diff --git a/less/admin.less b/less/admin.less
index 0b71139..f58f3ab 100644
--- a/less/admin.less
+++ b/less/admin.less
@@ -81,9 +81,11 @@
// Open Sans Fonts
@import "font.less";
+// Admin Interface styles
+@import "admin/variables.less";
+@import "admin/widgets.less";
+
+
// remove warnings
@fa-var-angle-right: ">";
@fa-var-angle-down: "\f107";
-
-// bigger default font
-@font-size-base: 14px;
diff --git a/less/admin/variables.less b/less/admin/variables.less
new file mode 100644
index 0000000..e30fd6c
--- /dev/null
+++ b/less/admin/variables.less
@@ -0,0 +1,9 @@
+// Copyright (C) 2014 Ipsilon project Contributors, for licensee see COPYING
+
+// Basic variables
+@state-enabled-bg: #ffffff;
+@state-disabled-bg: #ededed;
+
+// bigger default font
+@font-size-base: 14px;
+
diff --git a/less/admin/widgets.less b/less/admin/widgets.less
new file mode 100644
index 0000000..fd68fed
--- /dev/null
+++ b/less/admin/widgets.less
@@ -0,0 +1,86 @@
+// Copyright (C) 2014 Ipsilon project Contributors, for licensee see COPYING
+
+// Widgets
+
+// imitate tables
+.ipsilon-row {
+
+ // reuse bootstrap colors
+ border-top: 1px solid @table-border-color;
+ padding: @table-cell-padding;
+
+ // to have equal height - basically a hack, increase if default elements are
+ // larger. Proper equal height would have to be done in JavaScript.
+ min-height: @input-height-large;
+}
+
+
+.ipsilon-row:last-child {
+ border-bottom: 1px solid @table-border-color;
+}
+
+// add to div with 'ipsilon-row' class to change background
+.hl-enabled {
+ // ugly color
+ background-color: @state-enabled-bg;
+}
+
+.hl-disabled {
+ background-color: @state-disabled-bg;
+
+ strong {
+ color: #555;
+ }
+}
+
+// animation
+// https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Using_CSS_animations
+
+@keyframes bgfadein {
+ from {
+ background-color: @state-disabled-bg;
+ }
+ to {
+ background-color: @state-enabled-bg;
+ }
+}
+
+@keyframes bgfadeout {
+ from {
+ background-color: @state-enabled-bg;
+ }
+ to {
+ background-color: @state-disabled-bg;
+ }
+}
+
+// add these classes to rows to hightlight them on load
+.hl-enabled-new {
+ animation-duration: 2s;
+ animation-name: bgfadein;
+ animation-fill-mode: both
+}
+
+.hl-disabled-new {
+ animation-duration: 2s;
+ animation-name: bgfadeout;
+ animation-fill-mode: both
+}
+
+@keyframes flashout {
+ 0% {
+ background-color: @state-enabled-bg;
+ }
+ 50% {
+ background-color: @state-info-bg;
+ }
+ 100% {
+ background-color: @state-enabled-bg;
+ }
+}
+
+.hl-enabled-flash {
+ animation-duration: 1s;
+ animation-name: flashout;
+ animation-fill-mode: both
+}
diff --git a/templates/admin/plugins.html b/templates/admin/plugins.html
index 7ef50a0..54462b7 100644
--- a/templates/admin/plugins.html
+++ b/templates/admin/plugins.html
@@ -15,21 +15,27 @@
</div>
</div>
- <table class="table">
{% for p in enabled %}
- <tr><td>
- <div class="row">
+ {% set highlight = "hl-enabled" %}
+ {% if p in changed %}
+ {% if changed[p] == 'enabled' %}
+ {% set highlight = "hl-enabled-new" %}
+ {% elif changed[p] == 'reordered' %}
+ {% set highlight = "hl-enabled-flash" %}
+ {% endif %}
+ {% endif %}
+ <div class="row ipsilon-row {{ highlight }}">
<div class="col-md-3 col-sm-3 col-xs-5">
- <strong>{{ p }}</strong>
+ <p><strong>{{ p }}</strong></p>
</div>
<div class="col-md-7 col-sm-7 col-xs-5">
<div class="row">
<div class="col-md-6 col-sm-6 col-xs-12">
- <a class="text-info" href="{{ baseurl }}/disable/{{ p }}">Disable</a>
+ <p class="text-info"><a href="{{ baseurl }}/disable/{{ p }}">Disable</a></p>
</div>
<div class="col-md-6 col-sm-6 col-xs-12">
{%- if available[p].get_config_obj() %}
- <a class="text-primary" href="{{ baseurl }}/{{ p }}">Configure</a>
+ <p class="text-primary"><a href="{{ baseurl }}/{{ p }}">Configure</a></p>
{% endif %}
</div>
</div>
@@ -73,12 +79,16 @@
{%- endif %}
</div>
</div>
- </td></tr>
{% endfor %}
{% for p in available if not p in enabled %}
- <tr><td>
- <div class="row">
+ {% set highlight = "hl-disabled" %}
+ {% if p in changed %}
+ {% if changed[p] == 'disabled' %}
+ {% set highlight = "hl-disabled-new" %}
+ {% endif %}
+ {% endif %}
+ <div class="row ipsilon-row {{ highlight }}">
<div class="col-md-3 col-sm-3 col-xs-5">
<strong>{{ p }}</strong>
</div>
@@ -97,12 +107,7 @@
<div class="col-md-2 col-sm-2 col-xs-1">
</div>
</div>
- </td></tr>
{% endfor %}
- <tr><td>
- </td></tr>
- </table>
-
{% endif %}
{% endblock %}
diff --git a/templates/admin/providers.html b/templates/admin/providers.html
index 333b10d..a0ca765 100644
--- a/templates/admin/providers.html
+++ b/templates/admin/providers.html
@@ -15,58 +15,56 @@
</div>
</div>
- <hr>
-
- {% for p in enabled %}
- <div class="row">
+ {% for p in available %}
+ {%- if p in enabled %}
+ {%- set highlight = "hl-enabled" %}
+ {%- set actpath = "disable" %}
+ {%- set actlabel = "Disable" %}
+ {%- if p in changed %}
+ {%- if changed[p] == 'enabled' %}
+ {%- set highlight = "hl-enabled-new" %}
+ {%- endif %}
+ {%- endif %}
+ {%- else %}
+ {%- set highlight = "hl-disabled" %}
+ {%- set actpath = "enable" %}
+ {%- set actlabel = "Enable" %}
+ {%- if p in changed %}
+ {%- if changed[p] == 'disabled' %}
+ {%- set highlight = "hl-disabled-new" %}
+ {%- endif %}
+ {%- endif %}
+ {%- endif %}
+ <div class="row ipsilon-row {{ highlight }}">
<div class="col-md-3 col-sm-3 col-xs-6">
<p><strong>{{ p }}</strong></p>
</div>
<div class="col-md-9 col-sm-9 col-xs-6">
<div class="row">
<div class="col-md-4 col-sm-4 col-xs-12">
- <p class="text-info"><a href="{{ baseurl }}/disable/{{ p }}">Disable</a></p>
+ <p class="text-info"><a href="{{ baseurl }}/{{ actpath }}/{{ p }}">{{ actlabel }}</a></p>
</div>
<div class="col-md-4 col-sm-4 col-xs-12">
{%- if available[p].get_config_obj() %}
+ {%- if p in enabled %}
<p class="text-primary"><a href="{{ baseurl }}/{{ p }}">Configure</a></p>
- {% endif %}
- </div>
- <div class="col-md-4 col-sm-4 col-xs-12">
- {%- if available[p].admin %}
- <p class="text-primary"><a href="{{ baseurl }}/{{ p }}/admin">Manage</a></p>
- {% endif %}
- </div>
- </div>
- </div>
- </div>
- <hr>
- {% endfor %}
-
- {% for p in available if not p in enabled %}
- <div class="row">
- <div class="col-md-3 col-sm-3 col-xs-6">
- <p><strong>{{ p }}</strong></p>
- </div>
- <div class="col-md-9 col-sm-9 col-xs-6">
- <div class="row">
- <div class="col-md-4 col-sm-4 col-xs-12">
- <p class="text-info"><a href="{{ baseurl }}/enable/{{ p }}">Enable</a></p>
- </div>
- <div class="col-md-4 col-sm-4 col-xs-12">
- {%- if available[p].get_config_obj() %}
+ {%- else %}
<p class="text-muted">Configure</p>
- {% endif %}
+ {%- endif %}
+ {%- endif %}
</div>
<div class="col-md-4 col-sm-4 col-xs-12">
{%- if available[p].admin %}
+ {%- if p in enabled %}
+ <p class="text-primary"><a href="{{ baseurl }}/{{ p }}/admin">Manage</a></p>
+ {%- else %}
<p class="text-muted">Manage</p>
+ {%- endif %}
{% endif %}
</div>
</div>
</div>
</div>
- <hr>
{% endfor %}
{% endif %}
diff --git a/ui/css/admin.css b/ui/css/admin.css
index 2409613..0f9472a 100644
--- a/ui/css/admin.css
+++ b/ui/css/admin.css
@@ -6068,3 +6068,62 @@ fieldset[disabled] .btn-primary.active {
font-weight: 900;
src: local('Open Sans Extrabold Italic'), url('../fonts/open-sans/OpenSans-ExtraBoldItalic.ttf') format('truetype');
}
+.ipsilon-row {
+ border-top: 1px solid #dddddd;
+ padding: 8px;
+ min-height: 37px;
+}
+.ipsilon-row:last-child {
+ border-bottom: 1px solid #dddddd;
+}
+.hl-enabled {
+ background-color: #ffffff;
+}
+.hl-disabled {
+ background-color: #ededed;
+}
+.hl-disabled strong {
+ color: #555;
+}
+@keyframes bgfadein {
+ from {
+ background-color: #ededed;
+ }
+ to {
+ background-color: #ffffff;
+ }
+}
+@keyframes bgfadeout {
+ from {
+ background-color: #ffffff;
+ }
+ to {
+ background-color: #ededed;
+ }
+}
+.hl-enabled-new {
+ animation-duration: 3s;
+ animation-name: bgfadein;
+ animation-fill-mode: both;
+}
+.hl-disabled-new {
+ animation-duration: 3s;
+ animation-name: bgfadeout;
+ animation-fill-mode: both;
+}
+@keyframes flashout {
+ 0% {
+ background-color: #ffffff;
+ }
+ 50% {
+ background-color: #d9edf7;
+ }
+ 100% {
+ background-color: #ffffff;
+ }
+}
+.hl-enabled-flash {
+ animation-duration: 1.5s;
+ animation-name: flashout;
+ animation-fill-mode: both;
+}