droom 0.2.1 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. data/app/assets/images/droom/Untitled-1.png +0 -0
  2. data/app/assets/images/droom/asterisk.png +0 -0
  3. data/app/assets/images/droom/dropbox_small.png +0 -0
  4. data/app/assets/images/droom/handle.png +0 -0
  5. data/app/assets/images/droom/minisymbols.png +0 -0
  6. data/app/assets/images/droom/revoke_small.png +0 -0
  7. data/app/assets/images/droom/toggle.png +0 -0
  8. data/app/assets/javascripts/droom.js.coffee +4 -4
  9. data/app/assets/javascripts/droom/actions.js.coffee +16 -5
  10. data/app/assets/javascripts/droom/lib/wysihtml5.js +18 -0
  11. data/app/assets/javascripts/droom/widgets.js.coffee +72 -111
  12. data/app/assets/stylesheets/droom.css.sass +195 -119
  13. data/app/assets/stylesheets/{_definitions.css.sass → droom/_mixins.css.sass} +28 -43
  14. data/app/assets/stylesheets/{lib → droom}/_popups.css.sass +0 -0
  15. data/app/assets/stylesheets/{lib → droom}/_toolbar.css.sass +2 -4
  16. data/app/assets/stylesheets/droom/_variables.css.sass +46 -0
  17. data/app/assets/stylesheets/lib/_kalendae.css.sass +2 -2
  18. data/app/controllers/droom/engine_controller.rb +5 -1
  19. data/app/controllers/droom/events_controller.rb +9 -6
  20. data/app/controllers/droom/groups_controller.rb +1 -1
  21. data/app/controllers/droom/organisations_controller.rb +1 -1
  22. data/app/controllers/droom/people_controller.rb +18 -18
  23. data/app/controllers/droom/suggestions_controller.rb +0 -1
  24. data/app/controllers/droom/user_confirmations_controller.rb +55 -0
  25. data/app/controllers/droom/users_controller.rb +1 -2
  26. data/app/controllers/droom/youtube_controller.rb +4 -1
  27. data/app/helpers/droom/droom_helper.rb +3 -3
  28. data/app/models/droom/document.rb +3 -27
  29. data/app/models/droom/event.rb +0 -12
  30. data/app/models/droom/folder.rb +9 -10
  31. data/app/models/droom/group.rb +0 -7
  32. data/app/models/droom/person.rb +13 -20
  33. data/app/models/droom/scrap.rb +2 -12
  34. data/app/models/droom/user.rb +29 -5
  35. data/app/models/droom/venue.rb +0 -17
  36. data/app/views/{droom/users/unwelcome.en.html.haml → devise/confirmations/failure.en.html.haml} +5 -2
  37. data/app/views/devise/confirmations/new.html.haml +25 -0
  38. data/app/views/devise/confirmations/show.html.haml +32 -0
  39. data/app/views/droom/dashboard/_documents.html.haml +9 -0
  40. data/app/views/droom/dashboard/_folders.html.haml +1 -1
  41. data/app/views/droom/dashboard/_groups.html.haml +9 -0
  42. data/app/views/droom/documents/_document.html.haml +1 -1
  43. data/app/views/droom/documents/_table_document.html.haml +1 -1
  44. data/app/views/droom/events/_event.html.haml +0 -1
  45. data/app/views/droom/events/edit.html.haml +1 -1
  46. data/app/views/droom/events/index.html.haml +6 -4
  47. data/app/views/droom/events/new.html.haml +1 -1
  48. data/app/views/droom/events/show.html.haml +1 -1
  49. data/app/views/droom/folders/_folder.html.haml +2 -2
  50. data/app/views/droom/folders/edit.html.haml +1 -1
  51. data/app/views/droom/folders/index.html.haml +3 -1
  52. data/app/views/droom/folders/new.html.haml +1 -1
  53. data/app/views/droom/groups/_group.html.haml +6 -3
  54. data/app/views/droom/groups/edit.html.haml +1 -1
  55. data/app/views/droom/groups/index.html.haml +20 -1
  56. data/app/views/droom/groups/new.html.haml +1 -1
  57. data/app/views/droom/organisations/_action_menu.html.haml +3 -1
  58. data/app/views/droom/organisations/_organisation.html.haml +0 -1
  59. data/app/views/droom/organisations/edit.html.haml +1 -1
  60. data/app/views/droom/organisations/new.html.haml +1 -1
  61. data/app/views/droom/panels/_dropbox.html.haml +1 -1
  62. data/app/views/droom/panels/{_search.html.haml → _suggestions.html.haml} +3 -4
  63. data/app/views/droom/people/_form.html.haml +15 -19
  64. data/app/views/droom/people/_listing.html.haml +1 -1
  65. data/app/views/droom/people/_person.html.haml +3 -3
  66. data/app/views/droom/people/_suggested.html.haml +1 -1
  67. data/app/views/droom/people/edit.html.haml +1 -1
  68. data/app/views/droom/people/new.html.haml +1 -1
  69. data/app/views/droom/people/show.html.haml +31 -1
  70. data/app/views/droom/scraps/full/_document.html.haml +1 -1
  71. data/app/views/droom/scraps/thumbs/_document.html.haml +2 -2
  72. data/app/views/droom/shared/{_search_form.html.haml → _suggestion_form.html.haml} +1 -1
  73. data/app/views/droom/users/_extra_columns.html.haml +0 -0
  74. data/app/views/droom/users/_extra_columns_header.html.haml +0 -0
  75. data/app/views/droom/users/_extra_columns_note.html.haml +0 -0
  76. data/app/views/droom/users/_form.html.haml +5 -12
  77. data/app/views/droom/users/_user_or_person.html.haml +24 -15
  78. data/app/views/droom/users/_users_table.html.haml +24 -6
  79. data/app/views/droom/users/edit.html.haml +1 -1
  80. data/app/views/droom/users/index.html.haml +2 -5
  81. data/config/locales/devise.en.yml +1 -1
  82. data/config/locales/en.yml +22 -7
  83. data/config/routes.rb +4 -3
  84. data/lib/droom.rb +28 -14
  85. data/lib/droom/engine.rb +2 -0
  86. data/lib/droom/version.rb +1 -1
  87. data/spec/dummy/log/dav.log +1 -0
  88. data/spec/dummy/log/development.log +2 -0
  89. data/spec/dummy/log/test.log +1 -0
  90. metadata +29 -33
  91. data/app/controllers/droom/confirmations_controller.rb +0 -38
  92. data/app/controllers/droom/search_controller.rb +0 -66
  93. data/app/views/cropper/uploads/_crop.html.haml +0 -46
  94. data/app/views/devise/mailer/confirmation_instructions.en.html.haml +0 -24
  95. data/app/views/devise/mailer/reset_password_instructions.en.html.haml +0 -21
  96. data/app/views/droom/shared/_search_results.html.haml +0 -9
  97. data/app/views/droom/shared/search.html.haml +0 -18
