From 0edad4f8c0fc8f545366cdd94de041de23ca6430 Mon Sep 17 00:00:00 2001 From: chris2tof Date: Thu, 29 Dec 2011 19:45:21 +0800 Subject: [PATCH 01/26] New rss.js from Harry and fix html form for assets --- app/assets/javascripts/rss.js | 4 ++-- app/views/admin/assets/_edit.html.erb | 10 +++++++--- app/views/admin/assets/_new.html.erb | 10 +++++++--- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/app/assets/javascripts/rss.js b/app/assets/javascripts/rss.js index e993df799..5822fa84e 100644 --- a/app/assets/javascripts/rss.js +++ b/app/assets/javascripts/rss.js @@ -430,7 +430,7 @@ modalWindow : function(settings,callbackFn){ tempwidth=maxwidth; rgWLeft=(rgmaskWidth-tempwidth)/2; } - tempwidth+=25; + tempwidth=parseInt(tempwidth)+25; $rss("#rgWindow").empty().show(); var closebtn = ""; if(closeBtn) @@ -509,7 +509,7 @@ modalWindowUpdate : function(settings,callbackFn){ tempwidth=maxwidth; rgWLeft=(rgmaskWidth-tempwidth)/2; } - tempwidth+=25; + tempwidth=parseInt(tempwidth)+25; $rss("#rgContent").empty(); $rss("#rgWindow").animate({"width":tempwidth+"px","height":tempheight+"px",top:rgWTop+"px", left:rgWLeft+"px"},500,function(){$rss("#rgContent").css("height",tempheight+"px").html(dhtml)}); $rss("#rgwindow_temp_div").remove(); diff --git a/app/views/admin/assets/_edit.html.erb b/app/views/admin/assets/_edit.html.erb index cc0a5c52b..33f8131cb 100644 --- a/app/views/admin/assets/_edit.html.erb +++ b/app/views/admin/assets/_edit.html.erb @@ -1,12 +1,16 @@

<%= t('editing_asset') %>

- <%= form_for @asset, :url => admin_asset_path(@asset), :html => {:id => 'ajaxForm', :multipart => true } do |f| %> + <%= form_for @asset, :url => admin_asset_path(@asset), :html => {:id => (is_html ? nil : 'ajaxForm'), :multipart => true } do |f| %> <%= f.error_messages %> <%= render :partial => "form", :locals => { :f => f } %>
- <%= link_back if is_html %> - <%= t(:update) %> + <% if is_html %> + <%= link_back %> + <%= f.submit t(:edit) %> + <% else %> + <%= t(:edit) %> + <% end %>
<% end %>
\ No newline at end of file diff --git a/app/views/admin/assets/_new.html.erb b/app/views/admin/assets/_new.html.erb index 2f997a116..9653af6f4 100644 --- a/app/views/admin/assets/_new.html.erb +++ b/app/views/admin/assets/_new.html.erb @@ -1,12 +1,16 @@

<%= t('admin.new_asset') %>

- <%= form_for :asset, :url => admin_assets_path, :html => {:id => 'ajaxForm', :multipart => true }, :remote => true do |f| %> + <%= form_for :asset, :url => admin_assets_path, :html => {:id => (is_html ? nil : 'ajaxForm'), :multipart => true }, :remote => true do |f| %> <%= f.error_messages %> <%= render :partial => "form", :locals => { :f => f } %>
- <%= link_back if is_html %> - <%= t(:create) %> + <% if is_html %> + <%= link_back %> + <%= f.submit t(:create) %> + <% else %> + <%= t(:create) %> + <% end %>
<% end %>
From 1dd85d6ff1e4d3386ab7adadd403ba1150907126 Mon Sep 17 00:00:00 2001 From: chris2tof Date: Fri, 30 Dec 2011 02:34:13 +0800 Subject: [PATCH 02/26] Forgot to remove ":remote => true" for asset new --- app/views/admin/assets/_new.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/admin/assets/_new.html.erb b/app/views/admin/assets/_new.html.erb index 9653af6f4..4f15fafce 100644 --- a/app/views/admin/assets/_new.html.erb +++ b/app/views/admin/assets/_new.html.erb @@ -1,7 +1,7 @@

<%= t('admin.new_asset') %>

- <%= form_for :asset, :url => admin_assets_path, :html => {:id => (is_html ? nil : 'ajaxForm'), :multipart => true }, :remote => true do |f| %> + <%= form_for :asset, :url => admin_assets_path, :html => {:id => (is_html ? nil : 'ajaxForm'), :multipart => true } do |f| %> <%= f.error_messages %> <%= render :partial => "form", :locals => { :f => f } %>
From 4cdef7655083c5036946f591fd5cce909045c09d Mon Sep 17 00:00:00 2001 From: chris2tof Date: Fri, 13 Jan 2012 12:35:46 +0800 Subject: [PATCH 03/26] Update carrierwave #{column}_identifier must be used to get the name of the file --- Gemfile | 5 +++-- Gemfile.lock | 24 +++++++++++------------- config/initializers/carrierwave.rb | 6 +++--- 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/Gemfile b/Gemfile index 4fe1340a0..995de2555 100644 --- a/Gemfile +++ b/Gemfile @@ -3,14 +3,15 @@ gem 'rails' gem 'yajl-ruby', :require => 'yajl' gem 'bson_ext' -gem 'carrierwave', '0.5.4' +gem 'carrierwave' +gem 'carrierwave-mongoid', :require => 'carrierwave/mongoid' gem 'ckeditor' gem 'devise' gem 'mini_magick' gem 'rubyzip' gem 'sinatra' gem 'execjs' -gem 'mongoid', :git => 'git://github.com/mongoid/mongoid.git', :ref => '7a915395db50e2bc6071a503a11530e644879e49' +gem 'mongoid' gem 'rake' gem 'jquery-rails' diff --git a/Gemfile.lock b/Gemfile.lock index fcf8f0b9e..f733511ee 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,13 +1,3 @@ -GIT - remote: git://github.com/mongoid/mongoid.git - revision: 7a915395db50e2bc6071a503a11530e644879e49 - ref: 7a915395db50e2bc6071a503a11530e644879e49 - specs: - mongoid (2.4.0) - activemodel (~> 3.1) - mongo (~> 1.3) - tzinfo (~> 0.3.22) - GEM remote: http://rubygems.org/ specs: @@ -46,8 +36,11 @@ GEM bson_ext (1.5.2) bson (= 1.5.2) builder (3.0.0) - carrierwave (0.5.4) + carrierwave (0.5.8) activesupport (~> 3.0) + carrierwave-mongoid (0.1.3) + carrierwave (>= 0.5.6) + mongoid (~> 2.1) chronic (0.6.6) ckeditor (3.6.3) mime-types (~> 1.16) @@ -94,6 +87,10 @@ GEM subexec (~> 0.1.0) mongo (1.5.2) bson (= 1.5.2) + mongoid (2.4.0) + activemodel (~> 3.1) + mongo (~> 1.3) + tzinfo (~> 0.3.22) multi_json (1.0.4) orm_adapter (0.0.5) polyglot (0.3.3) @@ -190,7 +187,8 @@ PLATFORMS DEPENDENCIES bson_ext - carrierwave (= 0.5.4) + carrierwave + carrierwave-mongoid ckeditor coffee-rails database_cleaner @@ -200,7 +198,7 @@ DEPENDENCIES factory_girl_rails jquery-rails mini_magick - mongoid! + mongoid radius rails rake diff --git a/config/initializers/carrierwave.rb b/config/initializers/carrierwave.rb index 1c7f73c16..2c46dd114 100644 --- a/config/initializers/carrierwave.rb +++ b/config/initializers/carrierwave.rb @@ -1,5 +1,3 @@ -require 'carrierwave/orm/mongoid' - begin db_config = YAML::load(File.read(File.join(Rails.root, "/config/mongoid.yml"))) rescue @@ -12,4 +10,6 @@ CarrierWave.configure do |config| config.grid_fs_port = db_config[Rails.env]['port'] config.storage = :grid_fs config.grid_fs_access_url = "/gridfs" -end \ No newline at end of file +end + +CarrierWave::SanitizedFile.sanitize_regexp = /[^[:word:]\.\-\+]/ From 42c89220e3b73d43efcfbe5466aa826e25caa1b0 Mon Sep 17 00:00:00 2001 From: Matthew Fu Date: Fri, 13 Jan 2012 18:20:04 +0800 Subject: [PATCH 04/26] Manger and SubManager --- app/controllers/admin/app_auths_controller.rb | 6 +++ .../admin/module_apps_controller.rb | 53 +++++++++++++++++++ app/controllers/application_controller.rb | 2 +- app/models/app_manager.rb | 12 +++++ app/models/module_app.rb | 37 +++++++++++++ app/models/user/user.rb | 3 ++ app/views/admin/module_apps/edit.html.erb | 41 ++++++++++++++ config/routes.rb | 5 ++ 8 files changed, 158 insertions(+), 1 deletion(-) create mode 100644 app/models/app_manager.rb create mode 100644 app/views/admin/module_apps/edit.html.erb diff --git a/app/controllers/admin/app_auths_controller.rb b/app/controllers/admin/app_auths_controller.rb index e925b8578..6cbbf62e2 100644 --- a/app/controllers/admin/app_auths_controller.rb +++ b/app/controllers/admin/app_auths_controller.rb @@ -15,4 +15,10 @@ class Admin::AppAuthsController < ApplicationController @module_apps = ModuleApp.all end + def edit + @module_app = ModuleApp.find(params[:id]) + end + + + end \ No newline at end of file diff --git a/app/controllers/admin/module_apps_controller.rb b/app/controllers/admin/module_apps_controller.rb index 142830f19..34fcf1fdb 100644 --- a/app/controllers/admin/module_apps_controller.rb +++ b/app/controllers/admin/module_apps_controller.rb @@ -18,6 +18,7 @@ class Admin::ModuleAppsController < ApplicationController end + def update @module_app = ModuleApp.find(params[:id]) unless params['module_app']['enable_frontend'].nil? @@ -30,4 +31,56 @@ class Admin::ModuleAppsController < ApplicationController format.js { render 'admin/attributes/toggle_enable' } end end + + def assign_sub_manager + @module_app = ModuleApp.find(params[:id]) + @assign_to_user = User.find params[:sub_manager_id] rescue nil + unless @assign_to_user.nil? + if @module_app.assign_sub_manager(@assign_to_user,current_user) + flash[:notice] = t('admin.app_auth.assign_success_sub_manager') + else + flash[:notice] = t('admin.app_auth.assign_fail_sub_manager') + end + else + flash[:notice] = t('admin.app_auth.assign_fail_sub_manager_no_user') + end + redirect_to :action => "edit" + end + + def assign_manager + @module_app = ModuleApp.find(params[:id]) + @assign_to_user = User.find params[:manager_id] rescue nil + unless @assign_to_user.nil? + if @module_app.assign_manager(@assign_to_user,current_user) + flash[:notice] = t('admin.app_auth.assign_success_manager') + else + flash[:notice] = t('admin.app_auth.assign_fail_manager') + end + else + flash[:notice] = t('admin.app_auth.assign_fail_manager_no_user') + end + redirect_to :action => "edit" + end + + def remove_manager + @module_app = ModuleApp.find(params[:id]) + @app_manager = AppManager.find(params[:app_manager_id]) rescue nil + if @module_app.remove_manager(@app_manager.user) + flash[:notice] = t('admin.app_auth.delete_success_manager') + else + flash[:notice] = t('admin.app_auth.delete_fail_manager') + end + redirect_to :action => "edit" + end + + def remove_sub_manager + @module_app = ModuleApp.find(params[:id]) + @app_sub_manager = AppManager.find(params[:app_sub_manager_id]) rescue nil + if @module_app.remove_sub_manager(@app_sub_manager.user) + flash[:notice] = t('admin.app_auth.delete_success_sub_manager') + else + flash[:notice] = t('admin.app_auth.delete_fail_sub_manager') + end + redirect_to :action => "edit" + end end \ No newline at end of file diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 0227c2524..4bd847c7e 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -9,7 +9,7 @@ class ApplicationController < ActionController::Base def front_end_available(module_app_title='') app_controller = ModuleApp.first(conditions: {:title => module_app_title} ) unless app_controller.enable_frontend? - render :nothing + render :nothing => true end end diff --git a/app/models/app_manager.rb b/app/models/app_manager.rb new file mode 100644 index 000000000..46cbbb913 --- /dev/null +++ b/app/models/app_manager.rb @@ -0,0 +1,12 @@ +class AppManager + include Mongoid::Document + include Mongoid::Timestamps + + belongs_to :user + + belongs_to :managing_app, :polymorphic => true #,:class_name => 'ModuleApp',:inverse_of => :managers,:foreign_key => "user_id" + belongs_to :sub_managing_app, :polymorphic => true #,:class_name => 'ModuleApp',:inverse_of => :sub_manager,:foreign_key => "sub_user_id" + + belongs_to :rule_creator,:class_name => 'User' + +end \ No newline at end of file diff --git a/app/models/module_app.rb b/app/models/module_app.rb index 18e8a6d7b..d02a1cd4d 100644 --- a/app/models/module_app.rb +++ b/app/models/module_app.rb @@ -14,8 +14,45 @@ class ModuleApp field :app_pages ,type: Array field :widgets ,type: Array + has_many :managers,as: :managing_app ,:class_name => "AppManager" #,:dependent => :destroy,:foreign_key => "managing_app_id",:inverse_of => :managing_app + has_many :sub_managers,as: :sub_managing_app ,:class_name => "AppManager"#, :dependent => :destroy,:foreign_key => "sub_managing_app_id",:inverse_of => :sub_managing_app + has_one :app_auth,dependent: :delete + + def assign_manager(user,assigner) + manager = AppManager.first(conditions: {managing_app_id: self.id,user_id: user.id}) rescue nil + if manager.nil? + manager = self.managers.create(:user => user,:rule_creator => assigner) + end + manager + end + + def assign_sub_manager(user,assigner) + submanager = AppManager.first(conditions: {sub_managing_app_id: self.id,user_id: user.id}) rescue nil + if submanager.nil? + submanager = self.sub_managers.create(:user => user,:rule_creator => assigner) + end + submanager + end + + def remove_manager(user) + manager = AppManager.first(conditions: {managing_app_id: self.id,user_id: user.id}) rescue nil + if manager + manager.destroy + else + false + end + end + + def remove_sub_manager(user) + submanager = AppManager.first(conditions: {sub_managing_app_id: self.id,user_id: user.id}) rescue nil + if submanager + submanager.destroy + else + false + end + end end diff --git a/app/models/user/user.rb b/app/models/user/user.rb index 60199ce7f..13d282bb4 100644 --- a/app/models/user/user.rb +++ b/app/models/user/user.rb @@ -14,6 +14,9 @@ class User has_many :app_auths,as: :privilege_apps,:inverse_of => :privilege_lists has_many :blocked_apps, :inverse_of => :blocked_users, :class_name => "AppAuth" has_many :privilege_apps, :inverse_of => :privilege_users, :class_name => "AppAuth" + + has_many :managing_apps,:class_name => "AppManager" + belongs_to :role has_and_belongs_to_many :sub_roles accepts_nested_attributes_for :attribute_values, :allow_destroy => true diff --git a/app/views/admin/module_apps/edit.html.erb b/app/views/admin/module_apps/edit.html.erb new file mode 100644 index 000000000..ff9672730 --- /dev/null +++ b/app/views/admin/module_apps/edit.html.erb @@ -0,0 +1,41 @@ +<% content_for :secondary do %> +<% end %> + + +
+
+
+ + +
+

<%= @module_app.title %>

