keystone
Version:
Web Application Framework and Admin GUI / Content Management System built on Express.js and Mongoose
42 lines (29 loc) • 2.56 kB
Markdown
# Client
This is the client you see when you go to `/keystone`. It's a React.js app that uses Redux for state management.
## Overview
The client consists of two separate bundles: `Signin` and `App`.
`Signin` is, as the name suggests, the signin page. This is a separate bundle because we inject certain data into the `App` that a signed-out user should not be able to access.
`App` consists of three parts: The Homepage (Dashboard with lists), the List view and the single Item view.
Both of these have a separate EJS template that is rendered in the backend, [`admin/server/templates/signin.html`](../server/templates/signin.html) and [`admin/server/templates/index.html`](../server/templates/index.html). This where the data for the `App` bundle is injected too.
## Folder structure
We use a variant of the hirarchic folder structure detailled by @ryanflorence in [this gist](https://gist.github.com/ryanflorence/daafb1e3cb8ad740b346). Each part of our application can have a `components` folder with some reusable components that _only that part uses_ and a `shared` folder that _this part and some components further down the hirarchy use_.
```
client
├── App/
│ ├── components/ # Common, reusable components that only App uses
│ ├── screens/ # Client side routes
│ │ ├── Home
│ │ ├── Item
│ │ └── List
│ ├── shared/ # Common, reusable components that further down screens use too
│ └── store.js # The Redux store, also contains URL parameter logic for now
├── Signin
│ └── components/
├── utils/ # Some common utilities we use in both Signin and App
├── README.md
├── constants.js # A few shared constants
└── packages.js # A list of our vendor dependencies for browserify to bundle separately
```
This means an import like `import SomeSharedComponent from '../../../shared/SomeSharedComponent'` is perfectly fine, but if you find yourself import from a `component` folder like so `import SomeComponent from '../../../component/SomeComponent'` move that component to the `shared/` folder on the same level.
Every top-level part (e.g. `Home`) of our application can also be `connect`ed to the redux store and have associated `actions`, `constants` and `reducers`.
We co-locate test files in `test/` folders right next to the files we're testing.