@@ -1,7 +1,7 @@
1
1
  #event
2
2
  .header
3
3
  = link_to "X", '#', :class => "closer", :data => {:action => "close"}
4
- %h2
4
+ %h2.titlebar
5
5
  = t :edit_event
6
6
 
7
7
  = render :partial => 'form'
@@ -1,4 +1,7 @@
1
1
  #main.events
2
+ %p.standfirst
3
+ = t :calendar_introduction
4
+
2
5
  - if @direction == 'past'
3
6
  %h2.section
4
7
  = t(:past_events)
@@ -8,10 +11,9 @@
8
11
  - else
9
12
  %h2.section
10
13
  = t(:future_events)
11
- - if @calendar.events.past.any?
12
- %span.addendum
13
- = link_to t(:show_past_events), droom.events_url(:direction => "past"), :class => "past"
14
-
14
+ %span.addendum
15
+ = link_to t(:show_past_events), droom.events_url(:direction => "past"), :class => "past"
16
+
15
17
  - if admin?
16
18
  %p.action
17
19
  = link_to t(:add_event), droom.new_event_url, :class => "add", :data => {:action => "popup", :affected => ".events_list, #minicalendar"}
@@ -1,6 +1,6 @@
1
1
  #event
2
2
  .header
3
3
  = link_to "X", '#', :class => "closer", :data => {:action => "close"}
4
- %h2
4
+ %h2.titlebar
5
5
  = t :add_event
6
6
  = render :partial => 'form'
@@ -2,7 +2,7 @@
2
2
  = render :partial => 'droom/events/event', :object => @event, :locals => {:full_attachments => true}
3
3
 
4
4
  - content_for :title do
