diff --git a/app/assets/tailwind/application.css b/app/assets/tailwind/application.css index 3116798..da0fac2 100644 --- a/app/assets/tailwind/application.css +++ b/app/assets/tailwind/application.css @@ -3,4 +3,19 @@ h1 { @apply font-bold text-2xl; } h2 { @apply font-bold text-xl; } ul { @apply list-inside; } -li { @apply list-disc; } \ No newline at end of file +li { @apply list-disc; } + +.btn-new { @apply rounded-md px-3.5 py-2.5 bg-blue-600 hover:bg-blue-500 text-white block font-medium; } +.btn-show { @apply w-full sm:w-auto text-center rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium; } +.btn-empty { @apply w-full sm:w-auto text-center mt-2 sm:mt-0 sm:ml-2 rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium; } +.btn-destroy { @apply w-full sm:w-auto rounded-md px-3.5 py-2.5 text-white bg-red-600 hover:bg-red-500 font-medium cursor-pointer; } + +.notice p#notice { @apply py-2 px-3 bg-green-50 mb-5 text-green-500 font-medium rounded-md inline-block; } + +form input[type="text"], +form input[type="number"] +{ + @apply block shadow-sm rounded-md border px-3 py-2 mt-2 w-full; +} + +form input[type="submit"] { @apply w-full sm:w-auto rounded-md px-3.5 py-2.5 bg-blue-600 hover:bg-blue-500 text-white inline-block font-medium cursor-pointer; } \ No newline at end of file diff --git a/app/controllers/friends_controller.rb b/app/controllers/friends_controller.rb new file mode 100644 index 0000000..eed13f6 --- /dev/null +++ b/app/controllers/friends_controller.rb @@ -0,0 +1,56 @@ +class FriendsController < ApplicationController + before_action :set_friend, only: %i[ show edit update destroy ] + + def index + @friends = Friend.all + end + + def show + end + + def new + @friend = Friend.new + end + + def edit + end + + def create + @friend = Friend.new(friend_params) + + respond_to do |format| + if @friend.save + format.html { redirect_to friends_path, notice: "Der Freund wurde gespeichert." } + else + format.html { render :new, status: :unprocessable_entity } + end + end + end + + def update + respond_to do |format| + if @friend.update(friend_params) + format.html { redirect_to friends_path, notice: "Der Freund wurde angepasst.", status: :see_other } + else + format.html { render :edit, status: :unprocessable_entity } + end + end + end + + def destroy + @friend.destroy! + + respond_to do |format| + format.html { redirect_to friends_path, notice: "Der Freund wurde gelöscht.", status: :see_other } + end + end + + private + def set_friend + @friend = Friend.find(params.expect(:id)) + end + + def friend_params + params.expect(friend: [ :firstname, :lastname, :email, :telefon, :level ]) + end +end diff --git a/app/helpers/friends_helper.rb b/app/helpers/friends_helper.rb new file mode 100644 index 0000000..0b69e9b --- /dev/null +++ b/app/helpers/friends_helper.rb @@ -0,0 +1,2 @@ +module FriendsHelper +end diff --git a/app/models/friend.rb b/app/models/friend.rb new file mode 100644 index 0000000..01ac1ea --- /dev/null +++ b/app/models/friend.rb @@ -0,0 +1,3 @@ +class Friend < ApplicationRecord + validates :firstname, :lastname, :email, :telefon, presence: true +end diff --git a/app/views/friends/_form.html.erb b/app/views/friends/_form.html.erb new file mode 100644 index 0000000..2edfb0c --- /dev/null +++ b/app/views/friends/_form.html.erb @@ -0,0 +1,42 @@ +<%= form_with(model: friend, class: "contents") do |form| %> + <% if friend.errors.any? %> +
+

<%= pluralize(friend.errors.count, "error") %> prohibited this friend from being saved:

