alchemy_cms 2.5.0.b9 → 2.5.0.rc3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/alchemy_cms.gemspec +2 -1
- data/app/assets/javascripts/alchemy/alchemy.base.js +0 -27
- data/app/assets/javascripts/alchemy/alchemy.growler.js +1 -1
- data/app/assets/javascripts/alchemy/alchemy.gui.js.coffee +0 -1
- data/app/assets/javascripts/alchemy/alchemy.onload.js.coffee +0 -4
- data/app/assets/javascripts/alchemy/alchemy.page_sorter.js +0 -1
- data/app/assets/stylesheets/alchemy/admin.css.scss +1 -0
- data/app/assets/stylesheets/alchemy/archive.scss +8 -6
- data/app/assets/stylesheets/alchemy/base.scss +3 -92
- data/app/assets/stylesheets/alchemy/elements.scss +2 -2
- data/app/assets/stylesheets/alchemy/flash.scss +16 -12
- data/app/assets/stylesheets/alchemy/frame.scss +10 -5
- data/app/assets/stylesheets/alchemy/icons.scss +2 -2
- data/app/assets/stylesheets/alchemy/pagination.scss +5 -5
- data/app/assets/stylesheets/alchemy/tables.scss +2 -2
- data/app/assets/stylesheets/alchemy/toolbar.scss +79 -0
- data/app/controllers/alchemy/admin/base_controller.rb +3 -2
- data/app/controllers/alchemy/admin/dashboard_controller.rb +1 -1
- data/app/controllers/alchemy/admin/pictures_controller.rb +1 -1
- data/app/controllers/alchemy/admin/users_controller.rb +8 -2
- data/app/controllers/alchemy/attachments_controller.rb +1 -1
- data/app/controllers/alchemy/base_controller.rb +8 -0
- data/app/controllers/alchemy/pages_controller.rb +4 -0
- data/app/controllers/alchemy/passwords_controller.rb +23 -0
- data/app/controllers/alchemy/user_sessions_controller.rb +20 -49
- data/app/controllers/alchemy/users_controller.rb +49 -0
- data/app/mailers/alchemy/notifications.rb +5 -0
- data/app/models/alchemy/content.rb +6 -2
- data/app/models/alchemy/element.rb +9 -5
- data/app/models/alchemy/essence_richtext.rb +28 -16
- data/app/models/alchemy/essence_text.rb +22 -13
- data/app/models/alchemy/message.rb +1 -1
- data/app/models/alchemy/page.rb +7 -2
- data/app/models/alchemy/user.rb +66 -24
- data/app/views/alchemy/admin/dashboard/index.html.erb +1 -1
- data/app/views/alchemy/admin/essence_files/edit.html.erb +1 -0
- data/app/views/alchemy/admin/pages/_create_language_form.html.erb +8 -1
- data/app/views/alchemy/admin/partials/_flash.html.erb +1 -1
- data/app/views/alchemy/admin/users/_table.html.erb +2 -2
- data/app/views/alchemy/admin/users/_user.html.erb +1 -1
- data/app/views/alchemy/admin/users/index.html.erb +1 -1
- data/app/views/alchemy/notifications/admin_user_created.de.text.erb +11 -0
- data/app/views/alchemy/notifications/admin_user_created.en.text.erb +11 -0
- data/app/views/alchemy/notifications/registered_user_created.text.erb +2 -1
- data/app/views/alchemy/notifications/reset_password_instructions.de.text.erb +8 -0
- data/app/views/alchemy/notifications/reset_password_instructions.en.text.erb +8 -0
- data/app/views/alchemy/passwords/edit.html.erb +35 -0
- data/app/views/alchemy/passwords/new.html.erb +30 -0
- data/app/views/alchemy/user_sessions/leave.html.erb +3 -3
- data/app/views/alchemy/user_sessions/{login.html.erb → new.html.erb} +5 -2
- data/app/views/alchemy/{user_sessions/signup.html.erb → users/new.html.erb} +0 -0
- data/config/alchemy/config.yml +12 -0
- data/config/initializers/devise.rb +242 -0
- data/config/locales/alchemy.de.yml +12 -39
- data/config/locales/alchemy.en.yml +4 -31
- data/config/locales/devise.de.yml +57 -0
- data/config/locales/devise.en.yml +60 -0
- data/config/routes.rb +37 -21
- data/db/migrate/20130121092645_migrate_to_devise.rb +24 -0
- data/lib/alchemy/authentication_helpers.rb +0 -13
- data/lib/alchemy/engine.rb +2 -2
- data/lib/alchemy/essence.rb +2 -2
- data/lib/alchemy/upgrader.rb +33 -0
- data/lib/alchemy/version.rb +1 -1
- data/lib/alchemy_cms.rb +2 -1
- data/lib/rails/generators/alchemy/deploy_script/templates/deploy.rb.tt +1 -1
- data/lib/rails/generators/alchemy/devise/devise_generator.rb +24 -0
- data/lib/rails/generators/alchemy/scaffold/files/elements.yml +1 -111
- data/lib/rails/generators/alchemy/scaffold/templates/page_layouts.yml.tt +1 -27
- data/lib/tasks/ferret.rake +6 -6
- data/spec/controllers/admin/clipboard_controller_spec.rb +2 -3
- data/spec/controllers/admin/contents_controller_spec.rb +1 -2
- data/spec/controllers/admin/elements_controller_spec.rb +1 -2
- data/spec/controllers/admin/languages_controller_spec.rb +2 -3
- data/spec/controllers/admin/pages_controller_spec.rb +2 -3
- data/spec/controllers/admin/trash_controller_spec.rb +1 -2
- data/spec/controllers/admin/users_controller_spec.rb +36 -5
- data/spec/controllers/attachments_controller_spec.rb +2 -4
- data/spec/controllers/base_controller_spec.rb +25 -0
- data/spec/controllers/elements_controller_spec.rb +1 -2
- data/spec/controllers/passwords_controller_spec.rb +16 -0
- data/spec/controllers/pictures_controller_spec.rb +1 -2
- data/spec/controllers/user_sessions_controller_spec.rb +21 -0
- data/spec/controllers/users_controller_spec.rb +67 -0
- data/spec/dummy/db/migrate/20130121092645_migrate_to_devise.rb +24 -0
- data/spec/dummy/db/schema.rb +17 -16
- data/spec/factories.rb +2 -0
- data/spec/integration/pages_controller_spec.rb +9 -1
- data/spec/models/content_spec.rb +11 -0
- data/spec/models/element_spec.rb +11 -2
- data/spec/models/essence_richtext_spec.rb +42 -6
- data/spec/models/essence_text_spec.rb +41 -0
- data/spec/models/page_spec.rb +39 -0
- data/spec/models/user_spec.rb +95 -6
- data/spec/spec_helper.rb +2 -3
- data/spec/support/alchemy/controller_hacks.rb +1 -1
- data/spec/support/alchemy/specs_helpers.rb +4 -4
- metadata +47 -10
- data/app/models/alchemy/user_session.rb +0 -14
- data/app/views/alchemy/notifications/admin_user_created.text.erb +0 -13
- data/app/views/alchemy/user_sessions/logout.html.erb +0 -3
|
@@ -46,7 +46,7 @@ module Alchemy
|
|
|
46
46
|
|
|
47
47
|
case field.to_sym
|
|
48
48
|
when :email
|
|
49
|
-
validates_format_of field, :with => ::
|
|
49
|
+
validates_format_of field, :with => ::Devise.email_regexp, :if => :email_is_filled
|
|
50
50
|
when :email_confirmation
|
|
51
51
|
validates_confirmation_of :email
|
|
52
52
|
end
|
data/app/models/alchemy/page.rb
CHANGED
|
@@ -46,7 +46,7 @@ module Alchemy
|
|
|
46
46
|
|
|
47
47
|
has_many :folded_pages
|
|
48
48
|
has_many :cells, :dependent => :destroy
|
|
49
|
-
has_many :elements, :
|
|
49
|
+
has_many :elements, :order => :position
|
|
50
50
|
has_many :contents, :through => :elements
|
|
51
51
|
has_many :legacy_urls, :class_name => 'Alchemy::LegacyPageUrl'
|
|
52
52
|
has_and_belongs_to_many :to_be_sweeped_elements, :class_name => 'Alchemy::Element', :uniq => true, :join_table => 'alchemy_elements_alchemy_pages'
|
|
@@ -74,6 +74,7 @@ module Alchemy
|
|
|
74
74
|
after_update :trash_not_allowed_elements, :if => :page_layout_changed?
|
|
75
75
|
after_update :autogenerate_elements, :if => :page_layout_changed?
|
|
76
76
|
after_update :create_legacy_url, :if => :urlname_changed?
|
|
77
|
+
after_destroy { elements.each {|el| el.destroy unless el.trashed? } }
|
|
77
78
|
|
|
78
79
|
scope :language_roots, where(:language_root => true)
|
|
79
80
|
scope :layoutpages, where(:layoutpage => true)
|
|
@@ -95,6 +96,10 @@ module Alchemy
|
|
|
95
96
|
# Used for flushing all page caches at once.
|
|
96
97
|
scope :flushables, not_locked.published.contentpages
|
|
97
98
|
scope :searchables, not_restricted.published.contentpages
|
|
99
|
+
# Scope for only the pages from Alchemy::Site.current
|
|
100
|
+
scope :from_current_site, lambda { where(:alchemy_languages => {site_id: Site.current}).joins(:language) }
|
|
101
|
+
# TODO: add this as default_scope
|
|
102
|
+
#default_scope { from_current_site }
|
|
98
103
|
|
|
99
104
|
# Class methods
|
|
100
105
|
#
|
|
@@ -158,7 +163,7 @@ module Alchemy
|
|
|
158
163
|
#
|
|
159
164
|
def copy_elements(source, target)
|
|
160
165
|
new_elements = []
|
|
161
|
-
source.elements.each do |element|
|
|
166
|
+
source.elements.not_trashed.each do |element|
|
|
162
167
|
# detect cell for element
|
|
163
168
|
if element.cell
|
|
164
169
|
cell = target.cells.detect { |c| c.name == element.cell.name }
|
data/app/models/alchemy/user.rb
CHANGED
|
@@ -3,10 +3,9 @@ module Alchemy
|
|
|
3
3
|
|
|
4
4
|
model_stamper
|
|
5
5
|
stampable(:stamper_class_name => 'Alchemy::User')
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
end
|
|
6
|
+
|
|
7
|
+
devise(*Config.get(:devise_modules))
|
|
8
|
+
|
|
10
9
|
acts_as_taggable
|
|
11
10
|
|
|
12
11
|
attr_accessible(
|
|
@@ -24,59 +23,102 @@ module Alchemy
|
|
|
24
23
|
|
|
25
24
|
has_many :folded_pages
|
|
26
25
|
|
|
27
|
-
|
|
26
|
+
# Unlock all locked pages before destroy and before the user gets logged out.
|
|
27
|
+
before_destroy :unlock_pages!
|
|
28
|
+
Warden::Manager.before_logout do |user, auth, opts|
|
|
29
|
+
if user
|
|
30
|
+
user.unlock_pages!
|
|
31
|
+
end
|
|
32
|
+
end
|
|
28
33
|
|
|
29
34
|
scope :admins, where(:role => 'admin')
|
|
35
|
+
scope :logged_in, lambda { where("last_request_at > ?", logged_in_timeout.seconds.ago) }
|
|
36
|
+
scope :logged_out, lambda { where("last_request_at is NULL or last_request_at <= ?", logged_in_timeout.seconds.ago) }
|
|
30
37
|
|
|
31
38
|
ROLES = Config.get(:user_roles)
|
|
32
39
|
|
|
40
|
+
class << self
|
|
41
|
+
def human_rolename(role)
|
|
42
|
+
I18n.t("user_roles.#{role}")
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def genders_for_select
|
|
46
|
+
[
|
|
47
|
+
[I18n.t('male'), 'male'],
|
|
48
|
+
[I18n.t('female'), 'female']
|
|
49
|
+
]
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def logged_in_timeout
|
|
53
|
+
Config.get(:auto_logout_time).minutes.to_i
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
33
57
|
def role_symbols
|
|
34
58
|
[role.to_sym]
|
|
35
59
|
end
|
|
36
60
|
|
|
61
|
+
# Returns true if the user ahs admin role
|
|
37
62
|
def is_admin?
|
|
38
|
-
|
|
63
|
+
role == "admin"
|
|
39
64
|
end
|
|
40
65
|
alias_method :admin?, :is_admin?
|
|
41
66
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
end
|
|
67
|
+
# Calls unlock on all locked pages
|
|
68
|
+
def unlock_pages!
|
|
69
|
+
pages_locked_by_me.map(&:unlock)
|
|
46
70
|
end
|
|
47
71
|
|
|
72
|
+
# Returns all pages locked by user.
|
|
73
|
+
#
|
|
74
|
+
# A page gets locked, if the user requests to edit the page.
|
|
75
|
+
#
|
|
48
76
|
def pages_locked_by_me
|
|
49
77
|
Page.where(:locked => true).where(:locked_by => self.id).order(:updated_at)
|
|
50
78
|
end
|
|
79
|
+
alias_method :locked_pages, :pages_locked_by_me
|
|
51
80
|
|
|
52
81
|
# Returns the firstname and lastname as a string
|
|
82
|
+
#
|
|
53
83
|
# If both are blank, returns the login
|
|
54
|
-
#
|
|
55
|
-
#
|
|
84
|
+
#
|
|
85
|
+
# @option options :flipped (false)
|
|
86
|
+
# Flip the firstname and lastname
|
|
87
|
+
#
|
|
56
88
|
def fullname(options = {})
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
options[:flipped] ? "#{self.lastname}, #{self.firstname}".squeeze(" ") : "#{self.firstname} #{self.lastname}".squeeze(" ")
|
|
89
|
+
if lastname.blank? && firstname.blank?
|
|
90
|
+
login
|
|
60
91
|
else
|
|
61
|
-
|
|
92
|
+
options = {:flipped => false}.merge(options)
|
|
93
|
+
fullname = options[:flipped] ? "#{lastname}, #{firstname}" : "#{firstname} #{lastname}"
|
|
94
|
+
fullname.squeeze(" ").strip
|
|
62
95
|
end
|
|
63
96
|
end
|
|
97
|
+
alias_method :name, :fullname
|
|
64
98
|
|
|
65
|
-
|
|
99
|
+
# Returns true if the last request not longer ago then the logged_in_time_out
|
|
100
|
+
def logged_in?
|
|
101
|
+
raise "Can not determine the records login state because there is no last_request_at column" if !respond_to?(:last_request_at)
|
|
102
|
+
!last_request_at.nil? && last_request_at > logged_in_timeout.seconds.ago
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# Opposite of logged_in?
|
|
106
|
+
def logged_out?
|
|
107
|
+
!logged_in?
|
|
108
|
+
end
|
|
66
109
|
|
|
67
110
|
def human_role_name
|
|
68
111
|
self.class.human_rolename(self.role)
|
|
69
112
|
end
|
|
70
113
|
|
|
71
|
-
def
|
|
72
|
-
|
|
114
|
+
def store_request_time!
|
|
115
|
+
update_attribute(:last_request_at, Time.now)
|
|
73
116
|
end
|
|
74
117
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
]
|
|
118
|
+
private
|
|
119
|
+
|
|
120
|
+
def logged_in_timeout
|
|
121
|
+
self.class.logged_in_timeout
|
|
80
122
|
end
|
|
81
123
|
|
|
82
124
|
end
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<% end -%>
|
|
9
9
|
</h1>
|
|
10
10
|
<p>
|
|
11
|
-
<small><%= _t('Your last login was on %{time}', :time => l(current_user.
|
|
11
|
+
<small><%= _t('Your last login was on %{time}', :time => l(current_user.last_sign_in_at)) unless current_user.last_sign_in_at.blank? %></small>
|
|
12
12
|
</p>
|
|
13
13
|
</div>
|
|
14
14
|
<div class="widget">
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
<% if root = Alchemy::Page.rootpage %>
|
|
1
2
|
<div id="create_language_tree_form" style="display: none">
|
|
2
3
|
<div class="info">
|
|
3
4
|
<%= render_icon('info') %>
|
|
@@ -37,7 +38,7 @@
|
|
|
37
38
|
<%= form.hidden_field :language_code, :value => @language.code %>
|
|
38
39
|
<%= form.hidden_field :page_layout, :value => @language.page_layout %>
|
|
39
40
|
<%= form.hidden_field :language_root, :value => true %>
|
|
40
|
-
<%= form.hidden_field :parent_id, :value =>
|
|
41
|
+
<%= form.hidden_field :parent_id, :value => root.id %>
|
|
41
42
|
<%= hidden_field_tag :redirect_to, admin_pages_path %>
|
|
42
43
|
<%= form.button _t("create_tree_as_new_language", :language => @language.name), :class => 'button' %>
|
|
43
44
|
<% end %>
|
|
@@ -51,3 +52,9 @@
|
|
|
51
52
|
<%- end -%>
|
|
52
53
|
|
|
53
54
|
</div>
|
|
55
|
+
<% else %>
|
|
56
|
+
<%= render_message :error do %>
|
|
57
|
+
<h2>Root page not found.</h2>
|
|
58
|
+
<p>Please run <code>rake alchemy:db:seed</code> task.</p>
|
|
59
|
+
<% end %>
|
|
60
|
+
<% end %>
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
<td class="label mandatory"><%= f.label 'password_confirmation' %></td>
|
|
32
32
|
<td class="input"><%= f.password_field 'password_confirmation', :class => 'thin_border long', :autocomplete => "off", :required => action_name == 'signup' %></td>
|
|
33
33
|
</tr>
|
|
34
|
-
<% if
|
|
34
|
+
<% if @signup %>
|
|
35
35
|
<%= f.hidden_field :role %>
|
|
36
36
|
<% elsif permitted_to? :update_role %>
|
|
37
37
|
<tr>
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
<td class="select"><%= f.select :role, options_for_select(@user_roles, @user.role), {}, {:class => 'alchemy_selectbox long'} %></td>
|
|
40
40
|
</tr>
|
|
41
41
|
<% end %>
|
|
42
|
-
<% unless
|
|
42
|
+
<% unless @signup %>
|
|
43
43
|
<tr>
|
|
44
44
|
<td class="label"><%= f.label :tag_list %></td>
|
|
45
45
|
<td class="input">
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<td><%= user.lastname -%></td>
|
|
9
9
|
<td class="email"><%= user.email %></td>
|
|
10
10
|
<td><%= _t(user.language, :scope => 'translations') %></td>
|
|
11
|
-
<td><%= user.
|
|
11
|
+
<td><%= user.last_sign_in_at.present? ? l(user.last_sign_in_at, :format => :default) : _t(:unknown) %></td>
|
|
12
12
|
<td class="role"><%= user.human_role_name %></td>
|
|
13
13
|
<td class="tools">
|
|
14
14
|
<%- permitted_to?(:destroy, :alchemy_admin_users) do -%>
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
<th><%= Alchemy::User.human_attribute_name('lastname') %></th>
|
|
27
27
|
<th class="email"><%= Alchemy::User.human_attribute_name('email') %></th>
|
|
28
28
|
<th><%= Alchemy::User.human_attribute_name('language') %></th>
|
|
29
|
-
<th><%= Alchemy::User.human_attribute_name('
|
|
29
|
+
<th><%= Alchemy::User.human_attribute_name('last_sign_in_at') %></th>
|
|
30
30
|
<th class="role"><%= Alchemy::User.human_attribute_name('role') %></th>
|
|
31
31
|
<th class="tools"></th>
|
|
32
32
|
</tr>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
Willkommen in Alchemy!
|
|
2
|
+
|
|
3
|
+
Um die Inhalte Ihrer Webseite zu bearbeiten klicken Sie bitte auf folgenden Link:
|
|
4
|
+
|
|
5
|
+
<%= @url %>
|
|
6
|
+
|
|
7
|
+
Ihr Benutzername lautet: <%= @user.login %>
|
|
8
|
+
|
|
9
|
+
(Aus Sicherheitsgründen stellen wir Ihr Passwort hier nicht da. Wenn Sie Ihr Passwort vergessen haben oder dies Ihr erster Login ist, gehen Sie bitte auf: <%= new_password_url(@user) %>)
|
|
10
|
+
|
|
11
|
+
Viel Spaß mit Alchemy!
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
Welcome to Alchemy!
|
|
2
|
+
|
|
3
|
+
To manage your website open a browser and go to:
|
|
4
|
+
|
|
5
|
+
<%= @url %>
|
|
6
|
+
|
|
7
|
+
Your username is: <%= @user.login %>
|
|
8
|
+
|
|
9
|
+
(For security reasons we do not show your password here. If you forgot your password or this is your first login, please goto: <%= new_password_url(@user) %>)
|
|
10
|
+
|
|
11
|
+
Have much fun with Alchemy!
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
<%= @url %>
|
|
6
6
|
|
|
7
7
|
<%= Alchemy::I18n.t('mailer.new_user_mail.username') %>: <%= @user.login %>
|
|
8
|
-
|
|
8
|
+
|
|
9
|
+
<%= Alchemy::I18n.t('mailer.new_user_mail.password_notice') % {:url => new_password_url(@user)}%>
|
|
9
10
|
|
|
10
11
|
<%= Alchemy::I18n.t('mailer.new_user_mail.greeting') %>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
Hallo <%= @user.fullname %>.
|
|
2
|
+
|
|
3
|
+
Sie haben angefordert Ihr Passwort zurückzusetzen. Dies kann durch anklicken des nachfolgenden Links bestätigt werden.
|
|
4
|
+
|
|
5
|
+
<%= alchemy.edit_password_url(@user, :reset_password_token => @user.reset_password_token) %>
|
|
6
|
+
|
|
7
|
+
Wenn Sie diese Zurücksetzung nicht angefragt haben, dann können Sie diese E-Mail einfach ignorieren.
|
|
8
|
+
Ihr Passwort wird erst dann zurückgesetzt, wenn Sie den Link anklicken.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
Hello <%= @user.fullname %>.
|
|
2
|
+
|
|
3
|
+
You has requested to change your password. Please confirm this by clicking the link below.
|
|
4
|
+
|
|
5
|
+
<%= alchemy.edit_password_url(@user, :reset_password_token => @user.reset_password_token) %>
|
|
6
|
+
|
|
7
|
+
If you didn't request this, please ignore this email.
|
|
8
|
+
Your password won't change until you access the link above and create a new one.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
<div id="login_box">
|
|
2
|
+
<div id="alchemy_greeting">
|
|
3
|
+
<%= image_tag("alchemy/alchemy-logo.png", :style => "width: 240px; height: 70px") %>
|
|
4
|
+
</div>
|
|
5
|
+
<div class="login_signup_box">
|
|
6
|
+
<% if @user.errors.blank? %>
|
|
7
|
+
<%= render_message do %>
|
|
8
|
+
<h1><%= _t 'Password reset' %></h1>
|
|
9
|
+
<p><%= _t 'Please enter a new password' %></p>
|
|
10
|
+
<% end %>
|
|
11
|
+
<% else %>
|
|
12
|
+
<div id="errors" style="display: block">
|
|
13
|
+
<%= devise_error_messages! %>
|
|
14
|
+
</div>
|
|
15
|
+
<% end %>
|
|
16
|
+
<%= form_for(:user, :url => password_path, :html => { :method => :put }) do |f| %>
|
|
17
|
+
<table>
|
|
18
|
+
<tr>
|
|
19
|
+
<td class="label"><%= f.label :password, _t("New password") %></td>
|
|
20
|
+
<td class="input"><%= f.password_field :password, :autofocus => true %></td>
|
|
21
|
+
</tr>
|
|
22
|
+
<tr>
|
|
23
|
+
<td class="label"><%= f.label :password_confirmation, _t("Confirm new password") %></td>
|
|
24
|
+
<td class="input"><%= f.password_field :password_confirmation %></td>
|
|
25
|
+
</tr>
|
|
26
|
+
<tr>
|
|
27
|
+
<td colspan="2" class="submit">
|
|
28
|
+
<%= f.hidden_field :reset_password_token %>
|
|
29
|
+
<%= f.button _t("Change password") %>
|
|
30
|
+
</td>
|
|
31
|
+
</tr>
|
|
32
|
+
</table>
|
|
33
|
+
<% end %>
|
|
34
|
+
</div>
|
|
35
|
+
</div>
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
<div id="login_box">
|
|
2
|
+
<div id="alchemy_greeting">
|
|
3
|
+
<%= image_tag("alchemy/alchemy-logo.png", :style => "width: 240px; height: 70px") %>
|
|
4
|
+
</div>
|
|
5
|
+
<div class="login_signup_box">
|
|
6
|
+
<% if @user.errors.blank? %>
|
|
7
|
+
<%= render_message do %>
|
|
8
|
+
<h1><%= _t 'Password reset' %></h1>
|
|
9
|
+
<p><%= _t 'Please enter your email address' %></p>
|
|
10
|
+
<% end %>
|
|
11
|
+
<% else %>
|
|
12
|
+
<div id="errors" style="display: block">
|
|
13
|
+
<%= devise_error_messages! %>
|
|
14
|
+
</div>
|
|
15
|
+
<% end %>
|
|
16
|
+
<%= form_for(:user, :url => password_path, :html => { :method => :post }) do |f| %>
|
|
17
|
+
<table>
|
|
18
|
+
<tr>
|
|
19
|
+
<td class="label"><%= f.label :email %></td>
|
|
20
|
+
<td class="input"><%= f.email_field :email, :autofocus => true %></td>
|
|
21
|
+
</tr>
|
|
22
|
+
<tr>
|
|
23
|
+
<td colspan="2" class="submit">
|
|
24
|
+
<%= f.button _t("Send reset instructions") %>
|
|
25
|
+
</td>
|
|
26
|
+
</tr>
|
|
27
|
+
</table>
|
|
28
|
+
<% end %>
|
|
29
|
+
</div>
|
|
30
|
+
</div>
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
<label><%= _t("Do you want to") %></label>
|
|
5
5
|
<%= link_to _t('stay logged in'), alchemy.root_path, :class => 'button' %>
|
|
6
6
|
</p>
|
|
7
|
-
|
|
7
|
+
<%= form_tag alchemy.logout_path, :method => :delete, :class => 'buttons' do %>
|
|
8
8
|
<label><%= _t('or to completly') %></label>
|
|
9
|
-
<%=
|
|
10
|
-
|
|
9
|
+
<%= button _t('logout') %>
|
|
10
|
+
<% end %>
|
|
11
11
|
</div>
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
<%= image_tag("alchemy/alchemy-logo.png", :style => "width: 240px; height: 70px") %>
|
|
4
4
|
</div>
|
|
5
5
|
<div class="login_signup_box">
|
|
6
|
-
<%= form_for
|
|
6
|
+
<%= form_for :user, :url => {:action => :create}, :html => { :id => "login" } do |f| %>
|
|
7
7
|
<%= f.error_messages %>
|
|
8
8
|
<table>
|
|
9
9
|
<tr>
|
|
@@ -20,6 +20,9 @@
|
|
|
20
20
|
</td>
|
|
21
21
|
<td class="input">
|
|
22
22
|
<%= f.password_field :password, :class => 'thin_border' %>
|
|
23
|
+
<p class="foot_note">
|
|
24
|
+
<%= link_to _t('Forgot your password?'), new_password_path(@user) %>
|
|
25
|
+
</p>
|
|
23
26
|
</td>
|
|
24
27
|
</tr>
|
|
25
28
|
<tr>
|
|
@@ -36,7 +39,7 @@
|
|
|
36
39
|
<%- content_for :javascripts do -%>
|
|
37
40
|
<script type="text/javascript" charset="utf-8">
|
|
38
41
|
jQuery(function($) {
|
|
39
|
-
$('#
|
|
42
|
+
$('#user_login').focus();
|
|
40
43
|
$('#user_screensize').val(function() {
|
|
41
44
|
return screen.width+'x'+screen.height;
|
|
42
45
|
});
|
|
File without changes
|
data/config/alchemy/config.yml
CHANGED
|
@@ -185,3 +185,15 @@ link_target_options: [blank]
|
|
|
185
185
|
|
|
186
186
|
# Should pages that redirect to an external url open the link in a new tab/window?
|
|
187
187
|
open_external_links_in_new_tab: true
|
|
188
|
+
|
|
189
|
+
# === Devise modules
|
|
190
|
+
#
|
|
191
|
+
# List of Devise modules that should be activated on the user model.
|
|
192
|
+
#
|
|
193
|
+
devise_modules:
|
|
194
|
+
- :database_authenticatable
|
|
195
|
+
- :trackable
|
|
196
|
+
- :validatable
|
|
197
|
+
- :timeoutable
|
|
198
|
+
- :recoverable
|
|
199
|
+
# - :encryptable # Uncomment this if you are upgrading from an Alchemy version < 2.5.0
|