Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | 18x | <script> import { throttle } from 'lodash'; import { numberToHumanSize } from '~/lib/utils/number_utils'; import { encodeSaferUrl } from '~/lib/utils/url_utility'; const BLOB_PREFIX = 'blob:'; export default { props: { path: { type: String, required: true, }, fileSize: { type: Number, required: false, default: 0, }, renderInfo: { type: Boolean, default: true, required: false, }, innerCssClasses: { type: [Array, Object, String], required: false, default: '', }, }, data() { return { width: 0, height: 0, renderedWidth: 0, renderedHeight: 0, }; }, computed: { fileSizeReadable() { return numberToHumanSize(this.fileSize); }, hasFileSize() { return this.fileSize > 0; }, hasDimensions() { return this.width && this.height; }, safePath() { return this.path.startsWith(BLOB_PREFIX) ? this.path : encodeSaferUrl(this.path); }, }, beforeDestroy() { window.removeEventListener('resize', this.resizeThrottled, false); }, mounted() { // The onImgLoad may have happened before the control was actually mounted this.onImgLoad(); this.resizeThrottled = throttle(this.onImgLoad, 400); window.addEventListener('resize', this.resizeThrottled, false); }, methods: { onImgLoad() { requestIdleCallback(this.calculateImgSize, { timeout: 1000 }); }, calculateImgSize() { const { contentImg } = this.$refs; Iif (contentImg) { this.width = contentImg.naturalWidth; this.height = contentImg.naturalHeight; this.$nextTick(() => { this.renderedWidth = contentImg.clientWidth; this.renderedHeight = contentImg.clientHeight; this.$emit('imgLoaded', { width: this.width, height: this.height, renderedWidth: this.renderedWidth, renderedHeight: this.renderedHeight, }); }); } }, }, }; </script> <template> <div data-testid="image-viewer"> <div :class="innerCssClasses" class="position-relative"> <img ref="contentImg" :src="safePath" @load="onImgLoad" /> <slot name="image-overlay" :rendered-width="renderedWidth" :rendered-height="renderedHeight" ></slot> </div> <p v-if="renderInfo" class="image-info"> <template v-if="hasFileSize"> {{ fileSizeReadable }} </template> <template v-if="hasFileSize && hasDimensions"> | </template> <template v-if="hasDimensions"> <strong>{{ s__('ImageViewerDimensions|W') }}</strong >: {{ width }} | <strong>{{ s__('ImageViewerDimensions|H') }}</strong >: {{ height }} </template> </p> </div> </template> |