+ + +
+ <% end %> + +
+ <%= form.label :firstname %> + <%= form.text_field :firstname, class: [{"border-gray-400 focus:outline-blue-600": friend.errors[:firstname].none?, "border-red-400 focus:outline-red-600": friend.errors[:firstname].any?}] %> +
+ +
+ <%= form.label :lastname %> + <%= form.text_field :lastname, class: [{"border-gray-400 focus:outline-blue-600": friend.errors[:lastname].none?, "border-red-400 focus:outline-red-600": friend.errors[:lastname].any?}] %> +
+ +
+ <%= form.label :email %> + <%= form.text_field :email, class: [{"border-gray-400 focus:outline-blue-600": friend.errors[:email].none?, "border-red-400 focus:outline-red-600": friend.errors[:email].any?}] %> +
+ +
+ <%= form.label :telefon %> + <%= form.text_field :telefon, class: [{"border-gray-400 focus:outline-blue-600": friend.errors[:telefon].none?, "border-red-400 focus:outline-red-600": friend.errors[:telefon].any?}] %> +
+ +
+ <%= form.label :level %> + <%= form.number_field :level, class: [{"border-gray-400 focus:outline-blue-600": friend.errors[:level].none?, "border-red-400 focus:outline-red-600": friend.errors[:level].any?}] %> +
+ +
+ <%= form.submit %> +
+<% end %> diff --git a/app/views/friends/_friend.html.erb b/app/views/friends/_friend.html.erb new file mode 100644 index 0000000..800de22 --- /dev/null +++ b/app/views/friends/_friend.html.erb @@ -0,0 +1,22 @@ +
+
+ Firstname: + <%= friend.firstname %> +
+
+ Lastname: + <%= friend.lastname %> +
+
+ Email: + <%= friend.email %> +
+
+ Telefon: + <%= friend.telefon %> +
+
+ Level: + <%= friend.level %> +
+
diff --git a/app/views/friends/edit.html.erb b/app/views/friends/edit.html.erb new file mode 100644 index 0000000..3a77f61 --- /dev/null +++ b/app/views/friends/edit.html.erb @@ -0,0 +1,10 @@ +<% content_for :title, "Editing friend" %> + +
+

Freund bearbeiten

+ + <%= render "form", friend: @friend %> + + <%= link_to "Anzeigen", @friend, class: "btn-show" %> + <%= link_to "Liste", friends_path, class: "btn-show" %> +
diff --git a/app/views/friends/index.html.erb b/app/views/friends/index.html.erb new file mode 100644 index 0000000..727c9fe --- /dev/null +++ b/app/views/friends/index.html.erb @@ -0,0 +1,29 @@ +<% content_for :title, "Freunde" %> + +
+ <% if notice.present? %> +

<%= notice %>

+ <% end %> + +
+

Freunde

+ <%= link_to "Neuer Freund", new_friend_path, class: "btn-new" %> +
+ +
+ <% if @friends.any? %> + <% @friends.each do |friend| %> +
+ <%= render friend %> +
+ <%= link_to "Anzeigen", friend, class: "btn-show" %> + <%= link_to "Bearbeiten", edit_friend_path(friend), class: "btn-show" %> + <%= button_to "Löschen", friend, method: :delete, class: "btn-destroy", data: { turbo_confirm: "Sind Sie sich sicher?" } %> +
+
+ <% end %> + <% else %> +

Bisher kein Freund eingegeben.

+ <% end %> +
+
diff --git a/app/views/friends/new.html.erb b/app/views/friends/new.html.erb new file mode 100644 index 0000000..acceb3b --- /dev/null +++ b/app/views/friends/new.html.erb @@ -0,0 +1,7 @@ +<% content_for :title, "Neuer Freund" %> + +
+

Neuer Freund

+ <%= render "form", friend: @friend %> + <%= link_to "Back to friends", friends_path, class: "btn-empty" %> +
diff --git a/app/views/friends/show.html.erb b/app/views/friends/show.html.erb new file mode 100644 index 0000000..e86f93e --- /dev/null +++ b/app/views/friends/show.html.erb @@ -0,0 +1,17 @@ +<% content_for :title, "Freund anzeigen" %> + +
+ <% if notice.present? %> +

<%= notice %>

+ <% end %> + +

Freund anzeigen

+ + <%= render @friend %> + + <%= link_to "Bearbeiten", edit_friend_path(@friend), class: "btn-show" %> + <%= link_to "Liste anzeigen", friends_path, class: "btn-show" %> + <%= button_to "Löschen", @friend, method: :delete, form_class: "sm:inline-block mt-2 sm:mt-0 sm:ml-2", + class: "btn-destroy", + data: { turbo_confirm: "Are you sure?" } %> +
diff --git a/config/routes.rb b/config/routes.rb index 9eee1db..4ca6f6d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -9,5 +9,7 @@ Rails.application.routes.draw do get "pages/:page" => "welcome#pages", as: :pages + resources :friends + root "welcome#index" end diff --git a/db/migrate/20251119093322_create_friends.rb b/db/migrate/20251119093322_create_friends.rb new file mode 100644 index 0000000..2961d6b --- /dev/null +++ b/db/migrate/20251119093322_create_friends.rb @@ -0,0 +1,12 @@ +class CreateFriends < ActiveRecord::Migration[8.0] + def change + create_table :friends do |t| + t.string :firstname, null: false + t.string :lastname, null: false + t.string :email, null: false + t.string :telefon, null: false + t.integer :level, default: 5 + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 0f651a4..577f703 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,5 +10,14 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[8.0].define(version: 0) do +ActiveRecord::Schema[8.0].define(version: 2025_11_19_093322) do + create_table "friends", force: :cascade do |t| + t.string "firstname", null: false + t.string "lastname", null: false + t.string "email", null: false + t.string "telefon", null: false + t.integer "level", default: 5 + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end end