{"version":3,"file":"scans-BQQgz4X8.js","sources":["../../../../src/ts/scans/main.ts"],"sourcesContent":["\nimport { ScanTableData, FindingsGroup } from \"../../models/tables\";\nimport { CommonFilterData, OptionItem } from \"../../models/filters\"\nimport { Table, getFindingValueForSorting } from \"../utils\";\nimport { scansPageSize } from \"../config\";\n\nexport class ScanTable extends Table {\n\n isProjectFiltered: boolean = false;\n isProject: boolean = false;\n displayedScans: { [key: string]: boolean } = {};\n scansInProject: { [key: string]: string[] } = {};\n openProjects: { [key: string]: boolean } = {};\n collapsedProject: { [key: string]: boolean } = {};\n pageSize: number = scansPageSize;\n\n\n sort(col: string) {\n if (this.sortCol === col) {\n this.sortAsc = !this.sortAsc;\n } else {\n this.sortAsc = false;\n }\n this.sortCol = col;\n\n if (this.sortCol !== \"\") {\n if (this.isProjectFiltered) {\n // Direct sort without grouping\n this.tableData.sort((a :ScanTableData , b: ScanTableData) => this.compareValues(a, b, col));\n } else {\n // Step 1: Group data by project and sort within each group\n const groupedData = this.groupByProject(this.tableData);\n\n // Step 2: Sort each project group based on the selected column\n Object.values(groupedData).forEach(group => {\n group.sort((a, b) => this.compareValues(a, b, col));\n });\n\n const sortedGroups = Object.keys(groupedData)\n .sort((projectIdA, projectIdB) => {\n const firstItemA = groupedData[projectIdA][0];\n const firstItemB = groupedData[projectIdB][0];\n return this.compareValues(firstItemA, firstItemB, col);\n })\n .map(projectId => groupedData[projectId]);\n\n\n // Step 3: Flatten grouped data back to an array, preserving project grouping\n this.tableData = sortedGroups.flat();\n }\n }\n this.firstPage()\n }\n\n compareValues(a: ScanTableData, b: ScanTableData, col: string): number {\n\n if (col === \"project\") {\n if (!a.project) return 1;\n if (!b.project) return -1;\n if (a.project.name < b.project.name) return this.sortAsc ? 1 : -1;\n if (a.project.name > b.project.name) return this.sortAsc ? -1 : 1;\n } else if (col === \"user\") {\n if (!a.user) return 1;\n if (!b.user) return -1;\n if (a.user?.name < b.user?.name) return this.sortAsc ? 1 : -1;\n if (a.user?.name > b.user?.name) return this.sortAsc ? -1 : 1;\n } else if (col === \"findings\") {\n const aValue = getFindingValueForSorting(a.findings);\n const bValue = getFindingValueForSorting(b.findings);\n if (aValue < bValue) return this.sortAsc ? 1 : -1;\n if (aValue > bValue) return this.sortAsc ? -1 : 1;\n } else if (a[this.sortCol as keyof ScanTableData] != null && b[this.sortCol as keyof ScanTableData] != null) {\n const aValue = a[this.sortCol as keyof ScanTableData] ?? \"\";\n const bValue = b[this.sortCol as keyof ScanTableData] ?? \"\";\n\n if (aValue < bValue) return this.sortAsc ? 1 : -1;\n if (aValue > bValue) return this.sortAsc ? -1 : 1;\n }\n\n\n if (a[this.sortCol as keyof ScanTableData]! < b[this.sortCol as keyof ScanTableData]!) {\n return this.sortAsc ? 1 : -1;\n }\n if (a[this.sortCol as keyof ScanTableData]! > b[this.sortCol as keyof ScanTableData]!) {\n return this.sortAsc ? -1 : 1;\n }\n\n return this.sortAsc ? -1 : 1;\n }\n\n // Helper function to group data by project ID\n groupByProject(data: ScanTableData[]): Record {\n return data.reduce((acc: Record, scan: ScanTableData) => {\n const projectId = scan.project?.id || \"undefined\";\n if (!acc[projectId]) {\n acc[projectId] = [];\n }\n acc[projectId].push(scan);\n return acc;\n }, {});\n }\n\n defaultSorting() {\n this.tableData.sort((a: ScanTableData, b: ScanTableData) => b.date - a.date);\n }\n\n filterTable(filterData: CommonFilterData[]) {\n if(!this.isProject){\n this.isProjectFiltered = false;\n }\n let tableDataCopy: ScanTableData[] = [...this.constantTableData];\n\n filterData.forEach((filterItem: CommonFilterData) => {\n const validOptions: OptionItem[] = filterItem.options.filter((optionItem: OptionItem) => optionItem.checked);\n\n if (validOptions.length === 0) return;\n\n tableDataCopy = tableDataCopy.filter((item: ScanTableData) => !!validOptions.find((option: OptionItem) => {\n if (item.project && filterItem.col === 'project') {\n this.isProjectFiltered = true;\n return option.value === item.project.name;\n }\n if (item.branch_name && filterItem.col === 'branch_name') {\n return option.value === item.branch_name;\n }\n if (filterItem.col === 'findings') {\n return (item.findings.groups[option.value as keyof FindingsGroup] || 0) > 0\n }\n if (filterItem.type === 'Date Range') {\n return new Date(item.date * 1000) > new Date(option.from || \"\") && new Date(item.date * 1000) < new Date(option.to || \"\")\n }\n else return option.value === item[filterItem.col as keyof ScanTableData]\n }))\n });\n this.tableData = tableDataCopy;\n // Reset current page number if filtered table data length is smaller than page size\n if (this.tableData.length < this.pageSize) {\n this.curPage = 1;\n }\n }\n\n\n pagedTableData() {\n if (this.tableData) {\n\n // Paginate the already sorted `tableData`\n let start = (this.curPage - 1) * this.pageSize;\n let end = this.curPage * this.pageSize;\n const paginatedData = this.tableData.slice(start, end);\n\n\n const res = this.prepareDisplayedScans(paginatedData);\n return res\n } else {\n return [];\n }\n }\n\n resetTableData(newData: any) {\n if(!this.isProject){\n this.isProjectFiltered = false;\n }\n this.tableData = this.constantTableData = newData;\n this.defaultSorting();\n }\n\n\n prepareDisplayedScans(scans: ScanTableData[]): ScanTableData[] {\n if(this.isProjectFiltered) {\n return scans\n }\n const groupedScans = this.groupByProject(scans);\n const scansInProject: Record = {};\n const displayedScans: Record = {};\n const finalDisplayList: ScanTableData[] = [];\n\n // Process each project group\n Object.values(groupedScans).forEach((projectGroup) => {\n projectGroup.forEach((item, index) => {\n const projectId = item.project.id;\n const pageId = `${this.curPage}_${projectId}`; // Combine page and projectId\n\n\n // Initialize the project group if it doesn't exist\n if (!scansInProject[projectId]) {\n scansInProject[projectId] = [];\n }\n scansInProject[projectId].push(item.id);\n\n\n if (this.collapsedProject[pageId]) {\n this.openProjects[pageId] = false;\n } else if (item.findings.total > 0 && !this.openProjects[pageId]) {\n this.openProjects[pageId] = true; // Auto-expand if findings exist and not collapsed\n }\n if (index === 0) {\n displayedScans[item.id] = true;\n finalDisplayList.push(item);\n } else if (this.openProjects[pageId]) {\n // Add additional scans if the project is open\n finalDisplayList.push(item);\n }\n });\n });\n\n // Update the class properties for scansInProject and displayedScans\n this.scansInProject = scansInProject;\n this.displayedScans = displayedScans;\n return finalDisplayList; // Return the filtered list of scans\n }\n\n nextPage() {\n if (this.curPage * this.pageSize < this.tableData.length) this.curPage++;\n\n }\n\n previousPage() {\n if (this.curPage > 1) this.curPage--;\n }\n\n firstPage() {\n if(this.curPage > 1) this.curPage = 1\n }\n\n setIsProject() {\n this.isProject = true;\n this.isProjectFiltered = true;\n }\n}\n"],"names":["ScanTable","Table","scansPageSize","col","a","b","groupedData","group","sortedGroups","projectIdA","projectIdB","firstItemA","firstItemB","projectId","aValue","getFindingValueForSorting","bValue","data","acc","scan","filterData","tableDataCopy","filterItem","validOptions","optionItem","item","option","start","end","paginatedData","newData","scans","groupedScans","scansInProject","displayedScans","finalDisplayList","projectGroup","index","pageId"],"mappings":"0XAMO,MAAMA,UAAkBC,CAAM,CAEjC,kBAA6B,GAC7B,UAAqB,GACrB,eAA6C,CAAC,EAC9C,eAA8C,CAAC,EAC/C,aAA2C,CAAC,EAC5C,iBAA+C,CAAC,EAChD,SAAmBC,EAGnB,KAAKC,EAAa,CAQV,GAPA,KAAK,UAAYA,EACZ,KAAA,QAAU,CAAC,KAAK,QAErB,KAAK,QAAU,GAEnB,KAAK,QAAUA,EAEX,KAAK,UAAY,GACjB,GAAI,KAAK,kBAEA,KAAA,UAAU,KAAK,CAACC,EAAmBC,IAAqB,KAAK,cAAcD,EAAGC,EAAGF,CAAG,CAAC,MACvF,CAEH,MAAMG,EAAc,KAAK,eAAe,KAAK,SAAS,EAGtD,OAAO,OAAOA,CAAW,EAAE,QAAiBC,GAAA,CAClCA,EAAA,KAAK,CAACH,EAAGC,IAAM,KAAK,cAAcD,EAAGC,EAAGF,CAAG,CAAC,CAAA,CACrD,EAEK,MAAAK,EAAe,OAAO,KAAKF,CAAW,EAC3C,KAAK,CAACG,EAAYC,IAAe,CAC9B,MAAMC,EAAaL,EAAYG,CAAU,EAAE,CAAC,EACtCG,EAAaN,EAAYI,CAAU,EAAE,CAAC,EAC5C,OAAO,KAAK,cAAcC,EAAYC,EAAYT,CAAG,CACxD,CAAA,EACA,IAAiBU,GAAAP,EAAYO,CAAS,CAAC,EAInC,KAAA,UAAYL,EAAa,KAAK,CAAA,CAG3C,KAAK,UAAU,CAAA,CAGnB,cAAcJ,EAAkBC,EAAkBF,EAAqB,CAEnE,GAAIA,IAAQ,UAAW,CACf,GAAA,CAACC,EAAE,QAAgB,MAAA,GACnB,GAAA,CAACC,EAAE,QAAgB,MAAA,GACnB,GAAAD,EAAE,QAAQ,KAAOC,EAAE,QAAQ,KAAM,OAAO,KAAK,QAAU,EAAI,GAC3D,GAAAD,EAAE,QAAQ,KAAOC,EAAE,QAAQ,KAAM,OAAO,KAAK,QAAU,GAAK,CAAA,SACzDF,IAAQ,OAAQ,CACnB,GAAA,CAACC,EAAE,KAAa,MAAA,GAChB,GAAA,CAACC,EAAE,KAAa,MAAA,GAChB,GAAAD,EAAE,MAAM,KAAOC,EAAE,MAAM,KAAM,OAAO,KAAK,QAAU,EAAI,GACvD,GAAAD,EAAE,MAAM,KAAOC,EAAE,MAAM,KAAM,OAAO,KAAK,QAAU,GAAK,CAAA,SACrDF,IAAQ,WAAY,CACrB,MAAAW,EAASC,EAA0BX,EAAE,QAAQ,EAC7CY,EAASD,EAA0BV,EAAE,QAAQ,EACnD,GAAIS,EAASE,EAAe,OAAA,KAAK,QAAU,EAAI,GAC/C,GAAIF,EAASE,EAAe,OAAA,KAAK,QAAU,GAAK,CAAA,SACzCZ,EAAE,KAAK,OAA8B,GAAK,MAAQC,EAAE,KAAK,OAA8B,GAAK,KAAM,CACzG,MAAMS,EAASV,EAAE,KAAK,OAA8B,GAAK,GACnDY,EAASX,EAAE,KAAK,OAA8B,GAAK,GAEzD,GAAIS,EAASE,EAAe,OAAA,KAAK,QAAU,EAAI,GAC/C,GAAIF,EAASE,EAAe,OAAA,KAAK,QAAU,GAAK,CAAA,CAIpD,OAAIZ,EAAE,KAAK,OAA8B,EAAKC,EAAE,KAAK,OAA8B,EACxE,KAAK,QAAU,EAAI,GAE1BD,EAAE,KAAK,OAA8B,EAAKC,EAAE,KAAK,OAA8B,EACxE,KAAK,QAAU,GAAK,EAGxB,KAAK,QAAU,GAAK,CAAA,CAI/B,eAAeY,EAAwD,CACnE,OAAOA,EAAK,OAAO,CAACC,EAAsCC,IAAwB,CACxE,MAAAN,EAAYM,EAAK,SAAS,IAAM,YAClC,OAACD,EAAIL,CAAS,IACVK,EAAAL,CAAS,EAAI,CAAC,GAElBK,EAAAL,CAAS,EAAE,KAAKM,CAAI,EACjBD,CACX,EAAG,EAAE,CAAA,CAGT,gBAAiB,CACR,KAAA,UAAU,KAAK,CAACd,EAAkBC,IAAqBA,EAAE,KAAOD,EAAE,IAAI,CAAA,CAG/E,YAAYgB,EAAgC,CACpC,KAAK,YACL,KAAK,kBAAoB,IAE7B,IAAIC,EAAiC,CAAC,GAAG,KAAK,iBAAiB,EAEpDD,EAAA,QAASE,GAAiC,CACjD,MAAMC,EAA6BD,EAAW,QAAQ,OAAQE,GAA2BA,EAAW,OAAO,EAEvGD,EAAa,SAAW,IAEZF,EAAAA,EAAc,OAAQI,GAAwB,CAAC,CAACF,EAAa,KAAMG,GAC3ED,EAAK,SAAWH,EAAW,MAAQ,WACnC,KAAK,kBAAoB,GAClBI,EAAO,QAAUD,EAAK,QAAQ,MAErCA,EAAK,aAAeH,EAAW,MAAQ,cAChCI,EAAO,QAAUD,EAAK,YAE7BH,EAAW,MAAQ,YACXG,EAAK,SAAS,OAAOC,EAAO,KAA4B,GAAK,GAAK,EAE1EJ,EAAW,OAAS,aACb,IAAI,KAAKG,EAAK,KAAO,GAAI,EAAI,IAAI,KAAKC,EAAO,MAAQ,EAAE,GAAK,IAAI,KAAKD,EAAK,KAAO,GAAI,EAAI,IAAI,KAAKC,EAAO,IAAM,EAAE,EAEhHA,EAAO,QAAUD,EAAKH,EAAW,GAA0B,CAC1E,CAAC,EAAA,CACL,EACD,KAAK,UAAYD,EAEb,KAAK,UAAU,OAAS,KAAK,WAC7B,KAAK,QAAU,EACnB,CAIJ,gBAAiB,CACb,GAAI,KAAK,UAAW,CAGhB,IAAIM,GAAS,KAAK,QAAU,GAAK,KAAK,SAClCC,EAAM,KAAK,QAAU,KAAK,SAC9B,MAAMC,EAAgB,KAAK,UAAU,MAAMF,EAAOC,CAAG,EAI9C,OADK,KAAK,sBAAsBC,CAAa,CAC7C,KAEP,OAAO,CAAC,CACZ,CAGJ,eAAeC,EAAc,CACrB,KAAK,YACL,KAAK,kBAAoB,IAExB,KAAA,UAAY,KAAK,kBAAoBA,EAC1C,KAAK,eAAe,CAAA,CAIxB,sBAAsBC,EAAyC,CAC3D,GAAG,KAAK,kBACG,OAAAA,EAEL,MAAAC,EAAe,KAAK,eAAeD,CAAK,EACxCE,EAA2C,CAAC,EAC5CC,EAA0C,CAAC,EAC3CC,EAAoC,CAAC,EAG3C,cAAO,OAAOH,CAAY,EAAE,QAASI,GAAiB,CACrCA,EAAA,QAAQ,CAACX,EAAMY,IAAU,CAC5B,MAAAxB,EAAYY,EAAK,QAAQ,GACzBa,EAAS,GAAG,KAAK,OAAO,IAAIzB,CAAS,GAItCoB,EAAepB,CAAS,IACVoB,EAAApB,CAAS,EAAI,CAAC,GAEjCoB,EAAepB,CAAS,EAAE,KAAKY,EAAK,EAAE,EAGlC,KAAK,iBAAiBa,CAAM,EACvB,KAAA,aAAaA,CAAM,EAAI,GACrBb,EAAK,SAAS,MAAQ,GAAK,CAAC,KAAK,aAAaa,CAAM,IACtD,KAAA,aAAaA,CAAM,EAAI,IAE5BD,IAAU,GACKH,EAAAT,EAAK,EAAE,EAAI,GAC1BU,EAAiB,KAAKV,CAAI,GACnB,KAAK,aAAaa,CAAM,GAE/BH,EAAiB,KAAKV,CAAI,CAC9B,CACH,CAAA,CACJ,EAGD,KAAK,eAAiBQ,EACtB,KAAK,eAAiBC,EACfC,CAAA,CAGX,UAAW,CACH,KAAK,QAAU,KAAK,SAAW,KAAK,UAAU,QAAa,KAAA,SAAA,CAInE,cAAe,CACR,KAAK,QAAU,GAAQ,KAAA,SAAA,CAG9B,WAAY,CACL,KAAK,QAAU,IAAG,KAAK,QAAU,EAAA,CAGxC,cAAe,CACX,KAAK,UAAY,GACjB,KAAK,kBAAoB,EAAA,CAEjC"}