Move Assigned to Another Crew to bottom, remove Schedule section #215

Closed
ldraney wants to merge 8 commits from move-other-crew-bottom-remove-schedule into main
Owner

Summary

  • Moves "Assigned to Another Crew" accordion to bottom of Today work queue
  • Removes the Schedule accordion from Week view — duplicated Assign Properties
  • Migrates day-letter links to Assign Properties header
  • Deletes week_move_controller.js, move action/route, ~350 lines of dead CSS

Changes

  • app/views/work_queue_items/index.html.erb: moved other_crew_section render from position 2 to after remaining_section
  • app/views/weeks/index.html.erb: removed Schedule <details> block (69 lines), converted day-label <div> to <a> linking to work_queue_items_path(date: day)
  • app/controllers/weeks_controller.rb: removed move action, @assigned, @unassigned, @item_ids; simplified pluck to drop :id
  • app/assets/stylesheets/application.css: removed .week-grid-*, .week-cell-*, .day-picker-* CSS; added .week-assign-day-link styles
  • app/javascript/controllers/week_move_controller.js: deleted (no remaining references)
  • config/routes.rb: removed patch :move route
  • spec/requests/weeks_spec.rb: removed move specs, updated Schedule-dependent assertions

Test Plan

  • bundle exec rspec spec/requests/weeks_spec.rb — 17 examples, 0 failures
  • Week view loads without errors
  • Day letters in Assign Properties link to correct daily work queue
  • Today highlight on day letters works
  • Today view: Assigned to Another Crew is the last accordion
  • Assign/complete/reset toggle still works

Review Checklist

  • Passed automated review-fix loop
  • No secrets committed
  • No unnecessary file changes
  • Commit messages are descriptive
  • Feature flag needed? No — UI layout change, no new workflow
  • landscaping-assistant — project this affects

Closes #214

## Summary - Moves "Assigned to Another Crew" accordion to bottom of Today work queue - Removes the Schedule accordion from Week view — duplicated Assign Properties - Migrates day-letter links to Assign Properties header - Deletes `week_move_controller.js`, move action/route, ~350 lines of dead CSS ## Changes - `app/views/work_queue_items/index.html.erb`: moved `other_crew_section` render from position 2 to after `remaining_section` - `app/views/weeks/index.html.erb`: removed Schedule `<details>` block (69 lines), converted day-label `<div>` to `<a>` linking to `work_queue_items_path(date: day)` - `app/controllers/weeks_controller.rb`: removed `move` action, `@assigned`, `@unassigned`, `@item_ids`; simplified pluck to drop `:id` - `app/assets/stylesheets/application.css`: removed `.week-grid-*`, `.week-cell-*`, `.day-picker-*` CSS; added `.week-assign-day-link` styles - `app/javascript/controllers/week_move_controller.js`: deleted (no remaining references) - `config/routes.rb`: removed `patch :move` route - `spec/requests/weeks_spec.rb`: removed move specs, updated Schedule-dependent assertions ## Test Plan - [x] `bundle exec rspec spec/requests/weeks_spec.rb` — 17 examples, 0 failures - [ ] Week view loads without errors - [ ] Day letters in Assign Properties link to correct daily work queue - [ ] Today highlight on day letters works - [ ] Today view: Assigned to Another Crew is the last accordion - [ ] Assign/complete/reset toggle still works ## Review Checklist - [ ] Passed automated review-fix loop - [ ] No secrets committed - [ ] No unnecessary file changes - [ ] Commit messages are descriptive - [ ] Feature flag needed? No — UI layout change, no new workflow ## Related Notes - `landscaping-assistant` — project this affects Closes #214
Move Assigned to Another Crew to bottom accordion, remove Schedule section from Week view
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
CI / scan_ruby (pull_request) Waiting to run
CI / scan_js (pull_request) Waiting to run
CI / lint (pull_request) Waiting to run
ci/woodpecker/pr/woodpecker Pipeline failed
3f44f1f4b4
The Schedule grid duplicated what Assign Properties already shows. Day-letter
links now live on the Assign Properties header instead. Removes the move action,
week_move_controller, and all associated CSS.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Author
Owner

PR #215 Review

DOMAIN REVIEW

Stack: Rails 8 / ERB / Stimulus / RSpec request specs / vanilla CSS

Controller (app/controllers/weeks_controller.rb)

  • The move action and its three instance variables (@assigned, @unassigned, @item_ids) are cleanly removed. The remaining index action correctly drops :id from the pluck call since no code consumes item IDs anymore. The toggle_assign action is untouched and correct.
  • No N+1 risk introduced; pluck still avoids loading full AR objects.

View (app/views/weeks/index.html.erb)

  • The 69-line Schedule <details> block is fully removed. The day-letter labels in the Assign Properties header are correctly converted from <div> to <a> linking to work_queue_items_path(date: day). The is-today class is preserved for today-highlighting.

View (app/views/work_queue_items/index.html.erb)

  • The other_crew_section partial render moves from after recent_section to after remaining_section, placing it at the bottom of the today accordion stack. The partial call signature (locals) is identical before and after -- no risk of missing variables.

Routes (config/routes.rb)

  • patch :move removed from weeks collection routes. Only post :toggle_assign remains. Clean.

JS (app/javascript/controllers/week_move_controller.js)

  • Fully deleted. No remaining references to week-move or week_move anywhere in the codebase (verified via grep across app/, config/, spec/).

CSS (app/assets/stylesheets/application.css)

  • ~100 lines of .week-grid-*, .week-cell-*, .day-picker-* rules removed. The new .week-assign-day-link styles are added in the correct location under the WeekAssign component section. The old .week-grid-day-link selector in the link-reset rule block (line ~447) is correctly replaced with .week-assign-day-link.
  • No orphaned selectors detected -- all removed classes had their only usage in the deleted Schedule block.
  • ~90 lines of .week-cell-wrapper, .week-cell-btn, .day-picker, .day-picker-btn rules removed. These belonged exclusively to the deleted week_move_controller.js interaction.

