Commit 907bb8d2c28353bcbc14da35e6d26b5caa023ab2

Authored by Joenio Costa
Committed by Antonio Terceiro
1 parent 666aae2c

A profile can have multiple blogs

 - Ask confirmation before change blog address
 - Add cucumber tests for blog
 - Set icon to create blog in CMS
 - Choose a blog when edit blog archives block

(ActionItem1258)
Showing 38 changed files with 1221 additions and 905 deletions   Show diff stats
app/controllers/my_profile/cms_controller.rb
@@ -275,7 +275,7 @@ class CmsController < MyProfileController @@ -275,7 +275,7 @@ class CmsController < MyProfileController
275 elsif @article.parent 275 elsif @article.parent
276 redirect_to :action => 'view', :id => @article.parent 276 redirect_to :action => 'view', :id => @article.parent
277 else 277 else
278 - redirect_to :action => 'index' 278 + redirect_back_or_default :action => 'index'
279 end 279 end
280 end 280 end
281 281
@@ -286,6 +286,9 @@ class CmsController < MyProfileController @@ -286,6 +286,9 @@ class CmsController < MyProfileController
286 @back_to = 'public_view' 286 @back_to = 'public_view'
287 @back_url = @article.view_url 287 @back_url = @article.view_url
288 end 288 end
  289 + if !request.post? and @article.blog?
  290 + store_location(request.referer)
  291 + end
289 end 292 end
290 293
291 def record_creating_from_public_view 294 def record_creating_from_public_view
@@ -294,6 +297,9 @@ class CmsController < MyProfileController @@ -294,6 +297,9 @@ class CmsController < MyProfileController
294 @back_to = 'public_view' 297 @back_to = 'public_view'
295 @back_url = referer 298 @back_url = referer
296 end 299 end
  300 + if !request.post? and @article.blog?
  301 + store_location(request.referer)
  302 + end
297 end 303 end
298 304
299 def maybe_ssl(url) 305 def maybe_ssl(url)
app/models/blog.rb
@@ -11,12 +11,6 @@ class Blog < Folder @@ -11,12 +11,6 @@ class Blog < Folder
11 end 11 end
12 12
13 settings_items :posts_per_page, :type => :integer, :default => 5 13 settings_items :posts_per_page, :type => :integer, :default => 5
14 - settings_items :title, :type => :string, :default => N_('Blog')  
15 -  
16 - def initialize(*args)  
17 - super(*args)  
18 - self.name = 'blog'  
19 - end  
20 14
21 def self.short_description 15 def self.short_description
22 _('Blog') 16 _('Blog')
@@ -96,4 +90,13 @@ class Blog < Folder @@ -96,4 +90,13 @@ class Blog < Folder
96 end 90 end
97 end 91 end
98 92
  93 + def name=(value)
  94 + self.set_name(value)
  95 + if self.slug.blank?
  96 + self.slug = self.name.to_slug
  97 + else
  98 + self.slug = self.slug.to_slug
  99 + end
  100 + end
  101 +
99 end 102 end
app/models/blog_archives_block.rb
@@ -14,21 +14,27 @@ class BlogArchivesBlock < Block @@ -14,21 +14,27 @@ class BlogArchivesBlock < Block
14 _('Blog posts') 14 _('Blog posts')
15 end 15 end
16 16
  17 + settings_items :blog_id, Integer
  18 +
  19 + def blog
  20 + blog_id ? owner.blogs.find(blog_id) : owner.blog
  21 + end
  22 +
17 def content 23 def content
18 - return nil unless owner.has_blog? 24 + owner_blog = self.blog
  25 + return nil unless owner_blog
19 results = '' 26 results = ''
20 - posts = owner.blog.posts  
21 - posts.group_by {|i| i.published_at.year }.sort_by { |year,count| -year }.each do |year, results_by_year| 27 + owner_blog.posts.group_by {|i| i.published_at.year }.sort_by { |year,count| -year }.each do |year, results_by_year|
22 results << content_tag('li', content_tag('strong', "#{year} (#{results_by_year.size})")) 28 results << content_tag('li', content_tag('strong', "#{year} (#{results_by_year.size})"))
23 results << "<ul class='#{year}-archive'>" 29 results << "<ul class='#{year}-archive'>"
24 results_by_year.group_by{|i| [ ('%02d' % i.published_at.month()), gettext(MONTHS[i.published_at.month() - 1])]}.sort.reverse.each do |month, results_by_month| 30 results_by_year.group_by{|i| [ ('%02d' % i.published_at.month()), gettext(MONTHS[i.published_at.month() - 1])]}.sort.reverse.each do |month, results_by_month|
25 - results << content_tag('li', link_to("#{month[1]} (#{results_by_month.size})", owner.blog.url.merge(:year => year, :month => month[0]))) 31 + results << content_tag('li', link_to("#{month[1]} (#{results_by_month.size})", owner_blog.url.merge(:year => year, :month => month[0])))
26 end 32 end
27 results << "</ul>" 33 results << "</ul>"
28 end 34 end
29 block_title(title) + 35 block_title(title) +
30 content_tag('ul', results, :class => 'blog-archives') + 36 content_tag('ul', results, :class => 'blog-archives') +
31 - content_tag('div', link_to(_('Subscribe RSS Feed'), owner.blog.feed.url), :class => 'subscribe-feed') 37 + content_tag('div', link_to(_('Subscribe RSS Feed'), owner_blog.feed.url), :class => 'subscribe-feed')
32 end 38 end
33 39
34 end 40 end
app/models/profile.rb
@@ -590,14 +590,14 @@ private :generate_url, :url_options @@ -590,14 +590,14 @@ private :generate_url, :url_options
590 LayoutTemplate.find(layout_template).number_of_boxes 590 LayoutTemplate.find(layout_template).number_of_boxes
591 end 591 end
592 592
  593 + has_many :blogs, :source => 'articles', :class_name => 'Blog'
  594 +
593 def blog 595 def blog
594 - if self.has_blog?  
595 - self.articles.find(:first, :conditions => {:type => 'Blog'})  
596 - end 596 + self.has_blog? ? self.blogs.first : nil
597 end 597 end
598 598
599 def has_blog? 599 def has_blog?
600 - !self.articles.count(:conditions => {:type => 'Blog'}).zero? 600 + self.blogs.count.nonzero?
601 end 601 end
602 602
603 def admins 603 def admins
app/views/box_organizer/_blog_archives_block.rhtml 0 → 100644
@@ -0,0 +1,4 @@ @@ -0,0 +1,4 @@
  1 +<% blogs = @block.box.owner.blogs %>
  2 +<% if blogs.count > 1 %>
  3 + <%= labelled_form_field _('Choose a blog:'), select('block', 'blog_id', blogs.map {|item| [ item.path, item.id ]}, :selected => @block.blog.id) %>
  4 +<% end %>
