mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-27 11:18:14 +01:00 
			
		
		
		
	Merge pull request #1686 from divyangbw/feat-user-access-by-tag-enhancement
Invert Tag Selection
This commit is contained in:
		
						commit
						6f67c7bfa2
					
				| @ -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,14 @@ 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.2.20
 | ||||
|     if (user.itemTagsAccessible?.length) { | ||||
|       this.permissions.selectedTagsNotAccessible = false | ||||
|       user.itemTagsSelected = user.itemTagsAccessible | ||||
|     } | ||||
| 
 | ||||
|     this.librariesAccessible = [...(user.librariesAccessible || [])] | ||||
|     this.itemTagsAccessible = [...(user.itemTagsAccessible || [])] | ||||
|     this.itemTagsSelected = [...(user.itemTagsSelected || [])] | ||||
|   } | ||||
| 
 | ||||
|   update(payload) { | ||||
| @ -228,19 +233,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 +350,12 @@ class User { | ||||
| 
 | ||||
|   checkCanAccessLibraryItemWithTags(tags) { | ||||
|     if (this.permissions.accessAllTags) return true | ||||
|     if (!tags || !tags.length) return false | ||||
|     return this.itemTagsAccessible.some(tag => tags.includes(tag)) | ||||
|     if (this.permissions.selectedTagsNotAccessible) { | ||||
|       if (!tags?.length) return true | ||||
|       return tags.every(tag => !this.itemTagsSelected.includes(tag)) | ||||
|     } | ||||
|     if (!tags?.length) return false | ||||
|     return this.itemTagsSelected.some(tag => tags.includes(tag)) | ||||
|   } | ||||
| 
 | ||||
|   checkCanAccessLibraryItem(libraryItem) { | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user