diff --git a/.env.example b/.env.example
index 175dc68..6bd595a 100644
--- a/.env.example
+++ b/.env.example
@@ -10,7 +10,7 @@
PROJECT_NAME=jama
# Image version to run (set by build.sh, or use 'latest')
-JAMA_VERSION=0.9.81
+JAMA_VERSION=0.9.82
# App port — the host port Docker maps to the container
PORT=3000
diff --git a/backend/package.json b/backend/package.json
index c379b3e..e0cd5c0 100644
--- a/backend/package.json
+++ b/backend/package.json
@@ -1,6 +1,6 @@
{
"name": "jama-backend",
- "version": "0.9.81",
+ "version": "0.9.82",
"description": "TeamChat backend server",
"main": "src/index.js",
"scripts": {
diff --git a/build.sh b/build.sh
index 81a224e..53b6709 100644
--- a/build.sh
+++ b/build.sh
@@ -13,7 +13,7 @@
# ─────────────────────────────────────────────────────────────
set -euo pipefail
-VERSION="${1:-0.9.81}"
+VERSION="${1:-0.9.82}"
ACTION="${2:-}"
REGISTRY="${REGISTRY:-}"
IMAGE_NAME="jama"
diff --git a/frontend/package.json b/frontend/package.json
index d45ae84..6d9dbd5 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -1,6 +1,6 @@
{
"name": "jama-frontend",
- "version": "0.9.81",
+ "version": "0.9.82",
"private": true,
"scripts": {
"dev": "vite",
diff --git a/frontend/src/components/GroupInfoModal.jsx b/frontend/src/components/GroupInfoModal.jsx
index da3164a..a2cc08d 100644
--- a/frontend/src/components/GroupInfoModal.jsx
+++ b/frontend/src/components/GroupInfoModal.jsx
@@ -134,7 +134,7 @@ export default function GroupInfoModal({ group, onClose, onUpdated, onBack }) {
{canManage && (
-
setAddSearch(e.target.value)} />
+
setAddSearch(e.target.value)} />
{addResults.length > 0 && addSearch && (
{addResults.filter(u => !members.find(m => m.id === u.id)).map(u => (
diff --git a/frontend/src/components/MobileGroupManager.jsx b/frontend/src/components/MobileGroupManager.jsx
index ba4f030..fa53b28 100644
--- a/frontend/src/components/MobileGroupManager.jsx
+++ b/frontend/src/components/MobileGroupManager.jsx
@@ -33,7 +33,11 @@ function MembersScreen({ group, allUsers, onBack }) {
};
useEffect(() => { loadMembers(); }, [group.id]);
+ const [search, setSearch] = useState('');
const memberIds = new Set(members.map(m => m.id));
+ const filteredUsers = search.trim()
+ ? allUsers.filter(u => (u.display_name||u.name).toLowerCase().includes(search.toLowerCase()))
+ : allUsers;
const toggle = async (user) => {
const nowMember = memberIds.has(user.id);
@@ -62,8 +66,21 @@ function MembersScreen({ group, allUsers, onBack }) {
Loading…
) : (
-
All Users
- {allUsers.map(u => {
+
+
+
+ setSearch(e.target.value)}
+ placeholder="Search users…"
+ autoComplete="off" autoCorrect="off" autoCapitalize="off" spellCheck={false}
+ style={{width:'100%',padding:'8px 10px 8px 32px',border:'1px solid var(--border)',borderRadius:'var(--radius)',background:'var(--background)',color:'var(--text-primary)',fontSize:14,boxSizing:'border-box'}}
+ />
+
+
+
+ {search ? `${filteredUsers.length} result${filteredUsers.length!==1?'s':''}` : 'All Users'}
+
+ {filteredUsers.map(u => {
const isMember = memberIds.has(u.id);
return (
@@ -129,7 +146,7 @@ function MultiGroupDmsScreen({ userGroups, onBack }) {
/>
{creating && (
-
setNewName(e.target.value)} placeholder="DM name…" style={{ width:'100%',padding:'9px 12px',border:'1px solid var(--border)',borderRadius:'var(--radius)',background:'var(--background)',color:'var(--text-primary)',fontSize:15,marginBottom:10,boxSizing:'border-box' }}/>
+
setNewName(e.target.value)} placeholder="DM name…" autoComplete="off" autoCorrect="off" autoCapitalize="off" spellCheck={false} style={{ width:'100%',padding:'9px 12px',border:'1px solid var(--border)',borderRadius:'var(--radius)',background:'var(--background)',color:'var(--text-primary)',fontSize:15,marginBottom:10,boxSizing:'border-box' }}/>
Select groups (min 2):
{userGroups.map(g=>(