From dfd96f892bccc70b8add664d26dc4d5f3cc8efd3 Mon Sep 17 00:00:00 2001 From: "Alex A. Naanou" Date: Thu, 10 Oct 2019 06:07:17 +0300 Subject: [PATCH] reworked metadata UI... Signed-off-by: Alex A. Naanou --- ui (gen4)/features/experimental.js | 1 + ui (gen4)/features/metadata.js | 344 +++++++++++++-------------- ui (gen4)/features/tags.js | 14 ++ ui (gen4)/features/virtual-images.js | 57 ++++- ui (gen4)/lib/util-dom.js | 15 +- ui (gen4)/lib/widget/browse.js | 4 + ui (gen4)/package-lock.json | 102 ++++---- ui (gen4)/package.json | 10 +- 8 files changed, 298 insertions(+), 249 deletions(-) diff --git a/ui (gen4)/features/experimental.js b/ui (gen4)/features/experimental.js index 2286bcbb..8a34fabf 100755 --- a/ui (gen4)/features/experimental.js +++ b/ui (gen4)/features/experimental.js @@ -122,6 +122,7 @@ var ExperimentActions = actions.Actions({ function(){ }], + }) var ExperimentFeature = diff --git a/ui (gen4)/features/metadata.js b/ui (gen4)/features/metadata.js index 61a3e047..213b28fe 100755 --- a/ui (gen4)/features/metadata.js +++ b/ui (gen4)/features/metadata.js @@ -341,113 +341,148 @@ 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] + 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 x = field_order.length + 1 - // get image metadata... - var metadata = this.getMetadata(image) || {} - var img = this.images && this.images[image] || null + make.dialog.updateMetadata = + function(metadata){ + metadata = metadata || that.getMetadata() - // 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 - } + // build new data set and update view... + //this.options.data = _buildInfoList(image, metadata) + this.update() - var _buildInfoList = function(image, metadata){ - // 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()]) + return this } - // comment and tags... - info.push(['$Comment: ', - function(){ return img && img.comment || '' }]) - - info.push(['$Tags: ', - function(){ return that.data.getTags().join(', ') || '' }]) - - // build fields... - var fields = [] - Object.keys(metadata).forEach(function(k){ + // build fields... + var fields = [] + 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() + client.wait() - // add a loading indicator... - // NOTE: this will get overwritten when calling .updateMetadata() - data.push('---') - data.push('...') - client.update() - - reader.then(function(data){ - client.updateMetadata() - }) - } - }], + reader + .then(function(data){ + client.updateMetadata() }) + .catch(function(){ + client.update() }) + } }], ], }) diff --git a/ui (gen4)/features/tags.js b/ui (gen4)/features/tags.js index 77396634..07d448ea 100755 --- a/ui (gen4)/features/tags.js +++ b/ui (gen4)/features/tags.js @@ -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() }) }, + }) }], }) diff --git a/ui (gen4)/features/virtual-images.js b/ui (gen4)/features/virtual-images.js index 7944ef03..1cdbb8c8 100644 --- a/ui (gen4)/features/virtual-images.js +++ b/ui (gen4)/features/virtual-images.js @@ -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 }) diff --git a/ui (gen4)/lib/util-dom.js b/ui (gen4)/lib/util-dom.js index e1f15f42..022db34c 100755 --- a/ui (gen4)/lib/util-dom.js +++ b/ui (gen4)/lib/util-dom.js @@ -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){ diff --git a/ui (gen4)/lib/widget/browse.js b/ui (gen4)/lib/widget/browse.js index d93168b5..759a8011 100755 --- a/ui (gen4)/lib/widget/browse.js +++ b/ui (gen4)/lib/widget/browse.js @@ -375,6 +375,10 @@ function(text, options){ .trigger( options.abort_on_deselect !== false ? 'edit-abort' : 'edit-commit', editable.text()) }) + + options.multiline + && getEditable() + .css('white-space', 'pre-line') stop_propagation && elem diff --git a/ui (gen4)/package-lock.json b/ui (gen4)/package-lock.json index 68440bb7..cdada92c 100755 --- a/ui (gen4)/package-lock.json +++ b/ui (gen4)/package-lock.json @@ -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", diff --git a/ui (gen4)/package.json b/ui (gen4)/package.json index 3f832070..aa97f4d6 100755 --- a/ui (gen4)/package.json +++ b/ui (gen4)/package.json @@ -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"