Skip to content

Commit 95cdbd9

Browse files
authored
Merge pull request #4252 from guardian/an/include-exclude-metadata
[feature] Hold Alt to exclude, Shift to include when clicking search links
2 parents b3319ab + 0dd3917 commit 95cdbd9

File tree

9 files changed

+104
-38
lines changed

9 files changed

+104
-38
lines changed

kahuna/public/js/components/gr-image-metadata/gr-image-metadata.html

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@
104104
<dd class="image-info__title"
105105
ng-if="!ctrl.hasMultipleValues(ctrl.rawMetadata.title)">
106106
<a ui-sref="search.results({query: (ctrl.metadata.title | queryFilter:'title'), nonFree: ctrl.srefNonfree()})"
107+
ng-click="ctrl.searchWithModifiers($event, 'title', ctrl.metadata.title)"
107108
aria-label="Search images by {{ctrl.metadata.title}} title">{{ctrl.metadata.title}}</a>
108109
</dd>
109110
</div>
@@ -112,6 +113,7 @@
112113
<dd class="image-info__title"
113114
ng-if="!ctrl.hasMultipleValues(ctrl.rawMetadata.title)">
114115
<a ui-sref="search.results({query: (ctrl.metadata.title | queryFilter:'title'), nonFree: ctrl.srefNonfree()})"
116+
ng-click="ctrl.searchWithModifiers($event, 'title', ctrl.metadata.title)"
115117
aria-label="Search images by {{ctrl.metadata.title}} title">{{ctrl.metadata.title}}</a>
116118
</dd>
117119
</div>
@@ -322,6 +324,7 @@
322324
<span class="metadata-line__info" ng-if="!ctrl.hasMultipleValues(ctrl.rawMetadata.byline)">
323325
<span ng-if="ctrl.metadata.byline">
324326
<a ui-sref="search.results({query: (ctrl.metadata.byline | queryFilter:'by'), nonFree: ctrl.srefNonfree()})"
327+
ng-click="ctrl.searchWithModifiers($event, 'by', ctrl.metadata.byline)"
325328
aria-label="Search images by {{ctrl.metadata.byline}} byline">{{ctrl.metadata.byline}}</a>
326329
</span>
327330

@@ -370,6 +373,7 @@
370373
<span class="metadata-line__info" ng-if="!ctrl.hasMultipleValues(ctrl.rawMetadata.credit)">
371374
<span ng-if="ctrl.metadata.credit">
372375
<a ui-sref="search.results({query: (ctrl.metadata.credit | queryFilter:'credit'), nonFree: ctrl.srefNonfree()})"
376+
ng-click="ctrl.searchWithModifiers($event, 'credit', ctrl.metadata.credit)"
373377
aria-label="Search images by {{ctrl.metadata.credit}} credit">{{ctrl.metadata.credit}}</a>
374378
</span>
375379

@@ -400,6 +404,7 @@
400404
<a
401405
ng-if="!ctrl.hasMultipleValues(ctrl.rawMetadata[prop])"
402406
ui-sref="search.results({query: (ctrl.metadata[prop] | queryFilter:ctrl.locationFieldMap[prop]), nonFree: ctrl.srefNonfree()})"
407+
ng-click="ctrl.searchWithModifiers($event, ctrl.locationFieldMap[prop], ctrl.metadata[prop])"
403408
aria-label="Search images by {{ctrl.metadata[prop]}} {{prop}}"
404409
>{{ctrl.metadata[prop]}}</a><span
405410
ng-if="ctrl.hasMultipleValues(ctrl.rawMetadata[prop])"
@@ -538,6 +543,7 @@
538543
<span class="metadata-line__info" ng-if="!ctrl.hasMultipleValues(ctrl.rawMetadata.copyright)">
539544
<span ng-if="ctrl.metadata.copyright">
540545
<a ui-sref="search.results({query: (ctrl.metadata.copyright | queryFilter:'copyright'), nonFree: ctrl.srefNonfree()})"
546+
ng-click="ctrl.searchWithModifiers($event, 'copyright', ctrl.metadata.copyright)"
541547
aria-label="Search images by {{ctrl.metadata.copyright}} copyright">{{ctrl.metadata.copyright}}</a>
542548
</span>
543549

