Skip to main content

UserRoleSelector

A searchable dropdown component for selecting users and community roles. Use this component when you need to let users pick one or more community members or roles, such as for assigning permissions, mentions, or task assignments.

The component fetches available users and roles from the Root SDK and displays them in collapsible, searchable sections. Selected items appear first in each section for easy visibility.

Installation

Add to your client's package.json:

{
"dependencies": {
"@rootsdk/client-app-ui": "^0.1.0",
"lit": "^3.2.1",
"lit-element": "^4.1.1"
}
}

The lit and lit-element packages are peer dependencies required by the component.

Import

import '@rootsdk/client-app-ui';

Basic usage

<rootsdk-user-role-selector></rootsdk-user-role-selector>

Events

The component dispatches a rootsdk-user-role-selector:selection-change CustomEvent whenever the selection changes. The event detail contains { selectedUserIds: string[], selectedRoleIds: string[] }.

Examples

Multi-select mode (default):

<rootsdk-user-role-selector
mode="multi"
></rootsdk-user-role-selector>

Single-select mode:

<rootsdk-user-role-selector
mode="single"
></rootsdk-user-role-selector>

Pre-selected values:

<rootsdk-user-role-selector
.selectedUserIds=${['user-123', 'user-456']}
.selectedRoleIds=${['role-admin']}
></rootsdk-user-role-selector>

Handling selection changes:

const selector = document.querySelector('rootsdk-user-role-selector');

selector.addEventListener('rootsdk-user-role-selector:selection-change', (event) => {
const { selectedUserIds, selectedRoleIds } = event.detail;
console.log('Selected users:', selectedUserIds);
console.log('Selected roles:', selectedRoleIds);
});

Using with Lit:

import { LitElement, html } from 'lit';
import { customElement, state } from 'lit/decorators.js';
import '@rootsdk/client-app-ui';

@customElement('my-app')
class MyApp extends LitElement {
@state() selectedUsers: string[] = [];
@state() selectedRoles: string[] = [];

handleSelectionChange(e: CustomEvent) {
this.selectedUsers = e.detail.selectedUserIds;
this.selectedRoles = e.detail.selectedRoleIds;
}

render() {
return html`
<rootsdk-user-role-selector
mode="multi"
.selectedUserIds=${this.selectedUsers}
.selectedRoleIds=${this.selectedRoles}
@rootsdk-user-role-selector:selection-change=${this.handleSelectionChange}
></rootsdk-user-role-selector>
`;
}
}

Using with React:

import { useEffect, useRef, useState } from 'react';
import '@rootsdk/client-app-ui';

function UserRoleSelector() {
const selectorRef = useRef<HTMLElement>(null);
const [selectedUsers, setSelectedUsers] = useState<string[]>([]);
const [selectedRoles, setSelectedRoles] = useState<string[]>([]);

useEffect(() => {
const selector = selectorRef.current;
if (!selector) return;

const handleChange = (e: CustomEvent) => {
setSelectedUsers(e.detail.selectedUserIds);
setSelectedRoles(e.detail.selectedRoleIds);
};

selector.addEventListener('rootsdk-user-role-selector:selection-change', handleChange);
return () => {
selector.removeEventListener('rootsdk-user-role-selector:selection-change', handleChange);
};
}, []);

return (
<rootsdk-user-role-selector
ref={selectorRef}
mode="multi"
/>
);
}

To set initial values in React, update the element properties after mounting:

useEffect(() => {
const selector = selectorRef.current;
if (!selector) return;

(selector as any).selectedUserIds = ['user-123'];
(selector as any).selectedRoleIds = ['role-admin'];
}, []);

Extends

  • LitElement

Constructors

Constructor

new UserRoleSelector(): UserRoleSelector

Returns

UserRoleSelector

Overrides

LitElement.constructor

Properties

mode

mode: "single" | "multi" = "multi"

The selection mode. Use "multi" (default) to allow selecting multiple users and roles simultaneously. Use "single" to allow only one selection at a time—selecting a user clears any selected role and vice versa.


selectedRoleIds

selectedRoleIds: string[] = []

Array of community role IDs that should appear as selected. Pass this prop to control the component's selection state.


selectedUserIds

selectedUserIds: string[] = []

Array of user IDs that should appear as selected. Pass this prop to control the component's selection state.


view

view: "both" | "roles" | "members" = "both"


styles

static styles: CSSResult[]

The component's styles defined using Lit's CSS tagged template literal. These styles are scoped to the component using Shadow DOM.

Overrides

LitElement.styles

Methods

connectedCallback()

connectedCallback(): Promise<void>

Initializes the component by fetching available community roles and suggested user profiles from the Root SDK bridge.

Returns

Promise<void>

Overrides

LitElement.connectedCallback


disconnectedCallback()

disconnectedCallback(): void

Cleans up the component when removed from the DOM.

Returns

void

Overrides

LitElement.disconnectedCallback


render()

render(): TemplateResult<1>

Renders the search input and virtualized list of users and roles.

Returns

TemplateResult<1>

Overrides

LitElement.render