diff --git a/examples/data-literate/components/DataLiterate.js b/examples/data-literate/components/DataLiterate.js
index 474bfbb3..771a4da2 100644
--- a/examples/data-literate/components/DataLiterate.js
+++ b/examples/data-literate/components/DataLiterate.js
@@ -2,6 +2,7 @@ import Layout from '../components/Layout'
import Head from 'next/head'
import Excel from '../components/Excel'
import Table from '../components/Table'
+import TableGrid from '../components/TableGrid'
import LineChart from '../components/LineChart'
import { MDXProvider } from '@mdx-js/react'
import { Vega, VegaLite } from 'react-vega'
@@ -17,6 +18,7 @@ const components = {
VegaLite,
LineChart,
Head,
+ TableGrid
}
diff --git a/examples/data-literate/components/TableGrid.js b/examples/data-literate/components/TableGrid.js
new file mode 100644
index 00000000..be4eaa73
--- /dev/null
+++ b/examples/data-literate/components/TableGrid.js
@@ -0,0 +1,81 @@
+import axios from 'axios'
+import React, { useEffect } from 'react'
+import { Table } from 'portal'
+
+const papa = require("papaparse")
+
+/*
+ Portaljs Table Grid
+ usage:
+*/
+export default function TableGrid({ data = [], cols = [], csv = '', url = '' }) {
+
+ if (csv) {
+ const out = parseCsv(csv)
+ data = prepareRowsForPortalJsTable(out.rows)
+ cols = out.fields
+ }
+
+ if (cols) {
+ cols = prepareColsForPortalJsTable(cols)
+ }
+
+ const [ourdata, setData] = React.useState(data)
+ const [ourcols, setCols] = React.useState(cols)
+
+ useEffect(() => {
+ if (url) {
+ loadUrl(url)
+ }
+ }, [url])
+
+ function loadUrl(path) {
+ // HACK: duplicate of Excel code - maybe refactor
+ // if url is external may have CORS issue so we proxy it ...
+ if (url.startsWith('http')) {
+ const PROXY_URL = window.location.origin + '/api/proxy'
+ url = PROXY_URL + '?url=' + encodeURIComponent(url)
+ }
+ axios.get(url).then((res) => {
+ const { rows, fields } = parseCsv(res.data)
+ setData(rows)
+ setCols(prepareColsForPortalJsTable(fields))
+ })
+ }
+ return (
+
+ )
+}
+
+function prepareColsForPortalJsTable(cols) {
+ return cols.map((col) => {
+ return {
+ field: col.key,
+ headerName: col.name,
+ flex: true
+ }
+ })
+}
+
+function prepareRowsForPortalJsTable(rows) {
+ return rows.map((r) => {
+ return {
+ ...r,
+ id: r.id || r.key
+ }
+ })
+}
+
+function parseCsv(csv) {
+ csv = csv.trim()
+ const rawdata = papa.parse(csv, { header: true })
+ const cols = rawdata.meta.fields.map((r, i) => {
+ return { key: r, name: r }
+ })
+ return {
+ rows: rawdata.data,
+ fields: cols
+ }
+}