11// 状態/DOMヘルパー
2+ // contextは「UI状態・設定値など長期的に保持する値」に限定する。
3+ // 一時的な中間データはcontextに保存せず、関数内のローカル変数で扱う。
24const packageContext = {
35 packageSummaryCache : null ,
46 diagramNodeIdToFqn : new Map ( ) ,
57 aggregationDepth : 0 ,
6- diagramElement : null ,
7- pendingDiagramRender : null ,
8- lastDiagramSource : '' ,
9- lastDiagramEdgeCount : 0 ,
10- DEFAULT_MAX_EDGES : 500 ,
118 packageFilterFqn : null ,
129 relatedFilterMode : 'direct' ,
1310 relatedFilterFqn : null ,
@@ -16,6 +13,7 @@ const packageContext = {
1613} ;
1714
1815const DIAGRAM_CLICK_HANDLER_NAME = 'filterPackageDiagram' ;
16+ const DEFAULT_MAX_EDGES = 500 ;
1917
2018const dom = {
2119 getRelatedFilterTarget : ( ) => document . getElementById ( 'related-filter-target' ) ,
@@ -881,8 +879,7 @@ function getOrCreateDiagramErrorBox(diagram) {
881879 return dom . createDiagramErrorBox ( diagram ) ;
882880}
883881
884- function showDiagramErrorMessage ( message , withAction , err , hash , context ) {
885- const diagram = context . diagramElement ;
882+ function showDiagramErrorMessage ( diagram , message , pendingRender , err , hash ) {
886883 if ( ! diagram ) return ;
887884 console . error ( message ) ;
888885 if ( err ) {
@@ -896,12 +893,11 @@ function showDiagramErrorMessage(message, withAction, err, hash, context) {
896893 const actionNode = dom . getDiagramErrorActionNode ( ) ;
897894 dom . setNodeTextContent ( messageNode , message ) ;
898895 if ( actionNode ) {
899- dom . setNodeDisplay ( actionNode , withAction ? '' : 'none' ) ;
900- if ( withAction ) {
896+ const hasAction = Boolean ( pendingRender ) ;
897+ dom . setNodeDisplay ( actionNode , hasAction ? '' : 'none' ) ;
898+ if ( hasAction ) {
901899 dom . setNodeOnClick ( actionNode , function ( ) {
902- if ( ! context . pendingDiagramRender ) return ;
903- renderDiagramWithMermaid ( context . pendingDiagramRender . text , context . pendingDiagramRender . maxEdges , context ) ;
904- context . pendingDiagramRender = null ;
900+ renderDiagramWithMermaid ( diagram , pendingRender . text , pendingRender . maxEdges ) ;
905901 } ) ;
906902 } else {
907903 dom . setNodeOnClick ( actionNode , null ) ;
@@ -922,8 +918,7 @@ function hideDiagramErrorMessage(diagram) {
922918 dom . setDiagramElementDisplay ( diagram , '' ) ;
923919}
924920
925- function renderDiagramWithMermaid ( text , maxEdges , context ) {
926- const diagram = context . diagramElement ;
921+ function renderDiagramWithMermaid ( diagram , text , maxEdges ) {
927922 if ( ! diagram || ! window . mermaid ) return ;
928923 hideDiagramErrorMessage ( diagram ) ;
929924 dom . removeDiagramAttribute ( diagram , 'data-processed' ) ;
@@ -933,10 +928,10 @@ function renderDiagramWithMermaid(text, maxEdges, context) {
933928}
934929
935930// 描画/更新
936- function renderMutualDependencyList ( mutualPairs , causeRelationEvidence , context ) {
931+ function renderMutualDependencyList ( mutualPairs , causeRelationEvidence , aggregationDepth ) {
937932 const container = dom . getMutualDependencyList ( ) ;
938933 if ( ! container ) return ;
939- const items = buildMutualDependencyItems ( mutualPairs , causeRelationEvidence , context . aggregationDepth ) ;
934+ const items = buildMutualDependencyItems ( mutualPairs , causeRelationEvidence , aggregationDepth ) ;
940935 if ( items . length === 0 ) {
941936 container . style . display = 'none' ;
942937 container . innerHTML = '' ;
@@ -970,13 +965,12 @@ function renderMutualDependencyList(mutualPairs, causeRelationEvidence, context)
970965function renderPackageDiagram ( context , packageFilterFqn , relatedFilterFqn ) {
971966 const diagram = dom . getDiagram ( ) ;
972967 if ( ! diagram ) return ;
973- context . diagramElement = diagram ;
974968
975969 const renderPlan = buildDiagramRenderPlan ( context , packageFilterFqn , relatedFilterFqn ) ;
976970 applyDiagramRenderPlan ( context , renderPlan ) ;
977- if ( shouldSkipDiagramRenderByEdgeLimit ( context ) ) return ;
978- setDiagramSource ( diagram , context . lastDiagramSource ) ;
979- renderDiagramWithMermaidIfAvailable ( context ) ;
971+ if ( shouldSkipDiagramRenderByEdgeLimit ( diagram , renderPlan , context ) ) return ;
972+ setDiagramSource ( diagram , renderPlan . source ) ;
973+ renderDiagramWithMermaidIfAvailable ( diagram , renderPlan , context ) ;
980974}
981975
982976function buildDiagramRenderPlan ( context , packageFilterFqn , relatedFilterFqn ) {
@@ -1013,20 +1007,19 @@ function buildDiagramRenderPlan(context, packageFilterFqn, relatedFilterFqn) {
10131007
10141008function applyDiagramRenderPlan ( context , renderPlan ) {
10151009 context . diagramNodeIdToFqn = renderPlan . nodeIdToFqn ;
1016- renderMutualDependencyList ( renderPlan . mutualPairs , renderPlan . filteredCauseRelationEvidence , context ) ;
1017- context . lastDiagramSource = renderPlan . source ;
1018- context . lastDiagramEdgeCount = renderPlan . uniqueRelations . length ;
1010+ renderMutualDependencyList ( renderPlan . mutualPairs , renderPlan . filteredCauseRelationEvidence , context . aggregationDepth ) ;
10191011}
10201012
1021- function shouldSkipDiagramRenderByEdgeLimit ( context ) {
1022- if ( context . lastDiagramEdgeCount <= context . DEFAULT_MAX_EDGES ) return false ;
1023- context . pendingDiagramRender = { text : context . lastDiagramSource , maxEdges : context . lastDiagramEdgeCount } ;
1013+ function shouldSkipDiagramRenderByEdgeLimit ( diagram , renderPlan , context ) {
1014+ const edgeCount = renderPlan . uniqueRelations . length ;
1015+ if ( edgeCount <= DEFAULT_MAX_EDGES ) return false ;
1016+ const pendingRender = { text : renderPlan . source , maxEdges : edgeCount } ;
10241017 const message = [
10251018 '関連数が多すぎるため描画を省略しました。' ,
1026- `エッジ数: ${ context . lastDiagramEdgeCount } (上限: ${ context . DEFAULT_MAX_EDGES } )` ,
1019+ `エッジ数: ${ edgeCount } (上限: ${ DEFAULT_MAX_EDGES } )` ,
10271020 '描画する場合はボタンを押してください。' ,
10281021 ] . join ( '\n' ) ;
1029- showDiagramErrorMessage ( message , true , null , null , context ) ;
1022+ showDiagramErrorMessage ( diagram , message , pendingRender , null , null ) ;
10301023 return true ;
10311024}
10321025
@@ -1035,22 +1028,21 @@ function setDiagramSource(diagram, source) {
10351028 diagram . textContent = source ;
10361029}
10371030
1038- function renderDiagramWithMermaidIfAvailable ( context ) {
1031+ function renderDiagramWithMermaidIfAvailable ( diagram , renderPlan , context ) {
10391032 if ( ! window . mermaid ) return ;
1040- ensureMermaidParseErrorHandler ( context ) ;
1041- renderDiagramWithMermaid ( context . lastDiagramSource , context . DEFAULT_MAX_EDGES , context ) ;
1033+ ensureMermaidParseErrorHandler ( diagram , renderPlan , context ) ;
1034+ renderDiagramWithMermaid ( diagram , renderPlan . source , DEFAULT_MAX_EDGES ) ;
10421035}
10431036
1044- function ensureMermaidParseErrorHandler ( context ) {
1045- if ( mermaid . parseError ) return ;
1037+ function ensureMermaidParseErrorHandler ( diagram , renderPlan , context ) {
10461038 mermaid . parseError = function ( err , hash ) {
10471039 const message = err && err . message ? err . message : String ( err ) ;
10481040 const location = hash ? `\nLine: ${ hash . line } Column: ${ hash . loc } ` : '' ;
10491041 const isEdgeLimit = message . includes ( 'Edge limit exceeded' ) ;
1050- if ( isEdgeLimit ) {
1051- context . pendingDiagramRender = { text : context . lastDiagramSource , maxEdges : context . lastDiagramEdgeCount } ;
1052- }
1053- showDiagramErrorMessage ( `Mermaid parse error: ${ message } ${ location } ` , isEdgeLimit , err , hash , context ) ;
1042+ const pendingRender = isEdgeLimit
1043+ ? { text : renderPlan . source , maxEdges : renderPlan . uniqueRelations . length }
1044+ : null ;
1045+ showDiagramErrorMessage ( diagram , `Mermaid parse error: ${ message } ${ location } ` , pendingRender , err , hash ) ;
10541046 } ;
10551047}
10561048
0 commit comments