From 682da733da03489410f4cef5759184111f26bf77 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 22 Apr 2025 04:58:30 +0000 Subject: [PATCH 01/48] Bump nokogiri from 1.18.7 to 1.18.8 Bumps [nokogiri](https://github.com/sparklemotion/nokogiri) from 1.18.7 to 1.18.8. - [Release notes](https://github.com/sparklemotion/nokogiri/releases) - [Changelog](https://github.com/sparklemotion/nokogiri/blob/main/CHANGELOG.md) - [Commits](https://github.com/sparklemotion/nokogiri/compare/v1.18.7...v1.18.8) --- updated-dependencies: - dependency-name: nokogiri dependency-version: 1.18.8 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 37b14083c..a9c459db0 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -223,24 +223,24 @@ GEM net-protocol net-ssh (7.3.0) nio4r (2.7.4) - nokogiri (1.18.7) + nokogiri (1.18.8) mini_portile2 (~> 2.8.2) racc (~> 1.4) - nokogiri (1.18.7-aarch64-linux-gnu) + nokogiri (1.18.8-aarch64-linux-gnu) racc (~> 1.4) - nokogiri (1.18.7-aarch64-linux-musl) + nokogiri (1.18.8-aarch64-linux-musl) racc (~> 1.4) - nokogiri (1.18.7-arm-linux-gnu) + nokogiri (1.18.8-arm-linux-gnu) racc (~> 1.4) - nokogiri (1.18.7-arm-linux-musl) + nokogiri (1.18.8-arm-linux-musl) racc (~> 1.4) - nokogiri (1.18.7-arm64-darwin) + nokogiri (1.18.8-arm64-darwin) racc (~> 1.4) - nokogiri (1.18.7-x86_64-darwin) + nokogiri (1.18.8-x86_64-darwin) racc (~> 1.4) - nokogiri (1.18.7-x86_64-linux-gnu) + nokogiri (1.18.8-x86_64-linux-gnu) racc (~> 1.4) - nokogiri (1.18.7-x86_64-linux-musl) + nokogiri (1.18.8-x86_64-linux-musl) racc (~> 1.4) ostruct (0.6.1) parallel (1.26.3) From 58c7eb41bb47bb1ad4cc130fe6fb53f2cc146fda Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Tue, 22 Apr 2025 09:55:59 +0200 Subject: [PATCH 02/48] AI slop for the honcho seed data --- db/seeds/honcho.rb | 74 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 64 insertions(+), 10 deletions(-) diff --git a/db/seeds/honcho.rb b/db/seeds/honcho.rb index 918b3a4d5..9132177ab 100644 --- a/db/seeds/honcho.rb +++ b/db/seeds/honcho.rb @@ -3,19 +3,73 @@ create_tenant "honcho" david = create_first_run "David Heinemeier Hansson", "david@37signals.com" login_as david -jz = create_user "Jason Zimdars", "jz@37signals.com" +jason = create_user "Jason Zimdars", "jz@37signals.com" kevin = create_user "Kevin Mcconnell", "kevin@37signals.com" +sarah = create_user "Sarah Johnson", "sarah@37signals.com" +mike = create_user "Mike Peterson", "mike@37signals.com" -create_collection("Mucho", access_to: [ jz, kevin ]).tap do |fizzy| - create_card("Prepare MUCHO sign-up page", description: "We need to do this before the launch.", collection: fizzy) +# Array of authors for random assignment +authors = [david, jason, kevin, sarah, mike] - create_card("Prepare MUCHO sign-up page", description: "We need to do this before the launch.", collection: fizzy).tap do |card| - card.toggle_assignment(kevin) - card.engage - end +# Card titles for reuse across collections +card_titles = [ + "Implement authentication", + "Design landing page", + "Set up database", + "Create API endpoints", + "Write unit tests", + "Optimize performance", + "Add user profiles", + "Implement search", + "Create admin panel", + "Set up CI/CD", + "Design logo", + "Create documentation", + "Add payment system", + "Implement notifications", + "Set up analytics", + "Create mobile layout", + "Add social sharing", + "Implement caching", + "Set up monitoring", + "Create error handling" +] - create_card("Plain MUCHO text mentions", description: "We'll support plain text mentions first.", collection: fizzy).tap do |card| - card.toggle_assignment(david) - card.close +# Create 10 collections +collections = [ + "Project Launch", + "Frontend Dev", + "Backend Dev", + "Design System", + "Testing Suite", + "Performance", + "User Experience", + "API Development", + "DevOps", + "Documentation" +] + +collections.each_with_index do |collection_name, index| + create_collection(collection_name, access_to: authors.sample(3)).tap do |collection| + # Create 20 unique cards for each collection + card_titles.each do |title| + create_card(title, + description: "#{title} for #{collection_name} phase #{index + 1}.", + collection: collection + ).tap do |card| + # Randomly assign to 1-2 authors + card.toggle_assignment(authors.sample) + card.toggle_assignment(authors.sample) if rand > 0.5 + + # Randomly set card state + case rand(3) + when 0 + card.engage + when 1 + card.close + # 2 remains open + end + end + end end end From 9b9acf36ae22b357f0977ddeabb4f6e946640905 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Tue, 22 Apr 2025 11:21:09 +0200 Subject: [PATCH 03/48] Events track due_date changes in particulars, not as a direct attribute --- ...50422091602_remove_due_date_from_events.rb | 5 ++ db/schema.rb | 3 +- db/schema_cache.yml | 54 ++++++++----------- 3 files changed, 28 insertions(+), 34 deletions(-) create mode 100644 db/migrate/20250422091602_remove_due_date_from_events.rb diff --git a/db/migrate/20250422091602_remove_due_date_from_events.rb b/db/migrate/20250422091602_remove_due_date_from_events.rb new file mode 100644 index 000000000..5a636e3dd --- /dev/null +++ b/db/migrate/20250422091602_remove_due_date_from_events.rb @@ -0,0 +1,5 @@ +class RemoveDueDateFromEvents < ActiveRecord::Migration[8.1] + def change + remove_column :events, :due_date + end +end diff --git a/db/schema.rb b/db/schema.rb index 3a56a34ae..e1bea16a2 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[8.1].define(version: 2025_04_18_150259) do +ActiveRecord::Schema[8.1].define(version: 2025_04_22_091602) do create_table "accesses", force: :cascade do |t| t.integer "collection_id", null: false t.datetime "created_at", null: false @@ -180,7 +180,6 @@ ActiveRecord::Schema[8.1].define(version: 2025_04_18_150259) do t.integer "card_id", null: false t.datetime "created_at", null: false t.integer "creator_id", null: false - t.date "due_date" t.json "particulars", default: {} t.integer "summary_id", null: false t.datetime "updated_at", null: false diff --git a/db/schema_cache.yml b/db/schema_cache.yml index 8152c393d..5d78e6883 100644 --- a/db/schema_cache.yml +++ b/db/schema_cache.yml @@ -80,7 +80,7 @@ columns: default_function: collation: comment: - - &28 !ruby/object:ActiveRecord::ConnectionAdapters::SQLite3::Column + - &26 !ruby/object:ActiveRecord::ConnectionAdapters::SQLite3::Column auto_increment: name: user_id cast_type: *1 @@ -389,12 +389,12 @@ columns: - !ruby/object:ActiveRecord::ConnectionAdapters::SQLite3::Column auto_increment: name: due_on - cast_type: &24 !ruby/object:ActiveRecord::Type::Date + cast_type: !ruby/object:ActiveRecord::Type::Date precision: scale: limit: timezone: - sql_type_metadata: &25 !ruby/object:ActiveRecord::ConnectionAdapters::SqlTypeMetadata + sql_type_metadata: !ruby/object:ActiveRecord::ConnectionAdapters::SqlTypeMetadata sql_type: date type: :date limit: @@ -435,7 +435,7 @@ columns: default_function: collation: comment: - - &30 !ruby/object:ActiveRecord::ConnectionAdapters::SQLite3::Column + - &28 !ruby/object:ActiveRecord::ConnectionAdapters::SQLite3::Column auto_increment: name: title cast_type: *7 @@ -490,11 +490,11 @@ columns: - !ruby/object:ActiveRecord::ConnectionAdapters::SQLite3::Column auto_increment: name: all_access - cast_type: &31 !ruby/object:ActiveModel::Type::Boolean + cast_type: &29 !ruby/object:ActiveModel::Type::Boolean precision: scale: limit: - sql_type_metadata: &32 !ruby/object:ActiveRecord::ConnectionAdapters::SqlTypeMetadata + sql_type_metadata: &30 !ruby/object:ActiveRecord::ConnectionAdapters::SqlTypeMetadata sql_type: boolean type: :boolean limit: @@ -549,24 +549,14 @@ columns: - *21 - *6 - *23 - - !ruby/object:ActiveRecord::ConnectionAdapters::SQLite3::Column - auto_increment: - name: due_date - cast_type: *24 - sql_type_metadata: *25 - 'null': true - default: - default_function: - collation: - comment: - !ruby/object:ActiveRecord::ConnectionAdapters::SQLite3::Column auto_increment: name: particulars - cast_type: &26 !ruby/object:ActiveRecord::Type::Json + cast_type: &24 !ruby/object:ActiveRecord::Type::Json precision: scale: limit: - sql_type_metadata: &27 !ruby/object:ActiveRecord::ConnectionAdapters::SqlTypeMetadata + sql_type_metadata: &25 !ruby/object:ActiveRecord::ConnectionAdapters::SqlTypeMetadata sql_type: json type: :json limit: @@ -595,8 +585,8 @@ columns: - !ruby/object:ActiveRecord::ConnectionAdapters::SQLite3::Column auto_increment: name: fields - cast_type: *26 - sql_type_metadata: *27 + cast_type: *24 + sql_type_metadata: *25 'null': false default: "{}" default_function: @@ -627,7 +617,7 @@ columns: comment: filters_tags: - *18 - - &29 !ruby/object:ActiveRecord::ConnectionAdapters::SQLite3::Column + - &27 !ruby/object:ActiveRecord::ConnectionAdapters::SQLite3::Column auto_increment: name: tag_id cast_type: *1 @@ -707,13 +697,13 @@ columns: collation: comment: - *9 - - *28 + - *26 pins: - *5 - *21 - *6 - *9 - - *28 + - *26 reactions: - *5 - !ruby/object:ActiveRecord::ConnectionAdapters::SQLite3::Column @@ -793,25 +783,25 @@ columns: default_function: collation: comment: - - *28 + - *26 taggings: - *5 - *21 - *6 - - *29 + - *27 - *9 tags: - *5 - *6 - - *30 + - *28 - *9 users: - *5 - !ruby/object:ActiveRecord::ConnectionAdapters::SQLite3::Column auto_increment: name: active - cast_type: *31 - sql_type_metadata: *32 + cast_type: *29 + sql_type_metadata: *30 'null': false default: true default_function: @@ -855,12 +845,12 @@ columns: - *21 - *6 - *9 - - *28 + - *26 - !ruby/object:ActiveRecord::ConnectionAdapters::SQLite3::Column auto_increment: name: watching - cast_type: *31 - sql_type_metadata: *32 + cast_type: *29 + sql_type_metadata: *30 'null': false default: true default_function: @@ -1938,4 +1928,4 @@ indexes: comment: valid: true workflows: [] -version: 20250418150259 +version: 20250422091602 From 2d5901fe1e44fdd4ad7f992490d23da927620b8b Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Tue, 22 Apr 2025 11:48:19 +0200 Subject: [PATCH 04/48] Fix pin turbo stream response rendering --- app/controllers/cards/pins_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/cards/pins_controller.rb b/app/controllers/cards/pins_controller.rb index a4b49433f..6ac118543 100644 --- a/app/controllers/cards/pins_controller.rb +++ b/app/controllers/cards/pins_controller.rb @@ -28,6 +28,6 @@ class Cards::PinsController < ApplicationController end def render_pin_button_replacement - turbo_stream.replace [ @card, :pin_button ], partial: "cards/pins/pin_button", locals: { card: @card } + render turbo_stream: turbo_stream.replace([ @card, :pin_button ], partial: "cards/pins/pin_button", locals: { card: @card }) end end From 268e367c6f2ecf146b87f310e59ce0ba0acec367 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Tue, 22 Apr 2025 11:53:16 +0200 Subject: [PATCH 05/48] Unused --- app/models/colorable.rb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/models/colorable.rb b/app/models/colorable.rb index 4fba4556d..e774fd946 100644 --- a/app/models/colorable.rb +++ b/app/models/colorable.rb @@ -3,8 +3,4 @@ module Colorable COLORS = %w[ #3b3633 #67695e #eb7a32 #bf7c2b #c09c6f #746b1e #2c6da8 #5d618f #663251 #ff63a8 ] DEFAULT_COLOR = "#2c6da8" - - included do - attribute :color, default: DEFAULT_COLOR - end end From 22abf0ba46c6b294258c3dacc6318a0651e0031d Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Tue, 22 Apr 2025 11:56:41 +0200 Subject: [PATCH 06/48] Remove anemic concern Colors are a card concern. --- app/helpers/workflows_helper.rb | 2 +- app/models/card/colored.rb | 5 ++++- app/models/colorable.rb | 6 ------ app/views/workflows/stages/_color.html.erb | 2 +- test/models/card/colored_test.rb | 4 ++-- 5 files changed, 8 insertions(+), 11 deletions(-) delete mode 100644 app/models/colorable.rb diff --git a/app/helpers/workflows_helper.rb b/app/helpers/workflows_helper.rb index 1bbed5c32..43d0d5973 100644 --- a/app/helpers/workflows_helper.rb +++ b/app/helpers/workflows_helper.rb @@ -10,6 +10,6 @@ module WorkflowsHelper end def stage_color(stage) - stage.color.presence || Colorable::DEFAULT_COLOR + stage.color.presence || Card::DEFAULT_COLOR end end diff --git a/app/models/card/colored.rb b/app/models/card/colored.rb index 99e934a94..9a16ee4a4 100644 --- a/app/models/card/colored.rb +++ b/app/models/card/colored.rb @@ -1,8 +1,11 @@ module Card::Colored extend ActiveSupport::Concern + COLORS = %w[ #3b3633 #67695e #eb7a32 #bf7c2b #c09c6f #746b1e #2c6da8 #5d618f #663251 #ff63a8 ] + DEFAULT_COLOR = "#2c6da8" + def color - color_from_stage || Colorable::DEFAULT_COLOR + color_from_stage || DEFAULT_COLOR end private diff --git a/app/models/colorable.rb b/app/models/colorable.rb deleted file mode 100644 index e774fd946..000000000 --- a/app/models/colorable.rb +++ /dev/null @@ -1,6 +0,0 @@ -module Colorable - extend ActiveSupport::Concern - - COLORS = %w[ #3b3633 #67695e #eb7a32 #bf7c2b #c09c6f #746b1e #2c6da8 #5d618f #663251 #ff63a8 ] - DEFAULT_COLOR = "#2c6da8" -end diff --git a/app/views/workflows/stages/_color.html.erb b/app/views/workflows/stages/_color.html.erb index 04a9e12a3..f2b6e3160 100644 --- a/app/views/workflows/stages/_color.html.erb +++ b/app/views/workflows/stages/_color.html.erb @@ -6,7 +6,7 @@ <%= form_with model: stage, url: workflow_stage_path(stage.workflow, stage), class: "flex gap-half", data: { controller: "form", action: "change->form#submit" } do |form| %> - <% Colorable::COLORS.each do |color| %> + <% Card::COLORS.each do |color| %>