Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 25 additions & 1 deletion src/components/EntityPicker/EntityBubble.vue
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
class="entity-picker__bubble"
:margin="0"
:size="22"
:display-name="label">
:display-name="label"
:user="shareType === ShareType.User ? user : undefined">
<template #name>
<a
href="#"
Expand All @@ -19,6 +20,7 @@
</template>

<script>
import { ShareType } from '@nextcloud/sharing'
import { NcUserBubble as UserBubble } from '@nextcloud/vue'

export default {
Expand Down Expand Up @@ -52,6 +54,28 @@ export default {
type: String,
required: true,
},

/**
* Share type of the entity. e.g user, group, email, remote...
*/
shareType: {
type: Number,
default: undefined,
},

/**
* User identifier (for user-type entities)
*/
user: {
type: String,
default: undefined,
},
},

setup() {
return {
ShareType,
}
},

methods: {
Expand Down
9 changes: 8 additions & 1 deletion src/components/EntityPicker/EntitySearchResult.vue
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
class="entity-picker__bubble"
:class="{ 'entity-picker__bubble--selected': isSelected }"
:display-name="source.label"
:user="source.user"
:user="source.shareType === ShareType.User ? source.user : undefined"
:margin="6"
:size="44"
url="#"
Expand All @@ -25,6 +25,7 @@
</template>

<script>
import { ShareType } from '@nextcloud/sharing'
import { NcUserBubble as UserBubble } from '@nextcloud/vue'

export default {
Expand Down Expand Up @@ -53,6 +54,12 @@ export default {
},
},

setup() {
return {
ShareType,
}
},

computed: {
isSelected() {
return this.source.id in this.selection
Expand Down
4 changes: 2 additions & 2 deletions src/components/MemberList/MemberList.vue
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ export default defineComponent({
this.pickerLoading = true

try {
const results = await getSuggestions(term)
const results = await getSuggestions(term, this.circle)
this.pickerData = results
} catch (error) {
console.error('Unable to get the results', error)
Expand Down Expand Up @@ -241,7 +241,7 @@ export default defineComponent({
},

async onGuestCreated(guest) {
const results = await getSuggestions(guest.username)
const results = await getSuggestions(guest.username, this.circle)
this.$refs.entityPicker.onClick(results[0])
},
},
Expand Down
14 changes: 7 additions & 7 deletions src/models/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -130,13 +130,13 @@ export const CIRCLES_MEMBER_GROUPING = [
share: ShareType.Group,
type: MEMBER_TYPE_GROUP,
},
// TODO: implement federated
// {
// id: `picker-${ShareType.Remote}`,
// label: t('contacts', 'federated users'),
// share: ShareType.Remote,
// type: MEMBER_TYPE_USER
// },
{
id: `picker-${ShareType.Remote}`,
label: t('contacts', 'federated users'),
labelStandalone: t('contacts', 'Federated users'),
share: ShareType.Remote,
type: MEMBER_TYPE_USER,
},
// {
// id: `picker-${ShareType.RemoteGroup}`,
// label: t('contacts', 'federated groups'),
Expand Down
28 changes: 23 additions & 5 deletions src/services/collaborationAutocompletion.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@

import axios from '@nextcloud/axios'
import { generateOcsUrl } from '@nextcloud/router'
import { SHARES_TYPES_MEMBER_MAP } from '../models/constants.ts'
import { ShareType } from '@nextcloud/sharing'
import { CircleConfigs, SHARES_TYPES_MEMBER_MAP } from '../models/constants.ts'

// generate allowed shareType from SHARES_TYPES_MEMBER_MAP
const shareType = Object.keys(SHARES_TYPES_MEMBER_MAP)
Expand All @@ -15,12 +16,13 @@ const maxAutocompleteResults = parseInt(window.OC.config['sharing.maxAutocomplet
* Get suggestions
*
* @param {string} search the search query
* @param {object|null} circle - the circle object
*/
export async function getSuggestions(search) {
export async function getSuggestions(search, circle = null) {
const request = await axios.get(generateOcsUrl('apps/files_sharing/api/v1/sharees'), {
params: {
format: 'json',
itemType: 'contacts',
itemType: 'teams',
search,
perPage: maxAutocompleteResults,
shareType,
Expand All @@ -33,8 +35,24 @@ export async function getSuggestions(search) {
data.exact = [] // removing exact from general results

// flatten array of arrays
const rawExactSuggestions = Object.values(exact).reduce((arr, elem) => arr.concat(elem), [])
const rawSuggestions = Object.values(data).reduce((arr, elem) => arr.concat(elem), [])
let rawExactSuggestions = Object.values(exact).reduce((arr, elem) => arr.concat(elem), [])
let rawSuggestions = Object.values(data).reduce((arr, elem) => arr.concat(elem), [])

// check if federation flag is enabled using bitwise AND on circle config
const isCircleFederated = circle ? (circle.config & CircleConfigs.FEDERATED) !== 0 : false
if (isCircleFederated) {
// remove results from untrusted remote servers
rawExactSuggestions = rawExactSuggestions
.filter((result) => !(result.value?.shareType === ShareType.Remote && result.value?.isTrustedServer === false))
rawSuggestions = rawSuggestions
.filter((result) => !(result.value?.shareType === ShareType.Remote && result.value?.isTrustedServer === false))
} else {
// remove all results from remote servers
rawExactSuggestions = rawExactSuggestions
.filter((result) => result.value?.shareType !== ShareType.Remote)
rawSuggestions = rawSuggestions
.filter((result) => result.value?.shareType !== ShareType.Remote)
}

// remove invalid data and format to user-select layout
const exactSuggestions = rawExactSuggestions
Expand Down
Loading