alchemy_cms 2.5.0.rc3 → 2.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +1 -1
- data/README.md +22 -29
- data/alchemy_cms.gemspec +3 -2
- data/app/assets/javascripts/alchemy/alchemy.base.js +7 -0
- data/app/assets/javascripts/alchemy/alchemy.datepicker.js +3 -2
- data/app/assets/javascripts/alchemy/alchemy.image_cropper.js +5 -2
- data/app/assets/javascripts/alchemy/alchemy.js +8 -1
- data/app/assets/javascripts/alchemy/alchemy.menubar.js +4 -1
- data/app/assets/stylesheets/alchemy/archive.scss +1 -6
- data/app/assets/stylesheets/alchemy/base.scss +37 -17
- data/app/assets/stylesheets/alchemy/dashboard.scss +41 -24
- data/app/assets/stylesheets/alchemy/form_elements.scss +1 -1
- data/app/assets/stylesheets/alchemy/jquery-ui.scss +3 -2
- data/app/assets/stylesheets/alchemy/login.scss +1 -1
- data/app/assets/stylesheets/alchemy/menubar.css.scss +3 -1
- data/app/assets/stylesheets/alchemy/mixins.scss +9 -0
- data/app/assets/stylesheets/alchemy/notices.scss +1 -1
- data/app/assets/stylesheets/alchemy/sitemap.scss +1 -1
- data/app/controllers/alchemy/admin/dashboard_controller.rb +46 -3
- data/app/controllers/alchemy/admin/essence_pictures_controller.rb +3 -0
- data/app/controllers/alchemy/admin/pages_controller.rb +7 -7
- data/app/controllers/alchemy/attachments_controller.rb +1 -1
- data/app/controllers/alchemy/base_controller.rb +5 -1
- data/app/helpers/alchemy/admin/essences_helper.rb +21 -0
- data/app/models/alchemy/attachment.rb +3 -1
- data/app/models/alchemy/page.rb +11 -8
- data/app/views/alchemy/admin/dashboard/_locked_pages.html.erb +38 -0
- data/app/views/alchemy/admin/dashboard/_recent_pages.html.erb +22 -0
- data/app/views/alchemy/admin/dashboard/_sites.html.erb +13 -0
- data/app/views/alchemy/admin/dashboard/_users.html.erb +19 -0
- data/app/views/alchemy/admin/dashboard/index.html.erb +35 -101
- data/app/views/alchemy/admin/dashboard/info.html.erb +57 -0
- data/app/views/alchemy/admin/elements/create.js.erb +4 -1
- data/app/views/alchemy/admin/elements/update.js.erb +1 -0
- data/app/views/alchemy/admin/essence_pictures/crop.html.erb +38 -41
- data/app/views/alchemy/admin/essence_pictures/update.js.erb +2 -4
- data/app/views/alchemy/essences/_essence_file_view.html.erb +1 -2
- data/app/views/alchemy/essences/_essence_picture_editor.html.erb +1 -18
- data/app/views/alchemy/essences/_essence_picture_tools.html.erb +1 -1
- data/app/views/layouts/alchemy/admin.html.erb +1 -0
- data/config/authorization_rules.rb +1 -0
- data/config/locales/alchemy.de.yml +5 -1
- data/config/locales/alchemy.en.yml +1 -0
- data/config/routes.rb +5 -1
- data/lib/alchemy/errors.rb +7 -0
- data/lib/alchemy/version.rb +1 -1
- data/lib/alchemy_cms.rb +1 -0
- data/lib/tasks/ferret.rake +0 -3
- data/spec/models/attachment_spec.rb +27 -0
- data/spec/models/page_spec.rb +7 -0
- metadata +33 -7
@@ -94,11 +94,13 @@
|
|
94
94
|
@include inline-block;
|
95
95
|
list-style-type: none;
|
96
96
|
|
97
|
-
a {
|
97
|
+
a, button {
|
98
98
|
line-height: 14px;
|
99
99
|
@include default-button-style;
|
100
100
|
font-weight: normal;
|
101
101
|
text-decoration: none !important;
|
102
|
+
color: $text-color !important;
|
103
|
+
font-family: $default-font-face;
|
102
104
|
}
|
103
105
|
}
|
104
106
|
}
|
@@ -124,3 +124,12 @@
|
|
124
124
|
border-color: transparent transparent $light_yellow transparent;
|
125
125
|
}
|
126
126
|
}
|
127
|
+
|
128
|
+
@mixin thumbnail-background {
|
129
|
+
display: table-cell;
|
130
|
+
background-color: $dark-gray;
|
131
|
+
text-align: center;
|
132
|
+
vertical-align: middle;
|
133
|
+
padding: 0;
|
134
|
+
line-height: 0;
|
135
|
+
}
|
@@ -1,14 +1,57 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
|
1
3
|
module Alchemy
|
2
4
|
module Admin
|
3
5
|
class DashboardController < Alchemy::Admin::BaseController
|
4
6
|
|
5
7
|
def index
|
6
|
-
@alchemy_version = Alchemy::VERSION
|
7
|
-
@clipboard_items = session[:clipboard]
|
8
8
|
@last_edited_pages = Page.all_last_edited_from(current_user)
|
9
|
-
@locked_pages = Page.all_locked
|
9
|
+
@locked_pages = Page.from_current_site.all_locked
|
10
10
|
@online_users = User.logged_in.to_a - [current_user]
|
11
11
|
@first_time = current_user.sign_in_count == 1 && current_user.last_sign_in_at.nil?
|
12
|
+
@sites = Site.scoped
|
13
|
+
end
|
14
|
+
|
15
|
+
def info
|
16
|
+
@alchemy_version = Alchemy.version
|
17
|
+
render :layout => false
|
18
|
+
end
|
19
|
+
|
20
|
+
def update_check
|
21
|
+
@alchemy_version = Alchemy.version
|
22
|
+
if @alchemy_version < latest_alchemy_version
|
23
|
+
render :text => 'true'
|
24
|
+
else
|
25
|
+
render :text => 'false'
|
26
|
+
end
|
27
|
+
rescue UpdateServiceUnavailable => e
|
28
|
+
render :text => e, :status => 503
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def alchemy_tags
|
34
|
+
url = URI.parse('https://api.github.com/repos/magiclabs/alchemy_cms/tags')
|
35
|
+
request = Net::HTTP::Get.new(url.path)
|
36
|
+
connection = Net::HTTP.new(url.host, url.port)
|
37
|
+
connection.use_ssl = true
|
38
|
+
connection.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
39
|
+
response = connection.request(request)
|
40
|
+
if response.code == "200"
|
41
|
+
JSON.parse(response.body)
|
42
|
+
else
|
43
|
+
raise UpdateServiceUnavailable
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def alchemy_versions
|
48
|
+
return [] if alchemy_tags.blank?
|
49
|
+
alchemy_tags.collect { |h| h['name'] }.sort
|
50
|
+
end
|
51
|
+
|
52
|
+
def latest_alchemy_version
|
53
|
+
return '' if alchemy_versions.blank?
|
54
|
+
alchemy_versions.last.gsub(/^v/, '')
|
12
55
|
end
|
13
56
|
|
14
57
|
end
|
@@ -3,6 +3,8 @@ module Alchemy
|
|
3
3
|
class EssencePicturesController < Alchemy::Admin::BaseController
|
4
4
|
|
5
5
|
helper "alchemy/admin/contents"
|
6
|
+
helper "alchemy/admin/essences"
|
7
|
+
helper "alchemy/url"
|
6
8
|
|
7
9
|
def edit
|
8
10
|
@essence_picture = EssencePicture.find(params[:id])
|
@@ -49,6 +51,7 @@ module Alchemy
|
|
49
51
|
@essence_picture = EssencePicture.find(params[:id])
|
50
52
|
@essence_picture.update_attributes(params[:essence_picture])
|
51
53
|
@content = Content.find(params[:content_id])
|
54
|
+
@options = params[:options] || {}
|
52
55
|
end
|
53
56
|
|
54
57
|
def assign
|
@@ -15,7 +15,7 @@ module Alchemy
|
|
15
15
|
|
16
16
|
def index
|
17
17
|
@page_root = Page.language_root_for(session[:language_id])
|
18
|
-
@locked_pages = Page.all_locked_by(current_user)
|
18
|
+
@locked_pages = Page.from_current_site.all_locked_by(current_user)
|
19
19
|
@languages = Language.all
|
20
20
|
if !@page_root
|
21
21
|
if @languages.length == 1
|
@@ -56,7 +56,9 @@ module Alchemy
|
|
56
56
|
source_page = Page.find(params[:paste_from_clipboard])
|
57
57
|
@page = Page.copy(source_page, {
|
58
58
|
:parent_id => params[:page][:parent_id],
|
59
|
-
:language => parent.language
|
59
|
+
:language => parent.language,
|
60
|
+
:name => params[:page][:name],
|
61
|
+
:title => params[:page][:name]
|
60
62
|
})
|
61
63
|
if source_page.children.any?
|
62
64
|
source_page.copy_children_to(@page)
|
@@ -81,7 +83,7 @@ module Alchemy
|
|
81
83
|
redirect_to admin_pages_path
|
82
84
|
else
|
83
85
|
@page.lock(current_user)
|
84
|
-
@locked_pages = Page.all_locked_by(current_user)
|
86
|
+
@locked_pages = Page.from_current_site.from_current_site.all_locked_by(current_user)
|
85
87
|
end
|
86
88
|
@layoutpage = @page.layoutpage?
|
87
89
|
end
|
@@ -135,10 +137,8 @@ module Alchemy
|
|
135
137
|
end
|
136
138
|
@area_name = params[:area_name]
|
137
139
|
@content_id = params[:content_id]
|
138
|
-
@attachments = Attachment.all.collect { |f| [f.name, download_attachment_path(:id => f.id, :name => f.
|
140
|
+
@attachments = Attachment.all.collect { |f| [f.name, download_attachment_path(:id => f.id, :name => f.urlname)] }
|
139
141
|
if params[:link_urls_for] == "newsletter"
|
140
|
-
# TODO: links in newsletters has to go through statistic controller. therfore we have to put a string inside the content_rtfs and replace this string with recipient.id before sending the newsletter.
|
141
|
-
#@url_prefix = "#{current_server}/recipients/reacts"
|
142
142
|
@url_prefix = current_server
|
143
143
|
end
|
144
144
|
if multi_language?
|
@@ -161,7 +161,7 @@ module Alchemy
|
|
161
161
|
# fetching page via before filter
|
162
162
|
@page.unlock
|
163
163
|
flash[:notice] = _t("unlocked_page", :name => @page.name)
|
164
|
-
@pages_locked_by_user = Page.all_locked_by(current_user)
|
164
|
+
@pages_locked_by_user = Page.from_current_site.all_locked_by(current_user)
|
165
165
|
respond_to do |format|
|
166
166
|
format.js
|
167
167
|
format.html {
|
@@ -11,7 +11,7 @@ module Alchemy
|
|
11
11
|
before_filter :mailer_set_url_options
|
12
12
|
before_filter :store_user_request_time
|
13
13
|
|
14
|
-
helper_method :current_server, :current_site
|
14
|
+
helper_method :current_server, :current_site, :multi_site?
|
15
15
|
|
16
16
|
# Returns a host string with the domain the app is running on.
|
17
17
|
def current_server
|
@@ -36,6 +36,10 @@ module Alchemy
|
|
36
36
|
Language.published.count > 1
|
37
37
|
end
|
38
38
|
|
39
|
+
def multi_site?
|
40
|
+
Site.count > 1
|
41
|
+
end
|
42
|
+
|
39
43
|
def raise_not_found_error
|
40
44
|
raise ActionController::RoutingError.new('Not Found')
|
41
45
|
end
|
@@ -125,6 +125,27 @@ module Alchemy
|
|
125
125
|
render :partial => 'alchemy/admin/contents/missing', :locals => {:element => element, :name => name, :options => options}
|
126
126
|
end
|
127
127
|
|
128
|
+
def essence_picture_thumbnail(content, options)
|
129
|
+
image_options = {
|
130
|
+
:size => content.ingredient.cropped_thumbnail_size(content.essence.render_size.blank? ? options[:image_size] : content.essence.render_size),
|
131
|
+
:crop_from => content.essence.crop_from.blank? ? nil : content.essence.crop_from,
|
132
|
+
:crop_size => content.essence.crop_size.blank? ? nil : content.essence.crop_size,
|
133
|
+
:crop => content.essence.crop_size.blank? && content.essence.crop_from.blank? ? 'crop' : nil
|
134
|
+
}
|
135
|
+
image_tag(
|
136
|
+
alchemy.thumbnail_path({
|
137
|
+
:id => content.ingredient.id,
|
138
|
+
:name => content.ingredient.urlname,
|
139
|
+
:sh => content.ingredient.security_token(image_options)
|
140
|
+
}.merge(image_options)),
|
141
|
+
:alt => content.ingredient.name,
|
142
|
+
:class => 'img_paddingtop',
|
143
|
+
:title => _t("image_name") + ": #{content.ingredient.name}",
|
144
|
+
:onload => "Alchemy.fadeImage(this, '##{content_dom_id(content)} .picture_content_spinner');",
|
145
|
+
:style => "display: none;"
|
146
|
+
)
|
147
|
+
end
|
148
|
+
|
128
149
|
end
|
129
150
|
end
|
130
151
|
end
|
@@ -25,7 +25,9 @@ module Alchemy
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def urlname
|
28
|
-
|
28
|
+
parts = filename.split('.')
|
29
|
+
sfx = parts.pop
|
30
|
+
"#{parts.join('-')}.#{sfx}"
|
29
31
|
end
|
30
32
|
|
31
33
|
# Checks if the attachment is restricted, because it is attached on restricted pages only
|
data/app/models/alchemy/page.rb
CHANGED
@@ -131,7 +131,8 @@ module Alchemy
|
|
131
131
|
differences.stringify_keys!
|
132
132
|
attributes = source.attributes.merge(differences)
|
133
133
|
attributes.merge!(DEFAULT_ATTRIBUTES_FOR_COPY)
|
134
|
-
|
134
|
+
new_name = differences['name'].present? ? differences['name'] : "#{source.name} (#{I18n.t('Copy')})"
|
135
|
+
attributes.merge!('name' => new_name)
|
135
136
|
page = self.new(attributes.except(*SKIPPED_ATTRIBUTES_ON_COPY))
|
136
137
|
page.tag_list = source.tag_list
|
137
138
|
if page.save!
|
@@ -232,17 +233,17 @@ module Alchemy
|
|
232
233
|
|
233
234
|
# Finds selected elements from page.
|
234
235
|
#
|
235
|
-
#
|
236
|
+
# Returns only public elements by default.
|
237
|
+
# Pass true as second argument to get all elements.
|
238
|
+
#
|
239
|
+
# === Options are:
|
236
240
|
#
|
237
241
|
# :only => Array of element names # Returns only elements with given names
|
238
242
|
# :except => Array of element names # Returns all elements except the ones with given names
|
239
243
|
# :count => Integer # Limit the count of returned elements
|
240
244
|
# :offset => Integer # Starts with an offset while returning elements
|
241
|
-
# :random => Boolean #
|
242
|
-
# :from_cell => Cell or String #
|
243
|
-
#
|
244
|
-
# Returns only public elements by default.
|
245
|
-
# Pass true as second argument to get all elements.
|
245
|
+
# :random => Boolean # Return elements randomly shuffled
|
246
|
+
# :from_cell => Cell or String # Return elements from given cell
|
246
247
|
#
|
247
248
|
def find_selected_elements(options = {}, show_non_public = false)
|
248
249
|
if options[:from_cell].class.name == 'Alchemy::Cell'
|
@@ -252,7 +253,9 @@ module Alchemy
|
|
252
253
|
if cell
|
253
254
|
elements = cell.elements
|
254
255
|
else
|
255
|
-
|
256
|
+
warn("Cell with name `#{options[:from_cell]}` could not be found!")
|
257
|
+
# Returns an empty relation. Can be removed with the release of Rails 4
|
258
|
+
elements = self.elements.where('1 = 0')
|
256
259
|
end
|
257
260
|
else
|
258
261
|
elements = self.elements.not_in_cell
|
@@ -0,0 +1,38 @@
|
|
1
|
+
<div class="widget">
|
2
|
+
<h2><%= _t('Currently locked pages') %>:</h2>
|
3
|
+
<table>
|
4
|
+
<% if @locked_pages.blank? %>
|
5
|
+
<tr class="even">
|
6
|
+
<td><%= _t('no pages') %></td>
|
7
|
+
</tr>
|
8
|
+
<% else %>
|
9
|
+
<% @locked_pages.each do |page| %>
|
10
|
+
<tr class="<%= cycle('even', 'odd', :name => 'locked_pages') %>">
|
11
|
+
<% if current_user.id == page.locked_by %>
|
12
|
+
<td>
|
13
|
+
<%= link_to(page.name, alchemy.edit_admin_page_path(page)) %>
|
14
|
+
</td>
|
15
|
+
<td>
|
16
|
+
<small><%= _t(:me) %></small>
|
17
|
+
</td>
|
18
|
+
<td>
|
19
|
+
<%= form_tag(alchemy.unlock_admin_page_path(page, :redirect_to => alchemy.admin_dashboard_url)) do %>
|
20
|
+
<button class="icon_button small" title="<%= _t('explain_unlocking') %>">
|
21
|
+
<%= render_icon('close small') %>
|
22
|
+
</button>
|
23
|
+
<% end %>
|
24
|
+
</td>
|
25
|
+
<% else %>
|
26
|
+
<td>
|
27
|
+
<%= page.name %>
|
28
|
+
</td>
|
29
|
+
<td colspan="2">
|
30
|
+
<small><%= page.locker_name %></small>
|
31
|
+
</td>
|
32
|
+
<% end %>
|
33
|
+
</tr>
|
34
|
+
<% end %>
|
35
|
+
<% end %>
|
36
|
+
</table>
|
37
|
+
</div>
|
38
|
+
<% reset_cycle('locked_pages') %>
|
@@ -0,0 +1,22 @@
|
|
1
|
+
<div class="widget">
|
2
|
+
<h2><%= _t('Your last updated pages') %>:</h2>
|
3
|
+
<table>
|
4
|
+
<% if @last_edited_pages.blank? %>
|
5
|
+
<tr class="even">
|
6
|
+
<td><%= _t('no pages') %></td>
|
7
|
+
</tr>
|
8
|
+
<% else %>
|
9
|
+
<% @last_edited_pages.each do |page| %>
|
10
|
+
<tr class="<%= cycle('even', 'odd', :name => 'edited_pages') %>">
|
11
|
+
<td>
|
12
|
+
<%= link_to_if((page.locked_by.blank? || page.locked_by == current_user.id), page.name, edit_admin_page_path(page)) %>
|
13
|
+
</td>
|
14
|
+
<td>
|
15
|
+
<small><%= l(page.updated_at) %></small>
|
16
|
+
</td>
|
17
|
+
</tr>
|
18
|
+
<% end %>
|
19
|
+
<% end %>
|
20
|
+
</table>
|
21
|
+
</div>
|
22
|
+
<% reset_cycle('edited_pages') %>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<div class="widget">
|
2
|
+
<h2><%= Alchemy::Site.model_name.human(:count => 2) %>:</h2>
|
3
|
+
<table>
|
4
|
+
<% @sites.each do |site| %>
|
5
|
+
<tr class="<%= cycle('even', 'odd', :name => 'sites') %>">
|
6
|
+
<td>
|
7
|
+
<%= link_to_unless(site == Alchemy::Site.current, site.name, login_url(:protocol => 'http://', :host => site.host, :user => {:login => current_user.login}), :target => '_blank') %>
|
8
|
+
</td>
|
9
|
+
<td><small><%= site.host %></small></td>
|
10
|
+
</tr>
|
11
|
+
<% end %>
|
12
|
+
</table>
|
13
|
+
</div>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<div class="widget">
|
2
|
+
<h2><%= _t('Who else is online') %>:</h2>
|
3
|
+
<table>
|
4
|
+
<% if @online_users.blank? %>
|
5
|
+
<tr class="even">
|
6
|
+
<td><%= _t('no users') %></td>
|
7
|
+
</tr>
|
8
|
+
<% else %>
|
9
|
+
<% @online_users.each do |user| %>
|
10
|
+
<tr class="<%= cycle('even', 'odd') %>">
|
11
|
+
<td><%= user.name %></td>
|
12
|
+
<td>
|
13
|
+
<small><%= user.human_role_name %></small>
|
14
|
+
</td>
|
15
|
+
</tr>
|
16
|
+
<% end %>
|
17
|
+
<% end %>
|
18
|
+
</table>
|
19
|
+
</div>
|
@@ -1,105 +1,39 @@
|
|
1
|
+
<%= toolbar(
|
2
|
+
:buttons => [
|
3
|
+
{
|
4
|
+
:icon => 'info',
|
5
|
+
:label => _t('info'),
|
6
|
+
:url => alchemy.dashboard_info_path,
|
7
|
+
:title => _t('info'),
|
8
|
+
:overlay_options => {
|
9
|
+
:title => _t('info'),
|
10
|
+
:size => "420x360"
|
11
|
+
},
|
12
|
+
:if_permitted_to => [:info, :alchemy_admin_dashboard]
|
13
|
+
}
|
14
|
+
],
|
15
|
+
:search => false
|
16
|
+
) %>
|
17
|
+
|
1
18
|
<div id="dashboard">
|
2
|
-
<
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
<
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
<h2><%= _t('Your last updated pages') %>:</h2>
|
16
|
-
<%- if @last_edited_pages.blank? -%>
|
17
|
-
<ul><li class="even"><%= _t('no pages') %></li></ul>
|
18
|
-
<%- else -%>
|
19
|
-
<ul>
|
20
|
-
<%- @last_edited_pages.each do |page| -%>
|
21
|
-
<li class="<%= cycle('even', 'odd', :name => 'edited_pages') %>"><%= link_to_if((page.locked_by.blank? || page.locked_by == current_user.id), page.name, edit_admin_page_path(page)) %> <small>(<%= l(page.updated_at) %>)</small></li>
|
22
|
-
<%- end -%>
|
23
|
-
</ul>
|
24
|
-
<%- end -%>
|
25
|
-
</div>
|
26
|
-
<%- reset_cycle('edited_pages') -%>
|
27
|
-
<div class="widget">
|
28
|
-
<h2><%= _t('Currently locked pages') %>:</h2>
|
29
|
-
<%- if @locked_pages.blank? -%>
|
30
|
-
<ul><li class="even"><%= _t('no pages') %></li></ul>
|
31
|
-
<%- else -%>
|
32
|
-
<ul>
|
33
|
-
<%- @locked_pages.each do |page| -%>
|
34
|
-
<li class="<%= cycle('even', 'odd', :name => 'locked_pages') %>">
|
35
|
-
<%- if current_user.id == page.locked_by -%>
|
36
|
-
<%= link_to(page.name, alchemy.edit_admin_page_path(page)) %> <small>(<%= page.locker.name %>)</small>
|
37
|
-
<%= form_tag(alchemy.unlock_admin_page_path(page, :redirect_to => alchemy.admin_dashboard_url)) do %>
|
38
|
-
<button class="icon_button small" title="<%= _t('explain_unlocking') %>">
|
39
|
-
<%= render_icon('close small') %>
|
40
|
-
</button>
|
41
|
-
<% end %>
|
42
|
-
<%- else -%>
|
43
|
-
<%= page.name %> <small>(<%= page.locker_name %>)</small>
|
44
|
-
<%- end -%>
|
45
|
-
</li>
|
46
|
-
<%- end -%>
|
47
|
-
</ul>
|
48
|
-
<%- end -%>
|
49
|
-
</div>
|
50
|
-
<%- reset_cycle('locked_pages') -%>
|
51
|
-
<div class="widget">
|
52
|
-
<h2><%= _t('Who else is online') %>:</h2>
|
53
|
-
<%- if @online_users.blank? -%>
|
54
|
-
<ul><li class="even"><%= _t('no users') %></li></ul>
|
55
|
-
<%- else -%>
|
56
|
-
<ul>
|
57
|
-
<%- @online_users.each do |user| -%>
|
58
|
-
<li class="<%= cycle('even', 'odd') %>"><%= user.name %> <small>(<%= user.human_role_name %>)</small></li>
|
59
|
-
<%- end -%>
|
60
|
-
</ul>
|
61
|
-
<%- end -%>
|
19
|
+
<h1>
|
20
|
+
<% if @first_time -%>
|
21
|
+
<%= _t('Welcome, %{name}', :name => current_user.firstname.blank? ? current_user.login : current_user.firstname) %>
|
22
|
+
<% else -%>
|
23
|
+
<%= _t('Welcome back, %{name}', :name => current_user.firstname.blank? ? current_user.login : current_user.firstname) %>
|
24
|
+
<% end -%>
|
25
|
+
</h1>
|
26
|
+
<p>
|
27
|
+
<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>
|
28
|
+
</p>
|
29
|
+
<div class="column left">
|
30
|
+
<%= render 'locked_pages' %>
|
31
|
+
<%= render 'recent_pages' %>
|
62
32
|
</div>
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
<p><%= _t('Alchemy is open software and itself uses open software and free resources:') %></p>
|
69
|
-
<ul>
|
70
|
-
<li>
|
71
|
-
<a href="http://rubyonrails.org" target="_blank">RubyOnRails</a>
|
72
|
-
</li>
|
73
|
-
<li>
|
74
|
-
<a href="http://jquery.com" target="_blank">jQuery Javascript Library</a>
|
75
|
-
</li>
|
76
|
-
<li>
|
77
|
-
<a href="http://jqueryui.com" target="_blank">jQuery UI Javascript GUI Library</a>
|
78
|
-
</li>
|
79
|
-
<li>
|
80
|
-
<a href="http://tinymce.moxiecode.com" target="_blank">TinyMCE - Javascript WYSIWYG Editor</a>
|
81
|
-
</li>
|
82
|
-
<li>
|
83
|
-
<a href="http://swfupload.org" target="_blank">SWFUpload</a>
|
84
|
-
</li>
|
85
|
-
<li>
|
86
|
-
<a href="http://p.yusukekamiyamane.com" target="_blank">Fugue Icons by Yusuke Kamiyamane</a>
|
87
|
-
</li>
|
88
|
-
</ul>
|
33
|
+
<div class="column right">
|
34
|
+
<%= render 'users' %>
|
35
|
+
<% if multi_site? %>
|
36
|
+
<%= render 'sites' %>
|
37
|
+
<% end %>
|
89
38
|
</div>
|
90
39
|
</div>
|
91
|
-
|
92
|
-
<%= content_for :javascripts do %>
|
93
|
-
<script type="text/javascript" charset="utf-8">
|
94
|
-
(function($) {
|
95
|
-
|
96
|
-
$('#sideboard img:first-child').click(function(e) {
|
97
|
-
e.preventDefault();
|
98
|
-
$('#sideboard .sideboard_body').toggle();
|
99
|
-
}).bind('mouseover', function() {
|
100
|
-
$(this).css({cursor: 'pointer'});
|
101
|
-
});
|
102
|
-
|
103
|
-
})(jQuery);
|
104
|
-
</script>
|
105
|
-
<% end %>
|