# Features — unity-soft-ui

Evidence date: 2026-09-30. Source revision: `main` `afdeab6` (2022-01-24).

Status words used here:

- **Current** — reachable from the route table at this revision, or running at startup.
- **Completed** — present and doing the behaviour named. Not a claim that a product owner signed it off.
- **In development** — nothing in git after 2022-01-24, and no branch other than `main`. No feature is marked in development.
- **Planned** — named as future work. The only such list is the README TODO, which conflicts with the code.
- **Unrouted** — source exists and no route mounts it.
- **Removed** — a commit message says pages were removed (`d910f43`, "remove un-needed pages"). The deleted pages are not in this tree. Their names were not recovered from the commit body.

## Current and completed

### Application shell

| Feature | Status | Evidence |
|---|---|---|
| UnityLite document title | Current | `public/index.html` |
| Unity Soft wordmark and `logo.jpg` in the top bar | Current | `src/components/common/Navbar/TopNav.js` |
| Desktop nav and a mobile menu under the `lg` breakpoint | Current | `TopNav.js`, `DefaultNavbarMobile.js`, `assets/theme/base/breakpoints.js` |
| Footer with link column, shortFooter on `/`, contact block | Current | `src/components/common/Footer.js`, `MapAllowedRoutes.js` |
| Soft UI / MUI theme, `CssBaseline`, `StyledEngineProvider` | Current | `src/App.js`, `src/assets/theme/` |
| Popup modal context for error strings | Current | `src/contexts/popupModalContext.js`, used by Login, Register, Forgot Password |
| Not-found route | Current | `src/components/common/NotFound.js` |
| Service worker left unregistered | Current | `src/index.js` calls `serviceWorker.unregister()` |
| Web app manifest "Unity Soft" | Current file, install path not wired | `public/manifest.json` |

### Authentication

| Feature | Status | Evidence |
|---|---|---|
| Email/password sign-in via Cognito | Current | `src/components/Login.js` `Auth.signIn` |
| Unverified-email modal and hand-off to `/register?verify=` | Current | `Login.js` |
| Missing-user details modal and `POST /register` | Current | `Login.js` `handleDetailsProceed` |
| Store `roles`, `userDetails`, `IDNumbers` | Current | `Login.js` |
| Registration with email code confirmation | Current | `src/components/Register.js` |
| Resend sign-up email | Current | `Register.js` `Auth.resendSignUp` |
| Link or create the Unity user after confirmation (`/register`, `/updateregistration`) | Current | `Register.js` |
| Forgot password (request code, submit new password) | Current | `src/components/ForgotPassword.js` |
| Logout (`Auth.signOut`, clear roles and user details) | Current | `TopNav.js` |
| Guest vs signed-in route filter | Current | `src/utils/index.js` `getAllowedRoutes`, `src/config/Roles.js` |
| Prefilled login email and password | Current in source | `Login.js` initial `useState`. Values omitted. Treat as a defect until someone confirms it |

Role-based access is **completed as a filter** and **not completed as distinct powers**. SUPER_ADMIN, ADMIN, MANAGER, and CUSTOMER receive the same route list. `Roles.js` calls the names placeholders.

### Screens on the route table

