v0.9.37 bug fixes
This commit is contained in:
@@ -10,7 +10,7 @@
|
|||||||
PROJECT_NAME=jama
|
PROJECT_NAME=jama
|
||||||
|
|
||||||
# Image version to run (set by build.sh, or use 'latest')
|
# Image version to run (set by build.sh, or use 'latest')
|
||||||
JAMA_VERSION=0.9.36
|
JAMA_VERSION=0.9.37
|
||||||
|
|
||||||
# App port — the host port Docker maps to the container
|
# App port — the host port Docker maps to the container
|
||||||
PORT=3000
|
PORT=3000
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "jama-backend",
|
"name": "jama-backend",
|
||||||
"version": "0.9.36",
|
"version": "0.9.37",
|
||||||
"description": "TeamChat backend server",
|
"description": "TeamChat backend server",
|
||||||
"main": "src/index.js",
|
"main": "src/index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -320,6 +320,14 @@ function initDb() {
|
|||||||
db.exec("ALTER TABLE groups ADD COLUMN is_multi_group INTEGER NOT NULL DEFAULT 0");
|
db.exec("ALTER TABLE groups ADD COLUMN is_multi_group INTEGER NOT NULL DEFAULT 0");
|
||||||
console.log('[DB] Migration: added is_multi_group column to groups');
|
console.log('[DB] Migration: added is_multi_group column to groups');
|
||||||
} catch (e) { /* already exists */ }
|
} catch (e) { /* already exists */ }
|
||||||
|
// Back-fill feature_schedule_manager for installs that registered before this setting existed
|
||||||
|
try {
|
||||||
|
const appType = db.prepare("SELECT value FROM settings WHERE key = 'app_type'").get();
|
||||||
|
if (appType && appType.value === 'JAMA-Team') {
|
||||||
|
db.prepare("INSERT INTO settings (key, value) VALUES ('feature_schedule_manager', 'true') ON CONFLICT(key) DO UPDATE SET value = 'true' WHERE value = 'false'").run();
|
||||||
|
}
|
||||||
|
} catch(e) {}
|
||||||
|
|
||||||
// Back-fill is_multi_group for any existing multi-group DM groups
|
// Back-fill is_multi_group for any existing multi-group DM groups
|
||||||
try {
|
try {
|
||||||
db.exec("UPDATE groups SET is_multi_group = 1 WHERE id IN (SELECT dm_group_id FROM multi_group_dms WHERE dm_group_id IS NOT NULL)");
|
db.exec("UPDATE groups SET is_multi_group = 1 WHERE id IN (SELECT dm_group_id FROM multi_group_dms WHERE dm_group_id IS NOT NULL)");
|
||||||
|
|||||||
@@ -46,6 +46,13 @@ function getUserIdsForGroup(db, userGroupId) {
|
|||||||
return db.prepare('SELECT user_id FROM user_group_members WHERE user_group_id = ?').all(userGroupId).map(r => r.user_id);
|
return db.prepare('SELECT user_id FROM user_group_members WHERE user_group_id = ?').all(userGroupId).map(r => r.user_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ── Current user's group memberships (no admin required) ────────────────────────
|
||||||
|
router.get('/me', authMiddleware, (req, res) => {
|
||||||
|
const db = getDb();
|
||||||
|
const groupIds = db.prepare('SELECT user_group_id FROM user_group_members WHERE user_id = ?').all(req.user.id).map(r => r.user_group_id);
|
||||||
|
res.json({ groupIds });
|
||||||
|
});
|
||||||
|
|
||||||
// ── MULTI-GROUP DMs — must come before /:id ───────────────────────────────────
|
// ── MULTI-GROUP DMs — must come before /:id ───────────────────────────────────
|
||||||
|
|
||||||
router.get('/multigroup', authMiddleware, adminMiddleware, (req, res) => {
|
router.get('/multigroup', authMiddleware, adminMiddleware, (req, res) => {
|
||||||
|
|||||||
2
build.sh
2
build.sh
@@ -13,7 +13,7 @@
|
|||||||
# ─────────────────────────────────────────────────────────────
|
# ─────────────────────────────────────────────────────────────
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
VERSION="${1:-0.9.36}"
|
VERSION="${1:-0.9.37}"
|
||||||
ACTION="${2:-}"
|
ACTION="${2:-}"
|
||||||
REGISTRY="${REGISTRY:-}"
|
REGISTRY="${REGISTRY:-}"
|
||||||
IMAGE_NAME="jama"
|
IMAGE_NAME="jama"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "jama-frontend",
|
"name": "jama-frontend",
|
||||||
"version": "0.9.36",
|
"version": "0.9.37",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
|
|||||||
@@ -69,32 +69,30 @@ export default function Chat() {
|
|||||||
|
|
||||||
useEffect(() => { loadGroups(); }, [loadGroups]);
|
useEffect(() => { loadGroups(); }, [loadGroups]);
|
||||||
|
|
||||||
// Load feature flags on mount
|
// Load feature flags + current user's group memberships on mount
|
||||||
useEffect(() => {
|
const loadFeatures = useCallback(() => {
|
||||||
api.getSettings().then(({ settings }) => {
|
api.getSettings().then(({ settings }) => {
|
||||||
setFeatures({
|
setFeatures(prev => ({
|
||||||
branding: settings.feature_branding === 'true',
|
...prev,
|
||||||
groupManager: settings.feature_group_manager === 'true',
|
branding: settings.feature_branding === 'true',
|
||||||
scheduleManager: settings.feature_schedule_manager === 'true',
|
groupManager: settings.feature_group_manager === 'true',
|
||||||
appType: settings.app_type || 'JAMA-Chat',
|
scheduleManager: settings.feature_schedule_manager === 'true',
|
||||||
|
appType: settings.app_type || 'JAMA-Chat',
|
||||||
teamGroupManagers: JSON.parse(settings.team_group_managers || '[]'),
|
teamGroupManagers: JSON.parse(settings.team_group_managers || '[]'),
|
||||||
teamScheduleManagers: JSON.parse(settings.team_schedule_managers || '[]'),
|
teamScheduleManagers: JSON.parse(settings.team_schedule_managers || '[]'),
|
||||||
});
|
}));
|
||||||
}).catch(() => {});
|
}).catch(() => {});
|
||||||
const handler = () => api.getSettings().then(({ settings }) => {
|
api.getMyUserGroups().then(({ groupIds }) => {
|
||||||
setFeatures({
|
setFeatures(prev => ({ ...prev, userGroupMemberships: groupIds || [] }));
|
||||||
branding: settings.feature_branding === 'true',
|
|
||||||
groupManager: settings.feature_group_manager === 'true',
|
|
||||||
scheduleManager: settings.feature_schedule_manager === 'true',
|
|
||||||
appType: settings.app_type || 'JAMA-Chat',
|
|
||||||
teamGroupManagers: JSON.parse(settings.team_group_managers || '[]'),
|
|
||||||
teamScheduleManagers: JSON.parse(settings.team_schedule_managers || '[]'),
|
|
||||||
});
|
|
||||||
}).catch(() => {});
|
}).catch(() => {});
|
||||||
window.addEventListener('jama:settings-changed', handler);
|
|
||||||
return () => window.removeEventListener('jama:settings-changed', handler);
|
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
loadFeatures();
|
||||||
|
window.addEventListener('jama:settings-changed', loadFeatures);
|
||||||
|
return () => window.removeEventListener('jama:settings-changed', loadFeatures);
|
||||||
|
}, [loadFeatures]);
|
||||||
|
|
||||||
// Register / refresh push subscription
|
// Register / refresh push subscription
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!('serviceWorker' in navigator) || !('PushManager' in window)) return;
|
if (!('serviceWorker' in navigator) || !('PushManager' in window)) return;
|
||||||
|
|||||||
@@ -105,6 +105,7 @@ export const api = {
|
|||||||
updateTeamSettings: (body) => req('PATCH', '/settings/team', body),
|
updateTeamSettings: (body) => req('PATCH', '/settings/team', body),
|
||||||
|
|
||||||
// User groups (Group Manager)
|
// User groups (Group Manager)
|
||||||
|
getMyUserGroups: () => req('GET', '/usergroups/me'),
|
||||||
getUserGroups: () => req('GET', '/usergroups'),
|
getUserGroups: () => req('GET', '/usergroups'),
|
||||||
getUserGroup: (id) => req('GET', `/usergroups/${id}`),
|
getUserGroup: (id) => req('GET', `/usergroups/${id}`),
|
||||||
createUserGroup: (body) => req('POST', '/usergroups', body),
|
createUserGroup: (body) => req('POST', '/usergroups', body),
|
||||||
|
|||||||
Reference in New Issue
Block a user