From 486497b27aec2ba49d83e395750db1a615e5aa34 Mon Sep 17 00:00:00 2001 From: Konstantin Markov Date: Wed, 9 Oct 2024 14:49:33 +0300 Subject: [PATCH] Fulfil assignment (#1848) --- .../FulfilAssignmentController.tsx | 118 ++++++++++-------- client/extension_bridge.ts | 5 +- client/planning-extension/src/extension.ts | 39 +++++- .../src/extension_bridge.ts | 2 + index.ts | 89 +++++-------- package-lock.json | 102 +++++++++------ 6 files changed, 197 insertions(+), 158 deletions(-) diff --git a/client/controllers/FulfilAssignmentController.tsx b/client/controllers/FulfilAssignmentController.tsx index e8bcb63a1..5077e6822 100644 --- a/client/controllers/FulfilAssignmentController.tsx +++ b/client/controllers/FulfilAssignmentController.tsx @@ -3,12 +3,31 @@ import React from 'react'; import ReactDOM from 'react-dom'; import {Provider} from 'react-redux'; import {ModalsContainer} from '../components'; -import {get} from 'lodash'; import {registerNotifications} from '../utils'; import {WORKSPACE, MODALS, ASSIGNMENTS} from '../constants'; import {getErrorMessage} from '../utils/index'; +import {IArticle} from 'superdesk-api'; export class FulFilAssignmentController { + item: IArticle; + notify: {error: (message: string) => void}; + gettext: ( + value: string, + params?: {[placeholder: string]: string | number | React.ComponentType}, + ) => string; + $scope: any; + store: any; + newsItem: any; + rendered: boolean; + $timeout: any; + lock: any; + $element: any; + session: any; + superdeskFlags: any; + userList: any; + api: any; + desks: any; + constructor( $element, $scope, @@ -43,20 +62,18 @@ export class FulFilAssignmentController { this.store = null; this.newsItem = null; - this.item = get($scope, 'locals.data.item', {}); + this.item = $scope.locals?.data.item ?? {}; this.rendered = false; $scope.$on('$destroy', this.onDestroy); $scope.$on('item:unlock', this.onItemUnlock); - if (get(this.item, 'archive_item')) { // use archive item for published + if (this.item?.archive_item) { // use archive item for published this.item = this.item.archive_item; } - if (get(this.item, 'slugline', '') === '') { - this.notify.error( - this.gettext('[SLUGLINE] is a required field') - ); + if (!this.item?.slugline) { + this.notify.error(this.gettext('[SLUGLINE] is a required field')); this.$scope.resolve(); return; } @@ -92,7 +109,7 @@ export class FulFilAssignmentController { return Promise.resolve(); } - loadWorkspace(store, workspaceChanged) { + loadWorkspace(store) { this.store = store; return this.loadArchiveItem() @@ -120,15 +137,15 @@ export class FulFilAssignmentController { }, 1000); // Only unlock the item if it was locked when launching this modal - if (get(this.newsItem, 'lock_session', null) !== null && - get(this.newsItem, 'lock_action', 'edit') === 'fulfil_assignment' && - this.lock.isLockedInCurrentSession(this.newsItem) + if (this.newsItem?.lock_session != null + && (this.newsItem.lock_action ?? 'edit') === 'fulfil_assignment' + && this.lock.isLockedInCurrentSession(this.newsItem) ) { this.lock.unlock(this.newsItem); } // update the scope item. - if (this.item && get(this.newsItem, 'assignment_id')) { + if (this.item && this.newsItem?.assignment_id) { this.item.assignment_id = this.newsItem.assignment_id; } } @@ -170,51 +187,42 @@ export class FulFilAssignmentController { } loadArchiveItem() { - return this.api.find('archive', this.item._id) - .then((newsItem) => { - if (get(newsItem, 'assignment_id')) { - this.notify.error( - this.gettext('Item already linked to a Planning item') - ); - this.$scope.resolve(); - return Promise.reject(); - } + return this.api.find('archive', this.item._id).then((newsItem) => { + if (newsItem?.assignment_id) { + this.notify.error(this.gettext('Item already linked to a Planning item')); + this.$scope.resolve(); + return Promise.reject(); + } - if (this.lock.isLocked(newsItem)) { - this.notify.error( - this.gettext('Item already locked.') + if (this.lock.isLocked(newsItem)) { + this.notify.error(this.gettext('Item already locked.')); + this.$scope.resolve(); + return Promise.reject(); + } + + if (!this.lock.isLockedInCurrentSession(newsItem)) { + newsItem._editable = true; + return this.lock.lock(newsItem, false, 'fulfil_assignment') + .then( + (lockedItem) => Promise.resolve(lockedItem), + (error) => { + this.notify.error( + this.gettext(getErrorMessage(error, 'Failed to lock the item.')) + ); + this.$scope.resolve(error); + return Promise.reject(error); + } ); - this.$scope.resolve(); - return Promise.reject(); - } - - if (!this.lock.isLockedInCurrentSession(newsItem)) { - newsItem._editable = true; - return this.lock.lock(newsItem, false, 'fulfil_assignment') - .then( - (lockedItem) => Promise.resolve(lockedItem), - (error) => { - this.notify.error( - this.gettext( - getErrorMessage(error, 'Failed to lock the item.') - ) - ); - this.$scope.resolve(error); - return Promise.reject(error); - } - ); - } - - return Promise.resolve(newsItem); - }, (error) => { - this.notify.error( - this.gettext( - getErrorMessage(error, 'Failed to load the item.') - ) - ); - this.$scope.resolve(error); - return Promise.reject(error); - }); + } + + return Promise.resolve(newsItem); + }, (error) => { + this.notify.error( + this.gettext(getErrorMessage(error, 'Failed to load the item.')) + ); + this.$scope.resolve(error); + return Promise.reject(error); + }); } } diff --git a/client/extension_bridge.ts b/client/extension_bridge.ts index 281799d71..5f70d5b1c 100644 --- a/client/extension_bridge.ts +++ b/client/extension_bridge.ts @@ -1,6 +1,6 @@ import React from 'react'; -import {IVocabularyItem} from 'superdesk-api'; +import {IArticle, IVocabularyItem} from 'superdesk-api'; import {getAssignmentTypeInfo} from './utils/assignments'; import {SluglineComponent} from './components/Assignments/AssignmentItem/fields/Slugline'; @@ -10,6 +10,7 @@ import {EditorFieldVocabulary, IEditorFieldVocabularyProps} from './components/f import {getVocabularyItemFieldTranslated} from './utils/vocabularies'; import {getUserInterfaceLanguageFromCV} from './utils/users'; +import {isContentLinkToCoverageAllowed} from './utils/archive'; import {registerEditorField} from './components/fields/resources/registerEditorFields'; import {IAssignmentItem, IEditorFieldProps, IPlanningAppState, IPlanningItem} from 'interfaces'; @@ -20,6 +21,7 @@ import PlanningDetailsWidget, {getItemPlanningInfo} from './components/PlanningD interface IExtensionBridge { assignments: { utils: { + isContentLinkToCoverageAllowed(item: IArticle): boolean; getAssignmentTypeInfo( assignment: IAssignmentItem, contentTypes: Array, @@ -74,6 +76,7 @@ export const extensionBridge: IExtensionBridge = { assignments: { utils: { getAssignmentTypeInfo, + isContentLinkToCoverageAllowed, }, components: { SluglineComponent, diff --git a/client/planning-extension/src/extension.ts b/client/planning-extension/src/extension.ts index 725fc371e..d66035e79 100644 --- a/client/planning-extension/src/extension.ts +++ b/client/planning-extension/src/extension.ts @@ -113,7 +113,7 @@ const extension: IExtension = { const displayTopbarWidget = superdesk.privileges.hasPrivilege('planning_assignments_view') && extensionConfig?.assignmentsTopBarWidget === true; const {gettext} = superdesk.localization; - + const planningActionsGroupId = 'planning-actions'; const {getItemPlanningInfo} = extensionBridge.planning; const result: IExtensionActivationResult = { @@ -123,12 +123,11 @@ const extension: IExtension = { getActions: (item) => [ { label: gettext('Unlink as Coverage'), - groupId: 'planning-actions', + groupId: planningActionsGroupId, icon: 'cut', onTrigger: () => { const superdeskArticle = superdesk.entities.article; - // keep in sync with client/planning-extension/src/extension.ts:123 if ( superdesk.privileges.hasPrivilege('archive') && item.assignment_id != null && @@ -140,9 +139,39 @@ const extension: IExtension = { superdeskArticle.itemAction(item).deschedule ) ) { - const event = new CustomEvent('planning:unlinkfromcoverage', {detail: {item}}); + superdeskArticle.get(item._id).then((_item) => { + window.dispatchEvent(new CustomEvent( + 'planning:unlinkfromcoverage', + {detail: {item: _item}}, + )); + }); + } + }, + }, + { + label: superdesk.localization.gettext('Fulfil assignment'), + groupId: planningActionsGroupId, + icon: 'calendar-list', + onTrigger: () => { + const itemStates = ['killed', 'recalled', 'unpublished', 'spiked', 'correction']; + const {isContentLinkToCoverageAllowed} = extensionBridge.assignments.utils; - window.dispatchEvent(event); + if ( + !item.assignment_id && + !superdesk.entities.article.isPersonal(item) && + isContentLinkToCoverageAllowed(item) && + !superdesk.entities.article.isLockedInOtherSession(item) && + !itemStates.includes(item.state) && + superdesk.privileges.hasPrivilege('archive') + ) { + superdesk.entities.article.get(item._id).then((_item) => { + window.dispatchEvent(new CustomEvent( + 'planning:fulfilassignment', + {detail: {item: _item}}, + )); + }); + } else { + superdesk.ui.notify.error('This action is not permitted'); } }, } diff --git a/client/planning-extension/src/extension_bridge.ts b/client/planning-extension/src/extension_bridge.ts index c8de0b2c2..e9cceace7 100644 --- a/client/planning-extension/src/extension_bridge.ts +++ b/client/planning-extension/src/extension_bridge.ts @@ -1,6 +1,7 @@ import * as React from 'react'; import {IVocabularyItem} from 'superdesk-api'; import {IAssignmentItem, IEditorFieldProps, IPlanningAppState, IPlanningItem} from '../../interfaces'; +import {IArticle} from 'superdesk-api'; interface IEditorFieldVocabularyProps extends IEditorFieldProps { options: Array; @@ -16,6 +17,7 @@ interface IEditorFieldVocabularyProps extends IEditorFieldProps { interface IExtensionBridge { assignments: { utils: { + isContentLinkToCoverageAllowed(item: IArticle): boolean; getAssignmentTypeInfo( assignment: IAssignmentItem, contentTypes: Array, diff --git a/index.ts b/index.ts index 9717d0c20..d57d65f53 100644 --- a/index.ts +++ b/index.ts @@ -75,69 +75,38 @@ function configurePlanning(superdesk) { authoring.itemActions(item).deschedule ); }], - }) - .activity('planning.fulfil', { - label: gettext('Fulfil Assignment'), - icon: 'calendar-list', - modal: true, - priority: 2000, - controller: ctrl.FulFilAssignmentController, - filters: [ - { - action: 'list', - type: 'archive', - }, - { - action: 'external-app', - type: 'fulfill-assignment', - }, - ], - group: gettext('Planning'), - privileges: {archive: 1}, - additionalCondition: ['archiveService', 'item', - function(archiveService, item: IArticle) { - return !item.assignment_id && - !archiveService.isPersonal(item) && - !superdeskApi.entities.article.isLockedInOtherSession(item) && - isContentLinkToCoverageAllowed(item) && - !['killed', 'recalled', 'unpublished', 'spiked', 'correction'].includes(item.state); - }], - }) - - // TAG: AUTHORING-ANGULAR - .activity('planning.unlink', { - label: gettext('Unlink as Coverage'), - icon: 'cut', - priority: 1000, - controller: ctrl.UnlinkAssignmentController, - filters: [ - { - action: 'list', - type: 'archive', - }, - { - action: 'external-app', - type: 'unlink-assignment', - }, - ], - group: gettext('Planning'), - privileges: {archive: 1}, - - // keep in sync with client/planning-extension/src/extension.ts:126 - additionalCondition: ['archiveService', 'item', 'authoring', - function(archiveService, item, authoring) { - return item.assignment_id && - !archiveService.isPersonal(item) && - !superdeskApi.entities.article.isLockedInOtherSession(item) && - ( - authoring.itemActions(item).edit || - authoring.itemActions(item).correct || - authoring.itemActions(item).deschedule - ); - }], }); } +window.addEventListener('planning:fulfilassignment', (event: CustomEvent) => { + const element = window.$(document.createElement('div')); + const localScope = ng.get('$rootScope').$new(true); + const handleDestroy = () => { + localScope.$broadcast('$destroy'); + element[0].remove(); + }; + + localScope.resolve = handleDestroy; + localScope.reject = handleDestroy; + localScope.locals = {data: {item: event.detail.item}}; + + new ctrl.FulFilAssignmentController( + element, + localScope, + ng.get('sdPlanningStore'), + ng.get('notify'), + ng.get('gettext'), + ng.get('lock'), + ng.get('session'), + ng.get('userList'), + ng.get('api'), + ng.get('$timeout'), + ng.get('superdeskFlags'), + ng.get('desks') + ); +}); + + window.addEventListener('planning:unlinkfromcoverage', (event: CustomEvent) => { ctrl.UnlinkAssignmentController( event.detail, diff --git a/package-lock.json b/package-lock.json index e6740f6eb..7324d1942 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1128,7 +1128,7 @@ "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "dev": true }, "assign-symbols": { @@ -1172,7 +1172,7 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, "atob": { @@ -1206,7 +1206,7 @@ "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "dev": true }, "aws4": { @@ -1345,7 +1345,7 @@ "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dev": true, "requires": { "tweetnacl": "^0.14.3" @@ -1368,6 +1368,16 @@ "integrity": "sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA==", "dev": true }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, "block-stream": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", @@ -1526,13 +1536,22 @@ } }, "browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.1.tgz", + "integrity": "sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==", "dev": true, "requires": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" + "bn.js": "^5.2.1", + "randombytes": "^2.1.0", + "safe-buffer": "^5.2.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } } }, "browserify-sign": { @@ -1734,15 +1753,15 @@ } }, "caniuse-db": { - "version": "1.0.30001660", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30001660.tgz", - "integrity": "sha512-pwOmc3RUlTewTgGr0d5eKX/YWKb7ZDVcFeVz8G+7s3jma6z7ZTiXeRBRN8x0gTCOAuiBQX0Ny9ZIDWocECODKA==", + "version": "1.0.30001664", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30001664.tgz", + "integrity": "sha512-73+YTKw0KMawAD9ziTbZmcTYDATAHZVBD+K23Bnj0rUuEEX75M9F3j/3x5Nwweqz4F+djgIIuD+gltXFM7kTCQ==", "dev": true }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "dev": true }, "center-align": { @@ -2679,7 +2698,7 @@ "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dev": true, "requires": { "assert-plus": "^1.0.0" @@ -2894,7 +2913,7 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true }, "delegates": { @@ -3167,7 +3186,7 @@ "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "dev": true, "requires": { "jsbn": "~0.1.0", @@ -3199,9 +3218,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.5.23", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.23.tgz", - "integrity": "sha512-mBhODedOXg4v5QWwl21DjM5amzjmI1zw9EPrPK/5Wx7C8jt33bpZNrC7OhHUG3pxRtbLpr3W2dXT+Ph1SsfRZA==", + "version": "1.5.29", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.29.tgz", + "integrity": "sha512-PF8n2AlIhCKXQ+gTpiJi0VhcHDb69kYX4MtCiivctc2QD3XuNZ/XIOlbGzt7WAjjEev0TtaH6Cu3arZExm5DOw==", "dev": true }, "elliptic": { @@ -4272,7 +4291,7 @@ "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "dev": true }, "fast-deep-equal": { @@ -4456,6 +4475,13 @@ "integrity": "sha512-0k45oWBokCqh2MOexeYKpyqmGKG+8mQ2Wd8iawx+uWd/weWJQAZ6SoPybagdCI4xFisag8iAR77WPm4h3pTfxA==", "dev": true }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, "filename-regex": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", @@ -4620,7 +4646,7 @@ "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "dev": true }, "form-data": { @@ -4846,7 +4872,7 @@ "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "dev": true, "requires": { "assert-plus": "^1.0.0" @@ -5485,7 +5511,7 @@ "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", "dev": true }, "har-validator": { @@ -6039,7 +6065,7 @@ "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", "dev": true, "requires": { "assert-plus": "^1.0.0", @@ -6662,7 +6688,7 @@ "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true }, "is-upper-case": { @@ -6735,7 +6761,7 @@ "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", "dev": true }, "jasmine": { @@ -6826,7 +6852,7 @@ "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", "dev": true }, "json-loader": { @@ -6865,7 +6891,7 @@ "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true }, "json3": { @@ -8802,7 +8828,7 @@ "path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", "dev": true }, "path-exists": { @@ -8901,13 +8927,13 @@ "pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", "dev": true }, "pinkie-promise": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", "dev": true, "requires": { "pinkie": "^2.0.0" @@ -10272,7 +10298,7 @@ "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", "dev": true }, "repeat-element": { @@ -12135,7 +12161,7 @@ } }, "superdesk-core": { - "version": "github:superdesk/superdesk-client-core#c1b648853877b8072918efb65b45bdd04f031775", + "version": "github:superdesk/superdesk-client-core#be5cb155334b485016df9eb9dea78e8e9848dedf", "from": "github:superdesk/superdesk-client-core#develop", "dev": true, "requires": { @@ -12779,7 +12805,7 @@ "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, "requires": { "safe-buffer": "^5.0.1" @@ -12788,7 +12814,7 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true }, "type": { @@ -13286,7 +13312,7 @@ "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "dev": true, "requires": { "assert-plus": "^1.0.0", @@ -13297,7 +13323,7 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", "dev": true } } @@ -13402,6 +13428,7 @@ "dev": true, "optional": true, "requires": { + "bindings": "^1.5.0", "nan": "^2.12.1" } }, @@ -13900,6 +13927,7 @@ "dev": true, "optional": true, "requires": { + "bindings": "^1.5.0", "nan": "^2.12.1" } },