lock_issue_sidebar.vue 3.01 KB
Newer Older
Luke "Jared" Bennett's avatar
Luke "Jared" Bennett committed
1
<script>
2 3 4 5 6
import Flash from '~/flash';
import editForm from './edit_form.vue';
import issuableMixin from '../../../vue_shared/mixins/issuable';
import Icon from '../../../vue_shared/components/icon.vue';
import eventHub from '../../event_hub';
Luke "Jared" Bennett's avatar
Luke "Jared" Bennett committed
7

8 9 10 11 12 13
export default {
  components: {
    editForm,
    Icon,
  },
  mixins: [issuableMixin],
Luke "Jared" Bennett's avatar
Luke "Jared" Bennett committed
14

15 16 17 18 19
  props: {
    isLocked: {
      required: true,
      type: Boolean,
    },
Luke "Jared" Bennett's avatar
Luke "Jared" Bennett committed
20

21 22 23 24
    isEditable: {
      required: true,
      type: Boolean,
    },
Luke "Jared" Bennett's avatar
Luke "Jared" Bennett committed
25

26 27 28 29 30 31 32 33 34
    mediator: {
      required: true,
      type: Object,
      validator(mediatorObject) {
        return (
          mediatorObject.service &&
          mediatorObject.service.update &&
          mediatorObject.store
        );
Filipa Lacerda's avatar
Filipa Lacerda committed
35
      },
Luke "Jared" Bennett's avatar
Luke "Jared" Bennett committed
36
    },
37
  },
Luke "Jared" Bennett's avatar
Luke "Jared" Bennett committed
38

39 40 41 42
  computed: {
    lockIcon() {
      return this.isLocked ? 'lock' : 'lock-open';
    },
Luke "Jared" Bennett's avatar
Luke "Jared" Bennett committed
43

44 45
    isLockDialogOpen() {
      return this.mediator.store.isLockDialogOpen;
Luke "Jared" Bennett's avatar
Luke "Jared" Bennett committed
46
    },
47
  },
Luke "Jared" Bennett's avatar
Luke "Jared" Bennett committed
48

49 50 51 52 53 54 55
  created() {
    eventHub.$on('closeLockForm', this.toggleForm);
  },

  beforeDestroy() {
    eventHub.$off('closeLockForm', this.toggleForm);
  },
Filipa Lacerda's avatar
Filipa Lacerda committed
56

57 58 59 60 61 62 63 64 65
  methods: {
    toggleForm() {
      this.mediator.store.isLockDialogOpen = !this.mediator.store
        .isLockDialogOpen;
    },

    updateLockedAttribute(locked) {
      this.mediator.service
        .update(this.issuableType, {
Filipa Lacerda's avatar
Filipa Lacerda committed
66 67 68
          discussion_locked: locked,
        })
        .then(() => location.reload())
69 70 71 72 73 74 75 76 77
        .catch(() =>
          Flash(
            this.__(
              `Something went wrong trying to change the locked state of this ${
                this.issuableDisplayName
              }`,
            ),
          ),
        );
Luke "Jared" Bennett's avatar
Luke "Jared" Bennett committed
78
    },
79 80
  },
};
Luke "Jared" Bennett's avatar
Luke "Jared" Bennett committed
81 82 83 84
</script>

<template>
  <div class="block issuable-sidebar-item lock">
85 86 87 88
    <div
      class="sidebar-collapsed-icon"
      @click="toggleForm"
    >
89 90
      <icon
        :name="lockIcon"
Luke "Jared" Bennett's avatar
Luke "Jared" Bennett committed
91
        aria-hidden="true"
Filipa Lacerda's avatar
Filipa Lacerda committed
92 93
        class="sidebar-item-icon is-active"
      />
Luke "Jared" Bennett's avatar
Luke "Jared" Bennett committed
94 95 96
    </div>

    <div class="title hide-collapsed">
97
      {{ sprintf(__('Lock %{issuableDisplayName}'), { issuableDisplayName: issuableDisplayName }) }}
Luke "Jared" Bennett's avatar
Luke "Jared" Bennett committed
98 99
      <button
        v-if="isEditable"
100
        class="pull-right lock-edit"
Luke "Jared" Bennett's avatar
Luke "Jared" Bennett committed
101 102 103 104 105 106 107 108
        type="button"
        @click.prevent="toggleForm"
      >
        {{ __('Edit') }}
      </button>
    </div>

    <div class="value sidebar-item-value hide-collapsed">
109
      <edit-form
Luke "Jared" Bennett's avatar
Luke "Jared" Bennett committed
110 111 112 113 114 115
        v-if="isLockDialogOpen"
        :is-locked="isLocked"
        :update-locked-attribute="updateLockedAttribute"
        :issuable-type="issuableType"
      />

116 117 118 119
      <div
        v-if="isLocked"
        class="value sidebar-item-value"
      >
120 121 122
        <icon
          name="lock"
          :size="16"
123
          aria-hidden="true"
Filipa Lacerda's avatar
Filipa Lacerda committed
124 125
          class="sidebar-item-icon inline is-active"
        />
Luke "Jared" Bennett's avatar
Luke "Jared" Bennett committed
126 127 128
        {{ __('Locked') }}
      </div>

129 130 131 132
      <div
        v-else
        class="no-value sidebar-item-value hide-collapsed"
      >
133 134 135
        <icon
          name="lock-open"
          :size="16"
136
          aria-hidden="true"
Filipa Lacerda's avatar
Filipa Lacerda committed
137 138
          class="sidebar-item-icon inline"
        />
Luke "Jared" Bennett's avatar
Luke "Jared" Bennett committed
139 140 141 142 143
        {{ __('Unlocked') }}
      </div>
    </div>
  </div>
</template>