Added projects
This commit is contained in:
parent
0964187f22
commit
8b4ffb83ec
37 changed files with 470 additions and 1935 deletions
|
|
@ -22,9 +22,13 @@ class ApplicationController < ActionController::Base
|
|||
path: :root
|
||||
},
|
||||
{
|
||||
label: Report.model_name.human(count: 2),
|
||||
icon: :'journal-text',
|
||||
path: :reports },
|
||||
label: Project.model_name.human(count: 2),
|
||||
icon: :'folder',
|
||||
path: :projects },
|
||||
# {
|
||||
# label: Report.model_name.human(count: 2),
|
||||
# icon: :'journal-text',
|
||||
# path: :reports },
|
||||
{
|
||||
label: I18n.t("backoffice"),
|
||||
icon: :gear,
|
||||
|
|
|
|||
|
|
@ -20,11 +20,6 @@ class HomeController < ApplicationController
|
|||
path: profile_path,
|
||||
active: action_name == "profile"
|
||||
},
|
||||
# {
|
||||
# label: "Passwort ändern",
|
||||
# path: new_password_path,
|
||||
# icon: :lock
|
||||
# },
|
||||
{
|
||||
label: "Logout",
|
||||
icon: :"box-arrow-right",
|
||||
|
|
|
|||
62
app/controllers/projects_controller.rb
Normal file
62
app/controllers/projects_controller.rb
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
class ProjectsController < ApplicationController
|
||||
before_action :set_project, only: %i[ show edit update destroy ]
|
||||
|
||||
# GET /projects
|
||||
def index
|
||||
@projects = Project.all
|
||||
end
|
||||
|
||||
# GET /projects/1
|
||||
def show
|
||||
end
|
||||
|
||||
# GET /projects/new
|
||||
def new
|
||||
@project = Project.new
|
||||
end
|
||||
|
||||
# GET /projects/1/edit
|
||||
def edit
|
||||
end
|
||||
|
||||
# POST /projects
|
||||
def create
|
||||
@project = if params[:copy_from_id]
|
||||
Project.find(params[:copy_from_id]).dup
|
||||
else
|
||||
Project.new(project_params)
|
||||
end
|
||||
|
||||
if @project.save
|
||||
redirect_to @project, notice: "Project was successfully created."
|
||||
else
|
||||
render :new, status: :unprocessable_entity
|
||||
end
|
||||
end
|
||||
|
||||
# PATCH/PUT /projects/1
|
||||
def update
|
||||
if @project.update(project_params)
|
||||
redirect_to @project, notice: "Project was successfully updated.", status: :see_other
|
||||
else
|
||||
render :edit, status: :unprocessable_entity
|
||||
end
|
||||
end
|
||||
|
||||
# DELETE /projects/1
|
||||
def destroy
|
||||
@project.destroy!
|
||||
redirect_to projects_url, notice: "Project was successfully destroyed.", status: :see_other
|
||||
end
|
||||
|
||||
private
|
||||
# Use callbacks to share common setup or constraints between actions.
|
||||
def set_project
|
||||
@project = Project.find(params[:id])
|
||||
end
|
||||
|
||||
# Only allow a list of trusted parameters through.
|
||||
def project_params
|
||||
params.require(:project).permit(:name, :details)
|
||||
end
|
||||
end
|
||||
|
|
@ -1,11 +1,12 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class ReportsController < ApplicationController
|
||||
before_action :set_project, only: %i[index new create]
|
||||
before_action :set_report, only: %i[show edit update destroy work]
|
||||
|
||||
# GET /reports
|
||||
def index
|
||||
@reports = Report.all
|
||||
@reports = @project.reports
|
||||
end
|
||||
|
||||
# GET /reports/1
|
||||
|
|
@ -85,7 +86,7 @@ class ReportsController < ApplicationController
|
|||
|
||||
# GET /reports/new
|
||||
def new
|
||||
@report = Report.new
|
||||
@report = Report.new(project_id: @project.id)
|
||||
end
|
||||
|
||||
# GET /reports/1/edit
|
||||
|
|
@ -93,10 +94,45 @@ class ReportsController < ApplicationController
|
|||
|
||||
# POST /reports
|
||||
def create
|
||||
@report = Report.new(report_params)
|
||||
success = if params[:copy_from_id]
|
||||
original = Report.find(params[:copy_from_id])
|
||||
@report = original.dup
|
||||
@report.pages = original.pages.map do |page|
|
||||
page.dup.tap do |p|
|
||||
p.elements = page.elements.map do |element|
|
||||
element.dup.tap do |e|
|
||||
e.success_criteria = element.success_criteria.map do |sc|
|
||||
csc = sc.dup
|
||||
SuccessCriterion.rich_text_association_names
|
||||
.map { _1.to_s.sub(/^rich_text_/, "") }
|
||||
.each do |a|
|
||||
csc.send("#{a}=", sc.send(a).dup)
|
||||
end
|
||||
csc
|
||||
end
|
||||
e.screenshot = element.screenshot&.dup
|
||||
Element.rich_text_association_names
|
||||
.map { _1.to_s.sub(/^rich_text_/, "") }
|
||||
.each do |a|
|
||||
e.send("#{a}=", element.send(a).dup)
|
||||
end
|
||||
end
|
||||
end
|
||||
Page.rich_text_association_names
|
||||
.map { _1.to_s.sub(/^rich_text_/, "") }
|
||||
.each do |a|
|
||||
p.send("#{a}=", page.send(a).dup)
|
||||
end
|
||||
end
|
||||
end
|
||||
@report.save
|
||||
else
|
||||
@report = Report.new(report_params.merge(project_id: @project.id))
|
||||
@report.save
|
||||
end
|
||||
|
||||
if @report.save
|
||||
redirect_to @report, notice: "Report was successfully created."
|
||||
if success
|
||||
redirect_to @report.reload, notice: "Report was successfully created."
|
||||
else
|
||||
render :new, status: :unprocessable_entity
|
||||
end
|
||||
|
|
@ -114,7 +150,7 @@ class ReportsController < ApplicationController
|
|||
# DELETE /reports/1
|
||||
def destroy
|
||||
@report.destroy!
|
||||
redirect_to reports_url, notice: "Report was successfully destroyed.", status: :see_other
|
||||
redirect_to project_url(@report.project), notice: "Report was successfully destroyed.", status: :see_other
|
||||
end
|
||||
|
||||
def work
|
||||
|
|
@ -130,7 +166,7 @@ class ReportsController < ApplicationController
|
|||
|
||||
# Only allow a list of trusted parameters through.
|
||||
def report_params
|
||||
params.require(:report).permit(:name, :comment, :url)
|
||||
params.require(:report).permit(:name, :comment, :url, :project_id)
|
||||
end
|
||||
|
||||
def filename(report, extension: "html")
|
||||
|
|
@ -140,4 +176,8 @@ class ReportsController < ApplicationController
|
|||
def page_param
|
||||
params[:page_id]
|
||||
end
|
||||
|
||||
def set_project
|
||||
@project = Project.find(params[:project_id])
|
||||
end
|
||||
end
|
||||
|
|
|
|||
2
app/helpers/projects_helper.rb
Normal file
2
app/helpers/projects_helper.rb
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
module ProjectsHelper
|
||||
end
|
||||
|
|
@ -1,7 +1,6 @@
|
|||
// Entry point for the build script in your package.json
|
||||
import "@hotwired/turbo-rails"
|
||||
import "./controllers"
|
||||
import * as bootstrap from "bootstrap"
|
||||
|
||||
import "trix"
|
||||
import "@rails/actiontext"
|
||||
|
|
|
|||
|
|
@ -13,13 +13,13 @@ module PdfDocuments
|
|||
move_down 20
|
||||
@prawn_document.text "#{I18n.l params.report.updated_at.to_date, format: :long}"
|
||||
move_down 40
|
||||
safe_display(params.report.comment) do
|
||||
safe_display(params.report.comment) do
|
||||
rich_text _1
|
||||
move_down 30
|
||||
end
|
||||
|
||||
@prawn_document.font_size(8) do
|
||||
@prawn_document.draw_text("Dokument erstellt am #{Time.current.strftime('%d %B %Y')} um #{Time.current.strftime('%H:%M:%S')}", at: [0, 0])
|
||||
@prawn_document.draw_text("Dokument erstellt am #{Time.current.strftime('%d %B %Y')} um #{Time.current.strftime('%H:%M:%S')}", at: [ 0, 0 ])
|
||||
end
|
||||
@prawn_document.start_new_page
|
||||
@pages = {}
|
||||
|
|
@ -29,9 +29,9 @@ module PdfDocuments
|
|||
without_page_break do
|
||||
heading2 "#{element_index} #{element.title}"
|
||||
@prawn_document.text("<b>Pfad:</b> #{element.page.path}", inline_format: true)
|
||||
safe_display(element.screenshot) do
|
||||
image(_1.variant(:thumbnail), height: 160)
|
||||
move_down(15)
|
||||
safe_display(element.screenshot) do
|
||||
image(_1.variant(:thumbnail), height: 160)
|
||||
move_down(15)
|
||||
end
|
||||
end
|
||||
rich_text element.description
|
||||
|
|
@ -45,10 +45,10 @@ module PdfDocuments
|
|||
|
||||
@prawn_document.start_new_page
|
||||
heading1("Anhang: Richtlinien")
|
||||
params.report.export[:success_criteria].group_by(&:check).sort_by{ |c, _scs| c.external_number }.each do |check, criteria|
|
||||
params.report.export[:success_criteria].group_by(&:check).sort_by { |c, _scs| c.external_number }.each do |check, criteria|
|
||||
heading2(check.display_label)
|
||||
@pages[check] = @prawn_document.page_number
|
||||
{
|
||||
{
|
||||
external_number: { label: "WCAG Nummer" },
|
||||
external_url: { label: "WCAG Link" },
|
||||
conformity_level: { label: "Konformität" },
|
||||
|
|
@ -61,12 +61,12 @@ module PdfDocuments
|
|||
annotation_de: { label: "Anmerkung", rich: true }
|
||||
}.each do |attribute, options|
|
||||
v = check.send(attribute)
|
||||
safe_display(v) do
|
||||
safe_display(v) do
|
||||
text("<b>#{options[:label]}</b>", inline_format: true)
|
||||
if options[:rich]
|
||||
rich_text(_1)
|
||||
else
|
||||
text(_1)
|
||||
else
|
||||
text(_1)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -79,7 +79,7 @@ module PdfDocuments
|
|||
rich_text(%Q(
|
||||
<span>#{cat.name}</span>
|
||||
<ul>
|
||||
#{links.map{ "<li><a href='#{_1.url}'>#{_1.text}</a></li>" }.join() }
|
||||
#{links.map { "<li><a href='#{_1.url}'>#{_1.text}</a></li>" }.join() }
|
||||
</ul>
|
||||
))
|
||||
end
|
||||
|
|
@ -101,10 +101,10 @@ module PdfDocuments
|
|||
|
||||
@prawn_document.repeat(2..) do
|
||||
@prawn_document.text_box "<b>#{params.report.name}</b>", at: [ 50, 777 ], inline_format: true, width: 300
|
||||
@prawn_document.bounding_box([0, 766], width: 532) do
|
||||
@prawn_document.bounding_box([ 0, 766 ], width: 532) do
|
||||
hr
|
||||
end
|
||||
@prawn_document.bounding_box([0, 796], width: 200, height: 200) do
|
||||
@prawn_document.bounding_box([ 0, 796 ], width: 200, height: 200) do
|
||||
logo
|
||||
end
|
||||
end
|
||||
|
|
@ -120,7 +120,7 @@ module PdfDocuments
|
|||
end
|
||||
end
|
||||
section("Anhang: Richtlinien") do
|
||||
x.report.export[:success_criteria].group_by(&:check).sort_by{ |c, _scs| c.external_number }.each do |check, _criteria|
|
||||
x.report.export[:success_criteria].group_by(&:check).sort_by { |c, _scs| c.external_number }.each do |check, _criteria|
|
||||
page(title: check.display_label, destination: p[check])
|
||||
end
|
||||
end
|
||||
|
|
|
|||
7
app/models/project.rb
Normal file
7
app/models/project.rb
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
class Project < ApplicationRecord
|
||||
has_many :reports, dependent: :restrict_with_error
|
||||
|
||||
has_rich_text :details
|
||||
|
||||
scope :current, -> { where("updated_at > ?", 1.month.ago) }
|
||||
end
|
||||
|
|
@ -1,6 +1,8 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class Report < ApplicationRecord
|
||||
belongs_to :project, touch: true
|
||||
|
||||
has_many :pages, -> { order(:position) }, dependent: :destroy
|
||||
has_many :elements, through: :pages, dependent: :destroy
|
||||
has_many :success_criteria, through: :elements, dependent: :destroy
|
||||
|
|
|
|||
|
|
@ -1,30 +1,37 @@
|
|||
h1 a11ydive
|
||||
h2 Dashboard
|
||||
h1 Dashboard
|
||||
|
||||
- if Report.any?
|
||||
h3 Zuletzt bearbeitete Prüfberichte
|
||||
ul
|
||||
- Report.all.order(updated_at: :desc).limit(3).each do |r|
|
||||
li = link_to(r.name, r)
|
||||
.row
|
||||
.col-md-6
|
||||
- if Project.current.any?
|
||||
h2
|
||||
i.bi.bi-folder>
|
||||
'Aktuelle Projekte
|
||||
ul
|
||||
- Project.current.order(updated_at: :desc).each do |p|
|
||||
li = link_to(p.name, p)
|
||||
|
||||
p
|
||||
i.bi.bi-journal-text
|
||||
=< Report.count
|
||||
=< link_to Report.model_name.human(count: Report.count), :reports
|
||||
- if Report.any?
|
||||
h2
|
||||
i.bi.bi-journal-text>
|
||||
'Zuletzt bearbeitete Prüfberichte
|
||||
ul
|
||||
- Report.all.order(updated_at: :desc).limit(3).each do |r|
|
||||
li = link_to(r.name, r)
|
||||
|
||||
h3 Hotkeys
|
||||
p Auf der Bericht-Ausfüllen Seite können folgende Shortcuts verwendet werden:
|
||||
dl
|
||||
dt t
|
||||
dd Springe zum Anfang des Contents (Skip-Link, kann auf allen Seiten verwendet werden)
|
||||
dt a
|
||||
dd Alle auf
|
||||
dt s
|
||||
dd Alle zu
|
||||
dt b
|
||||
dd Baum
|
||||
dt n
|
||||
dd Notizen
|
||||
dt e
|
||||
dd Springe zu erstem Check
|
||||
|
||||
.col-md-6
|
||||
h2 Hotkeys
|
||||
p Auf der Bericht-Ausfüllen Seite können folgende Shortcuts verwendet werden:
|
||||
dl
|
||||
dt t
|
||||
dd Springe zum Anfang des Contents (Skip-Link, kann auf allen Seiten verwendet werden)
|
||||
dt a
|
||||
dd Alle auf
|
||||
dt s
|
||||
dd Alle zu
|
||||
dt b
|
||||
dd Baum
|
||||
dt n
|
||||
dd Notizen
|
||||
dt e
|
||||
dd Springe zu erstem Check
|
||||
|
||||
|
|
|
|||
5
app/views/projects/_form.html.erb
Normal file
5
app/views/projects/_form.html.erb
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
<%= bootstrap_form_with(model: project) do |form| %>
|
||||
<%= form.text_field :name %>
|
||||
<%= form.rich_text_area :details %>
|
||||
<%= form.submit %>
|
||||
<% end %>
|
||||
20
app/views/projects/_project.html.slim
Normal file
20
app/views/projects/_project.html.slim
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
.project id=dom_id(project)
|
||||
p
|
||||
strong Name:
|
||||
= project.name
|
||||
p
|
||||
strong Details:
|
||||
= project.details
|
||||
p
|
||||
strong Berichte:
|
||||
ul.ps-0
|
||||
- project.reports.each do
|
||||
li.d-flex.ps-0
|
||||
=< "ID #{_1.id}: #{l(_1.created_at,format: :short)} #{_1.name}"
|
||||
= link_to(_1, class: "btn btn-sm btn-link-secondary") do
|
||||
i.bi.bi-folder-symlink
|
||||
= button_to(project_reports_path(project), class: "btn btn-sm btn-link-secondary", params: { copy_from_id: _1.id }) do
|
||||
i.bi.bi-copy
|
||||
p
|
||||
= link_to(new_project_report_path(project), class: "btn btn-secondary") do
|
||||
i.bi.bi-plus-lg
|
||||
2
app/views/projects/_project.json.jbuilder
Normal file
2
app/views/projects/_project.json.jbuilder
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
json.extract! project, :id, :name, :created_at, :updated_at
|
||||
json.url project_url(project, format: :json)
|
||||
8
app/views/projects/edit.html.erb
Normal file
8
app/views/projects/edit.html.erb
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
<h1><%= t("scaffold.pagetitle_edit", model: Project.model_name.human) %></h1>
|
||||
|
||||
<%= render "form", project: @project %>
|
||||
|
||||
<div class="action-row">
|
||||
<%= link_to t("scaffold.link_show", model: Project.model_name.human), @project %>
|
||||
<%= link_to t("scaffold.link_index", model: Project.model_name.human(count: 2)), projects_path %>
|
||||
</div>
|
||||
25
app/views/projects/index.html.erb
Normal file
25
app/views/projects/index.html.erb
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
<h1><%= t("scaffold.pagetitle_index", model: Project.model_name.human(count: 2)) %></h1>
|
||||
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th><%= Project.human_attribute_name(:id) %></th>
|
||||
|
||||
<th><%= Project.human_attribute_name(:name) %></th>
|
||||
|
||||
</thead>
|
||||
<tbody>
|
||||
<% @projects.each do |project| %>
|
||||
<tr>
|
||||
<td><%= link_to(project.id, url_for(project)) %></td>
|
||||
|
||||
<td><%= link_to(project.name, url_for(project)) %></td>
|
||||
|
||||
</tr>
|
||||
<% end %>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<div class="action-row">
|
||||
<%= link_to t("scaffold.link_new", model: Project.model_name.human), new_project_path %>
|
||||
</div>
|
||||
1
app/views/projects/index.json.jbuilder
Normal file
1
app/views/projects/index.json.jbuilder
Normal file
|
|
@ -0,0 +1 @@
|
|||
json.array! @projects, partial: "projects/project", as: :project
|
||||
7
app/views/projects/new.html.erb
Normal file
7
app/views/projects/new.html.erb
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
<h1><%= t("scaffold.pagetitle_new", model: Project.model_name.human) %></h1>
|
||||
|
||||
<%= render "form", project: @project %>
|
||||
|
||||
<div class="action-row">
|
||||
<%= link_to t("scaffold.link_index", model: Project.model_name.human(count: 2)), projects_path %>
|
||||
</div>
|
||||
9
app/views/projects/show.html.erb
Normal file
9
app/views/projects/show.html.erb
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
<h1><%= t("scaffold.pagetitle_show", model: @project.class.model_name.human) %></h1>
|
||||
|
||||
<%= render @project %>
|
||||
|
||||
<div class="action-row">
|
||||
<%= link_to t("scaffold.link_edit", model: @project.model_name.human), edit_project_path(@project) %>
|
||||
<%= link_to t("scaffold.link_index", model: @project.model_name.human(count: 2)), projects_path %>
|
||||
<%= button_to t("scaffold.link_destroy", model: @project.model_name.human), @project, method: :delete, class: "btn btn-outline-danger" if @project.reports.none? %>
|
||||
</div>
|
||||
1
app/views/projects/show.json.jbuilder
Normal file
1
app/views/projects/show.json.jbuilder
Normal file
|
|
@ -0,0 +1 @@
|
|||
json.partial! "projects/project", project: @project
|
||||
|
|
@ -1,4 +1,5 @@
|
|||
<%= bootstrap_form_with(model: report) do |form| %>
|
||||
<%= bootstrap_form_with(model: report.persisted? ? report : [@project, report]) do |form| %>
|
||||
<%= form.collection_select :project_id, Project.all, :id, :name, include_blank: true %>
|
||||
<%= form.text_field :name %>
|
||||
<%= form.text_field :url %>
|
||||
<%= form.rich_text_area :comment %>
|
||||
|
|
|
|||
|
|
@ -4,5 +4,5 @@
|
|||
|
||||
<div class="action-row">
|
||||
<%= link_to t("scaffold.link_show", model: Report.model_name.human), @report %>
|
||||
<%= link_to t("scaffold.link_index", model: Report.model_name.human(count: 2)), reports_path %>
|
||||
<%= link_to t("scaffold.link_index", model: Report.model_name.human(count: 2)), project_reports_path(@report.project) %>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -27,5 +27,5 @@
|
|||
</table>
|
||||
|
||||
<div class="action-row">
|
||||
<%= link_to t("scaffold.link_new", model: Report.model_name.human), new_report_path %>
|
||||
<%= link_to t("scaffold.link_new", model: Report.model_name.human), new_project_report_path(@project) %>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -3,5 +3,5 @@
|
|||
<%= render "form", report: @report %>
|
||||
|
||||
<div class="action-row">
|
||||
<%= link_to t("scaffold.link_index", model: Report.model_name.human(count: 2)), reports_path %>
|
||||
<%= link_to t("scaffold.link_index", model: Report.model_name.human(count: 2)), project_reports_path(@project) %>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -3,11 +3,12 @@
|
|||
i.bi.bi-journal-text.me-2
|
||||
= @report.name
|
||||
div
|
||||
small
|
||||
'Erstellt am
|
||||
= l(@report.created_at, format: :short)
|
||||
', zuletzt bearbeitet am
|
||||
= l(@report.updated_at, format: :short)
|
||||
small = "Erstellt am #{l(@report.created_at, format: :short)}, zuletzt bearbeitet am #{l(@report.updated_at, format: :short)}"
|
||||
|
||||
p
|
||||
i.bi.bi-folder
|
||||
strong< = link_to(@report.project.name, @report.project)
|
||||
|
||||
.smb-4.lead.mb-5
|
||||
= @report.comment || tag.i("leer")
|
||||
- if @current_page
|
||||
|
|
@ -26,7 +27,6 @@ div
|
|||
.btn-group.me-3.visually-hidden
|
||||
= link_to("Alle zu [s]", "#", data: { action: "click->details-list#closeAll", controller: :hotkey, hotkey: "s" }, class: "btn btn-outline-secondary")
|
||||
= link_to("Alle auf [a]", "#", data: { action: "click->details-list#openAll", controller: :hotkey, hotkey: "a" }, class: "btn btn-outline-secondary")
|
||||
/= button_to(tag.i(class: "bi bi-trash"), page_path(@current_page), method: :delete, class: "btn btn-outline-danger", form: {data: { turbo_confirm: "Bist du sicher?" }})
|
||||
.row
|
||||
.col-lg-3.col-md-4.col-sm-12
|
||||
.page_nav.sticky-top
|
||||
|
|
@ -63,5 +63,5 @@ div
|
|||
| ODT
|
||||
.action-row
|
||||
= link_to t("scaffold.link_edit", model: @report.model_name.human), edit_report_path(@report)
|
||||
= link_to t("scaffold.link_index", model: @report.model_name.human(count: 2)), reports_path
|
||||
= link_to t("scaffold.link_index", model: @report.model_name.human(count: 2)), project_reports_path(@report.project)
|
||||
= button_to t("scaffold.link_destroy", model: @report.model_name.human), @report, method: :delete, class: "btn btn-outline-danger", data: { turbo_confirm: "Bist du sicher?"}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue