Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
4f5cdd1
Allow users to restrict user pickers to app users only. Default behav…
deanhannigan Jul 3, 2025
d665c11
Merge remote-tracking branch 'origin/master' into fix/user-picker-app…
deanhannigan Jul 3, 2025
e7c1f11
Lint :cry:
deanhannigan Jul 3, 2025
d461976
Merge remote-tracking branch 'origin/master' into fix/user-picker-app…
deanhannigan Jul 3, 2025
2408e39
Merge branch 'master' into fix/user-picker-app-limit
deanhannigan Jul 3, 2025
7764414
Merge branch 'master' into fix/user-picker-app-limit
deanhannigan Jul 3, 2025
15ca3ce
Merge branch 'master' into fix/user-picker-app-limit
melohagan Jul 7, 2025
2f01120
Merge branch 'master' into fix/user-picker-app-limit
deanhannigan Jul 9, 2025
0487afc
Merge branch 'master' into fix/user-picker-app-limit
deanhannigan Jul 10, 2025
123d07d
Feedback
deanhannigan Jul 10, 2025
0ad9301
Merge branch 'master' into fix/user-picker-app-limit
deanhannigan Jul 10, 2025
1258136
Merge branch 'master' into fix/user-picker-app-limit
deanhannigan Jul 16, 2025
59daafd
Merge branch 'master' into fix/user-picker-app-limit
deanhannigan Aug 6, 2025
e3a3c34
Merge remote-tracking branch 'origin/master' into fix/user-picker-app…
deanhannigan Sep 8, 2025
791b4ac
Merge branch 'master' into fix/user-picker-app-limit
deanhannigan Sep 16, 2025
2cba2e2
Merge branch 'master' into fix/user-picker-app-limit
deanhannigan Sep 17, 2025
9598c9e
Merge branch 'master' into fix/user-picker-app-limit
deanhannigan Oct 8, 2025
91bfab2
Change app users to workspace users
deanhannigan Oct 9, 2025
24f8ba5
Merge branch 'master' into fix/user-picker-app-limit
deanhannigan Oct 9, 2025
faab701
Merge branch 'master' into fix/user-picker-app-limit
melohagan Oct 10, 2025
ecfd2db
Merge branch 'master' into fix/user-picker-app-limit
melohagan Oct 10, 2025
7d558cb
Merge branch 'master' into fix/user-picker-app-limit
deanhannigan Oct 13, 2025
66d1d23
Merge branch 'master' into fix/user-picker-app-limit
deanhannigan Oct 14, 2025
a9bfd3f
Merge branch 'master' into fix/user-picker-app-limit
deanhannigan Oct 14, 2025
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
12 changes: 12 additions & 0 deletions packages/client/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -8375,6 +8375,12 @@
"key": "autocomplete",
"defaultValue": true
},
{
"type": "boolean",
"label": "Workspace users",
"key": "workspaceUsersOnly",
"defaultValue": false
},
{
"type": "boolean",
"label": "Disabled",
Expand Down Expand Up @@ -8491,6 +8497,12 @@
"key": "autocomplete",
"defaultValue": true
},
{
"type": "boolean",
"label": "Workspace users",
"key": "workspaceUsersOnly",
"defaultValue": false
},
{
"type": "boolean",
"label": "Disabled",
Expand Down
38 changes: 28 additions & 10 deletions packages/client/src/components/app/forms/RelationshipField.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,9 @@
type RelationshipFieldMetadata,
type Row,
type UIFieldValidationRule,
type DataFetchDatasource,
} from "@budibase/types"
import { fetchData, Utils } from "@budibase/frontend-core"
import { fetchData, Utils, Constants } from "@budibase/frontend-core"
import { getContext } from "svelte"
import Field from "./Field.svelte"
import type { FieldApi, FieldState } from "@/types"
Expand Down Expand Up @@ -48,6 +49,9 @@
export let tableId: string | undefined = undefined
export let defaultRows: Row[] | undefined = []

// Limit datasourceType "user" to app users only
export let workspaceUsersOnly: boolean | undefined = false

const { API } = getContext("sdk")

const dispatch = createEventDispatcher()
Expand All @@ -67,7 +71,7 @@
let loadingMissingOptions: boolean = false

// Reset the available options when our base filter changes
$: filter, (optionsMap = {})
$: filter, workspaceUsersOnly, (optionsMap = {})
// Determine if we can select multiple rows or not
$: multiselect =
multi ??
Expand All @@ -87,12 +91,17 @@
writable,
datasourceType,
migratedFilter,
linkedTableId
linkedTableId,
workspaceUsersOnly
)

// Attempt to determine the primary display field to use
$: tableDefinition = $fetch?.definition
$: primaryDisplayField = primaryDisplay || tableDefinition?.primaryDisplay
$: primaryDisplayField =
primaryDisplay ||
(tableDefinition && "primaryDisplay" in tableDefinition
? tableDefinition.primaryDisplay
: undefined)

// Build our options map
$: rows = $fetch?.rows || []
Expand Down Expand Up @@ -137,16 +146,17 @@
writable: boolean,
dsType: typeof datasourceType,
filter: UISearchFilter | undefined,
linkedTableId?: string
linkedTableId?: string,
workspaceUsersOnly?: boolean
) => {
const datasource =
const datasource: DataFetchDatasource =
dsType === "table"
? {
type: dsType,
tableId: linkedTableId!,
}
: {
type: dsType,
type: workspaceUsersOnly ? "table" : dsType,
tableId: InternalTable.USER_METADATA,
}
return fetchData({
Expand Down Expand Up @@ -200,6 +210,14 @@
optionsMap = optionsMap
}

const parseId = (id: string) => {
// Normalise app table users to the global format.
if (datasourceType === "user" && workspaceUsersOnly) {
return id.replace(`ro_${Constants.TableNames.USERS}_`, "")
}
return id
}

// Parses a row-like structure into a properly shaped option
const parseOption = (
option: string | BasicRelatedRow | Row,
Expand All @@ -219,21 +237,21 @@
// that
if (Object.keys(option).length === 2 && "primaryDisplay" in option) {
return {
_id: option._id,
_id: parseId(option._id),
primaryDisplay: ensureString(option.primaryDisplay),
}
}
// Otherwise use the primary display field specified
if (primaryDisplay) {
return {
_id: option._id,
_id: parseId(option._id),
primaryDisplay: ensureString(
option[primaryDisplay as keyof typeof option]
),
}
} else {
return {
_id: option._id,
_id: parseId(option._id),
primaryDisplay: option._id,
}
}
Expand Down
Loading