src/components/Matrix/util.js (118 lines of code) (raw):

import React from "react"; import "react-base-table/styles.css"; import { Column } from "react-base-table"; import { languages } from "@site/data/matrix"; const _key = (language) => language.replace(".", "").replace(" ", ""); export const genColumns = () => { return ["Feature", "Sub"].concat(languages).map((language, index) => { return { key: _key(language), dataKey: _key(language), title: language === "Sub" ? "" : language, width: index === 0 ? 180 : index === 1 ? 150 : index === 7 // DotPulsar ? 120 : index === 8 // .NET ? 100 : index === 9 // WS ? 90 : index === 11 // REST ? 126 : 74, dataGetter: ({ column, rowData }) => { if (parseInt(rowData[column.dataKey]) === 0) { return "🚫"; } else if (parseInt(rowData[column.dataKey]) === 1) { return "✔️"; } else if (parseInt(rowData[column.dataKey]) === 2) { return "✅"; } return rowData[column.dataKey]; }, align: index > 1 ? "center" : "left", }; }); }; export const genData = (values) => { const datas = []; values.forEach((feature) => { if (feature.Children) { feature.Children.forEach((child, index) => { const data = { id: feature.Feature + "-" + child.Feature, Feature: index > 0 ? "" : feature.Feature, Sub: child.Feature, rowSpan: () => (index > 0 ? 1 : feature.Children.length), isLast: index === feature.Children.length - 1, }; languages.forEach((language) => { if (language === "Feature") { data["Sub"] = child["Feature"]; } else { data[_key(language)] = child[_key(language)]; } }); datas.push(data); }); } else { const data = { id: feature.Feature, Feature: feature.Feature, Sub: "", rowSpan: () => 1, }; languages.forEach((language) => { data[_key(language)] = feature[_key(language)]; }); datas.push(data); } }); return datas; }; export const genCount = (values) => { let count = 1; values.forEach((feature) => { if (feature.Children) { count = count + feature.Children.length; } else { count = count + 1; } }); return count; }; export const getStyle = (name) => { if (name === "client") return { height: '45rem' }; if (name === "producer") return { height: '62rem' }; if (name === "consumer") return { height: '60rem' }; if (name === "reader") return { height: '25rem' }; if (name === "tableview") return { height: '14rem' }; return { height: '45rem' }; }; const columns = genColumns(); export const fixedColumns = columns.map((column, columnIndex) => { let frozen; if (columnIndex < 2) frozen = Column.FrozenDirection.LEFT; if (columnIndex === 0) { return { ...column, frozen, rowSpan: ({ rowData }) => rowData.rowSpan() }; } return { ...column, frozen }; }); export const rowRenderer = ({ rowData, rowIndex, cells, columns }) => { const rowSpan = columns[0].rowSpan({ rowData, rowIndex }); if (rowData.Sub.length > 0 && !rowData.isLast) { const cell = cells[0]; const style = { ...cell.props.style, height: rowSpan * 50, alignSelf: "flex-start", zIndex: 1, borderBottom: "0px", }; cells[0] = React.cloneElement(cell, { style }); } return cells; };