diff --git a/frontend/src/components/BrandingModal.jsx b/frontend/src/components/BrandingModal.jsx index d87dfd1..bb90bec 100644 --- a/frontend/src/components/BrandingModal.jsx +++ b/frontend/src/components/BrandingModal.jsx @@ -455,7 +455,7 @@ export default function BrandingModal({ onClose }) { className="input flex-1" value={appName} maxLength={16} - onChange={e = /> setAppName(e.target.value)} autoComplete="new-password" onKeyDown={e => e.key === 'Enter' && handleSaveName()} /> + onChange={e => setAppName(e.target.value)} autoComplete="new-password" onKeyDown={e => e.key === 'Enter' && handleSaveName()} />

diff --git a/frontend/src/components/GroupInfoModal.jsx b/frontend/src/components/GroupInfoModal.jsx index 2c0662b..2d1722e 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 }) {

{editing ? (
- setNewName(e.target.value)} autoComplete="new-password" onKeyDown={e => e.key === 'Enter' && handleRename()} autoComplete="new-password" autoCorrect="off" autoCapitalize="off" spellCheck={false} /> + setNewName(e.target.value)} autoComplete="new-password" onKeyDown={e => e.key === 'Enter' && handleRename()} autoComplete="new-password" autoCorrect="off" autoCapitalize="off" spellCheck={false} />
@@ -165,7 +165,7 @@ export default function GroupInfoModal({ group, onClose, onUpdated, onBack }) { setCustomName(e.target.value)} autoComplete="new-password" placeholder={group.owner_name_original || group.name} + onChange={e => setCustomName(e.target.value)} autoComplete="new-password" placeholder={group.owner_name_original || group.name} onKeyDown={e => e.key === 'Enter' && handleCustomName()} /> {customName.trim() !== savedCustomName ? (
{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/GroupManagerModal.jsx b/frontend/src/components/GroupManagerModal.jsx index be7e97b..be1c103 100644 --- a/frontend/src/components/GroupManagerModal.jsx +++ b/frontend/src/components/GroupManagerModal.jsx @@ -12,7 +12,7 @@ function UserCheckList({ allUsers, selectedIds, onChange }) { return (
setSearch(e.target.value)} style={{ marginBottom: 8 }} + onChange={e => setSearch(e.target.value)} style={{ marginBottom: 8 }} autoComplete="new-password" />
{filtered.map(u => ( @@ -155,7 +155,7 @@ function AllGroupsTab({ allUsers, onRefresh }) {
- setEditName(e.target.value)} + setEditName(e.target.value)} placeholder="e.g. Coaches" style={{ marginTop: 6 }} autoComplete="new-password" /> {isCreating &&

A matching Direct Message group will be created automatically.

} @@ -296,7 +296,7 @@ function DirectMessagesTab({ allUserGroups, onRefresh, refreshKey }) {
- setDmName(e.target.value)} + setDmName(e.target.value)} placeholder="e.g. Coaches + Players" style={{ marginTop: 6 }} autoComplete="new-password" />
diff --git a/frontend/src/components/HostPanel.jsx b/frontend/src/components/HostPanel.jsx index 6deb0f7..ce8a27c 100644 --- a/frontend/src/components/HostPanel.jsx +++ b/frontend/src/components/HostPanel.jsx @@ -55,7 +55,7 @@ function FieldGroup({ label, children }) { function Field({ label, value, onChange, placeholder, type = 'text', hint, required }) { return ( - onChange(e.target.value)} autoComplete="new-password" placeholder={placeholder} required={required} + onChange(e.target.value)} autoComplete="new-password" placeholder={placeholder} required={required} autoComplete="new-password" autoCorrect="off" spellCheck={false} className="input" style={{ fontSize: 13 }} /> {hint && {hint}} @@ -229,7 +229,7 @@ function DeleteModal({ api, tenant, onClose, onDone }) { Type {expected} to confirm:

{error &&
{error}
} - setConfirm(e.target.value)} autoComplete="new-password" placeholder={expected} style={{ marginBottom:16 }} autoComplete="new-password" /> + setConfirm(e.target.value)} autoComplete="new-password" placeholder={expected} style={{ marginBottom:16 }} autoComplete="new-password" />
diff --git a/frontend/src/components/MobileEventForm.jsx b/frontend/src/components/MobileEventForm.jsx index 8358026..86b795b 100644 --- a/frontend/src/components/MobileEventForm.jsx +++ b/frontend/src/components/MobileEventForm.jsx @@ -119,7 +119,7 @@ function RecurrenceSheet({ value, onChange, onClose }) {
Repeats every
- upd('interval',Math.max(1,parseInt(e.target.value)||1))} style={{ width:70,textAlign:'center',fontSize:16 }}/> + upd('interval',Math.max(1,parseInt(e.target.value)||1))} style={{ width:70,textAlign:'center',fontSize:16 }}/> @@ -146,8 +146,8 @@ function RecurrenceSheet({ value, onChange, onClose }) { {(customRule.ends||'never')===val&&
}
{lbl} - {val==='on'&&(customRule.ends||'never')==='on'&&upd('endDate',e.target.value)} style={{ width:150 }}/>} - {val==='after'&&(customRule.ends||'never')==='after'&&<>upd('endCount',parseInt(e.target.value)||1)} style={{ width:64,textAlign:'center' }}/>occurrences} + {val==='on'&&(customRule.ends||'never')==='on'&& upd('endDate',e.target.value)} style={{ width:150 }}/>} + {val==='after'&&(customRule.ends||'never')==='after'&&<> upd('endCount',parseInt(e.target.value)||1)} style={{ width:64,textAlign:'center' }}/>occurrences}
))}
@@ -282,7 +282,7 @@ export default function MobileEventForm({ event, eventTypes, userGroups, selecte
{/* Title */}
- setTitle(e.target.value)} autoComplete="new-password" placeholder="Add title" autoComplete="new-password" autoCorrect="off" autoCapitalize="sentences" spellCheck={false} style={{ width:'100%',border:'none',background:'transparent',fontSize:22,fontWeight:700,color:'var(--text-primary)',outline:'none' }}/> + setTitle(e.target.value)} autoComplete="new-password" placeholder="Add title" autoComplete="new-password" autoCorrect="off" autoCapitalize="sentences" spellCheck={false} style={{ width:'100%',border:'none',background:'transparent',fontSize:22,fontWeight:700,color:'var(--text-primary)',outline:'none' }}/>
{/* Event Type */} @@ -364,7 +364,7 @@ export default function MobileEventForm({ event, eventTypes, userGroups, selecte {/* Location */} }> - setLocation(e.target.value)} autoComplete="new-password" placeholder="Add location" autoComplete="new-password" autoCorrect="off" autoCapitalize="off" spellCheck={false} style={{ width:'100%',border:'none',background:'transparent',fontSize:15,color:'var(--text-primary)',outline:'none' }}/> + setLocation(e.target.value)} autoComplete="new-password" placeholder="Add location" autoComplete="new-password" autoCorrect="off" autoCapitalize="off" spellCheck={false} style={{ width:'100%',border:'none',background:'transparent',fontSize:15,color:'var(--text-primary)',outline:'none' }}/> {/* Description */} @@ -397,7 +397,7 @@ export default function MobileEventForm({ event, eventTypes, userGroups, selecte setNewTypeName(e.target.value)} autoComplete="new-password" onKeyDown={e=>e.key==='Enter'&&createEventType()} + onChange={e => setNewTypeName(e.target.value)} autoComplete="new-password" onKeyDown={e=>e.key==='Enter'&&createEventType()} placeholder="Type name…" autoComplete="new-password" autoCorrect="off" autoCapitalize="words" spellCheck={false} style={{ width:'100%',padding:'12px 14px',border:'1px solid var(--border)',borderRadius:'var(--radius)',fontSize:16,marginBottom:12,boxSizing:'border-box',background:'var(--background)',color:'var(--text-primary)' }} />
diff --git a/frontend/src/components/MobileGroupManager.jsx b/frontend/src/components/MobileGroupManager.jsx index 2f3b6c1..bb8af94 100644 --- a/frontend/src/components/MobileGroupManager.jsx +++ b/frontend/src/components/MobileGroupManager.jsx @@ -69,7 +69,7 @@ function MembersScreen({ group, allUsers, onBack }) {
setSearch(e.target.value)} autoComplete="new-password" placeholder="Search users…" + value={search} onChange={e => setSearch(e.target.value)} autoComplete="new-password" placeholder="Search users…" autoComplete="new-password" 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'}} />
@@ -142,7 +142,7 @@ function MultiGroupDmsScreen({ userGroups, onBack }) { right={} /> {creating && (
- setNewName(e.target.value)} autoComplete="new-password" placeholder="DM name…" autoComplete="new-password" 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' }}/> + setNewName(e.target.value)} autoComplete="new-password" placeholder="DM name…" autoComplete="new-password" 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=>(
)} @@ -120,7 +120,7 @@ export default function NewChatModal({ onClose, onCreated }) { - setSearch(e.target.value)} /> + setSearch(e.target.value)} />
{selected.length > 0 && ( diff --git a/frontend/src/components/ProfileModal.jsx b/frontend/src/components/ProfileModal.jsx index 87642bf..72609c9 100644 --- a/frontend/src/components/ProfileModal.jsx +++ b/frontend/src/components/ProfileModal.jsx @@ -107,7 +107,7 @@ export default function ProfileModal({ onClose }) { { + onChange={async e => { const val = e.target.value; setDisplayName(val); setDisplayNameWarning(''); @@ -167,15 +167,15 @@ export default function ProfileModal({ onClose }) {
- setCurrentPw(e.target.value)} autoComplete="new-password" /> + setCurrentPw(e.target.value)} autoComplete="new-password" />
- setNewPw(e.target.value)} autoComplete="new-password" /> + setNewPw(e.target.value)} autoComplete="new-password" />
- setConfirmPw(e.target.value)} autoComplete="new-password" /> + setConfirmPw(e.target.value)} autoComplete="new-password" />
- setSheetName(e.target.value)} autoComplete="new-password" onKeyDown={e=>e.key==='Enter'&&saveSheet()} placeholder="Type name…" + setSheetName(e.target.value)} autoComplete="new-password" onKeyDown={e=>e.key==='Enter'&&saveSheet()} placeholder="Type name…" style={{width:'100%',padding:'12px 14px',border:'1px solid var(--border)',borderRadius:'var(--radius)',fontSize:16,marginBottom:12,boxSizing:'border-box',background:'var(--background)',color:'var(--text-primary)'}}/>
@@ -1247,7 +1247,7 @@ export default function SchedulePage({ isToolManager, isMobile, onProfile, onHel className="input" placeholder={`Keyword… (space = OR, "phrase")`} value={filterKeyword} - onChange={e = /> setFilterKeyword(e.target.value)} autoComplete="new-password" autoCorrect="off" autoCapitalize="off" spellCheck={false} + onChange={e => setFilterKeyword(e.target.value)} autoComplete="new-password" autoCorrect="off" autoCapitalize="off" spellCheck={false} style={{ marginBottom:8, fontSize:13 }} /> setRegCode(e.target.value)} onKeyDown={e => e.key === 'Enter' && handleRegister()} autoComplete="new-password" /> + onChange={e => setRegCode(e.target.value)} onKeyDown={e => e.key === 'Enter' && handleRegister()} autoComplete="new-password" /> diff --git a/frontend/src/components/SupportModal.jsx b/frontend/src/components/SupportModal.jsx index 2ad4096..de2fa90 100644 --- a/frontend/src/components/SupportModal.jsx +++ b/frontend/src/components/SupportModal.jsx @@ -100,7 +100,7 @@ export default function SupportModal({ onClose }) { className="input" placeholder="Jane Smith" value={name} - onChange={e = /> setName(e.target.value)} autoComplete="new-password" maxLength={100} /> + onChange={e => setName(e.target.value)} autoComplete="new-password" maxLength={100} />
@@ -110,7 +110,7 @@ export default function SupportModal({ onClose }) { type="email" placeholder="jane@example.com" value={email} - onChange={e = /> setEmail(e.target.value)} autoComplete="new-password" maxLength={200} /> + onChange={e => setEmail(e.target.value)} autoComplete="new-password" maxLength={200} />
@@ -148,7 +148,7 @@ export default function SupportModal({ onClose }) { type="number" placeholder="Answer" value={captchaAnswer} - onChange={e = /> setCaptchaAnswer(e.target.value)} + onChange={e => setCaptchaAnswer(e.target.value)} style={{ width: 90 }} min={0} max={999} /> diff --git a/frontend/src/components/UserManagerModal.jsx b/frontend/src/components/UserManagerModal.jsx index 12f9dcd..7202e82 100644 --- a/frontend/src/components/UserManagerModal.jsx +++ b/frontend/src/components/UserManagerModal.jsx @@ -125,7 +125,7 @@ function UserRow({ u, onUpdated }) { className="input" style={{ flex: 1, fontSize: 13, padding: '5px 8px' }} value={nameVal} - onChange={e = /> setNameVal(e.target.value)} autoComplete="new-password" onKeyDown={e => { if (e.key === 'Enter') handleSaveName(); if (e.key === 'Escape') { setEditName(false); setNameVal(u.name); } }} /> + onChange={e => setNameVal(e.target.value)} autoComplete="new-password" onKeyDown={e => { if (e.key === 'Enter') handleSaveName(); if (e.key === 'Escape') { setEditName(false); setNameVal(u.name); } }} />
@@ -164,7 +164,7 @@ function UserRow({ u, onUpdated }) { type="text" placeholder="New password (min 6)" value={resetPw} - onChange={e = /> setResetPw(e.target.value)} autoComplete="new-password" onKeyDown={e => { if (e.key === 'Enter') handleResetPw(); if (e.key === 'Escape') { setShowReset(false); setResetPw(''); } }} /> + onChange={e => setResetPw(e.target.value)} autoComplete="new-password" onKeyDown={e => { if (e.key === 'Enter') handleResetPw(); if (e.key === 'Escape') { setShowReset(false); setResetPw(''); } }} />
@@ -306,7 +306,7 @@ export default function UserManagerModal({ onClose }) { {/* Users list — accordion */} {tab === 'users' && ( <> - setSearch(e.target.value)} /> + setSearch(e.target.value)} /> {loading ? (
) : loadError ? ( @@ -330,17 +330,17 @@ export default function UserManagerModal({ onClose }) {
- setForm(p => ({ ...p, name: e.target.value }))} /> + setForm(p => ({ ...p, name: e.target.value }))} />
- setForm(p => ({ ...p, email: e.target.value }))} /> + setForm(p => ({ ...p, email: e.target.value }))} />
- setForm(p => ({ ...p, password: e.target.value }))} /> + setForm(p => ({ ...p, password: e.target.value }))} />
diff --git a/frontend/src/pages/ChangePassword.jsx b/frontend/src/pages/ChangePassword.jsx index f850454..c668bb4 100644 --- a/frontend/src/pages/ChangePassword.jsx +++ b/frontend/src/pages/ChangePassword.jsx @@ -40,15 +40,15 @@ export default function ChangePassword() {
- setCurrent(e.target.value)} autoComplete="new-password" required /> + setCurrent(e.target.value)} autoComplete="new-password" required />
- setNext(e.target.value)} autoComplete="new-password" required /> + setNext(e.target.value)} autoComplete="new-password" required />
- setConfirm(e.target.value)} autoComplete="new-password" required /> + setConfirm(e.target.value)} autoComplete="new-password" required />
@@ -132,7 +132,7 @@ function UserRow({ u, onUpdated }) {
setResetPw(e.target.value)} + onChange={e => setResetPw(e.target.value)} onKeyDown={e => { if(e.key==='Enter') handleResetPw(); if(e.key==='Escape'){setShowReset(false);setResetPw('');} }} autoComplete="new-password" onFocus={onIF} onBlur={onIB} /> @@ -178,15 +178,15 @@ function CreateUserForm({ userPass, onCreated, isMobile, onIF, onIB }) {
- set('name')(e.target.value)} onFocus={onIF} onBlur={onIB} /> + set('name')(e.target.value)} onFocus={onIF} onBlur={onIB} />
- set('email')(e.target.value)} onFocus={onIF} onBlur={onIB} /> + set('email')(e.target.value)} onFocus={onIF} onBlur={onIB} />
- set('password')(e.target.value)} onFocus={onIF} onBlur={onIB} /> + set('password')(e.target.value)} onFocus={onIF} onBlur={onIB} />
@@ -353,7 +353,7 @@ export default function UserManagerPage({ isMobile = false, onProfile, onHelp, o
{tab === 'users' && ( <> - setSearch(e.target.value)} + setSearch(e.target.value)} onFocus={onIF} onBlur={onIB} autoComplete="new-password" autoCorrect="off" spellCheck={false} style={{ marginBottom:16, width:'100%', maxWidth: isMobile ? '100%' : 400 }} />