5
- = link_to t(:calendar), main_app.calendar_url
5
+ = t(:calendar)
6
6
 
7
7
  - content_for :margin do
8
8
  = render :partial => 'droom/shared/calendar_holder'
@@ -1,6 +1,6 @@
1
1
  - folder ||= @folder
2
2
  - standalone ||= false
3
- - title ||= folder.name
3
+ - title ||= folder.name || folder.slug
4
4
  - open ||= false
5
5
  - if @folder
6
6
  - open = true if folder == @folder || folder.ancestor_of?(@folder)
@@ -11,7 +11,7 @@
11
11
  - cssclass << " empty" unless folder.populated?
12
12
  - cssclass << " standalone" if standalone
13
13
 
14
- %li{:class => cssclass, :id => "folder_#{folder.id}", :data => {:refreshable => true, :url => droom.folder_path(folder, :js)} }
14
+ %li{:class => cssclass, :id => "folder_#{folder.id}", :data => {:refreshable => true, :url => droom.folder_path(folder, :js)} }<
15
15
  = link_to shorten(title, 48), droom.folder_url(folder), :class => "folder", :data => {:remote => true, :action => 'replace', :affected => "#folder_#{folder.id}"}
16
16
  = action_menulink(folder)
17
17
  = dropbox_link(folder)
@@ -1,6 +1,6 @@
1
1
  #folder
2
2
  .header
3
3
  = link_to "X", '#', :class => "closer", :data => {:action => "close"}
4
- %h2
4
+ %h2.titlebar
5
5
  = t :edit_folder
6
6
  = render :partial => 'form'
@@ -1,9 +1,11 @@
1
1
  #main.folders{:data => {:panel => false}}
2
- %p
2
+ %p.standfirst
3
3
  = t :library_introduction
4
4
 
5
5
  - if admin?
6
6
  %p.action
7
+ = link_to t(:hide_empty_folders), '#', :class => "toggle", :data => {:action => "toggle", :affected => ".folder.empty"}
8
+ %br
7
9
  = link_to t(:add_root_folder), droom.new_folder_url, :class => "add", :data => {:action => "popup", :affected => "#folders"}
8
10
  %br
9
11
  %span.note
@@ -1,6 +1,6 @@
1
1
  #folder
2
2
  .header
3
3
  = link_to "X", '#', :class => "closer", :data => {:action => "close"}
4
- %h2
4
+ %h2.titlebar
5
5
  = t :add_folder
6
6
  = render :partial => 'form'
@@ -1,10 +1,13 @@
1
1
  - group ||= @group
2
2
 
3
3
  %div{:id => "group_#{group.id}", :data => {:action => "collapser", :refreshable => true, :url => group_path(group, :format => :js)} }
4
- %h2
5
- = group.name
4
+
5
+ %h2.section
6
+ = link_to group.name, '#', :class => "name"
6
7
  = action_menulink(group)
7
8
  = action_menu(group)
8
9
 
9
- %ul.people
10
+ %ul.people.detail
10
11
  = render :partial => "droom/people/person", :collection => group.people, :locals => {:group => group}
12
+ %p.suffix.note
13
+ = t :group_members, :count => group.people.count
@@ -1,7 +1,7 @@
1
1
  #group
2
2
  .header
3
3
  = link_to "X", '#', :class => "closer", :data => {:action => "close"}
4
- %h2
4
+ %h2.titlebar
5
5
  = t :edit_group
6
6
 
7
7
  = render :partial => "form"
@@ -1,10 +1,29 @@
1
1
  - content_for :title do
2
2
  = t :group_admin
3
3
 
4
- #groups
4
+ #groups.main
5
+
6
+ %p.standfirst
7
+ = t :directory_introduction
8
+
5
9
  - if current_user.admin?
6
10
  %p.action
7
11
  = link_to t(:add_group), droom.new_group_url, :class => "add", :remote => true, :data => {:action => "popup", :type => "html", :affected => "div.groups"}
8
12
  = link_to t(:add_person), droom.new_person_url, :class => "add", :remote => true, :data => {:action => "popup", :type => "html", :affected => "div.groups"}
9
13
 
10
14
  = render :partial => 'groups'
