- Used create-react-app boilerplate to setup the skeleton.
- Application will work on Google Chrome & Firefox as it uses ES6 without transpilation to ES5.
- Redux & Redux-Saga middleware have been setup from scratch, without using any boilerplate.
- Axios has been used for XHR calls.
- Roboto font has been used.
- Wherever possible, Block, Elements, Modifier(BEM) methodology has been used to name CSS classes.
- Clone the repository locally.
- Run npm install under root folder(where package.json is placed).
- Go to root folder and run yarn start or npm start. This will initiate webpack-dev-server.
- Browser will automatically open up with application rendered on localhost:3000/ally/home.
- There is just one application route called /ally/home.
- Any invalid route would render a no-match view.
Noticed a few key-result objects having corrputed parent_objective_id, example below:
"parent_objective_id": " stock photos and illustrations)\""
- Filter selection will render the list to show limited results.
- Multiple filters can be selected.
- Complete selection/unselection will render the entire data.
- Expand/Collapse would work on clicking on arrows only. This has been done to keep toggle and show-details behavior separate.
- Mobile friendly.
- Upto width of 768px, filters and OKRs will be rendered in a stacked fashion.
- Above 768px, filters and OKRs will be rendered adjacent.
- Category pills will only render above 1000px.
- Category Pills: Added a pill adjacent to Objective title to make it easy to validate filter behavior.
- API Delay: Added a deliberate delay of 2s in service in order to render loader for a moment.
- Expand/Collpase: Simple effect as been added.
- Added count of rendered records in the heading of OKRs section.
- Color of objective and key-results title is kept as a shade of blue. This would clearly indicate that they are clickable.
- Scroll to Top has been added for operational ease.
- If any objective doesn't have any key-result, we'll show "No key results to display" message.
- Avatar images are not there.
- Error Boundaries are not used. Instead have used a connected container component called GlobalErrorHandler.