VG+SIm(=K{vhEB<$juwgrK_MTnP`Aivpj
zIlE@}X;+8F_V7g@e|k7^tfVa6^pZxVzkE>{C`zf_Gcl~8ofCh1rv7Ob7Z<6Z(GcJ(mWmUEG$IyIM_vmwP&_N|O|4XltarwII3B2EQ@c
zASAn)d$(dUN#YuG7plwOkGi6Wx~5e$3YUNtQ2Nd_)$&Vm^duU|K*UGVCWC7WBgr8ySo5^jrKCxXv%)b4&CDG>Xx0W+rqP}F~
zk-#x5jkqp~UyhfFX%btuj?EFeXbu*C8@)0hYMwKsVx+M)bLgr(VeC@*SXElV+L%S9
zZffDNN&k%~PL6msZ{rGvM`ww^7esr<;k1a{sAsdh`s?MGQH*O7&8;Ut*Kzl%L;aIN
zAF8CS`*ZL)d)Y
z2?pg1f1YitXD+#WsQmV*nYTb%;1k8poEbyp5^+lpfmQyK$=#}$F*x~C5oqpnVN)#D^G?y6U%P&f-^$hQpYABt+@wbvJrHVU
z_(siVQx)b$mVZNz&Fc|;4o-uyTD(WSOT6uTBCaOA41O)RYZiMKho*kx`SJDSG95Bf
z`odSoN&^=eX>sSeUB_}X=byIvf$ZbzmQm2;CR$NA17JXp4k0>O?qkqU3#&tS8$)@$
zbg!Z?*SQ$Q5g5yK;V^=|-YgQP6e!|I&c^k_T9xc5FiAtN_`-=97RsVqOa4+w|o
z(!qSr?=cQZ)31xUaN(Vk67Anu0I#a3UqU*93ar-!R)q1pk`+&EWdrt8|849-8UZ$9
z#I@!TiS3v;(;SoP<&}+y_tRL3%={ZpdCMQiSQX6TiW-BiBEl7Od%JX#Dcpk(E5q9LO$<@6QYH}@XX+mV>a81w&YXJ
zSy7tn=c{mG`RY>vZA2Q>#x~Eu8e|m}LVUu`5LF8ENO>wp((sf`J5H_-saxOuVs*an
zVDS=hB!>6s(m%t|Ngz2%bdk$JC{9dCe=V^z)FyooKITfuU1=I1*MQ#@SKV9sz@71s
zE66M^QpB6;A|pT7t>HC{uC~U=m{9ngQvb;DDcdXhVBH|AfW#52L)h{FTz2w;si*u}
zw_=T+ncIG($|pa4NfWpEakW5BNZYTOd(B=wO&G$mq3b!6-e#M(kKW4lBgGs|%u3Y6?AW*d-n2IR=W|Xoiv`iKw|EAP=w~K9!>mt$T
zQQd1trxQ&37AQDlKnT;qWC5g;r$ROvniehQG$u1X(AFH~r}n9?u8#mG4>S1#(4_vC
z8@xgCKsRgdL&0*Fx?3N|R*F8AJfUw7vM}OljRb3Ea@9r+zbO8)AvN)sR5YA>VCZsd
zjAhhp=9a=?c+dedLvU9jkIZuX3V}OL2X4!&iw||7(Z?tj)4yBSi>g?t4{XnZx#hrj
zFOH>g@K)zZ7%jlWT?A+2&kKEu(=d3mCds`>W>v0wGut9}RhW^VHRsPlT1_W`1{r
zOLy#wn|h_Z(1%P;?2jWQT$s!saJ2H$=S+%m8gK8lcX0QHd~v1qX|YpMkx$HuXivm$kC;ZK5
z;JcT{O-h{lUjY32>Y+B7WAaG61~w}Cw(CwM+B2$a_^_%JK`-Vdw99)`?{u!J8U-&H
zYV#8LTbcFAcTJNM+YRtz_zblOYKLV01f{
z*SO>=#ACSN#Q^fsUlfG`WUbs->!Z4YXLAsp$7~_ZlBmYQ=QlQ(TBTk_!BwNiMTj0=
zC03cgC9KY?^sXYI7G4@+Z8k11V3r?ROFu1IOJ6VU#fLh8kQVn0t-g|a_b};$ZJ2r%
zcETM^J=7|6`wXP#j1;Da1>O}E3zp_#3>#UEpgkmRW#V?pc46(;W5PGf<E^QJ1{D*@LE5b74%>T#XUY@R!iKUPdOGR2zO5M4Qsqzn1I;SzJB*`VHHel_2
zbjH6CvaMeTSu3*i)ixoU7(7^UWl2G!s;+at(0`ro4!(~%7GVMDX?Al9c|*;@{D6Z+
zF3q0$Rw|!?R;eS&{U=NOQth=fhFv~kWljsy~5}%=tUT0B0CPX$+4e)ez-*c6A{!}hT{%AeHB+6_2#pW<*lnp
zcOz2FlXhjELk)x#C#bKI6Fn8>3tQX?`@{Od@iF^ufD^L5;NBSY<&SPp)2#2U?w
zRW%nC*u%#UP#BTBgp5e6fFNty@-p|RbY|otaXQ^4x#EwGI`XAcMp!TFNY6)m%@*LNI^vxa@5sVB`$#J;rIFdd`jm3M=8
zeN0Z8(R?mm8BYJ@%HRIHmdmro|MUc!4cNVRZ#5H*@zt;p$KnTUeJH^kkricUnOF4J
z7V;ok3Zlb`{hH3R58e&MOjoLM
zcfi80`0GRkL^gOK;FB;jLua%-EMwnA&_MBdd2H1`2Kw_E4X}q+z
zyUj9;#a0k=o?r-)wK>cdYe`l7)`q;$&E>xXIFdq&-#nXd@mJunc)-|*Is7%6OLfy8
zC+U%H8^pnj{
zv+P%LMQlq2+bXwGQIN8t1c5&zx}e8k`BMD((z&NTcX+j`?2{PjAE>$>@be=zp9P9Z
z@~7TV#fVp#fmW&bR(J5muq)y22H$zL8!h?7hxWDa0lHTV!!H_8WKUvlR8sq6dHaF#
zalK_xD~aJ~lEyZZ!rybay*kSK!NOUfL?rR2Jr(6s1zIx}rtY$jgE8#}1mgv&nxx>U
zapYz&run(En|Ewt1s8vDZ6fOGDWZiXA|ceHkZ>q|79Bn{LZM>3(U3_;K!Dhglx@Xv
z8F|)N|Cbq^EJQY0Y)XMO?(iIK8PqPx;uxTP=~ZS!n{4?8dAgr6wNQd1hGos?+%HI`
zodv|&9HtBs&F7Gruk_rt5~0&=2Ml^w5Agi~`qgb`6lF1@n=@`q($#@yOmw7~>}D1p
z2j`A74?JX6)`FFB`~Vt=D$lT;t^nM_!+R9V2E|n>AYU{0Bp+8G3b$uBF;^0_o4Gnrn?=klX|}bd#1y>Q{kO~$U%5~v9kd`F
z0#2o_Xl(M-JU-;i=41>S^bxx${C?Sf#&{Z}x3b5{Cyn>@)z!nQ4+EwOtEKN&j0|2Src=%o7hHrrJYjNIFZio;ixM1M_`h1R0H
z{)?&I-vQAjAAy+7=kVfUfF>OnhX)>xsYdKpQG0s-=&F;vV-B9?WX|XguE_FL0h)M+
zvh}@%OKH}%d)0!?r3CIY;D8F_-oEm>t&Mi)gV*-0-(-As1%Gs^w$A9`20?V0j4G=&
za4r->>W=cGpHR35Gy{-coLcnN-AIrH$p&|Oi{;`_vIC14K1J)rCBvk{4TcI3nlX+E
zd=(qf8UD-HJKkEQ63l`jRIr1YZ=FNy!!|gFB;o=n*^gX`zzeHPm>!j>13x
zer#qn1vF|f(aJQ~)ElJMFORoRF8iQTVQ~?HGxDl$0ybP6W~`^O6M$hQE53n$kbVTi
zqgBRirE6uEsP&@vBof`Y=CO*0ic4|vTKY+}Xf`Jaocah@pEZ0!NhvdDHc}n5%s!&5
zbW6Vib@k2L%S(h9xbW=EXk=oAs~PBqX6#9!3!27nmfmJ}nCc8soiOvEhJ~U?E4auk
z`eyHsI_V;Fdjt*Y?2vW-is~^FONPOAyB#l
zvsV|cD-IB!h}N%FuQEeVq-m`Vl^B%TE8u7|vqoRr|MkDWx$@4&U)twH-f%>hUWA2&
zIG}W4o;VxZ385o!>b|GKoJX1%s#$r20%f$*$T>hv#*j5C#=v&gTe9X`U1XFoBWff~
zeH?0bn0Re?S6GIro_;jBHqe{vC%F^l@rrN=T$Pg)Tslmyi&lgj
z0~Cjtj?mD|-NWcO4xm`@yTq=e0i6&meC78)SOJrunUSK{9E1~XDyxToU%EgwtZLWC
z$HczU_d7VVNzkts|E^xw#aF(WhHfeG=I1m7mJOtX4~W)ZV#8PQ{#oAnxsqxGL6%Dh
zL9Y8Gjo15I9+bs68BRTN6!x!o7e1f#Vny=vjAP2_brKRVqOHdxxf!Axb|7!}E5XE-!1g02=zqM=GvdS^Sk86)@0YKV6J*
zj5vK2SgZA#eQqH2i@$#_(_Hvbv#=+}_STG%66kV+=<6`r`MuNEUZiwy=U0YbN$IDb
z|3|&`Z{C(yRt~#L-)5)M+wT>=414gz<{qnmPZ<09%A+Fl4c9&fdQM$JW~a
z*;w4ZEy{?ST2>~3MTH2_hG8UBNX^Xu)`Rnxn_cNMvfF;DFH5^{b6H*TYB$Z!$!pfc
zb*=XWiqWq)AFXJKcNEoG+dNfNd{XZ54ER?3)s{0yZD$1Fr
zZ}X2DwZBr1Z@qDt*?2gKnrK!oyn*pruw2dFTzt&h{s>XG$h-PvCNFrlMH@U@0`*nw
z%%J2E6cp5on`$&uQF`m;!T&kf)gjBKx_3&{3?56y*bmuO)8FbtX}c2l__?L6HjP=?
z3+it)abH5CBTFGeio~kL;R5n}aWJY63FTKljCpwd0+K6el=lk6Z|HS>>~c6SvX4k`
z7E$95EU(|#&&$lkr;W+CAeON?gsoi}!8jmbBGN9>yNH+-Vr`wPiHhRXch~nm@L>=W|?S~RP13f-G8FWx!ZhU`Y
zeUyL@StMR~H|_&LXPFsa?frf4`ygflhhHZ^_nyRjnBPC=lFMo3w-}WKh&7NfuMapq
z^i2M~-H`*kcQrFQT2~lJV??5@;ipUTl*psg>+z8O#THnAEedXzuT{1~uDabHzF*EA
z|2hm+`foR>A;s!6iT)e0WoVITjl1T}XyFIDkEfS+xMV%qI2_&uKg=7?m1k4h&8=L0
zu?U*Fm?2Ku3VIZw2WLMhLByv}`ca8s-4@=x@&)QZQzdw^P#R7JALg;c4wzsdt}Rtf
z(b3gbKX$FXx0$n9$rG&7z=3}0gslTb?A!Q_YLpb$?re6$C+SGoWrJv3?MbVvz^i{b
za*jXiDE8pdMa+9-J$b}Oy}K`+ei0XNbE_%=6Wab%F5}H$K74#kUL8#n73nAU23pAt
zuoG*MRM(@tJr9Cl4(Ao}TC3#U`#_;T01(=?5yQE=D%qULKbp17FYWhgm7j4>6y%xH
z(@?VSdZtq)S1N~rSYm7}W4z7S8HYO81mYXUhsLSBopo(k*=|rJrG^?P|zy=Z!dG2}dzw`@E#b&Fs?T9J8G3Vnl2uu)_N8PDxi%U+;$MkcKtRZsWN
zZ}M%)n&uHmnpvS+kyK?XUh0zwuSNuDD41R`(l}w?(en2XX{UF||NN42@%Fi{^ybh$
zHsvs3R3j5LaHQ^SO{P{xaO6dpL+h$EKt|2>s6++
zlZvzsdKPh2fX}$v{)26>o(SEOeHG*Ku3gJK0+;5gd^@ef2GF-~LQ%k};W-FsA4%9@
zWDDX`$Bo0*QaAqr<{eSRtR;)+AS5gwWKfb9Y0nY(WQ`n(ftH##A|1hs0CHePg`0a8
z224#{C0HWej${db>kNl{9iTnlWgr4J`ojl{j*0R3TaWx!H+K5xdHmdED;h)Xr-vHO
zrmg}w7P-iVv%3{ss%#^aNM{N&>5;(GfRNfNDlB*eZjE|;0+ZqrioV5Q{jtz)@-zrA
z0F1KEMs3lht$S^?<^SB`$N`|Jz}@qAuH|1Iy@&5o{TgwH{cPmL&Cm@w@Up-z0)g)OQ3e2H|f)VH+(
zb?ZpY-~RH?D}69)f__Nq6NqOK?Hum3PkxG3HAOEi$Dx$hjzl_1aMpv%ft5;qP9O~whl>POzb>KxwW(0W?lsMy@jb$3m45KE}qc?NqqiQ)f
zG=eV<68o4*4r5|@8~t+Y$UW$(zakCcPSr9S=p`gXw*_9^wZH#Ei#hm0+zKb=*6!*J
zPV!?e=EJXQ7+RredP_i$bN3W9OEX2*>}A;QHj@p>o2y&soJaMum^`Shl@-9h#oxRF
zC!aPf+kvAn9#mI5t=k~^67sW
z;5Ie~2M&JiaM8&WS7Ij+k50~TgdkH9}>R)
lOJURhEK}^i`NdB84!01se`MRCWZS<0d;#)H)w!#`{wpCHi?sj%
literal 0
HcmV?d00001
diff --git a/frontend/src/components/jobs/result/visualizer/elements/const.js b/frontend/src/components/jobs/result/visualizer/elements/const.js
index 3ba12f827b..7e0d1a211d 100644
--- a/frontend/src/components/jobs/result/visualizer/elements/const.js
+++ b/frontend/src/components/jobs/result/visualizer/elements/const.js
@@ -4,4 +4,5 @@ export const VisualizerComponentType = Object.freeze({
VLIST: "vertical_list",
HLIST: "horizontal_list",
TITLE: "title",
+ TABLE: "table",
});
diff --git a/frontend/src/components/jobs/result/visualizer/elements/table.jsx b/frontend/src/components/jobs/result/visualizer/elements/table.jsx
new file mode 100644
index 0000000000..f684a74e8e
--- /dev/null
+++ b/frontend/src/components/jobs/result/visualizer/elements/table.jsx
@@ -0,0 +1,79 @@
+import React from "react";
+import PropTypes from "prop-types";
+import { DataTable, DefaultColumnFilter } from "@certego/certego-ui";
+
+import { VerticalListVisualizer } from "./verticalList";
+import { HorizontalListVisualizer } from "./horizontalList";
+
+function getAccessor(element) {
+ if ([VerticalListVisualizer, HorizontalListVisualizer].includes(element.type))
+ // recursive call
+ return element.props.values.map((val) => getAccessor(val)).flat();
+ return element.props.value;
+}
+
+export function TableVisualizer({
+ id,
+ size,
+ columns,
+ data,
+ pageSize,
+ disableFilters,
+ disableSortBy,
+}) {
+ const tableColumns = [];
+
+ columns.forEach((column) => {
+ const columnHeader = column.replaceAll("_", " ");
+ tableColumns.push({
+ Header: columnHeader,
+ id: column,
+ accessor: (row) => getAccessor(row[column]),
+ Cell: ({
+ cell: {
+ row: { original },
+ },
+ }) => original[column],
+ disableFilters,
+ disableSortBy,
+ Filter: DefaultColumnFilter,
+ });
+ });
+
+ const tableConfig = {};
+ const tableInitialState = {
+ pageSize,
+ };
+
+ return (
+