diff --git a/docs/screenshots/03-hiring-home-overview.png b/docs/screenshots/03-hiring-home-overview.png index 34f5f4a..13116cb 100644 Binary files a/docs/screenshots/03-hiring-home-overview.png and b/docs/screenshots/03-hiring-home-overview.png differ diff --git a/docs/screenshots/README.md b/docs/screenshots/README.md index bb85783..18c92c0 100644 --- a/docs/screenshots/README.md +++ b/docs/screenshots/README.md @@ -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 @@ -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. | diff --git a/src/dashboards/employer-hiring.dashboard.ts b/src/dashboards/employer-hiring.dashboard.ts index 92dbe87..c98aecb 100644 --- a/src/dashboards/employer-hiring.dashboard.ts +++ b/src/dashboards/employer-hiring.dashboard.ts @@ -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 @@ -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', @@ -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' }, }, { @@ -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' }, }, { @@ -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 }, }, ], }; diff --git a/src/translations/en.ts b/src/translations/en.ts index 05976c8..8bcd834 100644 --- a/src/translations/en.ts +++ b/src/translations/en.ts @@ -1124,7 +1124,7 @@ export const en: TranslationData = { description: 'Published jobs.', }, awaiting_action: { - title: 'Applications Awaiting Action', + title: 'Awaiting Action', description: 'In "applied" or "screening".', }, interviews_this_week: { @@ -1132,7 +1132,7 @@ export const en: TranslationData = { 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: {