From 298b59d291c64951cfef4c86442b3fca219ad276 Mon Sep 17 00:00:00 2001 From: deme Date: Thu, 27 Apr 2023 19:36:46 -0300 Subject: [PATCH] [#801,docs,tutorial][m]: move initial tutorial aside, rewrite the tutorial in a fashion more similar to the Next.js tutorial --- .../assets/docs/editing-the-page-1.png | Bin 0 -> 23099 bytes .../content/assets/examples/basic-example.png | Bin 0 -> 19886 bytes site/content/docs/index.md | 403 ++---------------- ...torial-create-data-portal-singe-dataset.md | 374 ++++++++++++++++ 4 files changed, 399 insertions(+), 378 deletions(-) create mode 100644 site/content/assets/docs/editing-the-page-1.png create mode 100644 site/content/assets/examples/basic-example.png create mode 100644 site/content/docs/tutorial-create-data-portal-singe-dataset.md diff --git a/site/content/assets/docs/editing-the-page-1.png b/site/content/assets/docs/editing-the-page-1.png new file mode 100644 index 0000000000000000000000000000000000000000..88e6d8cf141fde3683ee509751e961da8b561c23 GIT binary patch literal 23099 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%0AfGtYWHAaf7V| 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 to the name of your project): +To create a PortalJS app, open your terminal, cd into the directory you’d like to create the app in, and run the following command: ```bash -npx create-next-app --example https://github.com/datopian/portaljs/tree/main/examples/basic-example +npx create-next-app my-data-portal --example https://github.com/datopian/portaljs/tree/main/examples/basic-example ``` -Your new project is now created. Note that the dependencies are going to be installed already. To run it, get into the directory of the project and run: +> [!tip] +> You may have noticed we used the command create-next-app. That’s because PortalJS is built on the awesome NextJS react javascript framework. That’s mean you can do everything you do with NextJS with PortalJS. Check out their docs to learn more. -```bash= +### Run the development server + +You now have a new directory called `my-data-portal`. Let’s cd into it and then run the following command: + +```bash npm run dev ``` -The project is now going to be running on http://localhost:3000. +This starts the NextJS (and hence PortalJS) "development server" on port 3000. -At this point you can start editing the project as you want or start the Portal.JS tutorials series. +Let's check it's working and what we have! Open http://localhost:3000 from your browser. -# Tutorial +You should see a page like this when you access http://localhost:3000. This is the starter template page which shows the most simple data portal you could have: a simple README plus csv file. -## Create a data portal with a single dataset + -Welcome to the PortalJS tutorials series. In this first tutorial, we are going to take a look at a simple data portal example built with PortalJS, understand its structure and learn how we can customize it, specially with data components. +### Editing the Page -The resulting data portal is our _Hello World_ equivalent: a single dataset, and it looks like this: +Let’s try editing the starter page. - +- Make sure the development server is still running. +- Open content/index.md with your text editor. +- Find the text that says “My Dataset” and change it to “My Awesome Dataset”. +- Save the file. -This tutorials series is sequential, so the next tutorials starts from where this one left, don't forget to save your progress, and, finally, let's get started! +As soon as you save the file, the browser automatically updates the page with the new text: -### Create a new PortalJS project - -First step is to create a new PortalJS project. To do that, please follow the instructions on the [Getting Started](#getting-started) section of the docs. - -Now, make sure you have the project running on your local environment (`npm run dev`) and access http://localhost:3000 on your browser. As you can see, the new project is not empty, it already contains some content which we will use as a base in this tutorial. Here's what the page looks like: - - - - -### Basics - -As you can see, the page is very generic, and consists of a header, some text, a table and a line chart (built with Vega). Soon we are going to make it more interesting, but first, how did we end up with this? - -#### The content routing system - -Let's start by analyzing the main components of the folder strucutre of the project: - -```bash -content/ - my-dataset/ - README.md -public/ - data_1.csv - data_2.csv -``` - -You see that `README.md` file inside the content folder? That's exactly what's being rendered on your browser. PortalJS uses a filesystem approach to content routing, this means that the folder structure inside the content folder determines the routes used to access the pages in the application, a page being a `.md` (Markdown) file, analogously to a HTML document. When the file is named "README.md", it means that it's an index file. Take a look at the following example: - -```bash -content/ - README.md # => Page rendered at / - folder-1/ - README.md # => Page rendered at /folder-1 - folder-2/ - README.md # => Page rendered at /folder-2 - folder-2-1/ - README.md # => Page rendered at /folder-2/folder-2-1 -``` - -INTERNAL NOTE: let's change that to index.md instead of README.md. Add examples of non-index pages? The MDX pipeline should be handling other .md files but it's not doing that rn. Maybe remove next paragraph - -Note that it's also possible to create non-index pages, but this is not going to be demonstrated on this tutorial for the sake of simplicity. - -#### The pages - -_Cool, a Markdown file becomes a page, but what is a Markdown file :thinking_face:?_ - -Without getting into much detail, Markdown is a markup language which allows users to write structured and formatted text using a very simple syntax, with the beauty of not leaving the realm of plain text and keeping the document completely human-readable (opposite of, for instance, HTML, in which the document might get messy and very hard to read when it's not being rendered on a browser). - -It's not the intent of this tutorial to guide the user throught Markdown, but it's a requirement to understand it, so if you are not familiar with it we encourage you to take a look at [this guide](https://www.datopian.com/playbook/markdown) written by Datopian (Markdown is going to take over the world, seriously, you won't regret it!). - -Now that you are aware of Markdown documents and their application on PortalJS, let's hop to how this page you were seeing on your browser looks like behind the scenes. You probably noticed the cool chart and table on the page. Plain Markdown cannot do that, but the extended Markdown on PortalJS can. - -If you open `content/README.md` on your IDE or any text editor, you are going to come across the following content: - -```markdown -# Data - -This is the README.md this project. - -## Table - - - -## Vega Lite Line Chart from URL - - - -``` - -Note the `
` and the `` components, that's how data components are used on PortalJS, similar to tags on HTML documents. Each data component will have it's own set of attributes. These two are not the only data components that are supported, but it's interesting to note that data components can be used in a way as simple as the table pointing to a CSV file, or as flexible and complex as a chart built using a VegaLite spec. - -One other very interesting point to notice here is that both data components are getting its data from the data files inside the public folder. When a relative URL is provided as the data source for a data component, PortalJS will look for the given file in the public folder. - -We now have the basics, let's build something. - -### Making the dataset page more interesting - -It's time to start playing around with the project. Let's say we want to create a dataset page to present the data about the TV series Breaking Bad (or feel free choose a different theme and be creative!). Here are some sites with data that we can use: - -- [Openpsychometrics.com Test](https://openpsychometrics.org/tests/characters/stats/BB/) -- [Rotten Tomatoes Page](https://www.rottentomatoes.com/tv/breaking_bad) - -Open the `content/my-dataset/README.md` file and delete the content inside it. Now, let's start with a heading and description: - -```markdown -# Breaking Bad Statistics - -**Data source:** https://openpsychometrics.org/tests/characters/stats/BB/ - -Visualizations about the public perception of the Breaking Bad TV series and its characters. - -``` - -Cool, with that, our intention with this page is now clear. Time to add some visualizations. - -#### Tables - -Let's start with a table. There's an interesting table in the dataset about the notability of 10 of the characters on the [Openpsychometrics.com Test](https://openpsychometrics.org/tests/characters/stats/BB/), let's reproduce that in our page. Here's the data in CSV format: - -```bash -Notability,Name -91.3,Walter White -88.9,Jesse Pinkman -82.5,Mike Ehrmantraut -79.6,Gus Fring -74.8,Hank Schrader -73.8,Saul Goodman -61.3,Jane Margolis -55.4,Skyler White -46.8,Flynn White -27.9,Marie Schrader -``` - -Tables can be created from different data sources on PortalJs, these being: - -##### URL - -The URL can be either internal (relative) or external. To create a table from a URL, use the following syntax: - -```jsx -
// Internal, file at /public/data.csv - -// Or - -
-``` - -##### Inline CSV - -To create a table using inline CSV, use the following syntax: - -```jsx -
-``` - -##### Columns and rows - - -Finally, you can also provide the data in the form of columns and rows using the following syntax: - -```jsx -
-``` - -___ - -Now that you are more familiar with the table data component, let's go ahead and add the table to the page. Since there are only a few rows in the data, inline CSV might be a good option for this table, but feel free to create a CSV file or to convert the data to columns and rows if you want. Add that to the end of the file: - -```markdown -## Character Notability - -
- -_Isn't it interesting that Saul is so below in the ranking? There's even a spin-off about him._ - -``` - -Here's how it's going to look like on the page: - - - -#### Simple line charts - -Let's use the `` data component and the ratings on Rotten Tomatoes to create a rating by year line chart (note that each season was released in a diffent year). - -INTERNAL NOTE: LineChart is not working properly on the example, the width is not right. Can't we make numeric X work as well instead of having just years? We still have that bug in which the X is offsetted by -1. - -First, here's the data of the rating by season in CSV format: - -```bash -Year,Rating -2008,86 -2009,97 -2010,100 -2011,100 -2012,97 -``` - -The `` data component expects two attributes: `title` and `data`, so let's add the following to the end of the file: - -```markdown -## Rating x Season - - - -_Consistently well received by critics_ - -``` - -Here are the results: - - - -#### Complex charts - -Finally, PortalJS also supports the creation of visualizations with [Vega and VegaLite](https://vega.github.io/). This becomes specially interesting when it's desired to create more complex and custom visualizations. To demonstrate this, let's add a bar chart that compares Breaking Bad to Better Call Saul, a spin-off of the series, based on the data on Rotten Tomatoes. Here's the data in CSV format: - -```bash -TV Show,Average Tomatometer,Average Audience Score -Breaking Bad,0.96,0.97 -Better Call Saul,0.98,0.96 -``` - -Add that to the file: - -```jsx= -## Breaking Bad x Better Call Saul - - - -_The producers were able to successfully expand the success of the original series to the spin-off_ - -``` - -It's going to look like this when you navigate to the page again: - - - -### Final results - -Here's the whole source code of the dataset page we built: - -```markdown -# Breaking Bad Statistics - -**Data source:** https://openpsychometrics.org/tests/characters/stats/BB/ - -Visualizations about the public perception of the Breaking Bad TV series and its characters. - -## Character Notability - -
- -_Isn't it interesting that Saul is so below in the ranking? There's even a spin-off about him._ - -## Rating x Season - - - -_Consistently well received by critics_ - -## Breaking Bad x Better Call Saul - - - -_The producers were able to successfully expand the success of the original series to the spin-off_ -``` -And here's a screenshot of what it looks like: - - - -### Next steps - -Now that you already know how to create pages and render data components, we encourage you to play around with this project. You can try adding new visualizations, changing values, or creating a new page about something you find interesting. - -Finally, proceed to the next tutorial in the series. \ No newline at end of file + diff --git a/site/content/docs/tutorial-create-data-portal-singe-dataset.md b/site/content/docs/tutorial-create-data-portal-singe-dataset.md new file mode 100644 index 00000000..faca6e90 --- /dev/null +++ b/site/content/docs/tutorial-create-data-portal-singe-dataset.md @@ -0,0 +1,374 @@ +## Create a data portal with a single dataset + +Welcome to the PortalJS tutorials series. In this first tutorial, we are going to take a look at a simple data portal example built with PortalJS, understand its structure and learn how we can customize it, specially with data components. + +The resulting data portal is our _Hello World_ equivalent: a single dataset, and it looks like this: + + + +This tutorials series is sequential, so the next tutorials starts from where this one left, don't forget to save your progress, and, finally, let's get started! + +### Create a new PortalJS project + +First step is to create a new PortalJS project. To do that, please follow the instructions on the [Getting Started](#getting-started) section of the docs. + +Now, make sure you have the project running on your local environment (`npm run dev`) and access http://localhost:3000 on your browser. As you can see, the new project is not empty, it already contains some content which we will use as a base in this tutorial. Here's what the page looks like: + + + + +### Basics + +As you can see, the page is very generic, and consists of a header, some text, a table and a line chart (built with Vega). Soon we are going to make it more interesting, but first, how did we end up with this? + +#### The content routing system + +Let's start by analyzing the main components of the folder strucutre of the project: + +```bash +content/ + my-dataset/ + README.md +public/ + data_1.csv + data_2.csv +``` + +You see that `README.md` file inside the content folder? That's exactly what's being rendered on your browser. PortalJS uses a filesystem approach to content routing, this means that the folder structure inside the content folder determines the routes used to access the pages in the application, a page being a `.md` (Markdown) file, analogously to a HTML document. When the file is named "README.md", it means that it's an index file. Take a look at the following example: + +```bash +content/ + README.md # => Page rendered at / + folder-1/ + README.md # => Page rendered at /folder-1 + folder-2/ + README.md # => Page rendered at /folder-2 + folder-2-1/ + README.md # => Page rendered at /folder-2/folder-2-1 +``` + +INTERNAL NOTE: let's change that to index.md instead of README.md. Add examples of non-index pages? The MDX pipeline should be handling other .md files but it's not doing that rn. Maybe remove next paragraph + +Note that it's also possible to create non-index pages, but this is not going to be demonstrated on this tutorial for the sake of simplicity. + +#### The pages + +_Cool, a Markdown file becomes a page, but what is a Markdown file :thinking_face:?_ + +Without getting into much detail, Markdown is a markup language which allows users to write structured and formatted text using a very simple syntax, with the beauty of not leaving the realm of plain text and keeping the document completely human-readable (opposite of, for instance, HTML, in which the document might get messy and very hard to read when it's not being rendered on a browser). + +It's not the intent of this tutorial to guide the user throught Markdown, but it's a requirement to understand it, so if you are not familiar with it we encourage you to take a look at [this guide](https://www.datopian.com/playbook/markdown) written by Datopian (Markdown is going to take over the world, seriously, you won't regret it!). + +Now that you are aware of Markdown documents and their application on PortalJS, let's hop to how this page you were seeing on your browser looks like behind the scenes. You probably noticed the cool chart and table on the page. Plain Markdown cannot do that, but the extended Markdown on PortalJS can. + +If you open `content/README.md` on your IDE or any text editor, you are going to come across the following content: + +```markdown +# Data + +This is the README.md this project. + +## Table + +
+ +## Vega Lite Line Chart from URL + + + +``` + +Note the `
` and the `` components, that's how data components are used on PortalJS, similar to tags on HTML documents. Each data component will have it's own set of attributes. These two are not the only data components that are supported, but it's interesting to note that data components can be used in a way as simple as the table pointing to a CSV file, or as flexible and complex as a chart built using a VegaLite spec. + +One other very interesting point to notice here is that both data components are getting its data from the data files inside the public folder. When a relative URL is provided as the data source for a data component, PortalJS will look for the given file in the public folder. + +We now have the basics, let's build something. + +### Making the dataset page more interesting + +It's time to start playing around with the project. Let's say we want to create a dataset page to present the data about the TV series Breaking Bad (or feel free choose a different theme and be creative!). Here are some sites with data that we can use: + +- [Openpsychometrics.com Test](https://openpsychometrics.org/tests/characters/stats/BB/) +- [Rotten Tomatoes Page](https://www.rottentomatoes.com/tv/breaking_bad) + +Open the `content/my-dataset/README.md` file and delete the content inside it. Now, let's start with a heading and description: + +```markdown +# Breaking Bad Statistics + +**Data source:** https://openpsychometrics.org/tests/characters/stats/BB/ + +Visualizations about the public perception of the Breaking Bad TV series and its characters. + +``` + +Cool, with that, our intention with this page is now clear. Time to add some visualizations. + +#### Tables + +Let's start with a table. There's an interesting table in the dataset about the notability of 10 of the characters on the [Openpsychometrics.com Test](https://openpsychometrics.org/tests/characters/stats/BB/), let's reproduce that in our page. Here's the data in CSV format: + +```bash +Notability,Name +91.3,Walter White +88.9,Jesse Pinkman +82.5,Mike Ehrmantraut +79.6,Gus Fring +74.8,Hank Schrader +73.8,Saul Goodman +61.3,Jane Margolis +55.4,Skyler White +46.8,Flynn White +27.9,Marie Schrader +``` + +Tables can be created from different data sources on PortalJs, these being: + +##### URL + +The URL can be either internal (relative) or external. To create a table from a URL, use the following syntax: + +```jsx +
// Internal, file at /public/data.csv + +// Or + +
+``` + +##### Inline CSV + +To create a table using inline CSV, use the following syntax: + +```jsx +
+``` + +##### Columns and rows + + +Finally, you can also provide the data in the form of columns and rows using the following syntax: + +```jsx +
+``` + +___ + +Now that you are more familiar with the table data component, let's go ahead and add the table to the page. Since there are only a few rows in the data, inline CSV might be a good option for this table, but feel free to create a CSV file or to convert the data to columns and rows if you want. Add that to the end of the file: + +```markdown +## Character Notability + +
+ +_Isn't it interesting that Saul is so below in the ranking? There's even a spin-off about him._ + +``` + +Here's how it's going to look like on the page: + + + +#### Simple line charts + +Let's use the `` data component and the ratings on Rotten Tomatoes to create a rating by year line chart (note that each season was released in a diffent year). + +INTERNAL NOTE: LineChart is not working properly on the example, the width is not right. Can't we make numeric X work as well instead of having just years? We still have that bug in which the X is offsetted by -1. + +First, here's the data of the rating by season in CSV format: + +```bash +Year,Rating +2008,86 +2009,97 +2010,100 +2011,100 +2012,97 +``` + +The `` data component expects two attributes: `title` and `data`, so let's add the following to the end of the file: + +```markdown +## Rating x Season + + + +_Consistently well received by critics_ + +``` + +Here are the results: + + + +#### Complex charts + +Finally, PortalJS also supports the creation of visualizations with [Vega and VegaLite](https://vega.github.io/). This becomes specially interesting when it's desired to create more complex and custom visualizations. To demonstrate this, let's add a bar chart that compares Breaking Bad to Better Call Saul, a spin-off of the series, based on the data on Rotten Tomatoes. Here's the data in CSV format: + +```bash +TV Show,Average Tomatometer,Average Audience Score +Breaking Bad,0.96,0.97 +Better Call Saul,0.98,0.96 +``` + +Add that to the file: + +```jsx= +## Breaking Bad x Better Call Saul + + + +_The producers were able to successfully expand the success of the original series to the spin-off_ + +``` + +It's going to look like this when you navigate to the page again: + + + +### Final results + +Here's the whole source code of the dataset page we built: + +```markdown +# Breaking Bad Statistics + +**Data source:** https://openpsychometrics.org/tests/characters/stats/BB/ + +Visualizations about the public perception of the Breaking Bad TV series and its characters. + +## Character Notability + +
+ +_Isn't it interesting that Saul is so below in the ranking? There's even a spin-off about him._ + +## Rating x Season + + + +_Consistently well received by critics_ + +## Breaking Bad x Better Call Saul + + + +_The producers were able to successfully expand the success of the original series to the spin-off_ +``` +And here's a screenshot of what it looks like: + + + +### Next steps + +Now that you already know how to create pages and render data components, we encourage you to play around with this project. You can try adding new visualizations, changing values, or creating a new page about something you find interesting. + +Finally, proceed to the next tutorial in the series. \ No newline at end of file