kahuna/public/js/image/view.html (184 lines of code) (raw):
<gr-top-bar role="banner" aria-label="Top bar">
<gr-top-bar-nav role="navigation" aria-label="Primary">
<a class="top-bar-item side-padded clickable" ui-sref="search" title="Back to search"
aria-label="Go to image search">
<gr-icon-label gr-icon="youtube_searched_for">Back to search</gr-icon-label>
</a>
</gr-top-bar-nav>
<gr-top-bar-actions role="region" aria-label="User actions and secondary navigation">
<a class="results-toolbar-item top-bar-item results-toolbar-item--right"
ng-click="ctrl.shareImage()">
<gr-icon-label gr-icon="share">Share with URL</gr-icon-label>
</a>
<gr-delete-image class="top-bar-item clickable"
ng-if="ctrl.canBeDeleted && !ctrl.isDeleted"
images="[ctrl.image]">
</gr-delete-image>
<gr-downloader class="top-bar-item"
images="[ctrl.image]"
crop="ctrl.crop">
</gr-downloader>
<gr-archiver class="top-bar-item"
gr-image="ctrl.image">
</gr-archiver>
<gr-crop-image class="top-bar-item" image="ctrl.image" has-full-crop="ctrl.hasFullCrop" tracking-location="Top bar">
</gr-crop-image>
</gr-top-bar-actions>
</gr-top-bar>
<div class="image-details image-details--crop" role="complementary" aria-label="Image original and crops select">
<div class="image-info image-details--scroll">
<div class="image-info__group" role="region" aria-label="Original image">
<dl>
<dt class="image-info__heading">Original <span class="image-info__file-size"> {{:: ctrl.image.data.source.size | asFileSize}}</span></dt>
<dd class="image-info__heading--crops">
<div class="image-crop"
ng-class="{'image-crop--selected': !ctrl.crop}">
<a draggable="true"
ui-sref="{ crop: null }"
ui-drag-data="ctrl.image | asImageDragData"
aria-label="View original image">
<img class="image-crop__image"
alt="original image thumbnail"
ng-src="{{:: ctrl.image.data.thumbnail | assetFile }}" />
<div class="image-crop__aspect-ratio"
ng-class="{'image-crop__aspect-ratio--selected': !ctrl.crop}">
{{::ctrl.image.data.source.dimensions.width}} × {{::ctrl.image.data.source.dimensions.height}}
</div>
<asset-handle
data-source="grid"
data-source-type="original"
data-thumbnail="{{:: ctrl.image.data.thumbnail | assetFile}}"
data-embeddable-url="{{:: ctrl.image.data.id | embeddableUrl}}"
></asset-handle>
</a>
</div>
</dd>
</dt>
</dl>
</div>
<div ng-if="ctrl.hasFullCrop" class="image-info__group" role="region" aria-label="Full frame">
<dt class="image-info__heading">Full frame</dt>
<dd>
<div class="image-crop"
ng-init="crop = ctrl.fullCrop"
ng-class="{'image-crop--selected': crop == ctrl.crop}"
ng-switch="ctrl.allowCropSelection(crop)">
<a ng-switch-when="true"
draggable="true"
ng-init="extremeAssets = (crop | getExtremeAssets)"
ng-click="ctrl.cropSelected(crop)"
ui-sref="{ crop: crop.id }"
ui-drag-data="ctrl.image | asImageAndCropDragData:crop"
ui-drag-image="extremeAssets.smallest | assetFile">
<img class="image-crop__image"
alt="full frame image thumbnail"
ng-src="{{:: extremeAssets.smallest | assetFile }}"
ng-class="{'image-crop__image--disabled': !ctrl.allowCropSelection(crop) }"/>
<div class="flex-container image-crop__info image-crop__more-info"
ng-class="{'image-crop__info--selected': crop == ctrl.crop}">
{{:: crop.specification.bounds.width}} × {{:: crop.specification.bounds.height}}
<span class="flex-spacer"></span>
<span class="image-crop__creator" title="Cropped by {{:: crop.author}} at {{:: crop.date | date:'medium'}}">{{:: crop.author | getInitials}}</span>
</div>
<asset-handle
data-source="grid"
data-source-type="crop"
data-thumbnail="{{:: extremeAssets.smallest | assetFile}}"
data-embeddable-url="{{:: ctrl.image.data.id | embeddableUrl:crop.id}}"
></asset-handle>
</a>
<div ng-switch-when="false"
draggable="false"
class="image-crop--disabled"
ng-init="extremeAssets = (crop | getExtremeAssets)"
gr-tooltip="{{:: ctrl.cropRatio}} crops only"
gr-tooltip-position="top">
<ng-include src="'/assets/js/image/crop.html'"></ng-include>
</div>
</div>
</dd>
</div>
<div class="image-info__group" ng-if="ctrl.hasCrops" role="region" aria-label="Image crops">
<dl class="image-info__group--dl">
<dt class="image-info__heading">Crops</dt>
<dd class="image-info__heading--crops">
<ul class="image-crops">
<li class="image-crop"
ng-repeat="crop in ctrl.crops"
ng-switch="ctrl.allowCropSelection(crop)"
ng-class="{'image-crop--selected': crop == ctrl.crop}">
<div role="region"
aria-label="{{crop.master.dimensions.width}} pixels by {{crop.master.dimensions.height}} pixels crop">
<a draggable="true"
ng-init="extremeAssets = (crop | getExtremeAssets)"
ng-switch-when="true"
ng-click="ctrl.cropSelected(crop)"
ui-sref="{crop: crop.id}"
ui-drag-data="ctrl.image | asImageAndCropDragData:crop"
ui-drag-image="extremeAssets.smallest | assetFile"
aria-label="Go to {{crop.master.dimensions.width}} pixels by {{crop.master.dimensions.height}} pixels crop">
<ng-include src="'/assets/js/image/crop.html'"></ng-include>
</a>
<div
class="image-crop--disabled"
draggable="false"
ng-init="extremeAssets = (crop | getExtremeAssets)"
ng-switch-when="false"
gr-tooltip="{{:: ctrl.cropRatio}} crops only"
gr-tooltip-position="top"
>
<ng-include src="'/assets/js/image/crop.html'"></ng-include>
</div>
</div>
</li>
</ul>
</dd>
</dl>
</div>
</div>
<gr-delete-crops
class="image-details__delete-crops"
gr-image="ctrl.image"
gr-on-delete="ctrl.onCropsDeleted()"></gr-delete-crops>
</div>
<div class="image-details image-details--full-image" role="complementary" aria-label="Image information">
<gr-metadata-validity gr-image="ctrl.image"></gr-metadata-validity>
<gr-image-cost-message gr-image="ctrl.image"></gr-image-cost-message>
<gr-radio-list gr-for="tabs" gr-options="ctrl.tabs" gr-selected-option="ctrl.selectedTab"></gr-radio-list>
<div class="image-details image-details--scroll">
<gr-image-metadata
gr-images="ctrl.singleImageList"
gr-user-can-edit="ctrl.canUserEdit"
ng-if="ctrl.selectedTab === 'metadata'"></gr-image-metadata>
<gr-image-usage gr-image="ctrl.image" ng-if="ctrl.selectedTab === 'usages'"></gr-image-usage>
</div>
</div>
<div class="image-holder" role="main" aria-label="Image view">
<div class="easel">
<div class="easel__canvas"
ng-if="!ctrl.crop"
draggable="true"
ui-drag-data="ctrl.image | asImageDragData">
<img ng-class="{'easel__image':true,'easel__image--checkered__background': ctrl.image.data.optimisedPng }"
crossorigin="anonymous"
alt="preview of original image"
ng-src="{{:: ctrl.optimisedImageUri}}"
grid:track-image="ctrl.image"
grid:track-image-location="original"
grid:track-image-loadtime/>
</div>
<!-- TODO: As this loads async, add a loader -->
<div class="easel__canvas" ng-if="ctrl.crop"
draggable="true"
ui-drag-data="ctrl.image | asImageAndCropDragData:ctrl.crop"
ui-drag-image="extremeAssets.smallest | assetFile">
<a class="easel__image-container"
ng-init="extremeAssets = (ctrl.crop | getExtremeAssets)"
ui-sref="{crop: ctrl.cropKey}">
<!-- TODO: Add tracking to crop -->
<img class="easel__image easel__image--checkered__background"
alt="cropped image"
ng-src="{{:: extremeAssets.largest | assetFile}}"
/>
</a>
</div>
</div>
</div>