| Path | Title | What it does at `afdeab6` | Evidence |
|---|---|---|---|
| `/` | Home | Static landing card | `src/components/LandingPage.js` |
| `/calendar` | Calendar | FullCalendar month/week/day; load, add, update, delete via `unity` API; weekend toggle; prompt and confirm dialogs | `src/components/Calendar.js` |
| `/tasklist` | Tasklist | Two hardcoded tasks and an add form that does not save | `src/components/Tasklist.js` |
| `/users` | Users | Table from `POST /unity/getusers/1`; EDIT points at `/app/user/:id`, which is not a route | `src/components/Users.js` |
| `/configer` | Config | "Developer Tools / Examples" jumbotron. It reads `children`, which the router does not pass | `src/components/Configer.js` |
| `/staff` | Staff | Title only | `src/components/Staff.js` |
| `/cronjobs` | Cron Jobs | Title only | `src/components/CronJobs.js` |
| `/dashboard` | Dashboard | Pie, stacked bar, radar, and counter charts from hardcoded vehicle/traffic sample data, plus onion and spaghetti counters | `src/components/Dashboard.js` |
| `/profile` | Profile (nav shows the person's name) | Edit form loaded from `POST /unity/getdetails`. Update does not submit. Hidden from `GUEST` | `src/components/Profile.js` |
| `/termsAndConditions` | Terms and Conditions | Title only. Footer link | `src/components/TermsAndConditions.js` |
| `/login` | Login | Guest only, in the nav | `Login.js` |
| `/forgot-password` | Forgot Password | Guest only, not in the nav | `ForgotPassword.js` |
| `/register` | Register | Guest only, not in the nav. Legal line names Paymyfines.com. Modals are placeholder sentences | `Register.js` |

### Shared UI that a screen uses

| Feature | Status | Evidence |
|---|---|---|
| Chart types: counter, line, bar, radial bar, stacked bar, pie, area, scatter, radar | Completed component. Dashboard uses pie, stack, radar, counter only | `src/components/common/Graphs.js` |
| Numeric coercion of chart series ("graph data sanitization") | Completed | `Graphs.js`, commit `5b33ed4` |
| Column header prettifier `getNiceName` (strips `dt` / `str` / `int` prefixes, splits camelCase and underscores) | Completed helper | `src/utils/index.js` |
| Field validators for RSA id, name, phone, email, text; foreign id and business registration return true | Completed helper | `validateFieldType` in `src/utils/index.js` |
| Loader button | Completed | `src/components/common/LoaderButton.js` |
| Jumbotron wrapper | Completed | `src/components/common/JumbotronWrapper.js` |

### Client integrations that are configured

| Feature | Status | Evidence |
|---|---|---|
| Amplify Auth against Cognito in `eu-west-1` | Current | `src/index.js`, `src/aws-config.js` |
| Amplify API name `unity` | Current | `src/index.js` |
| Amplify Storage aimed at bucket `unity-lite-files` | Configured. No upload/download call found | `src/index.js`, `src/aws-config.js` `MAX_ATTACHMENT_SIZE` 5000000 |

## Unrouted or unused at this revision

These are in the tree. They are not on `RoutingConfig` (or are imported and never referenced).

| Item | Evidence | Notes |
|---|---|---|
| `Quotes.js` | Same user-table pattern as `Users.js`, calls `/unity/getusers/1` | Exported from `src/components/index.js`. No route |
| `Timesheet.js` | Renders `<JumbotronWrapper title="Timesheet" />` | Not exported from `components/index.js`. No route |
| `Pivot.js` plus `PivotTable.jsx`, `PivotTableUI.jsx`, `Utilities.js`, `TableRenderers.jsx`, `PlotlyRenderers.jsx`, `makeData.js`, `tips.js` | A pivot-table implementation and sample helpers | `RoutingConfig.js` imports `PivotTable` and does not render it. `react-pivottable` and `plotly.js` are dependencies |
| `ExportableTable.js` | Search (including formatted columns, commit `06d76ef`), optional external filter override (commit `a1284f6`), summed columns, CSV export (commit `10112b3`) | A `renderComponent` demo with traffic rows sits in the same file and is not mounted. No screen imports the table |
| `WYSIWYG.js` | TinyMCE editor, plugins link, image, table, paste | Exported from `components/common/index.js`. No screen imports it |
| `react-trello` dependency | `package.json` | No import under `src/` was found |
| Leaflet 1.7.1 CSS | `public/index.html` | No map component under `src/` |
| Storybook | `package.json` scripts `storybook` and `build-storybook`; `JumbotronWrapper.stories.js` | No `.storybook` directory |
| `src/utils/history.js` | `createBrowserHistory` | Passed to `BrowserRouter`, which does not consume that prop in v5 |

## Planned (documented only)

`README.md` TODO:

- everything to do with Soft-ui
- styling
- documentation probably

Soft UI components and styling commits from October 2021 are already on `main`. This TODO is **not** a description of remaining work that matches the code. Documentation in-repo is still the short README. Provenance: **Documented**, and **in conflict** with **Implemented** theme files.

No other planned feature is written down.

## Recently changed (last commits on `main`)

| Date | Commit | Change |
|---|---|---|
| 2022-01-24 | `afdeab6` | More example data on the dashboard sample |
| 2022-01-18 | `923a2ec` | Dashboard code |
| 2022-01-13 | `10112b3` | Exportable table |
| 2022-01-13 | `5b33ed4` | Graph data sanitization |
| 2021-12-08 | `a1284f6` | Filter override prop rename |
| 2021-12-08 | `06d76ef` | Search includes formatted columns |
| 2021-12-06 | `3ff1bff`, `3fdaeb4` | Package update; footer styling |

Nothing has changed in git since 2022-01-24.

## Deprecated or removed

- Commit `d910f43` (2021-10-14) says it removed un-needed pages while adding routing features and Soft UI dependencies. The removed page names are not in the current tree. **Unknown** which screens those were.
- `serviceWorker.register` exists in `src/serviceWorker.js` and is not called. Offline caching is the unused CRA option, not a removed product feature.
- No feature flag or deprecation comment names a retired product area beyond that commit message.

## Not features of this repository

- A Lambda implementation. Named only in the README.
- Cron execution. The Cron Jobs page is a title.
- Staff administration. The Staff page is a title.
- Terms text. Both the terms route and the register modal are placeholders. The modal also names Paymyfines.com.
- Live traffic analytics. Dashboard numbers are literals in `Dashboard.js`.
