diff --git a/app/assets/javascripts/rapid_diffs/adapters.js b/app/assets/javascripts/rapid_diffs/adapters.js index bd76be708a2b23d2eb84a07c22945b0b59267e75..1911f55bcc49eb558c7a87500f32ee2f6dd4baeb 100644 --- a/app/assets/javascripts/rapid_diffs/adapters.js +++ b/app/assets/javascripts/rapid_diffs/adapters.js @@ -2,11 +2,13 @@ import { ExpandLinesAdapter } from '~/rapid_diffs/expand_lines/adapter'; import { OptionsMenuAdapter } from '~/rapid_diffs/options_menu/adapter'; import { ToggleFileAdapter } from '~/rapid_diffs/toggle_file/adapter'; import { DisableDiffSideAdapter } from '~/rapid_diffs/disable_diff_side/adapter'; +import { ImageAdapter } from '~/rapid_diffs/image_viewer/adapter'; const HEADER_ADAPTERS = [OptionsMenuAdapter, ToggleFileAdapter]; export const VIEWER_ADAPTERS = { text_inline: [...HEADER_ADAPTERS, ExpandLinesAdapter], text_parallel: [...HEADER_ADAPTERS, ExpandLinesAdapter, DisableDiffSideAdapter], + image: [...HEADER_ADAPTERS, ImageAdapter], no_preview: HEADER_ADAPTERS, }; diff --git a/app/assets/javascripts/rapid_diffs/image_viewer/adapter.js b/app/assets/javascripts/rapid_diffs/image_viewer/adapter.js new file mode 100644 index 0000000000000000000000000000000000000000..9186268237221efb5b37f972aace2ecc383983ec --- /dev/null +++ b/app/assets/javascripts/rapid_diffs/image_viewer/adapter.js @@ -0,0 +1,26 @@ +import Vue from 'vue'; +import ImageDiffViewer from '~/vue_shared/components/diff_viewer/viewers/image_diff_viewer.vue'; +import { MOUNTED } from '../events'; + +export const ImageAdapter = { + [MOUNTED]() { + const data = JSON.parse(this.diffElement.querySelector('[data-image-data]').dataset.imageData); + // eslint-disable-next-line no-new + new Vue({ + el: this.diffElement.querySelector('[data-image-view]'), + render(h) { + return h(ImageDiffViewer, { + props: { + oldPath: data.old_path || '', + newPath: data.new_path || '', + oldSize: data.old_size ? parseInt(data.old_size, 10) : undefined, + newSize: data.new_size ? parseInt(data.new_size, 10) : undefined, + diffMode: data.diff_mode, + // URLs are already encoded on the backend + encodePath: false, + }, + }); + }, + }); + }, +}; diff --git a/app/assets/javascripts/vue_shared/components/content_viewer/viewers/image_viewer.vue b/app/assets/javascripts/vue_shared/components/content_viewer/viewers/image_viewer.vue index 9742118cd5f77a24a13766eb14477b7713bec289..cb126352a49295488d65579c720451ef8a6d18f4 100644 --- a/app/assets/javascripts/vue_shared/components/content_viewer/viewers/image_viewer.vue +++ b/app/assets/javascripts/vue_shared/components/content_viewer/viewers/image_viewer.vue @@ -26,6 +26,11 @@ export default { required: false, default: '', }, + encodePath: { + type: Boolean, + required: false, + default: true, + }, }, data() { return { @@ -47,6 +52,7 @@ export default { return this.width && this.height; }, safePath() { + if (!this.encodePath) return this.path; return this.path.startsWith(BLOB_PREFIX) ? this.path : encodeSaferUrl(this.path); }, }, diff --git a/app/assets/javascripts/vue_shared/components/diff_viewer/viewers/image_diff/onion_skin_viewer.vue b/app/assets/javascripts/vue_shared/components/diff_viewer/viewers/image_diff/onion_skin_viewer.vue index a3d9b0ace341a533cbbae01267283d9f6f663066..2a12b372c0e4c2519daa9831bba482cfc5541562 100644 --- a/app/assets/javascripts/vue_shared/components/diff_viewer/viewers/image_diff/onion_skin_viewer.vue +++ b/app/assets/javascripts/vue_shared/components/diff_viewer/viewers/image_diff/onion_skin_viewer.vue @@ -15,6 +15,11 @@ export default { type: String, required: true, }, + encodePath: { + type: Boolean, + required: false, + default: true, + }, }, data() { return { @@ -123,6 +128,7 @@ export default { key="onionOldImg" :render-info="false" :path="oldPath" + :encode-path="encodePath" @imgLoaded="onionOldImgLoaded" /> @@ -139,6 +145,7 @@ export default { key="onionNewImg" :render-info="false" :path="newPath" + :encode-path="encodePath" @imgLoaded="onionNewImgLoaded" >