Commit Graph
333 Commits
Author SHA1 Message Date
Brenda WallaceandDaniel O'Connor 8474bdd416 remove newsletter (#4974)
* Remove unused bluecloth gem

Last released in 2011. It was only required, never called; kramdown
renders the markdown.

* Add specs for Tilt markdown rendering and posts markdown partial

* Remove rails_12factor gem

Last released in 2014. Rails 5+ does this via RAILS_SERVE_STATIC_FILES
and RAILS_LOG_TO_STDOUT, which production.rb already reads.

* Remove memcachier gem from Gemfile and Gemfile.lock

* Remove unused webrat gem

Last released in 2011. Nothing requires it; the specs use Rails'
assert_select and Capybara matchers. Only generator comments mention it.

* Remove crowdin-cli gem

Last released in 2018. Crowdin now ships its own standalone CLI, which
reads crowdin.yml and doesn't need the gem. Also drops the dependencies
only it used (rest-client, gli, crowdin-api and friends).

* Removes the crowdin-cli gem (last released 2018), the dependencies only
it needed, and crowdin.yml. Crowdin was never set up: the config still
has a placeholder project ID and nothing else in the repo mentions it.

Assisted by Claude

* Remove newsletter functionality and associated views and tests

* Remove newsletter functionality and related code across the application

* keep the column

* Remove stale test step

* add back newsletter

* Add migration to update newsletter column comment in members table

---------

