From b99931b3ab0bb6bda33547ac569a5ee875d63ce3 Mon Sep 17 00:00:00 2001 From: rolux Date: Thu, 13 Jan 2011 01:58:11 +0000 Subject: [PATCH] some more improvements to lists --- pandora/itemlist/views.py | 23 ++++++++-- static/js/pandora.js | 94 +++++++++++++++++++++++++++++++-------- 2 files changed, 94 insertions(+), 23 deletions(-) diff --git a/pandora/itemlist/views.py b/pandora/itemlist/views.py index 32cc372a7..ed7c34736 100644 --- a/pandora/itemlist/views.py +++ b/pandora/itemlist/views.py @@ -32,6 +32,7 @@ def _parse_query(data, user): query['range'] = [0, 100] #query['sort'] = [{'key':'user', 'operator':'+'}, {'key':'name', 'operator':'+'}] query['sort'] = [{'key':'position__position', 'operator':'+'}] + query['sort'] = [{'key':'name', 'operator':'+'}] for key in ('keys', 'group', 'list', 'range', 'ids'): if key in data: query[key] = data[key] @@ -76,7 +77,11 @@ def findLists(request): query = _parse_query(data, request.user) #order - qs = _order_query(query['qs'], query['sort']) + #FIXME: having to use distinct here seams wrong + qs = _order_query(query['qs'].distinct(), query['sort']) + #qs = query['qs'].distinct().order_by('position__position') + #qs = query['qs'] + #range response = json_response() if 'keys' in data: @@ -186,10 +191,12 @@ actions.register(addList) def editList(request): ''' param data { - key: value - position: int + id: listId, + key: value, } - keys: name, public, query, featured (if admin) + keys: name, status, query, position + if you change status you have to provide position of list + return { status: {'code': int, 'text': string}, data: { @@ -210,6 +217,13 @@ def editList(request): if value not in list._status: value = list._status[0] setattr(list, key, value) + elif key == 'name': + name = data['name'] + num = 1 + while models.List.objects.filter(name=name, user=list.user).exclude(id=list.id).count()>0: + num += 1 + name = data['name'] + ' (%d)' % num + setattr(list, key, name) else: setattr(list, key, data[key]) @@ -221,6 +235,7 @@ def editList(request): pos.section = 'my' pos.save() list.save() + response['data'] = list.json(user=request.user) else: response = json_response(status=403, text='not allowed') return render_to_json_response(response) diff --git a/static/js/pandora.js b/static/js/pandora.js index 9308eb54d..5ed35ad83 100755 --- a/static/js/pandora.js +++ b/static/js/pandora.js @@ -2110,9 +2110,9 @@ var pandora = new Ox.App({ if (id == 'my') { menu = [ { id: 'new', title: 'New List...' }, - { id: 'newfromselection', title: 'New List from Selection...' }, + { id: 'newfromselection', title: 'New List from Current Selection...', disabled: true }, { id: 'newsmart', title: 'New Smart List...' }, - { id: 'newfromresults', title: 'New Smart List from Results...' }, + { id: 'newfromresults', title: 'New Smart List from Current Results...', disabled: true }, {}, { id: 'addselection', title: 'Add Selection to List...' } ]; @@ -2132,19 +2132,26 @@ var pandora = new Ox.App({ columns: [ { id: 'id', - visible: false, - unique: true - }, - { - id: 'position', - visible: false, + format: function(value) { + return value.split('.').join(': '); + }, + operator: '+', + unique: true, + visible: id == 'public', + width: 184 }, { align: 'left', - editable: id == 'my', + editable: id == 'my' ? true : (id == 'featured' ? function(data) { + Ox.print('########', data, app.user.username) + return data.id && data.id.split(': ')[0] == app.user.username; + } : false), id: 'name', + input: { + autovalidate: autovalidateListname + }, operator: '+', - visible: true, + visible: id != 'public', width: 184 }, { @@ -2159,7 +2166,7 @@ var pandora = new Ox.App({ format: function(value) { return $('').attr({ src: 'static/oxjs/build/png/ox.ui.modern/symbol' + - (value ? 'Find' : 'None') + '.png' + (value ? 'Find' : 'None') + '.png' }); }, id: 'query', @@ -2169,11 +2176,12 @@ var pandora = new Ox.App({ }, { align: 'left', + clickable: id == 'my', format: function(value) { var symbols = {private: 'None', public: 'Publish', featured: 'Star'}; return $('').attr({ src: 'static/oxjs/build/png/ox.ui.modern/symbol' + - symbols[value] + '.png' + symbols[value] + '.png' }); }, id: 'status', @@ -2184,6 +2192,7 @@ var pandora = new Ox.App({ ], max: 1, min: 0, + pageLength: 1000, request: function(data, callback) { var query; if (id == 'my') { @@ -2216,6 +2225,19 @@ var pandora = new Ox.App({ } }) .bindEvent({ + click: function(event, data) { + var list = app.$ui.sectionLists[i]; + if (data.key == 'query') { + + } else if (data.key == 'status') { + pandora.api.editList({ + id: data.id, + status: list.value(data.id, data.key) == 'private' ? 'public' : 'private' + }, function(result) { + list.value(result.data.id, 'status', result.data.status); + }); + } + }, load: function(event, data) { $section.$content.css({ height: data.items * 16 + 'px' @@ -2224,22 +2246,38 @@ var pandora = new Ox.App({ height: data.items * 16 + 'px' }); }, - select: function(event, data) { - app.$ui.sectionLists.forEach(function($list, i_) { - i != i_ && $list.options('selected', []); - }); - }, - sort: function(event, data) { + move: function(event, data) { /* data.ids.forEach(function(id, pos) { app.user.ui.lists[id].position = pos; }); */ + // fixme: only one of the below + // (and then Ox.List can send less event data) + pandora.api.editList({ + id: data.id, + position: data.position + }); + /* pandora.api.sortLists({ section: id, ids: data.ids }); - } + */ + }, + select: function(event, data) { + app.$ui.sectionLists.forEach(function($list, i_) { + i != i_ && $list.options('selected', []); + }); + }, + submit: function(event, data) { + data_ = {id: data.id}; + data_[data.key] = data.value; + pandora.api.editList(data_, function(result) { + app.$ui.sectionLists[i].value(data.id, 'name', result.data.name); + app.$ui.sectionLists[i].value(data.id, 'id', result.data.id); + }); + } }) .appendTo($section.$content); }); @@ -2407,6 +2445,24 @@ var pandora = new Ox.App({ callback(value); } + function autovalidateListname(value, blur, callback) { + var length = value.length; + value = $.map(value.split(''), function(v, i) { + if (new RegExp('[0-9a-z\\(\\)' + ((i == 0 || (i == length - 1 && blur)) ? '' : ' \-') + ']', 'i')(v)) { + return v + } else { + return null; + } + }).join(''); + $.each([' ', ' -', '- ', '--', '\\(\\(', '\\)\\(', '\\)\\)'], function(i, v) { + Ox.print(v, v[0], v[0] == '\\') + while (value.indexOf(v) > -1) { + value = value.replace(new RegExp(v, 'g'), v[0] + (v[0] == '\\' ? v[1] : '')); + } + }) + callback(value); + } + function autovalidateUsername(value, blur, callback) { var length = value.length; value = $.map(value.toLowerCase().split(''), function(v, i) {