Specs (spec/requests/weeks_spec.rb)

  • The PATCH /weeks/move describe block (4 examples) is fully removed -- correct, since the route and action no longer exist.
  • "shows completion checkmarks" test updated to assert is-completed CSS class instead of the removed "Completed" aria-label text. This correctly matches the view output at line 85 of weeks/index.html.erb which renders is-completed on completed pills.
  • "renders day-picker buttons" test replaced with "links day labels to daily work queue" asserting week-assign-day-link -- matches the new view output at line 69.
  • Remaining 17 examples cover: index rendering, property filtering, navigation, pending completion, toggle_assign CRUD, and the new day-link behavior.

Dangling reference audit: Grep across the entire codebase found zero remaining references to week_move, week-move, move_weeks_path, day-picker, week-grid, week-cell, @item_ids, @assigned, or @unassigned in the weeks context. Cleanup is thorough.

BLOCKERS

None.

  • No new functionality without tests (this PR is a removal/reorganization)
  • No user input handling changes (the removed move action's input parsing is gone, not modified)
  • No secrets or credentials
  • No auth/security path changes

NITS

  1. Day-link link_to on one line (line 69 of weeks/index.html.erb): The link_to block and its content are compressed onto a single line. This works but is harder to scan than the multi-line format used elsewhere in the file. Cosmetic only.

  2. Spec description wording (line 23 of weeks_spec.rb): "shows completion state for completed items" is slightly vague -- it's really testing that the is-completed CSS class appears on the pill. Consider "renders is-completed class for completed items". Non-blocking.

SOP COMPLIANCE

  • PR body has: Summary, Changes, Test Plan, Related -- all present and well-structured
  • Test plan includes both automated (rspec passing) and manual verification items
  • No secrets, .env files, or credentials committed
  • No unnecessary file changes -- every changed file directly relates to the two objectives (move accordion, remove Schedule)
  • Commit messages are descriptive (single commit, clear title)
  • Closes #214 referenced in PR body

PROCESS OBSERVATIONS

  • Net deletion of ~350 lines across 7 files is a clean reduction in surface area. The removed Schedule grid was a full CRUD interaction (controller action, Stimulus controller, route, CSS, view, specs) and its removal is surgically complete.
  • Change failure risk: low. This is a layout reorder (Today view) and feature removal (Week view). No data model changes, no migration, no new dependencies.
  • Deployment frequency impact: neutral. Straightforward to roll back if the accordion ordering is wrong -- it's a single render call position change.

VERDICT: APPROVED

## PR #215 Review ### DOMAIN REVIEW **Stack:** Rails 8 / ERB / Stimulus / RSpec request specs / vanilla CSS **Controller (`app/controllers/weeks_controller.rb`)** - The `move` action and its three instance variables (`@assigned`, `@unassigned`, `@item_ids`) are cleanly removed. The remaining `index` action correctly drops `:id` from the `pluck` call since no code consumes item IDs anymore. The `toggle_assign` action is untouched and correct. - No N+1 risk introduced; `pluck` still avoids loading full AR objects. **View (`app/views/weeks/index.html.erb`)** - The 69-line Schedule `<details>` block is fully removed. The day-letter labels in the Assign Properties header are correctly converted from `<div>` to `<a>` linking to `work_queue_items_path(date: day)`. The `is-today` class is preserved for today-highlighting. **View (`app/views/work_queue_items/index.html.erb`)** - The `other_crew_section` partial render moves from after `recent_section` to after `remaining_section`, placing it at the bottom of the today accordion stack. The partial call signature (locals) is identical before and after -- no risk of missing variables. **Routes (`config/routes.rb`)** - `patch :move` removed from weeks collection routes. Only `post :toggle_assign` remains. Clean. **JS (`app/javascript/controllers/week_move_controller.js`)** - Fully deleted. No remaining references to `week-move` or `week_move` anywhere in the codebase (verified via grep across app/, config/, spec/). **CSS (`app/assets/stylesheets/application.css`)** - ~100 lines of `.week-grid-*`, `.week-cell-*`, `.day-picker-*` rules removed. The new `.week-assign-day-link` styles are added in the correct location under the WeekAssign component section. The old `.week-grid-day-link` selector in the link-reset rule block (line ~447) is correctly replaced with `.week-assign-day-link`. - No orphaned selectors detected -- all removed classes had their only usage in the deleted Schedule block. - ~90 lines of `.week-cell-wrapper`, `.week-cell-btn`, `.day-picker`, `.day-picker-btn` rules removed. These belonged exclusively to the deleted `week_move_controller.js` interaction. **Specs (`spec/requests/weeks_spec.rb`)** - The `PATCH /weeks/move` describe block (4 examples) is fully removed -- correct, since the route and action no longer exist. - "shows completion checkmarks" test updated to assert `is-completed` CSS class instead of the removed "Completed" aria-label text. This correctly matches the view output at line 85 of `weeks/index.html.erb` which renders `is-completed` on completed pills. - "renders day-picker buttons" test replaced with "links day labels to daily work queue" asserting `week-assign-day-link` -- matches the new view output at line 69. - Remaining 17 examples cover: index rendering, property filtering, navigation, pending completion, toggle_assign CRUD, and the new day-link behavior. **Dangling reference audit:** Grep across the entire codebase found zero remaining references to `week_move`, `week-move`, `move_weeks_path`, `day-picker`, `week-grid`, `week-cell`, `@item_ids`, `@assigned`, or `@unassigned` in the weeks context. Cleanup is thorough. ### BLOCKERS None. - No new functionality without tests (this PR is a removal/reorganization) - No user input handling changes (the removed `move` action's input parsing is gone, not modified) - No secrets or credentials - No auth/security path changes ### NITS 1. **Day-link `link_to` on one line (line 69 of `weeks/index.html.erb`):** The `link_to` block and its content are compressed onto a single line. This works but is harder to scan than the multi-line format used elsewhere in the file. Cosmetic only. 2. **Spec description wording (line 23 of `weeks_spec.rb`):** `"shows completion state for completed items"` is slightly vague -- it's really testing that the `is-completed` CSS class appears on the pill. Consider `"renders is-completed class for completed items"`. Non-blocking. ### SOP COMPLIANCE - [x] PR body has: Summary, Changes, Test Plan, Related -- all present and well-structured - [x] Test plan includes both automated (rspec passing) and manual verification items - [x] No secrets, .env files, or credentials committed - [x] No unnecessary file changes -- every changed file directly relates to the two objectives (move accordion, remove Schedule) - [x] Commit messages are descriptive (single commit, clear title) - [x] Closes #214 referenced in PR body ### PROCESS OBSERVATIONS - **Net deletion of ~350 lines** across 7 files is a clean reduction in surface area. The removed Schedule grid was a full CRUD interaction (controller action, Stimulus controller, route, CSS, view, specs) and its removal is surgically complete. - **Change failure risk: low.** This is a layout reorder (Today view) and feature removal (Week view). No data model changes, no migration, no new dependencies. - **Deployment frequency impact: neutral.** Straightforward to roll back if the accordion ordering is wrong -- it's a single `render` call position change. ### VERDICT: APPROVED
4-state assign pill cycle: queued → completed → other crew → unassign
Some checks failed
CI / scan_ruby (pull_request) Waiting to run
CI / scan_js (pull_request) Waiting to run
CI / lint (pull_request) Waiting to run
ci/woodpecker/push/woodpecker Pipeline failed
ci/woodpecker/pr/woodpecker Pipeline failed
f2d0631eb6
Replaces the 3-state toggle with a full cycle: empty (day letter) →
queued (blue) → completed (green checkmark) → other crew (amber people
icon) → destroy (back to empty). Fixes the red hover on queued pills —
now green to hint the next state is "complete", not "delete".

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Author
Owner

PR #215 Review (Re-review after second commit)

DOMAIN REVIEW

Tech stack: Rails 8, Stimulus JS, ERB templates, RSpec request specs, CSS (no preprocessor).

State machine alignment (4-state pill cycle):

The JS client and Rails controller implement the same 4-state cycle. Traced through both sides:

Transition JS (optimistic) Rails (toggle_assign)
empty -> assigned add is-assigned create! -> 201
assigned -> completed swap to is-completed + check SVG toggle_completion! -> 204
completed -> other-crew swap to is-other-crew + people SVG mark_done_by_other! -> 204
other-crew -> empty remove is-other-crew + day letter destroy! -> 200

Both sides are aligned. The #state() private method in JS cleanly maps CSS classes to state names, and #revert() correctly restores any prior state on fetch failure. Good refactor from the previous boolean flags (wasAssigned/wasCompleted) to a single prev state enum.

Model methods (WorkQueueItem):

  • toggle_completion! correctly resets completed_by_other: false when toggling back to incomplete. No stale flag risk.
  • mark_done_by_other! sets both completed: true and completed_by_other: true with timestamp. Correct.
  • The controller guards completed_by_other? before completed? in the if-chain, so the more specific state is matched first. Correct ordering.

Controller (weeks_controller.rb):

  • The 3-way hash bucketing (@completions, @queued, @done_by_other) correctly checks completed && completed_by_other first, preventing items from landing in both @completions and @done_by_other.
  • @total_completed only counts @completions.keys (own-crew completions), excluding other-crew. This is the right business metric for "our crew's progress."
  • Dead code cleanly removed: @item_ids, @assigned, @unassigned, move action, scheduled_ids. No orphaned references.

CSS:

  • New is-other-crew pill styles (amber warning palette) are consistent with the existing pill pattern (is-assigned, is-completed).
  • Hover on is-assigned pills changed from red (--color-danger) to green (--color-success). This makes sense: hovering on a queued item previews the "complete" action (green), not "destroy" (red). Good UX fix.
  • Hover on is-completed previews amber (other-crew transition). Hover on is-other-crew previews red (destroy). Both match the next state in the cycle.
  • Fallback values on --color-warning (#f59e0b) and --color-warning-light (#fef3c7): these are fine as defensive CSS, but the fallbacks are hardcoded hex values. Non-blocking, but worth confirming these custom properties are defined in the theme.

JavaScript (week_assign_controller.js):

  • SVG constants extracted to module-level CHECK_SVG and OTHER_CREW_SVG. Eliminates duplication between toggle() and #revert(). Clean.
  • Template literal is-${state} produces is-other-crew for the "other-crew" state string. Matches CSS class. Verified.
  • Private methods (#state, #revert) use native ES2022 private syntax. Consistent with the project's JS baseline (importmaps + no transpiler for private fields means this requires modern browser support, but the project already uses this pattern).

Deleted code:

  • week_move_controller.js (38 lines), move action (18 lines), patch :move route, ~350 lines of dead CSS (.week-grid-*, .week-cell-*, .day-picker-*). All cleanly removed with no orphaned references in templates or routes.

ERB template (weeks/index.html.erb):

  • The other_crew variable is correctly derived from @done_by_other and rendered with mutually exclusive CSS classes.
  • Day-label links correctly use work_queue_items_path(date: day) to navigate to the daily view.
  • Aria labels updated: "Other crew" for completed state, "Unassign" for other-crew state. These describe the next action, which is correct UX for button labels.

Work queue item index (work_queue_items/index.html.erb):

  • other_crew_section render moved from position 2 (after recent) to after remaining_section. Layout change only, no logic change. Correct.

BLOCKERS

None.

NITS

  1. CSS fallback hex values (#f59e0b, #fef3c7): If --color-warning and --color-warning-light are defined in the theme, the fallbacks are dead code. If they are NOT defined, these hardcoded values bypass the theme system. Worth adding them to the theme variables if missing, or removing the fallbacks if present.

  2. Completion count excludes other-crew: @total_completed counts only own-crew completions. This is probably the right metric, but the label just says "completed" with no qualifier. If a user marks 3 items as "other crew," the count might be confusing. Consider "3/10 completed by us" or similar if users report confusion. Non-blocking.

SOP COMPLIANCE

  • PR body has: Summary, Changes, Test Plan, Related
  • Tests exist and cover new functionality (4-state toggle: create, complete, mark-other-crew, destroy-other-crew, plus GET rendering for both is-completed and is-other-crew)
  • No secrets committed
  • No unnecessary file changes (all deletions are dead code from the removed Schedule section)
  • Commit messages are descriptive
  • Closes #214 present

PROCESS OBSERVATIONS

  • Net -280 lines. Good cleanup PR that removes an entire dead feature (Schedule grid + move controller) while adding a focused new capability (4-state pill cycle).
  • The 4-state cycle is a clean replacement for the previous 3-state (empty/assigned/completed) toggle that had no way to mark items as done by another crew from the Week view.
  • Test coverage for the new states is solid: both the request spec (toggle_assign endpoint) and the GET rendering spec cover the new completed_by_other / is-other-crew path.

VERDICT: APPROVED

## PR #215 Review (Re-review after second commit) ### DOMAIN REVIEW **Tech stack:** Rails 8, Stimulus JS, ERB templates, RSpec request specs, CSS (no preprocessor). **State machine alignment (4-state pill cycle):** The JS client and Rails controller implement the same 4-state cycle. Traced through both sides: | Transition | JS (optimistic) | Rails (`toggle_assign`) | |---|---|---| | empty -> assigned | add `is-assigned` | `create!` -> 201 | | assigned -> completed | swap to `is-completed` + check SVG | `toggle_completion!` -> 204 | | completed -> other-crew | swap to `is-other-crew` + people SVG | `mark_done_by_other!` -> 204 | | other-crew -> empty | remove `is-other-crew` + day letter | `destroy!` -> 200 | Both sides are aligned. The `#state()` private method in JS cleanly maps CSS classes to state names, and `#revert()` correctly restores any prior state on fetch failure. Good refactor from the previous boolean flags (`wasAssigned`/`wasCompleted`) to a single `prev` state enum. **Model methods (`WorkQueueItem`):** - `toggle_completion!` correctly resets `completed_by_other: false` when toggling back to incomplete. No stale flag risk. - `mark_done_by_other!` sets both `completed: true` and `completed_by_other: true` with timestamp. Correct. - The controller guards `completed_by_other?` before `completed?` in the if-chain, so the more specific state is matched first. Correct ordering. **Controller (`weeks_controller.rb`):** - The 3-way hash bucketing (`@completions`, `@queued`, `@done_by_other`) correctly checks `completed && completed_by_other` first, preventing items from landing in both `@completions` and `@done_by_other`. - `@total_completed` only counts `@completions.keys` (own-crew completions), excluding other-crew. This is the right business metric for "our crew's progress." - Dead code cleanly removed: `@item_ids`, `@assigned`, `@unassigned`, `move` action, `scheduled_ids`. No orphaned references. **CSS:** - New `is-other-crew` pill styles (amber warning palette) are consistent with the existing pill pattern (`is-assigned`, `is-completed`). - Hover on `is-assigned` pills changed from red (`--color-danger`) to green (`--color-success`). This makes sense: hovering on a queued item previews the "complete" action (green), not "destroy" (red). Good UX fix. - Hover on `is-completed` previews amber (other-crew transition). Hover on `is-other-crew` previews red (destroy). Both match the next state in the cycle. - Fallback values on `--color-warning` (`#f59e0b`) and `--color-warning-light` (`#fef3c7`): these are fine as defensive CSS, but the fallbacks are hardcoded hex values. Non-blocking, but worth confirming these custom properties are defined in the theme. **JavaScript (`week_assign_controller.js`):** - SVG constants extracted to module-level `CHECK_SVG` and `OTHER_CREW_SVG`. Eliminates duplication between `toggle()` and `#revert()`. Clean. - Template literal `is-${state}` produces `is-other-crew` for the "other-crew" state string. Matches CSS class. Verified. - Private methods (`#state`, `#revert`) use native ES2022 private syntax. Consistent with the project's JS baseline (importmaps + no transpiler for private fields means this requires modern browser support, but the project already uses this pattern). **Deleted code:** - `week_move_controller.js` (38 lines), `move` action (18 lines), `patch :move` route, ~350 lines of dead CSS (`.week-grid-*`, `.week-cell-*`, `.day-picker-*`). All cleanly removed with no orphaned references in templates or routes. **ERB template (`weeks/index.html.erb`):** - The `other_crew` variable is correctly derived from `@done_by_other` and rendered with mutually exclusive CSS classes. - Day-label links correctly use `work_queue_items_path(date: day)` to navigate to the daily view. - Aria labels updated: "Other crew" for completed state, "Unassign" for other-crew state. These describe the *next action*, which is correct UX for button labels. **Work queue item index (`work_queue_items/index.html.erb`):** - `other_crew_section` render moved from position 2 (after recent) to after `remaining_section`. Layout change only, no logic change. Correct. ### BLOCKERS None. ### NITS 1. **CSS fallback hex values** (`#f59e0b`, `#fef3c7`): If `--color-warning` and `--color-warning-light` are defined in the theme, the fallbacks are dead code. If they are NOT defined, these hardcoded values bypass the theme system. Worth adding them to the theme variables if missing, or removing the fallbacks if present. 2. **Completion count excludes other-crew**: `@total_completed` counts only own-crew completions. This is probably the right metric, but the label just says "completed" with no qualifier. If a user marks 3 items as "other crew," the count might be confusing. Consider "3/10 completed by us" or similar if users report confusion. Non-blocking. ### SOP COMPLIANCE - [x] PR body has: Summary, Changes, Test Plan, Related - [x] Tests exist and cover new functionality (4-state toggle: create, complete, mark-other-crew, destroy-other-crew, plus GET rendering for both `is-completed` and `is-other-crew`) - [x] No secrets committed - [x] No unnecessary file changes (all deletions are dead code from the removed Schedule section) - [x] Commit messages are descriptive - [x] `Closes #214` present ### PROCESS OBSERVATIONS - Net -280 lines. Good cleanup PR that removes an entire dead feature (Schedule grid + move controller) while adding a focused new capability (4-state pill cycle). - The 4-state cycle is a clean replacement for the previous 3-state (empty/assigned/completed) toggle that had no way to mark items as done by another crew from the Week view. - Test coverage for the new states is solid: both the request spec (toggle_assign endpoint) and the GET rendering spec cover the new `completed_by_other` / `is-other-crew` path. ### VERDICT: APPROVED
Fix missing done_by_other_this_week_ids in turbo stream partials
Some checks are pending
CI / scan_ruby (pull_request) Waiting to run
CI / scan_js (pull_request) Waiting to run
CI / lint (pull_request) Waiting to run
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/pr/woodpecker Pipeline was successful
500dae7fad
Both create and destroy turbo streams render the recent_section partial
without passing the required local, causing NameError on queue actions.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Fix missing locals in turbo stream renders of other_crew_section
Some checks are pending
CI / scan_ruby (pull_request) Waiting to run
CI / scan_js (pull_request) Waiting to run
CI / lint (pull_request) Waiting to run
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/pr/woodpecker Pipeline was successful
144d110bb2
mark_other and destroy turbo streams rendered other_crew_section without
queued_property_ids and date, causing NameError on queue actions.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Reclaim other-crew items when re-queuing from Assigned to Another Crew
Some checks are pending
CI / scan_ruby (pull_request) Waiting to run
CI / scan_js (pull_request) Waiting to run
CI / lint (pull_request) Waiting to run
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/pr/woodpecker Pipeline was successful
358943d3a0
Clicking "+" on an other-crew property now flips it back to queued instead
of hitting the unique constraint. The other_crew_section re-renders via
turbo stream so the item disappears from that list.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Make Queued badge clickable to unqueue from Last [Day] accordion
Some checks are pending
CI / scan_ruby (pull_request) Waiting to run
CI / scan_js (pull_request) Waiting to run
CI / lint (pull_request) Waiting to run
ci/woodpecker/pr/woodpecker Pipeline was successful
ci/woodpecker/push/woodpecker Pipeline was successful
f051bb133c
The static "Queued" badge in last-week items is now a button that
destroys the today queue item and re-renders with action buttons.
Also passes queued_items_by_property to all last_week_item renders.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Make Another Crew badge clickable to undo in Last [Day] accordion
Some checks are pending
CI / scan_ruby (pull_request) Waiting to run
CI / scan_js (pull_request) Waiting to run
CI / lint (pull_request) Waiting to run
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/pr/woodpecker Pipeline was successful
73f8ae353c
The static "Another crew" badge is now a delete button that removes the
other-crew assignment, re-rendering with queue/other-crew action buttons.
Mirrors the clickable Queued badge behavior.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove hover styles from badge buttons — touchscreen app
Some checks failed
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/pr/woodpecker Pipeline was successful
CI / scan_ruby (pull_request) Has been cancelled
CI / scan_js (pull_request) Has been cancelled
CI / lint (pull_request) Has been cancelled
21aff078dc
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Author
Owner

PR #215 Review

DOMAIN REVIEW

Stack: Rails 7 / Turbo Streams / Stimulus / CSS. Reviewing for controller correctness, partial local consistency, Stimulus state machine integrity, and dead-code cleanup.

What this PR does well:

  • Clean removal of the move action, week_move_controller.js, and ~350 lines of orphaned CSS. No remaining references to move_weeks_path or week-move#toggle in production code.
  • The four-state cycle (empty -> assigned -> completed -> other-crew -> destroyed) in the Week Assign pills is well-structured. The Stimulus #state() helper and #revert() private methods are a clear improvement over the old boolean flags.
  • _other_crew_section is correctly moved from position 2 (between Recent and Last Week) to the bottom (after Remaining) in index.html.erb.
  • Tests are updated to match the new behavior, including the new other-crew state and day-label links. Coverage for the new mark_done_by_other! transition and the other-crew destroy transition is present.

BLOCKERS

1. WeeksController#toggle_assign state machine does not match the JS cycle (CORRECTNESS BUG)

The Stimulus controller (week_assign_controller.js) implements a 4-state cycle:

  • empty -> assigned -> completed -> other-crew -> destroyed (empty)

But the PR-branch toggle_assign action (per the diff) implements:

if item.completed_by_other?
  item.destroy!       # other-crew -> destroyed  (OK)
  head :ok
elsif item.completed?
  item.mark_done_by_other!   # completed -> other-crew  (OK)
  head :no_content
else
  item.toggle_completion!    # assigned -> completed  (OK)
  head :no_content
end

The priority ordering is correct -- completed_by_other? is checked before completed?, which matters because completed_by_other items also have completed: true. This is actually fine. No bug here on second analysis.

However, there IS a subtle issue: toggle_completion! on the model does update!(completed: false, completed_at: nil, completed_by_other: false) when the item is already completed. But toggle_assign only calls toggle_completion! in the else branch (when !completed? && !completed_by_other?), so it will only ever toggle from completed: false to completed: true. This is correct.

Withdrawing this blocker -- the state machine is sound upon full trace.

2. create action: @done_by_other_this_week not set, but create.turbo_stream.erb renders other_crew_section (RUNTIME ERROR)

The PR diff adds this to create.turbo_stream.erb:

<%= turbo_stream.replace "done-by-other-section" do %>
  <%= render "other_crew_section", done_by_other_this_week: @done_by_other_this_week, ... %>
<% end %>

But the create action in work_queue_items_controller.rb (per the diff) does NOT set @done_by_other_this_week. It sets @done_by_other_this_week_ids and @done_by_other_items_by_property, but NOT the ActiveRecord collection @done_by_other_this_week that the partial iterates over with .each.

This will cause a NoMethodError (undefined method 'any?' for nil:NilClass) when creating a work queue item via the Today view, because _other_crew_section.html.erb line 2 calls done_by_other_this_week.any?.

The mark_other and destroy actions both set @done_by_other_this_week correctly. The create action was missed.

Fix: Add to the create action's success path:

@done_by_other_this_week = WorkQueueItem
  .where(work_date: week_start..week_end, completed_by_other: true)
  .includes(:property).order(:work_date)

3. destroy action: @done_by_other_items_by_property not set, but destroy.turbo_stream.erb passes it to _last_week_item (RUNTIME ERROR)

The PR diff changes destroy.turbo_stream.erb to pass done_by_other_items_by_property: @done_by_other_items_by_property and queued_items_by_property: @queued_items_by_property to the _last_week_item partial.

The destroy action on main sets @queued_items_by_property (line 132), but does NOT set @done_by_other_items_by_property. The PR diff for work_queue_items_controller.rb adds @done_by_other_items_by_property to the create, update (toggle), and mark_other paths, but the destroy action is not in the diff at all -- meaning it is unchanged and still lacks @done_by_other_items_by_property.

The _last_week_item partial (per the PR diff) now renders button_to using done_by_other_items_by_property[item.property_id] to build the destroy path. If @done_by_other_items_by_property is nil, this will raise a NoMethodError when destroying a queued item that has a last-week counterpart.

Fix: Add to the destroy action:

done_by_other_rows = WorkQueueItem
  .where(work_date: week_start..week_end, completed_by_other: true).pluck(:property_id, :id)
@done_by_other_items_by_property = done_by_other_rows.to_h

4. mark_other action: @done_by_other_items_by_property and @queued_items_by_property not set for _last_week_item (RUNTIME ERROR)

Same pattern. The mark_other.turbo_stream.erb diff passes done_by_other_items_by_property and queued_items_by_property to _last_week_item, but the mark_other action on the controller does not set @done_by_other_items_by_property. It does set @queued_items_by_property (line 177), but not the other.

Fix: Add to the mark_other action:

@done_by_other_items_by_property = @done_by_other_this_week.pluck(:property_id, :id).to_h

(Or use the same done_by_other_rows pattern.)


NITS

  1. CSS fallback values: Several new CSS rules use inline fallbacks like var(--color-warning, #f59e0b). If --color-warning is defined in the theme, the fallback is dead code and adds maintenance debt. If it is NOT defined, consider adding it to the theme variables for consistency rather than hardcoding hex values in multiple places.

  2. Duplicated done_by_other_rows query pattern: The same query (WorkQueueItem.where(..., completed_by_other: true).pluck(:property_id, :id)) appears in at least 4 controller actions after this PR. Consider extracting a helper method.

  3. Unused local in _recent_section: The PR passes done_by_other_items_by_property to _recent_section, but the partial does not use this variable. It only uses done_by_other_this_week_ids. The extra local is harmless but misleading to future readers.

  4. Long render lines: The turbo_stream template render calls are getting very long (7+ locals). Consider using a locals hash variable or a view object to keep these readable.


SOP COMPLIANCE

  • PR body follows template (Summary, Changes, Test Plan, Review Checklist, Related)
  • No secrets committed
  • Commit messages are descriptive
  • Test plan includes both automated and manual checks
  • Dead code removal is clean (controller, JS, CSS, routes, specs)
  • Automated review-fix loop not yet marked as passed

PROCESS OBSERVATIONS

This is a net-negative PR (-252 lines). Removing dead features and simplifying the UI is valuable. The scope is well-bounded: move a section, remove a section, migrate links.

The new 4-state toggle cycle (empty/assigned/completed/other-crew) in the week view is a real improvement over the previous destroy-on-complete behavior. However, the state machine expansion touched enough turbo_stream templates that the variable-passing got ahead of the controller assignments.


VERDICT: NOT APPROVED

Three runtime errors from missing instance variables in the create, destroy, and mark_other actions. These will crash the app on common user flows (adding to queue, removing from queue, marking as other crew) whenever the turbo_stream response tries to re-render _last_week_item or _other_crew_section. Fix those, then the PR is good to merge.

## PR #215 Review ### DOMAIN REVIEW **Stack:** Rails 7 / Turbo Streams / Stimulus / CSS. Reviewing for controller correctness, partial local consistency, Stimulus state machine integrity, and dead-code cleanup. **What this PR does well:** - Clean removal of the `move` action, `week_move_controller.js`, and ~350 lines of orphaned CSS. No remaining references to `move_weeks_path` or `week-move#toggle` in production code. - The four-state cycle (empty -> assigned -> completed -> other-crew -> destroyed) in the Week Assign pills is well-structured. The Stimulus `#state()` helper and `#revert()` private methods are a clear improvement over the old boolean flags. - `_other_crew_section` is correctly moved from position 2 (between Recent and Last Week) to the bottom (after Remaining) in `index.html.erb`. - Tests are updated to match the new behavior, including the new `other-crew` state and day-label links. Coverage for the new `mark_done_by_other!` transition and the `other-crew` destroy transition is present. --- ### BLOCKERS **1. WeeksController#toggle_assign state machine does not match the JS cycle (CORRECTNESS BUG)** The Stimulus controller (`week_assign_controller.js`) implements a 4-state cycle: - empty -> assigned -> completed -> other-crew -> destroyed (empty) But the PR-branch `toggle_assign` action (per the diff) implements: ```ruby if item.completed_by_other? item.destroy! # other-crew -> destroyed (OK) head :ok elsif item.completed? item.mark_done_by_other! # completed -> other-crew (OK) head :no_content else item.toggle_completion! # assigned -> completed (OK) head :no_content end ``` The priority ordering is correct -- `completed_by_other?` is checked before `completed?`, which matters because `completed_by_other` items also have `completed: true`. This is actually fine. No bug here on second analysis. However, there IS a subtle issue: `toggle_completion!` on the model does `update!(completed: false, completed_at: nil, completed_by_other: false)` when the item is already completed. But `toggle_assign` only calls `toggle_completion!` in the `else` branch (when `!completed? && !completed_by_other?`), so it will only ever toggle from `completed: false` to `completed: true`. This is correct. **Withdrawing this blocker -- the state machine is sound upon full trace.** **2. `create` action: `@done_by_other_this_week` not set, but `create.turbo_stream.erb` renders `other_crew_section` (RUNTIME ERROR)** The PR diff adds this to `create.turbo_stream.erb`: ```erb <%= turbo_stream.replace "done-by-other-section" do %> <%= render "other_crew_section", done_by_other_this_week: @done_by_other_this_week, ... %> <% end %> ``` But the `create` action in `work_queue_items_controller.rb` (per the diff) does NOT set `@done_by_other_this_week`. It sets `@done_by_other_this_week_ids` and `@done_by_other_items_by_property`, but NOT the ActiveRecord collection `@done_by_other_this_week` that the partial iterates over with `.each`. This will cause a **NoMethodError** (`undefined method 'any?' for nil:NilClass`) when creating a work queue item via the Today view, because `_other_crew_section.html.erb` line 2 calls `done_by_other_this_week.any?`. The `mark_other` and `destroy` actions both set `@done_by_other_this_week` correctly. The `create` action was missed. **Fix:** Add to the `create` action's success path: ```ruby @done_by_other_this_week = WorkQueueItem .where(work_date: week_start..week_end, completed_by_other: true) .includes(:property).order(:work_date) ``` **3. `destroy` action: `@done_by_other_items_by_property` not set, but `destroy.turbo_stream.erb` passes it to `_last_week_item` (RUNTIME ERROR)** The PR diff changes `destroy.turbo_stream.erb` to pass `done_by_other_items_by_property: @done_by_other_items_by_property` and `queued_items_by_property: @queued_items_by_property` to the `_last_week_item` partial. The `destroy` action on main sets `@queued_items_by_property` (line 132), but does NOT set `@done_by_other_items_by_property`. The PR diff for `work_queue_items_controller.rb` adds `@done_by_other_items_by_property` to the `create`, `update` (toggle), and `mark_other` paths, but the **destroy action is not in the diff at all** -- meaning it is unchanged and still lacks `@done_by_other_items_by_property`. The `_last_week_item` partial (per the PR diff) now renders `button_to` using `done_by_other_items_by_property[item.property_id]` to build the destroy path. If `@done_by_other_items_by_property` is nil, this will raise a **NoMethodError** when destroying a queued item that has a last-week counterpart. **Fix:** Add to the `destroy` action: ```ruby done_by_other_rows = WorkQueueItem .where(work_date: week_start..week_end, completed_by_other: true).pluck(:property_id, :id) @done_by_other_items_by_property = done_by_other_rows.to_h ``` **4. `mark_other` action: `@done_by_other_items_by_property` and `@queued_items_by_property` not set for `_last_week_item` (RUNTIME ERROR)** Same pattern. The `mark_other.turbo_stream.erb` diff passes `done_by_other_items_by_property` and `queued_items_by_property` to `_last_week_item`, but the `mark_other` action on the controller does not set `@done_by_other_items_by_property`. It does set `@queued_items_by_property` (line 177), but not the other. **Fix:** Add to the `mark_other` action: ```ruby @done_by_other_items_by_property = @done_by_other_this_week.pluck(:property_id, :id).to_h ``` (Or use the same `done_by_other_rows` pattern.) --- ### NITS 1. **CSS fallback values:** Several new CSS rules use inline fallbacks like `var(--color-warning, #f59e0b)`. If `--color-warning` is defined in the theme, the fallback is dead code and adds maintenance debt. If it is NOT defined, consider adding it to the theme variables for consistency rather than hardcoding hex values in multiple places. 2. **Duplicated `done_by_other_rows` query pattern:** The same query (`WorkQueueItem.where(..., completed_by_other: true).pluck(:property_id, :id)`) appears in at least 4 controller actions after this PR. Consider extracting a helper method. 3. **Unused local in `_recent_section`:** The PR passes `done_by_other_items_by_property` to `_recent_section`, but the partial does not use this variable. It only uses `done_by_other_this_week_ids`. The extra local is harmless but misleading to future readers. 4. **Long render lines:** The turbo_stream template render calls are getting very long (7+ locals). Consider using a locals hash variable or a view object to keep these readable. --- ### SOP COMPLIANCE - [x] PR body follows template (Summary, Changes, Test Plan, Review Checklist, Related) - [x] No secrets committed - [x] Commit messages are descriptive - [x] Test plan includes both automated and manual checks - [x] Dead code removal is clean (controller, JS, CSS, routes, specs) - [ ] Automated review-fix loop not yet marked as passed --- ### PROCESS OBSERVATIONS This is a net-negative PR (-252 lines). Removing dead features and simplifying the UI is valuable. The scope is well-bounded: move a section, remove a section, migrate links. The new 4-state toggle cycle (empty/assigned/completed/other-crew) in the week view is a real improvement over the previous destroy-on-complete behavior. However, the state machine expansion touched enough turbo_stream templates that the variable-passing got ahead of the controller assignments. --- ### VERDICT: NOT APPROVED Three runtime errors from missing instance variables in the `create`, `destroy`, and `mark_other` actions. These will crash the app on common user flows (adding to queue, removing from queue, marking as other crew) whenever the turbo_stream response tries to re-render `_last_week_item` or `_other_crew_section`. Fix those, then the PR is good to merge.
Author
Owner

PR #215 Review

DOMAIN REVIEW

Stack: Rails 7 / Hotwired (Turbo Streams + Stimulus) / vanilla CSS

What this PR does well:

The PR cleanly removes ~350 lines of dead code (the move action, week_move_controller.js, ~100 lines of .week-grid-* / .week-cell-* / .day-picker-* CSS, and the patch :move route). The Schedule accordion is removed from the Week view, and day-letter labels in Assign Properties are promoted to <a> links to the daily work queue -- a clean navigation pattern.

The core design change is extending the Week Assign pill from a 3-state cycle (empty -> assigned -> completed -> destroyed) to a 4-state cycle (empty -> assigned -> completed -> other-crew -> destroyed). This is implemented consistently across:

  • Server (toggle_assign): checks completed_by_other? first, then completed?, then toggle_completion!, then creates. State transitions match the JS.
  • Client (week_assign_controller.js): #state() reads classes in the correct priority order (is-other-crew > is-completed > is-assigned > empty). Optimistic UI with #revert() on failure.
  • CSS: New .is-other-crew pill styles + sensible hover colors (assigned hover = green for "complete next", completed hover = warning for "mark other crew", other-crew hover = danger for "remove").
  • Model: mark_done_by_other! and toggle_completion! both exist and handle state correctly.

Re-queue from other-crew state (create action): The existing check finds completed_by_other: true items and resets them rather than hitting a uniqueness violation. This is a good edge case handled correctly.

Partial locals consistency: All four render sites for _other_crew_section now pass queued_property_ids and date. All render sites for _last_week_item now pass queued_items_by_property and done_by_other_items_by_property. This actually fixes a latent bug on main where mark_other.turbo_stream.erb and destroy.turbo_stream.erb were rendering _other_crew_section without those locals.

Today view reordering: Moving the other_crew_section render from between Recent and Last Week to after remaining_section puts it at the bottom as intended.

BLOCKERS

None.

NITS

  1. Missing hover state for .queued-badge-btn: The PR removes .queued-badge-btn:hover (which had danger colors) but the _last_week_item partial now renders a button_to with class queued-badge queued-badge-btn. This button has no hover feedback. The new .done-badge-btn class only sets border and cursor. Consider adding hover styles for both badge buttons so users get visual feedback on interactive elements.

  2. DRY opportunity -- done_by_other_rows pattern: The 3-line pattern (done_by_other_rows = ...pluck(:property_id, :id) / @done_by_other_this_week_ids = ...map(&:first).to_set / @done_by_other_items_by_property = ...to_h) is repeated 4 times across the controller (index, create, destroy, mark_other). A private helper like compute_done_by_other_lookups(week_start, week_end) would reduce repetition. Non-blocking since this is a data-fetch pattern, not auth/security logic.

  3. Hardcoded fallback color: var(--color-warning, #f59e0b) appears 4 times in the new CSS. If --color-warning is defined in the theme, the fallback is redundant. If it is not yet defined, adding it to the CSS custom properties block would be cleaner than inline fallbacks.

  4. SVG duplication: The other-crew SVG (users icon) is defined as a JS constant (OTHER_CREW_SVG in week_assign_controller.js) and also inline in the ERB template (weeks/index.html.erb). If the icon ever changes, both locations need updating.

SOP COMPLIANCE

  • PR body has Summary, Changes, Test Plan, Related
  • Test Plan includes both automated and manual checks
  • No secrets committed
  • No unnecessary file changes -- all changes serve the stated goal
  • Commit messages match PR scope
  • Route removal matches controller action removal
  • Spec updates match feature changes (move specs removed, toggle specs updated, new other-crew state spec added)

PROCESS OBSERVATIONS

  • Net deletion of ~250 lines is healthy -- removing the Schedule accordion and move infrastructure reduces maintenance burden.
  • The 4-state toggle is well-tested: the spec now covers assigned -> completed, completed -> other-crew, and other-crew -> destroyed transitions.
  • The PR correctly closes #214.

VERDICT: APPROVED

## PR #215 Review ### DOMAIN REVIEW **Stack:** Rails 7 / Hotwired (Turbo Streams + Stimulus) / vanilla CSS **What this PR does well:** The PR cleanly removes ~350 lines of dead code (the `move` action, `week_move_controller.js`, ~100 lines of `.week-grid-*` / `.week-cell-*` / `.day-picker-*` CSS, and the `patch :move` route). The Schedule accordion is removed from the Week view, and day-letter labels in Assign Properties are promoted to `<a>` links to the daily work queue -- a clean navigation pattern. The core design change is extending the Week Assign pill from a 3-state cycle (empty -> assigned -> completed -> destroyed) to a 4-state cycle (empty -> assigned -> completed -> other-crew -> destroyed). This is implemented consistently across: - **Server** (`toggle_assign`): checks `completed_by_other?` first, then `completed?`, then `toggle_completion!`, then creates. State transitions match the JS. - **Client** (`week_assign_controller.js`): `#state()` reads classes in the correct priority order (`is-other-crew` > `is-completed` > `is-assigned` > `empty`). Optimistic UI with `#revert()` on failure. - **CSS**: New `.is-other-crew` pill styles + sensible hover colors (assigned hover = green for "complete next", completed hover = warning for "mark other crew", other-crew hover = danger for "remove"). - **Model**: `mark_done_by_other!` and `toggle_completion!` both exist and handle state correctly. **Re-queue from other-crew state** (create action): The `existing` check finds `completed_by_other: true` items and resets them rather than hitting a uniqueness violation. This is a good edge case handled correctly. **Partial locals consistency**: All four render sites for `_other_crew_section` now pass `queued_property_ids` and `date`. All render sites for `_last_week_item` now pass `queued_items_by_property` and `done_by_other_items_by_property`. This actually fixes a latent bug on `main` where `mark_other.turbo_stream.erb` and `destroy.turbo_stream.erb` were rendering `_other_crew_section` without those locals. **Today view reordering**: Moving the `other_crew_section` render from between Recent and Last Week to after `remaining_section` puts it at the bottom as intended. ### BLOCKERS None. ### NITS 1. **Missing hover state for `.queued-badge-btn`**: The PR removes `.queued-badge-btn:hover` (which had danger colors) but the `_last_week_item` partial now renders a `button_to` with class `queued-badge queued-badge-btn`. This button has no hover feedback. The new `.done-badge-btn` class only sets `border` and `cursor`. Consider adding hover styles for both badge buttons so users get visual feedback on interactive elements. 2. **DRY opportunity -- `done_by_other_rows` pattern**: The 3-line pattern (`done_by_other_rows = ...pluck(:property_id, :id)` / `@done_by_other_this_week_ids = ...map(&:first).to_set` / `@done_by_other_items_by_property = ...to_h`) is repeated 4 times across the controller (`index`, `create`, `destroy`, `mark_other`). A private helper like `compute_done_by_other_lookups(week_start, week_end)` would reduce repetition. Non-blocking since this is a data-fetch pattern, not auth/security logic. 3. **Hardcoded fallback color**: `var(--color-warning, #f59e0b)` appears 4 times in the new CSS. If `--color-warning` is defined in the theme, the fallback is redundant. If it is not yet defined, adding it to the CSS custom properties block would be cleaner than inline fallbacks. 4. **SVG duplication**: The other-crew SVG (users icon) is defined as a JS constant (`OTHER_CREW_SVG` in `week_assign_controller.js`) and also inline in the ERB template (`weeks/index.html.erb`). If the icon ever changes, both locations need updating. ### SOP COMPLIANCE - [x] PR body has Summary, Changes, Test Plan, Related - [x] Test Plan includes both automated and manual checks - [x] No secrets committed - [x] No unnecessary file changes -- all changes serve the stated goal - [x] Commit messages match PR scope - [x] Route removal matches controller action removal - [x] Spec updates match feature changes (move specs removed, toggle specs updated, new other-crew state spec added) ### PROCESS OBSERVATIONS - Net deletion of ~250 lines is healthy -- removing the Schedule accordion and move infrastructure reduces maintenance burden. - The 4-state toggle is well-tested: the spec now covers `assigned -> completed`, `completed -> other-crew`, and `other-crew -> destroyed` transitions. - The PR correctly closes #214. ### VERDICT: APPROVED
ldraney closed this pull request 2026-06-14 12:10:51 +00:00
Some checks failed
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/pr/woodpecker Pipeline was successful
CI / scan_ruby (pull_request) Has been cancelled
CI / scan_js (pull_request) Has been cancelled
CI / lint (pull_request) Has been cancelled

Pull request closed

Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
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
ldraney/landscaping-assistant!215
No description provided.