From 5d271239b7043ee3f6c74807f035ef426a1cab50 Mon Sep 17 00:00:00 2001 From: did Date: Tue, 29 Nov 2011 14:58:19 +0100 Subject: [PATCH] the screen for editing site has been refactored --- .../locomotive/models/membership.js.coffee | 13 ++++ .../locomotive/models/site.js.coffee | 19 +++++- .../views/current_site/edit_view.js.coffee | 35 ++++++---- .../editable_elements/edit_all_view.js.coffee | 2 - .../views/pages/edit_view.js.coffee | 2 - .../views/shared/form_view.js.coffee | 28 +++++++- .../views/sites/domain_entry_view.js.coffee | 2 +- .../views/sites/domains_view.js.coffee | 19 +++++- .../sites/membership_entry_view.js.coffee | 29 ++++++++ .../views/sites/memberships_view.js.coffee | 41 ++++++++++++ .../locomotive/formtastic_changes.scss | 67 +++++++++++-------- .../cross_domain_sessions_controller.rb | 2 +- app/helpers/locomotive/base_helper.rb | 12 ++++ app/helpers/locomotive/sites_helper.rb | 14 ++-- app/inputs/locomotive/empty_input.rb | 14 ++-- app/models/locomotive/membership.rb | 4 ++ app/models/locomotive/site.rb | 2 +- app/presenters/locomotive/base_presenter.rb | 15 ++++- .../locomotive/membership_presenter.rb | 33 +++++++++ app/presenters/locomotive/site_presenter.rb | 12 +++- .../locomotive/current_site/_form.html.haml | 30 +-------- app/views/locomotive/sites/_domains.html.haml | 4 -- .../locomotive/sites/_memberships.html.haml | 25 +++++++ config/locales/admin_ui.en.yml | 2 +- config/locales/admin_ui.es.yml | 2 +- config/locales/admin_ui.fr.yml | 2 +- config/locales/admin_ui.it.yml | 2 +- config/locales/admin_ui.no.yml | 2 +- config/locales/admin_ui.ru.yml | 2 +- doc/TODO | 11 +-- 30 files changed, 331 insertions(+), 116 deletions(-) create mode 100644 app/assets/javascripts/locomotive/models/membership.js.coffee create mode 100644 app/assets/javascripts/locomotive/views/sites/membership_entry_view.js.coffee create mode 100644 app/assets/javascripts/locomotive/views/sites/memberships_view.js.coffee create mode 100644 app/presenters/locomotive/membership_presenter.rb create mode 100644 app/views/locomotive/sites/_memberships.html.haml diff --git a/app/assets/javascripts/locomotive/models/membership.js.coffee b/app/assets/javascripts/locomotive/models/membership.js.coffee new file mode 100644 index 00000000..ef710c4d --- /dev/null +++ b/app/assets/javascripts/locomotive/models/membership.js.coffee @@ -0,0 +1,13 @@ +class Locomotive.Models.Membership extends Backbone.Model + + toJSONForSave: -> + _.tap {}, (hash) => + for key, value of @.toJSON() + hash[key] = value if _.include(['id', 'role', '_destroy'], key) + +class Locomotive.Models.MembershipsCollection extends Backbone.Collection + + model: Locomotive.Models.Membership + + toJSONForSave: -> + @map (model) => model.toJSONForSave() diff --git a/app/assets/javascripts/locomotive/models/site.js.coffee b/app/assets/javascripts/locomotive/models/site.js.coffee index 3895e310..41bdb14a 100644 --- a/app/assets/javascripts/locomotive/models/site.js.coffee +++ b/app/assets/javascripts/locomotive/models/site.js.coffee @@ -1,6 +1,6 @@ class Locomotive.Models.Site extends Backbone.Model - paramRoot: 'page' + paramRoot: 'site' urlRoot: "#{Locomotive.mount_on}/sites" @@ -9,10 +9,23 @@ class Locomotive.Models.Site extends Backbone.Model domains = _.map @get('domains_without_subdomain'), (name) => new Locomotive.Models.Domain(name: name) - @set domains: domains + memberships = new Locomotive.Models.MembershipsCollection(@get('memberships')) + + @set domains: domains, memberships: memberships + + includes_domain: (name) -> + name == @domain_with_domain() || _.any(@get('domains'), (domain) -> domain.get('name') == name) + + domain_with_domain: -> + "#{@get('subdomain')}.#{@get('domain_name')}" + + toJSON: -> + _.tap super, (hash) => + hash.memberships = @get('memberships').toJSONForSave() if @get('memberships') + hash.domains = _.map(@get('domains'), (domain) -> domain.get('name')) class Locomotive.Models.CurrentSite extends Locomotive.Models.Site - urlRoot: "#{Locomotive.mount_on}/current_site" + url: "#{Locomotive.mount_on}/current_site" diff --git a/app/assets/javascripts/locomotive/views/current_site/edit_view.js.coffee b/app/assets/javascripts/locomotive/views/current_site/edit_view.js.coffee index fa6a6ec8..b9054797 100644 --- a/app/assets/javascripts/locomotive/views/current_site/edit_view.js.coffee +++ b/app/assets/javascripts/locomotive/views/current_site/edit_view.js.coffee @@ -8,7 +8,7 @@ class Locomotive.Views.CurrentSite.EditView extends Locomotive.Views.Shared.Form el: '#content' events: - 'click .memberships a.remove': 'remove_membership' + 'submit': 'save' initialize: -> @model = new Locomotive.Models.CurrentSite(@options.site) @@ -20,17 +20,22 @@ class Locomotive.Views.CurrentSite.EditView extends Locomotive.Views.Shared.Form render: -> super() - @render_domain_entries() + @render_domains() + + @render_memberships() @enable_liquid_editing() - @enable_ui_effects() - - render_domain_entries: -> + render_domains: -> @domains_view = new Locomotive.Views.Site.DomainsView model: @model, errors: @options.errors @$('#site_domains_input label').after(@domains_view.render().el) + render_memberships: -> + @memberships_view = new Locomotive.Views.Site.MembershipsView model: @model + + @$('#site_memberships_input').append(@memberships_view.render().el) + enable_liquid_editing: -> input = @$('#site_robots_txt') @editor = CodeMirror.fromTextArea input.get()[0], @@ -42,12 +47,18 @@ class Locomotive.Views.CurrentSite.EditView extends Locomotive.Views.Shared.Form theme: 'default' onChange: (editor) => @model.set(robots_txt: editor.getValue()) - enable_ui_effects: -> - @$('#site_domains_input .domain input[type=text]').editableField() - @$('.memberships .entry .role select').editableField() + save: (event) -> + if @model.includes_domain(window.location.host) + @save_in_ajax(event) - remove_membership: (event) -> - event.stopPropagation() & event.preventDefault() - entry = $(event.target).parents('.entry').hide() - entry.find('input[type=hidden]').val(1) + show_error: (attribute, message, html) -> + if attribute == 'domains' + @domains_view.show_error(message) + else + super + + remove: -> + @domains_view.remove() + @memberships_view.remove() + super diff --git a/app/assets/javascripts/locomotive/views/editable_elements/edit_all_view.js.coffee b/app/assets/javascripts/locomotive/views/editable_elements/edit_all_view.js.coffee index 077f49f4..a066ba05 100644 --- a/app/assets/javascripts/locomotive/views/editable_elements/edit_all_view.js.coffee +++ b/app/assets/javascripts/locomotive/views/editable_elements/edit_all_view.js.coffee @@ -29,8 +29,6 @@ class Locomotive.Views.EditableElements.EditAllView extends Backbone.View refresh: -> _.each @_editable_elements_views, (view) => - foo = @collection.get(view.model.get('id')) - console.log(foo.cid) view.model = @collection.get(view.model.get('id')) view.refresh() diff --git a/app/assets/javascripts/locomotive/views/pages/edit_view.js.coffee b/app/assets/javascripts/locomotive/views/pages/edit_view.js.coffee index 3e72f207..fceb43ba 100644 --- a/app/assets/javascripts/locomotive/views/pages/edit_view.js.coffee +++ b/app/assets/javascripts/locomotive/views/pages/edit_view.js.coffee @@ -7,8 +7,6 @@ class Locomotive.Views.Pages.EditView extends Locomotive.Views.Pages.FormView @clear_errors() - console.log('saving') - @model.save {}, success: (model, response, xhr) => model._normalize() diff --git a/app/assets/javascripts/locomotive/views/shared/form_view.js.coffee b/app/assets/javascripts/locomotive/views/shared/form_view.js.coffee index db35038c..95ad4799 100644 --- a/app/assets/javascripts/locomotive/views/shared/form_view.js.coffee +++ b/app/assets/javascripts/locomotive/views/shared/form_view.js.coffee @@ -18,6 +18,32 @@ class Locomotive.Views.Shared.FormView extends Backbone.View save: (event) -> # by default, follow the default behaviour + save_in_ajax: (event, options) -> + event.stopPropagation() & event.preventDefault() + + @clear_errors() + + options ||= { on_success: null, on_error: null } + + previous_attributes = _.clone @model.attributes + + @model.save {}, + success: (model, response, xhr) => + $.growl('success', xhr.getResponseHeader('X-Message')) + + model.attributes = previous_attributes + + options.on_success(response) if options.on_success + + error: (model, xhr) => + $.growl('error', xhr.getResponseHeader('X-Message')) + + errors = JSON.parse(xhr.responseText) + + @show_errors errors + + options.on_error() if options.on_error + make_title_editable: -> title = @$('h2 a.editable') @@ -49,7 +75,7 @@ class Locomotive.Views.Shared.FormView extends Backbone.View # overide this method if necessary clear_errors: -> - @$('div.inline-errors').remove() + @$('.inline-errors').remove() show_errors: (errors) -> for attribute, message of errors diff --git a/app/assets/javascripts/locomotive/views/sites/domain_entry_view.js.coffee b/app/assets/javascripts/locomotive/views/sites/domain_entry_view.js.coffee index 69d8ee41..bf670890 100644 --- a/app/assets/javascripts/locomotive/views/sites/domain_entry_view.js.coffee +++ b/app/assets/javascripts/locomotive/views/sites/domain_entry_view.js.coffee @@ -1,4 +1,4 @@ -Locomotive.Views.CurrentSite ||= {} +Locomotive.Views.Site ||= {} class Locomotive.Views.Site.DomainEntryView extends Backbone.View diff --git a/app/assets/javascripts/locomotive/views/sites/domains_view.js.coffee b/app/assets/javascripts/locomotive/views/sites/domains_view.js.coffee index 3a665c0b..c78b2630 100644 --- a/app/assets/javascripts/locomotive/views/sites/domains_view.js.coffee +++ b/app/assets/javascripts/locomotive/views/sites/domains_view.js.coffee @@ -17,6 +17,8 @@ class Locomotive.Views.Site.DomainsView extends Backbone.View @render_entries() + @enable_ui_effects() + return @ add_entry: (event) -> @@ -53,11 +55,22 @@ class Locomotive.Views.Site.DomainsView extends Backbone.View @$('.empty').show() else _.each @model.get('domains'), (domain) => - _.each @options.errors.domain || [], (message) => - domain.error = message if message.test /^#{domain.get('name')} / - @_insert_entry(domain) + @show_errors() + + show_errors: -> + _.each @options.errors.domain || [], (message) => @show_error(message) + + show_error: (message) -> + _.each (@_entry_views || []), (view) -> + if new RegExp("^#{view.model.get('name')}").test message + html = $('').addClass('inline-errors').html(message) + view.$('input[type=text].path').after(html) + + enable_ui_effects: -> + @$('.domain input[type=text]').editableField() + _insert_entry: (domain) -> view = new Locomotive.Views.Site.DomainEntryView model: domain, parent_view: @ diff --git a/app/assets/javascripts/locomotive/views/sites/membership_entry_view.js.coffee b/app/assets/javascripts/locomotive/views/sites/membership_entry_view.js.coffee new file mode 100644 index 00000000..54fbffa8 --- /dev/null +++ b/app/assets/javascripts/locomotive/views/sites/membership_entry_view.js.coffee @@ -0,0 +1,29 @@ +Locomotive.Views.Site ||= {} + +class Locomotive.Views.Site.MembershipEntryView extends Backbone.View + + className: 'entry' + + events: + 'change select' : 'change' + 'click a.remove': 'remove' + + render: -> + data = @model.toJSON() + data.index = @options.index + + $(@el).html(ich.membership_entry(data)) + + @$('select').val(@model.get('role')) + + return @ + + change: (event) -> + value = $(event.target).val() + @options.parent_view.change_entry(@model, value) + + remove: (event) -> + event.stopPropagation() & event.preventDefault() + @$('select').editableField('destroy') + @options.parent_view.remove_entry(@model) + super() \ No newline at end of file diff --git a/app/assets/javascripts/locomotive/views/sites/memberships_view.js.coffee b/app/assets/javascripts/locomotive/views/sites/memberships_view.js.coffee new file mode 100644 index 00000000..18deb60f --- /dev/null +++ b/app/assets/javascripts/locomotive/views/sites/memberships_view.js.coffee @@ -0,0 +1,41 @@ +Locomotive.Views.Site ||= {} + +class Locomotive.Views.Site.MembershipsView extends Backbone.View + + tagName: 'div' + + className: 'list' + + _entry_views = [] + + render: -> + @render_entries() + + @enable_ui_effects() + + return @ + + change_entry: (membership, value) -> + membership.set role: value + + remove_entry: (membership) -> + membership.set _destroy: true + + render_entries: -> + @model.get('memberships').each (membership, index) => + @_insert_entry(membership, index) + + enable_ui_effects: -> + @$('.entry select').editableField() + + _insert_entry: (membership, index) -> + view = new Locomotive.Views.Site.MembershipEntryView model: membership, parent_view: @, index: index + + (@_entry_views ||= []).push(view) + + $(@el).append(view.render().el) + + + + + diff --git a/app/assets/stylesheets/locomotive/formtastic_changes.scss b/app/assets/stylesheets/locomotive/formtastic_changes.scss index 3f9a27e5..03d86a53 100644 --- a/app/assets/stylesheets/locomotive/formtastic_changes.scss +++ b/app/assets/stylesheets/locomotive/formtastic_changes.scss @@ -95,6 +95,16 @@ form.formtastic { } } + span.inline-errors { + margin-left: 10px; + padding: 2px 3px; + + background: #FFE5E5; + + color: #CE2525; + font-size: 13px; + } + span.actions { position: absolute; top: 0px; @@ -323,44 +333,45 @@ form.formtastic { margin-top: 10px; margin-bottom: 0px; } + } + } // li.no-label - &.memberships { - em.email { - margin-left: 10px; - } + &#site_memberships_input { + .entry { + em.email { + margin-left: 10px; + } - .role { - position: absolute; - top: 0px; - right: 30px; - width: 170px; + .role { + position: absolute; + top: 0px; + right: 30px; + width: 170px; - line-height: 30px; + line-height: 30px; - em { - padding-left: 17px; - margin-left: 0px; - background-repeat: no-repeat; + em { + padding-left: 17px; + margin-left: 0px; + background-repeat: no-repeat; - color: #757575; - font-size: 13px; - font-weight: normal; + color: #757575; + font-size: 13px; + font-weight: normal; - &.locked { - background-image: image-url("locomotive/icons/membership_lock.png"); - background-position: 1px 0px; - } + &.locked { + background-image: image-url("locomotive/icons/membership_lock.png"); + background-position: 1px 0px; + } - &.editable { - background-image: image-url("locomotive//icons/membership_edit.png"); - background-position: 0px 3px; - } + &.editable { + background-image: image-url("locomotive//icons/membership_edit.png"); + background-position: 0px 3px; } } - } // li.no-label .list.memberships + } } - - } // li.no-label + } // > li#site_memberships_input } // > li diff --git a/app/controllers/locomotive/cross_domain_sessions_controller.rb b/app/controllers/locomotive/cross_domain_sessions_controller.rb index 07008552..4231dcc4 100644 --- a/app/controllers/locomotive/cross_domain_sessions_controller.rb +++ b/app/controllers/locomotive/cross_domain_sessions_controller.rb @@ -31,7 +31,7 @@ module Locomotive sign_in(account) redirect_to admin_pages_path else - redirect_to new_admin_session_path, :alert => t('fash.locomotive.cross_domain_sessions.create.alert') + redirect_to new_admin_session_path, :alert => t('flash.locomotive.cross_domain_sessions.create.alert') end end diff --git a/app/helpers/locomotive/base_helper.rb b/app/helpers/locomotive/base_helper.rb index 95598cb6..c4a3e0e8 100644 --- a/app/helpers/locomotive/base_helper.rb +++ b/app/helpers/locomotive/base_helper.rb @@ -106,5 +106,17 @@ module Locomotive::BaseHelper end end + # memberships + + def options_for_membership_roles(options = {}) + list = (unless options[:skip_admin] + Locomotive::Ability::ROLES.map { |r| [t("locomotive.memberships.roles.#{r}"), r] } + else + (Locomotive::Ability::ROLES - ['admin']).map { |r| [t("locomotive.memberships.roles.#{r}"), r] } + end) + + options_for_select(list) + end + end diff --git a/app/helpers/locomotive/sites_helper.rb b/app/helpers/locomotive/sites_helper.rb index 56b7723d..b41d06d1 100644 --- a/app/helpers/locomotive/sites_helper.rb +++ b/app/helpers/locomotive/sites_helper.rb @@ -1,11 +1,11 @@ module Locomotive::SitesHelper - def error_on_domain(site, name) - if (error = (site.errors[:domains] || []).detect { |n| n.include?(name) }) - content_tag(:span, error, :class => 'inline-errors') - else - '' - end - end + # def error_on_domain(site, name) + # if (error = (site.errors[:domains] || []).detect { |n| n.include?(name) }) + # content_tag(:span, error, :class => 'inline-errors') + # else + # '' + # end + # end end diff --git a/app/inputs/locomotive/empty_input.rb b/app/inputs/locomotive/empty_input.rb index 7f3c413a..9bb12071 100644 --- a/app/inputs/locomotive/empty_input.rb +++ b/app/inputs/locomotive/empty_input.rb @@ -9,6 +9,12 @@ module Locomotive end end + def wrapper_html_options + super.tap do |opts| + opts[:class] += ' no-label' unless render_label? + end + end + def error_html "" end @@ -17,13 +23,5 @@ module Locomotive false end - # def hint_html - # "" - # end - # - # def hint? - # false - # end - end end \ No newline at end of file diff --git a/app/models/locomotive/membership.rb b/app/models/locomotive/membership.rb index 9053a6c5..8f787688 100644 --- a/app/models/locomotive/membership.rb +++ b/app/models/locomotive/membership.rb @@ -51,6 +51,10 @@ module Locomotive @ability ||= Ability.new(self.account, self.site) end + def as_json(options = {}) + Locomotive::MembershipPresenter.new(self, options).as_json + end + protected def define_role diff --git a/app/models/locomotive/site.rb b/app/models/locomotive/site.rb index 2aa50c6b..7d0cbbc5 100644 --- a/app/models/locomotive/site.rb +++ b/app/models/locomotive/site.rb @@ -50,7 +50,7 @@ module Locomotive end def as_json(options = {}) - Locomotive::SitePresenter.new(self).as_json + Locomotive::SitePresenter.new(self, options).as_json end protected diff --git a/app/presenters/locomotive/base_presenter.rb b/app/presenters/locomotive/base_presenter.rb index 5db5719b..648dad19 100644 --- a/app/presenters/locomotive/base_presenter.rb +++ b/app/presenters/locomotive/base_presenter.rb @@ -5,18 +5,27 @@ class Locomotive::BasePresenter include ActionView::Helpers::TextHelper include ActionView::Helpers::NumberHelper - attr_reader :source + attr_reader :source, :options, :ability delegate :created_at, :updated_at, :to => :source - def initialize(object) - @source = object + def initialize(object, options = {}) + @source = object + @options = options + + if @options && @options[:current_account] && @options[:current_site] + @ability = Locomotive::Ability.new @options[:current_account], @options[:current_site] + end end def id @source._id.to_s end + def ability? + self.ability.present? + end + def included_methods %w(id created_at updated_at) end diff --git a/app/presenters/locomotive/membership_presenter.rb b/app/presenters/locomotive/membership_presenter.rb new file mode 100644 index 00000000..e0d82227 --- /dev/null +++ b/app/presenters/locomotive/membership_presenter.rb @@ -0,0 +1,33 @@ +module Locomotive + class MembershipPresenter < BasePresenter + + delegate :role, :to => :source + + def name + self.source.account.name + end + + def role_name + I18n.t("locomotive.memberships.roles.#{self.source.role}") + end + + def email + self.source.account.email + end + + def can_update + return nil unless self.ability? + self.ability.can? :update, self.source + end + + def grant_admin + return nil unless self.ability? + self.ability.can? :grant_admin, self.source + end + + def included_methods + super + %w(name email role role_name can_update grant_admin) + end + + end +end \ No newline at end of file diff --git a/app/presenters/locomotive/site_presenter.rb b/app/presenters/locomotive/site_presenter.rb index 41168d52..de04a90b 100644 --- a/app/presenters/locomotive/site_presenter.rb +++ b/app/presenters/locomotive/site_presenter.rb @@ -1,10 +1,18 @@ module Locomotive class SitePresenter < BasePresenter - delegate :name, :subdomain, :domains, :robots_txt, :seo_title, :meta_keywords, :meta_description, :domains_without_subdomain, :memberships, :to => :source + delegate :name, :subdomain, :domains, :robots_txt, :seo_title, :meta_keywords, :meta_description, :domains_without_subdomain, :to => :source + + def domain_name + Locomotive.config.domain + end + + def memberships + self.source.memberships.map { |membership| membership.as_json(self.options) } + end def included_methods - super + %w(name subdomain domains robots_txt seo_title meta_keywords meta_description domains_without_subdomain memberships) + super + %w(name domain_name subdomain domains robots_txt seo_title meta_keywords meta_description domains_without_subdomain memberships) end end diff --git a/app/views/locomotive/current_site/_form.html.haml b/app/views/locomotive/current_site/_form.html.haml index aed844d2..37bab329 100644 --- a/app/views/locomotive/current_site/_form.html.haml +++ b/app/views/locomotive/current_site/_form.html.haml @@ -1,9 +1,10 @@ - content_for :head do = render 'locomotive/sites/domains' + = render 'locomotive/sites/memberships' - content_for :backbone_view_data do :plain - { site: #{@site.to_json}, errors: #{@site.errors.to_json} } + { site: #{@site.to_json(:current_account => current_locomotive_account, :current_site => current_site)}, errors: #{@site.errors.to_json} } = f.inputs :name => :information, :style => "#{'display: none' unless @site.new_record?}" do = f.input :name, :required => false @@ -24,32 +25,7 @@ - if can?(:index, Locomotive::Membership) = f.inputs :name => :memberships do - %li{ :class => 'input empty no-label' } - .list.memberships - = f.semantic_fields_for :memberships do |fm| - - - membership, account = fm.object, fm.object.account - - .entry - = fm.hidden_field :_destroy - - %strong= account.name - - %em.email= account.email - - - if can?(:update, membership) - .role - - if can?(:grant_admin, membership) - = fm.select :role, Locomotive::Ability::ROLES.map { |r| [t("locomotive.memberships.roles.#{r}"), r] }, :include_blank => false - - else - = fm.select :role, (Locomotive::Ability::ROLES - ['admin']).map { |r| [t("locomotive.memberships.roles.#{r}"), r] }, :include_blank => false - - %span.actions - = link_to 'x', '#', :class => 'remove' - - - else - .role - %em.locked= t("locomotive.memberships.roles.#{membership.role}") + = f.input :memberships, :as => :'Locomotive::Empty', :label => false, :wrapper_html => { :id => 'site_memberships_input' } - if can?(:manage, current_site) diff --git a/app/views/locomotive/sites/_domains.html.haml b/app/views/locomotive/sites/_domains.html.haml index 9da24035..fc038350 100644 --- a/app/views/locomotive/sites/_domains.html.haml +++ b/app/views/locomotive/sites/_domains.html.haml @@ -18,9 +18,5 @@ %em http:// = text_field_tag 'site[domains][]', '{{name}}', :id => '', :class => 'path' - {{#if error}} - %span.inline-errors {{error}} - {{/if}} - %span.actions = link_to 'x', '#', :class => 'remove' \ No newline at end of file diff --git a/app/views/locomotive/sites/_memberships.html.haml b/app/views/locomotive/sites/_memberships.html.haml new file mode 100644 index 00000000..28f0c7f6 --- /dev/null +++ b/app/views/locomotive/sites/_memberships.html.haml @@ -0,0 +1,25 @@ +%script{ :type => 'text/html', :id => 'membership_entry' } + + = hidden_field_tag 'site[memberships_attributes][{{index}}][id]', '{{id}}' + = hidden_field_tag 'site[memberships_attributes][{{index}}][_destroy]' + + %strong {{name}} + + %em.email {{email}} + + {{#if can_update}} + .role + {{#if grant_admin}} + = select_tag 'site[memberships_attributes][{{index}}][role]', options_for_membership_roles + {{else}} + = select_tag 'site[memberships_attributes][{{index}}][role]', options_for_membership_roles(:skip_admin => true) + {{/if}} + + %span.actions + = link_to 'x', '#', :class => 'remove' + + {{else}} + .role + %em.locked {{role_name}} + + {{/if}} \ No newline at end of file diff --git a/config/locales/admin_ui.en.yml b/config/locales/admin_ui.en.yml index af3ee629..dacf98f7 100644 --- a/config/locales/admin_ui.en.yml +++ b/config/locales/admin_ui.en.yml @@ -157,7 +157,7 @@ en: memberships: roles: - locomotive: Administrator + admin: Administrator designer: Designer author: Author new: diff --git a/config/locales/admin_ui.es.yml b/config/locales/admin_ui.es.yml index 2005fb4d..85183762 100644 --- a/config/locales/admin_ui.es.yml +++ b/config/locales/admin_ui.es.yml @@ -150,7 +150,7 @@ es: memberships: roles: - locomotive: Administrador + admin: Administrador designer: Diseñador author: Autor new: diff --git a/config/locales/admin_ui.fr.yml b/config/locales/admin_ui.fr.yml index e037bb6a..7b6e702a 100644 --- a/config/locales/admin_ui.fr.yml +++ b/config/locales/admin_ui.fr.yml @@ -155,7 +155,7 @@ fr: memberships: roles: - locomotive: Administrateur + admin: Administrateur designer: Designeur author: Auteur new: diff --git a/config/locales/admin_ui.it.yml b/config/locales/admin_ui.it.yml index 5b599566..794d7cda 100644 --- a/config/locales/admin_ui.it.yml +++ b/config/locales/admin_ui.it.yml @@ -150,7 +150,7 @@ it: memberships: roles: - locomotive: Amministratore + admin: Amministratore designer: Designer author: Autore new: diff --git a/config/locales/admin_ui.no.yml b/config/locales/admin_ui.no.yml index 0402a87e..e5c7787c 100644 --- a/config/locales/admin_ui.no.yml +++ b/config/locales/admin_ui.no.yml @@ -152,7 +152,7 @@ memberships: roles: - locomotive: Administrator + admin: Administrator designer: Designer author: Forfatter new: diff --git a/config/locales/admin_ui.ru.yml b/config/locales/admin_ui.ru.yml index 527fbc87..051ca121 100644 --- a/config/locales/admin_ui.ru.yml +++ b/config/locales/admin_ui.ru.yml @@ -152,7 +152,7 @@ ru: memberships: roles: - locomotive: Администратор + admin: Администратор designer: Дизайнер author: Автор new: diff --git a/doc/TODO b/doc/TODO index 432bb2d5..54e04efa 100644 --- a/doc/TODO +++ b/doc/TODO @@ -15,18 +15,19 @@ x menu / submenu in full css3 (no images) x fix css in firefox x update page in ajax - fix other sections - - edit my site + x edit my site x css x robots.txt - - domains - - roles - - save - + x domains + x roles + x save - create a new site - edit my account - theme assets - content types +- install a site by default at the first installation (without asking) +