@@ -559,6 +565,7 @@
559565
<dd ng-if="!ctrl.hasMultipleValues(ctrl.extraInfo.uploadedBy)" class="image-info__wrap metadata-line metadata-line__info image-info__group--dl__value--panel">
560566
<span class="metadata-line__info">
561567
<a ui-sref="search.results({query: (ctrl.extraInfo.uploadedBy | queryFilter:'uploader'), nonFree: ctrl.srefNonfree()})"
568+
ng-click="ctrl.searchWithModifiers($event, 'uploader', ctrl.extraInfo.uploadedBy)"
562569
aria-label="Search images uploaded by {{ctrl.extraInfo.uploadedBy}}">{{ctrl.extraInfo.uploadedBy | stripEmailDomain}}</a>
563570
</span>
564571
</dd>
@@ -639,6 +646,7 @@
639646
<dt class="metadata-line__key image-info__group--dl__key--full-metadata">{{key | spaceWords}}</dt>
640647
<dd class="metadata-line__info image-info__group--dl__value--full-metadata">
641648
<a ui-sref="search.results({query: (value | queryFilter:'{{key}}'), nonFree: ctrl.srefNonfree()})"
649+
ng-click="ctrl.searchWithModifiers($event, key, value)"
642650
aria-label="Search images with {{key}} '{{value}}'">{{value}}</a>
643651
</dd>
644652
</dl>
@@ -647,6 +655,7 @@
647655
<dt class="metadata-line__key image-info__group--dl__key--full-metadata">{{key}}</dt>
648656
<dd class="metadata-line__info image-info__group--dl__value--full-metadata">
649657
<a ui-sref="search.results({query: (metadata.value | queryFilter:'{{metadata.alias}}'), nonFree: ctrl.srefNonfree()})"
658+
ng-click="ctrl.searchWithModifiers($event, metadata.alias, metadata.value)"
650659
aria-label="Search images with {{key}} '{{metadata.value}}'">{{metadata.value}}</a>
651660
</dd>
652661
</dl>
@@ -832,6 +841,7 @@
832841
ng-repeat="collection in ctrl.singleImage.data.collections"
833842
ng-switch-default>
834843
<a ui-sref="search.results({query: (collection.data.pathId | queryCollectionFilter), nonFree: ctrl.srefNonfree()})"
844+
ng-click="ctrl.searchWithModifiers($event, 'collection', collection.data.pathId)"
835845
aria-label="Search images by {{collection.data.description}} collection">
836846
{{collection.data.path.join(' ▸ ')}}
837847
</a>

kahuna/public/js/components/gr-image-metadata/gr-image-metadata.js

Lines changed: 46 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import { editOptions, overwrite } from '../../util/constants/editOptions';
1212
import '../../services/image-accessor';
1313
import '../../services/image-list';
1414
import '../../services/label';
15+
import '../../search/query-filter';
16+
1517
import { List } from 'immutable';
1618