15
+
16
+ - content_for :margin do
17
+ #finder
18
+ %h3
19
+ = t :find_people
20
+
21
+ %form.filter{:action => droom.people_url(:format => :js), :data => {:action => "filter"}}
22
+ %p
23
+ = text_field_tag :q, params[:q], :placeholder => t(:by_name_or_email)
24
+
25
+ .scroller
26
+ #found
27
+ %p.waiting
28
+ = t :loading_people
29
+
@@ -1,7 +1,7 @@
1
1
  #group
2
2
  .header
3
3
  = link_to "X", '#', :class => "closer", :data => {:action => "close"}
4
- %h2
4
+ %h2.titlebar
5
5
  = t :add_group
6
6
 
7
7
  = render :partial => 'form'
@@ -2,6 +2,8 @@
2
2
  .menu{:data => {:for => "organisation_#{organisation.id}"}}
3
3
  %ul.actions
4
4
  %li
5
- = link_to t(:edit_organisation), droom.edit_organisation_url(organisation), :class => 'edit', :data => {:action => "popup", :replaced => "#organisation_#{organisation.id}", :affected => ".minimonth"}
5
+ = link_to t(:edit_organisation), droom.edit_organisation_url(organisation), :class => 'edit', :data => {:action => "popup", :replaced => "#organisation_#{organisation.id}"}
6
+ %li
7
+ = link_to t(:add_person), droom.new_organisation_person_url(organisation), :class => 'add', :data => {:action => "popup", :affected => "#organisation_#{organisation.id}"}
6
8
  %li
7
9
  = link_to t(:delete_organisation), droom.organisation_url(organisation), :method => 'delete', :class => 'delete', :data => {:action => "remove", :removed => "#organisation_#{organisation.id}", :affected => ".minimonth", :confirm => t(:confirm_delete_organisation, :name => organisation.name)}
@@ -16,7 +16,6 @@
16
16
  - if organisation.url?
17
17
  %p.note
18
18
  = link_to organisation.url_without_protocol, organisation.url_with_protocol, :class => "external"
19
-
20
19
 
21
20
  - if organisation.people.any?
22
21
  %ul.people
@@ -1,6 +1,6 @@
1
1
  #edit_organisation
2
2
  .header
3
3
  = link_to "X", '#', :class => "closer", :data => {:action => "close"}
4
- %h2
4
+ %h2.titlebar
5
5
  = t :edit_organisation
6
6
  = render :partial => 'form'
@@ -1,6 +1,6 @@
1
1
  #new_organisation
2
2
  .header
3
3
  = link_to "X", '#', :class => "closer", :data => {:action => "close"}
4
- %h2
4
+ %h2.titlebar
5
5
  = t :add_organisation
6
6
  = render :partial => 'form'
@@ -10,7 +10,7 @@
10
10
 
11
11
  - else
12
12
  %p
13
- = t :dropbox_introduction
13
+ = t :dropbox_introduction, :name => Droom.dropbox_app_name
14
14
  %p
15
15
  = link_to "Connect to your dropbox", droom.new_dropbox_token_url, :class => "dropbox"
16
16
 
@@ -1,8 +1,9 @@
1
1
  - dashboard = request.path == main_app.dashboard_path
2
- #search.panel
2
+ #suggestions.panel
3
3
  - if dashboard
4
4
  %p.instructions
5
- = t :search_instructions
5
+ = t :suggestions_instructions
6
+
6
7
  %form#suggestions{:action => droom.suggestions_url(:format => :js)}
7
8
  %p
8
9
  - unless dashboard
@@ -10,7 +11,5 @@
10
11
  = t :quick_search
11
12
  %br
12
13
  = text_field_tag :term, params[:term], :placeholder => t(:quick_search_prompt), :autocomplete => "off"
13
- %p.formnote
14
- = link_to t(:advanced_search_link), droom.search_url, :class => "search"
15
14
 
16
15
  #suggestion_box
@@ -1,19 +1,7 @@
1
1
  = form_for @person, :html => {:class => 'edit person'} do |f|
2
2
  .image
