fix: manage a job's linked reward from the job sheet (#110) #140

Merged
nalum merged 2 commits from fix/reward-job-links into main 2026-08-18 16:42:55 +00:00
Owner

PR 2 of the #137 stack (stacked on #139). Closes #110.

Investigation first: the server's RewardService/Update and /Delete handle linked rewards correctly (verified against the live deploy, including on the exact reward from the issue), and the Rewards board's Everyone view has offered edit/delete in the reward sheet since 2026-08-06. What was actually missing is the affordance where the member is standing: the job sheet's Points row offered only Unlink — repricing or removing the reward attached to a job meant knowing to walk to the Rewards board and find the same reward there.

Two commits:

  1. fix(web) — the linked-reward row in the job sheet (and each step's) now carries the three verbs in place: Change (inline value editor), Unlink, and Delete with an in-place danger-styled confirm. One shared LinkedRewardRow component serves both sites. Deletion propagates to the board without a reload (a removed-uids set, the Rewards page's own pattern), on Jobs and Today alike. The new verbs gate on the precise matrix rows (RewardService/Update, RewardService/Delete), not the ItemService/Delete manager proxy — no new #135 debt.
  2. fix(android) — the same three verbs on the job sheet's Points row, using the existing RewardsRepository.updateReward/deleteReward seams; danger wears icon and word per the design rule. Catalogs regenerated.

Verified live: value-only Update preserves name/type/owner/link and moves only the value; delete removes the reward and the job survives. make check and the Android unit tests pass.

🤖 Generated with Claude Code

PR 2 of the #137 stack (stacked on #139). Closes #110. Investigation first: the server's `RewardService/Update` and `/Delete` handle linked rewards correctly (verified against the live deploy, including on the exact reward from the issue), and the Rewards board's Everyone view has offered edit/delete in the reward sheet since 2026-08-06. What was actually missing is the affordance **where the member is standing**: the job sheet's Points row offered only *Unlink* — repricing or removing the reward attached to a job meant knowing to walk to the Rewards board and find the same reward there. Two commits: 1. **fix(web)** — the linked-reward row in the job sheet (and each step's) now carries the three verbs in place: *Change* (inline value editor), *Unlink*, and *Delete* with an in-place danger-styled confirm. One shared `LinkedRewardRow` component serves both sites. Deletion propagates to the board without a reload (a removed-uids set, the Rewards page's own pattern), on Jobs and Today alike. The new verbs gate on the precise matrix rows (`RewardService/Update`, `RewardService/Delete`), not the `ItemService/Delete` manager proxy — no new #135 debt. 2. **fix(android)** — the same three verbs on the job sheet's Points row, using the existing `RewardsRepository.updateReward`/`deleteReward` seams; danger wears icon and word per the design rule. Catalogs regenerated. Verified live: value-only `Update` preserves name/type/owner/link and moves only the value; delete removes the reward and the job survives. `make check` and the Android unit tests pass. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
The job sheet's Points row offered only Unlink for a linked reward
(issue #110): changing what a job is worth or removing the reward
meant knowing to walk to the Rewards board, find the same reward in
the Everyone list and open its sheet — from the job, where the reward
lives in the member's head, edit and delete simply did not exist. The
row now carries the three verbs in place — change the value, unlink,
delete with an in-place confirm — through one shared row component
used by the job's own points and each step's, gated on the precise
matrix verbs (RewardService Update/Delete), not the manager proxy.
fix(android): edit and delete a job's linked reward from the job sheet
Some checks failed
check / commits (pull_request) Successful in 6s
check / web (pull_request) Successful in 1m33s
check / go (pull_request) Successful in 2m39s
check / report (pull_request) Successful in 4s
android / build (pull_request) Successful in 5m19s
android / report (pull_request) Successful in 4s
android / report (push) Has been cancelled
check / report (push) Has been cancelled
check / web (push) Has been cancelled
tag / tag (push) Has been cancelled
check / commits (push) Has been cancelled
android / build (push) Has been cancelled
check / go (push) Has been cancelled
bb6b20edc8
The Android half of issue #110, mirroring the web: the job sheet's
Points row offered only Unlink — repricing or removing the linked
reward meant walking to the Rewards board and finding it there. The
row now carries change-the-value and delete (with in-place confirm)
alongside Unlink, gated on the precise matrix verbs.

Test report

Suite Tests Result Skipped
Unit 1370 ✅ pass 1
Integration 85 ✅ pass —

Coverage: 28.2%

Updated by the check workflow · commit bb6b20edc8

<!-- ci-test-report --> ## Test report | Suite | Tests | Result | Skipped | | --- | --: | --- | --: | | Unit | 1370 | ✅ pass | 1 | | Integration | 85 | ✅ pass | — | **Coverage:** 28.2% <sub>Updated by the check workflow · commit bb6b20edc8cf88a884b4a232f30cdce1b4bcfe19</sub>

Android test report

Suite Tests Result Skipped
Unit (debug) 31 ✅ pass 0

Coverage: 2.4% of lines

Updated by the android workflow · commit bb6b20edc8

<!-- android-test-report --> ## Android test report | Suite | Tests | Result | Skipped | | --- | --: | --- | --: | | Unit (debug) | 31 | ✅ pass | 0 | **Coverage:** 2.4% of lines <sub>Updated by the android workflow · commit bb6b20edc8cf88a884b4a232f30cdce1b4bcfe19</sub>
nalum changed target branch from ci/recursive-image-sign to main 2026-08-18 16:42:48 +00:00
nalum merged commit bb6b20edc8 into main 2026-08-18 16:42:55 +00:00
nalum deleted branch fix/reward-job-links 2026-08-18 16:42:56 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
eagraiclainne/app!140
No description provided.