+
+
Manager + <% @module_app.managers.each do |manager| %> +
<%= manager.user.name %> -AuthBy:<%= manager.rule_creator.name %> <%= link_to '[X]',remove_manager_admin_module_app_path(@module_app,manager),:method => :delete unless manager.user == current_user%>
+ <% end %> +
Add: + <%= form_tag(assign_manager_admin_module_app_path) do %> + <%= text_field_tag 'manager_id' %> + <%= submit_tag 'Add Manager' %> + <% end %> +
+
+ + +
+
Sub Manager + <% @module_app.sub_managers.each do |manager| %> +
<%= manager.user.name %> -AuthBy:<%= manager.rule_creator.name %> <%= link_to '[X]',remove_sub_manager_admin_module_app_path(@module_app,manager),:method => :delete unless manager.user == current_user%>
+ <% end %> +
Add: + <%= form_tag(assign_sub_manager_admin_module_app_path) do %> + <%= text_field_tag 'sub_manager_id' %> + <%= submit_tag 'Add Sub Manager' %> + <% end %> +
+
+ + +
+ diff --git a/config/routes.rb b/config/routes.rb index f2b4cc177..e0e9eec2d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -40,6 +40,11 @@ PrototypeR4::Application.routes.draw do end resources :module_apps do member do + match 'assign_manager' ,:action=> 'assign_manager',:via => "post",:as =>:assign_manager + match 'assign_sub_manager' ,:action=> 'assign_sub_manager',:via => "post",:as =>:assign_sub_manager + + match 'remove_manager/:app_manager_id' ,:action=> 'remove_manager',:via => "delete",:as =>:remove_manager + match 'remove_sub_manager/:app_sub_manager_id' ,:action=> 'remove_sub_manager',:via => "delete",:as =>:remove_sub_manager get 'reload_frontend_pages' end end From f86777b617cf53c411aa961963e6e00752192bd8 Mon Sep 17 00:00:00 2001 From: Christophe Vilayphiou Date: Mon, 16 Jan 2012 08:14:05 +0800 Subject: [PATCH 05/26] Embed attribute_fields and sub_roles --- app/models/user/attribute.rb | 2 +- app/models/user/attribute_field.rb | 2 +- app/models/user/role.rb | 2 +- app/models/user/sub_role.rb | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/models/user/attribute.rb b/app/models/user/attribute.rb index af8a11064..846504218 100644 --- a/app/models/user/attribute.rb +++ b/app/models/user/attribute.rb @@ -7,7 +7,7 @@ class Attribute field :built_in, :type => Boolean, :default => false field :disabled, :type => Boolean, :default => false - has_many :attribute_fields, :autosave => true, :dependent => :destroy + embeds_many :attribute_fields, :cascade_callbacks => true has_one :i18n_variable, :as => :language_value, :autosave => true, :dependent => :destroy accepts_nested_attributes_for :attribute_fields, :allow_destroy => true diff --git a/app/models/user/attribute_field.rb b/app/models/user/attribute_field.rb index 42bbf9109..2d909b3e4 100644 --- a/app/models/user/attribute_field.rb +++ b/app/models/user/attribute_field.rb @@ -10,7 +10,7 @@ class AttributeField field :built_in, :type => Boolean, :default => false field :disabled, :type => Boolean, :default => false - belongs_to :attribute + embedded_in :attribute has_one :i18n_variable, :as => :language_value, :autosave => true, :dependent => :destroy has_many :attribute_values diff --git a/app/models/user/role.rb b/app/models/user/role.rb index 86f7266fc..788d281d2 100644 --- a/app/models/user/role.rb +++ b/app/models/user/role.rb @@ -7,7 +7,7 @@ class Role field :built_in, :type => Boolean, :default => false field :disabled, :type => Boolean, :default => false - has_many :sub_roles, :autosave => true, :dependent => :destroy + embeds_many :sub_roles, :cascade_callbacks => true has_one :i18n_variable, :as => :language_value, :autosave => true, :dependent => :destroy has_many :users accepts_nested_attributes_for :i18n_variable, :allow_destroy => true diff --git a/app/models/user/sub_role.rb b/app/models/user/sub_role.rb index cdefb5f50..47f3e2dee 100644 --- a/app/models/user/sub_role.rb +++ b/app/models/user/sub_role.rb @@ -1,6 +1,6 @@ class SubRole < Attribute - belongs_to :role + embedded_in :role has_and_belongs_to_many :users # Get an sub_role from key From 1dea9ba156f7da4d5190b173b2e192ccda914148 Mon Sep 17 00:00:00 2001 From: Matthew Fu Date: Mon, 16 Jan 2012 18:52:08 +0800 Subject: [PATCH 06/26] Add methods to work with manager role,add task to build user test data --- .../admin/module_apps_controller.rb | 73 +++++++++++++------ lib/tasks/user.rake | 29 ++++++++ 2 files changed, 78 insertions(+), 24 deletions(-) create mode 100644 lib/tasks/user.rake diff --git a/app/controllers/admin/module_apps_controller.rb b/app/controllers/admin/module_apps_controller.rb index 34fcf1fdb..129453b14 100644 --- a/app/controllers/admin/module_apps_controller.rb +++ b/app/controllers/admin/module_apps_controller.rb @@ -1,4 +1,7 @@ class Admin::ModuleAppsController < ApplicationController + before_filter :user_has_manager_privilege?, :only => [ :assign_manager, :remove_manager ] + before_filter :user_has_sub_manager_privilege?, :only => [ :assign_sub_manager, :remove_sub_manager ] + layout "admin" def index @@ -32,55 +35,77 @@ class Admin::ModuleAppsController < ApplicationController end end + def assign_sub_manager - @module_app = ModuleApp.find(params[:id]) - @assign_to_user = User.find params[:sub_manager_id] rescue nil - unless @assign_to_user.nil? - if @module_app.assign_sub_manager(@assign_to_user,current_user) - flash[:notice] = t('admin.app_auth.assign_success_sub_manager') + unless @assign_to_user.nil? + if @module_app.assign_sub_manager(@assign_to_user,current_user) + flash[:notice] = t('admin.app_auth.assigning_manager.add_sub_manager_ok') + else + flash[:notice] = t('admin.app_auth.assigning_manager.add_sub_manager_fail') + end else - flash[:notice] = t('admin.app_auth.assign_fail_sub_manager') - end - else - flash[:notice] = t('admin.app_auth.assign_fail_sub_manager_no_user') - end - redirect_to :action => "edit" + flash[:notice] = t('admin.app_auth.assigning_manager.failed_no_user') + end + redirect_to :action => "edit" end + def assign_manager - @module_app = ModuleApp.find(params[:id]) - @assign_to_user = User.find params[:manager_id] rescue nil unless @assign_to_user.nil? if @module_app.assign_manager(@assign_to_user,current_user) - flash[:notice] = t('admin.app_auth.assign_success_manager') + flash[:notice] = t('admin.app_auth.assigning_sub_manager.add_manager_ok') else - flash[:notice] = t('admin.app_auth.assign_fail_manager') + flash[:notice] = t('admin.app_auth.assigning_sub_manager.add_manager_fail') end else - flash[:notice] = t('admin.app_auth.assign_fail_manager_no_user') + flash[:notice] = t('admin.app_auth.assigning_sub_manager.failed_no_user') end redirect_to :action => "edit" end + def remove_manager - @module_app = ModuleApp.find(params[:id]) - @app_manager = AppManager.find(params[:app_manager_id]) rescue nil if @module_app.remove_manager(@app_manager.user) - flash[:notice] = t('admin.app_auth.delete_success_manager') + flash[:notice] = t('admin.app_auth.delete_manager.success') else - flash[:notice] = t('admin.app_auth.delete_fail_manager') + flash[:notice] = t('admin.app_auth.delete_manager.fail') end redirect_to :action => "edit" end + def remove_sub_manager - @module_app = ModuleApp.find(params[:id]) - @app_sub_manager = AppManager.find(params[:app_sub_manager_id]) rescue nil if @module_app.remove_sub_manager(@app_sub_manager.user) - flash[:notice] = t('admin.app_auth.delete_success_sub_manager') + flash[:notice] = t('admin.app_auth.delete_sub_manager.success') else - flash[:notice] = t('admin.app_auth.delete_fail_sub_manager') + flash[:notice] = t('admin.app_auth.delete_sub_manager.fail') end redirect_to :action => "edit" end + + + private + def user_has_manager_privilege? + @module_app = ModuleApp.find(params[:id]) + @assign_to_user = User.find params[:manager_id] rescue nil + if current_user.admin? #only admin can assign app's manager + return + end + #user is not permited to do that + flash[:notice] = t('admin.app_auth.operation_not_permitted') + redirect_to :action => "edit" # [TODO] maybe need to redirect to some other page + end + + + def user_has_sub_manager_privilege? + @module_app = ModuleApp.find(params[:id]) + @assign_to_user = User.find params[:sub_manager_id] rescue nil + if current_user.admin? || @module_app.managers.include?(current_user) #admin or app's manager can assign app's subanager + return + end + #user is not permited to do that + flash[:notice] = t('admin.app_auth.operation_not_permitted') + redirect_to :action => "edit" # [TODO] maybe need to redirect to some other page + end + end \ No newline at end of file diff --git a/lib/tasks/user.rake b/lib/tasks/user.rake new file mode 100644 index 000000000..31ed7c246 --- /dev/null +++ b/lib/tasks/user.rake @@ -0,0 +1,29 @@ +# encoding: utf-8 +namespace :user do + + task :build => :environment do + User.all(conditions: {email: /nor/}).destroy_all + + username_list = %w{nor1 nor2 nor3 nor4 nor5 nor6 nor7} + userfirstname_list_en = %w{ One Two Thre For Fiv Six Sen } + userlastname_list_en = %w{ Aa Bb Cc Dd Ee Ff Gg } + + userfirstname_list_ct = %w{ 一一 二二 三三 四四 五五 六六 七七 } + userlastname_list_ct = %w{ 陳 林 吳 李 鄭 方 王 } + + first_name_field = AttributeField.first(conditions: {key: "first_name"}) + last_name_field = AttributeField.first(conditions: {key: "last_name"}) + major_field = AttributeField.first(conditions: {key: "major"}) + department_field = AttributeField.first(conditions: {key: "department"}) + + stud_role = Role.first(conditions: {key: 'student'}) + + username_list.each_with_index do |username,index| + user = User.create( :email => "#{username}@rulingcom.com", :password => 'password', :password_confirmation => 'password', :admin => false ,:role_id => stud_role.id,:sub_role_ids => [stud_role.sub_roles[Random.rand(stud_role.sub_roles.count-1)].id]) + AttributeValue.create( :user_id => user.id, :attribute_field_id => first_name_field.id, :key => 'first_name', :en => userfirstname_list_en[index], :zh_tw => userfirstname_list_ct[index] ) + AttributeValue.create( :user_id => user.id, :attribute_field_id => last_name_field.id, :key => 'last_name', :en => userlastname_list_en[index], :zh_tw => userlastname_list_ct[index] ) + AttributeValue.create( :user_id => user.id, :attribute_field_id => major_field.id, :key => 'major', :en => 'Information management', :zh_tw => '信息化管理' ) + AttributeValue.create( :user_id => user.id, :attribute_field_id => department_field.id, :key => 'department', :en => 'Computer Science', :zh_tw => '計算機科學' ) + end + end +end From 9fa6131ad301d586065094d422982b6266f9d24d Mon Sep 17 00:00:00 2001 From: Matthew Fu Date: Tue, 17 Jan 2012 16:20:03 +0800 Subject: [PATCH 07/26] First complete with manager and submanager --- app/controllers/admin/app_auths_controller.rb | 10 +++++++--- .../admin/module_apps_controller.rb | 14 +++++++++----- app/helpers/admin/module_app_helper.rb | 19 +++++++++++++++++++ app/models/module_app.rb | 12 +++++++++--- app/views/admin/module_apps/edit.html.erb | 8 ++++---- config/locales/en.yml | 2 ++ config/locales/zh_tw.yml | 2 ++ 7 files changed, 52 insertions(+), 15 deletions(-) create mode 100644 app/helpers/admin/module_app_helper.rb diff --git a/app/controllers/admin/app_auths_controller.rb b/app/controllers/admin/app_auths_controller.rb index 6cbbf62e2..1bbb5a2e8 100644 --- a/app/controllers/admin/app_auths_controller.rb +++ b/app/controllers/admin/app_auths_controller.rb @@ -1,7 +1,7 @@ class Admin::AppAuthsController < ApplicationController layout "admin" before_filter :authenticate_user! - before_filter :is_admin? +# before_filter :is_admin? ,:only => :index def index # @roles = Role.all.entries @@ -12,13 +12,17 @@ class Admin::AppAuthsController < ApplicationController # obj_auth = obj.send "auth" # [:app_obj => app,:auth_field => obj_auth] # end - @module_apps = ModuleApp.all + if current_user.admin? + @module_apps = ModuleApp.all + else + @module_apps = current_user.managing_apps.collect{|t| t.managing_app} + end end def edit @module_app = ModuleApp.find(params[:id]) end - + end \ No newline at end of file diff --git a/app/controllers/admin/module_apps_controller.rb b/app/controllers/admin/module_apps_controller.rb index 129453b14..914c5138c 100644 --- a/app/controllers/admin/module_apps_controller.rb +++ b/app/controllers/admin/module_apps_controller.rb @@ -37,7 +37,7 @@ class Admin::ModuleAppsController < ApplicationController def assign_sub_manager - unless @assign_to_user.nil? + unless @assign_to_user.nil? || @assign_to_user.admin? if @module_app.assign_sub_manager(@assign_to_user,current_user) flash[:notice] = t('admin.app_auth.assigning_manager.add_sub_manager_ok') else @@ -46,12 +46,13 @@ class Admin::ModuleAppsController < ApplicationController else flash[:notice] = t('admin.app_auth.assigning_manager.failed_no_user') end - redirect_to :action => "edit" + flash[:notice] = t('admin.app_auth.can_not_add_this_user') + redirect_to :action => "edit" end def assign_manager - unless @assign_to_user.nil? + unless @assign_to_user.nil? || @assign_to_user.admin? if @module_app.assign_manager(@assign_to_user,current_user) flash[:notice] = t('admin.app_auth.assigning_sub_manager.add_manager_ok') else @@ -60,11 +61,13 @@ class Admin::ModuleAppsController < ApplicationController else flash[:notice] = t('admin.app_auth.assigning_sub_manager.failed_no_user') end - redirect_to :action => "edit" + flash[:notice] = t('admin.app_auth.can_not_add_this_user') + redirect_to :action => "edit" end def remove_manager + @app_manager = AppManager.find(params[:app_manager_id]) if @module_app.remove_manager(@app_manager.user) flash[:notice] = t('admin.app_auth.delete_manager.success') else @@ -75,6 +78,7 @@ class Admin::ModuleAppsController < ApplicationController def remove_sub_manager + @app_sub_manager = AppManager.find(params[:app_sub_manager_id]) if @module_app.remove_sub_manager(@app_sub_manager.user) flash[:notice] = t('admin.app_auth.delete_sub_manager.success') else @@ -100,7 +104,7 @@ class Admin::ModuleAppsController < ApplicationController def user_has_sub_manager_privilege? @module_app = ModuleApp.find(params[:id]) @assign_to_user = User.find params[:sub_manager_id] rescue nil - if current_user.admin? || @module_app.managers.include?(current_user) #admin or app's manager can assign app's subanager + if current_user.admin? || @module_app.managing_users.include?(current_user) #admin or app's manager can assign app's subanager return end #user is not permited to do that diff --git a/app/helpers/admin/module_app_helper.rb b/app/helpers/admin/module_app_helper.rb new file mode 100644 index 000000000..0a636e9cd --- /dev/null +++ b/app/helpers/admin/module_app_helper.rb @@ -0,0 +1,19 @@ +module Admin::ModuleAppHelper + + def if_permit_to_delete(item) + case item.downcase + when :manager + current_user.admin? + when :sub_manager + @module_app.managing_users.include?(current_user) || current_user.admin? + end + end + + def if_permit_to_assign(item) + if_permit_to_delete(item) + end + + def get_auth_by(manager_obj) + "-AuthBy: " +( manager_obj.rule_creator==current_user ? t('me') : manager_obj.rule_creator.name) + end +end diff --git a/app/models/module_app.rb b/app/models/module_app.rb index d02a1cd4d..70d0d7da9 100644 --- a/app/models/module_app.rb +++ b/app/models/module_app.rb @@ -19,11 +19,17 @@ class ModuleApp has_one :app_auth,dependent: :delete - + def managing_users + self.managers.collect{ |t| t.user } + end + + def sub_managing_users + self.sub_managers.collect{ |t| t.user } + end def assign_manager(user,assigner) manager = AppManager.first(conditions: {managing_app_id: self.id,user_id: user.id}) rescue nil - if manager.nil? + if manager.nil? manager = self.managers.create(:user => user,:rule_creator => assigner) end manager @@ -31,7 +37,7 @@ class ModuleApp def assign_sub_manager(user,assigner) submanager = AppManager.first(conditions: {sub_managing_app_id: self.id,user_id: user.id}) rescue nil - if submanager.nil? + if submanager.nil? && !self.managing_users.include?(user) submanager = self.sub_managers.create(:user => user,:rule_creator => assigner) end submanager diff --git a/app/views/admin/module_apps/edit.html.erb b/app/views/admin/module_apps/edit.html.erb index ff9672730..96859a21d 100644 --- a/app/views/admin/module_apps/edit.html.erb +++ b/app/views/admin/module_apps/edit.html.erb @@ -12,11 +12,11 @@
Manager <% @module_app.managers.each do |manager| %> -
<%= manager.user.name %> -AuthBy:<%= manager.rule_creator.name %> <%= link_to '[X]',remove_manager_admin_module_app_path(@module_app,manager),:method => :delete unless manager.user == current_user%>
+
<%= manager.user.name %> <%= get_auth_by(manager) %> <%= link_to '[X]',remove_manager_admin_module_app_path(@module_app,manager),:method => :delete if if_permit_to_delete(:manager) && manager.user != current_user %>
<% end %>
Add: <%= form_tag(assign_manager_admin_module_app_path) do %> - <%= text_field_tag 'manager_id' %> + <%= text_field_tag 'manager_id','Enter User ID here',:disabled => !if_permit_to_assign(:manager)%> <%= submit_tag 'Add Manager' %> <% end %>
@@ -26,11 +26,11 @@
Sub Manager <% @module_app.sub_managers.each do |manager| %> -
<%= manager.user.name %> -AuthBy:<%= manager.rule_creator.name %> <%= link_to '[X]',remove_sub_manager_admin_module_app_path(@module_app,manager),:method => :delete unless manager.user == current_user%>
+
<%= manager.user.name %> -AuthBy:<%= manager.rule_creator.name %> <%= link_to '[X]',remove_sub_manager_admin_module_app_path(@module_app,manager),:method => :delete if if_permit_to_delete(:sub_manager) && manager.user != current_user %>
<% end %>
Add: <%= form_tag(assign_sub_manager_admin_module_app_path) do %> - <%= text_field_tag 'sub_manager_id' %> + <%= text_field_tag 'sub_manager_id','Enter User ID here',:disabled => !if_permit_to_assign(:sub_manager)%> <%= submit_tag 'Add Sub Manager' %> <% end %>
diff --git a/config/locales/en.yml b/config/locales/en.yml index f9d770620..c44d2359a 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -5,6 +5,8 @@ en: _locale: English + me: Me + add: Add back: Back create: Create diff --git a/config/locales/zh_tw.yml b/config/locales/zh_tw.yml index 5034ce8a6..c1d0552cc 100644 --- a/config/locales/zh_tw.yml +++ b/config/locales/zh_tw.yml @@ -2,6 +2,8 @@ zh_tw: _locale: 中文 + me: 我 + add: 新增 back: 回去 create: 創造 From 37b8b8555421cf8a9cca7026718a472e762af899 Mon Sep 17 00:00:00 2001 From: Matthew Fu Date: Wed, 18 Jan 2012 11:51:38 +0800 Subject: [PATCH 08/26] put setup APP var setup into Orbit class --- app/controllers/obit_frontend_component_controller.rb | 6 ++++++ .../panel/new_blog/front_end/posts_controller.rb | 8 -------- .../controllers/panel/new_blog/widget/posts_controller.rb | 8 -------- 3 files changed, 6 insertions(+), 16 deletions(-) diff --git a/app/controllers/obit_frontend_component_controller.rb b/app/controllers/obit_frontend_component_controller.rb index d5bfaac68..06bb06a52 100644 --- a/app/controllers/obit_frontend_component_controller.rb +++ b/app/controllers/obit_frontend_component_controller.rb @@ -1,4 +1,10 @@ class ObitFrontendComponentController< ApplicationController + before_filter :setup_vars before_filter {|c| c.front_end_available(@app_title)} layout 'production' + + def setup_vars + @app_title = request.fullpath.split('/')[2] + end + end \ No newline at end of file diff --git a/vendor/built_in_modules/new_blog/app/controllers/panel/new_blog/front_end/posts_controller.rb b/vendor/built_in_modules/new_blog/app/controllers/panel/new_blog/front_end/posts_controller.rb index 2471e5fd9..1aeb34b2b 100644 --- a/vendor/built_in_modules/new_blog/app/controllers/panel/new_blog/front_end/posts_controller.rb +++ b/vendor/built_in_modules/new_blog/app/controllers/panel/new_blog/front_end/posts_controller.rb @@ -1,14 +1,6 @@ class Panel::NewBlog::FrontEnd::PostsController < ObitFrontendController - - - def initialize - super - @app_title = NewBlog::MOUDLEAPP_TITLE - end - # GET /posts # GET /posts.xml - def index @posts = Post.all end diff --git a/vendor/built_in_modules/new_blog/app/controllers/panel/new_blog/widget/posts_controller.rb b/vendor/built_in_modules/new_blog/app/controllers/panel/new_blog/widget/posts_controller.rb index 796155bc8..dab532eeb 100644 --- a/vendor/built_in_modules/new_blog/app/controllers/panel/new_blog/widget/posts_controller.rb +++ b/vendor/built_in_modules/new_blog/app/controllers/panel/new_blog/widget/posts_controller.rb @@ -1,12 +1,4 @@ class Panel::NewBlog::Widget::PostsController < ObitWidgetController - - layout 'production' - - def initialize - super - @app_title = NewBlog::MOUDLEAPP_TITLE - end - # GET /posts # GET /posts.xml def index From f1a3008e2b125b41756c680ea7f32d4e431d4f71 Mon Sep 17 00:00:00 2001 From: Matthew Fu Date: Wed, 18 Jan 2012 12:04:01 +0800 Subject: [PATCH 09/26] update app package for previous commit --- lib/NewBlog.zip | Bin 53327 -> 53345 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/lib/NewBlog.zip b/lib/NewBlog.zip index 3513cabf8668eed283bebaac3103fd657c43901e..71f0e09101e32b59c1c13c6bc32357663d03d909 100644 GIT binary patch delta 7922 zcmai13tWup_n&#D%XFJbYO0xrj^ExDA-swjm=b|9*U`_c`Z0=Q-y*=X}q3+KU*EiWqu< z(-~^oG~(Z`1y0#|=3EUQPQW`)PCy^skVY^KX-xco-vTE|wvSCT(~A?Jhkpp}i`URxCRnTx6qhDm(|JhL=OuI19g16}LF=jBaOi2c3$3k#BoHHr}eoy`m~8 zUH=$u_2W&hRz7X&X+6$fhO50fC3Bnixi->Qdo9ks%9YM{Y@xZ*Ms@@p_6jicoA1!+ zn^m=5j~5Y|crSkXT0d~>t9wtLaEe_kS^E!8-=xp9lqe&{`lm*#AN|NyuAJ4GnbvLPHSx~txf8#z8w-W zDzsAIu9KFQy2qS5eec zO@8qD$cR_6A73skkjB08TYRT>Nksc!TaLY#70i3hJ{`ZfHTTKc?lfo`m%M!Pm%5RO z>yQ7(z1V7MNZtADxcX=RO&S+hm+*V)&G~2Ee3kLtwS7MyvU&7&!41c~%`wisZh@S} z%G{TzGVK0H?Fk8uYp&H9&3e6=SD?2tgIge780OkE`WtCx-QjgN48F3Grab6RE5Bb- zeYe3g;=A%~OQOElt+Y0~wTAQCoYC!e_cpU*n@W#~w@s~WIe5Q>eX4E3i;z9uRv)e$ zOfzo{EtBOqf51j+ z`R0d)q<2x>9gp~3jQ763Z+sQn{Z^XBpBeo2WL3=Fh=txYXJU4^ck)+Qy&Jjsp3T#5 z3rfn+yl6A0EcWHqrptQW&uaBFZtrzWMukmxIyOD)wR*38p;6FlJjF5NqU(+ctF_n7 zcr4~Od%JE~|HaOoOCPO2QN7tE*>vn<(ObLo+u|P1dpqv@mY!~-vpWP2m%MdLNsa85 zx)3^gdXwJMrA>u@8oxIm`0~oT&`G?gE$Ol`GZtN3F(D~yVsm`;wA#!+R!mCTwm2*` zzj$s{e=O&r?N4r5BlZ}i`3P~oQGYhP93MDclWAo8y0e}^qp3O2$hxMA-X+ROLRP>0 zmljQ*26NT)Ol>g?5I+hSP>RDwHCyh-Top*bIW-5S0wsW+%m*EVk&IIdoWMifh6I;s za`;ezOCAOn*r+~6s)bob3Ut}$>E9$V+%^!yTj8^4pZ%Gy52lSj;_G7l6h-h>9#uQC zm-)1| z*oBte7k_hh3TJ8z=g(htH7?d$^~~pu-yhXEZTg!YtzFV{Z#FlzR(ufq9~?dX*SUJl zS5{@t({=3V)){j?HQ4&J=n2Zgz7& z-RyD0H*;7wn)prl(~#*evP6x};giQOj>QE2;CiUm`rEdcq}gHF1^ih#^>c5fx#=~! z8P8w#et*r$eAxp#>GEft8!|c$yKED;G2Ydz{dM=t(nH+Y(`R&9mM@<3a_auE>&>qn zIS_N{R7dhQm#HIH=N%t&G0LIL@~^)i$~4OAf*LQ(E4vYNc~M^&1*mp;}@G z5>qvukWgKkJQbmrDS(~YDQb9=1a5d)i?$b~$zv{|$x@3tfrwG6 z!Bt9!zu`mX`XX(xnDrp{#GEi{_o zroRBX0u6D@IlwMZhps#mnFaS}26-6+<{qEiwhAo-!NgT@KO-^1-X1dZP4$#lsW4Y2 z6bzHw8Exqf*9#0lI@bU)jX7}KqK2|G+H#-D0lx5!;!fR|3g2OtkPivgEo3%%+Kg3X z6QmjlAWhE%I!g56yiE{EH`!cBI%~1a5TZsJ$RcdFpkW_lq!oCMvNa!+d;bEG&Z8tl zqVG78C(9jWAa|$IE`WqW99#dP083`?&$BI{%9*FD$Q)uEBi%?DJ62XExV2hh6XCh#a-56uc1u_Rd&xcT3ud+mQYlsp~^Fe_3+jqvKmK>aDhlK z*&UBNlxfuxry<@Gxu?rFhh9%L_@{~m^CT>g3V2|Vycky65mj%9c`WKC8@38%)?PEz z)o|00K&poYMAb0iyQxg6F+NYxJ=SH;^k+EgPPvmG>=S0(8QscC8{T2#m3{xuZ+uNB z_fNJzb&naTqp^dF0FVnJvX*&HS&BG6Wdi_ zJp0AX-yNe5g&h6btmo<%&o6JdHN`u9+~$iB`#0RSMbQoyA|2N*G}tLN?Vr;Jg=T(x z2I}*319#N?bS3Q7>q$rByf=GG?)&*oz3c9M#Wnc>?#h}>!|tD^b>dzeih)(tAc;uO zXi)0w##F=rqozQnHjU3v1`XI2h7d914S8X6X4-u+$t%Zv5+5PZUxz<9!~P`^(FkBFd(HqX42p)Ik4~=3saeLYBX~(jHl_{}p+@6Ia?5=tm`oD9HIU8A)^pg=LBo z9%>m;jv&<@MOgMfl3x()^O>WPg9C>ozwEEzQ7VJMGo(-H3;eQ*@>n|O5Je=~fZyDm z)PkPkNydX8`jv`%EYwA{zbnuRE}YW<`>@*-a&OeL0E+|z_D45B!gN2|kl;b&1$|j= zxTdB8>qQXNX!r>#$n+KlYmi91XsP5g?)n?rK~)pcE97yN>BrnvQ<^Aa$KGKoS3ueD z2a!xN-Nbx#m0#@}?WqMlWl$`xrASqq@9G&6mnh4U7Hg`g*HQ$s`0dWB5X;)XJn(Ikr6{RQIdlzbf(*fE5=GnLfK<*X{i2b(R39HNx$bLH5x54a;B$u zKyc{TkWi+=b@?Gm6%f9QM~{cbU54X7l~S4V*QK|XBeD7*{9`ugpwiTnc(0Z5zZpo3 zzW-qD;~_d@ICNyFITMZ&FgDmxVgw#MP?-+Vz7FrT5Gw|z&$&N%U%%&9nowNKBMvoD z)Y8X?!t)F+DwoS?>S;4+ietb%(~dEoNdpPf+>}X+zxqZq697((=3AsN}5r%lyfcuq7RY{G*gh8pFe0g#<*287866l|Ed z&jSr8R~7q4d}5005K}@72~)6Q+)z}uxbGLCGYSs$8xDt}QyNge-yVH$L>UrEKMqm3 z)H}e-_9!&wm_vCk3;n}^>O7&Q+)DCBl27ZZm8MQJCK%v$zylRhpQ}Q6Fi>v`U9Bv- zEmY-=!hMVK4b1ZF=^HS~UPVg9q+6J@0sYFwn#KT^XN0$Fz@>fqWI{dqo`*E}WMDH7 z=<)`+^9i!t#JM+LE}C!fS<$j1JXEg`H->P5vBDM*RO`d4LKf1p zfan6DGPBNP6Hy2zhJuhSq2_Cg=qk=gFwNsxB#X3sW z>x)>(L`ZIrveJZ!LT#uj5~COuDMP3W>|!zUvXV>b!}4N|q7LZ-C@K~yeJiXphn`{< zeKn?zfI@2>a44awd|C+)`Pz^w^hYr^^nbHFK3{XM|X!!hwO(W z@9aY&I$-L0w9$@Kjwf=J0cLp?ka3QM+T^?=Mka(8#Mu84j7q>EkBj&sxenrOsPq_~ z9~PkmB@4<#`cQU|16eXPSoJ*@Egr4d1qVj6A?2t(NJ^-Q0Ou(^38IdS{+G6m1{vpBzZZ$YVaJ!BHvI=g0wWDF;3rRB<6N}YS;;zk+?&2Grz{yQ z94DvQ<8w6NN|`-6ftxSxPn*W^p?5q7yvoIlYF8QzxSFW$D!1I8@tP!B!3!+#*o_9y z-MHXUA!aO_Kzy6Pt_pJ!CvneXO!lBbmWL5MtWY(*XB8sGc9Jg8kfV!7r9I;&Niv7@ z%1MmUNyIjDcvdN4I7*0bGw`e8eS(}r8{}yTE`J_=f-#kqQ&}ZK3{R3wJ*&LvKY~ZK zC0VH*$BiJN8Yh$&OsY16%4%Q64_-9*#fuLnHDY=u%&c*@AYK)N-y4G`nir`Xrh&ycJopVtSja?uk~ju_fMZF0CrAhAE8NAbuRf|3tvS?Jp#Y{;+G zRf-T!gw=AiUZ@xu zXI1-%L5{tfXd7O0l{+)ePCUVYvm$H#u}`kAz2+FTg7O@M!YoFSrM~P3610{1mjW*$%6lG)Eo57AhMK~ zLhQi|9hjM-4V$itQ36FONYNN1JAh@IDaPnFFJvkuw@IX0av35ytJ=6IhGJw%amd@m zC^nUp%aSr7KUE7BToa>JTjX0cp>be-+qe#iu@q=L- z$-R4>nkk9%-s40M*iMq;x3dV?hp0k*h`GT+iQi(fF=XA)SBCub4K8X?kagkB4PSaW fNZRM4c~<@vn1mf=Bjr>%}uMr^c$;m*Dms@L9>3 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 l Date: Thu, 19 Jan 2012 17:47:52 +0800 Subject: [PATCH 10/26] User role and sub_role simple interface complete --- app/controllers/admin/app_auths_controller.rb | 43 ++++++++++++++++++ .../admin/module_apps_controller.rb | 5 +-- app/views/admin/module_apps/edit.html.erb | 44 +++++++++++++++---- config/routes.rb | 8 +++- 4 files changed, 88 insertions(+), 12 deletions(-) diff --git a/app/controllers/admin/app_auths_controller.rb b/app/controllers/admin/app_auths_controller.rb index 1bbb5a2e8..cb3340fd9 100644 --- a/app/controllers/admin/app_auths_controller.rb +++ b/app/controllers/admin/app_auths_controller.rb @@ -19,6 +19,49 @@ class Admin::AppAuthsController < ApplicationController end end + def create + app_auth = AppAuth.find_or_create_by(module_app_id: params[:module_app_id]) + params[:new].each do |item| + field = item[0] + field_value = item[1] + if field_value!='' + case field + when 'role' + app_auth.send("add_#{field}",(Role.find field_value)) rescue nil + when 'sub_role' + app_auth.send("add_#{field}",(SubRole.find field_value)) rescue nil + when 'privilege_user' + app_auth.add_user_to_privilege_list (User.find field_value) rescue nil + when 'blocked_user' + app_auth.add_user_to_black_list (User.find field_value) rescue nil + end + end + end + app = ModuleApp.find params[:module_app_id] rescue nil + redirect_to edit_admin_module_app_path(app) + end + + def remove + app_auth = AppAuth.find( params[:id] ) + type = params[:type] + field_value = params[:target_id] + if field_value!='' + case type + when 'role' + app_auth.remove_role(Role.find field_value) rescue nil + when 'sub_role' + app_auth.remove_sub_role(SubRole.find field_value) rescue nil + when 'privilege_user' + app_auth.remove_user_from_privilege_list (User.find field_value) rescue nil + when 'blocked_user' + app_auth.remove_user_from_black_list (User.find field_value) rescue nil + end + end + + app = ModuleApp.find params[:module_app_id] rescue nil + redirect_to edit_admin_module_app_path(app) + end + def edit @module_app = ModuleApp.find(params[:id]) end diff --git a/app/controllers/admin/module_apps_controller.rb b/app/controllers/admin/module_apps_controller.rb index 914c5138c..56c2523fe 100644 --- a/app/controllers/admin/module_apps_controller.rb +++ b/app/controllers/admin/module_apps_controller.rb @@ -18,7 +18,6 @@ class Admin::ModuleAppsController < ApplicationController def edit @module_app = ModuleApp.find(params[:id]) - end @@ -91,7 +90,7 @@ class Admin::ModuleAppsController < ApplicationController private def user_has_manager_privilege? @module_app = ModuleApp.find(params[:id]) - @assign_to_user = User.find params[:manager_id] rescue nil + @assign_to_user = User.find params[:manager][:id] rescue nil if current_user.admin? #only admin can assign app's manager return end @@ -103,7 +102,7 @@ class Admin::ModuleAppsController < ApplicationController def user_has_sub_manager_privilege? @module_app = ModuleApp.find(params[:id]) - @assign_to_user = User.find params[:sub_manager_id] rescue nil + @assign_to_user = User.find params[:sub_manager][:id] rescue nil if current_user.admin? || @module_app.managing_users.include?(current_user) #admin or app's manager can assign app's subanager return end diff --git a/app/views/admin/module_apps/edit.html.erb b/app/views/admin/module_apps/edit.html.erb index 96859a21d..9429e963d 100644 --- a/app/views/admin/module_apps/edit.html.erb +++ b/app/views/admin/module_apps/edit.html.erb @@ -6,9 +6,11 @@

+

<%= @module_app.title %>

-

<%= @module_app.title %>

+

Manager

+
Manager <% @module_app.managers.each do |manager| %> @@ -16,13 +18,11 @@ <% end %>
Add: <%= form_tag(assign_manager_admin_module_app_path) do %> - <%= text_field_tag 'manager_id','Enter User ID here',:disabled => !if_permit_to_assign(:manager)%> + <%= collection_select(:manager,:id, User.all, :id, :name, :prompt => true,:disabled => !if_permit_to_assign(:manager))%> <%= submit_tag 'Add Manager' %> <% end %>
- -
Sub Manager <% @module_app.sub_managers.each do |manager| %> @@ -30,12 +30,40 @@ <% end %>
Add: <%= form_tag(assign_sub_manager_admin_module_app_path) do %> - <%= text_field_tag 'sub_manager_id','Enter User ID here',:disabled => !if_permit_to_assign(:sub_manager)%> + <%= collection_select(:sub_manager,:id, User.all, :id, :name, :prompt => true,:disabled => !if_permit_to_assign(:sub_manager))%> <%= submit_tag 'Add Sub Manager' %> <% end %>
- -
- +
+

User Role

+ <%= form_tag(admin_module_app_app_auths_path(@module_app),:method => :post) do %> + <%= collection_select(:new,:role, Role.all, :id, :key, :prompt => true) %> + <%= submit_tag 'Add Role' %>
+ <%= collection_select(:new,:sub_role, SubRole.all, :id, :key, :prompt => true) %> + <%= submit_tag 'Add SubRole' %>
+ <%= collection_select(:new,:privilege_user, User.all, :id, :name, :prompt => true) %> + <%= submit_tag 'Add PrivilegeList' %>
+ <%= collection_select(:new,:blocked_user, User.all, :id, :name, :prompt => true) %> + <%= submit_tag 'Add BlockedList' %>
+ <% end %> +
    Roles
