mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-27 11:18:14 +01:00 
			
		
		
		
	Merge pull request #2580 from KeyboardHammer/authorSort
Add sorting to author page
This commit is contained in:
		
						commit
						153f149d58
					
				@ -98,6 +98,9 @@
 | 
			
		||||
      <template v-else-if="page === 'authors'">
 | 
			
		||||
        <div class="flex-grow" />
 | 
			
		||||
        <ui-btn v-if="userCanUpdate && authors && authors.length && !isBatchSelecting" :loading="processingAuthors" color="primary" small @click="matchAllAuthors">{{ $strings.ButtonMatchAllAuthors }}</ui-btn>
 | 
			
		||||
 | 
			
		||||
        <!-- author sort select -->
 | 
			
		||||
        <controls-sort-select v-if="authors && authors.length" v-model="settings.authorSortBy" :descending.sync="settings.authorSortDesc" :items="authorSortItems" class="w-36 sm:w-44 md:w-48 h-7.5 ml-1 sm:ml-4" @change="updateAuthorSort" />
 | 
			
		||||
      </template>
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
@ -183,6 +186,30 @@ export default {
 | 
			
		||||
        }
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    authorSortItems() {
 | 
			
		||||
      return [
 | 
			
		||||
        {
 | 
			
		||||
          text: this.$strings.LabelAuthorFirstLast,
 | 
			
		||||
          value: 'name'
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          text: this.$strings.LabelAuthorLastFirst,
 | 
			
		||||
          value: 'lastFirst'
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          text: this.$strings.LabelNumberOfBooks,
 | 
			
		||||
          value: 'numBooks'
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          text: this.$strings.LabelAddedAt,
 | 
			
		||||
          value: 'addedAt'
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          text: this.$strings.LabelUpdatedAt,
 | 
			
		||||
          value: 'updatedAt'
 | 
			
		||||
        }
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    userIsAdminOrUp() {
 | 
			
		||||
      return this.$store.getters['user/getIsAdminOrUp']
 | 
			
		||||
    },
 | 
			
		||||
@ -455,6 +482,9 @@ export default {
 | 
			
		||||
    updateCollapseBookSeries() {
 | 
			
		||||
      this.saveSettings()
 | 
			
		||||
    },
 | 
			
		||||
    updateAuthorSort() {
 | 
			
		||||
      this.saveSettings()
 | 
			
		||||
    },
 | 
			
		||||
    saveSettings() {
 | 
			
		||||
      this.$store.dispatch('user/updateUserSettings', this.settings)
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,7 @@
 | 
			
		||||
    <app-book-shelf-toolbar page="authors" is-home :authors="authors" />
 | 
			
		||||
    <div id="bookshelf" class="w-full h-full p-8 overflow-y-auto">
 | 
			
		||||
      <div class="flex flex-wrap justify-center">
 | 
			
		||||
        <template v-for="author in authors">
 | 
			
		||||
        <template v-for="author in authorsSorted">
 | 
			
		||||
          <cards-author-card :key="author.id" :author="author" :width="160" :height="200" class="p-3" @edit="editAuthor" />
 | 
			
		||||
        </template>
 | 
			
		||||
      </div>
 | 
			
		||||
@ -44,6 +44,22 @@ export default {
 | 
			
		||||
    },
 | 
			
		||||
    selectedAuthor() {
 | 
			
		||||
      return this.$store.state.globals.selectedAuthor
 | 
			
		||||
    },
 | 
			
		||||
    authorSortBy() {
 | 
			
		||||
      return this.$store.getters['user/getUserSetting']('authorSortBy') || 'name'
 | 
			
		||||
    },
 | 
			
		||||
    authorSortDesc() {
 | 
			
		||||
      return !!this.$store.getters['user/getUserSetting']('authorSortDesc')
 | 
			
		||||
    },
 | 
			
		||||
    authorsSorted() {
 | 
			
		||||
      const sortProp = this.authorSortBy
 | 
			
		||||
      const bDesc = this.authorSortDesc ? -1 : 1
 | 
			
		||||
      return this.authors.sort((a, b) => {
 | 
			
		||||
        if (typeof a[sortProp] === 'number' && typeof b[sortProp] === 'number') {
 | 
			
		||||
          return a[sortProp] > b[sortProp] ? bDesc : -bDesc
 | 
			
		||||
        }
 | 
			
		||||
        return a[sortProp].localeCompare(b[sortProp], undefined, { sensitivity: 'base' }) * bDesc
 | 
			
		||||
      })
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  methods: {
 | 
			
		||||
 | 
			
		||||
@ -11,7 +11,9 @@ export const state = () => ({
 | 
			
		||||
    useChapterTrack: false,
 | 
			
		||||
    seriesSortBy: 'name',
 | 
			
		||||
    seriesSortDesc: false,
 | 
			
		||||
    seriesFilterBy: 'all'
 | 
			
		||||
    seriesFilterBy: 'all',
 | 
			
		||||
    authorSortBy: 'name',
 | 
			
		||||
    authorSortDesc: false
 | 
			
		||||
  }
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -660,6 +660,7 @@ class LibraryController {
 | 
			
		||||
    for (const author of authors) {
 | 
			
		||||
      const oldAuthor = author.getOldAuthor().toJSON()
 | 
			
		||||
      oldAuthor.numBooks = author.books.length
 | 
			
		||||
      oldAuthor.lastFirst = author.lastFirst
 | 
			
		||||
      oldAuthors.push(oldAuthor)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user