# [WIP] Feast Web UI

This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
## Project structure
The Web UI is powered by a JSON registry dump from Feast (running `feast registry-dump`). Running `yarn start` launches a UI
powered by test data.
- `public/` contains assets as well as demo data loaded by the Web UI.
- There is a `projects-list.json` which represents all Feast projects the UI shows.
- There is also a `registry.json` which is the registry dump for the feature repo.
- `feature_repo/` contains a sample Feast repo which generates the `registry.json`
- `src/` contains the Web UI source code. This parses the registry json blob in `src/parsers` to make this data
available for the rest of the UI.
- `src/custom-tabs` includes sample custom tabs. This is a WIP plugin system where users can inject their own tabs and
data to the UI.
## Usage
There are two modes of usage: importing the UI as a module, or running the entire build as a React app.
### Importing the UI as a module
This is the recommended way to use Feast UI for teams maintaining their own internal UI for their deployment of Feast.
Start with bootstrapping a React app with `create-react-app`
```
npx create-react-app your-feast-ui
```
Then, in your app folder, install Feast UI and its peer dependencies. Assuming you use yarn
```
yarn add @feast-dev/feast-ui
yarn add @elastic/eui @elastic/datemath @emotion/react moment prop-types inter-ui react-query react-router-dom use-query-params zod typescript query-string d3 @types/d3
```
Edit `index.js` in the React app to use Feast UI.
```js
import React from "react";
import ReactDOM from "react-dom";
import "./index.css";
import FeastUI from "@feast-dev/feast-ui";
import "@feast-dev/feast-ui/dist/feast-ui.css";
ReactDOM.render(
,
document.getElementById("root")
);
```
When you start the React app, it will look for `project-list.json` to find a list of your projects. The JSON should looks something like this.
```json
{
"projects": [
{
"name": "Credit Score Project",
"description": "Project for credit scoring team and associated models.",
"id": "credit_score_project",
"registryPath": "/registry.json"
},
]
}
```
```
// Start the React App
yarn start
```
#### Customization
The advantage of importing Feast UI as a module is in the ease of customization. The `` component exposes a `feastUIConfigs` prop thorough which you can customize the UI. Currently it supports a few parameters.
##### Fetching the Project List
You can use `projectListPromise` to provide a promise that overrides where the Feast UI fetches the project list from.
```jsx
{
return res.json();
})
}}
/>
```
##### Custom Tabs
You can add custom tabs for any of the core Feast objects through the `tabsRegistry`.
```
const tabsRegistry = {
RegularFeatureViewCustomTabs: [
{
label: "Custom Tab Demo", // Navigation Label for the tab
path: "demo-tab", // Subpath for the tab
Component: RFVDemoCustomTab, // a React Component
},
]
}
```
Examples of custom tabs can be found in the `/custom-tabs` folder.
### Alternative: Run this Repo
If you would like to simply try things out and see how the UI works, you can simply run the code in this repo. First:
### `yarn install`
That will install the all the dependencies that the UI needs, as well as development dependencies. Then in the project directory, you can run:
### `yarn start`
Runs the app in the development mode.\
Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
The page will reload if you make edits.\
You will also see any lint errors in the console.
### `yarn test`
Launches the test runner in the interactive watch mode.\
See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
## On React and Create React App
This project was bootstrapped with Create React App, and uses its scripts to simplify UI development. You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
To learn React, check out the [React documentation](https://reactjs.org/).