Skip to content

Commit 8cd70d8

Browse files
committed
feat: Enhance squad bases data retrieval and UI with validation and WIP hint
1 parent 18d8464 commit 8cd70d8

2 files changed

Lines changed: 32 additions & 8 deletions

File tree

src/features/squadBases/squadBasesData.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,36 +29,36 @@ export function getSquadBaseData(db: Database): SquadGroupBases[] {
2929
LEFT JOIN squad_member sm ON sm.squad_id = s.id
3030
LEFT JOIN user_profile up ON up.id = sm.user_profile_id
3131
LEFT JOIN base b on b.owner_user_profile_id = up.id
32-
where b.owner_user_profile_id > 0
3332
ORDER BY s.name, up.name`);
3433

35-
type Row = [number, string, number, string, number, number];
34+
type Row = [number, string, number, string, number | null, number | null];
3635
const squadGroups: SquadGroupBases[] = [];
3736
if (squads[0]) {
3837
let currentSquad: SquadGroupBases | null = null;
3938
let memberMap: Map<string, { name: string; bases: { location_x: number; location_y: number; }[] }> = new Map();
39+
let lastSquadName: string | null = null;
4040

4141
for (const row of squads[0].values as Row[]) {
4242
const squad_name = row[1] || '(no name)';
4343
const member_name = row[3] || String(row[2]);
4444
const location_x = row[4];
4545
const location_y = row[5];
4646

47-
if (!currentSquad || currentSquad.squadName !== squad_name) {
47+
if (lastSquadName !== squad_name) {
4848
if (currentSquad) {
49-
// Push previous squad group
5049
currentSquad.members = Array.from(memberMap.values());
5150
squadGroups.push(currentSquad);
5251
}
5352
currentSquad = { squadName: squad_name, members: [] };
5453
memberMap = new Map();
54+
lastSquadName = squad_name;
5555
}
5656

5757
if (!memberMap.has(member_name)) {
5858
memberMap.set(member_name, { name: member_name, bases: [] });
5959
}
6060
// Only add base if location_x and location_y are valid numbers
61-
if (typeof location_x === 'number' && typeof location_y === 'number') {
61+
if (typeof location_x === 'number' && typeof location_y === 'number' && !isNaN(location_x) && !isNaN(location_y)) {
6262
memberMap.get(member_name)!.bases.push({ location_x, location_y });
6363
}
6464
}

src/features/squadBases/squadBasesPanel.tsx

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,23 @@ export function SquadBasesPanel({ db }: squadBaseProps) {
194194
// Render
195195
return (
196196
<section style={{ width: '100%' }} aria-label={t('squad_base_panel.panel_header')} role="region">
197+
<div
198+
style={{
199+
background: '#fffbe6',
200+
color: '#8a6d3b',
201+
border: '1px solid #faebcc',
202+
borderRadius: 6,
203+
padding: '12px 18px',
204+
marginBottom: 16,
205+
fontSize: '1rem',
206+
fontWeight: 500,
207+
boxShadow: '0 1px 6px rgba(0,0,0,0.07)',
208+
}}
209+
role="note"
210+
aria-live="polite"
211+
>
212+
⚠️ <strong>{t('squad_base_panel.wip_hint', 'This panel is a work in progress. Not every flag is attributed correctly yet.')}</strong>
213+
</div>
197214
<div
198215
style={{
199216
display: 'flex',
@@ -292,15 +309,22 @@ export function SquadBasesPanel({ db }: squadBaseProps) {
292309
const filteredBases = member.bases.filter(b =>
293310
filter.base_location === '' || `${b.location_x},${b.location_y}`.includes(filter.base_location)
294311
);
312+
const hasBases = member.bases.length > 0;
295313
return (
296314
<React.Fragment key={member.name + mIdx}>
297-
<tr className="member-row" onClick={e => { e.stopPropagation(); toggleMember(squad.squadName, member.name); }} tabIndex={0} aria-label={t('squad_base_panel.member_aria_label', { name: member.name, bases: member.bases.length })}>
315+
<tr
316+
className={hasBases ? "member-row" : "member-row no-bases-member"}
317+
onClick={hasBases ? (e => { e.stopPropagation(); toggleMember(squad.squadName, member.name); }) : undefined}
318+
tabIndex={hasBases ? 0 : -1}
319+
aria-label={t('squad_base_panel.member_aria_label', { name: member.name, bases: member.bases.length })}
320+
style={hasBases ? {} : { opacity: 0.7, cursor: 'default' }}
321+
>
298322
<td className="member-cell" colSpan={3}>
299-
<span className="arrow" aria-hidden="true">{memberOpen ? '▼' : '▶'}</span>{member.name}
323+
<span className="arrow" aria-hidden="true">{hasBases ? (memberOpen ? '▼' : '▶') : ''}</span>{member.name}
300324
<span className="count">({t('squad_base_panel.bases', { count: member.bases.length })})</span>
301325
</td>
302326
</tr>
303-
{memberOpen && (filteredBases.length === 0 ? (
327+
{hasBases && memberOpen && (filteredBases.length === 0 ? (
304328
<tr className="no-bases-row">
305329
<td className="base-cell" colSpan={2}>{t('squad_base_panel.no_bases')}</td>
306330
</tr>

0 commit comments

Comments
 (0)