diff options
| author | shpuld <shp@cock.li> | 2019-01-26 17:45:03 +0200 |
|---|---|---|
| committer | shpuld <shp@cock.li> | 2019-01-26 17:45:03 +0200 |
| commit | 3978aaef84cc023908155343af76983f2715cf90 (patch) | |
| tree | 0776b181029151d45450e472d1540715040bcab0 /src/components/gallery | |
| parent | 8761e039d04ff26944c87339ef55d2951a42696c (diff) | |
Redo everything in the MR
Diffstat (limited to 'src/components/gallery')
| -rw-r--r-- | src/components/gallery/gallery.js | 55 | ||||
| -rw-r--r-- | src/components/gallery/gallery.vue | 60 |
2 files changed, 115 insertions, 0 deletions
diff --git a/src/components/gallery/gallery.js b/src/components/gallery/gallery.js new file mode 100644 index 00000000..7f33a81b --- /dev/null +++ b/src/components/gallery/gallery.js @@ -0,0 +1,55 @@ +import Attachment from '../attachment/attachment.vue' +import { chunk, last, dropRight } from 'lodash' + +const Gallery = { + data: () => ({ + width: 500 + }), + props: [ + 'attachments', + 'nsfw', + 'setMedia' + ], + components: { Attachment }, + mounted () { + this.resize() + window.addEventListener('resize', this.resize) + }, + destroyed () { + window.removeEventListener('resize', this.resize) + }, + computed: { + rows () { + if (!this.attachments) { + return [] + } + const rows = chunk(this.attachments, 3) + if (last(rows).length === 1 && rows.length > 1) { + // if 1 attachment on last row -> add it to the previous row instead + const lastAttachment = last(rows)[0] + const allButLastRow = dropRight(rows) + last(allButLastRow).push(lastAttachment) + return allButLastRow + } + return rows + }, + rowHeight () { + return itemsPerRow => ({ 'height': `${(this.width / (itemsPerRow + 0.6))}px` }) + }, + useContainFit () { + return this.$store.state.config.useContainFit + } + }, + methods: { + resize () { + // Quick optimization to make resizing not always trigger state change, + // only update attachment size in 10px steps + const width = Math.floor(this.$el.getBoundingClientRect().width / 10) * 10 + if (this.width !== width) { + this.width = width + } + } + } +} + +export default Gallery diff --git a/src/components/gallery/gallery.vue b/src/components/gallery/gallery.vue new file mode 100644 index 00000000..20e8ab2f --- /dev/null +++ b/src/components/gallery/gallery.vue @@ -0,0 +1,60 @@ +<template> + <div ref="galleryContainer" style="width: 100%;"> + <div class="gallery-row" v-for="row in rows" :style="rowHeight(row.length)" :class="{ 'contain-fit': useContainFit, 'cover-fit': !useContainFit }"> + <attachment + v-for="attachment in row" + :setMedia="setMedia" + :nsfw="nsfw" + :attachment="attachment" + :allowPlay="false" + :key="attachment.id" + /> + </div> + </div> +</template> + +<script src='./gallery.js'></script> + +<style lang="scss"> +@import '../../_variables.scss'; + +.gallery-row { + height: 200px; + width: 100%; + display: flex; + flex-direction: row; + flex-wrap: nowrap; + align-content: stretch; + flex-grow: 1; + margin-top: 0.5em; + + .attachments, .attachment { + margin: 0 0.5em 0 0; + flex-grow: 1; + height: 100%; + box-sizing: border-box; + } + + .image-attachment { + width: 100%; + height: 100%; + } + + .video-container { + height: 100%; + } + + &.contain-fit { + img, video { + object-fit: contain; + } + } + + &.cover-fit { + img, video { + object-fit: cover; + } + } +} + +</style> |
