@opencxh/domain 1.162.0 → 1.164.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.
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Aanwijsbare resources, over app-grenzen heen.
3
+ *
4
+ * Eén vraag die in dit platform steeds terugkwam en tot nu toe per geval werd opgelost: *welke
5
+ * dingen kan ik hier aanwijzen, en hoe heten ze?* Een werkitem koppelen aan een gesprek, een
6
+ * `resource_ref`-veld invullen, straks een bestand aanhaken — drie keer dezelfde vraag aan drie
7
+ * verschillende apps.
8
+ *
9
+ * Het antwoord is een **contract op de servicebus**, niet een HTTP-providerrol: beide vragen
10
+ * worden op de client gesteld door een gebruiker die de bron-app toch al open heeft, en die app
11
+ * heeft zijn gesprekken en bedrijven al in een store staan. Een providerrol zou daar een
12
+ * round-trip van maken voor gegevens die in het geheugen liggen.
13
+ *
14
+ * Drie sleutels, alle drie via `sdk.services.execute` (die de antwoorden van elke geïnstalleerde
15
+ * app als array teruggeeft):
16
+ *
17
+ * | Sleutel | Params | Antwoord |
18
+ * |---|---|---|
19
+ * | `resources.describe` | — | {@link ResourceSourceDescribe} |
20
+ * | `resources.search` | {@link ResourceSearchParams} | {@link ResourceSummary}`[]` |
21
+ * | `resources.resolve` | {@link ResourceResolveParams} | {@link ResourceSummary}`[]` |
22
+ *
23
+ * `describe` is niet cosmetisch: een kiezer tekent zijn soort-filters uit wat er daadwerkelijk
24
+ * antwoordt. Zonder die call zou hij een vaste lijst tonen met tabbladen die leeg blijven zodra
25
+ * een app niet geïnstalleerd is — precies de per-provider aanname die dit contract vermijdt.
26
+ */
27
+ /** De servicebus-sleutels, als constante zodat een typefout niet stil een lege lijst oplevert. */
28
+ export declare const RESOURCE_DESCRIBE_SERVICE = "resources.describe";
29
+ export declare const RESOURCE_SEARCH_SERVICE = "resources.search";
30
+ export declare const RESOURCE_RESOLVE_SERVICE = "resources.resolve";
31
+ /** Eén aanwijsbare resource, zoals de app die hem bezit hem toont. */
32
+ export interface ResourceSummary {
33
+ /**
34
+ * `<kind>:<ref>` — dezelfde vorm die `ScopeAuth` autoriseert en `WorkLink.toKey` draagt.
35
+ *
36
+ * Dit is de identiteit: twee aanbieders die dezelfde resource kennen (comms federeert
37
+ * adresboeken, crm heeft eigen contacten) leveren dezelfde sleutel, en een consument
38
+ * ontdubbelt daarop.
39
+ */
40
+ scopeKey: string;
41
+ /** Het voorvoegsel van {@link ResourceSummary.scopeKey}, apart zodat filteren geen split vraagt. */
42
+ kind: string;
43
+ title: string;
44
+ /** Tweede regel: afzender, e-mailadres, bedrijfsnaam, statuslabel. */
45
+ subtitle?: string;
46
+ /** Lucide-icoonnaam, zoals `TimeTarget.icon`. Afwezig = de consument kiest er zelf één bij de soort. */
47
+ icon?: string;
48
+ /**
49
+ * Pad binnen de shell om deze resource te openen.
50
+ *
51
+ * Afwezig = de regel is niet aanklikbaar. Dat is bewust een aparte staat en geen gok: een
52
+ * verzonnen pad levert een doodlopende navigatie op, en dat is erger dan geen link.
53
+ */
54
+ href?: string;
55
+ /** Sorteerhint; recenter staat hoger. Afwezig telt als oudst. */
56
+ updatedAt?: number;
57
+ /**
58
+ * Andere scopeKeys die bij deze resource horen — het contact en het bedrijf achter een
59
+ * gesprek, de klant achter een zaak.
60
+ *
61
+ * **De bron zegt het, de consument raadt het niet.** Comms weet dat een interactie
62
+ * `partyKeys` heeft; `apps/work` weet dat niet en hoort dat ook niet te weten. Zonder dit
63
+ * veld zou "neem het contact mee" in de koppel-flow een `if (kind === "interaction")` met
64
+ * een comms-specifieke veldnaam worden, en dat breekt bij de volgende aanbieder.
65
+ *
66
+ * Alleen één hop, en alleen wat de bron zelf al in handen heeft: dit is een hint voor een
67
+ * kiezer, geen graaf.
68
+ */
69
+ related?: string[];
70
+ }
71
+ /** Antwoord op `resources.describe`: welke soorten deze app kan zoeken en oplossen. */
72
+ export interface ResourceSourceDescribe {
73
+ kinds: string[];
74
+ }
75
+ /** Params voor `resources.search`. */
76
+ export interface ResourceSearchParams {
77
+ /** Vrije tekst. Leeg = "wat is er recent", niet "alles". */
78
+ query: string;
79
+ /** Beperk tot deze soorten. Leeg/afwezig = alles wat de aanbieder heeft. */
80
+ kinds?: string[];
81
+ /** Maximum per aanbieder, niet in totaal — de consument kapt zelf af na het ontdubbelen. */
82
+ limit?: number;
83
+ }
84
+ /** Params voor `resources.resolve`: van sleutel naar leesbare rij. */
85
+ export interface ResourceResolveParams {
86
+ scopeKeys: string[];
87
+ }
88
+ /**
89
+ * De soort uit een scopeKey, zonder de rest te hoeven splitsen.
90
+ *
91
+ * Losse helper en geen `splitScopeKey`-hergebruik: die zit in `platform-api` (server), en dit
92
+ * contract wordt vooral op de client gelezen.
93
+ */
94
+ export declare function resourceKindOf(scopeKey: string): string;
@@ -32,6 +32,20 @@ export interface InternalSDK<LocalServices extends ServiceMap = {}, TranslationK
32
32
  * that does not exist.
33
33
  */
34
34
  navigateAbsolute(path: string, options?: any): void;
35
+ /**
36
+ * Terug naar de vorige pagina — de echte, inclusief die van een andere app.
37
+ *
38
+ * Waarom dit hier hoort en niet per app: elk detailscherm heeft een terugknop, en zonder
39
+ * gedeelde vorm wordt dat overal een vaste route ("terug" = altijd de lijst) die liegt zodra
40
+ * je van een bord of uit een gesprek komt.
41
+ *
42
+ * `fallback` is app-relatief, net als {@link navigate}, en geldt alleen als er geen vorige
43
+ * pagina ín deze sessie is — dat is precies het geval bij een koud geopende deeplink. Geef je
44
+ * er geen, dan gebeurt er niets: uit het product lopen is geen taak van een terugknop.
45
+ */
46
+ back(fallback?: string): void;
47
+ /** Is er een vorige pagina in deze sessie? Voor een knop die zichzelf wil verbergen. */
48
+ canGoBack(): boolean;
35
49
  currentPath(): string;
36
50
  path$: Observable<string>;
37
51
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opencxh/domain",
3
- "version": "1.162.0",
3
+ "version": "1.164.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",