Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | 3x 1x 1x 2x 1x 1x 1x 1x 1x | /**
* resolveViewer — resolve the viewer for a commander leaf node.
*
* Priority:
* 1. explicit `viewer` type on the descriptor level (registered viewers)
* 2. model-system recognition — if the node maps to a registered
* `{subject}.{object}` model, the model-generated browse page component key
* is returned (the caller opens it as a portal tab) — see `resolveViewer`
* 3. generic `json` fallback
*/
import {getViewer} from './registry.js';
import type {CommanderViewer} from './registry.js';
export interface ICommanderModelRef {
subject: string;
object: string;
}
/** Leaf meta carried by the source descriptor level. */
export interface ICommanderLeafMeta {
/** Explicit viewer type (registered in the viewer registry). */
viewer?: string;
/** Model-system reference for recognition of `{subject}.{object}` resources. */
model?: ICommanderModelRef;
}
export interface IResolvedViewer {
/** A registered viewer component (for direct mount). */
component?: CommanderViewer;
/** A portal page-action component key (e.g. `component/party.person.browse`). */
page?: string;
/** Resolved type key ('model' when the model system owns it). */
type: string;
}
/**
* Resolve the viewer for a leaf node.
* `models` should be the list of `{subject, object}` pairs declared by the
* model system (e.g. from `subject.model.list` / the model aggregator).
*/
export function resolveViewer(
meta: ICommanderLeafMeta | undefined,
models?: ICommanderModelRef[],
): IResolvedViewer {
if (meta?.viewer) {
const component = getViewer(meta.viewer);
Eif (component) return {component, type: meta.viewer};
}
if (meta?.model) {
const {subject, object} = meta.model;
const recognized = models?.some(m => m.subject === subject && m.object === object);
Eif (recognized) {
return {page: `component/${subject}.${object}.browse`, type: 'model'};
}
}
return {component: getViewer('json'), type: 'json'};
}
|