Refactor task audits, integrate OpenClaw, and fix timezone handling

This commit is contained in:
NPS Agent
2026-05-21 11:33:32 +09:30
parent a9494742bd
commit 98cf813f00
5 changed files with 60 additions and 13 deletions
+20 -2
View File
@@ -917,7 +917,13 @@ function AuditScreen({ entries, onOpen }) {
const actor = r.actor === 'system' ? null : findUser(r.actor);
return (
<li key={r.id} className="audit__row">
<span className="audit__time mono">{new Date(r.at).toLocaleTimeString('en-US',{hour:'numeric', minute:'2-digit'})}</span>
<span className="audit__time mono">{(() => {
let safeTz = undefined;
if (window.workspace && window.workspace.timezone) {
try { Intl.DateTimeFormat(undefined, { timeZone: window.workspace.timezone }); safeTz = window.workspace.timezone; } catch(e) {}
}
return new Date(typeof r.at === 'string' && !r.at.endsWith('Z') && !r.at.includes('+') ? r.at + 'Z' : r.at).toLocaleTimeString('en-US',{hour:'numeric', minute:'2-digit', timeZone: safeTz});
})()}</span>
<span className="audit__actor">
{actor ? <Avatar user={actor} size={20} /> : <span className="audit__sys">SYS</span>}
<span>{actor ? actor.name : 'System'}</span>
@@ -1189,6 +1195,7 @@ function WorkspaceTab({ user, isAdmin, dbUsers = [], onSwitchUser, onCreateUser,
const [wsName, setWsName] = React.useState(workspace ? workspace.name : '');
const [wsTz, setWsTz] = React.useState(workspace ? workspace.timezone : '');
const [wsSaved, setWsSaved] = React.useState(false);
const [wsError, setWsError] = React.useState('');
// User editing state
const [editingUserId, setEditingUserId] = React.useState(null);
@@ -1234,6 +1241,16 @@ function WorkspaceTab({ user, isAdmin, dbUsers = [], onSwitchUser, onCreateUser,
};
const handleUpdateWorkspace = async () => {
setWsError(''); // Clear previous errors
if (wsTz) {
try {
Intl.DateTimeFormat(undefined, { timeZone: wsTz });
} catch (e) {
setWsError('Not a proper timezone (e.g., Asia/Tokyo)');
return; // Stop the save process
}
}
await onUpdateWorkspace({ name: wsName, timezone: wsTz });
setWsSaved(true);
setTimeout(() => setWsSaved(false), 2000);
@@ -1378,12 +1395,13 @@ function WorkspaceTab({ user, isAdmin, dbUsers = [], onSwitchUser, onCreateUser,
<label className="field">
<span className="field__label">Timezone</span>
<input className="field__input" value={wsTz} onChange={e => setWsTz(e.target.value)} disabled={!isAdmin} />
{wsError && <div className="field__error" style={{ color: 'var(--red)', marginTop: '4px', fontSize: '13px' }}>{wsError}</div>}
</label>
</div>
{isAdmin && (
<div className="settings__save-row" style={{ marginTop: '1rem' }}>
{wsSaved && <span className="settings__saved mono"><Icon.Check /> Saved</span>}
<button className="btn btn--ghost" onClick={() => { setWsName(workspace.name); setWsTz(workspace.timezone); }} disabled={!wsDirty}>Discard</button>
<button className="btn btn--ghost" onClick={() => { setWsName(workspace.name); setWsTz(workspace.timezone); setWsError(''); }} disabled={!wsDirty}>Discard</button>
<button className="btn btn--primary" onClick={handleUpdateWorkspace} disabled={!wsDirty}>Update workspace</button>
</div>
)}