From d1294c2fc4b6f1021935aee8da85d4c59c4ab763 Mon Sep 17 00:00:00 2001 From: david Date: Sun, 3 Nov 2024 21:58:25 +0100 Subject: [PATCH] Refactorings and gui improvements --- app/assets/stylesheets/layout.scss | 70 + app/controllers/checks_controller.rb | 4 +- app/controllers/elements_controller.rb | 2 +- app/controllers/pages_controller.rb | 2 +- .../success_criteria_controller.rb | 2 +- app/helpers/application_helper.rb | 4 + .../controllers/unsaved_changes_controller.js | 39 +- app/models/check.rb | 16 +- app/models/checklist_entry.rb | 1 - app/models/element.rb | 6 +- app/views/checklist_entries/_form.html.erb | 2 +- app/views/checklists/_form.html.erb_ | 5 - app/views/checklists/_form.html.slim | 2 +- app/views/checks/_form.html.slim | 13 +- app/views/elements/_element.html.erb | 1 + .../_new_success_criterion_button.html.erb | 4 +- app/views/elements/create.turbo_stream.erb | 2 - app/views/elements/create.turbo_stream.slim | 5 + app/views/elements/index.html.erb | 15 +- app/views/layouts/_application.html.erb | 30 + app/views/layouts/application.html.slim | 5 +- app/views/pages/_form.html.slim | 2 +- app/views/pages/_notes.html.slim | 7 +- app/views/pages/_page.html.erb | 2 +- app/views/pages/show.html.slim | 3 + app/views/reports/_new_page_button.html.erb | 2 +- app/views/reports/_page_nav.html.slim | 26 + app/views/reports/show.html.slim | 36 +- app/views/success_criteria/_form.html.erb | 2 +- app/views/success_criteria/new.html.slim | 2 +- config/locales/activerecord.yml | 11 + ...47_add_external_numbers_field_to_checks.rb | 33 + db/schema.rb | 6 +- public/404.html | 42626 +--------------- public/422.html | 42624 +-------------- public/500.html | 42624 +-------------- test/controllers/elements_controller_test.rb | 13 +- test/controllers/pages_controller_test.rb | 27 +- .../success_criteria_controller_test.rb | 14 +- test/fixtures/checks.yml | 9 +- test/fixtures/elements.yml | 10 +- test/fixtures/success_criteria.yml | 4 + test/system/elements_test.rb | 7 +- test/system/pages_test.rb | 38 +- test/system/reports_test.rb | 2 +- test/system/success_criteria_test.rb | 18 +- 46 files changed, 358 insertions(+), 128020 deletions(-) delete mode 100644 app/views/checklists/_form.html.erb_ delete mode 100644 app/views/elements/create.turbo_stream.erb create mode 100644 app/views/elements/create.turbo_stream.slim create mode 100644 app/views/layouts/_application.html.erb create mode 100644 app/views/reports/_page_nav.html.slim create mode 100644 db/migrate/20241101125547_add_external_numbers_field_to_checks.rb diff --git a/app/assets/stylesheets/layout.scss b/app/assets/stylesheets/layout.scss index a8c4146..4cf0b31 100644 --- a/app/assets/stylesheets/layout.scss +++ b/app/assets/stylesheets/layout.scss @@ -65,4 +65,74 @@ .highlight-when-nonempty:not([value=""]) { @extend .border-primary +} + +@mixin details-icon($color) { + background: url('data:image/svg+xml;utf8,'); + background-size: cover; +} + +.page_nav nav ul { + padding-left: 0; + list-style-type: none; + line-height: 2rem; + + a { + color: var(--bs-text); + text-decoration: none; + } + + a:hover { + text-decoration: underline; + } + + ul { + // padding-left: 1.5rem; + } +} + + +summary, +summary a { + font-size: 1rem; + font-style: normal; +} + +summary { + display: flex; + line-height: 2rem; +} + +summary::before { + @include details-icon(to-rgb(map-get($theme-colors, "dark"))); + content: ''; + float: inline-end; + width: 0.7rem; + height: 1rem; + margin-top: 0.5rem; + margin-right: 6px; + // background: url('chevron-right.svg'); + // background-size: cover; + margin-left: 0; + transition: 0.2s; +} + +@include color-mode(dark) { + summary::before { + @include details-icon(to-rgb(map-get($theme-colors, "light"))); + // content: ''; + // float: inline-end; + // width: 0.7rem; + // height: 1rem; + // margin-top: 0.5rem; + // margin-right: 6px; + // // background: url('chevron-right.svg'); + // // background-size: cover; + // margin-left: 0; + // transition: 0.2s; + } +} + +details[open]>summary::before { + transform: rotate(90deg); } \ No newline at end of file diff --git a/app/controllers/checks_controller.rb b/app/controllers/checks_controller.rb index 1a70bf5..551e7c2 100644 --- a/app/controllers/checks_controller.rb +++ b/app/controllers/checks_controller.rb @@ -7,7 +7,7 @@ class ChecksController < ApplicationController # GET /checks or /checks.json def index - @pagy, @checks = pagy(Check.filter_by(filter_params).order(:external_number)) + @pagy, @checks = pagy(Check.filter_by(filter_params).order(:external_number_1, :external_number_2, :external_number_3)) end # GET /checks/1 or /checks/1.json @@ -69,7 +69,7 @@ class ChecksController < ApplicationController end def filter_params - @filter_params ||= params.permit(filter: [ :s, priority: [], conformity_level: [], standard_ids: [], principle_id: [], target_disabilities: []])[:filter] || {} + @filter_params ||= params.permit(filter: [ :s, priority: [], conformity_level: [], standard_ids: [], principle_id: [], target_disabilities: [] ])[:filter] || {} end private diff --git a/app/controllers/elements_controller.rb b/app/controllers/elements_controller.rb index 7574183..2fe89b5 100644 --- a/app/controllers/elements_controller.rb +++ b/app/controllers/elements_controller.rb @@ -58,7 +58,7 @@ class ElementsController < ApplicationController # DELETE /elements/1 def destroy @element.destroy! - redirect_to elements_url, notice: "Element was successfully destroyed.", status: :see_other + redirect_to page_elements_url(@element.page), notice: "Element was successfully destroyed.", status: :see_other end private diff --git a/app/controllers/pages_controller.rb b/app/controllers/pages_controller.rb index 4bbee18..2be9f8c 100644 --- a/app/controllers/pages_controller.rb +++ b/app/controllers/pages_controller.rb @@ -44,7 +44,7 @@ class PagesController < ApplicationController # DELETE /pages/1 def destroy @page.destroy! - redirect_to pages_url, notice: "Page was successfully destroyed.", status: :see_other + redirect_to report_pages_url(@page.report), notice: "Page was successfully destroyed.", status: :see_other end private diff --git a/app/controllers/success_criteria_controller.rb b/app/controllers/success_criteria_controller.rb index 535de27..2233ac7 100644 --- a/app/controllers/success_criteria_controller.rb +++ b/app/controllers/success_criteria_controller.rb @@ -60,7 +60,7 @@ class SuccessCriteriaController < ApplicationController @success_criterion.destroy! respond_to do |format| format.html do - redirect_to success_criteria_url, notice: "Erfolgskriterium was successfully destroyed.", status: :see_other + redirect_to element_success_criteria_url(@success_criterion.element), notice: "Erfolgskriterium was successfully destroyed.", status: :see_other end format.turbo_stream end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 6bd9db2..de268bb 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -24,4 +24,8 @@ module ApplicationHelper yield(value) end + + def current_page_displayed(page) + @current_page&.id == page.id ? "open" : nil + end end diff --git a/app/javascript/controllers/unsaved_changes_controller.js b/app/javascript/controllers/unsaved_changes_controller.js index 29b198d..15a70fb 100644 --- a/app/javascript/controllers/unsaved_changes_controller.js +++ b/app/javascript/controllers/unsaved_changes_controller.js @@ -7,18 +7,21 @@ export default class extends Controller { static targets = ["cancel"] initialState = null + isSubmitted = false connect() { + console.log("connect unsaved-changes") this.initialState = this.formState() - console.log(this.cancelTargets) + + console.log("usaved-changes connect ", this.cancelTargets) window.addEventListener("beforeunload", (event) => this.leavingPage(event)) document.addEventListener('turbo:before-visit', (e) => this.leavingPage(e)) - this.element.addEventListener("submit", (_) => this.initialState = null) - this.cancelTargets.forEach(element => { - console.log(element) - element.addEventListener("onclick", (_) => this.initialState = null) - }); + this.element.addEventListener("submit", (_) => this.isSubmitted = true) + // this.cancelTargets.forEach(element => { + // console.log(element) + // element.addEventListener("onclick", (_) => this.reset()) + // }); } formState() { @@ -27,21 +30,23 @@ export default class extends Controller { .sort(x => x[0])) } + reset() { + console.log("reset") + this.initialState = this.formState() + } + + hasChanged() { + console.log("hasChanged result", this.initialState != this.formState()) + return this.formState() != this.initialState + } + leavingPage(event) { console.log(event.type) - if (this.initialState == null || this.initialState == this.formState()) { + if (this.isSubmitted || !this.hasChanged()) { return } - if (event.type == "turbo:before-visit") { - if (!window.confirm(LEAVE_ALERT)) { - event.preventDefault() - } else { - this.initialState = null - } - } else { - this.initialState = null - event.returnValue = LEAVE_ALERT; - return event.returnValue; + if (!window.confirm(LEAVE_ALERT)) { + event.preventDefault() } } } \ No newline at end of file diff --git a/app/models/check.rb b/app/models/check.rb index 76545a8..a201aa8 100644 --- a/app/models/check.rb +++ b/app/models/check.rb @@ -76,7 +76,7 @@ class Check < ApplicationRecord relation = relation.joins(:standards).where(standards: { id: value }) when "target_disabilities" cond = String.new - value.intersection(%w(auditory visual physical cognitive)).each_with_index do |v, i| + value.intersection(%w[auditory visual physical cognitive]).each_with_index do |v, i| if i == 0 cond << "checks.#{v} = 1" else @@ -112,10 +112,10 @@ class Check < ApplicationRecord end def display_applicabilities - %i[applicable_to_analogue - applicable_to_app - applicable_to_document - applicable_to_non_web + %i[applicable_to_analogue + applicable_to_app + applicable_to_document + applicable_to_non_web applicable_to_web].select { |a| send(:"#{a}?") } .map { |a| I18n.t("applicability.#{a}") } .sort_by(&:downcase) @@ -123,6 +123,10 @@ class Check < ApplicationRecord end def display_label - [external_number, name_de].compact_blank.join(" ") + [ external_number, name_de ].compact_blank.join(" ") + end + + def external_number + [ external_number_1, external_number_2, external_number_3 ].compact_blank.join(".") end end diff --git a/app/models/checklist_entry.rb b/app/models/checklist_entry.rb index 380f673..2cfe0c6 100644 --- a/app/models/checklist_entry.rb +++ b/app/models/checklist_entry.rb @@ -5,7 +5,6 @@ class ChecklistEntry < ApplicationRecord belongs_to :check before_validation :set_position - before_create :update_positions before_update :update_positions, if: :position_changed? def set_position diff --git a/app/models/element.rb b/app/models/element.rb index 807c4b6..5d86afe 100644 --- a/app/models/element.rb +++ b/app/models/element.rb @@ -18,7 +18,7 @@ class Element < ApplicationRecord def level return nil return nil unless success_criteria.all(&:result) - + element min_failed = success_criteria.select(&:failed?).map(&:level).min possible_levels = success_criteria.select(&:passed?).map(&:level).uniq @@ -37,4 +37,8 @@ class Element < ApplicationRecord Rails.logger.debug("element: position #{position}") self.position ||= (page.elements.pluck(:position).max || 0) + 1 end + + def number + "#{page.position}.#{position}" + end end diff --git a/app/views/checklist_entries/_form.html.erb b/app/views/checklist_entries/_form.html.erb index 8ff01f5..ec18544 100644 --- a/app/views/checklist_entries/_form.html.erb +++ b/app/views/checklist_entries/_form.html.erb @@ -3,7 +3,7 @@ <%= link_to "Abbrechen", checklist_entry.persisted? ? checklist_entry : checklist_entry.checklist, class: "btn btn-outline-secondary float-end", data: { turbo_frame: "checklist_entries" } %> <%= form.submit class: "btn btn-secondary float-end me-2" %> <%= form.hidden_field :checklist_id %> - <%= form.collection_select :check_id, Check.all.order(:external_number), :id, :display_label %> + <%= form.collection_select :check_id, Check.all.order(:external_number_1, :external_number_2, :external_number_3), :id, :display_label %> <%# form.number_field :position %> <% end %> \ No newline at end of file diff --git a/app/views/checklists/_form.html.erb_ b/app/views/checklists/_form.html.erb_ deleted file mode 100644 index bcce199..0000000 --- a/app/views/checklists/_form.html.erb_ +++ /dev/null @@ -1,5 +0,0 @@ -<%= bootstrap_form_with(model: checklist, data: { controller: "unsaved-changes" }) do |form| %> - <%= form.text_field :name %> - <%= form.rich_text_area :description_html, rows: 12 %> - <%= form.submit %> -<% end %> \ No newline at end of file diff --git a/app/views/checklists/_form.html.slim b/app/views/checklists/_form.html.slim index 59cc33c..e2ed02e 100644 --- a/app/views/checklists/_form.html.slim +++ b/app/views/checklists/_form.html.slim @@ -1,5 +1,5 @@ = bootstrap_form_with(model: checklist, data: { controller: "unsaved-changes" }) do |form| = form.text_field :name = form.rich_text_area :description_html, rows: 12 - = form.collection_check_boxes :check_ids, Check.all.order(:external_number), :id, :display_label + = form.collection_check_boxes :check_ids, Check.all.order(:external_number_1, :external_number_2, :external_number_3), :id, :display_label = form.submit diff --git a/app/views/checks/_form.html.slim b/app/views/checks/_form.html.slim index 77f69d6..53e4bb7 100644 --- a/app/views/checks/_form.html.slim +++ b/app/views/checks/_form.html.slim @@ -18,8 +18,17 @@ .col-md-2 = form.check_box d, label: t("applicability.#{d}").capitalize - h2 Richtlinie - = form.text_field :external_number + h2 Erfolgskriterium + .d-flex.justify-content-start + div style="width:60px" + = form.number_field :external_number_1, hide_label: true + div.px-1.mt-3 style="" = "." + div style="width:60px" + = form.number_field :external_number_2, hide_label: true + div.px-1.mt-3 style="" = "." + div style="width:60px" + = form.number_field :external_number_3, hide_label: true + = form.text_field :external_url = form.select :conformity_level, Check.conformity_levels.keys, include_blank: true = multilang_form_field(form, :conformity_notice, as: :rich_text_area) diff --git a/app/views/elements/_element.html.erb b/app/views/elements/_element.html.erb index 7ae81e7..566dd7d 100644 --- a/app/views/elements/_element.html.erb +++ b/app/views/elements/_element.html.erb @@ -1,4 +1,5 @@
+ <%= turbo_frame_tag dom_id(element, :frame) do %>

diff --git a/app/views/elements/_new_success_criterion_button.html.erb b/app/views/elements/_new_success_criterion_button.html.erb index 04607fc..49da718 100644 --- a/app/views/elements/_new_success_criterion_button.html.erb +++ b/app/views/elements/_new_success_criterion_button.html.erb @@ -1,3 +1,3 @@ -<%= link_to "#{tag.i(class: "bi bi-plus-lg")} Neue Checkliste".html_safe, new_from_checklist_element_success_criteria_path(element), class: "btn btn-primary" %> +<%= link_to "#{tag.i(class: "bi bi-plus-lg")} Checkliste".html_safe, new_from_checklist_element_success_criteria_path(element), class: "btn btn-primary" %> -<%= link_to "#{tag.i(class: "bi bi-plus-lg")} Neues Erfolgskriterium".html_safe, new_element_success_criterion_path(element), class: "btn btn-primary" %> +<%= link_to "#{tag.i(class: "bi bi-plus-lg")} Erfolgskriterium".html_safe, new_element_success_criterion_path(element), class: "btn btn-secondary" %> diff --git a/app/views/elements/create.turbo_stream.erb b/app/views/elements/create.turbo_stream.erb deleted file mode 100644 index a1781cf..0000000 --- a/app/views/elements/create.turbo_stream.erb +++ /dev/null @@ -1,2 +0,0 @@ -<%= turbo_stream.update "new_element_frame", partial: "pages/new_element_button", locals: { page: @element.page } %> -<%= turbo_stream.append "element_list", @element %> \ No newline at end of file diff --git a/app/views/elements/create.turbo_stream.slim b/app/views/elements/create.turbo_stream.slim new file mode 100644 index 0000000..e45d919 --- /dev/null +++ b/app/views/elements/create.turbo_stream.slim @@ -0,0 +1,5 @@ += turbo_stream.update "new_element_frame", partial: "pages/new_element_button", locals: { page: @element.page } += turbo_stream.append "element_list", @element += turbo_stream.append dom_id(@element.page, :page_nav_elements) do + i.bi.bi-boxes.me-1 + = link_to("#{@element.number} #{@element.title}", "##{dom_id(@element)}", data: { "turbo": false }) \ No newline at end of file diff --git a/app/views/elements/index.html.erb b/app/views/elements/index.html.erb index c8f8061..806b3b9 100644 --- a/app/views/elements/index.html.erb +++ b/app/views/elements/index.html.erb @@ -5,33 +5,24 @@ <%= Element.human_attribute_name(:id) %> - <%= Element.human_attribute_name(:report_id) %> - - <%= Element.human_attribute_name(:path) %> + <%= Element.human_attribute_name(:page_id) %> <%= Element.human_attribute_name(:title) %> - - <%= Element.human_attribute_name(:description_html) %> - <% @elements.each do |element| %> <%= link_to(element.id, url_for(element)) %> - <%= link_to(element.report_id, url_for(element)) %> - - <%= link_to(element.path, url_for(element)) %> + <%= link_to(element.page_id, url_for(element)) %> <%= link_to(element.title, url_for(element)) %> - <%= link_to(truncate(element.description_html&.to_plain_text), url_for(element)) %> - <% end %>
- <%= link_to t("scaffold.link_new", model: Element.model_name.human), new_element_path %> + <%= link_to t("scaffold.link_new", model: Element.model_name.human), new_page_element_path(@page) %>
\ No newline at end of file diff --git a/app/views/layouts/_application.html.erb b/app/views/layouts/_application.html.erb new file mode 100644 index 0000000..0e4a2de --- /dev/null +++ b/app/views/layouts/_application.html.erb @@ -0,0 +1,30 @@ + +" data-controller="set-theme"> + + a11ydive + + + <%= csrf_meta_tags %> + <%= csp_meta_tag %> + + <%= stylesheet_link_tag "application", "data-turbo-track": "reload" %> + <%= javascript_include_tag "application", "data-turbo-track": "reload", type: "module" %> + + + + <%= render partial: "layouts/navigation" %> +
+
+ <%= render partial: "layouts/sidebar" %> +
"> +
+
+ <%= yield %> +
+
+
+
+
+