From 7d2df7d72e879ebf8781c3950e0f8eee23229c1f Mon Sep 17 00:00:00 2001 From: Ferdinand Thiessen Date: Tue, 28 Nov 2023 20:23:45 +0100 Subject: [PATCH] enh(sharing): Move away from deprecated icon classes and allow to search user by email Signed-off-by: Ferdinand Thiessen --- .../SidebarTabs/SharingSearchDiv.vue | 34 +++++++++++-------- src/mixins/ShareTypes.js | 19 +++++++---- 2 files changed, 33 insertions(+), 20 deletions(-) diff --git a/src/components/SidebarTabs/SharingSearchDiv.vue b/src/components/SidebarTabs/SharingSearchDiv.vue index bfe21d71d..f82cc7ee8 100644 --- a/src/components/SidebarTabs/SharingSearchDiv.vue +++ b/src/components/SidebarTabs/SharingSearchDiv.vue @@ -232,15 +232,20 @@ export default { } }, + /** + * A OCS Sharee response + * @typedef {{label: string, shareWithDisplayNameUnique: string, value: { shareType: number, shareWith: string }, status?: unknown }} Sharee + */ + /** * Format search results * - * @param {object[]} results Results as returned by search - * @return {object[]} results as we use them on storage + * @param {Record} results Results as returned by search + * @return {Sharee[]} results as we use them on storage */ formatSearchResults(results) { // flatten array of arrays - const flatResults = Object.values(results).reduce((arr, elem) => arr.concat(elem), []) + const flatResults = Object.values(results).flat() return this.filterUnwantedShares(flatResults) .map(share => this.formatForMultiselect(share)) @@ -252,36 +257,35 @@ export default { * Remove static unwanted shares from search results * Existing shares must be done dynamically to account for new shares. * - * @param {object[]} shares the array of share objects - * @return {object[]} + * @param {Sharee[]} shares the array of share objects + * @return {Sharee[]} */ filterUnwantedShares(shares) { - return shares.reduce((arr, share) => { + return shares.filter((share) => { // only use proper objects if (typeof share !== 'object') { - return arr + return false } try { // filter out current user if (share.value.shareType === this.SHARE_TYPES.SHARE_TYPE_USER && share.value.shareWith === getCurrentUser().uid) { - return arr + return false } // All good, let's add the suggestion - arr.push(share) + return true } catch { - return arr + return false } - return arr - }, []) + }) }, /** * Format shares for the multiselect options * - * @param {object} share Share in search formatting + * @param {Sharee} share Share in search formatting * @return {object} Share in multiselect formatting */ formatForMultiselect(share) { @@ -290,8 +294,10 @@ export default { shareType: share.value.shareType, user: share.value.shareWith, isNoUser: share.value.shareType !== this.SHARE_TYPES.SHARE_TYPE_USER, + id: share.value.shareWith, displayName: share.label, - icon: this.shareTypeToIcon(share.value.shareType), + subname: share.shareWithDisplayNameUnique, + iconSvg: this.shareTypeToIcon(share.value.shareType), // Vue unique binding to render within Multiselect's AvatarSelectOption key: share.value.shareWith + '-' + share.value.shareType, } diff --git a/src/mixins/ShareTypes.js b/src/mixins/ShareTypes.js index d46f04d26..ac9e16969 100644 --- a/src/mixins/ShareTypes.js +++ b/src/mixins/ShareTypes.js @@ -19,6 +19,13 @@ * along with this program. If not, see . * */ +/* eslint-disable import/no-unresolved */ +import IconUserSvg from '@mdi/svg/svg/account.svg?raw' +import IconGroupSvg from '@mdi/svg/svg/account-group.svg?raw' +import IconMailSvg from '@mdi/svg/svg/email.svg?raw' +import IconChatSvg from '@mdi/svg/svg/chat.svg?raw' +import IconCircleSvg from '@mdi/svg/svg/circle-outline.svg?raw' +/* eslint-enable import/no-unresolved */ export default { data() { @@ -53,23 +60,23 @@ export default { * Default share is a user, other icons are here to differenciate from it, so let's not display the user icon. * * @param {number} type the share type - * @return {string} the icon class + * @return {string} the icon as raw svg */ shareTypeToIcon(type) { switch (type) { case this.SHARE_TYPES.SHARE_TYPE_GUEST: // case this.SHARE_TYPES.SHARE_TYPE_REMOTE: // case this.SHARE_TYPES.SHARE_TYPE_USER: - return 'icon-user' + return IconUserSvg case this.SHARE_TYPES.SHARE_TYPE_REMOTE_GROUP: case this.SHARE_TYPES.SHARE_TYPE_GROUP: - return 'icon-group' + return IconGroupSvg case this.SHARE_TYPES.SHARE_TYPE_EMAIL: - return 'icon-mail' + return IconMailSvg case this.SHARE_TYPES.SHARE_TYPE_CIRCLE: - return 'icon-circle' + return IconCircleSvg case this.SHARE_TYPES.SHARE_TYPE_ROOM: - return 'icon-room' + return IconChatSvg default: return ''