kahuna/public/js/components/gr-add-keyword/gr-add-keyword.js (105 lines of code) (raw):

import angular from 'angular'; import '../../services/image-accessor'; import '../../edits/service'; import '../../forms/datalist'; import './gr-add-keyword.css'; import template from './gr-add-keyword.html'; import '../../directives/gr-auto-focus'; import {overwrite} from "../../util/constants/editOptions"; export var addKeyword = angular.module('gr.addKeyword', [ 'gr.image.service', 'kahuna.edits.service', 'gr.autoFocus', 'kahuna.forms.datalist' ]); addKeyword.controller('GrAddKeywordCtrl', [ '$window', '$scope', '$q', 'imageAccessor', 'editsService', function ($window, $scope, $q, imageAccessor, editsService) { let ctrl = this; ctrl.active = false; ctrl.descriptionOption = overwrite.key; const updateImages = (images, metadataFieldName, valueFn) => { let uptodateImages = []; images.map((image) => { editsService.batchUpdateMetadataField( [image], metadataFieldName, valueFn(image), ctrl.descriptionOption ); //-ensure metadata in image is up-to-date- let tmpImages = $scope.$parent.ctrl.imageAsArray.filter(img => img.uri == image.uri); if (tmpImages.length > 0) { let uptodateImage = tmpImages[0]; uptodateImage.data.metadata.keywords = valueFn(image); uptodateImages.push(uptodateImage); } }); return Promise.resolve(uptodateImages); }; const addXToImages = (metadataFieldName, accessor) => (images, addedX) => { return updateImages( images, metadataFieldName, (image) => { const currentXInImage = accessor(image); return currentXInImage ? [...currentXInImage, ...addedX] : [...addedX]; } ); }; ctrl.keywordAccessor = (image) => imageAccessor.readMetadata(image).keywords; ctrl.addKeywordToImages = addXToImages('keywords', ctrl.keywordAccessor); ctrl.save = () => { let keywordList = ctrl.newKeyword.split(',').map(e => e.trim()); let imageArray = $scope.$parent.ctrl.imageAsArray; if (keywordList) { save(keywordList, imageArray); } }; ctrl.cancel = reset; function save(keyword, imageArray) { ctrl.adding = true; ctrl.active = false; ctrl.addKeywordToImages(imageArray, keyword) .then(() => { reset(); }) .catch(saveFailed) .finally(() => ctrl.adding = false); } function saveFailed(e) { console.error(e); $window.alert('Something went wrong when saving, please try again!'); ctrl.active = true; } function reset() { ctrl.newKeyword = ''; ctrl.active = false; } ctrl.keywordSearch = (q) => { //-current search always resolves to empty but retained as possible extension point- let a = q ? [] : []; return $q.resolve(a); }; ctrl.keywordAppend = (currentVal, selectedVal) => { const beforeLastComma = currentVal.split(/, ?/).slice(0, -1); const fullText = beforeLastComma.concat(selectedVal); return fullText.join(', '); }; ctrl.selectLastKeyword = (value) => { const afterComma = value.split(',').slice(-1)[0].trim(); return afterComma; }; } ]); addKeyword.directive('grAddKeyword', [function () { return { restrict: 'E', scope: { grSmall: '=?', active: '=?' }, controller: 'GrAddKeywordCtrl', controllerAs: 'ctrl', bindToController: true, template: template }; }]);