diff --git a/ui (gen4)/features/ui-widgets.js b/ui (gen4)/features/ui-widgets.js index 00bc7d7a..716771fb 100755 --- a/ui (gen4)/features/ui-widgets.js +++ b/ui (gen4)/features/ui-widgets.js @@ -1650,6 +1650,39 @@ var WidgetTestActions = actions.Actions({ - Letters: ${letters.join(', ')}`) }) })], + testPinnedList: ['Test/-99: Demo $pinned lists in dialog...', + makeUIDialog(function(){ + var actions = this + + // NOTE: passing things other than strings into a list editor + // is not supported... + var pins = ['a', 'b'] + var letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g'] + + return browse.makeLister(null, function(path, make){ + var that = this + + make.Heading('Numbers:', { + doc: 'List editor with all the buttons enabled...', + }) + make.EditablePinnedList(letters, pins, { + list_id: 'letters', + }) + + // NOTE: the dialog's .parent is not yet set at this point... + + // This will finalize the dialog... + // + // NOTE: this is not needed here as the dialog is drawn + // on sync, but for async dialogs this will align + // the selected field correctly. + make.done() + }) + // NOTE: this is not a dialog event, it is defined by the + // container to notify us that we are closing... + .on('close', function(){ + }) + })], testProgress: ['Test/Demo $progress bar...', function(text){ diff --git a/ui (gen4)/lib/util.js b/ui (gen4)/lib/util.js index f87ab059..775c125f 100755 --- a/ui (gen4)/lib/util.js +++ b/ui (gen4)/lib/util.js @@ -89,6 +89,18 @@ Array.fromArgs = function(args){ return [].slice.call(args) } +Array.prototype.sortAs = function(other){ + return this.sort(function(a, b){ + var i = other.indexOf(a) + var j = other.indexOf(b) + return i < 0 && j < 0 ? 0 + : i < 0 ? 1 + : j < 0 ? -1 + : i - j + }) +} + + module.chainCmp = function(cmp_chain){ return function(a, b, get, data){ var res diff --git a/ui (gen4)/lib/widget/browse.js b/ui (gen4)/lib/widget/browse.js index 177921a6..ec4d549d 100755 --- a/ui (gen4)/lib/widget/browse.js +++ b/ui (gen4)/lib/widget/browse.js @@ -876,7 +876,15 @@ function(list, options){ // - if nothing found, create Items.EditablePinnedList = function(list, pins, options){ + var that = this options = options || {} + var id = options.list_id + var pins_id = id + '-pins' + var dialog = this.dialog + + if(dialog.__list){ + pins = dialog.__list[pins_id] || pins + } // buttons... var buttons = options.buttons = (options.buttons || []).slice() @@ -885,8 +893,29 @@ function(list, pins, options){ '' +'', function(p, cur){ - // XXX toggle pin... - // XXX also check pins length limit... + // pin... + if(!cur.hasClass('pinned')){ + // XXX check pins length limit... + pins.splice(0, 0, p) + // sort pins... + sortable + || (options.sort instanceof Function ? + pins.sort(options.sort) + : pins.sortAs(list)) + + // XXX pin event??? + + // unpin... + } else { + pins.splice(pins.indexOf(p), 1) + + // XXX unpin event??? + } + + // XXX redraw... + + // XXX this is slow... + that.dialog.update() }] var i = buttons.indexOf('$PIN') i < 0 ? @@ -895,21 +924,24 @@ function(list, pins, options){ // options for pins... var pins_options = { - list_id: options.pins_id || 'pins', - cls: (options.cls || '') + ' pinned', + list_id: pins_id, + //cls: (options.cls || '') + ' pinned', new_item: false, length_limit: options.pins_lenght_limit || 10, } pins_options.__proto__ = options var sortable = pins_options.sortable = options.pins_sortable !== false || true - sortable - || pins.sort(function(a, b){ - // XXX - }) + sortable + || (options.sort instanceof Function ? + pins.sort(options.sort) + : pins.sortAs(list)) + + console.log('>>>>', pins, list) // build the list... var res = this.EditableList(pins, pins_options) + .addClass('pinned') .toArray() res.push(this.Separator()) @@ -917,7 +949,7 @@ function(list, pins, options){ res.concat(this.EditableList( // remove pinned from list... // XXX should these be removed or hidden??? - list.filter(function(e){ return pins.indexOf(e) >= 0 }), + list.filter(function(e){ return pins.indexOf(e) < 0 }), options) .toArray())