kahuna/public/js/components/gr-image-metadata/gr-image-metadata.html (949 lines of code) (raw):

<div class="image-info"> <div class="image-info__group" role="region" aria-label="Metadata templates" ng-if="ctrl.displayMetadataTemplates && ctrl.userCanEdit && ctrl.singleImage"> <div class="image-info__heading image-info__heading--lease"> <span>Fill in from template:</span> </div> <gr-metadata-templates image="ctrl.singleImage" metadata="ctrl.singleImage.data.metadata" usage-rights="ctrl.singleImage.data.usageRights" gr-on-metadata-template-selected="ctrl.onMetadataTemplateSelected(metadata, usageRights, collection, leasesWithConfig)" gr-on-metadata-template-applying="ctrl.onMetadataTemplateApplying(leases)" gr-on-metadata-template-applied="ctrl.onMetadataTemplateApplied()" gr-on-metadata-template-cancelled="ctrl.onMetadataTemplateCancelled(metadata, usageRights)" class="metadata-templates-flex"> </gr-metadata-templates> </div> <div class="image-info__group" role="region" aria-label="Rights and restrictions"> <dl class="image-info__wrap metadata-line image-info__usage-rights"> <dt class="metadata-line__key">Rights & restrictions</dt> <gr-usage-rights-editor ng-if="ctrl.showUsageRights" gr-usage-rights="ctrl.usageRights" gr-on-save="ctrl.showUsageRights = false" gr-on-cancel="ctrl.showUsageRights = false" gr-usage-rights-updated-by-template="ctrl.usageRightsUpdatedByTemplate"> </gr-usage-rights-editor> <div class="image-info__title" ng-if="!ctrl.showUsageRights"> <dd ng-if="!ctrl.usageRightsSummary"> {{ctrl.usageCategory || 'None'}} </dd> <dd ng-if="ctrl.usageRightsSummary"> <usage-rights-summary class="usage-rights-summary" props="{'images':ctrl.selectedImages, 'categoryCallback':ctrl.callbackUsageCategory}"> </usage-rights-summary> </dd> </div> <button data-cy="it-edit-usage-rights-button" ng-click="ctrl.showUsageRights = true" ng-hide="!ctrl.userCanEdit || ctrl.showUsageRights" class="image-info__edit">✎</button> </dl> </div> <div class="image-info__group" role="region" aria-label="Image type" ng-if="ctrl.validImageTypes.length > 0" > <dl class="image-info__wrap metadata-line image-info__image-type"> <dt class="metadata-line__key">Image type</dt> <span ng-if="ctrl.metadataUpdatedByTemplate.includes('imageType')"> <div class="metadata-line__info"> <dd class="image-info__image-type-preview">{{ctrl.metadata.imageType}}</dd> </div> </span> <span ng-if="!ctrl.metadataUpdatedByTemplate.includes('imageType')"> <button data-cy="it-edit-image-type-button" class="image-info__edit" ng-click="imageTypeEditForm.$show()" ng-if="ctrl.userCanEdit && ctrl.metadataUpdatedByTemplate.length == 0" ng-hide="imageTypeEditForm.$visible">✎</button> <span class="image-info__image-type" editable-select="ctrl.metadata.imageType" e-placeholder="-- choose type --" e-ng-options="option for option in ctrl.validImageTypes" ng-hide="imageTypeEditForm.$visible" onbeforesave="ctrl.updateMetadataField('imageType', $data)" e:ng-class="{'image-info__editor--error': $error, 'image-info__editor--saving': imageTypeEditForm.$waiting, 'text-input': true}" e:form="imageTypeEditForm"> <span ng-if="ctrl.userCanEdit"> <dd ng-if="ctrl.hasMultipleValues(ctrl.rawMetadata.imageType)" class="image-info__image-type image-info--multiple" > Multiple image types (click ✎ to edit <strong>all</strong>) </dd> <dd ng-if="!ctrl.hasMultipleValues(ctrl.rawMetadata.imageType)" class="image-info__image-type" ng-class="{'editable-empty': !ctrl.metadata.imageType}" > {{ctrl.metadata.imageType || "Unknown (click ✎ to add)"}} </dd> </span> <span ng-if="!ctrl.userCanEdit"> <dd ng-if="ctrl.hasMultipleValues(ctrl.rawMetadata.imageType)" class="image-info__image-type image-info--multiple" > Multiple image types </dd> <dd ng-if="!ctrl.hasMultipleValues(ctrl.rawMetadata.imageType)" class="image-info__image-type" ng-class="{'editable-empty': !ctrl.metadata.imageType}" > {{ctrl.metadata.imageType || "Unknown"}} </dd> </span> </span> </span> </dl> </div> <div class="image-info__group" ng-if="ctrl.displayLeases()" role="region" aria-label="Leases"> <dl class="image-info__wrap image-info__leases"> <div class="image-info__heading image-info__heading--lease" ng-class="{'image-info__heading--lease-preview': ctrl.leasesUpdatedByTemplate}"> <span>Leases</span> </div> <gr-leases gr-images="ctrl.selectedImages" gr-leases-updated-by-template="ctrl.leasesUpdatedByTemplate" gr-leases-updating-by-template="ctrl.leasesUpdatingByTemplate" gr-updated-leases="ctrl.updatedLeases" gr-on-save="ctrl.showLeases = false" gr-user-can-edit="ctrl.userCanEdit" gr-on-cancel="ctrl.showLeases = false"> </gr-leases> </dl> </div> <div class="image-info__group" role="region" aria-label="Title"> <dl> <div class="image-info__wrap"> <dt class="metadata-line metadata-line__key">Title</dt> <span ng-if="ctrl.metadataUpdatedByTemplate.includes('title')"> <div class="metadata-line__info"> <dd class="image-info__title-preview">{{ctrl.metadata.title}}</dd> </div> </span> <span ng-if="!ctrl.metadataUpdatedByTemplate.includes('title')"> <button class="image-info__edit" ng-if="ctrl.userCanEdit && ctrl.metadataUpdatedByTemplate.length == 0" ng-click="titleEditForm.$show()" ng-hide="titleEditForm.$visible">✎</button> <div class="metadata-line__info" ng-class="{'image-info--multiple': ctrl.hasMultipleValues(ctrl.rawMetadata.title)}" editable-text="ctrl.metadata.title" ng-hide="titleEditForm.$visible" onbeforesave="ctrl.updateMetadataField('title', $data)" e:form="titleEditForm" e:ng-class="{'image-info__editor--error': $error, 'image-info__editor--saving': titleEditForm.$waiting, 'text-input': true}"> <div ng-if="ctrl.hasMultipleValues(ctrl.rawMetadata.title) && ctrl.userCanEdit"> <dd class="image-info__title"> Multiple titles (click ✎ to edit <strong>all</strong>) </dd> </div> <div ng-if="ctrl.hasMultipleValues(ctrl.rawMetadata.title) && !ctrl.userCanEdit"> <dd class="image-info__title"> Multiple titles </dd> </div> <div ng-if="!ctrl.hasMultipleValues(ctrl.rawMetadata.title) && !ctrl.metadata.title" class="editable-empty"> <dd ng-if="ctrl.userCanEdit"> Unknown (click ✎ to add) </dd> <dd ng-if="!ctrl.userCanEdit"> Unknown </dd> </div> <div ng-if="ctrl.userCanEdit"> <dd class="image-info__title" ng-if="!ctrl.hasMultipleValues(ctrl.rawMetadata.title)"> <a ui-sref="search.results({query: (ctrl.metadata.title | queryFilter:'title'), nonFree: ctrl.srefNonfree()})" ng-click="ctrl.searchWithModifiers($event, 'title', ctrl.metadata.title)" aria-label="Search images by {{ctrl.metadata.title}} title">{{ctrl.metadata.title}}</a> </dd> </div> <div ng-if="!ctrl.userCanEdit"> <dd class="image-info__title" ng-if="!ctrl.hasMultipleValues(ctrl.rawMetadata.title)"> <a ui-sref="search.results({query: (ctrl.metadata.title | queryFilter:'title'), nonFree: ctrl.srefNonfree()})" ng-click="ctrl.searchWithModifiers($event, 'title', ctrl.metadata.title)" aria-label="Search images by {{ctrl.metadata.title}} title">{{ctrl.metadata.title}}</a> </dd> </div> </div> </span> </div> <div data-cy="metadata-description" class="image-info__wrap"> <dt class="metadata-line metadata-line__key">Description</dt> <span ng-if="ctrl.metadataUpdatedByTemplate.includes('description')"> <div class="metadata-line__info"> <dd class="image-info__description-preview">{{ctrl.metadata.description}}</dd> </div> </span> <span ng-if="!ctrl.metadataUpdatedByTemplate.includes('description')"> <button data-cy="it-edit-description-button" class="image-info__edit" ng-if="ctrl.userCanEdit && ctrl.metadataUpdatedByTemplate.length == 0" ng-click="descriptionEditForm.$show(); ctrl.checkDescriptionLength();" ng-hide="descriptionEditForm.$visible">✎</button> <form editable-form name="descriptionEditForm" onaftersave="ctrl.updateDescriptionField('description', $data)"> <div ng-hide="descriptionEditForm.$visible" ng-class="{'image-info--multiple': ctrl.hasMultipleValues(ctrl.rawMetadata.description)}"> <div ng-if="ctrl.userCanEdit"> <dd class="image-info__description" ng-if="ctrl.hasMultipleValues(ctrl.rawMetadata.description)" >Multiple descriptions (click ✎ to edit <strong>all</strong>) </dd> <dd class="image-info__description" ng-class="{'editable-empty': !ctrl.metadata.description}" ng-if="!ctrl.hasMultipleValues(ctrl.rawMetadata.description)" >{{ctrl.metadata.description || "Unknown (click ✎ to add)"}} </dd> </div> <div ng-if="!ctrl.userCanEdit"> <dd class="image-info__description" ng-if="ctrl.hasMultipleValues(ctrl.rawMetadata.description)" >Multiple descriptions </dd> <dd class="image-info__description" ng-class="{'editable-empty': !ctrl.metadata.description}" ng-if="!ctrl.hasMultipleValues(ctrl.rawMetadata.description)" >{{ctrl.metadata.description || "Unknown"}} </dd> </div> </div> <div class="metadata-line__info" editable-textarea="ctrl.metadata.description" ng-hide="descriptionEditForm.$visible" e:msd-elastic e:ng-class="{'image-info__editor--error': $error, 'image-info__editor--saving': descriptionEditForm.$waiting, 'text-input': true}" > </div> <div ng-if="ctrl.hasMultipleValues(ctrl.rawMetadata.description) && ctrl.userCanEdit && descriptionEditForm.$visible" class="image-info__description--options" > <gr-radio-list gr-for="description" gr-options="ctrl.descriptionOptions" gr-selected-option="ctrl.descriptionOption"></gr-radio-list> </div> <!-- These buttons are a copy of the buttons we use in the inline input elements but with a different form name which is why they are duplicated here --> <div ng-if="ctrl.userCanEdit && descriptionEditForm.$visible" class="editable-buttons"> <button class="button-cancel" type="button" ng-click="descriptionEditForm.$cancel()"> <gr-icon-label gr-icon="close">Cancel</gr-icon-label> </button> <button class="button-save" type="submit"> <gr-icon-label gr-icon="check">Save</gr-icon-label> </button> </div> </form> </span> </div> </dl> </div> <div data-cy="metadata-specialInstructions" role="region" class="image-info__group" aria-label="Special instructions"> <dl class="image-info__wrap"> <dt class="metadata-line metadata-line__key">Special instructions</dt> <span ng-if="ctrl.metadata.usageInstructions"> <span class="metadata-line__info">{{ctrl.metadata.usageInstructions}}</span> </span> <span ng-if="ctrl.metadataUpdatedByTemplate.includes('specialInstructions')"> <div class="metadata-line__info"> <dd class="image-info__description-preview">{{ctrl.metadata.specialInstructions}}</dd> </div> </span> <span ng-if="!ctrl.metadataUpdatedByTemplate.includes('specialInstructions')"> <button class="image-info__edit" ng-if="ctrl.userCanEdit && ctrl.metadataUpdatedByTemplate.length == 0" ng-click="specialInstructionsEditForm.$show(); ctrl.checkSpecialInstructionsLength();" ng-hide="specialInstructionsEditForm.$visible">✎</button> <form editable-form name="specialInstructionsEditForm" onaftersave="ctrl.updateSpecialInstructionsField()"> <div ng-hide="specialInstructionsEditForm.$visible" ng-class="{'image-info--multiple': ctrl.hasMultipleSpecialInstructions()}"> <div ng-if="ctrl.userCanEdit"> <dd class="image-info__special-instructions" ng-if="ctrl.hasMultipleSpecialInstructions()" >Multiple special instructions (click ✎ to edit <strong>all</strong>) </dd> <dd class="image-info__special-instructions" ng-class="{'editable-empty': !ctrl.metadata.specialInstructions}" ng-if="!ctrl.hasMultipleSpecialInstructions() && !ctrl.metadata.usageInstructions" >{{ctrl.metadata.specialInstructions || "Unknown (click ✎ to add)"}} </dd> <dd class="image-info__special-instructions" ng-class="{'editable-empty': !ctrl.metadata.specialInstructions}" ng-if="!ctrl.hasMultipleSpecialInstructions() && ctrl.metadata.usageInstructions" >{{ctrl.metadata.specialInstructions || "Click ✎ to add further instructions"}} </dd> </div> <div ng-if="!ctrl.userCanEdit"> <dd class="image-info__special-instructions" ng-if="ctrl.hasMultipleSpecialInstructions()" >Multiple special instructions </dd> <dd class="image-info__special-instructions" ng-class="{'editable-empty': !ctrl.metadata.specialInstructions}" ng-if="!ctrl.hasMultipleSpecialInstructions() && ctrl.metadata.usageInstructions" >{{ctrl.metadata.specialInstructions || ""}} </dd> <dd class="image-info__special-instructions" ng-class="{'editable-empty': !ctrl.metadata.specialInstructions}" ng-if="!ctrl.hasMultipleSpecialInstructions() && !ctrl.metadata.usageInstructions" >{{ctrl.metadata.specialInstructions || "Unknown"}} </dd> </div> </div> <div class="metadata-line__info" editable-textarea="ctrl.metadata.specialInstructions" ng-hide="specialInstructionsEditForm.$visible" e:msd-elastic e:ng-class="{'image-info__editor--error': $error, 'image-info__editor--saving': specialInstructionsEditForm.$waiting, 'text-input': true}" > </div> <div ng-if="ctrl.userCanEdit && specialInstructionsEditForm.$visible" class="editable-buttons"> <button class="button-cancel" type="button" ng-click="specialInstructionsEditForm.$cancel()"> <gr-icon-label gr-icon="close">Cancel</gr-icon-label> </button> <button class="button-save" type="submit"> <gr-icon-label gr-icon="check">Save</gr-icon-label> </button> </div> </form> </span> </dl> </div> <div class="image-info__group" role="region" aria-label="Image metadata"> <dl class="image-info__group--dl metadata-line"> <dt class="metadata-line image-info__wrap metadata-line__key image-info__group--dl__key--panel">Taken on</dt> <dd class="image-info__wrap metadata-line image-info__dateTaken metadata-line__info image-info__group--dl__value--panel"> <button data-cy="it-edit-dateTaken-button" class="image-info__edit" ng-if="ctrl.userCanEdit && ctrl.metadataUpdatedByTemplate.length == 0" ng-click="takenEditForm.$show()" ng-hide="takenEditForm.$visible" >✎</button> <span editable-datetime-local="ctrl.metadata.dateTaken" ng-class="{'image-info--multiple': ctrl.hasMultipleValues(ctrl.rawMetadata.dateTaken)}" ng-hide="takenEditForm.$visible" onbeforesave="ctrl.updateMetadataField('dateTaken', $data)" e:form="takenEditForm" e:ng-class="{'image-info__editor--error': $error, 'image-info__editor--saving': takenEditForm.$waiting, 'text-input': true}"> <span class="metadata-line__info" ng-if="ctrl.hasMultipleValues(ctrl.rawMetadata.dateTaken) && ctrl.userCanEdit"> Multiple dates (click ✎ to edit <strong>all</strong>) </span> <span class="metadata-line__info" ng-if="ctrl.hasMultipleValues(ctrl.rawMetadata.dateTaken) && !ctrl.userCanEdit"> Multiple dates </span> <span class="metadata-line__info" ng-if="!ctrl.hasMultipleValues(ctrl.rawMetadata.dateTaken)"> <span ng-if="ctrl.metadata.dateTaken"> {{ctrl.metadata.dateTaken | date:'d MMM yyyy, HH:mm'}} </span> <span class="editable-empty" ng-if="!ctrl.metadata.dateTaken && ctrl.userCanEdit">Unknown (click ✎ to add)</span> <span class="editable-empty" ng-if="!ctrl.metadata.dateTaken && !ctrl.userCanEdit">Unknown</span> </span> </span> </dd> <dt ng-if="ctrl.rawMetadata.byline || ctrl.userCanEdit" class="image-info__wrap metadata-line image-info__byline metadata-line__key image-info__group--dl__key--panel">By</dt> <dd data-cy="metadata-byline" ng-if="ctrl.rawMetadata.byline || ctrl.userCanEdit" class="image-info__wrap metadata-line image-info__byline metadata-line__info image-info__group--dl__value--panel"> <span ng-if="ctrl.metadataUpdatedByTemplate.includes('byline')"> <input type="text" class="text-input job-info--editor__input job-info--editor__input--byline image-info--editor__input-preview" ng-model="ctrl.metadata.byline" /> </span> <span ng-if="!ctrl.metadataUpdatedByTemplate.includes('byline')"> <button data-cy="it-edit-byline-button" class="image-info__edit" ng-if="ctrl.userCanEdit && ctrl.metadataUpdatedByTemplate.length == 0" ng-click="bylineEditForm.$show()" ng-hide="bylineEditForm.$visible" >✎</button> <span ng-class="{'image-info--multiple': ctrl.hasMultipleValues(ctrl.rawMetadata.byline)}" editable-text="ctrl.metadata.byline" ng-hide="bylineEditForm.$visible" onbeforesave="ctrl.updateMetadataField('byline', $data)" e:form="bylineEditForm" e:ng-class="{'image-info__editor--error': $error, 'image-info__editor--saving': bylineEditForm.$waiting, 'text-input': true}"> <span class="metadata-line__info" ng-if="ctrl.hasMultipleValues(ctrl.rawMetadata.byline) && ctrl.userCanEdit"> Multiple bylines (click ✎ to edit <strong>all</strong>) </span> <span class="metadata-line__info" ng-if="ctrl.hasMultipleValues(ctrl.rawMetadata.byline) && !ctrl.userCanEdit"> Multiple bylines </span> <span class="metadata-line__info" ng-if="!ctrl.hasMultipleValues(ctrl.rawMetadata.byline)"> <span ng-if="ctrl.metadata.byline"> <a ui-sref="search.results({query: (ctrl.metadata.byline | queryFilter:'by'), nonFree: ctrl.srefNonfree()})" ng-click="ctrl.searchWithModifiers($event, 'by', ctrl.metadata.byline)" aria-label="Search images by {{ctrl.metadata.byline}} byline">{{ctrl.metadata.byline}}</a> </span> <span class="editable-empty" ng-if="!ctrl.metadata.byline && ctrl.userCanEdit">Unknown (click ✎ to add)</span> </span> </span> </span> </dd> <dt class="metadata-line image-info__wrap image-info__credit metadata-line__key image-info__group--dl__key--panel">Credit</dt> <dd data-cy="metadata-credit" class="image-info__wrap metadata-line image-info__credit metadata-line__info image-info__group--dl__value--panel"> <span ng-if="ctrl.metadataUpdatedByTemplate.includes('credit')"> <input type="text" class="text-input job-info--editor__input job-info--editor__input--byline image-info--editor__input-preview" ng-model="ctrl.metadata.credit" /> </span> <span ng-if="!ctrl.metadataUpdatedByTemplate.includes('credit')"> <button data-cy="it-edit-credit-button" class="image-info__edit" ng-if="ctrl.userCanEdit && ctrl.metadataUpdatedByTemplate.length == 0" ng-click="creditEditForm.$show()" ng-hide="creditEditForm.$visible" >✎</button> <span ng-class="{'image-info--multiple': ctrl.hasMultipleValues(ctrl.rawMetadata.credit)}" editable-text="ctrl.metadata.credit" ng-hide="creditEditForm.$visible" e:typeahead="credit for credit in ctrl.credits($viewValue) | limitTo:8" onbeforesave="ctrl.updateMetadataField('credit', $data)" e:form="creditEditForm" e:ng-class="{'image-info__editor--error': $error, 'image-info__editor--saving': creditEditForm.$waiting, 'text-input': true}"> <span class="metadata-line__info" ng-if="ctrl.hasMultipleValues(ctrl.rawMetadata.credit) && ctrl.userCanEdit"> Multiple credits (click ✎ to edit <strong>all</strong>) </span> <span class="metadata-line__info" ng-if="ctrl.hasMultipleValues(ctrl.rawMetadata.credit) && !ctrl.userCanEdit"> Multiple credits </span> <span class="metadata-line__info" ng-if="!ctrl.hasMultipleValues(ctrl.rawMetadata.credit)"> <span ng-if="ctrl.metadata.credit"> <a ui-sref="search.results({query: (ctrl.metadata.credit | queryFilter:'credit'), nonFree: ctrl.srefNonfree()})" ng-click="ctrl.searchWithModifiers($event, 'credit', ctrl.metadata.credit)" aria-label="Search images by {{ctrl.metadata.credit}} credit">{{ctrl.metadata.credit}}</a> </span> <span class="editable-empty" ng-if="!ctrl.metadata.credit && ctrl.userCanEdit">Unknown (click ✎ to add)</span> <span class="editable-empty" ng-if="!ctrl.metadata.credit && !ctrl.userCanEdit">Unknown</span> </span> </span> </span> </dd> <dt ng-if="(ctrl.hasLocationInformation() || ctrl.hasMultipleValues(ctrl.rawMetadata.subLocation) || ctrl.hasMultipleValues(ctrl.rawMetadata.city) || ctrl.hasMultipleValues(ctrl.rawMetadata.state) || ctrl.hasMultipleValues(ctrl.rawMetadata.country)) || ctrl.userCanEdit" ng-hide="locationEditForm.$visible" class="image-info__wrap metadata-line metadata-line__key image-info__group--dl__key--panel">Location</dt> <dd ng-if="(ctrl.hasLocationInformation() || ctrl.hasMultipleValues(ctrl.rawMetadata.subLocation) || ctrl.hasMultipleValues(ctrl.rawMetadata.city) || ctrl.hasMultipleValues(ctrl.rawMetadata.state) || ctrl.hasMultipleValues(ctrl.rawMetadata.country)) || ctrl.userCanEdit" class="image-info__wrap metadata-line metadata-line__info image-info__group--dl__value--panel"> <button data-cy="it-edit-loc-button" class="image-info__edit" ng-if="ctrl.userCanEdit && ctrl.metadataUpdatedByTemplate.length == 0" ng-click="locationEditForm.$show()" ng-hide="locationEditForm.$visible">✎</button> <span ng-hide="locationEditForm.$visible" ng-repeat="prop in ['subLocation', 'city', 'state', 'country']"> <span ng-if="ctrl.metadata[prop] || ctrl.hasMultipleValues(ctrl.rawMetadata[prop])"> <a ng-if="!ctrl.hasMultipleValues(ctrl.rawMetadata[prop])" ui-sref="search.results({query: (ctrl.metadata[prop] | queryFilter:ctrl.locationFieldMap[prop]), nonFree: ctrl.srefNonfree()})" ng-click="ctrl.searchWithModifiers($event, ctrl.locationFieldMap[prop], ctrl.metadata[prop])" aria-label="Search images by {{ctrl.metadata[prop]}} {{prop}}" >{{ctrl.metadata[prop]}}</a><span ng-if="ctrl.hasMultipleValues(ctrl.rawMetadata[prop])" ng-class="{'image-info--multiple': ctrl.hasMultipleValues(ctrl.rawMetadata[prop])}" >{{'(Multiple ' + ctrl.locationFieldPluralMap[prop] + ')'}}</span>{{$last ? '' : ', '}} </span> </span> <span ng-hide="locationEditForm.$visible" class="editable-empty" ng-if="!ctrl.hasLocationInformation() && ctrl.userCanEdit && (!ctrl.hasMultipleValues(ctrl.rawMetadata.subLocation) && !ctrl.hasMultipleValues(ctrl.rawMetadata.city) && !ctrl.hasMultipleValues(ctrl.rawMetadata.state) && !ctrl.hasMultipleValues(ctrl.rawMetadata.country))">Unknown (click ✎ to add)</span> </dd> <div ng-hide="!locationEditForm.$visible" data-cy="metadata-location" class="image-info__wrap"> <form class="edit-Location-form" editable-form name="locationEditForm" onbeforesave="ctrl.updateLocationField('Location', $data)"> <div class="edit-Location-form-row"> <dt ng-hide="!locationEditForm.$visible" class="edit-Location-form-cell image-info__wrap metadata-line metadata-line__key image-info__group--dl__key--panel">Sublocation</dt> <dd class="edit-Location-form-cell image-info__wrap metadata-line metadata-line__info image-info__group--dl__value--panel"> <div class="metadata-line__info" editable-text="ctrl.metadata.subLocation" ng-hide="locationEditForm.$visible" e-name="subLocation" e-placeholder="{{ctrl.hasMultipleValues(ctrl.rawMetadata.subLocation) ? 'Multiple sublocations' : 'sublocation' }}" e:msd-elastic e:ng-class="{'image-info__editor--error': $error, 'image-info__editor--saving': locationEditForm.$waiting, 'text-input': true}"> </div> </dd> </div> <div class="edit-Location-form-row"> <dt ng-hide="!locationEditForm.$visible" class="edit-Location-form-cell image-info__wrap metadata-line metadata-line__key image-info__group--dl__key--panel">City</dt> <dd class="edit-Location-form-cell image-info__wrap metadata-line metadata-line__info image-info__group--dl__value--panel"> <div class="metadata-line__info" editable-text="ctrl.metadata.city" ng-hide="locationEditForm.$visible" e-name="city" e-placeholder="{{ctrl.hasMultipleValues(ctrl.rawMetadata.city) ? 'Multiple cities' : 'city' }}" e:msd-elastic e:ng-class="{'image-info__editor--error': $error, 'image-info__editor--saving': locationEditForm.$waiting, 'text-input': true}"> </div> </dd> </div> <div class="edit-Location-form-row"> <dt ng-hide="!locationEditForm.$visible" class="edit-Location-form-cell image-info__wrap metadata-line metadata-line__key image-info__group--dl__key--panel">State</dt> <dd class="edit-Location-form-cell image-info__wrap metadata-line metadata-line__info image-info__group--dl__value--panel"> <div class="metadata-line__info" editable-text="ctrl.metadata.state" ng-hide="locationEditForm.$visible" e-name="state" e-placeholder="{{ctrl.hasMultipleValues(ctrl.rawMetadata.state) ? 'Multiple states' : 'state' }}" e:msd-elastic e:ng-class="{'image-info__editor--error': $error, 'image-info__editor--saving': locationEditForm.$waiting, 'text-input': true}"> </div> </dd> </div> <div class="edit-Location-form-row"> <dt ng-hide="!locationEditForm.$visible" class="edit-Location-form-cell image-info__wrap metadata-line metadata-line__key image-info__group--dl__key--panel">Country</dt> <dd class="edit-Location-form-cell"> <div class="metadata-line__info" editable-text="ctrl.metadata.country" ng-hide="locationEditForm.$visible" e-name="country" e-placeholder="{{ctrl.hasMultipleValues(ctrl.rawMetadata.country) ? 'Multiple countries' : 'country' }}" e:msd-elastic e:ng-class="{'image-info__editor--error': $error, 'image-info__editor--saving': locationEditForm.$waiting, 'text-input': true}"> </div> <div ng-if="ctrl.userCanEdit && locationEditForm.$visible" class="editable-buttons"> <button class="button-cancel" type="button" ng-click="locationEditForm.$cancel()"> <gr-icon-label gr-icon="close">Cancel</gr-icon-label> </button> <button class="button-save" type="submit"> <gr-icon-label gr-icon="check">Save</gr-icon-label> </button> </div> <dd/> </div> </form> </div> <dt ng-if="ctrl.rawMetadata.copyright || ctrl.userCanEdit" class="image-info__wrap metadata-line metadata-line__key image-info__group--dl__key--panel">Copyright</dt> <dd data-cy="metadata-copyright" ng-if="ctrl.rawMetadata.copyright || ctrl.userCanEdit" class="image-info__wrap metadata-line metadata-line__info image-info__group--dl__value--panel"> <span ng-if="ctrl.metadataUpdatedByTemplate.includes('copyright')"> <input type="text" class="text-input job-info--editor__input job-info--editor__input--byline image-info--editor__input-preview" ng-model="ctrl.metadata.copyright" /> </span> <span ng-if="!ctrl.metadataUpdatedByTemplate.includes('copyright')"> <button data-cy="it-edit-copyright-button" class="image-info__edit" ng-if="ctrl.userCanEdit && ctrl.metadataUpdatedByTemplate.length == 0" ng-click="copyrightEditForm.$show()" ng-hide="copyrightEditForm.$visible" >✎</button> <span ng-class="{'image-info--multiple': ctrl.hasMultipleValues(ctrl.rawMetadata.copyright)}" editable-text="ctrl.metadata.copyright" ng-hide="copyrightEditForm.$visible" onbeforesave="ctrl.updateMetadataField('copyright', $data)" e:form="copyrightEditForm" e:ng-class="{'image-info__editor--error': $error, 'image-info__editor--saving': copyrightEditForm.$waiting, 'text-input': true}"> <span class="metadata-line__info" ng-if="ctrl.hasMultipleValues(ctrl.rawMetadata.copyright) && ctrl.userCanEdit"> Multiple copyrights (click ✎ to edit <strong>all</strong>) </span> <span class="metadata-line__info" ng-if="ctrl.hasMultipleValues(ctrl.rawMetadata.copyright) && !ctrl.userCanEdit"> Multiple copyrights </span> <span class="metadata-line__info" ng-if="!ctrl.hasMultipleValues(ctrl.rawMetadata.copyright)"> <span ng-if="ctrl.metadata.copyright"> <a ui-sref="search.results({query: (ctrl.metadata.copyright | queryFilter:'copyright'), nonFree: ctrl.srefNonfree()})" ng-click="ctrl.searchWithModifiers($event, 'copyright', ctrl.metadata.copyright)" aria-label="Search images by {{ctrl.metadata.copyright}} copyright">{{ctrl.metadata.copyright}}</a> </span> <span class="editable-empty" ng-if="!ctrl.metadata.copyright && ctrl.userCanEdit">Unknown (click ✎ to add)</span> </span> </span> </span> </dd> <dt ng-if="ctrl.singleImage" class="image-info__wrap metadata-line metadata-line__key image-info__group--dl__key--panel">Uploaded</dt> <dd ng-if="ctrl.singleImage" class="image-info__wrap metadata-line metadata-line__info image-info__group--dl__value--panel"> <span class="metadata-line__info"> {{ctrl.singleImage.data.uploadTime | date:'d MMM yyyy, HH:mm'}} </span> </dd> <dt ng-if="!ctrl.hasMultipleValues(ctrl.extraInfo.uploadedBy)" class="image-info__wrap metadata-line metadata-line__key image-info__group--dl__key--panel">Uploader</dt> <dd ng-if="!ctrl.hasMultipleValues(ctrl.extraInfo.uploadedBy)" class="image-info__wrap metadata-line metadata-line__info image-info__group--dl__value--panel"> <span class="metadata-line__info"> <a ui-sref="search.results({query: (ctrl.extraInfo.uploadedBy | queryFilter:'uploader'), nonFree: ctrl.srefNonfree()})" ng-click="ctrl.searchWithModifiers($event, 'uploader', ctrl.extraInfo.uploadedBy)" aria-label="Search images uploaded by {{ctrl.extraInfo.uploadedBy}}">{{ctrl.extraInfo.uploadedBy | stripEmailDomain}}</a> </span> </dd> <dt ng-if="!ctrl.hasMultipleValues(ctrl.extraInfo.filename) && ctrl.extraInfo.filename" class="image-info__wrap metadata-line metadata-line__key image-info__group--dl__key--panel">Filename</dt> <dd ng-if="!ctrl.hasMultipleValues(ctrl.extraInfo.filename) && ctrl.extraInfo.filename" class="metadata-line metadata-line__info image-info__group--dl__value image-info__group--dl__value--panel"> <span class="metadata-line__info select-all-wrap" title="{{ctrl.extraInfo.filename}}">{{ctrl.extraInfo.filename}}</span> </dd> <dt ng-if="ctrl.selectedImagesHasAny(ctrl.subjectsAccessor)" class="image-info__wrap metadata-line metadata-line__key image-info__group--dl__key--panel"> Subjects </dt> <dd ng-if="ctrl.selectedImagesHasAny(ctrl.subjectsAccessor)" class="image-info__pills image-info__wrap metadata-line metadata-line__info image-info__group--dl__value--panel"> <ui-list-editor-info-panel is-editable="false" images="ctrl.selectedImages" accessor="ctrl.subjectsAccessor" query-filter="queryFilter:'subject'" element-name="subject"> </ui-list-editor-info-panel> </dd> <dt ng-if="ctrl.userCanEdit || ctrl.selectedImagesHasAny(ctrl.peopleAccessor)" class="image-info__wrap metadata-line metadata-line__key image-info__group--dl__key--panel">People</dt> <dd ng-if="ctrl.userCanEdit || ctrl.selectedImagesHasAny(ctrl.peopleAccessor)" class="image-info__pills image-info__wrap metadata-line metadata-line__info image-info__group--dl__value--panel"> <button data-cy="it-edit-people-button" class="metadata-plus__button" ng-class="{'small': ctrl.grSmall}" ng-click="peopleInImageEditForm.$show()" ng-hide="peopleInImageEditForm.$visible" ng-if="ctrl.userCanEdit && ctrl.metadataUpdatedByTemplate.length == 0" gr-tooltip="Add People" gr-tooltip-position="left" aria-label="Add people to image"> <gr-icon ng-class="{'spin': ctrl.adding}">add_box</gr-icon> <span> <span ng-show="ctrl.adding">Adding...</span> </span> </button> <span ng-class="{'image-info--multiple': ctrl.selectedImages.size > 0}" editable-text="ctrl.newPeopleInImage" ng-hide="peopleInImageEditForm.$visible" onbeforesave="ctrl.updateMetadataField('peopleInImage', $data)" e:form="peopleInImageEditForm" e:ng-class="{'image-info__editor--error': $error, 'image-info__editor--saving': peopleInImageEditForm.$waiting, 'text-input': true}"></span> <ui-list-editor-info-panel is-editable="ctrl.userCanEdit" images="ctrl.selectedImages" add-to-images="ctrl.addPersonToImages" remove-from-images="ctrl.removePersonFromImages" accessor="ctrl.peopleAccessor" query-filter="queryFilter:'person'" element-name="person"> </ui-list-editor-info-panel> </dd> </dl> </div> <div ng-if="ctrl.singleImage && !ctrl.isAdditionalMetadataEmpty()" class="image-info__group image-info__group--full-metadata" role="region" aria-label="Additional metadata"> <button class="metadata-reveal" ng-click="ctrl.showMetadataSection('additionalMetadata')" aria-label="{{ctrl.isMetadataSectionHidden('additionalMetadata') ? 'Show' : 'Hide'}} additional metadata section"> <span ng-show="ctrl.isMetadataSectionHidden('additionalMetadata')">▸ Show</span> <span ng-hide="ctrl.isMetadataSectionHidden('additionalMetadata')">▾ Hide</span> additional metadata </button> <div ng-if="!ctrl.isMetadataSectionHidden('additionalMetadata')" class="metadata metadata-line image-info__group--dl"> <dl ng-repeat="(key, value) in ctrl.metadata" ng-if="ctrl.isUsefulMetadata(key)" class="metadata__body image-info__group--dl"> <dt class="metadata-line__key image-info__group--dl__key--full-metadata">{{key | spaceWords}}</dt> <dd class="metadata-line__info image-info__group--dl__value--full-metadata"> <a ui-sref="search.results({query: (value | queryFilter:'{{key}}'), nonFree: ctrl.srefNonfree()})" ng-click="ctrl.searchWithModifiers($event, key, value)" aria-label="Search images with {{key}} '{{value}}'">{{value}}</a> </dd> </dl> <dl ng-repeat="(key, metadata) in ctrl.additionalMetadata" class="metadata__body image-info__group--dl"> <dt class="metadata-line__key image-info__group--dl__key--full-metadata">{{key}}</dt> <dd class="metadata-line__info image-info__group--dl__value--full-metadata"> <a ui-sref="search.results({query: (metadata.value | queryFilter:'{{metadata.alias}}'), nonFree: ctrl.srefNonfree()})" ng-click="ctrl.searchWithModifiers($event, metadata.alias, metadata.value)" aria-label="Search images with {{key}} '{{metadata.value}}'">{{metadata.value}}</a> </dd> </dl> <dl ng-repeat="(key, value) in ctrl.identifiers" class="metadata__body image-info__group--dl"> <dt class="metadata-line__key image-info__group--dl__key--full-metadata">{{key | spaceWords}}</dt> <dd class="metadata-line__info image-info__group--dl__value--full-metadata">{{value}}</dd> </dl> </div> </div> <div ng-if="(ctrl.singleImage && ctrl.userCanEdit) || (ctrl.singleImage && !ctrl.userCanEdit && !ctrl.isDomainMetadataEmpty(spec.name))" ng-repeat="spec in ctrl.domainMetadata" class="image-info__group image-info__group--full-domain-metadata" role="region" aria-label="Domain metadata"> <button class="metadata-reveal" ng-click="ctrl.showMetadataSection(spec.name)" aria-label="{{ctrl.isMetadataSectionHidden(spec.name) ? 'Show' : 'Hide'}} {{spec.label}} domain metadata section"> <span ng-show="ctrl.isMetadataSectionHidden(spec.name)">▸ Show</span> <span ng-hide="ctrl.isMetadataSectionHidden(spec.name)">▾ Hide</span> {{spec.label}} metadata </button> <div ng-if="!ctrl.isMetadataSectionHidden(spec.name)" class="metadata metadata-line image-info__group--dl"> <span class="metadata__description" ng-if="spec.description">{{spec.description}}</span> <dl ng-repeat="specField in spec.fields" class="metadata__body image-info__group--dl"> <dt class="image-info__{{specField.name}} image-info__wrap metadata-line image-info__group--dl__key metadata-line__key" ng-if="specField.value || ctrl.userCanEdit">{{specField.label}}</dt> <dd data-cy="metadata-{{specField.name}}" class="image-info__wrap image-info__group--dl__value metadata-line__info" ng-if="specField.value || ctrl.userCanEdit"> <div ng-switch="specField.fieldType"> <span ng-switch-when="string"> <button data-cy="it-edit-{{specField.name}}-button" class="image-info__edit" ng-if="ctrl.userCanEdit && ctrl.metadataUpdatedByTemplate.length == 0" ng-click="domainMetadataEditForm.$show()" ng-hide="domainMetadataEditForm.$visible" >✎</button> <span class="image-info__{{specField.name}}" editable-text="specField.value" ng-hide="domainMetadataEditForm.$visible" onbeforesave="ctrl.updateDomainMetadataField(spec.name, specField.name, $data)" e:ng-class="{'image-info__editor--error': $error, 'image-info__editor--saving': domainMetadataEditForm.$waiting, 'text-input': true}" e:form="domainMetadataEditForm"> <span ng-if="specField.value"> {{specField.value}} </span> <span class="editable-empty" ng-if="! specField.value && ctrl.userCanEdit"> Unknown (click ✎ to add) </span> </span> </span> <span ng-switch-when="datetime"> <button data-cy="it-edit-{{specField.name}}-button" class="image-info__edit" ng-if="ctrl.userCanEdit && ctrl.metadataUpdatedByTemplate.length == 0" ng-click="domainMetadataEditForm.$show()" ng-hide="domainMetadataEditForm.$visible" >✎</button> <span class="image-info__{{specField.name}}" editable-datetime-local="specField.value" ng-hide="domainMetadataEditForm.$visible" onbeforesave="ctrl.updateDomainMetadataField(spec.name, specField.name, $data)" e:ng-class="{'image-info__editor--error': $error, 'image-info__editor--saving': domainMetadataEditForm.$waiting, 'text-input': true}" e:form="domainMetadataEditForm"> <span ng-if="specField.value"> {{specField.value | date:'d MMM yyyy, HH:mm'}} </span> <span class="editable-empty" ng-if="! specField.value && ctrl.userCanEdit"> Unknown (click ✎ to add) </span> </span> </span> <span ng-switch-when="integer"> <button data-cy="it-edit-{{specField.name}}-button" class="image-info__edit" ng-if="ctrl.userCanEdit && ctrl.metadataUpdatedByTemplate.length == 0" ng-click="domainMetadataEditForm.$show()" ng-hide="domainMetadataEditForm.$visible" >✎</button> <span class="image-info__{{specField.name}}" editable-number="specField.value" e-min="0" ng-hide="domainMetadataEditForm.$visible" onbeforesave="ctrl.updateDomainMetadataField(spec.name, specField.name, $data)" e:ng-class="{'image-info__editor--error': $error, 'image-info__editor--saving': domainMetadataEditForm.$waiting, 'text-input': true}" e:form="domainMetadataEditForm"> <span ng-if="specField.value"> {{specField.value}} </span> <span class="editable-empty" ng-if="! specField.value && ctrl.userCanEdit"> Unknown (click ✎ to add) </span> </span> </span> <span ng-switch-when="select"> <button data-cy="it-edit-{{specField.name}}-button" class="image-info__edit" ng-if="ctrl.userCanEdit && ctrl.metadataUpdatedByTemplate.length == 0" ng-click="domainMetadataEditForm.$show()" ng-hide="domainMetadataEditForm.$visible" >✎</button> <span class="image-info__{{specField.name}}" editable-select="specField.value" e-ng-options="option.value as option.text for option in specField.selectOptions" ng-hide="domainMetadataEditForm.$visible" onbeforesave="ctrl.updateDomainMetadataField(spec.name, specField.name, $data)" e:ng-class="{'image-info__editor--error': $error, 'image-info__editor--saving': domainMetadataEditForm.$waiting, 'text-input': true}" e:form="domainMetadataEditForm"> <span ng-if="specField.value"> {{specField.value}} </span> <span class="editable-empty" ng-if="! specField.value && ctrl.userCanEdit"> Unknown (click ✎ to add) </span> </span> </span> <span ng-switch-default> <button data-cy="it-edit-{{specField.name}}-button" class="image-info__edit" ng-if="ctrl.userCanEdit && ctrl.metadataUpdatedByTemplate.length == 0" ng-click="domainMetadataEditForm.$show()" ng-hide="domainMetadataEditForm.$visible" >✎</button> <span class="image-info__{{specField.name}}" editable-text="specField.value" ng-hide="domainMetadataEditForm.$visible" onbeforesave="ctrl.updateDomainMetadataField(spec.name, specField.name, $data)" e:ng-class="{'image-info__editor--error': $error, 'image-info__editor--saving': domainMetadataEditForm.$waiting, 'text-input': true}" e:form="domainMetadataEditForm"> <span ng-if="specField.value"> {{specField.value}} </span> <span class="editable-empty" ng-if="! specField.value && ctrl.userCanEdit"> Unknown (click ✎ to add) </span> </span> </span> </div> </dd> </dl> </div> </div> </div> <div ng-if="ctrl.singleImage" class="image-info" role="region" aria-label="Collections"> <dl class="image-info__group"> <dt class="flex-container"> <span class="metadata-line__key flex-spacer">Collections</span> <gr-collection-overlay image="ctrl.singleImage" gr-collection-updated-by-template="ctrl.collectionUpdatedByTemplate"> </gr-collection-overlay> </dt> <dd ng-switch="ctrl.collectionUpdatedByTemplate"> <span class="metadata-line__info flex-container" ng-repeat="collection in ctrl.updatedCollections" ng-switch-when="true"> <a class="preview__collections__collection__value" ng-class="{'result-editor__field-container__collections-preview' : collection.fromTemplate}"> {{collection.description}} </a> </span> <span class="metadata-line__info flex-container" ng-repeat="collection in ctrl.singleImage.data.collections" ng-switch-default> <a ui-sref="search.results({query: (collection.data.pathId | queryCollectionFilter), nonFree: ctrl.srefNonfree()})" ng-click="ctrl.searchWithModifiers($event, 'collection', collection.data.pathId)" aria-label="Search images by {{collection.data.description}} collection"> {{collection.data.path.join(' ▸ ')}} </a> <span class="flex-spacer"></span> <span ng-if="ctrl.removingCollection === collection">Removing…</span> <button class="clickable" type="button" ng-click="ctrl.removeImageFromCollection(collection)" ng-hide="ctrl.removingCollection === collection" gr-tooltip="Remove image from this collection" gr-tooltip-position="top-left" aria-label="Remove image from this collection"> <gr-icon-label gr-icon="clear"></gr-icon-label> </button> </span> </dd> </dl> </div> <div class="image-info" role="region" aria-label="Labels"> <dl class="image-info__group"> <dt class="flex-container"> <span class="metadata-line__key flex-spacer">Labels</span> <gr-add-label ng-blur="ctrl.cancel" gr-small="true" images="ctrl.selectedImages"> </gr-add-label> </dt> <dd class="labels"> <ui-list-editor-info-panel is-editable="true" images="ctrl.selectedImages" add-to-images="ctrl.addLabelToImages" remove-from-images="ctrl.removeLabelFromImages" accessor="ctrl.labelAccessor" query-filter="queryLabelFilter" element-name="label"> </ui-list-editor-info-panel> </dd> </dl> </div> <div class="image-info__group" role="region" aria-label="Photoshoot"> <dl class="image-info__wrap"> <dt class="metadata-line metadata-line__key">Photoshoot</dt> <dd> <gr-photoshoot images="ctrl.selectedImages"/> </dd> </dl> </div> <div ng-if="ctrl.singleImage" class="image-info" role="region" aria-label="Syndication rights"> <div class="image-info__group"> <dl class="image-info__wrap"> <dt class="metadata-line metadata-line__key">Syndication Rights (from RCS)</dt> <dd class="metadata-line__info"> <gr-syndication-rights image="ctrl.singleImage"></gr-syndication-rights> </dd> </dl> </div> </div> <div ng-if="ctrl.userCanEdit || ctrl.selectedImagesHasAny(ctrl.keywordAccessor)" class="image-info" role="region" aria-label="Keywords" > <dl class="image-info__group image-info__wrap"> <dt class="image-info__heading image-info__wrap"> Keywords <button data-cy="it-edit-keywords-button" class="metadata-plus__button" ng-class="{'small': ctrl.grSmall}" ng-click="keywordsEditForm.$show()" ng-hide="keywordsEditForm.$visible" ng-if="ctrl.userCanEdit && ctrl.metadataUpdatedByTemplate.length == 0" gr-tooltip="Add Keyword" gr-tooltip-position="left" aria-label="Add keyword to image"> <gr-icon ng-class="{'spin': ctrl.adding}">add_box</gr-icon> <span> <span ng-show="ctrl.adding">Adding...</span> </span> </button> </dt> <dd class="image-info__pills"> <span ng-class="{'image-info--multiple': ctrl.selectedImages.size > 0}" editable-text="ctrl.newKeywords" ng-hide="keywordsEditForm.$visible" onbeforesave="ctrl.updateMetadataField('keywords', $data)" e:form="keywordsEditForm" e:ng-class="{'image-info__editor--error': $error, 'image-info__editor--saving': keywordsEditForm.$waiting, 'text-input': true}"> <ui-list-editor-info-panel is-editable="ctrl.userCanEdit" images="ctrl.selectedImages" add-to-images="ctrl.addKeywordToImages" remove-from-images="ctrl.removeKeywordFromImages" accessor="ctrl.keywordAccessor" query-filter="queryFilter:'keyword'" element-name="keyword"> </ui-list-editor-info-panel> </span> </dd> </dl> </div> <gr-display-crops ng-if="ctrl.singleImage" gr-small="true" crops="ctrl.singleImage.allCrops"></gr-display-crops>