v0.12.48 Login Type bug fixes
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "rosterchirp-frontend",
|
||||
"version": "0.12.47",
|
||||
"version": "0.12.48",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
||||
@@ -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)' }}>
|
||||
|
||||
@@ -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}
|
||||
|
||||
Reference in New Issue
Block a user