1- import { classModule , eventListenersModule , h , init , propsModule , styleModule , toVNode } from "snabbdom" ;
21import * as d3Interpolate from "d3-interpolate" ;
3- import { _ } from "./utils/language.js" ;
2+ import { Moment } from "moment" ;
3+ import { classModule , eventListenersModule , h , init , propsModule , styleModule , VNode } from "snabbdom" ;
44import { DataDistributor , Filter , ObjectsLinksAndNodes } from "./datadistributor.js" ;
55import { GenericNodeFilter } from "./filters/genericnode.js" ;
66import * as helper from "./utils/helper.js" ;
7- import { compare } from "./utils/version.js" ;
8- import { Moment } from "moment" ;
7+ import { _ } from "./utils/language.js" ;
98import { Node } from "./utils/node.js" ;
109
10+ type TableNode = {
11+ element : HTMLTableElement ;
12+ vnode ?: VNode ;
13+ } ;
14+
1115const patch = init ( [ classModule , propsModule , styleModule , eventListenersModule ] ) ;
1216
1317export const Proportions = function ( filterManager : ReturnType < typeof DataDistributor > ) {
@@ -20,16 +24,7 @@ export const Proportions = function (filterManager: ReturnType<typeof DataDistri
2024 let scale = d3Interpolate . interpolate ( config . forceGraph . tqFrom , config . forceGraph . tqTo ) ;
2125 let time : Moment ;
2226
23- let statusTable : HTMLTableElement ;
24- let fwTable : HTMLTableElement ;
25- let baseTable : HTMLTableElement ;
26- let depTable : HTMLTableElement ;
27- let hwTable : HTMLTableElement ;
28- let geoTable : HTMLTableElement ;
29- let autoTable : HTMLTableElement ;
30- let gatewayTable : HTMLTableElement ;
31- let gateway6Table : HTMLTableElement ;
32- let domainTable : HTMLTableElement ;
27+ let tables : Record < string , TableNode > = { } ;
3328
3429 function count ( nodes : Node [ ] , key : string [ ] , f ?: ( k : any ) => any ) {
3530 let dict = { } ;
@@ -60,10 +55,11 @@ export const Proportions = function (filterManager: ReturnType<typeof DataDistri
6055 } ;
6156 }
6257
63- function fillTable ( name : string , table : HTMLTableElement | undefined , data : any [ ] [ ] ) : HTMLTableElement {
64- if ( ! table ) {
65- table = document . createElement ( "table" ) ;
66- }
58+ function fillTable ( name : string , table : TableNode | undefined , data : any [ ] [ ] ) : TableNode {
59+ let tableNode : TableNode = table ?? {
60+ element : document . createElement ( "table" ) ,
61+ vnode : undefined ,
62+ } ;
6763
6864 let max = Math . max . apply (
6965 Math ,
@@ -97,8 +93,8 @@ export const Proportions = function (filterManager: ReturnType<typeof DataDistri
9793 return h ( "tr" , [ th , td ] ) ;
9894 } ) ;
9995 let tableNew = h ( "table" , { props : { className : "proportion" } } , items ) ;
100- patch ( table , tableNew ) ;
101- return table ;
96+ tableNode . vnode = patch ( tableNode . vnode ?? tableNode . element , tableNew ) ;
97+ return tableNode ;
10298 }
10399
104100 self . setData = function setData ( data : ObjectsLinksAndNodes ) {
@@ -150,77 +146,95 @@ export const Proportions = function (filterManager: ReturnType<typeof DataDistri
150146 return d ;
151147 } ) ;
152148
153- statusTable = fillTable (
149+ tables . status = fillTable (
154150 "node.status" ,
155- statusTable ,
151+ tables . status ,
156152 statusDict . sort ( function ( a , b ) {
157153 return b [ 1 ] - a [ 1 ] ;
158154 } ) ,
159155 ) ;
160- fwTable = fillTable ( "node.firmware" , fwTable , fwDict . sort ( compare ) ) ;
161- baseTable = fillTable ( "node.baseversion" , baseTable , baseDict . sort ( compare ) ) ;
162- depTable = fillTable (
156+
157+ tables . firmware = fillTable (
158+ "node.firmware" ,
159+ tables . firmware ,
160+ fwDict . sort ( function ( a , b ) {
161+ return b [ 1 ] - a [ 1 ] ;
162+ } ) ,
163+ ) ;
164+
165+ tables . baseversion = fillTable (
166+ "node.baseversion" ,
167+ tables . baseversion ,
168+ baseDict . sort ( function ( a , b ) {
169+ return b [ 1 ] - a [ 1 ] ;
170+ } ) ,
171+ ) ;
172+
173+ tables . deprecationStatus = fillTable (
163174 "node.deprecationStatus" ,
164- depTable ,
175+ tables . deprecationStatus ,
165176 deprecationDict . sort ( function ( a , b ) {
166177 return b [ 1 ] - a [ 1 ] ;
167178 } ) ,
168179 ) ;
169- hwTable = fillTable (
180+
181+ tables . hardware = fillTable (
170182 "node.hardware" ,
171- hwTable ,
183+ tables . hardware ,
172184 hwDict . sort ( function ( a , b ) {
173185 return b [ 1 ] - a [ 1 ] ;
174186 } ) ,
175187 ) ;
176- geoTable = fillTable (
188+
189+ tables . visible = fillTable (
177190 "node.visible" ,
178- geoTable ,
191+ tables . visible ,
179192 geoDict . sort ( function ( a , b ) {
180193 return b [ 1 ] - a [ 1 ] ;
181194 } ) ,
182195 ) ;
183- autoTable = fillTable (
196+
197+ tables . update = fillTable (
184198 "node.update" ,
185- autoTable ,
199+ tables . update ,
186200 autoDict . sort ( function ( a , b ) {
187201 return b [ 1 ] - a [ 1 ] ;
188202 } ) ,
189203 ) ;
190- gatewayTable = fillTable (
204+ tables . gateway = fillTable (
191205 "node.selectedGatewayIPv4" ,
192- gatewayTable ,
206+ tables . gateway ,
193207 gatewayDict . sort ( function ( a , b ) {
194208 return b [ 1 ] - a [ 1 ] ;
195209 } ) ,
196210 ) ;
197- gateway6Table = fillTable (
211+ tables . gateway6 = fillTable (
198212 "node.selectedGatewayIPv6" ,
199- gateway6Table ,
213+ tables . gateway6 ,
200214 gateway6Dict . sort ( function ( a , b ) {
201215 return b [ 1 ] - a [ 1 ] ;
202216 } ) ,
203217 ) ;
204- domainTable = fillTable (
218+ tables . domain = fillTable (
205219 "node.domain" ,
206- domainTable ,
220+ tables . domain ,
207221 domainDict . sort ( function ( a , b ) {
208222 return b [ 1 ] - a [ 1 ] ;
209223 } ) ,
210224 ) ;
211225 } ;
212226
213227 self . render = function render ( el : HTMLElement ) {
214- self . renderSingle ( el , "node.status" , statusTable ) ;
215- self . renderSingle ( el , "node.firmware" , fwTable ) ;
216- self . renderSingle ( el , "node.baseversion" , baseTable ) ;
217- self . renderSingle ( el , "node.deprecationStatus" , depTable ) ;
218- self . renderSingle ( el , "node.hardware" , hwTable ) ;
219- self . renderSingle ( el , "node.visible" , geoTable ) ;
220- self . renderSingle ( el , "node.update" , autoTable ) ;
221- self . renderSingle ( el , "node.selectedGatewayIPv4" , gatewayTable ) ;
222- self . renderSingle ( el , "node.selectedGatewayIPv6" , gateway6Table ) ;
223- self . renderSingle ( el , "node.domain" , domainTable ) ;
228+ self . renderSingle ( el , "node.status" , tables . status . element ) ;
229+ self . renderSingle ( el , "node.firmware" , tables . firmware . element ) ;
230+ self . renderSingle ( el , "node.baseversion" , tables . baseversion . element ) ;
231+ self . renderSingle ( el , "node.deprecationStatus" , tables . deprecationStatus . element ) ;
232+ self . renderSingle ( el , "node.hardware" , tables . hardware . element ) ;
233+ self . renderSingle ( el , "node.visible" , tables . visible . element ) ;
234+ self . renderSingle ( el , "node.update" , tables . update . element ) ;
235+ self . renderSingle ( el , "node.selectedGatewayIPv4" , tables . gateway . element ) ;
236+ self . renderSingle ( el , "node.selectedGatewayIPv6" , tables . gateway6 . element ) ;
237+ self . renderSingle ( el , "node.domain" , tables . domain . element ) ;
224238
225239 if ( config . globalInfos ) {
226240 let images = document . createElement ( "div" ) ;
0 commit comments