src_js/iconolab-bundle/src/components/diffviewer/diffviewer.vue
author ymh <ymh.work@gmail.com>
Wed, 18 Jul 2018 18:17:01 +0200
changeset 572 423316923527
parent 156 e1e14766f608
permissions -rw-r--r--
Correct tag list removal

<template src='./template.html'></template>
<style scoped src='./style.css'></style>

<script>
	
	import ModalPanel from '../modalpanel/ModalPanel.vue'


	export default {
		components: { 'modalpanel': ModalPanel },
		mounted: function () {},
		props: ['transform-matrix', 'image-path', 'image-height', 'image-width'],
		data () {

			return {
				diffText: "",
				tagMode: false,
				textMode: false,
				fragmentMode: false,
				originalPath: "",
				modifiedPath: "",
				tags: []	
			}
		},

		mounted () { return false; },

		computed: {
			matrixTransform: function () {
				var matrixTransform = "";
				if (this.transformMatrix) {
					matrixTransform = "matrix(" + this.transformMatrix + ")";
				}
				return matrixTransform;
			}
		},

		methods: {

			setContent: function (content) {
				this.$refs.modalcontent.appendChild(content);
			},
			
			switchMode: function (mode) {
				var availableMode = ["tagMode", "textMode", "fragmentMode"];
				this.tagMode = false;
				this.textMode = false;
				this.fragmentMode = false;
				if (availableMode.indexOf(mode) !== -1) {
					this[mode] = true;	
				}
			},


			showTagDiff: function (tags, editedTags) {
				this.switchMode("tagMode");
				//si le label a changé considé qu'il a été effacé.
				var diff = iconolab.JsonDiff.diff(tags, editedTags);
				var tagsToRender = [];
				
				tags.forEach(function(tag, i) { 

					var tag = JSON.parse(JSON.stringify(tag));
					var deletedDiff = diff["_"+i];
					var currentDiff = diff[i];

					if (!deletedDiff && !currentDiff) {
						tagsToRender.push(tag); //render this tag
					}
					
					if (Array.isArray(deletedDiff)) {
						tag.action = "del";
						tagsToRender.push(tag);
						return true;
					}

					if (currentDiff && (currentDiff.tag_label || currentDiff.relevancy || currentDiff.accuracy)) {
						tag.action = (currentDiff.tag_label) ? "replace" : "update";
						tag.new_label =  editedTags[i].tag_label;
						tag.new_accuracy = editedTags[i].accuracy;
						tag.new_relevancy = editedTags[i].relevancy;
						tagsToRender.push(tag);
						return true;
					}
					if (Array.isArray(currentDiff)) {
						tag.action = "add";
						tagsToRender.push(editedTags[i]);
						return true;
					}
				});
				/* deal with remain */
				if (tags.length < editedTags.length) {
					var remainedTags = editedTags.slice(tags.length);
					remainedTags.forEach(function (tag, i) {
						tag.action = "add";
						tagsToRender.push(tag);	
					});
				}
				this.tags = tagsToRender;
			},

			showTextDiff: function (original, mod) {
				this.switchMode("textMode");
				var diff = iconolab.JsDiff.diffWords(original, mod);
				var fragment = document.createDocumentFragment();
				for (var i=0; i < diff.length; i++) {

					if (diff[i].added && diff[i + 1] && diff[i + 1].removed) {
						var swap = diff[i];
						diff[i] = diff[i + 1];
						diff[i + 1] = swap;
					}

					var node;
					if (diff[i].removed) {
						node = document.createElement('del');
						node.appendChild(document.createTextNode(diff[i].value));
					} else if (diff[i].added) {
						node = document.createElement('ins');
						node.appendChild(document.createTextNode(diff[i].value));
					} else {
						node = document.createTextNode(diff[i].value);
					}

					fragment.appendChild(node);
				}

				this.diffText = jQuery('<div>').append(fragment).html();		
			},
			
			showFragmentDiff: function (originalPath, modifiedPath) {
				this.switchMode("fragmentMode");
				this.originalPath = originalPath;
				this.modifiedPath = modifiedPath;
			},

			show: function () {
				this.$refs.panel.show();
			},

			hide: function () {
				this.$refs.panel.hide();
			}
		}
	}

</script>