@owlmeans/client-panel 0.1.18-rc.57 → 0.1.18-rc.58
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 +5 -5
- package/agent-meta/manifest.json +2 -2
- package/agent-meta/skills/client-panel/SKILL.md +16 -15
- package/build/auth/i18n.js +9 -9
- package/build/auth/i18n.js.map +1 -1
- package/build/auth/login/model.d.ts.map +1 -1
- package/build/auth/login/model.js +6 -6
- package/build/auth/login/model.js.map +1 -1
- package/build/components/nav/helper.d.ts +1 -9
- package/build/components/nav/helper.d.ts.map +1 -1
- package/build/components/nav/helper.js +0 -12
- package/build/components/nav/helper.js.map +1 -1
- package/build/components/nav/index.d.ts +1 -0
- package/build/components/nav/index.d.ts.map +1 -1
- package/build/components/nav/index.js +1 -0
- package/build/components/nav/index.js.map +1 -1
- package/build/components/nav/label.d.ts +4 -0
- package/build/components/nav/label.d.ts.map +1 -0
- package/build/components/nav/label.js +12 -0
- package/build/components/nav/label.js.map +1 -0
- package/build/components/nav/types.d.ts +12 -0
- package/build/components/nav/types.d.ts.map +1 -1
- package/build/i18n.js +2 -2
- package/build/i18n.js.map +1 -1
- package/package.json +14 -14
- package/src/auth/i18n.ts +9 -9
- package/src/auth/login/model.ts +6 -9
- package/src/components/nav/helper.ts +1 -19
- package/src/components/nav/index.ts +1 -0
- package/src/components/nav/label.ts +20 -0
- package/src/components/nav/types.ts +13 -0
- package/src/i18n.ts +2 -2
package/README.md
CHANGED
|
@@ -16,7 +16,7 @@ headless navigation model.
|
|
|
16
16
|
## Installation
|
|
17
17
|
|
|
18
18
|
```bash
|
|
19
|
-
bun add @owlmeans/client-panel@^0.1.18-rc.
|
|
19
|
+
bun add @owlmeans/client-panel@^0.1.18-rc.58
|
|
20
20
|
```
|
|
21
21
|
|
|
22
22
|
## Usage
|
|
@@ -130,12 +130,12 @@ Returns `sections` (with `hidden` filtered out), `current` (the active screen's
|
|
|
130
130
|
keyboard-operable, openable in a new tab). It returns `undefined` for a path carrying route
|
|
131
131
|
parameters.
|
|
132
132
|
|
|
133
|
-
### `resolveNavLabel(translate, label, key, alias)`
|
|
133
|
+
### `navLabelHelper.resolveNavLabel(translate, label, key, alias)`
|
|
134
134
|
|
|
135
135
|
Resolves a label as literal `label` → `translate(key, defaultNavLabel(alias))` → the humanized
|
|
136
|
-
alias. `translate` always reaches a component as a **prop**, defaulting to `defaultNavTranslate`
|
|
136
|
+
alias. `translate` always reaches a component as a **prop**, defaulting to `navLabelHelper.defaultNavTranslate`
|
|
137
137
|
(which returns the fallback) — a menu must never read an i18n context implicitly, because an app
|
|
138
|
-
mounted without an i18n provider throws inside render and blanks the page. `defaultNavLabel`
|
|
138
|
+
mounted without an i18n provider throws inside render and blanks the page. `navLabelHelper.defaultNavLabel`
|
|
139
139
|
humanizes the last alias segment
|
|
140
140
|
(`my-app:web:user-list` → `User list`). Default key families are `nav.<section>` and
|
|
141
141
|
`modules.<alias>`.
|
|
@@ -153,7 +153,7 @@ This package ships embedded agent skills under `agent-meta/`. After installing y
|
|
|
153
153
|
your project's skill store (`.agents/skills/`):
|
|
154
154
|
|
|
155
155
|
```sh
|
|
156
|
-
npx @owlmeans/agent-skills@^0.1.18-rc.
|
|
156
|
+
npx @owlmeans/agent-skills@^0.1.18-rc.49
|
|
157
157
|
```
|
|
158
158
|
|
|
159
159
|
The embedded files are version-matched to this package release. Do not edit them
|
package/agent-meta/manifest.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 2,
|
|
3
3
|
"package": "@owlmeans/client-panel",
|
|
4
|
-
"version": "0.1.18-rc.
|
|
5
|
-
"generatedAt": "2026-10-
|
|
4
|
+
"version": "0.1.18-rc.58",
|
|
5
|
+
"generatedAt": "2026-10-05T21:03:06.410Z",
|
|
6
6
|
"canonicalRepo": "https://github.com/owlmeans/common",
|
|
7
7
|
"entries": [
|
|
8
8
|
{
|
|
@@ -8,7 +8,7 @@ user-invocable: false
|
|
|
8
8
|
# @owlmeans/client-panel
|
|
9
9
|
|
|
10
10
|
**Layer:** Client
|
|
11
|
-
**Install:** `"@owlmeans/client-panel": "^0.1.18-rc.
|
|
11
|
+
**Install:** `"@owlmeans/client-panel": "^0.1.18-rc.58"` in `dependencies`
|
|
12
12
|
|
|
13
13
|
## Key Exports
|
|
14
14
|
|
|
@@ -34,7 +34,7 @@ controller; apps may override it through their own `buttons` resource.
|
|
|
34
34
|
| `usePanelLayout()` / `useLayoutTitle(name?, alias?)` / `prepareLayoutTitle(title)` | The entrypoint the current layout is rendering, and its translated title |
|
|
35
35
|
| `BlockScaling` | `Full` / `Half` / `Wide` — the sizing vocabulary both platform families render |
|
|
36
36
|
| `usePanelNav(config)` | Headless navigation model behind a two-layer menu |
|
|
37
|
-
| `resolveNavLabel`,
|
|
37
|
+
| `navLabelHelper` → `.resolveNavLabel`, `.defaultNavLabel`, `.defaultNavTranslate` | Label resolution helpers |
|
|
38
38
|
| `PanelNavConfig`, `PanelNavSection`, `PanelNavItem`, `PanelNavLink`, `PanelNavModel`, `NavTranslate` | Navigation types |
|
|
39
39
|
| `FormProps`, `FormRef`, `FormOnSubmit`, `TFormContext`, `FormFieldProps`, `FormActionProps`, `FormActionRenderArgs`, `InputControllerProps`, `TPanelContext`, `StatusOptions` | The model shapes a renderer is written against |
|
|
40
40
|
|
|
@@ -55,13 +55,13 @@ same split the form and navigation models already use. See `login-methods`.
|
|
|
55
55
|
`@owlmeans/client-auth/login`) rather than a flat `urls: { terms, privacy, cookies? }` — that field
|
|
56
56
|
is gone; nothing in the repo read it outside this model and its one renderer, so it was dropped
|
|
57
57
|
rather than kept alongside the replacement. It also carries `revisedAt?` and `version`. A renderer
|
|
58
|
-
turns `documents`/`notices` into markup with `termsSentence`
|
|
59
|
-
by re-deriving link/label pairs itself.
|
|
58
|
+
turns `documents`/`notices` into markup with `loginTermsHelper.termsSentence`
|
|
59
|
+
(`@owlmeans/client-auth/login`), never by re-deriving link/label pairs itself.
|
|
60
60
|
|
|
61
|
-
`LoginTermsModel.deferred` mirrors `termsDeferred(ctx)`: true once a registered,
|
|
62
|
-
confirms the terms instead of this screen. `LoginMethodsModel.blocked` folds it in
|
|
63
|
-
(`required && !deferred && !accepted`) — a renderer never blocks on `required`/`accepted` alone,
|
|
64
|
-
|
|
61
|
+
`LoginTermsModel.deferred` mirrors `loginTermsHelper.termsDeferred(ctx)`: true once a registered,
|
|
62
|
+
bound `LoginStep` confirms the terms instead of this screen. `LoginMethodsModel.blocked` folds it in
|
|
63
|
+
(`required && !deferred && !accepted`) — a renderer never blocks on `required`/`accepted` alone, or
|
|
64
|
+
it would re-block a screen whose confirmation moved elsewhere.
|
|
65
65
|
|
|
66
66
|
## Usage
|
|
67
67
|
|
|
@@ -122,13 +122,14 @@ alias, or null), `active` (its section), `showSide`, `isSectionActive` / `isItem
|
|
|
122
122
|
- **`showSide` owns the one-screen rule.** It is false when the active section holds a single
|
|
123
123
|
screen — a second level offering the page you are already on is noise. A renderer asks the model;
|
|
124
124
|
it does not count items itself.
|
|
125
|
-
- **Label resolution never touches i18n implicitly.** `NavTranslate` is a
|
|
126
|
-
string` **prop**, defaulting to `defaultNavTranslate`,
|
|
127
|
-
without an i18n provider (`renderApp` from
|
|
128
|
-
reaches for the panel i18n context: the hook
|
|
129
|
-
`react-i18next` returns without an instance, and a
|
|
130
|
-
|
|
131
|
-
`translate
|
|
125
|
+
- **Label resolution never touches i18n implicitly.** `NavTranslate` is a
|
|
126
|
+
`(key, defaultValue) => string` **prop**, defaulting to `navLabelHelper.defaultNavTranslate`,
|
|
127
|
+
which returns the fallback. An app mounted without an i18n provider (`renderApp` from
|
|
128
|
+
`@owlmeans/web-client` mounts none) crashes if a menu reaches for the panel i18n context: the hook
|
|
129
|
+
dereferences `i18n.options` on the empty object `react-i18next` returns without an instance, and a
|
|
130
|
+
throw inside render blanks the whole app.
|
|
131
|
+
`navLabelHelper.resolveNavLabel(translate, label, key, alias)` applies the order — literal `label`
|
|
132
|
+
→ `translate(key, humanized)` → `.defaultNavLabel(alias)`, which humanizes the last alias segment
|
|
132
133
|
(`my-app:web:user-list` → `User list`). Default key families: `nav.<name>` for sections,
|
|
133
134
|
`modules.<alias>` for items and footer links.
|
|
134
135
|
- **Resolving the current screen needs two sources.** The router's `location.state.alias` is
|
package/build/auth/i18n.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { i18nHelper } from '@owlmeans/i18n';
|
|
2
2
|
import en from './i18n/en.json' with { type: 'json' };
|
|
3
3
|
import pl from './i18n/pl.json' with { type: 'json' };
|
|
4
4
|
import ru from './i18n/ru.json' with { type: 'json' };
|
|
@@ -7,12 +7,12 @@ import uk from './i18n/uk.json' with { type: 'json' };
|
|
|
7
7
|
import es from './i18n/es.json' with { type: 'json' };
|
|
8
8
|
import de from './i18n/de.json' with { type: 'json' };
|
|
9
9
|
import fr from './i18n/fr.json' with { type: 'json' };
|
|
10
|
-
addI18nLib('en', 'client-panel-auth', en);
|
|
11
|
-
addI18nLib('pl', 'client-panel-auth', pl);
|
|
12
|
-
addI18nLib('ru', 'client-panel-auth', ru);
|
|
13
|
-
addI18nLib('be', 'client-panel-auth', be);
|
|
14
|
-
addI18nLib('uk', 'client-panel-auth', uk);
|
|
15
|
-
addI18nLib('es', 'client-panel-auth', es);
|
|
16
|
-
addI18nLib('de', 'client-panel-auth', de);
|
|
17
|
-
addI18nLib('fr', 'client-panel-auth', fr);
|
|
10
|
+
i18nHelper.addI18nLib('en', 'client-panel-auth', en);
|
|
11
|
+
i18nHelper.addI18nLib('pl', 'client-panel-auth', pl);
|
|
12
|
+
i18nHelper.addI18nLib('ru', 'client-panel-auth', ru);
|
|
13
|
+
i18nHelper.addI18nLib('be', 'client-panel-auth', be);
|
|
14
|
+
i18nHelper.addI18nLib('uk', 'client-panel-auth', uk);
|
|
15
|
+
i18nHelper.addI18nLib('es', 'client-panel-auth', es);
|
|
16
|
+
i18nHelper.addI18nLib('de', 'client-panel-auth', de);
|
|
17
|
+
i18nHelper.addI18nLib('fr', 'client-panel-auth', fr);
|
|
18
18
|
//# sourceMappingURL=i18n.js.map
|
package/build/auth/i18n.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../src/auth/i18n.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAE3C,OAAO,EAAE,MAAM,gBAAgB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AACrD,OAAO,EAAE,MAAM,gBAAgB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AACrD,OAAO,EAAE,MAAM,gBAAgB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AACrD,OAAO,EAAE,MAAM,gBAAgB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AACrD,OAAO,EAAE,MAAM,gBAAgB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AACrD,OAAO,EAAE,MAAM,gBAAgB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AACrD,OAAO,EAAE,MAAM,gBAAgB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AACrD,OAAO,EAAE,MAAM,gBAAgB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AAErD,UAAU,CAAC,IAAI,EAAE,mBAAmB,EAAE,EAAE,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../src/auth/i18n.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAE3C,OAAO,EAAE,MAAM,gBAAgB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AACrD,OAAO,EAAE,MAAM,gBAAgB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AACrD,OAAO,EAAE,MAAM,gBAAgB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AACrD,OAAO,EAAE,MAAM,gBAAgB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AACrD,OAAO,EAAE,MAAM,gBAAgB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AACrD,OAAO,EAAE,MAAM,gBAAgB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AACrD,OAAO,EAAE,MAAM,gBAAgB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AACrD,OAAO,EAAE,MAAM,gBAAgB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AAErD,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,mBAAmB,EAAE,EAAE,CAAC,CAAA;AACpD,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,mBAAmB,EAAE,EAAE,CAAC,CAAA;AACpD,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,mBAAmB,EAAE,EAAE,CAAC,CAAA;AACpD,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,mBAAmB,EAAE,EAAE,CAAC,CAAA;AACpD,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,mBAAmB,EAAE,EAAE,CAAC,CAAA;AACpD,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,mBAAmB,EAAE,EAAE,CAAC,CAAA;AACpD,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,mBAAmB,EAAE,EAAE,CAAC,CAAA;AACpD,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,mBAAmB,EAAE,EAAE,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/auth/login/model.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/auth/login/model.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AAE3E;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,UAAW,sBAAsB,KAAG,iBAoF/D,CAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useCallback, useMemo, useState } from 'react';
|
|
2
2
|
import { useContext, useNavigate } from '@owlmeans/client';
|
|
3
|
-
import {
|
|
3
|
+
import { resolveCredit, LoginOutcome, LOGIN_SERVICE, loginMethodsHelper, loginTermsHelper } from '@owlmeans/client-auth/login';
|
|
4
4
|
/**
|
|
5
5
|
* Everything a sign-in screen needs, with no opinion about how it looks.
|
|
6
6
|
*
|
|
@@ -14,9 +14,9 @@ export const useLoginMethods = (opts) => {
|
|
|
14
14
|
const login = context.service(LOGIN_SERVICE);
|
|
15
15
|
const cfg = opts?.config ?? context.cfg.security?.auth?.login;
|
|
16
16
|
const brand = context.cfg.brand;
|
|
17
|
-
const resolved = useMemo(() => resolveTerms(opts?.terms ?? cfg?.terms), [opts?.terms, cfg]);
|
|
17
|
+
const resolved = useMemo(() => loginTermsHelper.resolveTerms(opts?.terms ?? cfg?.terms), [opts?.terms, cfg]);
|
|
18
18
|
const credit = useMemo(() => resolveCredit(cfg?.credit, brand, context.cfg.service), [cfg, brand, context]);
|
|
19
|
-
const [accepted, setAccepted] = useState(() => termsAccepted(resolved));
|
|
19
|
+
const [accepted, setAccepted] = useState(() => loginTermsHelper.termsAccepted(resolved));
|
|
20
20
|
const [attempted, setAttempted] = useState(false);
|
|
21
21
|
const [busy, setBusy] = useState(null);
|
|
22
22
|
const [outcome, setOutcome] = useState(null);
|
|
@@ -29,7 +29,7 @@ export const useLoginMethods = (opts) => {
|
|
|
29
29
|
const methods = typeof opts?.methods === 'function'
|
|
30
30
|
? opts.methods(all)
|
|
31
31
|
: opts?.methods ?? all;
|
|
32
|
-
const deferred = termsDeferred(context);
|
|
32
|
+
const deferred = loginTermsHelper.termsDeferred(context);
|
|
33
33
|
const blocked = resolved != null && resolved.required && !deferred && !accepted;
|
|
34
34
|
const select = useCallback((method) => {
|
|
35
35
|
if (blocked) {
|
|
@@ -58,11 +58,11 @@ export const useLoginMethods = (opts) => {
|
|
|
58
58
|
const accept = useCallback((value) => {
|
|
59
59
|
setAccepted(value);
|
|
60
60
|
setAttempted(false);
|
|
61
|
-
acceptTerms(resolved, value);
|
|
61
|
+
loginTermsHelper.acceptTerms(resolved, value);
|
|
62
62
|
}, [resolved]);
|
|
63
63
|
return {
|
|
64
64
|
methods,
|
|
65
|
-
primary: primaryLoginMethod(methods),
|
|
65
|
+
primary: loginMethodsHelper.primaryLoginMethod(methods),
|
|
66
66
|
terms: {
|
|
67
67
|
required: resolved?.required ?? false,
|
|
68
68
|
accepted: resolved == null ? true : accepted,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../../src/auth/login/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACtD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE1D,OAAO,
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../../src/auth/login/model.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,4 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
/** Default resolver: no i18n, the caller's fallback wins. See {@link NavTranslate}. */
|
|
3
|
-
export declare const defaultNavTranslate: NavTranslate;
|
|
4
|
-
/**
|
|
5
|
-
* Turn an alias into something readable — `my-app:web:user-list` becomes `User list`.
|
|
6
|
-
* The last segment is the meaningful one; the prefixes address the app, not the screen.
|
|
7
|
-
*/
|
|
8
|
-
export declare const defaultNavLabel: (alias: string) => string;
|
|
9
|
-
export declare const resolveNavLabel: (translate: NavTranslate, label: string | undefined, key: string, alias?: string) => string;
|
|
1
|
+
import type { PanelNavConfig, PanelNavModel } from './types.js';
|
|
10
2
|
/**
|
|
11
3
|
* The navigation model behind both menus.
|
|
12
4
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helper.d.ts","sourceRoot":"","sources":["../../../src/components/nav/helper.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"helper.d.ts","sourceRoot":"","sources":["../../../src/components/nav/helper.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAgB,aAAa,EAAmB,MAAM,YAAY,CAAA;AAQ9F;;;;;;;;;GASG;AACH,eAAO,MAAM,WAAW,WAAY,cAAc,KAAG,aA6FpD,CAAA"}
|
|
@@ -1,17 +1,5 @@
|
|
|
1
1
|
import { useMemo } from 'react';
|
|
2
2
|
import { useContext, useNavigate } from '@owlmeans/client';
|
|
3
|
-
/** Default resolver: no i18n, the caller's fallback wins. See {@link NavTranslate}. */
|
|
4
|
-
export const defaultNavTranslate = (_key, defaultValue) => defaultValue;
|
|
5
|
-
/**
|
|
6
|
-
* Turn an alias into something readable — `my-app:web:user-list` becomes `User list`.
|
|
7
|
-
* The last segment is the meaningful one; the prefixes address the app, not the screen.
|
|
8
|
-
*/
|
|
9
|
-
export const defaultNavLabel = (alias) => {
|
|
10
|
-
const segment = alias.split(/[:.]/).filter(part => part !== '').pop() ?? alias;
|
|
11
|
-
const words = segment.replace(/[-_]+/g, ' ').trim();
|
|
12
|
-
return words.charAt(0).toUpperCase() + words.slice(1);
|
|
13
|
-
};
|
|
14
|
-
export const resolveNavLabel = (translate, label, key, alias) => label ?? translate(key, defaultNavLabel(alias ?? key));
|
|
15
3
|
const visibleItems = (section) => section.items.filter(item => item.hidden !== true);
|
|
16
4
|
const normalizePath = (path) => path.length > 1 && path.endsWith('/') ? path.slice(0, -1) : path;
|
|
17
5
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helper.js","sourceRoot":"","sources":["../../../src/components/nav/helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAI/B,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAI1D,
|
|
1
|
+
{"version":3,"file":"helper.js","sourceRoot":"","sources":["../../../src/components/nav/helper.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/nav/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,YAAY,CAAA;AAE/B,cAAc,aAAa,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/nav/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,YAAY,CAAA;AAE/B,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/nav/index.ts"],"names":[],"mappings":"AAEA,cAAc,aAAa,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/nav/index.ts"],"names":[],"mappings":"AAEA,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"label.d.ts","sourceRoot":"","sources":["../../../src/components/nav/label.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,YAAY,CAAA;AAE9D,eAAO,MAAM,oBAAoB,QAAO,cAevC,CAAA;AAED,eAAO,MAAM,cAAc,gBAAyB,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export const createNavLabelHelper = () => {
|
|
2
|
+
const defaultNavTranslate = (_key, defaultValue) => defaultValue;
|
|
3
|
+
const defaultNavLabel = (alias) => {
|
|
4
|
+
const segment = alias.split(/[:.]/).filter(part => part !== '').pop() ?? alias;
|
|
5
|
+
const words = segment.replace(/[-_]+/g, ' ').trim();
|
|
6
|
+
return words.charAt(0).toUpperCase() + words.slice(1);
|
|
7
|
+
};
|
|
8
|
+
const resolveNavLabel = (translate, label, key, alias) => label ?? translate(key, defaultNavLabel(alias ?? key));
|
|
9
|
+
return { defaultNavTranslate, defaultNavLabel, resolveNavLabel };
|
|
10
|
+
};
|
|
11
|
+
export const navLabelHelper = createNavLabelHelper();
|
|
12
|
+
//# sourceMappingURL=label.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"label.js","sourceRoot":"","sources":["../../../src/components/nav/label.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAmB,EAAE;IACvD,MAAM,mBAAmB,GAAiB,CAAC,IAAI,EAAE,YAAY,EAAE,EAAE,CAAC,YAAY,CAAA;IAE9E,MAAM,eAAe,GAAG,CAAC,KAAa,EAAU,EAAE;QAChD,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,CAAA;QAC9E,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;QAEnD,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACvD,CAAC,CAAA;IAED,MAAM,eAAe,GAAG,CACtB,SAAuB,EAAE,KAAyB,EAAE,GAAW,EAAE,KAAc,EACvE,EAAE,CAAC,KAAK,IAAI,SAAS,CAAC,GAAG,EAAE,eAAe,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAA;IAEnE,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,eAAe,EAAE,CAAA;AAClE,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,oBAAoB,EAAE,CAAA"}
|
|
@@ -73,4 +73,16 @@ export interface PanelNavModel {
|
|
|
73
73
|
*/
|
|
74
74
|
hrefOf: (target: PanelNavItem | PanelNavSection) => string | undefined;
|
|
75
75
|
}
|
|
76
|
+
/** How a navigation entry gets its label. */
|
|
77
|
+
export interface NavLabelHelper {
|
|
78
|
+
/** Default resolver: no i18n, the caller's fallback wins. See {@link NavTranslate}. */
|
|
79
|
+
defaultNavTranslate: NavTranslate;
|
|
80
|
+
/**
|
|
81
|
+
* Turn an alias into something readable — `my-app:web:user-list` becomes `User list`.
|
|
82
|
+
* The last segment is the meaningful one; the prefixes address the app, not the screen.
|
|
83
|
+
*/
|
|
84
|
+
defaultNavLabel: (alias: string) => string;
|
|
85
|
+
/** The literal label when given, else the translation of `key` falling back to the humanized alias. */
|
|
86
|
+
resolveNavLabel: (translate: NavTranslate, label: string | undefined, key: string, alias?: string) => string;
|
|
87
|
+
}
|
|
76
88
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/nav/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAE1C;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,4GAA4G;IAC5G,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,aAAa,CAAC;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC5C,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,+EAA+E;IAC/E,KAAK,EAAE,YAAY,EAAE,CAAA;IACrB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,eAAe,EAAE,CAAA;CAC5B;AAED,uFAAuF;AACvF,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,yBAAyB;IACzB,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAAA;CAC5C;AAED,MAAM,WAAW,aAAa;IAC5B,qDAAqD;IACrD,QAAQ,EAAE,eAAe,EAAE,CAAA;IAC3B,yEAAyE;IACzE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,MAAM,EAAE,eAAe,GAAG,IAAI,CAAA;IAC9B;;;OAGG;IACH,QAAQ,EAAE,OAAO,CAAA;IACjB,eAAe,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,OAAO,CAAA;IACtD,YAAY,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAA;IAC7C,SAAS,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,MAAM,IAAI,CAAA;IACnD,MAAM,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,MAAM,IAAI,CAAA;IAC1C;;;;;;;OAOG;IACH,MAAM,EAAE,CAAC,MAAM,EAAE,YAAY,GAAG,eAAe,KAAK,MAAM,GAAG,SAAS,CAAA;CACvE"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/nav/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAE1C;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,4GAA4G;IAC5G,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,aAAa,CAAC;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC5C,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,+EAA+E;IAC/E,KAAK,EAAE,YAAY,EAAE,CAAA;IACrB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,eAAe,EAAE,CAAA;CAC5B;AAED,uFAAuF;AACvF,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,yBAAyB;IACzB,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAAA;CAC5C;AAED,MAAM,WAAW,aAAa;IAC5B,qDAAqD;IACrD,QAAQ,EAAE,eAAe,EAAE,CAAA;IAC3B,yEAAyE;IACzE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,MAAM,EAAE,eAAe,GAAG,IAAI,CAAA;IAC9B;;;OAGG;IACH,QAAQ,EAAE,OAAO,CAAA;IACjB,eAAe,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,OAAO,CAAA;IACtD,YAAY,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAA;IAC7C,SAAS,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,MAAM,IAAI,CAAA;IACnD,MAAM,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,MAAM,IAAI,CAAA;IAC1C;;;;;;;OAOG;IACH,MAAM,EAAE,CAAC,MAAM,EAAE,YAAY,GAAG,eAAe,KAAK,MAAM,GAAG,SAAS,CAAA;CACvE;AAED,6CAA6C;AAC7C,MAAM,WAAW,cAAc;IAC7B,uFAAuF;IACvF,mBAAmB,EAAE,YAAY,CAAA;IACjC;;;OAGG;IACH,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;IAC1C,uGAAuG;IACvG,eAAe,EAAE,CAAC,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;CAC7G"}
|
package/build/i18n.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { i18nHelper } from '@owlmeans/i18n';
|
|
2
2
|
import { buttons } from './consts.local.js';
|
|
3
3
|
for (const [language, values] of Object.entries(buttons)) {
|
|
4
|
-
addI18nLib(language, 'client-panel', values);
|
|
4
|
+
i18nHelper.addI18nLib(language, 'client-panel', values);
|
|
5
5
|
}
|
|
6
6
|
//# sourceMappingURL=i18n.js.map
|
package/build/i18n.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.js","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAE3C,KAAK,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;IACzD,UAAU,CAAC,QAAQ,EAAE,cAAc,EAAE,MAAM,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"i18n.js","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAE3C,KAAK,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;IACzD,UAAU,CAAC,UAAU,CAAC,QAAQ,EAAE,cAAc,EAAE,MAAM,CAAC,CAAA;AACzD,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@owlmeans/client-panel",
|
|
3
|
-
"version": "0.1.18-rc.
|
|
3
|
+
"version": "0.1.18-rc.58",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
@@ -36,19 +36,19 @@
|
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
38
|
"@hookform/resolvers": "^5.9.1",
|
|
39
|
-
"@owlmeans/client": "^0.1.18-rc.
|
|
40
|
-
"@owlmeans/client-i18n": "^0.1.18-rc.
|
|
41
|
-
"@owlmeans/client-entrypoint": "^0.1.18-rc.
|
|
42
|
-
"@owlmeans/client-route": "^0.1.18-rc.
|
|
43
|
-
"@owlmeans/error": "^0.1.18-rc.
|
|
44
|
-
"@owlmeans/entrypoint": "^0.1.18-rc.
|
|
39
|
+
"@owlmeans/client": "^0.1.18-rc.51",
|
|
40
|
+
"@owlmeans/client-i18n": "^0.1.18-rc.50",
|
|
41
|
+
"@owlmeans/client-entrypoint": "^0.1.18-rc.47",
|
|
42
|
+
"@owlmeans/client-route": "^0.1.18-rc.48",
|
|
43
|
+
"@owlmeans/error": "^0.1.18-rc.38",
|
|
44
|
+
"@owlmeans/entrypoint": "^0.1.18-rc.41"
|
|
45
45
|
},
|
|
46
46
|
"peerDependencies": {
|
|
47
|
-
"@owlmeans/auth": "^0.1.18-rc.
|
|
48
|
-
"@owlmeans/client-auth": "^0.1.18-rc.
|
|
49
|
-
"@owlmeans/config": "^0.1.18-rc.
|
|
50
|
-
"@owlmeans/i18n": "^0.1.18-rc.
|
|
51
|
-
"@owlmeans/router": "^0.1.18-rc.
|
|
47
|
+
"@owlmeans/auth": "^0.1.18-rc.40",
|
|
48
|
+
"@owlmeans/client-auth": "^0.1.18-rc.58",
|
|
49
|
+
"@owlmeans/config": "^0.1.18-rc.44",
|
|
50
|
+
"@owlmeans/i18n": "^0.1.18-rc.39",
|
|
51
|
+
"@owlmeans/router": "^0.1.18-rc.33",
|
|
52
52
|
"ajv": "*",
|
|
53
53
|
"react": "*",
|
|
54
54
|
"react-hook-form": "*"
|
|
@@ -63,8 +63,8 @@
|
|
|
63
63
|
},
|
|
64
64
|
"devDependencies": {
|
|
65
65
|
"@owlmeans/dep-config": "workspace:*",
|
|
66
|
-
"@owlmeans/auth": "^0.1.18-rc.
|
|
67
|
-
"@owlmeans/client-auth": "^0.1.18-rc.
|
|
66
|
+
"@owlmeans/auth": "^0.1.18-rc.40",
|
|
67
|
+
"@owlmeans/client-auth": "^0.1.18-rc.58",
|
|
68
68
|
"@types/react": "^19.3.0",
|
|
69
69
|
"nodemon": "^3.1.14",
|
|
70
70
|
"react-hook-form": "^7.89.0",
|
package/src/auth/i18n.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { i18nHelper } from '@owlmeans/i18n'
|
|
2
2
|
|
|
3
3
|
import en from './i18n/en.json' with { type: 'json' }
|
|
4
4
|
import pl from './i18n/pl.json' with { type: 'json' }
|
|
@@ -9,11 +9,11 @@ import es from './i18n/es.json' with { type: 'json' }
|
|
|
9
9
|
import de from './i18n/de.json' with { type: 'json' }
|
|
10
10
|
import fr from './i18n/fr.json' with { type: 'json' }
|
|
11
11
|
|
|
12
|
-
addI18nLib('en', 'client-panel-auth', en)
|
|
13
|
-
addI18nLib('pl', 'client-panel-auth', pl)
|
|
14
|
-
addI18nLib('ru', 'client-panel-auth', ru)
|
|
15
|
-
addI18nLib('be', 'client-panel-auth', be)
|
|
16
|
-
addI18nLib('uk', 'client-panel-auth', uk)
|
|
17
|
-
addI18nLib('es', 'client-panel-auth', es)
|
|
18
|
-
addI18nLib('de', 'client-panel-auth', de)
|
|
19
|
-
addI18nLib('fr', 'client-panel-auth', fr)
|
|
12
|
+
i18nHelper.addI18nLib('en', 'client-panel-auth', en)
|
|
13
|
+
i18nHelper.addI18nLib('pl', 'client-panel-auth', pl)
|
|
14
|
+
i18nHelper.addI18nLib('ru', 'client-panel-auth', ru)
|
|
15
|
+
i18nHelper.addI18nLib('be', 'client-panel-auth', be)
|
|
16
|
+
i18nHelper.addI18nLib('uk', 'client-panel-auth', uk)
|
|
17
|
+
i18nHelper.addI18nLib('es', 'client-panel-auth', es)
|
|
18
|
+
i18nHelper.addI18nLib('de', 'client-panel-auth', de)
|
|
19
|
+
i18nHelper.addI18nLib('fr', 'client-panel-auth', fr)
|
package/src/auth/login/model.ts
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
import { useCallback, useMemo, useState } from 'react'
|
|
2
2
|
import { useContext, useNavigate } from '@owlmeans/client'
|
|
3
3
|
import type { CommonConfig } from '@owlmeans/config'
|
|
4
|
-
import {
|
|
5
|
-
acceptTerms, primaryLoginMethod, resolveCredit, resolveTerms, termsAccepted, termsDeferred,
|
|
6
|
-
LoginOutcome, LOGIN_SERVICE,
|
|
7
|
-
} from '@owlmeans/client-auth/login'
|
|
4
|
+
import { resolveCredit, LoginOutcome, LOGIN_SERVICE, loginMethodsHelper, loginTermsHelper } from '@owlmeans/client-auth/login'
|
|
8
5
|
import type { LoginContext, LoginMethod, LoginService } from '@owlmeans/client-auth/login'
|
|
9
6
|
import type { LoginMethodsModel, UseLoginMethodsOptions } from './types.js'
|
|
10
7
|
|
|
@@ -23,12 +20,12 @@ export const useLoginMethods = (opts?: UseLoginMethodsOptions): LoginMethodsMode
|
|
|
23
20
|
const cfg = opts?.config ?? (context.cfg as CommonConfig).security?.auth?.login
|
|
24
21
|
const brand = (context.cfg as CommonConfig).brand
|
|
25
22
|
|
|
26
|
-
const resolved = useMemo(() => resolveTerms(opts?.terms ?? cfg?.terms), [opts?.terms, cfg])
|
|
23
|
+
const resolved = useMemo(() => loginTermsHelper.resolveTerms(opts?.terms ?? cfg?.terms), [opts?.terms, cfg])
|
|
27
24
|
const credit = useMemo(
|
|
28
25
|
() => resolveCredit(cfg?.credit, brand, context.cfg.service), [cfg, brand, context]
|
|
29
26
|
)
|
|
30
27
|
|
|
31
|
-
const [accepted, setAccepted] = useState(() => termsAccepted(resolved))
|
|
28
|
+
const [accepted, setAccepted] = useState(() => loginTermsHelper.termsAccepted(resolved))
|
|
32
29
|
const [attempted, setAttempted] = useState(false)
|
|
33
30
|
const [busy, setBusy] = useState<string | null>(null)
|
|
34
31
|
const [outcome, setOutcome] = useState<LoginOutcome | null>(null)
|
|
@@ -43,7 +40,7 @@ export const useLoginMethods = (opts?: UseLoginMethodsOptions): LoginMethodsMode
|
|
|
43
40
|
? opts.methods(all)
|
|
44
41
|
: opts?.methods ?? all
|
|
45
42
|
|
|
46
|
-
const deferred = termsDeferred(context)
|
|
43
|
+
const deferred = loginTermsHelper.termsDeferred(context)
|
|
47
44
|
const blocked = resolved != null && resolved.required && !deferred && !accepted
|
|
48
45
|
|
|
49
46
|
const select = useCallback((method: LoginMethod) => {
|
|
@@ -75,12 +72,12 @@ export const useLoginMethods = (opts?: UseLoginMethodsOptions): LoginMethodsMode
|
|
|
75
72
|
const accept = useCallback((value: boolean) => {
|
|
76
73
|
setAccepted(value)
|
|
77
74
|
setAttempted(false)
|
|
78
|
-
acceptTerms(resolved, value)
|
|
75
|
+
loginTermsHelper.acceptTerms(resolved, value)
|
|
79
76
|
}, [resolved])
|
|
80
77
|
|
|
81
78
|
return {
|
|
82
79
|
methods,
|
|
83
|
-
primary: primaryLoginMethod(methods),
|
|
80
|
+
primary: loginMethodsHelper.primaryLoginMethod(methods),
|
|
84
81
|
terms: {
|
|
85
82
|
required: resolved?.required ?? false,
|
|
86
83
|
accepted: resolved == null ? true : accepted,
|
|
@@ -4,25 +4,7 @@ import type { ClientEntrypoint } from '@owlmeans/client-entrypoint'
|
|
|
4
4
|
import type { Location } from '@owlmeans/router'
|
|
5
5
|
import { useContext, useNavigate } from '@owlmeans/client'
|
|
6
6
|
|
|
7
|
-
import type {
|
|
8
|
-
|
|
9
|
-
/** Default resolver: no i18n, the caller's fallback wins. See {@link NavTranslate}. */
|
|
10
|
-
export const defaultNavTranslate: NavTranslate = (_key, defaultValue) => defaultValue
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Turn an alias into something readable — `my-app:web:user-list` becomes `User list`.
|
|
14
|
-
* The last segment is the meaningful one; the prefixes address the app, not the screen.
|
|
15
|
-
*/
|
|
16
|
-
export const defaultNavLabel = (alias: string): string => {
|
|
17
|
-
const segment = alias.split(/[:.]/).filter(part => part !== '').pop() ?? alias
|
|
18
|
-
const words = segment.replace(/[-_]+/g, ' ').trim()
|
|
19
|
-
|
|
20
|
-
return words.charAt(0).toUpperCase() + words.slice(1)
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export const resolveNavLabel = (
|
|
24
|
-
translate: NavTranslate, label: string | undefined, key: string, alias?: string
|
|
25
|
-
): string => label ?? translate(key, defaultNavLabel(alias ?? key))
|
|
7
|
+
import type { PanelNavConfig, PanelNavItem, PanelNavModel, PanelNavSection } from './types.js'
|
|
26
8
|
|
|
27
9
|
const visibleItems = (section: PanelNavSection): PanelNavItem[] =>
|
|
28
10
|
section.items.filter(item => item.hidden !== true)
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { NavLabelHelper, NavTranslate } from './types.js'
|
|
2
|
+
|
|
3
|
+
export const createNavLabelHelper = (): NavLabelHelper => {
|
|
4
|
+
const defaultNavTranslate: NavTranslate = (_key, defaultValue) => defaultValue
|
|
5
|
+
|
|
6
|
+
const defaultNavLabel = (alias: string): string => {
|
|
7
|
+
const segment = alias.split(/[:.]/).filter(part => part !== '').pop() ?? alias
|
|
8
|
+
const words = segment.replace(/[-_]+/g, ' ').trim()
|
|
9
|
+
|
|
10
|
+
return words.charAt(0).toUpperCase() + words.slice(1)
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const resolveNavLabel = (
|
|
14
|
+
translate: NavTranslate, label: string | undefined, key: string, alias?: string
|
|
15
|
+
): string => label ?? translate(key, defaultNavLabel(alias ?? key))
|
|
16
|
+
|
|
17
|
+
return { defaultNavTranslate, defaultNavLabel, resolveNavLabel }
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export const navLabelHelper = createNavLabelHelper()
|
|
@@ -77,3 +77,16 @@ export interface PanelNavModel {
|
|
|
77
77
|
*/
|
|
78
78
|
hrefOf: (target: PanelNavItem | PanelNavSection) => string | undefined
|
|
79
79
|
}
|
|
80
|
+
|
|
81
|
+
/** How a navigation entry gets its label. */
|
|
82
|
+
export interface NavLabelHelper {
|
|
83
|
+
/** Default resolver: no i18n, the caller's fallback wins. See {@link NavTranslate}. */
|
|
84
|
+
defaultNavTranslate: NavTranslate
|
|
85
|
+
/**
|
|
86
|
+
* Turn an alias into something readable — `my-app:web:user-list` becomes `User list`.
|
|
87
|
+
* The last segment is the meaningful one; the prefixes address the app, not the screen.
|
|
88
|
+
*/
|
|
89
|
+
defaultNavLabel: (alias: string) => string
|
|
90
|
+
/** The literal label when given, else the translation of `key` falling back to the humanized alias. */
|
|
91
|
+
resolveNavLabel: (translate: NavTranslate, label: string | undefined, key: string, alias?: string) => string
|
|
92
|
+
}
|
package/src/i18n.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { i18nHelper } from '@owlmeans/i18n'
|
|
2
2
|
import { buttons } from './consts.local.js'
|
|
3
3
|
|
|
4
4
|
for (const [language, values] of Object.entries(buttons)) {
|
|
5
|
-
addI18nLib(language, 'client-panel', values)
|
|
5
|
+
i18nHelper.addI18nLib(language, 'client-panel', values)
|
|
6
6
|
}
|