Skip to content
Snippets Groups Projects
LibraryFollowTable.vue 5.73 KiB
Newer Older
  • Learn to ignore specific revisions
  • <template>
      <div>
        <div class="ui form">
          <div class="fields">
            <div class="ui six wide field">
    
    Eliot Berriot's avatar
    Eliot Berriot committed
              <input type="text" v-model="search" :placeholder="labels.searchPlaceholder" />
    
            </div>
            <div class="ui four wide inline field">
              <div class="ui checkbox">
                <input v-model="pending" type="checkbox">
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                <label>
    
                  <translate>Pending approval</translate>
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                </label>
    
              </div>
            </div>
          </div>
        </div>
        <div class="ui hidden divider"></div>
        <table v-if="result" class="ui very basic single line unstackable table">
          <thead>
            <tr>
    
    Eliot Berriot's avatar
    Eliot Berriot committed
              <th>{{ $gettext('Actor') }}</th>
              <th>{{ $gettext('Creation date') }}</th>
              <th>{{ $gettext('Status') }}</th>
              <th>{{ $gettext('Actions') }}</th>
    
            </tr>
          </thead>
          <tbody>
            <tr v-for="follow in result.results">
              <td>
                {{ follow.actor.preferred_username }}@{{ follow.actor.domain }}
              </td>
              <td>
                <human-date :date="follow.creation_date"></human-date>
              </td>
              <td>
                <template v-if="follow.approved === true">
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                  <i class="check icon"></i>
    
                  <translate>Approved</translate>
    
                </template>
                <template v-else-if="follow.approved === false">
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                  <i class="x icon"></i>
    
                  <translate>Refused</translate>
    
                </template>
                <template v-else>
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                  <i class="clock icon"></i>
    
                  <translate>Pending</translate>
    
                </template>
              </td>
              <td>
                <dangerous-button v-if="follow.approved !== false" class="tiny basic labeled icon" color='red' @confirm="updateFollow(follow, false)">
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                  <i class="x icon"></i>
    
                  <translate>Deny</translate>
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                  <p slot="modal-header">
    
                    <translate>Deny access?</translate>
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                  </p>
    
    Bat's avatar
    Bat committed
                  <p slot="modal-content">
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                    <translate
                      :translate-params="{username: follow.actor.preferred_username + '@' + follow.actor.domain}">
                      By confirming, %{ username } will be denied access to your library.
                    </translate>
                  </p>
                  <p slot="modal-confirm">
    
                    <translate>Deny</translate>
    
    Bat's avatar
    Bat committed
                  </p>
    
                </dangerous-button>
                <dangerous-button v-if="follow.approved !== true" class="tiny basic labeled icon" color='green' @confirm="updateFollow(follow, true)">
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                  <i class="check icon"></i>
    
                  <translate>Approve</translate>
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                  <p slot="modal-header">
    
                    <translate>Approve access?</translate>
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                  </p>
    
    Bat's avatar
    Bat committed
                  <p slot="modal-content">
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                    <translate
                      :translate-params="{username: follow.actor.preferred_username + '@' + follow.actor.domain}">
                      By confirming, %{ username } will be granted access to your library.
                    </translate>
                  <p slot="modal-confirm">
    
                    <translate>Approve</translate>
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                  </p>
    
                </dangerous-button>
              </td>
            </tr>
          </tbody>
          <tfoot class="full-width">
            <tr>
              <th>
                <pagination
                v-if="result && result.results.length > 0"
                @page-changed="selectPage"
                :compact="true"
                :current="page"
                :paginate-by="paginateBy"
                :total="result.count"
                ></pagination>
              </th>
              <th v-if="result && result.results.length > 0">
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                <translate
                  :translate-params="{start: ((page-1) * paginateBy) + 1, end: ((page-1) * paginateBy) + result.results.length, total: result.count}">
                  Showing results %{ start }-%{ end } on %{ total }
                </translate>
    
    Bat's avatar
    Bat committed
              </th>
    
              <th></th>
              <th></th>
            </tr>
          </tfoot>
        </table>
      </div>
    </template>
    
    <script>
    import axios from 'axios'
    import _ from 'lodash'
    
    import Pagination from '@/components/Pagination'
    
    export default {
      props: {
        filters: {type: Object, required: false, default: () => {}}
      },
      components: {
        Pagination
      },
      data () {
        return {
          isLoading: false,
          result: null,
          page: 1,
          paginateBy: 25,
          search: '',
          pending: false
        }
      },
      created () {
        this.fetchData()
      },
    
    Eliot Berriot's avatar
    Eliot Berriot committed
      computed: {
        labels () {
          return {
            searchPlaceholder: this.$gettext('Search by username, domain...')
          }
        }
      },
    
      methods: {
        fetchData () {
          let params = _.merge({
            'page': this.page,
            'page_size': this.paginateBy,
            'q': this.search
          }, this.filters)
          if (this.pending) {
            params.pending = true
          }
          let self = this
          self.isLoading = true
          axios.get('/federation/libraries/followers/', {params: params}).then((response) => {
            self.result = response.data
            self.isLoading = false
          }, error => {
            self.isLoading = false
            self.errors = error.backendErrors
          })
        },
        selectPage: function (page) {
          this.page = page
        },
        updateFollow (follow, approved) {
          let payload = {
            follow: follow.id,
            approved: approved
          }
          let self = this
          axios.patch('/federation/libraries/followers/', payload).then((response) => {
            follow.approved = response.data.approved
            self.isLoading = false
          }, error => {
            self.isLoading = false
            self.errors = error.backendErrors
          })
        }
      },
      watch: {
        search (newValue) {
          if (newValue.length > 0) {
            this.fetchData()
          }
        },
        page () {
          this.fetchData()
        },
        pending () {
          this.fetchData()
        }
      }
    }
    </script>