From faa81cf28f2f5cf2d04e9cfa67c8eaa0da886751 Mon Sep 17 00:00:00 2001 From: Dennis Decoene Date: Sun, 12 Jul 2026 11:54:49 +0200 Subject: [PATCH 1/3] =?UTF-8?q?feat(#61):=20overtime=20demo=20=E2=80=94=20?= =?UTF-8?q?SCHEDULES=20lookup=20table,=20field-bound=20two-form=20Add=20Em?= =?UTF-8?q?ployee?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- demos/overtime.prg | 34 +++++++++++++++++++++++++--------- tests/DemoSchemas.test.ts | 1 + tests/overtime.spec.ts | 31 ++++++++++++++++++++++++++++++- 3 files changed, 56 insertions(+), 10 deletions(-) diff --git a/demos/overtime.prg b/demos/overtime.prg index 237146b..c0808db 100644 --- a/demos/overtime.prg +++ b/demos/overtime.prg @@ -31,6 +31,10 @@ SELECT SCH USE DATABASE OVERTIME USE SCHEDULEDAYS +SELECT SCD +USE DATABASE OVERTIME +USE SCHEDULES + SELECT TS USE DATABASE OVERTIME USE TIMESHEET @@ -52,8 +56,17 @@ USE LEAVETAKEN * wipe TIMESHEET and WEEKSUMMARY — on every run until someone used it. SELECT EMP IF RECCOUNT() == 0 + SELECT SCD + DROP TABLE SCHEDULES + CREATE TABLE SCHEDULES (SCHEDID CHAR(4), DESCR CHAR(30)) + APPEND RECORD + REPLACE SCHEDID WITH "S001", DESCR WITH "Standard 40h (08:00-16:30)" + APPEND RECORD + REPLACE SCHEDID WITH "S002", DESCR WITH "Short 31.25h (09:00-16:00)" + + SELECT EMP DROP TABLE EMPLOYEES - CREATE TABLE EMPLOYEES (EMPID CHAR(4), NAME CHAR(30), SCHEDID CHAR(4)) + CREATE TABLE EMPLOYEES (EMPID CHAR(4), NAME CHAR(30), SCHEDID CHAR(4) LOOKUP SCHEDULES.SCHEDID DISPLAY DESCR) INDEX ON EMPID TO BYEMP APPEND RECORD REPLACE EMPID WITH "E001", NAME WITH "Ada Lovelace", SCHEDID WITH "S001" @@ -139,21 +152,24 @@ DO WHILE running CASE UPPER(TRIM(choice)) == "1" CLEAR @ 2, 5 SAY "--- ADD EMPLOYEE ---" - STORE SPACE(4) TO m_emp - STORE SPACE(30) TO m_name - STORE SPACE(4) TO m_sch - @ 4, 5 SAY "Employee ID (4): " GET m_emp - @ 5, 5 SAY "Name (30): " GET m_name - @ 6, 5 SAY "Schedule ID (4): " GET m_sch - READ SELECT EMP SET INDEX TO BYEMP + STORE SPACE(4) TO m_emp + @ 4, 5 SAY "Employee ID (4): " GET m_emp + READ SEEK TRIM(m_emp) IF FOUND() @ 8, 5 SAY "Employee already exists: " + TRIM(m_emp) ELSE + * Create in natural order: writing the key under an active index + * would move the record out from under the form. + SET INDEX TO APPEND RECORD - REPLACE EMPID WITH TRIM(m_emp), NAME WITH TRIM(m_name), SCHEDID WITH TRIM(m_sch) + REPLACE EMPID WITH TRIM(m_emp) + @ 5, 5 SAY "Name (30): " GET NAME + @ 6, 5 SAY "Schedule : " GET SCHEDID + READ + SET INDEX TO BYEMP @ 8, 5 SAY "Employee added: " + TRIM(m_emp) ENDIF INPUT "Press Enter to continue" TO pause diff --git a/tests/DemoSchemas.test.ts b/tests/DemoSchemas.test.ts index 4621c40..79d2e2c 100644 --- a/tests/DemoSchemas.test.ts +++ b/tests/DemoSchemas.test.ts @@ -25,6 +25,7 @@ const DEMO_SCHEMAS: Record = { // overtime.prg (#46) EMPLOYEES: ['EMPID', 'NAME', 'SCHEDID'], + SCHEDULES: ['SCHEDID', 'DESCR'], SCHEDULEDAYS: ['SCHEDID', 'DOW', 'TIMEIN', 'BSTART', 'BEND', 'TIMEOUT'], TIMESHEET: ['EMPID', 'WEEKDATE', 'DOW', 'WORKDATE', 'TIMEIN', 'BSTART', 'BEND', 'TIMEOUT', 'WORKEDHOURS'], WEEKSUMMARY: ['EMPID', 'WEEKDATE', 'WEEKNO', 'WORKEDHOURS', 'STANDARDHOURS', 'OVERTIME'], diff --git a/tests/overtime.spec.ts b/tests/overtime.spec.ts index aeeafe5..4ceb176 100644 --- a/tests/overtime.spec.ts +++ b/tests/overtime.spec.ts @@ -79,7 +79,7 @@ test.describe('Overtime demo', () => { await seedProgram(page); // Clean slate: the OVERTIME database persists server-side across suites. await cmd(page, 'USE DATABASE OVERTIME'); - for (const t of ['EMPLOYEES', 'SCHEDULEDAYS', 'TIMESHEET', 'WEEKSUMMARY', 'LEAVETAKEN']) { + for (const t of ['EMPLOYEES', 'SCHEDULES', 'SCHEDULEDAYS', 'TIMESHEET', 'WEEKSUMMARY', 'LEAVETAKEN']) { await cmd(page, `DROP TABLE ${t}`, 150); } await cmd(page, `DO ${PRG_NAME}`, 2000); @@ -100,6 +100,35 @@ test.describe('Overtime demo', () => { await ack(page); }); + test('Add Employee: the schedule is picked from a lookup dropdown, not typed', async ({ page }) => { + await menuChoice(page, '1'); // Add Employee → form 1 (id) + await expect(page.locator('#form-view')).toContainText('ADD EMPLOYEE', { timeout: 6000 }); + const idInput = page.locator('#form-view input.f-get').last(); + await idInput.fill('E003'); + await idInput.press('Enter'); + + // Form 2: NAME is a text field, SCHEDID is a