summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/assets/config/manifest.js2
-rw-r--r--app/assets/images/.keep0
-rw-r--r--app/assets/stylesheets/application.css15
-rw-r--r--app/channels/application_cable/channel.rb4
-rw-r--r--app/channels/application_cable/connection.rb4
-rw-r--r--app/controllers/application_controller.rb4
-rw-r--r--app/controllers/concerns/.keep0
-rw-r--r--app/controllers/wines_controller.rb49
-rw-r--r--app/helpers/application_helper.rb2
-rw-r--r--app/helpers/wines_helper.rb2
-rw-r--r--app/jobs/application_job.rb7
-rw-r--r--app/mailers/application_mailer.rb4
-rw-r--r--app/models/application_record.rb3
-rw-r--r--app/models/concerns/.keep0
-rw-r--r--app/models/wine.rb4
-rw-r--r--app/views/layouts/application.html.erb22
-rw-r--r--app/views/layouts/mailer.html.erb13
-rw-r--r--app/views/layouts/mailer.text.erb1
-rw-r--r--app/views/pwa/manifest.json.erb22
-rw-r--r--app/views/pwa/service-worker.js26
-rw-r--r--app/views/wines/_form.html.erb33
-rw-r--r--app/views/wines/edit.html.erb5
-rw-r--r--app/views/wines/index.html.erb16
-rw-r--r--app/views/wines/new.html.erb5
-rw-r--r--app/views/wines/show.html.erb17
25 files changed, 260 insertions, 0 deletions
diff --git a/app/assets/config/manifest.js b/app/assets/config/manifest.js
new file mode 100644
index 0000000..5918193
--- /dev/null
+++ b/app/assets/config/manifest.js
@@ -0,0 +1,2 @@
+//= link_tree ../images
+//= link_directory ../stylesheets .css
diff --git a/app/assets/images/.keep b/app/assets/images/.keep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app/assets/images/.keep
diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css
new file mode 100644
index 0000000..288b9ab
--- /dev/null
+++ b/app/assets/stylesheets/application.css
@@ -0,0 +1,15 @@
+/*
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
+ * listed below.
+ *
+ * Any CSS (and SCSS, if configured) file within this directory, lib/assets/stylesheets, or any plugin's
+ * vendor/assets/stylesheets directory can be referenced here using a relative path.
+ *
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
+ * compiled file so the styles you add here take precedence over styles defined in any other CSS
+ * files in this directory. Styles in this file should be added after the last require_* statement.
+ * It is generally better to create a new file per style scope.
+ *
+ *= require_tree .
+ *= require_self
+ */
diff --git a/app/channels/application_cable/channel.rb b/app/channels/application_cable/channel.rb
new file mode 100644
index 0000000..d672697
--- /dev/null
+++ b/app/channels/application_cable/channel.rb
@@ -0,0 +1,4 @@
+module ApplicationCable
+ class Channel < ActionCable::Channel::Base
+ end
+end
diff --git a/app/channels/application_cable/connection.rb b/app/channels/application_cable/connection.rb
new file mode 100644
index 0000000..0ff5442
--- /dev/null
+++ b/app/channels/application_cable/connection.rb
@@ -0,0 +1,4 @@
+module ApplicationCable
+ class Connection < ActionCable::Connection::Base
+ end
+end
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
new file mode 100644
index 0000000..0d95db2
--- /dev/null
+++ b/app/controllers/application_controller.rb
@@ -0,0 +1,4 @@
+class ApplicationController < ActionController::Base
+ # Only allow modern browsers supporting webp images, web push, badges, import maps, CSS nesting, and CSS :has.
+ allow_browser versions: :modern
+end
diff --git a/app/controllers/concerns/.keep b/app/controllers/concerns/.keep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app/controllers/concerns/.keep
diff --git a/app/controllers/wines_controller.rb b/app/controllers/wines_controller.rb
new file mode 100644
index 0000000..9129dee
--- /dev/null
+++ b/app/controllers/wines_controller.rb
@@ -0,0 +1,49 @@
+class WinesController < ApplicationController
+ def index
+ @wines = Wine.all
+ end
+
+ def show
+ @wine = Wine.find(params[:id])
+ end
+
+ def new
+ @wine = Wine.new
+ end
+
+ def create
+ @wine = Wine.new(wine_params)
+
+ if @wine.save
+ redirect_to @wine
+ else
+ render :new, status: :unprocessable_entity
+ end
+ end
+
+ def edit
+ @wine = Wine.find(params[:id])
+ end
+
+ def update
+ @wine = Wine.find(params[:id])
+
+ if @wine.update(wine_params)
+ redirect_to @wine
+ else
+ render :edit, status: :unprocessable_entity
+ end
+ end
+
+ def destroy
+ @wine = Wine.find(params[:id])
+ @wine.destroy
+
+ redirect_to root_path, status: :see_other
+ end
+
+ private
+ def wine_params
+ params.require(:wine).permit(:name, :year, :variety, :notes)
+ end
+end
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
new file mode 100644
index 0000000..de6be79
--- /dev/null
+++ b/app/helpers/application_helper.rb
@@ -0,0 +1,2 @@
+module ApplicationHelper
+end
diff --git a/app/helpers/wines_helper.rb b/app/helpers/wines_helper.rb
new file mode 100644
index 0000000..bb7bcfc
--- /dev/null
+++ b/app/helpers/wines_helper.rb
@@ -0,0 +1,2 @@
+module WinesHelper
+end
diff --git a/app/jobs/application_job.rb b/app/jobs/application_job.rb
new file mode 100644
index 0000000..d394c3d
--- /dev/null
+++ b/app/jobs/application_job.rb
@@ -0,0 +1,7 @@
+class ApplicationJob < ActiveJob::Base
+ # Automatically retry jobs that encountered a deadlock
+ # retry_on ActiveRecord::Deadlocked
+
+ # Most jobs are safe to ignore if the underlying records are no longer available
+ # discard_on ActiveJob::DeserializationError
+end
diff --git a/app/mailers/application_mailer.rb b/app/mailers/application_mailer.rb
new file mode 100644
index 0000000..3c34c81
--- /dev/null
+++ b/app/mailers/application_mailer.rb
@@ -0,0 +1,4 @@
+class ApplicationMailer < ActionMailer::Base
+ default from: "from@example.com"
+ layout "mailer"
+end
diff --git a/app/models/application_record.rb b/app/models/application_record.rb
new file mode 100644
index 0000000..b63caeb
--- /dev/null
+++ b/app/models/application_record.rb
@@ -0,0 +1,3 @@
+class ApplicationRecord < ActiveRecord::Base
+ primary_abstract_class
+end
diff --git a/app/models/concerns/.keep b/app/models/concerns/.keep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app/models/concerns/.keep
diff --git a/app/models/wine.rb b/app/models/wine.rb
new file mode 100644
index 0000000..a47022e
--- /dev/null
+++ b/app/models/wine.rb
@@ -0,0 +1,4 @@
+class Wine < ApplicationRecord
+ validates :name, presence: true
+ validates :year, presence: true
+end
diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb
new file mode 100644
index 0000000..ef26703
--- /dev/null
+++ b/app/views/layouts/application.html.erb
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title><%= content_for(:title) || "Flacon" %></title>
+ <meta name="viewport" content="width=device-width,initial-scale=1">
+ <meta name="apple-mobile-web-app-capable" content="yes">
+ <%= csrf_meta_tags %>
+ <%= csp_meta_tag %>
+
+ <%= yield :head %>
+
+ <link rel="manifest" href="/manifest.json">
+ <link rel="icon" href="/icon.png" type="image/png">
+ <link rel="icon" href="/icon.svg" type="image/svg+xml">
+ <link rel="apple-touch-icon" href="/icon.png">
+ <%= stylesheet_link_tag "application", "data-turbo-track": "reload" %>
+ </head>
+
+ <body>
+ <%= yield %>
+ </body>
+</html>
diff --git a/app/views/layouts/mailer.html.erb b/app/views/layouts/mailer.html.erb
new file mode 100644
index 0000000..3aac900
--- /dev/null
+++ b/app/views/layouts/mailer.html.erb
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <style>
+ /* Email styles need to be inline */
+ </style>
+ </head>
+
+ <body>
+ <%= yield %>
+ </body>
+</html>
diff --git a/app/views/layouts/mailer.text.erb b/app/views/layouts/mailer.text.erb
new file mode 100644
index 0000000..37f0bdd
--- /dev/null
+++ b/app/views/layouts/mailer.text.erb
@@ -0,0 +1 @@
+<%= yield %>
diff --git a/app/views/pwa/manifest.json.erb b/app/views/pwa/manifest.json.erb
new file mode 100644
index 0000000..7a1a68b
--- /dev/null
+++ b/app/views/pwa/manifest.json.erb
@@ -0,0 +1,22 @@
+{
+ "name": "Flacon",
+ "icons": [
+ {
+ "src": "/icon.png",
+ "type": "image/png",
+ "sizes": "512x512"
+ },
+ {
+ "src": "/icon.png",
+ "type": "image/png",
+ "sizes": "512x512",
+ "purpose": "maskable"
+ }
+ ],
+ "start_url": "/",
+ "display": "standalone",
+ "scope": "/",
+ "description": "Flacon.",
+ "theme_color": "red",
+ "background_color": "red"
+}
diff --git a/app/views/pwa/service-worker.js b/app/views/pwa/service-worker.js
new file mode 100644
index 0000000..b3a13fb
--- /dev/null
+++ b/app/views/pwa/service-worker.js
@@ -0,0 +1,26 @@
+// Add a service worker for processing Web Push notifications:
+//
+// self.addEventListener("push", async (event) => {
+// const { title, options } = await event.data.json()
+// event.waitUntil(self.registration.showNotification(title, options))
+// })
+//
+// self.addEventListener("notificationclick", function(event) {
+// event.notification.close()
+// event.waitUntil(
+// clients.matchAll({ type: "window" }).then((clientList) => {
+// for (let i = 0; i < clientList.length; i++) {
+// let client = clientList[i]
+// let clientPath = (new URL(client.url)).pathname
+//
+// if (clientPath == event.notification.data.path && "focus" in client) {
+// return client.focus()
+// }
+// }
+//
+// if (clients.openWindow) {
+// return clients.openWindow(event.notification.data.path)
+// }
+// })
+// )
+// })
diff --git a/app/views/wines/_form.html.erb b/app/views/wines/_form.html.erb
new file mode 100644
index 0000000..fe676b2
--- /dev/null
+++ b/app/views/wines/_form.html.erb
@@ -0,0 +1,33 @@
+<!-- -*- mode: web; -*- -->
+
+<%= form_with model: wine do |form| %>
+ <div>
+ <%= form.label :name %><br>
+ <%= form.text_field :name %>
+ <% wine.errors.full_messages_for(:name).each do |message| %>
+ <div><%= message %></div>
+ <% end %>
+ </div>
+
+ <div>
+ <%= form.label :year %><br>
+ <%= form.text_field :year %>
+ <% wine.errors.full_messages_for(:year).each do |message| %>
+ <div><%= message %></div>
+ <% end %>
+ </div>
+
+ <div>
+ <%= form.label :variety %><br>
+ <%= form.text_field :variety %>
+ </div>
+
+ <div>
+ <%= form.label :notes %><br>
+ <%= form.text_field :notes %>
+ </div>
+
+ <div>
+ <%= form.submit %>
+ </div>
+<% end %>
diff --git a/app/views/wines/edit.html.erb b/app/views/wines/edit.html.erb
new file mode 100644
index 0000000..a97c707
--- /dev/null
+++ b/app/views/wines/edit.html.erb
@@ -0,0 +1,5 @@
+<!-- -*- mode: web; -*- -->
+
+<h1>Edit Wine</h1>
+
+<%= render "form", wine: @wine %>
diff --git a/app/views/wines/index.html.erb b/app/views/wines/index.html.erb
new file mode 100644
index 0000000..0202ada
--- /dev/null
+++ b/app/views/wines/index.html.erb
@@ -0,0 +1,16 @@
+<!-- -*- mode: web; -*- -->
+
+<h1>Wines#index</h1>
+<h2>List of wines</h2>
+
+<%= link_to "Add Wine", new_wine_path %>
+
+<ul>
+ <% @wines.each do |wine| %>
+ <li>
+ <%= link_to wine.name, wine %>,
+ <%= wine.year %>,
+ <%= wine.variety %>
+ </li>
+ <% end %>
+</ul>
diff --git a/app/views/wines/new.html.erb b/app/views/wines/new.html.erb
new file mode 100644
index 0000000..eeb6fd6
--- /dev/null
+++ b/app/views/wines/new.html.erb
@@ -0,0 +1,5 @@
+<!-- -*- mode: web; -*- -->
+
+<h1>Add Wine</h1>
+
+<%= render "form", wine: @wine %>
diff --git a/app/views/wines/show.html.erb b/app/views/wines/show.html.erb
new file mode 100644
index 0000000..cd8925d
--- /dev/null
+++ b/app/views/wines/show.html.erb
@@ -0,0 +1,17 @@
+<!-- -*- mode: web; -*- -->
+
+<li><%= link_to "Back to homepage", root_path %></li>
+
+<h1><%= @wine.name %></h1>
+<h2><%= @wine.year %></h2>
+<p><%= @wine.notes %></p>
+
+<ul>
+ <li><%= link_to "Edit", edit_wine_path(@wine) %></li>
+ <li><%= link_to "Destroy",
+ wine_path(@wine),
+ data: {
+ turbo_method: :delete,
+ turbo_confirm: "Are you sure you want to delete #{@wine.name}?"
+ } %></li>
+</ul>
Copyright 2019--2024 Marius PETER