The AddPositionToImageUploads migration was calling group_by directly on the ImageUpload class instead of on a collection. This fixes the NoMethodError by properly calling ImageUpload.all.group_by.
Also updates Gemfile.lock with arm64-darwin platform support after bundle install.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Replace deprecated account_balance with balance on Customer objects
- Replace deprecated date with created on Invoice objects
These API attribute changes in the newer Stripe gem were causing
NoMethodError exceptions on the billing history page.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Migrate from deprecated sources API to modern payment_methods API in SubscriptionsController
- Update subscription plan modifications to use Subscription.modify instead of direct assignment
- Fix payment method creation/deletion to use PaymentMethod.create/detach instead of sources
- Update view templates to use new payment_methods data structure
- Migrate price.id usage from deprecated plan.id in data integrity tasks
- Add comprehensive test suite with proper Stripe API stubs
- Add missing test gems: rspec-rails, webmock, factory_bot_rails, shoulda-matchers
This resolves Error 500 when users try to upgrade to Premium subscriptions.
The original error was: NoMethodError - undefined method 'total_count' for nil:NilClass
caused by stripe_customer.sources.total_count when sources API returned nil.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
This commit adds test coverage for the FoldersController, including tests for:
- Authentication requirements
- Creating folders and subfolders
- Updating folders
- Viewing folders
- Filtering by favorites and tags
- Deleting folders
- Security (preventing access to other users' folders)
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Switched to Materialize's built-in modal trigger mechanism
- Added proper modal-trigger class to help button
- Replaced inline onclick handler with data-target attribute
- Properly initialized all modals using document.querySelectorAll
- Added event listener for direct programmatic control
- Used getInstance pattern for reliable modal manipulation
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Replaced link with proper clickable button element
- Added inline onclick handler for immediate response
- Pre-defined modal structure in HTML instead of generating it dynamically
- Simplified JavaScript modal initialization for reliability
- Fixed event handling to ensure proper click response
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Fixed card alignment on incomplete rows to align left instead of right
- Added help button in header area with question mark icon
- Implemented modal with step-by-step instructions for joining the showcase
- Created styles for the how-to-join modal with proper highlighting
- Added JavaScript to dynamically create and show the modal
- Made help button stand out with pulse effect for visibility
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Switched from CSS Grid to standard Materialize column grid
- Fixed card width issues so cards properly fill available space
- Ensured cards maintain consistent heights within rows
- Added proper margins for better spacing between card rows
- Set consistent card image heights for better visual alignment
- Used flexbox approach that works better with Materialize CSS
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Set fixed card heights using flexbox for consistent grid layout
- Added flex properties to ensure proper spacing of card elements
- Made card heights responsive on smaller screens
- Added special media queries for tablet-sized screens
- Improved overall grid layout with flex display properties
- Enhanced mobile responsiveness for cards
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Complete redesign of the tag browsing experience
- Added interactive content filtering system by category
- Enhanced header with improved branding and statistics
- Modernized card design with improved visual hierarchy
- Redesigned tags to use pill format for better readability
- Added detailed creator attribution on all cards
- Improved card information architecture with clearer sections
- Enhanced card reveal with more structured information
- Added CSS variables for consistent color theming
- Implemented responsive design improvements for mobile
- Added JavaScript for interactive filtering functionality
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Replaced formal notice panel with subtle grey text
- Positioned as a simple text line at the top right
- Added small lock_open icon for visual indicator
- Kept the core message about private-by-default content
- More elegant and less obtrusive approach
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Added subtle blue info panel at top of page
- Clarifies that all Notebook.ai content is private by default
- Reminds users that displayed content was explicitly made public by creators
- Designed to be informative but not take up excessive screen space
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Created new /browse/tag/ArtFight2025 endpoint
- Added browse controller for site-wide content display
- Fixed tag slug case-sensitivity for reliable content retrieval
- Implemented a design that highlights the ArtFight2025 tag
- Show all content tags on each card for context
- Prioritize character display at the top of search results
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>