mirror of
https://github.com/flynx/ImageGrid.git
synced 2025-10-29 18:30:09 +00:00
now editible lists support item editing...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
parent
d5cf7500c4
commit
6dc1a52109
@ -644,7 +644,8 @@ var CollectionActions = actions.Actions({
|
|||||||
}],
|
}],
|
||||||
renameCollection: ['- Collections/',
|
renameCollection: ['- Collections/',
|
||||||
function(from, to){
|
function(from, to){
|
||||||
if(from == MAIN_COLLECTION_TITLE
|
if(to == from
|
||||||
|
|| from == MAIN_COLLECTION_TITLE
|
||||||
|| to == MAIN_COLLECTION_TITLE
|
|| to == MAIN_COLLECTION_TITLE
|
||||||
|| (this.collections || {})[from] == null){
|
|| (this.collections || {})[from] == null){
|
||||||
return
|
return
|
||||||
@ -2228,48 +2229,14 @@ var UICollectionActions = actions.Actions({
|
|||||||
|
|
||||||
update_merge: 'merge',
|
update_merge: 'merge',
|
||||||
|
|
||||||
// element edit...
|
// XXX REVISE...
|
||||||
// XXX move to browse???
|
itemedit: function(_, from, to){
|
||||||
menu: function(_, from){
|
that.renameCollection(from, to)
|
||||||
var elem = $(this).find('.text').last()
|
|
||||||
from = elem.attr('text') || from
|
|
||||||
|
|
||||||
elem
|
// rename was successful...
|
||||||
// NOTE: we need to do this to account for
|
if(to in that.collections){
|
||||||
// '$' in names...
|
collections[collections.indexOf(from)] = to
|
||||||
.html(from)
|
}
|
||||||
.makeEditable({
|
|
||||||
activate: true,
|
|
||||||
clear_on_edit: false,
|
|
||||||
abort_keys: [
|
|
||||||
'Esc',
|
|
||||||
|
|
||||||
// XXX
|
|
||||||
'Up',
|
|
||||||
'Down',
|
|
||||||
],
|
|
||||||
})
|
|
||||||
.on('edit-commit', function(_, to){
|
|
||||||
to = to.trim()
|
|
||||||
// check if name is unique or empty...
|
|
||||||
if(to in that.collections || to == ''){
|
|
||||||
// XXX ???
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// XXX need to get the real from...
|
|
||||||
that.renameCollection(from, to)
|
|
||||||
|
|
||||||
// rename was successful...
|
|
||||||
if(to in that.collections){
|
|
||||||
collections[collections.indexOf(from)] = to
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.on('edit-abort edit-commit', function(_, title){
|
|
||||||
make.dialog.update()
|
|
||||||
.then(function(){
|
|
||||||
make.dialog.select(title) })
|
|
||||||
})
|
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
}, {
|
}, {
|
||||||
@ -2282,10 +2249,6 @@ var UICollectionActions = actions.Actions({
|
|||||||
// XXX not sure it is good that we have to do this...
|
// XXX not sure it is good that we have to do this...
|
||||||
.replace(/\$/g, '')),
|
.replace(/\$/g, '')),
|
||||||
})
|
})
|
||||||
// keyboard...
|
|
||||||
.run(function(){
|
|
||||||
this.keyboard
|
|
||||||
.handler('General', 'F2', 'Menu') })
|
|
||||||
.open(function(_, title){
|
.open(function(_, title){
|
||||||
action
|
action
|
||||||
&& (that.config['collection-last-used'] = title) })
|
&& (that.config['collection-last-used'] = title) })
|
||||||
@ -2339,6 +2302,7 @@ var UICollectionActions = actions.Actions({
|
|||||||
make.EditableList(all,
|
make.EditableList(all,
|
||||||
{
|
{
|
||||||
new_item: false,
|
new_item: false,
|
||||||
|
sortable: 'y',
|
||||||
to_remove: to_remove,
|
to_remove: to_remove,
|
||||||
itemopen: function(_, title){
|
itemopen: function(_, title){
|
||||||
var i = to_remove.indexOf(title)
|
var i = to_remove.indexOf(title)
|
||||||
@ -2349,10 +2313,21 @@ var UICollectionActions = actions.Actions({
|
|||||||
|
|
||||||
dialog.update()
|
dialog.update()
|
||||||
},
|
},
|
||||||
|
// XXX for some reason after this ordering
|
||||||
|
// does not get saved...
|
||||||
|
itemedit: function(_, from, to){
|
||||||
|
that.renameCollection(from, to)
|
||||||
|
|
||||||
|
all[all.indexOf(from)] = to
|
||||||
|
|
||||||
|
that.collection_order = all
|
||||||
|
},
|
||||||
})
|
})
|
||||||
: make.Empty('No collections...')
|
: make.Empty('No collections...')
|
||||||
})
|
})
|
||||||
.close(function(){
|
.close(function(){
|
||||||
|
that.collection_order = all
|
||||||
|
|
||||||
all.forEach(function(title){
|
all.forEach(function(title){
|
||||||
collections.indexOf(title) < 0
|
collections.indexOf(title) < 0
|
||||||
&& to_remove.indexOf(title) < 0
|
&& to_remove.indexOf(title) < 0
|
||||||
|
|||||||
@ -557,8 +557,25 @@ function(data, options){
|
|||||||
// // it as item text...
|
// // it as item text...
|
||||||
// new_item: <text>|<bool>,
|
// new_item: <text>|<bool>,
|
||||||
//
|
//
|
||||||
|
// // If true (default), enable direct editing of items...
|
||||||
|
// //
|
||||||
|
// editable_items: <bool>,
|
||||||
|
//
|
||||||
|
// // Keys to trigger item edit...
|
||||||
|
// //
|
||||||
|
// // default: [ 'F2' ]
|
||||||
|
// //
|
||||||
|
// // NOTE: the keyboard settings are global to dialog, if multiple
|
||||||
|
// // editable lists are defined they mess things up.
|
||||||
|
// item_edit_keys: [ <key>, ... ],
|
||||||
|
// item_edit_events: 'menu',
|
||||||
|
//
|
||||||
// length_limit: <number>,
|
// length_limit: <number>,
|
||||||
//
|
//
|
||||||
|
// // Item edit event handler...
|
||||||
|
// //
|
||||||
|
// itemedit: function(from, to){ ... },
|
||||||
|
//
|
||||||
// // Item open event handler...
|
// // Item open event handler...
|
||||||
// //
|
// //
|
||||||
// // NOTE: this is simpler that binding to the global open event
|
// // NOTE: this is simpler that binding to the global open event
|
||||||
@ -694,10 +711,6 @@ function(data, options){
|
|||||||
// properly...
|
// properly...
|
||||||
// XXX the problem with this is that it adds elements live while removing
|
// XXX the problem with this is that it adds elements live while removing
|
||||||
// elements on close, either both should be live or both on close...
|
// elements on close, either both should be live or both on close...
|
||||||
// XXX add option to make items editable (on by default)...
|
|
||||||
// ...reuse the code used for new_item...
|
|
||||||
// for implementation source see:
|
|
||||||
// collections.UICollectionActions.browseCollections(..)
|
|
||||||
Items.EditableList =
|
Items.EditableList =
|
||||||
function(list, options){
|
function(list, options){
|
||||||
var make = this
|
var make = this
|
||||||
@ -717,9 +730,11 @@ function(list, options){
|
|||||||
// in case the list(..) returns nothing...
|
// in case the list(..) returns nothing...
|
||||||
|| lst
|
|| lst
|
||||||
}
|
}
|
||||||
|
// save item to lst...
|
||||||
/* XXX make a universal add/replace handler...
|
var saveItem = function(txt, replace){
|
||||||
var editItem = function(txt, replace){
|
if(txt == replace || txt.trim() == ''){
|
||||||
|
return txt
|
||||||
|
}
|
||||||
txt = options.normalize ?
|
txt = options.normalize ?
|
||||||
options.normalize(txt)
|
options.normalize(txt)
|
||||||
: txt
|
: txt
|
||||||
@ -765,7 +780,9 @@ function(list, options){
|
|||||||
|| normalized.indexOf(ntxt) >= 0)
|
|| normalized.indexOf(ntxt) >= 0)
|
||||||
|
|
||||||
// add new value and sort list...
|
// add new value and sort list...
|
||||||
lst.push(txt)
|
;(replace && lst.indexOf(replace) >= 0) ?
|
||||||
|
lst[lst.indexOf(replace)] = txt
|
||||||
|
: lst.push(txt)
|
||||||
|
|
||||||
// unique...
|
// unique...
|
||||||
if(options.unique == null || options.unique === true){
|
if(options.unique == null || options.unique === true){
|
||||||
@ -793,14 +810,43 @@ function(list, options){
|
|||||||
|
|
||||||
lst = write(dialog.__list[id], lst)
|
lst = write(dialog.__list[id], lst)
|
||||||
|
|
||||||
// update list and select new value...
|
return txt
|
||||||
dialog.update()
|
}
|
||||||
.done(function(){
|
// edit item inline...
|
||||||
//dialog.select('"'+txt+'"')
|
var editItem = function(elem){
|
||||||
dialog.select('"'+txt.replace(/\$/g, '')+'"')
|
var elem = $(elem).find('.text').last()
|
||||||
|
from = elem.attr('text') || from
|
||||||
|
|
||||||
|
elem
|
||||||
|
// NOTE: we need to do this to account for
|
||||||
|
// '$' in names...
|
||||||
|
.html(from)
|
||||||
|
.makeEditable({
|
||||||
|
activate: true,
|
||||||
|
clear_on_edit: false,
|
||||||
|
abort_keys: [
|
||||||
|
'Esc',
|
||||||
|
|
||||||
|
// XXX
|
||||||
|
'Up',
|
||||||
|
'Down',
|
||||||
|
],
|
||||||
|
})
|
||||||
|
.on('edit-commit', function(evt, to){
|
||||||
|
if(to.trim() != ''){
|
||||||
|
to = saveItem(to, from)
|
||||||
|
|
||||||
|
options.itemedit
|
||||||
|
&& options.itemedit.call(elem, evt, from, to)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.on('edit-abort edit-commit', function(_, title){
|
||||||
|
title = title.trim() == '' ? from : title
|
||||||
|
dialog.update()
|
||||||
|
.then(function(){
|
||||||
|
dialog.select(title) })
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
//*/
|
|
||||||
|
|
||||||
dialog.__list = dialog.__list || {}
|
dialog.__list = dialog.__list || {}
|
||||||
dialog.__editable = dialog.__editable || {}
|
dialog.__editable = dialog.__editable || {}
|
||||||
@ -1057,6 +1103,24 @@ function(list, options){
|
|||||||
|
|
||||||
res = res.toArray()
|
res = res.toArray()
|
||||||
|
|
||||||
|
// editable...
|
||||||
|
if(options.editable_items !== false){
|
||||||
|
var trigger_edit = function(){
|
||||||
|
dialog.select('!')
|
||||||
|
.trigger('itemedit')
|
||||||
|
}
|
||||||
|
$(res)
|
||||||
|
.on('itemedit', function(){ editItem($(this)) })
|
||||||
|
;(options.item_edit_keys || ['F2'])
|
||||||
|
.forEach(function(key){
|
||||||
|
dialog.keyboard
|
||||||
|
.handler('General', key, trigger_edit) })
|
||||||
|
options.item_edit_events != false
|
||||||
|
&& options.item_edit_events != ''
|
||||||
|
&& $(res).on(options.item_edit_events || 'menu',
|
||||||
|
function(){ $(this).trigger('itemedit') })
|
||||||
|
}
|
||||||
|
|
||||||
// new button...
|
// new button...
|
||||||
if(options.new_item !== false){
|
if(options.new_item !== false){
|
||||||
var new_item = options.new_item || true
|
var new_item = options.new_item || true
|
||||||
@ -1068,86 +1132,16 @@ function(list, options){
|
|||||||
clear_on_edit: true,
|
clear_on_edit: true,
|
||||||
})
|
})
|
||||||
// update list on edit done...
|
// update list on edit done...
|
||||||
.on('edit-commit', function(evt, txt){
|
.on('edit-commit', function(evt, txt){
|
||||||
txt = options.normalize ?
|
if(txt.trim() != ''){
|
||||||
options.normalize(txt)
|
txt = saveItem(txt)
|
||||||
: txt
|
|
||||||
// account for '$' as key binding marker...
|
|
||||||
var ntxt = txt.replace(/\$/g, '')
|
|
||||||
// unique-test text...
|
|
||||||
var utxt = options.unique instanceof Function ?
|
|
||||||
options.unique(txt)+''
|
|
||||||
: null
|
|
||||||
|
|
||||||
// invalid format...
|
|
||||||
if(options.check && !options.check(txt)){
|
|
||||||
dialog.update()
|
dialog.update()
|
||||||
return
|
.done(function(){
|
||||||
|
//dialog.select('"'+txt+'"')
|
||||||
|
dialog.select('"'+txt.replace(/\$/g, '')+'"')
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
lst = dialog.__list[id]
|
|
||||||
var normalized = lst.map(function(e){
|
|
||||||
return e.replace(/\$/g, '') })
|
|
||||||
|
|
||||||
// list length limit
|
|
||||||
if(options.length_limit
|
|
||||||
&& (lst.length >= options.length_limit)){
|
|
||||||
|
|
||||||
options.overflow
|
|
||||||
&& options.overflow.call(dialog, txt)
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// prevent editing non-arrays...
|
|
||||||
if(!editable || !lst){
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// check if item pre-existed...
|
|
||||||
var preexisted = utxt ?
|
|
||||||
//lst.indexOf(options.unique(txt)) >= 0
|
|
||||||
(lst.indexOf(utxt) >= 0
|
|
||||||
// account for '$' as key binding marker... (XXX ???)
|
|
||||||
|| normalized.indexOf(utxt.replace(/\$/g, '')) >= 0)
|
|
||||||
: (lst.indexOf(txt) >= 0
|
|
||||||
|| normalized.indexOf(ntxt) >= 0)
|
|
||||||
|
|
||||||
// add new value and sort list...
|
|
||||||
lst.push(txt)
|
|
||||||
|
|
||||||
// unique...
|
|
||||||
if(options.unique == null || options.unique === true){
|
|
||||||
// account for '$' as key binding marker...
|
|
||||||
lst = lst.unique(function(e){ return e.replace(/\$/g, '') })
|
|
||||||
|
|
||||||
// unique normalized...
|
|
||||||
} else if(options.unique instanceof Function){
|
|
||||||
lst = lst.unique(options.unique)
|
|
||||||
}
|
|
||||||
|
|
||||||
// itemadded handler...
|
|
||||||
options.itemadded
|
|
||||||
&& !(options.unique && preexisted)
|
|
||||||
&& options
|
|
||||||
.itemadded.call(dialog, txt)
|
|
||||||
|
|
||||||
// sort...
|
|
||||||
if(options.sort){
|
|
||||||
lst = lst
|
|
||||||
.sort(options.sort instanceof Function ?
|
|
||||||
options.sort
|
|
||||||
: undefined)
|
|
||||||
}
|
|
||||||
|
|
||||||
lst = write(dialog.__list[id], lst)
|
|
||||||
|
|
||||||
// update list and select new value...
|
|
||||||
dialog.update()
|
|
||||||
.done(function(){
|
|
||||||
//dialog.select('"'+txt+'"')
|
|
||||||
dialog.select('"'+txt.replace(/\$/g, '')+'"')
|
|
||||||
})
|
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user