Added projects
Some checks failed
/ Run tests (push) Failing after 2m3s
/ Run system tests (push) Failing after 2m17s
/ Build, push and deploy image (push) Has been skipped

This commit is contained in:
david 2024-11-24 22:08:36 +01:00
parent 0964187f22
commit 8b4ffb83ec
37 changed files with 470 additions and 1935 deletions

View file

@ -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,

View file

@ -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",

View 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

View file

@ -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

View file

@ -0,0 +1,2 @@
module ProjectsHelper
end

View file

@ -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"

View file

@ -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
View 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

View file

@ -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

View file

@ -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

View file

@ -0,0 +1,5 @@
<%= bootstrap_form_with(model: project) do |form| %>
<%= form.text_field :name %>
<%= form.rich_text_area :details %>
<%= form.submit %>
<% end %>

View 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

View file

@ -0,0 +1,2 @@
json.extract! project, :id, :name, :created_at, :updated_at
json.url project_url(project, format: :json)

View 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>

View 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>

View file

@ -0,0 +1 @@
json.array! @projects, partial: "projects/project", as: :project

View 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>

View 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>

View file

@ -0,0 +1 @@
json.partial! "projects/project", project: @project

View file

@ -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 %>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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?"}