diff --git a/.cursorrules b/.cursorrules new file mode 100644 index 0000000..d462b90 --- /dev/null +++ b/.cursorrules @@ -0,0 +1,69 @@ +{ + "expertise": { + "frameworks": ["Ruby on Rails", "MySQL", "PostgreSQL", "sqlite3", "Hotwire", "Tailwind CSS", "Yarn"], + "components": ["Turbo", "Stimulus"] + }, + "codeStyle": { + "general": [ + "Write concise, idiomatic Ruby code", + "Follow Rails conventions and best practices", + "Use object-oriented and functional programming patterns", + "Prefer iteration and modularization over duplication" + ], + "naming": { + "files": "snake_case", + "methods": "snake_case", + "variables": "snake_case", + "classes": "CamelCase", + "modules": "CamelCase" + } + }, + "conventions": { + "ruby": { + "version": "3.x", + "styleGuide": "https://rubystyle.guide/", + "preferences": [ + "Use expressive syntax (unless, ||=, &.)", + "Prefer single quotes unless interpolation needed", + "documentation": "https://www.ruby-lang.org/en/documentation/" + ] + }, + "rails": { + "structure": "MVC with concerns and helpers", + "routing": "RESTful", + "activeRecord": "Use effectively for database operations", + "documentation": "https://guides.rubyonrails.org/" + }, + "javascript": { + "preferred": "Hotwire", + "documentation": "https://hotwired.dev/", + "preferences": [ + "Use Hotwire (Turbo + Stimulus) instead of complex JavaScript libraries/frameworks", + "Implement JavaScript functionality through Stimulus controllers when possible", + "Use Turbo Drive, Frames and Streams for page updates without full reloads" + ] + }, + "tailwind": { + "css": "Use Tailwind CSS for styling", + "documentation": "https://tailwindcss.com/docs" + }, + "yarn": { + "css": "Use Tailwind CSS for styling", + "documentation": "https://classic.yarnpkg.com/lang/en/docs/" + } + }, + "testing": { + "framework": "RSpec", + "approach": "TDD/BDD", + "tools": ["FactoryBot", "Jest"], + "preferences": [ + "Use standard RSpec syntax exclusively", + "Avoid shoulda matchers in favor of explicit RSpec expectations", + "Write clear, descriptive test cases that follow RSpec best practices" + ] + }, + "preferences": { + "architecture": "domain modeling first", + "learning": "visual with analogies" + } +} diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index 9612375..0000000 --- a/.dockerignore +++ /dev/null @@ -1,37 +0,0 @@ -# See https://docs.docker.com/engine/reference/builder/#dockerignore-file for more about ignoring files. - -# Ignore git directory. -/.git/ - -# Ignore bundler config. -/.bundle - -# Ignore all environment files (except templates). -/.env* -!/.env*.erb - -# Ignore all default key files. -/config/master.key -/config/credentials/*.key - -# Ignore all logfiles and tempfiles. -/log/* -/tmp/* -!/log/.keep -!/tmp/.keep - -# Ignore pidfiles, but keep the directory. -/tmp/pids/* -!/tmp/pids/.keep - -# Ignore storage (uploaded files in development and any SQLite databases). -/storage/* -!/storage/.keep -/tmp/storage/* -!/tmp/storage/.keep - -# Ignore assets. -/node_modules/ -/app/assets/builds/* -!/app/assets/builds/.keep -/public/assets diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 197516d..0000000 --- a/Dockerfile +++ /dev/null @@ -1,75 +0,0 @@ -# syntax = docker/dockerfile:1 - -# Make sure RUBY_VERSION matches the Ruby version in .ruby-version and Gemfile -ARG RUBY_VERSION=3.3.0 -FROM registry.docker.com/library/ruby:$RUBY_VERSION-slim as base - -# Rails app lives here -WORKDIR /rails - -# Set production environment -ENV RAILS_ENV="production" \ - BUNDLE_DEPLOYMENT="1" \ - BUNDLE_PATH="/usr/local/bundle" \ - BUNDLE_WITHOUT="development" - - -# Throw-away build stage to reduce size of final image -FROM base as build - -# Install packages needed to build gems and node modules -RUN apt-get update -qq && \ - apt-get install --no-install-recommends -y build-essential curl git libpq-dev libvips node-gyp pkg-config python-is-python3 - -# Install JavaScript dependencies -ARG NODE_VERSION=21.6.2 -ARG YARN_VERSION=1.22.19 -ENV PATH=/usr/local/node/bin:$PATH -RUN curl -sL https://github.com/nodenv/node-build/archive/master.tar.gz | tar xz -C /tmp/ && \ - /tmp/node-build-master/bin/node-build "${NODE_VERSION}" /usr/local/node && \ - npm install -g yarn@$YARN_VERSION && \ - rm -rf /tmp/node-build-master - -# Install application gems -COPY Gemfile Gemfile.lock ./ -RUN bundle install && \ - rm -rf ~/.bundle/ "${BUNDLE_PATH}"/ruby/*/cache "${BUNDLE_PATH}"/ruby/*/bundler/gems/*/.git && \ - bundle exec bootsnap precompile --gemfile - -# Install node modules -COPY package.json yarn.lock ./ -RUN yarn install --frozen-lockfile - -# Copy application code -COPY . . - -# Precompile bootsnap code for faster boot times -RUN bundle exec bootsnap precompile app/ lib/ - -# Precompiling assets for production without requiring secret RAILS_MASTER_KEY -RUN SECRET_KEY_BASE_DUMMY=1 ./bin/rails assets:precompile - - -# Final stage for app image -FROM base - -# Install packages needed for deployment -RUN apt-get update -qq && \ - apt-get install --no-install-recommends -y curl libvips postgresql-client && \ - rm -rf /var/lib/apt/lists /var/cache/apt/archives - -# Copy built artifacts: gems, application -COPY --from=build /usr/local/bundle /usr/local/bundle -COPY --from=build /rails /rails - -# Run and own only the runtime files as a non-root user for security -RUN useradd rails --create-home --shell /bin/bash && \ - chown -R rails:rails db log storage tmp -USER rails:rails - -# Entrypoint prepares the database. -ENTRYPOINT ["/rails/bin/docker-entrypoint"] - -# Start the server by default, this can be overwritten at runtime -EXPOSE 3000 -CMD ["./bin/rails", "server"] diff --git a/app/admin/workshops.rb b/app/admin/workshops.rb index 1a51d31..e015ef8 100644 --- a/app/admin/workshops.rb +++ b/app/admin/workshops.rb @@ -5,7 +5,7 @@ # # Uncomment all parameters which should be permitted for assignment # - permit_params :instructor, :last_name, :first_name + permit_params :instructor, :last_name, :first_name, :active # # or # @@ -16,11 +16,12 @@ # end filter :last_name, as: :select - + filter :active index do selectable_column actions id_column + column :active column :instructor column :last_name column :first_name diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 698a6da..4f1d7e0 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -58,7 +58,7 @@ def payments_open? helper_method :payments_open? def get_workshops - @workshops_available = Workshop.all.order_by_lastname + @workshops_available = Workshop.active.order_by_lastname end helper_method :get_workshops diff --git a/app/models/workshop.rb b/app/models/workshop.rb index c405e4b..d580c86 100644 --- a/app/models/workshop.rb +++ b/app/models/workshop.rb @@ -14,12 +14,14 @@ class Workshop < ApplicationRecord validates :first_name, presence: true validates :last_name, presence: true + scope :active, -> { where(active: true) } + def self.ransackable_associations(auth_object = nil) [] end def self.ransackable_attributes(auth_object = nil) - ["created_at", "first_name", "id", "id_value", "instructor", "last_name", "updated_at"] + ["created_at", "first_name", "id", "active", "id_value", "instructor", "last_name", "updated_at"] end def self.order_by_lastname diff --git a/app/views/applications/_form.html.erb b/app/views/applications/_form.html.erb index bfcd75d..e8bf178 100644 --- a/app/views/applications/_form.html.erb +++ b/app/views/applications/_form.html.erb @@ -89,8 +89,17 @@