Skip to content
Snippets Groups Projects
LibraryFollowTable.vue 4.67 KiB
Newer Older
  • Learn to ignore specific revisions
  • <template>
      <div>
        <div class="ui form">
          <div class="fields">
            <div class="ui six wide field">
              <input type="text" v-model="search" placeholder="Search by username, domain..." />
            </div>
            <div class="ui four wide inline field">
              <div class="ui checkbox">
                <input v-model="pending" type="checkbox">
                <label>Pending approval</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>
              <th>Actor</th>
              <th>Creation date</th>
              <th>Status</th>
              <th>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">
                  <i class="check icon"></i> Approved
                </template>
                <template v-else-if="follow.approved === false">
                  <i class="x icon"></i> Refused
                </template>
                <template v-else>
                  <i class="clock icon"></i> Pending
                </template>
              </td>
              <td>
                <dangerous-button v-if="follow.approved !== false" class="tiny basic labeled icon" color='red' @confirm="updateFollow(follow, false)">
                  <i class="x icon"></i> Deny
                  <p slot="modal-header">Deny access?</p>
                  <p slot="modal-content">By confirming, {{ follow.actor.preferred_username }}@{{ follow.actor.domain }} will be denied access to your library.</p>
                  <p slot="modal-confirm">Deny</p>
                </dangerous-button>
                <dangerous-button v-if="follow.approved !== true" class="tiny basic labeled icon" color='green' @confirm="updateFollow(follow, true)">
                  <i class="x icon"></i> Approve
                  <p slot="modal-header">Approve access?</p>
                  <p slot="modal-content">By confirming, {{ follow.actor.preferred_username }}@{{ follow.actor.domain }} will be granted access to your library.</p>
                  <p slot="modal-confirm">Approve</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">
                Showing results {{ ((page-1) * paginateBy) + 1 }}-{{ ((page-1) * paginateBy) + result.results.length }} on {{ result.count }}</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()
      },
      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>