alchemy_cms 2.5.0.rc3 → 2.5.0
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/.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 %>
|