app/views/cms/_blog.rhtml
@@ -4,7 +4,51 @@ @@ -4,7 +4,51 @@
4 4
5 <%= render :file => 'shared/tiny_mce' %> 5 <%= render :file => 'shared/tiny_mce' %>
6 6
7 -<%= f.text_field('title', :size => '64') %> 7 +<%= required f.text_field(:name, :size => '64', :onchange => "updateUrlField(this, 'article_slug')") %>
  8 +
  9 +<script type="text/javascript">
  10 + function submit_button(index) {
  11 + return $("article_slug").form.select("input.submit")[index];
  12 + }
  13 + function warn_value_change() {
  14 + show_warning('article-formitem', "slug-change-confirmation");
  15 + disable_button(submit_button(0));
  16 + disable_button(submit_button(1));
  17 + }
  18 + function confirm_change() {
  19 + enable_button(submit_button(0));
  20 + enable_button(submit_button(1));
  21 + hide_warning('slug-change-confirmation');
  22 + }
  23 + function no_change() {
  24 + $("article_slug").value = $("old_article_slug").value;
  25 + enable_button(submit_button(0));
  26 + enable_button(submit_button(1));
  27 + hide_warning('slug-change-confirmation');
  28 + }
  29 +</script>
  30 +
  31 +<%= hidden_field_tag 'old_article_slug', @article.slug %>
  32 +<div id="article-formitem">
  33 + <%= labelled_form_field( _('Address'),
  34 + content_tag('code',
  35 + url_for(@article.url).gsub(/#{@article.slug}$/, '') +
  36 + text_field(:article, :slug, :onchange => "warn_value_change()", :size => 25)
  37 + ) +
  38 + content_tag('div',
  39 + content_tag('strong', _('WARNING!')) + '&nbsp;' +
  40 + _("You are about to change the address, and this will break external links to this blog or to posts inside it. Do you really want to change?") +
  41 + content_tag('div',
  42 + button_to_function(:ok, _("Yes"), "confirm_change()") + ' ' +
  43 + button_to_function(:cancel, _('No'), 'no_change()')
  44 + ),
  45 + :id => 'slug-change-confirmation',
  46 + :class => 'change-confirmation',
  47 + :style => 'display: none;'
  48 + )
  49 + )
  50 + %>
  51 +</div>
8 52
9 <%= labelled_form_field(_('Description:'), text_area(:article, :body, :cols => 64, :rows => 10)) %> 53 <%= labelled_form_field(_('Description:'), text_area(:article, :body, :cols => 64, :rows => 10)) %>
10 54
@@ -34,5 +78,3 @@ @@ -34,5 +78,3 @@
34 </div> 78 </div>
35 </div> 79 </div>
36 <% end %> 80 <% end %>
37 -  
38 -<%= javascript_tag "$('back_to').value = 'control_panel'" %>  
app/views/cms/edit.rhtml
@@ -37,7 +37,9 @@ @@ -37,7 +37,9 @@
37 37
38 <% button_bar do %> 38 <% button_bar do %>
39 <%= submit_button :save, _('Save') %> 39 <%= submit_button :save, _('Save') %>
40 - <% if @back_url %> 40 + <% if @return_to %>
  41 + <%= button :cancel, _('Cancel'), @return_to %>
  42 + <% elsif @back_url %>
41 <%= button :cancel, _('Cancel'), @back_url %> 43 <%= button :cancel, _('Cancel'), @back_url %>
42 <% elsif @parent_id || @article.parent %> 44 <% elsif @parent_id || @article.parent %>
43 <%= button :cancel, _('Cancel'), :action => 'view', :id => @parent_id || @article.parent %> 45 <%= button :cancel, _('Cancel'), :action => 'view', :id => @parent_id || @article.parent %>
app/views/cms/view.rhtml
@@ -7,6 +7,7 @@ @@ -7,6 +7,7 @@
7 7
8 <% if !@article or !@article.blog? %> 8 <% if !@article or !@article.blog? %>
9 <%= button :newfolder, _('New folder'), :action => 'new', :type => 'Folder', :parent_id => parent_id %> 9 <%= button :newfolder, _('New folder'), :action => 'new', :type => 'Folder', :parent_id => parent_id %>
  10 + <%= button :newblog, _('New Blog'), :action => 'new', :type => 'Blog', :parent_id => parent_id %>
10 <%= button('upload-file', _('Upload files'), :action => 'upload_files', :parent_id => parent_id) %> 11 <%= button('upload-file', _('Upload files'), :action => 'upload_files', :parent_id => parent_id) %>
11 <% end %> 12 <% end %>
12 <%= lightbox_button('new', label_for_new_article(@article), :action => 'new', :parent_id => parent_id) %> 13 <%= lightbox_button('new', label_for_new_article(@article), :action => 'new', :parent_id => parent_id) %>
app/views/profile_editor/_organization.rhtml
@@ -2,16 +2,6 @@ @@ -2,16 +2,6 @@
2 2
3 <%= required_fields_message if @profile.required_fields.any? %> 3 <%= required_fields_message if @profile.required_fields.any? %>
4 4
5 -<% if @environment.enabled?('enable_organization_url_change') %>  
6 - <script type="text/javascript">  
7 - function updateUrlField(name_field, id) {  
8 - url_field = $(id);  
9 - url_field.value = convToValidIdentifier(name_field.value, "-");  
10 - warn_value_change(url_field);  
11 - }  
12 - </script>  
13 -<% end %>  
14 -  
15 <div class="formfieldline"> 5 <div class="formfieldline">
16 <label class="formlabel" for="profile_data_nickname"><%= _('Display name') %></label> 6 <label class="formlabel" for="profile_data_nickname"><%= _('Display name') %></label>
17 <div class="formfield type-text"> 7 <div class="formfield type-text">
@@ -23,33 +13,42 @@ @@ -23,33 +13,42 @@
23 <% if @environment.enabled?('enable_organization_url_change') %> 13 <% if @environment.enabled?('enable_organization_url_change') %>
24 <script type="text/javascript"> 14 <script type="text/javascript">
25 function submit_button() { 15 function submit_button() {
26 - return $("profile_data_identifier").form.select("input.submit")[0]; 16 + return $("profile_data_identifier").form.select("input.submit")[0];
27 } 17 }
28 -  
29 - function warn_value_change(field) {  
30 - new Effect.Highlight($("profile-identifier-formitem"), {duration:3});  
31 - $("identifier-change-confirmation").show();  
32 - submit_button().disable();  
33 - submit_button().addClassName("disabled"); 18 + function warn_value_change() {
  19 + show_warning('profile-identifier-formitem', "identifier-change-confirmation");
  20 + disable_button(submit_button());
34 } 21 }
35 -  
36 - function hide_warning() {  
37 - submit_button().enable();  
38 - submit_button().removeClassName("disabled");  
39 - $("identifier-change-confirmation").hide() 22 + function confirm_change() {
  23 + enable_button(submit_button());
  24 + hide_warning('identifier-change-confirmation');
40 } 25 }
  26 + function no_change() {
  27 + $("profile_data_identifier").value = $("old_profile_identifier").value;
  28 + enable_button(submit_button());
  29 + hide_warning('identifier-change-confirmation');
  30 + }
  31 +
41 </script> 32 </script>
42 33
43 <%= hidden_field_tag 'old_profile_identifier', @profile.identifier %> 34 <%= hidden_field_tag 'old_profile_identifier', @profile.identifier %>
44 <div id="profile-identifier-formitem"> 35 <div id="profile-identifier-formitem">
45 <%= labelled_form_field( _('Address'), 36 <%= labelled_form_field( _('Address'),
46 - '<code>' + url_for(profile.url).gsub(/#{profile.identifier}$/, '') +  
47 - text_field(:profile_data, :identifier, :onchange => "warn_value_change(this)", :size => 15) + '</code>' +  
48 - content_tag('div', '<strong>' + _('WARNING!') + '</strong> ' + _("You are about to change the address, and this will break external links to the homepage or to content inside it. Do you really want to change? ") +  
49 - '<div>' + button_to_function(:ok, _("Yes"), 'hide_warning()') + ' ' +  
50 - button_to_function(:cancel, _('No'), '$("profile_data_identifier").value = $("old_profile_identifier").value; hide_warning()') + '</div>',  
51 - :id => 'identifier-change-confirmation', :style => 'display: none;'  
52 - ) 37 + content_tag('code',
  38 + url_for(profile.url).gsub(/#{profile.identifier}$/, '') +
  39 + text_field(:profile_data, :identifier, :onchange => "warn_value_change()", :size => 25)
  40 + ) +
  41 + content_tag('div',
  42 + content_tag('strong', _('WARNING!')) + '&nbsp;' +
  43 + _("You are about to change the address, and this will break external links to the homepage or to content inside it. Do you really want to change?") +
  44 + content_tag('div',
  45 + button_to_function(:ok, _("Yes"), "confirm_change()") + ' ' +
  46 + button_to_function(:cancel, _('No'), 'no_change()')
  47 + ),
  48 + :id => 'identifier-change-confirmation',
  49 + :class => 'change-confirmation',
  50 + :style => 'display: none;'
  51 + )
53 ) 52 )
54 %> 53 %>
55 </div> 54 </div>
app/views/profile_editor/index.rhtml
@@ -27,11 +27,14 @@ @@ -27,11 +27,14 @@
27 <%= control_panel_button(_('Manage Content'), 'cms', :controller => 'cms') if !environment.enabled?('disable_cms') || profile.community? %> 27 <%= control_panel_button(_('Manage Content'), 'cms', :controller => 'cms') if !environment.enabled?('disable_cms') || profile.community? %>
28 28
29 <% unless profile.enterprise? %> 29 <% unless profile.enterprise? %>
30 - <% if profile.has_blog? %>  
31 - <%= control_panel_button(_('Configure blog'), 'blog', :controller => 'cms', :action => 'edit', :id => profile.blog) %>  
32 - <% else %>  
33 - <%= control_panel_button(_('Create blog'), 'blog-disabled', :controller => 'cms', :action => 'new', :type => 'Blog') %>  
34 - <% end %> 30 + <%= case profile.blogs.count
  31 + when 0
  32 + control_panel_button(_('Create blog'), 'blog-disabled', :controller => 'cms', :action => 'new', :type => 'Blog')
  33 + when 1
  34 + control_panel_button(_('Configure blog'), 'blog', :controller => 'cms', :action => 'edit', :id => profile.blog)
  35 + else
  36 + control_panel_button(_('Configure blog'), 'blog', :controller => 'cms')
  37 + end %>
35 <% end %> 38 <% end %>
36 39
37 <%= control_panel_button(_('Change Password'), 'change-password', :controller => 'account', :action => 'change_password') if profile.person? %> 40 <%= control_panel_button(_('Change Password'), 'change-password', :controller => 'account', :action => 'change_password') if profile.person? %>
db/migrate/074_move_title_to_name_from_blogs.rb 0 → 100644
@@ -0,0 +1,15 @@ @@ -0,0 +1,15 @@
  1 +class MoveTitleToNameFromBlogs < ActiveRecord::Migration
  2 + def self.up
  3 + Blog.find(:all).each do |blog|
  4 + blog.name = blog.title
  5 + blog.save
  6 + end
  7 + end
  8 +
  9 + def self.down
  10 + Blog.find(:all).each do |blog|
  11 + blog.title = blog.name
  12 + blog.save
  13 + end
  14 + end
  15 +end
@@ -9,7 +9,7 @@ @@ -9,7 +9,7 @@
9 # 9 #
10 # It's strongly recommended to check this file into your version control system. 10 # It's strongly recommended to check this file into your version control system.
11 11
12 -ActiveRecord::Schema.define(:version => 73) do 12 +ActiveRecord::Schema.define(:version => 74) do
13 13
14 create_table "article_versions", :force => true do |t| 14 create_table "article_versions", :force => true do |t|
15 t.integer "article_id" 15 t.integer "article_id"
features/blog.feature 0 → 100644
@@ -0,0 +1,89 @@ @@ -0,0 +1,89 @@
  1 +Feature: blog
  2 + As a noosfero user
  3 + I want to have one or mutiple blogs
  4 +
  5 + Background:
  6 + Given I am on the homepage
  7 + And the following users
  8 + | login | name |
  9 + | joaosilva | Joao Silva |
  10 + And I am logged in as "joaosilva"
  11 +
  12 + Scenario: create a blog
  13 + Given I follow "Control panel"
  14 + And I follow "Create blog"
  15 + Then I should see "My Blog"
  16 + When I fill in "Title" with "My Blog"
  17 + And I press "Save"
  18 + And I follow "Control panel"
  19 + Then I should see "Configure blog"
  20 +
  21 + Scenario: redirect to control panel after create blog
  22 + Given I follow "Control panel"
  23 + And I follow "Create blog"
  24 + Then I should see "My Blog"
  25 + When I fill in "Title" with "My Blog"
  26 + And I press "Save"
  27 + Then I should be on /myprofile/joaosilva
  28 +
  29 + Scenario: redirect to cms after create blog
  30 + Given I follow "Control panel"
  31 + And I follow "Manage Content"
  32 + When I follow "New Blog"
  33 + Then I should see "My Blog"
  34 + When I fill in "Title" with "My Blog"
  35 + And I press "Save"
  36 + Then I should be on /myprofile/joaosilva/cms
  37 +
  38 + Scenario: create multiple blogs
  39 + Given I follow "Control panel"
  40 + And I follow "Manage Content"
  41 + And I follow "New Blog"
  42 + And I fill in "Title" with "Blog One"
  43 + And I press "Save"
  44 + And I follow "New Blog"
  45 + And I fill in "Title" with "Blog Two"
  46 + And I press "Save"
  47 + Then I should not see "error"
  48 + And I should be on /myprofile/joaosilva/cms
  49 +
  50 + Scenario: cancel button back to cms
  51 + Given I follow "Control panel"
  52 + And I follow "Manage Content"
  53 + And I follow "New Blog"
  54 + When I follow "Cancel"
  55 + Then I should be on /myprofile/joaosilva/cms
  56 +
  57 + Scenario: cancel button back to myprofile
  58 + Given I follow "Control panel"
  59 + And I follow "Create blog"
  60 + When I follow "Cancel"
  61 + Then I should be on /myprofile/joaosilva
  62 +
  63 + Scenario: configure blog link to cms
  64 + Given the following blogs
  65 + | owner | name |
  66 + | joaosilva | Blog One |
  67 + | joaosilva | Blog Two |
  68 + And I follow "Control panel"
  69 + When I follow "Configure blog"
  70 + Then I should be on /myprofile/joaosilva/cms
  71 +
  72 + Scenario: configure blog link to edit blog
  73 + Given the following blogs
  74 + | owner | name |
  75 + | joaosilva | Blog One |
  76 + And I follow "Control panel"
  77 + When I follow "Configure blog"
  78 + Then I should be on edit "Blog One" by joaosilva
  79 +
  80 + Scenario: change address of blog
  81 + Given the following blogs
  82 + | owner | name |
  83 + | joaosilva | Blog One |
  84 + And I follow "Control panel"
  85 + And I follow "Configure blog"
  86 + And I fill in "Address" with "blog-two"
  87 + And I press "Save"
  88 + When I am on /joaosilva/blog-two
  89 + Then I should see "Blog One"
features/edit_blog_archives_block.feature 0 → 100644
@@ -0,0 +1,34 @@ @@ -0,0 +1,34 @@
  1 +Feature: edit_blog_archives_block
  2 + As a blog owner
  3 + I want to edit a Blog Archive Block
  4 +
  5 + Scenario: not offer to select blog when I have once blog
  6 + Given I am on the homepage
  7 + And the following users
  8 + | login | name |
  9 + | joaosilva | Joao Silva |
  10 + And the following blogs
  11 + | owner | name |
  12 + | joaosilva | Blog One |
  13 + And the following blocks
  14 + | owner | type |
  15 + | joaosilva | BlogArchivesBlock |
  16 + And I am logged in as "joaosilva"
  17 + When I go to edit BlogArchivesBlock of joaosilva
  18 + Then I should not see "Choose a blog:"
  19 +
  20 + Scenario: offer to select blog when I have multiple blogs
  21 + Given I am on the homepage
  22 + And the following users
  23 + | login | name |
  24 + | joaosilva | Joao Silva |
  25 + And the following blogs
  26 + | owner | name |
  27 + | joaosilva | Blog One |
  28 + | joaosilva | Blog Two |
  29 + And the following blocks
  30 + | owner | type |
  31 + | joaosilva | BlogArchivesBlock |
  32 + And I am logged in as "joaosilva"
  33 + When I go to edit BlogArchivesBlock of joaosilva
  34 + Then I should see "Choose a blog:"
features/step_definitions/noosfero_steps.rb
@@ -19,16 +19,37 @@ Given /^the following enterprises$/ do |table| @@ -19,16 +19,37 @@ Given /^the following enterprises$/ do |table|
19 end 19 end
20 end 20 end
21 21
22 -Given /^the following (articles|events)$/ do |content, table| 22 +Given /^the following blocks$/ do |table|
  23 + table.hashes.map{|item| item.dup}.each do |item|
  24 + klass = item.delete('type')
  25 + owner = Profile[item.delete('owner')]
  26 + box_id = owner.boxes.last.id
  27 + klass.constantize.create!(item.merge(:box_id => box_id))
  28 + end
  29 +end
  30 +
  31 +Given /^the following (articles|events|blogs)$/ do |content, table|
23 klass = { 32 klass = {
24 'articles' => TextileArticle, 33 'articles' => TextileArticle,
25 'events' => Event, 34 'events' => Event,
  35 + 'blogs' => Blog,
26 }[content] || raise("Don't know how to build %s" % content) 36 }[content] || raise("Don't know how to build %s" % content)
27 - table.hashes.each do |item|  
28 - data = item.dup  
29 - owner_identifier = data.delete("owner") 37 + table.hashes.map{|item| item.dup}.each do |item|
  38 + owner_identifier = item.delete("owner")
30 owner = Profile[owner_identifier] 39 owner = Profile[owner_identifier]
31 - TextileArticle.create!(data.merge(:profile => owner)) 40 + klass.create!(item.merge(:profile => owner))
  41 + end
  42 +end
  43 +
  44 +Given /^the following files$/ do |table|
  45 + table.hashes.each do |item|
  46 + owner = Profile[item[:owner]]
  47 + file = "/files/#{item[:file]}"
  48 + article = UploadedFile.create!(:profile => owner, :uploaded_data => fixture_file_upload(file, item[:mime]))
  49 + if item[:homepage]
  50 + owner.home_page = article
  51 + owner.save!
  52 + end
32 end 53 end
33 end 54 end
34 55
@@ -40,3 +61,8 @@ Given /^the following products$/ do |table| @@ -40,3 +61,8 @@ Given /^the following products$/ do |table|
40 end 61 end
41 end 62 end
42 63
  64 +Given /^I am logged in as "(.+)"$/ do |username|
  65 + fill_in("Username", :with => username)
  66 + fill_in("Password", :with => '123456')
  67 + click_button("Log in")
  68 +end
features/step_definitions/webrat_steps.rb
@@ -186,4 +186,8 @@ end @@ -186,4 +186,8 @@ end
186 186
187 Then /^show me the page$/ do 187 Then /^show me the page$/ do
188 save_and_open_page 188 save_and_open_page
189 -end  
190 \ No newline at end of file 189 \ No newline at end of file
  190 +end
  191 +
  192 +Then /^the source should contain tag ([^\"]+)$/ do |tag|
  193 + response_body.should have_tag(tag, {id => 10})
  194 +end
features/support/paths.rb
@@ -13,7 +13,16 @@ module NavigationHelpers @@ -13,7 +13,16 @@ module NavigationHelpers
13 13
14 when /^\// 14 when /^\//
15 page_name 15 page_name
  16 +
  17 + when /edit "(.+)" by (.+)/
  18 + article_id = Person[$2].articles.find_by_slug($1.to_slug).id
  19 + "/myprofile/#{$2}/cms/edit/#{article_id}"
16 20
  21 + when /edit BlogArchivesBlock of (.+)/
  22 + owner = Profile[$1]
  23 + block = BlogArchivesBlock.find(:all).select{|i| i.owner == owner}.first
  24 + "/myprofile/#{$1}/profile_design/edit/#{block.id}"
  25 +
17 # Add more mappings here. 26 # Add more mappings here.
18 # Here is a more fancy example: 27 # Here is a more fancy example:
19 # 28 #
lib/acts_as_filesystem.rb
@@ -97,13 +97,16 @@ module ActsAsFileSystem @@ -97,13 +97,16 @@ module ActsAsFileSystem
97 self.children.empty? 97 self.children.empty?
98 end 98 end
99 99
100 - # sets the name of the category. Also sets #slug accordingly.  
101 - def name=(value) 100 + def set_name(value)
102 if self.name != value 101 if self.name != value
103 self.recalculate_path = true 102 self.recalculate_path = true
104 end 103 end
105 -  
106 self[:name] = value 104 self[:name] = value
  105 + end
  106 +
  107 + # sets the name of the category. Also sets #slug accordingly.
  108 + def name=(value)
  109 + self.set_name(value)
107 unless self.name.blank? 110 unless self.name.blank?
108 self.slug = self.name.to_slug 111 self.slug = self.name.to_slug
109 end 112 end
lib/authenticated_system.rb
@@ -80,7 +80,7 @@ module AuthenticatedSystem @@ -80,7 +80,7 @@ module AuthenticatedSystem
80 # 80 #
81 # We can return to this location by calling #redirect_back_or_default. 81 # We can return to this location by calling #redirect_back_or_default.
82 def store_location(location = request.request_uri) 82 def store_location(location = request.request_uri)
83 - session[:return_to] = location 83 + @return_to = session[:return_to] = location
84 end 84 end
85 85
86 # Redirect to the URI stored by the most recent store_location call or 86 # Redirect to the URI stored by the most recent store_location call or
public/designs/icons/tango/Tango-mod/16x16/apps/text-editor.png 0 → 100644

724 Bytes

public/designs/icons/tango/Tango-mod/32x32/apps/text-editor.png 0 → 100644

1.63 KB

public/designs/icons/tango/Tango-mod/48x48/apps/text-editor.png 0 → 100644

2.47 KB

public/designs/icons/tango/Tango-mod/scalable/apps/text-editor.svg 0 → 100644
@@ -0,0 +1,799 @@ @@ -0,0 +1,799 @@
  1 +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
  2 +<!-- Created with Inkscape (http://www.inkscape.org/) -->
  3 +<svg
  4 + xmlns:dc="http://purl.org/dc/elements/1.1/"
  5 + xmlns:cc="http://creativecommons.org/ns#"
  6 + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  7 + xmlns:svg="http://www.w3.org/2000/svg"
  8 + xmlns="http://www.w3.org/2000/svg"
  9 + xmlns:xlink="http://www.w3.org/1999/xlink"
  10 + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
  11 + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
  12 + inkscape:export-ydpi="90.000000"
  13 + inkscape:export-xdpi="90.000000"
  14 + inkscape:export-filename="text-editor.png"
  15 + width="48px"
  16 + height="48px"
  17 + id="svg11300"
  18 + sodipodi:version="0.32"
  19 + inkscape:version="0.46"
  20 + sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/apps"
  21 + sodipodi:docname="text-editor.svg"
  22 + inkscape:output_extension="org.inkscape.output.svg.inkscape">
  23 + <sodipodi:namedview
  24 + stroke="#c4a000"
  25 + fill="#edd400"
  26 + id="base"
  27 + pagecolor="#ffffff"
  28 + bordercolor="#666666"
  29 + borderopacity="0.25490196"
  30 + inkscape:pageopacity="0.0"
  31 + inkscape:pageshadow="2"
  32 + inkscape:zoom="11.229167"
  33 + inkscape:cx="24"
  34 + inkscape:cy="24"
  35 + inkscape:current-layer="layer1"
  36 + showgrid="false"
  37 + inkscape:grid-bbox="true"
  38 + inkscape:document-units="px"
  39 + inkscape:showpageshadow="false"
  40 + inkscape:window-width="1276"
  41 + inkscape:window-height="745"
  42 + inkscape:window-x="0"
  43 + inkscape:window-y="19" />
  44 + <defs
  45 + id="defs3">
  46 + <inkscape:perspective
  47 + id="perspective85"
  48 + inkscape:persp3d-origin="24 : 16 : 1"
  49 + inkscape:vp_z="48 : 24 : 1"
  50 + inkscape:vp_y="0 : 1000 : 0"
  51 + inkscape:vp_x="0 : 24 : 1"
  52 + sodipodi:type="inkscape:persp3d" />
  53 + <radialGradient
  54 + r="117.14286"
  55 + fy="486.64789"
  56 + fx="605.71429"
  57 + cy="486.64789"
  58 + cx="605.71429"
  59 + gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
  60 + gradientUnits="userSpaceOnUse"
  61 + id="radialGradient6719"
  62 + xlink:href="#linearGradient5060"
  63 + inkscape:collect="always" />
  64 + <linearGradient
  65 + id="linearGradient5060"
  66 + inkscape:collect="always">
  67 + <stop
  68 + id="stop5062"
  69 + offset="0"
  70 + style="stop-color:#000000;stop-opacity:1;" />
  71 + <stop
  72 + id="stop5064"
  73 + offset="1"
  74 + style="stop-color:#000000;stop-opacity:0;" />
  75 + </linearGradient>
  76 + <radialGradient
  77 + r="117.14286"
  78 + fy="486.64789"
  79 + fx="605.71429"
  80 + cy="486.64789"
  81 + cx="605.71429"
  82 + gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
  83 + gradientUnits="userSpaceOnUse"
  84 + id="radialGradient6717"
  85 + xlink:href="#linearGradient5060"
  86 + inkscape:collect="always" />
  87 + <linearGradient
  88 + id="linearGradient5048">
  89 + <stop
  90 + id="stop5050"
  91 + offset="0"
  92 + style="stop-color:#000000;stop-opacity:0;" />
  93 + <stop
  94 + style="stop-color:#000000;stop-opacity:1;"
  95 + offset="0.5"
  96 + id="stop5056" />
  97 + <stop
  98 + id="stop5052"
  99 + offset="1"
  100 + style="stop-color:#000000;stop-opacity:0;" />
  101 + </linearGradient>
  102 + <linearGradient
  103 + y2="609.50507"
  104 + x2="302.85715"
  105 + y1="366.64789"
  106 + x1="302.85715"
  107 + gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
  108 + gradientUnits="userSpaceOnUse"
  109 + id="linearGradient6715"
  110 + xlink:href="#linearGradient5048"
  111 + inkscape:collect="always" />
  112 + <linearGradient
  113 + id="linearGradient2994">
  114 + <stop
  115 + id="stop2996"
  116 + offset="0"
  117 + style="stop-color:#000000;stop-opacity:1;" />
  118 + <stop
  119 + id="stop2998"
  120 + offset="1"
  121 + style="stop-color:#c9c9c9;stop-opacity:1;" />
  122 + </linearGradient>
  123 + <linearGradient
  124 + id="linearGradient2984"
  125 + inkscape:collect="always">
  126 + <stop
  127 + id="stop2986"
  128 + offset="0"
  129 + style="stop-color:#cfcfcf;stop-opacity:1;" />
  130 + <stop
  131 + id="stop2988"
  132 + offset="1"
  133 + style="stop-color:#cfcfcf;stop-opacity:0;" />
  134 + </linearGradient>
  135 + <linearGradient
  136 + id="linearGradient2974">
  137 + <stop
  138 + id="stop2976"
  139 + offset="0"
  140 + style="stop-color:#c1c1c1;stop-opacity:1;" />
  141 + <stop
  142 + id="stop2978"
  143 + offset="1"
  144 + style="stop-color:#acacac;stop-opacity:1;" />
  145 + </linearGradient>
  146 + <linearGradient
  147 + id="linearGradient2966">
  148 + <stop
  149 + id="stop2968"
  150 + offset="0"
  151 + style="stop-color:#e8e8e8;stop-opacity:1;" />
  152 + <stop
  153 + style="stop-color:#8e8e8e;stop-opacity:1;"
  154 + offset="0.5"
  155 + id="stop3006" />
  156 + <stop
  157 + id="stop2970"
  158 + offset="1"
  159 + style="stop-color:#373737;stop-opacity:1;" />
  160 + </linearGradient>
  161 + <linearGradient
  162 + id="linearGradient2919">
  163 + <stop
  164 + id="stop2921"
  165 + offset="0"
  166 + style="stop-color:#a2a2a2;stop-opacity:1;" />
  167 + <stop
  168 + id="stop2923"
  169 + offset="1"
  170 + style="stop-color:#878787;stop-opacity:1;" />
  171 + </linearGradient>
  172 + <linearGradient
  173 + id="linearGradient2873">
  174 + <stop
  175 + id="stop2875"
  176 + offset="0"
  177 + style="stop-color:#939393;stop-opacity:1;" />
  178 + <stop
  179 + id="stop2877"
  180 + offset="1"
  181 + style="stop-color:#424242;stop-opacity:1;" />
  182 + </linearGradient>
  183 + <linearGradient
  184 + id="linearGradient2865"
  185 + inkscape:collect="always">
  186 + <stop
  187 + id="stop2867"
  188 + offset="0"
  189 + style="stop-color:#000000;stop-opacity:1;" />
  190 + <stop
  191 + id="stop2869"
  192 + offset="1"
  193 + style="stop-color:#000000;stop-opacity:0;" />
  194 + </linearGradient>
  195 + <linearGradient
  196 + id="linearGradient2855">
  197 + <stop
  198 + id="stop2857"
  199 + offset="0"
  200 + style="stop-color:#dfdfdf;stop-opacity:1;" />
  201 + <stop
  202 + id="stop2859"
  203 + offset="1"
  204 + style="stop-color:#ffffff;stop-opacity:1;" />
  205 + </linearGradient>
  206 + <linearGradient
  207 + gradientTransform="matrix(1.137871,0.000000,0.000000,1.000000,-2.660884,0.000000)"
  208 + gradientUnits="userSpaceOnUse"
  209 + y2="6.8333683"
  210 + x2="14.283642"
  211 + y1="42.83337"
  212 + x1="21.043484"
  213 + id="linearGradient2861"
  214 + xlink:href="#linearGradient2855"
  215 + inkscape:collect="always" />
  216 + <radialGradient
  217 + gradientUnits="userSpaceOnUse"
  218 + gradientTransform="matrix(1.000000,0.000000,0.000000,0.348243,0.000000,26.35543)"
  219 + r="19.5625"
  220 + fy="40.4375"
  221 + fx="23.5625"
  222 + cy="40.4375"
  223 + cx="23.5625"
  224 + id="radialGradient2871"
  225 + xlink:href="#linearGradient2865"
  226 + inkscape:collect="always" />
  227 + <linearGradient
  228 + gradientUnits="userSpaceOnUse"
  229 + y2="42.83337"
  230 + x2="26.228401"
  231 + y1="28.083368"
  232 + x1="26.612417"
  233 + id="linearGradient2879"
  234 + xlink:href="#linearGradient2873"
  235 + inkscape:collect="always" />
  236 + <linearGradient
  237 + gradientUnits="userSpaceOnUse"
  238 + y2="7.5624999"
  239 + x2="40.984375"
  240 + y1="7.5624999"
  241 + x1="6"
  242 + id="linearGradient2925"
  243 + xlink:href="#linearGradient2919"
  244 + inkscape:collect="always" />
  245 + <linearGradient
  246 + gradientTransform="translate(-5.669292,0.000000)"
  247 + gradientUnits="userSpaceOnUse"
  248 + y2="22.250591"
  249 + x2="50.988335"
  250 + y1="17.376184"
  251 + x1="48.90625"
  252 + id="linearGradient2972"
  253 + xlink:href="#linearGradient2966"
  254 + inkscape:collect="always" />
  255 + <linearGradient
  256 + gradientTransform="translate(-5.669292,0.000000)"
  257 + gradientUnits="userSpaceOnUse"
  258 + y2="22.625"
  259 + x2="47.6875"
  260 + y1="19.8125"
  261 + x1="46"
  262 + id="linearGradient2980"
  263 + xlink:href="#linearGradient2974"
  264 + inkscape:collect="always" />
  265 + <radialGradient
  266 + gradientUnits="userSpaceOnUse"
  267 + gradientTransform="matrix(2.923565,-3.911409e-24,2.471769e-23,2.029717,-61.55532,-27.88417)"
  268 + r="3.2408544"
  269 + fy="27.640751"
  270 + fx="29.053354"
  271 + cy="27.640751"
  272 + cx="29.053354"
  273 + id="radialGradient2990"
  274 + xlink:href="#linearGradient2984"
  275 + inkscape:collect="always" />
  276 + <linearGradient
  277 + gradientTransform="translate(-5.825542,0.125000)"
  278 + gradientUnits="userSpaceOnUse"
  279 + y2="30.703125"
  280 + x2="25.514589"
  281 + y1="31.046875"
  282 + x1="25.71875"
  283 + id="linearGradient3000"
  284 + xlink:href="#linearGradient2994"
  285 + inkscape:collect="always" />
  286 + <radialGradient
  287 + r="19.5625"
  288 + fy="40.4375"
  289 + fx="23.5625"
  290 + cy="40.4375"
  291 + cx="23.5625"
  292 + gradientTransform="matrix(1.000000,0.000000,0.000000,0.348243,1.439818e-16,26.35543)"
  293 + gradientUnits="userSpaceOnUse"
  294 + id="radialGradient3010"
  295 + xlink:href="#linearGradient2865"
  296 + inkscape:collect="always" />
  297 + <linearGradient
  298 + y2="609.50507"
  299 + x2="302.85715"
  300 + y1="366.64789"
  301 + x1="302.85715"
  302 + gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
  303 + gradientUnits="userSpaceOnUse"
  304 + id="linearGradient6715-635"
  305 + xlink:href="#linearGradient5048-282"
  306 + inkscape:collect="always" />
  307 + <linearGradient
  308 + id="linearGradient5048-282">
  309 + <stop
  310 + id="stop2506"
  311 + offset="0"
  312 + style="stop-color:#000000;stop-opacity:0;" />
  313 + <stop
  314 + style="stop-color:#000000;stop-opacity:1;"
  315 + offset="0.5"
  316 + id="stop2508" />
  317 + <stop
  318 + id="stop2510"
  319 + offset="1"
  320 + style="stop-color:#000000;stop-opacity:0;" />
  321 + </linearGradient>
  322 + <radialGradient
  323 + r="117.14286"
  324 + fy="486.64789"
  325 + fx="605.71429"
  326 + cy="486.64789"
  327 + cx="605.71429"
  328 + gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
  329 + gradientUnits="userSpaceOnUse"
  330 + id="radialGradient6717-944"
  331 + xlink:href="#linearGradient5060-14"
  332 + inkscape:collect="always" />
  333 + <linearGradient
  334 + id="linearGradient5060-14"
  335 + inkscape:collect="always">
  336 + <stop
  337 + id="stop2514"
  338 + offset="0"
  339 + style="stop-color:#000000;stop-opacity:1;" />
  340 + <stop
  341 + id="stop2516"
  342 + offset="1"
  343 + style="stop-color:#000000;stop-opacity:0;" />
  344 + </linearGradient>
  345 + <radialGradient
  346 + r="117.14286"
  347 + fy="486.64789"
  348 + fx="605.71429"
  349 + cy="486.64789"
  350 + cx="605.71429"
  351 + gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
  352 + gradientUnits="userSpaceOnUse"
  353 + id="radialGradient6719-778"
  354 + xlink:href="#linearGradient5060-358"
  355 + inkscape:collect="always" />
  356 + <linearGradient
  357 + id="linearGradient5060-358"
  358 + inkscape:collect="always">
  359 + <stop
  360 + id="stop2520"
  361 + offset="0"
  362 + style="stop-color:#000000;stop-opacity:1;" />
  363 + <stop
  364 + id="stop2522"
  365 + offset="1"
  366 + style="stop-color:#000000;stop-opacity:0;" />
  367 + </linearGradient>
  368 + <linearGradient
  369 + gradientTransform="matrix(1.137871,0.000000,0.000000,1.000000,-2.660884,0.000000)"
  370 + gradientUnits="userSpaceOnUse"
  371 + y2="6.8333683"
  372 + x2="14.283642"
  373 + y1="42.83337"
  374 + x1="21.043484"
  375 + id="linearGradient2861-627"
  376 + xlink:href="#linearGradient2855-316"
  377 + inkscape:collect="always" />
  378 + <linearGradient
  379 + id="linearGradient2855-316">
  380 + <stop
  381 + id="stop2526"
  382 + offset="0"
  383 + style="stop-color:#dfdfdf;stop-opacity:1;" />
  384 + <stop
  385 + id="stop2528"
  386 + offset="1"
  387 + style="stop-color:#ffffff;stop-opacity:1;" />
  388 + </linearGradient>
  389 + <linearGradient
  390 + gradientUnits="userSpaceOnUse"
  391 + y2="42.83337"
  392 + x2="26.228401"
  393 + y1="28.083368"
  394 + x1="26.612417"
  395 + id="linearGradient2879-751"
  396 + xlink:href="#linearGradient2873-629"
  397 + inkscape:collect="always" />
  398 + <linearGradient
  399 + id="linearGradient2873-629">
  400 + <stop
  401 + id="stop2532"
  402 + offset="0"
  403 + style="stop-color:#939393;stop-opacity:1;" />
  404 + <stop
  405 + id="stop2534"
  406 + offset="1"
  407 + style="stop-color:#424242;stop-opacity:1;" />
  408 + </linearGradient>
  409 + <radialGradient
  410 + r="19.5625"
  411 + fy="40.4375"
  412 + fx="23.5625"
  413 + cy="40.4375"
  414 + cx="23.5625"
  415 + gradientTransform="matrix(1.000000,0.000000,0.000000,0.348243,1.439818e-16,26.35543)"
  416 + gradientUnits="userSpaceOnUse"
  417 + id="radialGradient3010-591"
  418 + xlink:href="#linearGradient2865-708"
  419 + inkscape:collect="always" />
  420 + <linearGradient
  421 + id="linearGradient2865-708"
  422 + inkscape:collect="always">
  423 + <stop
  424 + id="stop2538"
  425 + offset="0"
  426 + style="stop-color:#000000;stop-opacity:1;" />
  427 + <stop
  428 + id="stop2540"
  429 + offset="1"
  430 + style="stop-color:#000000;stop-opacity:0;" />
  431 + </linearGradient>
  432 + <linearGradient
  433 + gradientUnits="userSpaceOnUse"
  434 + y2="7.5624999"
  435 + x2="40.984375"
  436 + y1="7.5624999"
  437 + x1="6"
  438 + id="linearGradient2925-565"
  439 + xlink:href="#linearGradient2919-578"
  440 + inkscape:collect="always" />
  441 + <linearGradient
  442 + id="linearGradient2919-578">
  443 + <stop
  444 + id="stop2544"
  445 + offset="0"
  446 + style="stop-color:#a2a2a2;stop-opacity:1;" />
  447 + <stop
  448 + id="stop2546"
  449 + offset="1"
  450 + style="stop-color:#878787;stop-opacity:1;" />
  451 + </linearGradient>
  452 + <linearGradient
  453 + gradientTransform="translate(-5.669292,0.000000)"
  454 + gradientUnits="userSpaceOnUse"
  455 + y2="22.250591"
  456 + x2="50.988335"
  457 + y1="17.376184"
  458 + x1="48.90625"
  459 + id="linearGradient2972-839"
  460 + xlink:href="#linearGradient2966-498"
  461 + inkscape:collect="always" />
  462 + <linearGradient
  463 + id="linearGradient2966-498">
  464 + <stop
  465 + id="stop2550"
  466 + offset="0"
  467 + style="stop-color:#e8e8e8;stop-opacity:1;" />
  468 + <stop
  469 + style="stop-color:#8e8e8e;stop-opacity:1;"
  470 + offset="0.5"
  471 + id="stop2552" />
  472 + <stop
  473 + id="stop2554"
  474 + offset="1"
  475 + style="stop-color:#373737;stop-opacity:1;" />
  476 + </linearGradient>
  477 + <linearGradient
  478 + gradientTransform="translate(-5.669292,0.000000)"
  479 + gradientUnits="userSpaceOnUse"
  480 + y2="22.625"
  481 + x2="47.6875"
  482 + y1="19.8125"
  483 + x1="46"
  484 + id="linearGradient2980-769"
  485 + xlink:href="#linearGradient2974-591"
  486 + inkscape:collect="always" />
  487 + <linearGradient
  488 + id="linearGradient2974-591">
  489 + <stop
  490 + id="stop2558"
  491 + offset="0"
  492 + style="stop-color:#c1c1c1;stop-opacity:1;" />
  493 + <stop
  494 + id="stop2560"
  495 + offset="1"
  496 + style="stop-color:#acacac;stop-opacity:1;" />
  497 + </linearGradient>
  498 + <radialGradient
  499 + gradientUnits="userSpaceOnUse"
  500 + gradientTransform="matrix(2.923565,-3.911409e-24,2.471769e-23,2.029717,-61.55532,-27.88417)"
  501 + r="3.2408544"
  502 + fy="27.640751"
  503 + fx="29.053354"
  504 + cy="27.640751"
  505 + cx="29.053354"
  506 + id="radialGradient2990-357"
  507 + xlink:href="#linearGradient2984-123"
  508 + inkscape:collect="always" />
  509 + <linearGradient
  510 + id="linearGradient2984-123"
  511 + inkscape:collect="always">
  512 + <stop
  513 + id="stop2564"
  514 + offset="0"
  515 + style="stop-color:#cfcfcf;stop-opacity:1;" />
  516 + <stop
  517 + id="stop2566"
  518 + offset="1"
  519 + style="stop-color:#cfcfcf;stop-opacity:0;" />
  520 + </linearGradient>
  521 + <linearGradient
  522 + gradientTransform="translate(-5.825542,0.125000)"
  523 + gradientUnits="userSpaceOnUse"
  524 + y2="30.703125"
  525 + x2="25.514589"
  526 + y1="31.046875"
  527 + x1="25.71875"
  528 + id="linearGradient3000-327"
  529 + xlink:href="#linearGradient2994-689"
  530 + inkscape:collect="always" />
  531 + <linearGradient
  532 + id="linearGradient2994-689">
  533 + <stop
  534 + id="stop2570"
  535 + offset="0"
  536 + style="stop-color:#000000;stop-opacity:1;" />
  537 + <stop
  538 + id="stop2572"
  539 + offset="1"
  540 + style="stop-color:#c9c9c9;stop-opacity:1;" />
  541 + </linearGradient>
  542 + </defs>
  543 + <metadata
  544 + id="metadata4">
  545 + <rdf:RDF>
  546 + <cc:Work
  547 + rdf:about="">
  548 + <dc:format>image/svg+xml</dc:format>
  549 + <dc:type
  550 + rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
  551 + <dc:creator>
  552 + <cc:Agent>
  553 + <dc:title>Jakub Steiner</dc:title>
  554 + </cc:Agent>
  555 + </dc:creator>
  556 + <dc:source>http://jimmac.musichall.cz</dc:source>
  557 + <cc:license
  558 + rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
  559 + <dc:title>Text Editor</dc:title>
  560 + </cc:Work>
  561 + <cc:License
  562 + rdf:about="http://creativecommons.org/licenses/publicdomain/">
  563 + <cc:permits
  564 + rdf:resource="http://creativecommons.org/ns#Reproduction" />
  565 + <cc:permits
  566 + rdf:resource="http://creativecommons.org/ns#Distribution" />
  567 + <cc:permits
  568 + rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
  569 + </cc:License>
  570 + </rdf:RDF>
  571 + </metadata>
  572 + <g
  573 + inkscape:groupmode="layer"
  574 + inkscape:label="Layer 1"
  575 + id="layer1">
  576 + <g
  577 + id="g6707"
  578 + transform="matrix(2.417561e-2,0,0,2.086758e-2,45.12765,40.1536)">
  579 + <rect
  580 + y="-150.69685"
  581 + x="-1559.2523"
  582 + height="478.35718"
  583 + width="1339.6335"
  584 + id="rect6709"
  585 + style="opacity:0.40206185;color:black;fill:url(#linearGradient6715-635);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
  586 + <path
  587 + sodipodi:nodetypes="cccc"
  588 + id="path6711"
  589 + d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
  590 + style="opacity:0.40206185;color:black;fill:url(#radialGradient6717-944);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
  591 + <path
  592 + style="opacity:0.40206185;color:black;fill:url(#radialGradient6719-778);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
  593 + d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
  594 + id="path6713"
  595 + sodipodi:nodetypes="cccc" />
  596 + </g>
  597 + <path
  598 + sodipodi:nodetypes="ccccccccccc"
  599 + id="rect1975"
  600 + d="M 7.1638699,4.5063726 L 39.813122,4.5063726 C 40.575699,4.5063726 41.189615,5.0388241 41.189615,5.7002099 C 41.189615,5.7002099 43.590945,39.868907 43.590945,39.868907 C 43.590945,39.868907 43.603403,42.216529 43.603403,42.216529 C 43.603403,42.877915 42.989488,43.410366 42.226911,43.410366 L 4.750081,43.410366 C 3.9875042,43.410366 3.3735887,42.877915 3.3735887,42.216529 L 3.3624173,40.049613 L 5.7873775,5.7002099 C 5.7873775,5.0388241 6.4012931,4.5063726 7.1638699,4.5063726 z "
  601 + style="color:#000000;fill:url(#linearGradient2861-627);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient2879-751);stroke-width:0.99999982;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
  602 + <path
  603 + sodipodi:type="arc"
  604 + style="opacity:0.31578944;color:#000000;fill:url(#radialGradient3010-591);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
  605 + id="path3008"
  606 + sodipodi:cx="23.5625"
  607 + sodipodi:cy="40.4375"
  608 + sodipodi:rx="19.5625"
  609 + sodipodi:ry="6.8125"
  610 + d="M 43.125 40.4375 A 19.5625 6.8125 0 1 1 4,40.4375 A 19.5625 6.8125 0 1 1 43.125 40.4375 z"
  611 + transform="matrix(0.616613,0.000000,0.000000,0.440367,10.61425,13.94266)" />
  612 + <rect
  613 + ry="0.67937863"
  614 + rx="0.67937863"
  615 + y="39.868271"
  616 + x="3.9770372"
  617 + height="3.0714951"
  618 + width="39.048077"
  619 + id="rect2851"
  620 + style="opacity:1;color:#000000;fill:#a4a4a4;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
  621 + <path
  622 + sodipodi:nodetypes="ccccccc"
  623 + id="path2853"
  624 + d="M 3.9267507,40.442796 C 3.9267507,40.442796 4.0776125,39.912466 4.6307727,39.868272 L 42.195375,39.868272 C 42.949684,39.868272 42.999971,40.619573 42.999971,40.619573 C 42.999971,40.619573 43.02357,39 41.7161,39 L 5.3042159,39 C 4.2984702,39.088388 3.9267507,39.779883 3.9267507,40.442796 z "
  625 + style="opacity:1;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
  626 + <path
  627 + sodipodi:nodetypes="ccccccccc"
  628 + id="path2915"
  629 + d="M 6.25,5.7343749 L 6,10.125 C 6,10.125 6.3125,8.9999999 7,8.9999999 L 40.125,8.9999999 C 40.828125,8.9843749 40.859375,9.3124999 40.984375,9.8281249 C 40.984375,9.8281249 40.734375,5.9531249 40.734375,5.9531249 C 40.703125,5.4062499 40.515625,4.9999999 39.953125,4.9999999 L 7.0625,4.9999999 C 6.609375,4.9999999 6.296875,5.3437499 6.25,5.7343749 z "
  630 + style="opacity:1;color:#000000;fill:url(#linearGradient2925-565);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
  631 + <path
  632 + style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99999946;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;opacity:0.43859649"
  633 + d="M 7.8126474,5.5404503 L 38.944983,5.5404503 C 39.66702,5.5404503 40.2483,5.3883462 40.2483,6.014572 C 40.2483,6.014572 42.521973,39.023077 42.521973,39.023077 C 42.521973,39.023077 42.622156,41.732033 42.622156,41.732033 C 42.622156,42.358259 42.48282,42.376269 41.760782,42.376269 L 4.8620444,42.376269 C 4.4493662,42.376269 4.4426114,42.269871 4.4426114,41.864615 L 4.4320338,39.194177 L 6.7280807,6.045822 C 6.7280807,5.4195962 7.09061,5.5404503 7.8126474,5.5404503 z "
  634 + id="path2917"
  635 + sodipodi:nodetypes="ccccccccccc" />
  636 + <g
  637 + id="g2950">
  638 + <rect
  639 + style="opacity:1;color:#000000;fill:#a5a5a5;fill-opacity:1;fill-rule:evenodd;stroke:#444444;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
  640 + id="rect2899"
  641 + width="2"
  642 + height="5"
  643 + x="8.5"
  644 + y="2.5"
  645 + rx="1"
  646 + ry="1" />
  647 + <rect
  648 + ry="1"
  649 + rx="1"
  650 + y="2.5"
  651 + x="12.5"
  652 + height="5"
  653 + width="2"
  654 + id="rect2901"
  655 + style="opacity:1;color:#000000;fill:#a5a5a5;fill-opacity:1;fill-rule:evenodd;stroke:#444444;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
  656 + <rect
  657 + style="opacity:1;color:#000000;fill:#a5a5a5;fill-opacity:1;fill-rule:evenodd;stroke:#444444;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
  658 + id="rect2903"
  659 + width="2"
  660 + height="5"
  661 + x="16.5"
  662 + y="2.5"
  663 + rx="1"
  664 + ry="1" />
  665 + <rect
  666 + ry="1"
  667 + rx="1"
  668 + y="2.5"
  669 + x="20.5"
  670 + height="5"
  671 + width="2"
  672 + id="rect2905"
  673 + style="opacity:1;color:#000000;fill:#a5a5a5;fill-opacity:1;fill-rule:evenodd;stroke:#444444;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
  674 + <rect
  675 + style="opacity:1;color:#000000;fill:#a5a5a5;fill-opacity:1;fill-rule:evenodd;stroke:#444444;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
  676 + id="rect2907"
  677 + width="2"
  678 + height="5"
  679 + x="24.5"
  680 + y="2.5"
  681 + rx="1"
  682 + ry="1" />
  683 + <rect
  684 + ry="1"
  685 + rx="1"
  686 + y="2.5"
  687 + x="28.5"
  688 + height="5"
  689 + width="2"
  690 + id="rect2909"
  691 + style="opacity:1;color:#000000;fill:#a5a5a5;fill-opacity:1;fill-rule:evenodd;stroke:#444444;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
  692 + <rect
  693 + style="opacity:1;color:#000000;fill:#a5a5a5;fill-opacity:1;fill-rule:evenodd;stroke:#444444;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
  694 + id="rect2911"
  695 + width="2"
  696 + height="5"
  697 + x="32.5"
  698 + y="2.5"
  699 + rx="1"
  700 + ry="1" />
  701 + <rect
  702 + ry="1"
  703 + rx="1"
  704 + y="2.5"
  705 + x="36.5"
  706 + height="5"
  707 + width="2"
  708 + id="rect2913"
  709 + style="opacity:1;color:#000000;fill:#a5a5a5;fill-opacity:1;fill-rule:evenodd;stroke:#444444;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
  710 + </g>
  711 + <g
  712 + id="g2941">
  713 + <rect
  714 + style="opacity:0.28070175;color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
  715 + id="rect2927"
  716 + width="29"
  717 + height="1"
  718 + x="9"
  719 + y="12" />
  720 + <rect
  721 + y="14.981792"
  722 + x="9"
  723 + height="1"
  724 + width="29"
  725 + id="rect2929"
  726 + style="opacity:0.28070176;color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
  727 + <rect
  728 + style="opacity:0.28070176;color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
  729 + id="rect2931"
  730 + width="13"
  731 + height="1"
  732 + x="9"
  733 + y="18.003939" />
  734 + <rect
  735 + y="22.985731"
  736 + x="9"
  737 + height="1"
  738 + width="29"
  739 + id="rect2933"
  740 + style="opacity:0.28070176;color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
  741 + <rect
  742 + style="opacity:0.28070176;color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
  743 + id="rect2935"
  744 + width="29"
  745 + height="1"
  746 + x="9"
  747 + y="26.007877" />
  748 + <rect
  749 + y="29.030024"
  750 + x="9"
  751 + height="1"
  752 + width="29"
  753 + id="rect2937"
  754 + style="opacity:0.28070176;color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
  755 + <rect
  756 + style="opacity:0.28070176;color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
  757 + id="rect2939"
  758 + width="8"
  759 + height="1"
  760 + x="9"
  761 + y="32.05217" />
  762 + </g>
  763 + <path
  764 + sodipodi:nodetypes="cccccc"
  765 + id="path2960"
  766 + d="M 17.34116,32.5 L 22.96616,26.875 L 43.059909,17.125 C 46.309909,15.875 48.247409,20.5 45.372409,22.125 L 25.34116,31.5 L 17.34116,32.5 z "
  767 + style="opacity:1;color:#000000;fill:#767676;fill-opacity:1;fill-rule:evenodd;stroke:#343434;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
  768 + <path
  769 + style="opacity:1;color:#000000;fill:url(#linearGradient2972-839);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
  770 + d="M 38.330708,20 C 38.330708,20 39.768208,20.09375 40.330708,21.34375 C 40.910201,22.631511 40.330708,24 40.330708,24 L 45.361958,21.53125 C 45.361958,21.53125 46.81399,20.649883 46.018208,18.6875 C 45.233296,16.751923 43.330708,17.53125 43.330708,17.53125 L 38.330708,20 z "
  771 + id="path2964"
  772 + sodipodi:nodetypes="czcczcc" />
  773 + <path
  774 + sodipodi:nodetypes="czcczcc"
  775 + id="path2962"
  776 + d="M 38.330708,20 C 38.330708,20 39.768208,20.09375 40.330708,21.34375 C 40.910201,22.631511 40.330708,24 40.330708,24 L 42.330708,23 C 42.330708,23 43.15774,21.681133 42.549458,20.3125 C 41.924458,18.90625 40.330708,19 40.330708,19 L 38.330708,20 z "
  777 + style="opacity:1;color:#000000;fill:url(#linearGradient2980-769);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
  778 + <path
  779 + sodipodi:nodetypes="cccc"
  780 + id="path2982"
  781 + d="M 18.768208,31.78125 L 23.268208,27.28125 C 24.768208,28.09375 25.549458,29.4375 25.143208,31 L 18.768208,31.78125 z "
  782 + style="opacity:1;color:#000000;fill:url(#radialGradient2990-357);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
  783 + <path
  784 + sodipodi:nodetypes="cccc"
  785 + id="path2992"
  786 + d="M 20.111958,30.375 L 18.486958,31.96875 L 20.830708,31.65625 C 21.049458,30.9375 20.643208,30.59375 20.111958,30.375 z "
  787 + style="opacity:1;color:#000000;fill:url(#linearGradient3000-327);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
  788 + <path
  789 + sodipodi:nodetypes="ccccc"
  790 + id="path3002"
  791 + d="M 23.268208,27.25 L 24.830708,28.5 L 40.218048,21.18133 C 39.773616,20.325286 38.976281,20.096733 38.314669,20.019068 L 23.268208,27.25 z "
  792 + style="opacity:1;color:#000000;fill:#ffffff;fill-opacity:0.36363639;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
  793 + <path
  794 + sodipodi:nodetypes="ccccc"
  795 + id="path3004"
  796 + d="M 25.143208,31.0625 L 25.330708,30.3125 L 40.561798,23.1829 C 40.561798,23.1829 40.451638,23.796527 40.345919,23.93225 L 25.143208,31.0625 z "
  797 + style="opacity:1;color:#000000;fill:#000000;fill-opacity:0.36363639;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
  798 + </g>
  799 +</svg>
public/designs/icons/tango/style.css
@@ -5,6 +5,7 @@ @@ -5,6 +5,7 @@
5 .icon-new { background-image: url(Tango/16x16/actions/filenew.png) } 5 .icon-new { background-image: url(Tango/16x16/actions/filenew.png) }
6 .icon-close { background-image: url(Tango/16x16/actions/gtk-cancel.png) } 6 .icon-close { background-image: url(Tango/16x16/actions/gtk-cancel.png) }
7 .icon-newfolder { background-image: url(Tango/16x16/actions/folder-new.png) } 7 .icon-newfolder { background-image: url(Tango/16x16/actions/folder-new.png) }
  8 +.icon-newblog { background-image: url(Tango-mod/16x16/apps/text-editor.png) }
8 /*.icon-open { background-image: url(folder-open.gif) } UNUSED*/ 9 /*.icon-open { background-image: url(folder-open.gif) } UNUSED*/
9 /*.icon-cms { background-image: url(abiword_48.png) } UNUSED*/ 10 /*.icon-cms { background-image: url(abiword_48.png) } UNUSED*/
10 .icon-save { background-image: url(Tango/16x16/actions/filesave.png) } 11 .icon-save { background-image: url(Tango/16x16/actions/filesave.png) }
public/images/control-panel/text-editor-disabled.png
1 Binary files a/public/images/control-panel/text-editor-disabled.png and /dev/null differ 1 Binary files a/public/images/control-panel/text-editor-disabled.png and /dev/null differ
public/images/control-panel/text-editor-disabled.png 0 → 120000
@@ -0,0 +1 @@ @@ -0,0 +1 @@
  1 +../../designs/icons/tango/Tango-mod/48x48/apps/text-editor.png
0 \ No newline at end of file 2 \ No newline at end of file
public/images/control-panel/text-editor-disabled.svg
@@ -1,799 +0,0 @@ @@ -1,799 +0,0 @@
1 -<?xml version="1.0" encoding="UTF-8" standalone="no"?>  
2 -<!-- Created with Inkscape (http://www.inkscape.org/) -->  
3 -<svg  
4 - xmlns:dc="http://purl.org/dc/elements/1.1/"  
5 - xmlns:cc="http://creativecommons.org/ns#"  
6 - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"  
7 - xmlns:svg="http://www.w3.org/2000/svg"  
8 - xmlns="http://www.w3.org/2000/svg"  
9 - xmlns:xlink="http://www.w3.org/1999/xlink"  
10 - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"  
11 - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"  
12 - inkscape:export-ydpi="90.000000"  
13 - inkscape:export-xdpi="90.000000"  
14 - inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png"  
15 - width="48px"  
16 - height="48px"  
17 - id="svg11300"  
18 - sodipodi:version="0.32"  
19 - inkscape:version="0.46"  
20 - sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/apps"  
21 - sodipodi:docname="text-editor-disabled.svg"  
22 - inkscape:output_extension="org.inkscape.output.svg.inkscape">  
23 - <sodipodi:namedview  
24 - stroke="#c4a000"  
25 - fill="#edd400"  
26 - id="base"  
27 - pagecolor="#ffffff"  
28 - bordercolor="#666666"  
29 - borderopacity="0.25490196"  
30 - inkscape:pageopacity="0.0"  
31 - inkscape:pageshadow="2"  
32 - inkscape:zoom="11.229167"  
33 - inkscape:cx="24"  
34 - inkscape:cy="24"  
35 - inkscape:current-layer="layer1"  
36 - showgrid="false"  
37 - inkscape:grid-bbox="true"  
38 - inkscape:document-units="px"  
39 - inkscape:showpageshadow="false"  
40 - inkscape:window-width="1276"  
41 - inkscape:window-height="745"  
42 - inkscape:window-x="0"  
43 - inkscape:window-y="19" />  
44 - <defs  
45 - id="defs3">  
46 - <inkscape:perspective  
47 - id="perspective85"  
48 - inkscape:persp3d-origin="24 : 16 : 1"  
49 - inkscape:vp_z="48 : 24 : 1"  
50 - inkscape:vp_y="0 : 1000 : 0"  
51 - inkscape:vp_x="0 : 24 : 1"  
52 - sodipodi:type="inkscape:persp3d" />  
53 - <radialGradient  
54 - r="117.14286"  
55 - fy="486.64789"  
56 - fx="605.71429"  
57 - cy="486.64789"  
58 - cx="605.71429"  
59 - gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"  
60 - gradientUnits="userSpaceOnUse"  
61 - id="radialGradient6719"  
62 - xlink:href="#linearGradient5060"  
63 - inkscape:collect="always" />  
64 - <linearGradient  
65 - id="linearGradient5060"  
66 - inkscape:collect="always">  
67 - <stop  
68 - id="stop5062"  
69 - offset="0"  
70 - style="stop-color:#000000;stop-opacity:1;" />  
71 - <stop  
72 - id="stop5064"  
73 - offset="1"  
74 - style="stop-color:#000000;stop-opacity:0;" />  
75 - </linearGradient>  
76 - <radialGradient  
77 - r="117.14286"  
78 - fy="486.64789"  
79 - fx="605.71429"  
80 - cy="486.64789"  
81 - cx="605.71429"  
82 - gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"  
83 - gradientUnits="userSpaceOnUse"  
84 - id="radialGradient6717"  
85 - xlink:href="#linearGradient5060"  
86 - inkscape:collect="always" />  
87 - <linearGradient  
88 - id="linearGradient5048">  
89 - <stop  
90 - id="stop5050"  
91 - offset="0"  
92 - style="stop-color:#000000;stop-opacity:0;" />  
93 - <stop  
94 - style="stop-color:#000000;stop-opacity:1;"  
95 - offset="0.5"  
96 - id="stop5056" />  
97 - <stop  
98 - id="stop5052"  
99 - offset="1"  
100 - style="stop-color:#000000;stop-opacity:0;" />  
101 - </linearGradient>  
102 - <linearGradient  
103 - y2="609.50507"  
104 - x2="302.85715"  
105 - y1="366.64789"  
106 - x1="302.85715"  
107 - gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"  
108 - gradientUnits="userSpaceOnUse"  
109 - id="linearGradient6715"  
110 - xlink:href="#linearGradient5048"  
111 - inkscape:collect="always" />  
112 - <linearGradient  
113 - id="linearGradient2994">  
114 - <stop  
115 - id="stop2996"  
116 - offset="0"  
117 - style="stop-color:#000000;stop-opacity:1;" />  
118 - <stop  
119 - id="stop2998"  
120 - offset="1"  
121 - style="stop-color:#c9c9c9;stop-opacity:1;" />  
122 - </linearGradient>  
123 - <linearGradient  
124 - id="linearGradient2984"  
125 - inkscape:collect="always">  
126 - <stop  
127 - id="stop2986"  
128 - offset="0"  
129 - style="stop-color:#cfcfcf;stop-opacity:1;" />  
130 - <stop  
131 - id="stop2988"  
132 - offset="1"  
133 - style="stop-color:#cfcfcf;stop-opacity:0;" />  
134 - </linearGradient>  
135 - <linearGradient  
136 - id="linearGradient2974">  
137 - <stop  
138 - id="stop2976"  
139 - offset="0"  
140 - style="stop-color:#c1c1c1;stop-opacity:1;" />  
141 - <stop  
142 - id="stop2978"  
143 - offset="1"  
144 - style="stop-color:#acacac;stop-opacity:1;" />  
145 - </linearGradient>  
146 - <linearGradient  
147 - id="linearGradient2966">  
148 - <stop  
149 - id="stop2968"  
150 - offset="0"  
151 - style="stop-color:#e8e8e8;stop-opacity:1;" />  
152 - <stop  
153 - style="stop-color:#8e8e8e;stop-opacity:1;"  
154 - offset="0.5"  
155 - id="stop3006" />  
156 - <stop  
157 - id="stop2970"  
158 - offset="1"  
159 - style="stop-color:#373737;stop-opacity:1;" />  
160 - </linearGradient>  
161 - <linearGradient  
162 - id="linearGradient2919">  
163 - <stop  
164 - id="stop2921"  
165 - offset="0"  
166 - style="stop-color:#a2a2a2;stop-opacity:1;" />  
167 - <stop  
168 - id="stop2923"  
169 - offset="1"  
170 - style="stop-color:#878787;stop-opacity:1;" />  
171 - </linearGradient>  
172 - <linearGradient  
173 - id="linearGradient2873">  
174 - <stop  
175 - id="stop2875"  
176 - offset="0"  
177 - style="stop-color:#939393;stop-opacity:1;" />  
178 - <stop  
179 - id="stop2877"  
180 - offset="1"  
181 - style="stop-color:#424242;stop-opacity:1;" />  
182 - </linearGradient>  
183 - <linearGradient  
184 - id="linearGradient2865"  
185 - inkscape:collect="always">  
186 - <stop  
187 - id="stop2867"  
188 - offset="0"  
189 - style="stop-color:#000000;stop-opacity:1;" />  
190 - <stop  
191 - id="stop2869"  
192 - offset="1"  
193 - style="stop-color:#000000;stop-opacity:0;" />  
194 - </linearGradient>  
195 - <linearGradient  
196 - id="linearGradient2855">  
197 - <stop  
198 - id="stop2857"  
199 - offset="0"  
200 - style="stop-color:#dfdfdf;stop-opacity:1;" />  
201 - <stop  
202 - id="stop2859"  
203 - offset="1"  
204 - style="stop-color:#ffffff;stop-opacity:1;" />  
205 - </linearGradient>  
206 - <linearGradient  
207 - gradientTransform="matrix(1.137871,0.000000,0.000000,1.000000,-2.660884,0.000000)"  
208 - gradientUnits="userSpaceOnUse"  
209 - y2="6.8333683"  
210 - x2="14.283642"  
211 - y1="42.83337"  
212 - x1="21.043484"  
213 - id="linearGradient2861"  
214 - xlink:href="#linearGradient2855"  
215 - inkscape:collect="always" />  
216 - <radialGradient  
217 - gradientUnits="userSpaceOnUse"  
218 - gradientTransform="matrix(1.000000,0.000000,0.000000,0.348243,0.000000,26.35543)"  
219 - r="19.5625"  
220 - fy="40.4375"  
221 - fx="23.5625"  
222 - cy="40.4375"  
223 - cx="23.5625"  
224 - id="radialGradient2871"  
225 - xlink:href="#linearGradient2865"  
226 - inkscape:collect="always" />  
227 - <linearGradient  
228 - gradientUnits="userSpaceOnUse"  
229 - y2="42.83337"  
230 - x2="26.228401"  
231 - y1="28.083368"  
232 - x1="26.612417"  
233 - id="linearGradient2879"  
234 - xlink:href="#linearGradient2873"  
235 - inkscape:collect="always" />  
236 - <linearGradient  
237 - gradientUnits="userSpaceOnUse"  
238 - y2="7.5624999"  
239 - x2="40.984375"  
240 - y1="7.5624999"  
241 - x1="6"  
242 - id="linearGradient2925"  
243 - xlink:href="#linearGradient2919"  
244 - inkscape:collect="always" />  
245 - <linearGradient  
246 - gradientTransform="translate(-5.669292,0.000000)"  
247 - gradientUnits="userSpaceOnUse"  
248 - y2="22.250591"  
249 - x2="50.988335"  
250 - y1="17.376184"  
251 - x1="48.90625"  
252 - id="linearGradient2972"  
253 - xlink:href="#linearGradient2966"  
254 - inkscape:collect="always" />  
255 - <linearGradient  
256 - gradientTransform="translate(-5.669292,0.000000)"  
257 - gradientUnits="userSpaceOnUse"  
258 - y2="22.625"  
259 - x2="47.6875"  
260 - y1="19.8125"  
261 - x1="46"  
262 - id="linearGradient2980"  
263 - xlink:href="#linearGradient2974"  
264 - inkscape:collect="always" />  
265 - <radialGradient  
266 - gradientUnits="userSpaceOnUse"  
267 - gradientTransform="matrix(2.923565,-3.911409e-24,2.471769e-23,2.029717,-61.55532,-27.88417)"  
268 - r="3.2408544"  
269 - fy="27.640751"  
270 - fx="29.053354"  
271 - cy="27.640751"  
272 - cx="29.053354"  
273 - id="radialGradient2990"  
274 - xlink:href="#linearGradient2984"  
275 - inkscape:collect="always" />  
276 - <linearGradient  
277 - gradientTransform="translate(-5.825542,0.125000)"  
278 - gradientUnits="userSpaceOnUse"  
279 - y2="30.703125"  
280 - x2="25.514589"  
281 - y1="31.046875"  
282 - x1="25.71875"  
283 - id="linearGradient3000"  
284 - xlink:href="#linearGradient2994"  
285 - inkscape:collect="always" />  
286 - <radialGradient  
287 - r="19.5625"  
288 - fy="40.4375"  
289 - fx="23.5625"  
290 - cy="40.4375"  
291 - cx="23.5625"  
292 - gradientTransform="matrix(1.000000,0.000000,0.000000,0.348243,1.439818e-16,26.35543)"  
293 - gradientUnits="userSpaceOnUse"  
294 - id="radialGradient3010"  
295 - xlink:href="#linearGradient2865"  
296 - inkscape:collect="always" />  
297 - <linearGradient  
298 - y2="609.50507"  
299 - x2="302.85715"  
300 - y1="366.64789"  
301 - x1="302.85715"  
302 - gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"  
303 - gradientUnits="userSpaceOnUse"  
304 - id="linearGradient6715-635"  
305 - xlink:href="#linearGradient5048-282"  
306 - inkscape:collect="always" />  
307 - <linearGradient  
308 - id="linearGradient5048-282">  
309 - <stop  
310 - id="stop2506"  
311 - offset="0"  
312 - style="stop-color:#000000;stop-opacity:0;" />  
313 - <stop  
314 - style="stop-color:#000000;stop-opacity:1;"  
315 - offset="0.5"  
316 - id="stop2508" />  
317 - <stop  
318 - id="stop2510"  
319 - offset="1"  
320 - style="stop-color:#000000;stop-opacity:0;" />  
321 - </linearGradient>  
322 - <radialGradient  
323 - r="117.14286"  
324 - fy="486.64789"  
325 - fx="605.71429"  
326 - cy="486.64789"  
327 - cx="605.71429"  
328 - gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"  
329 - gradientUnits="userSpaceOnUse"  
330 - id="radialGradient6717-944"  
331 - xlink:href="#linearGradient5060-14"  
332 - inkscape:collect="always" />  
333 - <linearGradient  
334 - id="linearGradient5060-14"  
335 - inkscape:collect="always">  
336 - <stop  
337 - id="stop2514"  
338 - offset="0"  
339 - style="stop-color:#000000;stop-opacity:1;" />  
340 - <stop  
341 - id="stop2516"  
342 - offset="1"  
343 - style="stop-color:#000000;stop-opacity:0;" />  
344 - </linearGradient>  
345 - <radialGradient  
346 - r="117.14286"  
347 - fy="486.64789"  
348 - fx="605.71429"  
349 - cy="486.64789"  
350 - cx="605.71429"  
351 - gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"  
352 - gradientUnits="userSpaceOnUse"  
353 - id="radialGradient6719-778"  
354 - xlink:href="#linearGradient5060-358"  
355 - inkscape:collect="always" />  
356 - <linearGradient  
357 - id="linearGradient5060-358"  
358 - inkscape:collect="always">  
359 - <stop  
360 - id="stop2520"  
361 - offset="0"  
362 - style="stop-color:#000000;stop-opacity:1;" />  
363 - <stop  
364 - id="stop2522"  
365 - offset="1"  
366 - style="stop-color:#000000;stop-opacity:0;" />  
367 - </linearGradient>  
368 - <linearGradient  
369 - gradientTransform="matrix(1.137871,0.000000,0.000000,1.000000,-2.660884,0.000000)"  
370 - gradientUnits="userSpaceOnUse"  
371 - y2="6.8333683"  
372 - x2="14.283642"  
373 - y1="42.83337"  
374 - x1="21.043484"  
375 - id="linearGradient2861-627"  
376 - xlink:href="#linearGradient2855-316"  
377 - inkscape:collect="always" />  
378 - <linearGradient  
379 - id="linearGradient2855-316">  
380 - <stop  
381 - id="stop2526"  
382 - offset="0"  
383 - style="stop-color:#dfdfdf;stop-opacity:1;" />  
384 - <stop  
385 - id="stop2528"  
386 - offset="1"  
387 - style="stop-color:#ffffff;stop-opacity:1;" />  
388 - </linearGradient>  
389 - <linearGradient  
390 - gradientUnits="userSpaceOnUse"  
391 - y2="42.83337"  
392 - x2="26.228401"  
393 - y1="28.083368"  
394 - x1="26.612417"  
395 - id="linearGradient2879-751"  
396 - xlink:href="#linearGradient2873-629"  
397 - inkscape:collect="always" />  
398 - <linearGradient  
399 - id="linearGradient2873-629">  
400 - <stop  
401 - id="stop2532"  
402 - offset="0"  
403 - style="stop-color:#939393;stop-opacity:1;" />  
404 - <stop  
405 - id="stop2534"  
406 - offset="1"  
407 - style="stop-color:#424242;stop-opacity:1;" />  
408 - </linearGradient>  
409 - <radialGradient  
410 - r="19.5625"  
411 - fy="40.4375"  
412 - fx="23.5625"  
413 - cy="40.4375"  
414 - cx="23.5625"  
415 - gradientTransform="matrix(1.000000,0.000000,0.000000,0.348243,1.439818e-16,26.35543)"  
416 - gradientUnits="userSpaceOnUse"  
417 - id="radialGradient3010-591"  
418 - xlink:href="#linearGradient2865-708"  
419 - inkscape:collect="always" />  
420 - <linearGradient  
421 - id="linearGradient2865-708"  
422 - inkscape:collect="always">  
423 - <stop  
424 - id="stop2538"  
425 - offset="0"  
426 - style="stop-color:#000000;stop-opacity:1;" />  
427 - <stop  
428 - id="stop2540"  
429 - offset="1"  
430 - style="stop-color:#000000;stop-opacity:0;" />  
431 - </linearGradient>  
432 - <linearGradient  
433 - gradientUnits="userSpaceOnUse"  
434 - y2="7.5624999"  
435 - x2="40.984375"  
436 - y1="7.5624999"  
437 - x1="6"  
438 - id="linearGradient2925-565"  
439 - xlink:href="#linearGradient2919-578"  
440 - inkscape:collect="always" />  
441 - <linearGradient  
442 - id="linearGradient2919-578">  
443 - <stop  
444 - id="stop2544"  
445 - offset="0"  
446 - style="stop-color:#a2a2a2;stop-opacity:1;" />  
447 - <stop  
448 - id="stop2546"  
449 - offset="1"  
450 - style="stop-color:#878787;stop-opacity:1;" />  
451 - </linearGradient>  
452 - <linearGradient  
453 - gradientTransform="translate(-5.669292,0.000000)"  
454 - gradientUnits="userSpaceOnUse"  
455 - y2="22.250591"  
456 - x2="50.988335"  
457 - y1="17.376184"  
458 - x1="48.90625"  
459 - id="linearGradient2972-839"  
460 - xlink:href="#linearGradient2966-498"  
461 - inkscape:collect="always" />  
462 - <linearGradient  
463 - id="linearGradient2966-498">  
464 - <stop  
465 - id="stop2550"  
466 - offset="0"  
467 - style="stop-color:#e8e8e8;stop-opacity:1;" />  
468 - <stop  
469 - style="stop-color:#8e8e8e;stop-opacity:1;"  
470 - offset="0.5"  
471 - id="stop2552" />  
472 - <stop  
473 - id="stop2554"  
474 - offset="1"  
475 - style="stop-color:#373737;stop-opacity:1;" />  
476 - </linearGradient>  
477 - <linearGradient  
478 - gradientTransform="translate(-5.669292,0.000000)"  
479 - gradientUnits="userSpaceOnUse"  
480 - y2="22.625"  
481 - x2="47.6875"  
482 - y1="19.8125"  
483 - x1="46"  
484 - id="linearGradient2980-769"  
485 - xlink:href="#linearGradient2974-591"  
486 - inkscape:collect="always" />  
487 - <linearGradient  
488 - id="linearGradient2974-591">  
489 - <stop  
490 - id="stop2558"  
491 - offset="0"  
492 - style="stop-color:#c1c1c1;stop-opacity:1;" />  
493 - <stop  
494 - id="stop2560"  
495 - offset="1"  
496 - style="stop-color:#acacac;stop-opacity:1;" />  
497 - </linearGradient>  
498 - <radialGradient  
499 - gradientUnits="userSpaceOnUse"  
500 - gradientTransform="matrix(2.923565,-3.911409e-24,2.471769e-23,2.029717,-61.55532,-27.88417)"  
501 - r="3.2408544"  
502 - fy="27.640751"  
503 - fx="29.053354"  
504 - cy="27.640751"  
505 - cx="29.053354"  
506 - id="radialGradient2990-357"  
507 - xlink:href="#linearGradient2984-123"  
508 - inkscape:collect="always" />  
509 - <linearGradient  
510 - id="linearGradient2984-123"  
511 - inkscape:collect="always">  
512 - <stop  
513 - id="stop2564"  
514 - offset="0"  
515 - style="stop-color:#cfcfcf;stop-opacity:1;" />  
516 - <stop  
517 - id="stop2566"  
518 - offset="1"  
519 - style="stop-color:#cfcfcf;stop-opacity:0;" />  
520 - </linearGradient>  
521 - <linearGradient  
522 - gradientTransform="translate(-5.825542,0.125000)"  
523 - gradientUnits="userSpaceOnUse"  
524 - y2="30.703125"  
525 - x2="25.514589"  
526 - y1="31.046875"  
527 - x1="25.71875"  
528 - id="linearGradient3000-327"  
529 - xlink:href="#linearGradient2994-689"  
530 - inkscape:collect="always" />  
531 - <linearGradient  
532 - id="linearGradient2994-689">  
533 - <stop  
534 - id="stop2570"  
535 - offset="0"  
536 - style="stop-color:#000000;stop-opacity:1;" />  
537 - <stop  
538 - id="stop2572"  
539 - offset="1"  
540 - style="stop-color:#c9c9c9;stop-opacity:1;" />  
541 - </linearGradient>  
542 - </defs>  
543 - <metadata  
544 - id="metadata4">  
545 - <rdf:RDF>  
546 - <cc:Work  
547 - rdf:about="">  
548 - <dc:format>image/svg+xml</dc:format>  
549 - <dc:type  
550 - rdf:resource="http://purl.org/dc/dcmitype/StillImage" />  
551 - <dc:creator>  
552 - <cc:Agent>  
553 - <dc:title>Jakub Steiner</dc:title>  
554 - </cc:Agent>  
555 - </dc:creator>  
556 - <dc:source>http://jimmac.musichall.cz</dc:source>  
557 - <cc:license  
558 - rdf:resource="http://creativecommons.org/licenses/publicdomain/" />  
559 - <dc:title>Text Editor</dc:title>  
560 - </cc:Work>  
561 - <cc:License  
562 - rdf:about="http://creativecommons.org/licenses/publicdomain/">  
563 - <cc:permits  
564 - rdf:resource="http://creativecommons.org/ns#Reproduction" />  
565 - <cc:permits  
566 - rdf:resource="http://creativecommons.org/ns#Distribution" />  
567 - <cc:permits  
568 - rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />  
569 - </cc:License>  
570 - </rdf:RDF>  
571 - </metadata>  
572 - <g  
573 - inkscape:groupmode="layer"  
574 - inkscape:label="Layer 1"  
575 - id="layer1">  
576 - <g  
577 - id="g6707"  
578 - transform="matrix(2.417561e-2,0,0,2.086758e-2,45.12765,40.1536)">  
579 - <rect  
580 - y="-150.69685"  
581 - x="-1559.2523"  
582 - height="478.35718"  
583 - width="1339.6335"  
584 - id="rect6709"  
585 - style="opacity:0.40206185;color:black;fill:url(#linearGradient6715-635);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />  
586 - <path  
587 - sodipodi:nodetypes="cccc"  
588 - id="path6711"  
589 - d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "  
590 - style="opacity:0.40206185;color:black;fill:url(#radialGradient6717-944);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />  
591 - <path  
592 - style="opacity:0.40206185;color:black;fill:url(#radialGradient6719-778);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"  
593 - d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "  
594 - id="path6713"  
595 - sodipodi:nodetypes="cccc" />  
596 - </g>  
597 - <path  
598 - sodipodi:nodetypes="ccccccccccc"  
599 - id="rect1975"  
600 - d="M 7.1638699,4.5063726 L 39.813122,4.5063726 C 40.575699,4.5063726 41.189615,5.0388241 41.189615,5.7002099 C 41.189615,5.7002099 43.590945,39.868907 43.590945,39.868907 C 43.590945,39.868907 43.603403,42.216529 43.603403,42.216529 C 43.603403,42.877915 42.989488,43.410366 42.226911,43.410366 L 4.750081,43.410366 C 3.9875042,43.410366 3.3735887,42.877915 3.3735887,42.216529 L 3.3624173,40.049613 L 5.7873775,5.7002099 C 5.7873775,5.0388241 6.4012931,4.5063726 7.1638699,4.5063726 z "  
601 - style="color:#000000;fill:url(#linearGradient2861-627);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient2879-751);stroke-width:0.99999982;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />  
602 - <path  
603 - sodipodi:type="arc"  
604 - style="opacity:0.31578944;color:#000000;fill:url(#radialGradient3010-591);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"  
605 - id="path3008"  
606 - sodipodi:cx="23.5625"  
607 - sodipodi:cy="40.4375"  
608 - sodipodi:rx="19.5625"  
609 - sodipodi:ry="6.8125"  
610 - d="M 43.125 40.4375 A 19.5625 6.8125 0 1 1 4,40.4375 A 19.5625 6.8125 0 1 1 43.125 40.4375 z"  
611 - transform="matrix(0.616613,0.000000,0.000000,0.440367,10.61425,13.94266)" />  
612 - <rect  
613 - ry="0.67937863"  
614 - rx="0.67937863"  
615 - y="39.868271"  
616 - x="3.9770372"  
617 - height="3.0714951"  
618 - width="39.048077"  
619 - id="rect2851"  
620 - style="opacity:1;color:#000000;fill:#a4a4a4;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />  
621 - <path  
622 - sodipodi:nodetypes="ccccccc"  
623 - id="path2853"  
624 - d="M 3.9267507,40.442796 C 3.9267507,40.442796 4.0776125,39.912466 4.6307727,39.868272 L 42.195375,39.868272 C 42.949684,39.868272 42.999971,40.619573 42.999971,40.619573 C 42.999971,40.619573 43.02357,39 41.7161,39 L 5.3042159,39 C 4.2984702,39.088388 3.9267507,39.779883 3.9267507,40.442796 z "  
625 - style="opacity:1;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />  
626 - <path  
627 - sodipodi:nodetypes="ccccccccc"  
628 - id="path2915"  
629 - d="M 6.25,5.7343749 L 6,10.125 C 6,10.125 6.3125,8.9999999 7,8.9999999 L 40.125,8.9999999 C 40.828125,8.9843749 40.859375,9.3124999 40.984375,9.8281249 C 40.984375,9.8281249 40.734375,5.9531249 40.734375,5.9531249 C 40.703125,5.4062499 40.515625,4.9999999 39.953125,4.9999999 L 7.0625,4.9999999 C 6.609375,4.9999999 6.296875,5.3437499 6.25,5.7343749 z "  
630 - style="opacity:1;color:#000000;fill:url(#linearGradient2925-565);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />  
631 - <path  
632 - style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99999946;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;opacity:0.43859649"  
633 - d="M 7.8126474,5.5404503 L 38.944983,5.5404503 C 39.66702,5.5404503 40.2483,5.3883462 40.2483,6.014572 C 40.2483,6.014572 42.521973,39.023077 42.521973,39.023077 C 42.521973,39.023077 42.622156,41.732033 42.622156,41.732033 C 42.622156,42.358259 42.48282,42.376269 41.760782,42.376269 L 4.8620444,42.376269 C 4.4493662,42.376269 4.4426114,42.269871 4.4426114,41.864615 L 4.4320338,39.194177 L 6.7280807,6.045822 C 6.7280807,5.4195962 7.09061,5.5404503 7.8126474,5.5404503 z "  
634 - id="path2917"  
635 - sodipodi:nodetypes="ccccccccccc" />  
636 - <g  
637 - id="g2950">  
638 - <rect  
639 - style="opacity:1;color:#000000;fill:#a5a5a5;fill-opacity:1;fill-rule:evenodd;stroke:#444444;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"  
640 - id="rect2899"  
641 - width="2"  
642 - height="5"  
643 - x="8.5"  
644 - y="2.5"  
645 - rx="1"  
646 - ry="1" />  
647 - <rect  
648 - ry="1"  
649 - rx="1"  
650 - y="2.5"  
651 - x="12.5"  
652 - height="5"  
653 - width="2"  
654 - id="rect2901"  
655 - style="opacity:1;color:#000000;fill:#a5a5a5;fill-opacity:1;fill-rule:evenodd;stroke:#444444;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />  
656 - <rect  
657 - style="opacity:1;color:#000000;fill:#a5a5a5;fill-opacity:1;fill-rule:evenodd;stroke:#444444;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"  
658 - id="rect2903"  
659 - width="2"  
660 - height="5"  
661 - x="16.5"  
662 - y="2.5"  
663 - rx="1"  
664 - ry="1" />  
665 - <rect  
666 - ry="1"  
667 - rx="1"  
668 - y="2.5"  
669 - x="20.5"  
670 - height="5"  
671 - width="2"  
672 - id="rect2905"  
673 - style="opacity:1;color:#000000;fill:#a5a5a5;fill-opacity:1;fill-rule:evenodd;stroke:#444444;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />  
674 - <rect  
675 - style="opacity:1;color:#000000;fill:#a5a5a5;fill-opacity:1;fill-rule:evenodd;stroke:#444444;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"  
676 - id="rect2907"  
677 - width="2"  
678 - height="5"  
679 - x="24.5"  
680 - y="2.5"  
681 - rx="1"  
682 - ry="1" />  
683 - <rect  
684 - ry="1"  
685 - rx="1"  
686 - y="2.5"  
687 - x="28.5"  
688 - height="5"  
689 - width="2"  
690 - id="rect2909"  
691 - style="opacity:1;color:#000000;fill:#a5a5a5;fill-opacity:1;fill-rule:evenodd;stroke:#444444;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />  
692 - <rect  
693 - style="opacity:1;color:#000000;fill:#a5a5a5;fill-opacity:1;fill-rule:evenodd;stroke:#444444;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"  
694 - id="rect2911"  
695 - width="2"  
696 - height="5"  
697 - x="32.5"  
698 - y="2.5"  
699 - rx="1"  
700 - ry="1" />  
701 - <rect  
702 - ry="1"  
703 - rx="1"  
704 - y="2.5"  
705 - x="36.5"  
706 - height="5"  
707 - width="2"  
708 - id="rect2913"  
709 - style="opacity:1;color:#000000;fill:#a5a5a5;fill-opacity:1;fill-rule:evenodd;stroke:#444444;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />  
710 - </g>  
711 - <g  
712 - id="g2941">  
713 - <rect  
714 - style="opacity:0.28070175;color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"  
715 - id="rect2927"  
716 - width="29"  
717 - height="1"  
718 - x="9"  
719 - y="12" />  
720 - <rect  
721 - y="14.981792"  
722 - x="9"  
723 - height="1"  
724 - width="29"  
725 - id="rect2929"  
726 - style="opacity:0.28070176;color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />  
727 - <rect  
728 - style="opacity:0.28070176;color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"  
729 - id="rect2931"  
730 - width="13"  
731 - height="1"  
732 - x="9"  
733 - y="18.003939" />  
734 - <rect  
735 - y="22.985731"  
736 - x="9"  
737 - height="1"  
738 - width="29"  
739 - id="rect2933"  
740 - style="opacity:0.28070176;color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />  
741 - <rect  
742 - style="opacity:0.28070176;color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"  
743 - id="rect2935"  
744 - width="29"  
745 - height="1"  
746 - x="9"  
747 - y="26.007877" />  
748 - <rect  
749 - y="29.030024"  
750 - x="9"  
751 - height="1"  
752 - width="29"  
753 - id="rect2937"  
754 - style="opacity:0.28070176;color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />  
755 - <rect  
756 - style="opacity:0.28070176;color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"  
757 - id="rect2939"  
758 - width="8"  
759 - height="1"  
760 - x="9"  
761 - y="32.05217" />  
762 - </g>  
763 - <path  
764 - sodipodi:nodetypes="cccccc"  
765 - id="path2960"  
766 - d="M 17.34116,32.5 L 22.96616,26.875 L 43.059909,17.125 C 46.309909,15.875 48.247409,20.5 45.372409,22.125 L 25.34116,31.5 L 17.34116,32.5 z "  
767 - style="opacity:1;color:#000000;fill:#767676;fill-opacity:1;fill-rule:evenodd;stroke:#343434;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />  
768 - <path  
769 - style="opacity:1;color:#000000;fill:url(#linearGradient2972-839);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"  
770 - d="M 38.330708,20 C 38.330708,20 39.768208,20.09375 40.330708,21.34375 C 40.910201,22.631511 40.330708,24 40.330708,24 L 45.361958,21.53125 C 45.361958,21.53125 46.81399,20.649883 46.018208,18.6875 C 45.233296,16.751923 43.330708,17.53125 43.330708,17.53125 L 38.330708,20 z "  
771 - id="path2964"  
772 - sodipodi:nodetypes="czcczcc" />  
773 - <path  
774 - sodipodi:nodetypes="czcczcc"  
775 - id="path2962"  
776 - d="M 38.330708,20 C 38.330708,20 39.768208,20.09375 40.330708,21.34375 C 40.910201,22.631511 40.330708,24 40.330708,24 L 42.330708,23 C 42.330708,23 43.15774,21.681133 42.549458,20.3125 C 41.924458,18.90625 40.330708,19 40.330708,19 L 38.330708,20 z "  
777 - style="opacity:1;color:#000000;fill:url(#linearGradient2980-769);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />  
778 - <path  
779 - sodipodi:nodetypes="cccc"  
780 - id="path2982"  
781 - d="M 18.768208,31.78125 L 23.268208,27.28125 C 24.768208,28.09375 25.549458,29.4375 25.143208,31 L 18.768208,31.78125 z "  
782 - style="opacity:1;color:#000000;fill:url(#radialGradient2990-357);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />  
783 - <path  
784 - sodipodi:nodetypes="cccc"  
785 - id="path2992"  
786 - d="M 20.111958,30.375 L 18.486958,31.96875 L 20.830708,31.65625 C 21.049458,30.9375 20.643208,30.59375 20.111958,30.375 z "  
787 - style="opacity:1;color:#000000;fill:url(#linearGradient3000-327);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />  
788 - <path  
789 - sodipodi:nodetypes="ccccc"  
790 - id="path3002"  
791 - d="M 23.268208,27.25 L 24.830708,28.5 L 40.218048,21.18133 C 39.773616,20.325286 38.976281,20.096733 38.314669,20.019068 L 23.268208,27.25 z "  
792 - style="opacity:1;color:#000000;fill:#ffffff;fill-opacity:0.36363639;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />  
793 - <path  
794 - sodipodi:nodetypes="ccccc"  
795 - id="path3004"  
796 - d="M 25.143208,31.0625 L 25.330708,30.3125 L 40.561798,23.1829 C 40.561798,23.1829 40.451638,23.796527 40.345919,23.93225 L 25.143208,31.0625 z "  
797 - style="opacity:1;color:#000000;fill:#000000;fill-opacity:0.36363639;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />  
798 - </g>  
799 -</svg>  
public/images/control-panel/text-editor-disabled.svg 0 → 120000
@@ -0,0 +1 @@ @@ -0,0 +1 @@
  1 +../../designs/icons/tango/Tango-mod/scalable/apps/text-editor.svg
0 \ No newline at end of file 2 \ No newline at end of file
public/javascripts/application.js
@@ -45,3 +45,28 @@ function convToValidIdentifier( str, sep ) { @@ -45,3 +45,28 @@ function convToValidIdentifier( str, sep ) {
45 .replace( /ç/g, "c" ) 45 .replace( /ç/g, "c" )
46 .replace( /[^-_a-z0-9.]+/g, sep ) 46 .replace( /[^-_a-z0-9.]+/g, sep )
47 } 47 }
  48 +
  49 +function updateUrlField(name_field, id) {
  50 + url_field = $(id);
  51 + url_field.value = convToValidIdentifier(name_field.value, "-");
  52 + warn_value_change(url_field);
  53 +}
  54 +
  55 +function show_warning(field, message) {
  56 + new Effect.Highlight(field, {duration:3});
  57 + $(message).show();
  58 +}
  59 +
  60 +function hide_warning(field) {
  61 + $(field).hide();
  62 +}
  63 +
  64 +function enable_button(button) {
  65 + button.enable();
  66 + button.removeClassName("disabled");
  67 +}
  68 +
  69 +function disable_button(button) {
  70 + button.disable();
  71 + button.addClassName("disabled");
  72 +}
public/stylesheets/common.css
@@ -577,3 +577,21 @@ div.pending-tasks { @@ -577,3 +577,21 @@ div.pending-tasks {
577 .post-date { 577 .post-date {
578 color: #E68A00; 578 color: #E68A00;
579 } 579 }
  580 +
  581 +/**** Change confirmation message ****/
  582 +
  583 +.change-confirmation {
  584 + background-color: #ef2929;
  585 + border: 6px solid #a40000;
  586 + padding: 20px;
  587 + margin: 5px 30px 10px 30px;
  588 +}
  589 +
  590 +.change-confirmation div {
  591 + text-align: right;
  592 + padding: 20px 10px 0px 0px;
  593 +}
  594 +
  595 +code input {
  596 + font-family: monospace;
  597 +}
public/stylesheets/controller_profile_editor.css
@@ -31,22 +31,6 @@ @@ -31,22 +31,6 @@
31 -moz-border-radius: 3px; 31 -moz-border-radius: 3px;
32 } 32 }
33 33
34 -#identifier-change-confirmation {  
35 - background-color: #ef2929;  
36 - border: 6px solid #a40000;  
37 - padding: 20px;  
38 - margin: 5px 30px 10px 30px;  
39 -}  
40 -  
41 -#identifier-change-confirmation div {  
42 - text-align: right;  
43 - padding: 20px 10px 0px 0px;  
44 -}  
45 -  
46 -code input {  
47 - font-family: monospace;  
48 -}  
49 -  
50 a.control-panel-groups { background-image: url(../images/control-panel/system-users.png) } 34 a.control-panel-groups { background-image: url(../images/control-panel/system-users.png) }
51 .msie6 a.control-panel-groups { background-image: url(../images/control-panel/system-users.gif) } 35 .msie6 a.control-panel-groups { background-image: url(../images/control-panel/system-users.gif) }
52 36
test/functional/cms_controller_test.rb
@@ -583,7 +583,7 @@ class CmsControllerTest &lt; Test::Unit::TestCase @@ -583,7 +583,7 @@ class CmsControllerTest &lt; Test::Unit::TestCase
583 should 'record when coming from public view on edit' do 583 should 'record when coming from public view on edit' do
584 article = @profile.articles.create!(:name => 'myarticle') 584 article = @profile.articles.create!(:name => 'myarticle')
585 585
586 - @request.expects(:referer).returns('http://colivre.net/testinguser/myarticle') 586 + @request.expects(:referer).returns('http://colivre.net/testinguser/myarticle').at_least_once
587 587
588 get :edit, :profile => 'testinguser', :id => article.id 588 get :edit, :profile => 'testinguser', :id => article.id
589 assert_tag :tag => 'input', :attributes => { :type => 'hidden', :name => 'back_to', :value => 'public_view' } 589 assert_tag :tag => 'input', :attributes => { :type => 'hidden', :name => 'back_to', :value => 'public_view' }
@@ -591,7 +591,7 @@ class CmsControllerTest &lt; Test::Unit::TestCase @@ -591,7 +591,7 @@ class CmsControllerTest &lt; Test::Unit::TestCase
591 end 591 end
592 592
593 should 'detect when comming from home page' do 593 should 'detect when comming from home page' do
594 - @request.expects(:referer).returns('http://colivre.net/testinguser') 594 + @request.expects(:referer).returns('http://colivre.net/testinguser').at_least_once
595 get :edit, :profile => 'testinguser', :id => @profile.home_page.id 595 get :edit, :profile => 'testinguser', :id => @profile.home_page.id
596 assert_tag :tag => 'input', :attributes => { :type => 'hidden', :name => 'back_to', :value => 'public_view' } 596 assert_tag :tag => 'input', :attributes => { :type => 'hidden', :name => 'back_to', :value => 'public_view' }
597 assert_tag :tag => 'a', :descendant => { :content => 'Cancel' }, :attributes => { :href => /^https?:\/\/colivre.net\/testinguser\/#{@profile.home_page.slug}$/ } 597 assert_tag :tag => 'a', :descendant => { :content => 'Cancel' }, :attributes => { :href => /^https?:\/\/colivre.net\/testinguser\/#{@profile.home_page.slug}$/ }
@@ -605,7 +605,7 @@ class CmsControllerTest &lt; Test::Unit::TestCase @@ -605,7 +605,7 @@ class CmsControllerTest &lt; Test::Unit::TestCase
605 end 605 end
606 606
607 should 'record as coming from public view when creating article' do 607 should 'record as coming from public view when creating article' do
608 - @request.expects(:referer).returns('http://colivre.net/testinguser/testingusers-home-page') 608 + @request.expects(:referer).returns('http://colivre.net/testinguser/testingusers-home-page').at_least_once
609 get :new, :profile => 'testinguser', :type => 'TextileArticle' 609 get :new, :profile => 'testinguser', :type => 'TextileArticle'
610 assert_tag :tag => 'input', :attributes => { :type => 'hidden', :name => 'back_to', :value => 'public_view' } 610 assert_tag :tag => 'input', :attributes => { :type => 'hidden', :name => 'back_to', :value => 'public_view' }
611 assert_tag :tag => 'a', :descendant => { :content => 'Cancel' }, :attributes => { :href => 'http://colivre.net/testinguser/testingusers-home-page' } 611 assert_tag :tag => 'a', :descendant => { :content => 'Cancel' }, :attributes => { :href => 'http://colivre.net/testinguser/testingusers-home-page' }
@@ -712,11 +712,6 @@ class CmsControllerTest &lt; Test::Unit::TestCase @@ -712,11 +712,6 @@ class CmsControllerTest &lt; Test::Unit::TestCase
712 assert_no_tag :tag => 'div', :descendant => { :tag => 'h4', :content => 'Categorize your article' } 712 assert_no_tag :tag => 'div', :descendant => { :tag => 'h4', :content => 'Categorize your article' }
713 end 713 end
714 714
715 - should 'not display input name on create blog' do  
716 - get :new, :profile => profile.identifier, :type => 'Blog'  
717 - assert_no_tag :tag => 'input', :attributes => { :name => 'article[name]', :type => 'text' }  
718 - end  
719 -  
720 should 'display posts per page input with default value on edit blog' do 715 should 'display posts per page input with default value on edit blog' do
721 n = Blog.new.posts_per_page.to_s 716 n = Blog.new.posts_per_page.to_s
722 get :new, :profile => profile.identifier, :type => 'Blog' 717 get :new, :profile => profile.identifier, :type => 'Blog'
@@ -789,11 +784,6 @@ class CmsControllerTest &lt; Test::Unit::TestCase @@ -789,11 +784,6 @@ class CmsControllerTest &lt; Test::Unit::TestCase
789 assert_equal 5, profile.blog.posts_per_page 784 assert_equal 5, profile.blog.posts_per_page
790 end 785 end
791 786
792 - should 'display input title on create blog' do  
793 - get :new, :profile => profile.identifier, :type => 'Blog'  
794 - assert_tag :tag => 'input', :attributes => { :name => 'article[title]', :type => 'text' }  
795 - end  
796 -  
797 should "display 'New article' when create children of folder" do 787 should "display 'New article' when create children of folder" do
798 a = Folder.new(:name => 'article folder'); profile.articles << a; a.save! 788 a = Folder.new(:name => 'article folder'); profile.articles << a; a.save!
799 Article.stubs(:short_description).returns('bli') 789 Article.stubs(:short_description).returns('bli')
@@ -868,7 +858,7 @@ class CmsControllerTest &lt; Test::Unit::TestCase @@ -868,7 +858,7 @@ class CmsControllerTest &lt; Test::Unit::TestCase
868 should 'record when coming from public view on upload files' do 858 should 'record when coming from public view on upload files' do
869 folder = Folder.create!(:name => 'testfolder', :profile => profile) 859 folder = Folder.create!(:name => 'testfolder', :profile => profile)
870 860
871 - @request.expects(:referer).returns("http://colivre.net/#{profile.identifier}/#{folder.slug}") 861 + @request.expects(:referer).returns("http://colivre.net/#{profile.identifier}/#{folder.slug}").at_least_once
872 862
873 get :upload_files, :profile => profile.identifier, :parent_id => folder.id 863 get :upload_files, :profile => profile.identifier, :parent_id => folder.id
874 assert_tag :tag => 'input', :attributes => { :type => 'hidden', :name => 'back_to', :value => 'public_view' } 864 assert_tag :tag => 'input', :attributes => { :type => 'hidden', :name => 'back_to', :value => 'public_view' }
@@ -931,14 +921,14 @@ class CmsControllerTest &lt; Test::Unit::TestCase @@ -931,14 +921,14 @@ class CmsControllerTest &lt; Test::Unit::TestCase
931 end 921 end
932 922
933 should "display 'Fetch posts from an external feed' checked if blog has enabled external feed" do 923 should "display 'Fetch posts from an external feed' checked if blog has enabled external feed" do
934 - profile.articles << Blog.new(:title => 'test blog', :profile => profile) 924 + profile.articles << Blog.new(:name => 'test blog', :profile => profile)
935 profile.blog.create_external_feed(:address => 'address', :enabled => true) 925 profile.blog.create_external_feed(:address => 'address', :enabled => true)
936 get :edit, :profile => profile.identifier, :id => profile.blog.id 926 get :edit, :profile => profile.identifier, :id => profile.blog.id
937 assert_tag :tag => 'input', :attributes => { :name => 'article[external_feed_builder][enabled]', :checked => 'checked' } 927 assert_tag :tag => 'input', :attributes => { :name => 'article[external_feed_builder][enabled]', :checked => 'checked' }
938 end 928 end
939 929
940 should "display 'Fetch posts from an external feed' unchecked if blog has disabled external feed" do 930 should "display 'Fetch posts from an external feed' unchecked if blog has disabled external feed" do
941 - profile.articles << Blog.new(:title => 'test blog', :profile => profile) 931 + profile.articles << Blog.new(:name => 'test blog', :profile => profile)
942 profile.blog.create_external_feed(:address => 'address', :enabled => false) 932 profile.blog.create_external_feed(:address => 'address', :enabled => false)
943 get :edit, :profile => profile.identifier, :id => profile.blog.id 933 get :edit, :profile => profile.identifier, :id => profile.blog.id
944 assert_tag :tag => 'input', :attributes => { :name => 'article[external_feed_builder][enabled]', :checked => nil } 934 assert_tag :tag => 'input', :attributes => { :name => 'article[external_feed_builder][enabled]', :checked => nil }
test/functional/content_viewer_controller_test.rb
@@ -719,14 +719,14 @@ class ContentViewerControllerTest &lt; Test::Unit::TestCase @@ -719,14 +719,14 @@ class ContentViewerControllerTest &lt; Test::Unit::TestCase
719 719
720 should 'add meta tag to rss feed on view blog' do 720 should 'add meta tag to rss feed on view blog' do
721 login_as(profile.identifier) 721 login_as(profile.identifier)
722 - profile.articles << Blog.new(:title => 'article blog', :profile => profile) 722 + profile.articles << Blog.new(:name => 'Blog', :profile => profile)
723 get :view_page, :profile => profile.identifier, :page => ['blog'] 723 get :view_page, :profile => profile.identifier, :page => ['blog']
724 assert_tag :tag => 'link', :attributes => { :rel => 'alternate', :type => 'application/rss+xml', :title => 'feed', :href => "http://#{environment.default_hostname}/testinguser/blog/feed" } 724 assert_tag :tag => 'link', :attributes => { :rel => 'alternate', :type => 'application/rss+xml', :title => 'feed', :href => "http://#{environment.default_hostname}/testinguser/blog/feed" }
725 end 725 end
726 726
727 should 'add meta tag to rss feed on view post blog' do 727 should 'add meta tag to rss feed on view post blog' do
728 login_as(profile.identifier) 728 login_as(profile.identifier)
729 - profile.articles << Blog.new(:name => 'article folder', :profile => profile) 729 + profile.articles << Blog.new(:name => 'Blog', :profile => profile)
730 profile.blog.posts << TextileArticle.new(:name => 'first post', :parent => profile.blog, :profile => profile) 730 profile.blog.posts << TextileArticle.new(:name => 'first post', :parent => profile.blog, :profile => profile)
731 get :view_page, :profile => profile.identifier, :page => ['blog', 'first-post'] 731 get :view_page, :profile => profile.identifier, :page => ['blog', 'first-post']
732 assert_tag :tag => 'link', :attributes => { :rel => 'alternate', :type => 'application/rss+xml', :title => 'feed', :href => "http://#{environment.default_hostname}/testinguser/blog/feed" } 732 assert_tag :tag => 'link', :attributes => { :rel => 'alternate', :type => 'application/rss+xml', :title => 'feed', :href => "http://#{environment.default_hostname}/testinguser/blog/feed" }
test/functional/tasks_controller_test.rb
@@ -208,8 +208,8 @@ class TasksControllerTest &lt; Test::Unit::TestCase @@ -208,8 +208,8 @@ class TasksControllerTest &lt; Test::Unit::TestCase
208 @controller.stubs(:profile).returns(c) 208 @controller.stubs(:profile).returns(c)
209 c.affiliate(profile, Profile::Roles.all_roles(c.environment)) 209 c.affiliate(profile, Profile::Roles.all_roles(c.environment))
210 person = create_user('test_user').person 210 person = create_user('test_user').person
211 - p_blog = Blog.create!(:profile => person)  
212 - c_blog1 = Blog.create!(:profile => c) 211 + p_blog = Blog.create!(:profile => person, :name => 'Blog')
  212 + c_blog1 = Blog.create!(:profile => c, :name => 'Blog')
213 c_blog2 = Blog.new(:profile => c); c_blog2.name = 'blog2'; c_blog2.save! 213 c_blog2 = Blog.new(:profile => c); c_blog2.name = 'blog2'; c_blog2.save!
214 214
215 article = person.articles.create!(:name => 'test article', :parent => p_blog) 215 article = person.articles.create!(:name => 'test article', :parent => p_blog)
test/unit/article_test.rb
@@ -794,4 +794,11 @@ class ArticleTest &lt; Test::Unit::TestCase @@ -794,4 +794,11 @@ class ArticleTest &lt; Test::Unit::TestCase
794 assert a.allow_post_content?(p) 794 assert a.allow_post_content?(p)
795 end 795 end
796 796
  797 + should 'update slug from name' do
  798 + article = Article.create!(:name => 'A test article', :profile => profile)
  799 + assert_equal 'a-test-article', article.slug
  800 + article.name = 'Changed name'
  801 + assert_equal 'changed-name', article.slug
  802 + end
  803 +
797 end 804 end
test/unit/blog_archives_block_test.rb
@@ -4,7 +4,7 @@ class BlogArchivesBlockTest &lt; ActiveSupport::TestCase @@ -4,7 +4,7 @@ class BlogArchivesBlockTest &lt; ActiveSupport::TestCase
4 4
5 def setup 5 def setup
6 @profile = create_user('flatline').person 6 @profile = create_user('flatline').person
7 - @profile.articles << Blog.new(:name => 'blog-test', :profile => @profile) 7 + @profile.articles << Blog.new(:name => 'Blog One', :profile => @profile)
8 end 8 end
9 attr_reader :profile 9 attr_reader :profile
10 10
@@ -34,11 +34,11 @@ class BlogArchivesBlockTest &lt; ActiveSupport::TestCase @@ -34,11 +34,11 @@ class BlogArchivesBlockTest &lt; ActiveSupport::TestCase
34 blog = profile.blog 34 blog = profile.blog
35 for i in 1..10 do 35 for i in 1..10 do
36 post = TextileArticle.create!(:name => "post #{i} test", :profile => profile, :parent => blog) 36 post = TextileArticle.create!(:name => "post #{i} test", :profile => profile, :parent => blog)
37 - post.update_attribute(:published_at, date) 37 + assert post.update_attribute(:published_at, date)
38 end 38 end
39 block = BlogArchivesBlock.new 39 block = BlogArchivesBlock.new
40 block.stubs(:owner).returns(profile) 40 block.stubs(:owner).returns(profile)
41 - assert_tag_in_string block.content, :tag => 'a', :content => 'January (10)', :attributes => {:href => /^http:\/\/.*\/flatline\/blog\?month=01&year=2008$/ } 41 + assert_tag_in_string block.content, :tag => 'a', :content => 'January (10)', :attributes => {:href => /^http:\/\/.*\/flatline\/blog-one\?month=01&year=2008$/ }
42 end 42 end
43 43
44 should 'order list of amount posts' do 44 should 'order list of amount posts' do
@@ -77,11 +77,29 @@ class BlogArchivesBlockTest &lt; ActiveSupport::TestCase @@ -77,11 +77,29 @@ class BlogArchivesBlockTest &lt; ActiveSupport::TestCase
77 end 77 end
78 78
79 should 'not display any content if has no blog' do 79 should 'not display any content if has no blog' do
80 - profile.stubs(:has_blog?).returns(false)  
81 - assert !profile.has_blog? 80 + profile.blogs.destroy_all
82 block = BlogArchivesBlock.new 81 block = BlogArchivesBlock.new
83 block.stubs(:owner).returns(profile) 82 block.stubs(:owner).returns(profile)
84 assert_nil block.content 83 assert_nil block.content
85 end 84 end
86 85
  86 + should 'has field to configure blog' do
  87 + b = BlogArchivesBlock.new
  88 + assert b.respond_to?(:blog_id)
  89 + assert b.respond_to?(:blog_id=)
  90 + end
  91 +
  92 + should 'show posts from first blog' do
  93 + (blog_one, blog_two) = profile.blogs
  94 + profile.articles << Blog.new(:name => 'Blog Two', :profile => profile)
  95 + for month in 1..3
  96 + TextileArticle.create!(:name => "blog one - post #{month}", :profile => profile, :parent => blog_one)
  97 + TextileArticle.create!(:name => "blog two - post #{month}", :profile => profile, :parent => blog_two)
  98 + end
  99 + block = BlogArchivesBlock.new
  100 + block.stubs(:owner).returns(profile)
  101 + assert_match(/blog-one/m, block.content)
  102 + assert_no_match(/blog-two/m, block.content)
  103 + end
  104 +
87 end 105 end
test/unit/blog_test.rb
@@ -139,4 +139,20 @@ class BlogTest &lt; ActiveSupport::TestCase @@ -139,4 +139,20 @@ class BlogTest &lt; ActiveSupport::TestCase
139 end 139 end
140 end 140 end
141 141
  142 + should 'profile has more then one blog' do
  143 + p = create_user('testuser').person
  144 + Blog.create!(:name => 'Blog test', :profile => p)
  145 + assert_nothing_raised ActiveRecord::RecordInvalid do
  146 + Blog.create!(:name => 'Another Blog', :profile => p)
  147 + end
  148 + end
  149 +
  150 + should 'not update slug from name for existing blog' do
  151 + p = create_user('testuser').person
  152 + blog = Blog.create!(:name => 'Blog test', :profile => p)
  153 + assert_equal 'blog-test', blog.slug
  154 + blog.name = 'Changed name'
  155 + assert_not_equal 'changed-name', blog.slug
  156 + end
  157 +
142 end 158 end
test/unit/profile_test.rb
@@ -1393,6 +1393,15 @@ class ProfileTest &lt; Test::Unit::TestCase @@ -1393,6 +1393,15 @@ class ProfileTest &lt; Test::Unit::TestCase
1393 assert_equal [c], profile.categories 1393 assert_equal [c], profile.categories
1394 end 1394 end
1395 1395
  1396 + should 'get first blog when has multiple blogs' do
  1397 + p = create_user('testuser').person
  1398 + p.blogs << Blog.new(:profile => p, :name => 'Blog one')
  1399 + p.blogs << Blog.new(:profile => p, :name => 'Blog two')
  1400 + p.blogs << Blog.new(:profile => p, :name => 'Blog three')
  1401 + assert_equal 'Blog one', p.blog.name
  1402 + assert_equal 3, p.blogs.count
  1403 + end
  1404 +
1396 private 1405 private
1397 1406
1398 def assert_invalid_identifier(id) 1407 def assert_invalid_identifier(id)