3
- .upload
4
- - @person.build_image_upload unless @person.image_upload
5
- = f.fields_for :image_upload do |iuf|
6
- .uploadbox{:data => {:action => "upload", :url => cropper.uploads_path(:format => :js, :for => "person"), :scale => 2}}
7
- = iuf.file_field :file, :class => 'file_upload', :accept => "image"
8
- .img
9
- - if @person.image_upload.persisted?
10
- = link_to image_tag(@person.image.url(:cropped), :width => 260, :height => 260), cropper.edit_upload_url(@person.image_upload), :data => {:action => "recrop"}, :class => "recrop"
11
- = link_to t(:detach_upload), '#', :class => 'detach'
12
- .prompt
13
- = link_to t(:click_to_upload), cropper.new_upload_url, :class => 'picker'
14
- .droppable
15
- .note
16
- = t :drop_to_upload
3
+ - @person.build_image_upload unless @person.image_upload
4
+ = render :partial => "cropper/uploads/pick", :locals => {:upload => @person.image_upload, :holder => @person, :multiplier => 4}
17
5
 
18
6
  - if Droom.use_forenames?
19
7
  %p.name
@@ -49,6 +37,12 @@
49
37
  = f.text_field :mobile
50
38
 
51
39
  - if admin?
40
+ - if Droom.use_organisations?
41
+ %p.organisation
42
+ = f.label :organisation_id
43
+ %br
44
+ = f.select :organisation_id, Droom::Organisation.for_selection, :class => 'preferences'
45
+
52
46
  - if @person.new_record?
53
47
  %p.admin
54
48
  = f.check_box :invite_on_creation, :class => 'invite'
@@ -56,11 +50,13 @@
56
50
  = f.check_box :admin_user
57
51
  = f.label :admin_user
58
52
 
59
- / %p.organisation
60
- / = f.label :organisation_id, :class => "optional"
61
- / %br
62
- / = f.select :organisation_id, Droom::Organisation.for_selection
63
-
53
+ - if Droom.use_biogs?
54
+ - @person.description = "<p></p>" unless @person.description?
55
+ .description.wysihtml
56
+ .toolbar#t1
57
+ = render 'droom/shared/toolbar'
58
+ = f.text_area :description
59
+
64
60
  .buttons
65
61
  - if current_user.is_person?(@person)
66
62
  = f.submit t(:save_your_profile)
@@ -2,7 +2,7 @@
2
2
 
3
3
  %li.person{:id => "list_person_#{person.id}", :data => {:refreshable => true, :url => droom.edit_person_path(person, :format => :js)} }
4
4
  %span.name
5
- = person.formal_name
5
+ = link_to person.formal_name, person_url(person), :data => {:action => "popup"}
6
6
  = action_menulink(person)
7
7
  = action_menu(person)
8
8
 
@@ -12,7 +12,7 @@
12
12
  - group = membership.group
13
13
 
14
14
  %li{:id => "person_#{person.id}", :class => cssclass, :data => {:refreshable => true, :url => droom.person_path(person, :format => :js, :invitation_id => invitation ? invitation.id : nil)} }
15
- %span.mugshot{:style => "background-image: url(#{person.image.url('cropped')})"}
15
+ %span.mugshot{:style => "background-image: url(#{person.image.url('icon')})"}
16
16
  - if invitation
17
17
  - if editable?(invitation)
18
18
  = link_to invitation.status, toggle_event_invitation_url(event, invitation), :class => "invitation #{invitation.status}", :data => {:action => "affect", :method => "put", :affected => "#person_#{person.id}"}
@@ -20,12 +20,12 @@
20
20
  %span{:class => "invitation #{invitation.status}"}
21
21
  %span.contact
22
22
  %span.name
23
- = person.formal_name
23
+ = link_to truncate(person.formal_name, :length => 14), person_url(person), :data => {:action => "popup"}
24
24
  = action_menulink(person, :class => "small")
25
25
  %br
26
26
  %span.note
27
27
  - if person.email?
28
- = mail_to person.email
28
+ = mail_to truncate(person.email, :length => 20)
29
29
  - else
30
30
  = t :contact_information_unavailable
31
31
 
@@ -1,7 +1,7 @@
1
1
  - person ||= suggested
2
2
 
3
3
  %li.person
4
- = mail_to person.email, person.formal_name
4
+ = link_to person.formal_name, person_url(person), :data => {:action => "popup"}
5
5
  %span.note
6
6
  - if person.phone? || person.email?
7
7
  - if person.phone?
@@ -1,7 +1,7 @@
1
1
  #person
2
2
  .header
3
3
  = link_to "X", '#', :class => "closer", :data => {:action => "close"}
4
- %h2
4
+ %h2.titlebar
5
5
  - if current_user.is_person?(@person)
