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(){ function(){
}], }],
}) })
var ExperimentFeature = var ExperimentFeature =

View File

@ -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()
})
}
}],
], ],
}) })

View File

@ -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() }) },
}) }],
}) })

View File

@ -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 })

View File

@ -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){

View File

@ -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

View File

@ -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",

View File

@ -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"