@nnkogift/dhis2-form-utils-devtools 0.1.0-alpha.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 @@
1
+ {"version":3,"sources":["../src/buildGraph.ts","../src/createLabelLookup.ts","../src/effectStyles.ts","../src/i18n.ts","../src/EffectBadge.tsx","../src/formatAgo.ts","../src/formatRuleActionSummary.ts","../src/resolveProgramRulesList.ts","../src/constants.ts","../src/traceStore.ts","../src/attach.ts","../src/RuleDevtoolsScope.tsx","../src/graphLayout.ts","../src/graphNodeStyles.ts","../src/traceEntry.ts","../src/RuleGraphView.tsx","../src/RuleGraphModal.tsx","../src/TraceTimeline.tsx","../src/RulesPanel.tsx"],"names":["jsx","endpoints","useEffect","useMemo","jsxs","useState","NoticeBox","Tag"],"mappings":"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","file":"index.js","sourcesContent":["import type { RuleTraceEntry } from '@nnkogift/dhis2-form-utils-hooks';\nimport type { DevtoolsLabelLookup } from './createLabelLookup';\n\nexport type GraphNodeKind = 'field' | 'section' | 'feedback' | 'rule';\n\nexport type GraphNode = {\n id: string;\n kind: GraphNodeKind;\n label: string;\n};\n\nexport type GraphEdge = {\n id: string;\n source: string;\n target: string;\n effectType?: string;\n fireCount: number;\n};\n\nexport type RuleDependencyGraph = {\n nodes: GraphNode[];\n edges: GraphEdge[];\n};\n\nconst nodeKey = (kind: GraphNodeKind, id: string) => `${kind}:${id}`;\n\nconst edgeKey = (source: string, ruleId: string, target: string, effectType?: string) =>\n `${source}|${ruleId}|${target}|${effectType ?? ''}`;\n\nexport function accumulateGraph(\n previous: RuleDependencyGraph,\n entry: RuleTraceEntry,\n labelLookup?: DevtoolsLabelLookup\n): RuleDependencyGraph {\n const nodes = new Map(previous.nodes.map((node) => [node.id, node]));\n const edges = new Map(previous.edges.map((edge) => [edge.id, edge]));\n\n const ensureNode = (kind: GraphNodeKind, id: string, label: string) => {\n const key = nodeKey(kind, id);\n if (!nodes.has(key)) {\n nodes.set(key, { id: key, kind, label });\n }\n return key;\n };\n\n for (const fieldId of entry.changedFields) {\n ensureNode('field', fieldId, labelLookup?.resolveFieldName(fieldId) ?? fieldId);\n }\n\n for (const ruleResult of entry.ruleResults) {\n const ruleLabel = labelLookup?.resolveRuleName(ruleResult.ruleId) ?? ruleResult.ruleId;\n const ruleNodeId = ensureNode('rule', ruleResult.ruleId, ruleLabel);\n\n for (const fieldId of entry.changedFields) {\n const fieldNodeId = ensureNode(\n 'field',\n fieldId,\n labelLookup?.resolveFieldName(fieldId) ?? fieldId\n );\n const id = edgeKey(fieldNodeId, ruleResult.ruleId, ruleNodeId, 'read');\n const existing = edges.get(id);\n edges.set(id, {\n id,\n source: fieldNodeId,\n target: ruleNodeId,\n effectType: 'read',\n fireCount: (existing?.fireCount ?? 0) + 1,\n });\n }\n\n for (const effect of ruleResult.effects) {\n const targetKind: GraphNodeKind =\n effect.type === 'HIDESECTION'\n ? 'section'\n : effect.type === 'DISPLAYTEXT' || effect.type === 'DISPLAYKEYVALUEPAIR'\n ? 'feedback'\n : 'field';\n\n const targetNodeId = ensureNode(\n targetKind,\n effect.targetId,\n targetKind === 'section'\n ? (labelLookup?.resolveSectionName(effect.targetId) ?? effect.targetId)\n : targetKind === 'field'\n ? (labelLookup?.resolveFieldName(effect.targetId) ?? effect.targetId)\n : effect.targetId\n );\n const id = edgeKey(ruleNodeId, ruleResult.ruleId, targetNodeId, effect.type);\n const existing = edges.get(id);\n edges.set(id, {\n id,\n source: ruleNodeId,\n target: targetNodeId,\n effectType: effect.type,\n fireCount: (existing?.fireCount ?? 0) + 1,\n });\n }\n }\n\n return {\n nodes: [...nodes.values()],\n edges: [...edges.values()],\n };\n}\n\nexport function buildGraphFromTrace(\n entries: readonly RuleTraceEntry[],\n labelLookup?: DevtoolsLabelLookup\n): RuleDependencyGraph {\n return entries.reduce<RuleDependencyGraph>(\n (graph, entry) => accumulateGraph(graph, entry, labelLookup),\n { nodes: [], edges: [] }\n );\n}\n","import type {\n EventProgramMetadata,\n ProgramStageMetadata,\n TrackerProgramMetadata,\n} from '@nnkogift/dhis2-form-utils-metadata';\nimport { selectProgramStage } from '@nnkogift/dhis2-form-utils-metadata';\n\nexport type ProgramStageRef = {\n id?: string;\n displayName?: string;\n};\n\nexport type RuleDevtoolsMetadata =\n | {\n formKind: 'event';\n metadata: EventProgramMetadata;\n programStageId: string;\n }\n | {\n formKind: 'tracker';\n metadata: TrackerProgramMetadata;\n /** Stage names for rules that target a stage — the tracker metadata query itself has no stage list. */\n programStages?: ProgramStageRef[];\n };\n\nexport type DevtoolsLabelLookup = {\n resolveRuleName(id: string): string;\n resolveFieldName(id: string): string;\n resolveSectionName(id: string): string;\n resolveStageName(id: string): string;\n};\n\nconst createLookup = (\n rules: Map<string, string>,\n fields: Map<string, string>,\n sections: Map<string, string>,\n stages: Map<string, string>\n): DevtoolsLabelLookup => ({\n resolveRuleName: (id) => rules.get(id) ?? id,\n resolveFieldName: (id) => fields.get(id) ?? id,\n resolveSectionName: (id) => sections.get(id) ?? id,\n resolveStageName: (id) => stages.get(id) ?? id,\n});\n\nfunction buildEventLookup(source: Extract<RuleDevtoolsMetadata, { formKind: 'event' }>) {\n const rules = new Map<string, string>();\n const fields = new Map<string, string>();\n const sections = new Map<string, string>();\n const stages = new Map<string, string>();\n\n for (const rule of source.metadata.programRules) {\n if (!rule.id) {\n continue;\n }\n rules.set(rule.id, rule.displayName ?? rule.id);\n }\n\n const stage: ProgramStageMetadata = selectProgramStage(\n source.metadata,\n source.programStageId\n ) ?? {\n id: source.programStageId,\n programStageDataElements: [],\n programStageSections: [],\n };\n\n for (const psde of stage.programStageDataElements ?? []) {\n const de = psde.dataElement;\n if (!de?.id) {\n continue;\n }\n fields.set(de.id, de.displayFormName ?? de.displayName ?? de.id);\n }\n\n for (const section of stage.programStageSections ?? []) {\n sections.set(section.id, section.displayName ?? section.id);\n }\n\n for (const programStage of source.metadata.programStages) {\n if (!programStage.id) {\n continue;\n }\n stages.set(programStage.id, programStage.displayName ?? programStage.id);\n }\n\n return createLookup(rules, fields, sections, stages);\n}\n\nfunction buildTrackerLookup(source: Extract<RuleDevtoolsMetadata, { formKind: 'tracker' }>) {\n const rules = new Map<string, string>();\n const fields = new Map<string, string>();\n const sections = new Map<string, string>();\n const stages = new Map<string, string>();\n\n for (const rule of source.metadata.programRules) {\n if (!rule.id) {\n continue;\n }\n rules.set(rule.id, rule.name ?? rule.id);\n }\n\n for (const ptea of source.metadata.programTrackedEntityAttributes) {\n const tea = ptea.trackedEntityAttribute;\n if (!tea.id) {\n continue;\n }\n fields.set(tea.id, tea.formName ?? tea.displayName ?? tea.id);\n }\n\n for (const section of source.metadata.programSections ?? []) {\n sections.set(section.id, section.displayName ?? section.id);\n }\n\n for (const programStage of source.programStages ?? []) {\n if (!programStage.id) {\n continue;\n }\n stages.set(programStage.id, programStage.displayName ?? programStage.id);\n }\n\n return createLookup(rules, fields, sections, stages);\n}\n\nexport function createLabelLookup(source: RuleDevtoolsMetadata): DevtoolsLabelLookup {\n return source.formKind === 'event' ? buildEventLookup(source) : buildTrackerLookup(source);\n}\n","import type { FC } from 'react';\nimport {\n IconEdit16,\n IconErrorFilled16,\n IconInfo16,\n IconLink16,\n IconMail16,\n IconMessages16,\n IconStarFilled16,\n IconView16,\n IconViewOff16,\n IconWarningFilled16,\n type IconProps,\n} from '@dhis2/ui';\n\nexport type EffectVisualVariant =\n | 'hide'\n | 'show'\n | 'assign'\n | 'mandatory'\n | 'warning'\n | 'error'\n | 'feedback'\n | 'message'\n | 'read'\n | 'default';\n\nexport type EffectVisual = {\n variant: EffectVisualVariant;\n tagClassName: string;\n edgeStroke: string;\n shortLabel: string;\n};\n\nconst EFFECT_VARIANT: Record<string, EffectVisualVariant> = {\n HIDEFIELD: 'hide',\n HIDEOPTION: 'hide',\n HIDEOPTIONGROUP: 'hide',\n HIDESECTION: 'hide',\n HIDEPROGRAMSTAGE: 'hide',\n SHOWFIELD: 'show',\n SHOWOPTION: 'show',\n SHOWOPTIONGROUP: 'show',\n ASSIGN: 'assign',\n SETMANDATORYFIELD: 'mandatory',\n UNSETMANDATORYFIELD: 'mandatory',\n SHOWWARNING: 'warning',\n WARNINGONCOMPLETE: 'warning',\n SHOWERROR: 'error',\n ERRORONCOMPLETE: 'error',\n DISPLAYTEXT: 'feedback',\n DISPLAYKEYVALUEPAIR: 'feedback',\n SENDMESSAGE: 'message',\n SCHEDULEMESSAGE: 'message',\n read: 'read',\n};\n\nconst EFFECT_VISUALS: Record<EffectVisualVariant, Omit<EffectVisual, 'variant'>> = {\n hide: {\n tagClassName: 'bg-dhis2-grey-200 text-dhis2-grey-900',\n edgeStroke: '#494949',\n shortLabel: 'hide',\n },\n show: {\n tagClassName: 'bg-dhis2-green-100 text-dhis2-green-900',\n edgeStroke: '#388e3c',\n shortLabel: 'show',\n },\n assign: {\n tagClassName: 'bg-dhis2-blue-100 text-dhis2-blue-900',\n edgeStroke: '#1565c0',\n shortLabel: 'assign',\n },\n mandatory: {\n tagClassName: 'bg-dhis2-yellow-100 text-dhis2-yellow-900',\n edgeStroke: '#e56408',\n shortLabel: 'required',\n },\n warning: {\n tagClassName: 'bg-dhis2-yellow-100 text-dhis2-yellow-900',\n edgeStroke: '#ff8302',\n shortLabel: 'warn',\n },\n error: {\n tagClassName: 'bg-dhis2-red-100 text-dhis2-red-900',\n edgeStroke: '#c62828',\n shortLabel: 'error',\n },\n feedback: {\n tagClassName: 'bg-dhis2-purple-100 text-dhis2-purple-900',\n edgeStroke: '#9c27b0',\n shortLabel: 'feedback',\n },\n message: {\n tagClassName: 'bg-dhis2-teal-100 text-dhis2-teal-900',\n edgeStroke: '#00796b',\n shortLabel: 'message',\n },\n read: {\n tagClassName: 'bg-dhis2-teal-100 text-dhis2-teal-900',\n edgeStroke: '#00796b',\n shortLabel: 'read',\n },\n default: {\n tagClassName: 'bg-dhis2-grey-100 text-dhis2-grey-800',\n edgeStroke: '#494949',\n shortLabel: 'effect',\n },\n};\n\nexport const EFFECT_ICONS: Record<EffectVisualVariant, FC<IconProps>> = {\n hide: IconViewOff16,\n show: IconView16,\n assign: IconEdit16,\n mandatory: IconStarFilled16,\n warning: IconWarningFilled16,\n error: IconErrorFilled16,\n feedback: IconMessages16,\n message: IconMail16,\n read: IconLink16,\n default: IconInfo16,\n};\n\n/** @deprecated Use getEffectVisual().variant */\nexport type EffectTagVariant = EffectVisualVariant;\n\nexport function getEffectVariant(type: string): EffectVisualVariant {\n return EFFECT_VARIANT[type] ?? 'default';\n}\n\nexport function getEffectVisual(type: string): EffectVisual {\n const variant = getEffectVariant(type);\n return { variant, ...EFFECT_VISUALS[variant] };\n}\n\nexport function getEffectTagVariant(type: string): EffectVisualVariant {\n return getEffectVariant(type);\n}\n\nexport type EffectTagRenderProps = {\n neutral?: boolean;\n positive?: boolean;\n negative?: boolean;\n className?: string;\n};\n\nconst TAG_LAYOUT_CLASS = 'max-w-full break-words';\n\nfunction tagPropsForVariant(variant: EffectVisualVariant): EffectTagRenderProps {\n switch (variant) {\n case 'show':\n return { positive: true, className: TAG_LAYOUT_CLASS };\n case 'error':\n return { negative: true, className: TAG_LAYOUT_CLASS };\n case 'assign':\n return { neutral: true, className: TAG_LAYOUT_CLASS };\n case 'hide':\n case 'mandatory':\n case 'warning':\n case 'feedback':\n case 'message':\n case 'read':\n return {\n className: `${TAG_LAYOUT_CLASS} ${EFFECT_VISUALS[variant].tagClassName}`,\n };\n default:\n return {\n className: `${TAG_LAYOUT_CLASS} ${EFFECT_VISUALS.default.tagClassName}`,\n };\n }\n}\n\nexport function getEffectTagRenderProps(type: string): EffectTagRenderProps {\n return tagPropsForVariant(getEffectVariant(type));\n}\n\nexport function getEffectTagRenderPropsForVariant(\n variant: EffectVisualVariant\n): EffectTagRenderProps {\n return tagPropsForVariant(variant);\n}\n\nexport function getEffectEdgeStroke(type: string, highlighted = true): string {\n const { edgeStroke } = getEffectVisual(type);\n if (highlighted) {\n return edgeStroke;\n }\n return '#bdbdbd';\n}\n\nexport function getEffectShortLabel(type: string): string {\n return getEffectVisual(type).shortLabel;\n}\n","import i18n from '@dhis2/d2-i18n';\n\ntype TranslateVariables = Record<string, string | number>;\n\nexport function translate(message: string, variables?: TranslateVariables): string {\n return String(i18n.t(message, variables));\n}\n","import { Tag } from '@dhis2/ui';\nimport type { ReactNode } from 'react';\nimport {\n EFFECT_ICONS,\n getEffectTagRenderProps,\n getEffectTagRenderPropsForVariant,\n getEffectVariant,\n type EffectVisualVariant,\n} from './effectStyles';\nimport { translate } from './i18n';\n\nexport type EffectBadgeProps = {\n type: string;\n children?: ReactNode;\n className?: string;\n};\n\nexport function EffectBadge({ type, children, className = '' }: EffectBadgeProps) {\n const variant = getEffectVariant(type);\n const Icon = EFFECT_ICONS[variant];\n const tagProps = getEffectTagRenderProps(type);\n const label = children ?? type;\n\n return (\n <Tag\n {...tagProps}\n icon={<Icon aria-hidden=\"true\" />}\n className={[tagProps.className, className].filter(Boolean).join(' ')}\n maxWidth=\"100%\"\n >\n {label}\n </Tag>\n );\n}\n\nconst LEGEND_VARIANTS: Array<{ variant: EffectVisualVariant; label: string }> = [\n { variant: 'read', label: translate('Read') },\n { variant: 'hide', label: translate('Hide') },\n { variant: 'show', label: translate('Show') },\n { variant: 'assign', label: translate('Assign') },\n { variant: 'mandatory', label: translate('Required') },\n { variant: 'warning', label: translate('Warning') },\n { variant: 'error', label: translate('Error') },\n { variant: 'feedback', label: translate('Feedback') },\n];\n\nexport type EffectLegendProps = {\n activeVariants: ReadonlySet<EffectVisualVariant>;\n};\n\nexport function EffectLegend({ activeVariants }: EffectLegendProps) {\n const items = LEGEND_VARIANTS.filter((item) => activeVariants.has(item.variant));\n\n if (!items.length) {\n return null;\n }\n\n return (\n <div className=\"flex min-w-0 flex-wrap items-center gap-dp8 border-t border-dhis2-grey-200 px-dp12 py-dp8\">\n {items.map((item) => {\n const Icon = EFFECT_ICONS[item.variant];\n const tagProps = getEffectTagRenderPropsForVariant(item.variant);\n\n return (\n <Tag\n key={item.variant}\n {...tagProps}\n icon={<Icon aria-hidden=\"true\" />}\n maxWidth=\"100%\"\n >\n {item.label}\n </Tag>\n );\n })}\n </div>\n );\n}\n","import { translate } from './i18n';\n\nexport function formatAgo(timestamp: number, now = Date.now()): string {\n const diffMs = Math.max(0, now - timestamp);\n\n if (diffMs < 5_000) {\n return translate('just now');\n }\n\n const seconds = Math.floor(diffMs / 1_000);\n if (seconds < 60) {\n return translate('{{seconds}}s ago', { seconds });\n }\n\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) {\n return translate('{{minutes}}m ago', { minutes });\n }\n\n const hours = Math.floor(minutes / 60);\n if (hours < 24) {\n return translate('{{hours}}h ago', { hours });\n }\n\n return new Date(timestamp).toLocaleString();\n}\n","import type { DevtoolsLabelLookup } from './createLabelLookup';\n\nexport type RuleActionLike = {\n programRuleActionType?: string;\n dataElement?: { id?: string; displayName?: string };\n trackedEntityAttribute?: { id?: string; displayName?: string };\n programStageSection?: { id?: string; displayName?: string };\n programSection?: { id?: string; displayName?: string };\n data?: string | null;\n content?: string | null;\n location?: string | null;\n};\n\nexport type FormattedRuleAction = {\n type: string;\n targetLabel: string;\n detail?: string;\n};\n\nfunction resolveFieldLabel(\n id: string,\n displayName: string | undefined,\n labelLookup?: DevtoolsLabelLookup\n): string {\n if (labelLookup) {\n const resolved = labelLookup.resolveFieldName(id);\n if (resolved !== id) {\n return resolved;\n }\n }\n return displayName ?? id;\n}\n\nfunction resolveSectionLabel(\n id: string,\n displayName: string | undefined,\n labelLookup?: DevtoolsLabelLookup\n): string {\n if (labelLookup) {\n const resolved = labelLookup.resolveSectionName(id);\n if (resolved !== id) {\n return resolved;\n }\n }\n return displayName ?? id;\n}\n\nexport function formatRuleActionSummary(\n action: RuleActionLike,\n labelLookup?: DevtoolsLabelLookup\n): FormattedRuleAction {\n const type = action.programRuleActionType ?? 'UNKNOWN';\n\n let targetLabel = '';\n if (action.dataElement?.id) {\n targetLabel = resolveFieldLabel(\n action.dataElement.id,\n action.dataElement.displayName,\n labelLookup\n );\n } else if (action.trackedEntityAttribute?.id) {\n targetLabel = resolveFieldLabel(\n action.trackedEntityAttribute.id,\n action.trackedEntityAttribute.displayName,\n labelLookup\n );\n } else if (action.programStageSection?.id) {\n targetLabel = resolveSectionLabel(\n action.programStageSection.id,\n action.programStageSection.displayName,\n labelLookup\n );\n } else if (action.programSection?.id) {\n targetLabel = resolveSectionLabel(\n action.programSection.id,\n action.programSection.displayName,\n labelLookup\n );\n } else if (type === 'DISPLAYTEXT' || type === 'DISPLAYKEYVALUEPAIR') {\n targetLabel = action.location ?? 'feedback';\n }\n\n let detail: string | undefined;\n if (action.data) {\n detail = action.data;\n }\n if (action.content && (type === 'DISPLAYTEXT' || type === 'DISPLAYKEYVALUEPAIR')) {\n detail = action.content;\n }\n\n return { type, targetLabel, detail };\n}\n","import type { RuleDevtoolsMetadata } from './createLabelLookup';\nimport type { RuleActionLike } from './formatRuleActionSummary';\n\nexport type CatalogRule = {\n id: string;\n name: string;\n condition?: string;\n priority?: number;\n programRuleActions: RuleActionLike[];\n /** Stage the rule applies to, or `null` for attribute-only/global rules. */\n programStageId: string | null;\n};\n\nfunction sortByPriority(rules: CatalogRule[]): CatalogRule[] {\n return [...rules].sort((left, right) => (left.priority ?? 0) - (right.priority ?? 0));\n}\n\nfunction toCatalogRule(rule: {\n id: string;\n name: string;\n condition?: string;\n priority?: number;\n programRuleActions?: readonly RuleActionLike[] | null;\n programStageId: string | null;\n}): CatalogRule {\n return {\n id: rule.id,\n name: rule.name,\n condition: rule.condition,\n priority: rule.priority,\n programRuleActions: [...(rule.programRuleActions ?? [])],\n programStageId: rule.programStageId,\n };\n}\n\n/**\n * The full program rule catalog — every rule regardless of which slot is currently\n * being viewed. `RulesPanel` derives in-scope/out-of-scope status from `programStageId`\n * against the slot it renders, so this must not pre-filter by stage.\n */\nexport function resolveProgramRulesList(metadata: RuleDevtoolsMetadata): CatalogRule[] {\n if (metadata.formKind === 'event') {\n return sortByPriority(\n metadata.metadata.programRules\n .filter((rule): rule is typeof rule & { id: string } => Boolean(rule.id))\n .map((rule) =>\n toCatalogRule({\n id: rule.id,\n name: rule.displayName ?? rule.id,\n condition: rule.condition,\n priority: rule.priority,\n programRuleActions: rule.programRuleActions,\n programStageId: rule.programStage?.id ?? null,\n })\n )\n );\n }\n\n return sortByPriority(\n metadata.metadata.programRules\n .filter((rule): rule is typeof rule & { id: string } => Boolean(rule.id))\n .map((rule) =>\n toCatalogRule({\n id: rule.id,\n name: rule.name ?? rule.id,\n condition: rule.condition,\n priority: rule.priority,\n programRuleActions: rule.programRuleActions,\n programStageId: rule.programStage?.id ?? null,\n })\n )\n );\n}\n","export const DEFAULT_TRACE_MAX_ENTRIES = 200;\n","import type { RuleTraceEntry } from '@nnkogift/dhis2-form-utils-hooks';\nimport { DEFAULT_TRACE_MAX_ENTRIES } from './constants';\n\ntype Listener = () => void;\n\nexport type RuleTraceStore = {\n record: (entry: RuleTraceEntry) => void;\n getSnapshot: () => readonly RuleTraceEntry[];\n subscribe: (listener: Listener) => () => void;\n dispose: () => void;\n};\n\nexport function createRuleTraceStore(maxEntries = DEFAULT_TRACE_MAX_ENTRIES): RuleTraceStore {\n let entries: RuleTraceEntry[] = [];\n const listeners = new Set<Listener>();\n let disposeTraceSubscription: (() => void) | null = null;\n\n const notify = () => {\n for (const listener of listeners) {\n listener();\n }\n };\n\n return {\n record(entry) {\n entries = [...entries, entry].slice(-maxEntries);\n notify();\n },\n getSnapshot() {\n return entries;\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n dispose() {\n disposeTraceSubscription?.();\n disposeTraceSubscription = null;\n listeners.clear();\n },\n bindTraceSubscription(unsubscribe: () => void) {\n disposeTraceSubscription = unsubscribe;\n },\n } as RuleTraceStore & {\n bindTraceSubscription: (unsubscribe: () => void) => void;\n };\n}\n","import type { FormStore } from '@nnkogift/dhis2-form-utils-hooks';\nimport { DEFAULT_TRACE_MAX_ENTRIES } from './constants';\nimport { createRuleTraceStore, type RuleTraceStore } from './traceStore';\n\nexport function attachRuleDevtools(\n formStore: FormStore,\n options?: { maxEntries?: number }\n): RuleTraceStore {\n const store = createRuleTraceStore(\n options?.maxEntries ?? DEFAULT_TRACE_MAX_ENTRIES\n ) as RuleTraceStore & {\n bindTraceSubscription: (unsubscribe: () => void) => void;\n };\n\n store.bindTraceSubscription(formStore.subscribeTrace(store.record));\n\n return store;\n}\n","import type { FormStore } from '@nnkogift/dhis2-form-utils-hooks';\nimport { createContext, useContext, useEffect, useMemo, type ReactNode } from 'react';\nimport { attachRuleDevtools } from './attach';\nimport type { RuleTraceStore } from './traceStore';\n\nconst RuleTraceContext = createContext<RuleTraceStore | null>(null);\n\nexport type RuleDevtoolsScopeProps = {\n formStore: FormStore;\n children: ReactNode;\n};\n\nexport function RuleDevtoolsScope({ formStore, children }: RuleDevtoolsScopeProps) {\n const traceStore = useMemo(() => attachRuleDevtools(formStore), [formStore]);\n\n useEffect(() => {\n return () => {\n traceStore.dispose();\n };\n }, [traceStore]);\n\n return <RuleTraceContext.Provider value={traceStore}>{children}</RuleTraceContext.Provider>;\n}\n\nexport function useRuleTraceStore(): RuleTraceStore {\n const store = useContext(RuleTraceContext);\n if (!store) {\n throw new Error('useRuleTraceStore must be used within RuleDevtoolsScope');\n }\n return store;\n}\n","import type { GraphEdge, GraphNodeKind, RuleDependencyGraph } from './buildGraph';\n\nexport type GraphNodePosition = { x: number; y: number };\n\nexport type FlowGraphRole = 'source' | 'rule' | 'target';\n\n/** A single visual node in the React Flow canvas (may differ from the semantic graph node). */\nexport type FlowGraphNode = {\n id: string;\n graphNodeId: string;\n kind: GraphNodeKind;\n label: string;\n role: FlowGraphRole;\n};\n\nexport type PreparedFlowGraph = {\n nodes: FlowGraphNode[];\n edges: GraphEdge[];\n};\n\n/** Column x-coordinates by node role. Effect targets always sit to the right of rules. */\nexport const ROLE_COLUMNS: Record<FlowGraphRole, number> = {\n source: 0,\n rule: 280,\n target: 560,\n};\n\n/** Feedback targets get an extra column so they never overlap sections/field targets. */\nexport const FEEDBACK_COLUMN = 720;\n\n/** Vertical distance between rule lanes. */\nexport const LANE_HEIGHT = 104;\n\n/** Vertical spread applied to nodes that land in the same column and lane. */\nconst STAGGER = 24;\n\nfunction median(values: number[]): number {\n const sorted = [...values].sort((a, b) => a - b);\n const mid = Math.floor(sorted.length / 2);\n return sorted.length % 2 === 0 ? (sorted[mid - 1] + sorted[mid]) / 2 : sorted[mid];\n}\n\n/** Centered spread: 0, +24, -24, +48, -48, … so a bucket fans out around its lane. */\nfunction staggerOffset(indexInBucket: number): number {\n if (indexInBucket === 0) {\n return 0;\n }\n const magnitude = Math.ceil(indexInBucket / 2) * STAGGER;\n return indexInBucket % 2 === 1 ? magnitude : -magnitude;\n}\n\nfunction columnFor(node: FlowGraphNode): number {\n if (node.role === 'target' && node.kind === 'feedback') {\n return FEEDBACK_COLUMN;\n }\n return ROLE_COLUMNS[node.role];\n}\n\n/**\n * Expands the semantic graph into flow nodes so every edge runs left → right.\n * Fields that are both read sources and effect targets are split into `@src` /\n * `@tgt` copies at the source and target columns respectively.\n */\nexport function prepareFlowGraph(graph: RuleDependencyGraph): PreparedFlowGraph {\n const readSources = new Set<string>();\n const effectTargets = new Set<string>();\n\n for (const edge of graph.edges) {\n if (edge.effectType === 'read') {\n readSources.add(edge.source);\n } else {\n effectTargets.add(edge.target);\n }\n }\n\n const flowNodes: FlowGraphNode[] = [];\n const endpointByGraphId = new Map<string, { source?: string; target?: string }>();\n\n for (const node of graph.nodes) {\n if (node.kind === 'rule') {\n flowNodes.push({\n id: node.id,\n graphNodeId: node.id,\n kind: node.kind,\n label: node.label,\n role: 'rule',\n });\n continue;\n }\n\n const isSource = readSources.has(node.id);\n const isTarget = effectTargets.has(node.id);\n const endpoints: { source?: string; target?: string } = {};\n\n if (isSource) {\n const flowId = isTarget ? `${node.id}@src` : node.id;\n endpoints.source = flowId;\n flowNodes.push({\n id: flowId,\n graphNodeId: node.id,\n kind: node.kind,\n label: node.label,\n role: 'source',\n });\n }\n\n if (isTarget) {\n const flowId = isSource ? `${node.id}@tgt` : node.id;\n endpoints.target = flowId;\n flowNodes.push({\n id: flowId,\n graphNodeId: node.id,\n kind: node.kind,\n label: node.label,\n role: 'target',\n });\n }\n\n endpointByGraphId.set(node.id, endpoints);\n }\n\n const flowEdges = graph.edges.map((edge) => {\n if (edge.effectType === 'read') {\n const endpoints = endpointByGraphId.get(edge.source);\n return { ...edge, source: endpoints?.source ?? edge.source };\n }\n const endpoints = endpointByGraphId.get(edge.target);\n return { ...edge, target: endpoints?.target ?? edge.target };\n });\n\n return { nodes: flowNodes, edges: flowEdges };\n}\n\n/**\n * Rule-centric lane layout on flow nodes. Each rule owns one horizontal lane;\n * sources sit left, targets right, so every edge flows in the same direction.\n */\nexport function computeGraphLayout(\n flowNodes: FlowGraphNode[],\n flowEdges: GraphEdge[]\n): Map<string, GraphNodePosition> {\n const positions = new Map<string, GraphNodePosition>();\n\n const ruleLane = new Map<string, number>();\n flowNodes\n .filter((node) => node.role === 'rule')\n .forEach((node, index) => {\n ruleLane.set(node.id, index);\n positions.set(node.id, { x: ROLE_COLUMNS.rule, y: index * LANE_HEIGHT });\n });\n\n const connectedRuleLanes = new Map<string, Set<number>>();\n const addLane = (nodeId: string, lane: number) => {\n const lanes = connectedRuleLanes.get(nodeId) ?? new Set<number>();\n lanes.add(lane);\n connectedRuleLanes.set(nodeId, lanes);\n };\n\n for (const edge of flowEdges) {\n const sourceLane = ruleLane.get(edge.source);\n const targetLane = ruleLane.get(edge.target);\n if (targetLane !== undefined && sourceLane === undefined) {\n addLane(edge.source, targetLane);\n }\n if (sourceLane !== undefined && targetLane === undefined) {\n addLane(edge.target, sourceLane);\n }\n }\n\n const bucketCounts = new Map<string, number>();\n for (const node of flowNodes) {\n if (node.role === 'rule') {\n continue;\n }\n const lanes = connectedRuleLanes.get(node.id);\n const lane = lanes && lanes.size > 0 ? median([...lanes]) : 0;\n const column = columnFor(node);\n const bucketKey = `${String(column)}:${String(lane)}`;\n const indexInBucket = bucketCounts.get(bucketKey) ?? 0;\n bucketCounts.set(bucketKey, indexInBucket + 1);\n positions.set(node.id, {\n x: column,\n y: lane * LANE_HEIGHT + staggerOffset(indexInBucket),\n });\n }\n\n return positions;\n}\n\n/** @deprecated Use ROLE_COLUMNS.source */\nexport const KIND_COLUMNS = {\n field: ROLE_COLUMNS.source,\n rule: ROLE_COLUMNS.rule,\n section: ROLE_COLUMNS.target,\n feedback: FEEDBACK_COLUMN,\n} as const;\n","import type { GraphNode } from './buildGraph';\n\nconst GRAPH_NODE_CLASSES: Record<GraphNode['kind'], string> = {\n field: 'border-dhis2-blue-500',\n rule: 'border-dhis2-teal-600 bg-dhis2-teal-050',\n section: 'border-dhis2-grey-600',\n feedback: 'border-dhis2-purple-500',\n};\n\nconst LEGEND_SWATCH_CLASSES: Record<GraphNode['kind'], string> = {\n field: 'bg-dhis2-blue-500',\n rule: 'bg-dhis2-teal-600',\n section: 'bg-dhis2-grey-600',\n feedback: 'bg-dhis2-purple-500',\n};\n\nexport function getGraphNodeClassName(kind: GraphNode['kind'], highlighted: boolean): string {\n return `p-dp8 rounded border bg-white min-w-28 max-w-[180px] text-xs shadow-[0_1px_2px_rgb(0_0_0/6%)] transition-opacity duration-150 ease-out cursor-grab active:cursor-grabbing ${GRAPH_NODE_CLASSES[kind]} ${\n highlighted ? '' : 'opacity-35'\n }`;\n}\n\nexport function getLegendSwatchClassName(kind: GraphNode['kind']): string {\n return `size-2.5 shrink-0 rounded-sm ${LEGEND_SWATCH_CLASSES[kind]}`;\n}\n","import type { RuleTraceEntry } from '@nnkogift/dhis2-form-utils-hooks';\n\n/**\n * Resolves which trace entry the dependency graph should render.\n * Defaults to the latest evaluation (active rules); uses the selected\n * trace entry when the user is inspecting a past evaluation.\n */\nexport function resolveGraphTraceEntry(\n entries: readonly RuleTraceEntry[],\n selectedEntryId?: string | null\n): RuleTraceEntry | null {\n if (!entries.length) {\n return null;\n }\n if (selectedEntryId) {\n return entries.find((entry) => entry.id === selectedEntryId) ?? entries[entries.length - 1];\n }\n return entries[entries.length - 1];\n}\n\n/** Rule IDs that fired in the latest evaluation cycle. */\nexport function getActiveRuleIds(entries: readonly RuleTraceEntry[]): ReadonlySet<string> {\n const latest = resolveGraphTraceEntry(entries);\n if (!latest) {\n return new Set<string>();\n }\n return new Set(latest.ruleResults.map((result) => result.ruleId));\n}\n","import { memo, useEffect, useMemo, useState, type ReactNode } from 'react';\nimport {\n Background,\n BaseEdge,\n Controls,\n EdgeLabelRenderer,\n type Edge,\n type EdgeProps,\n getSmoothStepPath,\n Handle,\n MarkerType,\n type Node,\n type NodeProps,\n Position,\n ReactFlow,\n ReactFlowProvider,\n useEdgesState,\n useNodesState,\n useReactFlow,\n} from '@xyflow/react';\nimport { NoticeBox } from '@dhis2/ui';\nimport type { RuleTraceEntry } from '@nnkogift/dhis2-form-utils-hooks';\nimport type { FormStore } from '@nnkogift/dhis2-form-utils-hooks';\nimport { buildGraphFromTrace, type GraphNode, type RuleDependencyGraph } from './buildGraph';\nimport { computeGraphLayout, prepareFlowGraph } from './graphLayout';\nimport type { DevtoolsLabelLookup } from './createLabelLookup';\nimport { EffectLegend } from './EffectBadge';\nimport {\n getEffectEdgeStroke,\n getEffectShortLabel,\n getEffectVariant,\n type EffectVisualVariant,\n} from './effectStyles';\nimport { getGraphNodeClassName, getLegendSwatchClassName } from './graphNodeStyles';\nimport { translate } from './i18n';\nimport { resolveGraphTraceEntry } from './traceEntry';\n\ntype FieldStateMap = ReturnType<FormStore['fieldStore']['getSnapshot']>;\n\ntype RuleNodeData = {\n label: string;\n kind: GraphNode['kind'];\n graphNodeId: string;\n value?: string;\n highlighted: boolean;\n};\n\nexport type RuleGraphViewProps = {\n entries: readonly RuleTraceEntry[];\n fieldState: FieldStateMap;\n formValues: Record<string, unknown>;\n selectedEntryId: string | null;\n highlightRuleId: string | null;\n labelLookup?: DevtoolsLabelLookup;\n className?: string;\n layoutKey?: string | number;\n headerActions?: ReactNode;\n minHeightClassName?: string;\n};\n\nconst KIND_LABELS: Record<GraphNode['kind'], string> = {\n field: 'Field',\n rule: 'Rule',\n section: 'Section',\n feedback: 'Feedback',\n};\n\n/**\n * Above this edge count, low-signal `read` labels are dropped from the canvas\n * and shown on hover instead. They stay documented in the toolbar legend.\n */\nconst READ_LABEL_EDGE_THRESHOLD = 4;\n\nconst DEFAULT_EDGE_OPTIONS = {\n type: 'ruleGraphEdge' as const,\n style: { stroke: getEffectEdgeStroke('default') },\n markerEnd: {\n type: MarkerType.ArrowClosed,\n color: getEffectEdgeStroke('default'),\n },\n};\n\nfunction RuleGraphNode({ data }: NodeProps<Node<RuleNodeData>>) {\n return (\n <div className={getGraphNodeClassName(data.kind, data.highlighted)}>\n <Handle type=\"target\" position={Position.Left} />\n <span className=\"mb-dp4 block text-[0.625rem] font-semibold uppercase leading-none tracking-wide text-dhis2-grey-600\">\n {KIND_LABELS[data.kind]}\n </span>\n <div className=\"break-words font-semibold leading-[1.3]\">{data.label}</div>\n {data.value !== undefined ? (\n <div className=\"mt-dp4 border-t border-dhis2-grey-200 pt-dp4 font-mono text-[0.6875rem] break-all text-dhis2-grey-700\">\n {data.value}\n </div>\n ) : null}\n <Handle type=\"source\" position={Position.Right} />\n </div>\n );\n}\n\nconst nodeTypes = {\n ruleGraphNode: memo(RuleGraphNode),\n};\n\ntype RuleGraphEdgeData = {\n label: string;\n stroke: string;\n /** When false, the label is hidden on the canvas and shown only on hover. */\n showLabel: boolean;\n /** Per-source fan-out distance so parallel edges don't overlap. */\n offset: number;\n};\n\nfunction RuleGraphEdge({\n id,\n sourceX,\n sourceY,\n sourcePosition,\n targetX,\n targetY,\n targetPosition,\n markerEnd,\n style,\n data,\n}: EdgeProps<Edge<RuleGraphEdgeData>>) {\n const [hovered, setHovered] = useState(false);\n const [edgePath, labelX, labelY] = getSmoothStepPath({\n sourceX,\n sourceY,\n sourcePosition,\n targetX,\n targetY,\n targetPosition,\n offset: data?.offset ?? 20,\n });\n\n const showLabel = data ? data.showLabel || hovered : false;\n\n return (\n <>\n <BaseEdge id={id} path={edgePath} markerEnd={markerEnd} style={style} />\n <path\n d={edgePath}\n fill=\"none\"\n stroke=\"transparent\"\n strokeWidth={16}\n onMouseEnter={() => {\n setHovered(true);\n }}\n onMouseLeave={() => {\n setHovered(false);\n }}\n />\n {showLabel && data ? (\n <EdgeLabelRenderer>\n <div\n className=\"nodrag nopan absolute rounded-sm px-dp4 text-[10px] font-semibold\"\n style={{\n transform: `translate(-50%, -50%) translate(${String(labelX)}px, ${String(labelY)}px)`,\n background: 'rgba(255,255,255,0.92)',\n color: data.stroke,\n pointerEvents: 'all',\n }}\n onMouseEnter={() => {\n setHovered(true);\n }}\n onMouseLeave={() => {\n setHovered(false);\n }}\n >\n {data.label}\n </div>\n </EdgeLabelRenderer>\n ) : null}\n </>\n );\n}\n\nconst edgeTypes = {\n ruleGraphEdge: memo(RuleGraphEdge),\n};\n\nfunction effectNodeKey(effect: RuleTraceEntry['ruleResults'][number]['effects'][number]): string {\n const kind =\n effect.type === 'HIDESECTION'\n ? 'section'\n : effect.type === 'DISPLAYTEXT' || effect.type === 'DISPLAYKEYVALUEPAIR'\n ? 'feedback'\n : 'field';\n return `${kind}:${effect.targetId}`;\n}\n\nfunction entryGraphKeys(entry: RuleTraceEntry): Set<string> {\n const keys = new Set<string>();\n\n for (const fieldId of entry.changedFields) {\n keys.add(`field:${fieldId}`);\n }\n\n for (const result of entry.ruleResults) {\n keys.add(`rule:${result.ruleId}`);\n for (const effect of result.effects) {\n keys.add(effectNodeKey(effect));\n }\n }\n\n return keys;\n}\n\nfunction ruleGraphKeys(entry: RuleTraceEntry, ruleId: string): Set<string> {\n const keys = new Set<string>([`rule:${ruleId}`]);\n\n for (const result of entry.ruleResults) {\n if (result.ruleId !== ruleId) {\n continue;\n }\n for (const effect of result.effects) {\n keys.add(effectNodeKey(effect));\n }\n }\n\n return keys;\n}\n\nconst formatDisplayValue = (value: unknown): string | undefined => {\n if (value === undefined || value === null || value === '') {\n return undefined;\n }\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n return JSON.stringify(value);\n};\n\nexport function toFlowGraph(\n graph: RuleDependencyGraph,\n fieldState: FieldStateMap,\n formValues: Record<string, unknown>,\n highlightedKeys: Set<string> | null\n): { nodes: Node<RuleNodeData>[]; edges: Edge<RuleGraphEdgeData>[] } {\n const { nodes: flowNodes, edges: flowEdges } = prepareFlowGraph(graph);\n const positions = computeGraphLayout(flowNodes, flowEdges);\n const graphNodeIdByFlowId = new Map(flowNodes.map((node) => [node.id, node.graphNodeId]));\n\n const nodes: Node<RuleNodeData>[] = flowNodes.map((node) => {\n const position = positions.get(node.id) ?? { x: 0, y: 0 };\n const rawFieldId =\n node.kind === 'field' ? node.graphNodeId.slice('field:'.length) : undefined;\n const assignedValue =\n rawFieldId && rawFieldId in fieldState\n ? fieldState[rawFieldId].assignedValue\n : undefined;\n const formValue = rawFieldId ? formValues[rawFieldId] : undefined;\n const displayValue = formatDisplayValue(assignedValue) ?? formatDisplayValue(formValue);\n\n return {\n id: node.id,\n type: 'ruleGraphNode',\n position,\n data: {\n label: node.label,\n kind: node.kind,\n graphNodeId: node.graphNodeId,\n value: displayValue,\n highlighted: highlightedKeys ? highlightedKeys.has(node.graphNodeId) : true,\n },\n };\n });\n\n const dense = flowEdges.length > READ_LABEL_EDGE_THRESHOLD;\n const sourceFanOut = new Map<string, number>();\n\n const edges: Edge<RuleGraphEdgeData>[] = flowEdges.map((edge) => {\n const sourceGraphId = graphNodeIdByFlowId.get(edge.source) ?? edge.source;\n const targetGraphId = graphNodeIdByFlowId.get(edge.target) ?? edge.target;\n const isHighlighted = highlightedKeys\n ? highlightedKeys.has(sourceGraphId) && highlightedKeys.has(targetGraphId)\n : true;\n const effectType = edge.effectType ?? 'default';\n const isRead = effectType === 'read';\n const stroke = getEffectEdgeStroke(effectType, isHighlighted);\n const label = getEffectShortLabel(effectType);\n const showLabel = !(isRead && dense);\n\n const fanIndex = sourceFanOut.get(edge.source) ?? 0;\n sourceFanOut.set(edge.source, fanIndex + 1);\n const offset = 20 + fanIndex * 14;\n\n return {\n id: edge.id,\n source: edge.source,\n target: edge.target,\n type: 'ruleGraphEdge',\n animated: isHighlighted && !isRead,\n zIndex: isHighlighted ? 1 : 0,\n style: {\n stroke,\n strokeWidth: isRead ? 1 : Math.min(1 + edge.fireCount, 4),\n opacity: isHighlighted ? (isRead ? 0.5 : 1) : 0.35,\n },\n markerEnd: {\n type: MarkerType.ArrowClosed,\n color: stroke,\n },\n data: {\n label,\n stroke,\n showLabel,\n offset,\n },\n };\n });\n\n return { nodes, edges };\n}\n\ntype GraphToolbarProps = {\n nodeCount: number;\n edgeCount: number;\n headerActions?: ReactNode;\n activeEffectVariants: ReadonlySet<EffectVisualVariant>;\n};\n\nfunction GraphToolbar({\n nodeCount,\n edgeCount,\n headerActions,\n activeEffectVariants,\n}: GraphToolbarProps) {\n const items: Array<{ kind: GraphNode['kind']; label: string }> = [\n { kind: 'field', label: translate('Field') },\n { kind: 'rule', label: translate('Rule') },\n { kind: 'section', label: translate('Section') },\n { kind: 'feedback', label: translate('Feedback') },\n ];\n\n return (\n <div className=\"shrink-0 border-b border-dhis2-grey-200 bg-white\">\n <div className=\"flex flex-wrap items-center justify-between gap-dp8 px-dp12 py-dp8\">\n <div\n className=\"flex min-w-0 flex-wrap items-center gap-x-dp12 gap-y-dp8\"\n aria-hidden=\"true\"\n >\n {items.map((item) => (\n <span\n key={item.kind}\n className=\"inline-flex items-center gap-dp8 text-xs text-dhis2-grey-800\"\n >\n <span className={getLegendSwatchClassName(item.kind)} />\n {item.label}\n </span>\n ))}\n </div>\n <div className=\"flex shrink-0 items-center gap-dp8\">\n <span className=\"text-xs tabular-nums text-dhis2-grey-600\">\n {translate('{{nodes}} nodes · {{edges}} edges', {\n nodes: nodeCount,\n edges: edgeCount,\n })}\n </span>\n {headerActions}\n </div>\n </div>\n <EffectLegend activeVariants={activeEffectVariants} />\n </div>\n );\n}\n\ntype RuleGraphCanvasProps = {\n nodes: Node<RuleNodeData>[];\n edges: Edge<RuleGraphEdgeData>[];\n layoutKey?: string | number;\n};\n\nfunction FitViewOnChange({\n layoutKey,\n nodeCount,\n edgeCount,\n}: {\n layoutKey?: string | number;\n nodeCount: number;\n edgeCount: number;\n}) {\n const { fitView } = useReactFlow();\n\n useEffect(() => {\n const frameId = requestAnimationFrame(() => {\n void fitView({ padding: 0.2, duration: 150 });\n });\n return () => {\n cancelAnimationFrame(frameId);\n };\n }, [edgeCount, fitView, layoutKey, nodeCount]);\n\n return null;\n}\n\nfunction mergeNodePositions(\n next: Node<RuleNodeData>[],\n current: Node<RuleNodeData>[]\n): Node<RuleNodeData>[] {\n const currentById = new Map(current.map((node) => [node.id, node]));\n return next.map((node) => {\n const existing = currentById.get(node.id);\n if (existing) {\n return { ...node, position: existing.position };\n }\n return node;\n });\n}\n\nfunction RuleGraphCanvas({\n nodes: layoutNodes,\n edges: layoutEdges,\n layoutKey,\n}: RuleGraphCanvasProps) {\n const [nodes, setNodes, onNodesChange] = useNodesState(layoutNodes);\n const [edges, setEdges, onEdgesChange] = useEdgesState(layoutEdges);\n\n useEffect(() => {\n setNodes((current) => mergeNodePositions(layoutNodes, current));\n }, [layoutNodes, setNodes]);\n\n useEffect(() => {\n setEdges(layoutEdges);\n }, [layoutEdges, setEdges]);\n\n return (\n <ReactFlow\n nodes={nodes}\n edges={edges}\n nodeTypes={nodeTypes}\n edgeTypes={edgeTypes}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n nodesDraggable\n defaultEdgeOptions={DEFAULT_EDGE_OPTIONS}\n elevateEdgesOnSelect\n fitView\n proOptions={{ hideAttribution: true }}\n className=\"h-full w-full\"\n >\n <FitViewOnChange\n layoutKey={layoutKey}\n nodeCount={nodes.length}\n edgeCount={edges.length}\n />\n <Background gap={16} size={1} />\n <Controls showInteractive={false} />\n </ReactFlow>\n );\n}\n\nexport function RuleGraphView({\n entries,\n fieldState,\n formValues,\n selectedEntryId,\n highlightRuleId,\n labelLookup,\n className,\n layoutKey,\n headerActions,\n minHeightClassName = 'min-h-[360px]',\n}: RuleGraphViewProps) {\n const graphEntry = useMemo(\n () => resolveGraphTraceEntry(entries, selectedEntryId),\n [entries, selectedEntryId]\n );\n\n const graph = useMemo(\n () =>\n graphEntry ? buildGraphFromTrace([graphEntry], labelLookup) : { nodes: [], edges: [] },\n [graphEntry, labelLookup]\n );\n\n const highlightedKeys = useMemo(() => {\n if (!graphEntry || (!selectedEntryId && !highlightRuleId)) {\n return null;\n }\n\n const keys = new Set<string>();\n\n if (selectedEntryId) {\n for (const key of entryGraphKeys(graphEntry)) {\n keys.add(key);\n }\n }\n\n if (highlightRuleId) {\n for (const key of ruleGraphKeys(graphEntry, highlightRuleId)) {\n keys.add(key);\n }\n }\n\n return keys;\n }, [graphEntry, highlightRuleId, selectedEntryId]);\n\n const { nodes, edges } = useMemo(\n () => toFlowGraph(graph, fieldState, formValues, highlightedKeys),\n [graph, fieldState, formValues, highlightedKeys]\n );\n\n const activeEffectVariants = useMemo(() => {\n const variants = new Set<EffectVisualVariant>();\n for (const edge of graph.edges) {\n if (edge.effectType) {\n variants.add(getEffectVariant(edge.effectType));\n }\n }\n return variants;\n }, [graph.edges]);\n\n if (!graph.nodes.length) {\n return (\n <div className=\"p-dp8\">\n <NoticeBox title={translate('No rule relationships yet')}>\n {translate(\n 'Interact with the form to build the dependency graph. Only rules active in the latest evaluation are shown. Select a trace entry to inspect a past evaluation. Connections flow Field → Rule → Target (read / effect).'\n )}\n </NoticeBox>\n </div>\n );\n }\n\n return (\n <div\n className={`flex h-full min-h-[480px] flex-1 flex-col overflow-hidden rounded-md border border-dhis2-grey-200 bg-white ${className ?? ''}`}\n >\n <GraphToolbar\n nodeCount={graph.nodes.length}\n edgeCount={graph.edges.length}\n headerActions={headerActions}\n activeEffectVariants={activeEffectVariants}\n />\n <div\n className={`${minHeightClassName} flex-1 bg-white`}\n style={{ width: '100%', height: '100%' }}\n >\n <ReactFlowProvider>\n <RuleGraphCanvas nodes={nodes} edges={edges} layoutKey={layoutKey} />\n </ReactFlowProvider>\n </div>\n </div>\n );\n}\n","import { Modal, ModalContent, ModalTitle } from '@dhis2/ui';\nimport { translate } from './i18n';\nimport { RuleGraphView, type RuleGraphViewProps } from './RuleGraphView';\n\nexport type RuleGraphModalProps = Omit<\n RuleGraphViewProps,\n 'className' | 'minHeightClassName' | 'headerActions'\n> & {\n open: boolean;\n onClose: () => void;\n subtitle?: string | null;\n};\n\nexport function RuleGraphModal({\n open,\n onClose,\n subtitle,\n layoutKey,\n ...graphProps\n}: RuleGraphModalProps) {\n if (!open) {\n return null;\n }\n\n return (\n <Modal large fluid onClose={onClose}>\n <ModalTitle>\n {translate('Rule dependency graph')}\n {subtitle ? (\n <span className=\"mt-dp4 block text-sm font-normal text-dhis2-grey-700\">\n {subtitle}\n </span>\n ) : null}\n </ModalTitle>\n <ModalContent className=\"p-0\">\n <div className=\"h-[min(85vh,900px)] w-full min-w-[min(1200px,92vw)]\">\n <RuleGraphView\n {...graphProps}\n layoutKey={layoutKey ?? 'modal'}\n className=\"h-full min-h-0 rounded-none border-0\"\n minHeightClassName=\"min-h-0 h-full\"\n />\n </div>\n </ModalContent>\n </Modal>\n );\n}\n","import {\n Card,\n Chip,\n Divider,\n IconChevronDown16,\n IconChevronRight16,\n NoticeBox,\n Tag,\n} from '@dhis2/ui';\nimport type { RuleTraceEntry, TraceEffect } from '@nnkogift/dhis2-form-utils-hooks';\nimport { useEffect, useState } from 'react';\nimport type { DevtoolsLabelLookup } from './createLabelLookup';\nimport { EffectBadge } from './EffectBadge';\nimport { formatAgo } from './formatAgo';\nimport { translate } from './i18n';\n\ntype TraceTimelineProps = {\n entries: readonly RuleTraceEntry[];\n selectedEntryId: string | null;\n highlightRuleId: string | null;\n onSelectEntry: (entryId: string) => void;\n onHighlightRule: (ruleId: string | null) => void;\n labelLookup?: DevtoolsLabelLookup;\n};\n\nfunction resolveLabel(\n id: string,\n resolver?: (value: string) => string\n): { label: string; showId: boolean } {\n const label = resolver?.(id) ?? id;\n return { label, showId: label !== id };\n}\n\nfunction resolveEffectTargetLabel(\n effect: TraceEffect,\n labelLookup?: DevtoolsLabelLookup\n): { label: string; showId: boolean } {\n if (effect.type === 'HIDESECTION') {\n return resolveLabel(\n effect.targetId,\n labelLookup ? (id) => labelLookup.resolveSectionName(id) : undefined\n );\n }\n\n if (effect.type === 'DISPLAYTEXT' || effect.type === 'DISPLAYKEYVALUEPAIR') {\n return { label: effect.targetId, showId: false };\n }\n\n return resolveLabel(\n effect.targetId,\n labelLookup ? (id) => labelLookup.resolveFieldName(id) : undefined\n );\n}\n\nexport function TraceTimeline({\n entries,\n selectedEntryId,\n highlightRuleId,\n onSelectEntry,\n onHighlightRule,\n labelLookup,\n}: TraceTimelineProps) {\n const [expandedIds, setExpandedIds] = useState<ReadonlySet<string>>(() => new Set());\n\n useEffect(() => {\n if (!entries.length) {\n setExpandedIds(new Set());\n return;\n }\n\n const newestId = entries[entries.length - 1]?.id;\n if (!newestId) {\n return;\n }\n\n setExpandedIds((current) => {\n if (current.size > 0) {\n return current;\n }\n return new Set([newestId]);\n });\n }, [entries]);\n\n if (!entries.length) {\n return (\n <div className=\"p-dp8\">\n <NoticeBox title={translate('No rules observed yet')}>\n {translate(\n 'Interact with the form to record rule evaluations. Only rules that have fired at least once appear here.'\n )}\n </NoticeBox>\n </div>\n );\n }\n\n const reversed = [...entries].reverse();\n\n const toggleExpanded = (entryId: string) => {\n setExpandedIds((current) => {\n const next = new Set(current);\n if (next.has(entryId)) {\n next.delete(entryId);\n } else {\n next.add(entryId);\n }\n return next;\n });\n };\n\n return (\n <ul className=\"m-0 flex list-none flex-col gap-dp12 p-0\">\n {reversed.map((entry) => {\n const isInitial = entry.changedFields.length === 0;\n const ruleCount = entry.ruleResults.length;\n const effectCount = entry.ruleResults.reduce(\n (total, result) => total + result.effects.length,\n 0\n );\n const isExpanded = expandedIds.has(entry.id);\n const isSelected = selectedEntryId === entry.id;\n\n return (\n <li key={entry.id} className=\"m-0\">\n <Card\n className={`overflow-hidden rounded-md border border-dhis2-grey-300 bg-white shadow-[0_1px_2px_rgb(0_0_0/4%)] transition-[border-color,box-shadow] duration-150 ease-out ${\n isSelected\n ? 'border-dhis2-teal-600 shadow-[0_0_0_1px_var(--color-dhis2-teal-600),0_2px_8px_rgb(0_137_123/12%)]'\n : ''\n }`}\n >\n <div className=\"flex items-stretch gap-dp4 bg-dhis2-grey-050 py-dp4 pe-dp8 ps-dp4\">\n <button\n type=\"button\"\n className=\"inline-flex size-10 min-h-10 min-w-10 shrink-0 cursor-pointer items-center justify-center self-center rounded border-none bg-transparent text-dhis2-grey-700 hover:bg-dhis2-grey-200 focus-visible:outline-2 focus-visible:outline-dhis2-teal-600 focus-visible:outline-offset-1\"\n aria-expanded={isExpanded}\n aria-label={\n isExpanded\n ? translate('Collapse evaluation details')\n : translate('Expand evaluation details')\n }\n onClick={() => {\n toggleExpanded(entry.id);\n }}\n >\n {isExpanded ? <IconChevronDown16 /> : <IconChevronRight16 />}\n </button>\n\n <button\n type=\"button\"\n className=\"flex min-h-11 min-w-0 flex-1 cursor-pointer items-center justify-between gap-dp12 rounded border-none bg-transparent py-dp8 pe-dp8 ps-dp4 text-start font-[inherit] text-inherit hover:bg-white/80 focus-visible:outline-2 focus-visible:outline-dhis2-teal-600 focus-visible:outline-offset-1\"\n aria-pressed={isSelected}\n onClick={() => {\n onSelectEntry(entry.id);\n }}\n >\n <span className=\"flex min-w-0 flex-col items-start gap-0.5\">\n <span className=\"text-sm font-semibold leading-[1.3] text-dhis2-grey-900 tabular-nums\">\n {formatAgo(entry.timestamp)}\n </span>\n {!isExpanded && effectCount > 0 ? (\n <span className=\"text-xs leading-[1.3] text-dhis2-grey-600\">\n {translate('{{count}} effects', {\n count: effectCount,\n })}\n </span>\n ) : null}\n </span>\n <Tag\n className={isInitial ? 'shrink-0' : undefined}\n neutral={!isInitial}\n >\n {isInitial\n ? translate('Initial')\n : translate('{{count}} rules', { count: ruleCount })}\n </Tag>\n </button>\n </div>\n\n {isExpanded ? (\n <div className=\"flex flex-col gap-dp16 border-t border-dhis2-grey-200 p-dp16\">\n {isInitial ? (\n <p className=\"m-0 text-sm leading-normal text-dhis2-grey-600\">\n {ruleCount\n ? translate('{{count}} effects on load', {\n count: effectCount,\n })\n : translate('No rules fired')}\n </p>\n ) : (\n <section className=\"flex flex-col gap-dp8\">\n <h3 className=\"m-0 text-[0.6875rem] font-bold uppercase leading-[1.3] tracking-wider text-dhis2-grey-600\">\n {translate('Changed fields')}\n </h3>\n <div className=\"flex flex-wrap gap-dp8\">\n {entry.changedFields.map((fieldId) => {\n const { label, showId } = resolveLabel(\n fieldId,\n labelLookup\n ? (id) =>\n labelLookup.resolveFieldName(id)\n : undefined\n );\n\n return (\n <div\n key={fieldId}\n className=\"flex max-w-full flex-col gap-0.5\"\n >\n <Tag\n neutral\n className={`max-w-full break-words text-xs ${showId ? '' : 'font-mono break-all'}`}\n >\n {label}\n </Tag>\n </div>\n );\n })}\n </div>\n </section>\n )}\n\n {entry.ruleResults.length === 0 ? (\n !isInitial ? (\n <p className=\"m-0 text-sm leading-normal text-dhis2-grey-600\">\n {translate('No rules fired')}\n </p>\n ) : null\n ) : (\n <section className=\"flex flex-col gap-dp8\">\n {!isInitial ? (\n <h3 className=\"m-0 text-[0.6875rem] font-bold uppercase leading-[1.3] tracking-wider text-dhis2-grey-600\">\n {translate('Rules fired')}\n </h3>\n ) : null}\n <div className=\"flex flex-col gap-dp12\">\n {entry.ruleResults.map((result, index) => {\n const { label: displayName } = resolveLabel(\n result.ruleId,\n labelLookup\n ? (id) =>\n labelLookup.resolveRuleName(id)\n : undefined\n );\n\n return (\n <div\n key={result.ruleId}\n className=\"rounded border border-dhis2-grey-200 bg-dhis2-grey-050 p-dp12\"\n >\n {index > 0 ? (\n <Divider margin=\"12px 0\" />\n ) : null}\n <div className=\"mb-dp12 flex flex-col items-start gap-dp4\">\n <Chip\n selected={\n highlightRuleId ===\n result.ruleId\n }\n onClick={(_, event) => {\n event.stopPropagation();\n onHighlightRule(\n highlightRuleId ===\n result.ruleId\n ? null\n : result.ruleId\n );\n }}\n >\n {displayName}\n </Chip>\n </div>\n <ul className=\"m-0 flex list-none flex-col gap-dp12 p-0\">\n {result.effects.map((effect) => {\n const {\n label: targetLabel,\n showId: showTargetId,\n } = resolveEffectTargetLabel(\n effect,\n labelLookup\n );\n\n return (\n <li\n key={`${effect.type}-${effect.targetId}-${effect.data ?? ''}`}\n className=\"flex flex-col gap-dp4\"\n >\n <div className=\"flex flex-wrap items-baseline gap-dp8\">\n <EffectBadge\n type={\n effect.type\n }\n />\n <span\n className={`break-words text-[0.8125rem] leading-[1.45] text-dhis2-grey-800 ${showTargetId ? '' : 'break-all font-mono'}`}\n >\n {targetLabel}\n </span>\n </div>\n {effect.data ? (\n <p className=\"m-0 ps-dp4 text-[0.8125rem] leading-[1.45] break-words text-dhis2-grey-600\">\n {effect.data}\n </p>\n ) : null}\n </li>\n );\n })}\n </ul>\n </div>\n );\n })}\n </div>\n </section>\n )}\n </div>\n ) : null}\n </Card>\n </li>\n );\n })}\n </ul>\n );\n}\n","import { Button, IconFullscreen16 } from '@dhis2/ui';\nimport type { RuleTraceEntry } from '@nnkogift/dhis2-form-utils-hooks';\nimport { useFormStateContext, useFormStore } from '@nnkogift/dhis2-form-utils-hooks';\nimport { useCallback, useMemo, useState, useSyncExternalStore } from 'react';\nimport { buildGraphFromTrace } from './buildGraph';\nimport { createLabelLookup, type RuleDevtoolsMetadata } from './createLabelLookup';\nimport { EffectBadge } from './EffectBadge';\nimport { formatAgo } from './formatAgo';\nimport { formatRuleActionSummary } from './formatRuleActionSummary';\nimport { translate } from './i18n';\nimport type { CatalogRule } from './resolveProgramRulesList';\nimport { resolveProgramRulesList } from './resolveProgramRulesList';\nimport { useRuleTraceStore } from './RuleDevtoolsScope';\nimport { RuleGraphModal } from './RuleGraphModal';\nimport { RuleGraphView } from './RuleGraphView';\nimport { TraceTimeline } from './TraceTimeline';\nimport { getActiveRuleIds, resolveGraphTraceEntry } from './traceEntry';\n\nexport type { RuleDevtoolsMetadata } from './createLabelLookup';\n\nexport type RulesPanelProps = {\n metadata: RuleDevtoolsMetadata;\n /** Show each rule's raw condition expression in the Rules tab. Defaults to true. */\n showConditions?: boolean;\n};\n\ntype DevtoolsTab = 'rules' | 'trace' | 'graph';\n\ntype RuleCardStatus = {\n label: string;\n className: string;\n};\n\nfunction resolveScopeStageId(metadata: RuleDevtoolsMetadata): string | null {\n return metadata.formKind === 'event' ? metadata.programStageId : null;\n}\n\nfunction isRuleInScope(rule: CatalogRule, scopeStageId: string | null): boolean {\n return rule.programStageId === null || rule.programStageId === scopeStageId;\n}\n\nfunction resolveAccentClassName(inScope: boolean, firing: boolean, selected: boolean): string {\n if (selected) {\n return 'bg-dhis2-blue-600';\n }\n if (!inScope) {\n return 'bg-transparent';\n }\n return firing ? 'bg-dhis2-teal-600' : 'bg-dhis2-grey-400';\n}\n\nfunction resolveCardStatus(inScope: boolean, firing: boolean): RuleCardStatus {\n if (!inScope) {\n return { label: translate('Out of scope'), className: 'text-dhis2-grey-500' };\n }\n return firing\n ? { label: translate('Firing'), className: 'text-dhis2-teal-700' }\n : { label: translate('Idle'), className: 'text-dhis2-grey-600' };\n}\n\nfunction formatActionLabel(action: ReturnType<typeof formatRuleActionSummary>): string {\n if (action.targetLabel && action.detail) {\n return `${action.type} · ${action.targetLabel} = ${action.detail}`;\n }\n if (action.targetLabel) {\n return `${action.type} · ${action.targetLabel}`;\n }\n return action.type;\n}\n\nfunction countObservedRules(entries: readonly RuleTraceEntry[]): number {\n const ruleIds = new Set<string>();\n for (const entry of entries) {\n for (const result of entry.ruleResults) {\n ruleIds.add(result.ruleId);\n }\n }\n return ruleIds.size;\n}\n\nconst PANEL_TAB_KEYS: DevtoolsTab[] = ['rules', 'trace', 'graph'];\n\nfunction resolveTabLabel(key: DevtoolsTab): string {\n switch (key) {\n case 'rules':\n return translate('Rules');\n case 'trace':\n return translate('Trace');\n case 'graph':\n return translate('Graph');\n }\n}\n\nexport function RulesPanel({ metadata, showConditions = true }: RulesPanelProps) {\n const formStore = useFormStore();\n const { form } = useFormStateContext();\n const traceStore = useRuleTraceStore();\n\n const [tab, setTab] = useState<DevtoolsTab>('rules');\n const [selectedEntryId, setSelectedEntryId] = useState<string | null>(null);\n const [highlightRuleId, setHighlightRuleId] = useState<string | null>(null);\n const [graphModalOpen, setGraphModalOpen] = useState(false);\n\n const labelLookup = useMemo(() => createLabelLookup(metadata), [metadata]);\n const catalog = useMemo(() => resolveProgramRulesList(metadata), [metadata]);\n const scopeStageId = useMemo(() => resolveScopeStageId(metadata), [metadata]);\n\n const entries = useSyncExternalStore(\n useCallback((listener) => traceStore.subscribe(listener), [traceStore]),\n useCallback(() => traceStore.getSnapshot(), [traceStore]),\n useCallback(() => traceStore.getSnapshot(), [traceStore])\n );\n\n const fieldState = useSyncExternalStore(\n useCallback((listener) => formStore.fieldStore.subscribeAll(listener), [formStore]),\n useCallback(() => formStore.fieldStore.getSnapshot(), [formStore]),\n useCallback(() => formStore.fieldStore.getSnapshot(), [formStore])\n );\n\n const activeRuleIds = useMemo(() => getActiveRuleIds(entries), [entries]);\n const scopedRules = useMemo(\n () => catalog.filter((rule) => isRuleInScope(rule, scopeStageId)),\n [catalog, scopeStageId]\n );\n const firingCount = useMemo(\n () => scopedRules.filter((rule) => activeRuleIds.has(rule.id)).length,\n [scopedRules, activeRuleIds]\n );\n\n const selectedEntry = useMemo(\n () => entries.find((entry) => entry.id === selectedEntryId) ?? null,\n [entries, selectedEntryId]\n );\n const observedRuleCount = useMemo(() => countObservedRules(entries), [entries]);\n const highlightedRuleName = useMemo(() => {\n if (!highlightRuleId) {\n return null;\n }\n return labelLookup.resolveRuleName(highlightRuleId);\n }, [highlightRuleId, labelLookup]);\n\n const graphHasNodes = useMemo(() => {\n const entry = resolveGraphTraceEntry(entries, selectedEntryId);\n return entry ? buildGraphFromTrace([entry], labelLookup).nodes.length > 0 : false;\n }, [entries, labelLookup, selectedEntryId]);\n\n const graphSubtitle = useMemo(() => {\n if (selectedEntry && highlightedRuleName) {\n return translate('Highlighting evaluation {{time}} · Rule: {{name}}', {\n time: formatAgo(selectedEntry.timestamp),\n name: highlightedRuleName,\n });\n }\n if (selectedEntry) {\n return translate('Highlighting evaluation {{time}}', {\n time: formatAgo(selectedEntry.timestamp),\n });\n }\n if (highlightedRuleName) {\n return translate('Rule: {{name}}', { name: highlightedRuleName });\n }\n return null;\n }, [highlightedRuleName, selectedEntry]);\n\n const graphProps = {\n entries,\n fieldState,\n formValues: form.getValues(),\n selectedEntryId,\n highlightRuleId,\n labelLookup,\n };\n\n const expandGraphButton = (\n <button\n type=\"button\"\n className=\"inline-flex size-11 min-h-11 min-w-11 shrink-0 cursor-pointer items-center justify-center rounded border border-dhis2-grey-300 bg-white text-dhis2-grey-800 hover:bg-dhis2-grey-100 focus-visible:outline-2 focus-visible:outline-dhis2-teal-600 focus-visible:outline-offset-1\"\n aria-label={translate('Open graph in full screen')}\n onClick={() => {\n setGraphModalOpen(true);\n }}\n >\n <IconFullscreen16 />\n </button>\n );\n\n return (\n <aside\n className=\"flex h-full w-[404px] min-w-[320px] max-w-[min(92vw,480px)] flex-col border-s border-dhis2-grey-400 bg-dhis2-grey-100\"\n aria-label={translate('Rules')}\n >\n <header className=\"shrink-0 border-b border-dhis2-grey-200 bg-white px-dp16 pt-dp12\">\n <div className=\"flex items-center justify-between gap-dp12 pb-[10px]\">\n <div className=\"flex items-center gap-dp8\">\n <span\n className=\"size-2 shrink-0 rounded-full bg-dhis2-teal-600\"\n aria-hidden=\"true\"\n />\n <h2 className=\"m-0 text-base font-bold leading-[1.35] text-dhis2-grey-900\">\n {translate('Rules')}\n </h2>\n </div>\n <span className=\"shrink-0 text-xs text-dhis2-grey-600\">\n {translate('{{scoped}} in scope · {{firing}} firing', {\n scoped: scopedRules.length,\n firing: firingCount,\n })}\n </span>\n </div>\n <div className=\"flex\">\n {PANEL_TAB_KEYS.map((key) => (\n <button\n key={key}\n type=\"button\"\n className={`cursor-pointer border-0 border-b-[3px] bg-transparent px-dp12 py-dp8 text-sm font-medium ${\n tab === key\n ? 'border-b-dhis2-blue-600 text-dhis2-blue-600'\n : 'border-b-transparent text-dhis2-grey-700'\n }`}\n onClick={() => {\n setTab(key);\n }}\n >\n {resolveTabLabel(key)}\n </button>\n ))}\n </div>\n </header>\n\n {tab !== 'rules' && (selectedEntry || highlightedRuleName) ? (\n <div className=\"mx-dp16 mt-dp12 flex shrink-0 items-center justify-between gap-dp12 rounded border border-dhis2-teal-400 bg-dhis2-teal-050 p-dp12 text-[0.8125rem] leading-[1.45] text-dhis2-grey-900\">\n <span className=\"min-w-0\">\n {selectedEntry\n ? translate('Highlighting evaluation {{time}}', {\n time: formatAgo(selectedEntry.timestamp),\n })\n : null}\n {selectedEntry && highlightedRuleName ? ' · ' : null}\n {highlightedRuleName\n ? translate('Rule: {{name}}', { name: highlightedRuleName })\n : null}\n </span>\n <Button\n small\n onClick={() => {\n setSelectedEntryId(null);\n setHighlightRuleId(null);\n }}\n >\n {translate('Clear')}\n </Button>\n </div>\n ) : null}\n\n <div className=\"min-h-0 flex-1 overflow-auto p-dp16\">\n {tab === 'rules' ? (\n <RulesTab\n catalog={catalog}\n scopeStageId={scopeStageId}\n activeRuleIds={activeRuleIds}\n selectedRuleId={highlightRuleId}\n showConditions={showConditions}\n labelLookup={labelLookup}\n onSelectRule={(ruleId) => {\n setHighlightRuleId(ruleId);\n setTab('graph');\n }}\n />\n ) : tab === 'trace' ? (\n <TraceTimeline\n entries={entries}\n selectedEntryId={selectedEntryId}\n highlightRuleId={highlightRuleId}\n onSelectEntry={(entryId) => {\n setSelectedEntryId((current) => (current === entryId ? null : entryId));\n }}\n onHighlightRule={(ruleId) => {\n setHighlightRuleId(ruleId);\n if (ruleId) {\n setTab('graph');\n }\n }}\n labelLookup={labelLookup}\n />\n ) : (\n <RuleGraphView\n {...graphProps}\n headerActions={graphHasNodes ? expandGraphButton : undefined}\n />\n )}\n </div>\n\n {entries.length > 0 && tab !== 'rules' ? (\n <p className=\"sr-only\" aria-live=\"polite\">\n {translate('{{evaluations}} evaluations · {{rules}} rules observed', {\n evaluations: entries.length,\n rules: observedRuleCount,\n })}\n </p>\n ) : null}\n\n <RuleGraphModal\n {...graphProps}\n open={graphModalOpen}\n onClose={() => {\n setGraphModalOpen(false);\n }}\n subtitle={graphSubtitle}\n layoutKey={graphModalOpen ? 'open' : 'closed'}\n />\n </aside>\n );\n}\n\ntype RulesTabProps = {\n catalog: CatalogRule[];\n scopeStageId: string | null;\n activeRuleIds: ReadonlySet<string>;\n selectedRuleId: string | null;\n showConditions: boolean;\n labelLookup: ReturnType<typeof createLabelLookup>;\n onSelectRule: (ruleId: string) => void;\n};\n\nfunction RulesTab({\n catalog,\n scopeStageId,\n activeRuleIds,\n selectedRuleId,\n showConditions,\n labelLookup,\n onSelectRule,\n}: RulesTabProps) {\n if (!catalog.length) {\n return (\n <p className=\"m-0 text-sm leading-normal text-dhis2-grey-600\">\n {translate('This program has no rules.')}\n </p>\n );\n }\n\n return (\n <ul className=\"m-0 flex list-none flex-col gap-[10px] p-0\">\n {catalog.map((rule) => {\n const inScope = isRuleInScope(rule, scopeStageId);\n const firing = activeRuleIds.has(rule.id);\n const isSelected = selectedRuleId === rule.id;\n const status = resolveCardStatus(inScope, firing);\n\n return (\n <li key={rule.id} className=\"m-0 shrink-0\">\n <article\n role=\"button\"\n tabIndex={0}\n onClick={() => {\n onSelectRule(rule.id);\n }}\n onKeyDown={(event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n onSelectRule(rule.id);\n }\n }}\n className=\"relative flex cursor-pointer flex-col gap-dp8 rounded-[5px] border border-dhis2-grey-300 bg-white py-[11px] pe-[12px] ps-[14px] shadow-[0_1px_2px_rgb(0_0_0/4%)]\"\n >\n <span\n className={`absolute inset-y-0 start-0 w-[3px] rounded-s-[5px] ${resolveAccentClassName(inScope, firing, isSelected)}`}\n aria-hidden=\"true\"\n />\n <div className=\"flex items-start justify-between gap-dp8\">\n <h3\n className={`m-0 min-w-0 flex-1 text-sm font-semibold leading-[1.4] ${\n inScope ? 'text-dhis2-grey-900' : 'text-dhis2-grey-600'\n }`}\n >\n {rule.name}\n </h3>\n <span\n className={`shrink-0 text-[11px] font-semibold ${status.className}`}\n >\n {status.label}\n </span>\n </div>\n\n {rule.programRuleActions.length ? (\n <div className=\"flex flex-wrap gap-[6px]\">\n {rule.programRuleActions.map((action, index) => {\n const summary = formatRuleActionSummary(\n action,\n labelLookup\n );\n return (\n <EffectBadge\n key={`${rule.id}-action-${String(index)}`}\n type={summary.type}\n >\n {formatActionLabel(summary)}\n </EffectBadge>\n );\n })}\n </div>\n ) : null}\n\n {showConditions && rule.condition ? (\n <p\n className=\"m-0 break-words font-mono text-[11px] leading-[1.5] text-dhis2-grey-700\"\n title={rule.condition}\n >\n {rule.condition}\n </p>\n ) : null}\n\n {!inScope && rule.programStageId ? (\n <span className=\"text-[11px] text-dhis2-grey-600\">\n {translate('Applies to {{stage}}', {\n stage: labelLookup.resolveStageName(rule.programStageId),\n })}\n </span>\n ) : null}\n </article>\n </li>\n );\n })}\n </ul>\n );\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,76 @@
1
+ {
2
+ "name": "@nnkogift/dhis2-form-utils-devtools",
3
+ "version": "0.1.0-alpha.0",
4
+ "description": "Developer tools for debugging DHIS2 program rules in dhis2-form-utils forms",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/nnkogift/dhis2-form-utils.git",
9
+ "directory": "utils/devtools"
10
+ },
11
+ "homepage": "https://github.com/nnkogift/dhis2-form-utils#readme",
12
+ "type": "module",
13
+ "sideEffects": [
14
+ "./dist/index.css"
15
+ ],
16
+ "main": "./dist/index.cjs",
17
+ "module": "./dist/index.js",
18
+ "types": "./dist/index.d.ts",
19
+ "exports": {
20
+ ".": {
21
+ "import": {
22
+ "types": "./dist/index.d.ts",
23
+ "default": "./dist/index.js"
24
+ },
25
+ "require": {
26
+ "types": "./dist/index.d.cts",
27
+ "default": "./dist/index.cjs"
28
+ }
29
+ },
30
+ "./style.css": "./dist/index.css"
31
+ },
32
+ "files": [
33
+ "dist"
34
+ ],
35
+ "publishConfig": {
36
+ "access": "public",
37
+ "registry": "https://registry.npmjs.org/"
38
+ },
39
+ "dependencies": {
40
+ "@xyflow/react": "^12.11.1",
41
+ "@nnkogift/dhis2-form-utils-hooks": "0.1.0-alpha.0",
42
+ "@nnkogift/dhis2-form-utils-metadata": "0.1.0-alpha.0"
43
+ },
44
+ "peerDependencies": {
45
+ "@dhis2/d2-i18n": ">=1.0.0",
46
+ "@dhis2/ui": ">=10.0.0",
47
+ "react": ">=18.0.0",
48
+ "react-dom": ">=18.0.0"
49
+ },
50
+ "devDependencies": {
51
+ "@dhis2/d2-i18n": "^1.2.0",
52
+ "@dhis2/ui": "^10.15.1",
53
+ "@tailwindcss/cli": "^4.3.2",
54
+ "@testing-library/react": "^16.3.2",
55
+ "concurrently": "^10.0.0",
56
+ "@types/react": "^18.3.29",
57
+ "@types/react-dom": "^18.3.7",
58
+ "jsdom": "^29.1.1",
59
+ "react": "^18.3.1",
60
+ "react-dom": "^18.3.1",
61
+ "tailwindcss": "^4.3.2",
62
+ "tsup": "^8.5.1",
63
+ "typescript": "^5.9.3",
64
+ "vitest": "^4.1.7",
65
+ "@nnkogift/dhis2-form-utils-config": "0.0.0"
66
+ },
67
+ "engines": {
68
+ "node": ">=18"
69
+ },
70
+ "scripts": {
71
+ "build": "tsup && tailwindcss -i ./src/tailwind.css -o ./dist/index.css --minify",
72
+ "dev": "concurrently -n tsup,css -c blue,magenta \"tsup --watch\" \"tailwindcss -i ./src/tailwind.css -o ./dist/index.css --watch\"",
73
+ "typecheck": "tsc --noEmit",
74
+ "test": "vitest run"
75
+ }
76
+ }