Skip to content

Commit 4153c29

Browse files
committed
use new parentAndChildDetails property on an image response, to add extra sections (with thumbnails) in the bottom left of the sidebar (below crops etc.)
1 parent 98040d9 commit 4153c29

6 files changed

Lines changed: 54 additions & 8 deletions

File tree

kahuna/public/js/image/controller.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,8 @@ image.controller('ImageCtrl', [
169169
ctrl.canUserEdit = editable;
170170
});
171171

172+
ctrl.objectHasEntries = obj => obj && Object.keys(obj).length > 0;
173+
172174
const usages = imageUsagesService.getUsages(ctrl.image);
173175
const usagesCount$ = usages.count$;
174176

kahuna/public/js/image/view.html

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,32 @@
151151
class="image-details__delete-crops"
152152
gr-image="ctrl.image"
153153
gr-on-delete="ctrl.onCropsDeleted()"></gr-delete-crops>
154+
155+
<div class="image-info image-details--scroll" style="margin-top: auto; max-height: 50%">
156+
<div ng-repeat="(title, idToDetailMap) in ctrl.image.data.parentAndChildDetails">
157+
<div class="image-info__group image-info__group--bottom" aria-label="{{title}}"
158+
ng-if="ctrl.objectHasEntries(idToDetailMap)">
159+
<dl class="image-info__group--dl">
160+
<dt class="image-info__heading">{{title}}</dt>
161+
<dd class="image-info__heading--crops"
162+
ng-repeat="(id, detail) in idToDetailMap">
163+
<a class="image-crop"
164+
ui-sref="image({imageId: id})"
165+
aria-label="View {{title}}">
166+
<img class="image-crop__image"
167+
alt="{{title}} {{id}} thumbnail"
168+
ng-src="{{detail.thumbnail}}" />
169+
<div class="flex-container image-crop__more-info">
170+
<span ng-if="detail.dimensions">{{detail.dimensions.width}} &times; {{detail.dimensions.height}}</span>
171+
<span class="flex-spacer"></span>
172+
<span class="image-crop__creator" title="Added by {{detail.addedBy}} at {{detail.addedAt | date:'medium'}}">{{detail.addedBy | getInitials}}</span>
173+
</div>
174+
</a>
175+
</dd>
176+
</dl>
177+
</div>
178+
</div>
179+
</div>
154180
</div>
155181

156182
<div class="image-details image-details--full-image" role="complementary" aria-label="Image information">

kahuna/public/stylesheets/main.css

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2116,7 +2116,8 @@ FIXME: what to do with touch devices
21162116
}
21172117

21182118
.image-details__delete-crops {
2119-
width: 100%;
2119+
width: 100%;
2120+
outline: 1px solid #565656;
21202121
}
21212122

21222123
.image-details:after {
@@ -2136,6 +2137,11 @@ FIXME: what to do with touch devices
21362137
border-bottom: 1px solid #565656;
21372138
}
21382139

2140+
.image-info__group--bottom {
2141+
border-bottom: 0;
2142+
border-top: 1px solid #565656;
2143+
}
2144+
21392145
.image-info__group--last {
21402146
border-bottom: 0;
21412147
clear: both;

media-api/app/controllers/MediaApi.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -628,6 +628,8 @@ class MediaApi(
628628
val deleteImagePermission = authorisation.isUploaderOrHasPermission(request.user, source.instance.uploadedBy, DeleteImagePermission)
629629
val deleteCropsOrUsagePermission = canUserDeleteCropsOrUsages(request.user)
630630

631+
import JodaWrites._
632+
implicit val jsonDetailsWrites: OWrites[RelationDetail] = Json.writes[RelationDetail]
631633
val getRelationDetails = elasticSearch.getRelationDetails(id, imageResponse.getSecureThumbUrl)_
632634
val relationDetails = Map(
633635
"Replacement for" -> source.instance.identifiers.get(ImageStorageProps.replacesMediaIdIdentifierKey).map(getRelationDetails),

media-api/app/lib/elasticsearch/ElasticSearch.scala

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import com.gu.mediaservice.lib.auth.Authentication.Principal
88
import com.gu.mediaservice.lib.elasticsearch.{CompletionPreview, ElasticSearchClient, ElasticSearchConfig, MigrationStatusProvider, Running}
99
import com.gu.mediaservice.lib.logging.{GridLogging, LogMarker, MarkerMap}
1010
import com.gu.mediaservice.lib.metrics.FutureSyntax
11-
import com.gu.mediaservice.model.{Agencies, Agency, AwaitingReviewForSyndication, Image}
11+
import com.gu.mediaservice.model.{Agencies, Agency, AwaitingReviewForSyndication, Dimensions, Image}
1212
import com.sksamuel.elastic4s.ElasticDsl
1313
import com.sksamuel.elastic4s.ElasticDsl._
1414
import com.sksamuel.elastic4s.requests.get.{GetRequest, GetResponse}
@@ -334,12 +334,16 @@ class ElasticSearch(
334334

335335
def getRelationDetails(mediaIdThisIsFor: String, getSecureThumbUrl: Image => String)(
336336
id: String
337-
)(implicit ex: ExecutionContext, request: AuthenticatedRequest[AnyContent, Principal], logMarker:MarkerMap = MarkerMap()): (String, Option[Map[String, String]]) = {
337+
)(implicit ex: ExecutionContext, logMarker:MarkerMap = MarkerMap()): (String, Option[RelationDetail]) = {
338338
try {
339-
id -> Await.result(getImageById(id), 5.seconds).map(image => Map(
340-
"thumbnail" -> getSecureThumbUrl(image),
341-
"addedBy" -> image.uploadedBy
342-
))
339+
id -> Await.result(getImageById(id), 5.seconds).map{image =>
340+
RelationDetail(
341+
thumbnail = getSecureThumbUrl(image),
342+
addedBy = image.uploadedBy,
343+
addedAt = image.uploadTime,
344+
dimensions = image.source.orientedDimensions.orElse(image.source.dimensions)
345+
)
346+
}
343347
} catch {
344348
case e: TimeoutException =>
345349
logger.error(logMarker, s"Timeout getting image $id (when finding relation details for $mediaIdThisIsFor)", e)

media-api/app/lib/elasticsearch/ElasticSearchModel.scala

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import com.gu.mediaservice.lib.argo.model.ExtraCounts
44
import com.gu.mediaservice.lib.auth.{Authentication, Tier}
55
import com.gu.mediaservice.lib.formatting.{parseDateFromQuery, printDateTime}
66
import com.gu.mediaservice.model.usage.UsageStatus
7-
import com.gu.mediaservice.model.{Image, PrintUsageFilters, SyndicationStatus}
7+
import com.gu.mediaservice.model.{Dimensions, Image, PrintUsageFilters, SyndicationStatus}
88
import lib.querysyntax.{Condition, Parser}
99
import org.joda.time.DateTime
1010
import play.api.libs.json.{Json, OWrites}
@@ -52,6 +52,12 @@ object AggregateSearchParams {
5252
)
5353
}
5454
}
55+
case class RelationDetail(
56+
thumbnail: String,
57+
addedBy: String,
58+
addedAt: DateTime,
59+
dimensions: Option[Dimensions]
60+
)
5561

5662
case class SearchParams(
5763
query: Option[String] = None,

0 commit comments

Comments
 (0)