1719
export const module = angular.module('gr.imageMetadata', [
@@ -34,8 +36,7 @@ module.controller('grImageMetadataCtrl', [
3436
'inject$',
3537
'labelService',
3638
'storage',
37-
38-
39+
'searchWithModifiers',
3940
function ($rootScope,
4041
$scope,
4142
$window,
@@ -47,7 +48,8 @@ module.controller('grImageMetadataCtrl', [
4748
imageAccessor,
4849
inject$,
4950
labelService,
50-
storage) {
51+
storage,
52+
searchWithModifiers) {
5153

5254
let ctrl = this;
5355

@@ -58,14 +60,14 @@ module.controller('grImageMetadataCtrl', [
5860
ctrl.metadataUpdatedByTemplate = [];
5961

6062
ctrl.$onInit = () => {
61-
$scope.$watchCollection('ctrl.selectedImages', function() {
63+
$scope.$watchCollection('ctrl.selectedImages', function () {
6264
ctrl.singleImage = singleImage();
6365
ctrl.selectedLabels = selectedLabels();
6466
ctrl.usageRights = selectedUsageRights();
6567
inject$($scope, Rx.Observable.fromPromise(selectedUsageCategory(ctrl.usageRights)), ctrl, 'usageCategory');
6668
ctrl.rawMetadata = rawMetadata();
6769
ctrl.metadata = displayMetadata();
68-
ctrl.metadata.dateTaken = ctrl.displayDateTakenMetadata();
70+
ctrl.metadata.dateTaken = ctrl.displayDateTakenMetadata();
6971
ctrl.newPeopleInImage = "";
7072
ctrl.newKeywords = "";
7173
ctrl.extraInfo = extraInfo();
@@ -76,26 +78,28 @@ module.controller('grImageMetadataCtrl', [
7678
});
7779

7880
const freeUpdateListener = $rootScope.$on('images-updated',
79-
(e, updatedImages) => updateHandler(updatedImages));
81+
(e, updatedImages) => updateHandler(updatedImages));
8082

8183
const updateHandler = (updatedImages) => {
8284
ctrl.selectedImages = new List(updatedImages);
8385
};
8486

8587
ctrl.hasMultipleValues = (val) => Array.isArray(val) && val.length > 1;
8688

87-
ctrl.displayDateTakenMetadata = function() {
89+
ctrl.displayDateTakenMetadata = function () {
8890
let dateTaken = ctrl.metadata.dateTaken ? new Date(ctrl.metadata.dateTaken) : undefined;
89-
if (dateTaken) { dateTaken.setSeconds(0, 0); }
91+
if (dateTaken) {
92+
dateTaken.setSeconds(0, 0);
93+
}
9094
return dateTaken;
9195
};
9296

93-
ctrl.credits = function(searchText) {
97+
ctrl.credits = function (searchText) {
9498
return ctrl.metadataSearch('credit', searchText);
9599
};
96100

97101
ctrl.metadataSearch = (field, q) => {
98-
return mediaApi.metadataSearch(field, { q }).then(resource => {
102+
return mediaApi.metadataSearch(field, {q}).then(resource => {
99103
return resource.data.map(d => d.key);
100104
});
101105
};
@@ -104,11 +108,11 @@ module.controller('grImageMetadataCtrl', [
104108

105109
ctrl.descriptionOptions = editOptions;
106110

107-
ctrl.updateDescriptionField = function() {
111+
ctrl.updateDescriptionField = function () {
108112
ctrl.updateMetadataField('description', ctrl.metadata.description);
109113
};
110114

111-
ctrl.updateLocationField = function(data, value) {
115+
ctrl.updateLocationField = function (data, value) {
112116
Object.keys(value).forEach(key => {
113117
if (value[key] === undefined) {
114118
delete value[key];
@@ -120,7 +124,7 @@ module.controller('grImageMetadataCtrl', [
120124
ctrl.updateMetadataField = function (field, value) {
121125
var imageArray = Array.from(ctrl.selectedImages);
122126
if (field === 'dateTaken') {
123-
value = value.toISOString();
127+
value = value.toISOString();
124128
}
125129
if (field === 'peopleInImage') {
126130
ctrl.addPersonToImages(imageArray, value);
@@ -138,7 +142,7 @@ module.controller('grImageMetadataCtrl', [
138142
);
139143
};
140144

141-
ctrl.updateDomainMetadataField = function(name, field, value) {
145+
ctrl.updateDomainMetadataField = function (name, field, value) {
142146
return editsService.updateDomainMetadataField(ctrl.singleImage, name, field, value)
143147
.then((updatedImage) => {
144148
if (updatedImage) {
@@ -240,7 +244,7 @@ module.controller('grImageMetadataCtrl', [
240244
.map(([key, value]) => {
241245
let fieldAlias = ctrl.fieldAliases.find(_ => _.alias === key);
242246
if (fieldAlias && fieldAlias.displayInAdditionalMetadata === true) {
243-
return [fieldAlias.label, { value, alias: fieldAlias.alias}];
247+
return [fieldAlias.label, {value, alias: fieldAlias.alias}];
244248
}
245249
})
246250
.filter(_ => _ !== undefined));
@@ -250,7 +254,7 @@ module.controller('grImageMetadataCtrl', [
250254
ctrl.domainMetadata = ctrl.domainMetadataSpecs
251255
.filter(domainMetadataSpec => domainMetadataSpec.fields.length > 0)
252256
.reduce((acc, domainMetadataSpec) => {
253-
let domainMetadata = { ...domainMetadataSpec };
257+
let domainMetadata = {...domainMetadataSpec};
254258

255259
if (ctrl.singleImage.data.metadata) {
256260
const imageDomainMetadata = ctrl.singleImage.data.metadata.domainMetadata ? ctrl.singleImage.data.metadata.domainMetadata : {};
@@ -284,7 +288,7 @@ module.controller('grImageMetadataCtrl', [
284288
field.selectOptions = field.options
285289
.filter(option => option)
286290
.map(option => {
287-
return { value: option, text: option };
291+
return {value: option, text: option};
288292
});
289293
}
290294

@@ -332,7 +336,7 @@ module.controller('grImageMetadataCtrl', [
332336
ctrl.hasLocationInformation = hasLocationInformation;
333337

334338
function singleImage() {
335-
if (ctrl.selectedImages.size === 1){
339+
if (ctrl.selectedImages.size === 1) {
336340
return ctrl.selectedImages.first();
337341
}
338342
}
@@ -371,18 +375,23 @@ module.controller('grImageMetadataCtrl', [
371375
function rawMetadata() {
372376
return selectedMetadata().map((values) => {
373377
switch (values.size) {
374-
case 0: return undefined;
375-
case 1: return values.first();
376-
default: return Array.from(values);
378+
case 0:
379+
return undefined;
380+
case 1:
381+
return values.first();
382+
default:
383+
return Array.from(values);
377384
}
378385
}).toObject();
379386
}
380387

381388
function displayMetadata() {
382389
return selectedMetadata().map((values) => {
383390
switch (values.size) {
384-
case 1: return values.first();
385-
default: return undefined;
391+
case 1:
392+
return values.first();
393+
default:
394+
return undefined;
386395
}
387396
}).toObject();
388397
}
@@ -392,9 +401,12 @@ module.controller('grImageMetadataCtrl', [
392401
const properties = imageList.getSetOfProperties(info);
393402
return properties.map((values) => {
394403
switch (values.size) {
395-
case 0: return undefined;
396-
case 1: return values.first();
397-
default: return Array.from(values);
404+
case 0:
405+
return undefined;
406+
case 1:
407+
return values.first();
408+
default:
409+
return Array.from(values);
398410
}
399411
}).toObject();
400412
}
@@ -421,11 +433,11 @@ module.controller('grImageMetadataCtrl', [
421433
ctrl.removeImageFromCollection = (collection) => {
422434
ctrl.removingCollection = collection;
423435
collections.removeImageFromCollection(collection, ctrl.singleImage)
424-
.then(() => ctrl.removingCollection = false);
436+
.then(() => ctrl.removingCollection = false);
425437
};
426438

427-
$scope.$on('$destroy', function() {
428-
freeUpdateListener();
439+
$scope.$on('$destroy', function () {
440+
freeUpdateListener();
429441
});
430442

431443
ctrl.onMetadataTemplateSelected = (metadata, usageRights, collection, leasesWithConfig) => {
@@ -498,16 +510,18 @@ module.controller('grImageMetadataCtrl', [
498510
};
499511

500512
ctrl.isDomainMetadataEmpty = (key) => {
501-
return ctrl.domainMetadata.find(obj => obj.name === key ).fields.every(field => field.value === undefined );
513+
return ctrl.domainMetadata.find(obj => obj.name === key).fields.every(field => field.value === undefined);
502514
};
503515

504516
ctrl.isAdditionalMetadataEmpty = () => {
505517
const totalAdditionalMetadataCount = Object.keys(ctrl.metadata).filter(key => ctrl.isUsefulMetadata(key)).length +
506-
Object.keys(ctrl.additionalMetadata).length +
507-
Object.keys(ctrl.identifiers).length;
518+
Object.keys(ctrl.additionalMetadata).length +
519+
Object.keys(ctrl.identifiers).length;
508520

509521
return totalAdditionalMetadataCount == 0;
510522
};
523+
524+
ctrl.searchWithModifiers = searchWithModifiers;
511525
};
512526
}
513527
]);

kahuna/public/js/edits/list-editor-compact.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
<a class="element__value element__value--compact element__link"
99
ng-if="!ctrl.disabled"
1010
ui-sref="search.results({query: (element | {{ctrl.queryFilter}}), nonFree: ctrl.srefNonfree()})"
11+
ng-click="ctrl.searchWithModifiers($event, 'label', element)"
1112
aria-label="Search images by {{element}} {{ctrl.elementName}}">
1213
{{element}}
1314
</a>

kahuna/public/js/edits/list-editor-info-panel.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
<gr-icon>library_add</gr-icon>
99
</button>
1010
<a ui-sref="search.results({query: (element.data | {{ctrl.queryFilter}}), nonFree: ctrl.srefNonfree()})" class="element__value"
11+
ng-click="ctrl.searchWithModifiers($event, ctrl.elementName, element.data)"
1112
aria-label="Search images by {{element.data}} {{ctrl.elementName}}"
1213
ng-class="{'element__right-bit': !ctrl.isEditable}"
1314
>

kahuna/public/js/edits/list-editor.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,15 @@ listEditor.controller('ListEditorCtrl', [
2222
'imageLogic',
2323
'imageList',
2424
'storage',
25+
'searchWithModifiers',
2526
function($rootScope,
2627
$scope,
2728
$window,
2829
$timeout,
2930
imageLogic,
3031
imageList,
31-
storage) {
32+
storage,
33+
searchWithModifiers) {
3234
var ctrl = this;
3335

3436
ctrl.$onInit = () => {
@@ -147,6 +149,8 @@ listEditor.controller('ListEditorCtrl', [
147149
$scope.$on('$destroy', function() {
148150
updateListener();
149151
});
152+
153+
ctrl.searchWithModifiers = searchWithModifiers;
150154
};
151155
}]);
152156

kahuna/public/js/preview/image.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@
7979
gr-tooltip-position="top">
8080
<a ui-sref="search.results({query: (collection.data.pathId | queryCollectionFilter), nonFree: ctrl.srefNonfree()})"
8181
ng-attr-style="{{::ctrl.getCollectionStyle(collection)}}"
82+
ng-click="ctrl.searchWithModifiers($event, 'collection', collection.data.pathId)"
8283
class="preview__collections__collection__value">
8384
{{::collection.data.description}}
8485
</a>

kahuna/public/js/preview/image.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import '../components/gr-add-label/gr-add-label';
1717
import '../components/gr-archiver-status/gr-archiver-status';
1818
import '../components/gr-syndication-icon/gr-syndication-icon';
1919
import {graphicImageBlurService} from "../services/graphic-image-blur";
20+
import '../search/query-filter';
2021

2122
export var image = angular.module('kahuna.preview.image', [
2223
'gr.image.service',
@@ -43,6 +44,7 @@ image.controller('uiPreviewImageCtrl', [
4344
'imageAccessor',
4445
'storage',
4546
'graphicImageBlurService',
47+
'searchWithModifiers',
4648
function (
4749
$scope,
4850
inject$,
@@ -53,7 +55,8 @@ image.controller('uiPreviewImageCtrl', [
5355
labelService,
5456
imageAccessor,
5557
storage,
56-
graphicImageBlurService) {
58+
graphicImageBlurService,
59+
searchWithModifiers) {
5760
var ctrl = this;
5861

5962
ctrl.$onInit = () => {
@@ -131,6 +134,8 @@ image.controller('uiPreviewImageCtrl', [
131134
return $window._clientConfig.imagePreviewFlagAlertCopy;
132135
}
133136
};
137+
138+
ctrl.searchWithModifiers = searchWithModifiers;
134139
};
135140
}]);
136141

0 commit comments

Comments
 (0)