From 87841876b7fa2fdc9cee77cc465fa6e8db9fc417 Mon Sep 17 00:00:00 2001 From: Zog Date: Fri, 12 Jan 2018 11:31:14 +0100 Subject: Refs #5571 @0.25h; Let the user select the number of items per page on ReferentialVehicleJourneys#index --- app/assets/stylesheets/components/_forms.sass | 4 ++++ app/controllers/referential_vehicle_journeys_controller.rb | 2 +- app/views/referential_vehicle_journeys/_filters.html.slim | 3 +++ config/locales/simple_form.en.yml | 1 + config/locales/simple_form.fr.yml | 1 + 5 files changed, 10 insertions(+), 1 deletion(-) diff --git a/app/assets/stylesheets/components/_forms.sass b/app/assets/stylesheets/components/_forms.sass index b7f720963..1f0d2f59b 100644 --- a/app/assets/stylesheets/components/_forms.sass +++ b/app/assets/stylesheets/components/_forms.sass @@ -444,6 +444,10 @@ table, .table margin: 0 min-height: 41px padding: 5px 15px + &.per-page-select + padding-top: 10px + .selected + font-weight: bold .control-label font-weight: 700 diff --git a/app/controllers/referential_vehicle_journeys_controller.rb b/app/controllers/referential_vehicle_journeys_controller.rb index f93de29cc..89b3703a0 100644 --- a/app/controllers/referential_vehicle_journeys_controller.rb +++ b/app/controllers/referential_vehicle_journeys_controller.rb @@ -13,7 +13,7 @@ class ReferentialVehicleJourneysController < ChouetteController @q ||= end_of_association_chain @q = @q.with_stop_area_ids(params[:q][:stop_area_ids]) if params[:q] && params[:q][:stop_area_ids] @q = @q.ransack(params[:q]) - @vehicle_journeys ||= @q.result.order(:published_journey_name).includes(:vehicle_journey_at_stops).paginate page: params[:page], per_page: 10 + @vehicle_journeys ||= @q.result.order(:published_journey_name).includes(:vehicle_journey_at_stops).paginate page: params[:page], per_page: params[:per_page] || 10 @all_companies = Chouette::Company.where("id IN (#{@referential.vehicle_journeys.select(:company_id).to_sql})").distinct @all_stop_areas = Chouette::StopArea.where("id IN (#{@referential.vehicle_journeys.joins(:stop_areas).select("stop_areas.id").to_sql})").distinct end diff --git a/app/views/referential_vehicle_journeys/_filters.html.slim b/app/views/referential_vehicle_journeys/_filters.html.slim index 609927615..7c5a63e25 100644 --- a/app/views/referential_vehicle_journeys/_filters.html.slim +++ b/app/views/referential_vehicle_journeys/_filters.html.slim @@ -6,6 +6,9 @@ button.btn.btn-default#search-btn type='submit' span.fa.fa-search .ffg-row + .form-group.per-page-select + = I18n.t("simple_form.per_page") + = %w(10 50 100).each_with_index.map{ |v, i| (params[:per_page] == v || params[:per_page].nil? && i == 0) ? "#{v}" : link_to(v, referential_vehicle_journeys_path(@referential, q: params[:q], per_page: v)) }.join(' - ').html_safe .form-group.togglable = f.label Chouette::VehicleJourney.human_attribute_name(:company), required: false, class: 'control-label' = f.input :company_id_eq_any, collection: @all_companies.select(:id, :name).order(name: :asc), as: :check_boxes, label: false, label_method: lambda{|l| ("" + l.name + "").html_safe}, required: false, wrapper_html: { class: 'checkbox_list'} diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index ad722312e..ed4ad2e95 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -1,5 +1,6 @@ en: simple_form: + "per_page": "Per page: " "yes": 'Yes' "no": 'No' from: 'From' diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml index cd5dd1fbe..a1868eef7 100644 --- a/config/locales/simple_form.fr.yml +++ b/config/locales/simple_form.fr.yml @@ -1,5 +1,6 @@ fr: simple_form: + "per_page": "Afficher par: " "yes": 'Oui' "no": 'Non' from: 'Du' -- cgit v1.2.3 From 865e58859cb83da4e36d8502fc778d383c756c26 Mon Sep 17 00:00:00 2001 From: Zog Date: Mon, 22 Jan 2018 11:05:09 +0100 Subject: Refs #5647; Scope CustomField validations on workgroup --- app/models/custom_field.rb | 5 +++-- spec/models/custom_field_spec.rb | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/app/models/custom_field.rb b/app/models/custom_field.rb index 3f79ec62c..774c8b0f6 100644 --- a/app/models/custom_field.rb +++ b/app/models/custom_field.rb @@ -1,8 +1,9 @@ class CustomField < ActiveRecord::Base extend Enumerize + belongs_to :workgroup enumerize :field_type, in: %i{list} - validates :name, uniqueness: {scope: :resource_type} - validates :code, uniqueness: {scope: :resource_type, case_sensitive: false} + validates :name, uniqueness: {scope: [:resource_type, :workgroup_id]} + validates :code, uniqueness: {scope: [:resource_type, :workgroup_id], case_sensitive: false} end diff --git a/spec/models/custom_field_spec.rb b/spec/models/custom_field_spec.rb index 8a6d0cb41..51128b0a2 100644 --- a/spec/models/custom_field_spec.rb +++ b/spec/models/custom_field_spec.rb @@ -4,8 +4,8 @@ RSpec.describe CustomField, type: :model do let( :vj ){ create :vehicle_journey, custom_field_values: {energy: 99} } context "validates" do - it { should validate_uniqueness_of(:name).scoped_to(:resource_type) } - it { should validate_uniqueness_of(:code).scoped_to(:resource_type).case_insensitive } + it { should validate_uniqueness_of(:name).scoped_to(:resource_type, :workgroup_id) } + it { should validate_uniqueness_of(:code).scoped_to(:resource_type, :workgroup_id).case_insensitive } end context "field access" do -- cgit v1.2.3 From 82279efd9598204d5429e4b3cc98ddfad0e6dd56 Mon Sep 17 00:00:00 2001 From: Zog Date: Wed, 24 Jan 2018 08:58:28 +0100 Subject: Add a toolbar for devs to easily manage permissions and features --- .gitignore | 1 + app/assets/stylesheets/components/_toolbar.sass | 47 +++++++++++++++++++++ app/controllers/development_toolbar_controller.rb | 11 +++++ app/views/layouts/application.html.slim | 3 ++ .../layouts/navigation/_main_nav_top.html.slim | 4 ++ app/views/shared/_development_toolbar.html.slim | 48 ++++++++++++++++++++++ config/environments/development.rb | 7 ++++ config/routes.rb | 4 ++ 8 files changed, 125 insertions(+) create mode 100644 app/assets/stylesheets/components/_toolbar.sass create mode 100644 app/controllers/development_toolbar_controller.rb create mode 100644 app/views/shared/_development_toolbar.html.slim diff --git a/.gitignore b/.gitignore index ddd5fdda3..acdb5e230 100644 --- a/.gitignore +++ b/.gitignore @@ -49,3 +49,4 @@ coverage /bin/spring spec/fixtures/target_* +config/development_toolbar.rb diff --git a/app/assets/stylesheets/components/_toolbar.sass b/app/assets/stylesheets/components/_toolbar.sass new file mode 100644 index 000000000..47ae2ac0c --- /dev/null +++ b/app/assets/stylesheets/components/_toolbar.sass @@ -0,0 +1,47 @@ +#development-toolbar + .inner + overflow: scroll + padding: 10px + max-height: 70vh + display: flex + flex-direction: row + .toggles + font-size: 0.7em + float: right + a:first-child + padding-right: 3px + margin-right: 3px + border-right: 1px solid $lightgrey + + .col + flex: 1 1 + padding-right: 10px + padding-left: 10px + border-right: 1px solid $lightgrey + &:last-child + padding-right: 0 + border-right: none + + ul + padding: 0 + li + list-style-type: none + label + padding-left: 5px + font-weight: normal + h5 + font-weight: bold + &.permissions + ul + overflow: hidden + li + float: left + width: 33% + label + font-size: 0.8em + max-width: calc(100% - 15px) + text-overflow: ellipsis + overflow: hidden + padding-top: 3px + input + vertical-align: top diff --git a/app/controllers/development_toolbar_controller.rb b/app/controllers/development_toolbar_controller.rb new file mode 100644 index 000000000..20349f7b8 --- /dev/null +++ b/app/controllers/development_toolbar_controller.rb @@ -0,0 +1,11 @@ +class DevelopmentToolbarController < ApplicationController + def update_settings + return unless Rails.application.config.development_toolbar.present? + organisation = current_user.organisation + organisation.features = params[:features].keys.select{|k| params[:features][k] == "true"} + organisation.save + current_user.permissions = params[:permissions].keys.select{|k| params[:permissions][k] == "true"} + current_user.save + redirect_to request.referrer || "/" + end +end diff --git a/app/views/layouts/application.html.slim b/app/views/layouts/application.html.slim index 567e14ef0..34b373295 100644 --- a/app/views/layouts/application.html.slim +++ b/app/views/layouts/application.html.slim @@ -21,3 +21,6 @@ html lang=I18n.locale = yield #sidebar = yield :sidebar + + = render 'shared/development_toolbar' + = yield :javascript diff --git a/app/views/layouts/navigation/_main_nav_top.html.slim b/app/views/layouts/navigation/_main_nav_top.html.slim index 278249e09..f664d5416 100644 --- a/app/views/layouts/navigation/_main_nav_top.html.slim +++ b/app/views/layouts/navigation/_main_nav_top.html.slim @@ -14,9 +14,13 @@ span = current_user.name span.fa.fa-lg.fa-user + - if Rails.application.config.development_toolbar + = link_to '#', data: { toggle: 'modal', target: '#development-toolbar' }, class: "toolbar-button menu-item" do + .fa.fa-cog = link_to destroy_user_session_path, method: :delete, class: 'menu-item', title: 'Se déconnecter' do span.fa.fa-lg.fa-sign-out + = render 'layouts/navigation/nav_panel_operations' = render 'layouts/navigation/nav_panel_profile' if user_signed_in? diff --git a/app/views/shared/_development_toolbar.html.slim b/app/views/shared/_development_toolbar.html.slim new file mode 100644 index 000000000..b51bb3de6 --- /dev/null +++ b/app/views/shared/_development_toolbar.html.slim @@ -0,0 +1,48 @@ +- if Rails.application.config.development_toolbar + = modalbox 'development-toolbar' do + = form_tag development_toolbar_update_settings_path, authenticity_token: true do + .modal-header + h3= "Toolbar" + + .inner + .col.features + h4 + = "Features" + .toggles + = link_to 'all', '#', data: {mask: 'features', val: true} + = link_to 'none', '#', data: {mask: 'features', val: false} + ul + - Rails.application.config.development_toolbar.available_features.sort.each do |feature| + li + = hidden_field_tag "features[#{feature}]", false, id: "" + = check_box_tag "features[#{feature}]", true, has_feature?(feature) + = label :features, feature + .col.permissions + h4 + = "Permissions" + .toggles + = link_to 'all', '#', data: {mask: 'permissions', val: true} + = link_to 'none', '#', data: {mask: 'permissions', val: false} + - model = "" + - Rails.application.config.development_toolbar.available_permissions.sort.each do |permission| + - if permission.split('.').first != model + - model = permission.split('.').first + + h5 + = model + .toggles + = link_to 'all', '#', data: {mask: "permissions[#{model}", val: true} + = link_to 'none', '#', data: {mask: "permissions[#{model}", val: false} +