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.
Files changed (51) hide show
  1. data/.travis.yml +1 -1
  2. data/README.md +22 -29
  3. data/alchemy_cms.gemspec +3 -2
  4. data/app/assets/javascripts/alchemy/alchemy.base.js +7 -0
  5. data/app/assets/javascripts/alchemy/alchemy.datepicker.js +3 -2
  6. data/app/assets/javascripts/alchemy/alchemy.image_cropper.js +5 -2
  7. data/app/assets/javascripts/alchemy/alchemy.js +8 -1
  8. data/app/assets/javascripts/alchemy/alchemy.menubar.js +4 -1
  9. data/app/assets/stylesheets/alchemy/archive.scss +1 -6
  10. data/app/assets/stylesheets/alchemy/base.scss +37 -17
  11. data/app/assets/stylesheets/alchemy/dashboard.scss +41 -24
  12. data/app/assets/stylesheets/alchemy/form_elements.scss +1 -1
  13. data/app/assets/stylesheets/alchemy/jquery-ui.scss +3 -2
  14. data/app/assets/stylesheets/alchemy/login.scss +1 -1
  15. data/app/assets/stylesheets/alchemy/menubar.css.scss +3 -1
  16. data/app/assets/stylesheets/alchemy/mixins.scss +9 -0
  17. data/app/assets/stylesheets/alchemy/notices.scss +1 -1
  18. data/app/assets/stylesheets/alchemy/sitemap.scss +1 -1
  19. data/app/controllers/alchemy/admin/dashboard_controller.rb +46 -3
  20. data/app/controllers/alchemy/admin/essence_pictures_controller.rb +3 -0
  21. data/app/controllers/alchemy/admin/pages_controller.rb +7 -7
  22. data/app/controllers/alchemy/attachments_controller.rb +1 -1
  23. data/app/controllers/alchemy/base_controller.rb +5 -1
  24. data/app/helpers/alchemy/admin/essences_helper.rb +21 -0
  25. data/app/models/alchemy/attachment.rb +3 -1
  26. data/app/models/alchemy/page.rb +11 -8
  27. data/app/views/alchemy/admin/dashboard/_locked_pages.html.erb +38 -0
  28. data/app/views/alchemy/admin/dashboard/_recent_pages.html.erb +22 -0
  29. data/app/views/alchemy/admin/dashboard/_sites.html.erb +13 -0
  30. data/app/views/alchemy/admin/dashboard/_users.html.erb +19 -0
  31. data/app/views/alchemy/admin/dashboard/index.html.erb +35 -101
  32. data/app/views/alchemy/admin/dashboard/info.html.erb +57 -0
  33. data/app/views/alchemy/admin/elements/create.js.erb +4 -1
  34. data/app/views/alchemy/admin/elements/update.js.erb +1 -0
  35. data/app/views/alchemy/admin/essence_pictures/crop.html.erb +38 -41
  36. data/app/views/alchemy/admin/essence_pictures/update.js.erb +2 -4
  37. data/app/views/alchemy/essences/_essence_file_view.html.erb +1 -2
  38. data/app/views/alchemy/essences/_essence_picture_editor.html.erb +1 -18
  39. data/app/views/alchemy/essences/_essence_picture_tools.html.erb +1 -1
  40. data/app/views/layouts/alchemy/admin.html.erb +1 -0
  41. data/config/authorization_rules.rb +1 -0
  42. data/config/locales/alchemy.de.yml +5 -1
  43. data/config/locales/alchemy.en.yml +1 -0
  44. data/config/routes.rb +5 -1
  45. data/lib/alchemy/errors.rb +7 -0
  46. data/lib/alchemy/version.rb +1 -1
  47. data/lib/alchemy_cms.rb +1 -0
  48. data/lib/tasks/ferret.rake +0 -3
  49. data/spec/models/attachment_spec.rb +27 -0
  50. data/spec/models/page_spec.rb +7 -0
  51. metadata +33 -7
@@ -3,7 +3,7 @@ div#alchemy_greeting {
3
3
  margin-right: auto;
4
4
  margin-left: auto;
5
5
  padding: 2*$default-padding;
6
- margin-top: 1em;
6
+ margin-top: -4em;
7
7
  text-align: center;
8
8
 
9
9
  p {
@@ -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
+ }
@@ -45,7 +45,7 @@ div.error {
45
45
  color: #931f23;
46
46
  }
47
47
 
48
- div.warning {
48
+ div.warning, div.warn {
49
49
  @include message;
50
50
  background-color: #f7efb8;
51
51
  color: #756f47;
@@ -4,7 +4,7 @@ div#sort_panel {
4
4
  position: fixed;
5
5
  top: 27px;
6
6
  left: 0;
7
- z-index: 10;
7
+ z-index: 1;
8
8
  width: 100%;
9
9
  border-bottom: $default-border;
10
10
 
@@ -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.name)] }
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 {
@@ -29,7 +29,7 @@ module Alchemy
29
29
  private
30
30
 
31
31
  def load_attachment
32
- @attachment = Attachment.find(params[:id])
32
+ @attachment = Attachment.where(:id => params[:id]).first
33
33
  end
34
34
 
35
35
  end
@@ -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
- ::CGI.escape(read_attribute(:filename).split('.').first)
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
@@ -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
- attributes.merge!('name' => "#{source.name} (#{I18n.t('Copy')})")
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
- # Options are:
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 # Returning elements randomly shuffled
242
- # :from_cell => Cell or String # Returning elements from given cell
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
- raise(ActiveRecord::RecordNotFound, "Cell with name `#{options[:from_cell]}` could not be found!")
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
- <div class="with_padding">
3
- <h1>
4
- <% if @first_time -%>
5
- <%= _t('Welcome, %{name}', :name => current_user.firstname.blank? ? current_user.login : current_user.firstname) %>
6
- <% else -%>
7
- <%= _t('Welcome back, %{name}', :name => current_user.firstname.blank? ? current_user.login : current_user.firstname) %>
8
- <% end -%>
9
- </h1>
10
- <p>
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
- </p>
13
- </div>
14
- <div class="widget">
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
- </div>
64
- <div id="sideboard">
65
- <%= image_tag("alchemy/alchemy-logo.png", :style => "width: 240px; height: 70px") %>
66
- <p><%= _t("Version") %>: <%= @alchemy_version %></p>
67
- <div class="sideboard_body" style="display: none">
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 %>