mirror of
https://github.com/flynx/ImageGrid.git
synced 2025-10-29 10:20:08 +00:00
reworked metadata UI...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
parent
6146f41967
commit
dfd96f892b
@ -122,6 +122,7 @@ var ExperimentActions = actions.Actions({
|
|||||||
function(){
|
function(){
|
||||||
}],
|
}],
|
||||||
|
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|
||||||
var ExperimentFeature =
|
var ExperimentFeature =
|
||||||
|
|||||||
@ -341,113 +341,148 @@ var MetadataUIActions = actions.Actions({
|
|||||||
//
|
//
|
||||||
// XXX should we replace 'mode' with nested set of metadata???
|
// XXX should we replace 'mode' with nested set of metadata???
|
||||||
// XXX make this support multiple images...
|
// XXX make this support multiple images...
|
||||||
// XXX add support for .metadataSection(make) action to construct a section...
|
showMetadata: ['Image/Metadata2...',
|
||||||
showMetadata: ['Image/Metadata...',
|
|
||||||
widgets.makeUIDialog(function(image, mode){
|
widgets.makeUIDialog(function(image, mode){
|
||||||
//function(image, mode){
|
|
||||||
var that = this
|
var that = this
|
||||||
image = this.data.getImage(image)
|
image = this.data.getImage(image)
|
||||||
mode = mode || 'disabled'
|
mode = mode || 'disabled'
|
||||||
|
data = this.images[image]
|
||||||
|
|
||||||
|
return browse.makeLister(null,
|
||||||
|
function(p, make){
|
||||||
|
// helper...
|
||||||
|
// NOTE: we intentionally rewrite this on each update,
|
||||||
|
// this is done to keep the ref to make(..) up-to-date...
|
||||||
|
make.dialog.wait = function(){
|
||||||
|
make.Separator()
|
||||||
|
make.Spinner()
|
||||||
|
}
|
||||||
|
|
||||||
|
// essentials...
|
||||||
|
make(['$GID: ', image])
|
||||||
|
// NOTE: these are 1-based and not 0-based...
|
||||||
|
make(['Index (ribbon): ',
|
||||||
|
that.data.getImageOrder('ribbon', image) + 1
|
||||||
|
+'/'+
|
||||||
|
that.data.getImages(image).len])
|
||||||
|
// show this only when cropped...
|
||||||
|
make(['Index (global): ',
|
||||||
|
that.data.getImageOrder(image) + 1
|
||||||
|
+'/'+
|
||||||
|
that.data.getImages('all').len])
|
||||||
|
// crop-specific stuff...
|
||||||
|
;(that.crop_stack && that.crop_stack.len > 0)
|
||||||
|
&& make(['Index (crop): ',
|
||||||
|
that.data.getImageOrder('loaded', image) + 1
|
||||||
|
+'/'+
|
||||||
|
that.data.getImages('loaded').len])
|
||||||
|
// ribbons order...
|
||||||
|
make(['Ribbon: ',
|
||||||
|
that.data.getRibbonOrder(image) + 1
|
||||||
|
+'/'+
|
||||||
|
Object.keys(that.data.ribbons).length])
|
||||||
|
|
||||||
|
if(data){
|
||||||
|
// some abstractions...
|
||||||
|
var _normalize = typeof(path) != 'undefined' ?
|
||||||
|
path.normalize
|
||||||
|
: function(e){ return e.replace(/\/\.\//, '') }
|
||||||
|
var _basename = typeof(path) != 'undefined' ?
|
||||||
|
path.basename
|
||||||
|
: function(e){ return e.split(/[\\\/]/g).pop() }
|
||||||
|
var _dirname = typeof(path) != 'undefined' ?
|
||||||
|
function(e){ return path.normalize(path.dirname(e)) }
|
||||||
|
: function(e){
|
||||||
|
return _normalize(e.split(/[\\\/]/g).slice(0, -1).join('/')) }
|
||||||
|
|
||||||
|
make.Separator()
|
||||||
|
// paths...
|
||||||
|
data.path
|
||||||
|
&& make(['File $Name: ',
|
||||||
|
_basename(data.path)])
|
||||||
|
&& make(['Parent $Directory: ',
|
||||||
|
_dirname((data.base_path || '.') +'/'+ data.path)])
|
||||||
|
&& make(['Full $Path: ',
|
||||||
|
_normalize((data.base_path || '.') +'/'+ data.path)])
|
||||||
|
// times...
|
||||||
|
data.birthtime
|
||||||
|
&& make(['Date created: ',
|
||||||
|
data.birthtime && new Date(data.birthtime).toShortDate()])
|
||||||
|
data.ctime
|
||||||
|
&& make(['- ctime: ',
|
||||||
|
data.ctime && new Date(data.ctime).toShortDate()],
|
||||||
|
{disabled: true})
|
||||||
|
data.mtime
|
||||||
|
&& make(['- mtime: ',
|
||||||
|
data.mtime && new Date(data.mtime).toShortDate()],
|
||||||
|
{disabled: true})
|
||||||
|
data.atime
|
||||||
|
&& make(['- atime: ',
|
||||||
|
data.atime && new Date(data.atime).toShortDate()],
|
||||||
|
{disabled: true})
|
||||||
|
}
|
||||||
|
|
||||||
|
// comment...
|
||||||
|
make.Editable(['$Comment: ',
|
||||||
|
function(){
|
||||||
|
return data && data.comment || '' }],
|
||||||
|
{
|
||||||
|
start_on: 'open',
|
||||||
|
edit_text: 'last',
|
||||||
|
multiline: true,
|
||||||
|
reset_on_commit: false,
|
||||||
|
editdone: function(evt, value){
|
||||||
|
if(value.trim() == ''){
|
||||||
|
return }
|
||||||
|
data = that.images[image] = that.images[image] || {}
|
||||||
|
data.comment = value
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
// get other sections...
|
||||||
|
that.callSortedAction('metadataSection', make, image, data, mode)
|
||||||
|
}, {
|
||||||
|
cls: 'table-view',
|
||||||
|
showDisabled: false,
|
||||||
|
})
|
||||||
|
// select value of current item...
|
||||||
|
.on('select', function(evt, elem){
|
||||||
|
that.config['metadata-auto-select-mode'] == 'on select'
|
||||||
|
&& $(elem).find('.text').last().selectText() })
|
||||||
|
.close(function(){
|
||||||
|
// XXX handle comment and tag changes...
|
||||||
|
// XXX
|
||||||
|
})
|
||||||
|
})],
|
||||||
|
|
||||||
|
metadataSection: ['- Image/',
|
||||||
|
{ sortedActionPriority: 'normal' },
|
||||||
|
core.notUserCallable(function(make, gid, image, mode){
|
||||||
|
var that = this
|
||||||
|
var metadata = this.getMetadata(gid) || {}
|
||||||
var field_order = this.config['metadata-field-order'] || []
|
var field_order = this.config['metadata-field-order'] || []
|
||||||
var x = field_order.length + 1
|
var x = field_order.length + 1
|
||||||
|
|
||||||
// get image metadata...
|
make.dialog.updateMetadata =
|
||||||
var metadata = this.getMetadata(image) || {}
|
function(metadata){
|
||||||
var img = this.images && this.images[image] || null
|
metadata = metadata || that.getMetadata()
|
||||||
|
|
||||||
// helpers...
|
// build new data set and update view...
|
||||||
var _cmp = function(a, b){
|
//this.options.data = _buildInfoList(image, metadata)
|
||||||
a = field_order.indexOf(a[0]
|
this.update()
|
||||||
.replace(/\$(\w)/g, '$1')
|
|
||||||
.replace(/^- |: $/g, ''))
|
|
||||||
a = a == -1 ? x : a
|
|
||||||
b = field_order.indexOf(b[0]
|
|
||||||
.replace(/\$(\w)/g, '$1')
|
|
||||||
.replace(/^- |: $/g, ''))
|
|
||||||
b = b == -1 ? x : b
|
|
||||||
return a - b
|
|
||||||
}
|
|
||||||
|
|
||||||
var _buildInfoList = function(image, metadata){
|
return this
|
||||||
// XXX move these to an info feature...
|
|
||||||
// base fields...
|
|
||||||
var base = [
|
|
||||||
['$GID: ', image],
|
|
||||||
// NOTE: these are 1-based and not 0-based...
|
|
||||||
['Index (ribbon): ',
|
|
||||||
that.data.getImageOrder('ribbon', image) + 1
|
|
||||||
+'/'+
|
|
||||||
that.data.getImages(image).len],
|
|
||||||
// show this only when cropped...
|
|
||||||
['Index (global): ',
|
|
||||||
that.data.getImageOrder(image) + 1
|
|
||||||
+'/'+
|
|
||||||
that.data.getImages('all').len],
|
|
||||||
]
|
|
||||||
// crop-specific stuff...
|
|
||||||
if(that.crop_stack && that.crop_stack.len > 0){
|
|
||||||
base = base.concat([
|
|
||||||
['Index (crop): ',
|
|
||||||
that.data.getImageOrder('loaded', image) + 1
|
|
||||||
+'/'+
|
|
||||||
that.data.getImages('loaded').len],
|
|
||||||
])
|
|
||||||
}
|
|
||||||
// fields that expect that image data is available...
|
|
||||||
var info = ['---']
|
|
||||||
if(img){
|
|
||||||
// some abstractions...
|
|
||||||
// XXX should these be here???
|
|
||||||
var _normalize = typeof(path) != 'undefined' ?
|
|
||||||
path.normalize
|
|
||||||
: function(e){ return e.replace(/\/\.\//, '') }
|
|
||||||
var _basename = typeof(path) != 'undefined' ?
|
|
||||||
path.basename
|
|
||||||
: function(e){ return e.split(/[\\\/]/g).pop() }
|
|
||||||
var _dirname = typeof(path) != 'undefined' ?
|
|
||||||
function(e){ return path.normalize(path.dirname(e)) }
|
|
||||||
: function(e){
|
|
||||||
return _normalize(e.split(/[\\\/]/g).slice(0, -1).join('/')) }
|
|
||||||
|
|
||||||
// paths...
|
|
||||||
img.path
|
|
||||||
&& base.push(['File $Name: ',
|
|
||||||
_basename(img.path)])
|
|
||||||
&& base.push(['Parent $Directory: ',
|
|
||||||
_dirname((img.base_path || '.') +'/'+ img.path)])
|
|
||||||
&& base.push(['Full $Path: ',
|
|
||||||
_normalize((img.base_path || '.') +'/'+ img.path)])
|
|
||||||
|
|
||||||
// times...
|
|
||||||
img.birthtime
|
|
||||||
&& base.push(['Date created: ',
|
|
||||||
img.birthtime && new Date(img.birthtime).toShortDate()])
|
|
||||||
img.ctime
|
|
||||||
&& base.push(['- ctime: ',
|
|
||||||
img.ctime && new Date(img.ctime).toShortDate()])
|
|
||||||
img.mtime
|
|
||||||
&& base.push(['- mtime: ',
|
|
||||||
img.mtime && new Date(img.mtime).toShortDate()])
|
|
||||||
img.atime
|
|
||||||
&& base.push(['- atime: ',
|
|
||||||
img.atime && new Date(img.atime).toShortDate()])
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// comment and tags...
|
// build fields...
|
||||||
info.push(['$Comment: ',
|
var fields = []
|
||||||
function(){ return img && img.comment || '' }])
|
Object.keys(metadata)
|
||||||
|
.forEach(function(k){
|
||||||
info.push(['$Tags: ',
|
|
||||||
function(){ return that.data.getTags().join(', ') || '' }])
|
|
||||||
|
|
||||||
// build fields...
|
|
||||||
var fields = []
|
|
||||||
Object.keys(metadata).forEach(function(k){
|
|
||||||
var n = k
|
var n = k
|
||||||
// convert camel-case to human-case ;)
|
// convert camel-case to human-case ;)
|
||||||
.replace(/([A-Z]+)/g, ' $1')
|
.replace(/([A-Z]+)/g, ' $1')
|
||||||
.capitalize()
|
.capitalize()
|
||||||
|
var opts = {}
|
||||||
|
|
||||||
// skip metadata stuff in short mode...
|
// skip metadata stuff in short mode...
|
||||||
if(mode != 'full'
|
if(mode != 'full'
|
||||||
@ -456,89 +491,34 @@ var MetadataUIActions = actions.Actions({
|
|||||||
return
|
return
|
||||||
|
|
||||||
} else if(mode == 'disabled') {
|
} else if(mode == 'disabled') {
|
||||||
n = '- ' + n
|
opts.disabled = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fields.push([ n + ': ', metadata[k] ])
|
fields.push([
|
||||||
|
[ n + ': ', metadata[k] ],
|
||||||
|
opts,
|
||||||
|
])
|
||||||
})
|
})
|
||||||
|
|
||||||
// sort fields...
|
// make fields...
|
||||||
base.sort(_cmp)
|
fields
|
||||||
fields.sort(_cmp)
|
.sort(function(a, b){
|
||||||
|
a = field_order.indexOf(a[0][0]
|
||||||
// add separator to base...
|
.replace(/\$(\w)/g, '$1')
|
||||||
fields.length > 0 && info.push('---')
|
.replace(/^- |: $/g, ''))
|
||||||
|
a = a == -1 ? x : a
|
||||||
return base
|
b = field_order.indexOf(b[0][0]
|
||||||
.concat(info)
|
.replace(/\$(\w)/g, '$1')
|
||||||
.concat(fields)
|
.replace(/^- |: $/g, ''))
|
||||||
}
|
b = b == -1 ? x : b
|
||||||
|
return a - b })
|
||||||
// XXX might be a good idea to directly bind ctrl-c to copy value...
|
.run(function(){
|
||||||
var o = browse.makeList(
|
this.length > 0
|
||||||
null,
|
&& make.Separator() })
|
||||||
_buildInfoList(image, metadata),
|
.forEach(function(e){
|
||||||
{
|
make(...e) })
|
||||||
showDisabled: false,
|
})],
|
||||||
})
|
|
||||||
// select value of current item...
|
|
||||||
.on('select', function(evt, elem){
|
|
||||||
if(that.config['metadata-auto-select-mode'] == 'on select'){
|
|
||||||
$(elem).find('.text').last().selectText()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
// XXX start editing onkeydown...
|
|
||||||
.on('keydown', function(){
|
|
||||||
// XXX Enter + editable -> edit (only this???)
|
|
||||||
})
|
|
||||||
// path selected...
|
|
||||||
.open(function(evt, path){
|
|
||||||
event.preventDefault()
|
|
||||||
|
|
||||||
var editable = that.config['metadata-editable-fields']
|
|
||||||
|
|
||||||
var text = o.filter(path).find('.text')
|
|
||||||
|
|
||||||
var field = text.first().text()
|
|
||||||
.trim()
|
|
||||||
// remove the trailing ':'
|
|
||||||
.slice(0, -1)
|
|
||||||
var elem = text.last()
|
|
||||||
|
|
||||||
// handle select...
|
|
||||||
if(that.config['metadata-auto-select-mode'] == 'on open'){
|
|
||||||
elem.selectText()
|
|
||||||
}
|
|
||||||
|
|
||||||
// skip non-editable fields...
|
|
||||||
if(editable.indexOf(field) >= 0){
|
|
||||||
elem.makeEditable({
|
|
||||||
activate: true,
|
|
||||||
clear_on_edit: false,
|
|
||||||
//blur_on_abort: false,
|
|
||||||
//blur_on_commit: false,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.on('close', function(){
|
|
||||||
// XXX
|
|
||||||
})
|
|
||||||
|
|
||||||
o.dom.addClass('table-view')
|
|
||||||
|
|
||||||
o.updateMetadata = function(metadata){
|
|
||||||
metadata = metadata || that.getMetadata()
|
|
||||||
|
|
||||||
// build new data set and update view...
|
|
||||||
this.options.data = _buildInfoList(image, metadata)
|
|
||||||
this.update()
|
|
||||||
|
|
||||||
return this
|
|
||||||
}
|
|
||||||
|
|
||||||
return o
|
|
||||||
})]
|
|
||||||
})
|
})
|
||||||
|
|
||||||
var MetadataUI =
|
var MetadataUI =
|
||||||
@ -573,27 +553,23 @@ module.MetadataFSUI = core.ImageGridFeatures.Feature({
|
|||||||
|
|
||||||
handlers: [
|
handlers: [
|
||||||
// Read metadata and when done update the list...
|
// Read metadata and when done update the list...
|
||||||
// XXX should we show what we can and wait for metadata load (current
|
|
||||||
// state) or wait and show everything in one go???
|
|
||||||
['showMetadata.pre',
|
['showMetadata.pre',
|
||||||
function(image){
|
function(image){
|
||||||
var that = this
|
var that = this
|
||||||
var reader = this.readMetadata(image)
|
var reader = this.readMetadata(image)
|
||||||
|
|
||||||
return reader && function(client){
|
return reader
|
||||||
var data = client.options.data
|
&& function(client){
|
||||||
|
// add a loading indicator...
|
||||||
|
// NOTE: this will get overwritten when calling .updateMetadata()
|
||||||
|
client.wait()
|
||||||
|
|
||||||
// add a loading indicator...
|
reader
|
||||||
// NOTE: this will get overwritten when calling .updateMetadata()
|
.then(function(data){
|
||||||
data.push('---')
|
client.updateMetadata() })
|
||||||
data.push('...')
|
.catch(function(){
|
||||||
client.update()
|
client.update() })
|
||||||
|
} }],
|
||||||
reader.then(function(data){
|
|
||||||
client.updateMetadata()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}],
|
|
||||||
],
|
],
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@ -706,6 +706,20 @@ var TagUIActions = actions.Actions({
|
|||||||
// XXX
|
// XXX
|
||||||
},
|
},
|
||||||
|
|
||||||
|
metadataSection: [
|
||||||
|
{ sortedActionPriority: 80 },
|
||||||
|
function(make, gid, image){
|
||||||
|
var that = this
|
||||||
|
|
||||||
|
make(['Tags:',
|
||||||
|
function(){
|
||||||
|
return that.data.getTags(gid).join(', ') }],
|
||||||
|
{
|
||||||
|
open: function(){
|
||||||
|
that.showTagCloud(gid)
|
||||||
|
.close(function(){
|
||||||
|
make.dialog.update() }) },
|
||||||
|
}) }],
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -108,10 +108,10 @@ module.VirtualImages = core.ImageGridFeatures.Feature({
|
|||||||
tag: 'virtual-images',
|
tag: 'virtual-images',
|
||||||
depends: [
|
depends: [
|
||||||
'edit',
|
'edit',
|
||||||
// XXX
|
|
||||||
],
|
],
|
||||||
suggested: [
|
suggested: [
|
||||||
'ui-virtual-images',
|
'ui-virtual-images',
|
||||||
|
'ui-virtual-images-edit',
|
||||||
],
|
],
|
||||||
|
|
||||||
actions: VirtualImagesActions,
|
actions: VirtualImagesActions,
|
||||||
@ -128,7 +128,7 @@ var VirtualImagesUIActions = actions.Actions({
|
|||||||
},
|
},
|
||||||
|
|
||||||
__virtual_block_processors__: {
|
__virtual_block_processors__: {
|
||||||
// The default handler is designed to process plain or lightly
|
// Text handler is designed to process plain or lightly
|
||||||
// formatted text.
|
// formatted text.
|
||||||
//
|
//
|
||||||
// This will:
|
// This will:
|
||||||
@ -137,9 +137,10 @@ var VirtualImagesUIActions = actions.Actions({
|
|||||||
//
|
//
|
||||||
// NOTE: the processor is allowed to only modify image block
|
// NOTE: the processor is allowed to only modify image block
|
||||||
// content, anything else would require cleanup...
|
// content, anything else would require cleanup...
|
||||||
|
//
|
||||||
// XXX might be a good idea to add action param to enable
|
// XXX might be a good idea to add action param to enable
|
||||||
// handlers to do things like 'setup', 'cleanup', ...
|
// handlers to do things like 'setup', 'cleanup', ...
|
||||||
default: function(image, dom){
|
text: function(image, dom){
|
||||||
if(!image.text){
|
if(!image.text){
|
||||||
return dom }
|
return dom }
|
||||||
|
|
||||||
@ -184,14 +185,33 @@ var VirtualImagesUIActions = actions.Actions({
|
|||||||
var p = (this.__virtual_block_processors__
|
var p = (this.__virtual_block_processors__
|
||||||
|| VirtualImagesUIActions.__virtual_block_processors__
|
|| VirtualImagesUIActions.__virtual_block_processors__
|
||||||
|| {})
|
|| {})
|
||||||
p = p[image.format] || p['default']
|
p = p[image.format] || p['text']
|
||||||
return p instanceof Function ?
|
return p instanceof Function ?
|
||||||
p.call(this, image, dom)
|
p.call(this, image, dom)
|
||||||
: dom }],
|
: dom }],
|
||||||
|
|
||||||
|
// XXX add text format selection...
|
||||||
|
metadataSection: [
|
||||||
|
{ sortedActionPriority: 80 },
|
||||||
|
function(make, gid, image){
|
||||||
|
var that = this
|
||||||
|
if(!image || image.type != 'virtual'){
|
||||||
|
return }
|
||||||
|
|
||||||
// XXX virtual block editor UI...
|
make.Separator()
|
||||||
// XXX
|
make.Editable(['Te$xt:', image.text], {
|
||||||
|
start_on: 'open',
|
||||||
|
edit_text: 'last',
|
||||||
|
multiline: true,
|
||||||
|
reset_on_commit: false,
|
||||||
|
editdone: function(evt, value){
|
||||||
|
image.text = value
|
||||||
|
that.refresh(gid)
|
||||||
|
},
|
||||||
|
})
|
||||||
|
// XXX add format selection...
|
||||||
|
make(['Format:', image.format || 'text'])
|
||||||
|
}],
|
||||||
})
|
})
|
||||||
|
|
||||||
// NOTE: this is independent of 'virtual-images'...
|
// NOTE: this is independent of 'virtual-images'...
|
||||||
@ -206,6 +226,7 @@ module.VirtualImagesUI = core.ImageGridFeatures.Feature({
|
|||||||
],
|
],
|
||||||
suggested: [
|
suggested: [
|
||||||
'virtual-images',
|
'virtual-images',
|
||||||
|
'ui-virtual-images-edit',
|
||||||
],
|
],
|
||||||
|
|
||||||
actions: VirtualImagesUIActions,
|
actions: VirtualImagesUIActions,
|
||||||
@ -229,6 +250,30 @@ module.VirtualImagesUI = core.ImageGridFeatures.Feature({
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------
|
||||||
|
|
||||||
|
var VirtualImagesEditUIActions = actions.Actions({
|
||||||
|
// XXX virtual block editor...
|
||||||
|
// XXX
|
||||||
|
})
|
||||||
|
|
||||||
|
// NOTE: this is independent of 'virtual-images'...
|
||||||
|
var VirtualImagesEditUI =
|
||||||
|
module.VirtualImagesEditUI = core.ImageGridFeatures.Feature({
|
||||||
|
title: '',
|
||||||
|
doc: '',
|
||||||
|
|
||||||
|
tag: 'ui-virtual-images-edit',
|
||||||
|
depends: [
|
||||||
|
'ui',
|
||||||
|
'ui-virtual-images',
|
||||||
|
'virtual-images',
|
||||||
|
],
|
||||||
|
|
||||||
|
actions: VirtualImagesEditUIActions,
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* vim:set ts=4 sw=4 : */ return module })
|
* vim:set ts=4 sw=4 : */ return module })
|
||||||
|
|||||||
@ -281,7 +281,10 @@ if(typeof(jQuery) != typeof(undefined)){
|
|||||||
} else if(n == 'Enter'
|
} else if(n == 'Enter'
|
||||||
&& !options.multiline){
|
&& !options.multiline){
|
||||||
evt.preventDefault()
|
evt.preventDefault()
|
||||||
that.trigger('edit-commit', that[0].innerText)
|
that.trigger('edit-commit',
|
||||||
|
that.length == 1 ?
|
||||||
|
that[0].innerText
|
||||||
|
: that.toArray().map(function(e){ return e.innerText }))
|
||||||
|
|
||||||
// done -- multi-line...
|
// done -- multi-line...
|
||||||
} else if(options.multiline
|
} else if(options.multiline
|
||||||
@ -290,7 +293,10 @@ if(typeof(jQuery) != typeof(undefined)){
|
|||||||
!(evt.ctrlKey || evt.shiftKey || evt.metaKey)
|
!(evt.ctrlKey || evt.shiftKey || evt.metaKey)
|
||||||
: (evt.ctrlKey || evt.shiftKey || evt.metaKey)) ){
|
: (evt.ctrlKey || evt.shiftKey || evt.metaKey)) ){
|
||||||
evt.preventDefault()
|
evt.preventDefault()
|
||||||
that.trigger('edit-commit', that[0].innerText)
|
that.trigger('edit-commit',
|
||||||
|
that.length == 1 ?
|
||||||
|
that[0].innerText
|
||||||
|
: that.toArray().map(function(e){ return e.innerText }))
|
||||||
|
|
||||||
// multi-line keep keys...
|
// multi-line keep keys...
|
||||||
} else if(options.multiline
|
} else if(options.multiline
|
||||||
@ -311,7 +317,10 @@ if(typeof(jQuery) != typeof(undefined)){
|
|||||||
return
|
return
|
||||||
} else if(n == 'Up' || n == 'Down'){
|
} else if(n == 'Up' || n == 'Down'){
|
||||||
evt.preventDefault()
|
evt.preventDefault()
|
||||||
that.trigger('edit-commit', that[0].innerText)
|
that.trigger('edit-commit',
|
||||||
|
that.length == 1 ?
|
||||||
|
that[0].innerText
|
||||||
|
: that.toArray().map(function(e){ return e.innerText }))
|
||||||
|
|
||||||
// continue handling...
|
// continue handling...
|
||||||
} else if(options.propagate_unhandled_keys){
|
} else if(options.propagate_unhandled_keys){
|
||||||
|
|||||||
@ -375,6 +375,10 @@ function(text, options){
|
|||||||
.trigger(
|
.trigger(
|
||||||
options.abort_on_deselect !== false ? 'edit-abort' : 'edit-commit', editable.text())
|
options.abort_on_deselect !== false ? 'edit-abort' : 'edit-commit', editable.text())
|
||||||
})
|
})
|
||||||
|
|
||||||
|
options.multiline
|
||||||
|
&& getEditable()
|
||||||
|
.css('white-space', 'pre-line')
|
||||||
|
|
||||||
stop_propagation
|
stop_propagation
|
||||||
&& elem
|
&& elem
|
||||||
|
|||||||
102
ui (gen4)/package-lock.json
generated
102
ui (gen4)/package-lock.json
generated
@ -5,14 +5,14 @@
|
|||||||
"requires": true,
|
"requires": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/node": {
|
"@types/node": {
|
||||||
"version": "10.14.13",
|
"version": "10.14.21",
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.13.tgz",
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.21.tgz",
|
||||||
"integrity": "sha512-yN/FNNW1UYsRR1wwAoyOwqvDuLDtVXnaJTZ898XIw/Q5cCaeVAlVwvsmXLX5PuiScBYwZsZU4JYSHB3TvfdwvQ=="
|
"integrity": "sha512-nuFlRdBiqbF+PJIEVxm2jLFcQWN7q7iWEJGsBV4n7v1dbI9qXB8im2pMMKMCUZe092sQb5SQft2DHfuQGK5hqQ=="
|
||||||
},
|
},
|
||||||
"ajv": {
|
"ajv": {
|
||||||
"version": "6.6.1",
|
"version": "6.10.2",
|
||||||
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.1.tgz",
|
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
|
||||||
"integrity": "sha512-ZoJjft5B+EJBjUyu9C9Hc0OZyPZSSlOF+plzouTrg6UlA8f+e/n8NIgBFG/9tppJtpPWfthHakK7juJdNDODww==",
|
"integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"fast-deep-equal": "^2.0.1",
|
"fast-deep-equal": "^2.0.1",
|
||||||
"fast-json-stable-stringify": "^2.0.0",
|
"fast-json-stable-stringify": "^2.0.0",
|
||||||
@ -214,17 +214,17 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"combined-stream": {
|
"combined-stream": {
|
||||||
"version": "1.0.7",
|
"version": "1.0.8",
|
||||||
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz",
|
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
|
||||||
"integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==",
|
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"delayed-stream": "~1.0.0"
|
"delayed-stream": "~1.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"commander": {
|
"commander": {
|
||||||
"version": "2.20.0",
|
"version": "2.20.1",
|
||||||
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
|
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.1.tgz",
|
||||||
"integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ=="
|
"integrity": "sha512-cCuLsMhJeWQ/ZpsFTbE765kvVfoeSddc4nU3up4fV+fDBcfUXnbITJ+JzhkdjzOqhURjZgujxaioam4RM9yGUg=="
|
||||||
},
|
},
|
||||||
"concat-map": {
|
"concat-map": {
|
||||||
"version": "0.0.1",
|
"version": "0.0.1",
|
||||||
@ -330,9 +330,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"electron": {
|
"electron": {
|
||||||
"version": "5.0.8",
|
"version": "5.0.11",
|
||||||
"resolved": "https://registry.npmjs.org/electron/-/electron-5.0.8.tgz",
|
"resolved": "https://registry.npmjs.org/electron/-/electron-5.0.11.tgz",
|
||||||
"integrity": "sha512-wkUVE2GaYCsqQTsISSHWkIkcdpwLwZ1jhzAXSFFoSzsTgugmzhX60rJjIccotUmZ0iPzw+u4ahfcaJ0eslrPNQ==",
|
"integrity": "sha512-2QVVycTmvMmKC3S9XV7zSvouYBooHRTOBx1r64nBwtMh44gPydR3HzUbyVYjjxsw+4vIuH6AqNuY48KtWRpajg==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"@types/node": "^10.12.18",
|
"@types/node": "^10.12.18",
|
||||||
"electron-download": "^4.1.0",
|
"electron-download": "^4.1.0",
|
||||||
@ -1142,9 +1142,9 @@
|
|||||||
"integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
|
"integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
|
||||||
},
|
},
|
||||||
"hosted-git-info": {
|
"hosted-git-info": {
|
||||||
"version": "2.7.1",
|
"version": "2.8.5",
|
||||||
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
|
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz",
|
||||||
"integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w=="
|
"integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg=="
|
||||||
},
|
},
|
||||||
"http-signature": {
|
"http-signature": {
|
||||||
"version": "1.2.0",
|
"version": "1.2.0",
|
||||||
@ -1162,9 +1162,9 @@
|
|||||||
"integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ=="
|
"integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ=="
|
||||||
},
|
},
|
||||||
"ig-actions": {
|
"ig-actions": {
|
||||||
"version": "3.23.0",
|
"version": "3.24.1",
|
||||||
"resolved": "https://registry.npmjs.org/ig-actions/-/ig-actions-3.23.0.tgz",
|
"resolved": "https://registry.npmjs.org/ig-actions/-/ig-actions-3.24.1.tgz",
|
||||||
"integrity": "sha512-afgaPVscDe8n1vurzFl2cpwBtulDTCUzP4LKLrr87dN+nZY7zAshxiPeljxfz2pzMcqJMPtDhbWICm2Gpc9VJQ==",
|
"integrity": "sha512-D3TNcUHTbAdsV91hs+GITIofBP3NJpQ9IEOogEY/eKEm8MYLGin7SgwwrggVvC9cPJTe+VYE9oPS0RP2V7Tj1w==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"ig-object": "^2.0.0"
|
"ig-object": "^2.0.0"
|
||||||
}
|
}
|
||||||
@ -1317,9 +1317,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"less": {
|
"less": {
|
||||||
"version": "3.9.0",
|
"version": "3.10.3",
|
||||||
"resolved": "https://registry.npmjs.org/less/-/less-3.9.0.tgz",
|
"resolved": "https://registry.npmjs.org/less/-/less-3.10.3.tgz",
|
||||||
"integrity": "sha512-31CmtPEZraNUtuUREYjSqRkeETFdyEHSEPAGq4erDlUXtda7pzNmctdljdIagSb589d/qXGWiiP31R5JVf+v0w==",
|
"integrity": "sha512-vz32vqfgmoxF1h3K4J+yKCtajH0PWmjkIFgbs5d78E/c/e+UQTnI+lWK+1eQRE95PXM2mC3rJlLSSP9VQHnaow==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"clone": "^2.1.2",
|
"clone": "^2.1.2",
|
||||||
@ -1392,16 +1392,16 @@
|
|||||||
"optional": true
|
"optional": true
|
||||||
},
|
},
|
||||||
"mime-db": {
|
"mime-db": {
|
||||||
"version": "1.37.0",
|
"version": "1.40.0",
|
||||||
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz",
|
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
|
||||||
"integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg=="
|
"integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA=="
|
||||||
},
|
},
|
||||||
"mime-types": {
|
"mime-types": {
|
||||||
"version": "2.1.21",
|
"version": "2.1.24",
|
||||||
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz",
|
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz",
|
||||||
"integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==",
|
"integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"mime-db": "~1.37.0"
|
"mime-db": "1.40.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"mimic-response": {
|
"mimic-response": {
|
||||||
@ -1755,9 +1755,9 @@
|
|||||||
"optional": true
|
"optional": true
|
||||||
},
|
},
|
||||||
"psl": {
|
"psl": {
|
||||||
"version": "1.1.29",
|
"version": "1.4.0",
|
||||||
"resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz",
|
"resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz",
|
||||||
"integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ=="
|
"integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw=="
|
||||||
},
|
},
|
||||||
"pump": {
|
"pump": {
|
||||||
"version": "2.0.1",
|
"version": "2.0.1",
|
||||||
@ -1892,14 +1892,9 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"safe-buffer": {
|
"safe-buffer": {
|
||||||
"version": "5.1.2",
|
"version": "5.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
|
||||||
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
|
"integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg=="
|
||||||
},
|
|
||||||
"uuid": {
|
|
||||||
"version": "3.3.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
|
|
||||||
"integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -1914,9 +1909,9 @@
|
|||||||
"integrity": "sha1-aTtVidl/hZhGL8cYJjUyYqr9qDY="
|
"integrity": "sha1-aTtVidl/hZhGL8cYJjUyYqr9qDY="
|
||||||
},
|
},
|
||||||
"resolve": {
|
"resolve": {
|
||||||
"version": "1.11.1",
|
"version": "1.12.0",
|
||||||
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz",
|
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz",
|
||||||
"integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==",
|
"integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"path-parse": "^1.0.6"
|
"path-parse": "^1.0.6"
|
||||||
}
|
}
|
||||||
@ -2047,9 +2042,9 @@
|
|||||||
"integrity": "sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0="
|
"integrity": "sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0="
|
||||||
},
|
},
|
||||||
"sshpk": {
|
"sshpk": {
|
||||||
"version": "1.15.2",
|
"version": "1.16.1",
|
||||||
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.2.tgz",
|
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
|
||||||
"integrity": "sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==",
|
"integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"asn1": "~0.2.3",
|
"asn1": "~0.2.3",
|
||||||
"assert-plus": "^1.0.0",
|
"assert-plus": "^1.0.0",
|
||||||
@ -2300,10 +2295,15 @@
|
|||||||
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
||||||
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
|
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
|
||||||
},
|
},
|
||||||
|
"uuid": {
|
||||||
|
"version": "3.3.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz",
|
||||||
|
"integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ=="
|
||||||
|
},
|
||||||
"v8-compile-cache": {
|
"v8-compile-cache": {
|
||||||
"version": "2.0.3",
|
"version": "2.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz",
|
||||||
"integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w=="
|
"integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g=="
|
||||||
},
|
},
|
||||||
"validate-npm-package-license": {
|
"validate-npm-package-license": {
|
||||||
"version": "3.0.4",
|
"version": "3.0.4",
|
||||||
|
|||||||
@ -20,15 +20,15 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"app-module-path": "^1.0.6",
|
"app-module-path": "^1.0.6",
|
||||||
"async-json": "0.0.2",
|
"async-json": "0.0.2",
|
||||||
"commander": "^2.20.0",
|
"commander": "^2.20.1",
|
||||||
"electron": "^5.0.8",
|
"electron": "^5.0.11",
|
||||||
"exiftool": "^0.0.3",
|
"exiftool": "^0.0.3",
|
||||||
"fs-extra": "^7.0.1",
|
"fs-extra": "^7.0.1",
|
||||||
"fs-walk": "^0.0.1",
|
"fs-walk": "^0.0.1",
|
||||||
"generic-walk": "^1.4.0",
|
"generic-walk": "^1.4.0",
|
||||||
"glob": "^7.1.4",
|
"glob": "^7.1.4",
|
||||||
"guarantee-events": "^1.0.0",
|
"guarantee-events": "^1.0.0",
|
||||||
"ig-actions": "^3.23.0",
|
"ig-actions": "^3.24.1",
|
||||||
"ig-features": "^3.4.0",
|
"ig-features": "^3.4.0",
|
||||||
"ig-object": "^2.0.0",
|
"ig-object": "^2.0.0",
|
||||||
"moment": "^2.24.0",
|
"moment": "^2.24.0",
|
||||||
@ -37,7 +37,7 @@
|
|||||||
"requirejs-plugins": "^1.0.2",
|
"requirejs-plugins": "^1.0.2",
|
||||||
"sharp": "^0.22.1",
|
"sharp": "^0.22.1",
|
||||||
"strip-json-comments": "^2.0.1",
|
"strip-json-comments": "^2.0.1",
|
||||||
"v8-compile-cache": "^2.0.3",
|
"v8-compile-cache": "^2.1.0",
|
||||||
"wildglob": "^0.1.1"
|
"wildglob": "^0.1.1"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
@ -48,7 +48,7 @@
|
|||||||
"react-dom": "^15.6.2"
|
"react-dom": "^15.6.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"less": "^3.9.0"
|
"less": "^3.10.3"
|
||||||
},
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
"ig": "ig.js"
|
"ig": "ig.js"
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user