aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlban Peignier2018-03-15 10:17:57 +0100
committerGitHub2018-03-15 10:17:57 +0100
commitec7b83ebc22ea7355d49c4b4fac32ef3104a9622 (patch)
tree5fb93f87993eacdbac52ac57325a79066ae7b171
parent9e1ad7402881a0ef47b949a3ad95ba39e6e65008 (diff)
parent3036b52aea082c12dec82d463936dae29643cb22 (diff)
downloadchouette-core-ec7b83ebc22ea7355d49c4b4fac32ef3104a9622.tar.bz2
Merge pull request #365 from af83/6033-stop-area-states
Enable stop area states. Refs #6033
-rw-r--r--app/controllers/stop_areas_controller.rb25
-rw-r--r--app/helpers/stop_areas_helper.rb20
-rw-r--r--app/models/chouette/stop_area.rb30
-rw-r--r--app/views/stop_areas/_filters.html.slim26
-rw-r--r--app/views/stop_areas/_form.html.slim2
-rw-r--r--app/views/stop_areas/index.html.slim4
-rw-r--r--app/views/stop_areas/show.html.slim2
-rw-r--r--config/locales/stop_areas.en.yml9
-rw-r--r--config/locales/stop_areas.fr.yml10
-rw-r--r--db/migrate/20180307202627_add_confirmed_at_to_stop_areas.rb5
-rw-r--r--db/migrate/20180308063549_update_stop_areas_confirmed_at_attribute.rb9
-rw-r--r--db/schema.rb54
-rw-r--r--spec/features/stop_areas_spec.rb40
13 files changed, 175 insertions, 61 deletions
diff --git a/app/controllers/stop_areas_controller.rb b/app/controllers/stop_areas_controller.rb
index 41a1a8c6d..c77500132 100644
--- a/app/controllers/stop_areas_controller.rb
+++ b/app/controllers/stop_areas_controller.rb
@@ -53,6 +53,7 @@ class StopAreasController < ChouetteController
index! do |format|
format.html {
+ # binding.pry
if collection.out_of_bounds?
redirect_to params.merge(:page => 1)
end
@@ -133,7 +134,9 @@ class StopAreasController < ChouetteController
end
def collection
- @q = parent.present? ? parent.stop_areas.search(params[:q]) : referential.stop_areas.search(params[:q])
+ scope = parent.present? ? parent.stop_areas : referential.stop_areas
+ scope = ransack_status(scope)
+ @q = scope.search(params[:q])
if sort_column && sort_direction
@stop_areas ||=
@@ -202,8 +205,28 @@ class StopAreasController < ChouetteController
:waiting_time,
:zip_code,
:kind,
+ :status,
localized_names: Chouette::StopArea::AVAILABLE_LOCALIZATIONS
)
end
+ # Fake ransack filter
+ def ransack_status scope
+ return scope unless params[:q].try(:[], :status)
+ return scope if params[:q][:status].values.uniq.length == 1
+
+ @status = {
+ in_creation: params[:q][:status]['in_creation'] == 'true',
+ confirmed: params[:q][:status]['confirmed'] == 'true',
+ deactivated: params[:q][:status]['deactivated'] == 'true',
+ }
+
+ scope = Chouette::StopArea.where(
+ "confirmed_at #{@status[:confirmed] ? "IS NOT NULL" : "IS NULL"}
+ AND deleted_at #{@status[:deactivated] ? "IS NOT NULL" : "IS NULL"}"
+ )
+
+ params[:q].delete :status
+ scope
+ end
end
diff --git a/app/helpers/stop_areas_helper.rb b/app/helpers/stop_areas_helper.rb
index fa99f1b4c..1c9d974a1 100644
--- a/app/helpers/stop_areas_helper.rb
+++ b/app/helpers/stop_areas_helper.rb
@@ -70,4 +70,24 @@ module StopAreasHelper
def stop_area_registration_number_value stop_area
stop_area&.registration_number || stop_area&.stop_area_referential&.generate_registration_number
end
+
+ def stop_area_status(stop_area)
+ if stop_area.activated?
+ content_tag(:span, nil, class: 'fa fa-check-circle fa-lg text-success') +
+ t('activerecord.attributes.stop_area.confirmed')
+ elsif stop_area.deactivated?
+ content_tag(:span, nil, class: 'fa fa-exclamation-circle fa-lg text-danger') +
+ t('activerecord.attributes.stop_area.deactivated')
+ else
+ content_tag(:span, nil, class: 'fa fa-pencil fa-lg text-info') +
+ t('activerecord.attributes.stop_area.in_creation')
+ end
+ end
+
+ def stop_area_status_options
+ Chouette::StopArea.statuses.map do |status|
+ [ t(status, scope: 'activerecord.attributes.stop_area'), status ]
+ end
+ end
+
end
diff --git a/app/models/chouette/stop_area.rb b/app/models/chouette/stop_area.rb
index 0a27b2f39..1918c90d1 100644
--- a/app/models/chouette/stop_area.rb
+++ b/app/models/chouette/stop_area.rb
@@ -383,29 +383,55 @@ module Chouette
end
def activated?
- deleted_at.nil?
+ deleted_at.nil? && confirmed_at
end
def deactivated?
- !activated?
+ deleted_at && confirmed_at.nil?
end
def activate
+ self.confirmed_at = Time.now
self.deleted_at = nil
end
def deactivate
+ self.confirmed_at = nil
self.deleted_at = Time.now
end
def activate!
+ update_attribute :confirmed_at, Time.now
update_attribute :deleted_at, nil
end
def deactivate!
+ update_attribute :confirmed_at, nil
update_attribute :deleted_at, Time.now
end
+ def status
+ return :deleted if deleted_at
+ return :confirmed if confirmed_at
+
+ :in_creation
+ end
+
+ def status=(status)
+ case status&.to_sym
+ when :deleted
+ deactivate
+ when :confirmed
+ activate
+ when :in_creation
+ self.confirmed_at = self.deleted_at = nil
+ end
+ end
+
+ def self.statuses
+ %i{in_creation confirmed deleted}
+ end
+
def time_zone_offset
return 0 unless time_zone.present?
ActiveSupport::TimeZone[time_zone]&.utc_offset
diff --git a/app/views/stop_areas/_filters.html.slim b/app/views/stop_areas/_filters.html.slim
index 00369d3ed..a32638567 100644
--- a/app/views/stop_areas/_filters.html.slim
+++ b/app/views/stop_areas/_filters.html.slim
@@ -13,6 +13,32 @@
.form-group.togglable class=filter_item_class(params[:q], :area_type_eq_any)
= f.label Chouette::StopArea.human_attribute_name(:area_type), required: false, class: 'control-label'
= f.input :area_type_eq_any, checked: params[:q] && params[:q][:area_type_eq_any], collection: Chouette::AreaType.options, as: :check_boxes, label: false, label_method: lambda{|w| ("<span>" + w[0] + "</span>").html_safe}, required: false, wrapper_html: { class: 'checkbox_list' }
+
+ .form-group.togglable class=filter_item_class(params[:q], :status)
+ = f.label Chouette::StopArea.human_attribute_name(:state), required: false, class: 'control-label'
+ .form-group.checkbox_list
+ = f.simple_fields_for :status do |p|
+ = p.input :in_creation,
+ label: ("<span>#{t('activerecord.attributes.stop_area.in_creation')}<span class='fa fa-pencil text-info'></span></span>").html_safe,
+ as: :boolean,
+ wrapper_html: { class: 'checkbox-wrapper' },
+ checked_value: true,
+ unchecked_value: false,
+ input_html: { checked: @status.try(:[], :in_creation) }
+ = p.input :confirmed,
+ label: ("<span>#{t('activerecord.attributes.stop_area.confirmed')}<span class='fa fa-check-circle text-success'></span></span>").html_safe,
+ as: :boolean,
+ wrapper_html: { class: 'checkbox-wrapper' },
+ checked_value: true,
+ unchecked_value: false,
+ input_html: { checked: @status.try(:[], :confirmed) }
+ = p.input :deactivated,
+ label: ("<span>#{t('activerecord.attributes.stop_area.deleted')}<span class='fa fa-exclamation-circle text-danger'></span></span>").html_safe,
+ as: :boolean,
+ wrapper_html: { class: 'checkbox-wrapper' },
+ checked_value: true,
+ unchecked_value: false,
+ input_html: { checked: @status.try(:[], :deactivated) }
.actions
= link_to 'Effacer', @workbench, class: 'btn btn-link'
diff --git a/app/views/stop_areas/_form.html.slim b/app/views/stop_areas/_form.html.slim
index c63e95c89..d6682ef70 100644
--- a/app/views/stop_areas/_form.html.slim
+++ b/app/views/stop_areas/_form.html.slim
@@ -27,6 +27,8 @@
.slave data-master="[name='stop_area[kind]']" data-value=kind
= f.input :area_type, as: :select, :input_html => {id: kind, :disabled => !@stop_area.new_record?}, :collection => Chouette::AreaType.options(kind), :include_blank => false, disabled: !@stop_area.new_record?
+ = f.input :status, as: :select, :collection => stop_area_status_options, :include_blank => false
+
.location_info
h3 = t("stop_areas.stop_area.localisation")
diff --git a/app/views/stop_areas/index.html.slim b/app/views/stop_areas/index.html.slim
index 71c7f995c..587efbdaa 100644
--- a/app/views/stop_areas/index.html.slim
+++ b/app/views/stop_areas/index.html.slim
@@ -32,8 +32,8 @@
attribute: 'registration_number' \
), \
TableBuilderHelper::Column.new( \
- key: :deleted_at, \
- attribute: Proc.new { |s| line_status(s.deleted_at) } \
+ name: t('activerecord.attributes.stop_area.state'), \
+ attribute: Proc.new { |s| stop_area_status(s) } \
), \
TableBuilderHelper::Column.new( \
key: :zip_code, \
diff --git a/app/views/stop_areas/show.html.slim b/app/views/stop_areas/show.html.slim
index 34b872e91..a6147b86d 100644
--- a/app/views/stop_areas/show.html.slim
+++ b/app/views/stop_areas/show.html.slim
@@ -20,7 +20,7 @@
@stop_area.human_attribute_name(:zip_code) => @stop_area.zip_code,
@stop_area.human_attribute_name(:city_name) => @stop_area.city_name,
@stop_area.human_attribute_name(:country_code) => @stop_area.country_code.presence || '-',
- t('activerecord.attributes.stop_area.state') => (@stop_area.deleted_at ? t('stop_areas.show.state.deactivated') : t('stop_areas.show.state.active')),
+ t('activerecord.attributes.stop_area.state') => stop_area_status(@stop_area),
@stop_area.human_attribute_name(:comment) => @stop_area.try(:comment),
})
= definition_list t('metadatas'), attributes
diff --git a/config/locales/stop_areas.en.yml b/config/locales/stop_areas.en.yml
index 33722b60b..389f70c0c 100644
--- a/config/locales/stop_areas.en.yml
+++ b/config/locales/stop_areas.en.yml
@@ -110,8 +110,11 @@ en:
name: "Name"
registration_number: "Registration number"
published_name: "Published name"
- deleted: "Deleted"
- deleted_at: "Deleted at"
+ in_creation: "In creation"
+ confirmed: "Activated"
+ confirmed_at: "Activated at"
+ deleted: "Deactivated"
+ deleted_at: "Deactivated at"
comment: "Description"
stop_area_type: "Area type"
area_type: "Area type"
@@ -143,8 +146,6 @@ en:
coordinates: "Coordinates (lat,lng) WGS84"
zip_code: "Zip code"
city_name: "City"
- created_at: Created at
- updated_at: Updated at
waiting_time: Waiting time (minutes)
state: State
formtastic:
diff --git a/config/locales/stop_areas.fr.yml b/config/locales/stop_areas.fr.yml
index 605e6158e..aee112be7 100644
--- a/config/locales/stop_areas.fr.yml
+++ b/config/locales/stop_areas.fr.yml
@@ -112,8 +112,12 @@ fr:
kind: "Catégorie"
registration_number: "Numéro d'enregistrement"
published_name: "Nom public"
- deleted: "Supprimé"
- deleted_at: "Activé"
+ in_creation: "En création"
+ confirmed: "Actif"
+ confirmed_at: "Activé le"
+ deleted: "Désactivé"
+ deactivated: "Désactivé"
+ deleted_at: "Désactivé le"
comment: "Commentaire"
stop_area_type: "Type d'arrêt"
area_type: "Type d'arrêt"
@@ -145,8 +149,6 @@ fr:
coordinates: "Coordonnées (lat,lng) WGS84"
zip_code: "Code postal"
city_name: "Commune"
- created_at: "Créé le"
- updated_at: "Edité le"
waiting_time: Temps de desserte (minutes)
state: État
formtastic:
diff --git a/db/migrate/20180307202627_add_confirmed_at_to_stop_areas.rb b/db/migrate/20180307202627_add_confirmed_at_to_stop_areas.rb
new file mode 100644
index 000000000..602d3afdc
--- /dev/null
+++ b/db/migrate/20180307202627_add_confirmed_at_to_stop_areas.rb
@@ -0,0 +1,5 @@
+class AddConfirmedAtToStopAreas < ActiveRecord::Migration
+ def change
+ add_column :stop_areas, :confirmed_at, :datetime
+ end
+end
diff --git a/db/migrate/20180308063549_update_stop_areas_confirmed_at_attribute.rb b/db/migrate/20180308063549_update_stop_areas_confirmed_at_attribute.rb
new file mode 100644
index 000000000..7bc0471f7
--- /dev/null
+++ b/db/migrate/20180308063549_update_stop_areas_confirmed_at_attribute.rb
@@ -0,0 +1,9 @@
+class UpdateStopAreasConfirmedAtAttribute < ActiveRecord::Migration
+ def up
+ Chouette::StopArea.where(deleted_at: nil).update_all(confirmed_at: Time.now)
+ end
+
+ def down
+ raise ActiveRecord::IrreversibleMigration
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index cf0a32a3b..2f9ffa840 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -298,58 +298,18 @@ ActiveRecord::Schema.define(version: 20180308095116) do
add_index "custom_fields", ["resource_type"], name: "index_custom_fields_on_resource_type", using: :btree
- create_table "export_messages", id: :bigserial, force: :cascade do |t|
- t.string "criticity"
- t.string "message_key"
- t.hstore "message_attributes"
- t.integer "export_id", limit: 8
- t.integer "resource_id", limit: 8
- t.datetime "created_at"
- t.datetime "updated_at"
- t.hstore "resource_attributes"
- end
-
- add_index "export_messages", ["export_id"], name: "index_export_messages_on_export_id", using: :btree
- add_index "export_messages", ["resource_id"], name: "index_export_messages_on_resource_id", using: :btree
-
- create_table "export_resources", id: :bigserial, force: :cascade do |t|
- t.integer "export_id", limit: 8
- t.string "status"
- t.datetime "created_at"
- t.datetime "updated_at"
- t.string "resource_type"
- t.string "reference"
- t.string "name"
- t.hstore "metrics"
- end
-
- add_index "export_resources", ["export_id"], name: "index_export_resources_on_export_id", using: :btree
-
create_table "exports", id: :bigserial, force: :cascade do |t|
+ t.integer "referential_id", limit: 8
t.string "status"
- t.string "current_step_id"
- t.float "current_step_progress"
- t.integer "workbench_id", limit: 8
- t.integer "referential_id", limit: 8
- t.string "name"
+ t.string "type"
+ t.string "options"
t.datetime "created_at"
t.datetime "updated_at"
- t.string "file"
- t.datetime "started_at"
- t.datetime "ended_at"
- t.string "token_upload"
- t.string "type"
- t.integer "parent_id", limit: 8
- t.string "parent_type"
- t.datetime "notified_parent_at"
- t.integer "current_step", default: 0
- t.integer "total_steps", default: 0
- t.string "creator"
- t.hstore "options"
+ t.string "references_type"
+ t.string "reference_ids"
end
add_index "exports", ["referential_id"], name: "index_exports_on_referential_id", using: :btree
- add_index "exports", ["workbench_id"], name: "index_exports_on_workbench_id", using: :btree
create_table "facilities", id: :bigserial, force: :cascade do |t|
t.integer "stop_area_id", limit: 8
@@ -460,9 +420,9 @@ ActiveRecord::Schema.define(version: 20180308095116) do
t.string "type"
t.integer "parent_id", limit: 8
t.string "parent_type"
- t.datetime "notified_parent_at"
t.integer "current_step", default: 0
t.integer "total_steps", default: 0
+ t.datetime "notified_parent_at"
t.string "creator"
end
@@ -805,7 +765,6 @@ ActiveRecord::Schema.define(version: 20180308095116) do
t.datetime "created_at"
t.datetime "updated_at"
t.string "objectid_format"
- t.string "registration_number_format"
end
create_table "stop_areas", id: :bigserial, force: :cascade do |t|
@@ -841,6 +800,7 @@ ActiveRecord::Schema.define(version: 20180308095116) do
t.integer "waiting_time"
t.string "kind"
t.jsonb "localized_names"
+ t.datetime "confirmed_at"
end
add_index "stop_areas", ["name"], name: "index_stop_areas_on_name", using: :btree
diff --git a/spec/features/stop_areas_spec.rb b/spec/features/stop_areas_spec.rb
index 668eb2fa3..02e853999 100644
--- a/spec/features/stop_areas_spec.rb
+++ b/spec/features/stop_areas_spec.rb
@@ -30,6 +30,46 @@ describe "StopAreas", :type => :feature do
expect(page).to have_content(stop_areas.first.name)
expect(page).not_to have_content(stop_areas.last.name)
end
+
+ context 'filtering by status' do
+ before do
+ stop_areas.first.activate!
+ stop_areas.last.deactivate!
+ end
+
+ describe 'updated stop areas in before block' do
+
+ it 'supports displaying only stop areas in creation' do
+ find("#q_status_in_creation").set(true)
+ click_button 'search-btn'
+ expect(page).not_to have_content(stop_areas.first.name)
+ expect(page).not_to have_content(stop_areas.last.name)
+ end
+
+ it 'supports displaying only confirmed stop areas' do
+ find("#q_status_confirmed").set(true)
+ click_button 'search-btn'
+ expect(page).to have_content(stop_areas.first.name)
+ expect(page).not_to have_content(stop_areas.last.name)
+ end
+
+ it 'supports displaying only deactivated stop areas' do
+ find("#q_status_deactivated").set(true)
+ click_button 'search-btn'
+ expect(page).not_to have_content(stop_areas.first.name)
+ expect(page).to have_content(stop_areas.last.name)
+ end
+
+ it 'should display all stop areas if all filters are checked' do
+ find("#q_status_in_creation").set(true)
+ find("#q_status_confirmed").set(true)
+ find("#q_status_deactivated").set(true)
+ click_button 'search-btn'
+ expect(page).to have_content(stop_areas.first.name)
+ expect(page).to have_content(stop_areas.last.name)
+ end
+ end
+ end
end
end