diff --git a/app/assets/javascripts/events.js.coffee b/app/assets/javascripts/events.js.coffee index 917c05905cb936991e1841b7665af4b339093fa3..7db041c4ba811cabbbf900ef6d5eb88ba7ffe915 100644 --- a/app/assets/javascripts/events.js.coffee +++ b/app/assets/javascripts/events.js.coffee @@ -1,9 +1,11 @@ $(document).ready -> # Setup the graphical editor for event's description tinyMCE.init - selector: 'textarea#event_description', - menubar : false, schema: 'html5', + menubar: false, + language: 'fr_FR', + selector: 'textarea#event_description', + content_css: '/assets/application.css', entity_encoding : 'raw', add_unload_trigger: true, browser_spellcheck: true, diff --git a/app/assets/stylesheets/all.css.sass b/app/assets/stylesheets/all.css.sass index 87054573826136d607f253b2e7a3255aaa4dca32..b43ee267f59ea528d7ff2c4eac6a8b3693869d96 100644 --- a/app/assets/stylesheets/all.css.sass +++ b/app/assets/stylesheets/all.css.sass @@ -112,7 +112,7 @@ header.top font-weight: normal margin-bottom: 21px -main +main, body.mce-content-body position: relative & > * max-width: 80em @@ -141,6 +141,13 @@ main hr margin: 10px 20px + &.mce-content-body + margin: 0 + height: 100% + border: solid thin transparent + font-size: initial + font-family: georgia, serif + fieldset border: none margin: 1em auto @@ -165,10 +172,10 @@ label +border-radius(0.4em) input, textarea, select, a.button, button, .select2-container ul color: black - margin: 3px + margin: 3px 0 border: 1px solid darkgray outline: none - padding: 2px 4px + padding: 0.2em 0.4em font-size: inherit font-family: inherit background-color: white diff --git a/app/assets/stylesheets/events.css.sass b/app/assets/stylesheets/events.css.sass index 18c7bd6b2d614df0fe071f43a2a67f23583927d1..34965c66e9357bef4a3449a5119209051c179723 100644 --- a/app/assets/stylesheets/events.css.sass +++ b/app/assets/stylesheets/events.css.sass @@ -1,4 +1,5 @@ @import compass +@import awesome_mixins header.calendar-header font-size: 1.5em @@ -9,7 +10,7 @@ header.calendar-header &:first-child, &:last-child margin: 0 0.3em -.city:after +span.city:after, strong.city:after, em.city:after content: ':' p.full_address @@ -165,10 +166,8 @@ aside#lug-list margin: 1px 5px 1px 6.6em line-height: 0.9em label - width: 6.3em + width: 6.2em +inline-block() - &:after - content: ':' input[type=radio] + label width: 20em &:after @@ -176,11 +175,37 @@ aside#lug-list .actions text-align: center input - margin: 0.4em font-size: x-large .mce-tinymce +inline-block() +.field label:before + color: gray +.field.title label + +fa-icon('') +.field.start_time label + +fa-icon('') +.field.end_time label + +fa-icon('') +.field.description label + +fa-icon('ï„') +.field.address label + +fa-icon('ï') +.field.city label + +fa-icon('') +.field.region label + +fa-icon('') +.field.locality label + +fa-icon('') +.field.contact label + +fa-icon('') +.field.submitter label + +fa-icon('ïƒ ') +.field.url label + +fa-icon('ïƒ') +.field.tags label + +fa-icon('') + .description text-align: left diff --git a/app/models/event.rb b/app/models/event.rb index c5ce0883cf31a99c443fd4026c694fdf14dc18a7..f931e5db5b9fdcea07baffaf372ae998502baded 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -8,14 +8,15 @@ class Event < ActiveRecord::Base class_name: City validates :title, presence: true + validate :end_after_start validates :description, presence: true validates :city, presence: true validates :related_region, presence: true - validates :url, presence: true, format: %r{\Ahttps?:\/\/.*\z} + validates :url, presence: true, format: %r{\Ahttps?:\/\/.*\..*\z} validates :contact, presence: true validates :contact, email: true validates :submitter, email: true - validate :end_after_start + validates :tags, presence: false, format: /\A[\p{Alnum}\s-]*\z/ geocoded_by :full_address, lookup: :nominatim # after_validation :geocode, if: -> (obj) { obj.address_changed? } @@ -42,6 +43,11 @@ class Event < ActiveRecord::Base scope :tag, -> tag { where 'tags like ?', "%#{tag}%" } scope :geo, -> { where 'latitude is not null and longitude is not null' } + before_validation do + # Tags are always downcased + self.tags = tags.mb_chars.downcase if tags + end + before_validation on: :create do self.submission_time = DateTime.now self.decision_time = DateTime.now diff --git a/app/views/events/_form.html.haml b/app/views/events/_form.html.haml index dcccc1418ff58b2fd827413cdbdc85bc1e7cb379..52198b070eeb5cbf6f421c1e7019b5634eacbe68 100644 --- a/app/views/events/_form.html.haml +++ b/app/views/events/_form.html.haml @@ -9,64 +9,62 @@ = hidden_field_tag :secret, params[:secret] .field.title - .helper - :markdown - #{t '.title_helper'} = f.label :title - = f.text_field :title, required: true, size: 70 + = f.text_field :title, required: true, size: 70, + placeholder: "#{t '.title_helper'}" .field.start_time = f.label :start_time = f.datetime_local_field :start_time, required: true .field.end_time = f.label :end_time = f.datetime_local_field :end_time, required: true - .field + .field.description .helper :markdown #{t '.description_helper'} = f.label :description = f.text_area :description, rows: 25, cols: 90 - .field + .field.address .helper :markdown #{t '.address_helper'} = f.label :address = f.text_field :address, size: 70 - .field + .field.city = f.label :city = f.text_field :city, required: true, size: 70, list: :cities %datalist#cities - - City.connection.select_values('select distinct name from cities join events on name=city group by city order by count(*) desc').each do |name| - %option= name - .field + - Event.group(:city).order('count(city) desc').pluck(:city).each do |city| + %option= city + .field.region = f.label :region = f.select :region, options_from_collection_for_select(Region.all, 'id', 'name', @event.region) - .field + .field.locality = f.label :locality = f.select :locality, options_for_select([[t('attributes.locality_0'), 0], [t('attributes.locality_1'), 1]], @event.locality) - .field + .field.url .helper :markdown #{t '.url_helper'} = f.label :url = f.url_field :url, required: true, size: 70, placeholder: 'Ex: http://april.org' - .field + .field.contact .helper :markdown #{t '.contact_helper'} = f.label :contact = f.email_field :contact, required: true, size: 70 - .field + .field.submitter .helper :markdown #{t '.submitter_helper'} = f.label :submitter = f.email_field :submitter, size: 70 - .field + .field.tags .helper :markdown #{t '.tags_helper'} diff --git a/config/locales/views/fr.yml b/config/locales/views/fr.yml index 74d7d8e571891e035b2313cd9159033ef442fc24..63f79d42ce97d671c5e2492da9ef3df07e926fb2 100644 --- a/config/locales/views/fr.yml +++ b/config/locales/views/fr.yml @@ -74,6 +74,8 @@ fr: update: ok: Votre événement a été mis à jour form: + title_helper: Décrivez en moins de 5 mots votre événement, sans y + indiquer le lieu, la ville ou la date address_helper: "*Associée à la ville et la région, elle générerera une carte [OpenStreetMap](http://www.openstreetmap.org), affichée aux côtés de l'événement*" diff --git a/db/seeds.rb b/db/seeds.rb index d3b24a36a9f637d2251b8135a1d2f26bca5fd9a5..6ae196dc866bf88e12c2f36b3648d0328d279530 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -50,7 +50,7 @@ Si vous soumettez souvent un événement régulier dans l'Agenda du Libre, vous " }, { locale: 'fr', key: 'events.form.title_helper', - value: '**Décrivez en moins de 5 mots votre événement, sans y indiquer le lieu, la ville ou la date.**' }, + value: 'Décrivez en moins de 5 mots votre événement, sans y indiquer le lieu, la ville ou la date' }, { locale: 'fr', key: 'events.form.description_helper', value: '**Décrivez de la manière la plus complète possible votre événement.**' }, diff --git a/test/fixtures/events.yml b/test/fixtures/events.yml index 1c5c2ff4642b6a25ad798d6e6c857b9e88a6f688..3b14157da23d3c91f0d5b249b9a2210fb80855ed 100644 --- a/test/fixtures/events.yml +++ b/test/fixtures/events.yml @@ -12,7 +12,7 @@ one: contact: test@example.com submitter: test@example.com moderated: 1 - tags: MyString + tags: my-string secret: MyString decision_time: <%= 2.days.ago %> submission_time: <%= 3.days.ago %> @@ -31,7 +31,7 @@ two: contact: test2@example.com submitter: test2@example.com moderated: 1 - tags: MyString + tags: my-string secret: MyString decision_time: 2013-12-28 16:04:56 submission_time: 2013-12-28 16:04:56 @@ -50,7 +50,7 @@ proposed: contact: test2@example.com submitter: test2@example.com moderated: 0 - tags: MyString + tags: my-string secret: MyString decision_time: 2013-12-28 16:04:56 submission_time: 2013-12-28 16:04:56 diff --git a/test/mailers/moderation_mailer_test.rb b/test/mailers/moderation_mailer_test.rb index cd55efb5d7558a63eeae9f88e9973e11a2e8e36e..a821d9589c3caa21e8bb5c03961f45a646b8ca1a 100644 --- a/test/mailers/moderation_mailer_test.rb +++ b/test/mailers/moderation_mailer_test.rb @@ -18,7 +18,7 @@ class ModerationMailerTest < ActionMailer::TestCase event = Event.last older_event = Event.new event.attributes - event.tags += ', ho' + event.tags += ' ho' event.start_time += 1.day event.description = event.description + ' hello world' diff --git a/test/mailers/previews/moderation_mailer_preview.rb b/test/mailers/previews/moderation_mailer_preview.rb index 5ff66e26f7dc08ae95afe2c0d81874b9ff575dbd..91608cea39cd82e52b1d4a280259e88d9721c51f 100644 --- a/test/mailers/previews/moderation_mailer_preview.rb +++ b/test/mailers/previews/moderation_mailer_preview.rb @@ -14,7 +14,7 @@ class ModerationMailerPreview < ActionMailer::Preview event = Event.last older_event = Event.new event.attributes - event.tags += ', ho' + event.tags += ' ho' event.start_time += 1.day event.description = event.description + ' hello world'