6
6
  = t :edit_your_profile
7
7
  - else
@@ -1,6 +1,6 @@
1
1
  #person
2
2
  .header
3
3
  = link_to "X", '#', :class => "closer", :data => {:action => "close"}
4
- %h2
4
+ %h2.titlebar
5
5
  = t :new_person
6
6
  = render :partial => 'form'
@@ -1 +1,31 @@
1
- = render :partial => "person", :object => @person
1
+ - person ||= @person
2
+
3
+ #person
4
+ .header
5
+ = link_to "X", '#', :class => "closer", :data => {:action => "close"}
6
+ %h2.titlebar
7
+ = person.formal_name
8
+ .person
9
+ .mugshot.full{:style => "background-image: url(#{person.image.url('thumb')})"}
10
+ .detail
11
+ %h3
12
+ = person.formal_name
13
+
14
+ %p.contact
15
+ - if person.organisation
16
+ %strong
17
+ = person.organisation.name
18
+ %br
19
+ - if person.email?
20
+ = mail_to person.email
21
+ - if person.email? && person.phone?
22
+ = t :or
23
+ - if person.phone?
24
+ = person.phone
25
+ .description
26
+ - if person.description?
27
+ = sanitize(person.description.html_safe)
28
+ - else
29
+ %p
30
+ = t :no_person_description
31
+
@@ -1,6 +1,6 @@
1
1
  - if document = scrap.document
2
2
  .body.scrapdocument
3
3
  %p.name
4
- = link_to document.name, document_url(document), :class => "dl #{document.file_extension}"
4
+ = link_to document.name, droom.folder_document_url(document.folder, document), :class => "dl #{document.file_extension}"
5
5
 
6
6
  = render "droom/scraps/caption", :scrap => scrap
@@ -1,7 +1,7 @@
1
1
  - if document = scrap.document
2
- = link_to "document:", droom.folder_document_url(document.folder, document), :class => "#{document.file_extension} icon"
2
+ = link_to "document:", droom.scrap_url(scrap), :data => {:action => "popup"}, :class => "#{document.file_extension} icon"
3
3
  %p.scrapdocument
4
- = link_to document.name, droom.folder_document_url(document.folder, document), :class => "external", :target => "_scrap"
4
+ = link_to document.name, droom.scrap_url(scrap), :data => {:action => "popup"}
5
5
  = action_menulink(scrap, :class => "small")
6
6
  %span.caption
7
7
  = shorten(scrap.note, 120)
@@ -1,5 +1,5 @@
1
1
  #search
2
- %form#searchform{:action => droom.suggestions_url(:format => :js)}<
2
+ %form#suggestionform{:action => droom.suggestions_url(:format => :js)}<
3
3
  = text_field_tag :term, params[:term], :placeholder => t(:quick_search), :autocomplete => "off"
4
4
  = submit_tag "go"
5
5
  .search_results
@@ -1,29 +1,22 @@
1
- = form_for @user, :html => {:class => 'edit user', :autocomplete => false} do |f|
1
+ = form_for @user, :html => {:class => 'edit user password', :autocomplete => false} do |f|
2
2
 
3
3
  %p.email
4
4
  = f.label :email
5
5
  %br
6
- = f.text_field :email, :class => 'preferences', :autocomplete => false
7
- - if @user.person
8
- %br
9
- = f.check_box :update_person_email
10
- = f.label :update_person_email, :class => 'minor'
11
- %span.formnote
12
- = t :update_person_email_note
6
+ = f.email_field :email, :class => 'preferences', :autocomplete => false
13
7
 
14
8
  %p.password
15
9
  = f.label :password
16
10
  %br
17
- = f.password_field :password, :autocomplete => "off", :class => 'preferences password'
11
+ = f.password_field :password, :autocomplete => "off", :class => 'preferences password', :pattern => ".{6,}"
18
12
  %br
19
- %span.formnote
13
+ %span.note
20
14
  = t :password_requirements
21
- = t :password_leave_same
22
15
 
23
16
  %p.confirmation
24
17
  = f.label :password_confirmation
25
18
  %br
26
- = f.password_field :password_confirmation, :class => 'preferences'
19
+ = f.password_field :password_confirmation, :class => 'preferences password_confirmation', :pattern => ""
27
20
 
28
21
  %p.password_notice
29
22