+ <% unless @module_app.app_auth.nil? %> + <% @module_app.app_auth.roles.each do |role| %> +
  • <%= role.key %> Build in:<%= role.built_in ? 'Yes' : 'No' %> <%= link_to '[X]',remove_admin_module_app_app_auth_path(@module_app,@module_app.app_auth,'role',role),:method => :delete %>
  • + <% end %> +
      Sub Roles
    + <% @module_app.app_auth.sub_roles.each do |role| %> +
  • <%= role.key %> Build in:<%= role.built_in ? 'Yes' : 'No' %>
  • <%= link_to '[X]',remove_admin_module_app_app_auth_path(@module_app,@module_app.app_auth,'sub_role',role),:method => :delete %> + <% end %> +
      PrivilegeList
    + <% @module_app.app_auth.privilege_users.each do |user| %> +
  • <%= user.name %> <%= link_to '[X]',remove_admin_module_app_app_auth_path(@module_app,@module_app.app_auth,'privilege_user',user),:method => :delete %>
  • + <% end %> +
      BlockedList
    + <% @module_app.app_auth.blocked_users.each do |user| %> +
  • <%= user.name %><%= link_to '[X]',remove_admin_module_app_app_auth_path(@module_app,@module_app.app_auth,'blocked_user',user),:method => :delete %>
  • + <% end %> +<% end %> +
    diff --git a/config/routes.rb b/config/routes.rb index e0e9eec2d..efa645763 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -12,7 +12,7 @@ PrototypeR4::Application.routes.draw do # routes for admin namespace :admin do resources :assets - resources :app_auths + resources :app_auths resources :designs do collection do @@ -39,6 +39,12 @@ PrototypeR4::Application.routes.draw do end end resources :module_apps do + resources :app_auths do + member do + match 'remove/:type/:target_id' ,:action=> 'remove',:via => "delete",:as =>:remove + end + end + member do match 'assign_manager' ,:action=> 'assign_manager',:via => "post",:as =>:assign_manager match 'assign_sub_manager' ,:action=> 'assign_sub_manager',:via => "post",:as =>:assign_sub_manager From 6ee1d71c6417b944f913f7b6c15fd2bfad7aafe4 Mon Sep 17 00:00:00 2001 From: Christophe Vilayphiou Date: Tue, 24 Jan 2012 11:38:53 +0800 Subject: [PATCH 11/26] Ray's modification before redesign --- app/assets/images/PIE.htc | 96 ++ app/assets/images/bar_orbit.png | Bin 4619 -> 6475 bytes app/assets/images/service_btn.png | Bin 5037 -> 3307 bytes app/assets/javascripts/rc.js | 120 +++ app/assets/javascripts/rss.js | 8 +- app/assets/javascripts/site_editor.js | 3 +- app/assets/stylesheets/admin_back_end.css.erb | 145 ++- app/assets/stylesheets/reset.css | 4 + app/assets/stylesheets/site_items.css.erb | 925 +++++++++--------- app/controllers/application_controller.rb | 2 +- app/controllers/pages_controller.rb | 8 +- app/views/admin/assets/_asset.html.erb | 2 +- app/views/admin/assets/_form.html.erb | 2 +- app/views/admin/assets/_new.html.erb | 2 +- .../admin/users/_sub_role_selector.html.erb | 4 +- app/views/layouts/admin.html.erb | 68 +- app/views/layouts/site_editor.html.erb | 70 +- config/environments/development.rb | 2 +- lib/parsers/parser_back_end.rb | 2 +- lib/parsers/parser_common.rb | 47 +- lib/parsers/parser_front_end.rb | 4 +- lib/tasks/pages.rake | 66 ++ 22 files changed, 1001 insertions(+), 579 deletions(-) create mode 100644 app/assets/images/PIE.htc create mode 100644 app/assets/javascripts/rc.js create mode 100644 lib/tasks/pages.rake diff --git a/app/assets/images/PIE.htc b/app/assets/images/PIE.htc new file mode 100644 index 000000000..00b63838a --- /dev/null +++ b/app/assets/images/PIE.htc @@ -0,0 +1,96 @@ + + + + + + + + + diff --git a/app/assets/images/bar_orbit.png b/app/assets/images/bar_orbit.png index feaca6b838d4de02fa3342e964663236fc40498c..eb0c95ee0ce7368e019c83542c9ee8fe9b2f1814 100644 GIT binary patch literal 6475 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
    xwAwuvJZX@ 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 YPW5A2c8Kf^a$5z|m35RF6s#lu57Kg1{{R30 literal 4619 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'+t+''); + $(this).find('.td').show().css('display','inline-block'); + $(document).mousemove(function(e){ + $(this).find('.td').css({ + left: e.pageX - p.left + 16, + top: e.pageY - p.top - th - 20 + }); + }); + }) + .mouseout(function(){ + $(this).find('.td').hide().detach(); + }); + }); +} + +function accordion(){ + if( !$('.rc_accor').length ){ + return; + } + $('.rc_accor').each(function(){ + $(this).find('.ac_ctrl:first').addClass('recent'); + $(this).find('.ac_content:not(:first)').hide(); + if($(this).hasClass('av')){ + $(this).find('.ac_ctrl').click(function(){ + var index = $(this).parents('.av').find('.ac_ctrl').index(this); + $(this).siblings('.ac_ctrl').removeClass('recent'); + $(this).addClass('recent'); + $(this).parents('.rc_accor').find('.ac_content:not(:eq('+index+'))').stop().slideUp(); + $(this).parents('.rc_accor').find('.ac_content:eq('+index+')').stop().slideToggle(); + return false; + }); + } else if($(this).hasClass('ah')){ + var w = $(this).find('.ac_content').css('width'); + $(this).find('.ac_content:not(:eq(0))').css({width:0}); + $(this).find('.ac_ctrl').click(function(){ + var index = $(this).parents('.ah').find('.ac_ctrl').index(this); + $(this).siblings('.ac_ctrl').removeClass('recent'); + $(this).addClass('recent'); + $(this).parents('.rc_accor').find('.ac_content:not(:eq('+index+'))').stop().animate({width:0}); + $(this).parents('.rc_accor').find('.ac_content:eq('+index+')').stop().show().animate({width:w}); + return false; + }); + } + + + + }); +} diff --git a/app/assets/javascripts/rss.js b/app/assets/javascripts/rss.js index a9d8ff32a..737b08b71 100644 --- a/app/assets/javascripts/rss.js +++ b/app/assets/javascripts/rss.js @@ -393,9 +393,9 @@ modalWindow : function(settings,callbackFn){ }else{tempwidth="auto";} $rss("body").append('
    '); - $rss("#rgsheath").css({background: "#000", width: "100%", position: "fixed", top: 0, left: 0,opacity:0.9,'z-index':199}); + $rss("#rgsheath").css({background: "#000", width: "100%", position: "fixed", top: 0, left: 0,opacity:0.5,'z-index':199}); $rss("body").append('
    '); - $rss("#rgWindow").css({"position": "fixed", "z-index": "999", "background": "#fff", "border": "solid 3px #ccc", "padding": "20px", "overflow": "hidden", "border-radius": "12px", "-webkit-border-radius": "12px", "-moz-border-radius": "12px", "-ms-border-radius": "12px", "box-shadow": "0 0 20px rgba(0,0,0,0.9)","-webkit-box-shadow": "0 0 20px rgba(0,0,0,0.9)","-moz-box-shadow": "0 0 20px rgba(0,0,0,0.9)","-ms-box-shadow": "0 0 20px rgba(0,0,0,0.9)"}); + $rss("#rgWindow").css({"position": "fixed", "z-index": "999", "background": "#fff", "border": "solid 1px #ccc", "padding": "10px", "border-radius": "5px", "-webkit-border-radius": "5px", "-moz-border-radius": "5px", "-ms-border-radius": "5px", "box-shadow": "0 0 20px rgba(0,0,0,0.7)","-webkit-box-shadow": "0 0 20px rgba(0,0,0,0.7)","-moz-box-shadow": "0 0 20px rgba(0,0,0,0.7)","-ms-box-shadow": "0 0 20px rgba(0,0,0,0.7)"}); var rgWTop = (rgmaskHeight-20)/2; var rgWLeft = (rgmaskWidth-20)/2; $rss("#rgWindow").css({top:rgWTop+"px", left:rgWLeft+"px"}); @@ -433,8 +433,8 @@ modalWindow : function(settings,callbackFn){ $rss("#rgWindow").empty().show(); var closebtn = ""; if(closeBtn) - closebtn='X'; - $rss("#rgWindow").animate({"width":tempwidth+"px","height":tempheight+"px",top:rgWTop+"px", left:rgWLeft+"px"},500,function(){$rss("#rgWindow").html(closebtn+"
    "+dhtml+"
    "); + closebtn='X'; + $rss("#rgWindow").animate({"width":tempwidth+"px","height":tempheight+"px",top:rgWTop+"px", left:rgWLeft+"px"},500,function(){$rss("#rgWindow").html(closebtn+"
    "+dhtml+"
    "); $rss("#close_modal").mouseover(function(){$rss(this).css("color","#999");}).mouseout(function(){$rss(this).css("color","#666");}) $rss("#close_modal").click(function(){ $rss("#rgWindow").empty(); diff --git a/app/assets/javascripts/site_editor.js b/app/assets/javascripts/site_editor.js index 98405564c..ef4acc855 100644 --- a/app/assets/javascripts/site_editor.js +++ b/app/assets/javascripts/site_editor.js @@ -7,4 +7,5 @@ //= require jquery //= require jquery_ujs //= require page_edit -//= require side_bar_history \ No newline at end of file +//= require side_bar_history +//= require rc \ No newline at end of file diff --git a/app/assets/stylesheets/admin_back_end.css.erb b/app/assets/stylesheets/admin_back_end.css.erb index 405281b49..5aecff454 100644 --- a/app/assets/stylesheets/admin_back_end.css.erb +++ b/app/assets/stylesheets/admin_back_end.css.erb @@ -14,39 +14,69 @@ body{ } #back_banner_link{ - background: url(<%= asset_path "orbitbar1.png" %>) repeat-x scroll 0 0; - height: 50px; - left: 0; - position: fixed; - top: 0; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0, #787e82), color-stop(0.05, #61676c), color-stop(1, #292c2d) ); + background:-moz-linear-gradient( center top -90deg, #787e82 0%, #61676c 5%, #292c2d 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#61676c', endColorstr='#292c2d'); + -moz-box-shadow: 0px 1px 5px 0px rgba(0,0,0,.7); + -webkit-box-shadow: 0px 1px 5px 0px rgba(0,0,0,.7); + box-shadow: 0px 1px 5px 0px rgba(0,0,0,.7); + border-top: 1px solid #474a4c; + border-bottom: 1px solid #1d2020; + height: 41px; width: 100%; - z-index: 5; + behavior: url(<%= asset_path "PIE.htc" %>); } .hmenu{ - height: 40px; - position: absolute; - right: 0; - top: 1px; - width: 250px; + float: right; + height: 41px; } #back_orbit{ - background: url(<%= asset_path "bar_orbit.png" %>) no-repeat scroll 0 0 transparent; - cursor:pointer; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0, #70787d), color-stop(1, #3b4043) ); + background:-moz-linear-gradient( center top -90deg, #70787d 0%, #3b4043 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#70787d', endColorstr='#3b4043'); + -webkit-border-radius: 0px 0px 5px 5px; + -moz-border-radius: 0px 0px 5px 5px; + border-radius: 0px 0px 5px 5px; + -moz-box-shadow: 0px 1px 1px 0px rgba(0,0,0,.7); + -webkit-box-shadow: 0px 1px 1px 0px rgba(0,0,0,.7); + box-shadow: 0px 1px 1px 0px rgba(0,0,0,.7); + cursor: pointer; + float: left; height: 43px; - left: 10px; - position: relative; + margin-left: 10px; width: 41px; + behavior: url(<%= asset_path "PIE.htc" %>); +} +#back_orbit span{ + text-indent: -9999px; + background: url(<%= asset_path "bar_orbit.png" %>) no-repeat scroll 0 0 transparent; + display: block; + height: 43px; + width: 100%; } #back_orbit:hover{ - background-position:0 -43px; - box-shadow: 0 3px 3px #000000; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0, #fefefe), color-stop(1, #e4e4e4) ); + background:-moz-linear-gradient( center top -90deg, #fefefe 0%, #e4e4e4 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fefefe', endColorstr='#e4e4e4'); + -webkit-border-radius: 0px; + -moz-border-radius: 0px; + border-radius: 0px; +} +#back_orbit:hover span{ + background-position: 0 -44px; } #back_orbit:hover #orblist{ display:block; } #orblist{ - background: none repeat scroll 0 0 #FFFFFF; - border-radius: 0 3px 3px 3px; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0, #e4e4e4), color-stop(1, #FFFFFF) ); + background:-moz-linear-gradient( center top -90deg, #e4e4e4 0%, #FFFFFF 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e4e4e4', endColorstr='#FFFFFF'); + -webkit-border-radius: 0px 3px 3px 3px; + -moz-border-radius: 0px 3px 3px 3px; + border-radius: 0px 3px 3px 3px; + -webkit-box-shadow: 0 3px 3px #000000; + -moz-box-shadow: 0 3px 3px #000000; box-shadow: 0 3px 3px #000000; display: none; margin: 0; @@ -70,30 +100,37 @@ body{ background:#eee; color:#333; } - +#log_out{ + -moz-box-shadow:inset 1px 0px 0px 0px #73777b; + -webkit-box-shadow:inset 1px 0px 0px 0px #73777b; + box-shadow:inset 1px 0px 0px 0px #73777b; + border-right:1px solid #41474c; + border-left:1px solid #41474c; + float:right; + width:41px; + height:41px; +} +#log_out:hover{ + background:-webkit-gradient( linear, left top, left bottom, color-stop(0, #01afde), color-stop(1, #007ec6) ); + background:-moz-linear-gradient( center top -90deg, #01afde 0%, #007ec6 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#01afde', endColorstr='#007ec6'); +} #log_out a{ background: url(<%= asset_path "service_btn.png" %>) no-repeat scroll right 0 transparent; - border: medium none !important; - display: block !important; - height: 40px !important; - line-height: normal !important; - padding: 0 !important; - position: absolute; - right: 0px; - text-indent: -10000px; - top: 0px; - width: 43px !important; + display: block; + height: 41px; + text-indent: -9999px; + width: 41px; } #log_out a:hover{ background: url(<%= asset_path "service_btn.png" %>) no-repeat scroll right bottom transparent !important; } .lang{ - color: #FFFFFF; - font-size: 15px; - line-height: 40px; - position: absolute; - right: 55px; - top: 0; + color: #FFFFFF; + float: right; + font-size: 15px; + line-height: 40px; + margin-right: 10px; } .lang a{ color:#fff; @@ -589,4 +626,40 @@ hr.student_block { position: absolute; top: -15%; width: 130%; +} +#rgContent .main2{ + padding:0; +} +#rgContent h1{ + border-bottom: 1px dashed #CCCCCC; + color: #333333; + font-size: 19px; + font-weight: bold; + margin: 0 0 20px; + padding: 0 0 10px; + text-align: center; +} +#rgContent label { + color: #888888; + display: block; + font-size: 12px; + margin: 25px 0 5px; + width: 100%; +} +#rgContent input { + color: #888888; + width: 98%; +} +#rgContent .button_bar { + float: none; + text-align: center; + width:100%; + margin:30px 0 0; +} +#rgContent .button_bar a { + float: none; + display:block; +} +#close_modal{ + display:none !important; } \ No newline at end of file diff --git a/app/assets/stylesheets/reset.css b/app/assets/stylesheets/reset.css index 44f2ae777..612cab191 100644 --- a/app/assets/stylesheets/reset.css +++ b/app/assets/stylesheets/reset.css @@ -42,3 +42,7 @@ input:focus, select:focus, textarea:focus { height:0; visibility:hidden; } +.fixed { + position: fixed; + z-index: 100; +} \ No newline at end of file diff --git a/app/assets/stylesheets/site_items.css.erb b/app/assets/stylesheets/site_items.css.erb index 151dabdee..38b0a1855 100644 --- a/app/assets/stylesheets/site_items.css.erb +++ b/app/assets/stylesheets/site_items.css.erb @@ -1,445 +1,482 @@ -html, body{ - height: 100%; - margin: 0; - padding: 0; -} -html{ - background: url(<%= asset_path "body.jpg" %>) no-repeat fixed 0 0 transparent; - background-size: cover; -} - -body{ - color: #000000; - font-family: Helvetica, '微軟正黑體'; -} -#back_banner_link{ - background: url(<%= asset_path "orbitbar1.png" %>) repeat-x scroll 0 0; - height: 50px; - left: 0; - position: fixed; - top: 0; - width: 100%; - z-index: 5; -} -.hmenu{ - height: 40px; - position: absolute; - right: 0; - top: 1px; - width: 250px; -} -#back_orbit{ - background: url(<%= asset_path "bar_orbit.png" %>) no-repeat scroll 0 0 transparent; - cursor:pointer; - height: 43px; - left: 10px; - position: relative; - width: 41px; -} -#back_orbit:hover{ - background-position:0 -43px; - box-shadow: 0 3px 3px #000000; -} -#back_orbit:hover #orblist{ - display:block; -} -#orblist{ - background: none repeat scroll 0 0 #FFFFFF; - border-radius: 0 3px 3px 3px; - box-shadow: 0 3px 3px #000000; - display: none; - margin: 0; - padding: 10px; - position: absolute; - top: 43px; - width: 130px; -} -#orblist li{ - border-bottom:1px solid #aaa; - list-style:none; -} -.orblink{ - color: #333333; - display: block; - font: 12px/100% arial,sans-serif; - padding: 5px; - text-decoration: none; -} -.orblink:hover{ - background:#eee; - color:#333; -} - -#log_out a{ - background: url(<%= asset_path "service_btn.png" %>) no-repeat scroll right 0 transparent; - border: medium none !important; - display: block !important; - height: 40px !important; - line-height: normal !important; - padding: 0 !important; - position: absolute; - right: 0px; - text-indent: -10000px; - top: 0px; - width: 43px !important; -} -#log_out a:hover{ - background: url(<%= asset_path "service_btn.png" %>) no-repeat scroll right bottom transparent !important; -} -.lang{ - color: #FFFFFF; - font-size: 15px; - line-height: 40px; - position: absolute; - right: 55px; - top: 0; -} -.lang a{ - color:#fff; - text-decoration:none; -} -.lang a:hover{ - text-decoration:underline; -} -#back_content{ - height: 100%; -} -#back_footer{ - background-color: #101010; - bottom: 0; - color: #FFFFFF; - font-size: 11px; - padding: 10px; - position: fixed; - width: 100%; - left: 0; - box-shadow: 0 -3px 4px #000; -} -.items_setup{ - padding:42px 0 0 0; -} -#back_sidebar .items_setup .list li{ - padding: 6px 0 7px 5px; -} -#back_sidebar .items_setup .list li a{ - display: inline; - font-size: 0.9em; - padding: 0; -} -#back_sidebar .items_setup .list li a span{ - background:none; - padding:0; - text-shadow:none; -} -.main { - background: none repeat scroll 0 0 #FFFFFF; - height: 100%; - margin-left: 220px; - padding: 0 40px; - position: relative; -} -.main_list { - padding-top: 70px; -} -.main_list ul { - clear:both; -} -#porfile { - padding-top: 100px; -} -/*add_buttom*/ -.button_bar { - float: right; - -moz-box-shadow:inset 0px 1px 0px 0px #666, 0px 0px 3px black; - -webkit-box-shadow:inset 0px 1px 0px 0px #666, 0px 0px 3px black; - box-shadow:inset 0px 1px 0px 0px #666, 0px 0px 3px black; - background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #4f4f4f), color-stop(1, #000000) ); - background:-moz-linear-gradient( center top, #4f4f4f 5%, #000000 100% ); - filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#4f4f4f', endColorstr='#000000'); - background-color:#4f4f4f; - -moz-border-radius:5px; - -webkit-border-radius:5px; - border-radius:5px; - display:inline-block; - padding:0; - margin:10px 0 60px; -} -.button_bar a { - text-decoration:none; - text-shadow:0px -1px 0px #000000; - font-size:12px; - color:#EDEDED; - border-right:1px solid #555; - -moz-box-shadow:1px 0px 0px black; - -webkit-box-shadow:1px 0px 0px black; - box-shadow:1px 0px 0px black; - padding: 6px 10px 4px; - display: inline-block; - float: left; -} -.button_bar a:active { - padding: 7px 10px 3px !important; - text-shadow:0px 1px 0px #000000; - background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #000000), color-stop(1, #4f4f4f) ); - background:-moz-linear-gradient( center top, #000000 5%, #4f4f4f 100% ); - filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#000000', endColorstr='#4f4f4f'); -} -.button_bar a:last-child { - border-right:none; - -moz-box-shadow:none; - -webkit-box-shadow:none; - box-shadow:none; - -moz-border-radius:0px 5px 5px 0px; - -webkit-border-radius:0px 5px 5px 0px; - border-radius:0px 5px 5px 0px; -} -.button_bar a:first-child { - -moz-border-radius:5px 0px 0px 5px; - -webkit-border-radius:5px 0px 0px 5px; - border-radius:5px 0px 0px 5px; -} -.button_bar a.new { - padding: 5px 10px; - -moz-border-radius:5px; - -webkit-border-radius:5px; - border-radius:5px; -} -.button_bar a:hover { - color:#FFFFFF; -} -.up { - margin:10px 0; -} -#person { - left: 245px; - position: fixed; - text-align: center; - top: 75px; - width: 140px; - background-color:#FFF; - padding:15px; - border-radius: 5px; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - -moz-box-shadow: 0px 0px 4px #180902; /* Firefox */ - -webkit-box-shadow: 0px 0px 4px #180902;/* Safari 和 Chrome */ - box-shadow: 0px 0px 4px #180902; /* Opera 10.5 + */ -} -#file { - display:none; -} -#person img { -} -.user_mail { - border: medium none; - border:1px solid #DDDDDD; - color: #666666; - font-size: 12px; - width: 140px; -} -#person label { - display: block; - margin: 15px 0 0; -} -#person label input { -} -#person label #user_admin { - float:right; - margin: 0; -} -#person label span { - text-align:left; - font-size:11px; - color:#888; - display:block; -} -#person select { - border: 1px solid #DDDDDD; - padding: 0; - width: 140px; -} -#porfile .users{ - margin-left: 180px; -} -.roles_block { - background: url(<%= asset_path "75.png" %>) repeat left top; - min-width:710px; - margin-bottom:50px; - position:relative; - padding-bottom: 20px; - border-radius: 5px; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - -moz-box-shadow: 0px 0px 4px #180902; /* Firefox */ - -webkit-box-shadow: 0px 0px 4px #180902;/* Safari 和 Chrome */ - box-shadow: 0px 0px 4px #180902; /* Opera 10.5 + */ -} -.roles_block h2 { - color: #FFFFFF; - font-weight: normal; - margin: 0; - padding: 0; - position: absolute; - text-shadow: 0 3px 2px #000000; - top: -30px; -} -.main hr { - height:8px; - border:none; - margin:0; - border-radius: 5px 5px 0px 0px; - -moz-border-radius: 5px 5px 0px 0px; - -webkit-border-radius: 5px 5px 0px 0px; - border-bottom:1px solid #000; -} -.main2{ - padding:70px 0 0; -} -#basic_block hr { - background-color: #666666; -} -#teacher_block hr { - background-color: #0071A9; -} -#student_block hr { - background-color: #AF0045; -} -.info_input { - padding:10px 20px; -} -.info_input table { - color:#fff; - width:100%; - font-size:14px; -} -.info_input table td { - padding:5px 10px 5px 0; - width: 10%; -} -.info_input .list_head { - background:url(<%= asset_path "line.png" %>) left bottom repeat-x; -} -.info_input .list_head td { -} -.info_input .list_item { - color:#AEAEAE; -} -.info_input .add { - display:block; - padding-left:22px; - font-size:12px; - line-height:21px; - height:19px; - background:url(<%= asset_path "icon.png" %>) no-repeat -59px 0; - margin-top: 10px; - color: #DDDDDD; -} - -.main table { - width:100%; -} -.main td { - padding-left:20px; - color:#fff; - font-size:14px; - line-height:40px; -} -.main tr.have td{ - background: url(<%= asset_path "75.png" %>) repeat left top; -} -.main tr.have td:first-child{ - border-radius: 5px 0 0 5px; - -moz-border-radius: 5px 0 0 5px; - -webkit-border-radius: 5px 0 0 5px; -} -.main tr.have td:last-child{ - border-radius: 0 5px 5px 0; - -moz-border-radius: 0 5px 5px 0; - -webkit-border-radius: 0 5px 5px 0; -} -.main thead td { - line-height:40px; - font-size:16px; - text-shadow: 0px 1px 1px #3e2914; -} -.main thead td.action { - width:140px; -} -.main tbody td.roles { - background-image: url(<%= asset_path "roles_type.jpg" %>); - background-repeat: repeat-x; -} -.main tbody td.teacher { - background-position: 0 -54px; -} -.main tbody td.student { - background-position: 0 -5px; -} -.main tbody td.action a { - background-image: url(<%= asset_path "icon.png" %>); - display: inline-block; - height: 19px; - margin-right: 10px; - top: 8px; - text-indent: -9999px; - width: 19px; - position: relative; -} -.main tbody td.action a.show { - background-position: left top; -} -.main tbody td.action a.show:hover { - background-position: left -19px; -} -.main tbody td.action a.edit { - background-position: -19px top; -} -.main tbody td.action a.edit:hover { - background-position: -19px -19px; -} -.main tbody td.action a.delete { - background-position: -38px top; -} -.main tbody td.action a.delete:hover { - background-position: -38px -19px; -} -.main tbody td.action a.switch { - background: url(<%= asset_path "switch.png" %>) no-repeat left 3px; - width: 40px; -} -.main tbody tr.disable td.action a.switch { - background-position:left bottom; -} -.main tbody td.action a.delete:hover { - background-position: -38px -19px; -} -.main tbody tr.have { -} -.main tbody tr.disable { - opacity: 0.7; -} -.main tbody tr { - background:none; - height:15px; -} -h1{ - margin:0 0 20px; -} -p{ - margin:0 0 10px; -} - -#back_sidebar .items_setup .list li{ - background:url(<%= asset_path "sidebar_li2.jpg" %>) repeat left top; - border:none; - padding: 0 0 0 5px; -} -#back_sidebar .items_setup .list li a{ - line-height:31px; -} -#back_sidebar .items_setup .list li:hover{ - background:url(<%= asset_path "sidebar_li2.jpg" %>) repeat left top; - border:none; -} -#back_sidebar .items_setup ul .list { +html, body{ + height: 100%; + margin: 0; + padding: 0; +} +html{ + background: url(<%= asset_path "body.jpg" %>) no-repeat fixed 0 0 transparent; + background-size: cover; +} + +body{ + color: #000000; + font-family: Helvetica, '微軟正黑體'; +} +#back_banner_link{ + background:-webkit-gradient( linear, left top, left bottom, color-stop(0, #787e82), color-stop(0.05, #61676c), color-stop(1, #292c2d) ); + background:-moz-linear-gradient( center top -90deg, #787e82 0%, #61676c 5%, #292c2d 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#61676c', endColorstr='#292c2d'); + -moz-box-shadow: 0px 1px 5px 0px rgba(0,0,0,.7); + -webkit-box-shadow: 0px 1px 5px 0px rgba(0,0,0,.7); + box-shadow: 0px 1px 5px 0px rgba(0,0,0,.7); + border-top: 1px solid #474a4c; + border-bottom: 1px solid #1d2020; + height: 41px; + width: 100%; + behavior: url(<%= asset_path "PIE.htc" %>); +} +.hmenu{ + float: right; + height: 41px; +} +#back_orbit{ + background:-webkit-gradient( linear, left top, left bottom, color-stop(0, #70787d), color-stop(1, #3b4043) ); + background:-moz-linear-gradient( center top -90deg, #70787d 0%, #3b4043 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#70787d', endColorstr='#3b4043'); + -webkit-border-radius: 0px 0px 5px 5px; + -moz-border-radius: 0px 0px 5px 5px; + border-radius: 0px 0px 5px 5px; + -moz-box-shadow: 0px 1px 1px 0px rgba(0,0,0,.7); + -webkit-box-shadow: 0px 1px 1px 0px rgba(0,0,0,.7); + box-shadow: 0px 1px 1px 0px rgba(0,0,0,.7); + cursor: pointer; + float: left; + height: 43px; + margin-left: 10px; + width: 41px; + behavior: url(<%= asset_path "PIE.htc" %>); +} +#back_orbit span{ + text-indent: -9999px; + background: url(<%= asset_path "bar_orbit.png" %>) no-repeat scroll 0 0 transparent; + display: block; + height: 43px; + width: 100%; +} +#back_orbit:hover{ + background:-webkit-gradient( linear, left top, left bottom, color-stop(0, #fefefe), color-stop(1, #e4e4e4) ); + background:-moz-linear-gradient( center top -90deg, #fefefe 0%, #e4e4e4 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fefefe', endColorstr='#e4e4e4'); + -webkit-border-radius: 0px; + -moz-border-radius: 0px; + border-radius: 0px; +} +#back_orbit:hover span{ + background-position: 0 -44px; +} +#back_orbit:hover #orblist{ + display:block; +} +#orblist{ + background:-webkit-gradient( linear, left top, left bottom, color-stop(0, #e4e4e4), color-stop(1, #FFFFFF) ); + background:-moz-linear-gradient( center top -90deg, #e4e4e4 0%, #FFFFFF 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e4e4e4', endColorstr='#FFFFFF'); + -webkit-border-radius: 0px 3px 3px 3px; + -moz-border-radius: 0px 3px 3px 3px; + border-radius: 0px 3px 3px 3px; + -webkit-box-shadow: 0 3px 3px #000000; + -moz-box-shadow: 0 3px 3px #000000; + box-shadow: 0 3px 3px #000000; + display: none; + margin: 0; + padding: 10px; + position: absolute; + top: 43px; + width: 130px; +} +#orblist li{ + border-bottom:1px solid #aaa; + list-style:none; +} +.orblink{ + color: #333333; + display: block; + font: 12px/100% arial,sans-serif; + padding: 5px; + text-decoration: none; +} +.orblink:hover{ + background:#eee; + color:#333; +} +#log_out{ + -moz-box-shadow:inset 1px 0px 0px 0px #73777b; + -webkit-box-shadow:inset 1px 0px 0px 0px #73777b; + box-shadow:inset 1px 0px 0px 0px #73777b; + border-right:1px solid #41474c; + border-left:1px solid #41474c; + float:right; + width:41px; + height:41px; +} +#log_out:hover{ + background:-webkit-gradient( linear, left top, left bottom, color-stop(0, #01afde), color-stop(1, #007ec6) ); + background:-moz-linear-gradient( center top -90deg, #01afde 0%, #007ec6 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#01afde', endColorstr='#007ec6'); +} +#log_out a{ + background: url(<%= asset_path "service_btn.png" %>) no-repeat scroll right 0 transparent; + display: block; + height: 41px; + text-indent: -9999px; + width: 41px; +} +#log_out a:hover{ + background: url(<%= asset_path "service_btn.png" %>) no-repeat scroll right bottom transparent !important; +} +.lang{ + color: #FFFFFF; + float: right; + font-size: 15px; + line-height: 40px; + margin-right: 10px; +} +.lang a{ + color:#fff; + text-decoration:none; +} +.lang a:hover{ + text-decoration:underline; +} +#back_content{ + height: 100%; +} +#back_footer{ + background-color: #101010; + bottom: 0; + color: #FFFFFF; + font-size: 11px; + padding: 10px; + position: fixed; + width: 100%; + left: 0; + box-shadow: 0 -3px 4px #000; +} +.items_setup{ + padding:42px 0 0 0; +} +#back_sidebar .items_setup .list li{ + padding: 6px 0 7px 5px; +} +#back_sidebar .items_setup .list li a{ + display: inline; + font-size: 0.9em; + padding: 0; +} +#back_sidebar .items_setup .list li a span{ + background:none; + padding:0; + text-shadow:none; +} +.main { + background: none repeat scroll 0 0 #FFFFFF; + height: 100%; + margin-left: 220px; + padding: 0 40px; + position: relative; +} +.main_list { + padding-top: 70px; +} +.main_list ul { + clear:both; +} +#porfile { + padding-top: 100px; +} +/*add_buttom*/ +.button_bar { + float: right; + -moz-box-shadow:inset 0px 1px 0px 0px #666, 0px 0px 3px black; + -webkit-box-shadow:inset 0px 1px 0px 0px #666, 0px 0px 3px black; + box-shadow:inset 0px 1px 0px 0px #666, 0px 0px 3px black; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #4f4f4f), color-stop(1, #000000) ); + background:-moz-linear-gradient( center top, #4f4f4f 5%, #000000 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#4f4f4f', endColorstr='#000000'); + background-color:#4f4f4f; + -moz-border-radius:5px; + -webkit-border-radius:5px; + border-radius:5px; + display:inline-block; + padding:0; + margin:10px 0 60px; +} +.button_bar a { + text-decoration:none; + text-shadow:0px -1px 0px #000000; + font-size:12px; + color:#EDEDED; + border-right:1px solid #555; + -moz-box-shadow:1px 0px 0px black; + -webkit-box-shadow:1px 0px 0px black; + box-shadow:1px 0px 0px black; + padding: 6px 10px 4px; + display: inline-block; + float: left; +} +.button_bar a:active { + padding: 7px 10px 3px !important; + text-shadow:0px 1px 0px #000000; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #000000), color-stop(1, #4f4f4f) ); + background:-moz-linear-gradient( center top, #000000 5%, #4f4f4f 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#000000', endColorstr='#4f4f4f'); +} +.button_bar a:last-child { + border-right:none; + -moz-box-shadow:none; + -webkit-box-shadow:none; + box-shadow:none; + -moz-border-radius:0px 5px 5px 0px; + -webkit-border-radius:0px 5px 5px 0px; + border-radius:0px 5px 5px 0px; +} +.button_bar a:first-child { + -moz-border-radius:5px 0px 0px 5px; + -webkit-border-radius:5px 0px 0px 5px; + border-radius:5px 0px 0px 5px; +} +.button_bar a.new { + padding: 5px 10px; + -moz-border-radius:5px; + -webkit-border-radius:5px; + border-radius:5px; +} +.button_bar a:hover { + color:#FFFFFF; +} +.up { + margin:10px 0; +} +#person { + left: 245px; + position: fixed; + text-align: center; + top: 75px; + width: 140px; + background-color:#FFF; + padding:15px; + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + -moz-box-shadow: 0px 0px 4px #180902; /* Firefox */ + -webkit-box-shadow: 0px 0px 4px #180902;/* Safari 和 Chrome */ + box-shadow: 0px 0px 4px #180902; /* Opera 10.5 + */ +} +#file { + display:none; +} +#person img { +} +.user_mail { + border: medium none; + border:1px solid #DDDDDD; + color: #666666; + font-size: 12px; + width: 140px; +} +#person label { + display: block; + margin: 15px 0 0; +} +#person label input { +} +#person label #user_admin { + float:right; + margin: 0; +} +#person label span { + text-align:left; + font-size:11px; + color:#888; + display:block; +} +#person select { + border: 1px solid #DDDDDD; + padding: 0; + width: 140px; +} +#porfile .users{ + margin-left: 180px; +} +.roles_block { + background: url(<%= asset_path "75.png" %>) repeat left top; + min-width:710px; + margin-bottom:50px; + position:relative; + padding-bottom: 20px; + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + -moz-box-shadow: 0px 0px 4px #180902; /* Firefox */ + -webkit-box-shadow: 0px 0px 4px #180902;/* Safari 和 Chrome */ + box-shadow: 0px 0px 4px #180902; /* Opera 10.5 + */ +} +.roles_block h2 { + color: #FFFFFF; + font-weight: normal; + margin: 0; + padding: 0; + position: absolute; + text-shadow: 0 3px 2px #000000; + top: -30px; +} +.main hr { + height:8px; + border:none; + margin:0; + border-radius: 5px 5px 0px 0px; + -moz-border-radius: 5px 5px 0px 0px; + -webkit-border-radius: 5px 5px 0px 0px; + border-bottom:1px solid #000; +} +.main2{ + padding:70px 0 0; +} +#basic_block hr { + background-color: #666666; +} +#teacher_block hr { + background-color: #0071A9; +} +#student_block hr { + background-color: #AF0045; +} +.info_input { + padding:10px 20px; +} +.info_input table { + color:#fff; + width:100%; + font-size:14px; +} +.info_input table td { + padding:5px 10px 5px 0; + width: 10%; +} +.info_input .list_head { + background:url(<%= asset_path "line.png" %>) left bottom repeat-x; +} +.info_input .list_head td { +} +.info_input .list_item { + color:#AEAEAE; +} +.info_input .add { + display:block; + padding-left:22px; + font-size:12px; + line-height:21px; + height:19px; + background:url(<%= asset_path "icon.png" %>) no-repeat -59px 0; + margin-top: 10px; + color: #DDDDDD; +} + +.main table { + width:100%; +} +.main td { + padding-left:20px; + color:#fff; + font-size:14px; + line-height:40px; +} +.main tr.have td{ + background: url(<%= asset_path "75.png" %>) repeat left top; +} +.main tr.have td:first-child{ + border-radius: 5px 0 0 5px; + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; +} +.main tr.have td:last-child{ + border-radius: 0 5px 5px 0; + -moz-border-radius: 0 5px 5px 0; + -webkit-border-radius: 0 5px 5px 0; +} +.main thead td { + line-height:40px; + font-size:16px; + text-shadow: 0px 1px 1px #3e2914; +} +.main thead td.action { + width:140px; +} +.main tbody td.roles { + background-image: url(<%= asset_path "roles_type.jpg" %>); + background-repeat: repeat-x; +} +.main tbody td.teacher { + background-position: 0 -54px; +} +.main tbody td.student { + background-position: 0 -5px; +} +.main tbody td.action a { + background-image: url(<%= asset_path "icon.png" %>); + display: inline-block; + height: 19px; + margin-right: 10px; + top: 8px; + text-indent: -9999px; + width: 19px; + position: relative; +} +.main tbody td.action a.show { + background-position: left top; +} +.main tbody td.action a.show:hover { + background-position: left -19px; +} +.main tbody td.action a.edit { + background-position: -19px top; +} +.main tbody td.action a.edit:hover { + background-position: -19px -19px; +} +.main tbody td.action a.delete { + background-position: -38px top; +} +.main tbody td.action a.delete:hover { + background-position: -38px -19px; +} +.main tbody td.action a.switch { + background: url(<%= asset_path "switch.png" %>) no-repeat left 3px; + width: 40px; +} +.main tbody tr.disable td.action a.switch { + background-position:left bottom; +} +.main tbody td.action a.delete:hover { + background-position: -38px -19px; +} +.main tbody tr.have { +} +.main tbody tr.disable { + opacity: 0.7; +} +.main tbody tr { + background:none; + height:15px; +} +h1{ + margin:0 0 20px; +} +p{ + margin:0 0 10px; +} + +#back_sidebar .items_setup .list li{ + background:url(<%= asset_path "sidebar_li2.jpg" %>) repeat left top; + border:none; + padding: 0 0 0 5px; +} +#back_sidebar .items_setup .list li a{ + line-height:31px; +} +#back_sidebar .items_setup .list li:hover{ + background:url(<%= asset_path "sidebar_li2.jpg" %>) repeat left top; + border:none; +} +#back_sidebar .items_setup ul .list { } \ No newline at end of file diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 6bdac5ee2..e4e94c123 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -9,7 +9,7 @@ class ApplicationController < ActionController::Base def front_end_available(module_app_title='') app_controller = ModuleApp.first(conditions: {:title => module_app_title} ) unless app_controller.enable_frontend? - render :nothing + render :nothing => true end end diff --git a/app/controllers/pages_controller.rb b/app/controllers/pages_controller.rb index 693243c22..33c927acd 100644 --- a/app/controllers/pages_controller.rb +++ b/app/controllers/pages_controller.rb @@ -19,7 +19,7 @@ class PagesController < ApplicationController end def show - begin + #begin item = Item.first(:conditions => {:full_name => params[:page_name]}) case item._type when 'Page' @@ -28,9 +28,9 @@ class PagesController < ApplicationController when 'Link' redirect_to "http://#{item[:url]}" end - rescue - render :file => "#{Rails.root}/public/404.html", :status => :not_found - end + #rescue + # render :file => "#{Rails.root}/public/404.html", :status => :not_found + #end end end diff --git a/app/views/admin/assets/_asset.html.erb b/app/views/admin/assets/_asset.html.erb index b29bc51df..7aad2ef81 100644 --- a/app/views/admin/assets/_asset.html.erb +++ b/app/views/admin/assets/_asset.html.erb @@ -13,5 +13,5 @@ - + \ No newline at end of file diff --git a/app/views/admin/assets/_form.html.erb b/app/views/admin/assets/_form.html.erb index 3ee7c6447..72199ceb4 100644 --- a/app/views/admin/assets/_form.html.erb +++ b/app/views/admin/assets/_form.html.erb @@ -9,6 +9,6 @@

    -<%= f.label :data, t('admin.data') %> +<%= f.label :data, t('admin.data'), :class => 'file' %> <%= f.file_field :data %>

    \ No newline at end of file diff --git a/app/views/admin/assets/_new.html.erb b/app/views/admin/assets/_new.html.erb index 4f15fafce..49e638c8c 100644 --- a/app/views/admin/assets/_new.html.erb +++ b/app/views/admin/assets/_new.html.erb @@ -9,7 +9,7 @@ <%= link_back %> <%= f.submit t(:create) %> <% else %> - <%= t(:create) %> + <%= t(:create) %> <% end %>
    <% end %> diff --git a/app/views/admin/users/_sub_role_selector.html.erb b/app/views/admin/users/_sub_role_selector.html.erb index 6d7924ca8..2305cb475 100644 --- a/app/views/admin/users/_sub_role_selector.html.erb +++ b/app/views/admin/users/_sub_role_selector.html.erb @@ -1,4 +1,4 @@ <% role.sub_roles.each do |sub_role| %> - <%= sub_role.i18n_variable[I18n.locale] %> - <%= check_box_tag "user[sub_role_ids][]", sub_role.id, @user.sub_role_ids.include?(sub_role.id), :class => 'sub_role_select' %> + <%= f.label sub_role.i18n_variable[I18n.locale], :for => "check_sub_role_#{sub_role.id}", :class => 'sub_role_select' %> + <%= check_box_tag "user[sub_role_ids][]", sub_role.id, @user.sub_role_ids.include?(sub_role.id), :id => "check_sub_role_#{sub_role.id}", :class => 'sub_role_select' %> <% end %> \ No newline at end of file diff --git a/app/views/layouts/admin.html.erb b/app/views/layouts/admin.html.erb index 631370488..d800ab5d0 100644 --- a/app/views/layouts/admin.html.erb +++ b/app/views/layouts/admin.html.erb @@ -1,31 +1,37 @@ - - - - - <%= @title || APP_CONFIG['orbit'] %> - - <%= stylesheet_link_tag "admin" %> - <%= javascript_include_tag "admin" %> - <%= yield :page_specific_css %> - <%= yield :page_specific_javascript %> - <%= csrf_meta_tag %> - - - - -
    -
    <%= yield :secondary %>
    -
    - <%= yield %> -
    -
    <%= yield :tertiary %>
    - -
    - - + + + + + <%= @title || APP_CONFIG['orbit'] %> + + + <%= stylesheet_link_tag "admin" %> + <%= javascript_include_tag "admin" %> + <%= yield :page_specific_css %> + <%= yield :page_specific_javascript %> + <%= csrf_meta_tag %> + + + + +
    +
    <%= yield :secondary %>
    +
    + <%= yield %> +
    +
    <%= yield :tertiary %>
    + +
    + + diff --git a/app/views/layouts/site_editor.html.erb b/app/views/layouts/site_editor.html.erb index f419fb028..f4df75c4b 100644 --- a/app/views/layouts/site_editor.html.erb +++ b/app/views/layouts/site_editor.html.erb @@ -1,32 +1,38 @@ - - - - - <%= @title || APP_CONFIG['orbit'] %> - - <%= stylesheet_link_tag "site_editor" %> - <%= javascript_include_tag "site_editor" %> - <%= yield :page_specific_css %> - <%= yield :page_specific_javascript %> - <%= csrf_meta_tag %> - - - - -
    -
    <%= yield :sidebar %>
    -
    - <%= yield %> -
    -
    <%= yield :tertiary %>
    - -
    - - - + + + + + <%= @title || APP_CONFIG['orbit'] %> + + + <%= stylesheet_link_tag "site_editor" %> + <%= javascript_include_tag "site_editor" %> + <%= yield :page_specific_css %> + <%= yield :page_specific_javascript %> + <%= csrf_meta_tag %> + + + + +
    +
    <%= yield :sidebar %>
    +
    + <%= yield %> +
    +
    <%= yield :tertiary %>
    + +
    + + + diff --git a/config/environments/development.rb b/config/environments/development.rb index 48f4d9568..d1b671e55 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -10,7 +10,7 @@ PrototypeR4::Application.configure do config.whiny_nils = true # Show full error reports and disable caching - config.consider_all_requests_local = true + config.consider_all_requests_local = false #config.action_view.debug_rjs = true config.action_controller.perform_caching = false diff --git a/lib/parsers/parser_back_end.rb b/lib/parsers/parser_back_end.rb index d11ce9b2f..48b6a1df8 100644 --- a/lib/parsers/parser_back_end.rb +++ b/lib/parsers/parser_back_end.rb @@ -107,7 +107,7 @@ module ParserBackEnd c.define_tag 'menu' do |tag| home = get_homepage menu = page.design.layout.menu - menu_level(home, 1, menu, true) + menu_level(home, 0, menu, true) end end end diff --git a/lib/parsers/parser_common.rb b/lib/parsers/parser_common.rb index e96c92016..70006eb32 100644 --- a/lib/parsers/parser_common.rb +++ b/lib/parsers/parser_common.rb @@ -1,23 +1,33 @@ module ParserCommon def menu_level(page, current, menu, edit = false) + res = '' if current <= menu.levels - res = "" end end @@ -26,8 +36,11 @@ module ParserCommon res << menu.values["li_class_#{current}"] res << "_#{i}" if i res << ">" - res << "#{page.name}" - res << menu_level(page, current + 1, menu, edit) if page.children.size > 0 && !page.is_home? + if page.children.size > 0 + res << menu_level(page, current + 1, menu, edit) + else + res << "#{page.name}" + end res << "" end diff --git a/lib/parsers/parser_front_end.rb b/lib/parsers/parser_front_end.rb index 660a779b9..3452f4fc9 100644 --- a/lib/parsers/parser_front_end.rb +++ b/lib/parsers/parser_front_end.rb @@ -104,7 +104,7 @@ module ParserFrontEnd ret << "
    " else part = page.page_parts.detect{ |p| p.name.to_s == tag.attr['name'].to_s } rescue nil - ret << part.content + ret << part.content rescue nil end ret end @@ -118,7 +118,7 @@ module ParserFrontEnd c.define_tag 'menu' do |tag| home = get_homepage menu = page.design.layout.menu - menu_level(home, 1, menu) + menu_level(home, 0, menu) end end end diff --git a/lib/tasks/pages.rake b/lib/tasks/pages.rake new file mode 100644 index 000000000..8a43f420a --- /dev/null +++ b/lib/tasks/pages.rake @@ -0,0 +1,66 @@ +# encoding: utf-8 + +namespace :pages do + + task :build => :environment do + + Item.delete_all + + + var_10 = I18nVariable.create!( :document_class => 'Home', :key => 'home', :en => 'Homepage', :zh_tw => '首頁') + var_13 = I18nVariable.create!( :document_class => 'PagePart', :key => 'main_content', :en => 'This is the homepage', :zh_tw => '這是首頁', :parent_id => var_10.id ) + + + design = Design.new(:title => "Fraisier", :author => "Paul", :intro => "Strawberry cake") + + design.build_default_css(:file => File.open("#{Rails.root}/lib/fraisier/default.css")) + + # image = design.images.build(:file => File.open("#{Rails.root}/lib/fraisier/img/buttons.gif")) + # + # js = design.javascripts.build(:file => File.open("#{Rails.root}/lib/fraisier/inettuts.js")) + # + theme = design.themes.build(:file => File.open("#{Rails.root}/lib/fraisier/themes/default.css")) + theme_1 = design.themes.build(:file => File.open("#{Rails.root}/lib/fraisier/themes/red.css")) + + design.build_layout + design.layout.file = File.open("#{Rails.root}/lib/fraisier/layout.html") + + design.layout.save + theme.save + theme_1.save + # image.save + # js.save + + design.save + + + + design_1 = Design.new(:title => "Bob", :author => "Me", :intro => "Moran") + + design_1.build_default_css(:file => File.open("#{Rails.root}/lib/fraisier/default.css")) + + # image = design.images.build(:file => File.open("#{Rails.root}/lib/fraisier/img/buttons.gif")) + # + # js = design.javascripts.build(:file => File.open("#{Rails.root}/lib/fraisier/inettuts.js")) + # + theme = design_1.themes.build(:file => File.open("#{Rails.root}/lib/fraisier/themes/default.css")) + theme_1 = design_1.themes.build(:file => File.open("#{Rails.root}/lib/fraisier/themes/red.css")) + + design_1.build_layout + design_1.layout.file = File.open("#{Rails.root}/lib/fraisier/layout.html") + + design_1.layout.save + theme.save + theme_1.save + # image.save + # js.save + + design_1.save + + + home = Page.create!( :i18n_variable_id => var_10.id, :design_id => design_1.id, :name => 'home', :is_published => true, :theme_id => theme.id ) + home.page_parts.create!( :name => 'content_1', :content => File.open("#{Rails.root}/lib/template/home.page").read, :kind => 'text', :i18n_variable_id => var_13.id ) + + end + +end From 4d2809d40bfbff66f82e9b1e056c0868922d1f8f Mon Sep 17 00:00:00 2001 From: chris2tof Date: Fri, 13 Jan 2012 12:35:46 +0800 Subject: [PATCH 12/26] Update carrierwave #{column}_identifier must be used to get the name of the file --- Gemfile | 5 +++-- Gemfile.lock | 24 +++++++++++------------- config/initializers/carrierwave.rb | 6 +++--- 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/Gemfile b/Gemfile index 6fd6eaa18..3ff28976b 100644 --- a/Gemfile +++ b/Gemfile @@ -3,14 +3,15 @@ gem 'rails' gem 'yajl-ruby', :require => 'yajl' gem 'bson_ext' -gem 'carrierwave', '0.5.4' +gem 'carrierwave' +gem 'carrierwave-mongoid', :require => 'carrierwave/mongoid' gem 'ckeditor' gem 'devise' gem 'mini_magick' gem 'rubyzip' gem 'sinatra' gem 'execjs' -gem 'mongoid', :git => 'git://github.com/mongoid/mongoid.git', :ref => '7a915395db50e2bc6071a503a11530e644879e49' +gem 'mongoid' gem 'rake' gem 'jquery-rails' diff --git a/Gemfile.lock b/Gemfile.lock index 14d92fe07..27a3d794e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,13 +1,3 @@ -GIT - remote: git://github.com/mongoid/mongoid.git - revision: 7a915395db50e2bc6071a503a11530e644879e49 - ref: 7a915395db50e2bc6071a503a11530e644879e49 - specs: - mongoid (2.4.0) - activemodel (~> 3.1) - mongo (~> 1.3) - tzinfo (~> 0.3.22) - GEM remote: http://rubygems.org/ specs: @@ -46,8 +36,11 @@ GEM bson_ext (1.5.2) bson (= 1.5.2) builder (3.0.0) - carrierwave (0.5.4) + carrierwave (0.5.8) activesupport (~> 3.0) + carrierwave-mongoid (0.1.3) + carrierwave (>= 0.5.6) + mongoid (~> 2.1) chronic (0.6.6) ckeditor (3.6.3) mime-types (~> 1.16) @@ -96,6 +89,10 @@ GEM subexec (~> 0.1.0) mongo (1.5.2) bson (= 1.5.2) + mongoid (2.4.0) + activemodel (~> 3.1) + mongo (~> 1.3) + tzinfo (~> 0.3.22) multi_json (1.0.4) orm_adapter (0.0.5) polyglot (0.3.3) @@ -192,7 +189,8 @@ PLATFORMS DEPENDENCIES bson_ext - carrierwave (= 0.5.4) + carrierwave + carrierwave-mongoid ckeditor coffee-rails database_cleaner @@ -203,7 +201,7 @@ DEPENDENCIES factory_girl_rails jquery-rails mini_magick - mongoid! + mongoid radius rails rake diff --git a/config/initializers/carrierwave.rb b/config/initializers/carrierwave.rb index 1c7f73c16..2c46dd114 100644 --- a/config/initializers/carrierwave.rb +++ b/config/initializers/carrierwave.rb @@ -1,5 +1,3 @@ -require 'carrierwave/orm/mongoid' - begin db_config = YAML::load(File.read(File.join(Rails.root, "/config/mongoid.yml"))) rescue @@ -12,4 +10,6 @@ CarrierWave.configure do |config| config.grid_fs_port = db_config[Rails.env]['port'] config.storage = :grid_fs config.grid_fs_access_url = "/gridfs" -end \ No newline at end of file +end + +CarrierWave::SanitizedFile.sanitize_regexp = /[^[:word:]\.\-\+]/ From 9ea613cf4eb01d23573c5405a879f8528c15e8a1 Mon Sep 17 00:00:00 2001 From: Christophe Vilayphiou Date: Mon, 16 Jan 2012 08:14:05 +0800 Subject: [PATCH 13/26] Embed attribute_fields and sub_roles --- app/models/user/attribute.rb | 2 +- app/models/user/attribute_field.rb | 2 +- app/models/user/role.rb | 2 +- app/models/user/sub_role.rb | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/models/user/attribute.rb b/app/models/user/attribute.rb index af8a11064..846504218 100644 --- a/app/models/user/attribute.rb +++ b/app/models/user/attribute.rb @@ -7,7 +7,7 @@ class Attribute field :built_in, :type => Boolean, :default => false field :disabled, :type => Boolean, :default => false - has_many :attribute_fields, :autosave => true, :dependent => :destroy + embeds_many :attribute_fields, :cascade_callbacks => true has_one :i18n_variable, :as => :language_value, :autosave => true, :dependent => :destroy accepts_nested_attributes_for :attribute_fields, :allow_destroy => true diff --git a/app/models/user/attribute_field.rb b/app/models/user/attribute_field.rb index 42bbf9109..2d909b3e4 100644 --- a/app/models/user/attribute_field.rb +++ b/app/models/user/attribute_field.rb @@ -10,7 +10,7 @@ class AttributeField field :built_in, :type => Boolean, :default => false field :disabled, :type => Boolean, :default => false - belongs_to :attribute + embedded_in :attribute has_one :i18n_variable, :as => :language_value, :autosave => true, :dependent => :destroy has_many :attribute_values diff --git a/app/models/user/role.rb b/app/models/user/role.rb index 86f7266fc..788d281d2 100644 --- a/app/models/user/role.rb +++ b/app/models/user/role.rb @@ -7,7 +7,7 @@ class Role field :built_in, :type => Boolean, :default => false field :disabled, :type => Boolean, :default => false - has_many :sub_roles, :autosave => true, :dependent => :destroy + embeds_many :sub_roles, :cascade_callbacks => true has_one :i18n_variable, :as => :language_value, :autosave => true, :dependent => :destroy has_many :users accepts_nested_attributes_for :i18n_variable, :allow_destroy => true diff --git a/app/models/user/sub_role.rb b/app/models/user/sub_role.rb index cdefb5f50..47f3e2dee 100644 --- a/app/models/user/sub_role.rb +++ b/app/models/user/sub_role.rb @@ -1,6 +1,6 @@ class SubRole < Attribute - belongs_to :role + embedded_in :role has_and_belongs_to_many :users # Get an sub_role from key From 5f684ba0f4ada65315a73b3e2d90fd1981afde64 Mon Sep 17 00:00:00 2001 From: Christophe Vilayphiou Date: Tue, 24 Jan 2012 11:36:24 +0800 Subject: [PATCH 14/26] Change "_filename" to "_identifier" for carrierwave --- app/controllers/admin/designs_controller.rb | 8 ++++---- app/controllers/admin/purchases_controller.rb | 2 +- app/models/design/design.rb | 6 +++--- app/models/design/stylesheet.rb | 4 ++-- app/models/design/theme.rb | 2 +- app/views/admin/assets/_asset.html.erb | 2 +- app/views/admin/designs/_design_file.html.erb | 4 ++-- lib/parsers/parser_layout.rb | 2 +- 8 files changed, 15 insertions(+), 15 deletions(-) diff --git a/app/controllers/admin/designs_controller.rb b/app/controllers/admin/designs_controller.rb index 5930d1bfb..68fbb2436 100644 --- a/app/controllers/admin/designs_controller.rb +++ b/app/controllers/admin/designs_controller.rb @@ -46,7 +46,7 @@ class Admin::DesignsController < ApplicationController filename = params[:filename] files = @design.themes + @design.javascripts + @design.images file_to_removed = files.find{ |obj| - obj.file_filename == filename + obj.file_identifier == filename } type = file_to_removed._type new_file = "" @@ -103,7 +103,7 @@ class Admin::DesignsController < ApplicationController temp_file.write (zip_file.read entry ).force_encoding('UTF-8') default_css = design.build_default_css default_css.file = temp_file - default_css.file_filename = filename + default_css.file_identifier = filename default_css.to_save = true when /\A(#{zip_name})\/(reset\.css)\z/ #for reset css filename = File.basename(entry.to_s) @@ -111,7 +111,7 @@ class Admin::DesignsController < ApplicationController temp_file.write (zip_file.read entry ).force_encoding('UTF-8') reset_css = design.build_reset_css reset_css.file = temp_file - reset_css.file_filename = filename + reset_css.file_identifier = filename reset_css.to_save = true when /\A(#{zip_name})\/(layout\.html)\z/ #for layout html filename = File.basename(entry.to_s) @@ -135,7 +135,7 @@ class Admin::DesignsController < ApplicationController temp_file.write (zip_file.read entry).force_encoding('UTF-8') build_and_store = eval("design.#{type}").build build_and_store.file = temp_file - build_and_store.file_filename = filename + build_and_store.file_identifier = filename build_and_store.to_save = true end end diff --git a/app/controllers/admin/purchases_controller.rb b/app/controllers/admin/purchases_controller.rb index 40a042f44..00980cec0 100644 --- a/app/controllers/admin/purchases_controller.rb +++ b/app/controllers/admin/purchases_controller.rb @@ -172,7 +172,7 @@ class Admin::PurchasesController < ApplicationController def build_file(orig_zip, zip_name, dir, object, type = nil) - title = object.file_filename + title = object.file_identifier temp = File.new(dir + '/' + title, 'w+') temp.write orig_zip.read(zip_name + '/' + (type ? (type + '/') : '') + title) object.file = temp diff --git a/app/models/design/design.rb b/app/models/design/design.rb index e77f7f0ff..eb1f5e64f 100644 --- a/app/models/design/design.rb +++ b/app/models/design/design.rb @@ -31,7 +31,7 @@ class Design def files_with_duplicate? [self.javascripts, self.images,self.themes].each do |objects_hash| - ary = objects_hash.collect{ |k| k.file_filename} + ary = objects_hash.collect{ |k| k.file_identifier} ary.compact! # debugger return true if(ary.count!=ary.uniq.count) @@ -42,7 +42,7 @@ class Design def files_with_noname? [self.javascripts, self.images,self.themes].each do |objects_hash| objects_hash.each{ |k| - return true if(k.file_filename.nil? && !k.to_save?) + return true if(k.file_identifier.nil? && !k.to_save?) } end false @@ -121,7 +121,7 @@ class Design def process_object(object) if object.to_save - if object.file_filename.nil? + if object.file_identifier.nil? new_object = self.send(object._type.downcase.pluralize).build(object.attributes) new_object.file = object.file object.destroy diff --git a/app/models/design/stylesheet.rb b/app/models/design/stylesheet.rb index f26f15584..13fb154d3 100644 --- a/app/models/design/stylesheet.rb +++ b/app/models/design/stylesheet.rb @@ -11,14 +11,14 @@ class Stylesheet < DesignFile content.scan(/(?<=url)(.*?)(?=\))/){ css_name = $1.gsub(' ','').gsub('(','') name = File.basename(css_name).gsub(/[\\\"]/, '') - file_name = images.detect{ |i| i.file_filename.eql?(name) }.file_url rescue nil + file_name = images.detect{ |i| i.file_identifier.eql?(name) }.file_url rescue nil names << [css_name, file_name] } names.each do |name| content.gsub!(name[0], name[1]) if name[1] end Dir.mktmpdir('f_path') { |dir| - orig_file_name = self.file_filename + orig_file_name = self.file_identifier temp_file = File.new(dir + '/' + orig_file_name, 'w+') temp_file.write orig_content.force_encoding("UTF-8") diff --git a/app/models/design/theme.rb b/app/models/design/theme.rb index e69741818..dd4a6b01f 100644 --- a/app/models/design/theme.rb +++ b/app/models/design/theme.rb @@ -7,7 +7,7 @@ class Theme < Stylesheet protected def set_name - self.name = File.basename(self.file_filename,".css") + self.name = File.basename(self.file_identifier,".css") end end diff --git a/app/views/admin/assets/_asset.html.erb b/app/views/admin/assets/_asset.html.erb index 7aad2ef81..ea71dc6c0 100644 --- a/app/views/admin/assets/_asset.html.erb +++ b/app/views/admin/assets/_asset.html.erb @@ -5,7 +5,7 @@ <%= asset.description %> <%= asset.data.file.content_type %> - <%= asset.data_filename %> + <%= asset.data_identifier %> <%= number_to_human_size(asset.data.file.file_length) %> <%= link_to t(:edit), edit_admin_asset_path(asset), :remote => true, :class => 'edit' %> diff --git a/app/views/admin/designs/_design_file.html.erb b/app/views/admin/designs/_design_file.html.erb index c29450696..9e4945525 100644 --- a/app/views/admin/designs/_design_file.html.erb +++ b/app/views/admin/designs/_design_file.html.erb @@ -1,8 +1,8 @@ <%= f.label "field_name", t('admin.' + field_name) %>
      <% object.send(field_name).each do |t| %> -
    • > - <%= t.file_filename %> +
    • > + <%= t.file_identifier %> <% if classes.include?('r_destroy') %> <%= fields_for "design[" + field_name + "][]", t, :index => nil do |f| %> <%= f.hidden_field :id %> diff --git a/lib/parsers/parser_layout.rb b/lib/parsers/parser_layout.rb index e9eec7cc5..16def68b4 100644 --- a/lib/parsers/parser_layout.rb +++ b/lib/parsers/parser_layout.rb @@ -27,7 +27,7 @@ module ParserLayout layout.layout_parts.create(:name => tag.attr['name'], :editable => true) end c.define_tag 'image' do |tag| - image = layout.design.images.detect{ |i| i.file_filename.eql?(parse_html_image(tag.expand)) } + image = layout.design.images.detect{ |i| i.file_identifier.eql?(parse_html_image(tag.expand)) } image.update_attributes(:name => tag.attr['name'], :html_id => tag.attr['id'], :html_class => tag.attr['class']) end end From b04d845a5a3004b42d414b1588493abeba2a41db Mon Sep 17 00:00:00 2001 From: chris2tof Date: Thu, 29 Dec 2011 19:45:21 +0800 Subject: [PATCH 15/26] New rss.js from Harry and fix html form for assets --- app/assets/javascripts/rss.js | 4 ++-- app/views/admin/assets/_edit.html.erb | 10 +++++++--- app/views/admin/assets/_new.html.erb | 10 +++++++--- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/app/assets/javascripts/rss.js b/app/assets/javascripts/rss.js index 93b52140b..a9d8ff32a 100644 --- a/app/assets/javascripts/rss.js +++ b/app/assets/javascripts/rss.js @@ -429,7 +429,7 @@ modalWindow : function(settings,callbackFn){ tempwidth=maxwidth; rgWLeft=(rgmaskWidth-tempwidth)/2; } - tempwidth+=25; + tempwidth=parseInt(tempwidth)+25; $rss("#rgWindow").empty().show(); var closebtn = ""; if(closeBtn) @@ -508,7 +508,7 @@ modalWindowUpdate : function(settings,callbackFn){ tempwidth=maxwidth; rgWLeft=(rgmaskWidth-tempwidth)/2; } - tempwidth+=25; + tempwidth=parseInt(tempwidth)+25; $rss("#rgContent").empty(); $rss("#rgWindow").animate({"width":tempwidth+"px","height":tempheight+"px",top:rgWTop+"px", left:rgWLeft+"px"},500,function(){$rss("#rgContent").css("height",tempheight+"px").html(dhtml)}); $rss("#rgwindow_temp_div").remove(); diff --git a/app/views/admin/assets/_edit.html.erb b/app/views/admin/assets/_edit.html.erb index cc0a5c52b..33f8131cb 100644 --- a/app/views/admin/assets/_edit.html.erb +++ b/app/views/admin/assets/_edit.html.erb @@ -1,12 +1,16 @@

      <%= t('editing_asset') %>

      - <%= form_for @asset, :url => admin_asset_path(@asset), :html => {:id => 'ajaxForm', :multipart => true } do |f| %> + <%= form_for @asset, :url => admin_asset_path(@asset), :html => {:id => (is_html ? nil : 'ajaxForm'), :multipart => true } do |f| %> <%= f.error_messages %> <%= render :partial => "form", :locals => { :f => f } %>
      - <%= link_back if is_html %> - <%= t(:update) %> + <% if is_html %> + <%= link_back %> + <%= f.submit t(:edit) %> + <% else %> + <%= t(:edit) %> + <% end %>
      <% end %>
      \ No newline at end of file diff --git a/app/views/admin/assets/_new.html.erb b/app/views/admin/assets/_new.html.erb index 2f997a116..9653af6f4 100644 --- a/app/views/admin/assets/_new.html.erb +++ b/app/views/admin/assets/_new.html.erb @@ -1,12 +1,16 @@

      <%= t('admin.new_asset') %>

      - <%= form_for :asset, :url => admin_assets_path, :html => {:id => 'ajaxForm', :multipart => true }, :remote => true do |f| %> + <%= form_for :asset, :url => admin_assets_path, :html => {:id => (is_html ? nil : 'ajaxForm'), :multipart => true }, :remote => true do |f| %> <%= f.error_messages %> <%= render :partial => "form", :locals => { :f => f } %>
      - <%= link_back if is_html %> - <%= t(:create) %> + <% if is_html %> + <%= link_back %> + <%= f.submit t(:create) %> + <% else %> + <%= t(:create) %> + <% end %>
      <% end %>
      From 1bbb197fba7ad9dbc600d61fe0772ac4e66ce5de Mon Sep 17 00:00:00 2001 From: chris2tof Date: Fri, 30 Dec 2011 02:34:13 +0800 Subject: [PATCH 16/26] Forgot to remove ":remote => true" for asset new --- app/views/admin/assets/_new.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/admin/assets/_new.html.erb b/app/views/admin/assets/_new.html.erb index 9653af6f4..4f15fafce 100644 --- a/app/views/admin/assets/_new.html.erb +++ b/app/views/admin/assets/_new.html.erb @@ -1,7 +1,7 @@

      <%= t('admin.new_asset') %>

      - <%= form_for :asset, :url => admin_assets_path, :html => {:id => (is_html ? nil : 'ajaxForm'), :multipart => true }, :remote => true do |f| %> + <%= form_for :asset, :url => admin_assets_path, :html => {:id => (is_html ? nil : 'ajaxForm'), :multipart => true } do |f| %> <%= f.error_messages %> <%= render :partial => "form", :locals => { :f => f } %>
      From 04f51f2d98993ea4e9bfdfef5c46734bd4d9ec41 Mon Sep 17 00:00:00 2001 From: chris2tof Date: Fri, 13 Jan 2012 12:35:46 +0800 Subject: [PATCH 17/26] Update carrierwave #{column}_identifier must be used to get the name of the file --- Gemfile | 5 +++-- Gemfile.lock | 24 +++++++++++------------- config/initializers/carrierwave.rb | 6 +++--- 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/Gemfile b/Gemfile index d6f88b3ef..e4e69edef 100644 --- a/Gemfile +++ b/Gemfile @@ -3,14 +3,15 @@ gem 'rails','>=3.1.0' gem 'yajl-ruby', :require => 'yajl' gem 'bson_ext' -gem 'carrierwave', '0.5.4' +gem 'carrierwave' +gem 'carrierwave-mongoid', :require => 'carrierwave/mongoid' gem 'ckeditor' gem 'devise' gem 'mini_magick' gem 'rubyzip' gem 'sinatra' gem 'execjs' -gem 'mongoid', :git => 'git://github.com/mongoid/mongoid.git', :ref => '7a915395db50e2bc6071a503a11530e644879e49' +gem 'mongoid' gem 'rake','0.8.7' gem 'jquery-rails' diff --git a/Gemfile.lock b/Gemfile.lock index d7c74ccf4..9f4fce7e6 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,13 +1,3 @@ -GIT - remote: git://github.com/mongoid/mongoid.git - revision: 7a915395db50e2bc6071a503a11530e644879e49 - ref: 7a915395db50e2bc6071a503a11530e644879e49 - specs: - mongoid (2.4.0) - activemodel (~> 3.1) - mongo (~> 1.3) - tzinfo (~> 0.3.22) - GEM remote: http://rubygems.org/ specs: @@ -47,8 +37,11 @@ GEM bson_ext (1.5.2) bson (= 1.5.2) builder (3.0.0) - carrierwave (0.5.4) + carrierwave (0.5.8) activesupport (~> 3.0) + carrierwave-mongoid (0.1.3) + carrierwave (>= 0.5.6) + mongoid (~> 2.1) chronic (0.6.6) ckeditor (3.6.3) mime-types (~> 1.16) @@ -96,6 +89,10 @@ GEM subexec (~> 0.1.0) mongo (1.5.2) bson (= 1.5.2) + mongoid (2.4.0) + activemodel (~> 3.1) + mongo (~> 1.3) + tzinfo (~> 0.3.22) multi_json (1.0.4) orm_adapter (0.0.5) polyglot (0.3.3) @@ -192,7 +189,8 @@ PLATFORMS DEPENDENCIES bson_ext - carrierwave (= 0.5.4) + carrierwave + carrierwave-mongoid ckeditor coffee-rails database_cleaner @@ -203,7 +201,7 @@ DEPENDENCIES factory_girl_rails jquery-rails mini_magick - mongoid! + mongoid radius rails (>= 3.1.0) rake (= 0.8.7) diff --git a/config/initializers/carrierwave.rb b/config/initializers/carrierwave.rb index 11d91bdb9..2c46dd114 100644 --- a/config/initializers/carrierwave.rb +++ b/config/initializers/carrierwave.rb @@ -1,5 +1,3 @@ -#require 'carrierwave/orm/mongoid' - begin db_config = YAML::load(File.read(File.join(Rails.root, "/config/mongoid.yml"))) rescue @@ -12,4 +10,6 @@ CarrierWave.configure do |config| config.grid_fs_port = db_config[Rails.env]['port'] config.storage = :grid_fs config.grid_fs_access_url = "/gridfs" -end \ No newline at end of file +end + +CarrierWave::SanitizedFile.sanitize_regexp = /[^[:word:]\.\-\+]/ From bfd55277d761530da7b637dbfb4dd82e0a0c2839 Mon Sep 17 00:00:00 2001 From: Christophe Vilayphiou Date: Mon, 16 Jan 2012 08:14:05 +0800 Subject: [PATCH 18/26] Embed attribute_fields and sub_roles --- app/models/user/attribute.rb | 2 +- app/models/user/attribute_field.rb | 2 +- app/models/user/role.rb | 2 +- app/models/user/sub_role.rb | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/models/user/attribute.rb b/app/models/user/attribute.rb index af8a11064..846504218 100644 --- a/app/models/user/attribute.rb +++ b/app/models/user/attribute.rb @@ -7,7 +7,7 @@ class Attribute field :built_in, :type => Boolean, :default => false field :disabled, :type => Boolean, :default => false - has_many :attribute_fields, :autosave => true, :dependent => :destroy + embeds_many :attribute_fields, :cascade_callbacks => true has_one :i18n_variable, :as => :language_value, :autosave => true, :dependent => :destroy accepts_nested_attributes_for :attribute_fields, :allow_destroy => true diff --git a/app/models/user/attribute_field.rb b/app/models/user/attribute_field.rb index 42bbf9109..2d909b3e4 100644 --- a/app/models/user/attribute_field.rb +++ b/app/models/user/attribute_field.rb @@ -10,7 +10,7 @@ class AttributeField field :built_in, :type => Boolean, :default => false field :disabled, :type => Boolean, :default => false - belongs_to :attribute + embedded_in :attribute has_one :i18n_variable, :as => :language_value, :autosave => true, :dependent => :destroy has_many :attribute_values diff --git a/app/models/user/role.rb b/app/models/user/role.rb index 86f7266fc..788d281d2 100644 --- a/app/models/user/role.rb +++ b/app/models/user/role.rb @@ -7,7 +7,7 @@ class Role field :built_in, :type => Boolean, :default => false field :disabled, :type => Boolean, :default => false - has_many :sub_roles, :autosave => true, :dependent => :destroy + embeds_many :sub_roles, :cascade_callbacks => true has_one :i18n_variable, :as => :language_value, :autosave => true, :dependent => :destroy has_many :users accepts_nested_attributes_for :i18n_variable, :allow_destroy => true diff --git a/app/models/user/sub_role.rb b/app/models/user/sub_role.rb index cdefb5f50..47f3e2dee 100644 --- a/app/models/user/sub_role.rb +++ b/app/models/user/sub_role.rb @@ -1,6 +1,6 @@ class SubRole < Attribute - belongs_to :role + embedded_in :role has_and_belongs_to_many :users # Get an sub_role from key From 5518ae362d06cd7e2222ae63892d5eb7580d45f9 Mon Sep 17 00:00:00 2001 From: Christophe Vilayphiou Date: Tue, 24 Jan 2012 11:38:53 +0800 Subject: [PATCH 19/26] Ray's modification before redesign --- app/assets/images/PIE.htc | 96 ++ app/assets/images/bar_orbit.png | Bin 4619 -> 6475 bytes app/assets/images/service_btn.png | Bin 5037 -> 3307 bytes app/assets/javascripts/rc.js | 120 +++ app/assets/javascripts/rss.js | 8 +- app/assets/javascripts/site_editor.js | 3 +- app/assets/stylesheets/admin_back_end.css.erb | 145 ++- app/assets/stylesheets/reset.css | 4 + app/assets/stylesheets/site_items.css.erb | 925 +++++++++--------- app/controllers/pages_controller.rb | 8 +- app/views/admin/assets/_asset.html.erb | 2 +- app/views/admin/assets/_form.html.erb | 2 +- app/views/admin/assets/_new.html.erb | 2 +- .../admin/users/_sub_role_selector.html.erb | 4 +- app/views/layouts/admin.html.erb | 68 +- app/views/layouts/site_editor.html.erb | 70 +- config/environments/development.rb | 2 +- lib/parsers/parser_back_end.rb | 2 +- lib/parsers/parser_common.rb | 47 +- lib/parsers/parser_front_end.rb | 4 +- lib/tasks/pages.rake | 66 ++ 21 files changed, 1000 insertions(+), 578 deletions(-) create mode 100644 app/assets/images/PIE.htc create mode 100644 app/assets/javascripts/rc.js create mode 100644 lib/tasks/pages.rake diff --git a/app/assets/images/PIE.htc b/app/assets/images/PIE.htc new file mode 100644 index 000000000..00b63838a --- /dev/null +++ b/app/assets/images/PIE.htc @@ -0,0 +1,96 @@ + + + + + + + + + diff --git a/app/assets/images/bar_orbit.png b/app/assets/images/bar_orbit.png index feaca6b838d4de02fa3342e964663236fc40498c..eb0c95ee0ce7368e019c83542c9ee8fe9b2f1814 100644 GIT binary patch literal 6475 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
      xwAwuvJZX@ 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 YPW5A2c8Kf^a$5z|m35RF6s#lu57Kg1{{R30 literal 4619 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'+t+''); + $(this).find('.td').show().css('display','inline-block'); + $(document).mousemove(function(e){ + $(this).find('.td').css({ + left: e.pageX - p.left + 16, + top: e.pageY - p.top - th - 20 + }); + }); + }) + .mouseout(function(){ + $(this).find('.td').hide().detach(); + }); + }); +} + +function accordion(){ + if( !$('.rc_accor').length ){ + return; + } + $('.rc_accor').each(function(){ + $(this).find('.ac_ctrl:first').addClass('recent'); + $(this).find('.ac_content:not(:first)').hide(); + if($(this).hasClass('av')){ + $(this).find('.ac_ctrl').click(function(){ + var index = $(this).parents('.av').find('.ac_ctrl').index(this); + $(this).siblings('.ac_ctrl').removeClass('recent'); + $(this).addClass('recent'); + $(this).parents('.rc_accor').find('.ac_content:not(:eq('+index+'))').stop().slideUp(); + $(this).parents('.rc_accor').find('.ac_content:eq('+index+')').stop().slideToggle(); + return false; + }); + } else if($(this).hasClass('ah')){ + var w = $(this).find('.ac_content').css('width'); + $(this).find('.ac_content:not(:eq(0))').css({width:0}); + $(this).find('.ac_ctrl').click(function(){ + var index = $(this).parents('.ah').find('.ac_ctrl').index(this); + $(this).siblings('.ac_ctrl').removeClass('recent'); + $(this).addClass('recent'); + $(this).parents('.rc_accor').find('.ac_content:not(:eq('+index+'))').stop().animate({width:0}); + $(this).parents('.rc_accor').find('.ac_content:eq('+index+')').stop().show().animate({width:w}); + return false; + }); + } + + + + }); +} diff --git a/app/assets/javascripts/rss.js b/app/assets/javascripts/rss.js index a9d8ff32a..737b08b71 100644 --- a/app/assets/javascripts/rss.js +++ b/app/assets/javascripts/rss.js @@ -393,9 +393,9 @@ modalWindow : function(settings,callbackFn){ }else{tempwidth="auto";} $rss("body").append('
      '); - $rss("#rgsheath").css({background: "#000", width: "100%", position: "fixed", top: 0, left: 0,opacity:0.9,'z-index':199}); + $rss("#rgsheath").css({background: "#000", width: "100%", position: "fixed", top: 0, left: 0,opacity:0.5,'z-index':199}); $rss("body").append('
      '); - $rss("#rgWindow").css({"position": "fixed", "z-index": "999", "background": "#fff", "border": "solid 3px #ccc", "padding": "20px", "overflow": "hidden", "border-radius": "12px", "-webkit-border-radius": "12px", "-moz-border-radius": "12px", "-ms-border-radius": "12px", "box-shadow": "0 0 20px rgba(0,0,0,0.9)","-webkit-box-shadow": "0 0 20px rgba(0,0,0,0.9)","-moz-box-shadow": "0 0 20px rgba(0,0,0,0.9)","-ms-box-shadow": "0 0 20px rgba(0,0,0,0.9)"}); + $rss("#rgWindow").css({"position": "fixed", "z-index": "999", "background": "#fff", "border": "solid 1px #ccc", "padding": "10px", "border-radius": "5px", "-webkit-border-radius": "5px", "-moz-border-radius": "5px", "-ms-border-radius": "5px", "box-shadow": "0 0 20px rgba(0,0,0,0.7)","-webkit-box-shadow": "0 0 20px rgba(0,0,0,0.7)","-moz-box-shadow": "0 0 20px rgba(0,0,0,0.7)","-ms-box-shadow": "0 0 20px rgba(0,0,0,0.7)"}); var rgWTop = (rgmaskHeight-20)/2; var rgWLeft = (rgmaskWidth-20)/2; $rss("#rgWindow").css({top:rgWTop+"px", left:rgWLeft+"px"}); @@ -433,8 +433,8 @@ modalWindow : function(settings,callbackFn){ $rss("#rgWindow").empty().show(); var closebtn = ""; if(closeBtn) - closebtn='X'; - $rss("#rgWindow").animate({"width":tempwidth+"px","height":tempheight+"px",top:rgWTop+"px", left:rgWLeft+"px"},500,function(){$rss("#rgWindow").html(closebtn+"
      "+dhtml+"
      "); + closebtn='X'; + $rss("#rgWindow").animate({"width":tempwidth+"px","height":tempheight+"px",top:rgWTop+"px", left:rgWLeft+"px"},500,function(){$rss("#rgWindow").html(closebtn+"
      "+dhtml+"
      "); $rss("#close_modal").mouseover(function(){$rss(this).css("color","#999");}).mouseout(function(){$rss(this).css("color","#666");}) $rss("#close_modal").click(function(){ $rss("#rgWindow").empty(); diff --git a/app/assets/javascripts/site_editor.js b/app/assets/javascripts/site_editor.js index 98405564c..ef4acc855 100644 --- a/app/assets/javascripts/site_editor.js +++ b/app/assets/javascripts/site_editor.js @@ -7,4 +7,5 @@ //= require jquery //= require jquery_ujs //= require page_edit -//= require side_bar_history \ No newline at end of file +//= require side_bar_history +//= require rc \ No newline at end of file diff --git a/app/assets/stylesheets/admin_back_end.css.erb b/app/assets/stylesheets/admin_back_end.css.erb index 405281b49..5aecff454 100644 --- a/app/assets/stylesheets/admin_back_end.css.erb +++ b/app/assets/stylesheets/admin_back_end.css.erb @@ -14,39 +14,69 @@ body{ } #back_banner_link{ - background: url(<%= asset_path "orbitbar1.png" %>) repeat-x scroll 0 0; - height: 50px; - left: 0; - position: fixed; - top: 0; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0, #787e82), color-stop(0.05, #61676c), color-stop(1, #292c2d) ); + background:-moz-linear-gradient( center top -90deg, #787e82 0%, #61676c 5%, #292c2d 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#61676c', endColorstr='#292c2d'); + -moz-box-shadow: 0px 1px 5px 0px rgba(0,0,0,.7); + -webkit-box-shadow: 0px 1px 5px 0px rgba(0,0,0,.7); + box-shadow: 0px 1px 5px 0px rgba(0,0,0,.7); + border-top: 1px solid #474a4c; + border-bottom: 1px solid #1d2020; + height: 41px; width: 100%; - z-index: 5; + behavior: url(<%= asset_path "PIE.htc" %>); } .hmenu{ - height: 40px; - position: absolute; - right: 0; - top: 1px; - width: 250px; + float: right; + height: 41px; } #back_orbit{ - background: url(<%= asset_path "bar_orbit.png" %>) no-repeat scroll 0 0 transparent; - cursor:pointer; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0, #70787d), color-stop(1, #3b4043) ); + background:-moz-linear-gradient( center top -90deg, #70787d 0%, #3b4043 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#70787d', endColorstr='#3b4043'); + -webkit-border-radius: 0px 0px 5px 5px; + -moz-border-radius: 0px 0px 5px 5px; + border-radius: 0px 0px 5px 5px; + -moz-box-shadow: 0px 1px 1px 0px rgba(0,0,0,.7); + -webkit-box-shadow: 0px 1px 1px 0px rgba(0,0,0,.7); + box-shadow: 0px 1px 1px 0px rgba(0,0,0,.7); + cursor: pointer; + float: left; height: 43px; - left: 10px; - position: relative; + margin-left: 10px; width: 41px; + behavior: url(<%= asset_path "PIE.htc" %>); +} +#back_orbit span{ + text-indent: -9999px; + background: url(<%= asset_path "bar_orbit.png" %>) no-repeat scroll 0 0 transparent; + display: block; + height: 43px; + width: 100%; } #back_orbit:hover{ - background-position:0 -43px; - box-shadow: 0 3px 3px #000000; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0, #fefefe), color-stop(1, #e4e4e4) ); + background:-moz-linear-gradient( center top -90deg, #fefefe 0%, #e4e4e4 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fefefe', endColorstr='#e4e4e4'); + -webkit-border-radius: 0px; + -moz-border-radius: 0px; + border-radius: 0px; +} +#back_orbit:hover span{ + background-position: 0 -44px; } #back_orbit:hover #orblist{ display:block; } #orblist{ - background: none repeat scroll 0 0 #FFFFFF; - border-radius: 0 3px 3px 3px; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0, #e4e4e4), color-stop(1, #FFFFFF) ); + background:-moz-linear-gradient( center top -90deg, #e4e4e4 0%, #FFFFFF 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e4e4e4', endColorstr='#FFFFFF'); + -webkit-border-radius: 0px 3px 3px 3px; + -moz-border-radius: 0px 3px 3px 3px; + border-radius: 0px 3px 3px 3px; + -webkit-box-shadow: 0 3px 3px #000000; + -moz-box-shadow: 0 3px 3px #000000; box-shadow: 0 3px 3px #000000; display: none; margin: 0; @@ -70,30 +100,37 @@ body{ background:#eee; color:#333; } - +#log_out{ + -moz-box-shadow:inset 1px 0px 0px 0px #73777b; + -webkit-box-shadow:inset 1px 0px 0px 0px #73777b; + box-shadow:inset 1px 0px 0px 0px #73777b; + border-right:1px solid #41474c; + border-left:1px solid #41474c; + float:right; + width:41px; + height:41px; +} +#log_out:hover{ + background:-webkit-gradient( linear, left top, left bottom, color-stop(0, #01afde), color-stop(1, #007ec6) ); + background:-moz-linear-gradient( center top -90deg, #01afde 0%, #007ec6 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#01afde', endColorstr='#007ec6'); +} #log_out a{ background: url(<%= asset_path "service_btn.png" %>) no-repeat scroll right 0 transparent; - border: medium none !important; - display: block !important; - height: 40px !important; - line-height: normal !important; - padding: 0 !important; - position: absolute; - right: 0px; - text-indent: -10000px; - top: 0px; - width: 43px !important; + display: block; + height: 41px; + text-indent: -9999px; + width: 41px; } #log_out a:hover{ background: url(<%= asset_path "service_btn.png" %>) no-repeat scroll right bottom transparent !important; } .lang{ - color: #FFFFFF; - font-size: 15px; - line-height: 40px; - position: absolute; - right: 55px; - top: 0; + color: #FFFFFF; + float: right; + font-size: 15px; + line-height: 40px; + margin-right: 10px; } .lang a{ color:#fff; @@ -589,4 +626,40 @@ hr.student_block { position: absolute; top: -15%; width: 130%; +} +#rgContent .main2{ + padding:0; +} +#rgContent h1{ + border-bottom: 1px dashed #CCCCCC; + color: #333333; + font-size: 19px; + font-weight: bold; + margin: 0 0 20px; + padding: 0 0 10px; + text-align: center; +} +#rgContent label { + color: #888888; + display: block; + font-size: 12px; + margin: 25px 0 5px; + width: 100%; +} +#rgContent input { + color: #888888; + width: 98%; +} +#rgContent .button_bar { + float: none; + text-align: center; + width:100%; + margin:30px 0 0; +} +#rgContent .button_bar a { + float: none; + display:block; +} +#close_modal{ + display:none !important; } \ No newline at end of file diff --git a/app/assets/stylesheets/reset.css b/app/assets/stylesheets/reset.css index 44f2ae777..612cab191 100644 --- a/app/assets/stylesheets/reset.css +++ b/app/assets/stylesheets/reset.css @@ -42,3 +42,7 @@ input:focus, select:focus, textarea:focus { height:0; visibility:hidden; } +.fixed { + position: fixed; + z-index: 100; +} \ No newline at end of file diff --git a/app/assets/stylesheets/site_items.css.erb b/app/assets/stylesheets/site_items.css.erb index 151dabdee..38b0a1855 100644 --- a/app/assets/stylesheets/site_items.css.erb +++ b/app/assets/stylesheets/site_items.css.erb @@ -1,445 +1,482 @@ -html, body{ - height: 100%; - margin: 0; - padding: 0; -} -html{ - background: url(<%= asset_path "body.jpg" %>) no-repeat fixed 0 0 transparent; - background-size: cover; -} - -body{ - color: #000000; - font-family: Helvetica, '微軟正黑體'; -} -#back_banner_link{ - background: url(<%= asset_path "orbitbar1.png" %>) repeat-x scroll 0 0; - height: 50px; - left: 0; - position: fixed; - top: 0; - width: 100%; - z-index: 5; -} -.hmenu{ - height: 40px; - position: absolute; - right: 0; - top: 1px; - width: 250px; -} -#back_orbit{ - background: url(<%= asset_path "bar_orbit.png" %>) no-repeat scroll 0 0 transparent; - cursor:pointer; - height: 43px; - left: 10px; - position: relative; - width: 41px; -} -#back_orbit:hover{ - background-position:0 -43px; - box-shadow: 0 3px 3px #000000; -} -#back_orbit:hover #orblist{ - display:block; -} -#orblist{ - background: none repeat scroll 0 0 #FFFFFF; - border-radius: 0 3px 3px 3px; - box-shadow: 0 3px 3px #000000; - display: none; - margin: 0; - padding: 10px; - position: absolute; - top: 43px; - width: 130px; -} -#orblist li{ - border-bottom:1px solid #aaa; - list-style:none; -} -.orblink{ - color: #333333; - display: block; - font: 12px/100% arial,sans-serif; - padding: 5px; - text-decoration: none; -} -.orblink:hover{ - background:#eee; - color:#333; -} - -#log_out a{ - background: url(<%= asset_path "service_btn.png" %>) no-repeat scroll right 0 transparent; - border: medium none !important; - display: block !important; - height: 40px !important; - line-height: normal !important; - padding: 0 !important; - position: absolute; - right: 0px; - text-indent: -10000px; - top: 0px; - width: 43px !important; -} -#log_out a:hover{ - background: url(<%= asset_path "service_btn.png" %>) no-repeat scroll right bottom transparent !important; -} -.lang{ - color: #FFFFFF; - font-size: 15px; - line-height: 40px; - position: absolute; - right: 55px; - top: 0; -} -.lang a{ - color:#fff; - text-decoration:none; -} -.lang a:hover{ - text-decoration:underline; -} -#back_content{ - height: 100%; -} -#back_footer{ - background-color: #101010; - bottom: 0; - color: #FFFFFF; - font-size: 11px; - padding: 10px; - position: fixed; - width: 100%; - left: 0; - box-shadow: 0 -3px 4px #000; -} -.items_setup{ - padding:42px 0 0 0; -} -#back_sidebar .items_setup .list li{ - padding: 6px 0 7px 5px; -} -#back_sidebar .items_setup .list li a{ - display: inline; - font-size: 0.9em; - padding: 0; -} -#back_sidebar .items_setup .list li a span{ - background:none; - padding:0; - text-shadow:none; -} -.main { - background: none repeat scroll 0 0 #FFFFFF; - height: 100%; - margin-left: 220px; - padding: 0 40px; - position: relative; -} -.main_list { - padding-top: 70px; -} -.main_list ul { - clear:both; -} -#porfile { - padding-top: 100px; -} -/*add_buttom*/ -.button_bar { - float: right; - -moz-box-shadow:inset 0px 1px 0px 0px #666, 0px 0px 3px black; - -webkit-box-shadow:inset 0px 1px 0px 0px #666, 0px 0px 3px black; - box-shadow:inset 0px 1px 0px 0px #666, 0px 0px 3px black; - background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #4f4f4f), color-stop(1, #000000) ); - background:-moz-linear-gradient( center top, #4f4f4f 5%, #000000 100% ); - filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#4f4f4f', endColorstr='#000000'); - background-color:#4f4f4f; - -moz-border-radius:5px; - -webkit-border-radius:5px; - border-radius:5px; - display:inline-block; - padding:0; - margin:10px 0 60px; -} -.button_bar a { - text-decoration:none; - text-shadow:0px -1px 0px #000000; - font-size:12px; - color:#EDEDED; - border-right:1px solid #555; - -moz-box-shadow:1px 0px 0px black; - -webkit-box-shadow:1px 0px 0px black; - box-shadow:1px 0px 0px black; - padding: 6px 10px 4px; - display: inline-block; - float: left; -} -.button_bar a:active { - padding: 7px 10px 3px !important; - text-shadow:0px 1px 0px #000000; - background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #000000), color-stop(1, #4f4f4f) ); - background:-moz-linear-gradient( center top, #000000 5%, #4f4f4f 100% ); - filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#000000', endColorstr='#4f4f4f'); -} -.button_bar a:last-child { - border-right:none; - -moz-box-shadow:none; - -webkit-box-shadow:none; - box-shadow:none; - -moz-border-radius:0px 5px 5px 0px; - -webkit-border-radius:0px 5px 5px 0px; - border-radius:0px 5px 5px 0px; -} -.button_bar a:first-child { - -moz-border-radius:5px 0px 0px 5px; - -webkit-border-radius:5px 0px 0px 5px; - border-radius:5px 0px 0px 5px; -} -.button_bar a.new { - padding: 5px 10px; - -moz-border-radius:5px; - -webkit-border-radius:5px; - border-radius:5px; -} -.button_bar a:hover { - color:#FFFFFF; -} -.up { - margin:10px 0; -} -#person { - left: 245px; - position: fixed; - text-align: center; - top: 75px; - width: 140px; - background-color:#FFF; - padding:15px; - border-radius: 5px; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - -moz-box-shadow: 0px 0px 4px #180902; /* Firefox */ - -webkit-box-shadow: 0px 0px 4px #180902;/* Safari 和 Chrome */ - box-shadow: 0px 0px 4px #180902; /* Opera 10.5 + */ -} -#file { - display:none; -} -#person img { -} -.user_mail { - border: medium none; - border:1px solid #DDDDDD; - color: #666666; - font-size: 12px; - width: 140px; -} -#person label { - display: block; - margin: 15px 0 0; -} -#person label input { -} -#person label #user_admin { - float:right; - margin: 0; -} -#person label span { - text-align:left; - font-size:11px; - color:#888; - display:block; -} -#person select { - border: 1px solid #DDDDDD; - padding: 0; - width: 140px; -} -#porfile .users{ - margin-left: 180px; -} -.roles_block { - background: url(<%= asset_path "75.png" %>) repeat left top; - min-width:710px; - margin-bottom:50px; - position:relative; - padding-bottom: 20px; - border-radius: 5px; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - -moz-box-shadow: 0px 0px 4px #180902; /* Firefox */ - -webkit-box-shadow: 0px 0px 4px #180902;/* Safari 和 Chrome */ - box-shadow: 0px 0px 4px #180902; /* Opera 10.5 + */ -} -.roles_block h2 { - color: #FFFFFF; - font-weight: normal; - margin: 0; - padding: 0; - position: absolute; - text-shadow: 0 3px 2px #000000; - top: -30px; -} -.main hr { - height:8px; - border:none; - margin:0; - border-radius: 5px 5px 0px 0px; - -moz-border-radius: 5px 5px 0px 0px; - -webkit-border-radius: 5px 5px 0px 0px; - border-bottom:1px solid #000; -} -.main2{ - padding:70px 0 0; -} -#basic_block hr { - background-color: #666666; -} -#teacher_block hr { - background-color: #0071A9; -} -#student_block hr { - background-color: #AF0045; -} -.info_input { - padding:10px 20px; -} -.info_input table { - color:#fff; - width:100%; - font-size:14px; -} -.info_input table td { - padding:5px 10px 5px 0; - width: 10%; -} -.info_input .list_head { - background:url(<%= asset_path "line.png" %>) left bottom repeat-x; -} -.info_input .list_head td { -} -.info_input .list_item { - color:#AEAEAE; -} -.info_input .add { - display:block; - padding-left:22px; - font-size:12px; - line-height:21px; - height:19px; - background:url(<%= asset_path "icon.png" %>) no-repeat -59px 0; - margin-top: 10px; - color: #DDDDDD; -} - -.main table { - width:100%; -} -.main td { - padding-left:20px; - color:#fff; - font-size:14px; - line-height:40px; -} -.main tr.have td{ - background: url(<%= asset_path "75.png" %>) repeat left top; -} -.main tr.have td:first-child{ - border-radius: 5px 0 0 5px; - -moz-border-radius: 5px 0 0 5px; - -webkit-border-radius: 5px 0 0 5px; -} -.main tr.have td:last-child{ - border-radius: 0 5px 5px 0; - -moz-border-radius: 0 5px 5px 0; - -webkit-border-radius: 0 5px 5px 0; -} -.main thead td { - line-height:40px; - font-size:16px; - text-shadow: 0px 1px 1px #3e2914; -} -.main thead td.action { - width:140px; -} -.main tbody td.roles { - background-image: url(<%= asset_path "roles_type.jpg" %>); - background-repeat: repeat-x; -} -.main tbody td.teacher { - background-position: 0 -54px; -} -.main tbody td.student { - background-position: 0 -5px; -} -.main tbody td.action a { - background-image: url(<%= asset_path "icon.png" %>); - display: inline-block; - height: 19px; - margin-right: 10px; - top: 8px; - text-indent: -9999px; - width: 19px; - position: relative; -} -.main tbody td.action a.show { - background-position: left top; -} -.main tbody td.action a.show:hover { - background-position: left -19px; -} -.main tbody td.action a.edit { - background-position: -19px top; -} -.main tbody td.action a.edit:hover { - background-position: -19px -19px; -} -.main tbody td.action a.delete { - background-position: -38px top; -} -.main tbody td.action a.delete:hover { - background-position: -38px -19px; -} -.main tbody td.action a.switch { - background: url(<%= asset_path "switch.png" %>) no-repeat left 3px; - width: 40px; -} -.main tbody tr.disable td.action a.switch { - background-position:left bottom; -} -.main tbody td.action a.delete:hover { - background-position: -38px -19px; -} -.main tbody tr.have { -} -.main tbody tr.disable { - opacity: 0.7; -} -.main tbody tr { - background:none; - height:15px; -} -h1{ - margin:0 0 20px; -} -p{ - margin:0 0 10px; -} - -#back_sidebar .items_setup .list li{ - background:url(<%= asset_path "sidebar_li2.jpg" %>) repeat left top; - border:none; - padding: 0 0 0 5px; -} -#back_sidebar .items_setup .list li a{ - line-height:31px; -} -#back_sidebar .items_setup .list li:hover{ - background:url(<%= asset_path "sidebar_li2.jpg" %>) repeat left top; - border:none; -} -#back_sidebar .items_setup ul .list { +html, body{ + height: 100%; + margin: 0; + padding: 0; +} +html{ + background: url(<%= asset_path "body.jpg" %>) no-repeat fixed 0 0 transparent; + background-size: cover; +} + +body{ + color: #000000; + font-family: Helvetica, '微軟正黑體'; +} +#back_banner_link{ + background:-webkit-gradient( linear, left top, left bottom, color-stop(0, #787e82), color-stop(0.05, #61676c), color-stop(1, #292c2d) ); + background:-moz-linear-gradient( center top -90deg, #787e82 0%, #61676c 5%, #292c2d 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#61676c', endColorstr='#292c2d'); + -moz-box-shadow: 0px 1px 5px 0px rgba(0,0,0,.7); + -webkit-box-shadow: 0px 1px 5px 0px rgba(0,0,0,.7); + box-shadow: 0px 1px 5px 0px rgba(0,0,0,.7); + border-top: 1px solid #474a4c; + border-bottom: 1px solid #1d2020; + height: 41px; + width: 100%; + behavior: url(<%= asset_path "PIE.htc" %>); +} +.hmenu{ + float: right; + height: 41px; +} +#back_orbit{ + background:-webkit-gradient( linear, left top, left bottom, color-stop(0, #70787d), color-stop(1, #3b4043) ); + background:-moz-linear-gradient( center top -90deg, #70787d 0%, #3b4043 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#70787d', endColorstr='#3b4043'); + -webkit-border-radius: 0px 0px 5px 5px; + -moz-border-radius: 0px 0px 5px 5px; + border-radius: 0px 0px 5px 5px; + -moz-box-shadow: 0px 1px 1px 0px rgba(0,0,0,.7); + -webkit-box-shadow: 0px 1px 1px 0px rgba(0,0,0,.7); + box-shadow: 0px 1px 1px 0px rgba(0,0,0,.7); + cursor: pointer; + float: left; + height: 43px; + margin-left: 10px; + width: 41px; + behavior: url(<%= asset_path "PIE.htc" %>); +} +#back_orbit span{ + text-indent: -9999px; + background: url(<%= asset_path "bar_orbit.png" %>) no-repeat scroll 0 0 transparent; + display: block; + height: 43px; + width: 100%; +} +#back_orbit:hover{ + background:-webkit-gradient( linear, left top, left bottom, color-stop(0, #fefefe), color-stop(1, #e4e4e4) ); + background:-moz-linear-gradient( center top -90deg, #fefefe 0%, #e4e4e4 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fefefe', endColorstr='#e4e4e4'); + -webkit-border-radius: 0px; + -moz-border-radius: 0px; + border-radius: 0px; +} +#back_orbit:hover span{ + background-position: 0 -44px; +} +#back_orbit:hover #orblist{ + display:block; +} +#orblist{ + background:-webkit-gradient( linear, left top, left bottom, color-stop(0, #e4e4e4), color-stop(1, #FFFFFF) ); + background:-moz-linear-gradient( center top -90deg, #e4e4e4 0%, #FFFFFF 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e4e4e4', endColorstr='#FFFFFF'); + -webkit-border-radius: 0px 3px 3px 3px; + -moz-border-radius: 0px 3px 3px 3px; + border-radius: 0px 3px 3px 3px; + -webkit-box-shadow: 0 3px 3px #000000; + -moz-box-shadow: 0 3px 3px #000000; + box-shadow: 0 3px 3px #000000; + display: none; + margin: 0; + padding: 10px; + position: absolute; + top: 43px; + width: 130px; +} +#orblist li{ + border-bottom:1px solid #aaa; + list-style:none; +} +.orblink{ + color: #333333; + display: block; + font: 12px/100% arial,sans-serif; + padding: 5px; + text-decoration: none; +} +.orblink:hover{ + background:#eee; + color:#333; +} +#log_out{ + -moz-box-shadow:inset 1px 0px 0px 0px #73777b; + -webkit-box-shadow:inset 1px 0px 0px 0px #73777b; + box-shadow:inset 1px 0px 0px 0px #73777b; + border-right:1px solid #41474c; + border-left:1px solid #41474c; + float:right; + width:41px; + height:41px; +} +#log_out:hover{ + background:-webkit-gradient( linear, left top, left bottom, color-stop(0, #01afde), color-stop(1, #007ec6) ); + background:-moz-linear-gradient( center top -90deg, #01afde 0%, #007ec6 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#01afde', endColorstr='#007ec6'); +} +#log_out a{ + background: url(<%= asset_path "service_btn.png" %>) no-repeat scroll right 0 transparent; + display: block; + height: 41px; + text-indent: -9999px; + width: 41px; +} +#log_out a:hover{ + background: url(<%= asset_path "service_btn.png" %>) no-repeat scroll right bottom transparent !important; +} +.lang{ + color: #FFFFFF; + float: right; + font-size: 15px; + line-height: 40px; + margin-right: 10px; +} +.lang a{ + color:#fff; + text-decoration:none; +} +.lang a:hover{ + text-decoration:underline; +} +#back_content{ + height: 100%; +} +#back_footer{ + background-color: #101010; + bottom: 0; + color: #FFFFFF; + font-size: 11px; + padding: 10px; + position: fixed; + width: 100%; + left: 0; + box-shadow: 0 -3px 4px #000; +} +.items_setup{ + padding:42px 0 0 0; +} +#back_sidebar .items_setup .list li{ + padding: 6px 0 7px 5px; +} +#back_sidebar .items_setup .list li a{ + display: inline; + font-size: 0.9em; + padding: 0; +} +#back_sidebar .items_setup .list li a span{ + background:none; + padding:0; + text-shadow:none; +} +.main { + background: none repeat scroll 0 0 #FFFFFF; + height: 100%; + margin-left: 220px; + padding: 0 40px; + position: relative; +} +.main_list { + padding-top: 70px; +} +.main_list ul { + clear:both; +} +#porfile { + padding-top: 100px; +} +/*add_buttom*/ +.button_bar { + float: right; + -moz-box-shadow:inset 0px 1px 0px 0px #666, 0px 0px 3px black; + -webkit-box-shadow:inset 0px 1px 0px 0px #666, 0px 0px 3px black; + box-shadow:inset 0px 1px 0px 0px #666, 0px 0px 3px black; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #4f4f4f), color-stop(1, #000000) ); + background:-moz-linear-gradient( center top, #4f4f4f 5%, #000000 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#4f4f4f', endColorstr='#000000'); + background-color:#4f4f4f; + -moz-border-radius:5px; + -webkit-border-radius:5px; + border-radius:5px; + display:inline-block; + padding:0; + margin:10px 0 60px; +} +.button_bar a { + text-decoration:none; + text-shadow:0px -1px 0px #000000; + font-size:12px; + color:#EDEDED; + border-right:1px solid #555; + -moz-box-shadow:1px 0px 0px black; + -webkit-box-shadow:1px 0px 0px black; + box-shadow:1px 0px 0px black; + padding: 6px 10px 4px; + display: inline-block; + float: left; +} +.button_bar a:active { + padding: 7px 10px 3px !important; + text-shadow:0px 1px 0px #000000; + background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #000000), color-stop(1, #4f4f4f) ); + background:-moz-linear-gradient( center top, #000000 5%, #4f4f4f 100% ); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#000000', endColorstr='#4f4f4f'); +} +.button_bar a:last-child { + border-right:none; + -moz-box-shadow:none; + -webkit-box-shadow:none; + box-shadow:none; + -moz-border-radius:0px 5px 5px 0px; + -webkit-border-radius:0px 5px 5px 0px; + border-radius:0px 5px 5px 0px; +} +.button_bar a:first-child { + -moz-border-radius:5px 0px 0px 5px; + -webkit-border-radius:5px 0px 0px 5px; + border-radius:5px 0px 0px 5px; +} +.button_bar a.new { + padding: 5px 10px; + -moz-border-radius:5px; + -webkit-border-radius:5px; + border-radius:5px; +} +.button_bar a:hover { + color:#FFFFFF; +} +.up { + margin:10px 0; +} +#person { + left: 245px; + position: fixed; + text-align: center; + top: 75px; + width: 140px; + background-color:#FFF; + padding:15px; + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + -moz-box-shadow: 0px 0px 4px #180902; /* Firefox */ + -webkit-box-shadow: 0px 0px 4px #180902;/* Safari 和 Chrome */ + box-shadow: 0px 0px 4px #180902; /* Opera 10.5 + */ +} +#file { + display:none; +} +#person img { +} +.user_mail { + border: medium none; + border:1px solid #DDDDDD; + color: #666666; + font-size: 12px; + width: 140px; +} +#person label { + display: block; + margin: 15px 0 0; +} +#person label input { +} +#person label #user_admin { + float:right; + margin: 0; +} +#person label span { + text-align:left; + font-size:11px; + color:#888; + display:block; +} +#person select { + border: 1px solid #DDDDDD; + padding: 0; + width: 140px; +} +#porfile .users{ + margin-left: 180px; +} +.roles_block { + background: url(<%= asset_path "75.png" %>) repeat left top; + min-width:710px; + margin-bottom:50px; + position:relative; + padding-bottom: 20px; + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + -moz-box-shadow: 0px 0px 4px #180902; /* Firefox */ + -webkit-box-shadow: 0px 0px 4px #180902;/* Safari 和 Chrome */ + box-shadow: 0px 0px 4px #180902; /* Opera 10.5 + */ +} +.roles_block h2 { + color: #FFFFFF; + font-weight: normal; + margin: 0; + padding: 0; + position: absolute; + text-shadow: 0 3px 2px #000000; + top: -30px; +} +.main hr { + height:8px; + border:none; + margin:0; + border-radius: 5px 5px 0px 0px; + -moz-border-radius: 5px 5px 0px 0px; + -webkit-border-radius: 5px 5px 0px 0px; + border-bottom:1px solid #000; +} +.main2{ + padding:70px 0 0; +} +#basic_block hr { + background-color: #666666; +} +#teacher_block hr { + background-color: #0071A9; +} +#student_block hr { + background-color: #AF0045; +} +.info_input { + padding:10px 20px; +} +.info_input table { + color:#fff; + width:100%; + font-size:14px; +} +.info_input table td { + padding:5px 10px 5px 0; + width: 10%; +} +.info_input .list_head { + background:url(<%= asset_path "line.png" %>) left bottom repeat-x; +} +.info_input .list_head td { +} +.info_input .list_item { + color:#AEAEAE; +} +.info_input .add { + display:block; + padding-left:22px; + font-size:12px; + line-height:21px; + height:19px; + background:url(<%= asset_path "icon.png" %>) no-repeat -59px 0; + margin-top: 10px; + color: #DDDDDD; +} + +.main table { + width:100%; +} +.main td { + padding-left:20px; + color:#fff; + font-size:14px; + line-height:40px; +} +.main tr.have td{ + background: url(<%= asset_path "75.png" %>) repeat left top; +} +.main tr.have td:first-child{ + border-radius: 5px 0 0 5px; + -moz-border-radius: 5px 0 0 5px; + -webkit-border-radius: 5px 0 0 5px; +} +.main tr.have td:last-child{ + border-radius: 0 5px 5px 0; + -moz-border-radius: 0 5px 5px 0; + -webkit-border-radius: 0 5px 5px 0; +} +.main thead td { + line-height:40px; + font-size:16px; + text-shadow: 0px 1px 1px #3e2914; +} +.main thead td.action { + width:140px; +} +.main tbody td.roles { + background-image: url(<%= asset_path "roles_type.jpg" %>); + background-repeat: repeat-x; +} +.main tbody td.teacher { + background-position: 0 -54px; +} +.main tbody td.student { + background-position: 0 -5px; +} +.main tbody td.action a { + background-image: url(<%= asset_path "icon.png" %>); + display: inline-block; + height: 19px; + margin-right: 10px; + top: 8px; + text-indent: -9999px; + width: 19px; + position: relative; +} +.main tbody td.action a.show { + background-position: left top; +} +.main tbody td.action a.show:hover { + background-position: left -19px; +} +.main tbody td.action a.edit { + background-position: -19px top; +} +.main tbody td.action a.edit:hover { + background-position: -19px -19px; +} +.main tbody td.action a.delete { + background-position: -38px top; +} +.main tbody td.action a.delete:hover { + background-position: -38px -19px; +} +.main tbody td.action a.switch { + background: url(<%= asset_path "switch.png" %>) no-repeat left 3px; + width: 40px; +} +.main tbody tr.disable td.action a.switch { + background-position:left bottom; +} +.main tbody td.action a.delete:hover { + background-position: -38px -19px; +} +.main tbody tr.have { +} +.main tbody tr.disable { + opacity: 0.7; +} +.main tbody tr { + background:none; + height:15px; +} +h1{ + margin:0 0 20px; +} +p{ + margin:0 0 10px; +} + +#back_sidebar .items_setup .list li{ + background:url(<%= asset_path "sidebar_li2.jpg" %>) repeat left top; + border:none; + padding: 0 0 0 5px; +} +#back_sidebar .items_setup .list li a{ + line-height:31px; +} +#back_sidebar .items_setup .list li:hover{ + background:url(<%= asset_path "sidebar_li2.jpg" %>) repeat left top; + border:none; +} +#back_sidebar .items_setup ul .list { } \ No newline at end of file diff --git a/app/controllers/pages_controller.rb b/app/controllers/pages_controller.rb index 693243c22..33c927acd 100644 --- a/app/controllers/pages_controller.rb +++ b/app/controllers/pages_controller.rb @@ -19,7 +19,7 @@ class PagesController < ApplicationController end def show - begin + #begin item = Item.first(:conditions => {:full_name => params[:page_name]}) case item._type when 'Page' @@ -28,9 +28,9 @@ class PagesController < ApplicationController when 'Link' redirect_to "http://#{item[:url]}" end - rescue - render :file => "#{Rails.root}/public/404.html", :status => :not_found - end + #rescue + # render :file => "#{Rails.root}/public/404.html", :status => :not_found + #end end end diff --git a/app/views/admin/assets/_asset.html.erb b/app/views/admin/assets/_asset.html.erb index b29bc51df..7aad2ef81 100644 --- a/app/views/admin/assets/_asset.html.erb +++ b/app/views/admin/assets/_asset.html.erb @@ -13,5 +13,5 @@ - + \ No newline at end of file diff --git a/app/views/admin/assets/_form.html.erb b/app/views/admin/assets/_form.html.erb index 3ee7c6447..72199ceb4 100644 --- a/app/views/admin/assets/_form.html.erb +++ b/app/views/admin/assets/_form.html.erb @@ -9,6 +9,6 @@

      -<%= f.label :data, t('admin.data') %> +<%= f.label :data, t('admin.data'), :class => 'file' %> <%= f.file_field :data %>

      \ No newline at end of file diff --git a/app/views/admin/assets/_new.html.erb b/app/views/admin/assets/_new.html.erb index 4f15fafce..49e638c8c 100644 --- a/app/views/admin/assets/_new.html.erb +++ b/app/views/admin/assets/_new.html.erb @@ -9,7 +9,7 @@ <%= link_back %> <%= f.submit t(:create) %> <% else %> - <%= t(:create) %> + <%= t(:create) %> <% end %>
      <% end %> diff --git a/app/views/admin/users/_sub_role_selector.html.erb b/app/views/admin/users/_sub_role_selector.html.erb index 6d7924ca8..2305cb475 100644 --- a/app/views/admin/users/_sub_role_selector.html.erb +++ b/app/views/admin/users/_sub_role_selector.html.erb @@ -1,4 +1,4 @@ <% role.sub_roles.each do |sub_role| %> - <%= sub_role.i18n_variable[I18n.locale] %> - <%= check_box_tag "user[sub_role_ids][]", sub_role.id, @user.sub_role_ids.include?(sub_role.id), :class => 'sub_role_select' %> + <%= f.label sub_role.i18n_variable[I18n.locale], :for => "check_sub_role_#{sub_role.id}", :class => 'sub_role_select' %> + <%= check_box_tag "user[sub_role_ids][]", sub_role.id, @user.sub_role_ids.include?(sub_role.id), :id => "check_sub_role_#{sub_role.id}", :class => 'sub_role_select' %> <% end %> \ No newline at end of file diff --git a/app/views/layouts/admin.html.erb b/app/views/layouts/admin.html.erb index 631370488..d800ab5d0 100644 --- a/app/views/layouts/admin.html.erb +++ b/app/views/layouts/admin.html.erb @@ -1,31 +1,37 @@ - - - - - <%= @title || APP_CONFIG['orbit'] %> - - <%= stylesheet_link_tag "admin" %> - <%= javascript_include_tag "admin" %> - <%= yield :page_specific_css %> - <%= yield :page_specific_javascript %> - <%= csrf_meta_tag %> - - - - -
      -
      <%= yield :secondary %>
      -
      - <%= yield %> -
      -
      <%= yield :tertiary %>
      - -
      - - + + + + + <%= @title || APP_CONFIG['orbit'] %> + + + <%= stylesheet_link_tag "admin" %> + <%= javascript_include_tag "admin" %> + <%= yield :page_specific_css %> + <%= yield :page_specific_javascript %> + <%= csrf_meta_tag %> + + + + +
      +
      <%= yield :secondary %>
      +
      + <%= yield %> +
      +
      <%= yield :tertiary %>
      + +
      + + diff --git a/app/views/layouts/site_editor.html.erb b/app/views/layouts/site_editor.html.erb index f419fb028..f4df75c4b 100644 --- a/app/views/layouts/site_editor.html.erb +++ b/app/views/layouts/site_editor.html.erb @@ -1,32 +1,38 @@ - - - - - <%= @title || APP_CONFIG['orbit'] %> - - <%= stylesheet_link_tag "site_editor" %> - <%= javascript_include_tag "site_editor" %> - <%= yield :page_specific_css %> - <%= yield :page_specific_javascript %> - <%= csrf_meta_tag %> - - - - -
      -
      <%= yield :sidebar %>
      -
      - <%= yield %> -
      -
      <%= yield :tertiary %>
      - -
      - - - + + + + + <%= @title || APP_CONFIG['orbit'] %> + + + <%= stylesheet_link_tag "site_editor" %> + <%= javascript_include_tag "site_editor" %> + <%= yield :page_specific_css %> + <%= yield :page_specific_javascript %> + <%= csrf_meta_tag %> + + + + +
      +
      <%= yield :sidebar %>
      +
      + <%= yield %> +
      +
      <%= yield :tertiary %>
      + +
      + + + diff --git a/config/environments/development.rb b/config/environments/development.rb index 48f4d9568..d1b671e55 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -10,7 +10,7 @@ PrototypeR4::Application.configure do config.whiny_nils = true # Show full error reports and disable caching - config.consider_all_requests_local = true + config.consider_all_requests_local = false #config.action_view.debug_rjs = true config.action_controller.perform_caching = false diff --git a/lib/parsers/parser_back_end.rb b/lib/parsers/parser_back_end.rb index d11ce9b2f..48b6a1df8 100644 --- a/lib/parsers/parser_back_end.rb +++ b/lib/parsers/parser_back_end.rb @@ -107,7 +107,7 @@ module ParserBackEnd c.define_tag 'menu' do |tag| home = get_homepage menu = page.design.layout.menu - menu_level(home, 1, menu, true) + menu_level(home, 0, menu, true) end end end diff --git a/lib/parsers/parser_common.rb b/lib/parsers/parser_common.rb index e96c92016..70006eb32 100644 --- a/lib/parsers/parser_common.rb +++ b/lib/parsers/parser_common.rb @@ -1,23 +1,33 @@ module ParserCommon def menu_level(page, current, menu, edit = false) + res = '' if current <= menu.levels - res = "" end end @@ -26,8 +36,11 @@ module ParserCommon res << menu.values["li_class_#{current}"] res << "_#{i}" if i res << ">" - res << "#{page.name}" - res << menu_level(page, current + 1, menu, edit) if page.children.size > 0 && !page.is_home? + if page.children.size > 0 + res << menu_level(page, current + 1, menu, edit) + else + res << "#{page.name}" + end res << "
    • " end diff --git a/lib/parsers/parser_front_end.rb b/lib/parsers/parser_front_end.rb index 660a779b9..3452f4fc9 100644 --- a/lib/parsers/parser_front_end.rb +++ b/lib/parsers/parser_front_end.rb @@ -104,7 +104,7 @@ module ParserFrontEnd ret << "
      " else part = page.page_parts.detect{ |p| p.name.to_s == tag.attr['name'].to_s } rescue nil - ret << part.content + ret << part.content rescue nil end ret end @@ -118,7 +118,7 @@ module ParserFrontEnd c.define_tag 'menu' do |tag| home = get_homepage menu = page.design.layout.menu - menu_level(home, 1, menu) + menu_level(home, 0, menu) end end end diff --git a/lib/tasks/pages.rake b/lib/tasks/pages.rake new file mode 100644 index 000000000..8a43f420a --- /dev/null +++ b/lib/tasks/pages.rake @@ -0,0 +1,66 @@ +# encoding: utf-8 + +namespace :pages do + + task :build => :environment do + + Item.delete_all + + + var_10 = I18nVariable.create!( :document_class => 'Home', :key => 'home', :en => 'Homepage', :zh_tw => '首頁') + var_13 = I18nVariable.create!( :document_class => 'PagePart', :key => 'main_content', :en => 'This is the homepage', :zh_tw => '這是首頁', :parent_id => var_10.id ) + + + design = Design.new(:title => "Fraisier", :author => "Paul", :intro => "Strawberry cake") + + design.build_default_css(:file => File.open("#{Rails.root}/lib/fraisier/default.css")) + + # image = design.images.build(:file => File.open("#{Rails.root}/lib/fraisier/img/buttons.gif")) + # + # js = design.javascripts.build(:file => File.open("#{Rails.root}/lib/fraisier/inettuts.js")) + # + theme = design.themes.build(:file => File.open("#{Rails.root}/lib/fraisier/themes/default.css")) + theme_1 = design.themes.build(:file => File.open("#{Rails.root}/lib/fraisier/themes/red.css")) + + design.build_layout + design.layout.file = File.open("#{Rails.root}/lib/fraisier/layout.html") + + design.layout.save + theme.save + theme_1.save + # image.save + # js.save + + design.save + + + + design_1 = Design.new(:title => "Bob", :author => "Me", :intro => "Moran") + + design_1.build_default_css(:file => File.open("#{Rails.root}/lib/fraisier/default.css")) + + # image = design.images.build(:file => File.open("#{Rails.root}/lib/fraisier/img/buttons.gif")) + # + # js = design.javascripts.build(:file => File.open("#{Rails.root}/lib/fraisier/inettuts.js")) + # + theme = design_1.themes.build(:file => File.open("#{Rails.root}/lib/fraisier/themes/default.css")) + theme_1 = design_1.themes.build(:file => File.open("#{Rails.root}/lib/fraisier/themes/red.css")) + + design_1.build_layout + design_1.layout.file = File.open("#{Rails.root}/lib/fraisier/layout.html") + + design_1.layout.save + theme.save + theme_1.save + # image.save + # js.save + + design_1.save + + + home = Page.create!( :i18n_variable_id => var_10.id, :design_id => design_1.id, :name => 'home', :is_published => true, :theme_id => theme.id ) + home.page_parts.create!( :name => 'content_1', :content => File.open("#{Rails.root}/lib/template/home.page").read, :kind => 'text', :i18n_variable_id => var_13.id ) + + end + +end From 9fcf8280fa05feafe7e8f7ffb76006c013c96f78 Mon Sep 17 00:00:00 2001 From: Christophe Vilayphiou Date: Tue, 24 Jan 2012 11:36:24 +0800 Subject: [PATCH 20/26] Change "_filename" to "_identifier" for carrierwave --- app/controllers/admin/designs_controller.rb | 8 ++++---- app/controllers/admin/purchases_controller.rb | 2 +- app/models/design/design.rb | 6 +++--- app/models/design/stylesheet.rb | 4 ++-- app/models/design/theme.rb | 2 +- app/views/admin/assets/_asset.html.erb | 2 +- app/views/admin/designs/_design_file.html.erb | 4 ++-- lib/parsers/parser_layout.rb | 2 +- 8 files changed, 15 insertions(+), 15 deletions(-) diff --git a/app/controllers/admin/designs_controller.rb b/app/controllers/admin/designs_controller.rb index 5930d1bfb..68fbb2436 100644 --- a/app/controllers/admin/designs_controller.rb +++ b/app/controllers/admin/designs_controller.rb @@ -46,7 +46,7 @@ class Admin::DesignsController < ApplicationController filename = params[:filename] files = @design.themes + @design.javascripts + @design.images file_to_removed = files.find{ |obj| - obj.file_filename == filename + obj.file_identifier == filename } type = file_to_removed._type new_file = "" @@ -103,7 +103,7 @@ class Admin::DesignsController < ApplicationController temp_file.write (zip_file.read entry ).force_encoding('UTF-8') default_css = design.build_default_css default_css.file = temp_file - default_css.file_filename = filename + default_css.file_identifier = filename default_css.to_save = true when /\A(#{zip_name})\/(reset\.css)\z/ #for reset css filename = File.basename(entry.to_s) @@ -111,7 +111,7 @@ class Admin::DesignsController < ApplicationController temp_file.write (zip_file.read entry ).force_encoding('UTF-8') reset_css = design.build_reset_css reset_css.file = temp_file - reset_css.file_filename = filename + reset_css.file_identifier = filename reset_css.to_save = true when /\A(#{zip_name})\/(layout\.html)\z/ #for layout html filename = File.basename(entry.to_s) @@ -135,7 +135,7 @@ class Admin::DesignsController < ApplicationController temp_file.write (zip_file.read entry).force_encoding('UTF-8') build_and_store = eval("design.#{type}").build build_and_store.file = temp_file - build_and_store.file_filename = filename + build_and_store.file_identifier = filename build_and_store.to_save = true end end diff --git a/app/controllers/admin/purchases_controller.rb b/app/controllers/admin/purchases_controller.rb index 40a042f44..00980cec0 100644 --- a/app/controllers/admin/purchases_controller.rb +++ b/app/controllers/admin/purchases_controller.rb @@ -172,7 +172,7 @@ class Admin::PurchasesController < ApplicationController def build_file(orig_zip, zip_name, dir, object, type = nil) - title = object.file_filename + title = object.file_identifier temp = File.new(dir + '/' + title, 'w+') temp.write orig_zip.read(zip_name + '/' + (type ? (type + '/') : '') + title) object.file = temp diff --git a/app/models/design/design.rb b/app/models/design/design.rb index e77f7f0ff..eb1f5e64f 100644 --- a/app/models/design/design.rb +++ b/app/models/design/design.rb @@ -31,7 +31,7 @@ class Design def files_with_duplicate? [self.javascripts, self.images,self.themes].each do |objects_hash| - ary = objects_hash.collect{ |k| k.file_filename} + ary = objects_hash.collect{ |k| k.file_identifier} ary.compact! # debugger return true if(ary.count!=ary.uniq.count) @@ -42,7 +42,7 @@ class Design def files_with_noname? [self.javascripts, self.images,self.themes].each do |objects_hash| objects_hash.each{ |k| - return true if(k.file_filename.nil? && !k.to_save?) + return true if(k.file_identifier.nil? && !k.to_save?) } end false @@ -121,7 +121,7 @@ class Design def process_object(object) if object.to_save - if object.file_filename.nil? + if object.file_identifier.nil? new_object = self.send(object._type.downcase.pluralize).build(object.attributes) new_object.file = object.file object.destroy diff --git a/app/models/design/stylesheet.rb b/app/models/design/stylesheet.rb index f26f15584..13fb154d3 100644 --- a/app/models/design/stylesheet.rb +++ b/app/models/design/stylesheet.rb @@ -11,14 +11,14 @@ class Stylesheet < DesignFile content.scan(/(?<=url)(.*?)(?=\))/){ css_name = $1.gsub(' ','').gsub('(','') name = File.basename(css_name).gsub(/[\\\"]/, '') - file_name = images.detect{ |i| i.file_filename.eql?(name) }.file_url rescue nil + file_name = images.detect{ |i| i.file_identifier.eql?(name) }.file_url rescue nil names << [css_name, file_name] } names.each do |name| content.gsub!(name[0], name[1]) if name[1] end Dir.mktmpdir('f_path') { |dir| - orig_file_name = self.file_filename + orig_file_name = self.file_identifier temp_file = File.new(dir + '/' + orig_file_name, 'w+') temp_file.write orig_content.force_encoding("UTF-8") diff --git a/app/models/design/theme.rb b/app/models/design/theme.rb index e69741818..dd4a6b01f 100644 --- a/app/models/design/theme.rb +++ b/app/models/design/theme.rb @@ -7,7 +7,7 @@ class Theme < Stylesheet protected def set_name - self.name = File.basename(self.file_filename,".css") + self.name = File.basename(self.file_identifier,".css") end end diff --git a/app/views/admin/assets/_asset.html.erb b/app/views/admin/assets/_asset.html.erb index 7aad2ef81..ea71dc6c0 100644 --- a/app/views/admin/assets/_asset.html.erb +++ b/app/views/admin/assets/_asset.html.erb @@ -5,7 +5,7 @@ <%= asset.description %> <%= asset.data.file.content_type %> - <%= asset.data_filename %> + <%= asset.data_identifier %> <%= number_to_human_size(asset.data.file.file_length) %> <%= link_to t(:edit), edit_admin_asset_path(asset), :remote => true, :class => 'edit' %> diff --git a/app/views/admin/designs/_design_file.html.erb b/app/views/admin/designs/_design_file.html.erb index c29450696..9e4945525 100644 --- a/app/views/admin/designs/_design_file.html.erb +++ b/app/views/admin/designs/_design_file.html.erb @@ -1,8 +1,8 @@ <%= f.label "field_name", t('admin.' + field_name) %>
        <% object.send(field_name).each do |t| %> -
      • > - <%= t.file_filename %> +
      • > + <%= t.file_identifier %> <% if classes.include?('r_destroy') %> <%= fields_for "design[" + field_name + "][]", t, :index => nil do |f| %> <%= f.hidden_field :id %> diff --git a/lib/parsers/parser_layout.rb b/lib/parsers/parser_layout.rb index e9eec7cc5..16def68b4 100644 --- a/lib/parsers/parser_layout.rb +++ b/lib/parsers/parser_layout.rb @@ -27,7 +27,7 @@ module ParserLayout layout.layout_parts.create(:name => tag.attr['name'], :editable => true) end c.define_tag 'image' do |tag| - image = layout.design.images.detect{ |i| i.file_filename.eql?(parse_html_image(tag.expand)) } + image = layout.design.images.detect{ |i| i.file_identifier.eql?(parse_html_image(tag.expand)) } image.update_attributes(:name => tag.attr['name'], :html_id => tag.attr['id'], :html_class => tag.attr['class']) end end From 18a82d7f472494d014e2a90f2e65726cb635a54a Mon Sep 17 00:00:00 2001 From: Matthew Fu Date: Fri, 13 Jan 2012 18:20:04 +0800 Subject: [PATCH 21/26] Manger and SubManager --- app/controllers/admin/app_auths_controller.rb | 6 +++ .../admin/module_apps_controller.rb | 53 +++++++++++++++++++ app/models/app_manager.rb | 12 +++++ app/models/module_app.rb | 37 +++++++++++++ app/models/user/user.rb | 3 ++ app/views/admin/module_apps/edit.html.erb | 41 ++++++++++++++ config/routes.rb | 5 ++ 7 files changed, 157 insertions(+) create mode 100644 app/models/app_manager.rb create mode 100644 app/views/admin/module_apps/edit.html.erb diff --git a/app/controllers/admin/app_auths_controller.rb b/app/controllers/admin/app_auths_controller.rb index e925b8578..6cbbf62e2 100644 --- a/app/controllers/admin/app_auths_controller.rb +++ b/app/controllers/admin/app_auths_controller.rb @@ -15,4 +15,10 @@ class Admin::AppAuthsController < ApplicationController @module_apps = ModuleApp.all end + def edit + @module_app = ModuleApp.find(params[:id]) + end + + + end \ No newline at end of file diff --git a/app/controllers/admin/module_apps_controller.rb b/app/controllers/admin/module_apps_controller.rb index 142830f19..34fcf1fdb 100644 --- a/app/controllers/admin/module_apps_controller.rb +++ b/app/controllers/admin/module_apps_controller.rb @@ -18,6 +18,7 @@ class Admin::ModuleAppsController < ApplicationController end + def update @module_app = ModuleApp.find(params[:id]) unless params['module_app']['enable_frontend'].nil? @@ -30,4 +31,56 @@ class Admin::ModuleAppsController < ApplicationController format.js { render 'admin/attributes/toggle_enable' } end end + + def assign_sub_manager + @module_app = ModuleApp.find(params[:id]) + @assign_to_user = User.find params[:sub_manager_id] rescue nil + unless @assign_to_user.nil? + if @module_app.assign_sub_manager(@assign_to_user,current_user) + flash[:notice] = t('admin.app_auth.assign_success_sub_manager') + else + flash[:notice] = t('admin.app_auth.assign_fail_sub_manager') + end + else + flash[:notice] = t('admin.app_auth.assign_fail_sub_manager_no_user') + end + redirect_to :action => "edit" + end + + def assign_manager + @module_app = ModuleApp.find(params[:id]) + @assign_to_user = User.find params[:manager_id] rescue nil + unless @assign_to_user.nil? + if @module_app.assign_manager(@assign_to_user,current_user) + flash[:notice] = t('admin.app_auth.assign_success_manager') + else + flash[:notice] = t('admin.app_auth.assign_fail_manager') + end + else + flash[:notice] = t('admin.app_auth.assign_fail_manager_no_user') + end + redirect_to :action => "edit" + end + + def remove_manager + @module_app = ModuleApp.find(params[:id]) + @app_manager = AppManager.find(params[:app_manager_id]) rescue nil + if @module_app.remove_manager(@app_manager.user) + flash[:notice] = t('admin.app_auth.delete_success_manager') + else + flash[:notice] = t('admin.app_auth.delete_fail_manager') + end + redirect_to :action => "edit" + end + + def remove_sub_manager + @module_app = ModuleApp.find(params[:id]) + @app_sub_manager = AppManager.find(params[:app_sub_manager_id]) rescue nil + if @module_app.remove_sub_manager(@app_sub_manager.user) + flash[:notice] = t('admin.app_auth.delete_success_sub_manager') + else + flash[:notice] = t('admin.app_auth.delete_fail_sub_manager') + end + redirect_to :action => "edit" + end end \ No newline at end of file diff --git a/app/models/app_manager.rb b/app/models/app_manager.rb new file mode 100644 index 000000000..46cbbb913 --- /dev/null +++ b/app/models/app_manager.rb @@ -0,0 +1,12 @@ +class AppManager + include Mongoid::Document + include Mongoid::Timestamps + + belongs_to :user + + belongs_to :managing_app, :polymorphic => true #,:class_name => 'ModuleApp',:inverse_of => :managers,:foreign_key => "user_id" + belongs_to :sub_managing_app, :polymorphic => true #,:class_name => 'ModuleApp',:inverse_of => :sub_manager,:foreign_key => "sub_user_id" + + belongs_to :rule_creator,:class_name => 'User' + +end \ No newline at end of file diff --git a/app/models/module_app.rb b/app/models/module_app.rb index d398f7ef5..029d55fa6 100644 --- a/app/models/module_app.rb +++ b/app/models/module_app.rb @@ -14,9 +14,46 @@ class ModuleApp field :app_pages ,type: Array field :widgets ,type: Array + has_many :managers,as: :managing_app ,:class_name => "AppManager" #,:dependent => :destroy,:foreign_key => "managing_app_id",:inverse_of => :managing_app + has_many :sub_managers,as: :sub_managing_app ,:class_name => "AppManager"#, :dependent => :destroy,:foreign_key => "sub_managing_app_id",:inverse_of => :sub_managing_app + has_one :app_auth,dependent: :delete + + def assign_manager(user,assigner) + manager = AppManager.first(conditions: {managing_app_id: self.id,user_id: user.id}) rescue nil + if manager.nil? + manager = self.managers.create(:user => user,:rule_creator => assigner) + end + manager + end + + def assign_sub_manager(user,assigner) + submanager = AppManager.first(conditions: {sub_managing_app_id: self.id,user_id: user.id}) rescue nil + if submanager.nil? + submanager = self.sub_managers.create(:user => user,:rule_creator => assigner) + end + submanager + end + + def remove_manager(user) + manager = AppManager.first(conditions: {managing_app_id: self.id,user_id: user.id}) rescue nil + if manager + manager.destroy + else + false + end + end + + def remove_sub_manager(user) + submanager = AppManager.first(conditions: {sub_managing_app_id: self.id,user_id: user.id}) rescue nil + if submanager + submanager.destroy + else + false + end + end field :app_pages ,type: Array diff --git a/app/models/user/user.rb b/app/models/user/user.rb index 60199ce7f..13d282bb4 100644 --- a/app/models/user/user.rb +++ b/app/models/user/user.rb @@ -14,6 +14,9 @@ class User has_many :app_auths,as: :privilege_apps,:inverse_of => :privilege_lists has_many :blocked_apps, :inverse_of => :blocked_users, :class_name => "AppAuth" has_many :privilege_apps, :inverse_of => :privilege_users, :class_name => "AppAuth" + + has_many :managing_apps,:class_name => "AppManager" + belongs_to :role has_and_belongs_to_many :sub_roles accepts_nested_attributes_for :attribute_values, :allow_destroy => true diff --git a/app/views/admin/module_apps/edit.html.erb b/app/views/admin/module_apps/edit.html.erb new file mode 100644 index 000000000..ff9672730 --- /dev/null +++ b/app/views/admin/module_apps/edit.html.erb @@ -0,0 +1,41 @@ +<% content_for :secondary do %> +<% end %> + + +
        +
        +
        + + +
        +

        <%= @module_app.title %>

        +
        +
        Manager + <% @module_app.managers.each do |manager| %> +
        <%= manager.user.name %> -AuthBy:<%= manager.rule_creator.name %> <%= link_to '[X]',remove_manager_admin_module_app_path(@module_app,manager),:method => :delete unless manager.user == current_user%>
        + <% end %> +
        Add: + <%= form_tag(assign_manager_admin_module_app_path) do %> + <%= text_field_tag 'manager_id' %> + <%= submit_tag 'Add Manager' %> + <% end %> +
        +
        + + +
        +
        Sub Manager + <% @module_app.sub_managers.each do |manager| %> +
        <%= manager.user.name %> -AuthBy:<%= manager.rule_creator.name %> <%= link_to '[X]',remove_sub_manager_admin_module_app_path(@module_app,manager),:method => :delete unless manager.user == current_user%>
        + <% end %> +
        Add: + <%= form_tag(assign_sub_manager_admin_module_app_path) do %> + <%= text_field_tag 'sub_manager_id' %> + <%= submit_tag 'Add Sub Manager' %> + <% end %> +
        +
        + + +
        + diff --git a/config/routes.rb b/config/routes.rb index f2b4cc177..e0e9eec2d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -40,6 +40,11 @@ PrototypeR4::Application.routes.draw do end resources :module_apps do member do + match 'assign_manager' ,:action=> 'assign_manager',:via => "post",:as =>:assign_manager + match 'assign_sub_manager' ,:action=> 'assign_sub_manager',:via => "post",:as =>:assign_sub_manager + + match 'remove_manager/:app_manager_id' ,:action=> 'remove_manager',:via => "delete",:as =>:remove_manager + match 'remove_sub_manager/:app_sub_manager_id' ,:action=> 'remove_sub_manager',:via => "delete",:as =>:remove_sub_manager get 'reload_frontend_pages' end end From 4df8ab6cc3c5dbcf0dcc3dafe15bb66af4660812 Mon Sep 17 00:00:00 2001 From: Matthew Fu Date: Mon, 16 Jan 2012 18:52:08 +0800 Subject: [PATCH 22/26] Add methods to work with manager role,add task to build user test data --- .../admin/module_apps_controller.rb | 73 +++++++++++++------ lib/tasks/user.rake | 29 ++++++++ 2 files changed, 78 insertions(+), 24 deletions(-) create mode 100644 lib/tasks/user.rake diff --git a/app/controllers/admin/module_apps_controller.rb b/app/controllers/admin/module_apps_controller.rb index 34fcf1fdb..129453b14 100644 --- a/app/controllers/admin/module_apps_controller.rb +++ b/app/controllers/admin/module_apps_controller.rb @@ -1,4 +1,7 @@ class Admin::ModuleAppsController < ApplicationController + before_filter :user_has_manager_privilege?, :only => [ :assign_manager, :remove_manager ] + before_filter :user_has_sub_manager_privilege?, :only => [ :assign_sub_manager, :remove_sub_manager ] + layout "admin" def index @@ -32,55 +35,77 @@ class Admin::ModuleAppsController < ApplicationController end end + def assign_sub_manager - @module_app = ModuleApp.find(params[:id]) - @assign_to_user = User.find params[:sub_manager_id] rescue nil - unless @assign_to_user.nil? - if @module_app.assign_sub_manager(@assign_to_user,current_user) - flash[:notice] = t('admin.app_auth.assign_success_sub_manager') + unless @assign_to_user.nil? + if @module_app.assign_sub_manager(@assign_to_user,current_user) + flash[:notice] = t('admin.app_auth.assigning_manager.add_sub_manager_ok') + else + flash[:notice] = t('admin.app_auth.assigning_manager.add_sub_manager_fail') + end else - flash[:notice] = t('admin.app_auth.assign_fail_sub_manager') - end - else - flash[:notice] = t('admin.app_auth.assign_fail_sub_manager_no_user') - end - redirect_to :action => "edit" + flash[:notice] = t('admin.app_auth.assigning_manager.failed_no_user') + end + redirect_to :action => "edit" end + def assign_manager - @module_app = ModuleApp.find(params[:id]) - @assign_to_user = User.find params[:manager_id] rescue nil unless @assign_to_user.nil? if @module_app.assign_manager(@assign_to_user,current_user) - flash[:notice] = t('admin.app_auth.assign_success_manager') + flash[:notice] = t('admin.app_auth.assigning_sub_manager.add_manager_ok') else - flash[:notice] = t('admin.app_auth.assign_fail_manager') + flash[:notice] = t('admin.app_auth.assigning_sub_manager.add_manager_fail') end else - flash[:notice] = t('admin.app_auth.assign_fail_manager_no_user') + flash[:notice] = t('admin.app_auth.assigning_sub_manager.failed_no_user') end redirect_to :action => "edit" end + def remove_manager - @module_app = ModuleApp.find(params[:id]) - @app_manager = AppManager.find(params[:app_manager_id]) rescue nil if @module_app.remove_manager(@app_manager.user) - flash[:notice] = t('admin.app_auth.delete_success_manager') + flash[:notice] = t('admin.app_auth.delete_manager.success') else - flash[:notice] = t('admin.app_auth.delete_fail_manager') + flash[:notice] = t('admin.app_auth.delete_manager.fail') end redirect_to :action => "edit" end + def remove_sub_manager - @module_app = ModuleApp.find(params[:id]) - @app_sub_manager = AppManager.find(params[:app_sub_manager_id]) rescue nil if @module_app.remove_sub_manager(@app_sub_manager.user) - flash[:notice] = t('admin.app_auth.delete_success_sub_manager') + flash[:notice] = t('admin.app_auth.delete_sub_manager.success') else - flash[:notice] = t('admin.app_auth.delete_fail_sub_manager') + flash[:notice] = t('admin.app_auth.delete_sub_manager.fail') end redirect_to :action => "edit" end + + + private + def user_has_manager_privilege? + @module_app = ModuleApp.find(params[:id]) + @assign_to_user = User.find params[:manager_id] rescue nil + if current_user.admin? #only admin can assign app's manager + return + end + #user is not permited to do that + flash[:notice] = t('admin.app_auth.operation_not_permitted') + redirect_to :action => "edit" # [TODO] maybe need to redirect to some other page + end + + + def user_has_sub_manager_privilege? + @module_app = ModuleApp.find(params[:id]) + @assign_to_user = User.find params[:sub_manager_id] rescue nil + if current_user.admin? || @module_app.managers.include?(current_user) #admin or app's manager can assign app's subanager + return + end + #user is not permited to do that + flash[:notice] = t('admin.app_auth.operation_not_permitted') + redirect_to :action => "edit" # [TODO] maybe need to redirect to some other page + end + end \ No newline at end of file diff --git a/lib/tasks/user.rake b/lib/tasks/user.rake new file mode 100644 index 000000000..31ed7c246 --- /dev/null +++ b/lib/tasks/user.rake @@ -0,0 +1,29 @@ +# encoding: utf-8 +namespace :user do + + task :build => :environment do + User.all(conditions: {email: /nor/}).destroy_all + + username_list = %w{nor1 nor2 nor3 nor4 nor5 nor6 nor7} + userfirstname_list_en = %w{ One Two Thre For Fiv Six Sen } + userlastname_list_en = %w{ Aa Bb Cc Dd Ee Ff Gg } + + userfirstname_list_ct = %w{ 一一 二二 三三 四四 五五 六六 七七 } + userlastname_list_ct = %w{ 陳 林 吳 李 鄭 方 王 } + + first_name_field = AttributeField.first(conditions: {key: "first_name"}) + last_name_field = AttributeField.first(conditions: {key: "last_name"}) + major_field = AttributeField.first(conditions: {key: "major"}) + department_field = AttributeField.first(conditions: {key: "department"}) + + stud_role = Role.first(conditions: {key: 'student'}) + + username_list.each_with_index do |username,index| + user = User.create( :email => "#{username}@rulingcom.com", :password => 'password', :password_confirmation => 'password', :admin => false ,:role_id => stud_role.id,:sub_role_ids => [stud_role.sub_roles[Random.rand(stud_role.sub_roles.count-1)].id]) + AttributeValue.create( :user_id => user.id, :attribute_field_id => first_name_field.id, :key => 'first_name', :en => userfirstname_list_en[index], :zh_tw => userfirstname_list_ct[index] ) + AttributeValue.create( :user_id => user.id, :attribute_field_id => last_name_field.id, :key => 'last_name', :en => userlastname_list_en[index], :zh_tw => userlastname_list_ct[index] ) + AttributeValue.create( :user_id => user.id, :attribute_field_id => major_field.id, :key => 'major', :en => 'Information management', :zh_tw => '信息化管理' ) + AttributeValue.create( :user_id => user.id, :attribute_field_id => department_field.id, :key => 'department', :en => 'Computer Science', :zh_tw => '計算機科學' ) + end + end +end From 4ed8a2164c5b14fb72075375c4b5dea7e721c629 Mon Sep 17 00:00:00 2001 From: Matthew Fu Date: Tue, 17 Jan 2012 16:20:03 +0800 Subject: [PATCH 23/26] First complete with manager and submanager --- app/controllers/admin/app_auths_controller.rb | 10 +++++++--- .../admin/module_apps_controller.rb | 14 +++++++++----- app/helpers/admin/module_app_helper.rb | 19 +++++++++++++++++++ app/models/module_app.rb | 12 +++++++++--- app/views/admin/module_apps/edit.html.erb | 8 ++++---- config/locales/en.yml | 2 ++ config/locales/zh_tw.yml | 2 ++ 7 files changed, 52 insertions(+), 15 deletions(-) create mode 100644 app/helpers/admin/module_app_helper.rb diff --git a/app/controllers/admin/app_auths_controller.rb b/app/controllers/admin/app_auths_controller.rb index 6cbbf62e2..1bbb5a2e8 100644 --- a/app/controllers/admin/app_auths_controller.rb +++ b/app/controllers/admin/app_auths_controller.rb @@ -1,7 +1,7 @@ class Admin::AppAuthsController < ApplicationController layout "admin" before_filter :authenticate_user! - before_filter :is_admin? +# before_filter :is_admin? ,:only => :index def index # @roles = Role.all.entries @@ -12,13 +12,17 @@ class Admin::AppAuthsController < ApplicationController # obj_auth = obj.send "auth" # [:app_obj => app,:auth_field => obj_auth] # end - @module_apps = ModuleApp.all + if current_user.admin? + @module_apps = ModuleApp.all + else + @module_apps = current_user.managing_apps.collect{|t| t.managing_app} + end end def edit @module_app = ModuleApp.find(params[:id]) end - + end \ No newline at end of file diff --git a/app/controllers/admin/module_apps_controller.rb b/app/controllers/admin/module_apps_controller.rb index 129453b14..914c5138c 100644 --- a/app/controllers/admin/module_apps_controller.rb +++ b/app/controllers/admin/module_apps_controller.rb @@ -37,7 +37,7 @@ class Admin::ModuleAppsController < ApplicationController def assign_sub_manager - unless @assign_to_user.nil? + unless @assign_to_user.nil? || @assign_to_user.admin? if @module_app.assign_sub_manager(@assign_to_user,current_user) flash[:notice] = t('admin.app_auth.assigning_manager.add_sub_manager_ok') else @@ -46,12 +46,13 @@ class Admin::ModuleAppsController < ApplicationController else flash[:notice] = t('admin.app_auth.assigning_manager.failed_no_user') end - redirect_to :action => "edit" + flash[:notice] = t('admin.app_auth.can_not_add_this_user') + redirect_to :action => "edit" end def assign_manager - unless @assign_to_user.nil? + unless @assign_to_user.nil? || @assign_to_user.admin? if @module_app.assign_manager(@assign_to_user,current_user) flash[:notice] = t('admin.app_auth.assigning_sub_manager.add_manager_ok') else @@ -60,11 +61,13 @@ class Admin::ModuleAppsController < ApplicationController else flash[:notice] = t('admin.app_auth.assigning_sub_manager.failed_no_user') end - redirect_to :action => "edit" + flash[:notice] = t('admin.app_auth.can_not_add_this_user') + redirect_to :action => "edit" end def remove_manager + @app_manager = AppManager.find(params[:app_manager_id]) if @module_app.remove_manager(@app_manager.user) flash[:notice] = t('admin.app_auth.delete_manager.success') else @@ -75,6 +78,7 @@ class Admin::ModuleAppsController < ApplicationController def remove_sub_manager + @app_sub_manager = AppManager.find(params[:app_sub_manager_id]) if @module_app.remove_sub_manager(@app_sub_manager.user) flash[:notice] = t('admin.app_auth.delete_sub_manager.success') else @@ -100,7 +104,7 @@ class Admin::ModuleAppsController < ApplicationController def user_has_sub_manager_privilege? @module_app = ModuleApp.find(params[:id]) @assign_to_user = User.find params[:sub_manager_id] rescue nil - if current_user.admin? || @module_app.managers.include?(current_user) #admin or app's manager can assign app's subanager + if current_user.admin? || @module_app.managing_users.include?(current_user) #admin or app's manager can assign app's subanager return end #user is not permited to do that diff --git a/app/helpers/admin/module_app_helper.rb b/app/helpers/admin/module_app_helper.rb new file mode 100644 index 000000000..0a636e9cd --- /dev/null +++ b/app/helpers/admin/module_app_helper.rb @@ -0,0 +1,19 @@ +module Admin::ModuleAppHelper + + def if_permit_to_delete(item) + case item.downcase + when :manager + current_user.admin? + when :sub_manager + @module_app.managing_users.include?(current_user) || current_user.admin? + end + end + + def if_permit_to_assign(item) + if_permit_to_delete(item) + end + + def get_auth_by(manager_obj) + "-AuthBy: " +( manager_obj.rule_creator==current_user ? t('me') : manager_obj.rule_creator.name) + end +end diff --git a/app/models/module_app.rb b/app/models/module_app.rb index 029d55fa6..f4a636183 100644 --- a/app/models/module_app.rb +++ b/app/models/module_app.rb @@ -19,11 +19,17 @@ class ModuleApp has_one :app_auth,dependent: :delete - + def managing_users + self.managers.collect{ |t| t.user } + end + + def sub_managing_users + self.sub_managers.collect{ |t| t.user } + end def assign_manager(user,assigner) manager = AppManager.first(conditions: {managing_app_id: self.id,user_id: user.id}) rescue nil - if manager.nil? + if manager.nil? manager = self.managers.create(:user => user,:rule_creator => assigner) end manager @@ -31,7 +37,7 @@ class ModuleApp def assign_sub_manager(user,assigner) submanager = AppManager.first(conditions: {sub_managing_app_id: self.id,user_id: user.id}) rescue nil - if submanager.nil? + if submanager.nil? && !self.managing_users.include?(user) submanager = self.sub_managers.create(:user => user,:rule_creator => assigner) end submanager diff --git a/app/views/admin/module_apps/edit.html.erb b/app/views/admin/module_apps/edit.html.erb index ff9672730..96859a21d 100644 --- a/app/views/admin/module_apps/edit.html.erb +++ b/app/views/admin/module_apps/edit.html.erb @@ -12,11 +12,11 @@
        Manager <% @module_app.managers.each do |manager| %> -
        <%= manager.user.name %> -AuthBy:<%= manager.rule_creator.name %> <%= link_to '[X]',remove_manager_admin_module_app_path(@module_app,manager),:method => :delete unless manager.user == current_user%>
        +
        <%= manager.user.name %> <%= get_auth_by(manager) %> <%= link_to '[X]',remove_manager_admin_module_app_path(@module_app,manager),:method => :delete if if_permit_to_delete(:manager) && manager.user != current_user %>
        <% end %>
        Add: <%= form_tag(assign_manager_admin_module_app_path) do %> - <%= text_field_tag 'manager_id' %> + <%= text_field_tag 'manager_id','Enter User ID here',:disabled => !if_permit_to_assign(:manager)%> <%= submit_tag 'Add Manager' %> <% end %>
        @@ -26,11 +26,11 @@
        Sub Manager <% @module_app.sub_managers.each do |manager| %> -
        <%= manager.user.name %> -AuthBy:<%= manager.rule_creator.name %> <%= link_to '[X]',remove_sub_manager_admin_module_app_path(@module_app,manager),:method => :delete unless manager.user == current_user%>
        +
        <%= manager.user.name %> -AuthBy:<%= manager.rule_creator.name %> <%= link_to '[X]',remove_sub_manager_admin_module_app_path(@module_app,manager),:method => :delete if if_permit_to_delete(:sub_manager) && manager.user != current_user %>
        <% end %>
        Add: <%= form_tag(assign_sub_manager_admin_module_app_path) do %> - <%= text_field_tag 'sub_manager_id' %> + <%= text_field_tag 'sub_manager_id','Enter User ID here',:disabled => !if_permit_to_assign(:sub_manager)%> <%= submit_tag 'Add Sub Manager' %> <% end %>
        diff --git a/config/locales/en.yml b/config/locales/en.yml index 27d5cbb29..07f5ec739 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -5,6 +5,8 @@ en: _locale: English + me: Me + add: Add back: Back create: Create diff --git a/config/locales/zh_tw.yml b/config/locales/zh_tw.yml index a83f327b7..7555c3a55 100644 --- a/config/locales/zh_tw.yml +++ b/config/locales/zh_tw.yml @@ -2,6 +2,8 @@ zh_tw: _locale: 中文 + me: 我 + add: 新增 back: 回去 create: 創造 From 959f3e8b2f886aafc440ce538645ef599a265f74 Mon Sep 17 00:00:00 2001 From: Matthew Fu Date: Wed, 18 Jan 2012 11:51:38 +0800 Subject: [PATCH 24/26] put setup APP var setup into Orbit class --- app/controllers/obit_frontend_component_controller.rb | 6 ++++++ .../panel/new_blog/front_end/posts_controller.rb | 8 -------- .../controllers/panel/new_blog/widget/posts_controller.rb | 8 -------- 3 files changed, 6 insertions(+), 16 deletions(-) diff --git a/app/controllers/obit_frontend_component_controller.rb b/app/controllers/obit_frontend_component_controller.rb index d5bfaac68..06bb06a52 100644 --- a/app/controllers/obit_frontend_component_controller.rb +++ b/app/controllers/obit_frontend_component_controller.rb @@ -1,4 +1,10 @@ class ObitFrontendComponentController< ApplicationController + before_filter :setup_vars before_filter {|c| c.front_end_available(@app_title)} layout 'production' + + def setup_vars + @app_title = request.fullpath.split('/')[2] + end + end \ No newline at end of file diff --git a/vendor/built_in_modules/new_blog/app/controllers/panel/new_blog/front_end/posts_controller.rb b/vendor/built_in_modules/new_blog/app/controllers/panel/new_blog/front_end/posts_controller.rb index 2471e5fd9..1aeb34b2b 100644 --- a/vendor/built_in_modules/new_blog/app/controllers/panel/new_blog/front_end/posts_controller.rb +++ b/vendor/built_in_modules/new_blog/app/controllers/panel/new_blog/front_end/posts_controller.rb @@ -1,14 +1,6 @@ class Panel::NewBlog::FrontEnd::PostsController < ObitFrontendController - - - def initialize - super - @app_title = NewBlog::MOUDLEAPP_TITLE - end - # GET /posts # GET /posts.xml - def index @posts = Post.all end diff --git a/vendor/built_in_modules/new_blog/app/controllers/panel/new_blog/widget/posts_controller.rb b/vendor/built_in_modules/new_blog/app/controllers/panel/new_blog/widget/posts_controller.rb index 796155bc8..dab532eeb 100644 --- a/vendor/built_in_modules/new_blog/app/controllers/panel/new_blog/widget/posts_controller.rb +++ b/vendor/built_in_modules/new_blog/app/controllers/panel/new_blog/widget/posts_controller.rb @@ -1,12 +1,4 @@ class Panel::NewBlog::Widget::PostsController < ObitWidgetController - - layout 'production' - - def initialize - super - @app_title = NewBlog::MOUDLEAPP_TITLE - end - # GET /posts # GET /posts.xml def index From 25cbe0c2a54d36d9c2867321cc5fd53f95184c64 Mon Sep 17 00:00:00 2001 From: Matthew Fu Date: Wed, 18 Jan 2012 12:04:01 +0800 Subject: [PATCH 25/26] update app package for previous commit --- lib/NewBlog.zip | Bin 53327 -> 53345 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/lib/NewBlog.zip b/lib/NewBlog.zip index 3513cabf8668eed283bebaac3103fd657c43901e..71f0e09101e32b59c1c13c6bc32357663d03d909 100644 GIT binary patch delta 7922 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 fNZRM4c~<@vn1mf=Bjr>%}uMr^c$;m*Dms@L9>3 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 l Date: Thu, 19 Jan 2012 17:47:52 +0800 Subject: [PATCH 26/26] User role and sub_role simple interface complete --- app/controllers/admin/app_auths_controller.rb | 43 ++++++++++++++++++ .../admin/module_apps_controller.rb | 5 +-- app/views/admin/module_apps/edit.html.erb | 44 +++++++++++++++---- config/routes.rb | 8 +++- 4 files changed, 88 insertions(+), 12 deletions(-) diff --git a/app/controllers/admin/app_auths_controller.rb b/app/controllers/admin/app_auths_controller.rb index 1bbb5a2e8..cb3340fd9 100644 --- a/app/controllers/admin/app_auths_controller.rb +++ b/app/controllers/admin/app_auths_controller.rb @@ -19,6 +19,49 @@ class Admin::AppAuthsController < ApplicationController end end + def create + app_auth = AppAuth.find_or_create_by(module_app_id: params[:module_app_id]) + params[:new].each do |item| + field = item[0] + field_value = item[1] + if field_value!='' + case field + when 'role' + app_auth.send("add_#{field}",(Role.find field_value)) rescue nil + when 'sub_role' + app_auth.send("add_#{field}",(SubRole.find field_value)) rescue nil + when 'privilege_user' + app_auth.add_user_to_privilege_list (User.find field_value) rescue nil + when 'blocked_user' + app_auth.add_user_to_black_list (User.find field_value) rescue nil + end + end + end + app = ModuleApp.find params[:module_app_id] rescue nil + redirect_to edit_admin_module_app_path(app) + end + + def remove + app_auth = AppAuth.find( params[:id] ) + type = params[:type] + field_value = params[:target_id] + if field_value!='' + case type + when 'role' + app_auth.remove_role(Role.find field_value) rescue nil + when 'sub_role' + app_auth.remove_sub_role(SubRole.find field_value) rescue nil + when 'privilege_user' + app_auth.remove_user_from_privilege_list (User.find field_value) rescue nil + when 'blocked_user' + app_auth.remove_user_from_black_list (User.find field_value) rescue nil + end + end + + app = ModuleApp.find params[:module_app_id] rescue nil + redirect_to edit_admin_module_app_path(app) + end + def edit @module_app = ModuleApp.find(params[:id]) end diff --git a/app/controllers/admin/module_apps_controller.rb b/app/controllers/admin/module_apps_controller.rb index 914c5138c..56c2523fe 100644 --- a/app/controllers/admin/module_apps_controller.rb +++ b/app/controllers/admin/module_apps_controller.rb @@ -18,7 +18,6 @@ class Admin::ModuleAppsController < ApplicationController def edit @module_app = ModuleApp.find(params[:id]) - end @@ -91,7 +90,7 @@ class Admin::ModuleAppsController < ApplicationController private def user_has_manager_privilege? @module_app = ModuleApp.find(params[:id]) - @assign_to_user = User.find params[:manager_id] rescue nil + @assign_to_user = User.find params[:manager][:id] rescue nil if current_user.admin? #only admin can assign app's manager return end @@ -103,7 +102,7 @@ class Admin::ModuleAppsController < ApplicationController def user_has_sub_manager_privilege? @module_app = ModuleApp.find(params[:id]) - @assign_to_user = User.find params[:sub_manager_id] rescue nil + @assign_to_user = User.find params[:sub_manager][:id] rescue nil if current_user.admin? || @module_app.managing_users.include?(current_user) #admin or app's manager can assign app's subanager return end diff --git a/app/views/admin/module_apps/edit.html.erb b/app/views/admin/module_apps/edit.html.erb index 96859a21d..9429e963d 100644 --- a/app/views/admin/module_apps/edit.html.erb +++ b/app/views/admin/module_apps/edit.html.erb @@ -6,9 +6,11 @@

        +

        <%= @module_app.title %>

        -

        <%= @module_app.title %>

        +

        Manager

        +
        Manager <% @module_app.managers.each do |manager| %> @@ -16,13 +18,11 @@ <% end %>
        Add: <%= form_tag(assign_manager_admin_module_app_path) do %> - <%= text_field_tag 'manager_id','Enter User ID here',:disabled => !if_permit_to_assign(:manager)%> + <%= collection_select(:manager,:id, User.all, :id, :name, :prompt => true,:disabled => !if_permit_to_assign(:manager))%> <%= submit_tag 'Add Manager' %> <% end %>
        - -
        Sub Manager <% @module_app.sub_managers.each do |manager| %> @@ -30,12 +30,40 @@ <% end %>
        Add: <%= form_tag(assign_sub_manager_admin_module_app_path) do %> - <%= text_field_tag 'sub_manager_id','Enter User ID here',:disabled => !if_permit_to_assign(:sub_manager)%> + <%= collection_select(:sub_manager,:id, User.all, :id, :name, :prompt => true,:disabled => !if_permit_to_assign(:sub_manager))%> <%= submit_tag 'Add Sub Manager' %> <% end %>
        - -
        - +
        +

        User Role

        + <%= form_tag(admin_module_app_app_auths_path(@module_app),:method => :post) do %> + <%= collection_select(:new,:role, Role.all, :id, :key, :prompt => true) %> + <%= submit_tag 'Add Role' %>
        + <%= collection_select(:new,:sub_role, SubRole.all, :id, :key, :prompt => true) %> + <%= submit_tag 'Add SubRole' %>
        + <%= collection_select(:new,:privilege_user, User.all, :id, :name, :prompt => true) %> + <%= submit_tag 'Add PrivilegeList' %>
        + <%= collection_select(:new,:blocked_user, User.all, :id, :name, :prompt => true) %> + <%= submit_tag 'Add BlockedList' %>
        + <% end %> +
          Roles
        + <% unless @module_app.app_auth.nil? %> + <% @module_app.app_auth.roles.each do |role| %> +
      • <%= role.key %> Build in:<%= role.built_in ? 'Yes' : 'No' %> <%= link_to '[X]',remove_admin_module_app_app_auth_path(@module_app,@module_app.app_auth,'role',role),:method => :delete %>
      • + <% end %> +
          Sub Roles
        + <% @module_app.app_auth.sub_roles.each do |role| %> +
      • <%= role.key %> Build in:<%= role.built_in ? 'Yes' : 'No' %>
      • <%= link_to '[X]',remove_admin_module_app_app_auth_path(@module_app,@module_app.app_auth,'sub_role',role),:method => :delete %> + <% end %> +
          PrivilegeList
        + <% @module_app.app_auth.privilege_users.each do |user| %> +
      • <%= user.name %> <%= link_to '[X]',remove_admin_module_app_app_auth_path(@module_app,@module_app.app_auth,'privilege_user',user),:method => :delete %>
      • + <% end %> +
          BlockedList
        + <% @module_app.app_auth.blocked_users.each do |user| %> +
      • <%= user.name %><%= link_to '[X]',remove_admin_module_app_app_auth_path(@module_app,@module_app.app_auth,'blocked_user',user),:method => :delete %>
      • + <% end %> +<% end %> +
        diff --git a/config/routes.rb b/config/routes.rb index e0e9eec2d..efa645763 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -12,7 +12,7 @@ PrototypeR4::Application.routes.draw do # routes for admin namespace :admin do resources :assets - resources :app_auths + resources :app_auths resources :designs do collection do @@ -39,6 +39,12 @@ PrototypeR4::Application.routes.draw do end end resources :module_apps do + resources :app_auths do + member do + match 'remove/:type/:target_id' ,:action=> 'remove',:via => "delete",:as =>:remove + end + end + member do match 'assign_manager' ,:action=> 'assign_manager',:via => "post",:as =>:assign_manager match 'assign_sub_manager' ,:action=> 'assign_sub_manager',:via => "post",:as =>:assign_sub_manager