Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified docs/screenshots/03-hiring-home-overview.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
9 changes: 5 additions & 4 deletions docs/screenshots/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,10 @@ OS_PLATFORM_OWNER_EMAIL=admin@objectos.ai npx objectstack dev --fresh --database
The seed has since grown to 818 rows — #53 added one `accepted` `ats_offer` per hired application, nothing
else — so a boot today logs `{"inserted":818,…}`; no screen below reads `ats_offer`, and the stage counts the
shots show (88 / 46 / 28 / 14 / 9 marketplace-wide, 10 / 8 / 5 / 2 / 1 for Quillstone) did not move.
`03` is the one exception to the paragraph above: it was **re-taken on 2026-09-07 at 818 rows** (same CLI,
same driver, same 1440 × 900, `-p 4631`) because [#55](https://github.com/objectstack-ai/ats/issues/55)
added a fourth tile to its dashboard. The other six still date from the 809-row boot; re-shot against 818
`03` is the one exception to the paragraph above: it was **re-taken on 2026-09-08 at 818 rows** (same CLI,
same driver, same 1440 × 900, `-p 4661`) because [#78](https://github.com/objectstack-ai/ats/issues/78)
moved its four KPI tiles onto one row. That is this file's second re-take — the first was on 2026-09-07
(`-p 4631`) when [#55](https://github.com/objectstack-ai/ats/issues/55) added the fourth tile. The other six still date from the 809-row boot; re-shot against 818
they render the same screen, so they were left as they are.
The driver matters: on the default (sqlite) driver the four tenancy-scoped objects return no rows to the
platform personas ([#39](https://github.com/objectstack-ai/ats/issues/39)), so the Platform group's review
Expand All @@ -24,7 +25,7 @@ personas below are three of them.
|:--|:--|:--|
| `01-platform-home-overview.png` | `admin@platform.example` (Platform) | The Platform group's home: the **Platform Overview** dashboard — 9 verified employers · 22 open jobs · 30 applications this month · 70 active candidates · review queue 2 employers / 6 jobs · applications per ISO week. |
| `02-platform-hiring-funnel.png` | `admin@platform.example` (Platform) | The **Hiring Funnel** dashboard, marketplace-wide: applied → screening → interview → offer → hired, plus the two exits. The funnel's per-stage values are hover-only in the Console's funnel widget; measured through the dataset query they are **88 / 46 / 28 / 14 / 9**, with 15 rejected · 0 withdrawn · 185 in pipeline (see [`docs/evidence/issue-8`](../evidence/issue-8/README.md)). |
| `03-hiring-home-overview.png` | `admin@quillstone.example` (Hiring) | The Hiring group's home: the **Hiring Overview** dashboard, row-level scoped to Quillstone — 3 open jobs · 18 applications awaiting action · 6 interviews this week · **average days to offer 30.0**. That fourth tile ([#55](https://github.com/objectstack-ai/ats/issues/55)) opened a second tile row and pushed **Pipeline by Stage** past the 900 px fold, so the bars are cropped here exactly as `01`'s weekly chart is; measured through the dataset query they are 10 / 8 / 5 / 2 / 1 (+1 rejected). On the demo seed the 30.0 is the hired applications' *age*, not elapsed decision time — a seed cannot set `created_at` ([#65](https://github.com/objectstack-ai/ats/issues/65)); `src/dashboards/employer-hiring.dashboard.ts` says so at the tile. |
| `03-hiring-home-overview.png` | `admin@quillstone.example` (Hiring) | The Hiring group's home: the **Hiring Overview** dashboard, row-level scoped to Quillstone — 3 open jobs · 18 awaiting action · 5 interviews this week · **average days to offer 30.0** — and, under them, the whole of **Pipeline by Stage**: 10 / 8 / 5 / 2 / 1 (+1 rejected), every bar and both axes inside the 900 px fold. The four KPI tiles share row 0 at `w: 3` since [#78](https://github.com/objectstack-ai/ats/issues/78); the tile row `w: 4` forced ([#55](https://github.com/objectstack-ai/ats/issues/55)) is gone and nothing here is cropped. **The "5 interviews this week" is a Tuesday-boot number, not a fixed one**: the seed schedules Quillstone's ten rounds at boot + 1 … + 10 days while the tile counts a fixed Monday-to-Sunday week, so a Monday boot puts six of them inside the window (what the `#55` re-take photographed) and every later weekday one fewer. The other four numbers do not move with the boot day. On the demo seed the 30.0 is the hired applications' *age*, not elapsed decision time — a seed cannot set `created_at` ([#65](https://github.com/objectstack-ai/ats/issues/65)); `src/dashboards/employer-hiring.dashboard.ts` says so at the tile. |
| `04-hiring-pipeline-kanban.png` | `admin@quillstone.example` (Hiring) | The **Pipeline** kanban over `ats_application`, grouped by `stage`: Quillstone's 27 applications in their columns (Applied 10 · Screening 8 · Interview 5 · Offer 2 …). |
| `05-hiring-interview-calendar.png` | `admin@quillstone.example` (Hiring) | The **Interview Calendar** over `ats_interview.scheduled_at`: Quillstone's 10 rounds, all inside the next two weeks because the seed schedules them relative to boot time. |
| `06-seeker-home-find-jobs.png` | `candidate01@mail.example` (Job Seeker) | The Job Seeker group's home: **Find Jobs**, the `published` grid over `ats_job` — 22 published jobs across every industry in the seed. |
Expand Down
42 changes: 31 additions & 11 deletions src/dashboards/employer-hiring.dashboard.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,10 @@ import type { Dashboard } from '@objectstack/spec/ui';
* #46). Quillstone's administrator and Harborline's read different numbers
* from the same widgets, and platform staff read the whole marketplace.
*
* All four of the card's tiles are here. The fourth — "Average Days to
* Offer" — reads `avg(ats_application.days_to_offer)` over this employer's
* HIRED applications, and it took three things that did not exist when the
* All four of the card's tiles are here. The fourth — "Days to Offer",
* DESIGN.md §04's 平均到 Offer 天数 — reads
* `avg(ats_application.days_to_offer)` over this employer's HIRED
* applications, and it took three things that did not exist when the
* dashboard was first built:
* - a STORED column. `days_to_offer` is a duration between `applied_at` on
* the application and `created_at` on the offer; a dataset measure
Expand Down Expand Up @@ -43,7 +44,26 @@ import type { Dashboard } from '@objectstack/spec/ui';
*
* "This week" is Monday 00:00 (`{current_week_start}`) up to but excluding
* next Monday (`{next_week_start}`): `*_end` macros are calendar days, and
* `scheduled_at` is a timestamp.
* `scheduled_at` is a timestamp. On the demo seed that window is why the tile
* is boot-day dependent: the seed schedules each employer's rounds at
* boot + 1 … + n days, so a Monday boot leaves six of Quillstone's ten inside
* the week and every later weekday one fewer (#78 measured 5 on a Tuesday).
*
* LAYOUT — four `w: 3` KPI tiles on row 0, `x` 0/3/6/9, and the bar at
* `y: 2` (#78). The fourth tile arrived at `w: 4`, which fills 12 columns with
* three and opens row 2 for the fourth alone; that pushed the chart to `y: 4`
* and past the 900 px fold of the screenshot set's viewport. Two titles were
* shortened to fit the narrower tile, because the dashboard header already
* says "applications awaiting action" and "average days to offer":
* "Applications Awaiting Action" → "Awaiting Action", "Average Days to Offer"
* → "Days to Offer". Measured in the Console at 1440 × 900 (sidebar open) a
* `w: 3` tile gives the title a 222 px box; the four titles render at
* 77 / 118 / 162 / 101 px, one line box each. The retired long spelling
* measures 215.5 px — it would have survived on this font stack with 6.5 px to
* spare, which is not a margin to ship a home screen on. `src/translations`
* carries the same two strings in `en` (`check:i18n-source` compares them to
* these labels); the `zh-CN` titles are unchanged — they are 62–96 px wide in
* the same box and 平均到 Offer 天数 is DESIGN.md §04's own wording.
*/
export const EmployerHiringDashboard: Dashboard = {
name: 'ats_employer_hiring',
Expand All @@ -61,19 +81,19 @@ export const EmployerHiringDashboard: Dashboard = {
dataset: 'ats_job_metrics',
values: ['job_count'],
filter: { status: 'published' },
layout: { x: 0, y: 0, w: 4, h: 2 },
layout: { x: 0, y: 0, w: 3, h: 2 },
options: { icon: 'briefcase' },
},
{
id: 'awaiting_action',
type: 'kpi',
title: 'Applications Awaiting Action',
title: 'Awaiting Action',
description: 'In "applied" or "screening".',
dataset: 'ats_application_metrics',
values: ['application_count'],
filter: { stage: { $in: ['applied', 'screening'] } },
colorVariant: 'warning',
layout: { x: 4, y: 0, w: 4, h: 2 },
layout: { x: 3, y: 0, w: 3, h: 2 },
options: { icon: 'inbox' },
},
{
Expand All @@ -84,19 +104,19 @@ export const EmployerHiringDashboard: Dashboard = {
dataset: 'ats_interview_metrics',
values: ['interview_count'],
filter: { status: { $ne: 'cancelled' }, scheduled_at: { $gte: '{current_week_start}', $lt: '{next_week_start}' } },
layout: { x: 8, y: 0, w: 4, h: 2 },
layout: { x: 6, y: 0, w: 3, h: 2 },
options: { icon: 'calendar-clock' },
},
{
id: 'avg_days_to_offer',
type: 'kpi',
title: 'Average Days to Offer',
title: 'Days to Offer',
description: 'Applied to first offer, over your hired applications.',
dataset: 'ats_application_metrics',
values: ['avg_days_to_offer'],
filter: { stage: 'hired' },
colorVariant: 'success',
layout: { x: 0, y: 2, w: 4, h: 2 },
layout: { x: 9, y: 0, w: 3, h: 2 },
options: { icon: 'timer' },
},
{
Expand All @@ -114,7 +134,7 @@ export const EmployerHiringDashboard: Dashboard = {
series: [{ name: 'application_count', label: 'Applications' }],
showLegend: false,
},
layout: { x: 0, y: 4, w: 12, h: 5 },
layout: { x: 0, y: 2, w: 12, h: 5 },
},
],
};
4 changes: 2 additions & 2 deletions src/translations/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1124,15 +1124,15 @@ export const en: TranslationData = {
description: 'Published jobs.',
},
awaiting_action: {
title: 'Applications Awaiting Action',
title: 'Awaiting Action',
description: 'In "applied" or "screening".',
},
interviews_this_week: {
title: 'Interviews This Week',
description: 'Rounds scheduled Monday to Sunday, cancelled ones excluded.',
},
avg_days_to_offer: {
title: 'Average Days to Offer',
title: 'Days to Offer',
description: 'Applied to first offer, over your hired applications.',
},
pipeline_by_stage: {
Expand Down
Loading