diff --git a/apps/files/js/dist/personal-settings.js b/apps/files/js/dist/personal-settings.js index 1e30ef09dabfa073f3641d1c606ffb274805a1c4..042ab81916ed71c5c4bac3bd856989a4f2287586 100644 Binary files a/apps/files/js/dist/personal-settings.js and b/apps/files/js/dist/personal-settings.js differ diff --git a/apps/files/js/dist/personal-settings.js.map b/apps/files/js/dist/personal-settings.js.map index db99c781316e05023efb5a741e5a1552045cba62..17486dbcec79b1e66b0564737827b4e160a08815 100644 Binary files a/apps/files/js/dist/personal-settings.js.map and b/apps/files/js/dist/personal-settings.js.map differ diff --git a/apps/files/js/dist/sidebar.js b/apps/files/js/dist/sidebar.js index c1704dab68058548ac36cc2127ce29cf26fe54f9..402c4003317527ca5919406d476281beb6f39156 100644 Binary files a/apps/files/js/dist/sidebar.js and b/apps/files/js/dist/sidebar.js differ diff --git a/apps/files/js/dist/sidebar.js.map b/apps/files/js/dist/sidebar.js.map index 937b255821537ce5ae440328c96bfd5508809cc0..b8d37c152bc4661ef2a2fbbaed6cc9bde12b7db5 100644 Binary files a/apps/files/js/dist/sidebar.js.map and b/apps/files/js/dist/sidebar.js.map differ diff --git a/apps/files/src/components/TransferOwnershipDialogue.vue b/apps/files/src/components/TransferOwnershipDialogue.vue index 01873536913205c77a2d607211ed8c2bffbb0d1a..8889d908716f5e4dd7e9b8e1f249322a204b3c5e 100644 --- a/apps/files/src/components/TransferOwnershipDialogue.vue +++ b/apps/files/src/components/TransferOwnershipDialogue.vue @@ -42,7 +42,20 @@ <div class="step-header"> {{ t('files', 'Target user') }} </div> - <input id="files-transfer-user" v-model="uid" type="text"> + <Multiselect + v-model="selectedUser" + :options="formatedUserSuggestions" + :multiple="false" + :searchable="true" + :placeholder="t('core', 'Target user …')" + :preselect-first="true" + :preserve-search="true" + :loading="loadingUsers" + track-by="user" + label="displayName" + :clear-on-select="false" + :user-select="true" + @search-change="findUserDebounced" /> </li> <li> <input type="submit" @@ -58,8 +71,11 @@ <script> import axios from '@nextcloud/axios' +import debounce from 'debounce' import { generateOcsUrl } from '@nextcloud/router' import { getFilePickerBuilder } from '@nextcloud/dialogs' +import { Multiselect } from 'nextcloud-vue/dist/Components/Multiselect' +import Vue from 'vue' import logger from '../logger' @@ -72,19 +88,37 @@ const picker = getFilePickerBuilder(t('files', 'Select directory to transfer')) export default { name: 'TransferOwnershipDialogue', + components: { + Multiselect + }, data() { return { directory: undefined, directoryPickerError: undefined, submitError: undefined, - uid: '' + loadingUsers: false, + selectedUser: null, + userSuggestions: {} } }, computed: { canSubmit() { - return !!this.directory && !!this.uid + return !!this.directory && !!this.selectedUser + }, + formatedUserSuggestions() { + return Object.keys(this.userSuggestions).map((uid) => { + const user = this.userSuggestions[uid] + return { + user: user.uid, + displayName: user.displayName, + icon: 'icon-user' + } + }) } }, + created() { + this.findUserDebounced = debounce(this.findUser, 300) + }, methods: { start() { this.directoryPickerError = undefined @@ -105,6 +139,41 @@ export default { this.directoryPickerError = error.message || t('files', 'Unknown error') }) }, + async findUser(query) { + this.query = query.trim() + + if (query.length < 3) { + return + } + + this.loadingUsers = true + try { + const response = await axios.get(generateOcsUrl('apps/files_sharing/api/v1') + 'sharees', { + params: { + format: 'json', + itemType: 'file', + search: query, + perPage: 20, + lookup: false + } + }) + + if (response.data.ocs.meta.statuscode !== 100) { + logger.error('Error fetching suggestions', { response }) + } + + response.data.ocs.data.users.forEach(user => { + Vue.set(this.userSuggestions, user.value.shareWith, { + uid: user.value.shareWith, + displayName: user.label + }) + }) + } catch (error) { + logger.error('could not fetch users', { error }) + } finally { + this.loadingUsers = false + } + }, submit() { if (!this.canSubmit) { logger.warn('ignoring form submit') @@ -113,7 +182,7 @@ export default { this.submitError = undefined const data = { path: this.directory, - recipient: this.uid + recipient: this.selectedUser.user } logger.debug('submit transfer ownership form', data) @@ -125,7 +194,7 @@ export default { logger.info('Transfer ownership request sent', { data }) this.directory = undefined - this.recipient = undefined + this.selectedUser = null OCP.Toast.success(t('files', 'Ownership transfer request sent')) }) .catch(error => {