commit.vue 3.9 KB
Newer Older
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 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
<script>
  import commitIconSvg from 'icons/_icon_commit.svg';
  import userAvatarLink from './user_avatar/user_avatar_link.vue';

  export default {
    props: {
      /**
       * Indicates the existance of a tag.
       * Used to render the correct icon, if true will render `fa-tag` icon,
       * if false will render `fa-code-fork` icon.
       */
      tag: {
        type: Boolean,
        required: false,
        default: false,
      },
      /**
       * If provided is used to render the branch name and url.
       * Should contain the following properties:
       * name
       * ref_url
       */
      commitRef: {
        type: Object,
        required: false,
        default: () => ({}),
      },
      /**
       * Used to link to the commit sha.
       */
      commitUrl: {
        type: String,
        required: false,
        default: '',
      },

      /**
       * Used to show the commit short sha that links to the commit url.
       */
      shortSha: {
        type: String,
        required: false,
        default: '',
      },
      /**
       * If provided shows the commit tile.
       */
      title: {
        type: String,
        required: false,
        default: '',
      },
      /**
       * If provided renders information about the author of the commit.
       * When provided should include:
       * `avatar_url` to render the avatar icon
       * `web_url` to link to user profile
       * `username` to render alt and title tags
       */
      author: {
        type: Object,
        required: false,
        default: () => ({}),
      },
    },
    computed: {
      /**
       * Used to verify if all the properties needed to render the commit
       * ref section were provided.
       *
       * TODO: Improve this! Use lodash _.has when we have it.
       *
       * @returns {Boolean}
       */
      hasCommitRef() {
        return this.commitRef && this.commitRef.name && this.commitRef.ref_url;
      },
      /**
       * Used to verify if all the properties needed to render the commit
       * author section were provided.
       *
       * TODO: Improve this! Use lodash _.has when we have it.
       *
       * @returns {Boolean}
       */
      hasAuthor() {
        return this.author &&
          this.author.avatar_url &&
          this.author.path &&
          this.author.username;
      },
      /**
       * If information about the author is provided will return a string
       * to be rendered as the alt attribute of the img tag.
       *
       * @returns {String}
       */
      userImageAltDescription() {
        return this.author &&
          this.author.username ? `${this.author.username}'s avatar` : null;
      },
    },
    data() {
      return { commitIconSvg };
    },
    components: {
      userAvatarLink,
    },
  };
</script>
<template>
  <div class="branch-commit">
    <div v-if="hasCommitRef" class="icon-container">
      <i
        v-if="tag"
        class="fa fa-tag"
        aria-hidden="true">
      </i>
      <i
        v-if="!tag"
        class="fa fa-code-fork"
        aria-hidden="true">
      </i>
    </div>

    <a
      v-if="hasCommitRef"
      class="ref-name"
      :href="commitRef.ref_url">
      {{commitRef.name}}
    </a>

    <div
      v-html="commitIconSvg"
      class="commit-icon js-commit-icon">
    </div>

    <a
      class="commit-sha"
      :href="commitUrl">
      {{shortSha}}
    </a>

    <div class="commit-title flex-truncate-parent">
      <span
        v-if="title"
        class="flex-truncate-child">
        <user-avatar-link
          v-if="hasAuthor"
          class="avatar-image-container"
          :link-href="author.path"
          :img-src="author.avatar_url"
          :img-alt="userImageAltDescription"
          :tooltip-text="author.username"
        />
        <a class="commit-row-message"
          :href="commitUrl">
          {{title}}
        </a>
      </span>
      <span v-else>
        Cant find HEAD commit for this branch
      </span>
    </div>
  </div>
</template>