Merge branch 'master' into feat/company-header-logo-branding
All checks were successful
PR checks / checks (pull_request) Successful in 32s
All checks were successful
PR checks / checks (pull_request) Successful in 32s
This commit is contained in:
commit
467f0ddea4
6 changed files with 68 additions and 5 deletions
|
|
@ -31,7 +31,13 @@ jobs:
|
|||
pnpm build # includes prisma generate
|
||||
pnpm db:migrate:deploy
|
||||
|
||||
pm2 restart ppms --update-env
|
||||
# NOT --update-env: this job runs inside the Forgejo Actions runner, whose
|
||||
# environment includes an ephemeral FORGEJO_TOKEN (the per-job token, revoked
|
||||
# when the job ends). --update-env would inject it into ppms, where it shadows
|
||||
# the real PAT from .env (Next.js does not override an already-set process.env
|
||||
# var) and breaks the Report Issue button once the job token expires. A plain
|
||||
# restart re-execs ppms from the pm2 daemon's clean env, so .env wins.
|
||||
pm2 restart ppms
|
||||
echo "=== Deployed $TAG ==="
|
||||
|
||||
- name: Verify portal responds
|
||||
|
|
|
|||
27
.forgejo/workflows/staging.yml
Normal file
27
.forgejo/workflows/staging.yml
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
name: Refresh staging
|
||||
|
||||
# Rebuilds the pms1 staging instance (pm2 `ppms-staging`, port 3200) to the latest
|
||||
# master on every merge to master, so staging always mirrors the trunk for
|
||||
# smoke-testing before a release tag. Also runnable on demand (workflow_dispatch).
|
||||
# See automation/README.md > "Staging".
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [master]
|
||||
workflow_dispatch: {}
|
||||
|
||||
# Only one staging refresh at a time; a newer master push cancels an in-flight build
|
||||
# (staging-up.sh always checks out the latest origin/master, so the newest wins).
|
||||
concurrency:
|
||||
group: refresh-staging
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
refresh:
|
||||
runs-on: host
|
||||
steps:
|
||||
- name: Rebuild staging on latest master
|
||||
run: |
|
||||
set -e
|
||||
export NVM_DIR="$HOME/.nvm"; . "$NVM_DIR/nvm.sh"
|
||||
"$HOME/issue-watcher/staging-up.sh"
|
||||
|
|
@ -20,8 +20,11 @@ const UOM_OPTIONS = [
|
|||
{ value: "mL", label: "mL — Millilitre" },
|
||||
{ value: "m", label: "m — Metre" },
|
||||
{ value: "m2", label: "m² — Sq. Metre" },
|
||||
{ value: "hr", label: "hr — Hour" },
|
||||
{ value: "day", label: "day — Day" },
|
||||
{ value: "hr", label: "hr — Hour" },
|
||||
{ value: "day", label: "day — Day" },
|
||||
{ value: "week", label: "week — Week" },
|
||||
{ value: "month", label: "month — Month" },
|
||||
{ value: "year", label: "year — Year" },
|
||||
{ value: "lump", label: "lump — Lump Sum" },
|
||||
{ value: "Ltr", label: "Ltr — Litre (alt)" },
|
||||
];
|
||||
|
|
|
|||
|
|
@ -93,6 +93,25 @@ describe("LineItemsEditor — edit mode", () => {
|
|||
const lastCall = onChange.mock.calls[onChange.mock.calls.length - 1][0] as LineItemInput[];
|
||||
expect(lastCall[0].gstRate).toBeCloseTo(0.05);
|
||||
});
|
||||
|
||||
it("offers month and year as unit-of-measure options", () => {
|
||||
render(<LineItemsEditor items={[DEFAULT_ITEM]} onChange={vi.fn()} />);
|
||||
const selects = screen.getAllByRole("combobox") as HTMLSelectElement[];
|
||||
const unitSelect = selects.find((s) => s.value === "pc")!;
|
||||
const values = Array.from(unitSelect.options).map((o) => o.value);
|
||||
expect(values).toContain("month");
|
||||
expect(values).toContain("year");
|
||||
});
|
||||
|
||||
it("calls onChange with the selected duration unit", async () => {
|
||||
const onChange = vi.fn();
|
||||
render(<LineItemsEditor items={[DEFAULT_ITEM]} onChange={onChange} />);
|
||||
const selects = screen.getAllByRole("combobox") as HTMLSelectElement[];
|
||||
const unitSelect = selects.find((s) => s.value === "pc")!;
|
||||
fireEvent.change(unitSelect, { target: { value: "year" } });
|
||||
const lastCall = onChange.mock.calls[onChange.mock.calls.length - 1][0] as LineItemInput[];
|
||||
expect(lastCall[0].unit).toBe("year");
|
||||
});
|
||||
});
|
||||
|
||||
// ── Totals calculation (edit mode) ────────────────────────────────────────────
|
||||
|
|
|
|||
|
|
@ -121,7 +121,11 @@ before a release tag deploys them to prod.
|
|||
- Checkout: `~/pelagia-staging` (separate from `~/pms` and `~/pelagia-autofix`)
|
||||
- Process: pm2 `ppms-staging` on **port 3200**, against the prod-mirror test DB
|
||||
(`pelagia_test`), safe dev mode (console email, local storage, SSO disabled).
|
||||
- Refresh to newer master + restart: re-run `~/issue-watcher/staging-up.sh`.
|
||||
- **Auto-refresh:** [`.forgejo/workflows/staging.yml`](../.forgejo/workflows/staging.yml)
|
||||
rebuilds staging on **every push to `master`** (i.e. every merged PR) on the host runner,
|
||||
so staging always tracks the trunk. It runs `~/issue-watcher/staging-up.sh`; concurrent
|
||||
runs are coalesced (newest master wins). Also triggerable on demand (`workflow_dispatch`).
|
||||
- Manual refresh / restart: re-run `~/issue-watcher/staging-up.sh`.
|
||||
- Stop: `pm2 delete ppms-staging`.
|
||||
- **Access is SSH-tunnel only** — the dev server binds to `127.0.0.1:3200`, so it is
|
||||
not reachable from the public internet. Open a tunnel and browse `http://localhost:3200`:
|
||||
|
|
|
|||
|
|
@ -67,8 +67,12 @@ echo "Generating Prisma client..."; pnpm db:generate
|
|||
# must be applied or the new code 500s on the missing columns.
|
||||
echo "Applying pending migrations to the test DB..."; pnpm db:migrate:deploy
|
||||
|
||||
# Drop any FORGEJO_* the caller may carry (e.g. when invoked from the Forgejo
|
||||
# Actions runner, whose ephemeral FORGEJO_TOKEN would otherwise be injected into
|
||||
# the staging process). NOT --update-env on restart, for the same reason.
|
||||
for v in $(env | grep -oE '^FORGEJO_[A-Z_]+' || true); do unset "$v"; done
|
||||
if pm2 describe "$NAME" >/dev/null 2>&1; then
|
||||
pm2 restart "$NAME" --update-env
|
||||
pm2 restart "$NAME"
|
||||
else
|
||||
pm2 start "$DIR/App/run-staging.sh" --name "$NAME" --interpreter bash
|
||||
fi
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue