Settings → General, beside the language. An operator reading 2026-07-30 as the
7th of the 30th month is reading their own log wrongly, and that is a display
problem.
Storage stays ISO/ADIF, deliberately and permanently: it is what ADIF
specifies, it sorts correctly as text, and a stored format that followed a UI
preference would make the log unreadable the day the preference changed. Exports
and uploads are untouched.
Two details that decide whether it actually works:
- The columns are rebuilt when the format changes. The formatters are captured
inside AG-Grid's column definitions, so nothing else would notice and the
table would keep the old format until something forced a rebuild.
- main.tsx re-reads the choice after the portable prefs are pulled from the
database. The module reads localStorage at import time, which is BEFORE that
sync — so a copied data/ folder would have shown ISO until the next launch.
UTC is not part of the choice and never will be: a logbook is kept in UTC, and
showing local time would make the display disagree with the QSO's own record
twice a year.
42 lines
1.7 KiB
TypeScript
42 lines
1.7 KiB
TypeScript
import React from 'react'
|
|
import {createRoot} from 'react-dom/client'
|
|
import './style.css'
|
|
import App from './App'
|
|
import { syncPortablePrefs } from './lib/uiPref'
|
|
import { I18nProvider } from './lib/i18n'
|
|
import { ThemeProvider, initTheme } from './lib/theme'
|
|
import { ErrorBoundary, installGlobalErrorLogging } from './components/ErrorBoundary'
|
|
import { reloadDateFormat } from './lib/dateFormat'
|
|
|
|
const container = document.getElementById('root')
|
|
|
|
const root = createRoot(container!)
|
|
|
|
// Pull portable UI prefs (DB → localStorage) before the first render so the
|
|
// app's synchronous reads see the values copied along with the data/ folder.
|
|
// Render regardless of the outcome so a backend hiccup never blocks startup.
|
|
syncPortablePrefs().finally(() => {
|
|
// Stamp the persisted theme onto <html> before render so the correct
|
|
// palette is applied immediately (portable pref hydrated just above).
|
|
initTheme()
|
|
// The date format module read localStorage at import time, which is BEFORE
|
|
// the portable prefs were pulled from the database. Re-read it now, or a
|
|
// copied data/ folder would show ISO until the next launch.
|
|
reloadDateFormat()
|
|
// Catch what a boundary cannot: errors thrown from timers, event handlers and
|
|
// rejected promises. Installed before the first render so a fault during
|
|
// startup is reported too.
|
|
installGlobalErrorLogging()
|
|
root.render(
|
|
<React.StrictMode>
|
|
<ErrorBoundary>
|
|
<I18nProvider>
|
|
<ThemeProvider>
|
|
<App/>
|
|
</ThemeProvider>
|
|
</I18nProvider>
|
|
</ErrorBoundary>
|
|
</React.StrictMode>
|
|
)
|
|
})
|