kahuna/public/js/crop/view.html (131 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 clickable side-padded"
ui-sref="image({ imageId: ctrl.image.data.id })"
gr-tooltip="Go back to image [esc]"
aria-label="Go back to image">
<gr-icon-label gr-icon="cancel">Back</gr-icon-label></a>
</gr-top-bar-nav>
<gr-top-bar-actions role="region" aria-label="User actions and secondary navigation">
<div class="top-bar-item side-padded crop-dimensions">
x:
<form class="top-bar-item__form">
<input
data-cy="crop-x-value-input"
type="number"
min="0"
max="{{ctrl.maxInputX()}}"
class="top-bar-item__form__input"
ng-model="ctrl.inputX"
ng-change="ctrl.broadcastXChange()"/>
</form>
y:
<form class="top-bar-item__form">
<input
data-cy="crop-y-value-input"
type="number"
min="0"
max="{{ctrl.maxInputY()}}"
class="top-bar-item__form__input"
ng-model="ctrl.inputY"
ng-change="ctrl.broadcastYChange()"/>
</form>
</div>
<div class="top-bar-item side-padded crop-dimensions">
<form class="top-bar-item__form">
<input
data-cy="crop-width-input"
type="number"
min="1"
max="{{ctrl.originalWidth}}"
class="top-bar-item__form__input"
ng-model="ctrl.inputWidth"
ng-change="ctrl.broadcastWidthChange()"/>
</form>
×
<form class="top-bar-item__form" ng-disabled="ctrl.freeRatio">
<input
data-cy="crop-height-input"
type="number"
min="1"
max="{{ctrl.originalHeight}}"
class="top-bar-item__form__input"
ng-model="ctrl.inputHeight"
ng-change="ctrl.broadcastHeightChange()"/>
</form>
</div>
<div class="inline-block side-padded">
<gr-radio-list data-cy="crop-options" gr-for="crop" gr-options="ctrl.cropOptions" gr-selected-option="ctrl.cropType"></gr-radio-list>
</div>
<div class="top-bar-item" ng-switch="ctrl.image.data.cost">
<div ng-switch-when="pay"
class="cost cost--pay">
Pay to use
</div>
<div ng-switch-when="overquota"
class="cost cost--pay">
Quota exceeded for this supplier
</div>
<div ng-switch-when="conditional"
class="cost cost--conditional"
title="restricted use: {{ctrl.image.data.usageRights.restrictions}}">
<!-- As `conditional` can only be set with usageRights, let's
just assume it's here. We might need to revisit this. -->
<gr-icon>flag</gr-icon>
<span class="top-bar-item__label">Restricted use</span>
<gr-icon>help</gr-icon>
</div>
</div>
<div class="top-bar-item side-padded">
<button class="button crop__action"
type="button"
ng-click="ctrl.callCrop()"
ng-disabled="ctrl.cropping"
gr-tooltip="Crop [enter]"
aria-label="Crop image">
<gr-icon-label gr-icon="crop" gr-loading="{{ctrl.cropping}}">Crop<span ng-show="ctrl.cropping">ping…</span></gr-icon-label>
</button>
</div>
</gr-top-bar-actions>
</gr-top-bar>
<div class="warning" ng-if="ctrl.cropSizeWarning()">
This crop is very small and will result in a low-quality image.
Please try to use a larger crop or an alternative image.
</div>
<div class="warning status--info" ng-if="ctrl.shouldShowVerticalWarningGutters">
Although this is a 5:3 crop, it might be used in a 5:4 space, so please ensure
there is nothing important in the striped sides<sup>
<a ng-click="ctrl.shouldHideVerticalWarningGutters = !ctrl.shouldHideVerticalWarningGutters">
[{{ctrl.shouldHideVerticalWarningGutters ? "show" : "hide"}}]
</a>
</sup>
as these might be clipped.
</div>
<div class="circular-mask-toggle-container" ng-if="ctrl.shouldShowCircularGuideline && ctrl.isSquareCrop">
<label>
Apply circular mask
<input type="checkbox" ng-model="ctrl.shouldUseCircularMask">
</label>
</div>
<div class="easel" role="main" aria-label="Image cropper" ng-class="{
'vertical-warning-gutters': ctrl.shouldShowVerticalWarningGutters,
'hide-vertical-warning-gutters': ctrl.shouldHideVerticalWarningGutters,
'circular-guideline': ctrl.shouldShowCircularGuideline && !ctrl.shouldUseCircularMask,
'circular-mask': ctrl.shouldShowCircularGuideline && ctrl.shouldUseCircularMask
}">
<div class="easel__canvas">
<div class="easel__image-container" oncontextmenu="return false;">
<img class="easel__image easel__image--cropper"
crossorigin="anonymous"
oncontextmenu="return false;"
alt="original image to crop"
ng-src="{{ctrl.optimisedImageUri}}"
ui-crop-box="ctrl.coords"
ui-crop-box-original-width="ctrl.originalWidth"
ui-crop-box-original-height="ctrl.originalHeight"
ui-crop-box-crop-type="ctrl.cropType"
grid:track-image="ctrl.image"
grid:track-image-location="original-cropping"
grid:track-image-loadtime
/>
</div>
</div>
</div>