diff --git a/src/components/board/SharingTabSidebar.vue b/src/components/board/SharingTabSidebar.vue
index c2df4ad98..d5b89ae4f 100644
--- a/src/components/board/SharingTabSidebar.vue
+++ b/src/components/board/SharingTabSidebar.vue
@@ -7,10 +7,19 @@
:options="formatedSharees"
:user-select="true"
label="displayName"
+ :loading="isLoading || !!isSearching"
+ :disabled="isLoading"
track-by="multiselectKey"
:internal-search="true"
@input="clickAddAcl"
- @search-change="asyncFind" />
+ @search-change="asyncFind">
+
+ {{ isSearching ? t('deck', 'Searching for users, groups and circles ...') : t('deck', 'No participants found') }}
+
+
+ {{ isSearching ? t('deck', 'Searching for users, groups and circles ...') : t('deck', 'No participants found') }}
+
+
{
- this.isLoading = false
- })
+ async asyncFind(query) {
+ // manual debounce to handle async searching more easily and have more control over the loading state
+ const timestamp = (new Date()).getTime()
+ if (!this.isSearching || timestamp > this.isSearching + 300) {
+ this.isSearching = timestamp
+ await this.$store.dispatch('loadSharees', query)
+
+ // only reset searching flag if the most recent search finished
+ if (this.isSearching === timestamp) {
+ this.isSearching = false
+ }
+ }
},
- clickAddAcl() {
+ async clickAddAcl() {
this.addAclForAPI = {
type: this.addAcl.value.shareType,
participant: this.addAcl.value.shareWith,
@@ -151,7 +169,16 @@ export default {
permissionShare: false,
permissionManage: false,
}
- this.$store.dispatch('addAclToCurrentBoard', this.addAclForAPI)
+ this.isLoading = true
+ try {
+ await this.$store.dispatch('addAclToCurrentBoard', this.addAclForAPI)
+ } catch (e) {
+ const errorMessage = t('deck', 'Failed to create share with {displayName}', { displayName: this.addAcl.displayName })
+ console.error(errorMessage, e)
+ showError(errorMessage)
+ }
+ this.addAcl = null
+ this.isLoading = false
},
clickEditAcl(acl) {
this.addAclForAPI = Object.assign({}, acl)
diff --git a/src/store/main.js b/src/store/main.js
index dc25160ab..76f1b45fa 100644
--- a/src/store/main.js
+++ b/src/store/main.js
@@ -34,7 +34,6 @@ import comment from './comment'
import trashbin from './trashbin'
import attachment from './attachment'
import overview from './overview'
-import debounce from 'lodash/debounce'
Vue.use(Vuex)
const apiClient = new BoardApi()
@@ -392,7 +391,7 @@ export default new Vuex.Store({
const boards = await apiClient.loadBoards()
commit('setBoards', boards)
},
- loadSharees: debounce(function({ commit }, query) {
+ async loadSharees({ commit }, query) {
const params = new URLSearchParams()
if (typeof query === 'undefined') {
return
@@ -402,10 +401,9 @@ export default new Vuex.Store({
params.append('perPage', 20)
params.append('itemType', [0, 1, 7])
- axios.get(generateOcsUrl('apps/files_sharing/api/v1') + 'sharees', { params }).then((response) => {
- commit('setSharees', response.data.ocs.data)
- })
- }, 250),
+ const response = await axios.get(generateOcsUrl('apps/files_sharing/api/v1') + 'sharees', { params })
+ commit('setSharees', response.data.ocs.data)
+ },
setBoardFilter({ commmit }, filter) {
commmit('setBoardFilter', filter)
@@ -454,13 +452,11 @@ export default new Vuex.Store({
},
// acl actions
- addAclToCurrentBoard({ dispatch, commit }, newAcl) {
+ async addAclToCurrentBoard({ dispatch, commit }, newAcl) {
newAcl.boardId = this.state.currentBoard.id
- apiClient.addAcl(newAcl)
- .then((returnAcl) => {
- commit('addAclToCurrentBoard', returnAcl)
- dispatch('refreshBoard', newAcl.boardId)
- })
+ const result = await apiClient.addAcl(newAcl)
+ commit('addAclToCurrentBoard', result)
+ dispatch('refreshBoard', newAcl.boardId)
},
updateAclFromCurrentBoard({ commit }, acl) {
acl.boardId = this.state.currentBoard.id