From daa04bebc89ab216a2d7593e5c184bb0ce4bffa1 Mon Sep 17 00:00:00 2001 From: Tom Rees Date: Thu, 23 Feb 2012 13:43:16 +0000 Subject: [PATCH] [#1506][resourceedit][l]: Added icon querying API. Dynamically update resource icon in editor. --- ckan/config/routing.py | 2 ++ ckan/controllers/api.py | 10 +++++++++- ckan/lib/helpers.py | 19 +++++++++---------- ckan/public/scripts/application.js | 20 ++++++++++++++++---- ckan/public/scripts/templates.js | 7 +++++-- ckan/templates/facets.html | 2 +- 6 files changed, 42 insertions(+), 18 deletions(-) diff --git a/ckan/config/routing.py b/ckan/config/routing.py index e55fa2c1494..55e3c4ebe7a 100644 --- a/ckan/config/routing.py +++ b/ckan/config/routing.py @@ -178,6 +178,8 @@ def make_map(): conditions=dict(method=['GET'])) map.connect('/api/2/util/resource/format_autocomplete', controller='api', action='format_autocomplete', conditions=dict(method=['GET'])) + map.connect('/api/2/util/format_icon', controller='api', action='format_icon', + conditions=dict(method=['GET'])) map.connect('/api/2/util/authorizationgroup/autocomplete', controller='api', action='authorizationgroup_autocomplete') diff --git a/ckan/controllers/api.py b/ckan/controllers/api.py index 698bf3ecfca..49eeec2a750 100644 --- a/ckan/controllers/api.py +++ b/ckan/controllers/api.py @@ -5,7 +5,7 @@ from webob.multidict import UnicodeMultiDict from ckan.lib.base import BaseController, response, c, _, gettext, request -from ckan.lib.helpers import json, date_str_to_datetime +from ckan.lib.helpers import json, date_str_to_datetime, format_icon, icon_url import ckan.model as model import ckan.rating from ckan.lib.search import (query_for, QueryOptions, SearchIndexError, SearchError, @@ -705,6 +705,14 @@ def munge_tag(self): munged_tag = munge_tag(tag) return self._finish_ok(munged_tag) + def format_icon(self): + f = request.params.get('format') + out = { + 'format' : f, + 'icon' : icon_url(format_icon(f)) + } + return self._finish_ok(out) + def status(self): context = {'model': model, 'session': model.Session} data_dict = {} diff --git a/ckan/lib/helpers.py b/ckan/lib/helpers.py index 70d9c7ffd5a..71b73b3153d 100644 --- a/ckan/lib/helpers.py +++ b/ckan/lib/helpers.py @@ -321,19 +321,18 @@ def resource_icon(res): # also: 'page_white_link' return icon(icon_name) else: - return format_icon(res.get('format','')) + return icon(format_icon(res.get('format',''))) def format_icon(_format): - icon_name = 'page_white' _format = _format.lower() - if ('json' in _format): icon_name = 'page_white_cup' - if ('csv' in _format): icon_name = 'page_white_gear' - if ('xls' in _format): icon_name = 'page_white_excel' - if ('zip' in _format): icon_name = 'page_white_compressed' - if ('api' in _format): icon_name = 'page_white_database' - if ('plain text' in _format): icon_name = 'page_white_text' - if ('xml' in _format): icon_name = 'page_white_code' - return icon(icon_name) + if ('json' in _format): return 'page_white_cup' + if ('csv' in _format): return 'page_white_gear' + if ('xls' in _format): return 'page_white_excel' + if ('zip' in _format): return 'page_white_compressed' + if ('api' in _format): return 'page_white_database' + if ('plain text' in _format): return 'page_white_text' + if ('xml' in _format): return 'page_white_code' + return 'page_white' def linked_gravatar(email_hash, size=100, default="identicon"): return literal(''''+CKAN.Strings.noNameBrackets+''); // Need to structurally modify the DOM to force a re-render of text + $link = $li.find('.js-resource-edit-open'); $link.html(''+newName+''); }; - var nameBoxChanged = function(e) { - setName($(e.target).val()); + // == Inner function: Updates the icon as you type == // + var setFormat = function(newFormat) { + // Ask the server which icon to use + $.getJSON('/api/2/util/format_icon?format='+newFormat, function(data) { + if (data.icon) { + // Maybe I'll refactor the table to be inside the li + $li .find('.js-resource-icon').attr('src',data.icon); + $table.find('.js-resource-icon').attr('src',data.icon); + } + }); } // Trigger animation @@ -736,12 +745,15 @@ CKAN.View.ResourceEditList = Backbone.View.extend({ } var nameBox = $table.find('input.js-resource-edit-name'); - CKAN.Utils.bindInputChanges(nameBox,nameBoxChanged); + CKAN.Utils.bindInputChanges(nameBox,function(e) { setName($(e.target).val()); }); + var formatBox = $table.find('input.js-resource-edit-format'); + CKAN.Utils.bindInputChanges(formatBox,function(e) { setFormat($(e.target).val()); }); $li.find('.js-resource-edit-open').click(openTable); $li.find('.js-resource-edit-delete').click(deleteResource); // Initialise name setName(resource.attributes.name); + setFormat(resource.attributes.format); }, removeResource: function(resource) { diff --git a/ckan/public/scripts/templates.js b/ckan/public/scripts/templates.js index e8845041e8c..6af09805999 100644 --- a/ckan/public/scripts/templates.js +++ b/ckan/public/scripts/templates.js @@ -67,6 +67,7 @@ CKAN.Templates.resourceUpload = ' \ CKAN.Templates.resourceEntry = ' \
  • \
    |||
    \ + \
    ${resource.name}\
  • \