Co-authored-by: Daniel O'Connor <daniel.oconnor@gmail.com>
2026-10-26 11:48:36 +10:30
e0b24f860b Add rel=nofollow to member website link when member has no plantings (#5056)
* Add rel=nofollow to member website link when member has no plantings

Co-authored-by: CloCkWeRX <365751+CloCkWeRX@users.noreply.github.com>

* Add rel=nofollow to member website and other URL links when user has no plantings

Co-authored-by: CloCkWeRX <365751+CloCkWeRX@users.noreply.github.com>

* Remove low value coverage

---------

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
2026-10-24 13:47:00 +10:30
Brenda Wallace a0b24381ac Refactor activities to jobs across the application
- Renamed all instances of 'Activity' to 'Job' in views, controllers, and models.
- Updated routes to reflect the change from activities to jobs.
- Modified database schema to rename the activities table to jobs and adjusted related columns.
- Updated locale files to change activity-related translations to jobs.
- Adjusted tests to ensure they reference jobs instead of activities.
- Removed the category field from jobs as they are now a plain list.
- Updated seed data and sample data generation to create jobs instead of activities.
2026-10-22 17:16:25 +13:00
Brenda Wallace e68c98fd38 Add JavaScript functionality for planting alternate names and tab navigation
- Implemented `planting_alternate_name.js` to load alternate names for crops in the planting form based on user input.
- Added `tab_navigation.js` to manage tab navigation and update the URL hash accordingly.

Update map rendering in member and place views

- Modified `_map.html.haml` to include a custom marker icon for member maps.
- Updated `index.html.haml` and `show.html.haml` to pass `places_map_data` to the map sections.

Refactor asset management in Rails application

- Removed Sprockets from the application configuration and adjusted asset paths.
- Updated asset precompilation settings and removed deprecated asset configurations from environment files.
- Added new build scripts for CSS and updated package dependencies in `package.json` for Bootstrap, Chart.js, and others.

Ensure React and CSS bundles are built before running tests

- Updated `react_bundle.rb` to check for the existence of both JavaScript and CSS bundles and build them if missing.
2026-10-20 23:55:33 +13:00
Brenda Wallace 3b06325e62 Add friends and neighbours feature with member dismissal functionality
- Implement RecentActivity service to track recent planting, harvesting, and trading events.
- Enhance TimelineService to include garden layouts in event queries.
- Update navigation menu to include a link to friends and neighbours.
- Create member card partial for displaying gardener information.
- Add follow button partial for managing follow actions.
- Refactor members index view to use the new member card partial.
- Introduce neighbours feed view with daily updates and entries.
- Implement entry partial for displaying individual neighbour activities.
- Create layout partial for visualizing garden layouts.
- Add posts section to neighbours view for displaying recent posts.
- Implement reach section to show nearby gardeners.
- Add suggestions section for recommending gardeners to follow.
- Create routes for neighbours functionality and member dismissals.
- Add migrations for member dismissals and garden layout timestamps.
- Write feature and request specs for neighbours functionality.
- Include support for creating located members in tests.
2026-10-13 17:08:18 +13:00
6a208a127b Tidy up plantings#show (#4848)
* Restore the Ruby 4.0.6 upgrade

PR #4831 committed a stale Gemfile.lock over the newer one, taking
.ruby-version back to 3.2.3 and rolling back active_median, dalli,
parallel, rbs and selenium-webdriver. Dockerfile and
.devcontainer/Dockerfile still build on Ruby 4, so the Gemfile's version
check fails against the image.

Restores both files to what they were before that merge.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Tidy plantings#show, and make cards and menus consistent

This page read as a page about the crop rather than about one member's
planting, and its sections each did things their own way. Changes follow
the conventions written up in the UI consistency guide.

Identity
- Title, meta description and OpenGraph all read "<crop> planting by
  <owner>"; the hero carries a muted "planting by X in Y" subtitle and
  the scientific name moves to the crop card.
- Breadcrumb's last item is plain text, not a link to the current page.

Actions
- One actions menu per page: a quiet three-dot button in the top right of
  the hero, rendered by the new PlantingActions island, opening the
  EditPlanting, RecordHarvest, SaveSeeds, MarkFinished and AddPhoto
  dialogs that already existed for the garden list.
- Menu items are lower case, so a menu reads as a list of things you can
  do rather than a row of headings.
- Transplanting moves out of the sidebar into a dialog off that menu: it
  is done once in a planting's life and should not hold real estate.
- The second seed-saving dropdown and the loose photo buttons are gone;
  each section keeps one quiet "add" on its heading bar as the non-JS
  path.
- The plant-part icons from the server-rendered harvest form now reach
  the dialog, via icon_url on HarvestFormSerializer.

Fact cards
- Every card fills the same four slots, and the core cards always render
  so one planting's page has the same shape as the next.
- Progress reads as a percentage with "day 43 of 90" beneath; quantity
  and "grown from" merge into one card rather than both saying
  "seedling"; rating is stars and renders even when unrated.
- Dates go through I18n.l and standard_time_distance instead of
  assembling abbr_month_names by hand.
- Adds Planting#planned?, replacing three copies of age_in_days < 0.
- Perennial no longer claims the plant "grows back each year".

Cards by type
- Harvest cards get square corners, a warm accent and the harvest icon,
  and say "<crop> harvest", so they are not mistaken for plantings.
- Seed cards are drawn as seed packets: portrait, papery, torn top edge,
  printed band, small print along the foot and the year saved stamped on
  them.

Layout
- The page wrapper is .planting-show, not .planting: that is the planting
  *card's* class, and its absolutely positioned badges and quick actions
  were leaking onto this page.
- Sections are bordered blocks with their heading bar as the lid, so a
  heading and its content read as one thing.
- One spacing scale, and the hero aligns to the same left edge as
  everything below it.

Copy
- Section headings and empty states go through en.yml, in one voice.
- "Add a photo to visually track growth of this planting, to Flickr,
  iNaturalist or Pl@ntNet" was nonsense: photos come from Flickr only.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Use the harvest and seed cards site-wide, and rate a planting in place

The new harvest cards and seed packets only appeared on plantings#show.
Everywhere else either used the old thumbnails or hand-rolled its own
markup, which is what made harvests and plantings look alike in the first
place.

- members#show and members/_harvests render harvests/card. The latter also
  wrapped each card in another .card, which nested a card in a card.
- The homepage harvest list was hand-rolled markup beside a seeds section
  that already used seeds/card; both now use the shared partials.
- Homepage seed packets go in an .index-cards grid. Outside one they have
  no width, and the packet's 3:4 ratio made each half the page wide.
- harvests/_harvest and seeds/_seed chose between card and thumbnail on a
  `full:` local that nothing passes. Both render the card.

The crop pages' harvest and seed panels are lists of links in a sidebar,
not card grids, so they are left alone.

Section "add" buttons now open the same dialogs as the actions menu, via a
data-planting-dialog attribute the island listens for. Their href stays as
the fallback without JavaScript.

The rating card is now clickable: for someone who may edit the planting it
renders StarRating, which saves the new rating and puts it back if the
save fails. The card's own heading is the label, so the fieldset legend is
hidden rather than saying "Rating" twice.

"More photos" is a plain link again, and only shows when there are more
photos than the page is displaying — the photos are now paginated to 12,
where before the whole set was loaded and the link always showed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Put the like button beside the planting's name

It sat on its own below the hero, with a section's worth of space above
and below it, reading as an orphan rather than as something belonging to
the planting.

It now sits on the title line, right after the name, at its own size
rather than the title's.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Draw a border around the planting's own data

The title, facts, photos, harvests, seeds and planned activities now sit
inside one subtle border, so they read as one body of data rather than
running into the sidebar beside them.

Also drops the raised shadow from the like button. The global .btn shadow
made the heart look like a call to action it isn't.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Tidy the planting page sidebar, and the add-photo dialog

The sidebar was three blocks with three different treatments: a bare
owner card, the shared crop card, and a bordered neighbours section. They
now all use the same sections as the main column, with a heading bar each.

- The owner block leads with the avatar and who grows this where, rather
  than a heading repeating "Planted by".
- The crop card renders without its footer here. "Add to my garden" and
  "Save seeds" made no sense beside a planting you are already growing,
  and the page offers both already. crops/_crop takes actions: false;
  everywhere else keeps them.
- Partials shared with other pages bring their own .card, which inside a
  section is a box in a box, so those are flattened.

Add-photo dialog:
- It now says what it is adding to: "Add photo to chives planting",
  rather than "Add a photo to chives". Garden cards say which garden.
- While Flickr is being read the body holds roughly the height the picker
  will take and centres the spinner, instead of a short dialog with a
  spinner in the corner that jumps open when the photos arrive.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Say what kind of record a page is about in its title

"Chives" is a crop. A page about one member's chives should say "Chives
planting" in its heading, not leave the reader to work it out from the
furniture around it. The same for harvests and saved seeds.

- plantings#show: "Chives planting", subtitle "by <owner> in <garden>".
- harvests#show: "Basil harvest", subtitle "by <owner> · <date>". The
  owner was in a %small inside the h1 before.
- seeds#show: already said "seeds"; it now names who saved them.

Gardens are left as they are: a garden's name is the member's own, so the
noun belongs in the subtitle rather than appended to a name that may
already contain it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* One corner radius for all data cards, and harvest months by season

Cards used three different shapes: plantings rounded at 5%, harvests and
seed packets square. A percentage radius also draws an ellipse that
changes with the card's size, so a tall packet and a square planting card
curved differently. There is now one $card-radius, used by every data
card and by the section boxes.

Harvest months are grouped into the grower's own seasons, three months
each, named and kept together, starting at their spring — so a Wellington
gardener sees spring begin in September. Where we have no latitude we
show the plain January-to-December row rather than guessing at a
hemisphere.

The grower's location now appears in the page subtitle. It decides the
seasons and the harvest times, so it belongs with the rest of the
planting's identity rather than only as a "nearby" link in the sidebar.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Tidy the harvest months block

It was loose text at the end of the timeline partial: a bare "Harvest
months:" label, twelve badges, and a trailing "in <place>" that now
repeats the location in the page subtitle.

- Moved into its own partial with a proper label, rather than trailing
  off the timeline.
- Dropped the repeated location.
- A legend says what a highlighted month means. Nothing said so before.
- The empty state is its own muted line instead of a sentence running on
  from the label, and no longer says "we need more data" at the reader.
- Each badge carries its full month name for screen readers, and
  highlighted ones say they are harvest months. The quiet months were
  aria-hidden, so a screen reader heard the harvest months with no
  calendar around them.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Give the sidebar crop block its own partial

Reusing crops/_crop inside a section meant a card inside a box: a white
strip between the green heading and the photo, the card's own shadow
sitting proud of the section, a photo that overshot the right edge, and
two corner radii disagreeing. Flattening it with negative margins was
fighting the card rather than fixing it.

plantings/_crop is written for this spot instead: the photo runs edge to
edge under the heading bar, the crop's name is title-cased with its
scientific name beneath, and the growing times are a short list rather
than three stats laid out side by side.

crops/_crop goes back to how it was, including its footer buttons, since
nothing needs to suppress them now.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Update the specs for the tidied planting page

Mostly copy and flow changes from the tidy-up, but two real bugs came out
of running them.

Bugs fixed:
- planting_actions_props didn't pass planted_at or today, which
  MarkFinishedModal needs to decide whether "today" may be offered and
  where the date box starts. Without them the dialog threw while
  rendering, and with no error boundary React tore down the whole island,
  so the actions menu vanished entirely.
- The dialogs reloaded the page from inside the save callback, tearing
  the page down while the dialog was still finishing its own update. They
  now close first and reload on the next tick.

Menu items are lower-cased in CSS, as the garden cards already do it,
rather than by calling downcase on the shared button translations. That
was mangling labels other pages show in sentence case.

Specs:
- Menu, dialog and section-heading flows updated: the actions menu opens
  dialogs rather than navigating, so recording a harvest, marking a
  planting finished, editing and transplanting all drive the dialog.
- Copy: "grows this in", "day 14 of 50", "Planned" for a future planting,
  "4 of 5", the new harvest-months wording, and the add-photo dialog
  naming what it adds to.
- The parent-seed example asserted a link to the planting, which came
  from the breadcrumb; the last crumb is the page you are on, so it is
  plain text now and the example checks the seed link instead.
- Removed spec/features/shared_examples/append_date.rb. It drove the old
  datepicker finish flow and had one caller.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Stop avatars shifting the page during feature specs

spec/features/places/searching_a_place_spec.rb intermittently failed on
"goes to members' index page": the click on "View all members >>" landed
on nothing and the browser stayed put.

Member avatars come from gravatar.com over the network and were rendered
with img-fluid and no dimensions, so they reserved no space until they
arrived. The link sits directly under that grid. Capybara found the link,
an avatar landed, the link moved, and the click missed.

rails_helper meant to prevent this, but its guard tested for Poltergeist's
url_blacklist. Poltergeist is long gone and Selenium's browser has no such
method, so the condition was always false and the block never ran.

- Give the two avatar image tags explicit width and height, so the box is
  reserved before the image loads. This fixes real layout shift for
  members too, not only the specs.
- Replace the dead guard with config.x.blank_avatars, which browser specs
  set, making avatar_uri return a blank inline GIF. Helper specs still
  assert the real Gravatar URLs.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Fix avatar URI logic to prevent layout shift in all environments

* Add waiting assertions to prevent premature content checks after saving harvest

* Refactor PlantingActions to improve dialog handling and state management
Enhance PlantingRating to prevent multiple saves and improve error messaging

* Fix date input handling in planting edit dialog

* Add neighbour planting sidebar with improved styling and layout

* Tidy crops#show, and share the record page layout

The planting page's layout was planting-specific CSS. It is now a shared
.record-page / .record-panel in _record_page.scss, and crops#show uses it:
the crop's own data inside one border, the sidebar outside, sections as
bordered blocks with a heading bar as the lid.

Along the way a duplicate section rule and two copies of the kebab button
styling collapsed into one each.

Crop page:
- Scientific and alternate names sit under the crop's name, where they
  belong, instead of having a sidebar card of their own. Wranglers add and
  edit them from the actions menu, in a dialog; the loose "Add" buttons in
  the page body are gone.
- The actions menu is the same three-dot kebab as plantings, in the top
  right of the hero. The "you are a CROP WRANGLER" banner is gone: seeing
  the menu already tells you that. Menu items have no icons now, except
  delete, which keeps its icon and its red.
- Growing facts were split three ways — prose in the hero, prediction
  cards in the main column, an OpenFarm list in the sidebar — and the
  hero prose was the same fields as the OpenFarm ones. One "Growing X"
  section of fact cards now holds all of it.
- The sidebar listed planting, harvest and seed counts directly above
  three sections with those same names. The counts are headline numbers
  in the hero instead, which also fills the space the hero was wasting.
- Main column reads top to bottom: how to grow it, how members grow it,
  varieties, companions, photos, video, where it grows, posts, history.
  Headings say something rather than naming a partial.
- Crop actions are just "Add to my garden". Recording a harvest, saving
  seeds, posting and marking a planting failed all belong to a planting
  you already have.
- The charts section rendered as an empty white strip whenever a crop had
  any plantings or harvests but no chart to draw.
- The hero photo moved to the sidebar, where it has room.

Also: the whimsical icons perch on the heading bar below them rather than
sitting inside the box, the garden picker dialog gives every row the same
shape so the names line up, and crops/_grown_for.html.haml is deleted —
nothing rendered it once its content moved into the growing cards.

Specs are not updated yet: crop_detail_page_spec clicks "Record harvest"
on this page, which no longer exists.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Refactor crop-related views and styles for improved layout and functionality

- Update styles in _crops.scss for better alignment and spacing.
- Enhance _record_page.scss with a new section footer for actions.
- Modify _alternate_names.html.haml to improve dropdown functionality for editing and deleting names.
- Change _history.html.haml header to "Edit history" for clarity.
- Adjust _info.haml to display sowing method and sun requirements prominently.
- Revise _openfarm_data.html.haml to remove unnecessary comments and clarify content.
- Update _photos.html.haml to include a section footer for the "More photos" link.
- Refine _posts.html.haml to streamline the display of posts and actions.
- Improve _scientific_names.html.haml to enhance dropdown functionality for scientific names.
- Update tests in alternate_name_spec.rb and scientific_name_spec.rb to reflect UI changes.
- Remove unused _grown_for.html.haml_spec.rb file.

* Replace language text field with a dropdown select for improved user experience

* Enhance editable forms and fact cards for improved user interaction and layout

* Refactor styles and improve layout for planting details, including muted text color updates and enhanced card displays

* Refactor crop detail page for improved SEO and user experience, including updated links and content for planting and growing information.

* Adjust section add button width for better layout on heading bar

* Update link text for consistency and clarity in crop detail page

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: Daniel O'Connor <daniel.oconnor@gmail.com>
2026-10-11 16:06:15 +10:30
Brenda WallaceandClaude Opus 5 6dbab4678f Stop avatars shifting the page during feature specs (#4847)
* Stop avatars shifting the page during feature specs

spec/features/places/searching_a_place_spec.rb intermittently failed on
"goes to members' index page": the click on "View all members >>" landed
on nothing and the browser stayed put.

Member avatars come from gravatar.com over the network and were rendered
with img-fluid and no dimensions, so they reserved no space until they
arrived. The link sits directly under that grid. Capybara found the link,
an avatar landed, the link moved, and the click missed.

rails_helper meant to prevent this, but its guard tested for Poltergeist's
url_blacklist. Poltergeist is long gone and Selenium's browser has no such
method, so the condition was always false and the block never ran.

- Give the two avatar image tags explicit width and height, so the box is
  reserved before the image loads. This fixes real layout shift for
  members too, not only the specs.
- Replace the dead guard with config.x.blank_avatars, which browser specs
  set, making avatar_uri return a blank inline GIF. Helper specs still
  assert the real Gravatar URLs.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Fix avatar URI logic to prevent layout shift in all environments

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-09-24 13:36:44 +09:30
Brenda WallaceandClaude Sonnet 5 27f4282f5b Let plantings use a crop's alternate name
A planting can now choose one of its crop's alternate names (eg. "lauki"
for calabash, "aubergine" for eggplant) and shows it instead of the
crop's primary name.

- plantings.alternate_name_id, validated to belong to the planting's crop
- Planting#display_name, used on cards, the planting page, garden lists,
  the member page, the homepage and the RSS/ICS feeds
- planting form offers the crop's alternate names, preselecting the one
  that was searched for
- crop autosuggest shows the matched alternate name, eg.
  "aubergine (eggplant)", via matched_alternate_name in the search JSON

Part of #554

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-21 21:28:46 +12:00
Brenda Wallace 2989dafc4c Merge dev into chore/bootstrap-5 2026-09-20 20:20:51 +12:00
Daniel O'Connorandgoogle-labs-jules[bot] 2b366213e8 Cap RSS feeds iterate unbounded associations to 50 records (#4809)
- Cap @member.posts in app/views/members/show.rss.haml with .limit(50)
- Cap @post.comments in app/views/posts/show.rss.haml with .limit(50) and eager load authors
- Remove eager loading of all comments+authors on Post in PostsController#show
- Add view specs to verify RSS feed limits

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
2026-09-20 16:41:28 +09:30
Brenda WallaceandClaude Sonnet 5 b15b92c08e Replace the remaining Bootstrap 4 components with Bootstrap 5 equivalents
form-inline -> flex utilities, embed-responsive -> ratio ratio-16x9,
input-group-prepend wrapper removed (Bootstrap 5 puts the addon directly in
the group), and media/media-body -> d-flex/flex-grow-1.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-20 18:05:19 +12:00
Brenda WallaceandClaude Sonnet 5 92f3f0cc36 Convert Bootstrap 3 horizontal forms to Bootstrap 5
The label-beside-input forms (label col-md-2, input col-md-8) relied on
form-horizontal and form-group acting as a row. Each field wrapper is now a real
.row.mb-3, labels are col-form-label, help text is form-text, and the leftover
form-horizontal and form-actions classes, which do nothing in Bootstrap 5, are
dropped.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-20 18:03:36 +12:00
Brenda WallaceandClaude Sonnet 5 742599fea6 Rename Bootstrap 3/4 grid, button and form-group classes
col-xs-N -> col-N, col-md-offset-N -> offset-md-N, row-fluid -> row,
btn-block -> w-100, btn-xs -> btn-sm, form-group -> mb-3 (Bootstrap 5 dropped
form-group), and btn-default (Bootstrap 3) -> btn-outline-secondary. The three
helpers that combined btn-default with btn-secondary keep just btn-secondary.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-20 18:01:45 +12:00
Brenda WallaceandClaude Sonnet 5 1ee95263ee Rename Bootstrap 4 badge classes to Bootstrap 5
badge-info/success/... -> text-bg-info/success/..., which set the background
and a readable text colour together, and badge-pill -> rounded-pill. The site's
own badge-late, badge-harvest and similar hooks are unchanged.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-20 18:01:20 +12:00
Brenda WallaceandClaude Sonnet 5 be5ed5fca5 Rename Bootstrap 4 utility classes to their Bootstrap 5 names
text-left/right -> text-start/end, float-left/right -> float-start/end,
ml-/mr-/pl-/pr- -> ms-/me-/ps-/pe-, border-left/right -> border-start/end,
dropdown-menu-left/right -> dropdown-menu-start/end, font-weight-* -> fw-*,
font-italic -> fst-italic and sr-only -> visually-hidden. Bootstrap 5 dropped
text-justify, so the site keeps a one-line rule for it.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-20 18:01:00 +12:00
3b60e8f974 Implement blocking feature (#4199)
* Implement blocking feature

This commit introduces a blocking feature that allows members to block other members.

A blocked member is prevented from:
- following the blocker
- sending private messages to the blocker
- replying to the blocker's posts
- liking the blocker's content

The implementation includes:
- A new `Block` model and a corresponding database table.
- Updates to the `Member` model to include associations for blocks.
- A new `BlocksController` to handle blocking and unblocking actions.
- New routes for the `BlocksController`.
- UI changes to add block/unblock buttons to the member profile page.
- Validations in the `Follow`, `Comment`, and `Like` models to enforce the blocking rules.
- A check in the `MessagesController` to prevent sending messages to a member who has blocked the sender.
- A callback in the `Block` model to destroy the follow relationship when a block is created.
- New feature and model specs to test the blocking functionality.

* Implement blocking feature and fix failing tests

This commit introduces a blocking feature that allows members to block other members.

A blocked member is prevented from:
- following the blocker
- sending private messages to the blocker
- replying to the blocker's posts
- liking the blocker's content

The implementation includes:
- A new `Block` model and a corresponding database table.
- Updates to the `Member` model to include associations for blocks.
- A new `BlocksController` to handle blocking and unblocking actions.
- New routes for the `BlocksController`.
- UI changes to add block/unblock buttons to the member profile page.
- Validations in the `Follow`, `Comment`, and `Like` models to enforce the blocking rules.
- A check in the `MessagesController` to prevent sending messages to a member who has blocked the sender.
- A callback in the `Block` model to destroy the follow relationship when a block is created.
- New feature and model specs to test the blocking functionality.

This commit also fixes a failing test in the blocking feature. The error was caused by the validation being called even when the `member` association was `nil`. A guard has been added to the validation methods in the `Like`, `Follow`, and `Comment` models to prevent this from happening.

* Generate schema

* Fix tests

* Add permissions

* Define Block permissions in Ability model

The feature specs for member blocking were failing because the "Block"
link was not being rendered on member profiles. This was due to the
lack of explicit create and destroy permissions for the Block resource
in the Ability model, which is used by CanCanCan to authorize actions
and by the view to conditionally show links.

This change adds the necessary permissions to `member_abilities`:
- Allows members to create blocks (except for blocking themselves).
- Allows members to destroy blocks where they are the blocker.

These rules ensure that the "Block" and "Unblock" links are correctly
rendered and authorized for signed-in members.

Co-authored-by: CloCkWeRX <365751+CloCkWeRX@users.noreply.github.com>

* Comment out specs for now

---------

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
Co-authored-by: Daniel O'Connor <daniel.oconnor@gmail.com>
Co-authored-by: CloCkWeRX <365751+CloCkWeRX@users.noreply.github.com>
2026-04-26 14:22:32 +09:30
google-labs-jules[bot] 91e1f1c004 feat: Add dynamic meta descriptions
This commit improves the meta descriptions for several pages by making them dynamic and object-specific.

- The default meta description in `app/views/layouts/_head.html.haml` has been updated to include a mention of open data.
- The `show.html.haml` views for crops, seeds, plantings, harvests, and members now have a `content_for :meta_description` block. This block uses the object's description or bio if available, and falls back to a generated string if not.
2025-12-01 14:21:43 +00:00
Daniel O'Connor b3c749566b More named anchors 2025-09-07 05:14:18 +00:00
google-labs-jules[bot] ee2fffd25b Fix: Only show 'add a bio' link on own profile
The 'add a bio' link on the member profile page was previously shown
based on the `can? :edit, @member` ability check. This caused an issue
for admins, who could see the link on other users' profiles, but the
link would incorrectly lead to their own settings page.

This change modifies the condition to be `member_signed_in? && current_member == @member`.
This ensures the link is only displayed when a logged-in user is
viewing their own profile, which is the correct and intended behavior.
2025-08-31 22:48:41 +00:00
Daniel O'Connor a481cb7c06 Merge pull request #4171 from Growstuff/feature/pwa-install-instructions
Add PWA installation instructions to homepage
2025-08-31 13:17:22 +09:30
Daniel O'Connor 48d2f0a224 Fix width of ready to harvest 2025-08-31 03:30:24 +00:00
Daniel O'Connor 532afafa0e Restyle slightly 2025-08-31 02:55:02 +00:00
Daniel O'Connor b4c1104af0 Merge branch 'dev' into remove-twitter-auth 2025-08-24 16:36:42 +09:30
Daniel O'Connor b8f7f95f32 Merge pull request #4144 from Growstuff/grid-layout
Improve profile page display slightly
2025-08-24 16:33:33 +09:30
google-labs-jules[bot] 0b639d5940 Remove twitter authentication
This change removes the twitter authentication feature from the application.

It removes the `omniauth-twitter` gem and all related code from controllers, views, and tests. It also removes the twitter icon and environment variable settings.
2025-08-24 07:03:20 +00:00
google-labs-jules[bot] 76a6c1d849 Merge pull request #4131 from Growstuff/feature/add-social-media-links
feat: Add social media links to user profiles
2025-08-24 16:21:05 +09:30
Daniel O'Connor b7f4de782d Styling 2025-08-24 06:50:53 +00:00
Daniel O'Connor 112a626941 Adjust Bio layout 2025-08-24 06:48:40 +00:00
Daniel O'Connor 000f4979db Trial Ruby32 (#3418)
* Ruby 3.2/Bundler 2.4

* Fix creation

* Upgrade to js-routes 2. Put all js routes into a global namespace.

* Remove js-routes

* Remove

* Adjust ownership

* Appease codeclimate for the nth time

* Fix deprecation warning by explicitly calling to_fs

* Fix deprecation warning by explicitly calling to_fs

* Fix deprecation warning by explicitly calling to_fs

* Swap to will paginate successor for bootstrap

* Update app/views/members/show.html.haml

* Update app/views/plantings/index.rss.haml

* Update .env

* Update .devcontainer/.env

* Fix spec

* Update spec

* Fix spec

* Pin to 2.4.22

* 3 space indent

* Regenerate

* Update rubocop
2024-07-13 14:45:33 +09:30
Daniel O'Connor 725c146e2d Improve profile page on mobile (#3711)
* Avoid showing when there are 0 things

* Styling

* Styling

* Collapse stats by default on small screens

* Add ARIA skip links

* Refactoring out of partial, and use CSS to set order on mobile

* Remove partial

* Update expectations

* Fix visual appearance on Ban button on your own profile for admins

* Typo

* Stale expectation
2024-04-07 21:43:52 +09:30
Daniel O'Connor e3bb749e6d Fix activities (#3710)
* Clean up activities display

* Clean up activities display

* Fix display
2024-04-07 20:10:29 +09:30
bennett-zink b5bab8bd0b fixed Bug: 404 on "add a bio" #3667 2024-04-04 23:41:41 +00:00
Daniel O'Connor 7c6508e387 Overflow of location badges (#3685)
* Swap to CSS for truncation

* Adjust styling on mobile

* Contain more

* Contain more

* All badges clip

* Adjust badges to truncate again

* Adjust badges to truncate again

* Apply suggestions from code review
2024-03-24 20:16:56 +10:30
Daniel O'Connor 5be0153c74 Activities (#3646)
* Implement activities

* Add activities to timeline

* Add factory

* Add coverage

* Fix misc issues

* Activities display

* Add activities to garden and plantings

* Add activities to garden and plantings

* Add planting

* Add to planting, harvest show

* More CRUD

* More CRUD

* index

* index

* Extract card view

* Permissions

* Add edit

* Remove workaround fro vs code

* Fix title

* CSV

* CSV

* Add RSS, ical

* Extend ical slightly

* Cleanup

* Rubocop

* Remove doubled form

* Change icon

* Fix short description

* Add menus

* Put homepage widget in

* Add activity icon - MIT licenced - https://www.svgrepo.com/svg/336823/plan

* Naming

* Missing files

* Revert VS Code lag induced change

* Update app/views/home/_harvests.html.haml

* Update activities_controller.rb

* Update activities_controller.rb

* Update app/controllers/activities_controller.rb

* Update index.html.haml

* Apply suggestions from code review

* Apply suggestions from code review

* Typo

* Translation

* Apply suggestions from code review

* Update app/views/plantings/index.ics.erb

* Update app/models/activity.rb

* Update plantings_spec.rb

* Update plantings_spec.rb

* We are now rendering an extra event, so check the next one for the old behaviour
2024-03-10 11:36:24 +10:30
Daniel O'Connor 42e1dbb4da Rearrange member profile so that current progress is reported first, harvests second 2024-02-18 03:23:30 +00:00
Daniel O'Connor 49284eb169 Fix haml preview (#3610)
* HAML

* rewrite

* Fix specs - but likely still wrong

* Return temple

* Trailing line

* Fix specs

* This was rearranged, apparently.

* Fix tests

* Retain escaping

* Fix specs

* Rubocop

* Attempt to fix rendering

* Fix output

* Move away from filter

* Move away from filter

* Fix spec

* Fix specs

* Fix structure to avoid nested paragraph tags
2024-02-04 15:08:18 +10:30
Daniel O'Connor 91f8c2e0b3 Harvests - Compare dates to dates when determing how long ago something was (#3585)
* Compare dates to dates

* Adjust timeline display to check if Date or Time
2024-01-21 15:20:32 +10:30
Daniel O'Connor 4a45acf79b Update _avatar.html.haml
Fix naming
2024-01-18 08:32:49 +10:30
Daniel O'Connor 78eaf0b4c9 Address minor accessibility issues: Image elements do not have [alt] attributes (#3561)
* Add alt tags

* Update app/views/members/_tiny.haml

* Update app/views/home/_plantings.html.haml

* Use crop_name as this is a searchkick record
2024-01-17 22:02:09 +10:30
Daniel O'ConnorandCesy da45aae52f Adjust layout (#3187)
Co-authored-by: Cesy <cesy.avon@gmail.com>
2023-03-13 13:18:00 +10:30
Daniel O'Connor c1e511d099 Merge branch 'dev' into bundleupdate3 2022-12-18 11:45:10 +10:30
Cesy Avon f677500d2e Empty fails on nil, better to use present instead 2022-12-14 20:18:49 +00:00
Daniel O'Connor d3063f844d Remove facebook auth. They wanted to dictate the behaviour of an application they didn't own, so I told them to get stuffed a few years ago 2022-12-10 15:52:12 +10:30
Daniel O'Connor 06c5e4b8e8 to_s 2022-11-07 23:20:49 +10:30
Daniel O'Connor ef1938879e DEPRECATION WARNING: TimeWithZone#to_s(:rfc822) is deprecated. Please use TimeWithZone#to_fs(:rfc822) instead. 2022-11-06 16:30:30 +10:30
Brenda 36bad1cda0 Fix mobile display of member profiles 2020-02-23 11:42:07 +13:00
Brenda Wallace 878ae9073c Tidy up member planting progress section 2020-02-22 07:49:56 +13:00
Brenda Wallace b72e866362 Remove reference to current member 2020-02-21 14:40:53 +13:00
Brenda d3cdaea218 Show member plantings summary on member page 2020-02-20 23:01:04 +13:00
Brenda Wallace aa2893f666 Added breadcrumbs to members 2020-02-20 15:03:35 +13:00