@bardioc/create-bardioc-app 0.5.6 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/package.json +1 -1
- package/templates/_base/README.md +1 -1
- package/templates/_base/public/app-manifest.json +1 -2
- package/templates/angular/.env.example +4 -1
- package/templates/angular/package.json +2 -2
- package/templates/angular/scripts/dev-env.mjs +62 -0
- package/templates/angular/scripts/dev.mjs +56 -0
- package/templates/angular/scripts/sync-runtime-env.mjs +2 -28
- package/templates/angular/src/app/app.component.ts +44 -26
- package/templates/angular/src/app/bardioc.token.ts +2 -2
- package/templates/angular/src/main.ts +6 -8
- package/templates/angular/src/styles.css +4 -0
- package/templates/nextjs/.env.example +4 -1
- package/templates/nextjs/app/page.tsx +18 -15
- package/templates/nextjs/next.config.ts +1 -1
- package/templates/nextjs/package.json +3 -3
- package/templates/nextjs/scripts/dev-env.mjs +62 -0
- package/templates/nextjs/scripts/dev.mjs +56 -0
- package/templates/preact/.env.example +3 -0
- package/templates/preact/package.json +2 -2
- package/templates/preact/src/App.tsx +10 -10
- package/templates/preact/src/main.tsx +3 -3
- package/templates/preact/vite.config.ts +4 -1
- package/templates/solid/.env.example +3 -0
- package/templates/solid/package.json +2 -2
- package/templates/solid/src/App.tsx +10 -10
- package/templates/solid/src/bardioc-sdk.tsx +11 -23
- package/templates/solid/src/main.tsx +5 -3
- package/templates/solid/vite.config.ts +4 -1
- package/templates/svelte/.env.example +3 -0
- package/templates/svelte/package.json +2 -2
- package/templates/svelte/src/App.svelte +12 -12
- package/templates/svelte/src/main.ts +5 -5
- package/templates/svelte/vite.config.ts +4 -1
- package/templates/vite/.env.example +3 -0
- package/templates/vite/CLAUDE.md +34 -7
- package/templates/vite/package.json +3 -3
- package/templates/vite/public/app-manifest.json +0 -1
- package/templates/vite/src/auth/onboarding.tsx +7 -5
- package/templates/vite/src/climate/conditions-chart.tsx +2 -2
- package/templates/vite/src/climate/overview-view.tsx +1 -1
- package/templates/vite/src/climate/stations-view.tsx +3 -10
- package/templates/vite/src/climate/use-climate.ts +8 -8
- package/templates/vite/src/events/live-events-view.tsx +8 -10
- package/templates/vite/src/graph/explorer-view.tsx +7 -14
- package/templates/vite/src/graph/requests.ts +16 -19
- package/templates/vite/src/locales/de.json +7 -8
- package/templates/vite/src/locales/en.json +45 -46
- package/templates/vite/src/main.tsx +3 -3
- package/templates/vite/src/profile/profile-view.tsx +5 -12
- package/templates/vite/src/profile/use-profile.ts +3 -3
- package/templates/vite/src/shell/about-dialog.tsx +5 -11
- package/templates/vite/src/shell/app-shell.tsx +63 -22
- package/templates/vite/src/shell/header.tsx +24 -24
- package/templates/vite/vite.config.ts +4 -1
- package/templates/vue/.env.example +3 -0
- package/templates/vue/package.json +2 -2
- package/templates/vue/src/App.vue +12 -12
- package/templates/vue/src/bardioc-sdk.ts +6 -15
- package/templates/vue/src/main.ts +5 -4
- package/templates/vue/vite.config.ts +4 -1
- package/templates/angular/scripts/dev-auth-proxy.mjs +0 -17
- package/templates/angular/src/app/bardioc-bridge.ts +0 -5
- package/templates/nextjs/scripts/dev-auth-proxy.mjs +0 -17
|
@@ -25,9 +25,10 @@ export function Onboarding() {
|
|
|
25
25
|
icon={PlugZap}
|
|
26
26
|
iconVariant="chip"
|
|
27
27
|
titleSize="lg"
|
|
28
|
-
title={t('auth.title', { fallback: 'Connect to Bardioc
|
|
28
|
+
title={t('auth.title', { fallback: 'Connect to Bardioc' })}
|
|
29
29
|
description={t('auth.description', {
|
|
30
|
-
fallback:
|
|
30
|
+
fallback:
|
|
31
|
+
'This dashboard reads live data through the Bardioc SDK transport. It runs when opened inside Bardioc, or standalone with dev auth.',
|
|
31
32
|
})}
|
|
32
33
|
actions={
|
|
33
34
|
<Button onClick={() => globalThis.location.reload()}>
|
|
@@ -42,7 +43,8 @@ export function Onboarding() {
|
|
|
42
43
|
<ol className="text-muted-foreground list-decimal space-y-2 pl-4">
|
|
43
44
|
<li>
|
|
44
45
|
{t('auth.step1', {
|
|
45
|
-
fallback:
|
|
46
|
+
fallback:
|
|
47
|
+
'Set DEV_SECRET=<your-secret> and API_BASE_URL=<your-host> in the .env file.',
|
|
46
48
|
})}
|
|
47
49
|
</li>
|
|
48
50
|
<li>
|
|
@@ -52,10 +54,10 @@ export function Onboarding() {
|
|
|
52
54
|
</ol>
|
|
53
55
|
<div className="border-border mt-3 space-y-1 border-t pt-3">
|
|
54
56
|
<p className="text-foreground font-medium">
|
|
55
|
-
{t('auth.detectedTitle', { fallback: 'Detected
|
|
57
|
+
{t('auth.detectedTitle', { fallback: 'Detected Environment' })}
|
|
56
58
|
</p>
|
|
57
59
|
<DetectedRow
|
|
58
|
-
label={t('auth.insideHost', { fallback: 'Inside
|
|
60
|
+
label={t('auth.insideHost', { fallback: 'Inside Host Iframe' })}
|
|
59
61
|
ok={insideHost}
|
|
60
62
|
/>
|
|
61
63
|
</div>
|
|
@@ -28,8 +28,8 @@ export function ConditionsChart({ forecast }: Readonly<ConditionsChartProps>) {
|
|
|
28
28
|
seriesData={seriesData}
|
|
29
29
|
xKey="day"
|
|
30
30
|
chartConfig={chartConfig}
|
|
31
|
-
title={t('chart.title', { fallback: '7-
|
|
32
|
-
description={t('chart.description', { fallback: 'Daylight hours by condition' })}
|
|
31
|
+
title={t('chart.title', { fallback: '7-Day Outlook' })}
|
|
32
|
+
description={t('chart.description', { fallback: 'Daylight hours by condition.' })}
|
|
33
33
|
heightClass="h-[220px]"
|
|
34
34
|
/>
|
|
35
35
|
);
|
|
@@ -120,27 +120,20 @@ export function StationsView() {
|
|
|
120
120
|
|
|
121
121
|
return (
|
|
122
122
|
<div className="flex flex-col gap-3">
|
|
123
|
-
<
|
|
124
|
-
<h2 className="text-lg font-semibold">
|
|
125
|
-
{t('stations.title', { fallback: 'Monitoring stations' })}
|
|
126
|
-
</h2>
|
|
127
|
-
<p className="text-muted-foreground text-xs">
|
|
128
|
-
{t('stations.description', { fallback: '' })}
|
|
129
|
-
</p>
|
|
130
|
-
</div>
|
|
123
|
+
<p className="text-muted-foreground text-xs">{t('stations.description', { fallback: '' })}</p>
|
|
131
124
|
<DataTable
|
|
132
125
|
boxed
|
|
133
126
|
data={data}
|
|
134
127
|
columns={columns}
|
|
135
128
|
filterKey={['name', 'region']}
|
|
136
129
|
showSearchBar
|
|
137
|
-
filterPlaceholder={t('stations.search', { fallback: 'Search
|
|
130
|
+
filterPlaceholder={t('stations.search', { fallback: 'Search Stations…' })}
|
|
138
131
|
itemLabel={t('stations.itemLabel', { fallback: 'stations' })}
|
|
139
132
|
onRowClick={station => setActiveStation(station.id)}
|
|
140
133
|
filterSlot={<ConditionFilter selected={conditions} onToggle={onToggle} />}
|
|
141
134
|
emptyState={
|
|
142
135
|
<p className="text-muted-foreground p-6 text-center text-sm">
|
|
143
|
-
{t('stations.empty', { fallback: 'No stations match your filters' })}
|
|
136
|
+
{t('stations.empty', { fallback: 'No stations match your filters.' })}
|
|
144
137
|
</p>
|
|
145
138
|
}
|
|
146
139
|
/>
|
|
@@ -6,10 +6,10 @@ import { generateState, syncState } from './climate-data';
|
|
|
6
6
|
import { IDB_LOG_PREFIX, IDB_STATE_KEY, IDB_STORE, type ClimateState } from './types';
|
|
7
7
|
|
|
8
8
|
export function useClimate() {
|
|
9
|
-
const
|
|
9
|
+
const bardioc = useSdk();
|
|
10
10
|
const notify = useAppNotify();
|
|
11
11
|
const { t } = useTranslation();
|
|
12
|
-
const store = useMemo(() =>
|
|
12
|
+
const store = useMemo(() => bardioc.idb(IDB_STORE), [bardioc]);
|
|
13
13
|
|
|
14
14
|
const [state, setState] = useState<ClimateState | null>(null);
|
|
15
15
|
const [syncing, setSyncing] = useState(false);
|
|
@@ -42,7 +42,7 @@ export function useClimate() {
|
|
|
42
42
|
useEffect(() => {
|
|
43
43
|
let active = true;
|
|
44
44
|
void (async () => {
|
|
45
|
-
const raw = await store.get
|
|
45
|
+
const raw = (await store.get(IDB_STATE_KEY).catch(() => null))?.value;
|
|
46
46
|
const saved =
|
|
47
47
|
raw !== null &&
|
|
48
48
|
raw !== undefined &&
|
|
@@ -69,12 +69,12 @@ export function useClimate() {
|
|
|
69
69
|
try {
|
|
70
70
|
let source: ClimateState['source'] = 'graph';
|
|
71
71
|
try {
|
|
72
|
-
await
|
|
72
|
+
await bardioc.os.profile.get();
|
|
73
73
|
} catch {
|
|
74
74
|
source = 'mock';
|
|
75
75
|
}
|
|
76
76
|
|
|
77
|
-
const raw = await store.get
|
|
77
|
+
const raw = (await store.get(IDB_STATE_KEY).catch(() => null))?.value;
|
|
78
78
|
const saved =
|
|
79
79
|
raw !== null &&
|
|
80
80
|
raw !== undefined &&
|
|
@@ -89,7 +89,7 @@ export function useClimate() {
|
|
|
89
89
|
|
|
90
90
|
notify(
|
|
91
91
|
t('notify.synced', {
|
|
92
|
-
fallback: 'Synced {count} stations',
|
|
92
|
+
fallback: 'Synced {count} stations.',
|
|
93
93
|
params: { count: next.stations.length },
|
|
94
94
|
}),
|
|
95
95
|
source === 'graph' ? 'success' : 'warning'
|
|
@@ -97,7 +97,7 @@ export function useClimate() {
|
|
|
97
97
|
} finally {
|
|
98
98
|
setSyncing(false);
|
|
99
99
|
}
|
|
100
|
-
}, [
|
|
100
|
+
}, [bardioc, notify, persist, store, t]);
|
|
101
101
|
|
|
102
102
|
const setActiveStation = useCallback(
|
|
103
103
|
(id: string) => {
|
|
@@ -108,7 +108,7 @@ export function useClimate() {
|
|
|
108
108
|
const station = next.stations.find(item => item.id === id);
|
|
109
109
|
notify(
|
|
110
110
|
t('notify.stationSelected', {
|
|
111
|
-
fallback: 'Active station: {name}',
|
|
111
|
+
fallback: 'Active station: {name}.',
|
|
112
112
|
params: { name: station?.name ?? id },
|
|
113
113
|
}),
|
|
114
114
|
'info'
|
|
@@ -23,28 +23,26 @@ export function LiveEventsView() {
|
|
|
23
23
|
|
|
24
24
|
return (
|
|
25
25
|
<div className="flex h-full min-w-0 flex-col gap-3">
|
|
26
|
-
<
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
})}
|
|
32
|
-
</p>
|
|
33
|
-
</div>
|
|
26
|
+
<p className="text-muted-foreground text-xs">
|
|
27
|
+
{t('events.description', {
|
|
28
|
+
fallback: 'Live graph events streamed from the OS over SSE (permission "events").',
|
|
29
|
+
})}
|
|
30
|
+
</p>
|
|
34
31
|
|
|
35
32
|
<Card className="min-h-0 min-w-0 flex-1">
|
|
36
33
|
{events.length === 0 ? (
|
|
37
34
|
<Empty
|
|
38
35
|
icon={Activity}
|
|
39
36
|
iconVariant="chip"
|
|
40
|
-
title={t('events.emptyTitle', { fallback: 'Waiting for
|
|
37
|
+
title={t('events.emptyTitle', { fallback: 'Waiting for Events' })}
|
|
41
38
|
description={
|
|
42
39
|
isInsideIframe()
|
|
43
40
|
? t('events.emptyHost', {
|
|
44
41
|
fallback: 'No graph events yet — activity will appear here as it happens.',
|
|
45
42
|
})
|
|
46
43
|
: t('events.emptyStandalone', {
|
|
47
|
-
fallback:
|
|
44
|
+
fallback:
|
|
45
|
+
'Open inside Bardioc (or run standalone with dev auth) to receive live events.',
|
|
48
46
|
})
|
|
49
47
|
}
|
|
50
48
|
/>
|
|
@@ -13,7 +13,7 @@ type Result =
|
|
|
13
13
|
|
|
14
14
|
export function ExplorerView() {
|
|
15
15
|
const { t } = useTranslation();
|
|
16
|
-
const
|
|
16
|
+
const bardioc = useSdk();
|
|
17
17
|
const notify = useAppNotify();
|
|
18
18
|
const [activeId, setActiveId] = useState(SDK_REQUESTS[0].id);
|
|
19
19
|
const [result, setResult] = useState<Result>({ status: 'idle' });
|
|
@@ -25,15 +25,15 @@ export function ExplorerView() {
|
|
|
25
25
|
setResult({ status: 'running' });
|
|
26
26
|
const started = Date.now();
|
|
27
27
|
try {
|
|
28
|
-
const data = await request.run(
|
|
28
|
+
const data = await request.run(bardioc);
|
|
29
29
|
const ms = Date.now() - started;
|
|
30
30
|
setResult({ status: 'done', live: true, ms, data });
|
|
31
|
-
notify(t('notify.queryOk', { fallback: 'Request
|
|
31
|
+
notify(t('notify.queryOk', { fallback: 'Request OK ({ms} ms).', params: { ms } }), 'success');
|
|
32
32
|
} catch {
|
|
33
33
|
const ms = Date.now() - started;
|
|
34
34
|
setResult({ status: 'done', live: false, ms, data: request.mock() });
|
|
35
35
|
notify(
|
|
36
|
-
t('notify.queryFailed', { fallback: 'Request failed — showing simulated data' }),
|
|
36
|
+
t('notify.queryFailed', { fallback: 'Request failed — showing simulated data.' }),
|
|
37
37
|
'warning'
|
|
38
38
|
);
|
|
39
39
|
}
|
|
@@ -41,14 +41,7 @@ export function ExplorerView() {
|
|
|
41
41
|
|
|
42
42
|
return (
|
|
43
43
|
<div className="flex h-full min-w-0 flex-col gap-3">
|
|
44
|
-
<
|
|
45
|
-
<h2 className="text-lg font-semibold">
|
|
46
|
-
{t('explorer.title', { fallback: 'Graph Explorer' })}
|
|
47
|
-
</h2>
|
|
48
|
-
<p className="text-muted-foreground text-xs">
|
|
49
|
-
{t('explorer.description', { fallback: '' })}
|
|
50
|
-
</p>
|
|
51
|
-
</div>
|
|
44
|
+
<p className="text-muted-foreground text-xs">{t('explorer.description', { fallback: '' })}</p>
|
|
52
45
|
|
|
53
46
|
<div className="grid min-w-0 gap-3 lg:grid-cols-[minmax(0,240px)_minmax(0,1fr)]">
|
|
54
47
|
<div className="flex min-w-0 flex-col gap-1">
|
|
@@ -85,7 +78,7 @@ export function ExplorerView() {
|
|
|
85
78
|
>
|
|
86
79
|
{result.status === 'running'
|
|
87
80
|
? t('explorer.running', { fallback: 'Running…' })
|
|
88
|
-
: t('explorer.run', { fallback: 'Run
|
|
81
|
+
: t('explorer.run', { fallback: 'Run Request' })}
|
|
89
82
|
</Button>
|
|
90
83
|
</div>
|
|
91
84
|
|
|
@@ -107,7 +100,7 @@ export function ExplorerView() {
|
|
|
107
100
|
{result.status === 'done'
|
|
108
101
|
? JSON.stringify(result.data, null, 2)
|
|
109
102
|
: t('explorer.empty', {
|
|
110
|
-
fallback: 'Select a request and run it to see the response',
|
|
103
|
+
fallback: 'Select a request and run it to see the response.',
|
|
111
104
|
})}
|
|
112
105
|
</pre>
|
|
113
106
|
</div>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Bardioc } from '@bardioc/app-sdk';
|
|
2
2
|
|
|
3
3
|
export type RequestCategory = 'graph' | 'os';
|
|
4
4
|
|
|
@@ -6,7 +6,7 @@ export interface SdkRequest {
|
|
|
6
6
|
id: string;
|
|
7
7
|
category: RequestCategory;
|
|
8
8
|
label: string;
|
|
9
|
-
run: (
|
|
9
|
+
run: (bardioc: Bardioc) => Promise<unknown>;
|
|
10
10
|
mock: () => unknown;
|
|
11
11
|
}
|
|
12
12
|
|
|
@@ -32,8 +32,8 @@ function toItems(result: unknown): GraphNode[] {
|
|
|
32
32
|
return [];
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
async function sampleNodes(
|
|
36
|
-
return toItems(await
|
|
35
|
+
async function sampleNodes(bardioc: Bardioc, limit: number): Promise<GraphNode[]> {
|
|
36
|
+
return toItems(await bardioc.graph.query<GraphNode>('*', { limit }));
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
// The full surface a hosted app can reach over the SDK transport. Each `run` issues a real call
|
|
@@ -48,7 +48,7 @@ export const SDK_REQUESTS: [SdkRequest, ...SdkRequest[]] = [
|
|
|
48
48
|
id: 'graph.query.all',
|
|
49
49
|
category: 'graph',
|
|
50
50
|
label: "graph.query('*', { limit: 10 })",
|
|
51
|
-
run:
|
|
51
|
+
run: bardioc => bardioc.graph.query('*', { limit: 10 }),
|
|
52
52
|
mock: () => ({
|
|
53
53
|
items: [
|
|
54
54
|
{
|
|
@@ -63,14 +63,14 @@ export const SDK_REQUESTS: [SdkRequest, ...SdkRequest[]] = [
|
|
|
63
63
|
id: 'graph.query.type',
|
|
64
64
|
category: 'graph',
|
|
65
65
|
label: String.raw`graph.query('ogit\/_type:"<first result type>"', { limit: 5 })`,
|
|
66
|
-
run: async
|
|
67
|
-
const [first] = await sampleNodes(
|
|
66
|
+
run: async bardioc => {
|
|
67
|
+
const [first] = await sampleNodes(bardioc, 1);
|
|
68
68
|
const type = first?.['ogit/_type'];
|
|
69
69
|
if (!type) {
|
|
70
70
|
return [];
|
|
71
71
|
}
|
|
72
72
|
const escapedType = type.replaceAll('/', String.raw`\/`);
|
|
73
|
-
return
|
|
73
|
+
return bardioc.graph.query(String.raw`ogit\/_type:"${escapedType}"`, { limit: 5 });
|
|
74
74
|
},
|
|
75
75
|
mock: () => ({
|
|
76
76
|
items: [
|
|
@@ -86,13 +86,13 @@ export const SDK_REQUESTS: [SdkRequest, ...SdkRequest[]] = [
|
|
|
86
86
|
id: 'graph.get',
|
|
87
87
|
category: 'graph',
|
|
88
88
|
label: 'graph.get(firstNodeId)',
|
|
89
|
-
run: async
|
|
90
|
-
const [first] = await sampleNodes(
|
|
89
|
+
run: async bardioc => {
|
|
90
|
+
const [first] = await sampleNodes(bardioc, 1);
|
|
91
91
|
const id = first?.['ogit/_id'];
|
|
92
92
|
if (!id) {
|
|
93
93
|
return null;
|
|
94
94
|
}
|
|
95
|
-
return
|
|
95
|
+
return bardioc.graph.get(id);
|
|
96
96
|
},
|
|
97
97
|
mock: () => ({
|
|
98
98
|
'ogit/_id': 'cmexample_app-1',
|
|
@@ -106,11 +106,8 @@ export const SDK_REQUESTS: [SdkRequest, ...SdkRequest[]] = [
|
|
|
106
106
|
label: "graph.gremlin(nodeId, 'both()')",
|
|
107
107
|
// `both()` returns adjacent vertices in either direction. Replace this id with a connected
|
|
108
108
|
// node from your own instance — many nodes (e.g. config vertices) have no traversable edges.
|
|
109
|
-
run:
|
|
110
|
-
|
|
111
|
-
'cjohdg6y80000ai48sw7swsq0_cmm2b2jz3t6dq0110poeobock',
|
|
112
|
-
'both()'
|
|
113
|
-
),
|
|
109
|
+
run: bardioc =>
|
|
110
|
+
bardioc.graph.gremlin('cjohdg6y80000ai48sw7swsq0_cmm2b2jz3t6dq0110poeobock', 'both()'),
|
|
114
111
|
mock: () => [
|
|
115
112
|
{
|
|
116
113
|
'ogit/_id': 'cmexample_node-2',
|
|
@@ -123,21 +120,21 @@ export const SDK_REQUESTS: [SdkRequest, ...SdkRequest[]] = [
|
|
|
123
120
|
id: 'os.profile',
|
|
124
121
|
category: 'os',
|
|
125
122
|
label: 'os.profile.get()',
|
|
126
|
-
run:
|
|
123
|
+
run: bardioc => bardioc.os.profile.get(),
|
|
127
124
|
mock: () => ({ id: 'usr-demo', email: 'operator@bardioc.dev', name: 'Demo Operator' }),
|
|
128
125
|
},
|
|
129
126
|
{
|
|
130
127
|
id: 'os.organization',
|
|
131
128
|
category: 'os',
|
|
132
129
|
label: 'os.organization.getStructure()',
|
|
133
|
-
run:
|
|
130
|
+
run: bardioc => bardioc.os.organization.getStructure(),
|
|
134
131
|
mock: () => ({ id: 'org-demo', name: 'Bardioc Climate Corp', units: [], members: [] }),
|
|
135
132
|
},
|
|
136
133
|
{
|
|
137
134
|
id: 'os.applications',
|
|
138
135
|
category: 'os',
|
|
139
136
|
label: 'os.applications.list()',
|
|
140
|
-
run:
|
|
137
|
+
run: bardioc => bardioc.os.applications.list(),
|
|
141
138
|
mock: () => [{ id: 'app-demo', name: 'Climate Dashboard', version: '0.0.1' }],
|
|
142
139
|
},
|
|
143
140
|
];
|
|
@@ -16,12 +16,11 @@
|
|
|
16
16
|
"version": "Version",
|
|
17
17
|
"id": "App-ID",
|
|
18
18
|
"description": "Beschreibung",
|
|
19
|
-
"permissions": "Berechtigungen",
|
|
20
19
|
"error": "app-manifest.json konnte nicht gelesen werden",
|
|
21
20
|
"source": "Live aus public/app-manifest.json gelesen"
|
|
22
21
|
},
|
|
23
22
|
"genericTable": {
|
|
24
|
-
"filterPlaceholder": "Ergebnisse filtern
|
|
23
|
+
"filterPlaceholder": "Ergebnisse filtern…",
|
|
25
24
|
"itemLabel": "Zeilen",
|
|
26
25
|
"showing": "{from} bis {to} von {total}",
|
|
27
26
|
"columns": "Spalten",
|
|
@@ -39,9 +38,9 @@
|
|
|
39
38
|
"neverSaved": "Noch nicht gespeichert"
|
|
40
39
|
},
|
|
41
40
|
"auth": {
|
|
42
|
-
"title": "Mit Bardioc
|
|
43
|
-
"description": "Dieses Dashboard liest Live-Daten über den Bardioc-SDK-Transport. Es läuft in Bardioc
|
|
44
|
-
"stepsTitle": "Eigenständig mit Dev-
|
|
41
|
+
"title": "Mit Bardioc verbinden",
|
|
42
|
+
"description": "Dieses Dashboard liest Live-Daten über den Bardioc-SDK-Transport. Es läuft in Bardioc oder eigenständig mit Dev-Auth.",
|
|
43
|
+
"stepsTitle": "Eigenständig mit Dev-Auth ausführen:",
|
|
45
44
|
"step1": "Setze DEV_SECRET=<dein-secret> und API_BASE_URL=<dein-host> in .env",
|
|
46
45
|
"step2": "Dev-Server starten:",
|
|
47
46
|
"detectedTitle": "Erkannte Umgebung",
|
|
@@ -56,7 +55,7 @@
|
|
|
56
55
|
"noOperator": "Betreiber nicht verfügbar",
|
|
57
56
|
"updated": "Aktualisiert {time}",
|
|
58
57
|
"persistence": "In IndexedDB gespeichert",
|
|
59
|
-
"notPersisted": "Vorschau — nicht gespeichert (in Bardioc
|
|
58
|
+
"notPersisted": "Vorschau — nicht gespeichert (in Bardioc öffnen zum Speichern)",
|
|
60
59
|
"historyOne": "{count} Snapshot im Verlauf",
|
|
61
60
|
"historyOther": "{count} Snapshots im Verlauf",
|
|
62
61
|
"source": "Quelle"
|
|
@@ -127,14 +126,14 @@
|
|
|
127
126
|
"description": "Live-Graph-Ereignisse, vom OS über SSE gestreamt (Berechtigung \"events\").",
|
|
128
127
|
"emptyTitle": "Warte auf Ereignisse",
|
|
129
128
|
"emptyHost": "Noch keine Graph-Ereignisse — Aktivität erscheint hier, sobald sie auftritt.",
|
|
130
|
-
"emptyStandalone": "In Bardioc
|
|
129
|
+
"emptyStandalone": "In Bardioc öffnen (oder eigenständig mit Dev-Auth ausführen), um Live-Ereignisse zu empfangen."
|
|
131
130
|
},
|
|
132
131
|
"notify": {
|
|
133
132
|
"synced": "{count} Stationen synchronisiert",
|
|
134
133
|
"saved": "In IndexedDB gespeichert",
|
|
135
134
|
"stationSelected": "Aktive Station: {name}",
|
|
136
135
|
"localeChanged": "Sprache gewechselt zu {locale}",
|
|
137
|
-
"queryOk": "Anfrage
|
|
136
|
+
"queryOk": "Anfrage OK ({ms} ms)",
|
|
138
137
|
"queryFailed": "Anfrage fehlgeschlagen — zeige simulierte Daten"
|
|
139
138
|
}
|
|
140
139
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"app": { "title": "Weather Dashboard", "tagline": "Live
|
|
2
|
+
"app": { "title": "Weather Dashboard", "tagline": "Live Planetary Readings" },
|
|
3
3
|
"nav": {
|
|
4
4
|
"overview": "Overview",
|
|
5
5
|
"stations": "Stations",
|
|
@@ -9,77 +9,76 @@
|
|
|
9
9
|
},
|
|
10
10
|
"menu": {
|
|
11
11
|
"view": "View",
|
|
12
|
-
"about": "About
|
|
12
|
+
"about": "About This App"
|
|
13
13
|
},
|
|
14
14
|
"about": {
|
|
15
|
-
"title": "About
|
|
15
|
+
"title": "About This App",
|
|
16
16
|
"version": "Version",
|
|
17
17
|
"id": "App ID",
|
|
18
18
|
"description": "Description",
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"source": "Read live from public/app-manifest.json"
|
|
19
|
+
"error": "Could not read app-manifest.json.",
|
|
20
|
+
"source": "Read live from public/app-manifest.json."
|
|
22
21
|
},
|
|
23
22
|
"genericTable": {
|
|
24
|
-
"filterPlaceholder": "Filter
|
|
23
|
+
"filterPlaceholder": "Filter Results…",
|
|
25
24
|
"itemLabel": "rows",
|
|
26
25
|
"showing": "{from} to {to} of {total}",
|
|
27
26
|
"columns": "Columns",
|
|
28
27
|
"noResults": "No results found.",
|
|
29
|
-
"goToPreviousPage": "Go to
|
|
30
|
-
"goToNextPage": "Go to
|
|
28
|
+
"goToPreviousPage": "Go to Previous Page",
|
|
29
|
+
"goToNextPage": "Go to Next Page"
|
|
31
30
|
},
|
|
32
31
|
"common": { "button": { "previous": "Previous", "next": "Next" } },
|
|
33
32
|
"header": {
|
|
34
|
-
"search": "Search
|
|
33
|
+
"search": "Search Stations…",
|
|
35
34
|
"sync": "Sync",
|
|
36
35
|
"syncing": "Syncing…",
|
|
37
36
|
"location": "Station",
|
|
38
37
|
"savedAt": "Saved {time}",
|
|
39
|
-
"neverSaved": "Not
|
|
38
|
+
"neverSaved": "Not Yet Saved"
|
|
40
39
|
},
|
|
41
40
|
"auth": {
|
|
42
|
-
"title": "Connect to Bardioc
|
|
43
|
-
"description": "This dashboard reads live data through the Bardioc SDK transport. It runs when opened inside Bardioc
|
|
44
|
-
"stepsTitle": "Run standalone with
|
|
45
|
-
"step1": "Set DEV_SECRET=<your-secret> and API_BASE_URL=<your-host> in .env",
|
|
41
|
+
"title": "Connect to Bardioc",
|
|
42
|
+
"description": "This dashboard reads live data through the Bardioc SDK transport. It runs when opened inside Bardioc, or standalone with dev auth.",
|
|
43
|
+
"stepsTitle": "Run standalone with dev auth:",
|
|
44
|
+
"step1": "Set DEV_SECRET=<your-secret> and API_BASE_URL=<your-host> in the .env file.",
|
|
46
45
|
"step2": "Start the dev server:",
|
|
47
|
-
"detectedTitle": "Detected
|
|
48
|
-
"insideHost": "Inside
|
|
49
|
-
"devAuth": "Dev
|
|
46
|
+
"detectedTitle": "Detected Environment",
|
|
47
|
+
"insideHost": "Inside Host Iframe",
|
|
48
|
+
"devAuth": "Dev Auth Enabled",
|
|
50
49
|
"yes": "yes",
|
|
51
50
|
"no": "no",
|
|
52
51
|
"retry": "Reload"
|
|
53
52
|
},
|
|
54
53
|
"overview": {
|
|
55
54
|
"operator": "Operator",
|
|
56
|
-
"noOperator": "Operator
|
|
55
|
+
"noOperator": "Operator Unavailable",
|
|
57
56
|
"updated": "Updated {time}",
|
|
58
57
|
"persistence": "Persisted to IndexedDB",
|
|
59
|
-
"notPersisted": "Preview — not persisted (open inside Bardioc
|
|
58
|
+
"notPersisted": "Preview — not persisted (open inside Bardioc to persist)",
|
|
60
59
|
"historyOne": "{count} snapshot in history",
|
|
61
60
|
"historyOther": "{count} snapshots in history",
|
|
62
61
|
"source": "Source"
|
|
63
62
|
},
|
|
64
63
|
"conditions": { "sunny": "Sunny", "cloudy": "Cloudy", "rainy": "Rainy" },
|
|
65
|
-
"source": { "graph": "Bardioc
|
|
64
|
+
"source": { "graph": "Bardioc Graph", "mock": "Simulated" },
|
|
66
65
|
"metrics": {
|
|
67
66
|
"oxygen": "Oxygen",
|
|
68
|
-
"temperature": "Surface
|
|
67
|
+
"temperature": "Surface Temp",
|
|
69
68
|
"humidity": "Humidity",
|
|
70
|
-
"windSpeed": "Wind
|
|
69
|
+
"windSpeed": "Wind Speed",
|
|
71
70
|
"vegetation": "Vegetation",
|
|
72
|
-
"oxygenHint": "Atmospheric
|
|
73
|
-
"temperatureHint": "Ground
|
|
71
|
+
"oxygenHint": "Atmospheric Mix",
|
|
72
|
+
"temperatureHint": "Ground Level",
|
|
74
73
|
"humidityHint": "Relative",
|
|
75
74
|
"windSpeedHint": "Sustained",
|
|
76
|
-
"vegetationHint": "Surface
|
|
75
|
+
"vegetationHint": "Surface Cover"
|
|
77
76
|
},
|
|
78
|
-
"chart": { "title": "7-
|
|
77
|
+
"chart": { "title": "7-Day Outlook", "description": "Daylight hours by condition." },
|
|
79
78
|
"stations": {
|
|
80
|
-
"title": "Monitoring
|
|
79
|
+
"title": "Monitoring Stations",
|
|
81
80
|
"description": "All stations reporting to this instance. Search, filter, or select one.",
|
|
82
|
-
"search": "Search
|
|
81
|
+
"search": "Search Stations…",
|
|
83
82
|
"filter": "Condition",
|
|
84
83
|
"colName": "Station",
|
|
85
84
|
"colRegion": "Region",
|
|
@@ -88,16 +87,16 @@
|
|
|
88
87
|
"colHumidity": "Humidity",
|
|
89
88
|
"colVegetation": "Vegetation",
|
|
90
89
|
"itemLabel": "stations",
|
|
91
|
-
"empty": "No stations match your filters",
|
|
90
|
+
"empty": "No stations match your filters.",
|
|
92
91
|
"apply": "Apply",
|
|
93
92
|
"clear": "Clear"
|
|
94
93
|
},
|
|
95
94
|
"explorer": {
|
|
96
95
|
"title": "Graph Explorer",
|
|
97
96
|
"description": "Run real Bardioc SDK transport requests. Without a session, each request falls back to simulated data so you can still explore the shape.",
|
|
98
|
-
"run": "Run
|
|
97
|
+
"run": "Run Request",
|
|
99
98
|
"running": "Running…",
|
|
100
|
-
"empty": "Select a request and run it to see the response",
|
|
99
|
+
"empty": "Select a request and run it to see the response.",
|
|
101
100
|
"live": "Live",
|
|
102
101
|
"mock": "Simulated",
|
|
103
102
|
"categoryGraph": "Graph",
|
|
@@ -106,35 +105,35 @@
|
|
|
106
105
|
"durationMs": "{ms} ms"
|
|
107
106
|
},
|
|
108
107
|
"profile": {
|
|
109
|
-
"title": "Operator
|
|
108
|
+
"title": "Operator Profile",
|
|
110
109
|
"description": "Pulled live from the OS transport (os.profile).",
|
|
111
110
|
"name": "Name",
|
|
112
|
-
"displayName": "Display
|
|
113
|
-
"firstName": "First
|
|
114
|
-
"lastName": "Last
|
|
111
|
+
"displayName": "Display Name",
|
|
112
|
+
"firstName": "First Name",
|
|
113
|
+
"lastName": "Last Name",
|
|
115
114
|
"email": "Email",
|
|
116
115
|
"id": "ID",
|
|
117
116
|
"organization": "Organization",
|
|
118
117
|
"units": "Units",
|
|
119
118
|
"members": "Members",
|
|
120
|
-
"raw": "Raw
|
|
121
|
-
"errorTitle": "Could
|
|
119
|
+
"raw": "Raw Response",
|
|
120
|
+
"errorTitle": "Could Not Load Profile",
|
|
122
121
|
"errorHint": "The transport returned an error. Authorize a session, then reload.",
|
|
123
122
|
"unknown": "Unknown"
|
|
124
123
|
},
|
|
125
124
|
"events": {
|
|
126
125
|
"title": "Live Events",
|
|
127
126
|
"description": "Live graph events streamed from the OS over SSE (permission \"events\").",
|
|
128
|
-
"emptyTitle": "Waiting for
|
|
127
|
+
"emptyTitle": "Waiting for Events",
|
|
129
128
|
"emptyHost": "No graph events yet — activity will appear here as it happens.",
|
|
130
|
-
"emptyStandalone": "Open inside Bardioc
|
|
129
|
+
"emptyStandalone": "Open inside Bardioc (or run standalone with dev auth) to receive live events."
|
|
131
130
|
},
|
|
132
131
|
"notify": {
|
|
133
|
-
"synced": "Synced {count} stations",
|
|
134
|
-
"saved": "Saved to IndexedDB",
|
|
135
|
-
"stationSelected": "Active station: {name}",
|
|
136
|
-
"localeChanged": "Language switched to {locale}",
|
|
137
|
-
"queryOk": "Request
|
|
138
|
-
"queryFailed": "Request failed — showing simulated data"
|
|
132
|
+
"synced": "Synced {count} stations.",
|
|
133
|
+
"saved": "Saved to IndexedDB.",
|
|
134
|
+
"stationSelected": "Active station: {name}.",
|
|
135
|
+
"localeChanged": "Language switched to {locale}.",
|
|
136
|
+
"queryOk": "Request OK ({ms} ms).",
|
|
137
|
+
"queryFailed": "Request failed — showing simulated data."
|
|
139
138
|
}
|
|
140
139
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { installDevHost, isDevStandalone, isInsideIframe } from '@bardioc/app-sdk/dev';
|
|
2
2
|
import { AppSdkProvider } from '@bardioc/app-sdk/react';
|
|
3
3
|
import { StrictMode } from 'react';
|
|
4
4
|
import { createRoot } from 'react-dom/client';
|
|
@@ -17,13 +17,13 @@ const devStandalone = isDevStandalone();
|
|
|
17
17
|
const useSdkProvider = insideIframe || devStandalone;
|
|
18
18
|
|
|
19
19
|
if (devStandalone) {
|
|
20
|
-
|
|
20
|
+
installDevHost({ appId: APP_NAME });
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
createRoot(document.getElementById('root')!).render(
|
|
24
24
|
<StrictMode>
|
|
25
25
|
{useSdkProvider ? (
|
|
26
|
-
<AppSdkProvider
|
|
26
|
+
<AppSdkProvider>
|
|
27
27
|
<AppI18nProvider syncWithOs>
|
|
28
28
|
<App />
|
|
29
29
|
</AppI18nProvider>
|