src_js/iconolab-bundle/src/components/mergetool/MergeTool.vue
author ymh <ymh.work@gmail.com>
Wed, 06 Jun 2018 16:21:54 +0200
changeset 539 08e2513dbc2f
parent 156 e1e14766f608
permissions -rw-r--r--
Upgrade webpack to 4, upgrade vue.js, and some style changes

<script>
import Typeahead from "../typeahead/Typeahead.vue";
import DiffViewer from "../diffviewer/diffviewer.vue";

export default {
  data() {
    return {};
  },

  components: {
    Typeahead: Typeahead,
    diffviewer: DiffViewer
  },

  mounted() {
    this.targetKeyMap = {
      title: "proposal-title",
      desc: "proposal-description",
      frag: "proposal-fragment"
    };

    this.targetFieldTypeMap = {
      title: "input",
      desc: "input",
      frag: "frag"
    };

    this.originalValues = {
      title: "",
      desc: "",
      frag: ""
    };
  },

  methods: {
    pickProposition: function(event, sourceId, targetKey) {
      var value = "";
      var source = document.getElementById(sourceId);
      var targetField = this.$refs[this.targetKeyMap[targetKey]];
      var targetType = this.targetFieldTypeMap[targetKey];
      if (!targetType) {
        throw new Error("A target type must be provided...");
      }

      if (targetType === "input") {
        value = targetField.value;
        targetField.value = source.value;
      }

      if (targetType === "frag") {
        value = targetField.getAttribute("d");
        var sourceValue = source.getAttribute("d");
        var targetPathType = targetField.getAttribute("data-path-type");
        targetField.setAttribute("d", sourceValue);

        var pathType = source.getAttribute("data-path-type");
        pathType = pathType || "FREE";
        var fragmentField = this.$refs["fragment-field"];
        fragmentField.value = sourceValue + ";" + pathType;
      }

      this.preserveOriginalValue(targetKey, value);
    },

    pickTag: function(event, refTag) {
      var source = this.$refs[refTag];
      var target = this.$refs["proposal-tags"];
      this.preserveOriginalValue("proposal-tags", target.tags);
      target.setTags(source.tags, true);
    },

    preserveOriginalValue: function(key, value) {
      if (!this.originalValues[key]) {
        this.originalValues[key] = value;
      }
    },

    showDiffviewer: function(refId, sourceId, targetKey) {
      var sourceField = document.getElementById(sourceId);
      var targetField = this.$refs[this.targetKeyMap[targetKey]];
      var targetType = this.targetFieldTypeMap[targetKey];
      var diffViewer = this.$refs[refId];

      if (!diffViewer) {
        throw new Error("The DiffViewer can't be found for " + targetKey);
      }

      if (targetType === "input") {
        diffViewer.showTextDiff(sourceField.value, targetField.value);
      }

      if (targetKey === "tag") {
        var source = this.$refs[sourceId];
        var target = this.$refs["proposal-tags"];
        if (source.tags.length !== 0 && target.tags.length !== 0) {
          diffViewer.showTagDiff(source.tags, target.tags);
        }
      }
      /* frag */
      if (targetKey === "frag") {
        var originalPath = targetField.getAttribute("d");
        var modifiedPath = sourceField.getAttribute("d");
        diffViewer.showFragmentDiff(originalPath, modifiedPath);
      }

      diffViewer.show();
    },

    hightlightSource: function(source) {
      source.className += "highlight";
    },

    save: function() {
      alert("this is it ... ");
    }
  }
};
</script>