v0.12.48 Login Type bug fixes

This commit is contained in:
2026-03-31 20:11:40 -04:00
parent f942bc45b9
commit a3a878854e
6 changed files with 41 additions and 10 deletions

View File

@@ -1,6 +1,6 @@
{
"name": "rosterchirp-frontend",
"version": "0.12.47",
"version": "0.12.48",
"private": true,
"scripts": {
"dev": "vite",

View File

@@ -67,6 +67,7 @@ function AllGroupsTab({ allUsers, onRefresh, isMobile = false, onIF, onIB }) {
const [savedMembers, setSavedMembers] = useState(new Set());
const [members, setMembers] = useState(new Set());
const [fullMembers, setFullMembers] = useState([]); // full member objects including deleted
const [aliasMembers, setAliasMembers] = useState([]); // child aliases in this group
const [editName, setEditName] = useState('');
const [noDm, setNoDm] = useState(false);
const [saving, setSaving] = useState(false);
@@ -81,16 +82,17 @@ function AllGroupsTab({ allUsers, onRefresh, isMobile = false, onIF, onIB }) {
const selectGroup = async (g) => {
setShowDelete(false);
setAccordionOpen(false);
const { members: mems } = await api.getUserGroup(g.id);
const { members: mems, aliasMembers: aliases } = await api.getUserGroup(g.id);
const ids = new Set(mems.map(m => m.id));
setSelected(g); setEditName(g.name); setMembers(ids); setSavedMembers(ids);
setFullMembers(mems);
setAliasMembers(aliases || []);
// No DM → checkbox enabled+checked; has DM → checkbox disabled+unchecked
setNoDm(!g.dm_group_id);
};
const clearSelection = () => {
setSelected(null); setEditName(''); setMembers(new Set()); setSavedMembers(new Set());
setShowDelete(false); setFullMembers([]); setNoDm(false);
setShowDelete(false); setFullMembers([]); setAliasMembers([]); setNoDm(false);
};
const handleSave = async () => {
@@ -102,9 +104,9 @@ function AllGroupsTab({ allUsers, onRefresh, isMobile = false, onIF, onIB }) {
const createDm = !selected.dm_group_id && !noDm;
const { group: updated } = await api.updateUserGroup(selected.id, { name: editName.trim(), memberIds: [...members], createDm });
toast('Group updated', 'success');
const { members: fresh } = await api.getUserGroup(selected.id);
const { members: fresh, aliasMembers: freshAliases } = await api.getUserGroup(selected.id);
const freshIds = new Set(fresh.map(m => m.id));
setSavedMembers(freshIds); setMembers(freshIds); setFullMembers(fresh);
setSavedMembers(freshIds); setMembers(freshIds); setFullMembers(fresh); setAliasMembers(freshAliases || []);
// Reflect new dm_group_id if a DM was just created
setSelected(prev => ({ ...prev, name: editName.trim(), dm_group_id: updated?.dm_group_id ?? prev.dm_group_id }));
if (createDm) setNoDm(false);
@@ -220,6 +222,19 @@ function AllGroupsTab({ allUsers, onRefresh, isMobile = false, onIF, onIB }) {
<div style={{ marginTop:6 }}><UserCheckList allUsers={allUsers} selectedIds={members} onChange={setMembers} onIF={onIF} onIB={onIB} /></div>
<p style={{ fontSize:12, color:'var(--text-tertiary)', marginTop:5 }}>{members.size} selected</p>
</div>
{aliasMembers.length > 0 && (
<div>
<label className="settings-section-label">Child Aliases</label>
<div style={{ marginTop:6, border:'1px solid var(--border)', borderRadius:'var(--radius)', overflow:'hidden' }}>
{aliasMembers.map((a, i) => (
<div key={a.id} style={{ display:'flex', alignItems:'center', gap:10, padding:'8px 12px', borderBottom: i < aliasMembers.length - 1 ? '1px solid var(--border)' : 'none' }}>
<span style={{ flex:1, fontSize:13 }}>{a.name}</span>
{a.date_of_birth && <span style={{ fontSize:11, color:'var(--text-tertiary)' }}>{a.date_of_birth.slice(0,10)}</span>}
</div>
))}
</div>
</div>
)}
{deletedMembers.length > 0 && (
<div>
<label className="settings-section-label" style={{ color:'var(--error)' }}>

View File

@@ -139,7 +139,7 @@ function UserForm({ user, userPass, allUserGroups, nonMinorUsers, loginType, onD
const [email, setEmail] = useState(user?.email || '');
const [phone, setPhone] = useState(user?.phone || '');
const [role, setRole] = useState(user?.role || 'member');
const [dob, setDob] = useState(user?.date_of_birth || '');
const [dob, setDob] = useState(user?.date_of_birth?.slice(0, 10) || '');
const [guardianId, setGuardianId] = useState(user?.guardian_user_id || '');
const [password, setPassword] = useState('');
const [pwEnabled, setPwEnabled] = useState(!isEdit);
@@ -566,6 +566,7 @@ export default function UserManagerPage({ isMobile = false, onProfile, onHelp, o
const [userPass, setUserPass] = useState('user@1234');
const [allUserGroups, setAllUserGroups] = useState([]);
const [loginType, setLoginType] = useState('all_ages');
const [guardiansGroupUserIds, setGuardiansGroupUserIds] = useState(null); // null = not loaded yet
const [inputFocused, setInputFocused] = useState(false);
const onIF = () => setInputFocused(true);
const onIB = () => setInputFocused(false);
@@ -582,6 +583,12 @@ export default function UserManagerPage({ isMobile = false, onProfile, onHelp, o
api.getSettings().then(({ settings }) => {
if (settings.user_pass) setUserPass(settings.user_pass);
setLoginType(settings.feature_login_type || 'all_ages');
const guardiansGroupId = settings.feature_guardians_group_id ? parseInt(settings.feature_guardians_group_id) : null;
if (guardiansGroupId) {
api.getUserGroup(guardiansGroupId)
.then(({ members }) => setGuardiansGroupUserIds(new Set((members || []).map(m => m.id))))
.catch(() => setGuardiansGroupUserIds(null));
}
}).catch(() => {});
api.getUserGroups().then(({ groups }) => setAllUserGroups([...(groups||[])].sort((a,b) => a.name.localeCompare(b.name)))).catch(() => {});
}, [load]);
@@ -690,7 +697,7 @@ export default function UserManagerPage({ isMobile = false, onProfile, onHelp, o
user={view === 'edit' ? editUser : null}
userPass={userPass}
allUserGroups={allUserGroups}
nonMinorUsers={users.filter(u => !u.is_minor && u.status === 'active')}
nonMinorUsers={users.filter(u => !u.is_minor && u.status === 'active' && (guardiansGroupUserIds === null || guardiansGroupUserIds.has(u.id)))}
loginType={loginType}
onDone={() => { load(); goList(); }}
onCancel={goList}