[#814,tutorial,docs][xl]: add initial version of the second tutorial, rename basic-example to learn-example, clean up learn-example
This commit is contained in:
@@ -1,3 +0,0 @@
|
|||||||
{
|
|
||||||
"extends": "next/core-web-vitals"
|
|
||||||
}
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
|
|
||||||
|
|
||||||
## Getting Started
|
|
||||||
|
|
||||||
First, run the development server:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
npm run dev
|
|
||||||
# or
|
|
||||||
yarn dev
|
|
||||||
```
|
|
||||||
|
|
||||||
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
|
|
||||||
|
|
||||||
You can start editing the page by modifying `pages/index.tsx`. The page auto-updates as you edit the file.
|
|
||||||
|
|
||||||
[API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.ts`.
|
|
||||||
|
|
||||||
The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages.
|
|
||||||
|
|
||||||
## Learn More
|
|
||||||
|
|
||||||
To learn more about Next.js, take a look at the following resources:
|
|
||||||
|
|
||||||
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
|
|
||||||
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
|
|
||||||
|
|
||||||
You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!
|
|
||||||
|
|
||||||
## Deploy on Vercel
|
|
||||||
|
|
||||||
The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
|
|
||||||
|
|
||||||
Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
/** @type {import('next').NextConfig} */
|
|
||||||
const nextConfig = {
|
|
||||||
reactStrictMode: true,
|
|
||||||
swcMinify: true,
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = nextConfig
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
import { GetStaticProps } from 'next';
|
|
||||||
import { promises as fs } from 'fs';
|
|
||||||
import path from 'path';
|
|
||||||
import parse from '../lib/markdown';
|
|
||||||
import DRD from '../components/DRD';
|
|
||||||
|
|
||||||
export const getStaticProps = async (context) => {
|
|
||||||
const indexFile = path.join(process.cwd(), '/content/index.md');
|
|
||||||
const readme = await fs.readFile(indexFile, 'utf8');
|
|
||||||
let { mdxSource, frontMatter } = await parse(readme, '.mdx');
|
|
||||||
return {
|
|
||||||
props: {
|
|
||||||
mdxSource,
|
|
||||||
frontMatter,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
export default function DatasetPage({ mdxSource, frontMatter }) {
|
|
||||||
return (
|
|
||||||
<div className="prose mx-auto">
|
|
||||||
<header>
|
|
||||||
<div className="mb-6">
|
|
||||||
<>
|
|
||||||
<h1>{frontMatter.title}</h1>
|
|
||||||
{frontMatter.author && (
|
|
||||||
<div className="-mt-6">
|
|
||||||
<p className="opacity-60 pl-1">{frontMatter.author}</p>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
{frontMatter.description && (
|
|
||||||
<p className="description">{frontMatter.description}</p>
|
|
||||||
)}
|
|
||||||
</>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
<main>
|
|
||||||
<DRD source={mdxSource} />
|
|
||||||
</main>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
1
examples/learn-example/README.md
Normal file
1
examples/learn-example/README.md
Normal file
@@ -0,0 +1 @@
|
|||||||
|
PortalJS Learn Example - https://portaljs.org/docs
|
||||||
@@ -1,11 +1,15 @@
|
|||||||
import { GetStaticProps } from 'next';
|
|
||||||
import { promises as fs } from 'fs';
|
import { promises as fs } from 'fs';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
import parse from '../lib/markdown';
|
import parse from '../lib/markdown';
|
||||||
import DRD from '../components/DRD';
|
import DRD from '../components/DRD';
|
||||||
|
|
||||||
export const getServerSideProps = async (context) => {
|
export const getServerSideProps = async (context) => {
|
||||||
const indexFile = path.join(process.cwd(), '/content/' + context.params.path.join('/') + '/index.md');
|
let pathToFile = 'index.md';
|
||||||
|
if (context.params.path) {
|
||||||
|
pathToFile = context.params.path.join('/') + '/index.md';
|
||||||
|
}
|
||||||
|
|
||||||
|
const indexFile = path.join(process.cwd(), '/content/' + pathToFile);
|
||||||
const readme = await fs.readFile(indexFile, 'utf8');
|
const readme = await fs.readFile(indexFile, 'utf8');
|
||||||
let { mdxSource, frontMatter } = await parse(readme, '.mdx');
|
let { mdxSource, frontMatter } = await parse(readme, '.mdx');
|
||||||
return {
|
return {
|
||||||
|
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 37 KiB |
BIN
site/content/assets/docs/datasets-index-page.png
Normal file
BIN
site/content/assets/docs/datasets-index-page.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 17 KiB |
BIN
site/content/assets/docs/my-incredible-dataset.png
Normal file
BIN
site/content/assets/docs/my-incredible-dataset.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 30 KiB |
@@ -50,3 +50,69 @@ Let’s try editing the starter page.
|
|||||||
As soon as you save the file, the browser automatically updates the page with the new text:
|
As soon as you save the file, the browser automatically updates the page with the new text:
|
||||||
|
|
||||||
<img src="/assets/docs/editing-the-page-1.png" />
|
<img src="/assets/docs/editing-the-page-1.png" />
|
||||||
|
|
||||||
|
## Displaying data
|
||||||
|
|
||||||
|
So far, the PortalJS app we created only has a single page displaying a dataset. Data catalogs and data portals generally showcase many different datasets.
|
||||||
|
|
||||||
|
Let's explore how to add and display more datasets to our portal.
|
||||||
|
|
||||||
|
### Pages in PortalJS
|
||||||
|
|
||||||
|
As you have seen, in this example a dataset page is just a markdown file on disk plus a data file.
|
||||||
|
|
||||||
|
To create a new data showcase page we just create a new markdown file in the `content/` folder and a new data file in the `public/` folder.
|
||||||
|
|
||||||
|
Let's do that now. Create a `content/my-incredible-dataset` folder, and inside this new folder create a `index.md` file with the following content:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# My Incredible Dataset
|
||||||
|
|
||||||
|
This is my incredible dataset.
|
||||||
|
|
||||||
|
## Chart
|
||||||
|
|
||||||
|
<LineChart
|
||||||
|
title="US Population By Decade"
|
||||||
|
xAxis="Year"
|
||||||
|
yAxis="Population (mi)"
|
||||||
|
data="my-incredible-data.csv"
|
||||||
|
/>
|
||||||
|
```
|
||||||
|
|
||||||
|
Now, create a file in `public/` named `my-incredible-data.csv` and put the following content inside it:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
Year,Population (mi)
|
||||||
|
1980,227
|
||||||
|
1990,249
|
||||||
|
2000,281
|
||||||
|
2010,309
|
||||||
|
2020,331
|
||||||
|
```
|
||||||
|
|
||||||
|
Note that pages are associated with a route based on their pathname, so, to see the new data page, access http://localhost:3000/my-incredible-dataset from the browser. You should see the following:
|
||||||
|
|
||||||
|
<img src="/assets/docs/my-incredible-dataset.png" />
|
||||||
|
|
||||||
|
> [!tip]
|
||||||
|
> In this tutorial we opted for storing content as markdown files and data as CSV files in the app, but PortalJS can have metadata, data and content stored anywhere.
|
||||||
|
|
||||||
|
### Create an index page
|
||||||
|
|
||||||
|
Now, let's create an index page. First, create a new folder `content/my-awesome-dataset/` and move `content/index.md` to it. Then, create a new file `content/index.md` and put the following content inside it:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Welcome to my data portal!
|
||||||
|
|
||||||
|
List of available datasets:
|
||||||
|
|
||||||
|
- [My Awesome Dataset](/my-awesome-dataset)
|
||||||
|
- [My Incredible Dataset](/my-incredible-dataset)
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
From the browser, access http://localhost:3000. You should see the following:
|
||||||
|
|
||||||
|
<img src="/assets/docs/datasets-index-page.png" />
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user