From e99701a79bf5bac9e304a1a906a1f0a3fc1b01a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Mon, 13 Jan 2014 17:23:31 +0100 Subject: [PATCH] add possibility to set colours on workflows status (#3977) --- wcs/admin/workflows.py | 24 +++++++++++++++++++++++- wcs/forms/backoffice.py | 24 ++++++++++++++++++++++++ wcs/qommon/form.py | 13 +++++++++++++ wcs/qommon/static/css/qommon.css | 30 ++++++++++++++++++++++++++++++ wcs/qommon/static/js/popup.js | 3 +++ wcs/workflows.py | 5 +++++ 6 files changed, 98 insertions(+), 1 deletion(-) diff --git a/wcs/admin/workflows.py b/wcs/admin/workflows.py index 20c2421..cfc0bd6 100644 --- a/wcs/admin/workflows.py +++ b/wcs/admin/workflows.py @@ -290,7 +290,7 @@ class WorkflowItemsDir(Directory): class WorkflowStatusPage(Directory): _q_exports = ['', 'delete', 'newitem', ('items', 'items_dir'), 'update_order', 'edit', 'reassign', 'visibility', - 'endpoint'] + 'endpoint', 'colour'] def __init__(self, workflow, status_id, html_top): self.html_top = html_top @@ -367,6 +367,8 @@ class WorkflowStatusPage(Directory): def get_sidebar(self): + get_response().add_javascript(['jquery.js', 'jquery-ui.js', 'popup.js', + 'jquery.colourpicker.js']) r = TemplateIO(html=True) if str(self.workflow.id).startswith(str('_')): r += htmltext('

') @@ -378,6 +380,7 @@ class WorkflowStatusPage(Directory): r += htmltext('

  • %s
  • ') % _('Change Status Name') r += htmltext('
  • %s
  • ') % _('Change Status Visibility') r += htmltext('
  • %s
  • ') % _('Change Terminal Status') + r += htmltext('
  • %s
  • ') % _('Change Status Colour') r += htmltext('
  • %s
  • ') % _('Delete') r += htmltext('') r += htmltext('
    ') @@ -611,6 +614,25 @@ class WorkflowStatusPage(Directory): get_response().breadcrumb.append( ('endpoint', _('Terminal Status')) ) return form.render() + def colour(self): + form = Form(enctype = 'multipart/form-data') + form.add(ColourWidget, 'colour', + title=_('Colour'), + value=self.status.colour) + form.add_submit('submit', _('Submit')) + form.add_submit('cancel', _('Cancel')) + if form.get_widget('cancel').parse(): + return redirect('..') + + if form.is_submitted() and not form.has_errors(): + self.status.colour = form.get_widget('colour').parse() + self.workflow.store() + return redirect('.') + + self.html_top(title = _('Edit Status Colour')) + get_response().breadcrumb.append( ('colour', _('Status Colour')) ) + return form.render() + class WorkflowStatusDirectory(Directory): _q_exports = [''] diff --git a/wcs/forms/backoffice.py b/wcs/forms/backoffice.py index 8179b78..871adea 100644 --- a/wcs/forms/backoffice.py +++ b/wcs/forms/backoffice.py @@ -50,6 +50,30 @@ class FormDefUI: get_response().add_css_include('../js/tablesorter/themes/blue/style.css') r = TemplateIO(html=True) + + if self.formdef.workflow: + colours = [] + for status in self.formdef.workflow.possible_status: + if status.colour and status.colour != 'ffffff': + # luminance coefficients taken from section C-9 fro + # http://www.faqs.org/faqs/graphics/colorspace-faq/ + brightess = int(status.colour[0:2], 16) * 0.212671 + \ + int(status.colour[2:4], 16) * 0.715160 + \ + int(status.colour[4:6], 16) * 0.072169 + if brightess > 128: + fg_colour = 'black' + else: + fg_colour = 'white' + colours.append((status.id, status.colour, fg_colour)) + if colours: + r += htmltext('') + r += htmltext('') r += htmltext('') diff --git a/wcs/qommon/form.py b/wcs/qommon/form.py index c65ff19..565f1b2 100644 --- a/wcs/qommon/form.py +++ b/wcs/qommon/form.py @@ -23,6 +23,7 @@ import tempfile import time import random import datetime +import itertools from storage import atomic_write @@ -1674,3 +1675,15 @@ $('#%(variable)s').change(); """) return r.getvalue() + + +class ColourWidget(SingleSelectWidget): + + def __init__(self, *args, **kwargs): + colours = ['%s%s%s' % x for x in itertools.product(('00', '66', '99', 'FF'), repeat=3)] + SelectWidget.__init__(self, options=colours, *args, **kwargs) + self.attrs['class'] = 'colour-picker' + + def render_content(self): + get_response().add_javascript(['jquery.js', 'jquery.colourpicker.js']) + return SingleSelectWidget.render_content(self) diff --git a/wcs/qommon/static/css/qommon.css b/wcs/qommon/static/css/qommon.css index e2ddd4a..ce8eff0 100644 --- a/wcs/qommon/static/css/qommon.css +++ b/wcs/qommon/static/css/qommon.css @@ -355,3 +355,33 @@ ul.select2-results { .passStrengthify { padding-left: 1em; } + +#jquery-colour-picker { + background: #fafafa; + width: 250px; + padding: 10px 5px; + border-radius: 5px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.3); + z-index: 1000; +} + +#jquery-colour-picker ul { + margin: 0; + padding: 0; + list-style-type: none; +} + +#jquery-colour-picker li { + float: left; + margin: 0 5px 5px 0; +} + +#jquery-colour-picker li a { + display: block; + width: 13px; + height: 13px; + text-decoration: none; + text-indent: -10000px; + outline: 0; + border: 1px solid #aaa; +} diff --git a/wcs/qommon/static/js/popup.js b/wcs/qommon/static/js/popup.js index 0a4ca95..41906c6 100644 --- a/wcs/qommon/static/js/popup.js +++ b/wcs/qommon/static/js/popup.js @@ -13,6 +13,9 @@ function displayPopup(event) if ($(dialog).find('input[name$=add_element]').length) { prepare_widget_list_elements(); } + if (jQuery.fn.colourPicker !== undefined) { + jQuery('select.colour-picker').colourPicker({title: ''}); + } return false; } }); diff --git a/wcs/workflows.py b/wcs/workflows.py index 5ac7346..777d834 100644 --- a/wcs/workflows.py +++ b/wcs/workflows.py @@ -266,9 +266,13 @@ class Workflow(StorableObject): just_submitted_status = workflow.add_status(_('Just Submitted'), 'just_submitted') just_submitted_status.visibility = ['_receiver'] new_status = workflow.add_status(_('New'), 'new') + new_status.colour = '66FF00' rejected_status = workflow.add_status(_('Rejected'), 'rejected') + rejected_status.colour = 'FF3300' accepted_status = workflow.add_status(_('Accepted'), 'accepted') + accepted_status.colour = '66CCFF' finished_status = workflow.add_status(_('Finished'), 'finished') + finished_status.colour = 'CCCCCC' commentable = CommentableWorkflowStatusItem() commentable.id = '_commentable' @@ -387,6 +391,7 @@ class WorkflowStatus: items = None visibility = None forced_endpoint = False + colour = 'FFFFFF' def __init__(self, name = None): self.name = name -- 1.8.5.2