@nnkogift/dhis2-form-utils-devtools 0.1.0-alpha.3 → 0.1.0-alpha.5

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.
@@ -1 +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":["selectProgramStage","IconViewOff16","IconView16","IconEdit16","IconStarFilled16","IconWarningFilled16","IconErrorFilled16","IconMessages16","IconMail16","IconLink16","IconInfo16","i18n","jsx","Tag","createContext","useMemo","useEffect","useContext","endpoints","MarkerType","jsxs","Handle","Position","memo","useState","getSmoothStepPath","Fragment","BaseEdge","EdgeLabelRenderer","useReactFlow","useNodesState","useEdgesState","ReactFlow","Background","Controls","NoticeBox","ReactFlowProvider","Modal","ModalTitle","ModalContent","Card","IconChevronDown16","IconChevronRight16","Divider","Chip","useFormStore","useFormStateContext","useSyncExternalStore","useCallback","IconFullscreen16","Button"],"mappings":"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","file":"index.cjs","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"]}
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/programRuleDetailQuery.ts","../src/useProgramRuleDetail.ts","../src/RuleDetailsModal.tsx","../src/graphLayout.ts","../src/graphNodeStyles.ts","../src/traceEntry.ts","../src/RuleGraphView.tsx","../src/RuleGraphModal.tsx","../src/TraceTimeline.tsx","../src/useFlipReorder.ts","../src/RulesPanel.tsx"],"names":["selectProgramStage","IconViewOff16","IconView16","IconEdit16","IconStarFilled16","IconWarningFilled16","IconErrorFilled16","IconMessages16","IconMail16","IconLink16","IconInfo16","i18n","jsx","Tag","createContext","useMemo","useEffect","useContext","useDataQuery","jsxs","CircularLoader","ButtonStrip","Button","Modal","ModalContent","endpoints","MarkerType","Handle","Position","memo","useState","getSmoothStepPath","Fragment","BaseEdge","EdgeLabelRenderer","useReactFlow","useNodesState","useEdgesState","ReactFlow","Background","Controls","NoticeBox","ReactFlowProvider","ModalTitle","Card","IconChevronDown16","IconChevronRight16","Divider","Chip","useRef","useLayoutEffect","useFormStore","useFormStateContext","useSyncExternalStore","useCallback","IconFullscreen16","SegmentedControl"],"mappings":"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","file":"index.cjs","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 { Query, QueryVariables } from '@dhis2/data-engine';\n\nexport type ProgramRuleActionDetail = {\n id: string;\n programRuleActionType: string;\n priority?: number;\n content?: string;\n data?: string;\n location?: string;\n dataElement?: { id: string; displayName?: string };\n trackedEntityAttribute?: { id: string; displayName?: string };\n option?: { id: string; displayName?: string };\n optionGroup?: { id: string; displayName?: string };\n programStageSection?: { id: string; displayName?: string };\n programStage?: { id: string; displayName?: string };\n programSection?: { id: string; displayName?: string };\n};\n\nexport type ProgramRuleDetail = {\n id: string;\n name?: string;\n displayName?: string;\n code?: string;\n description?: string;\n condition?: string;\n priority?: number;\n lastUpdated?: string;\n lastUpdatedBy?: { displayName?: string };\n program?: { id: string; displayName?: string };\n programStage?: { id: string; displayName?: string };\n programRuleActions?: ProgramRuleActionDetail[];\n};\n\nexport type ProgramRuleDetailQueryResult = {\n programRule: ProgramRuleDetail;\n};\n\nconst PROGRAM_RULE_ACTION_DETAIL_FIELDS = [\n 'id',\n 'programRuleActionType',\n 'priority',\n 'content',\n 'data',\n 'location',\n 'dataElement[id,displayName]',\n 'trackedEntityAttribute[id,displayName]',\n 'option[id,displayName]',\n 'optionGroup[id,displayName]',\n 'programStageSection[id,displayName]',\n 'programStage[id,displayName]',\n 'programSection[id,displayName]',\n].join(',');\n\n/** `programRules/{id}` fields for the rule details modal — richer than the catalog list query. */\nconst PROGRAM_RULE_DETAIL_FIELDS: string = [\n 'id',\n 'name',\n 'displayName',\n 'code',\n 'description',\n 'condition',\n 'priority',\n 'lastUpdated',\n 'lastUpdatedBy[displayName]',\n 'program[id,displayName]',\n 'programStage[id,displayName]',\n `programRuleActions[${PROGRAM_RULE_ACTION_DETAIL_FIELDS}]`,\n].join(',');\n\n/**\n * Fetches a single program rule (with actions expanded) by id — used lazily by the rule\n * details modal so the catalog list query stays lightweight. See `useProgramRuleDetail`.\n */\nexport const programRuleDetailQuery: Query = {\n programRule: {\n resource: 'programRules',\n id: (variables: QueryVariables) => variables.ruleId as string,\n params: {\n fields: PROGRAM_RULE_DETAIL_FIELDS,\n },\n },\n};\n","import { useDataQuery } from '@dhis2/app-runtime';\nimport { useEffect } from 'react';\nimport {\n programRuleDetailQuery,\n type ProgramRuleDetail,\n type ProgramRuleDetailQueryResult,\n} from './programRuleDetailQuery';\n\nexport type UseProgramRuleDetailResult = {\n detail: ProgramRuleDetail | undefined;\n loading: boolean;\n error: Error | undefined;\n};\n\nfunction isCurrentDetail(ruleId: string | null, detail: ProgramRuleDetail | undefined): boolean {\n return ruleId != null && detail?.id === ruleId;\n}\n\nfunction resolveDetailState(\n ruleId: string | null,\n detail: ProgramRuleDetail | undefined,\n hasError: boolean\n): Pick<UseProgramRuleDetailResult, 'detail' | 'loading'> {\n const isCurrent = isCurrentDetail(ruleId, detail);\n return {\n detail: isCurrent ? detail : undefined,\n loading: ruleId != null && !isCurrent && !hasError,\n };\n}\n\n/**\n * Lazily fetches a single program rule's full detail (actions with resolved target names,\n * code/description/lastUpdated) when `ruleId` is set — the catalog list already has enough\n * (id/name/condition/priority/scope) to render rule cards, so this only runs when the details\n * modal opens.\n */\nexport function useProgramRuleDetail(ruleId: string | null): UseProgramRuleDetailResult {\n const { data, error, refetch } = useDataQuery<ProgramRuleDetailQueryResult>(\n programRuleDetailQuery,\n { lazy: true }\n );\n\n useEffect(() => {\n if (ruleId) {\n void refetch({ ruleId });\n }\n }, [ruleId, refetch]);\n\n return { ...resolveDetailState(ruleId, data?.programRule, Boolean(error)), error };\n}\n","import { Button, ButtonStrip, CircularLoader, Modal, ModalContent } from '@dhis2/ui';\nimport { EFFECT_ICONS, getEffectVisual } from './effectStyles';\nimport { translate } from './i18n';\nimport type { ProgramRuleActionDetail, ProgramRuleDetail } from './programRuleDetailQuery';\nimport { useProgramRuleDetail } from './useProgramRuleDetail';\n\nexport type RuleDetailsStatus = 'firing' | 'idle' | 'out-of-scope';\n\n/**\n * Structural subset of `ProgramRuleVariable` (event) / the tracker `programRuleVariables` entry\n * shape — those two are distinct generated types (tracker variables never carry `dataElement`),\n * so this only asks for what condition-token resolution actually needs.\n */\nexport type ProgramRuleVariableLike = {\n name?: string;\n dataElement?: { displayName?: string };\n trackedEntityAttribute?: { displayName?: string };\n};\n\nexport type RuleDetailsModalProps = {\n open: boolean;\n onClose: () => void;\n ruleId: string | null;\n /** Already known from the catalog list — shown immediately, before the detail fetch resolves. */\n ruleName: string;\n status: RuleDetailsStatus;\n programStageName?: string | null;\n programRuleVariables: readonly ProgramRuleVariableLike[];\n};\n\nconst EM_DASH = '—';\n\nfunction formatTimestamp(value: string | undefined): string | null {\n if (!value) {\n return null;\n }\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n return null;\n }\n const day = String(date.getDate());\n const month = date.toLocaleString('en-GB', { month: 'short' });\n const year = String(date.getFullYear());\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n return `${day} ${month} ${year} ${hours}:${minutes}`;\n}\n\nfunction resolveStatusChip(status: RuleDetailsStatus): { label: string; className: string } {\n switch (status) {\n case 'firing':\n return {\n label: translate('Firing'),\n className: 'bg-dhis2-teal-100 text-dhis2-teal-900',\n };\n case 'idle':\n return { label: translate('Idle'), className: 'bg-dhis2-grey-200 text-dhis2-grey-700' };\n case 'out-of-scope':\n return {\n label: translate('Out of scope'),\n className: 'bg-dhis2-grey-200 text-dhis2-grey-600',\n };\n }\n}\n\ntype VariableKind =\n | 'Data element'\n | 'Tracked entity attribute'\n | 'Environment variable'\n | 'Function';\n\ntype VariableChip = {\n token: string;\n kind: VariableKind;\n label: string;\n className: string;\n};\n\nconst VARIABLE_PATTERNS: Array<{ pattern: RegExp; kind: VariableKind; className: string }> = [\n {\n pattern: /#\\{[^}]*\\}/g,\n kind: 'Data element',\n className: 'bg-dhis2-blue-100 text-dhis2-blue-900',\n },\n {\n pattern: /A\\{[^}]*\\}/g,\n kind: 'Tracked entity attribute',\n className: 'bg-dhis2-teal-100 text-dhis2-teal-900',\n },\n {\n pattern: /V\\{[^}]*\\}/g,\n kind: 'Environment variable',\n className: 'bg-dhis2-grey-200 text-dhis2-grey-900',\n },\n {\n pattern: /d2:\\w+(?=\\()/g,\n kind: 'Function',\n className: 'bg-dhis2-yellow-100 text-dhis2-yellow-900',\n },\n];\n\nconst RESOLVABLE_VARIABLE_KINDS: ReadonlySet<VariableKind> = new Set([\n 'Data element',\n 'Tracked entity attribute',\n]);\n\nfunction resolveVariableDisplayName(\n name: string,\n programRuleVariables: readonly ProgramRuleVariableLike[]\n): string | undefined {\n const variable = programRuleVariables.find((candidate) => candidate.name === name);\n return variable?.dataElement?.displayName ?? variable?.trackedEntityAttribute?.displayName;\n}\n\n/** `#{name}`/`A{name}` reference a program rule *variable* name, not a metadata uid directly — resolve via `programRuleVariables`. */\nfunction resolveVariableToken(\n token: string,\n kind: VariableKind,\n programRuleVariables: readonly ProgramRuleVariableLike[]\n): string {\n if (kind === 'Function') {\n return `${token}()`;\n }\n if (!RESOLVABLE_VARIABLE_KINDS.has(kind)) {\n return token;\n }\n return resolveVariableDisplayName(token.slice(2, -1), programRuleVariables) ?? token;\n}\n\nfunction matchDistinctTokens(condition: string, pattern: RegExp, seen: Set<string>): string[] {\n const matches = condition.match(pattern) ?? [];\n const distinct = matches.filter((token) => !seen.has(token));\n for (const token of distinct) {\n seen.add(token);\n }\n return distinct;\n}\n\nfunction parseConditionVariables(\n condition: string | undefined,\n programRuleVariables: readonly ProgramRuleVariableLike[]\n): VariableChip[] {\n if (!condition) {\n return [];\n }\n const seen = new Set<string>();\n return VARIABLE_PATTERNS.flatMap(({ pattern, kind, className }) =>\n matchDistinctTokens(condition, pattern, seen).map((token) => ({\n token,\n kind,\n label: resolveVariableToken(token, kind, programRuleVariables),\n className,\n }))\n );\n}\n\ntype ActionTarget = { label: string; value: string };\ntype ActionTargetRef = { id: string; displayName?: string } | undefined;\n\n/** Checked in this order — an action only ever populates one of these six target kinds. */\nconst ACTION_TARGET_RESOLVERS: Array<{\n label: string;\n getRef: (action: ProgramRuleActionDetail) => ActionTargetRef;\n}> = [\n { label: 'Data element', getRef: (action) => action.dataElement },\n { label: 'Tracked entity attribute', getRef: (action) => action.trackedEntityAttribute },\n { label: 'Program stage section', getRef: (action) => action.programStageSection },\n { label: 'Program stage', getRef: (action) => action.programStage },\n { label: 'Option', getRef: (action) => action.option },\n { label: 'Option group', getRef: (action) => action.optionGroup },\n];\n\nfunction formatActionTargetValue(ref: NonNullable<ActionTargetRef>): string {\n return `${ref.displayName ?? ref.id} · ${ref.id}`;\n}\n\nfunction resolveActionTarget(action: ProgramRuleActionDetail): ActionTarget | null {\n for (const { label, getRef } of ACTION_TARGET_RESOLVERS) {\n const ref = getRef(action);\n if (ref?.id) {\n return { label: translate(label), value: formatActionTargetValue(ref) };\n }\n }\n return null;\n}\n\nfunction BasicDetailCell({ label, value, mono }: { label: string; value: string; mono?: boolean }) {\n return (\n <div className=\"min-w-0\">\n <p className=\"m-0 text-xs text-dhis2-grey-600\">{label}</p>\n <p className={`m-0 mt-[2px] text-sm text-dhis2-grey-900 ${mono ? 'font-mono' : ''}`}>\n {value}\n </p>\n </div>\n );\n}\n\ntype DetailRow = { label: string; value: string; mono?: boolean };\n\nconst FEEDBACK_ACTION_TYPES: ReadonlySet<string> = new Set(['DISPLAYTEXT', 'DISPLAYKEYVALUEPAIR']);\n\nfunction resolveDataRow(action: ProgramRuleActionDetail): DetailRow | null {\n return action.data\n ? { label: translate('Data (expression)'), value: action.data, mono: true }\n : null;\n}\n\nfunction resolveContentRow(action: ProgramRuleActionDetail): DetailRow | null {\n const showContent =\n Boolean(action.content) && FEEDBACK_ACTION_TYPES.has(action.programRuleActionType);\n return showContent\n ? { label: translate('Content (static text)'), value: action.content ?? '' }\n : null;\n}\n\nfunction resolveLocationRow(action: ProgramRuleActionDetail): DetailRow | null {\n return action.location\n ? { label: translate('Location'), value: action.location, mono: true }\n : null;\n}\n\nfunction resolveActionRows(action: ProgramRuleActionDetail): DetailRow[] {\n const rows = [\n resolveActionTarget(action),\n resolveDataRow(action),\n resolveContentRow(action),\n resolveLocationRow(action),\n ];\n return rows.filter((row): row is DetailRow => row !== null);\n}\n\nfunction ActionCard({ action, index }: { action: ProgramRuleActionDetail; index: number }) {\n const type = action.programRuleActionType;\n const visual = getEffectVisual(type);\n const Icon = EFFECT_ICONS[visual.variant];\n const rows = resolveActionRows(action);\n\n return (\n <div\n className=\"relative rounded-[3px] border border-dhis2-grey-300 bg-white py-dp12 pe-dp16 ps-dp16 shadow-[0_1px_2px_rgb(0_0_0/4%)]\"\n style={{ borderInlineStartWidth: 3, borderInlineStartColor: visual.edgeStroke }}\n >\n <div className=\"mb-dp12 flex items-center justify-between gap-dp8\">\n <span\n className={`inline-flex items-center gap-[4px] rounded-[4px] px-dp8 py-[2px] text-xs font-semibold ${visual.tagClassName}`}\n >\n <Icon />\n {type}\n </span>\n <span className=\"text-[11px] uppercase tracking-wide text-dhis2-grey-600\">\n {translate('Action {{n}}', { n: index + 1 })}\n </span>\n </div>\n <div className=\"flex flex-col gap-dp10\">\n {rows.map((row) => (\n <div key={row.label} className=\"grid grid-cols-[172px_minmax(0,1fr)] gap-dp10\">\n <span className=\"text-xs text-dhis2-grey-600\">{row.label}</span>\n <span\n className={`min-w-0 break-words text-sm ${row.mono ? 'font-mono text-[12px]' : ''}`}\n >\n {row.value}\n </span>\n </div>\n ))}\n </div>\n </div>\n );\n}\n\nfunction orDash(value: string | undefined): string {\n return value ?? EM_DASH;\n}\n\nfunction resolveDetailDisplayName(rule: ProgramRuleDetail | undefined): string | undefined {\n return rule?.displayName;\n}\n\nfunction resolveDetailName(rule: ProgramRuleDetail | undefined): string | undefined {\n return rule?.name;\n}\n\n/** Shared by the modal title and the \"Name\" basic-detail cell — both fall back the same way. */\nfunction resolveRuleDisplayName(rule: ProgramRuleDetail | undefined, fallback: string): string {\n const displayName = resolveDetailDisplayName(rule) ?? resolveDetailName(rule);\n return displayName ?? fallback;\n}\n\nfunction resolveRuleStageName(rule: ProgramRuleDetail | undefined): string | undefined {\n return rule?.programStage?.displayName;\n}\n\nfunction resolveStageName(\n rule: ProgramRuleDetail | undefined,\n programStageName: string | null | undefined\n): string {\n if (programStageName === null) {\n return translate('All stages (registration)');\n }\n return orDash(resolveRuleStageName(rule) ?? programStageName);\n}\n\nfunction resolveLastUpdatedByName(rule: ProgramRuleDetail | undefined): string | undefined {\n return rule?.lastUpdatedBy?.displayName;\n}\n\nfunction resolveLastUpdatedValue(rule: ProgramRuleDetail | undefined): string {\n const label = formatTimestamp(rule?.lastUpdated);\n if (!label) {\n return EM_DASH;\n }\n const by = resolveLastUpdatedByName(rule);\n return by ? `${label} · ${by}` : label;\n}\n\nfunction resolvePriorityCellValue(rule: ProgramRuleDetail | undefined): string {\n return rule?.priority != null ? String(rule.priority) : EM_DASH;\n}\n\nfunction resolveActionsCellValue(rule: ProgramRuleDetail | undefined): string {\n return translate('{{n}} action(s)', { n: rule?.programRuleActions?.length ?? 0 });\n}\n\nfunction resolveBasicDetailCells(\n rule: ProgramRuleDetail | undefined,\n ruleName: string,\n programStageName: string | null | undefined\n): Array<{ label: string; value: string; mono?: boolean }> {\n return [\n { label: translate('Name'), value: resolveRuleDisplayName(rule, ruleName) },\n { label: translate('Code'), value: orDash(rule?.code), mono: true },\n { label: translate('Identifier'), value: orDash(rule?.id), mono: true },\n { label: translate('Program'), value: orDash(rule?.program?.displayName) },\n { label: translate('Program stage'), value: resolveStageName(rule, programStageName) },\n { label: translate('Priority'), value: resolvePriorityCellValue(rule) },\n { label: translate('Actions'), value: resolveActionsCellValue(rule) },\n { label: translate('Last updated'), value: resolveLastUpdatedValue(rule) },\n ];\n}\n\nfunction BasicDetails({\n rule,\n ruleName,\n programStageName,\n}: {\n rule: ProgramRuleDetail | undefined;\n ruleName: string;\n programStageName?: string | null;\n}) {\n const cells = resolveBasicDetailCells(rule, ruleName, programStageName);\n return (\n <div className=\"grid grid-cols-2 gap-x-dp24 gap-y-dp12 rounded-[3px] border border-dhis2-grey-300 bg-dhis2-grey-050 p-dp16\">\n {cells.map((cell) => (\n <BasicDetailCell key={cell.label} {...cell} />\n ))}\n </div>\n );\n}\n\nconst SECTION_HEADING_CLASS =\n 'm-0 mb-dp8 text-[13px] font-bold uppercase tracking-wide text-dhis2-grey-700';\n\n/**\n * `Modal` already renders its own absolutely-positioned close button and wraps every child in\n * a uniform 24px padding box — this bleeds that padding away on its own edges (negative margin)\n * and re-applies the design's own padding, instead of stacking a second layer of padding (and\n * a duplicate close icon) inside it. A plain div defaults to flex `order: 0`, which already\n * sorts before `ModalContent` (order 2) and the footer below (explicit `order: 3`).\n */\nfunction RuleDetailsHeader({\n title,\n chip,\n description,\n}: {\n title: string;\n chip: { label: string; className: string };\n description?: string;\n}) {\n return (\n <div className=\"-mx-dp24 -mt-dp24 mb-0 border-b border-dhis2-grey-300 px-dp24 pb-dp16 pe-[44px] pt-[20px]\">\n <p className=\"m-0 text-[11px] font-bold uppercase tracking-[.09em] text-dhis2-grey-600\">\n {translate('Program rule')}\n </p>\n <div className=\"mt-[6px] flex flex-wrap items-center gap-dp8\">\n <h2 className=\"m-0 text-xl font-medium leading-[1.3] text-dhis2-grey-900\">\n {title}\n </h2>\n <span\n className={`rounded-[4px] px-dp8 py-[2px] text-xs font-semibold ${chip.className}`}\n >\n {chip.label}\n </span>\n </div>\n {description ? (\n <p\n className=\"m-0 mt-[6px] text-sm text-dhis2-grey-700\"\n style={{ textWrap: 'pretty' }}\n >\n {description}\n </p>\n ) : null}\n </div>\n );\n}\n\nfunction ConditionSection({\n condition,\n variables,\n}: {\n condition: string | undefined;\n variables: VariableChip[];\n}) {\n return (\n <section>\n <h3 className={SECTION_HEADING_CLASS}>{translate('Condition')}</h3>\n <pre className=\"m-0 whitespace-pre-wrap break-words rounded-[3px] border border-dhis2-grey-300 bg-dhis2-grey-200 px-dp16 py-[14px] font-mono text-[13px] leading-[1.6] text-dhis2-grey-900\">\n {condition ?? EM_DASH}\n </pre>\n {variables.length ? (\n <div className=\"mt-dp12\">\n <p className=\"m-0 mb-dp8 text-xs text-dhis2-grey-600\">\n {translate('Variables referenced')}\n </p>\n <div className=\"flex flex-wrap gap-dp8\">\n {variables.map((variable) => (\n <span\n key={variable.token}\n className={`inline-flex items-center gap-[4px] rounded-full px-dp8 py-[2px] text-xs ${variable.className}`}\n >\n <span className=\"font-mono font-medium\">{variable.label}</span>\n <span className=\"opacity-70\">{translate(variable.kind)}</span>\n </span>\n ))}\n </div>\n </div>\n ) : null}\n </section>\n );\n}\n\nfunction ActionsSection({ actions }: { actions: ProgramRuleActionDetail[] }) {\n return (\n <section>\n <h3 className={SECTION_HEADING_CLASS}>{translate('Actions')}</h3>\n <div className=\"flex flex-col gap-dp12\">\n {actions.map((action, index) => (\n <ActionCard key={action.id} action={action} index={index} />\n ))}\n </div>\n </section>\n );\n}\n\nfunction RuleDetailsContent({\n detail,\n ruleName,\n programStageName,\n variables,\n}: {\n detail: ProgramRuleDetail;\n ruleName: string;\n programStageName?: string | null;\n variables: VariableChip[];\n}) {\n return (\n <div className=\"flex flex-col gap-dp24 pt-dp16\">\n <section>\n <h3 className={SECTION_HEADING_CLASS}>{translate('Basic details')}</h3>\n <BasicDetails\n rule={detail}\n ruleName={ruleName}\n programStageName={programStageName}\n />\n </section>\n <ConditionSection condition={detail.condition} variables={variables} />\n <ActionsSection actions={detail.programRuleActions ?? []} />\n </div>\n );\n}\n\nfunction RuleDetailsBody({\n detail,\n loading,\n error,\n ruleName,\n programStageName,\n variables,\n}: {\n detail: ProgramRuleDetail | undefined;\n loading: boolean;\n error: Error | undefined;\n ruleName: string;\n programStageName?: string | null;\n variables: VariableChip[];\n}) {\n if (loading) {\n return (\n <div className=\"flex min-h-[280px] items-center justify-center\">\n <CircularLoader small />\n </div>\n );\n }\n if (error) {\n return (\n <p className=\"m-0 text-sm text-dhis2-red-700\">\n {translate('Could not load this rule: {{message}}', { message: error.message })}\n </p>\n );\n }\n if (!detail) {\n return null;\n }\n return (\n <RuleDetailsContent\n detail={detail}\n ruleName={ruleName}\n programStageName={programStageName}\n variables={variables}\n />\n );\n}\n\n/**\n * A plain div (not `ModalActions`) — `ModalActions` sets `align-self: flex-end`, which\n * shrink-wraps it to its content width instead of stretching full-width, so the bleed-to-edge\n * trick here would compute against that shrunk box. `order: 3` reproduces `ModalActions`'\n * position in the flex column without that side effect.\n */\nfunction RuleDetailsFooter({ onClose }: { onClose: () => void }) {\n return (\n <div\n style={{ order: 3 }}\n className=\"-mx-dp24 -mb-dp24 mt-dp16 flex items-center justify-between gap-dp12 border-t border-dhis2-grey-300 bg-dhis2-grey-050 px-dp24 py-[14px]\"\n >\n <p className=\"m-0 text-sm text-dhis2-grey-600\">\n {translate('Read-only view. Edit rules in the Maintenance app.')}\n </p>\n <ButtonStrip>\n <Button secondary onClick={onClose}>\n {translate('Close')}\n </Button>\n </ButtonStrip>\n </div>\n );\n}\n\nfunction resolveActiveRuleId(open: boolean, ruleId: string | null): string | null {\n return open ? ruleId : null;\n}\n\nfunction shouldRenderModal(open: boolean, ruleId: string | null): boolean {\n return open && ruleId != null;\n}\n\nexport function RuleDetailsModal({\n open,\n onClose,\n ruleId,\n ruleName,\n status,\n programStageName,\n programRuleVariables,\n}: RuleDetailsModalProps) {\n const { detail, loading, error } = useProgramRuleDetail(resolveActiveRuleId(open, ruleId));\n\n if (!shouldRenderModal(open, ruleId)) {\n return null;\n }\n\n const chip = resolveStatusChip(status);\n const variables = parseConditionVariables(detail?.condition, programRuleVariables);\n const title = resolveRuleDisplayName(detail, ruleName);\n\n return (\n <Modal position=\"middle\" onClose={onClose}>\n <RuleDetailsHeader title={title} chip={chip} description={detail?.description} />\n <ModalContent>\n <RuleDetailsBody\n detail={detail}\n loading={loading}\n error={error}\n ruleName={ruleName}\n programStageName={programStageName}\n variables={variables}\n />\n </ModalContent>\n <RuleDetailsFooter onClose={onClose} />\n </Modal>\n );\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 { useLayoutEffect, useRef } from 'react';\n\nconst REORDER_DURATION_MS = 220;\nconst REORDER_EASING = 'ease-out';\n\nfunction prefersReducedMotion(): boolean {\n return (\n typeof window !== 'undefined' &&\n window.matchMedia('(prefers-reduced-motion: reduce)').matches\n );\n}\n\n/**\n * Animates list-item reordering via the FLIP technique (First-Last-Invert-Play):\n * captures each item's position before the order changes, then on the next\n * paint inverts the delta with a transform and plays it out to zero.\n */\nexport function useFlipReorder(\n orderedIds: readonly string[],\n containerRef: React.RefObject<HTMLElement | null>\n) {\n const positionsRef = useRef<Map<string, DOMRect>>(new Map());\n\n useLayoutEffect(() => {\n const container = containerRef.current;\n if (!container) {\n return;\n }\n\n const previousPositions = positionsRef.current;\n const items = container.querySelectorAll<HTMLElement>('[data-rule-id]');\n\n if (!prefersReducedMotion()) {\n items.forEach((item) => {\n const id = item.dataset.ruleId;\n if (!id) {\n return;\n }\n const previousRect = previousPositions.get(id);\n if (!previousRect) {\n return;\n }\n const currentRect = item.getBoundingClientRect();\n const deltaY = previousRect.top - currentRect.top;\n if (deltaY === 0) {\n return;\n }\n item.style.transition = 'none';\n item.style.transform = `translateY(${String(deltaY)}px)`;\n // Force reflow so the inverted transform applies before we animate it away.\n item.getBoundingClientRect();\n item.style.transition = `transform ${String(REORDER_DURATION_MS)}ms ${REORDER_EASING}`;\n item.style.transform = '';\n });\n }\n\n const nextPositions = new Map<string, DOMRect>();\n items.forEach((item) => {\n const id = item.dataset.ruleId;\n if (id) {\n nextPositions.set(id, item.getBoundingClientRect());\n }\n });\n positionsRef.current = nextPositions;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [orderedIds.join('|')]);\n}\n","import { Button, IconFullscreen16, IconInfo16, SegmentedControl } from '@dhis2/ui';\nimport type { RuleTraceEntry } from '@nnkogift/dhis2-form-utils-hooks';\nimport { useFormStateContext, useFormStore } from '@nnkogift/dhis2-form-utils-hooks';\nimport { useCallback, useMemo, useRef, 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 { RuleDetailsModal, type RuleDetailsStatus } from './RuleDetailsModal';\nimport { RuleGraphModal } from './RuleGraphModal';\nimport { RuleGraphView } from './RuleGraphView';\nimport { TraceTimeline } from './TraceTimeline';\nimport { getActiveRuleIds, resolveGraphTraceEntry } from './traceEntry';\nimport { useFlipReorder } from './useFlipReorder';\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 RuleScopeFilter = 'scoped' | 'all';\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 resolveDetailsStatus(inScope: boolean, firing: boolean): RuleDetailsStatus {\n if (!inScope) {\n return 'out-of-scope';\n }\n return firing ? 'firing' : 'idle';\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\nconst SCOPE_FILTER_OPTIONS = [\n { label: translate('In scope'), value: 'scoped' satisfies RuleScopeFilter },\n { label: translate('All'), value: 'all' satisfies RuleScopeFilter },\n];\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 const [scopeFilter, setScopeFilter] = useState<RuleScopeFilter>('scoped');\n const [detailsRuleId, setDetailsRuleId] = useState<string | null>(null);\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 detailsRule = useMemo(\n () => catalog.find((rule) => rule.id === detailsRuleId) ?? null,\n [catalog, detailsRuleId]\n );\n const detailsStatus = detailsRule\n ? resolveDetailsStatus(\n isRuleInScope(detailsRule, scopeStageId),\n activeRuleIds.has(detailsRule.id)\n )\n : 'idle';\n const detailsProgramStageName = detailsRule\n ? detailsRule.programStageId === null\n ? null\n : labelLookup.resolveStageName(detailsRule.programStageId)\n : undefined;\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 <div className=\"flex shrink-0 items-center gap-dp8\">\n <span className=\"text-xs text-dhis2-grey-600\">\n {translate('{{scoped}} in scope · {{firing}} firing', {\n scoped: scopedRules.length,\n firing: firingCount,\n })}\n </span>\n <SegmentedControl\n options={SCOPE_FILTER_OPTIONS}\n selected={scopeFilter}\n onChange={({ value }) => {\n setScopeFilter(value as RuleScopeFilter);\n }}\n />\n </div>\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 scopeFilter={scopeFilter}\n activeRuleIds={activeRuleIds}\n selectedRuleId={highlightRuleId}\n showConditions={showConditions}\n labelLookup={labelLookup}\n onSelectRule={(ruleId) => {\n setHighlightRuleId(ruleId);\n setTab('graph');\n }}\n onOpenDetails={(ruleId) => {\n setDetailsRuleId(ruleId);\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\n <RuleDetailsModal\n open={detailsRuleId != null}\n onClose={() => {\n setDetailsRuleId(null);\n }}\n ruleId={detailsRuleId}\n ruleName={detailsRule?.name ?? ''}\n status={detailsStatus}\n programStageName={detailsProgramStageName}\n programRuleVariables={metadata.metadata.programRuleVariables}\n />\n </aside>\n );\n}\n\ntype RulesTabProps = {\n catalog: CatalogRule[];\n scopeStageId: string | null;\n scopeFilter: RuleScopeFilter;\n activeRuleIds: ReadonlySet<string>;\n selectedRuleId: string | null;\n showConditions: boolean;\n labelLookup: ReturnType<typeof createLabelLookup>;\n onSelectRule: (ruleId: string) => void;\n onOpenDetails: (ruleId: string) => void;\n};\n\nfunction sortRulesFiringFirst(\n visibleRules: CatalogRule[],\n activeRuleIds: ReadonlySet<string>\n): CatalogRule[] {\n const firing: CatalogRule[] = [];\n const idle: CatalogRule[] = [];\n for (const rule of visibleRules) {\n (activeRuleIds.has(rule.id) ? firing : idle).push(rule);\n }\n return [...firing, ...idle];\n}\n\nfunction RulesTab({\n catalog,\n scopeStageId,\n scopeFilter,\n activeRuleIds,\n selectedRuleId,\n showConditions,\n labelLookup,\n onSelectRule,\n onOpenDetails,\n}: RulesTabProps) {\n const listRef = useRef<HTMLUListElement>(null);\n\n const visibleRules =\n scopeFilter === 'all'\n ? catalog\n : catalog.filter((rule) => isRuleInScope(rule, scopeStageId));\n\n const sortedRules = useMemo(\n () => sortRulesFiringFirst(visibleRules, activeRuleIds),\n [visibleRules, activeRuleIds]\n );\n\n useFlipReorder(\n useMemo(() => sortedRules.map((rule) => rule.id), [sortedRules]),\n listRef\n );\n\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 if (!sortedRules.length) {\n return (\n <p className=\"m-0 text-sm leading-normal text-dhis2-grey-600\">\n {translate('No rules are in scope for this stage.')}\n </p>\n );\n }\n\n return (\n <ul ref={listRef} className=\"m-0 flex list-none flex-col gap-[10px] p-0\">\n {sortedRules.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} data-rule-id={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 className=\"flex shrink-0 items-center gap-[6px]\">\n <span\n className={`text-[11px] font-semibold ${status.className}`}\n >\n {status.label}\n </span>\n <button\n type=\"button\"\n title={translate('Program rule details')}\n aria-label={translate('Program rule details')}\n onClick={(event) => {\n event.stopPropagation();\n onOpenDetails(rule.id);\n }}\n className=\"inline-flex size-[22px] shrink-0 cursor-pointer items-center justify-center rounded-[3px] border-0 bg-transparent text-dhis2-grey-600 hover:bg-dhis2-grey-200 hover:text-dhis2-blue-600\"\n >\n <IconInfo16 />\n </button>\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"]}