reworked metadata UI...

Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
Alex A. Naanou 2019-10-10 06:07:17 +03:00
parent 6146f41967
commit dfd96f892b
8 changed files with 298 additions and 249 deletions

View File

@ -122,6 +122,7 @@ var ExperimentActions = actions.Actions({
function(){
}],
})
var ExperimentFeature =

View File

@ -341,64 +341,49 @@ var MetadataUIActions = actions.Actions({
//
// XXX should we replace 'mode' with nested set of metadata???
// XXX make this support multiple images...
// XXX add support for .metadataSection(make) action to construct a section...
showMetadata: ['Image/Metadata...',
showMetadata: ['Image/Metadata2...',
widgets.makeUIDialog(function(image, mode){
//function(image, mode){
var that = this
image = this.data.getImage(image)
mode = mode || 'disabled'
data = this.images[image]
var field_order = this.config['metadata-field-order'] || []
var x = field_order.length + 1
// get image metadata...
var metadata = this.getMetadata(image) || {}
var img = this.images && this.images[image] || null
// helpers...
var _cmp = function(a, b){
a = field_order.indexOf(a[0]
.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
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()
}
var _buildInfoList = function(image, metadata){
// XXX move these to an info feature...
// base fields...
var base = [
['$GID: ', image],
// essentials...
make(['$GID: ', image])
// NOTE: these are 1-based and not 0-based...
['Index (ribbon): ',
make(['Index (ribbon): ',
that.data.getImageOrder('ribbon', image) + 1
+'/'+
that.data.getImages(image).len],
that.data.getImages(image).len])
// show this only when cropped...
['Index (global): ',
make(['Index (global): ',
that.data.getImageOrder(image) + 1
+'/'+
that.data.getImages('all').len],
]
that.data.getImages('all').len])
// crop-specific stuff...
if(that.crop_stack && that.crop_stack.len > 0){
base = base.concat([
['Index (crop): ',
;(that.crop_stack && that.crop_stack.len > 0)
&& make(['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){
that.data.getImages('loaded').len])
// ribbons order...
make(['Ribbon: ',
that.data.getRibbonOrder(image) + 1
+'/'+
Object.keys(that.data.ribbons).length])
if(data){
// some abstractions...
// XXX should these be here???
var _normalize = typeof(path) != 'undefined' ?
path.normalize
: function(e){ return e.replace(/\/\.\//, '') }
@ -410,44 +395,94 @@ var MetadataUIActions = actions.Actions({
: function(e){
return _normalize(e.split(/[\\\/]/g).slice(0, -1).join('/')) }
make.Separator()
// 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)])
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...
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()])
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 and tags...
info.push(['$Comment: ',
function(){ return img && img.comment || '' }])
// 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
},
})
info.push(['$Tags: ',
function(){ return that.data.getTags().join(', ') || '' }])
// 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 x = field_order.length + 1
make.dialog.updateMetadata =
function(metadata){
metadata = metadata || that.getMetadata()
// build new data set and update view...
//this.options.data = _buildInfoList(image, metadata)
this.update()
return this
}
// build fields...
var fields = []
Object.keys(metadata).forEach(function(k){
Object.keys(metadata)
.forEach(function(k){
var n = k
// convert camel-case to human-case ;)
.replace(/([A-Z]+)/g, ' $1')
.capitalize()
var opts = {}
// skip metadata stuff in short mode...
if(mode != 'full'
@ -456,89 +491,34 @@ var MetadataUIActions = actions.Actions({
return
} else if(mode == 'disabled') {
n = '- ' + n
opts.disabled = true
}
}
fields.push([ n + ': ', metadata[k] ])
fields.push([
[ n + ': ', metadata[k] ],
opts,
])
})
// sort fields...
base.sort(_cmp)
fields.sort(_cmp)
// add separator to base...
fields.length > 0 && info.push('---')
return base
.concat(info)
.concat(fields)
}
// XXX might be a good idea to directly bind ctrl-c to copy value...
var o = browse.makeList(
null,
_buildInfoList(image, metadata),
{
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
})]
// make fields...
fields
.sort(function(a, b){
a = field_order.indexOf(a[0][0]
.replace(/\$(\w)/g, '$1')
.replace(/^- |: $/g, ''))
a = a == -1 ? x : a
b = field_order.indexOf(b[0][0]
.replace(/\$(\w)/g, '$1')
.replace(/^- |: $/g, ''))
b = b == -1 ? x : b
return a - b })
.run(function(){
this.length > 0
&& make.Separator() })
.forEach(function(e){
make(...e) })
})],
})
var MetadataUI =
@ -573,27 +553,23 @@ module.MetadataFSUI = core.ImageGridFeatures.Feature({
handlers: [
// 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',
function(image){
var that = this
var reader = this.readMetadata(image)
return reader && function(client){
var data = client.options.data
return reader
&& function(client){
// add a loading indicator...
// NOTE: this will get overwritten when calling .updateMetadata()
data.push('---')
data.push('...')
client.update()
client.wait()
reader.then(function(data){
client.updateMetadata()
})
}
}],
reader
.then(function(data){
client.updateMetadata() })
.catch(function(){
client.update() })
} }],
],
})

View File

@ -706,6 +706,20 @@ var TagUIActions = actions.Actions({
// 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() }) },
}) }],
})

View File

@ -108,10 +108,10 @@ module.VirtualImages = core.ImageGridFeatures.Feature({
tag: 'virtual-images',
depends: [
'edit',
// XXX
],
suggested: [
'ui-virtual-images',
'ui-virtual-images-edit',
],
actions: VirtualImagesActions,
@ -128,7 +128,7 @@ var VirtualImagesUIActions = actions.Actions({
},
__virtual_block_processors__: {
// The default handler is designed to process plain or lightly
// Text handler is designed to process plain or lightly
// formatted text.
//
// This will:
@ -137,9 +137,10 @@ var VirtualImagesUIActions = actions.Actions({
//
// NOTE: the processor is allowed to only modify image block
// content, anything else would require cleanup...
//
// XXX might be a good idea to add action param to enable
// handlers to do things like 'setup', 'cleanup', ...
default: function(image, dom){
text: function(image, dom){
if(!image.text){
return dom }
@ -184,14 +185,33 @@ var VirtualImagesUIActions = actions.Actions({
var p = (this.__virtual_block_processors__
|| VirtualImagesUIActions.__virtual_block_processors__
|| {})
p = p[image.format] || p['default']
p = p[image.format] || p['text']
return p instanceof Function ?
p.call(this, image, 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...
// XXX
make.Separator()
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'...
@ -206,6 +226,7 @@ module.VirtualImagesUI = core.ImageGridFeatures.Feature({
],
suggested: [
'virtual-images',
'ui-virtual-images-edit',
],
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 })

View File

@ -281,7 +281,10 @@ if(typeof(jQuery) != typeof(undefined)){
} else if(n == 'Enter'
&& !options.multiline){
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...
} 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.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...
} else if(options.multiline
@ -311,7 +317,10 @@ if(typeof(jQuery) != typeof(undefined)){
return
} else if(n == 'Up' || n == 'Down'){
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...
} else if(options.propagate_unhandled_keys){

View File

@ -376,6 +376,10 @@ function(text, options){
options.abort_on_deselect !== false ? 'edit-abort' : 'edit-commit', editable.text())
})
options.multiline
&& getEditable()
.css('white-space', 'pre-line')
stop_propagation
&& elem
.on(stop_propagation, function(e){ e.stopPropagation() })

View File

@ -5,14 +5,14 @@
"requires": true,
"dependencies": {
"@types/node": {
"version": "10.14.13",
"resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.13.tgz",
"integrity": "sha512-yN/FNNW1UYsRR1wwAoyOwqvDuLDtVXnaJTZ898XIw/Q5cCaeVAlVwvsmXLX5PuiScBYwZsZU4JYSHB3TvfdwvQ=="
"version": "10.14.21",
"resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.21.tgz",
"integrity": "sha512-nuFlRdBiqbF+PJIEVxm2jLFcQWN7q7iWEJGsBV4n7v1dbI9qXB8im2pMMKMCUZe092sQb5SQft2DHfuQGK5hqQ=="
},
"ajv": {
"version": "6.6.1",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.1.tgz",
"integrity": "sha512-ZoJjft5B+EJBjUyu9C9Hc0OZyPZSSlOF+plzouTrg6UlA8f+e/n8NIgBFG/9tppJtpPWfthHakK7juJdNDODww==",
"version": "6.10.2",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
"integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==",
"requires": {
"fast-deep-equal": "^2.0.1",
"fast-json-stable-stringify": "^2.0.0",
@ -214,17 +214,17 @@
}
},
"combined-stream": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz",
"integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==",
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"requires": {
"delayed-stream": "~1.0.0"
}
},
"commander": {
"version": "2.20.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
"integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ=="
"version": "2.20.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.1.tgz",
"integrity": "sha512-cCuLsMhJeWQ/ZpsFTbE765kvVfoeSddc4nU3up4fV+fDBcfUXnbITJ+JzhkdjzOqhURjZgujxaioam4RM9yGUg=="
},
"concat-map": {
"version": "0.0.1",
@ -330,9 +330,9 @@
}
},
"electron": {
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/electron/-/electron-5.0.8.tgz",
"integrity": "sha512-wkUVE2GaYCsqQTsISSHWkIkcdpwLwZ1jhzAXSFFoSzsTgugmzhX60rJjIccotUmZ0iPzw+u4ahfcaJ0eslrPNQ==",
"version": "5.0.11",
"resolved": "https://registry.npmjs.org/electron/-/electron-5.0.11.tgz",
"integrity": "sha512-2QVVycTmvMmKC3S9XV7zSvouYBooHRTOBx1r64nBwtMh44gPydR3HzUbyVYjjxsw+4vIuH6AqNuY48KtWRpajg==",
"requires": {
"@types/node": "^10.12.18",
"electron-download": "^4.1.0",
@ -1142,9 +1142,9 @@
"integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
},
"hosted-git-info": {
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
"integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w=="
"version": "2.8.5",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz",
"integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg=="
},
"http-signature": {
"version": "1.2.0",
@ -1162,9 +1162,9 @@
"integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ=="
},
"ig-actions": {
"version": "3.23.0",
"resolved": "https://registry.npmjs.org/ig-actions/-/ig-actions-3.23.0.tgz",
"integrity": "sha512-afgaPVscDe8n1vurzFl2cpwBtulDTCUzP4LKLrr87dN+nZY7zAshxiPeljxfz2pzMcqJMPtDhbWICm2Gpc9VJQ==",
"version": "3.24.1",
"resolved": "https://registry.npmjs.org/ig-actions/-/ig-actions-3.24.1.tgz",
"integrity": "sha512-D3TNcUHTbAdsV91hs+GITIofBP3NJpQ9IEOogEY/eKEm8MYLGin7SgwwrggVvC9cPJTe+VYE9oPS0RP2V7Tj1w==",
"requires": {
"ig-object": "^2.0.0"
}
@ -1317,9 +1317,9 @@
}
},
"less": {
"version": "3.9.0",
"resolved": "https://registry.npmjs.org/less/-/less-3.9.0.tgz",
"integrity": "sha512-31CmtPEZraNUtuUREYjSqRkeETFdyEHSEPAGq4erDlUXtda7pzNmctdljdIagSb589d/qXGWiiP31R5JVf+v0w==",
"version": "3.10.3",
"resolved": "https://registry.npmjs.org/less/-/less-3.10.3.tgz",
"integrity": "sha512-vz32vqfgmoxF1h3K4J+yKCtajH0PWmjkIFgbs5d78E/c/e+UQTnI+lWK+1eQRE95PXM2mC3rJlLSSP9VQHnaow==",
"dev": true,
"requires": {
"clone": "^2.1.2",
@ -1392,16 +1392,16 @@
"optional": true
},
"mime-db": {
"version": "1.37.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz",
"integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg=="
"version": "1.40.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
"integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA=="
},
"mime-types": {
"version": "2.1.21",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz",
"integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==",
"version": "2.1.24",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz",
"integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
"requires": {
"mime-db": "~1.37.0"
"mime-db": "1.40.0"
}
},
"mimic-response": {
@ -1755,9 +1755,9 @@
"optional": true
},
"psl": {
"version": "1.1.29",
"resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz",
"integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ=="
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz",
"integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw=="
},
"pump": {
"version": "2.0.1",
@ -1892,14 +1892,9 @@
},
"dependencies": {
"safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
},
"uuid": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
"integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
"integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg=="
}
}
},
@ -1914,9 +1909,9 @@
"integrity": "sha1-aTtVidl/hZhGL8cYJjUyYqr9qDY="
},
"resolve": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz",
"integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==",
"version": "1.12.0",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz",
"integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==",
"requires": {
"path-parse": "^1.0.6"
}
@ -2047,9 +2042,9 @@
"integrity": "sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0="
},
"sshpk": {
"version": "1.15.2",
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.2.tgz",
"integrity": "sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==",
"version": "1.16.1",
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
"integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
"requires": {
"asn1": "~0.2.3",
"assert-plus": "^1.0.0",
@ -2300,10 +2295,15 @@
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"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": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz",
"integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w=="
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz",
"integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g=="
},
"validate-npm-package-license": {
"version": "3.0.4",

View File

@ -20,15 +20,15 @@
"dependencies": {
"app-module-path": "^1.0.6",
"async-json": "0.0.2",
"commander": "^2.20.0",
"electron": "^5.0.8",
"commander": "^2.20.1",
"electron": "^5.0.11",
"exiftool": "^0.0.3",
"fs-extra": "^7.0.1",
"fs-walk": "^0.0.1",
"generic-walk": "^1.4.0",
"glob": "^7.1.4",
"guarantee-events": "^1.0.0",
"ig-actions": "^3.23.0",
"ig-actions": "^3.24.1",
"ig-features": "^3.4.0",
"ig-object": "^2.0.0",
"moment": "^2.24.0",
@ -37,7 +37,7 @@
"requirejs-plugins": "^1.0.2",
"sharp": "^0.22.1",
"strip-json-comments": "^2.0.1",
"v8-compile-cache": "^2.0.3",
"v8-compile-cache": "^2.1.0",
"wildglob": "^0.1.1"
},
"optionalDependencies": {
@ -48,7 +48,7 @@
"react-dom": "^15.6.2"
},
"devDependencies": {
"less": "^3.9.0"
"less": "^3.10.3"
},
"bin": {
"ig": "ig.js"