mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2024-12-20 19:06:06 +01:00
feat: add support for inverting the selection on libraries and tags
This commit is contained in:
parent
7685ead000
commit
0387436111
@ -6,7 +6,7 @@
|
||||
</div>
|
||||
</template>
|
||||
<form @submit.prevent="submitForm">
|
||||
<div class="px-4 w-full text-sm py-6 rounded-lg bg-bg shadow-lg border border-black-300">
|
||||
<div class="px-4 w-full text-sm py-6 rounded-lg bg-bg shadow-lg border border-black-300 overflow-y-auto overflow-x-hidden" style="min-height: 400px; max-height: 80vh">
|
||||
<div class="w-full p-8">
|
||||
<div class="flex py-2">
|
||||
<div class="w-1/2 px-2">
|
||||
@ -96,7 +96,14 @@
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="!newUser.permissions.accessAllTags" class="my-4">
|
||||
<ui-multi-select-dropdown v-model="newUser.itemTagsAccessible" :items="itemTags" :label="$strings.LabelTagsAccessibleToUser" />
|
||||
<div class="flex items-center">
|
||||
<ui-multi-select-dropdown v-model="newUser.itemTagsSelected" :items="itemTags" :label="tagsSelectionText" />
|
||||
<div class="flex items-center pt-4 px-2">
|
||||
<p class="px-3 font-semibold" id="selected-tags-not-accessible--permissions-toggle">{{ $strings.LabelInvert }}</p>
|
||||
<ui-toggle-switch labeledBy="selected-tags-not-accessible--permissions-toggle" v-model="newUser.permissions.selectedTagsNotAccessible" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -185,6 +192,9 @@ export default {
|
||||
value: t
|
||||
}
|
||||
})
|
||||
},
|
||||
tagsSelectionText() {
|
||||
return this.newUser.permissions.selectedTagsNotAccessible ? this.$strings.LabelTagsNotAccessibleToUser : this.$strings.LabelTagsAccessibleToUser
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
@ -193,8 +203,11 @@ export default {
|
||||
if (this.$refs.modal) this.$refs.modal.setHide()
|
||||
},
|
||||
accessAllTagsToggled(val) {
|
||||
if (val && this.newUser.itemTagsAccessible.length) {
|
||||
this.newUser.itemTagsAccessible = []
|
||||
if (val) {
|
||||
if (this.newUser.itemTagsSelected?.length) {
|
||||
this.newUser.itemTagsSelected = []
|
||||
}
|
||||
this.newUser.permissions.selectedTagsNotAccessible = false
|
||||
}
|
||||
},
|
||||
fetchAllTags() {
|
||||
@ -226,7 +239,7 @@ export default {
|
||||
this.$toast.error('Must select at least one library')
|
||||
return
|
||||
}
|
||||
if (!this.newUser.permissions.accessAllTags && !this.newUser.itemTagsAccessible.length) {
|
||||
if (!this.newUser.permissions.accessAllTags && !this.newUser.itemTagsSelected.length) {
|
||||
this.$toast.error('Must select at least one tag')
|
||||
return
|
||||
}
|
||||
@ -307,12 +320,12 @@ export default {
|
||||
delete: type === 'admin',
|
||||
upload: type === 'admin',
|
||||
accessAllLibraries: true,
|
||||
accessAllTags: true
|
||||
accessAllTags: true,
|
||||
selectedTagsNotAccessible: false
|
||||
}
|
||||
},
|
||||
init() {
|
||||
this.fetchAllTags()
|
||||
|
||||
this.isNew = !this.account
|
||||
if (this.account) {
|
||||
this.newUser = {
|
||||
@ -322,9 +335,10 @@ export default {
|
||||
isActive: this.account.isActive,
|
||||
permissions: { ...this.account.permissions },
|
||||
librariesAccessible: [...(this.account.librariesAccessible || [])],
|
||||
itemTagsAccessible: [...(this.account.itemTagsAccessible || [])]
|
||||
itemTagsSelected: [...(this.account.itemTagsSelected || [])]
|
||||
}
|
||||
} else {
|
||||
this.fetchAllTags()
|
||||
this.newUser = {
|
||||
username: null,
|
||||
password: null,
|
||||
@ -336,7 +350,8 @@ export default {
|
||||
delete: false,
|
||||
upload: false,
|
||||
accessAllLibraries: true,
|
||||
accessAllTags: true
|
||||
accessAllTags: true,
|
||||
selectedTagsNotAccessible: false
|
||||
},
|
||||
librariesAccessible: []
|
||||
}
|
||||
|
@ -254,6 +254,7 @@
|
||||
"LabelIntervalEveryDay": "Jeden Tag",
|
||||
"LabelIntervalEveryHour": "Jede Stunde",
|
||||
"LabelInvalidParts": "Ungültige Teile",
|
||||
"LabelInvert": "Invert",
|
||||
"LabelItem": "Medium",
|
||||
"LabelLanguage": "Sprache",
|
||||
"LabelLanguageDefaultServer": "Standard-Server-Sprache",
|
||||
@ -412,6 +413,7 @@
|
||||
"LabelTag": "Schlagwort",
|
||||
"LabelTags": "Schlagwörter",
|
||||
"LabelTagsAccessibleToUser": "Für Benutzer zugängliche Schlagwörter",
|
||||
"LabelTagsNotAccessibleToUser": "Tags not Accessible to User",
|
||||
"LabelTasks": "Laufende Aufgaben",
|
||||
"LabelTimeBase": "Basiszeit",
|
||||
"LabelTimeListened": "Gehörte Zeit",
|
||||
|
@ -254,6 +254,7 @@
|
||||
"LabelIntervalEveryDay": "Every day",
|
||||
"LabelIntervalEveryHour": "Every hour",
|
||||
"LabelInvalidParts": "Invalid Parts",
|
||||
"LabelInvert": "Invert",
|
||||
"LabelItem": "Item",
|
||||
"LabelLanguage": "Language",
|
||||
"LabelLanguageDefaultServer": "Default Server Language",
|
||||
@ -412,6 +413,7 @@
|
||||
"LabelTag": "Tag",
|
||||
"LabelTags": "Tags",
|
||||
"LabelTagsAccessibleToUser": "Tags Accessible to User",
|
||||
"LabelTagsNotAccessibleToUser": "Tags not Accessible to User",
|
||||
"LabelTasks": "Tasks Running",
|
||||
"LabelTimeBase": "Time Base",
|
||||
"LabelTimeListened": "Time Listened",
|
||||
|
@ -254,6 +254,7 @@
|
||||
"LabelIntervalEveryDay": "Cada Dia",
|
||||
"LabelIntervalEveryHour": "Cada Hora",
|
||||
"LabelInvalidParts": "Partes Invalidas",
|
||||
"LabelInvert": "Invert",
|
||||
"LabelItem": "Elemento",
|
||||
"LabelLanguage": "Lenguaje",
|
||||
"LabelLanguageDefaultServer": "Lenguaje Predeterminado del Servidor",
|
||||
@ -412,6 +413,7 @@
|
||||
"LabelTag": "Etiqueta",
|
||||
"LabelTags": "Etiquetas",
|
||||
"LabelTagsAccessibleToUser": "Etiquetas Accessible para el Usuario",
|
||||
"LabelTagsNotAccessibleToUser": "Tags not Accessible to User",
|
||||
"LabelTasks": "Tareas Corriendo",
|
||||
"LabelTimeBase": "Time Base",
|
||||
"LabelTimeListened": "Tiempo Escuchando",
|
||||
|
@ -254,6 +254,7 @@
|
||||
"LabelIntervalEveryDay": "Tous les jours",
|
||||
"LabelIntervalEveryHour": "Toutes les heures",
|
||||
"LabelInvalidParts": "Parties invalides",
|
||||
"LabelInvert": "Invert",
|
||||
"LabelItem": "Article",
|
||||
"LabelLanguage": "Langue",
|
||||
"LabelLanguageDefaultServer": "Langue par défaut",
|
||||
@ -412,6 +413,7 @@
|
||||
"LabelTag": "Étiquette",
|
||||
"LabelTags": "Étiquettes",
|
||||
"LabelTagsAccessibleToUser": "Étiquettes accessibles à l’utilisateur",
|
||||
"LabelTagsNotAccessibleToUser": "Tags not Accessible to User",
|
||||
"LabelTasks": "Tâches en cours",
|
||||
"LabelTimeBase": "Base de temps",
|
||||
"LabelTimeListened": "Temps d’écoute",
|
||||
|
@ -254,6 +254,7 @@
|
||||
"LabelIntervalEveryDay": "Every day",
|
||||
"LabelIntervalEveryHour": "Every hour",
|
||||
"LabelInvalidParts": "Invalid Parts",
|
||||
"LabelInvert": "Invert",
|
||||
"LabelItem": "Item",
|
||||
"LabelLanguage": "Language",
|
||||
"LabelLanguageDefaultServer": "Default Server Language",
|
||||
@ -412,6 +413,7 @@
|
||||
"LabelTag": "Tag",
|
||||
"LabelTags": "Tags",
|
||||
"LabelTagsAccessibleToUser": "Tags Accessible to User",
|
||||
"LabelTagsNotAccessibleToUser": "Tags not Accessible to User",
|
||||
"LabelTasks": "Tasks Running",
|
||||
"LabelTimeBase": "Time Base",
|
||||
"LabelTimeListened": "Time Listened",
|
||||
|
@ -254,6 +254,7 @@
|
||||
"LabelIntervalEveryDay": "Every day",
|
||||
"LabelIntervalEveryHour": "Every hour",
|
||||
"LabelInvalidParts": "Invalid Parts",
|
||||
"LabelInvert": "Invert",
|
||||
"LabelItem": "Item",
|
||||
"LabelLanguage": "Language",
|
||||
"LabelLanguageDefaultServer": "Default Server Language",
|
||||
@ -412,6 +413,7 @@
|
||||
"LabelTag": "Tag",
|
||||
"LabelTags": "Tags",
|
||||
"LabelTagsAccessibleToUser": "Tags Accessible to User",
|
||||
"LabelTagsNotAccessibleToUser": "Tags not Accessible to User",
|
||||
"LabelTasks": "Tasks Running",
|
||||
"LabelTimeBase": "Time Base",
|
||||
"LabelTimeListened": "Time Listened",
|
||||
|
@ -254,6 +254,7 @@
|
||||
"LabelIntervalEveryDay": "Every day",
|
||||
"LabelIntervalEveryHour": "Every hour",
|
||||
"LabelInvalidParts": "Nevaljajuči dijelovi",
|
||||
"LabelInvert": "Invert",
|
||||
"LabelItem": "Stavka",
|
||||
"LabelLanguage": "Jezik",
|
||||
"LabelLanguageDefaultServer": "Default jezik servera",
|
||||
@ -412,6 +413,7 @@
|
||||
"LabelTag": "Tag",
|
||||
"LabelTags": "Tags",
|
||||
"LabelTagsAccessibleToUser": "Tags dostupni korisniku",
|
||||
"LabelTagsNotAccessibleToUser": "Tags not Accessible to User",
|
||||
"LabelTasks": "Tasks Running",
|
||||
"LabelTimeBase": "Time Base",
|
||||
"LabelTimeListened": "Vremena odslušano",
|
||||
|
@ -254,6 +254,7 @@
|
||||
"LabelIntervalEveryDay": "Ogni Giorno",
|
||||
"LabelIntervalEveryHour": "Ogni ora",
|
||||
"LabelInvalidParts": "Parti Invalide",
|
||||
"LabelInvert": "Invert",
|
||||
"LabelItem": "Oggetti",
|
||||
"LabelLanguage": "Lingua",
|
||||
"LabelLanguageDefaultServer": "Lingua di Default",
|
||||
@ -412,6 +413,7 @@
|
||||
"LabelTag": "Tag",
|
||||
"LabelTags": "Tags",
|
||||
"LabelTagsAccessibleToUser": "Tags permessi agli Utenti",
|
||||
"LabelTagsNotAccessibleToUser": "Tags not Accessible to User",
|
||||
"LabelTasks": "Processi in esecuzione",
|
||||
"LabelTimeBase": "Time Base",
|
||||
"LabelTimeListened": "Tempo di Ascolto",
|
||||
|
@ -254,6 +254,7 @@
|
||||
"LabelIntervalEveryDay": "Każdego dnia",
|
||||
"LabelIntervalEveryHour": "Każdej godziny",
|
||||
"LabelInvalidParts": "Nieprawidłowe części",
|
||||
"LabelInvert": "Invert",
|
||||
"LabelItem": "Pozycja",
|
||||
"LabelLanguage": "Język",
|
||||
"LabelLanguageDefaultServer": "Domyślny język serwera",
|
||||
@ -412,6 +413,7 @@
|
||||
"LabelTag": "Tag",
|
||||
"LabelTags": "Tagi",
|
||||
"LabelTagsAccessibleToUser": "Tagi dostępne dla użytkownika",
|
||||
"LabelTagsNotAccessibleToUser": "Tags not Accessible to User",
|
||||
"LabelTasks": "Tasks Running",
|
||||
"LabelTimeBase": "Time Base",
|
||||
"LabelTimeListened": "Czas odtwarzania",
|
||||
|
@ -254,6 +254,7 @@
|
||||
"LabelIntervalEveryDay": "Каждый день",
|
||||
"LabelIntervalEveryHour": "Каждый час",
|
||||
"LabelInvalidParts": "Неверные части",
|
||||
"LabelInvert": "Invert",
|
||||
"LabelItem": "Элемент",
|
||||
"LabelLanguage": "Язык",
|
||||
"LabelLanguageDefaultServer": "Язык сервера по умолчанию",
|
||||
@ -412,6 +413,7 @@
|
||||
"LabelTag": "Тег",
|
||||
"LabelTags": "Теги",
|
||||
"LabelTagsAccessibleToUser": "Теги доступные для пользователя",
|
||||
"LabelTagsNotAccessibleToUser": "Tags not Accessible to User",
|
||||
"LabelTasks": "Запущенные задачи",
|
||||
"LabelTimeBase": "Time Base",
|
||||
"LabelTimeListened": "Время прослушивания",
|
||||
|
@ -254,6 +254,7 @@
|
||||
"LabelIntervalEveryDay": "每天",
|
||||
"LabelIntervalEveryHour": "每小时",
|
||||
"LabelInvalidParts": "无效部件",
|
||||
"LabelInvert": "Invert",
|
||||
"LabelItem": "项目",
|
||||
"LabelLanguage": "语言",
|
||||
"LabelLanguageDefaultServer": "默认服务器语言",
|
||||
@ -412,6 +413,7 @@
|
||||
"LabelTag": "标签",
|
||||
"LabelTags": "标签",
|
||||
"LabelTagsAccessibleToUser": "用户可访问的标签",
|
||||
"LabelTagsNotAccessibleToUser": "Tags not Accessible to User",
|
||||
"LabelTasks": "正在运行的任务",
|
||||
"LabelTimeBase": "Time Base",
|
||||
"LabelTimeListened": "收听时间",
|
||||
|
@ -20,7 +20,7 @@ class User {
|
||||
|
||||
this.permissions = {}
|
||||
this.librariesAccessible = [] // Library IDs (Empty if ALL libraries)
|
||||
this.itemTagsAccessible = [] // Empty if ALL item tags accessible
|
||||
this.itemTagsSelected = [] // Empty if ALL item tags accessible
|
||||
|
||||
if (user) {
|
||||
this.construct(user)
|
||||
@ -86,7 +86,7 @@ class User {
|
||||
createdAt: this.createdAt,
|
||||
permissions: this.permissions,
|
||||
librariesAccessible: [...this.librariesAccessible],
|
||||
itemTagsAccessible: [...this.itemTagsAccessible]
|
||||
itemTagsSelected: [...this.itemTagsSelected]
|
||||
}
|
||||
}
|
||||
|
||||
@ -105,7 +105,7 @@ class User {
|
||||
createdAt: this.createdAt,
|
||||
permissions: this.permissions,
|
||||
librariesAccessible: [...this.librariesAccessible],
|
||||
itemTagsAccessible: [...this.itemTagsAccessible]
|
||||
itemTagsSelected: [...this.itemTagsSelected]
|
||||
}
|
||||
if (minimal) {
|
||||
delete json.mediaProgress
|
||||
@ -169,9 +169,15 @@ class User {
|
||||
if (this.permissions.accessAllTags === undefined) this.permissions.accessAllTags = true
|
||||
// Explicit content restriction permission added v2.0.18
|
||||
if (this.permissions.accessExplicitContent === undefined) this.permissions.accessExplicitContent = true
|
||||
// itemTagsAccessible was renamed to itemTagsSelected in version v2.x
|
||||
if (this.itemTagsAccessible) {
|
||||
this.permissions.selectedTagsNotAccessible = false
|
||||
this.itemTagsSelected = this.itemTagsAccessible
|
||||
this.itemTagsAccessible = undefined
|
||||
}
|
||||
|
||||
this.librariesAccessible = [...(user.librariesAccessible || [])]
|
||||
this.itemTagsAccessible = [...(user.itemTagsAccessible || [])]
|
||||
this.itemTagsSelected = [...(user.itemTagsSelected || [])]
|
||||
}
|
||||
|
||||
update(payload) {
|
||||
@ -228,19 +234,21 @@ class User {
|
||||
// Update accessible tags
|
||||
if (this.permissions.accessAllTags) {
|
||||
// Access all tags
|
||||
if (this.itemTagsAccessible.length) {
|
||||
this.itemTagsAccessible = []
|
||||
if (this.itemTagsSelected.length) {
|
||||
this.itemTagsSelected = []
|
||||
this.permissions.selectedTagsNotAccessible = false
|
||||
hasUpdates = true
|
||||
}
|
||||
} else if (payload.itemTagsAccessible !== undefined) {
|
||||
if (payload.itemTagsAccessible.length) {
|
||||
if (payload.itemTagsAccessible.join(',') !== this.itemTagsAccessible.join(',')) {
|
||||
} else if (payload.itemTagsSelected !== undefined) {
|
||||
if (payload.itemTagsSelected.length) {
|
||||
if (payload.itemTagsSelected.join(',') !== this.itemTagsSelected.join(',')) {
|
||||
hasUpdates = true
|
||||
this.itemTagsAccessible = [...payload.itemTagsAccessible]
|
||||
this.itemTagsSelected = [...payload.itemTagsSelected]
|
||||
}
|
||||
} else if (this.itemTagsAccessible.length > 0) {
|
||||
} else if (this.itemTagsSelected.length > 0) {
|
||||
hasUpdates = true
|
||||
this.itemTagsAccessible = []
|
||||
this.itemTagsSelected = []
|
||||
this.permissions.selectedTagsNotAccessible = false
|
||||
}
|
||||
}
|
||||
return hasUpdates
|
||||
@ -343,8 +351,12 @@ class User {
|
||||
|
||||
checkCanAccessLibraryItemWithTags(tags) {
|
||||
if (this.permissions.accessAllTags) return true
|
||||
if (this.permissions.selectedTagsNotAccessible) {
|
||||
if (!tags || !tags.length) return true
|
||||
return tags.every(tag => !this.itemTagsSelected.includes(tag))
|
||||
}
|
||||
if (!tags || !tags.length) return false
|
||||
return this.itemTagsAccessible.some(tag => tags.includes(tag))
|
||||
return this.itemTagsSelected.some(tag => tags.includes(tag))
|
||||
}
|
||||
|
||||
checkCanAccessLibraryItem(libraryItem) {
|
||||
|
Loading…
Reference in New Issue
Block a user