From 4f1e47bb82b8f12ec68ac573568ed09841fa8c66 Mon Sep 17 00:00:00 2001 From: "Matthew K. Fu JuYuan" Date: Thu, 10 May 2012 14:43:05 +0800 Subject: [PATCH 01/26] Don't display admin in any premission select. Fix not necessary header for UT data --- app/controllers/admin/new_interface_module_apps_controller.rb | 2 +- .../panel/announcement/back_end/approvals_controller.rb | 1 + .../back_end/bulletin_category_setting_controller.rb | 1 + .../announcement/back_end/approvals/_privilege_user.html.erb | 3 +-- .../bulletin_category_setting/_privilege_user.html.erb | 3 +-- .../lib/tasks/data_for_ut_list_for_posting_anc.rake | 2 +- .../announcement/lib/ut_list_from_nccu_2012feb.csv | 1 - .../panel/news/back_end/news_approvals_controller.rb | 1 + .../news/back_end/news_bulletin_category_setting_controller.rb | 1 + .../news/back_end/news_approvals/_privilege_user.html.erb | 3 +-- .../news_bulletin_category_setting/_privilege_user.html.erb | 3 +-- 11 files changed, 10 insertions(+), 11 deletions(-) diff --git a/app/controllers/admin/new_interface_module_apps_controller.rb b/app/controllers/admin/new_interface_module_apps_controller.rb index 6603334c..8cf77e5e 100644 --- a/app/controllers/admin/new_interface_module_apps_controller.rb +++ b/app/controllers/admin/new_interface_module_apps_controller.rb @@ -6,7 +6,7 @@ class Admin::NewInterfaceModuleAppsController < ApplicationController layout "new_admin" def setting - @sys_users = User.all + @sys_users = User.all(conditions: {admin: false}) @module_app = ModuleApp.find(params[:module_app_id]) @options_from_collection_for_select_bulletin_categorys = [@module_app].collect{|ma| [ma.title,ma.id] } # if params.has_key? :category diff --git a/vendor/built_in_modules/announcement/app/controllers/panel/announcement/back_end/approvals_controller.rb b/vendor/built_in_modules/announcement/app/controllers/panel/announcement/back_end/approvals_controller.rb index 9f63a8ab..e5c92023 100644 --- a/vendor/built_in_modules/announcement/app/controllers/panel/announcement/back_end/approvals_controller.rb +++ b/vendor/built_in_modules/announcement/app/controllers/panel/announcement/back_end/approvals_controller.rb @@ -12,6 +12,7 @@ class Panel::Announcement::BackEnd::ApprovalsController < OrbitBackendControlle # end def setting + @sys_users = User.all(conditions: {admin: false}) @bulletin_categorys = BulletinCategory.all @options_from_collection_for_select_bulletin_categorys = @bulletin_categorys.collect{|bc| [bc.i18n_variable[I18n.locale],bc.id] } if params.has_key? :category diff --git a/vendor/built_in_modules/announcement/app/controllers/panel/announcement/back_end/bulletin_category_setting_controller.rb b/vendor/built_in_modules/announcement/app/controllers/panel/announcement/back_end/bulletin_category_setting_controller.rb index 4be5f6bc..8903adb2 100644 --- a/vendor/built_in_modules/announcement/app/controllers/panel/announcement/back_end/bulletin_category_setting_controller.rb +++ b/vendor/built_in_modules/announcement/app/controllers/panel/announcement/back_end/bulletin_category_setting_controller.rb @@ -12,6 +12,7 @@ class Panel::Announcement::BackEnd::BulletinCategorySettingController < OrbitBac # end def setting + @sys_users = User.all(conditions: {admin: false}) @bulletin_categorys = [] @bulletin_categorys << BulletinCategory.find(params[:bulletin_category_id]) @options_from_collection_for_select_bulletin_categorys = @bulletin_categorys.collect{|bc| [bc.i18n_variable[I18n.locale],bc.id] } diff --git a/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/approvals/_privilege_user.html.erb b/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/approvals/_privilege_user.html.erb index c36941de..90f5cb65 100644 --- a/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/approvals/_privilege_user.html.erb +++ b/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/approvals/_privilege_user.html.erb @@ -1,6 +1,5 @@ <%= content_tag :div ,:id => "users_checkbox_ary",:class => 'clear' do -%> -<% sys_users = User.all -%> - <% sys_users.each do |sys_user| -%> + <% @sys_users.each do |sys_user| -%>
diff --git a/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/_privilege_user.html.erb b/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/_privilege_user.html.erb index c36941de..90f5cb65 100644 --- a/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/_privilege_user.html.erb +++ b/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/_privilege_user.html.erb @@ -1,6 +1,5 @@ <%= content_tag :div ,:id => "users_checkbox_ary",:class => 'clear' do -%> -<% sys_users = User.all -%> - <% sys_users.each do |sys_user| -%> + <% @sys_users.each do |sys_user| -%>
diff --git a/vendor/built_in_modules/announcement/lib/tasks/data_for_ut_list_for_posting_anc.rake b/vendor/built_in_modules/announcement/lib/tasks/data_for_ut_list_for_posting_anc.rake index e5bd0be2..9b8b05e5 100644 --- a/vendor/built_in_modules/announcement/lib/tasks/data_for_ut_list_for_posting_anc.rake +++ b/vendor/built_in_modules/announcement/lib/tasks/data_for_ut_list_for_posting_anc.rake @@ -4,9 +4,9 @@ namespace :nccu_data do desc "load nccu data from csv" task :setup_ut_list => :environment do require 'csv' - CSV.foreach("vendor/built_in_modules/announcement/lib/ut_list_from_nccu_2012feb.csv") do |row| new_unit = UnitListForAnc.new(:order => row[0], :ut_code => row[1], :up_ut_code => row[2], :created_at => Time.now,:updated_at => Time.now) + # order,ut_code,up_tu_code,ut_zh_tw,ut_en new_unit.build_title :en => row[4], :zh_tw => row[3] new_unit.save end diff --git a/vendor/built_in_modules/announcement/lib/ut_list_from_nccu_2012feb.csv b/vendor/built_in_modules/announcement/lib/ut_list_from_nccu_2012feb.csv index 548ad528..806d0b9a 100644 --- a/vendor/built_in_modules/announcement/lib/ut_list_from_nccu_2012feb.csv +++ b/vendor/built_in_modules/announcement/lib/ut_list_from_nccu_2012feb.csv @@ -1,4 +1,3 @@ -order,ut_code,up_tu_code,ut_zh_tw,ut_en 0100,H00,H00,校長室,Office of the President 0110,H01,H01,副校長室一,Office of the Vice President 0110,H03,H03,副校長室二,Office of the Vice President diff --git a/vendor/built_in_modules/news/app/controllers/panel/news/back_end/news_approvals_controller.rb b/vendor/built_in_modules/news/app/controllers/panel/news/back_end/news_approvals_controller.rb index c6eda9d0..80838ec5 100644 --- a/vendor/built_in_modules/news/app/controllers/panel/news/back_end/news_approvals_controller.rb +++ b/vendor/built_in_modules/news/app/controllers/panel/news/back_end/news_approvals_controller.rb @@ -12,6 +12,7 @@ class Panel::News::BackEnd::NewsApprovalsController < OrbitBackendController end def setting + @sys_users = User.all(conditions: {admin: false}) @news_bulletin_categorys = NewsBulletinCategory.all if params.has_key?(:category_id) first_category = NewsBulletinCategory.find params[:category_id] diff --git a/vendor/built_in_modules/news/app/controllers/panel/news/back_end/news_bulletin_category_setting_controller.rb b/vendor/built_in_modules/news/app/controllers/panel/news/back_end/news_bulletin_category_setting_controller.rb index 6b92195f..6ac76973 100644 --- a/vendor/built_in_modules/news/app/controllers/panel/news/back_end/news_bulletin_category_setting_controller.rb +++ b/vendor/built_in_modules/news/app/controllers/panel/news/back_end/news_bulletin_category_setting_controller.rb @@ -12,6 +12,7 @@ class Panel::News::BackEnd::NewsBulletinCategorySettingController < OrbitBackend # end def setting + @sys_users = User.all(conditions: {admin: false}) @bulletin_categorys = [] @bulletin_categorys << NewsBulletinCategory.find(params[:news_bulletin_category_id]) @options_from_collection_for_select_bulletin_categorys = @bulletin_categorys.collect{|bc| [bc.i18n_variable[I18n.locale],bc.id] } diff --git a/vendor/built_in_modules/news/app/views/panel/news/back_end/news_approvals/_privilege_user.html.erb b/vendor/built_in_modules/news/app/views/panel/news/back_end/news_approvals/_privilege_user.html.erb index 87d4d78e..d48bb850 100644 --- a/vendor/built_in_modules/news/app/views/panel/news/back_end/news_approvals/_privilege_user.html.erb +++ b/vendor/built_in_modules/news/app/views/panel/news/back_end/news_approvals/_privilege_user.html.erb @@ -1,6 +1,5 @@ <%= content_tag :div ,:id => "users_checkbox_ary",:class => 'clear' do -%> -<% sys_users = User.all -%> - <% sys_users.each do |user| -%> + <% @sys_users.each do |user| -%>
diff --git a/vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/_privilege_user.html.erb b/vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/_privilege_user.html.erb index c36941de..90f5cb65 100644 --- a/vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/_privilege_user.html.erb +++ b/vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/_privilege_user.html.erb @@ -1,6 +1,5 @@ <%= content_tag :div ,:id => "users_checkbox_ary",:class => 'clear' do -%> -<% sys_users = User.all -%> - <% sys_users.each do |sys_user| -%> + <% @sys_users.each do |sys_user| -%>
From cb25cf60a9a4b3e5b3d600987780feb5a382f2b6 Mon Sep 17 00:00:00 2001 From: "Matthew K. Fu JuYuan" Date: Thu, 10 May 2012 15:37:07 +0800 Subject: [PATCH 02/26] AdBanner app_auth --- app/views/layouts/_side_bar.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/layouts/_side_bar.html.erb b/app/views/layouts/_side_bar.html.erb index dde071c5..0a6c6912 100644 --- a/app/views/layouts/_side_bar.html.erb +++ b/app/views/layouts/_side_bar.html.erb @@ -54,7 +54,7 @@ <%#= content_tag :li, link_to(t('admin.ad.all_banners'), admin_ad_banners_path), :class => active_for_action('ad_banners', 'index') %> <%#= content_tag :li, link_to(t('admin.ad.new_banner'), new_admin_ad_banner_path), :class => active_for_action('ad_banners', 'new') %> <%#= content_tag :li, link_to(t('admin.ad.new_image'), new_ad_image_admin_ad_banners_path), :class => active_for_action('ad_images', 'new') %> - <%= content_tag :li, link_to(t('admin.module.authorization'),edit_admin_module_app_path(ModuleApp.first(conditions: {title: "ad_banners"}))), :class => active_sys_call_for_app('module_apps','edit','ad_banners') if (is_admin? rescue nil) %> + <%= content_tag :li, link_to(t('admin.module.authorization'),admin_module_app_manager_auth_proc_path(ModuleApp.first(conditions: {title: "ad_banners"}))), :class => active_sys_call_for_app('new_interface_module_apps','setting','ad_banners',:module_app_id) if (is_admin? rescue nil) %> <% end -%> <% end %> From 63f904d3b0d8bacdd7d37bd8da2b59b958a3b235 Mon Sep 17 00:00:00 2001 From: Christophe Vilayphiou Date: Thu, 10 May 2012 20:36:19 +0800 Subject: [PATCH 03/26] Fix tinymce js load Change to full_name for page_context index --- app/assets/javascripts/tinymce_orbit.js | 6 +++++- app/views/admin/page_parts/_text.html.erb | 6 +++++- .../back_end/page_contexts/_page_context.html.erb | 2 +- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/tinymce_orbit.js b/app/assets/javascripts/tinymce_orbit.js index 60492914..71264fde 100644 --- a/app/assets/javascripts/tinymce_orbit.js +++ b/app/assets/javascripts/tinymce_orbit.js @@ -1,4 +1,4 @@ -$(function() { +function load_tinymce() { $('.tinymce_textarea').tinymce({ theme: 'advanced', plugins : "autolink,lists,spellchecker,pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,inlinepopups,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template", @@ -22,4 +22,8 @@ $(function() { external_image_list_url : "js/image_list.js", media_external_list_url : "js/media_list.js" }); +} + +$(document).ready(function() { + load_tinymce(); }); \ No newline at end of file diff --git a/app/views/admin/page_parts/_text.html.erb b/app/views/admin/page_parts/_text.html.erb index c7386623..4193cf50 100644 --- a/app/views/admin/page_parts/_text.html.erb +++ b/app/views/admin/page_parts/_text.html.erb @@ -5,4 +5,8 @@ <%= f.text_area locale, :class => 'tinymce_textarea' %>
<% end %> -<% end %> \ No newline at end of file +<% end %> + + diff --git a/vendor/built_in_modules/page_content/app/views/panel/page_content/back_end/page_contexts/_page_context.html.erb b/vendor/built_in_modules/page_content/app/views/panel/page_content/back_end/page_contexts/_page_context.html.erb index 08db9b2d..39730de1 100644 --- a/vendor/built_in_modules/page_content/app/views/panel/page_content/back_end/page_contexts/_page_context.html.erb +++ b/vendor/built_in_modules/page_content/app/views/panel/page_content/back_end/page_contexts/_page_context.html.erb @@ -1,7 +1,7 @@ - <%= page_context.page.i18n_variable[I18n.locale] %> + <%= page_context.page.full_name %>
- +
diff --git a/config/routes.rb b/config/routes.rb index 863d17fd..63d70d30 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -49,6 +49,7 @@ Orbit::Application.routes.draw do get 'add_attribute_field' end resources :items + match 'update_position' => 'items#update_position' resources :links do member do get 'delete' From 6a443f0976214275564d12e8aa733a72dabbde54 Mon Sep 17 00:00:00 2001 From: Christophe Vilayphiou Date: Fri, 11 May 2012 16:16:09 +0800 Subject: [PATCH 05/26] Add mongoid-tree to Item --- Gemfile | 1 + Gemfile.lock | 3 + app/controllers/pages_controller.rb | 8 +-- app/helpers/admin/item_helper.rb | 21 ++---- app/helpers/application_helper.rb | 2 +- app/models/item.rb | 70 +++++-------------- app/models/page.rb | 4 -- .../admin/items/_site_map_left_bar.html.erb | 3 - lib/parsers/parser_back_end.rb | 2 +- lib/parsers/parser_common.rb | 18 ++--- lib/parsers/parser_front_end.rb | 2 +- lib/tasks/items.rake | 19 +++++ .../page_contexts/_page_context.html.erb | 2 +- 13 files changed, 60 insertions(+), 95 deletions(-) create mode 100644 lib/tasks/items.rake diff --git a/Gemfile b/Gemfile index 24ee0383..c24754c6 100644 --- a/Gemfile +++ b/Gemfile @@ -16,6 +16,7 @@ gem 'kaminari', :git => 'git://github.com/amatsuda/kaminari.git' gem 'mini_magick' gem 'mongoid' +gem 'mongoid-tree', :require => 'mongoid/tree' gem "mongo_session_store-rails3" gem 'nokogiri' gem 'radius' diff --git a/Gemfile.lock b/Gemfile.lock index e850e52b..0dfca3b6 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -118,6 +118,8 @@ GEM activemodel (~> 3.1) mongo (~> 1.3) tzinfo (~> 0.3.22) + mongoid-tree (0.7.0) + mongoid (~> 2.0) multi_json (1.1.0) nokogiri (1.5.2) nokogiri (1.5.2-x86-mingw32) @@ -277,6 +279,7 @@ DEPENDENCIES mini_magick mongo_session_store-rails3 mongoid + mongoid-tree nokogiri radius rails (>= 3.1.0, < 3.2.0) diff --git a/app/controllers/pages_controller.rb b/app/controllers/pages_controller.rb index c4e00aa2..b781f202 100644 --- a/app/controllers/pages_controller.rb +++ b/app/controllers/pages_controller.rb @@ -15,7 +15,7 @@ class PagesController < ApplicationController def show #begin - @item = Item.first(:conditions => {:full_name => params[:page_name]}) + @item = Item.first(:conditions => {:path => params[:page_name]}) if @item && @item.is_published && (@item.enabled_for.nil? ? true : @item.enabled_for.include?(I18n.locale.to_s)) case @item._type when 'Page' @@ -33,16 +33,16 @@ class PagesController < ApplicationController def index_from_link if params[:page] - redirect_to "/#{@item.full_name}?page=#{params[:page]}&category_id=#{params[:category_id]}&tag_id=#{params[:tag_id]}" + redirect_to "/#{@item.path}?page=#{params[:page]}&category_id=#{params[:category_id]}&tag_id=#{params[:tag_id]}" else - redirect_to "/#{@item.full_name}?category_id=#{params[:category_id]}&tag_id=#{params[:tag_id]}" + redirect_to "/#{@item.path}?category_id=#{params[:category_id]}&tag_id=#{params[:tag_id]}" end end def show_from_link # debugger # a=1 - redirect_to "/#{@item.full_name}?id=#{params[:id]}&preview=#{params[:preview]}" + redirect_to "/#{@item.path}?id=#{params[:id]}&preview=#{params[:preview]}" end def load_orbit_bar diff --git a/app/helpers/admin/item_helper.rb b/app/helpers/admin/item_helper.rb index dc78db88..aeadfdd0 100644 --- a/app/helpers/admin/item_helper.rb +++ b/app/helpers/admin/item_helper.rb @@ -8,9 +8,9 @@ module Admin::ItemHelper dest = admin_page_path(node) when 'Link' dest = admin_link_path(node) + no_nested = 'no-nest' end - # ret << "
    " unless node.parent.nil? - ret << "
  1. " + ret << "
  2. " ret << "
    " ret << (link_to node.i18n_variable[I18n.locale], dest) ret << "
    " @@ -22,14 +22,13 @@ module Admin::ItemHelper ret << "
    " ret << render_children(node) ret << "
  3. " - # ret << "
" unless node.parent.nil? end ret.html_safe end def render_children(parent) - children = parent.ordered_children - if !children.entries.blank? + children = parent.children + if !parent.children.entries.blank? ret = '' ret << "
    " children.each do |child| @@ -43,15 +42,3 @@ module Admin::ItemHelper end end - - -#
      -#
    1. Some content
    2. -#
    3. Some content
      -#
        -#
      1. Some sub-item content
      2. -#
      3. Some sub-item content
      4. -#
      -#
    4. -#
    5. Some content
    6. -#
    \ No newline at end of file diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 844fbe14..37c2d0d2 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -114,7 +114,7 @@ module ApplicationHelper def page_title(page) res = "" page_title = page.title ? page.title[I18n.locale] : page.i18n_variable[I18n.locale] - if page.is_home? && @site.title + if page.root? && @site.title res << @site.title[I18n.locale] elsif @site.title && @site.title_always_on res << @site.title[I18n.locale] + ' - ' + page_title diff --git a/app/models/item.rb b/app/models/item.rb index cea088fc..4d6ca001 100644 --- a/app/models/item.rb +++ b/app/models/item.rb @@ -2,59 +2,31 @@ class Item include Mongoid::Document include Mongoid::Timestamps + include Mongoid::Tree + include Mongoid::Tree::Ordering - field :name, :index => true - field :full_name, :index => true - field :position, :type => Integer - field :is_published, :type => Boolean, :default => false, :index => true - field :enabled_for, :type => Array, :default => nil - field :menu_enabled_for, :type => Array, :default => nil + field :name + field :path + field :is_published, :type => Boolean, :default => false + field :enabled_for, :type => Array, :default => nil + field :menu_enabled_for, :type => Array, :default => nil validates_format_of :name, :with => /^[0-9a-zA-Z\-_]+$/ validates :name, :exclusion => { :in => LIST[:forbidden_item_names] } validates_uniqueness_of :name, :scope => :parent_id - validates_presence_of :name, :full_name, :position + validates_presence_of :name + + validates_associated :parent, :children + after_rearrange :rebuild_path - belongs_to :parent, :class_name => "Item" has_one :i18n_variable, :as => :language_value, :autosave => true, :dependent => :destroy - has_many :children, :class_name => "Item", :as => 'parent' - - before_validation :setup_default_value def self.find_by_name(item_name) Item.first(:conditions => { :name => item_name, :is_published => true }) end - - # Get an array of ancestors - def ancestors - node, nodes = self, [] - nodes << node = node.parent while !node.parent.blank? rescue nil - nodes.reverse - end - # Get an array of ancestor's id - def ancestor_ids - node, nodes = self, [] - while !node.parent.blank? do - node = node.parent rescue nil - nodes << node.id if node - end - # nodes << node = node.parent while !node.parent.blank? rescue nil - nodes.reverse - end - - # Build the url from the array of ancestors - def url - urls = ancestors.map{ |a| a.name } << self.name - urls.join("/") - end - - def ordered_children - self.children.asc(:position) - end - - def ordered_and_visible_children - objects = ordered_children + def visible_children + objects = self.children a = [] if objects objects.each do |object| @@ -66,20 +38,10 @@ class Item protected - def setup_default_value - # Set the position value within the parent scope - if self.position.blank? - max_page = Item.where(:parent_id => self.parent_id).count - self.position = (max_page)? max_page + 1 : 1 - end - - # Build the full_name from the ancestors array - full_node = self.ancestors.map{ |a| a.name }.push( self.name ) - # Remove root node if not root - full_node.shift if full_node.size >= 2 - self.full_name = full_node.join("/") + def rebuild_path + self.path = (self.ancestors_and_self - [Item.root]).collect{|x| x.name unless x.root?}.join('/') end - + # Enable the validation for parent_id def validates_presence_of_parent_id? true diff --git a/app/models/page.rb b/app/models/page.rb index 5a742e92..0378b688 100644 --- a/app/models/page.rb +++ b/app/models/page.rb @@ -15,10 +15,6 @@ class Page < Item before_save :create_parts, :set_key # embeds_many :custom_images, :class_name => 'Image', as: :design_image - - def is_home? - self.parent ? false : true - end def title @title ||= I18nVariable.first(:conditions => {:key => 'title', :language_value_id => self.id, :language_value_type => self.class}) rescue nil diff --git a/app/views/admin/items/_site_map_left_bar.html.erb b/app/views/admin/items/_site_map_left_bar.html.erb index 69e7851c..fb280299 100644 --- a/app/views/admin/items/_site_map_left_bar.html.erb +++ b/app/views/admin/items/_site_map_left_bar.html.erb @@ -19,9 +19,6 @@ stop: function(event, ui) { $.post("<%= admin_update_position_path %>", { id: ui.item.attr('id'), parent_id: ui.item.parent().closest('li').attr('id'), position: ui.item.index() } ); - // console.log("parent: " + ui.item.parent().closest('li').attr('id')); - // console.log("id: " + ui.item.attr('id')); - // console.log("position: " + ui.item.index()); } }); }); diff --git a/lib/parsers/parser_back_end.rb b/lib/parsers/parser_back_end.rb index 33b19510..e9c08a01 100644 --- a/lib/parsers/parser_back_end.rb +++ b/lib/parsers/parser_back_end.rb @@ -14,7 +14,7 @@ module ParserBackEnd # }.join(' | ') # end # c.define_tag 'link' do |tag| - # item = Item.first(:conditions => { :full_name => tag.attr['name'] }) + # item = Item.first(:conditions => { :path => tag.attr['name'] }) # ret = '' # ret << "<a href='" # ret << eval("admin_#{item._type.downcase}_path(item.id)") diff --git a/lib/parsers/parser_common.rb b/lib/parsers/parser_common.rb index be676544..59bd85b3 100644 --- a/lib/parsers/parser_common.rb +++ b/lib/parsers/parser_common.rb @@ -3,7 +3,7 @@ module ParserCommon def menu_level(page, current_page, current, menu, edit = false) res = '' - if page.ordered_and_visible_children.size > 0 + if page.visible_children.size > 0 res << "<ul class='" res << menu.values["class_#{current}"] rescue nil res << "'>" @@ -12,7 +12,7 @@ module ParserCommon if menu.values['home'] && current == 1 res << menu_li(page, current_page, current, menu, i, edit) end - page.ordered_and_visible_children.each do |child| + page.visible_children.each do |child| res << menu_li(child, current_page, current, menu, i, edit) i += 1 if i end @@ -25,13 +25,13 @@ module ParserCommon res = "<li class='" res << menu.values["li_class_#{current}"] rescue nil res << "_#{i}" if i - res << " active" if (current_page.id.eql?(page.id) || current_page.ancestor_ids.include?(page.id)) + res << " active" if (current_page.id.eql?(page.id) || current_page.descendant_of?(page)) res << "'>" - res << "<a href='/#{edit ? admin_page_path(page.id) : page.full_name}'><span>#{page.i18n_variable[I18n.locale]}</span></a>" - if page.ordered_and_visible_children.size > 0 && current <= menu.levels + res << "<a href='/#{edit ? admin_page_path(page.id) : page.path}'><span>#{page.i18n_variable[I18n.locale]}</span></a>" + if page.visible_children.size > 0 && current <= menu.levels res << "<span class='dot'></span>" res << menu_level(page, current_page, current + 1, menu, edit) - end unless (page.is_home? rescue nil) + end unless (page.root? rescue nil) res << "</li>" end @@ -113,13 +113,13 @@ module ParserCommon body.css('sub_menu').each do |sub_menu| menu_page = Page.find(sub_menu['id']) rescue nil res = '' - if menu_page && menu_page.ordered_and_visible_children.size > 0 + if menu_page && menu_page.visible_children.size > 0 res << "<div class='category_list'>" res << "<h3 class='h3'>#{menu_page.i18n_variable[I18n.locale]}</h3>" res << "<ul class='list'>" - menu_page.ordered_and_visible_children.each do |child| + menu_page.visible_children.each do |child| res << "<li class='#{page.id.eql?(child.id) ? 'active' : nil}'>" - res << "<a href='/#{edit ? admin_page_path(child.id) : child.full_name}'>#{child.i18n_variable[I18n.locale]}</a>" + res << "<a href='/#{edit ? admin_page_path(child.id) : child.path}'>#{child.i18n_variable[I18n.locale]}</a>" res << "</li>" end res << "</ul>" diff --git a/lib/parsers/parser_front_end.rb b/lib/parsers/parser_front_end.rb index a0004f15..6320f808 100644 --- a/lib/parsers/parser_front_end.rb +++ b/lib/parsers/parser_front_end.rb @@ -11,7 +11,7 @@ module ParserFrontEnd # }.join(' | ') # end # c.define_tag 'link' do |tag| - # item = Item.first(:conditions => { :full_name => tag.attr['name'] }) + # item = Item.first(:conditions => { :path => tag.attr['name'] }) # ret = '' # ret << "<a href='#{tag.attr['name']}'>" # ret << item.i18n_variable[I18n.locale] diff --git a/lib/tasks/items.rake b/lib/tasks/items.rake new file mode 100644 index 00000000..8889567d --- /dev/null +++ b/lib/tasks/items.rake @@ -0,0 +1,19 @@ +# encoding: utf-8 + +namespace :items do + task :tree_changes => :environment do + Item.all.each do |item| + item.position -= 1 + item.parent_ids = ancestors(item) + item.rename(:full_name, :path) + item.save + end + end + + def ancestors(item) + node, nodes = item, [] + nodes << node = node.parent while !node.parent.blank? rescue nil + nodes.reverse + end + +end \ No newline at end of file diff --git a/vendor/built_in_modules/page_content/app/views/panel/page_content/back_end/page_contexts/_page_context.html.erb b/vendor/built_in_modules/page_content/app/views/panel/page_content/back_end/page_contexts/_page_context.html.erb index 39730de1..81b31b93 100644 --- a/vendor/built_in_modules/page_content/app/views/panel/page_content/back_end/page_contexts/_page_context.html.erb +++ b/vendor/built_in_modules/page_content/app/views/panel/page_content/back_end/page_contexts/_page_context.html.erb @@ -1,7 +1,7 @@ <tr id="<%= dom_id page_context %>" class="with_action"> <td> - <%= page_context.page.full_name %> + <%= page_context.page.path %> <div class="quick-edit"> <ul class="nav nav-pills hide"> <li><%= link_to t('page_context.edit'), edit_panel_page_content_back_end_page_context_path(page_context) %></li> From 20a1a6e30f87f08f7453c7faddd8550efd361f18 Mon Sep 17 00:00:00 2001 From: "Matthew K. Fu JuYuan" <matthewfu@gmail.com> Date: Fri, 11 May 2012 16:44:40 +0800 Subject: [PATCH 06/26] New Interface for App Auth and Object Auth --- .../module_apps_new_interface_controller.rb | 66 +++++++++++++++++ .../object_auths_new_interface_controller.rb | 71 +++++++++++++++++++ app/helpers/application_helper.rb | 20 +++++- .../_modal_list.html.erb | 42 +++++++++++ .../_privilege_user.html.erb | 25 +++++++ .../setting.html.erb | 56 +++++++++++++++ .../module_apps_new_interface/setting.js.erb | 2 + .../update_setting.js.erb | 1 + .../user_list.js.erb | 2 + .../_modal_list.html.erb | 42 +++++++++++ .../_privilege_user.html.erb | 25 +++++++ .../setting.html.erb | 57 +++++++++++++++ .../object_auths_new_interface/setting.js.erb | 2 + .../update_setting.js.erb | 1 + .../user_list.js.erb | 2 + app/views/layouts/_side_bar.html.erb | 16 ++--- config/locales/en.yml | 4 ++ config/locales/zh_tw.yml | 6 +- lib/orbit_core_lib.rb | 4 ++ .../back_end/bulletin_categorys_helper.rb | 2 +- .../app/models/bulletin_category.rb | 4 ++ .../news_bulletin_categorys_helper.rb | 2 +- .../news/app/models/news_bulletin_category.rb | 4 ++ 23 files changed, 442 insertions(+), 14 deletions(-) create mode 100644 app/controllers/admin/module_apps_new_interface_controller.rb create mode 100644 app/controllers/admin/object_auths_new_interface_controller.rb create mode 100644 app/views/admin/module_apps_new_interface/_modal_list.html.erb create mode 100644 app/views/admin/module_apps_new_interface/_privilege_user.html.erb create mode 100644 app/views/admin/module_apps_new_interface/setting.html.erb create mode 100644 app/views/admin/module_apps_new_interface/setting.js.erb create mode 100644 app/views/admin/module_apps_new_interface/update_setting.js.erb create mode 100644 app/views/admin/module_apps_new_interface/user_list.js.erb create mode 100644 app/views/admin/object_auths_new_interface/_modal_list.html.erb create mode 100644 app/views/admin/object_auths_new_interface/_privilege_user.html.erb create mode 100644 app/views/admin/object_auths_new_interface/setting.html.erb create mode 100644 app/views/admin/object_auths_new_interface/setting.js.erb create mode 100644 app/views/admin/object_auths_new_interface/update_setting.js.erb create mode 100644 app/views/admin/object_auths_new_interface/user_list.js.erb diff --git a/app/controllers/admin/module_apps_new_interface_controller.rb b/app/controllers/admin/module_apps_new_interface_controller.rb new file mode 100644 index 00000000..52292588 --- /dev/null +++ b/app/controllers/admin/module_apps_new_interface_controller.rb @@ -0,0 +1,66 @@ +class Admin::ModuleAppsNewInterfaceController < ApplicationController + before_filter :authenticate_user! + before_filter :is_admin? + include AdminHelper + + layout "new_admin" + + def setting + @sys_users = User.all(conditions: {admin: false}) + @module_app = ModuleApp.find(params[:module_app_id]) + @options_from_collection_for_select_bulletin_categorys = [@module_app].collect{|ma| [ma.title,ma.id] } + # if params.has_key? :category + # @bulletin_category = BulletinCategory.find params[:category][:id] + # else + # @bulletin_category = @bulletin_categorys.first + # end + @users_array = @module_app.managing_users rescue [] + + respond_to do |format| + format.html + format.js + end + end + + def update_setting + module_app = update_setting_by_params + if module_app.save! + flash[:notice] = "Update Done" + else + flash[:notice] = "Update Failed" + end + end + + def user_list + @module_app = ModuleApp.find params[:module_app][:id] + end + + protected + def update_setting_by_params + ma = ModuleApp.find params[:module_app][:id] + user_sat = User.find params[:users].keys + users_to_new = user_sat - ma.managing_users + users_to_remove = ma.managing_users - user_sat + + users_to_new.each do |new_user| + ma.assign_manager(new_user,current_user) + end + + users_to_remove.each do |remove_user| + ma.remove_manager(remove_user) + end + ma + end + + def get_categorys(id = nil) + @bulletin_categorys = [] + if(is_manager? || is_admin?) + @bulletin_categorys = (id ? BulletinCategory.find(id).to_a : BulletinCategory.excludes('disabled' => true)) + elsif is_sub_manager? + @bulletin_categorys = BulletinCategory.authed_for_user(current_user,'submit_new') + end + end + + + +end \ No newline at end of file diff --git a/app/controllers/admin/object_auths_new_interface_controller.rb b/app/controllers/admin/object_auths_new_interface_controller.rb new file mode 100644 index 00000000..427ec722 --- /dev/null +++ b/app/controllers/admin/object_auths_new_interface_controller.rb @@ -0,0 +1,71 @@ +class Admin::ObjectAuthsNewInterfaceController < ApplicationController + include OrbitCoreLib::PermissionUnility + layout "new_admin" + before_filter :force_order + + layout "new_admin" + + + def setting + @sys_users = User.all(conditions: {admin: false}) + @ob_auth = ObjectAuth.find params[:object_auth_id] + @options_from_collection_for_select_ob_auth = [@ob_auth].collect{|oa| [oa.auth_obj.pp_object,oa.id] } + @users_array = @ob_auth.privilege_users rescue [] + + respond_to do |format| + format.html + format.js + end + end + + def update_setting + ob_auth = update_setting_by_params + if ob_auth.save! + flash[:notice] = t("admin.object_auth.update_done") + else + flash[:notice] = t("admin.object_auth.update_failed") + end + end + + def user_list + @ob_auth = ObjectAuth.find params[:ob_auth][:id] + end + + protected + def update_setting_by_params + oa = ObjectAuth.find params[:ob_auth][:id] + user_sat = User.find params[:users].keys + users_to_new = user_sat - oa.auth_users + users_to_remove = oa.auth_users - user_sat + + users_to_new.each do |new_user| + oa.add_user_to_privilege_list(new_user) + end + + users_to_remove.each do |remove_user| + oa.remove_user_from_privilege_list(remove_user) + end + oa + end + + # def get_categorys(id = nil) + # @bulletin_categorys = [] + # if(is_manager? || is_admin?) + # @bulletin_categorys = (id ? BulletinCategory.find(id).to_a : BulletinCategory.excludes('disabled' => true)) + # elsif is_sub_manager? + # @bulletin_categorys = BulletinCategory.authed_for_user(current_user,'submit_new') + # end + # end + + def force_order + authenticate_user! + check_if_user_can_do_object_auth + end + + def check_if_user_can_do_object_auth + unless check_permission(:manager) + render :nothing => true, :status => 403 + end + end + +end \ No newline at end of file diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 844fbe14..cd7a15dd 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -68,9 +68,23 @@ module ApplicationHelper end end - def active_sys_call_for_app(controller_name,action_name,app_title,field = :id) - unless active_for_action(controller_name,action_name).nil? - app = ModuleApp.find params[field] + def active_for_ob_auths_object(object_class,field = :object_auth_id) + unless active_for_action("object_auths_new_interface","setting").nil? + ob_auth = ObjectAuth.find params[field] + ob_auth.obj_authable_type == object_class.to_s ? 'active' : nil + end + end + + def active_for_ob_auth(ob_auth_title,field = :object_auth_id) + unless active_for_action("module_apps_new_interface","setting").nil? + oa_auth = ObjectAuth.find params[field] + oa_auth.title == ob_auth_title ? 'active' : nil + end + end + + def active_for_app_auth(app_title ='', opt={:controller_name => 'module_apps_new_interface',:action_name=>'setting',:field => :module_app_id}) + unless active_for_action(opt[:controller_name],opt[:action_name]).nil? + app = ModuleApp.find params[opt[:field]] app.title == app_title ? 'active' : nil else nil diff --git a/app/views/admin/module_apps_new_interface/_modal_list.html.erb b/app/views/admin/module_apps_new_interface/_modal_list.html.erb new file mode 100644 index 00000000..b5b0ebcd --- /dev/null +++ b/app/views/admin/module_apps_new_interface/_modal_list.html.erb @@ -0,0 +1,42 @@ +<% if module_app -%> + +<div class="modal hide fade in" id="module_app-<%=module_app.id%>"> + <div class="modal-header"> + <a class="close" data-dismiss="modal">×</a> + <h3><%= t("admin.user_role.auth.manager") %></h3> + </div> + <div class="modal-body"> + <div class="clear"> + <% module_app.managing_users.each do |user| %> + <div class="checkbox clear checked"> + <div class='member-avatar'> + <% if user.avatar? %> + <%= image_tag(user.avatar.thumb.url,:class => "member-img") %> + <% else %> + <%= image_tag "person.png",:class => "member-img" %> + <% end %> + </div> + <%= label_tag "lab-user-#{user.id}", (user.name rescue ''),:class=>"member-name",:id=>nil -%> + </div> + <% end -%> + <divl> + </div> + <div class="modal-footer"> + <a href="#" class="btn" data-dismiss="modal"><%= t("modal.close") %></a> + </div> + <div> + <script type="text/javascript" src="/static/kernel.js"></script> + <script type="text/javascript"> + $(document).ready(function() { + + $("#module_app-<%=module_app.id%>").on("show", function () { + }); + $(".modal").on("hidden", function () { + $("#show_preview").remove(); + }); + }); + </script> + </div> +</div> + +<% end -%> \ No newline at end of file diff --git a/app/views/admin/module_apps_new_interface/_privilege_user.html.erb b/app/views/admin/module_apps_new_interface/_privilege_user.html.erb new file mode 100644 index 00000000..90f5cb65 --- /dev/null +++ b/app/views/admin/module_apps_new_interface/_privilege_user.html.erb @@ -0,0 +1,25 @@ +<%= content_tag :div ,:id => "users_checkbox_ary",:class => 'clear' do -%> + <% @sys_users.each do |sys_user| -%> + + <div class="checkblock"> + + <% sys_user.sub_roles.each do |sr| %> + <div class="for_unit" style="display:none;"> <%= sr.key %></div> + <% end %> + <%= content_tag :div,:data=>{'original-title'=>t('announcement.bulletin.approval_setting_window_title'),:content => "#{sys_user.sub_roles.collect{|sr| sr.i18n_variable[I18n.locale]}.join(',')}"},:class=>"checkbox clear" do %> + <div class="check-icon"> + </div> + <div class='member-avatar'> + <% if sys_user.avatar? %> + <%= image_tag(sys_user.avatar.thumb.url,:class => "member-img") %> + <% else %> + <%= image_tag "person.png",:class => "member-img" %> + <% end %> + </div> + <%= label_tag "lab-user-#{sys_user.id}", (sys_user.name rescue ''),:class=>"member-name",:id=>nil -%> + <%= check_box_tag "[users][#{sys_user.id}]", 'true',users.include?(sys_user),:class => "check" -%> + <%end -%> + </div> + + <% end -%> +<% end -%> \ No newline at end of file diff --git a/app/views/admin/module_apps_new_interface/setting.html.erb b/app/views/admin/module_apps_new_interface/setting.html.erb new file mode 100644 index 00000000..7d1179f0 --- /dev/null +++ b/app/views/admin/module_apps_new_interface/setting.html.erb @@ -0,0 +1,56 @@ +<% content_for :page_specific_css do %> + <%= stylesheet_link_tag "inc/permission-checkbox" %> +<% end %> +<% content_for :page_specific_javascript do %> + <%= javascript_include_tag "inc/permission-checkbox" %> + <%= javascript_include_tag "inc/search" %> + <%= javascript_include_tag "inc/modal-preview" %> +<% end %> +<%#= label_tag :fact_check_setting, t("announcement.bulletin.fact_check_setting") %> +<%= form_tag('', :remote => true,:class => "prevent_enter_submit_form") %> +<div class="subnav clear"> + <ul class="nav nav-pills filter pull-left"> + <li class="accordion-group"> + <div class="form-search" style="margin: 5px 10px;"> + <%= label_tag :module, t("module") %> + <%= select "module_app",'id',@options_from_collection_for_select_bulletin_categorys %> + <%= search_field_tag 'user_filter' %> + </div> + + </li> + </ul> + <%= link_to t("admin.user_role.auth.manager"), admin_module_app_manager_auth_show_path , :class=>'preview_trigger btn btn-success pull-right'%> + +</div> +<%#= label_tag :role, t("admin.roles") %> +<div class="clear"> +<%= content_tag :div do -%> + <% form_tag admin_module_app_manager_auth_proc_path do %> + <%= render :partial => "privilege_user", :locals => {:users => @users_array} %> + <div class="form-actions form-fixed pagination-right"> + <%= submit_tag "Update", :class => 'btn btn-primary' %> + </div> + <% end -%> +<% end -%> +</div> + +<script type="text/javascript" charset="utf-8"> +var availableTags = []; +$(document).ready(function() { + + $(".prevent_enter_submit_form").bind("keypress", function(e) { + if (e.keyCode == 13) { + return false; + } + }); + + $('#category_id').change(function() { + $.ajax({ + type: 'GET', + dataType: "script", + url:$(this).parents("from").attr("href"), + data:$(this).parents("form").serialize() + }); + }); +}); +</script> \ No newline at end of file diff --git a/app/views/admin/module_apps_new_interface/setting.js.erb b/app/views/admin/module_apps_new_interface/setting.js.erb new file mode 100644 index 00000000..0ca148da --- /dev/null +++ b/app/views/admin/module_apps_new_interface/setting.js.erb @@ -0,0 +1,2 @@ +$("#users_checkbox_ary").replaceWith('<%= escape_javascript(render :partial => "privilege_user", :locals => {:users => @users_array})%>'); +permissionCheckbox(); \ No newline at end of file diff --git a/app/views/admin/module_apps_new_interface/update_setting.js.erb b/app/views/admin/module_apps_new_interface/update_setting.js.erb new file mode 100644 index 00000000..7486000a --- /dev/null +++ b/app/views/admin/module_apps_new_interface/update_setting.js.erb @@ -0,0 +1 @@ +alert( "<% flash.each do |key, msg| %><%= msg %><% end%>"); \ No newline at end of file diff --git a/app/views/admin/module_apps_new_interface/user_list.js.erb b/app/views/admin/module_apps_new_interface/user_list.js.erb new file mode 100644 index 00000000..7caf1e39 --- /dev/null +++ b/app/views/admin/module_apps_new_interface/user_list.js.erb @@ -0,0 +1,2 @@ +$('#show_preview').html("<%= escape_javascript(render(:partial => 'modal_list',:locals => {:module_app => @module_app})) %>"); +var start_modal_with_id = "module_app-<%=@module_app.id%>" \ No newline at end of file diff --git a/app/views/admin/object_auths_new_interface/_modal_list.html.erb b/app/views/admin/object_auths_new_interface/_modal_list.html.erb new file mode 100644 index 00000000..04f46511 --- /dev/null +++ b/app/views/admin/object_auths_new_interface/_modal_list.html.erb @@ -0,0 +1,42 @@ +<% if ob_auth -%> + +<div class="modal hide fade in" id="ob_auth-<%=ob_auth.id%>"> + <div class="modal-header"> + <a class="close" data-dismiss="modal">×</a> + <h3><%= t("admin.object_auth.list_title_of_users",:auth_title => ob_auth.title) %></h3> + </div> + <div class="modal-body"> + <div class="clear"> + <% ob_auth.auth_users.each do |user| %> + <div class="checkbox clear checked"> + <div class='member-avatar'> + <% if user.avatar? %> + <%= image_tag(user.avatar.thumb.url,:class => "member-img") %> + <% else %> + <%= image_tag "person.png",:class => "member-img" %> + <% end %> + </div> + <%= label_tag "lab-user-#{user.id}", (user.name rescue ''),:class=>"member-name",:id=>nil -%> + </div> + <% end -%> + <divl> + </div> + <div class="modal-footer"> + <a href="#" class="btn" data-dismiss="modal"><%= t("modal.close") %></a> + </div> + <div> + <script type="text/javascript" src="/static/kernel.js"></script> + <script type="text/javascript"> + $(document).ready(function() { + + $("#ob_auth-<%=ob_auth.id%>").on("show", function () { + }); + $(".modal").on("hidden", function () { + $("#show_preview").remove(); + }); + }); + </script> + </div> +</div> + +<% end -%> \ No newline at end of file diff --git a/app/views/admin/object_auths_new_interface/_privilege_user.html.erb b/app/views/admin/object_auths_new_interface/_privilege_user.html.erb new file mode 100644 index 00000000..90f5cb65 --- /dev/null +++ b/app/views/admin/object_auths_new_interface/_privilege_user.html.erb @@ -0,0 +1,25 @@ +<%= content_tag :div ,:id => "users_checkbox_ary",:class => 'clear' do -%> + <% @sys_users.each do |sys_user| -%> + + <div class="checkblock"> + + <% sys_user.sub_roles.each do |sr| %> + <div class="for_unit" style="display:none;"> <%= sr.key %></div> + <% end %> + <%= content_tag :div,:data=>{'original-title'=>t('announcement.bulletin.approval_setting_window_title'),:content => "#{sys_user.sub_roles.collect{|sr| sr.i18n_variable[I18n.locale]}.join(',')}"},:class=>"checkbox clear" do %> + <div class="check-icon"> + </div> + <div class='member-avatar'> + <% if sys_user.avatar? %> + <%= image_tag(sys_user.avatar.thumb.url,:class => "member-img") %> + <% else %> + <%= image_tag "person.png",:class => "member-img" %> + <% end %> + </div> + <%= label_tag "lab-user-#{sys_user.id}", (sys_user.name rescue ''),:class=>"member-name",:id=>nil -%> + <%= check_box_tag "[users][#{sys_user.id}]", 'true',users.include?(sys_user),:class => "check" -%> + <%end -%> + </div> + + <% end -%> +<% end -%> \ No newline at end of file diff --git a/app/views/admin/object_auths_new_interface/setting.html.erb b/app/views/admin/object_auths_new_interface/setting.html.erb new file mode 100644 index 00000000..ae5096ba --- /dev/null +++ b/app/views/admin/object_auths_new_interface/setting.html.erb @@ -0,0 +1,57 @@ +<% content_for :page_specific_css do %> + <%= stylesheet_link_tag "inc/permission-checkbox" %> +<% end %> +<% content_for :page_specific_javascript do %> + <%= javascript_include_tag "inc/permission-checkbox" %> + <%= javascript_include_tag "inc/search" %> + <%= javascript_include_tag "inc/modal-preview" %> +<% end %> +<%#= label_tag :fact_check_setting, t("announcement.bulletin.fact_check_setting") %> +<%= form_tag('', :remote => true,:class => "prevent_enter_submit_form") %> +<div class="subnav clear"> + <ul class="nav nav-pills filter pull-left"> + <li class="accordion-group"> + <div class="form-search" style="margin: 5px 10px;"> + <%= label_tag :object, @ob_auth.auth_obj.class %> + <%= label_tag :module,"::" %> + <%= select "ob_auth",'id',@options_from_collection_for_select_ob_auth %> + <%= search_field_tag 'user_filter' %> + </div> + + </li> + </ul> + <%= link_to t("admin.object_auth.list_title_of_users",:auth_title => @ob_auth.title), admin_object_auth_ob_auth_show_path , :class=>'preview_trigger btn btn-success pull-right'%> + +</div> +<%#= label_tag :role, t("admin.roles") %> +<div class="clear"> +<%= content_tag :div do -%> + <% form_tag admin_object_auth_ob_auth_path do %> + <%#= render :partial => "privilege_user", :locals => {:users => @users_array} %> + <div class="form-actions form-fixed pagination-right"> + <%= submit_tag "Update", :class => 'btn btn-primary' %> + </div> + <% end -%> +<% end -%> +</div> + +<script type="text/javascript" charset="utf-8"> +var availableTags = []; +$(document).ready(function() { + + $(".prevent_enter_submit_form").bind("keypress", function(e) { + if (e.keyCode == 13) { + return false; + } + }); + + $('#category_id').change(function() { + $.ajax({ + type: 'GET', + dataType: "script", + url:$(this).parents("from").attr("href"), + data:$(this).parents("form").serialize() + }); + }); +}); +</script> \ No newline at end of file diff --git a/app/views/admin/object_auths_new_interface/setting.js.erb b/app/views/admin/object_auths_new_interface/setting.js.erb new file mode 100644 index 00000000..0ca148da --- /dev/null +++ b/app/views/admin/object_auths_new_interface/setting.js.erb @@ -0,0 +1,2 @@ +$("#users_checkbox_ary").replaceWith('<%= escape_javascript(render :partial => "privilege_user", :locals => {:users => @users_array})%>'); +permissionCheckbox(); \ No newline at end of file diff --git a/app/views/admin/object_auths_new_interface/update_setting.js.erb b/app/views/admin/object_auths_new_interface/update_setting.js.erb new file mode 100644 index 00000000..7486000a --- /dev/null +++ b/app/views/admin/object_auths_new_interface/update_setting.js.erb @@ -0,0 +1 @@ +alert( "<% flash.each do |key, msg| %><%= msg %><% end%>"); \ No newline at end of file diff --git a/app/views/admin/object_auths_new_interface/user_list.js.erb b/app/views/admin/object_auths_new_interface/user_list.js.erb new file mode 100644 index 00000000..ebb088cc --- /dev/null +++ b/app/views/admin/object_auths_new_interface/user_list.js.erb @@ -0,0 +1,2 @@ +$('#show_preview').html("<%= escape_javascript(render(:partial => 'modal_list',:locals => {:ob_auth => @ob_auth})) %>"); +var start_modal_with_id = "ob_auth-<%=@ob_auth.id%>" \ No newline at end of file diff --git a/app/views/layouts/_side_bar.html.erb b/app/views/layouts/_side_bar.html.erb index 0a6c6912..7a9bcf4e 100644 --- a/app/views/layouts/_side_bar.html.erb +++ b/app/views/layouts/_side_bar.html.erb @@ -5,29 +5,29 @@ <%= javascript_include_tag "/static/kernel.js" %> <% end %> -<%= content_tag :li, :class => (active_for_controllers('bulletins', '/panel/announcement/back_end/tags', 'bulletin_categorys', 'approvals') || active_sys_call_for_app('new_interface_module_apps','setting','Announcement',:module_app_id) ) do -%> +<%= content_tag :li, :class => (active_for_controllers('bulletins', '/panel/announcement/back_end/tags', 'bulletin_categorys', 'approvals') || active_for_app_auth('Announcement') || active_for_ob_auths_object("BulletinCategory") ) do -%> <%= link_to content_tag(:i, nil, :class => 'icons-announcement') + t('admin.announcement'), panel_announcement_back_end_bulletins_path %> <%= content_tag :ul, :class => ("nav nav-list " + visible_for_controllers('bulletins', '/panel/announcement/back_end/tags', 'bulletin_categorys', 'approvals')) do -%> <%= content_tag :li, link_to(t('announcement.all_articles'), panel_announcement_back_end_bulletins_path), :class => active_for_action('bulletins', 'index') %> <%= content_tag :li, link_to(t('announcement.add_new'), new_panel_announcement_back_end_bulletin_path), :class => active_for_action('bulletins', 'new') %> - <%= content_tag :li, link_to(t('announcement.categories'), panel_announcement_back_end_bulletin_categorys_path), :class => active_for_action('bulletin_categorys', 'index') %> + <%= content_tag :li, link_to(t('announcement.categories'), panel_announcement_back_end_bulletin_categorys_path), :class =>( active_for_action('bulletin_categorys', 'index') || active_for_ob_auths_object("BulletinCategory") ) %> <%= content_tag :li, link_to(t('announcement.tags'), panel_announcement_back_end_tags_path), :class => active_for_action('/panel/announcement/back_end/tags', 'index') %> <%= content_tag :li, link_to(t('announcement.bulletin.approval_setting'), panel_announcement_back_end_approval_setting_path), :class => active_for_action('approvals', 'setting') if (is_manager? rescue nil) %> - <%= content_tag :li, link_to(t('admin.module.authorization'),admin_module_app_manager_auth_proc_path(ModuleApp.first(conditions: {title: "Announcement"}))), :class => active_sys_call_for_app('new_interface_module_apps','setting','Announcement',:module_app_id) if (is_admin? rescue nil) %> + <%= content_tag :li, link_to(t('admin.module.authorization'),admin_module_app_manager_auth_proc_path(ModuleApp.first(conditions: {title: "Announcement"}))), :class => active_for_app_auth('Announcement') if (is_admin? rescue nil) %> <% end -%> <% end -%> -<%= content_tag :li, :class =>( active_for_controllers('news_bulletins', '/panel/news/back_end/tags', 'news_bulletin_categorys', 'news_approvals')|| active_sys_call_for_app('new_interface_module_apps','setting','news',:module_app_id)) do -%> +<%= content_tag :li, :class =>( active_for_controllers('news_bulletins', '/panel/news/back_end/tags', 'news_bulletin_categorys', 'news_approvals')|| active_for_app_auth('news') || active_for_ob_auths_object("NewsBulletinCategory")) do -%> <%= link_to content_tag(:i, nil, :class => 'icons-announcement') + t('admin.news'), panel_news_back_end_news_bulletins_path %> <%= content_tag :ul, :class => ("nav nav-list " + visible_for_controllers('news_bulletins', '/panel/news/back_end/tags', 'news_bulletin_categorys', 'news_approvals')) do -%> <%= content_tag :li, link_to(t('announcement.all_articles'), panel_news_back_end_news_bulletins_path), :class => active_for_action('news_bulletins', 'index') %> <%= content_tag :li, link_to(t('announcement.add_new'), new_panel_news_back_end_news_bulletin_path), :class => active_for_action('news_bulletins', 'new') %> - <%= content_tag :li, link_to(t('announcement.categories'), panel_news_back_end_news_bulletin_categorys_path), :class => active_for_action('news_bulletin_categorys', 'index') %> + <%= content_tag :li, link_to(t('announcement.categories'), panel_news_back_end_news_bulletin_categorys_path), :class => active_for_action('news_bulletin_categorys', 'index') || active_for_ob_auths_object("NewsBulletinCategory") %> <%= content_tag :li, link_to(t('announcement.tags'), panel_news_back_end_tags_path), :class => active_for_action('/panel/news/back_end/tags', 'index') %> <%= content_tag :li, link_to(t('announcement.bulletin.approval_setting'), panel_news_back_end_news_approval_setting_path), :class => active_for_action('news_approvals', 'setting') if (is_manager? rescue nil) %> - <%= content_tag :li, link_to(t('admin.module.authorization'),admin_module_app_manager_auth_proc_path(ModuleApp.first(conditions: {key: "news"}))), :class => active_sys_call_for_app('new_interface_module_apps','setting','news',:module_app_id) if (is_admin? rescue nil) %> + <%= content_tag :li, link_to(t('admin.module.authorization'),admin_module_app_manager_auth_proc_path(ModuleApp.first(conditions: {key: "news"}))), :class => active_for_app_auth('news') if (is_admin? rescue nil) %> <% end -%> <% end -%> @@ -47,14 +47,14 @@ <%= link_to content_tag(:i, nil, :class => 'icons-window-block') + t('admin.design'), admin_designs_path %> <% end -%> -<%= content_tag :li, :class => active_for_controllers('ad_banners', 'ad_images') || active_sys_call_for_app('module_apps','edit','ad_banners') do -%> +<%= content_tag :li, :class => active_for_controllers('ad_banners', 'ad_images') || active_for_app_auth('ad_banners') do -%> <%= link_to content_tag(:i, nil, :class => 'icons-link') + t('admin.ad_banner'), admin_ad_banners_path %> <%= content_tag :ul, :class => ("nav nav-list " + visible_for_controllers('ad_banners', 'ad_images') ) do -%> <%#= content_tag :li, link_to(t('admin.ad.all_banners'), admin_ad_banners_path), :class => active_for_action('ad_banners', 'index') %> <%#= content_tag :li, link_to(t('admin.ad.new_banner'), new_admin_ad_banner_path), :class => active_for_action('ad_banners', 'new') %> <%#= content_tag :li, link_to(t('admin.ad.new_image'), new_ad_image_admin_ad_banners_path), :class => active_for_action('ad_images', 'new') %> - <%= content_tag :li, link_to(t('admin.module.authorization'),admin_module_app_manager_auth_proc_path(ModuleApp.first(conditions: {title: "ad_banners"}))), :class => active_sys_call_for_app('new_interface_module_apps','setting','ad_banners',:module_app_id) if (is_admin? rescue nil) %> + <%= content_tag :li, link_to(t('admin.module.authorization'),admin_module_app_manager_auth_proc_path(ModuleApp.first(conditions: {title: "ad_banners"}))), :class => active_for_app_auth('ad_banners') if (is_admin? rescue nil) %> <% end -%> <% end %> diff --git a/config/locales/en.yml b/config/locales/en.yml index 07bfe189..f5407124 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -197,6 +197,10 @@ en: new_role: New user role news: News non_multilingual: Non multilingual + object_auth: + list_title_of_users: %{auth_title} Auth List + update_done: Update done,reulst showing in list + update_failed: Update failed options: Options orig_upload_file: Original filename page: Page diff --git a/config/locales/zh_tw.yml b/config/locales/zh_tw.yml index ae1b92f3..29721630 100644 --- a/config/locales/zh_tw.yml +++ b/config/locales/zh_tw.yml @@ -191,7 +191,11 @@ zh_tw: new_info: 新增用戶資料 new_role: 新增用戶身份 news: 新聞 - non_multilingual: 非多種語言 + non_multilingual: + object_auth: + list_title_of_users: 授權清單-%{auth_title} + update_done: 更新完成,結果顯示於清單 + update_failed: 更新失敗 options: 選項 orig_upload_file: 原上傳檔名 page: 頁面管理 diff --git a/lib/orbit_core_lib.rb b/lib/orbit_core_lib.rb index b92f4eca..281654a7 100644 --- a/lib/orbit_core_lib.rb +++ b/lib/orbit_core_lib.rb @@ -19,6 +19,10 @@ module OrbitCoreLib end + def pp_object + "Object Auth method 'pp_object' need to be defined for class #{self.class}" + end + def get_object_auth_by_title(title) self.object_auths.where({title: title }).first end diff --git a/vendor/built_in_modules/announcement/app/helpers/panel/announcement/back_end/bulletin_categorys_helper.rb b/vendor/built_in_modules/announcement/app/helpers/panel/announcement/back_end/bulletin_categorys_helper.rb index 1fccbbe1..92604985 100644 --- a/vendor/built_in_modules/announcement/app/helpers/panel/announcement/back_end/bulletin_categorys_helper.rb +++ b/vendor/built_in_modules/announcement/app/helpers/panel/announcement/back_end/bulletin_categorys_helper.rb @@ -10,7 +10,7 @@ include ActionView::Helpers::UrlHelper oa = bulletin_category.get_object_auth_by_title(type) end # link_to t('announcement.bulletin.cate_auth'), edit_admin_object_auth_path(oa) - link_to t('announcement.bulletin.cate_auth'),panel_announcement_back_end_bulletin_category_setting_path(bulletin_category) + link_to t('announcement.bulletin.cate_auth'),admin_object_auth_ob_auth_path(oa) end end \ No newline at end of file diff --git a/vendor/built_in_modules/announcement/app/models/bulletin_category.rb b/vendor/built_in_modules/announcement/app/models/bulletin_category.rb index 7daaf6db..955d5f18 100644 --- a/vendor/built_in_modules/announcement/app/models/bulletin_category.rb +++ b/vendor/built_in_modules/announcement/app/models/bulletin_category.rb @@ -18,6 +18,10 @@ class BulletinCategory has_many :bulletins + def pp_object + i18n_variable[I18n.locale] + end + def self.from_id(id) BulletinCategory.find(id) rescue nil end diff --git a/vendor/built_in_modules/news/app/helpers/panel/news/back_end/news_bulletin_categorys_helper.rb b/vendor/built_in_modules/news/app/helpers/panel/news/back_end/news_bulletin_categorys_helper.rb index 74905640..4b896555 100644 --- a/vendor/built_in_modules/news/app/helpers/panel/news/back_end/news_bulletin_categorys_helper.rb +++ b/vendor/built_in_modules/news/app/helpers/panel/news/back_end/news_bulletin_categorys_helper.rb @@ -10,7 +10,7 @@ include ActionView::Helpers::UrlHelper oa = news_bulletin_category.get_object_auth_by_title(type) end # link_to t('announcement.bulletin.cate_auth'), edit_admin_object_auth_path(oa) -link_to t('announcement.bulletin.cate_auth'),panel_news_back_end_news_bulletin_category_setting_path(news_bulletin_category) + link_to t('announcement.bulletin.cate_auth'),admin_object_auth_ob_auth_path(oa) end diff --git a/vendor/built_in_modules/news/app/models/news_bulletin_category.rb b/vendor/built_in_modules/news/app/models/news_bulletin_category.rb index 45576589..b3dd7bc4 100644 --- a/vendor/built_in_modules/news/app/models/news_bulletin_category.rb +++ b/vendor/built_in_modules/news/app/models/news_bulletin_category.rb @@ -18,6 +18,10 @@ class NewsBulletinCategory has_many :news_bulletins + def pp_object + i18n_variable[I18n.locale] + end + def self.from_id(id) NewsBulletinCategory.find(id) rescue nil end From 0a34f0277eec1b7ced7dbd7d9da3dd58b33d64e8 Mon Sep 17 00:00:00 2001 From: "Matthew K. Fu JuYuan" <matthewfu@gmail.com> Date: Fri, 11 May 2012 16:46:36 +0800 Subject: [PATCH 07/26] Remove unless files and change routes. --- .../new_interface_module_apps_controller.rb | 66 ------------------- .../_modal_list.html.erb | 42 ------------ .../_privilege_user.html.erb | 25 ------- .../setting.html.erb | 56 ---------------- .../new_interface_module_apps/setting.js.erb | 2 - .../update_setting.js.erb | 1 - .../user_list.js.erb | 2 - config/routes.rb | 11 +++- .../bulletin_category_setting_controller.rb | 64 ------------------ .../_modal_list.html.erb | 44 ------------- .../_privilege_user.html.erb | 25 ------- .../setting.html.erb | 56 ---------------- .../bulletin_category_setting/setting.js.erb | 2 - .../update_setting.js.erb | 1 - .../user_list.js.erb | 2 - .../announcement/config/routes.rb | 6 +- ...ws_bulletin_category_setting_controller.rb | 64 ------------------ .../_modal_list.html.erb | 44 ------------- .../_privilege_user.html.erb | 25 ------- .../setting.html.erb | 56 ---------------- .../setting.js.erb | 2 - .../update_setting.js.erb | 1 - .../user_list.js.erb | 2 - vendor/built_in_modules/news/config/routes.rb | 6 +- 24 files changed, 10 insertions(+), 595 deletions(-) delete mode 100644 app/controllers/admin/new_interface_module_apps_controller.rb delete mode 100644 app/views/admin/new_interface_module_apps/_modal_list.html.erb delete mode 100644 app/views/admin/new_interface_module_apps/_privilege_user.html.erb delete mode 100644 app/views/admin/new_interface_module_apps/setting.html.erb delete mode 100644 app/views/admin/new_interface_module_apps/setting.js.erb delete mode 100644 app/views/admin/new_interface_module_apps/update_setting.js.erb delete mode 100644 app/views/admin/new_interface_module_apps/user_list.js.erb delete mode 100644 vendor/built_in_modules/announcement/app/controllers/panel/announcement/back_end/bulletin_category_setting_controller.rb delete mode 100644 vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/_modal_list.html.erb delete mode 100644 vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/_privilege_user.html.erb delete mode 100644 vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/setting.html.erb delete mode 100644 vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/setting.js.erb delete mode 100644 vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/update_setting.js.erb delete mode 100644 vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/user_list.js.erb delete mode 100644 vendor/built_in_modules/news/app/controllers/panel/news/back_end/news_bulletin_category_setting_controller.rb delete mode 100644 vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/_modal_list.html.erb delete mode 100644 vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/_privilege_user.html.erb delete mode 100644 vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/setting.html.erb delete mode 100644 vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/setting.js.erb delete mode 100644 vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/update_setting.js.erb delete mode 100644 vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/user_list.js.erb diff --git a/app/controllers/admin/new_interface_module_apps_controller.rb b/app/controllers/admin/new_interface_module_apps_controller.rb deleted file mode 100644 index 8cf77e5e..00000000 --- a/app/controllers/admin/new_interface_module_apps_controller.rb +++ /dev/null @@ -1,66 +0,0 @@ -class Admin::NewInterfaceModuleAppsController < ApplicationController - before_filter :authenticate_user! - before_filter :is_admin? - include AdminHelper - - layout "new_admin" - - def setting - @sys_users = User.all(conditions: {admin: false}) - @module_app = ModuleApp.find(params[:module_app_id]) - @options_from_collection_for_select_bulletin_categorys = [@module_app].collect{|ma| [ma.title,ma.id] } - # if params.has_key? :category - # @bulletin_category = BulletinCategory.find params[:category][:id] - # else - # @bulletin_category = @bulletin_categorys.first - # end - @users_array = @module_app.managing_users rescue [] - - respond_to do |format| - format.html - format.js - end - end - - def update_setting - module_app = update_setting_by_params - if module_app.save! - flash[:notice] = "Update Done" - else - flash[:notice] = "Update Failed" - end - end - - def user_list - @module_app = ModuleApp.find params[:module_app][:id] - end - - protected - def update_setting_by_params - ma = ModuleApp.find params[:module_app][:id] - user_sat = User.find params[:users].keys - users_to_new = user_sat - ma.managing_users - users_to_remove = ma.managing_users - user_sat - - users_to_new.each do |new_user| - ma.assign_manager(new_user,current_user) - end - - users_to_remove.each do |remove_user| - ma.remove_manager(remove_user) - end - ma - end - - def get_categorys(id = nil) - @bulletin_categorys = [] - if(is_manager? || is_admin?) - @bulletin_categorys = (id ? BulletinCategory.find(id).to_a : BulletinCategory.excludes('disabled' => true)) - elsif is_sub_manager? - @bulletin_categorys = BulletinCategory.authed_for_user(current_user,'submit_new') - end - end - - - -end \ No newline at end of file diff --git a/app/views/admin/new_interface_module_apps/_modal_list.html.erb b/app/views/admin/new_interface_module_apps/_modal_list.html.erb deleted file mode 100644 index b5b0ebcd..00000000 --- a/app/views/admin/new_interface_module_apps/_modal_list.html.erb +++ /dev/null @@ -1,42 +0,0 @@ -<% if module_app -%> - -<div class="modal hide fade in" id="module_app-<%=module_app.id%>"> - <div class="modal-header"> - <a class="close" data-dismiss="modal">×</a> - <h3><%= t("admin.user_role.auth.manager") %></h3> - </div> - <div class="modal-body"> - <div class="clear"> - <% module_app.managing_users.each do |user| %> - <div class="checkbox clear checked"> - <div class='member-avatar'> - <% if user.avatar? %> - <%= image_tag(user.avatar.thumb.url,:class => "member-img") %> - <% else %> - <%= image_tag "person.png",:class => "member-img" %> - <% end %> - </div> - <%= label_tag "lab-user-#{user.id}", (user.name rescue ''),:class=>"member-name",:id=>nil -%> - </div> - <% end -%> - <divl> - </div> - <div class="modal-footer"> - <a href="#" class="btn" data-dismiss="modal"><%= t("modal.close") %></a> - </div> - <div> - <script type="text/javascript" src="/static/kernel.js"></script> - <script type="text/javascript"> - $(document).ready(function() { - - $("#module_app-<%=module_app.id%>").on("show", function () { - }); - $(".modal").on("hidden", function () { - $("#show_preview").remove(); - }); - }); - </script> - </div> -</div> - -<% end -%> \ No newline at end of file diff --git a/app/views/admin/new_interface_module_apps/_privilege_user.html.erb b/app/views/admin/new_interface_module_apps/_privilege_user.html.erb deleted file mode 100644 index 90f5cb65..00000000 --- a/app/views/admin/new_interface_module_apps/_privilege_user.html.erb +++ /dev/null @@ -1,25 +0,0 @@ -<%= content_tag :div ,:id => "users_checkbox_ary",:class => 'clear' do -%> - <% @sys_users.each do |sys_user| -%> - - <div class="checkblock"> - - <% sys_user.sub_roles.each do |sr| %> - <div class="for_unit" style="display:none;"> <%= sr.key %></div> - <% end %> - <%= content_tag :div,:data=>{'original-title'=>t('announcement.bulletin.approval_setting_window_title'),:content => "#{sys_user.sub_roles.collect{|sr| sr.i18n_variable[I18n.locale]}.join(',')}"},:class=>"checkbox clear" do %> - <div class="check-icon"> - </div> - <div class='member-avatar'> - <% if sys_user.avatar? %> - <%= image_tag(sys_user.avatar.thumb.url,:class => "member-img") %> - <% else %> - <%= image_tag "person.png",:class => "member-img" %> - <% end %> - </div> - <%= label_tag "lab-user-#{sys_user.id}", (sys_user.name rescue ''),:class=>"member-name",:id=>nil -%> - <%= check_box_tag "[users][#{sys_user.id}]", 'true',users.include?(sys_user),:class => "check" -%> - <%end -%> - </div> - - <% end -%> -<% end -%> \ No newline at end of file diff --git a/app/views/admin/new_interface_module_apps/setting.html.erb b/app/views/admin/new_interface_module_apps/setting.html.erb deleted file mode 100644 index 7d1179f0..00000000 --- a/app/views/admin/new_interface_module_apps/setting.html.erb +++ /dev/null @@ -1,56 +0,0 @@ -<% content_for :page_specific_css do %> - <%= stylesheet_link_tag "inc/permission-checkbox" %> -<% end %> -<% content_for :page_specific_javascript do %> - <%= javascript_include_tag "inc/permission-checkbox" %> - <%= javascript_include_tag "inc/search" %> - <%= javascript_include_tag "inc/modal-preview" %> -<% end %> -<%#= label_tag :fact_check_setting, t("announcement.bulletin.fact_check_setting") %> -<%= form_tag('', :remote => true,:class => "prevent_enter_submit_form") %> -<div class="subnav clear"> - <ul class="nav nav-pills filter pull-left"> - <li class="accordion-group"> - <div class="form-search" style="margin: 5px 10px;"> - <%= label_tag :module, t("module") %> - <%= select "module_app",'id',@options_from_collection_for_select_bulletin_categorys %> - <%= search_field_tag 'user_filter' %> - </div> - - </li> - </ul> - <%= link_to t("admin.user_role.auth.manager"), admin_module_app_manager_auth_show_path , :class=>'preview_trigger btn btn-success pull-right'%> - -</div> -<%#= label_tag :role, t("admin.roles") %> -<div class="clear"> -<%= content_tag :div do -%> - <% form_tag admin_module_app_manager_auth_proc_path do %> - <%= render :partial => "privilege_user", :locals => {:users => @users_array} %> - <div class="form-actions form-fixed pagination-right"> - <%= submit_tag "Update", :class => 'btn btn-primary' %> - </div> - <% end -%> -<% end -%> -</div> - -<script type="text/javascript" charset="utf-8"> -var availableTags = []; -$(document).ready(function() { - - $(".prevent_enter_submit_form").bind("keypress", function(e) { - if (e.keyCode == 13) { - return false; - } - }); - - $('#category_id').change(function() { - $.ajax({ - type: 'GET', - dataType: "script", - url:$(this).parents("from").attr("href"), - data:$(this).parents("form").serialize() - }); - }); -}); -</script> \ No newline at end of file diff --git a/app/views/admin/new_interface_module_apps/setting.js.erb b/app/views/admin/new_interface_module_apps/setting.js.erb deleted file mode 100644 index 0ca148da..00000000 --- a/app/views/admin/new_interface_module_apps/setting.js.erb +++ /dev/null @@ -1,2 +0,0 @@ -$("#users_checkbox_ary").replaceWith('<%= escape_javascript(render :partial => "privilege_user", :locals => {:users => @users_array})%>'); -permissionCheckbox(); \ No newline at end of file diff --git a/app/views/admin/new_interface_module_apps/update_setting.js.erb b/app/views/admin/new_interface_module_apps/update_setting.js.erb deleted file mode 100644 index 7486000a..00000000 --- a/app/views/admin/new_interface_module_apps/update_setting.js.erb +++ /dev/null @@ -1 +0,0 @@ -alert( "<% flash.each do |key, msg| %><%= msg %><% end%>"); \ No newline at end of file diff --git a/app/views/admin/new_interface_module_apps/user_list.js.erb b/app/views/admin/new_interface_module_apps/user_list.js.erb deleted file mode 100644 index 7caf1e39..00000000 --- a/app/views/admin/new_interface_module_apps/user_list.js.erb +++ /dev/null @@ -1,2 +0,0 @@ -$('#show_preview').html("<%= escape_javascript(render(:partial => 'modal_list',:locals => {:module_app => @module_app})) %>"); -var start_modal_with_id = "module_app-<%=@module_app.id%>" \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 863d17fd..065bba1d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -16,6 +16,11 @@ Orbit::Application.routes.draw do resources :assets resources :app_auths resources :object_auths do + match 'new_interface/:ob_type/:title/new' => "object_auths_new_interface#new" ,:as => :init_ob_auth,:via => :get + match 'new_interface' => "object_auths_new_interface#setting" ,:as => :ob_auth,:via => :get + match 'new_interface' => "object_auths_new_interface#update_setting" ,:as => :ob_auth,:via => :post + match 'new_interface' => "object_auths_new_interface#user_list" ,:as => :ob_auth_show,:via => :put + collection do match 'new/:type/:obj_id',:action => 'new',:via => "get",:as => :init end @@ -61,9 +66,9 @@ Orbit::Application.routes.draw do end end resources :module_apps do - match 'manager_auth_proc' => "new_interface_module_apps#setting" ,:as => :manager_auth_proc,:via => :get - match 'manager_auth_proc' => "new_interface_module_apps#update_setting" ,:as => :manager_auth_proc,:via => :post - match 'manager_auth_proc' => "new_interface_module_apps#user_list" ,:as => :manager_auth_show,:via => :put + match 'manager_auth_proc' => "module_apps_new_interface#setting" ,:as => :manager_auth_proc,:via => :get + match 'manager_auth_proc' => "module_apps_new_interface#update_setting" ,:as => :manager_auth_proc,:via => :post + match 'manager_auth_proc' => "module_apps_new_interface#user_list" ,:as => :manager_auth_show,:via => :put resources :app_auths do member do match 'remove/:type/:target_id' ,:action=> 'remove',:via => "delete",:as =>:remove diff --git a/vendor/built_in_modules/announcement/app/controllers/panel/announcement/back_end/bulletin_category_setting_controller.rb b/vendor/built_in_modules/announcement/app/controllers/panel/announcement/back_end/bulletin_category_setting_controller.rb deleted file mode 100644 index 8903adb2..00000000 --- a/vendor/built_in_modules/announcement/app/controllers/panel/announcement/back_end/bulletin_category_setting_controller.rb +++ /dev/null @@ -1,64 +0,0 @@ -class Panel::Announcement::BackEnd::BulletinCategorySettingController < OrbitBackendController - before_filter :authenticate_user! - before_filter :for_app_manager - include AdminHelper - # layout 'admin' - def preview_and_approve - @bulletin = Bulletin.find params[:bulletin_id] - end - - # def approve - # - # end - - def setting - @sys_users = User.all(conditions: {admin: false}) - @bulletin_categorys = [] - @bulletin_categorys << BulletinCategory.find(params[:bulletin_category_id]) - @options_from_collection_for_select_bulletin_categorys = @bulletin_categorys.collect{|bc| [bc.i18n_variable[I18n.locale],bc.id] } - if params.has_key? :category - @bulletin_category = BulletinCategory.find params[:category][:id] - else - @bulletin_category = @bulletin_categorys.first - end - preload_object_auth = @bulletin_category.object_auths.where(title: 'submit').empty?? (@bulletin_category.object_auths.create! :title=> 'submit') : @bulletin_category.object_auths.where(title: 'submit') - @users_array = preload_object_auth.first.privilege_users rescue [] - respond_to do |format| - format.html - format.js - end - end - - def update_setting - object_auth = update_setting_by_params - if object_auth.save! - flash[:notice] = "Update Done" - else - flash[:notice] = "Update Failed" - end - end - - def user_list - @bulletin_category = BulletinCategory.find params[:category][:id] - end - - protected - def update_setting_by_params - category = BulletinCategory.find params[:category][:id] - privilege_users = params[:users].collect{|key,value| User.find key } rescue [] - object_auth_ary = category.object_auths.where(title: 'submit') || (category.object_auths.create :title=> 'submit') - object_auth = object_auth_ary.first - object_auth.privilege_users = privilege_users - object_auth - end - - def get_categorys(id = nil) - @bulletin_categorys = [] - if(is_manager? || is_admin?) - @bulletin_categorys = (id ? BulletinCategory.find(id).to_a : BulletinCategory.excludes('disabled' => true)) - elsif is_sub_manager? - @bulletin_categorys = BulletinCategory.authed_for_user(current_user,'submit_new') - end - end - -end diff --git a/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/_modal_list.html.erb b/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/_modal_list.html.erb deleted file mode 100644 index a73fdab2..00000000 --- a/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/_modal_list.html.erb +++ /dev/null @@ -1,44 +0,0 @@ -<% if bulletin_category -%> - -<div class="modal hide fade in" id="bulletin_category-<%=bulletin_category.id%>"> - <div class="modal-header"> - <a class="close" data-dismiss="modal">×</a> - <h3><%= t("announcement.bulletin.approval_user_list") %></h3> - </div> - <div class="modal-body"> - <div class="clear"> - <% bulletin_category.get_object_auth_by_title('submit').auth_users.each do |user| %> - <div class="checkbox clear checked"> - <div class='member-avatar'> - <% if user.avatar? %> - <%= image_tag(user.avatar.thumb.url,:class => "member-img") %> - <% else %> - <%= image_tag "person.png",:class => "member-img" %> - <% end %> - </div> - <%= label_tag "lab-user-#{user.id}", (user.name rescue ''),:class=>"member-name",:id=>nil -%> - </div> - <% end -%> - <divl> - </div> - <div class="modal-footer"> - <a href="#" class="btn" data-dismiss="modal"><%= t("modal.close") %></a> - </div> - <div> - <script type="text/javascript" src="/static/kernel.js"></script> - <script type="text/javascript"> - $(document).ready(function() { - - $("#bulletin_category-<%=bulletin_category.id%>").on("show", function () { - }); - $(".modal").on("hidden", function () { - $("#show_preview").remove(); - }); - }); - </script> - </div> -</div> - - - -<% end -%> \ No newline at end of file diff --git a/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/_privilege_user.html.erb b/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/_privilege_user.html.erb deleted file mode 100644 index 90f5cb65..00000000 --- a/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/_privilege_user.html.erb +++ /dev/null @@ -1,25 +0,0 @@ -<%= content_tag :div ,:id => "users_checkbox_ary",:class => 'clear' do -%> - <% @sys_users.each do |sys_user| -%> - - <div class="checkblock"> - - <% sys_user.sub_roles.each do |sr| %> - <div class="for_unit" style="display:none;"> <%= sr.key %></div> - <% end %> - <%= content_tag :div,:data=>{'original-title'=>t('announcement.bulletin.approval_setting_window_title'),:content => "#{sys_user.sub_roles.collect{|sr| sr.i18n_variable[I18n.locale]}.join(',')}"},:class=>"checkbox clear" do %> - <div class="check-icon"> - </div> - <div class='member-avatar'> - <% if sys_user.avatar? %> - <%= image_tag(sys_user.avatar.thumb.url,:class => "member-img") %> - <% else %> - <%= image_tag "person.png",:class => "member-img" %> - <% end %> - </div> - <%= label_tag "lab-user-#{sys_user.id}", (sys_user.name rescue ''),:class=>"member-name",:id=>nil -%> - <%= check_box_tag "[users][#{sys_user.id}]", 'true',users.include?(sys_user),:class => "check" -%> - <%end -%> - </div> - - <% end -%> -<% end -%> \ No newline at end of file diff --git a/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/setting.html.erb b/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/setting.html.erb deleted file mode 100644 index d20bfc27..00000000 --- a/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/setting.html.erb +++ /dev/null @@ -1,56 +0,0 @@ -<% content_for :page_specific_css do %> - <%= stylesheet_link_tag "inc/permission-checkbox" %> -<% end %> -<% content_for :page_specific_javascript do %> - <%= javascript_include_tag "inc/permission-checkbox" %> - <%= javascript_include_tag "inc/search" %> - <%= javascript_include_tag "inc/modal-preview" %> -<% end %> -<%#= label_tag :fact_check_setting, t("announcement.bulletin.fact_check_setting") %> -<%= form_tag('', :remote => true,:class => "prevent_enter_submit_form") %> -<div class="subnav clear"> - <ul class="nav nav-pills filter pull-left"> - <li class="accordion-group"> - <div class="form-search" style="margin: 5px 10px;"> - <%= label_tag :category, t("announcement.bulletin.category") %> - <%= select "category",'id',@options_from_collection_for_select_bulletin_categorys %> - <%= search_field_tag 'user_filter' %> - </div> - - </li> - </ul> - <%= link_to t("announcement.bulletin.approval_user_list"), panel_announcement_back_end_bulletin_category_user_list_path , :class=>'preview_trigger btn btn-success pull-right'%> - -</div> -<%#= label_tag :role, t("admin.roles") %> -<div class="clear"> -<%= content_tag :div do -%> - <% form_tag panel_announcement_back_end_approval_setting_path do %> - <%= render :partial => "privilege_user", :locals => {:users => @users_array} %> - <div class="form-actions form-fixed pagination-right"> - <%= submit_tag "Update", :class => 'btn btn-primary' %> - </div> - <% end -%> -<% end -%> -</div> - -<script type="text/javascript" charset="utf-8"> -var availableTags = []; -$(document).ready(function() { - - $(".prevent_enter_submit_form").bind("keypress", function(e) { - if (e.keyCode == 13) { - return false; - } - }); - - $('#category_id').change(function() { - $.ajax({ - type: 'GET', - dataType: "script", - url:$(this).parents("from").attr("href"), - data:$(this).parents("form").serialize() - }); - }); -}); -</script> \ No newline at end of file diff --git a/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/setting.js.erb b/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/setting.js.erb deleted file mode 100644 index 0ca148da..00000000 --- a/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/setting.js.erb +++ /dev/null @@ -1,2 +0,0 @@ -$("#users_checkbox_ary").replaceWith('<%= escape_javascript(render :partial => "privilege_user", :locals => {:users => @users_array})%>'); -permissionCheckbox(); \ No newline at end of file diff --git a/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/update_setting.js.erb b/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/update_setting.js.erb deleted file mode 100644 index 7486000a..00000000 --- a/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/update_setting.js.erb +++ /dev/null @@ -1 +0,0 @@ -alert( "<% flash.each do |key, msg| %><%= msg %><% end%>"); \ No newline at end of file diff --git a/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/user_list.js.erb b/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/user_list.js.erb deleted file mode 100644 index 4c8bf25d..00000000 --- a/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/user_list.js.erb +++ /dev/null @@ -1,2 +0,0 @@ -$('#show_preview').html("<%= escape_javascript(render(:partial => 'modal_list',:locals => {:bulletin_category => @bulletin_category})) %>"); -var start_modal_with_id = "bulletin_category-<%=@bulletin_category.id%>" \ No newline at end of file diff --git a/vendor/built_in_modules/announcement/config/routes.rb b/vendor/built_in_modules/announcement/config/routes.rb index c6a406b0..a9f1c496 100644 --- a/vendor/built_in_modules/announcement/config/routes.rb +++ b/vendor/built_in_modules/announcement/config/routes.rb @@ -21,11 +21,7 @@ Rails.application.routes.draw do match "file_quick_edit/:bulletin_id" => "bulletins#file_quick_edit" ,:as => :file_quick_edit end - resources :bulletin_categorys do - match 'submit_setting' => "bulletin_category_setting#setting" ,:as => :setting,:via => :get - match 'submit_setting' => "bulletin_category_setting#update_setting" ,:as => :setting,:via => :post - match 'submit_setting' => "bulletin_category_setting#user_list" ,:as => :user_list,:via => :put - end + resources :bulletin_categorys resources :bulletin_links, :controller => 'bulletin_links' do match "link_quick_edit/:bulletin_link_id" => "bulletin_links#link_quick_edit" ,:as => :link_quick_edit diff --git a/vendor/built_in_modules/news/app/controllers/panel/news/back_end/news_bulletin_category_setting_controller.rb b/vendor/built_in_modules/news/app/controllers/panel/news/back_end/news_bulletin_category_setting_controller.rb deleted file mode 100644 index 6ac76973..00000000 --- a/vendor/built_in_modules/news/app/controllers/panel/news/back_end/news_bulletin_category_setting_controller.rb +++ /dev/null @@ -1,64 +0,0 @@ -class Panel::News::BackEnd::NewsBulletinCategorySettingController < OrbitBackendController - before_filter :authenticate_user! - before_filter :for_app_manager - include AdminHelper - # layout 'admin' - # def preview_and_approve - # @bulletin = Bulletin.find params[:bulletin_id] - # end - - # def approve - # - # end - - def setting - @sys_users = User.all(conditions: {admin: false}) - @bulletin_categorys = [] - @bulletin_categorys << NewsBulletinCategory.find(params[:news_bulletin_category_id]) - @options_from_collection_for_select_bulletin_categorys = @bulletin_categorys.collect{|bc| [bc.i18n_variable[I18n.locale],bc.id] } - if params.has_key? :category - @bulletin_category = NewsBulletinCategory.find params[:category][:id] - else - @bulletin_category = @bulletin_categorys.first - end - preload_object_auth = @bulletin_category.object_auths.where(title: 'submit').empty?? (@bulletin_category.object_auths.create! :title=> 'submit') : @bulletin_category.object_auths.where(title: 'submit') - @users_array = preload_object_auth.first.privilege_users rescue [] - respond_to do |format| - format.html - format.js - end - end - - def update_setting - object_auth = update_setting_by_params - if object_auth.save! - flash[:notice] = "Update Done" - else - flash[:notice] = "Update Failed" - end - end - - def user_list - @bulletin_category = NewsBulletinCategory.find params[:category][:id] - end - - protected - def update_setting_by_params - category = NewsBulletinCategory.find params[:category][:id] - privilege_users = params[:users].collect{|key,value| User.find key } rescue [] - object_auth_ary = category.object_auths.where(title: 'submit') || (category.object_auths.create :title=> 'submit') - object_auth = object_auth_ary.first - object_auth.privilege_users = privilege_users - object_auth - end - - def get_categorys(id = nil) - @bulletin_categorys = [] - if(is_manager? || is_admin?) - @bulletin_categorys = (id ? NewsBulletinCategory.find(id).to_a : NewsBulletinCategory.excludes('disabled' => true)) - elsif is_sub_manager? - @bulletin_categorys = NewsBulletinCategory.authed_for_user(current_user,'submit_new') - end - end - -end diff --git a/vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/_modal_list.html.erb b/vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/_modal_list.html.erb deleted file mode 100644 index a73fdab2..00000000 --- a/vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/_modal_list.html.erb +++ /dev/null @@ -1,44 +0,0 @@ -<% if bulletin_category -%> - -<div class="modal hide fade in" id="bulletin_category-<%=bulletin_category.id%>"> - <div class="modal-header"> - <a class="close" data-dismiss="modal">×</a> - <h3><%= t("announcement.bulletin.approval_user_list") %></h3> - </div> - <div class="modal-body"> - <div class="clear"> - <% bulletin_category.get_object_auth_by_title('submit').auth_users.each do |user| %> - <div class="checkbox clear checked"> - <div class='member-avatar'> - <% if user.avatar? %> - <%= image_tag(user.avatar.thumb.url,:class => "member-img") %> - <% else %> - <%= image_tag "person.png",:class => "member-img" %> - <% end %> - </div> - <%= label_tag "lab-user-#{user.id}", (user.name rescue ''),:class=>"member-name",:id=>nil -%> - </div> - <% end -%> - <divl> - </div> - <div class="modal-footer"> - <a href="#" class="btn" data-dismiss="modal"><%= t("modal.close") %></a> - </div> - <div> - <script type="text/javascript" src="/static/kernel.js"></script> - <script type="text/javascript"> - $(document).ready(function() { - - $("#bulletin_category-<%=bulletin_category.id%>").on("show", function () { - }); - $(".modal").on("hidden", function () { - $("#show_preview").remove(); - }); - }); - </script> - </div> -</div> - - - -<% end -%> \ No newline at end of file diff --git a/vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/_privilege_user.html.erb b/vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/_privilege_user.html.erb deleted file mode 100644 index 90f5cb65..00000000 --- a/vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/_privilege_user.html.erb +++ /dev/null @@ -1,25 +0,0 @@ -<%= content_tag :div ,:id => "users_checkbox_ary",:class => 'clear' do -%> - <% @sys_users.each do |sys_user| -%> - - <div class="checkblock"> - - <% sys_user.sub_roles.each do |sr| %> - <div class="for_unit" style="display:none;"> <%= sr.key %></div> - <% end %> - <%= content_tag :div,:data=>{'original-title'=>t('announcement.bulletin.approval_setting_window_title'),:content => "#{sys_user.sub_roles.collect{|sr| sr.i18n_variable[I18n.locale]}.join(',')}"},:class=>"checkbox clear" do %> - <div class="check-icon"> - </div> - <div class='member-avatar'> - <% if sys_user.avatar? %> - <%= image_tag(sys_user.avatar.thumb.url,:class => "member-img") %> - <% else %> - <%= image_tag "person.png",:class => "member-img" %> - <% end %> - </div> - <%= label_tag "lab-user-#{sys_user.id}", (sys_user.name rescue ''),:class=>"member-name",:id=>nil -%> - <%= check_box_tag "[users][#{sys_user.id}]", 'true',users.include?(sys_user),:class => "check" -%> - <%end -%> - </div> - - <% end -%> -<% end -%> \ No newline at end of file diff --git a/vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/setting.html.erb b/vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/setting.html.erb deleted file mode 100644 index 618f7825..00000000 --- a/vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/setting.html.erb +++ /dev/null @@ -1,56 +0,0 @@ -<% content_for :page_specific_css do %> - <%= stylesheet_link_tag "inc/permission-checkbox" %> -<% end %> -<% content_for :page_specific_javascript do %> - <%= javascript_include_tag "inc/permission-checkbox" %> - <%= javascript_include_tag "inc/search" %> - <%= javascript_include_tag "inc/modal-preview" %> -<% end %> -<%#= label_tag :fact_check_setting, t("announcement.bulletin.fact_check_setting") %> -<%= form_tag('', :remote => true,:class => "prevent_enter_submit_form") %> -<div class="subnav clear"> - <ul class="nav nav-pills filter pull-left"> - <li class="accordion-group"> - <div class="form-search" style="margin: 5px 10px;"> - <%= label_tag :category, t("announcement.bulletin.category") %> - <%= select "category",'id',@options_from_collection_for_select_bulletin_categorys %> - <%= search_field_tag 'user_filter' %> - </div> - - </li> - </ul> - <%= link_to t("announcement.bulletin.approval_user_list"), panel_news_back_end_news_bulletin_category_user_list_path , :class=>'preview_trigger btn btn-success pull-right'%> - -</div> -<%#= label_tag :role, t("admin.roles") %> -<div class="clear"> -<%= content_tag :div do -%> - <% form_tag panel_news_back_end_news_bulletin_category_setting_path do %> - <%= render :partial => "privilege_user", :locals => {:users => @users_array} %> - <div class="form-actions form-fixed pagination-right"> - <%= submit_tag "Update", :class => 'btn btn-primary' %> - </div> - <% end -%> -<% end -%> -</div> - -<script type="text/javascript" charset="utf-8"> -var availableTags = []; -$(document).ready(function() { - - $(".prevent_enter_submit_form").bind("keypress", function(e) { - if (e.keyCode == 13) { - return false; - } - }); - - $('#category_id').change(function() { - $.ajax({ - type: 'GET', - dataType: "script", - url:$(this).parents("from").attr("href"), - data:$(this).parents("form").serialize() - }); - }); -}); -</script> \ No newline at end of file diff --git a/vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/setting.js.erb b/vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/setting.js.erb deleted file mode 100644 index 0ca148da..00000000 --- a/vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/setting.js.erb +++ /dev/null @@ -1,2 +0,0 @@ -$("#users_checkbox_ary").replaceWith('<%= escape_javascript(render :partial => "privilege_user", :locals => {:users => @users_array})%>'); -permissionCheckbox(); \ No newline at end of file diff --git a/vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/update_setting.js.erb b/vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/update_setting.js.erb deleted file mode 100644 index 7486000a..00000000 --- a/vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/update_setting.js.erb +++ /dev/null @@ -1 +0,0 @@ -alert( "<% flash.each do |key, msg| %><%= msg %><% end%>"); \ No newline at end of file diff --git a/vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/user_list.js.erb b/vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/user_list.js.erb deleted file mode 100644 index 4c8bf25d..00000000 --- a/vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/user_list.js.erb +++ /dev/null @@ -1,2 +0,0 @@ -$('#show_preview').html("<%= escape_javascript(render(:partial => 'modal_list',:locals => {:bulletin_category => @bulletin_category})) %>"); -var start_modal_with_id = "bulletin_category-<%=@bulletin_category.id%>" \ No newline at end of file diff --git a/vendor/built_in_modules/news/config/routes.rb b/vendor/built_in_modules/news/config/routes.rb index ccefcf38..b7882d2d 100644 --- a/vendor/built_in_modules/news/config/routes.rb +++ b/vendor/built_in_modules/news/config/routes.rb @@ -20,11 +20,7 @@ Rails.application.routes.draw do match "file_quick_edit/:news_bulletin_id" => "news_bulletins#file_quick_edit" ,:as => :file_quick_edit end - resources :news_bulletin_categorys do - match 'submit_setting' => "news_bulletin_category_setting#setting" ,:as => :setting,:via => :get - match 'submit_setting' => "news_bulletin_category_setting#update_setting" ,:as => :setting,:via => :post - match 'submit_setting' => "news_bulletin_category_setting#user_list" ,:as => :user_list,:via => :put - end + resources :news_bulletin_categorys resources :news_bulletin_links, :controller => 'news_bulletin_links' do match "link_quick_edit/:news_bulletin_link_id" => "news_bulletin_links#link_quick_edit" ,:as => :link_quick_edit From 82d1d3fed8e5a38c34f1dbfa5e39e455b19a3a7e Mon Sep 17 00:00:00 2001 From: "Matthew K. Fu JuYuan" <matthewfu@gmail.com> Date: Fri, 11 May 2012 16:56:32 +0800 Subject: [PATCH 08/26] Restart job --- app/jobs/restart_server.rb | 8 ++++++++ config/resque_schedule.yml | 6 ++++++ 2 files changed, 14 insertions(+) create mode 100644 app/jobs/restart_server.rb diff --git a/app/jobs/restart_server.rb b/app/jobs/restart_server.rb new file mode 100644 index 00000000..53167fea --- /dev/null +++ b/app/jobs/restart_server.rb @@ -0,0 +1,8 @@ +class RestartServer + @queue = :high + + def self.perform() + CronMail.time_check("Going to restarting Orbit").deliver + %x[touch #{Rails.root}/tmp/restart] + end +end diff --git a/config/resque_schedule.yml b/config/resque_schedule.yml index 6929152e..60194101 100644 --- a/config/resque_schedule.yml +++ b/config/resque_schedule.yml @@ -10,6 +10,12 @@ nccu_daily_ldap_sync: args: description: Sync NCCU middle site with Orbit for LDAP data +nccu_daily_restart: + cron: * * */3 * * * + class: RestartServer + args: + description: Restart NCCU site + nccu_claender_sync: cron: * * [0,12] * * * class: NccuCalendar From e696516aae2264bf16134b1d89a9a97ebde57f08 Mon Sep 17 00:00:00 2001 From: "Matthew K. Fu JuYuan" <matthewfu@gmail.com> Date: Fri, 11 May 2012 17:07:21 +0800 Subject: [PATCH 09/26] Fix for manager and admin can see all post in announcement. Haven't applied to news --- .../announcement/back_end/bulletins_controller.rb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/vendor/built_in_modules/announcement/app/controllers/panel/announcement/back_end/bulletins_controller.rb b/vendor/built_in_modules/announcement/app/controllers/panel/announcement/back_end/bulletins_controller.rb index 7d89183e..325f60f7 100644 --- a/vendor/built_in_modules/announcement/app/controllers/panel/announcement/back_end/bulletins_controller.rb +++ b/vendor/built_in_modules/announcement/app/controllers/panel/announcement/back_end/bulletins_controller.rb @@ -43,10 +43,12 @@ class Panel::Announcement::BackEnd::BulletinsController < OrbitBackendController @bulletin_file = BulletinFile.new @file_url = panel_announcement_back_end_bulletins_path - @bulletins.delete_if{ |bulletin| - bulletin.is_pending == true && (!bulletin.bulletin_category.authed_users('fact_check').include?(current_user) || bulletin.create_user_id!=current_user.id) - } - + if(!is_admin? || !is_manager?) + @bulletins.delete_if{ |bulletin| + bulletin.is_pending == true && (!bulletin.bulletin_category.authed_users('fact_check').include?(current_user) || bulletin.create_user_id!=current_user.id) + } + end + respond_to do |format| format.html # index.html.erb format.js { } From 076f5ad6efe72954963c9a058364b974db90407f Mon Sep 17 00:00:00 2001 From: Christophe Vilayphiou <chris@rulingcom.com> Date: Fri, 11 May 2012 17:54:33 +0800 Subject: [PATCH 10/26] Ray's changes for drag and drop in structure's side_bar --- app/assets/images/icons_pack.png | Bin 37286 -> 37328 bytes app/assets/images/icons_pack_white.png | Bin 34694 -> 34841 bytes app/assets/stylesheets/sidebar.css.erb | 26 +++++++- app/assets/stylesheets/style.css.erb | 58 +++++++++++++++++- app/helpers/admin/item_helper.rb | 1 + .../admin/items/_site_map_left_bar.html.erb | 4 +- 6 files changed, 83 insertions(+), 6 deletions(-) diff --git a/app/assets/images/icons_pack.png b/app/assets/images/icons_pack.png index 39669303215a19d63d205aca5f8afa1866498da0..16ac98720ad504af0c9a837c5ab0779fe6fdbbbe 100644 GIT binary patch delta 33241 zcmY(qcTiK^8!a4)6j32`q#7xL6h(RmgP=4OB29vHktUrG;DCSxkP<<9QBlCqyOf9` z9VyZ~N((&#LWGdy=KXzl=Fay|PG)ju@10$qXRY<DU0g&vQbb$*^*lhl3)Qs<ncX3^ zr#SWTG{xoT1bf|%(ygT7yCEHgeePMU{M<Ei{wvxc5Qwt8srtP51CooyvC6LqdD~#; zfoy=!`d5%@<gIh78^R(6+@3njsxRN_ybS03+k9(6kpPF+mTlGc;b_h;h{_=_Tazhf z`KP}5n0{oZsxmve0t1lKe!7~$+8gus;!zj$ov%ZjV5CVs0S1WQJ4_+{!&M&xs4R(K zapZr8m^kvK#$saWR(i!d!sH`pf&WCSe-kTcgcs(;3H@*t!UBE(=2IlW6GR~9iE*y= zGd$=dlyS<H1@2;*PKVW*cAq+dJez7Y?!^^|C)61N$-m$Wj9^kfN60+$G?O34*EO_X z^}gIDRPT_fBO+k=uR3lr4+)PqI0QBR&d*NhorY^U*UmKk4c2$|^nH43;T(@lNVu@R zvzJ3&2XQ?QSv#V7waN)FC<xMDHHEG>ALzsEz+rM>9jCB*IS-_!GHV{H*A5dJymxH0 z?C;}?c}54UuS=T9e_zhCRmF|N%diE%_Gm)fgbexlmKX~pyuNerg}4>-Vf6@N?uCsT z2;=oPZ0G{i4?R|=WTJ3L^8^`h#mjl6#Nb9+egT5FeaRBM37b#DpRmt-+2e=I+9TkT zWrFY-P8V|du4TP4KX`L)yX<}2j9U?Occ)`#5wNwhBqDwAa()wcX`@EoE-K|U+F9uf zt>uiWvF}@b04%O7@7Z#uj6shdMdeFyDD*M1Lj24f-5h9pcrwb~`x}X@igTIA-@4A2 zPaot~5V<jx{@pn`u94n(r1-+KN~F}mwcoE_71aoT$?T6XX%k=k<%PCsLnxiPm`^Wq zQh*o9xjHI-G<>L@_fCZj7Z;Z~yNV=4&rH=h(Yc(EVwwGokBIw_N3|gZn!lAUj()io zKP6tvvnT$K^uBzFez6^9Ecf&msdeUxkn)%5S9yeJk)&2K-k{c&si;KrK+=^g{E@^? zlif)cf`5xuzIuZhy9(~yGTU|Un;m#BYYc3(F~?lxO66Lv+4y?i%=uuGzD{vKTBszj zLo#piE^kWitL2|Ol4<8tET8SG9E`d7GHIe63LcBK;EHZnB38l|71&Zp>3SW+g~dt= zM~J<|#Y#IE^RCsg#}@e)=dLnm%2nX}%(6zJ3d%|`f3RkAhbvz>>Um7=)3$R99&^Br z2c8x)3B464je!BMY<r1@Ubkwn&pt0Vf3U@o({k5}vbxes4erDR*pX4fMbW4Vm#5l6 zLiGGG3Fpr2z|F_pe|XBx1r}Dkh7cALDe$~7+1*7AMm!erGvfKMFzhHzX5A7uPi@oX z<jZkYVm<n8FTrInoZ97mSo^duAUl_yTY7fY2}AaYmp!iYe7_lz8(L7oYGuoJR*V6x zP!kMr`lFU)+<Y!0&D%UyWJ1sTD+oi$<vjme9@jDoN}EmQpB}dbR8*k181!7P%enpj zxMe78TrVvx8w?lvz&;WT?+Ng5@CM?dP;DqI$M^x(SR*4aBlF<&Rht#CNw8+X2V-lS z=Jyvk-;-NIF7*Gt$&|zEnR|huJTKt--faaUdFb#7NTIR4PVkr=rA!1H;7?3Ufc z-j4G0^-GWf+qn|h)QsEVFC=KBF>?O4#wBxv&>;WcCrJ}^Gj<8Rb}#Ab!f#evOjNm! z@uW^kYNWuwYaXkm)wG2GG;t8W+!12S-@X0mZIuMmEj2duO0R*6oh6e*VZ#&}F2R1| zU8dWdPPNz7?v?lPA@zQKXd6T4)#huA>KZLeb49&zn8H?)+P+nK&HF*&+>u0ah-Qt3 zG<dkGvTpe0Hv;Ib%sp;@qQT@@Jy~qOCHMJ)-9f`kt~iO5RTnIf4SdE!d<7EnhpLi2 z`aTaVwByO*84@Q5lU0+K4Fw+!CVRIBg)A=zAEFW}s$ORn8M(qwkzy`&9PXq|LfD%p zgH9%@Kc|l#v>hdxkbO3Jb73z63L8iXSL^SkB-VbOmoU`!5MhoXe2(vyS~D4mT;)!& z<f3&<)z!F2yKe;qt^YPzRw?fcay*5|7e%)1Gq6R(9dUYYps>W|@)gYX*E1xS2hWCK z#A4I}bI>nw^*e?UT56yAe6=K%%p1f+zSH#Ii|`zuR*>YGHj@+LU@e%5H4$kur%^rB z5MePhbXISJ^#^O?)DCyt<3ifZJeQhIM0*ZP^#I)A`#(T`;~I&HepNaOm3<E4&D};w z`)qt8@{`(-8)t|FvIHW+uhs99q1&0CPipMCiqm0d!Yix5xN!6Rww7yEv9`sJ4|&V6 z)|uru`Aepc_@`xqKs?*5!qE-EO_)<NJ)%qNTVegxE8km&YyZtphnBfia|cym+Qnq) z4(-;4CV}`tFU>9O_&tM~<8k|K6&^Isg1@xQZzB`i(4=+HkvMSUrzEJWJEn#wbChCU zp<72(|2rA!ofsyE$ivlP$Sg#kS{|}%hEjVm+1`o|nIT;A{BdGac1cnY7$h~RlVLJd z{HK0gV1#HPAFDhXX5RD#=j*c1=aToOFK7KF0FT$*YbcFXu8eB(4t+gFQ#E{AcA$5} zF*{7={jNM@@uOOJf^O!th_*uW!uHn$cMsa%Oq!`miq-Y#z1lxvrCavdcM8J!1L2{K z+BnXi1(w^oFp8(cYPiQ@j9ia=^&bt#J`MQ&Y=Y&%VU1GXK#!I|QGGMZ<PZv*nmNWN z{pE@FJ?crRlUYhG6}r}1L6iKss`i1f&YNnuybC=D1Y$Czet=Z6Se<FobdjQIg*R>j zzdC(~0(;MabacMpUxqE`<y!OR-Oa&c6?hy1lJh_Nd#ASEQf@7}+82Gj>VmQ3TCBf! z&Wbu?cLhEV={F?fSkn5A#1C%vsA*%(^Cxl7*;X)(ad^4G8*XMy>Wa6v7-Wf7Yx@o@ zsNh1y3JE)hcYmBs-x}18r6*h|!zvd6nD-b6gae#yot4mQ2vu9eg}1H~k<Bkq^NA>% z&)P3kINuej3uTXK$lUb@---7OD$lF<F@&k`!@VI|ryg5ZB7Kf-SVsu6r6315xX}6^ zmL7qdtF8eASm4duIgDH`0J=yc^vEZ5UyJo#e``W-_wraDXA0b8?$)3)@C%5A7Y7VO zow>)8qAVE;*&F>?T8Ha$s%vlDn;xE5-T+F#a|O}2Ul8BA>>p^W%O{CgLJsN;icM_U zZ?aT5*sgMOav^T2-rE2CC&n(|fzz_@PuCK=(Nb@z<+{ErkmwfGXEhp}1kzoox8tSv zZA+mCYC9!%csJuZV7P9a^cEm5SgD5>x~FQ~LJFE0FIYvaN)hUmP75#7*rk7mC+j8> zPK&GE5kR5Zu6kv5r!;Z#YXFWUvzc~>srUHY>KF~5@>5-npbmnK5W28DvYai&tf2S0 z+N8B!tN8%YJux~nTSDN@Bsy8+%FTh*qp?PP=l;fDR+sUwzx^;n6ap)YQz2vtzRs0v zPl*h%PwF+Yi@DKUYg%z30*cpye~x(v@f4KQm|tB~%bDE9T%7HE@II<zJU8lKZn31p z^}cceTk0-L?>8F0rhB^=r8rW=;MsSLI%=*>V{d^|s*1TZ<bF$|4YSh~@^V^fVev}s zMR$LqlsA6dkx5UK8h#GQIcinCI905vmTWEVk{oxYt#$llJQ~$H#rUeNw&{~i;{#(C zan8M5?#>n1{q8%udERXy`d-9}^1+-8_o`PH*jK;zUuUc;{)1KfX(S?2qV5`&AV0l- zTFOUT>w+D5`*Sp}$l<yO+2TkfujTl1wn^uw{x?%9>46ztEhCOez*B9<?+u^WN~7%x z-5wu)uJJoa$8c2Sa34+1QzIf0whVF1ZYT8rs@Em)3x0d+$a$-9TSG|SpmF=OcYvo> zcFp}pRy$#~Sa;PljQhf4@x}6#cC8^E_99~!nVy^;SoZf0JdQT%mWO+!J!&vF20p#4 zwZs_y(|iZ%(9vcLXqZ;uTbTt^Z&l^Zi-@G$)(Hx_M!}4ji3ssTh0N0z#N|%2Y#L3f z#dg$WR_jiO1f5SA7%%(WQ0T^<V%>H_JqC(7uU^W$q^a!?C#bH4T&0+Q{w7ltBF*q1 zEi16SFPxQsG(E|k&dl)jOx$HTyxA=s=HjiYwumR}o}!x}fRSbKqV$NlD@{K1KEq;9 zZKzgh*7}}4drWj5|HsRdCyori`sT*7JOx8<xGYp<eM!*@xubK3EmhInHCHfcRyr+2 z03kTj>+_4l6t-p~O~&Y6P`VcLTRgAZ=YhtvALkalV6#rv{!@RnUfFCIzD7oE6+ay) z_Qg`vWl%k$>cAiV5REjZYjWD^-zZr2s$r8W@WjAp@yar52WO_3$qAn27Dq47S4Zsx zq8eQr#{+Nn$v$-Ol0^JAP*t9E-MU{PvEdj@!zU5;C;9M16ylF;=0ewC$QVp}qM;?U z8*=b;N@H%uxe08>8On(^0$b1GwQ?6ax~H{lZ3Pkl73>jjQ5BbPp#JI!YFJ~Q8|S32 z5{*v{3$vKeKIbU(>F8&FFrQOdQS(sI;XqeWmy9Bhx|Th0s&uPq+D$9eE75*f7B*r1 z?>4Mm)Q}jcF9=lj#!b86ZU3|ba<T&l+PVS}hX*rnR_|{4eU?G^NJ3J&W}-8cjfkGS zR|WyVCKOm$@yK)~syV?uZ%rWE+m_Ce=A6pI;(Bp93|FIIMg_?uhaq^xoy0)iM0)QX zI}aVpMcH|N0D9S-e$|JUN%>N`iGy}mR>z{Rr>VCbNT_#eOu<ViKQIkJnlYbvb?5V* zS}f1|D4cKV$zoO8Ovc^kmz>6ra0R$J96(wkOuqMdAy|E@YS1|R{5PpI#;}Lx<TDd~ z%fQ@i$b8%)+StMDj8ELhZq*!8MR{AEbTqke{QV<Ch)9a(`PL7AjODo|(Go($Z}ow1 zLW~<C!ylH*U7sOkuRiXuYxSbj6%6MXq=ES5gj^oOLw#)6Qp=v0SX4SWor>*`qyu9O z7yDOCSd^-y_J$#!z0<8UxbvqJ{7bOclm_VY*E?Iq8$%XDJO<pjB<%l2=g*dPy0ItQ zsC_B1^dA&?%72O$yrz7S_$l3d%JSV)meY7*r<Z*@v~7tox!@e_LC87h9`zfInLmjm zhf;nj2c}X&!KgB|D+rE0(<)~=13AE7jc0WE$^n;N<<yJFc?+5K;Sl2?6C<~RV{9AV z?Ko7re^SWuhp{yKI`(uMbgOttSUUK{(GcM`T7ua%@{wy3+gKN9um5`7n9lg|tq|do z?Ai7~Szn?0w42KEiUkt~2NCFMp=8?OUkX|8cEsA2>KLNih#B-BmbA4$vZn&yUhQ-M z_>FVU_n#NYTP#{{I4}oYX@Usx3rK}MWQ<p4Lw~}8TAaQ^ha`94rZjvZg{NZqL=*A- ztRvq*MZwN)^;(>kO25?BdgDBy#ex6UOwDaXx}naAp2Jq~Rzc~tJ@ZR=CsVg?&}RiI zD}pZRr^ZA2U8MH?wino}fl{FV61&`fzu7|pQTXq31?QrBAKa&?dolICKCQhw&3bC! z>NWc;^AdY%l-nOE-!3fk9o4ZX_gZ25rE3!FP2{J|KOpjPJZ}Ty03-A18I9C}DW8YI z_VV+D?0QPuZf)JK;@8KLBGJDtd_~t2=8qoSzeI9llL$veXA<gi+~=<Yc<1Eg;v+3n z+g^%$Uoz49Zm!C`FbWZ_)n;RpszRc}SMR~PUSr}vsMCdJ9ImF^rm|53Q}*NNXgd#R zik%L3KS8qSsr5O=m#oRU8W{pgm9PIb*Bej+K?RL^tBJzm<-&*oLhFRePN`dtlMQxS z#gBfo9h1#$cq+Xvf(HuQ0yD{12!!~qmD0iEh@RIUP430r+pxZ%0g%#Z<yE938k}x# zN=5O6tzNur$<^a#Vxz@4D#xD)rE4Dj=o?$KJN@@XT`x?~<0l8&YiC9N-cEpLB3a+} zm6^ks>QtHPGse+{lxCFlEx{$okm|z9Du}SS%YBm9;*DK72nMceC;tg$L&y2|Umu7z zqNrp)-fSuwsEl5Dl@au6D6_Ls0&_YAUL^%SZ~O5OM(Gns;Rk1z4Efh7rV97`Q~WKv z9_}}^U@HV1ESp!$Dnz~+9I!Iz-5nz{_AoCLm!=FgyTb}?3DzEgA5C>=|HFSVVInO5 zJwY_gAW&K#ia#yilrybbg(K~G06PGR3>Fc|_ZP&?|4=O%YJTHiId#WbT8JMv|I+p< z6&|YLidX4%t{?e4d6)L>(eM_rd-iv2b&W?Tcz4TIkDgehxs$|xq*_Nes+IUa_Fjbl za^AMEZZjZt_b`nLCM7SC^jPZih41?pTEO!BS-{PIsl<PxeU2>^Qp*K?0KkH~1uYGr z1z2P)C)xu>${1O%9C{)N`JV2p(m}jYTl??Rxw)#n9@VKh?!6PQ5h3n1$`yU<>PvpI zkcF4_Gd6Z-uiq_B9c1`zHW5^JV4V))kneQuT9y;q>}!;V&^?Qz!g*5`FrO_Vj1%1u z9^imytq?lPRuTFlZjIRj@CM_`!}_b%Fp3)C_#oQFaM}vq^xR22!s+3ygWS9j#>qO` zQ1>^1PbtIZ$d|B*H|Mse6I23*-Z^HahH#>LI15-+zUb!0$M?KGzQ2Ptz|BKk1^;Xz zr)JyLIpQ1y1!moBTa}(6@52ZlvoYolyl3{ShknEO?)8Vzg2C&+%zy>so{4C(39k=U zV`diV1a5BdFz;HCDvi!OhR=C*zG2=n;&*<53V=eRs~^DnxTKcv^Z9kl_-p;ucm7W~ z+oV6Ks~$d$_uQ@=mT60vi(ia;aJQM?CHeM&ywBRRvFb%H)3XA(<EPQw;9b+iGp~nD zSS3Au=gVbzYp1|srC&koE^7q9R^Lho&R#>MEKKDl_<aVW%R1M9`}O{Cz`UM7rU+Jr z3phVR+PX)}XlW*zTdVTs`Q=Vu1Ei#UJ!s_(inz|!Ckpc8<UTMkOAXcQy4`yAK<Cb` z&Qg5HkHttA&Q!+0#mQ<@)763{f%_B*w5QK8NfVsi2|OzSr+y52l+lxKw|4biR_>Z7 z0A0NcbzOY&>^JLE<6p7~jZ4dfbe-~DDLU-qU2LY@-ML6}w$#KY^<zHoz&=Jg+(ng} zLKkP!6s2+veX|t2MA~Sz`y@qf|3p9i+iJ!u%5IUCP<!L<#FKxUOJX8UC6v^mxdTUz z8M?8WFkZkSkbN@#qT>>h;{q|G9kzNV-1f08FD>$wWN8p$frTHYcl9-6=)(~5z1h>} zFMmlnP}Jq)5^U^p>38khQMb{;=#}S7Z!gRnG&X<2P%h3g&^z}f<u<IIdupzOVeSxz z_-!eRqc5jop{>eEib)Ezw!3NEKIvKsnx|eN;p4#1s-!SC_%)7t(ytu&`=5XvUtYH< z<qN#2S~uz1TjjvTjMrh-U6(h6M1-7*1!<abUvJh%vYfj;?86Zq8l0x1lW`=6O%P*= zE!`E{0vI3l@W7(2{FO`+h$9_3-fylgv@%?$M)&)9bSE2f7ls;Ol-`i)_LUqDZ!d>^ zCn(VBgqU$y2r>9*r@jcDDxMem?7pSet><Vf5`lFq&`RhH?Ce@=I;b6Z?)~mn1>r=$ zTz}l*6n5mK57(G=lN?=2S2seA4_-g;Th_6R*g4~zs~&Cg@GdX+sVJzF5n`1X+4E$b zPQ7{I3$cI?kMOD;Wcl`qB@=EfppLr}BoFjy+>R)(_`%~v8fl$c=p~t1TYI{2*nV$Z zgB;u$+D&e0a?Lfy^6q2R$QxhAUNXuP)Up!5PiAs5N8R^O#}aX$Pn}Y}nuog?*gRrP zeuTejlJ9+XCdZG?kXD`UEWHZbWbL0-a5z1Zxw8D1RPKDYNAziKWyhel#IGogZ4*F2 zjPT^Lx9k2WDg7H=>7&I{F+xe&S2`Q%Y-`w{iiPnzd$F7jA%(0Cq0WMiMSni?1T15D zlt#e$)@26Q1uy=Vq%yKATPllB#YFKm4NeAPIuj|grG~Cm$%`b_+I=Oxy!b=hk#2N` ziu56s-!R7Qfzo50o7&tosxmX<4*@BW=*`N4Zfm`2pIIlFD;o%xCo3kbLH7>a*&olT z-=tApsEIeZ#oUX3vAA_AbuA?k8vbA=rziKk#4x0G_c@<Q`+HK#msiCmG}d(t{vEPA zn)J?HkV*ZYhS?}7rIf#><8&vhu;tjMQs6gppY=<I9gJgBNF_tP7tzc_{RA-F_Er+} z5RuSjn$q!hR9H4hB|n<dVNjRDCl0z7V52gR--MGn5m$}c2TdM}ZO@;53&<`-HU9LC zBdk4}YN^la;cKY5-s*hZw?w1K!jN6|^>%@yWk^ZqgP&z=)+BmbZ;Lu1U#`_25yu>f zW;31XD~=Le;lI`ek`>hrbshnEagCp>rnNP1vO3Rf1e-U0UK&oJzxYr3TB(f~+-&@d z+&Ux7-16qm6jNMou>rOX_g8p8b|)NbDruTHee05B^3N><|JIq(r*fG+7v9g>eft7s zX+}Di?!`dmcvk})y&Vtw7n6cL?}un@*S`k}L=V1BTr54U3BKLb9P?ovu&SH56s4`J zvo%n3;W~GNvh{el;PwL}qQ=AP>uGF1_NGVY0(1#>`-BQ#=1~%_r|31?CnTu?30F$0 zVw(>lefF*6gR{y0V>f(@W0Apl?X>IZ(nGu_-LT5!N}K0*<FUcVwg^P}^i(g)2|n0! zblN5-O$%PRS|B~Rmr36UbX-h3R2miVbarpK>wGq8V3bi0q#T4sFI&O15mOgQVF~vs zuHTAFSzx3`uUYMol<ql=<8=ecN8?cqXVX@^-q#S-D&*|yHn%AnF2YK350}zB)ZAam z!S1sv4eRR0SH=5dye!$#o8QC{TJfr}e$eB(6g~d(R_l)i9qKOtMU+N-acH(q&Et1j z`5Vp&2Gc{%_KAClE9wRTK=Etu!=ZQYcxK2ZT{TKYwMy3w;3YYM8ly^I?M?k+Gku38 zcM{yW1{Gr$UT(Ln(IR_w*T<|{e<gR4YtHv7@$45KIceIK#%X?1Nv!&)<ZyLYqeW(* z=x|ZW6GC3xxp?FQWV|J(NI~aCyCivSC^3!s9xML&{d)X?^EjPH2#NOD8Gk$f%_Zy4 zM?)VHyX;oC7g?riDcQ+gM^h3{gn#k!&ZYm3#YDW))chi01m^n^7<#O;4)M$O=s%6* zt4m=g2y}X=?s)bfJ{%AG1mnJG+9N6U7RJp%>}!YGk1n-e&+Pl*vb+~VJWKmsqL>PD zGyhjMrPJ7Qi4g?)HGL8*9eK-jaDy8JdIJ1O;}0+eBK?<nYN=q#ZzV7BKpk_>m9`!v z^go?#+Du0cCqAUw0Dh;$R78LE!Gbd9l97V^o(j&j0Q<&&Pim#NZ6y!cp>;f04GevF zW`68W$9i&xonsx*qy^Paz`5VthuMvF>%#2D4FyK7aqTAw@+1x$Ltlys+m&ujUC3uX z25OdaNd7#jlC$Z>L1jDm(=*N4s_c$O+qq%nB-9yIFQs?_6qEg1KG_{XLnH#^059<G zh(Z+>-NrAgSY~y|x>@a$0|$<KrhCZDiA`S+wk%a1+C{t1#a+|;_RQc|3}0pozRi*- zL~-vTQf$E|?WkUgEtCvKQ@(Pf05|^yFaBAeNZN^sh`f`u-EpF%?+Dk1iT(~)k48P7 zrtloMpm1+wu4jv}2RD7&Zsn%0|FU)%>`jp~gOc4AiIg{}vmWZGMoFMHIU3cb`xE<~ z?8-K8jyaUx2j-6jG7tkj7G6&GM0i?E2(rsJ!BR5F?@$_QxKK3EZu<e~Bg02DolDrz zY4fwBub}6XXSGF6Cr)v_+ud7V`#lw^3txB-5I)TL%~u1($NBzdN`@^K6LKzray8Ed zGO$5If%irixzJVUG5coKs`uduuX*CmOn)fVxDah15PdlE3eB&4=H7~_5Fhg(I9JjG zC8Dm=X_LSAwYA0WxeLItb~eekug7V}Njo|O%ZZlbqj&1{zmG4#{)-7qaWcNL=EL1L z!<K6h`1E(jY))l5GGCaZXRRdZ&2LJ49UYkY&!y7bjy*LT!{poGfy;Be7w-=GjL!~_ zph<t>-GbFFf}H}yX*17YzOy&R9>Od_{qV9aH*Hf$?V|}ZbSE&X@K=K&*S*-m_Kl&A z-CVeE?o;W`6}!8iRieLaE-``HjA)u0x;@<;w;sGWcNVYyx*|~M&9V8zpQ@V9^%Uy} zI1v#?s;h5*!{aj-crTZV_|N`S%jNrX0B^J0Nh>Wo4TE~+!598qa+&{o*ohk+GMddY z*q;m!U319(e5MN6OJ|Y_vna*~Rnhd3hO`GZFm241GK;Wz;1jN-{rfP=4~KS$sSCe* zWyRG22MVThATk`spnB<+*89IcCK|62|4lzoCNTfd>i3YFnialQ{8wxC(sqeFjl0lS z4-U&%lyLWAykIELK+MB?tRFBD4<@vu3131Nr{0s0_a}S+$=Tn3qSyl|Jqj{a${$38 zXcobzqmMQTl;Cp|8`ztsm~gK+-;lC!IU!AOGZ+m^TA&t^^*;y?RJyf~ef^R{`ldQV zsO0OE3dW0)!okgi{>5H01~qR`TjmuuMNHEFuGU_?txU$E(B$yh)>=QlTNLb)a0s5u z<q6j<JTNf36i!ZgqP`QC(2zoLpVpp;;U!QmwrG2+>xi_KJg<&?#Y>|p3ia$%6F+~P z^j-R8>bwK+AkCnRS8x5|=CC`EijfvVoR)|~l*Q<>BRpwV;+yr8Mr@(nsl>?>>s2Df z9QjZp%aIix%xu_7=|UD+(AIwZ7Cmeq_0;n=phKQxI3~-`zSapTihQMc-sgeNqOg>s zzB9)+@`tFYk1|BB679Iiyj6i4f=>Wv-GLY=l+~h2Y7kb4RrE2|5RQ%1c*Oc4bJ5z9 zrm2ciz9up~<J>Am5Bk4$ZCkl%?y3;~u-y9h(I7_QWA1dsl#+72%aVQCX|wafGj4$B zIyX~!hFA@JnzRQ@%vLe&f1a<A^_A52*+4uWl1Z$)Y+io5(snz8h~gjiu2n4k4c2lo zIB`~6#|_z1X3)Z{<{?_&Kf+W`+V9nsES$9l?E;2V%+w#xt!7Av-3o;43=N$VxZ5@3 zGt@l9&oiM6j`GLlQHQWy9+!OxwC@rrB69psTOLh$?_w*l6t@e%$8+>TB$bJ?l&feJ z8O{EZy&Ndwz;bZhyC3;Gh*aobe*dZ{#RGf-P$StOx$(*)iWdtl&#!CeR;}Pd7bgP( zfT^G!fAJrQD>25<<N<n%1i@@ZROI7EEhD28Hjhtj!&oG_6l0&~Z*&XH7pETdn>3nX zK(N}ui*UXw<0zd1mHZ6awMwMY?Nq(b-Rx1$;vib~|0s8I{{O4JC;+n@sZ>P(tTfad zfkD-KwL55V4>e!vVla*OuO!wZK_DN_)QcMly=`6H<z7SxB$JyFDw@ZEdrWXAfIvA+ zhOj_~8^6;(-t?G@fN9WzPYi!XnHLrBdD&JH`*sWcXK6t1nR*ktca3tdE{`9RB#U0! zHwO)wn0;iU<{({Q!>x9%MzZDktarxu0p#8>p%nSOF~&Ie*vM16(0q{&G=A)WIkkgw zUHvVE=4xwzP1rjnd~V#yWbU~kWKyXL)j{>nsxcNeqaK%SH5u#em9%l89Yp4-dTt%8 z`+r<pcn8-^30#|r8JO>XHrY}*N)~D?tT2sG{n*9`fDC0tqPso$ZtK7lKfHUpzx$!u z-W6#OU3qgyI5+Yd7|p7<h;C<}_0~&I{yV=bY`ZY*1r)Y;9tFxmj9{dY^9WW@s)<fF z=Y5~2y+yNB?kAKRIUP5R0GMQOl)KX<d&=C;V?)~Nn}nQDy__e^pvXw5&N|zTXys|j zt4QFsPC-kgG&qIb2&z=CeZ83gjD*wZ<evGZV;YOiT|NlqpV)eH%>={qY)NI{l!yE9 z^DomisHL*eyMp|-CkPI+F?>F(`R(I^sr2nj`=6oHG+$M}7hQ13K0*3$-#`jAr*~>~ z6>EYEAGB$W$M-xg5e0z+t{OWCv&C^Z<pU>3Mixd2C6B;3j2k|>(j-y46;V=)&)bgg ztzhmQQ0gr5_l9u6O>KFaVH3d5BpMxlfsc%}JD)COYqH`xTiH^-pqMD@wYzfzyYc0r zkL0_Q`HaBLH)xuE$Ot7deuBgOBq71`;?xlfHHXL$&tla2^OmB6AIo9jO?Gks$H<$^ zqm)=wSbcji-`LrpXU4_J*TR2ULDiX&<p%+)2ch-u?G*}5Ka>s$4@ssEiOlE5;m79Z zOB)A(w3b3CEv|MuRBxr=)S-yn*lhEtmOL0Cn4WfX84Q|TFYy;49G&m<)S0VoPuZo< zKfZHm{#^KZ#`t!{g60+9gx1t+x$~6tP0hxZ_HAEG_8hhb6LBEq7E*>O+-L#)dP+~7 zED%VC!-_8L-3_(05hF1`L}W>BNHuUsQWY)Ju0GTp@9zy;#m2tDE~!Rq@TyYx^y$PR zRq5#I?$|Kw?@sH&tqaWN*QTD3tE6AigWi6M3>dPrcG5gj3kn<>ln=g)y~X)}zy;aT zYDCo{!|dM->l=)&&Nda>LaCrp0>bmHhv%4lW}*MVzY>>cON|#r*gzS`ZI-FyMe5q1 zTTG|%+9<=Rj@!9MBdWn-5D%m(H`<nCJRf?@@MwsKTbz2dhZM>%EVoU6KVAFN(Q#Fe z9n^mrQ}_a9425E=+0YV1;L&mZv@Z12HTWvzDwvOR|L#+B0@E1%ag{VSFi08V_vYFl zHO$NquL5A}69hca>qCgK?T=th1!(OO%N`N4nghGf5X!v$%>v53xUHWMwsckNR^siR z>$y^pXw->zty1M@*6Ratp9qWH@RWqltKM<!vjXQ_%B9L3Cy}&Ke<E&AqXNonDm`>u z`P5#?Ur|(-r{RPBu*$jpGs0=}3#*!Pk{F~+?Gqr5?`q=_BOo2<vh}aMHM_4PE5&f$ zg#rv0LIdCOWXM%{9@}uH>T78r5I0bN=AuOkeV`xgZ@$g{M_A^hUlr;AU%4y729ISW z*C&~9T->erXktIlU^?KvESZi3BV=oCX{@<>_-xhw8Z8EQX|>jAScQ&d=X2bnm=SDY z6hNvOztAa!z|GAcsdcBnTkt5XSRgu{Cw^N*!nD{;Bp2g*ZD5rB(X*6>i@|)w`)-Ys zHRYbc*v+$P&s~C#SHf9;Mp}S$p^r?!IS>d=|3T(nAu?$t8bhwc*u#!|wmTc)JzU{} z8BGj3jo%ugulBYYz(~9`V|$^3Gb2!-EC0-j80d~4#t!WzLj>Nq+_0KCQe$vxE%Bg` z%eL$>r!yV)x`L1Ag1eaye%U}}?<x5_7UlHO=dVu}_RyMYJgz~F`HLKT!;btrqrO+U z5@)t%>t<$VL3^X*OJ?pjsC(byNcp<aHiNx&Vy_hpFrP3}-~-{3w8iSt34lBE2_h7E zb$?RiqBCK({f4o;alTkSM#_4r5q+>(Cow>Ikjhxbk<)Rh#J8-tnuodMLJ2%V8Bu}u zv`38nOUv<)a5VqtIM&Zxd@FdO^}!3t!}oU9*0#Uo91yRCJ%p=v0_EP5bgi{)+PDvD z*K4L$)j!R?{V{M3Q(WI}W(^n_8SydEcc3exE<k@z6bOcEo0q`2xY6<sQrS~j7*iH8 z=c4{t?MqS&z4MsgjsE6!X&38i-KZRq6EeV2lcv{6AKi!f!#U%6g%jU3m*sf!pwlg_ znx_1Rfd{_?F-*ch)wp`GZTeb$jqbf3j@MtF|Ls~cwxYW$l1IAS>jC)8hRi*$7^(X& z-((t&y_}<KS5LVSsAQtRH6600)jL<~UM%-5;JD9W%%OF($#quRT6M?D_J*vwUiV}~ zvi_>t!R(y(&*IW8<tmM^I?0uayq_)KF>Pic>1I>KtF4Q*Sq(DQpX;Ch&YSB^DGG;1 zXgy;A4ZUK;oDNQ^egW7OgSc(L9k)g@$Pl8kQkH!=P3yv8*_0ox2MBglMyOR;^0pZp zDU=WPIXg4S4@xs_+frwom7zDEA}{TI?z!!g3bwW23M%xdL|m#&l5||}QZ4Cv_xs_O z>`M^V`FoQ(r+R)eRZ~x^VyWCyWP&k1Wv#2#GA6DwX`1Jx2GIRoV%k>z{ow=<meR%V z38WVW>)>1kQJuc=Pl3vl#l8SnMRzqAer2BF()CtKlS|yAIb;)Lw86ti>;<D1Z>r4p zR(g12dO)tb_by=yrsS#9>NjL!`g=XjEL#$}Wt`^0e!j0T#%a}$5hNilGVH}ku8D7w z{H^dXTP4gB5aBK~`xEqv5JtfsK8=3KQZ-gEH)fW=7a8BCCHA}H3y1%&Tj`k`+yOmB ze`UogB+m4t+LAL^Q^XbGf}VYstk+gA!I+!4&H3t&E!Vs`aN25NqpmS0e_Oe~whae} zE%p9TetO~Il;mZEr1tecd-PprICj<^jdirlMYRb}U>KrQwIv_YdR<%NmA|Am@SJbp zs>kABVmK7uX+W&te_Zz$>V4%|hFIXT4C20q)Zb@u(=92|^B?c38d-6-c3d|6&*x(M z^RG$2re{jf`kGyQByUevN2c%q*OuBp-|rqyHy8KSj!3=D@w%%nEtA4J<**~m;k~M; zk=c9mfcvULF+SZ_^2o@UT1Oy!-FtX!f6Gq7w5sB<ePVANbG-z|-P`KZkGqsuLjkjQ zyABscK?3uU0)FXzq7%NCANpD7|I2pPh&GWg_%1G^!J@80*n>yp-Lg6<t^G3#Mfl1o z8t^v+wu>!1FzsrN?gC3%KH5w42PdvHa#N)Xpfh~f-sHgQu2BhKJfZi(sbh7GmrwhP z8S~z4`v?uazpaAEs?5WUf~&~-D=D&~Y)n-zu3w6tKirhvenNQu%02I!)?!7>;#<qH zJI$U5C3U6c_DjX_lj|p+6IT%$&!mMjs8Y#wtjS*Rmb}Auf47*>m*zGN(uR40LVK5O z?ya{wKD(RhE>nMhIGylri=tZoeUL>4p4hK?Q8&(;@9M)WubRLhcoRo#<bQr6&{JBE zv{V~~v?oZGwDuc}X>x)L|F_8G#FIMI9Ods#tqwJSqZ)U=@BhxrRmIgyi#E;$4^{k_ z>`<MmA*dhQ>>g?bZ#wtq2wj#>?}|Ow&kqtPjO0YC%hl_aQR%!UZhk%T(kf*okGLe7 zJl0L$sD^WO6S?e`F=PZraH8Mwcz@q!4=DEsTjydcQ5w@k*5gp%X`%L5fKErt4KVuS zMD%~204mt-8G96OxTJ=wQM57I7R{uVqtG8Q5k{(`-ZSK{G2gG830oXd3Pen=a@@Ba z$Tc8t=)u|xo|Yg`25zO8!mB+F)X#i>YQ8SPw5#EijwwrUglar;|B+b^rp4S4NDENG zF+5UI(4Pe=WWp4FT2T>lH|8|9k_BYrqYYE!l!5)gw$JJP>U#ELwieIQ`~G(6h6RNJ zIq=z`Pzu{Ze2Q2Mx1sCY)a+44Se&IFYD&9~>bWAq1MzcMdoBZE#cWA?HyzJdK_@Y% zNYPvl)p=q>2?oF_F0pdy`JC*jbER&*i7TZA{D%GhtP?MR*vxf;jI$b+qnLJ-lMDzI z)Csk8G=I&=)C-hhDEghIAFgU^R8_^imw*()j#ijidYi|QF>%}vnR=6%yF4Tbv=t_g zwL01M<0hN4j^sG?iPK49B4wU9wvwLJD0)zc+1aw<<Pw!9eJapGCtOlIA4Mu|p97Mf zoQ`gbkomzUOYyxFb10egtA%n0N~U_N?E6y|wlk?uXq)hGM)CIjx20P=xOu9nRt=Yd zISpP;4wRBxY?P*BN<riYcd1GgM81-NUypr_ZDX^o^4LdZlUsk`t-%)-_xy0T&1vlB z3G+d>CbdD4Bzotc2)v|7W)094eP*Td#Y;q}@ai0edU64X9J~~u4&@=dEtw)$cT_m7 z_(?r=EjfAXn<{~=l@75IASIymRBduYhVB6}d(`Sa>+H4YCjEtH|Fl6MT6wnTO~~_K zrfF-d+ZTOzU1+Ifje<s<At48aiM<p{xYA{k*=iR*0l4?1iue*3Qq75Ml04W?b`LY` zxyeL$XUU4UI1;|j;z(EOuoJrEeA+T7xpyI&NdpCXE>By_MPu$rd5FQLE})L(?ky5o zr3DTa!qro$l=!y#s&{7_z}c2E@*aiB{W5f;i&TxH{A8N4*dtyBy}hUv<LD~<fZLz$ zb}T7SALUMY{}I4v_%;nw&`N%P^Zl=L?4+n(x~p}E#+)lBEJE)GR(C$%f3IIDd*Mx( z5KIT*vbQ(lvDjO2mPLAc@ZZ0!{lFpVv>hno|4G{qSCMb^?IVw@^rgAZ<GHQRT}v9H zzbJvwIUXDwyj7s|`t+`7AZ>&GeyF6}*yQl*=OibX8gO>z<#!PTT3yS0%|J54&0E2T zM9$LH^}ObM;sdD>_UFgTI&%Ww6pp_aQ0PD+B3N*^L4-!*ZnNXKc6Ile|4whcGw|;v zo{V=oZ>Vl;cbVL-(bTb}*}%lk{FxiSJ7hN<AN*`76jIYi0fF31RARB|!fq71Ood+@ zHIkkHZa)0QKPustIe+ut2DWLN5-2)17c44-^LrsQMpy7%DDXVii-=4ZC<0?aAlwgv z#LscXajqY*qZ9!_{d>e7ztk%KN{PWKNTriz+{{j;N#4cn(YoP=?7iFd)OX|4(`k!$ z4fuo-BV}_7j+e@aZ55|Wjp0xQkU(0bv|)i(ZNt!s(a3Z-uv6HU$HyC(<j7AweEh2O zWk*Y&wkT)xYJXzeJkzcALc0&OrXV7}D-cVo{!~h&Gw}Z@2~T*0duh{tLpjp^u<NDS zdz=So5Nt!u1^(Wy4$tZLH`Q?rROxvt8r4o*&D+L*-s`VSED#=Q?z_3VuezK!))b?( z>rYh?*iw6XV^J5dB16r|@t;lCO(R4g)W}&q#RAU8vxg(8am9!_U9lu8K5yKn1{PI6 zb{`o{f`LX>meq#27tMc7#2WHu18z>wd;+m4t>Tw)@ZOiqjTNZJIlId~${juc7~P}S ztBUj1+jpilgHns@+Tw=G6>gML=m&pqQHTe)nFGx-P?dHYwxIRSgs6~9727Qu%D)RG zB1jtRkOOLDWoM4fcJr5!6EZBUkeF`7oO;{=n>&vdVIl&CDiZ#6ZOGi$^bK?06yVnD zqhGu2%W84NN>QiA!4C?iyI&G#DD$De!|txk?h&a@-|f}3ciKFFP1ql`*aDM5tqhbw z4M8a1pXD&2YyBsY@_zNOQbLp}FS$R}bM@3C=s`1T)b7Jbu6lolMy(Y!BQ`56rRhtc z3EvG6`%rJHb<D6hq3UDDKyJVJGmnQnVjg7fPlq3_nFV@WGEY<jyqqSe`w%32e*c=B z$C<1qT3r0vo*n?cDz|;~KEd$NQ;X53O6K1Wb5p0;J6wup<sm1&4!(Tc2rlGGJccYL z2iLKOYB54iP2pxmJ@u3(i6NYU2qb)8MS8M5r|GW}deF^h<QJo)WZ~UDO_v=nwlQcl zlxp=Aqj48>`e~i=ah@)OKVav9nmGr(GL<*C9ZPFrfGr=)X>QxGDID2aCxKqRAwLZ7 z8Hi&+0<Ml;Pkkj1mgTz?s+c$NkcSb*_Hmx(sB0X!9#IHMUb!hC#fX91r<uS%JP`al z-e3E%P4+d77r9ST(a@2#zh_*I6EWMCF=8N)#qk4(ynIySQHKVbL~JVJSZ$ALzGx3L z`JfC4^7}mqa1`HZ6q^dO=lIvH^5a8<&Dl^}^ojS6?S_<P=HtqRX!Z6qvnTENg-nON z!Rz8fLLRcsk0t;|R6Xze?TTa4(x(LT8O54i;`WVga*6{#2(&2I-kXxd;lv?sbb|0& z$PZo^(E=I?T4D)vA5mdPWH~3nzDcK~$j5+D1J8}dCoRYH%P#S#LGfjaqeOr2rx3rr zya91YFskR{n*N3T>6AbGSPMNZPS5OfZJ~hNQz;tIFPQcf$X4KwIrb}xRAWh=KR*Z6 z&xZsLu>7tN3rn5azTtx<w8p+YEPm}2|K^=UD&AN?I|OkvGc$kbZV=7f%hb7q6db^v zQo;O#TFjtY361rZ-$;z^5!K#gQ7ybii2WB4iJoQsL~K(pvh04@p{!D~ct*HJDhO1a z5*gMwH6=E6VGXC4;z8}TjzcoLvBFVcTjkwI>q_8j?f67a!D8lmm#!YFfu;g#;iBm( z!G^ZGtMIYVTq6gY+~zAmw8hf_|3#9;y2!Q+;jt+PoE_>V3!cQX9a88N2q`e!R66T- zxgeM2zt?A!V%W@hFx2_@?`Ei(!qTkf=M3S+k>#+j$qR{z<L@!z1so?eSApy3DgAZs z6j*f3lV1vQC-#n)q>{ZZI%Du4&{y~UL{hl)iKn%|LoeLzQw^h-l4^kdF|xh6{yx*E z29ox17wm$?k^MLEeD#x)jrV~Vy745u5DYh8E1JY}aQghn=%hyWW+tlbh>XA28Hn~m z^)NgRp+k9JijK{!GR;y{^%MYsL=c5y+LJna?5UYtw9*-jwJY%`s;qRVag)qp<!wAd z;*jBhBd5X|W33WufH`DJ*!0WIN;aDTE3^0RyiFrUZEuuAA=iul)S-Hu?C7!&kg)c# zJ5(L@7wN!g&@Hn7w=W+EHI_ar)BAcdMautrHXGAf^zmpCZa<LnY3=c{@7_m}k|9w7 zmlpy#kawe+`CNl#9w+wNwx#k=hg`(pxBr0$L<L5)2fdzHrrRgJ<tFzW{@&eDfp9#9 z$hB6s#~ThE3ipT$2(P-798J}Jwh`!g2$(uv0yk$g3HwrYgt0?^gzD1G%#g<!7atx! zAujTR+E5_Sb0$-+9>zT1b0Kr4J8R8|d;g2f|Do_|<^O-GI0wvis+JJXgva)19Qp<6 z4CjPCl;Xi#U%FrA`g=c*+|}*WQ1Kv+L<suSk+B{$n{H5kzNyZL{yUoWb;A@Hp0_t4 z>_ZJS!w$fdqC^0{x4v^FW{9;bP7FW1t3Ew!Zon|qOf`&+t2P;0ku8UsCF&;jD>tW+ zW<i5@Cumwr01qSri`zc*Zr6t<8qb&L{NviGI2V!`zLWuk8xwt`!z#M2JkrXmi&VuS zmx4~T$H_OxDOM-;_2DJ}J{3QH_Gnn`J9S+#&vK&)29Sem5FX4a7ty!tJ?b&TmB16> zP@ju3k3%6R-wrlrI{m+C=xWaAB)P#z&WLa?-z}hf@35`KVt%XvL!SJ5)J$k+>irtA z-`Yw};Y;!7O4VOkaJ@`Tj8{YmV6%Ajk>VdtILa3Un<NE4SavX{h1kurwU(er9M{zw z7_qEOueC$MmBj`0p;Tm!FJ96N0Kq03$Facq-KD!My|2-k-9w+9*i%)%Ox1%dNqdz5 z^6w>mXS;KY+(nBc>TGjlt&=RrKhLF)y|%V&pj4DAW_hv{4B|KcI!SuzUs?5ErNMIj z4We->6hiA~9ujovNg1ZyQTs0PpXUo-@4$Uq47o~AC#alMv72bBtFs&h)%ikQH>C0$ zd+Owqa%^{fz3(fSFF}x|7*mSB3+UvaW^77c-_y~`j^w0T@TmIc-aQyaRi9=vZ<}ij zO~nG32>+oY>fJ{eWv$Dr5(9{Ce4Wkdh{!bJHSHpQ+0~V$nNg6H5T#y+@VnBO{%&)d zT7<?s@-+H;J0=E6NPJqheVppa@<CbL_zWG=^lT-P)E>{9v|Wry{~81wn2Nvu3Zy3} zJ^=3n?b|cLsNOmmb;E=v>vvD96Q{n%Bpv572h;?>t((JS87z*25f|1H1>b@mY%j%P z!{!f<5V-udXvNg#9o#?o&X7n4Q}s$<@)ZvbnTG-E@q4;<0ygcG-%pj_Fpd`Mzr>vW z)Z*_;<oRR9udy&2K3xn{<7WhNlWLR$ABBjwBY!!DM)pr~A&bcGFcCpRgR3s*H=Ue` zc8LA0AWbwpfbI6-ouD0fSn^tU{1tk$2|6of;+vZ!+v_}2pXS~bd$9-^PU;A8w7-2f z%)c#=*nMCVu~Unra#Up1hL!N()iD#!xO}}KA|NU^me~H07Y(d?^BTX^=uN~~?r2e6 zQ;zTVz73Z_*M6s=!sJ^u>n4uWemdyM>GT%OZ09i6SCekmo)`__A;XE^MyuII4r)Jq z|9Fi*&Ui^!ZH+Z)W|l;8?D?3~_d0EtjukUJuC0-3&>Ao9rWN9AHNeU`^)bH72tQgA z9>IhB+fXJz-I&5--ec{|2jt0vBh!eTh_JuV!AJ07pY}DYX!llgpEZ~Mpk1Vc<GSu3 zb}#EmShc)m`ryVf9lo}m+wXpefcZuF<R=^#g?caVZ`fH%LHrRSUYg#PkV;??mb|aC zK6VAqMID0zt=bFlU@R#-L)a}!b9UQ}gL5i2(l}oN2uvDau1(LBTmka@ZEHSxT<3X+ z>iJOA$Mf^pQxJCZ`RDYQZP|eg2HwN3d-@##aje&`k%VjiJgZ**DI>`t`R}fVjVftl zkbd>(K=e2=V@D<{j;`bh!>{sFSB)g5-lBCTmJOw+BZb&IVY#==hCUvgUToA(+QAO# zCSPiCj{wdJ{Qo?%WH3kaWp$9<+0=uF!g+j^s{3F{tx8!Qt29Z|i(Eq8@(&XyTVMb4 z#8Q_0#vho!TqFsHMx!duRKA8K*{I0xLW~^>kHmA%6Fof2r*yyjN-TEgSeQ>=TtP_4 zG0u~7h~&Zp)l{#}-!exczxPea-Id-_csw$z<3gp1#Em2Nf(qvN!2Gnpd%}SGzSSJX zvF>J9A5*5dtlSPo)_j`Dkp6?f?wFy_nhR;B0ygW&sgemzNq<(fd?1>$;;xgTual#^ zVI5(dTeY_4E@sb`Iz#V#1v2$;1)%|^v2Jag>t88a`~DD~(E^oAj4BlvU>#n~ZxhHN zDMnR9omt5r-V<S16XDF7!vIHp#C4Lb(oYc)aH<<cdgn6Hp93AM{A;pm8r}6>YfSW} z!7nDmJHH|#UX}mQrruOLhWo~hdhM*y$5kG#iR_P6+y6Y)r<#{W$XBRMG+(YRhg9Cx z%0ueMO6T`s+sd)0eRCTKu_7%BFHKzJk6j0PdguBxbC+oFe;JBi0Y_(@R%65Qf0ZHu zYPClS*jB;ap(YRN{Xo?cE(e#XS9$*V<^vaS^B=@_BeLq9m8}JiQ9Uuw=%~qW@qZTy z??Gjc&-QF!fclmFX)xN$`gEu6W1#_Ni+#q+xLjq2KP4-OnihYN_6NXB%Hab9j)d&Q zrfwOS&BLBDDWT>=YEz(OTb;!O>eUgTQh$}oxzQeo{Z7q+D0rQdKCE387j(XP8q(i{ zl-{ITf<UE3Ssjl!;`}*K0}0!5G8gn$AukD4Y|cdT<hv#0wojvra-cxYnYUCc_2oYi z=T;a0o8lVJMmuu#QgS#I2^4bn{3~bux0kc?U*{^?R&>nTKf7JC!+|zy$>lgw&@LV5 ztNPga@~C;d^034Cxva$AXyvcGLJ*~gAG%U-wkykXtfQ1tjIeFJz2x7AGla$M84+LV zHIpEG+<{;HL{HZ7fB1!^_XC`Tezlc7)gQ5che&(S%!YP@h+NlSm1Hr*&A*B7t_+@e z^j``y-}y`Jk_ddr>VOZ>Fvh2aOAJKE`u<t`^W(r_CofIPY_%^*Jij$FlkX)XKlIh^ zkrk}{z6=$8ai%s=HC7e>+2dltD3W$`la{#@2=w+<ku@FSLOyj*@0vI?1>$RlZ)#Cz zLy6{OPpw+1>&H!0srf84I`THvp#GJ}k$PSA$;A&CJ938TL#}+AtxIJ;yeHOQ3PAej zrc=eVa}t<is8jV7VJ;vVAt}eQUidM>|Ho`4-(2u}md|S7y6r=zc|}fG@TXlRL%dz` zU$@%-{O)+BlK$+k)Gwfsy#H5(R|B5UpFKQ^@~@PG*nz<?lJO(z1_4E)Q05cz`zm0x zIz<x}D3MJwv}yZ=G8y)bjF_XYdq|1}LIn41+W_~tN9~7CkLbURuTeA?sO3ud|7q*J zgPLl?Zf}|t0qLLu0Yg!WAV}|O5Rj(Qy9fvf0U`9ZK}4GL-lg{rp@t?+s)DqHqExA& zM~J|;ectz*IWy<{qr;Hwgh}>&U)Q?U`rQhNZgv;(eA_B?w;~78(w>NjTQA&te_4PA zq0rqYM5AE!*U*RKb2K^nBM3Fq11_edn`r;#lFGKQp!+7wl=1ybJw+t_uR(}v(Ysnu zHPCa%_vin)0ZtAH&_7wU<;MCXM!`7c>G?|-Boo1<Ef*2?DGM=Pc0OK9(PR4fXJrpD zepcAh{$ww?2(<V|r-2i)7TTEpZ!-0jWdZRio7=Hub;9yvEn2mgVn70_`_@Jyb5G5m zPC@QZJ%!XiBF@3T@LeX+1US*GMnx*CNTje}SGr^xVkwVI9~(RIB&ZDSoy^OP!O5G` z5Khy1fwH8nm#?D5W5B0<`uqB|h;>OB5HV;m*0LErc4IlBB%C6&bL7a&0jpTBNLc+( zCIwx_?!sl~Us(XhQsqx&mvO`T!Oabp0H1I@;kdc?^S9u9j*XRL)fSsilIJ=fA1iaW zS|@J3qdl|J+xBY7hlAy@=r$uli)L2Do6{t-C*ZRY5ka8U1`C~$f!k*RhWjjsuAjzZ zcb<*qgCo0BJ8ui}2$PL@ee+}{?iLnaEfDqK=wMOrssa3G)+_l=1$E_FOf;fEFvOc_ z{|IY$tT_{ZZ^yR~g2LjR8-d?K^I-#n^XZ1|4KwO=b3SJ%r0;{%;$*AhC22{!!{0-U zr<B<Ivdb46n@2IIaL23SE5z)^O%Cv@;`}$S>`H25`lUkB{X;92-}&Jgwe1@93bFn# zyc1J^hmxJCHO&um_eaeY!v<v<ZEHq1vR6Ryl)#HaO7CKmZSXqsu&!l25>dtA@PrJa zy2BCqUn5B1ORl;-7;*QzX`*QpbKG{1tjEh+fq^{%!>2SC)c>aE4MLnKt<7iV*dFtK zujP@d=s(ZB5+SFxG~hi@7bw?8rPTF`mV*%dv;+Us>jT}uXh=d=82A5?2%!N!uw?#| z*^~Z>^`J!m<FT+68#vdd@Lc&l)Q?IEnUY3tT()T~du;Se<E(ebM)q)@quh!#9KJ}+ zKVK%`-wG{@r&N@@{g4hM6@V*+&ECy^W+4HgHZb;~6G2S33GxeILOZ*SVI#`c<z>K| zk;q0=`=B?+?bY$hFhM}s`p>i%`!^Abh`}cZkM+!`@MY&MzqaGT<ofG?)!nYos-9nM zDgWI+1281`JDy^AwWC38gT#S)(O(XuTlgQ-oQvqs!>0D6UIry)sbTH(aUo$PA*Eq% zf*Q)!R@iEowXUDA{sUP_sA%njeFau8>{6KOUE~F)kTPT*C}?1qW%KfG7ntY%r1FAP z0xDYnyw@R4M3L9r=Wff+Uf87OI}TF1Ve}nK`r&|t8R!Jf(C>mm`~%uJ{0E#D-Re<4 zx+~l4;r*>AJIF!&ZW;<wh=jwjd6sFIFjd7#{{Z^9V&-i;s_^XcCYpoj*X(;?$dp5> z#Nt)Q=Y3Wn?L}_{x|&v-tGfFKXLJ@7k!x~p+?HNJt<d~krw1%Sb{t-~O9h>5$M;(0 zGj(2UA8a1z8)5PjEWA&1w7M?|57-N7YqG=8hVnNJrP)$TOy_L1YeNzn0iEhh>WI_P zi8j%;1V-psIj%J{Y=@^~oPFH9xUfz?5y$j8NT~#1juo(A^f4dEA;}Q;;D=^}F}ZsL z;%w4$e@!rdP@8=4j2j}^9k|@qG|J$P3qP_>-wxoA>Y9TcU;c(H-h`LyQ14WufB#S) z>JxjNWnm;cQ{M81x$W{AQkELEl%I^|SZaAND)szkqwdB<gT<Yj<R5ajzIt{yl-!KF z`eEb+WPRm~Z`%CK*G{EVJRrzfO;535lu8!TRQy{B%-fYu%sb@1|1jxWi&DIu7;+gc z+7j+f^DH?+tQMF&ln;{+kzEkKN4~Ym?|SZZTFb7}jupX++`pyjCQ5CXE!xm+c~8Ju z(JVBKGZXQr4^vS~J^d7HeW(Q_9teW-;t5e;B$CTmY>9$7t~v|hkI|htIo$e1F5&LD zG>4T~>&63iz{aBO)eu|Gz^f;d@Q7<Cm+Ooh^UbqTKQr6t<7AgQI>UL0j#wW0Vy<Lg zqn%-^wG~=M7rr;p;rCcmpGj1OBlZ;L@2&Uc*7$E`vi8l+TV~i?BH0I`98EB+4pzX| znr`tX<^lU}d*B_gL5}M%IgE4OXk8Wy+clA7G`<{Tbu!OL@dMqCSC*33GIx2?{Z*zG zf7dMKk!k7pav&UEdp|jMh88d6^gtR!LfFxjvv#7Y@5XIyAPe!0mN<%u3LYJgt;%l9 zhf^+JP7D%Q@t!8_wl&~!$j`3=0HI_Dk`utV_7q`No%34bmyh|?7zF8CJ8bcDfsJH) zk&J1L>lv%HjiZYaz9}q;MZydv^NRf*M3u;a6Lno~)+)k<$$QIfspi=O&1p9lw;gI2 zUMyY5VMLaqSED?`uBWkvDQjNvP+k~S&BMN~lPBiT=k~hU9$t%W{VJ&i*y^KW91%Lm z`u5ikn&SSnW#3(l-q8EX#~Ar;e;K&jA84<Q$x7`h<c`6c-^PnCi<~O?<V4Bwk-BEZ zyZ7r^PEYqkh<@F?wpy}ze!Ds$hkL8Jj@`2E%VeDYh0OwKyeYN*R}lqm>F5K#BcEwE z*I<&(6M5%fMQPS;m%(oO0DJM_GbtWZ;<+D}oCgGNleYh)DuH<d$4l;H==H(qyA$Ws za0}&*tH@TrD!LfHH^d%|Uow7V7~MWr*7-mj^pj#x>82K|E?7-I!(eo};81NV&C@J} zuk&H>I;ODm_Ec-yDkIc5lWc`#%NUBXPwA_RwBmgxHIa~o<O@<Lz_Te&e$7bPH2Ycd zelMDE5i@xz=6cpyO}n4PUeA>Q!>trW9XaC+U-mYL2fh0Bq{hyh4{Bv1$S%a3jedLt zul*^vEHhI5@`~g`4zpoXd$>)Om)X|9t9)2fluEeGe7jiu;aw~kb~v+O)GiH+ov|2s zTI*fHD!A1-{Yg6)sB!h*?b|s0v5R?=*wz{ap;&o<8+t{T;!<O2yOT7Py*4iQxCJ}= z6!jE|($ts<m#Flwwn*+ciypP%yV>FLW!$7?ehOEEAnL-vbbdvpecitMeRaQI%!usa z(2o10nR$?giqR+0xy)-i8#-!!H9k{B9+iOcFn`G1vTHG+z_i!nB4=q?(f4<Gx82P8 zj(^=tSa_EnU_8BOlx3=nM3seU134=JqDbKD7~z6AYpe@JOy?)t1c%dbC9f2nS*GpJ z`rYZx9Z1;_nYZ0V`uD}g<+4P-3UU_nu;T@%81vW$EVuIK9kOoF1(!}M75yCxV)v?g zr1O3K{(HVPbKu>mSoiJu=)Yd7PfB+`-?$+ffzwZBU<`H}5Bfz@P)(mg3@jj)OkS_i zRQQIG5#_>^^mkO%&wqE3I^;=&%U1edTjjJeuW&_I&}%D`Az);scfT?SP)2^jHO)5H zYk!+P{qiKqvwfQCwNql_9lwivU+iO-F7v6X>E}A*X2<{!mY5gqheI}7)ZCJ?(|LCn zMr<EGct_V3|6;G@lN?QWgXp67&+lQ7vb<-d&@iwbkoJE>-#?qeeR?F45>&wN12 zES@Ll{`G4<n^>-8j%zFn7)zxw@Sst!sgrCJPxbX@zH=pv`->Kxk}=#cy*qQ;WFr&O zeB9gDVDb0OVn?<1JNdn+O4;M#m1%TdTkq~SRhW?8iMFg1ehi(lB)ZY9XLPPpgtD{P zI-H%(SuC^*-ocR_x=Nj;uwT5CwB;ap*RX4o6)5+<U(Q4Y96Mi6{*f1sqyZ;K|LXB~ z%>S>lgUV$r3KZ5iGC}&6%h+fp;;rR+=62?jpqd8l2)U*j7tpsNH7X!nsriNfkzB;m z9vPM<V%)9{Z0~-P6oiLrY8JPA<tqSdmw!G0r*%JX=D1v(j~zCP7(oXz0?5>H-!41d z$L@<R;FQ(o)a`x!x;&F9RuC;K;$R&Ql>c>IJ!m6`nF@WRUII1vt*}8KnxJ;j1Iuu| zDSYh=WG;De_<M}WM-I+QOTL)uq^G$p#2Qv+SMoNlV_Uv=r4iv&0M4yoo88hg;v$NS zac!T1CG_-~u(sfzY%Zl&xug1+u&^u#;bF~`g_32$@Nzc!MzE(mSYV~|E&=Gncpo_H zM9lK%#v8Zq+*xnpt;<oihUjQWrsa+4T_QFV3Bbfev@3Oickbz>AoS=X7Db_Vv5sno zr%Fol9d?oEdaB55(0fY<RW|*2T=3y41+{UZ815&$ciYs5Wxi?h_KUqiAYB7&Vi`d* zMtOXbu&Dbh|56JJB$ebXfcvKm?MsBc0?NB2@T~1uAq}+7V=PKbslsg)K3VTcvG)iL z!UZ}j1E|*etiU!SFt9=EqE@51U{T2`yRoI+t7RH2TP^P?O1OskOK5L~>rR2=rcm5@ z4A-Fyd>3mK@=Z}{^c3?YefVSDMj~F;+Vse1Mj8i-WHT{*(|{uLWUn58c>X4G(*b;o zOtFW{Q=7@|+3^7)fF*wJvh(31X%@`9B@wTRX>=0h*)Ja7u)i3Z!#Yf>1#}O8Xyxgl z@!dyvc0IRFOaasN7F-kcE>i7i3*7+*nxA6*;D`L~yd4dje06RJTNRznWvwU14ANj% zl)v(*pSb`d8V&4Ud06j(qsH<XBadN)m^u6MGKbdi9%;!MKh@e=+dEJe%k!N@&>@6l z%qz4%|KgzI)z2>>>8?Y$C?WZMM}X=;l?a?(KRI~UvLZV?3(YH<9GeJFn!7=w*|c-S zz!XdDJ!iJ_Z26WMj6FY4kU<x|cR9|(nK2){d>a4@_%83G?rkL}4Y@JBsgOqjj?k6{ zhow#*Wbowh2ZwKQ$pKDF@L)`tm-4IaLhO{#yw0LORkiYKWpD^au%8#KE1ubddOlUn z^xlD2ar%xq_x@8Ro!O`lV<yFMl;bP8SyoiqBZQFV#=ohHo$4+no?{4t10{V-#WUY% zFW}t`u!H#V!i$q*ZD2hKK6(;!+9a?h+qg7@$a5%{S#eh0@KUwg%w}3X5IJD5jJ{L( zjVL!&MGkD?wPhZ`I;x9h1531vYxBL6CwA;PQ}nVY{6i*8WHG9z1JufAS?z)kRZn#} z<zhE>|1~?aePq&A!I_;yd-bGEyr!K%_AJWFF;xXv^D3}@O0$|Zx7}cN$#1BBF&E1> zJ2WgalY6l+p-V{6CGz4-a7Ul(WI4P&Atg%ItXjuEImI2Y;6kHq7uK}d{Xe*;8qN6c zad8s=^3l&02KA&Nbnz#NNV(3F91ZJ?X~@_CC`bISLtiTp6bHbc5@5b}KtR%e`oM$- zNhabv8CzcV<r3crc25LYT`=4A6zW<#fCES3eEQrsnC>_;Db6b1z!Ti3d7T4WP4A{9 z=*lK~2@_IY^@zcaDz7rkk%5MOXG#YERQP?>zk4yqIqZ=VC?O)mV@>G1b@dELuJS<s zT`zlt@y*0`$*=P*X5L6(d<?Um$qJ6z^*HHLx-DGB;D3D#7$iiXv|~l9NDG}S3BFy~ z4Vh9nLDwdwDqWoW7p&m;J>cWw)se>g%Cb9v>zKPJ#Xy`p8-fy?<PRmw6x@Em#^{P3 zzc(K<5s)W!Kc>Je4OB?PumZY`bqohje}A1O1^c`!|M9)&dVnGscA<33LT@R`QgOy} zIN(crl{@<!XqinDy^vkrf157y5tOkAz%R@v?Z%p|Ym3SAlg%-Q%Y>+t#kP@Gp1&#e zz2{8b1%x46+l<6vxaA;?O(w@-1|Pvq=ay`3aI&F78`CE{SRI0>QlTLv=wx%5Z@rJf z^-UP-by_0<!1DE;C~Z>doX-^)b!%zgd3kXgV~Bx_SRH&uGQ}V#0g?<mp~^~cX1bY| z5L2Uty`cjHpRl?y=&hnLyGKBDcoP(26v2rU7G?7We{KAJ0dTJx7384StX1Bhq1(GM zCe32z)!u}7U`1JFB^z2F^0%4lGNQ5*4lP2K0q5JSM_7)H`9_N-SG4EYLZsyI^W>{V z`jqHK;)R>1o)_ktMqoyx9<etSe;c$HB1h**hTXpf!g(eidpZ~jn=r>BD9yHC3GJLX z^L@Iu%_)1h90aNdzdValL{POGdqHwY@q+ukw)XDuxu-s(c**3HwcGG-Nw{I(XjuXv z^K)RkM7IQ0@5;a4`BN~~=Fj}cK;5ZMjS=d~1k@mRcFLh>p+|X{MPzWYj@xbQnVKBj z*D|J?^6#`%qNYjbRJmthAUo2=LQhd<W1aU^oBNsl?ou@!eCE>J$h4xuu@e4M@KxZ$ z_1_+rzF3^b19-Wdd8vmb+562GdWyh$&C)BDQ*9j$3J*&bhl#T0d()5WC|Nm;WoMg^ z>o~5MjULh?i)IIcjnVJkoWt#R_@)<kf1>eMXR38?1gd9jik9`w+hbUGa-yu93%s=< zgFkGl?M<V3AaRGCQ<`EDA^r}hCMM&y?{`W-yw1_@6>@?!^tdQZfu@xcs!8}`X^~6J zCR;ypH>Cn~%(^!&J?RXIQ)h@*_fC6x#f(wN^d{C7os9ElP#+)xjfe_XEHBh*cvWHR zV=XOZmyeQp*cSkXxN#Nw6k%w*U-}lRD(DkmCQbO4+8xpu+L*$I=J2O_oo5fh@$t8s zr4nP}xsPPa@)YDd#dM+sX_%aF>Qv!`A}dp1I~Kf4ur(L@danOg2!h+eWS}JX&;Ro8 z-&jL%NpMq{mD)JxgMRDsfQQ|T*;JSTgMHFRP}|(uxDCqb%ED1>lX=ST4(*2<UwiB2 z?awZc?-ddd@DSAznt@mk`nYRlTj?KQ>jPsgFM`LcxuGkJSxA&Sdx5*D3t(nqYHTzJ zg<^Kv5p$=*Zf0jrK4v>Izo%mCi~O)4j+7S7Ppm^{w88w%RwlM}d{=7rVSqn)%d_!w z?cL<$^z?+JNGn?p%l#-ESMXJ35B=%xkY%d|W@%xoR<K&y4$0b&#+66<zFG4OjWN47 zp=jxuBiY`vvD!`d@LM@RLTp__^ti|_JWQq9U%LO#iL$j2lx3PFS|>$b`$6@+JMR)_ zg&h6Q3<?Dqb4+H#R6DoO{=rumzRt;?k_M+4Aeti4Z?Sg#N7Zhx7BERGFxs|bV5)dh zmG-nov2t*wtR^f8Cyr~1+r7D2-Au+_Zo9N?I_FMtsFcwwj9dV&XE2PfbBB(myH<$| z|Gm*BPj@S^U6D4<{G(e8%=*n5cBq_HauJVWw5cx3Tod$Ua@i(3c>(I%xhO5Q04nq| z#h~X#`ZTn$OR^0N46(tjTF~FmNoyxL@MuG#x@DAoMf0CCcJk)CbS-swSDWfi$`+ES zQ*&gboa#MJ)&(GvjmUM$0bRnH)@${W&fcbymOo$VN2&0ZXrb>*k(%3Ck^k^(YNWN< zqZ#pky&l)lE*1t-@#{GL@?a#I2*8zA#2w$>|IKt}NV3}D0i{%>mMMJ^<;mS@z`ySy zUi&X$NUy!pVaZ@5g=H-&=H+A!8{jto{+X&HeT|P!1V|v+gnWR0KazX<meBVTQ62Tc z&5@5GxuJG<+D!=4@<ch(0(ZQr`}=Rl2JD+}WRk23ja$EuUMbBTwBWI;$vM6Gs+T_Y zJehWQdp6l$J5xJ78CSN=6+WQ(<OPSr+2ettkN!au)wB;gW^?)+BZ&xQA3nO(4>xYl z;lyHN)RX|^JxH~jZ~5oZv{l+Y_<a!Q$hp)QSg|j5U+zF^=$DQCa~Ff!>0F46a{6<n z=yZu1ilLuV5F0MNbAOs|p1GMXm5>WThTe-icQ_41QofTc*IL|x#FK}2VUBfiZM?tz z9?>CaPjr!cLbS1JGb<s`y8DE4$zEcZ`d1X)_xgZ|+MDVxX=6XokU6%hc_eCKRHSCV zQ_UbTP7ZBR!XUdBOO0S(dXD(;VrE$)#-G_{4h8>39u>+id(m_`wmOJxx{vL`Vf*g3 zadbAe9CfUdS7O54_a4JqecAG-{+!Eun1EhTu&xIkr*yaU6GIElaQ7!DNLT{qs_|xc zU_>~Wh0fU@M=s%ZnYN#b^!GIJ)R{jryDMtga)hl0V%qr5bCBb&J~AwYWDOI~<&hP9 zy)n=2&{-xID_ayJTPxwhmP__>+rtO>D~Kvt!uo&!;<I3~i>+Hjb%a|3dTTGrOIXWO zAyP*^@V7-#l6<J=>uVUXgRaoUlEDn%><!$PvwY8Yec{T|BDU|SdEguqA{wIURSg+r zSR0dzQfDPpNcQd@QLjx*dH8D&vro#DO%4{lLyL4??E!jVC1`OAv*g}uR}s8)W984( za^m)LJd!L)^Ts|9X1y&r{sma*eFD$!c7Kbl@P<0;_~e4L=AXNMf(|A-C_tsU{l;z^ z?EvMB%h>&P*XEHm@8kCGnnPDMBWcA&G}ytv&uOH@X$q`OgPB&)@{(hIikR;`Lq~O> z1)#)B))up`^l|ZXB4p5tHRxGnTaAvd3HnfJPiOCCrSIY4)s)Z@y>=onGRj>yuz6Rw zU?XUx)*E{47xi}9rWoBT3Q#`o+`7;?1UUfg2ye)6`>?E*dg}58w7pzYtmRsP*t{wI z!Ji1V2T}XFq9_E1;3;I4p0<=(WY{vp3r!#UPz|`TT5*kVj*?6))EoyH527N4_X)k~ ze8PTBr&J)kjTod%U!LU{^;*%!*h|UpY9h1|5$Vh{dt>)Gzm%>3nw0jZA?KQX6Ioa& z<lwQ?$Dg_<c&qQ}%>}p?<R;OgXp>J`R++<+9q?+Bd7K#nm)XoqZLQf1X}n+2fwZs8 zH9HdbIR7G7f|q-I?zuQVi~AczIbUrv@FrMN<IVzDLui_<Kbw3Su-H`twwW|7Ldr&; z%r@Tc?V5Txug?PLhUF9z+?A2J^Xt^%;rh)^iq(pZYIH{8ZcI|!UbY2h-I0qR8d-Ht zRHrr&r>-Q?etJ;pKuGLjxIcLg1r>bv2iL&Zq`V$6T6biCJ{C?vMo=wy>PR42(G0HS zD@`}hv~=XE*bZSD(16#>)|#JodUG)=P-DuFtt+EX+v;2FyzyOEgDH{Jro-uW&Zbg1 z25Dt>BKqj(N{rcWa=5cC87jAlI|JxUMjoFM4nM*{2q|9uXIC|5ec%r23+dgIoSgsm z&Yx!8(h0Rvw-VkdkR_NY+)jvkzyS=#Fwpsb!EKbCt27Ks&Ctb}{2QT#;J$-^aOKrU zAYX4hF~tiUu}=8nr9*e)n~!0u#xRK93Fa${DhQ9c3biz<m-~}AxYy+vmQ=53G7_B6 z2Y|1pavvmG`EPf%$qH#sx0nq0+d`4AcEjfy!{*Dj6mRwQ4());2jEo(o%nEw;7lJf zj2Hwpk|;;elMZQb0$;(3vge>=h@(N&>n7&&cVXg~vhy@HnGDwl`{qu!<anzQF-7w0 zW#=p{6KwuZQcKI)#luuBU=qHwS^YI8^r0aaV1E4g{Wv&jNdAY;W;SnSflhq2!R#!h z?v{U$@bO)|(geH!Xm2hTR68ik@yx$sEhe_H%51lUtbYFFiVFKk8&=fqKRfG-(%6L? z-7*Xx{Q2R?|NCnWT%xgsSlE}Y<?nzkuClJy*eJMBm5;M>MX3BiB>QPKG%_@#FMsLz z^99@1M_Cfe1$Rw-O0Ro<l{Xisjf;f2q$Pu#(IQ_zH((7*e!JumYt}R6Tf29wY&A)> zBN4Q59!tJyaOUVwNnxJ^ZxG{wse*u~PQF7uzhT%W<m|v`x=bm|dfDuu8g1xPn;k<m z!Q8L4P3*l{5t3DFgC|Co0FwyA-mWB`iQS`f^Q8D5G#LLQ=5JemysvESN8jnER$Jj> z3&k(*@&iCVxNY47JZQ3AJ(rmt=ehq%%$qE^1=H4eu1{UC_wagIT1fGy#XoTdSl%?p zQ#oy`;$?`Y&Paf6gS2~YPPhGouSPiaO!B0Y1)ToVJ<MC>f}|jW8Sb0yJ3G$pb*<8G z2<Kq1eh@&&o4<P<f1w)XX_Ig2@dQPxxS@M00(e1lDn8>FVlH_f+19DGe8|hKStv;D zcYc2P<`-)0#br;N$J2ucc9ZyZPb%5v@7nhuPZ#~Gw&q<UTO8q9U*n6Ew>C|-E%c|Q zY4{%xRH@Z|c$>o`ryYJ2u+b&`ojxxMI<cqiCStb2oiW|0Nipniwn+1GmS$N5{+j~c zu?SRfC)m=doU%GMY=`30GyE7_wn}DRiOtirD`mil%Ipmr9xQuBn7TA-DeY~kKJ>Ky zj>@(?tM9j54$&JrY#J!>W61A7y-?z15uv_jt?O*9%=!*Xo$U)+MMbC2Bw*Ha>8lwZ zP9?J6S?G;=F%hGCZ7$!YbbU3vlHhsxE)rn87>7Vb)#PV+pgNR;MNrY;K)<&#N4)rm z?$0j=7-Q>+Z)4Odq9@wC6XI*`9SoYIPDqnmdU4coGNB!PHr9Zzxs{Ke?#rXZdBcrq zpggrq?W&;PU2%9bobLcO_L97jbdvA3o2vmxp%5jMmL?)hbNlHABdT-!R--DN1nec@ z>Vp0j@o2B|Cv0e<JgO?FI?e@M(k!k$ym2u?ykS48VXasjh~|Up+$h+BS>O2galQd} z5c*nHy1Bp0yZw8lDrD_4GN4am?uG0ZSX;MnCL&=1zKpC~93$7T1ndFlUGgaY);Cv? z?U|Zq$X%?kw@;Hwy3p#$St<|{7cHEMp_8HU_%!ky_HnGG5e4dlW-K}7TRCGbX=X?B z>)#*q!A-z;`C@>E;ibp-M$vP=r)QX8l{T!!nv@|V=)&b=zFtR;ufu?b*||zv!P`*Q z29*?jVFlg_U&(1^_ua}3b~s{0VyzzGw72#}?uhOgi~e}ziZw*E2`J^rLM*R&8vN^A za(5Ko2tUn{YEamm5O79pm>yc~Jex3oki4KW(iicCMVO}59Nozlci}W?<yRy=>0Pg? zLnbTvOxF?F9P#SvO-elODbM7$hf_T_x=U234bQ9F?Uy@3G9t!R7JVg)WkRxCs8>fJ zkij&`O6mAx$e__4V8wIWi_=89=iUKty8YDc;fT_CYgWGKZsJ=%P~0a~PS@LdC#Pv< ztnZq7{w{9QdBGu(HsqIf_mEcyZ?YLaQk$6nEBa5SdWoO#{%1}6BVVr?uTMOj#bgl! z_a;-!*HCZyA*j;7Q@+eG&Y4cE+?gE??hKk>RKxO2z^J#=4#@x8*tp^y8t7O*FHD~t zR35Q8QHHo<kT#j^P7U74n(J9hlkuf1_CLi`Tf*PyiNIUm)<bsaU#3Y$zx}%X$i#m9 zml8jNOAE>B4Z1cR@M{rMOJWTSqz7mGP%&b(HJ|o^6fwDEXGVG*Plw)kE%ZhaY2{}u zLsnPyceKZC9S{WWC)R6mes&)FwSWA%Lf9kmqFje5=KlJX_P`%QqaACR{^GCbC2aQB z5$}ia7fS9Pnac7~dW2?N%TC6~CFiZ6krVE8yuT;MKm{zD>{Z<`0|VQ6rq!LZS}(}m zQvMwgHtxms1Urw!PV<a4tm=)#?CeJ}p6-couN-4(GN7){_uJ{C<@}<7Et`>;cf1AE zgn9;&q!j1Pjv0naUQkt&Q%MybPMi@U_AUR{dcXn^Xy3WX@Pyur7kw<pyrFo5KIRhR zm-tIFW3q6-_>z21*;-Gwd1%vHZUww@J{6vacy5Sz>>*?)OIb<0k<~;A;sbs5@zza6 z4X{1}^q|vB{D(^5KBm%}<!OLi*~xorkhe>!S;sI89%RtAgk0QPt?b)C_vpjwcEk8R z)SDV7=REqC=Bg&ODRz$?i`S~MoIn6UG>U6hi_;6aU_(=OZcFLypSVU-ml7PkOVH7P zM~$>o-i*#?18Id>ZM#iKuZ4F5RSsXO27m`o7iwgha9>F&COYSBi+wflJO^_-5s?pR zW^x5}+!_{L9+_#2jUaTn>-`<F8gslIwtsM-<&Z^%V>_Y-WN%c&qt-U^!Q}p7>dRip zi{eLT#DNl+T;<?yKR3e3A5M;hx1`k5T@Bboyo!iiw<9Kd|CJ)f%+>Ox*&$R$xBA(h zv)o9S_lP-G*cpoC`JbH4>GJ>OOydR`LjRc|bSN2INuCXdgZ2i3caH3{N}$$PAONOW zKr2FuPSbxJhsH3fQDo{xOIg5B;;BGAu!)jqi32m`>31%y>Md#-j;|0~n~HhoxMw#@ z%JTJyK-HHGF(3}sKH73;70Rm;g|T+8fQqslhPe(&j9vk9i6w3TP?8FfL(BhRp7T(F zK{Vv_Ya5OM>Bi%fRpooHnxKc7>RnJyLc+8vSC*(j16LAGV^li!cRM9S_hg)*zSGXm zL<8m@0mgZu<4ip*8iUkU;U)4%0RqsOT4lG4O`2sFE~qDSObhONAu7cbyjCtB#}<Dh z)4IM)0@6{k0o3H8s0n&=O9N@?S~P2f%Ej^P-tF@%0x`T^ujjD4ce1aGFw|f8E^=L% zfvF*>oM-2eUK(qClz2|i@pSQpvU4cX^VAr&&f7|eR@MWqLnm0`riKUjrJrOVw|62{ zRbWMn;{4G3PX}9|L&DQs%p05dK8z~5&xzHAE-nZNb9=UkEo{YsevR`6=iew#ytzr8 zvmtB*WXNK*m96W!Zse0ARmh5fbg2u?o_nrr5^Y<lC&XZ;iN}e|yznFu<JZGF6mD>j z?DR@=?EPfXuK$k7lTNz0aD!jA6uspiI|ZNy(#nnDA!&VuSQKuxGo{PvyCr;UQC-gK zIWW9kJ`&8_7;X8@)$|#>s3L*qv5o%0A{4Zh&^;3X`SafLnw;iN8oe|g?JR{5W4uA~ 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 MYr(1>zk2`w0l>*-LI3~& delta 33133 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 A3;+NC diff --git a/app/assets/images/icons_pack_white.png b/app/assets/images/icons_pack_white.png index 70fe3d851ea0e7163921d24cb61401eb3d3fcfb6..e736070231b85bf012488a4ccabe36052a14ae9d 100644 GIT binary patch delta 20335 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 Mb?$0c-nM!5AA!#1jsO4v delta 20146 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 Wz#(%JMSM&E0000<MNUMnLSTY@sz-eQ diff --git a/app/assets/stylesheets/sidebar.css.erb b/app/assets/stylesheets/sidebar.css.erb index be15746e..15922cc0 100644 --- a/app/assets/stylesheets/sidebar.css.erb +++ b/app/assets/stylesheets/sidebar.css.erb @@ -7,7 +7,7 @@ position: relative; } .nav-list ol { - margin-left: 10px; + margin-left: 20px; } .nav-list ol li { padding: 5px 0; @@ -148,4 +148,28 @@ } #main-sidebar .quick-edit a:hover { background-color: #DDDDDD; +} +ol.nav>li>.icons-moves { + display: none; +} +.sortable i { + position: absolute; + left: -20px; + top: 6px; + margin-right: 0; + opacity: 0.3; + filter: alpha(opacity=30); +} +.sortable i:hover { + cursor:move; + opacity: 0.7; + filter: alpha(opacity=70); +} +.placeholder { + background-color: rgba(0,136,204,.6); + border-radius: 3px; +} +.ui-nestedSortable-error { + background: rgba(255,206,206,.6); + color: #8a1f11; } \ No newline at end of file diff --git a/app/assets/stylesheets/style.css.erb b/app/assets/stylesheets/style.css.erb index 9bba5765..c4b2e93c 100644 --- a/app/assets/stylesheets/style.css.erb +++ b/app/assets/stylesheets/style.css.erb @@ -685,6 +685,7 @@ #banner [id^="slideshow-"] { z-index: 2 !important; } + [class^="icons-"] { display: inline-block; width: 16px; @@ -1243,12 +1244,63 @@ .icons-plus { background-position: -288px -576px; } +/*20*/ .icons-power { background-position: -0px -608px; } -/*20*/ -.icons- { - background-position: -0px -608px; +.icons-output { + background-position: -32px -608px; +} +.icons-col-resize { + background-position: -64px -608px; +} +.icons-move { + background-position: -96px -608px; +} +.icons-size-out { + background-position: -128px -608px; +} +.icons-size-in { + background-position: -160px -608px; +} +.icons-slash { + background-position: -192px -608px; +} +.icons-level { + background-position: -224px -608px; +} +.icons-share { + background-position: -256px -608px; +} +.icons-share2 { + background-position: -288px -608px; +} +.icons-re { + background-position: -320px -608px; +} +.icons-insert { + background-position: -352px -608px; +} +.icons-insert2 { + background-position: -384px -608px; +} +.icons-download { + background-position: -416px -608px; +} +.icons-tag-rignt { + background-position: -448px -608px; +} +.icons-tag-top { + background-position: -480px -608px; +} +.icons-tag-bottom { + background-position: -512px -608px; +} +.icons-tag-left { + background-position: -544px -608px; +} +.icons-moves { + background-position: -576px -608px; } /*21*/ .icons- { diff --git a/app/helpers/admin/item_helper.rb b/app/helpers/admin/item_helper.rb index dc78db88..7b38314e 100644 --- a/app/helpers/admin/item_helper.rb +++ b/app/helpers/admin/item_helper.rb @@ -11,6 +11,7 @@ module Admin::ItemHelper end # ret << "<ol>" unless node.parent.nil? ret << "<li id='#{node.id}'>" + ret << "<i class='icons-moves'></i>" ret << "<div class='with_action'>" ret << (link_to node.i18n_variable[I18n.locale], dest) ret << "<div class='quick-edit hide'>" diff --git a/app/views/admin/items/_site_map_left_bar.html.erb b/app/views/admin/items/_site_map_left_bar.html.erb index 69e7851c..380b467e 100644 --- a/app/views/admin/items/_site_map_left_bar.html.erb +++ b/app/views/admin/items/_site_map_left_bar.html.erb @@ -6,11 +6,11 @@ $('ol.sortable').nestedSortable({ disableNesting: 'no-nest', forcePlaceholderSize: true, - handle: 'div', + handle: 'i', helper: 'clone', items: 'li', maxLevels: 3, - opacity: .6, + opacity: .5, placeholder: 'placeholder', revert: 250, tabSize: 25, From 17b486f9e94e81e0b9513a721c2b2734ac66d0fb Mon Sep 17 00:00:00 2001 From: Christophe Vilayphiou <chris.vilayphiou@gmail.com> Date: Fri, 11 May 2012 17:56:26 +0800 Subject: [PATCH 11/26] Fix bugs for shift_to and change items.rake for the missing position in db --- app/controllers/admin/items_controller.rb | 2 ++ app/models/item.rb | 17 +++++++++++++++++ lib/tasks/items.rake | 2 +- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/app/controllers/admin/items_controller.rb b/app/controllers/admin/items_controller.rb index eea82f9c..1ea40640 100644 --- a/app/controllers/admin/items_controller.rb +++ b/app/controllers/admin/items_controller.rb @@ -17,6 +17,8 @@ class Admin::ItemsController < ApplicationController end def update_position + item = Item.find(params[:id]) + item.shift_to(params[:parent_id], params[:position]) render :nothing => true end diff --git a/app/models/item.rb b/app/models/item.rb index 4d6ca001..cdf0f2fb 100644 --- a/app/models/item.rb +++ b/app/models/item.rb @@ -35,6 +35,19 @@ class Item end a end + + def shift_to(new_parent, position) + unless self.parent_id.to_s.eql?(new_parent) && self.position.eql?(position.to_i) + new_parent = Item.find(new_parent) + current_position_sibling = find_by_parent_and_position(new_parent, position.to_i) + if current_position_sibling + current_position_sibling.at_bottom? ? move_below(current_position_sibling) : move_above(current_position_sibling) + elsif self.parent != new_parent + self.parent = new_parent + save! + end + end + end protected @@ -42,6 +55,10 @@ class Item self.path = (self.ancestors_and_self - [Item.root]).collect{|x| x.name unless x.root?}.join('/') end + def find_by_parent_and_position(parent, position) + parent.children.detect{|child| child.position == position} + end + # Enable the validation for parent_id def validates_presence_of_parent_id? true diff --git a/lib/tasks/items.rake b/lib/tasks/items.rake index 8889567d..7d94332e 100644 --- a/lib/tasks/items.rake +++ b/lib/tasks/items.rake @@ -3,7 +3,7 @@ namespace :items do task :tree_changes => :environment do Item.all.each do |item| - item.position -= 1 + item.position -= item.position > 5 ? 2 : 1 item.parent_ids = ancestors(item) item.rename(:full_name, :path) item.save From 803253ebcf8d2f89c00da0c241affbd199fbd679 Mon Sep 17 00:00:00 2001 From: Christophe Vilayphiou <chris.vilayphiou@gmail.com> Date: Sat, 12 May 2012 22:12:17 +0800 Subject: [PATCH 12/26] Put nestedSortable in page_edit.js.erb --- .../{page_edit.js => page_edit.js.erb} | 21 ++++++++++++++++ .../admin/items/_site_map_left_bar.html.erb | 24 ------------------- 2 files changed, 21 insertions(+), 24 deletions(-) rename app/assets/javascripts/{page_edit.js => page_edit.js.erb} (63%) diff --git a/app/assets/javascripts/page_edit.js b/app/assets/javascripts/page_edit.js.erb similarity index 63% rename from app/assets/javascripts/page_edit.js rename to app/assets/javascripts/page_edit.js.erb index a889f5b2..7c0f6923 100644 --- a/app/assets/javascripts/page_edit.js +++ b/app/assets/javascripts/page_edit.js.erb @@ -32,3 +32,24 @@ $('.part_kind').live('click', function() { $('.part_kind_partial').hide(); $('#part_' + $(this).attr('value')).show(); }); + +$(document).ready(function(){ + $('ol.sortable').nestedSortable({ + disableNesting: 'no-nest', + forcePlaceholderSize: true, + handle: 'i', + helper: 'clone', + items: 'li', + maxLevels: 3, + opacity: .5, + placeholder: 'placeholder', + revert: 250, + tabSize: 25, + tolerance: 'pointer', + toleranceElement: '> div', + + stop: function(event, ui) { + $.post("<%= Rails.application.routes.url_helpers.admin_update_position_path %>", { id: ui.item.attr('id'), parent_id: ui.item.parent().closest('li').attr('id'), position: ui.item.index() } ); + } + }); +}); \ No newline at end of file diff --git a/app/views/admin/items/_site_map_left_bar.html.erb b/app/views/admin/items/_site_map_left_bar.html.erb index b33023b4..8d32365f 100644 --- a/app/views/admin/items/_site_map_left_bar.html.erb +++ b/app/views/admin/items/_site_map_left_bar.html.erb @@ -1,25 +1 @@ <%= render_node_and_children(Item.first(:conditions => {:parent_id => nil})) %> - - -<script> - $(document).ready(function(){ - $('ol.sortable').nestedSortable({ - disableNesting: 'no-nest', - forcePlaceholderSize: true, - handle: 'i', - helper: 'clone', - items: 'li', - maxLevels: 3, - opacity: .5, - placeholder: 'placeholder', - revert: 250, - tabSize: 25, - tolerance: 'pointer', - toleranceElement: '> div', - - stop: function(event, ui) { - $.post("<%= admin_update_position_path %>", { id: ui.item.attr('id'), parent_id: ui.item.parent().closest('li').attr('id'), position: ui.item.index() } ); - } - }); - }); -</script> \ No newline at end of file From 82fa85def8838382c1ba8d89818c06835c6291cd Mon Sep 17 00:00:00 2001 From: Christophe Vilayphiou <chris.vilayphiou@gmail.com> Date: Sun, 13 May 2012 19:32:05 +0800 Subject: [PATCH 13/26] Clean the parsers code --- app/controllers/application_controller.rb | 4 +- app/controllers/pages_controller.rb | 20 ++++---- app/helpers/application_helper.rb | 6 +-- lib/parsers/parser_back_end.rb | 58 ++--------------------- lib/parsers/parser_common.rb | 53 +++++++++++++++++++-- lib/parsers/parser_front_end.rb | 57 ++-------------------- 6 files changed, 70 insertions(+), 128 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 494b497e..4d8d6d48 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -95,9 +95,9 @@ class ApplicationController < ActionController::Base end # Render the page - def render_page(param={}) + def render_page if @item - render :text => process_page(@item, param[:id], param), :layout => 'page_layout' + render :text => parse_page_noko(@item), :layout => 'page_layout' else render :text => '404 Not Found' end diff --git a/app/controllers/pages_controller.rb b/app/controllers/pages_controller.rb index b781f202..c4a571dd 100644 --- a/app/controllers/pages_controller.rb +++ b/app/controllers/pages_controller.rb @@ -19,7 +19,7 @@ class PagesController < ApplicationController if @item && @item.is_published && (@item.enabled_for.nil? ? true : @item.enabled_for.include?(I18n.locale.to_s)) case @item._type when 'Page' - render_page(params) + render_page when 'Link' redirect_to "http://#{@item[:url]}" end @@ -32,17 +32,19 @@ class PagesController < ApplicationController end def index_from_link - if params[:page] - redirect_to "/#{@item.path}?page=#{params[:page]}&category_id=#{params[:category_id]}&tag_id=#{params[:tag_id]}" - else - redirect_to "/#{@item.path}?category_id=#{params[:category_id]}&tag_id=#{params[:tag_id]}" - end + url = "/#{@item.path}" + options = '' + options << "?page=#{params[:page]}" unless params[:page].blank? + options << "#{options.blank? ? '?' : '&'}category_id=#{params[:category_id]}" unless params[:category_id].blank? + options << "#{options.blank? ? '?' : '&'}tag_id=#{params[:tag_id]}" unless params[:tag_id].blank? + redirect_to url + options end def show_from_link - # debugger - # a=1 - redirect_to "/#{@item.path}?id=#{params[:id]}&preview=#{params[:preview]}" + url = "/#{@item.path}?id=#{params[:id]}" + options = '' + options << "&preview=#{params[:preview]}" unless params[:preview].blank? + redirect_to url + options end def load_orbit_bar diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 37c2d0d2..32800d80 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -89,11 +89,7 @@ module ApplicationHelper def active_for_action(controller_name, action_name) ((controller.controller_name.eql?(controller_name) || request.fullpath.eql?(controller_name)) && controller.action_name.eql?(action_name)) ? 'active' : nil end - - def process_page(page, id, params) - parse_page_noko(page, id, params) - end - + def page_metas(page) tmp_meta = {} metas = '' diff --git a/lib/parsers/parser_back_end.rb b/lib/parsers/parser_back_end.rb index e9c08a01..aed8f36b 100644 --- a/lib/parsers/parser_back_end.rb +++ b/lib/parsers/parser_back_end.rb @@ -23,67 +23,19 @@ module ParserBackEnd # ret << "</a>" # end - def parse_page_edit_noko(page, id = nil) + def parse_page_edit_noko(page) body = Nokogiri::HTML(page.design.layout.body) parse_menu(body, page, true) - public_r_tags = parse_content_edits(body, page, id) + public_r_tags = parse_contents(body, page, true) parse_images(body, page) - parse_footer(body, page, true) - parse_sub_menu(body, page, true) - + parse_footer(body, page) + parse_sub_menu(body, page) public_r_tags.each do |tag| - send("parse_#{tag}s", body, page, id, true) + send("parse_#{tag}s", body, page, true) end - body.to_html end - # page_contents - def parse_content_edits(body, page, id) - public_r_tags = [] - body.css('.page_content').each do |content| - ret = '' - if (content["main"] == "true" && !page.module_app.nil?) - ret << "<div id='appfrontend' class='dymanic_load' path='/panel/#{page.module_app.key}/front_end/#{page.app_frontend_url}?inner=true&page_id=#{page.id}" - ret << "&category_id=#{page.category}" if page[:category] - ret << "&tag_id=#{page.tag}" if page[:tag] - ret << "'></div>" - else - part = page.page_parts.detect{ |p| p.name.to_s == content['name'].to_s } rescue nil - ret << "<div id='#{content['name']}' part_id='#{part.id}' class='editable' style='border:solid 1px; margin:5px; padding:5px;'>" if part - ret << "<div class='edit_link' style='display:none'>" - ret << " <a href='#{edit_admin_page_part_path(part.id)}' class='nav'>#{t(:edit)}</a>" if part - ret << '</div>' - case part.kind - when 'text' - ret << part.i18n_variable[I18n.locale] rescue '' - when 'module_widget' - if !part[:category].blank? - ret << "<div class='dymanic_load' path='/panel/#{part.module_app.key}/widget/#{part.widget_path}?category_id=#{part[:category]}}'></div>" - elsif !part[:tag].blank? - ret << "<div class='dymanic_load' path='/panel/#{part.module_app.key}/widget/#{part.widget_path}?inner=true&tag_id=#{part[:tag]}'></div>" - else - ret << "<div class='dymanic_load' path='/panel/#{part.module_app.key}/widget/#{part.widget_path}'></div>" - end - when 'public_r_tag' - ret << "<r:#{part.public_r_tag} id='#{part.public_r_tag_object_id}'/>" - public_r_tags << part.public_r_tag - else - '' - end if part - end - scope = "<#{content.name}" - content.attributes.each_pair do |key, value| - scope << " #{key}='#{value}'" - end - scope << ">#{ret}</#{content.name}>" - fragment = Nokogiri::HTML::DocumentFragment.new(body, scope) - content.swap(fragment) - end - public_r_tags.uniq - end - - def self.included(base) base.send :helper_method, :parse_page_edit_noko if base.respond_to? :helper_method end diff --git a/lib/parsers/parser_common.rb b/lib/parsers/parser_common.rb index 59bd85b3..180914b3 100644 --- a/lib/parsers/parser_common.rb +++ b/lib/parsers/parser_common.rb @@ -36,7 +36,7 @@ module ParserCommon end # ad_banners - def parse_ad_banners(body = nil, page = nil, id = nil, edit=nil) + def parse_ad_banners(body = nil, page = nil, edit=nil) body.css('ad_banner').each do |banner| res = '' ad_banner = AdBanner.find(banner["id"]) rescue nil @@ -82,7 +82,7 @@ module ParserCommon end # page_images - def parse_images(body, page, id = nil, edit=nil) + def parse_images(body, page, edit=nil) body.css('.page_image').each do |page_image| # image = page.custom_images.detect{|image| image.name.eql?(tag.attr['name']) } # image = page.design.custom_images.detect{|image| image.name.eql?(tag.attr['name']) } unless image @@ -109,7 +109,7 @@ module ParserCommon end # sub_menus - def parse_sub_menus(body = nil, page = nil, id = nil, edit=nil) + def parse_sub_menus(body = nil, page = nil, edit=nil) body.css('sub_menu').each do |sub_menu| menu_page = Page.find(sub_menu['id']) rescue nil res = '' @@ -132,7 +132,7 @@ module ParserCommon end # page_footer - def parse_footer(body, page, edit=nil) + def parse_footer(body, page) page_footer = body.css('.page_footer').first if page_footer res = "<div id='#{page_footer['id']}', class='#{page_footer['class']}'>" @@ -146,7 +146,7 @@ module ParserCommon end # page_sub_menu - def parse_sub_menu(body, page, edit=nil) + def parse_sub_menu(body, page) page_sub_menu = body.css('.page_sub_menu').first if page_sub_menu res = "<div id='#{page_sub_menu['id']}', class='#{page_sub_menu['class']}'>" @@ -159,4 +159,47 @@ module ParserCommon end end + # page_contents + def parse_contents(body, page, edit=nil) + public_r_tags = [] + body.css('.page_content').each do |content| + ret = '' + if (content["main"] == "true" && !page.module_app.nil?) + ret << "<div id='appfrontend' class='dymanic_load' path='/panel/#{page.module_app.key}/front_end/#{page.app_frontend_url}" + ret << "/#{params[:id]}" if params[:id] && !params[:id].eql?(page.id.to_s) + ret << "?inner=true&page_id=#{page.id}&category_id=#{params[:category_id]}&tag_id=#{params[:tag_id]}&preview=#{params[:preview]}&page=#{params[:page]}" + ret << "'></div>" + else + part = page.page_parts.detect{ |p| p.name.to_s == content['name'].to_s } rescue nil + if edit + ret << "<div id='#{content['name']}' part_id='#{part.id}' class='editable' style='border:solid 1px; margin:5px; padding:5px;'>" if part + ret << "<div class='edit_link' style='display:none'>" + ret << " <a href='#{edit_admin_page_part_path(part.id)}' class='nav'>#{t(:edit)}</a>" if part + end + case part.kind + when 'text' + ret << part.i18n_variable[I18n.locale] rescue '' + when 'module_widget' + url = "/panel/#{part.module_app.key}/widget/#{part.widget_path}?inner=true" + options = "&category_id=#{!part[:category].blank? ? part[:category].blank? : params[:category_id]}&tag_id=#{!part[:tag].blank? ? part[:tag] : params[:tag_id]}&page=#{params[:page]}" + ret << "<div class='dymanic_load' path='#{url + options}'></div>" + when 'public_r_tag' + ret << "<r:#{part.public_r_tag} id='#{part.public_r_tag_object_id}'/>" + public_r_tags << part.public_r_tag + else + '' + end if part + ret << '</div>' if edit + end + scope = "<#{content.name}" + content.attributes.each_pair do |key, value| + scope << " #{key}='#{value}'" + end + scope << ">#{ret}</#{content.name}>" + fragment = Nokogiri::HTML::DocumentFragment.new(body, scope) + content.swap(fragment) + end + public_r_tags.uniq + end + end diff --git a/lib/parsers/parser_front_end.rb b/lib/parsers/parser_front_end.rb index 6320f808..3d39bd5f 100644 --- a/lib/parsers/parser_front_end.rb +++ b/lib/parsers/parser_front_end.rb @@ -21,69 +21,18 @@ module ParserFrontEnd require 'nokogiri' - def parse_page_noko(page, id = nil,params) + def parse_page_noko(page) body = Nokogiri::HTML(page.design.layout.body) parse_menu(body, page) - public_r_tags = parse_contents(body, page, id,params[:preview]) + public_r_tags = parse_contents(body, page) parse_images(body, page) parse_footer(body, page) parse_sub_menu(body, page) - public_r_tags.each do |tag| - send("parse_#{tag}s", body, page,id) + send("parse_#{tag}s", body, page) end body.to_html end - - # page_contents - def parse_contents(body, page, id,preview = false) - public_r_tags = [] - body.css('.page_content').each do |content| - ret = '' - if (content["main"] == "true" && !page.module_app.nil?) - ret << "<div id='appfrontend' class='dymanic_load' path='/panel/#{page.module_app.key}/front_end/#{page.app_frontend_url}" - ret << "/#{id}" if id - ret << "?inner=true&page_id=#{page.id}" - # ret << "&category_id=#{page.category}" if page[:category] - ret << "&category_id=#{params[:category_id]}" if !params[:category_id].blank? - ret << "&tag_id=#{params[:tag_id]}" if !params[:tag_id].blank? - ret << "&preview=true" if preview.eql?('true') - ret << "'></div>" - else - part = page.page_parts.detect{ |p| p.name.to_s == content['name'].to_s } rescue nil - case part.kind - when 'text' - ret << part.i18n_variable[I18n.locale] rescue '' - when 'module_widget' - # if part[:category] - # ret << "<div class='dymanic_load' path='/panel/#{part.module_app.key}/widget/#{part.widget_path}?inner=true&category_id=#{part[:category]}'></div>" - # else - # ret << "<div class='dymanic_load' path='/panel/#{part.module_app.key}/widget/#{part.widget_path}?inner=true'></div>" - # end - if !part[:category].blank? - ret << "<div class='dymanic_load' path='/panel/#{part.module_app.key}/widget/#{part.widget_path}?inner=true&category_id=#{part[:category]}'></div>" - elsif !part[:tag].blank? - ret << "<div class='dymanic_load' path='/panel/#{part.module_app.key}/widget/#{part.widget_path}?inner=true&tag_id=#{part[:tag]}'></div>" - else - ret << "<div class='dymanic_load' path='/panel/#{part.module_app.key}/widget/#{part.widget_path}?inner=true'></div>" - end - when 'public_r_tag' - ret << "<r:#{part.public_r_tag} id='#{part.public_r_tag_object_id}'/>" - public_r_tags << part.public_r_tag - else - '' - end if part - end - scope = "<#{content.name}" - content.attributes.each_pair do |key, value| - scope << " #{key}='#{value}'" - end - scope << ">#{ret}</#{content.name}>" - fragment = Nokogiri::HTML::DocumentFragment.new(body, scope) - content.swap(fragment) - end - public_r_tags.uniq - end end From ef2d416c705b94953d137eacf44d556ec2a1fde2 Mon Sep 17 00:00:00 2001 From: Christophe Vilayphiou <chris@rulingcom.com> Date: Sun, 13 May 2012 19:36:04 +0800 Subject: [PATCH 14/26] Ray's changes for page_edit --- app/assets/images/editicon.png | Bin 0 -> 2935 bytes app/assets/stylesheets/sidebar.css.erb | 1 + app/assets/stylesheets/style.css.erb | 28 +++++- app/views/admin/pages/_edit.html.erb | 17 ++-- app/views/admin/pages/_form.html.erb | 128 ++++++++++++++++--------- lib/parsers/parser_back_end.rb | 2 +- 6 files changed, 121 insertions(+), 55 deletions(-) create mode 100644 app/assets/images/editicon.png diff --git a/app/assets/images/editicon.png b/app/assets/images/editicon.png new file mode 100644 index 0000000000000000000000000000000000000000..cef3e600041b8e110bc9050067807b87953ad38d GIT binary patch literal 2935 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 literal 0 HcmV?d00001 diff --git a/app/assets/stylesheets/sidebar.css.erb b/app/assets/stylesheets/sidebar.css.erb index 15922cc0..1e4b4010 100644 --- a/app/assets/stylesheets/sidebar.css.erb +++ b/app/assets/stylesheets/sidebar.css.erb @@ -11,6 +11,7 @@ } .nav-list ol li { padding: 5px 0; + list-style: none; } .nav-list ol li a { font-size: 13px; diff --git a/app/assets/stylesheets/style.css.erb b/app/assets/stylesheets/style.css.erb index c4b2e93c..ba1c3066 100644 --- a/app/assets/stylesheets/style.css.erb +++ b/app/assets/stylesheets/style.css.erb @@ -110,10 +110,8 @@ padding:6px; } #orbit-bar .nav > li.search { - background-image: none; overflow: hidden; width: 28px; - margin-bottom: 0; position: relative; } #orbit-bar .nav > li > a.orbit-bar-home { @@ -686,6 +684,32 @@ z-index: 2 !important; } +#back_main .editable { + position: relative; +} +#back_main .editable:after { + content: ''; + clear: both; + display: block; + visibility: hidden; + height: 0; +} + +#back_main .edit_link a { + position: absolute; + z-index: 10; + width: 100%; + height: 100%; + top: 0; + left: 0; + text-indent: -9999px; + background: url(<%= asset_path 'editicon.png' %>) no-repeat center center rgba(255,255,255,.8); + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 1); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 1); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 1); +} + + [class^="icons-"] { display: inline-block; width: 16px; diff --git a/app/views/admin/pages/_edit.html.erb b/app/views/admin/pages/_edit.html.erb index 61ff8046..b2da28d0 100644 --- a/app/views/admin/pages/_edit.html.erb +++ b/app/views/admin/pages/_edit.html.erb @@ -1,10 +1,11 @@ <%= flash_messages %> - -<h1><%= t('admin.editing_page') %></h1> - -<%= form_for @item, :url => admin_page_path(@item) do |f| %> - <%= render :partial => "form", :locals => { :f => f } %> - <p> - <%= f.submit t('update') %> <%= link_back %> - </p> +<div id="poststuff"> + <h1><%= t('admin.editing_page') %></h1> + <%= form_for @item, :url => admin_page_path(@item), :html => { :class => 'form-horizontal edit_page' } do |f| %> + <%= render :partial => "form", :locals => { :f => f } %> + <div class="form-actions"> + <%= f.submit t('update'), :class => 'btn btn-primary' %> + <%= link_to t('cancel'), get_go_back, :class=>"btn" %> + </div> +</div> <% end %> \ No newline at end of file diff --git a/app/views/admin/pages/_form.html.erb b/app/views/admin/pages/_form.html.erb index 7aae7c00..94632b57 100644 --- a/app/views/admin/pages/_form.html.erb +++ b/app/views/admin/pages/_form.html.erb @@ -1,52 +1,92 @@ <%= f.error_messages %> <%= f.hidden_field :parent, :value => (@item.parent.id rescue nil) %> -<p> -<%= f.label :name, t('admin.name') %> -<%= f.text_field :name, :class => 'text' %> -</p> +<div class="control-group"> + <%= f.label :name, t('admin.name'), :class => 'control-label' %> + <div class="controls"> + <%= f.text_field :name, :class => 'text input-xlarge' %> + <p class="help-block">In addition to freeform text, any HTML5 text-based input appears like so.</p> + </div> +</div> <%= f.fields_for :i18n_variable, (@item.new_record? ? @item.build_i18n_variable : @item.i18n_variable) do |f| %> - <% @site_valid_locales.each do |locale| %> - <p> - <%= f.label :locale, "#{t('admin.title')} #{I18nVariable.from_locale(locale)}" %> - <%= f.text_field locale %> - </p> - <% end %> + <% @site_valid_locales.each do |locale| %> + <div class="control-group"> + <%= f.label :locale, "#{t('admin.title')} #{I18nVariable.from_locale(locale)}", :class => 'control-label' %> + <div class="controls"> + <%= f.text_field locale, :class => 'text input-xlarge' %> + <p class="help-block">In addition to freeform text, any HTML5 text-based input appears like so.</p> + </div> + </div> + <% end %> <% end %> -<p> - <%= t('admin.design_name') %> - <%= f.collection_select :design, @designs, :id, :title, {:selected => @design.id}, {:rel => admin_pages_path} %> -</p> -<p> - <%= t('admin.theme') %> - <%= f.select :theme_id, @design.themes.collect { |t| [t.name.capitalize, t.id] }, :include_blank => true %> -</p> -<p> - <%= t('admin.module_app') %> - <%= render :partial => "app_selector", :locals => { :f => f } %> - <span id="app_page_url"><%= select('page','app_frontend_url', @app_frontend_urls, :selected => @item.app_frontend_url ) rescue ''%> </span> - <span id="app_page_category"><%= select('page','category', @categories.collect{|category| [category.i18n_variable[I18n.locale], category.id]}, :selected => @item[:category], :include_blank => true ) rescue ''%> </span> -</p> -<p> - <%= f.label :is_published, "#{t('admin.is_published')} ?" %> - <%= f.radio_button :is_published, true %>Yes <%= f.radio_button :is_published, false %> No -</p> -<p> - <%= f.label :menu_enabled_for, "#{t('admin.menu_enabled_for')}:" %> - <% @site_valid_locales.each do |valid_locale| %> - <%= check_box_tag 'page[menu_enabled_for][]', valid_locale, (@item.menu_enabled_for.nil? ? true : @item.menu_enabled_for.include?(valid_locale)) %> - <%= I18nVariable.from_locale(valid_locale) %> - <% end %> - <%= hidden_field_tag 'page[menu_enabled_for][]', '' %> -</p> -<p> - <%= f.label :enabled_for, "#{t('admin.enabled_for')}:" %> - <% @site_valid_locales.each do |valid_locale| %> - <%= check_box_tag 'page[enabled_for][]', valid_locale, (@item.enabled_for.nil? ? true : @item.enabled_for.include?(valid_locale)) %> - <%= I18nVariable.from_locale(valid_locale) %> - <% end %> - <%= hidden_field_tag 'page[enabled_for][]', '' %> -</p> +<div class="control-group"> + <%= f.label :name, t('admin.design_name'), :class => 'control-label' %> + <div class="controls"> + <%= f.collection_select :design, @designs, :id, :title, {:selected => @design.id}, {:rel => admin_pages_path} %> + <p class="help-block">In addition to freeform text, any HTML5 text-based input appears like so.</p> + </div> +</div> +<div class="control-group"> + <%= f.label :name, t('admin.theme'), :class => 'control-label' %> + <div class="controls"> + <%= f.select :theme_id, @design.themes.collect { |t| [t.name.capitalize, t.id] }, :include_blank => true %> + <p class="help-block">In addition to freeform text, any HTML5 text-based input appears like so.</p> + </div> +</div> +<div class="control-group"> + <%= f.label :name, t('admin.module_app'), :class => 'control-label' %> + <div class="controls"> + <%= render :partial => "app_selector", :locals => { :f => f } %> + <span id="app_page_url"> + <%= select('page','app_frontend_url', @app_frontend_urls, :selected => @item.app_frontend_url ) rescue ''%> + </span> + <span id="app_page_category"> + <%= select('page','category', @categories.collect{|category| [category.i18n_variable[I18n.locale], category.id]}, :selected => @item[:category], :include_blank => true ) rescue ''%> + </span> + <p class="help-block">In addition to freeform text, any HTML5 text-based input appears like so.</p> + </div> +</div> +<div class="control-group"> + <%= f.label :is_published, "#{t('admin.is_published')} ?", :class => 'control-label' %> + <div class="controls"> + <label class="radio"> + <%= f.radio_button :is_published, true %> + Yes + </label> + <label class="radio"> + <%= f.radio_button :is_published, false %> + No + </label> + <p class="help-block">In addition to freeform text, any HTML5 text-based input appears like so.</p> + </div> +</div> +<div class="control-group"> + <%= f.label :menu_enabled_for, "#{t('admin.menu_enabled_for')}:", :class => 'control-label' %> + <div class="controls"> + <% @site_valid_locales.each do |valid_locale| %> + <label class="checkbox"> + <%= check_box_tag 'page[menu_enabled_for][]', valid_locale, (@item.menu_enabled_for.nil? ? true : @item.menu_enabled_for.include?(valid_locale)) %> + <%= I18nVariable.from_locale(valid_locale) %> + </label> + <% end %> + <%= hidden_field_tag 'page[menu_enabled_for][]', '' %> + <p class="help-block">In addition to freeform text, any HTML5 text-based input appears like so.</p> + </div> +</div> + +<div class="control-group"> + <%= f.label :enabled_for, "#{t('admin.enabled_for')}:", :class => 'control-label' %> + <div class="controls"> + <% @site_valid_locales.each do |valid_locale| %> + <label class="checkbox"> + <%= check_box_tag 'page[enabled_for][]', valid_locale, (@item.enabled_for.nil? ? true : @item.enabled_for.include?(valid_locale)) %> + <%= I18nVariable.from_locale(valid_locale) %> + </label> + <% end %> + <%= hidden_field_tag 'page[enabled_for][]', '' %> + <p class="help-block">In addition to freeform text, any HTML5 text-based input appears like so.</p> + </div> +</div> diff --git a/lib/parsers/parser_back_end.rb b/lib/parsers/parser_back_end.rb index e9c08a01..03141df2 100644 --- a/lib/parsers/parser_back_end.rb +++ b/lib/parsers/parser_back_end.rb @@ -50,7 +50,7 @@ module ParserBackEnd ret << "'></div>" else part = page.page_parts.detect{ |p| p.name.to_s == content['name'].to_s } rescue nil - ret << "<div id='#{content['name']}' part_id='#{part.id}' class='editable' style='border:solid 1px; margin:5px; padding:5px;'>" if part + ret << "<div id='#{content['name']}' part_id='#{part.id}' class='editable'>" if part ret << "<div class='edit_link' style='display:none'>" ret << " <a href='#{edit_admin_page_part_path(part.id)}' class='nav'>#{t(:edit)}</a>" if part ret << '</div>' From 4685952bd687609ccaaa5b9610b52ecd9cca2df2 Mon Sep 17 00:00:00 2001 From: Christophe Vilayphiou <chris.vilayphiou@gmail.com> Date: Sun, 13 May 2012 20:13:26 +0800 Subject: [PATCH 15/26] Changes in page_edit --- app/assets/images/editicon.png | Bin 0 -> 2935 bytes app/assets/stylesheets/sidebar.css.erb | 1 + app/assets/stylesheets/style.css.erb | 28 +++++- app/views/admin/pages/_edit.html.erb | 19 ++-- app/views/admin/pages/_form.html.erb | 128 ++++++++++++++++--------- app/views/admin/pages/_new.html.erb | 22 ++--- lib/parsers/parser_common.rb | 2 +- 7 files changed, 132 insertions(+), 68 deletions(-) create mode 100644 app/assets/images/editicon.png diff --git a/app/assets/images/editicon.png b/app/assets/images/editicon.png new file mode 100644 index 0000000000000000000000000000000000000000..cef3e600041b8e110bc9050067807b87953ad38d GIT binary patch literal 2935 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 literal 0 HcmV?d00001 diff --git a/app/assets/stylesheets/sidebar.css.erb b/app/assets/stylesheets/sidebar.css.erb index 15922cc0..1e4b4010 100644 --- a/app/assets/stylesheets/sidebar.css.erb +++ b/app/assets/stylesheets/sidebar.css.erb @@ -11,6 +11,7 @@ } .nav-list ol li { padding: 5px 0; + list-style: none; } .nav-list ol li a { font-size: 13px; diff --git a/app/assets/stylesheets/style.css.erb b/app/assets/stylesheets/style.css.erb index c4b2e93c..ba1c3066 100644 --- a/app/assets/stylesheets/style.css.erb +++ b/app/assets/stylesheets/style.css.erb @@ -110,10 +110,8 @@ padding:6px; } #orbit-bar .nav > li.search { - background-image: none; overflow: hidden; width: 28px; - margin-bottom: 0; position: relative; } #orbit-bar .nav > li > a.orbit-bar-home { @@ -686,6 +684,32 @@ z-index: 2 !important; } +#back_main .editable { + position: relative; +} +#back_main .editable:after { + content: ''; + clear: both; + display: block; + visibility: hidden; + height: 0; +} + +#back_main .edit_link a { + position: absolute; + z-index: 10; + width: 100%; + height: 100%; + top: 0; + left: 0; + text-indent: -9999px; + background: url(<%= asset_path 'editicon.png' %>) no-repeat center center rgba(255,255,255,.8); + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 1); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 1); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 1); +} + + [class^="icons-"] { display: inline-block; width: 16px; diff --git a/app/views/admin/pages/_edit.html.erb b/app/views/admin/pages/_edit.html.erb index 61ff8046..d81a533d 100644 --- a/app/views/admin/pages/_edit.html.erb +++ b/app/views/admin/pages/_edit.html.erb @@ -1,10 +1,11 @@ <%= flash_messages %> - -<h1><%= t('admin.editing_page') %></h1> - -<%= form_for @item, :url => admin_page_path(@item) do |f| %> - <%= render :partial => "form", :locals => { :f => f } %> - <p> - <%= f.submit t('update') %> <%= link_back %> - </p> -<% end %> \ No newline at end of file +<div id="poststuff"> + <h1><%= t('admin.editing_page') %></h1> + <%= form_for @item, :url => admin_page_path(@item), :html => { :class => 'form-horizontal edit_page' } do |f| %> + <%= render :partial => "form", :locals => { :f => f } %> + <div class="form-actions"> + <%= f.submit t('update'), :class => 'btn btn-primary' %> + <%= link_to t('cancel'), get_go_back, :class=>"btn" %> + </div> + <% end %> +</div> \ No newline at end of file diff --git a/app/views/admin/pages/_form.html.erb b/app/views/admin/pages/_form.html.erb index 7aae7c00..36e6e008 100644 --- a/app/views/admin/pages/_form.html.erb +++ b/app/views/admin/pages/_form.html.erb @@ -1,52 +1,92 @@ <%= f.error_messages %> <%= f.hidden_field :parent, :value => (@item.parent.id rescue nil) %> -<p> -<%= f.label :name, t('admin.name') %> -<%= f.text_field :name, :class => 'text' %> -</p> +<div class="control-group"> + <%= f.label :name, t('admin.name'), :class => 'control-label' %> + <div class="controls"> + <%= f.text_field :name, :class => 'text input-xlarge' %> + <!-- <p class="help-block">In addition to freeform text, any HTML5 text-based input appears like so.</p> --> + </div> +</div> <%= f.fields_for :i18n_variable, (@item.new_record? ? @item.build_i18n_variable : @item.i18n_variable) do |f| %> - <% @site_valid_locales.each do |locale| %> - <p> - <%= f.label :locale, "#{t('admin.title')} #{I18nVariable.from_locale(locale)}" %> - <%= f.text_field locale %> - </p> - <% end %> + <% @site_valid_locales.each do |locale| %> + <div class="control-group"> + <%= f.label :locale, "#{t('admin.title')} #{I18nVariable.from_locale(locale)}", :class => 'control-label' %> + <div class="controls"> + <%= f.text_field locale, :class => 'text input-xlarge' %> + <!-- <p class="help-block">In addition to freeform text, any HTML5 text-based input appears like so.</p> --> + </div> + </div> + <% end %> <% end %> -<p> - <%= t('admin.design_name') %> - <%= f.collection_select :design, @designs, :id, :title, {:selected => @design.id}, {:rel => admin_pages_path} %> -</p> -<p> - <%= t('admin.theme') %> - <%= f.select :theme_id, @design.themes.collect { |t| [t.name.capitalize, t.id] }, :include_blank => true %> -</p> -<p> - <%= t('admin.module_app') %> - <%= render :partial => "app_selector", :locals => { :f => f } %> - <span id="app_page_url"><%= select('page','app_frontend_url', @app_frontend_urls, :selected => @item.app_frontend_url ) rescue ''%> </span> - <span id="app_page_category"><%= select('page','category', @categories.collect{|category| [category.i18n_variable[I18n.locale], category.id]}, :selected => @item[:category], :include_blank => true ) rescue ''%> </span> -</p> -<p> - <%= f.label :is_published, "#{t('admin.is_published')} ?" %> - <%= f.radio_button :is_published, true %>Yes <%= f.radio_button :is_published, false %> No -</p> -<p> - <%= f.label :menu_enabled_for, "#{t('admin.menu_enabled_for')}:" %> - <% @site_valid_locales.each do |valid_locale| %> - <%= check_box_tag 'page[menu_enabled_for][]', valid_locale, (@item.menu_enabled_for.nil? ? true : @item.menu_enabled_for.include?(valid_locale)) %> - <%= I18nVariable.from_locale(valid_locale) %> - <% end %> - <%= hidden_field_tag 'page[menu_enabled_for][]', '' %> -</p> -<p> - <%= f.label :enabled_for, "#{t('admin.enabled_for')}:" %> - <% @site_valid_locales.each do |valid_locale| %> - <%= check_box_tag 'page[enabled_for][]', valid_locale, (@item.enabled_for.nil? ? true : @item.enabled_for.include?(valid_locale)) %> - <%= I18nVariable.from_locale(valid_locale) %> - <% end %> - <%= hidden_field_tag 'page[enabled_for][]', '' %> -</p> +<div class="control-group"> + <%= f.label :name, t('admin.design_name'), :class => 'control-label' %> + <div class="controls"> + <%= f.collection_select :design, @designs, :id, :title, {:selected => @design.id}, {:rel => admin_pages_path} %> + <!-- <p class="help-block">In addition to freeform text, any HTML5 text-based input appears like so.</p> --> + </div> +</div> +<div class="control-group"> + <%= f.label :name, t('admin.theme'), :class => 'control-label' %> + <div class="controls"> + <%= f.select :theme_id, @design.themes.collect { |t| [t.name.capitalize, t.id] }, :include_blank => true %> + <!-- <p class="help-block">In addition to freeform text, any HTML5 text-based input appears like so.</p> --> + </div> +</div> +<div class="control-group"> + <%= f.label :name, t('admin.module_app'), :class => 'control-label' %> + <div class="controls"> + <%= render :partial => "app_selector", :locals => { :f => f } %> + <span id="app_page_url"> + <%= select('page','app_frontend_url', @app_frontend_urls, :selected => @item.app_frontend_url ) rescue ''%> + </span> + <span id="app_page_category"> + <%= select('page','category', @categories.collect{|category| [category.i18n_variable[I18n.locale], category.id]}, :selected => @item[:category], :include_blank => true ) rescue ''%> + </span> + <!-- <p class="help-block">In addition to freeform text, any HTML5 text-based input appears like so.</p> --> + </div> +</div> +<div class="control-group"> + <%= f.label :is_published, "#{t('admin.is_published')} ?", :class => 'control-label' %> + <div class="controls"> + <label class="radio"> + <%= f.radio_button :is_published, true %> + Yes + </label> + <label class="radio"> + <%= f.radio_button :is_published, false %> + No + </label> + <!-- <p class="help-block">In addition to freeform text, any HTML5 text-based input appears like so.</p> --> + </div> +</div> +<div class="control-group"> + <%= f.label :menu_enabled_for, "#{t('admin.menu_enabled_for')}:", :class => 'control-label' %> + <div class="controls"> + <% @site_valid_locales.each do |valid_locale| %> + <label class="checkbox"> + <%= check_box_tag 'page[menu_enabled_for][]', valid_locale, (@item.menu_enabled_for.nil? ? true : @item.menu_enabled_for.include?(valid_locale)) %> + <%= I18nVariable.from_locale(valid_locale) %> + </label> + <% end %> + <%= hidden_field_tag 'page[menu_enabled_for][]', '' %> + <!-- <p class="help-block">In addition to freeform text, any HTML5 text-based input appears like so.</p> --> + </div> +</div> + +<div class="control-group"> + <%= f.label :enabled_for, "#{t('admin.enabled_for')}:", :class => 'control-label' %> + <div class="controls"> + <% @site_valid_locales.each do |valid_locale| %> + <label class="checkbox"> + <%= check_box_tag 'page[enabled_for][]', valid_locale, (@item.enabled_for.nil? ? true : @item.enabled_for.include?(valid_locale)) %> + <%= I18nVariable.from_locale(valid_locale) %> + </label> + <% end %> + <%= hidden_field_tag 'page[enabled_for][]', '' %> + <!-- <p class="help-block">In addition to freeform text, any HTML5 text-based input appears like so.</p> --> + </div> +</div> diff --git a/app/views/admin/pages/_new.html.erb b/app/views/admin/pages/_new.html.erb index a2991bec..d3190e0e 100644 --- a/app/views/admin/pages/_new.html.erb +++ b/app/views/admin/pages/_new.html.erb @@ -1,13 +1,11 @@ -<h1><%= t('admin.new_page') %></h1> - <%= flash_messages %> - -<%= form_for @item, :url => admin_pages_path, :html => { :class => 'form' } do |f| %> - - <%= render :partial => "form", :locals => { :f => f } %> - - <p> - <%= f.submit t('create') %> <%= link_back %> - </p> - -<% end %> \ No newline at end of file +<div id="poststuff"> + <h1><%= t('admin.new_page') %></h1> + <%= form_for @item, :url => admin_page_path, :html => { :class => 'form-horizontal edit_page' } do |f| %> + <%= render :partial => "form", :locals => { :f => f } %> + <div class="form-actions"> + <%= f.submit t('update'), :class => 'btn btn-primary' %> + <%= link_to t('cancel'), get_go_back, :class=>"btn" %> + </div> + <% end %> +</div> \ No newline at end of file diff --git a/lib/parsers/parser_common.rb b/lib/parsers/parser_common.rb index 180914b3..f9dd868a 100644 --- a/lib/parsers/parser_common.rb +++ b/lib/parsers/parser_common.rb @@ -175,6 +175,7 @@ module ParserCommon ret << "<div id='#{content['name']}' part_id='#{part.id}' class='editable' style='border:solid 1px; margin:5px; padding:5px;'>" if part ret << "<div class='edit_link' style='display:none'>" ret << " <a href='#{edit_admin_page_part_path(part.id)}' class='nav'>#{t(:edit)}</a>" if part + ret << '</div>' end case part.kind when 'text' @@ -189,7 +190,6 @@ module ParserCommon else '' end if part - ret << '</div>' if edit end scope = "<#{content.name}" content.attributes.each_pair do |key, value| From 281cfa6518651438809001dfae3e15d51bbca13a Mon Sep 17 00:00:00 2001 From: Christophe Vilayphiou <chris.vilayphiou@gmail.com> Date: Sun, 13 May 2012 21:55:39 +0800 Subject: [PATCH 16/26] Changes for widgets --- .../assets/javascripts/module.js.erb | 1 - .../orbit_frontend_component_controller.rb | 2 +- app/views/admin/page_parts/_text.html.erb | 4 ++- app/views/layouts/module_widget.html.erb | 4 ++- .../app/assets/javascripts/module_widget.js | 9 ----- .../widget/bulletins_controller.rb | 1 - .../widget/bulletins/_index.html.erb | 29 +++++++++++++++ .../bulletins_and_web_links.html.erb | 6 +++- .../widget/bulletins/index.html.erb | 32 ++--------------- .../widget/bulletins/index.js.erb | 1 + .../news/widget/news_bulletins_controller.rb | 7 ++-- .../widget/news_bulletins/_index.html.erb | 33 +++++++++++++++++ .../news/widget/news_bulletins/index.html.erb | 36 ++----------------- .../news/widget/news_bulletins/index.js.erb | 1 + .../news_bulletins_and_web_links.html.erb | 6 +++- vendor/built_in_modules/news/news.json | 2 +- .../assets/javascripts/web_resource/.gitkeep | 0 .../front_end/web_links_controller.rb | 2 +- .../front_end/web_links/index.html.erb | 2 +- .../front_end/web_links/index.js.erb | 1 + .../web_resource/config/routes.rb | 1 - .../web_resource/web_resource.json | 2 +- 22 files changed, 95 insertions(+), 87 deletions(-) rename vendor/built_in_modules/news/app/assets/javascripts/module_widget.js => app/assets/javascripts/module.js.erb (95%) delete mode 100644 vendor/built_in_modules/announcement/app/assets/javascripts/module_widget.js create mode 100644 vendor/built_in_modules/announcement/app/views/panel/announcement/widget/bulletins/_index.html.erb create mode 100644 vendor/built_in_modules/announcement/app/views/panel/announcement/widget/bulletins/index.js.erb create mode 100644 vendor/built_in_modules/news/app/views/panel/news/widget/news_bulletins/_index.html.erb create mode 100644 vendor/built_in_modules/news/app/views/panel/news/widget/news_bulletins/index.js.erb delete mode 100644 vendor/built_in_modules/web_resource/app/assets/javascripts/web_resource/.gitkeep create mode 100644 vendor/built_in_modules/web_resource/app/views/panel/web_resource/front_end/web_links/index.js.erb diff --git a/vendor/built_in_modules/news/app/assets/javascripts/module_widget.js b/app/assets/javascripts/module.js.erb similarity index 95% rename from vendor/built_in_modules/news/app/assets/javascripts/module_widget.js rename to app/assets/javascripts/module.js.erb index aea46d72..fc19b8e6 100644 --- a/vendor/built_in_modules/news/app/assets/javascripts/module_widget.js +++ b/app/assets/javascripts/module.js.erb @@ -6,4 +6,3 @@ // //= require jquery //= require jquery_ujs -//= require news_link \ No newline at end of file diff --git a/app/controllers/orbit_frontend_component_controller.rb b/app/controllers/orbit_frontend_component_controller.rb index 185dbce6..09621e5f 100644 --- a/app/controllers/orbit_frontend_component_controller.rb +++ b/app/controllers/orbit_frontend_component_controller.rb @@ -1,7 +1,7 @@ class OrbitFrontendComponentController< ApplicationController before_filter :setup_vars before_filter {|c| c.front_end_available(@app_title)} - layout :false + layout "module_widget" def setup_vars @app_title = request.fullpath.split('/')[2] diff --git a/app/views/admin/page_parts/_text.html.erb b/app/views/admin/page_parts/_text.html.erb index 4193cf50..529773e3 100644 --- a/app/views/admin/page_parts/_text.html.erb +++ b/app/views/admin/page_parts/_text.html.erb @@ -8,5 +8,7 @@ <% end %> <script> - load_tinymce(); + $(document).ready(function() { + load_tinymce(); + }); </script> diff --git a/app/views/layouts/module_widget.html.erb b/app/views/layouts/module_widget.html.erb index 44a2be85..793f7370 100644 --- a/app/views/layouts/module_widget.html.erb +++ b/app/views/layouts/module_widget.html.erb @@ -5,7 +5,9 @@ <%= javascript_include_tag "html5" %> <![endif]--> <%#= stylesheet_link_tag "module_widget" %> - <%= javascript_include_tag "module_widget" %> + <%= javascript_include_tag "module" %> + <%#= javascript_include_tag "#{@app_title}/module_widget" %> + <%= yield :page_specific_javascript %> <%= csrf_meta_tag %> </head> <body> diff --git a/vendor/built_in_modules/announcement/app/assets/javascripts/module_widget.js b/vendor/built_in_modules/announcement/app/assets/javascripts/module_widget.js deleted file mode 100644 index 9c429aac..00000000 --- a/vendor/built_in_modules/announcement/app/assets/javascripts/module_widget.js +++ /dev/null @@ -1,9 +0,0 @@ -// This is a manifest file that'll be compiled into including all the files listed below. -// Add new JavaScript/Coffee code in separate files in this directory and they'll automatically -// be included in the compiled file accessible from http://example.com/assets/application.js -// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the -// the compiled file. -// -//= require jquery -//= require jquery_ujs -//= require announcement_link \ No newline at end of file diff --git a/vendor/built_in_modules/announcement/app/controllers/panel/announcement/widget/bulletins_controller.rb b/vendor/built_in_modules/announcement/app/controllers/panel/announcement/widget/bulletins_controller.rb index 57295cc7..ad3eec72 100644 --- a/vendor/built_in_modules/announcement/app/controllers/panel/announcement/widget/bulletins_controller.rb +++ b/vendor/built_in_modules/announcement/app/controllers/panel/announcement/widget/bulletins_controller.rb @@ -31,7 +31,6 @@ class Panel::Announcement::Widget::BulletinsController < OrbitWidgetController @selected_tag = AnnouncementTag.find(params[:id]) rescue @tags[0] @bulletins = @selected_tag.get_visible_bulletins.can_display.page(params[:page]).per(5) rescue nil @web_links = WebResourceTag.first(:conditions => {:en => @selected_tag[:en]}).get_visible_links.page(params[:page]).per(5) rescue nil - render :layout => 'module_widget' end def reload_bulletins diff --git a/vendor/built_in_modules/announcement/app/views/panel/announcement/widget/bulletins/_index.html.erb b/vendor/built_in_modules/announcement/app/views/panel/announcement/widget/bulletins/_index.html.erb new file mode 100644 index 00000000..4213ed29 --- /dev/null +++ b/vendor/built_in_modules/announcement/app/views/panel/announcement/widget/bulletins/_index.html.erb @@ -0,0 +1,29 @@ +<% if @current_category %> + <h1 class="h1"><%= @current_category.i18n_variable[I18n.locale] + t('announcement.bulletin.list_lower') %></h1> +<% elsif @tag %> + <h1 class="h1"><%= @tag[I18n.locale] + t('announcement.bulletin.list_lower') %></h1> +<% else %> + <h1 class="h1"><%= t('announcement.list_announcement') %></h1> +<% end %> + + +<table class="table table-bordered"> + <tr> + <th><%= t('announcement.bulletin.category') %></th> + <th><%= t('announcement.bulletin.title') %></th> + <th><%= t('announcement.bulletin.postdate') %></th> + </tr> + +<% @bulletins.each do |post| %> + <tr> + <td><%= post.bulletin_category.i18n_variable[I18n.locale] %></td> + <td><%= link_to post.title[I18n.locale], panel_announcement_front_end_bulletin_path(post, :category_id => post.bulletin_category_id) %> + </td> + <td><%= post.postdate %></td> + </tr> + +<% end %> + +</table> + +<%= paginate @bulletins, :params => {:inner => 'true'}, :remote => true %> \ No newline at end of file diff --git a/vendor/built_in_modules/announcement/app/views/panel/announcement/widget/bulletins/bulletins_and_web_links.html.erb b/vendor/built_in_modules/announcement/app/views/panel/announcement/widget/bulletins/bulletins_and_web_links.html.erb index 3e628120..50ae0674 100644 --- a/vendor/built_in_modules/announcement/app/views/panel/announcement/widget/bulletins/bulletins_and_web_links.html.erb +++ b/vendor/built_in_modules/announcement/app/views/panel/announcement/widget/bulletins/bulletins_and_web_links.html.erb @@ -16,4 +16,8 @@ <ul id='bulletins_web_links_web_links' class="links_list"> <%= render 'web_links' if @web_links %> </ul> -</div> \ No newline at end of file +</div> + +<% content_for :page_specific_javascript do %> + <%= javascript_include_tag "news_link" %> +<% end %> \ No newline at end of file diff --git a/vendor/built_in_modules/announcement/app/views/panel/announcement/widget/bulletins/index.html.erb b/vendor/built_in_modules/announcement/app/views/panel/announcement/widget/bulletins/index.html.erb index c885488f..dacb9eaf 100644 --- a/vendor/built_in_modules/announcement/app/views/panel/announcement/widget/bulletins/index.html.erb +++ b/vendor/built_in_modules/announcement/app/views/panel/announcement/widget/bulletins/index.html.erb @@ -1,29 +1,3 @@ -<% if @current_category %> - <h1 class="h1"><%= @current_category.i18n_variable[I18n.locale] + t('announcement.bulletin.list_lower') %></h1> -<% elsif @tag %> - <h1 class="h1"><%= @tag[I18n.locale] + t('announcement.bulletin.list_lower') %></h1> -<% else %> - <h1 class="h1"><%= t('announcement.list_announcement') %></h1> -<% end %> - - -<table class="table table-bordered"> - <tr> - <th><%= t('announcement.bulletin.category') %></th> - <th><%= t('announcement.bulletin.title') %></th> - <th><%= t('announcement.bulletin.postdate') %></th> - </tr> - -<% @bulletins.each do |post| %> - <tr> - <td><%= post.bulletin_category.i18n_variable[I18n.locale] %></td> - <td><%= link_to post.title[I18n.locale], panel_announcement_front_end_bulletin_path(post, :category_id => post.bulletin_category_id) %> - </td> - <td><%= post.postdate %></td> - </tr> - -<% end %> - -</table> - -<%= paginate @bulletins, :params => {:inner => 'false'} %> \ No newline at end of file +<div id="bulletin_widget"> + <%= render 'index' %> +</div> \ No newline at end of file diff --git a/vendor/built_in_modules/announcement/app/views/panel/announcement/widget/bulletins/index.js.erb b/vendor/built_in_modules/announcement/app/views/panel/announcement/widget/bulletins/index.js.erb new file mode 100644 index 00000000..e1be79eb --- /dev/null +++ b/vendor/built_in_modules/announcement/app/views/panel/announcement/widget/bulletins/index.js.erb @@ -0,0 +1 @@ +$('#bulletin_widget').html("<%= j render 'index' %>") \ No newline at end of file diff --git a/vendor/built_in_modules/news/app/controllers/panel/news/widget/news_bulletins_controller.rb b/vendor/built_in_modules/news/app/controllers/panel/news/widget/news_bulletins_controller.rb index a6d20ca7..27e83c00 100644 --- a/vendor/built_in_modules/news/app/controllers/panel/news/widget/news_bulletins_controller.rb +++ b/vendor/built_in_modules/news/app/controllers/panel/news/widget/news_bulletins_controller.rb @@ -11,14 +11,14 @@ class Panel::News::Widget::NewsBulletinsController < OrbitWidgetController def index date_now = Time.now if !params[:category_id].blank? - @news_bulletins = NewsBulletin.can_display.where(:news_bulletin_category_id => params[:category_id]).any_of( {deadline: nil,:postdate.lte => date_now} , {:deadline.gte => date_now,:postdate.lte => date_now} ).desc( :is_top, :postdate).page( params[:page]).per(10) + @news_bulletins = NewsBulletin.can_display.where(:news_bulletin_category_id => params[:category_id]).any_of( {deadline: nil,:postdate.lte => date_now} , {:deadline.gte => date_now,:postdate.lte => date_now} ).desc( :is_top, :postdate).page( params[:page]).per(5) @current_category = NewsBulletinCategory.from_id(params[:category_id]) rescue nil elsif !params[:tag_id].blank? @tag = NewsTag.find(params[:tag_id]) rescue nil @tag = NewsTag.where(key: params[:tag_id])[0] unless @tag - @news_bulletins = @tag.news_bulletins.can_display.any_of( {deadline: nil,:postdate.lte => date_now} , {:deadline.gte => date_now,:postdate.lte => date_now} ).desc( :is_top, :postdate).page( params[:page]).per(10) rescue nil + @news_bulletins = @tag.news_bulletins.can_display.any_of( {deadline: nil,:postdate.lte => date_now} , {:deadline.gte => date_now,:postdate.lte => date_now} ).desc( :is_top, :postdate).page( params[:page]).per(5) rescue nil else - @news_bulletins = NewsBulletin.can_display.any_of( {deadline: nil,:postdate.lte => date_now} , {:deadline.gte => date_now,:postdate.lte => date_now} ).desc( :is_top, :postdate).page( params[:page]).per(10) + @news_bulletins = NewsBulletin.can_display.any_of( {deadline: nil,:postdate.lte => date_now} , {:deadline.gte => date_now,:postdate.lte => date_now} ).desc( :is_top, :postdate).page( params[:page]).per(5) end end @@ -28,7 +28,6 @@ class Panel::News::Widget::NewsBulletinsController < OrbitWidgetController @selected_tag = NewsTag.find(params[:id]) rescue @tags[0] @news_bulletins = @selected_tag.get_visible_news_bulletins.can_display.page(params[:page]).per(5) rescue nil @web_links = WebResourceTag.first(:conditions => {:en => @selected_tag[:en]}).get_visible_links.page(params[:page]).per(5) rescue nil - render :layout => 'module_widget' end def reload_news_bulletins diff --git a/vendor/built_in_modules/news/app/views/panel/news/widget/news_bulletins/_index.html.erb b/vendor/built_in_modules/news/app/views/panel/news/widget/news_bulletins/_index.html.erb new file mode 100644 index 00000000..fd3d477a --- /dev/null +++ b/vendor/built_in_modules/news/app/views/panel/news/widget/news_bulletins/_index.html.erb @@ -0,0 +1,33 @@ +<% # encoding: utf-8 %> + +<%= flash_messages %> + +<% if @current_category %> + <h1 class="h1"><%= @current_category.i18n_variable[I18n.locale] + t('news.news_bulletin.list_lower') %></h1> +<% elsif @tag %> + <h1 class="h1"><%= @tag[I18n.locale] + t('news.news_bulletin.list_lower') %></h1> +<% else %> + <h1 class="h1"><%= t('news.list_news') %></h1> +<% end %> + +<table class="table table-bordered"> + <tbody> + <tr> + <th class="span2"><%= t('news.news_bulletin.image') %></th> + <th><%= t('news.news_bulletin.title') %></th> + <th class="span2 pagination-right"><%= t('news.news_bulletin.postdate') %></th> + </tr> + <% @news_bulletins.each do |post| %> + <tr> + <td><%= image_tag post.image %></td> + <td> + <%= link_to post.title[I18n.locale], panel_news_front_end_news_bulletin_path(post), :class => 'news_title' %> + <%= post.subtitle[I18n.locale].html_safe %> + </td> + <td><%= post.postdate %></td> + </tr> + <% end %> + </tbody> +</table> + +<%= paginate @news_bulletins, :params => {:inner => 'true'}, :remote => true %> diff --git a/vendor/built_in_modules/news/app/views/panel/news/widget/news_bulletins/index.html.erb b/vendor/built_in_modules/news/app/views/panel/news/widget/news_bulletins/index.html.erb index bb2ff639..1b59c3f9 100644 --- a/vendor/built_in_modules/news/app/views/panel/news/widget/news_bulletins/index.html.erb +++ b/vendor/built_in_modules/news/app/views/panel/news/widget/news_bulletins/index.html.erb @@ -1,33 +1,3 @@ -<% # encoding: utf-8 %> - -<%= flash_messages %> - -<% if @current_category %> - <h1 class="h1"><%= @current_category.i18n_variable[I18n.locale] + t('news.news_bulletin.list_lower') %></h1> -<% elsif @tag %> - <h1 class="h1"><%= @tag[I18n.locale] + t('news.news_bulletin.list_lower') %></h1> -<% else %> - <h1 class="h1"><%= t('news.list_news') %></h1> -<% end %> - -<table class="table table-bordered"> - <tbody> - <tr> - <th class="span2"><%= t('news.news_bulletin.image') %></th> - <th><%= t('news.news_bulletin.title') %></th> - <th class="span2 pagination-right"><%= t('news.news_bulletin.postdate') %></th> - </tr> - <% @news_bulletins.each do |post| %> - <tr> - <td><%= image_tag post.image %></td> - <td> - <%= link_to post.title[I18n.locale], panel_news_front_end_news_bulletin_path(post), :class => 'news_title' %> - <%= post.subtitle[I18n.locale].html_safe %> - </td> - <td><%= post.postdate %></td> - </tr> - <% end %> - </tbody> -</table> - -<%= paginate @news_bulletins, :params => {:inner => 'false'} %> +<div id='news_bulletin_widget'> + <%= render 'index' %> +</div> \ No newline at end of file diff --git a/vendor/built_in_modules/news/app/views/panel/news/widget/news_bulletins/index.js.erb b/vendor/built_in_modules/news/app/views/panel/news/widget/news_bulletins/index.js.erb new file mode 100644 index 00000000..d4862b87 --- /dev/null +++ b/vendor/built_in_modules/news/app/views/panel/news/widget/news_bulletins/index.js.erb @@ -0,0 +1 @@ +$('#news_bulletin_widget').html("<%= j render 'index' %>") \ No newline at end of file diff --git a/vendor/built_in_modules/news/app/views/panel/news/widget/news_bulletins/news_bulletins_and_web_links.html.erb b/vendor/built_in_modules/news/app/views/panel/news/widget/news_bulletins/news_bulletins_and_web_links.html.erb index 9e8ae742..b71f26f9 100644 --- a/vendor/built_in_modules/news/app/views/panel/news/widget/news_bulletins/news_bulletins_and_web_links.html.erb +++ b/vendor/built_in_modules/news/app/views/panel/news/widget/news_bulletins/news_bulletins_and_web_links.html.erb @@ -16,4 +16,8 @@ <ul id='news_bulletins_web_links_web_links' class="links_list"> <%= render 'web_links' if @web_links %> </ul> -</div> \ No newline at end of file +</div> + +<% content_for :page_specific_javascript do %> + <%= javascript_include_tag "announcement_link" %> +<% end %> \ No newline at end of file diff --git a/vendor/built_in_modules/news/news.json b/vendor/built_in_modules/news/news.json index 74b2bfcc..e1b5c95e 100644 --- a/vendor/built_in_modules/news/news.json +++ b/vendor/built_in_modules/news/news.json @@ -7,6 +7,6 @@ "update_info": "Some info", "create_date": "11-11-2011", "app_pages": ["news_bulletins"], - "widgets": ["news_bulletins", "news_bulletins_and_web_links", "home_banner"], + "widgets": ["news_bulletins", "home_banner"], "enable_frontend": true } diff --git a/vendor/built_in_modules/web_resource/app/assets/javascripts/web_resource/.gitkeep b/vendor/built_in_modules/web_resource/app/assets/javascripts/web_resource/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/vendor/built_in_modules/web_resource/app/controllers/panel/web_resource/front_end/web_links_controller.rb b/vendor/built_in_modules/web_resource/app/controllers/panel/web_resource/front_end/web_links_controller.rb index 82804979..e605c768 100644 --- a/vendor/built_in_modules/web_resource/app/controllers/panel/web_resource/front_end/web_links_controller.rb +++ b/vendor/built_in_modules/web_resource/app/controllers/panel/web_resource/front_end/web_links_controller.rb @@ -12,7 +12,7 @@ class Panel::WebResource::FrontEnd::WebLinksController < OrbitWidgetController date_now = Time.now - @web_links = WebLink.where( :is_hidden => false ).desc(:is_top, :name).page( params[:page]).per(20) + @web_links = WebLink.where( :is_hidden => false ).desc(:is_top, :name).page(params[:page]).per(10) get_categorys end diff --git a/vendor/built_in_modules/web_resource/app/views/panel/web_resource/front_end/web_links/index.html.erb b/vendor/built_in_modules/web_resource/app/views/panel/web_resource/front_end/web_links/index.html.erb index 2c30da53..2c32f800 100644 --- a/vendor/built_in_modules/web_resource/app/views/panel/web_resource/front_end/web_links/index.html.erb +++ b/vendor/built_in_modules/web_resource/app/views/panel/web_resource/front_end/web_links/index.html.erb @@ -2,7 +2,7 @@ <%= flash_messages %> -<%= paginate @web_links %> +<%= paginate @web_links, :params => {:inner => false}%> <h1><%= t('web_link.list_web_resource') %></h1> diff --git a/vendor/built_in_modules/web_resource/app/views/panel/web_resource/front_end/web_links/index.js.erb b/vendor/built_in_modules/web_resource/app/views/panel/web_resource/front_end/web_links/index.js.erb new file mode 100644 index 00000000..c5efda63 --- /dev/null +++ b/vendor/built_in_modules/web_resource/app/views/panel/web_resource/front_end/web_links/index.js.erb @@ -0,0 +1 @@ +alert('bob'); \ No newline at end of file diff --git a/vendor/built_in_modules/web_resource/config/routes.rb b/vendor/built_in_modules/web_resource/config/routes.rb index fed85983..02c81a82 100644 --- a/vendor/built_in_modules/web_resource/config/routes.rb +++ b/vendor/built_in_modules/web_resource/config/routes.rb @@ -13,7 +13,6 @@ Rails.application.routes.draw do resources :tags end namespace :front_end do - root :to => "web_links#index" resources :web_links end namespace :widget do diff --git a/vendor/built_in_modules/web_resource/web_resource.json b/vendor/built_in_modules/web_resource/web_resource.json index c27bf731..f87f06a2 100644 --- a/vendor/built_in_modules/web_resource/web_resource.json +++ b/vendor/built_in_modules/web_resource/web_resource.json @@ -7,6 +7,6 @@ "update_info": "Some info", "create_date": "11-11-2011", "app_pages": ["web_links"], - "widgets": ["web_links", "home_list"], + "widgets": ["home_list"], "enable_frontend": true } From 4ae829994936941ac80cca3edc02f19c77de7ae5 Mon Sep 17 00:00:00 2001 From: Christophe Vilayphiou <chris.vilayphiou@gmail.com> Date: Sun, 13 May 2012 22:35:00 +0800 Subject: [PATCH 17/26] Add custom title to widgets Fix pagination conflict with main_content and widgets --- app/controllers/pages_controller.rb | 2 +- app/models/page_part.rb | 20 ++++++++++++++++++- .../admin/page_parts/_module_widget.html.erb | 11 ++++++++++ lib/parsers/parser_common.rb | 5 +++-- .../front_end/bulletins_controller.rb | 6 +++--- .../widget/bulletins_controller.rb | 2 +- .../front_end/bulletins/index.html.erb | 2 +- .../widget/bulletins/_index.html.erb | 8 ++------ .../front_end/news_bulletins_controller.rb | 6 +++--- .../news/widget/news_bulletins_controller.rb | 1 + .../front_end/news_bulletins/index.html.erb | 2 +- .../widget/news_bulletins/_index.html.erb | 10 ++-------- .../widget/web_links_controller.rb | 1 + .../widget/web_links/home_list.html.erb | 4 +++- 14 files changed, 52 insertions(+), 28 deletions(-) diff --git a/app/controllers/pages_controller.rb b/app/controllers/pages_controller.rb index c4a571dd..45299450 100644 --- a/app/controllers/pages_controller.rb +++ b/app/controllers/pages_controller.rb @@ -34,7 +34,7 @@ class PagesController < ApplicationController def index_from_link url = "/#{@item.path}" options = '' - options << "?page=#{params[:page]}" unless params[:page].blank? + options << "?page_main=#{params[:page_main]}" unless params[:page_main].blank? options << "#{options.blank? ? '?' : '&'}category_id=#{params[:category_id]}" unless params[:category_id].blank? options << "#{options.blank? ? '?' : '&'}tag_id=#{params[:tag_id]}" unless params[:tag_id].blank? redirect_to url + options diff --git a/app/models/page_part.rb b/app/models/page_part.rb index 8bb1bc72..52eafdf3 100644 --- a/app/models/page_part.rb +++ b/app/models/page_part.rb @@ -11,9 +11,27 @@ class PagePart field :public_r_tag_option, :default => nil field :widget_path - has_one :i18n_variable, :as => :language_value, :autosave => true, :dependent => :destroy + has_one :i18n_variable, :class_name => "I18nVariable", :as => :language_value, :autosave => true, :dependent => :destroy + has_one :title, :class_name => "I18nVariable", :as => :language_value, :autosave => true, :dependent => :destroy belongs_to :page belongs_to :module_app + before_save :set_key + + def i18n_variable + @i18n_variable ||= I18nVariable.first(:conditions => {:key => 'i18n_variable', :language_value_id => self.id, :language_value_type => self.class}) rescue nil + end + + def title + @title ||= I18nVariable.first(:conditions => {:key => 'title', :language_value_id => self.id, :language_value_type => self.class}) rescue nil + end + + protected + + def set_key + title.key = 'title' if title && (title.key.blank? rescue true) + i18n_variable.key = 'i18n_variable' if i18n_variable && (i18n_variable.key.blank? rescue true) + end + end \ No newline at end of file diff --git a/app/views/admin/page_parts/_module_widget.html.erb b/app/views/admin/page_parts/_module_widget.html.erb index 3f81a5ae..1a1dd63c 100644 --- a/app/views/admin/page_parts/_module_widget.html.erb +++ b/app/views/admin/page_parts/_module_widget.html.erb @@ -1,3 +1,14 @@ +<div> + <%= f.fields_for :title, @part.title do |f| %> + <% @site_valid_locales.each do |locale| %> + <p> + <%= f.label :locale, "#{t('admin.title')} #{I18nVariable.from_locale(locale)}" %> + <%= f.text_field locale %> + </p> + <% end %> +<% end %> +</div> + <span id='module_app_list'> <%= f.select :module_app, options_from_collection_for_select(@module_apps, :id, :title, :selected => @module_app.id), {}, {:rel => admin_page_parts_path} %> </span> diff --git a/lib/parsers/parser_common.rb b/lib/parsers/parser_common.rb index f9dd868a..b9c56642 100644 --- a/lib/parsers/parser_common.rb +++ b/lib/parsers/parser_common.rb @@ -167,10 +167,11 @@ module ParserCommon if (content["main"] == "true" && !page.module_app.nil?) ret << "<div id='appfrontend' class='dymanic_load' path='/panel/#{page.module_app.key}/front_end/#{page.app_frontend_url}" ret << "/#{params[:id]}" if params[:id] && !params[:id].eql?(page.id.to_s) - ret << "?inner=true&page_id=#{page.id}&category_id=#{params[:category_id]}&tag_id=#{params[:tag_id]}&preview=#{params[:preview]}&page=#{params[:page]}" + ret << "?inner=true&page_id=#{page.id}&category_id=#{params[:category_id]}&tag_id=#{params[:tag_id]}&preview=#{params[:preview]}&page_main=#{params[:page_main]}" ret << "'></div>" else part = page.page_parts.detect{ |p| p.name.to_s == content['name'].to_s } rescue nil + part_title = part.title[I18n.locale] rescue nil if edit ret << "<div id='#{content['name']}' part_id='#{part.id}' class='editable' style='border:solid 1px; margin:5px; padding:5px;'>" if part ret << "<div class='edit_link' style='display:none'>" @@ -182,7 +183,7 @@ module ParserCommon ret << part.i18n_variable[I18n.locale] rescue '' when 'module_widget' url = "/panel/#{part.module_app.key}/widget/#{part.widget_path}?inner=true" - options = "&category_id=#{!part[:category].blank? ? part[:category].blank? : params[:category_id]}&tag_id=#{!part[:tag].blank? ? part[:tag] : params[:tag_id]}&page=#{params[:page]}" + options = "&category_id=#{!part[:category].blank? ? part[:category].blank? : params[:category_id]}&tag_id=#{!part[:tag].blank? ? part[:tag] : params[:tag_id]}&page=#{params[:page]}&part_title=part_title" ret << "<div class='dymanic_load' path='#{url + options}'></div>" when 'public_r_tag' ret << "<r:#{part.public_r_tag} id='#{part.public_r_tag_object_id}'/>" diff --git a/vendor/built_in_modules/announcement/app/controllers/panel/announcement/front_end/bulletins_controller.rb b/vendor/built_in_modules/announcement/app/controllers/panel/announcement/front_end/bulletins_controller.rb index 725ffac9..56cbb312 100644 --- a/vendor/built_in_modules/announcement/app/controllers/panel/announcement/front_end/bulletins_controller.rb +++ b/vendor/built_in_modules/announcement/app/controllers/panel/announcement/front_end/bulletins_controller.rb @@ -12,14 +12,14 @@ class Panel::Announcement::FrontEnd::BulletinsController < OrbitWidgetController date_now = Time.now if !params[:category_id].blank? - @bulletins = Bulletin.can_display.where(:bulletin_category_id => params[:category_id]).any_of( {deadline: nil,:postdate.lte => date_now} , {:deadline.gte => date_now,:postdate.lte => date_now} ).desc( :is_top, :postdate).page( params[:page]).per(10) + @bulletins = Bulletin.can_display.where(:bulletin_category_id => params[:category_id]).any_of( {deadline: nil,:postdate.lte => date_now} , {:deadline.gte => date_now,:postdate.lte => date_now} ).desc( :is_top, :postdate).page( params[:page_main]).per(10) @current_category = BulletinCategory.from_id(params[:category_id]) rescue nil elsif !params[:tag_id].blank? @tag = AnnouncementTag.find(params[:tag_id]) rescue nil @tag = AnnouncementTag.where(key: params[:tag_id])[0] unless @tag - @bulletins = @tag.bulletins.can_display.any_of( {deadline: nil,:postdate.lte => date_now} , {:deadline.gte => date_now,:postdate.lte => date_now} ).desc( :is_top, :postdate).page( params[:page]).per(10) + @bulletins = @tag.bulletins.can_display.any_of( {deadline: nil,:postdate.lte => date_now} , {:deadline.gte => date_now,:postdate.lte => date_now} ).desc( :is_top, :postdate).page( params[:page_main]).per(10) else - @bulletins = Bulletin.can_display.any_of( {deadline: nil,:postdate.lte => date_now} , {:deadline.gte => date_now,:postdate.lte => date_now} ).desc( :is_top, :postdate).page( params[:page]).per(10) + @bulletins = Bulletin.can_display.any_of( {deadline: nil,:postdate.lte => date_now} , {:deadline.gte => date_now,:postdate.lte => date_now} ).desc( :is_top, :postdate).page( params[:page_main]).per(10) end end diff --git a/vendor/built_in_modules/announcement/app/controllers/panel/announcement/widget/bulletins_controller.rb b/vendor/built_in_modules/announcement/app/controllers/panel/announcement/widget/bulletins_controller.rb index ad3eec72..2a7c6b1f 100644 --- a/vendor/built_in_modules/announcement/app/controllers/panel/announcement/widget/bulletins_controller.rb +++ b/vendor/built_in_modules/announcement/app/controllers/panel/announcement/widget/bulletins_controller.rb @@ -9,7 +9,7 @@ class Panel::Announcement::Widget::BulletinsController < OrbitWidgetController # GET /bulletins.xml def index - + @title = params[:page_title] date_now = Time.now if !params[:category_id].blank? @bulletins = Bulletin.can_display.where(:bulletin_category_id => params[:category_id]).any_of( {deadline: nil,:postdate.lte => date_now} , {:deadline.gte => date_now,:postdate.lte => date_now} ).desc( :is_top, :postdate).page( params[:page]).per(10) diff --git a/vendor/built_in_modules/announcement/app/views/panel/announcement/front_end/bulletins/index.html.erb b/vendor/built_in_modules/announcement/app/views/panel/announcement/front_end/bulletins/index.html.erb index 086794b9..f09d8b70 100644 --- a/vendor/built_in_modules/announcement/app/views/panel/announcement/front_end/bulletins/index.html.erb +++ b/vendor/built_in_modules/announcement/app/views/panel/announcement/front_end/bulletins/index.html.erb @@ -29,5 +29,5 @@ </table> -<%= paginate @bulletins, :params => {:inner => 'false'} %> +<%= paginate @bulletins, :param_name => :page_main, :params => {:inner => 'false'} %> diff --git a/vendor/built_in_modules/announcement/app/views/panel/announcement/widget/bulletins/_index.html.erb b/vendor/built_in_modules/announcement/app/views/panel/announcement/widget/bulletins/_index.html.erb index 4213ed29..c0fe606f 100644 --- a/vendor/built_in_modules/announcement/app/views/panel/announcement/widget/bulletins/_index.html.erb +++ b/vendor/built_in_modules/announcement/app/views/panel/announcement/widget/bulletins/_index.html.erb @@ -1,9 +1,5 @@ -<% if @current_category %> - <h1 class="h1"><%= @current_category.i18n_variable[I18n.locale] + t('announcement.bulletin.list_lower') %></h1> -<% elsif @tag %> - <h1 class="h1"><%= @tag[I18n.locale] + t('announcement.bulletin.list_lower') %></h1> -<% else %> - <h1 class="h1"><%= t('announcement.list_announcement') %></h1> +<% if @title %> + <h1 class="h1"><%= @title %></h1> <% end %> diff --git a/vendor/built_in_modules/news/app/controllers/panel/news/front_end/news_bulletins_controller.rb b/vendor/built_in_modules/news/app/controllers/panel/news/front_end/news_bulletins_controller.rb index 263d1cf2..57ff9e0a 100644 --- a/vendor/built_in_modules/news/app/controllers/panel/news/front_end/news_bulletins_controller.rb +++ b/vendor/built_in_modules/news/app/controllers/panel/news/front_end/news_bulletins_controller.rb @@ -11,13 +11,13 @@ class Panel::News::FrontEnd::NewsBulletinsController < OrbitWidgetController def index date_now = Time.now if !params[:category_id].blank? - @news_bulletins = NewsBulletin.can_display.where(:news_bulletin_category_id => params[:category_id]).any_of( {deadline: nil,:postdate.lte => date_now} , {:deadline.gte => date_now,:postdate.lte => date_now} ).desc( :is_top, :postdate).page( params[:page]).per(10) + @news_bulletins = NewsBulletin.can_display.where(:news_bulletin_category_id => params[:category_id]).any_of( {deadline: nil,:postdate.lte => date_now} , {:deadline.gte => date_now,:postdate.lte => date_now} ).desc( :is_top, :postdate).page( params[:page_main]).per(10) elsif !params[:tag_id].blank? tmp = NewsTag.find(params[:tag_id]) rescue nil tmp = NewsTag.where(key: params[:tag_id])[0] unless tmp - @news_bulletins = tmp.news_bulletins.can_display.any_of( {deadline: nil,:postdate.lte => date_now} , {:deadline.gte => date_now,:postdate.lte => date_now} ).desc( :is_top, :postdate).page( params[:page]).per(10) rescue nil + @news_bulletins = tmp.news_bulletins.can_display.any_of( {deadline: nil,:postdate.lte => date_now} , {:deadline.gte => date_now,:postdate.lte => date_now} ).desc( :is_top, :postdate).page( params[:page_main]).per(10) rescue nil else - @news_bulletins = NewsBulletin.can_display.any_of( {deadline: nil,:postdate.lte => date_now} , {:deadline.gte => date_now,:postdate.lte => date_now} ).desc( :is_top, :postdate).page( params[:page]).per(10) + @news_bulletins = NewsBulletin.can_display.any_of( {deadline: nil,:postdate.lte => date_now} , {:deadline.gte => date_now,:postdate.lte => date_now} ).desc( :is_top, :postdate).page( params[:page_main]).per(10) end get_categorys diff --git a/vendor/built_in_modules/news/app/controllers/panel/news/widget/news_bulletins_controller.rb b/vendor/built_in_modules/news/app/controllers/panel/news/widget/news_bulletins_controller.rb index 27e83c00..263d8302 100644 --- a/vendor/built_in_modules/news/app/controllers/panel/news/widget/news_bulletins_controller.rb +++ b/vendor/built_in_modules/news/app/controllers/panel/news/widget/news_bulletins_controller.rb @@ -9,6 +9,7 @@ class Panel::News::Widget::NewsBulletinsController < OrbitWidgetController # GET /news_bulletins.xml def index + @title = params[:page_title] date_now = Time.now if !params[:category_id].blank? @news_bulletins = NewsBulletin.can_display.where(:news_bulletin_category_id => params[:category_id]).any_of( {deadline: nil,:postdate.lte => date_now} , {:deadline.gte => date_now,:postdate.lte => date_now} ).desc( :is_top, :postdate).page( params[:page]).per(5) diff --git a/vendor/built_in_modules/news/app/views/panel/news/front_end/news_bulletins/index.html.erb b/vendor/built_in_modules/news/app/views/panel/news/front_end/news_bulletins/index.html.erb index 9fc3f129..ade5e6a7 100644 --- a/vendor/built_in_modules/news/app/views/panel/news/front_end/news_bulletins/index.html.erb +++ b/vendor/built_in_modules/news/app/views/panel/news/front_end/news_bulletins/index.html.erb @@ -28,5 +28,5 @@ </tbody> </table> -<%= paginate @news_bulletins, :params => {:inner => 'false'} %> +<%= paginate @news_bulletins, :param_name => :page_main, :params => {:inner => 'false'} %> diff --git a/vendor/built_in_modules/news/app/views/panel/news/widget/news_bulletins/_index.html.erb b/vendor/built_in_modules/news/app/views/panel/news/widget/news_bulletins/_index.html.erb index fd3d477a..d345f037 100644 --- a/vendor/built_in_modules/news/app/views/panel/news/widget/news_bulletins/_index.html.erb +++ b/vendor/built_in_modules/news/app/views/panel/news/widget/news_bulletins/_index.html.erb @@ -1,13 +1,7 @@ <% # encoding: utf-8 %> -<%= flash_messages %> - -<% if @current_category %> - <h1 class="h1"><%= @current_category.i18n_variable[I18n.locale] + t('news.news_bulletin.list_lower') %></h1> -<% elsif @tag %> - <h1 class="h1"><%= @tag[I18n.locale] + t('news.news_bulletin.list_lower') %></h1> -<% else %> - <h1 class="h1"><%= t('news.list_news') %></h1> +<% if @title %> + <h1 class="h1"><%= @title %></h1> <% end %> <table class="table table-bordered"> diff --git a/vendor/built_in_modules/web_resource/app/controllers/panel/web_resource/widget/web_links_controller.rb b/vendor/built_in_modules/web_resource/app/controllers/panel/web_resource/widget/web_links_controller.rb index ec57451c..441933d4 100644 --- a/vendor/built_in_modules/web_resource/app/controllers/panel/web_resource/widget/web_links_controller.rb +++ b/vendor/built_in_modules/web_resource/app/controllers/panel/web_resource/widget/web_links_controller.rb @@ -25,6 +25,7 @@ class Panel::WebResource::Widget::WebLinksController < OrbitWidgetController def home_list + @title = params[:page_title] # deadline diff --git a/vendor/built_in_modules/web_resource/app/views/panel/web_resource/widget/web_links/home_list.html.erb b/vendor/built_in_modules/web_resource/app/views/panel/web_resource/widget/web_links/home_list.html.erb index 5be53041..1f9fd304 100644 --- a/vendor/built_in_modules/web_resource/app/views/panel/web_resource/widget/web_links/home_list.html.erb +++ b/vendor/built_in_modules/web_resource/app/views/panel/web_resource/widget/web_links/home_list.html.erb @@ -1,5 +1,7 @@ <div class="quicklinks"> - <h3 class="link_title"><%= t("announcement.related_links") %></h3> + <% if @title %> + <h3 class="link_title"><%= @title %></h3> + <% end %> <div id='web_links_links'> <%= render 'web_links' %> From 62e9a772f65ea9aadc6af1cad80c4691155f841a Mon Sep 17 00:00:00 2001 From: Christophe Vilayphiou <chris.vilayphiou@gmail.com> Date: Sun, 13 May 2012 23:09:48 +0800 Subject: [PATCH 18/26] Fix titles for widgets Add translations --- app/views/admin/page_parts/_edit.html.erb | 2 +- config/locales/en.yml | 4 ++++ config/locales/zh_tw.yml | 4 ++++ lib/parsers/parser_common.rb | 2 +- .../panel/announcement/widget/bulletins_controller.rb | 2 +- .../panel/announcement/front_end/bulletins/index.html.erb | 4 ++-- vendor/built_in_modules/announcement/config/locales/en.yml | 2 +- vendor/built_in_modules/announcement/config/locales/zh_tw.yml | 2 +- .../panel/news/widget/news_bulletins_controller.rb | 2 +- .../views/panel/news/front_end/news_bulletins/index.html.erb | 4 ++-- vendor/built_in_modules/news/config/locales/en.yml | 2 +- vendor/built_in_modules/news/config/locales/zh_tw.yml | 4 ++-- .../panel/web_resource/widget/web_links_controller.rb | 2 +- 13 files changed, 22 insertions(+), 14 deletions(-) diff --git a/app/views/admin/page_parts/_edit.html.erb b/app/views/admin/page_parts/_edit.html.erb index ec99c555..eaee4d8f 100644 --- a/app/views/admin/page_parts/_edit.html.erb +++ b/app/views/admin/page_parts/_edit.html.erb @@ -2,7 +2,7 @@ <% LIST[:page_part_kinds].each do |kind| %> <%= f.radio_button :kind, kind, :class => 'part_kind' %> - <%= t(kind) %> + <%= t(kind, :scope => 'admin.page_part_kinds') %> <% end %> <% LIST[:page_part_kinds].each do |kind| %> diff --git a/config/locales/en.yml b/config/locales/en.yml index 07bfe189..0d0707cc 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -200,6 +200,10 @@ en: options: Options orig_upload_file: Original filename page: Page + page_part_kinds: + text: Text Area + public_r_tag: System Widget + module_widget: Plug-in Module Widget position: Position published?: Published? purchase: Purchase diff --git a/config/locales/zh_tw.yml b/config/locales/zh_tw.yml index ae1b92f3..b4d644c7 100644 --- a/config/locales/zh_tw.yml +++ b/config/locales/zh_tw.yml @@ -195,6 +195,10 @@ zh_tw: options: 選項 orig_upload_file: 原上傳檔名 page: 頁面管理 + page_part_kinds: + text: 文字區塊 + public_r_tag: 系統模塊 + module_widget: 外掛模塊 position: 位置 published?: 發布? purchase: 購買 diff --git a/lib/parsers/parser_common.rb b/lib/parsers/parser_common.rb index b9c56642..4afa586c 100644 --- a/lib/parsers/parser_common.rb +++ b/lib/parsers/parser_common.rb @@ -183,7 +183,7 @@ module ParserCommon ret << part.i18n_variable[I18n.locale] rescue '' when 'module_widget' url = "/panel/#{part.module_app.key}/widget/#{part.widget_path}?inner=true" - options = "&category_id=#{!part[:category].blank? ? part[:category].blank? : params[:category_id]}&tag_id=#{!part[:tag].blank? ? part[:tag] : params[:tag_id]}&page=#{params[:page]}&part_title=part_title" + options = "&category_id=#{!part[:category].blank? ? part[:category].blank? : params[:category_id]}&tag_id=#{!part[:tag].blank? ? part[:tag] : params[:tag_id]}&page=#{params[:page]}&part_title=#{Rack::Utils.escape(part_title).gsub("+", "%20") rescue nil}" ret << "<div class='dymanic_load' path='#{url + options}'></div>" when 'public_r_tag' ret << "<r:#{part.public_r_tag} id='#{part.public_r_tag_object_id}'/>" diff --git a/vendor/built_in_modules/announcement/app/controllers/panel/announcement/widget/bulletins_controller.rb b/vendor/built_in_modules/announcement/app/controllers/panel/announcement/widget/bulletins_controller.rb index 2a7c6b1f..316a715b 100644 --- a/vendor/built_in_modules/announcement/app/controllers/panel/announcement/widget/bulletins_controller.rb +++ b/vendor/built_in_modules/announcement/app/controllers/panel/announcement/widget/bulletins_controller.rb @@ -9,7 +9,7 @@ class Panel::Announcement::Widget::BulletinsController < OrbitWidgetController # GET /bulletins.xml def index - @title = params[:page_title] + @title = params[:part_title] date_now = Time.now if !params[:category_id].blank? @bulletins = Bulletin.can_display.where(:bulletin_category_id => params[:category_id]).any_of( {deadline: nil,:postdate.lte => date_now} , {:deadline.gte => date_now,:postdate.lte => date_now} ).desc( :is_top, :postdate).page( params[:page]).per(10) diff --git a/vendor/built_in_modules/announcement/app/views/panel/announcement/front_end/bulletins/index.html.erb b/vendor/built_in_modules/announcement/app/views/panel/announcement/front_end/bulletins/index.html.erb index f09d8b70..16ac7d8b 100644 --- a/vendor/built_in_modules/announcement/app/views/panel/announcement/front_end/bulletins/index.html.erb +++ b/vendor/built_in_modules/announcement/app/views/panel/announcement/front_end/bulletins/index.html.erb @@ -3,9 +3,9 @@ <%= flash_messages %> <% if @current_category %> - <h1 class="h1"><%= @current_category.i18n_variable[I18n.locale] + t('announcement.bulletin.list_lower') %></h1> + <h1 class="h1"><%= @current_category.i18n_variable[I18n.locale] %></h1> <% else %> - <h1 class="h1"><%= t('announcement.list_announcement') %></h1> + <h1 class="h1"><%= t('announcement.announcement') %></h1> <% end %> diff --git a/vendor/built_in_modules/announcement/config/locales/en.yml b/vendor/built_in_modules/announcement/config/locales/en.yml index 5a1d2f13..4d4d426d 100644 --- a/vendor/built_in_modules/announcement/config/locales/en.yml +++ b/vendor/built_in_modules/announcement/config/locales/en.yml @@ -58,6 +58,7 @@ en: announcement: all_articles: List add_new: Add + announcement: Announcement categories: Categories error: no_avilb_cate_for_posting: You need a category to submit your post,please contact admin @@ -66,7 +67,6 @@ en: more: more+ bulletins: Bulletins related_links: Related Links - list_announcement: List Announcement bulletin: submit_user_list: Submit User category: Category diff --git a/vendor/built_in_modules/announcement/config/locales/zh_tw.yml b/vendor/built_in_modules/announcement/config/locales/zh_tw.yml index 5e559b6a..4fb22bb9 100644 --- a/vendor/built_in_modules/announcement/config/locales/zh_tw.yml +++ b/vendor/built_in_modules/announcement/config/locales/zh_tw.yml @@ -37,6 +37,7 @@ zh_tw: announcement: add_new: 新增 all_articles: 列表 + announcement: 公告 error: no_avilb_cate_for_posting: 您目前沒有分類可以刊登公告,請聯絡系統管理員為您開通分類 tags: 標籤 @@ -47,7 +48,6 @@ zh_tw: more: 更多+ bulletins: 公告訊息 related_links: 相關連結 - list_announcement: 公告列表 bulletin: category: 分類 submit_user_list: 張貼人 diff --git a/vendor/built_in_modules/news/app/controllers/panel/news/widget/news_bulletins_controller.rb b/vendor/built_in_modules/news/app/controllers/panel/news/widget/news_bulletins_controller.rb index 263d8302..dad3c781 100644 --- a/vendor/built_in_modules/news/app/controllers/panel/news/widget/news_bulletins_controller.rb +++ b/vendor/built_in_modules/news/app/controllers/panel/news/widget/news_bulletins_controller.rb @@ -9,7 +9,7 @@ class Panel::News::Widget::NewsBulletinsController < OrbitWidgetController # GET /news_bulletins.xml def index - @title = params[:page_title] + @title = params[:part_title] date_now = Time.now if !params[:category_id].blank? @news_bulletins = NewsBulletin.can_display.where(:news_bulletin_category_id => params[:category_id]).any_of( {deadline: nil,:postdate.lte => date_now} , {:deadline.gte => date_now,:postdate.lte => date_now} ).desc( :is_top, :postdate).page( params[:page]).per(5) diff --git a/vendor/built_in_modules/news/app/views/panel/news/front_end/news_bulletins/index.html.erb b/vendor/built_in_modules/news/app/views/panel/news/front_end/news_bulletins/index.html.erb index ade5e6a7..4c2292a6 100644 --- a/vendor/built_in_modules/news/app/views/panel/news/front_end/news_bulletins/index.html.erb +++ b/vendor/built_in_modules/news/app/views/panel/news/front_end/news_bulletins/index.html.erb @@ -3,9 +3,9 @@ <%= flash_messages %> <% if @current_category %> - <h1 class="h1"><%= @current_category.i18n_variable[I18n.locale] + t('news.news_bulletin.list_lower') %></h1> + <h1 class="h1"><%= @current_category.i18n_variable[I18n.locale] %></h1> <% else %> - <h1 class="h1"><%= t('news.list_news') %></h1> + <h1 class="h1"><%= t('news.news') %></h1> <% end %> <table class="table table-bordered"> diff --git a/vendor/built_in_modules/news/config/locales/en.yml b/vendor/built_in_modules/news/config/locales/en.yml index 557a643b..37f06ea4 100644 --- a/vendor/built_in_modules/news/config/locales/en.yml +++ b/vendor/built_in_modules/news/config/locales/en.yml @@ -63,7 +63,7 @@ en: more: more+ news_bulletins: NewsBulletins related_links: Related Links - list_news: List News + news: News news_bulletin: category: Category list_lower: " list" diff --git a/vendor/built_in_modules/news/config/locales/zh_tw.yml b/vendor/built_in_modules/news/config/locales/zh_tw.yml index afbca2b0..290df5e6 100644 --- a/vendor/built_in_modules/news/config/locales/zh_tw.yml +++ b/vendor/built_in_modules/news/config/locales/zh_tw.yml @@ -43,9 +43,9 @@ zh_tw: sure?: 確定嗎? campus_news: 校園新聞 more: 更多+ - news_bulletins: 公告訊息 + news_bulletins: 新聞訊息 related_links: 相關連結 - list_news: 公告列表 + news: 新聞 news_bulletin: category: 分類 list_lower: 列表 diff --git a/vendor/built_in_modules/web_resource/app/controllers/panel/web_resource/widget/web_links_controller.rb b/vendor/built_in_modules/web_resource/app/controllers/panel/web_resource/widget/web_links_controller.rb index 441933d4..504e82e1 100644 --- a/vendor/built_in_modules/web_resource/app/controllers/panel/web_resource/widget/web_links_controller.rb +++ b/vendor/built_in_modules/web_resource/app/controllers/panel/web_resource/widget/web_links_controller.rb @@ -25,7 +25,7 @@ class Panel::WebResource::Widget::WebLinksController < OrbitWidgetController def home_list - @title = params[:page_title] + @title = params[:part_title] # deadline From e40c76bf5f3208e1f6c559d97aff1e7bc26a0e46 Mon Sep 17 00:00:00 2001 From: Christophe Vilayphiou <chris.vilayphiou@gmail.com> Date: Sun, 13 May 2012 23:48:34 +0800 Subject: [PATCH 19/26] Fix new page form Redirect to home when not authorized Get only module_apps with app_pages for new and edit page Change web_resource.json --- app/controllers/admin/pages_controller.rb | 4 ++-- app/controllers/orbit_backend_controller.rb | 2 +- app/views/admin/pages/_new.html.erb | 2 +- vendor/built_in_modules/web_resource/web_resource.json | 1 - 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/app/controllers/admin/pages_controller.rb b/app/controllers/admin/pages_controller.rb index 65754319..71153a14 100644 --- a/app/controllers/admin/pages_controller.rb +++ b/app/controllers/admin/pages_controller.rb @@ -20,14 +20,14 @@ class Admin::PagesController < ApplicationController def new @item = Page.new @item.parent = Item.find(params[:parent_id]) rescue nil - @apps = ModuleApp.all + @apps = ModuleApp.excludes(app_pages: nil).entries @designs = Design.all.entries @design = Design.first end def edit @item = Page.find(params[:id]) - @apps = ModuleApp.all + @apps = ModuleApp.excludes(app_pages: nil).entries @designs = Design.all.entries @design = @item.design ? @item.design : @designs.first @app_frontend_urls = @item.module_app.app_pages if @item.module_app diff --git a/app/controllers/orbit_backend_controller.rb b/app/controllers/orbit_backend_controller.rb index a03a1f6c..bdddfb43 100644 --- a/app/controllers/orbit_backend_controller.rb +++ b/app/controllers/orbit_backend_controller.rb @@ -23,7 +23,7 @@ class OrbitBackendController< ApplicationController def check_user_can_use unless check_permission #redirect_to polymorphic_path(['panel',@app_title,'back_end','public']) - render :text => '403 Forbidden' + redirect_to root_url end end diff --git a/app/views/admin/pages/_new.html.erb b/app/views/admin/pages/_new.html.erb index d3190e0e..ecbda3de 100644 --- a/app/views/admin/pages/_new.html.erb +++ b/app/views/admin/pages/_new.html.erb @@ -1,7 +1,7 @@ <%= flash_messages %> <div id="poststuff"> <h1><%= t('admin.new_page') %></h1> - <%= form_for @item, :url => admin_page_path, :html => { :class => 'form-horizontal edit_page' } do |f| %> + <%= form_for @item, :url => admin_pages_path, :html => { :class => 'form-horizontal edit_page' } do |f| %> <%= render :partial => "form", :locals => { :f => f } %> <div class="form-actions"> <%= f.submit t('update'), :class => 'btn btn-primary' %> diff --git a/vendor/built_in_modules/web_resource/web_resource.json b/vendor/built_in_modules/web_resource/web_resource.json index f87f06a2..a854d31b 100644 --- a/vendor/built_in_modules/web_resource/web_resource.json +++ b/vendor/built_in_modules/web_resource/web_resource.json @@ -6,7 +6,6 @@ "intro": "A simple blog……", "update_info": "Some info", "create_date": "11-11-2011", - "app_pages": ["web_links"], "widgets": ["home_list"], "enable_frontend": true } From cf8d20dc84a192eb70afaae4fd988e5d2e7c7003 Mon Sep 17 00:00:00 2001 From: Christophe Vilayphiou <chris.vilayphiou@gmail.com> Date: Mon, 14 May 2012 00:33:52 +0800 Subject: [PATCH 20/26] Add category and tag to pages --- app/controllers/admin/module_apps_controller.rb | 12 +++++++++++- app/controllers/admin/pages_controller.rb | 3 +++ app/models/page.rb | 2 ++ .../admin/module_apps/reload_frontend_pages.js.erb | 3 ++- app/views/admin/pages/_form.html.erb | 3 +++ lib/parsers/parser_common.rb | 6 ++++-- 6 files changed, 25 insertions(+), 4 deletions(-) diff --git a/app/controllers/admin/module_apps_controller.rb b/app/controllers/admin/module_apps_controller.rb index c6a8d2b2..1393bf32 100644 --- a/app/controllers/admin/module_apps_controller.rb +++ b/app/controllers/admin/module_apps_controller.rb @@ -11,7 +11,17 @@ class Admin::ModuleAppsController < ApplicationController def reload_frontend_pages @module_app = ModuleApp.find(params[:id]) - @categories = @module_app.key.eql?('announcement') ? BulletinCategory.all : nil + case @module_app.key + when 'announcement' + @categories = BulletinCategory.all + @tags = AnnouncementTag.all + when 'news' + @categories = NewsBulletinCategory.all + @tags = NewsTag.all + when 'web_resource' + @categories = WebLinkCategory.all + @tags = WebResourceTag.all + end respond_to do |format| format.js {} end diff --git a/app/controllers/admin/pages_controller.rb b/app/controllers/admin/pages_controller.rb index 71153a14..44bda4aa 100644 --- a/app/controllers/admin/pages_controller.rb +++ b/app/controllers/admin/pages_controller.rb @@ -35,10 +35,13 @@ class Admin::PagesController < ApplicationController case @item.module_app.key when 'announcement' @categories = BulletinCategory.all + @tags = AnnouncementTag.all when 'news' @categories = NewsBulletinCategory.all + @tags = NewsTag.all when 'web_resource' @categories = WebLinkCategory.all + @tags = WebResourceTag.all end else @categories = nil diff --git a/app/models/page.rb b/app/models/page.rb index 0378b688..4bcb49a6 100644 --- a/app/models/page.rb +++ b/app/models/page.rb @@ -3,6 +3,8 @@ class Page < Item field :content field :app_frontend_url field :theme_id, :type => BSON::ObjectId, :default => nil + field :category + field :tag belongs_to :design belongs_to :module_app diff --git a/app/views/admin/module_apps/reload_frontend_pages.js.erb b/app/views/admin/module_apps/reload_frontend_pages.js.erb index 3feb17cf..2fc90b8e 100644 --- a/app/views/admin/module_apps/reload_frontend_pages.js.erb +++ b/app/views/admin/module_apps/reload_frontend_pages.js.erb @@ -1,2 +1,3 @@ $('#app_page_url').html("<%= escape_javascript(select 'page', 'app_frontend_url', @module_app.app_pages) %>"); -$('#app_page_category').html("<%= escape_javascript(select 'page', 'category', @categories.collect{|category| [category.i18n_variable[I18n.locale], category.id]}) if @categories %>"); \ No newline at end of file +$('#app_page_category').html("<%= j (select 'page', 'category', @categories.collect{|category| [category.i18n_variable[I18n.locale], category.id]}, {:include_blank => true}) if @categories %>"); +$('#app_page_tag').html("<%= j (select 'page', 'tag', @tags.collect{|tag| [tag[I18n.locale], tag.id]}, {:include_blank => true}) if @tags %>"); \ No newline at end of file diff --git a/app/views/admin/pages/_form.html.erb b/app/views/admin/pages/_form.html.erb index 36e6e008..eff3e4df 100644 --- a/app/views/admin/pages/_form.html.erb +++ b/app/views/admin/pages/_form.html.erb @@ -45,6 +45,9 @@ <span id="app_page_category"> <%= select('page','category', @categories.collect{|category| [category.i18n_variable[I18n.locale], category.id]}, :selected => @item[:category], :include_blank => true ) rescue ''%> </span> + <span id="app_page_tag"> + <%= select('page','tag', @tags.collect{|tag| [tag[I18n.locale], tag.id]}, :selected => @item[:tag], :include_blank => true ) rescue ''%> + </span> <!-- <p class="help-block">In addition to freeform text, any HTML5 text-based input appears like so.</p> --> </div> </div> diff --git a/lib/parsers/parser_common.rb b/lib/parsers/parser_common.rb index 4afa586c..d727e68c 100644 --- a/lib/parsers/parser_common.rb +++ b/lib/parsers/parser_common.rb @@ -164,10 +164,12 @@ module ParserCommon public_r_tags = [] body.css('.page_content').each do |content| ret = '' + category = params[:category_id].blank? ? page[:category] : params[:category_id] + tag = params[:tag_id].blank? ? page[:tag] : params[:tag_id] if (content["main"] == "true" && !page.module_app.nil?) ret << "<div id='appfrontend' class='dymanic_load' path='/panel/#{page.module_app.key}/front_end/#{page.app_frontend_url}" ret << "/#{params[:id]}" if params[:id] && !params[:id].eql?(page.id.to_s) - ret << "?inner=true&page_id=#{page.id}&category_id=#{params[:category_id]}&tag_id=#{params[:tag_id]}&preview=#{params[:preview]}&page_main=#{params[:page_main]}" + ret << "?inner=true&page_id=#{page.id}&category_id=#{category}&tag_id=#{tag}&preview=#{params[:preview]}&page_main=#{params[:page_main]}" ret << "'></div>" else part = page.page_parts.detect{ |p| p.name.to_s == content['name'].to_s } rescue nil @@ -183,7 +185,7 @@ module ParserCommon ret << part.i18n_variable[I18n.locale] rescue '' when 'module_widget' url = "/panel/#{part.module_app.key}/widget/#{part.widget_path}?inner=true" - options = "&category_id=#{!part[:category].blank? ? part[:category].blank? : params[:category_id]}&tag_id=#{!part[:tag].blank? ? part[:tag] : params[:tag_id]}&page=#{params[:page]}&part_title=#{Rack::Utils.escape(part_title).gsub("+", "%20") rescue nil}" + options = "&category_id=#{!part[:category].blank? ? part[:category].blank? : category}&tag_id=#{!part[:tag].blank? ? part[:tag] : tag}&page=#{params[:page]}&part_title=#{Rack::Utils.escape(part_title).gsub("+", "%20") rescue nil}" ret << "<div class='dymanic_load' path='#{url + options}'></div>" when 'public_r_tag' ret << "<r:#{part.public_r_tag} id='#{part.public_r_tag_object_id}'/>" From 8b42c595b3d6c301ec594bf3fcdcae6cd1ea29d6 Mon Sep 17 00:00:00 2001 From: "Matthew K. Fu JuYuan" <matthewfu@gmail.com> Date: Thu, 10 May 2012 14:43:05 +0800 Subject: [PATCH 21/26] Don't display admin in any premission select. Fix not necessary header for UT data --- app/controllers/admin/new_interface_module_apps_controller.rb | 2 +- .../panel/announcement/back_end/approvals_controller.rb | 1 + .../back_end/bulletin_category_setting_controller.rb | 1 + .../announcement/back_end/approvals/_privilege_user.html.erb | 3 +-- .../bulletin_category_setting/_privilege_user.html.erb | 3 +-- .../lib/tasks/data_for_ut_list_for_posting_anc.rake | 2 +- .../announcement/lib/ut_list_from_nccu_2012feb.csv | 1 - .../panel/news/back_end/news_approvals_controller.rb | 1 + .../news/back_end/news_bulletin_category_setting_controller.rb | 1 + .../news/back_end/news_approvals/_privilege_user.html.erb | 3 +-- .../news_bulletin_category_setting/_privilege_user.html.erb | 3 +-- 11 files changed, 10 insertions(+), 11 deletions(-) diff --git a/app/controllers/admin/new_interface_module_apps_controller.rb b/app/controllers/admin/new_interface_module_apps_controller.rb index 6603334c..8cf77e5e 100644 --- a/app/controllers/admin/new_interface_module_apps_controller.rb +++ b/app/controllers/admin/new_interface_module_apps_controller.rb @@ -6,7 +6,7 @@ class Admin::NewInterfaceModuleAppsController < ApplicationController layout "new_admin" def setting - @sys_users = User.all + @sys_users = User.all(conditions: {admin: false}) @module_app = ModuleApp.find(params[:module_app_id]) @options_from_collection_for_select_bulletin_categorys = [@module_app].collect{|ma| [ma.title,ma.id] } # if params.has_key? :category diff --git a/vendor/built_in_modules/announcement/app/controllers/panel/announcement/back_end/approvals_controller.rb b/vendor/built_in_modules/announcement/app/controllers/panel/announcement/back_end/approvals_controller.rb index 9f63a8ab..e5c92023 100644 --- a/vendor/built_in_modules/announcement/app/controllers/panel/announcement/back_end/approvals_controller.rb +++ b/vendor/built_in_modules/announcement/app/controllers/panel/announcement/back_end/approvals_controller.rb @@ -12,6 +12,7 @@ class Panel::Announcement::BackEnd::ApprovalsController < OrbitBackendControlle # end def setting + @sys_users = User.all(conditions: {admin: false}) @bulletin_categorys = BulletinCategory.all @options_from_collection_for_select_bulletin_categorys = @bulletin_categorys.collect{|bc| [bc.i18n_variable[I18n.locale],bc.id] } if params.has_key? :category diff --git a/vendor/built_in_modules/announcement/app/controllers/panel/announcement/back_end/bulletin_category_setting_controller.rb b/vendor/built_in_modules/announcement/app/controllers/panel/announcement/back_end/bulletin_category_setting_controller.rb index 4be5f6bc..8903adb2 100644 --- a/vendor/built_in_modules/announcement/app/controllers/panel/announcement/back_end/bulletin_category_setting_controller.rb +++ b/vendor/built_in_modules/announcement/app/controllers/panel/announcement/back_end/bulletin_category_setting_controller.rb @@ -12,6 +12,7 @@ class Panel::Announcement::BackEnd::BulletinCategorySettingController < OrbitBac # end def setting + @sys_users = User.all(conditions: {admin: false}) @bulletin_categorys = [] @bulletin_categorys << BulletinCategory.find(params[:bulletin_category_id]) @options_from_collection_for_select_bulletin_categorys = @bulletin_categorys.collect{|bc| [bc.i18n_variable[I18n.locale],bc.id] } diff --git a/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/approvals/_privilege_user.html.erb b/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/approvals/_privilege_user.html.erb index c36941de..90f5cb65 100644 --- a/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/approvals/_privilege_user.html.erb +++ b/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/approvals/_privilege_user.html.erb @@ -1,6 +1,5 @@ <%= content_tag :div ,:id => "users_checkbox_ary",:class => 'clear' do -%> -<% sys_users = User.all -%> - <% sys_users.each do |sys_user| -%> + <% @sys_users.each do |sys_user| -%> <div class="checkblock"> diff --git a/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/_privilege_user.html.erb b/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/_privilege_user.html.erb index c36941de..90f5cb65 100644 --- a/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/_privilege_user.html.erb +++ b/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/_privilege_user.html.erb @@ -1,6 +1,5 @@ <%= content_tag :div ,:id => "users_checkbox_ary",:class => 'clear' do -%> -<% sys_users = User.all -%> - <% sys_users.each do |sys_user| -%> + <% @sys_users.each do |sys_user| -%> <div class="checkblock"> diff --git a/vendor/built_in_modules/announcement/lib/tasks/data_for_ut_list_for_posting_anc.rake b/vendor/built_in_modules/announcement/lib/tasks/data_for_ut_list_for_posting_anc.rake index e5bd0be2..9b8b05e5 100644 --- a/vendor/built_in_modules/announcement/lib/tasks/data_for_ut_list_for_posting_anc.rake +++ b/vendor/built_in_modules/announcement/lib/tasks/data_for_ut_list_for_posting_anc.rake @@ -4,9 +4,9 @@ namespace :nccu_data do desc "load nccu data from csv" task :setup_ut_list => :environment do require 'csv' - CSV.foreach("vendor/built_in_modules/announcement/lib/ut_list_from_nccu_2012feb.csv") do |row| new_unit = UnitListForAnc.new(:order => row[0], :ut_code => row[1], :up_ut_code => row[2], :created_at => Time.now,:updated_at => Time.now) + # order,ut_code,up_tu_code,ut_zh_tw,ut_en new_unit.build_title :en => row[4], :zh_tw => row[3] new_unit.save end diff --git a/vendor/built_in_modules/announcement/lib/ut_list_from_nccu_2012feb.csv b/vendor/built_in_modules/announcement/lib/ut_list_from_nccu_2012feb.csv index 548ad528..806d0b9a 100644 --- a/vendor/built_in_modules/announcement/lib/ut_list_from_nccu_2012feb.csv +++ b/vendor/built_in_modules/announcement/lib/ut_list_from_nccu_2012feb.csv @@ -1,4 +1,3 @@ -order,ut_code,up_tu_code,ut_zh_tw,ut_en 0100,H00,H00,校長室,Office of the President 0110,H01,H01,副校長室一,Office of the Vice President 0110,H03,H03,副校長室二,Office of the Vice President diff --git a/vendor/built_in_modules/news/app/controllers/panel/news/back_end/news_approvals_controller.rb b/vendor/built_in_modules/news/app/controllers/panel/news/back_end/news_approvals_controller.rb index c6eda9d0..80838ec5 100644 --- a/vendor/built_in_modules/news/app/controllers/panel/news/back_end/news_approvals_controller.rb +++ b/vendor/built_in_modules/news/app/controllers/panel/news/back_end/news_approvals_controller.rb @@ -12,6 +12,7 @@ class Panel::News::BackEnd::NewsApprovalsController < OrbitBackendController end def setting + @sys_users = User.all(conditions: {admin: false}) @news_bulletin_categorys = NewsBulletinCategory.all if params.has_key?(:category_id) first_category = NewsBulletinCategory.find params[:category_id] diff --git a/vendor/built_in_modules/news/app/controllers/panel/news/back_end/news_bulletin_category_setting_controller.rb b/vendor/built_in_modules/news/app/controllers/panel/news/back_end/news_bulletin_category_setting_controller.rb index 6b92195f..6ac76973 100644 --- a/vendor/built_in_modules/news/app/controllers/panel/news/back_end/news_bulletin_category_setting_controller.rb +++ b/vendor/built_in_modules/news/app/controllers/panel/news/back_end/news_bulletin_category_setting_controller.rb @@ -12,6 +12,7 @@ class Panel::News::BackEnd::NewsBulletinCategorySettingController < OrbitBackend # end def setting + @sys_users = User.all(conditions: {admin: false}) @bulletin_categorys = [] @bulletin_categorys << NewsBulletinCategory.find(params[:news_bulletin_category_id]) @options_from_collection_for_select_bulletin_categorys = @bulletin_categorys.collect{|bc| [bc.i18n_variable[I18n.locale],bc.id] } diff --git a/vendor/built_in_modules/news/app/views/panel/news/back_end/news_approvals/_privilege_user.html.erb b/vendor/built_in_modules/news/app/views/panel/news/back_end/news_approvals/_privilege_user.html.erb index 87d4d78e..d48bb850 100644 --- a/vendor/built_in_modules/news/app/views/panel/news/back_end/news_approvals/_privilege_user.html.erb +++ b/vendor/built_in_modules/news/app/views/panel/news/back_end/news_approvals/_privilege_user.html.erb @@ -1,6 +1,5 @@ <%= content_tag :div ,:id => "users_checkbox_ary",:class => 'clear' do -%> -<% sys_users = User.all -%> - <% sys_users.each do |user| -%> + <% @sys_users.each do |user| -%> <div class="checkblock"> diff --git a/vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/_privilege_user.html.erb b/vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/_privilege_user.html.erb index c36941de..90f5cb65 100644 --- a/vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/_privilege_user.html.erb +++ b/vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/_privilege_user.html.erb @@ -1,6 +1,5 @@ <%= content_tag :div ,:id => "users_checkbox_ary",:class => 'clear' do -%> -<% sys_users = User.all -%> - <% sys_users.each do |sys_user| -%> + <% @sys_users.each do |sys_user| -%> <div class="checkblock"> From a184f96ce79e67630e9ad01a993732c4540a62db Mon Sep 17 00:00:00 2001 From: "Matthew K. Fu JuYuan" <matthewfu@gmail.com> Date: Thu, 10 May 2012 15:37:07 +0800 Subject: [PATCH 22/26] AdBanner app_auth --- app/views/layouts/_side_bar.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/layouts/_side_bar.html.erb b/app/views/layouts/_side_bar.html.erb index 72baca6b..e808427a 100644 --- a/app/views/layouts/_side_bar.html.erb +++ b/app/views/layouts/_side_bar.html.erb @@ -54,7 +54,7 @@ <%#= content_tag :li, link_to(t('admin.ad.all_banners'), admin_ad_banners_path), :class => active_for_action('ad_banners', 'index') %> <%#= content_tag :li, link_to(t('admin.ad.new_banner'), new_admin_ad_banner_path), :class => active_for_action('ad_banners', 'new') %> <%#= content_tag :li, link_to(t('admin.ad.new_image'), new_ad_image_admin_ad_banners_path), :class => active_for_action('ad_images', 'new') %> - <%= content_tag :li, link_to(t('admin.module.authorization'),edit_admin_module_app_path(ModuleApp.first(conditions: {title: "ad_banners"}))), :class => active_sys_call_for_app('module_apps','edit','ad_banners') if (is_admin? rescue nil) %> + <%= content_tag :li, link_to(t('admin.module.authorization'),admin_module_app_manager_auth_proc_path(ModuleApp.first(conditions: {title: "ad_banners"}))), :class => active_sys_call_for_app('new_interface_module_apps','setting','ad_banners',:module_app_id) if (is_admin? rescue nil) %> <% end -%> <% end %> From 0119ab1a74901a1ae58c6e601e8a6569ee60a68a Mon Sep 17 00:00:00 2001 From: "Matthew K. Fu JuYuan" <matthewfu@gmail.com> Date: Fri, 11 May 2012 16:44:40 +0800 Subject: [PATCH 23/26] New Interface for App Auth and Object Auth --- .../module_apps_new_interface_controller.rb | 66 +++++++++++++++++ .../object_auths_new_interface_controller.rb | 71 +++++++++++++++++++ app/helpers/application_helper.rb | 20 +++++- .../_modal_list.html.erb | 42 +++++++++++ .../_privilege_user.html.erb | 25 +++++++ .../setting.html.erb | 56 +++++++++++++++ .../module_apps_new_interface/setting.js.erb | 2 + .../update_setting.js.erb | 1 + .../user_list.js.erb | 2 + .../_modal_list.html.erb | 42 +++++++++++ .../_privilege_user.html.erb | 25 +++++++ .../setting.html.erb | 57 +++++++++++++++ .../object_auths_new_interface/setting.js.erb | 2 + .../update_setting.js.erb | 1 + .../user_list.js.erb | 2 + app/views/layouts/_side_bar.html.erb | 16 ++--- config/locales/en.yml | 4 ++ config/locales/zh_tw.yml | 6 +- lib/orbit_core_lib.rb | 4 ++ .../back_end/bulletin_categorys_helper.rb | 2 +- .../app/models/bulletin_category.rb | 4 ++ .../news_bulletin_categorys_helper.rb | 2 +- .../news/app/models/news_bulletin_category.rb | 4 ++ 23 files changed, 442 insertions(+), 14 deletions(-) create mode 100644 app/controllers/admin/module_apps_new_interface_controller.rb create mode 100644 app/controllers/admin/object_auths_new_interface_controller.rb create mode 100644 app/views/admin/module_apps_new_interface/_modal_list.html.erb create mode 100644 app/views/admin/module_apps_new_interface/_privilege_user.html.erb create mode 100644 app/views/admin/module_apps_new_interface/setting.html.erb create mode 100644 app/views/admin/module_apps_new_interface/setting.js.erb create mode 100644 app/views/admin/module_apps_new_interface/update_setting.js.erb create mode 100644 app/views/admin/module_apps_new_interface/user_list.js.erb create mode 100644 app/views/admin/object_auths_new_interface/_modal_list.html.erb create mode 100644 app/views/admin/object_auths_new_interface/_privilege_user.html.erb create mode 100644 app/views/admin/object_auths_new_interface/setting.html.erb create mode 100644 app/views/admin/object_auths_new_interface/setting.js.erb create mode 100644 app/views/admin/object_auths_new_interface/update_setting.js.erb create mode 100644 app/views/admin/object_auths_new_interface/user_list.js.erb diff --git a/app/controllers/admin/module_apps_new_interface_controller.rb b/app/controllers/admin/module_apps_new_interface_controller.rb new file mode 100644 index 00000000..52292588 --- /dev/null +++ b/app/controllers/admin/module_apps_new_interface_controller.rb @@ -0,0 +1,66 @@ +class Admin::ModuleAppsNewInterfaceController < ApplicationController + before_filter :authenticate_user! + before_filter :is_admin? + include AdminHelper + + layout "new_admin" + + def setting + @sys_users = User.all(conditions: {admin: false}) + @module_app = ModuleApp.find(params[:module_app_id]) + @options_from_collection_for_select_bulletin_categorys = [@module_app].collect{|ma| [ma.title,ma.id] } + # if params.has_key? :category + # @bulletin_category = BulletinCategory.find params[:category][:id] + # else + # @bulletin_category = @bulletin_categorys.first + # end + @users_array = @module_app.managing_users rescue [] + + respond_to do |format| + format.html + format.js + end + end + + def update_setting + module_app = update_setting_by_params + if module_app.save! + flash[:notice] = "Update Done" + else + flash[:notice] = "Update Failed" + end + end + + def user_list + @module_app = ModuleApp.find params[:module_app][:id] + end + + protected + def update_setting_by_params + ma = ModuleApp.find params[:module_app][:id] + user_sat = User.find params[:users].keys + users_to_new = user_sat - ma.managing_users + users_to_remove = ma.managing_users - user_sat + + users_to_new.each do |new_user| + ma.assign_manager(new_user,current_user) + end + + users_to_remove.each do |remove_user| + ma.remove_manager(remove_user) + end + ma + end + + def get_categorys(id = nil) + @bulletin_categorys = [] + if(is_manager? || is_admin?) + @bulletin_categorys = (id ? BulletinCategory.find(id).to_a : BulletinCategory.excludes('disabled' => true)) + elsif is_sub_manager? + @bulletin_categorys = BulletinCategory.authed_for_user(current_user,'submit_new') + end + end + + + +end \ No newline at end of file diff --git a/app/controllers/admin/object_auths_new_interface_controller.rb b/app/controllers/admin/object_auths_new_interface_controller.rb new file mode 100644 index 00000000..427ec722 --- /dev/null +++ b/app/controllers/admin/object_auths_new_interface_controller.rb @@ -0,0 +1,71 @@ +class Admin::ObjectAuthsNewInterfaceController < ApplicationController + include OrbitCoreLib::PermissionUnility + layout "new_admin" + before_filter :force_order + + layout "new_admin" + + + def setting + @sys_users = User.all(conditions: {admin: false}) + @ob_auth = ObjectAuth.find params[:object_auth_id] + @options_from_collection_for_select_ob_auth = [@ob_auth].collect{|oa| [oa.auth_obj.pp_object,oa.id] } + @users_array = @ob_auth.privilege_users rescue [] + + respond_to do |format| + format.html + format.js + end + end + + def update_setting + ob_auth = update_setting_by_params + if ob_auth.save! + flash[:notice] = t("admin.object_auth.update_done") + else + flash[:notice] = t("admin.object_auth.update_failed") + end + end + + def user_list + @ob_auth = ObjectAuth.find params[:ob_auth][:id] + end + + protected + def update_setting_by_params + oa = ObjectAuth.find params[:ob_auth][:id] + user_sat = User.find params[:users].keys + users_to_new = user_sat - oa.auth_users + users_to_remove = oa.auth_users - user_sat + + users_to_new.each do |new_user| + oa.add_user_to_privilege_list(new_user) + end + + users_to_remove.each do |remove_user| + oa.remove_user_from_privilege_list(remove_user) + end + oa + end + + # def get_categorys(id = nil) + # @bulletin_categorys = [] + # if(is_manager? || is_admin?) + # @bulletin_categorys = (id ? BulletinCategory.find(id).to_a : BulletinCategory.excludes('disabled' => true)) + # elsif is_sub_manager? + # @bulletin_categorys = BulletinCategory.authed_for_user(current_user,'submit_new') + # end + # end + + def force_order + authenticate_user! + check_if_user_can_do_object_auth + end + + def check_if_user_can_do_object_auth + unless check_permission(:manager) + render :nothing => true, :status => 403 + end + end + +end \ No newline at end of file diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 32800d80..d04d8c59 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -68,9 +68,23 @@ module ApplicationHelper end end - def active_sys_call_for_app(controller_name,action_name,app_title,field = :id) - unless active_for_action(controller_name,action_name).nil? - app = ModuleApp.find params[field] + def active_for_ob_auths_object(object_class,field = :object_auth_id) + unless active_for_action("object_auths_new_interface","setting").nil? + ob_auth = ObjectAuth.find params[field] + ob_auth.obj_authable_type == object_class.to_s ? 'active' : nil + end + end + + def active_for_ob_auth(ob_auth_title,field = :object_auth_id) + unless active_for_action("module_apps_new_interface","setting").nil? + oa_auth = ObjectAuth.find params[field] + oa_auth.title == ob_auth_title ? 'active' : nil + end + end + + def active_for_app_auth(app_title ='', opt={:controller_name => 'module_apps_new_interface',:action_name=>'setting',:field => :module_app_id}) + unless active_for_action(opt[:controller_name],opt[:action_name]).nil? + app = ModuleApp.find params[opt[:field]] app.title == app_title ? 'active' : nil else nil diff --git a/app/views/admin/module_apps_new_interface/_modal_list.html.erb b/app/views/admin/module_apps_new_interface/_modal_list.html.erb new file mode 100644 index 00000000..b5b0ebcd --- /dev/null +++ b/app/views/admin/module_apps_new_interface/_modal_list.html.erb @@ -0,0 +1,42 @@ +<% if module_app -%> + +<div class="modal hide fade in" id="module_app-<%=module_app.id%>"> + <div class="modal-header"> + <a class="close" data-dismiss="modal">×</a> + <h3><%= t("admin.user_role.auth.manager") %></h3> + </div> + <div class="modal-body"> + <div class="clear"> + <% module_app.managing_users.each do |user| %> + <div class="checkbox clear checked"> + <div class='member-avatar'> + <% if user.avatar? %> + <%= image_tag(user.avatar.thumb.url,:class => "member-img") %> + <% else %> + <%= image_tag "person.png",:class => "member-img" %> + <% end %> + </div> + <%= label_tag "lab-user-#{user.id}", (user.name rescue ''),:class=>"member-name",:id=>nil -%> + </div> + <% end -%> + <divl> + </div> + <div class="modal-footer"> + <a href="#" class="btn" data-dismiss="modal"><%= t("modal.close") %></a> + </div> + <div> + <script type="text/javascript" src="/static/kernel.js"></script> + <script type="text/javascript"> + $(document).ready(function() { + + $("#module_app-<%=module_app.id%>").on("show", function () { + }); + $(".modal").on("hidden", function () { + $("#show_preview").remove(); + }); + }); + </script> + </div> +</div> + +<% end -%> \ No newline at end of file diff --git a/app/views/admin/module_apps_new_interface/_privilege_user.html.erb b/app/views/admin/module_apps_new_interface/_privilege_user.html.erb new file mode 100644 index 00000000..90f5cb65 --- /dev/null +++ b/app/views/admin/module_apps_new_interface/_privilege_user.html.erb @@ -0,0 +1,25 @@ +<%= content_tag :div ,:id => "users_checkbox_ary",:class => 'clear' do -%> + <% @sys_users.each do |sys_user| -%> + + <div class="checkblock"> + + <% sys_user.sub_roles.each do |sr| %> + <div class="for_unit" style="display:none;"> <%= sr.key %></div> + <% end %> + <%= content_tag :div,:data=>{'original-title'=>t('announcement.bulletin.approval_setting_window_title'),:content => "#{sys_user.sub_roles.collect{|sr| sr.i18n_variable[I18n.locale]}.join(',')}"},:class=>"checkbox clear" do %> + <div class="check-icon"> + </div> + <div class='member-avatar'> + <% if sys_user.avatar? %> + <%= image_tag(sys_user.avatar.thumb.url,:class => "member-img") %> + <% else %> + <%= image_tag "person.png",:class => "member-img" %> + <% end %> + </div> + <%= label_tag "lab-user-#{sys_user.id}", (sys_user.name rescue ''),:class=>"member-name",:id=>nil -%> + <%= check_box_tag "[users][#{sys_user.id}]", 'true',users.include?(sys_user),:class => "check" -%> + <%end -%> + </div> + + <% end -%> +<% end -%> \ No newline at end of file diff --git a/app/views/admin/module_apps_new_interface/setting.html.erb b/app/views/admin/module_apps_new_interface/setting.html.erb new file mode 100644 index 00000000..7d1179f0 --- /dev/null +++ b/app/views/admin/module_apps_new_interface/setting.html.erb @@ -0,0 +1,56 @@ +<% content_for :page_specific_css do %> + <%= stylesheet_link_tag "inc/permission-checkbox" %> +<% end %> +<% content_for :page_specific_javascript do %> + <%= javascript_include_tag "inc/permission-checkbox" %> + <%= javascript_include_tag "inc/search" %> + <%= javascript_include_tag "inc/modal-preview" %> +<% end %> +<%#= label_tag :fact_check_setting, t("announcement.bulletin.fact_check_setting") %> +<%= form_tag('', :remote => true,:class => "prevent_enter_submit_form") %> +<div class="subnav clear"> + <ul class="nav nav-pills filter pull-left"> + <li class="accordion-group"> + <div class="form-search" style="margin: 5px 10px;"> + <%= label_tag :module, t("module") %> + <%= select "module_app",'id',@options_from_collection_for_select_bulletin_categorys %> + <%= search_field_tag 'user_filter' %> + </div> + + </li> + </ul> + <%= link_to t("admin.user_role.auth.manager"), admin_module_app_manager_auth_show_path , :class=>'preview_trigger btn btn-success pull-right'%> + +</div> +<%#= label_tag :role, t("admin.roles") %> +<div class="clear"> +<%= content_tag :div do -%> + <% form_tag admin_module_app_manager_auth_proc_path do %> + <%= render :partial => "privilege_user", :locals => {:users => @users_array} %> + <div class="form-actions form-fixed pagination-right"> + <%= submit_tag "Update", :class => 'btn btn-primary' %> + </div> + <% end -%> +<% end -%> +</div> + +<script type="text/javascript" charset="utf-8"> +var availableTags = []; +$(document).ready(function() { + + $(".prevent_enter_submit_form").bind("keypress", function(e) { + if (e.keyCode == 13) { + return false; + } + }); + + $('#category_id').change(function() { + $.ajax({ + type: 'GET', + dataType: "script", + url:$(this).parents("from").attr("href"), + data:$(this).parents("form").serialize() + }); + }); +}); +</script> \ No newline at end of file diff --git a/app/views/admin/module_apps_new_interface/setting.js.erb b/app/views/admin/module_apps_new_interface/setting.js.erb new file mode 100644 index 00000000..0ca148da --- /dev/null +++ b/app/views/admin/module_apps_new_interface/setting.js.erb @@ -0,0 +1,2 @@ +$("#users_checkbox_ary").replaceWith('<%= escape_javascript(render :partial => "privilege_user", :locals => {:users => @users_array})%>'); +permissionCheckbox(); \ No newline at end of file diff --git a/app/views/admin/module_apps_new_interface/update_setting.js.erb b/app/views/admin/module_apps_new_interface/update_setting.js.erb new file mode 100644 index 00000000..7486000a --- /dev/null +++ b/app/views/admin/module_apps_new_interface/update_setting.js.erb @@ -0,0 +1 @@ +alert( "<% flash.each do |key, msg| %><%= msg %><% end%>"); \ No newline at end of file diff --git a/app/views/admin/module_apps_new_interface/user_list.js.erb b/app/views/admin/module_apps_new_interface/user_list.js.erb new file mode 100644 index 00000000..7caf1e39 --- /dev/null +++ b/app/views/admin/module_apps_new_interface/user_list.js.erb @@ -0,0 +1,2 @@ +$('#show_preview').html("<%= escape_javascript(render(:partial => 'modal_list',:locals => {:module_app => @module_app})) %>"); +var start_modal_with_id = "module_app-<%=@module_app.id%>" \ No newline at end of file diff --git a/app/views/admin/object_auths_new_interface/_modal_list.html.erb b/app/views/admin/object_auths_new_interface/_modal_list.html.erb new file mode 100644 index 00000000..04f46511 --- /dev/null +++ b/app/views/admin/object_auths_new_interface/_modal_list.html.erb @@ -0,0 +1,42 @@ +<% if ob_auth -%> + +<div class="modal hide fade in" id="ob_auth-<%=ob_auth.id%>"> + <div class="modal-header"> + <a class="close" data-dismiss="modal">×</a> + <h3><%= t("admin.object_auth.list_title_of_users",:auth_title => ob_auth.title) %></h3> + </div> + <div class="modal-body"> + <div class="clear"> + <% ob_auth.auth_users.each do |user| %> + <div class="checkbox clear checked"> + <div class='member-avatar'> + <% if user.avatar? %> + <%= image_tag(user.avatar.thumb.url,:class => "member-img") %> + <% else %> + <%= image_tag "person.png",:class => "member-img" %> + <% end %> + </div> + <%= label_tag "lab-user-#{user.id}", (user.name rescue ''),:class=>"member-name",:id=>nil -%> + </div> + <% end -%> + <divl> + </div> + <div class="modal-footer"> + <a href="#" class="btn" data-dismiss="modal"><%= t("modal.close") %></a> + </div> + <div> + <script type="text/javascript" src="/static/kernel.js"></script> + <script type="text/javascript"> + $(document).ready(function() { + + $("#ob_auth-<%=ob_auth.id%>").on("show", function () { + }); + $(".modal").on("hidden", function () { + $("#show_preview").remove(); + }); + }); + </script> + </div> +</div> + +<% end -%> \ No newline at end of file diff --git a/app/views/admin/object_auths_new_interface/_privilege_user.html.erb b/app/views/admin/object_auths_new_interface/_privilege_user.html.erb new file mode 100644 index 00000000..90f5cb65 --- /dev/null +++ b/app/views/admin/object_auths_new_interface/_privilege_user.html.erb @@ -0,0 +1,25 @@ +<%= content_tag :div ,:id => "users_checkbox_ary",:class => 'clear' do -%> + <% @sys_users.each do |sys_user| -%> + + <div class="checkblock"> + + <% sys_user.sub_roles.each do |sr| %> + <div class="for_unit" style="display:none;"> <%= sr.key %></div> + <% end %> + <%= content_tag :div,:data=>{'original-title'=>t('announcement.bulletin.approval_setting_window_title'),:content => "#{sys_user.sub_roles.collect{|sr| sr.i18n_variable[I18n.locale]}.join(',')}"},:class=>"checkbox clear" do %> + <div class="check-icon"> + </div> + <div class='member-avatar'> + <% if sys_user.avatar? %> + <%= image_tag(sys_user.avatar.thumb.url,:class => "member-img") %> + <% else %> + <%= image_tag "person.png",:class => "member-img" %> + <% end %> + </div> + <%= label_tag "lab-user-#{sys_user.id}", (sys_user.name rescue ''),:class=>"member-name",:id=>nil -%> + <%= check_box_tag "[users][#{sys_user.id}]", 'true',users.include?(sys_user),:class => "check" -%> + <%end -%> + </div> + + <% end -%> +<% end -%> \ No newline at end of file diff --git a/app/views/admin/object_auths_new_interface/setting.html.erb b/app/views/admin/object_auths_new_interface/setting.html.erb new file mode 100644 index 00000000..ae5096ba --- /dev/null +++ b/app/views/admin/object_auths_new_interface/setting.html.erb @@ -0,0 +1,57 @@ +<% content_for :page_specific_css do %> + <%= stylesheet_link_tag "inc/permission-checkbox" %> +<% end %> +<% content_for :page_specific_javascript do %> + <%= javascript_include_tag "inc/permission-checkbox" %> + <%= javascript_include_tag "inc/search" %> + <%= javascript_include_tag "inc/modal-preview" %> +<% end %> +<%#= label_tag :fact_check_setting, t("announcement.bulletin.fact_check_setting") %> +<%= form_tag('', :remote => true,:class => "prevent_enter_submit_form") %> +<div class="subnav clear"> + <ul class="nav nav-pills filter pull-left"> + <li class="accordion-group"> + <div class="form-search" style="margin: 5px 10px;"> + <%= label_tag :object, @ob_auth.auth_obj.class %> + <%= label_tag :module,"::" %> + <%= select "ob_auth",'id',@options_from_collection_for_select_ob_auth %> + <%= search_field_tag 'user_filter' %> + </div> + + </li> + </ul> + <%= link_to t("admin.object_auth.list_title_of_users",:auth_title => @ob_auth.title), admin_object_auth_ob_auth_show_path , :class=>'preview_trigger btn btn-success pull-right'%> + +</div> +<%#= label_tag :role, t("admin.roles") %> +<div class="clear"> +<%= content_tag :div do -%> + <% form_tag admin_object_auth_ob_auth_path do %> + <%#= render :partial => "privilege_user", :locals => {:users => @users_array} %> + <div class="form-actions form-fixed pagination-right"> + <%= submit_tag "Update", :class => 'btn btn-primary' %> + </div> + <% end -%> +<% end -%> +</div> + +<script type="text/javascript" charset="utf-8"> +var availableTags = []; +$(document).ready(function() { + + $(".prevent_enter_submit_form").bind("keypress", function(e) { + if (e.keyCode == 13) { + return false; + } + }); + + $('#category_id').change(function() { + $.ajax({ + type: 'GET', + dataType: "script", + url:$(this).parents("from").attr("href"), + data:$(this).parents("form").serialize() + }); + }); +}); +</script> \ No newline at end of file diff --git a/app/views/admin/object_auths_new_interface/setting.js.erb b/app/views/admin/object_auths_new_interface/setting.js.erb new file mode 100644 index 00000000..0ca148da --- /dev/null +++ b/app/views/admin/object_auths_new_interface/setting.js.erb @@ -0,0 +1,2 @@ +$("#users_checkbox_ary").replaceWith('<%= escape_javascript(render :partial => "privilege_user", :locals => {:users => @users_array})%>'); +permissionCheckbox(); \ No newline at end of file diff --git a/app/views/admin/object_auths_new_interface/update_setting.js.erb b/app/views/admin/object_auths_new_interface/update_setting.js.erb new file mode 100644 index 00000000..7486000a --- /dev/null +++ b/app/views/admin/object_auths_new_interface/update_setting.js.erb @@ -0,0 +1 @@ +alert( "<% flash.each do |key, msg| %><%= msg %><% end%>"); \ No newline at end of file diff --git a/app/views/admin/object_auths_new_interface/user_list.js.erb b/app/views/admin/object_auths_new_interface/user_list.js.erb new file mode 100644 index 00000000..ebb088cc --- /dev/null +++ b/app/views/admin/object_auths_new_interface/user_list.js.erb @@ -0,0 +1,2 @@ +$('#show_preview').html("<%= escape_javascript(render(:partial => 'modal_list',:locals => {:ob_auth => @ob_auth})) %>"); +var start_modal_with_id = "ob_auth-<%=@ob_auth.id%>" \ No newline at end of file diff --git a/app/views/layouts/_side_bar.html.erb b/app/views/layouts/_side_bar.html.erb index e808427a..7a9bcf4e 100644 --- a/app/views/layouts/_side_bar.html.erb +++ b/app/views/layouts/_side_bar.html.erb @@ -5,29 +5,29 @@ <%= javascript_include_tag "/static/kernel.js" %> <% end %> -<%= content_tag :li, :class => (active_for_controllers('bulletins', '/panel/announcement/back_end/tags', 'bulletin_categorys', 'approvals') || active_sys_call_for_app('new_interface_module_apps','setting','Announcement',:module_app_id) ) do -%> +<%= content_tag :li, :class => (active_for_controllers('bulletins', '/panel/announcement/back_end/tags', 'bulletin_categorys', 'approvals') || active_for_app_auth('Announcement') || active_for_ob_auths_object("BulletinCategory") ) do -%> <%= link_to content_tag(:i, nil, :class => 'icons-announcement') + t('admin.announcement'), panel_announcement_back_end_bulletins_path %> <%= content_tag :ul, :class => ("nav nav-list " + visible_for_controllers('bulletins', '/panel/announcement/back_end/tags', 'bulletin_categorys', 'approvals')) do -%> <%= content_tag :li, link_to(t('announcement.all_articles'), panel_announcement_back_end_bulletins_path), :class => active_for_action('bulletins', 'index') %> <%= content_tag :li, link_to(t('announcement.add_new'), new_panel_announcement_back_end_bulletin_path), :class => active_for_action('bulletins', 'new') %> - <%= content_tag :li, link_to(t('announcement.categories'), panel_announcement_back_end_bulletin_categorys_path), :class => (active_for_action('bulletin_categorys', 'index') || active_for_action('bulletin_category_setting', 'setting')) %> + <%= content_tag :li, link_to(t('announcement.categories'), panel_announcement_back_end_bulletin_categorys_path), :class =>( active_for_action('bulletin_categorys', 'index') || active_for_ob_auths_object("BulletinCategory") ) %> <%= content_tag :li, link_to(t('announcement.tags'), panel_announcement_back_end_tags_path), :class => active_for_action('/panel/announcement/back_end/tags', 'index') %> <%= content_tag :li, link_to(t('announcement.bulletin.approval_setting'), panel_announcement_back_end_approval_setting_path), :class => active_for_action('approvals', 'setting') if (is_manager? rescue nil) %> - <%= content_tag :li, link_to(t('admin.module.authorization'),admin_module_app_manager_auth_proc_path(ModuleApp.first(conditions: {title: "Announcement"}))), :class => active_sys_call_for_app('new_interface_module_apps','setting','Announcement',:module_app_id) if (is_admin? rescue nil) %> + <%= content_tag :li, link_to(t('admin.module.authorization'),admin_module_app_manager_auth_proc_path(ModuleApp.first(conditions: {title: "Announcement"}))), :class => active_for_app_auth('Announcement') if (is_admin? rescue nil) %> <% end -%> <% end -%> -<%= content_tag :li, :class =>( active_for_controllers('news_bulletins', '/panel/news/back_end/tags', 'news_bulletin_categorys', 'news_approvals')|| active_sys_call_for_app('new_interface_module_apps','setting','news',:module_app_id)) do -%> +<%= content_tag :li, :class =>( active_for_controllers('news_bulletins', '/panel/news/back_end/tags', 'news_bulletin_categorys', 'news_approvals')|| active_for_app_auth('news') || active_for_ob_auths_object("NewsBulletinCategory")) do -%> <%= link_to content_tag(:i, nil, :class => 'icons-announcement') + t('admin.news'), panel_news_back_end_news_bulletins_path %> <%= content_tag :ul, :class => ("nav nav-list " + visible_for_controllers('news_bulletins', '/panel/news/back_end/tags', 'news_bulletin_categorys', 'news_approvals')) do -%> <%= content_tag :li, link_to(t('announcement.all_articles'), panel_news_back_end_news_bulletins_path), :class => active_for_action('news_bulletins', 'index') %> <%= content_tag :li, link_to(t('announcement.add_new'), new_panel_news_back_end_news_bulletin_path), :class => active_for_action('news_bulletins', 'new') %> - <%= content_tag :li, link_to(t('announcement.categories'), panel_news_back_end_news_bulletin_categorys_path), :class => (active_for_action('news_bulletin_categorys', 'index') || active_for_action('news_bulletin_category_setting', 'setting'))%> + <%= content_tag :li, link_to(t('announcement.categories'), panel_news_back_end_news_bulletin_categorys_path), :class => active_for_action('news_bulletin_categorys', 'index') || active_for_ob_auths_object("NewsBulletinCategory") %> <%= content_tag :li, link_to(t('announcement.tags'), panel_news_back_end_tags_path), :class => active_for_action('/panel/news/back_end/tags', 'index') %> <%= content_tag :li, link_to(t('announcement.bulletin.approval_setting'), panel_news_back_end_news_approval_setting_path), :class => active_for_action('news_approvals', 'setting') if (is_manager? rescue nil) %> - <%= content_tag :li, link_to(t('admin.module.authorization'),admin_module_app_manager_auth_proc_path(ModuleApp.first(conditions: {key: "news"}))), :class => active_sys_call_for_app('new_interface_module_apps','setting','news',:module_app_id) if (is_admin? rescue nil) %> + <%= content_tag :li, link_to(t('admin.module.authorization'),admin_module_app_manager_auth_proc_path(ModuleApp.first(conditions: {key: "news"}))), :class => active_for_app_auth('news') if (is_admin? rescue nil) %> <% end -%> <% end -%> @@ -47,14 +47,14 @@ <%= link_to content_tag(:i, nil, :class => 'icons-window-block') + t('admin.design'), admin_designs_path %> <% end -%> -<%= content_tag :li, :class => active_for_controllers('ad_banners', 'ad_images') || active_sys_call_for_app('module_apps','edit','ad_banners') do -%> +<%= content_tag :li, :class => active_for_controllers('ad_banners', 'ad_images') || active_for_app_auth('ad_banners') do -%> <%= link_to content_tag(:i, nil, :class => 'icons-link') + t('admin.ad_banner'), admin_ad_banners_path %> <%= content_tag :ul, :class => ("nav nav-list " + visible_for_controllers('ad_banners', 'ad_images') ) do -%> <%#= content_tag :li, link_to(t('admin.ad.all_banners'), admin_ad_banners_path), :class => active_for_action('ad_banners', 'index') %> <%#= content_tag :li, link_to(t('admin.ad.new_banner'), new_admin_ad_banner_path), :class => active_for_action('ad_banners', 'new') %> <%#= content_tag :li, link_to(t('admin.ad.new_image'), new_ad_image_admin_ad_banners_path), :class => active_for_action('ad_images', 'new') %> - <%= content_tag :li, link_to(t('admin.module.authorization'),admin_module_app_manager_auth_proc_path(ModuleApp.first(conditions: {title: "ad_banners"}))), :class => active_sys_call_for_app('new_interface_module_apps','setting','ad_banners',:module_app_id) if (is_admin? rescue nil) %> + <%= content_tag :li, link_to(t('admin.module.authorization'),admin_module_app_manager_auth_proc_path(ModuleApp.first(conditions: {title: "ad_banners"}))), :class => active_for_app_auth('ad_banners') if (is_admin? rescue nil) %> <% end -%> <% end %> diff --git a/config/locales/en.yml b/config/locales/en.yml index 0d0707cc..374b3b33 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -197,6 +197,10 @@ en: new_role: New user role news: News non_multilingual: Non multilingual + object_auth: + list_title_of_users: %{auth_title} Auth List + update_done: Update done,reulst showing in list + update_failed: Update failed options: Options orig_upload_file: Original filename page: Page diff --git a/config/locales/zh_tw.yml b/config/locales/zh_tw.yml index b4d644c7..feb8e83a 100644 --- a/config/locales/zh_tw.yml +++ b/config/locales/zh_tw.yml @@ -191,7 +191,11 @@ zh_tw: new_info: 新增用戶資料 new_role: 新增用戶身份 news: 新聞 - non_multilingual: 非多種語言 + non_multilingual: + object_auth: + list_title_of_users: 授權清單-%{auth_title} + update_done: 更新完成,結果顯示於清單 + update_failed: 更新失敗 options: 選項 orig_upload_file: 原上傳檔名 page: 頁面管理 diff --git a/lib/orbit_core_lib.rb b/lib/orbit_core_lib.rb index b92f4eca..281654a7 100644 --- a/lib/orbit_core_lib.rb +++ b/lib/orbit_core_lib.rb @@ -19,6 +19,10 @@ module OrbitCoreLib end + def pp_object + "Object Auth method 'pp_object' need to be defined for class #{self.class}" + end + def get_object_auth_by_title(title) self.object_auths.where({title: title }).first end diff --git a/vendor/built_in_modules/announcement/app/helpers/panel/announcement/back_end/bulletin_categorys_helper.rb b/vendor/built_in_modules/announcement/app/helpers/panel/announcement/back_end/bulletin_categorys_helper.rb index 1fccbbe1..92604985 100644 --- a/vendor/built_in_modules/announcement/app/helpers/panel/announcement/back_end/bulletin_categorys_helper.rb +++ b/vendor/built_in_modules/announcement/app/helpers/panel/announcement/back_end/bulletin_categorys_helper.rb @@ -10,7 +10,7 @@ include ActionView::Helpers::UrlHelper oa = bulletin_category.get_object_auth_by_title(type) end # link_to t('announcement.bulletin.cate_auth'), edit_admin_object_auth_path(oa) - link_to t('announcement.bulletin.cate_auth'),panel_announcement_back_end_bulletin_category_setting_path(bulletin_category) + link_to t('announcement.bulletin.cate_auth'),admin_object_auth_ob_auth_path(oa) end end \ No newline at end of file diff --git a/vendor/built_in_modules/announcement/app/models/bulletin_category.rb b/vendor/built_in_modules/announcement/app/models/bulletin_category.rb index 7daaf6db..955d5f18 100644 --- a/vendor/built_in_modules/announcement/app/models/bulletin_category.rb +++ b/vendor/built_in_modules/announcement/app/models/bulletin_category.rb @@ -18,6 +18,10 @@ class BulletinCategory has_many :bulletins + def pp_object + i18n_variable[I18n.locale] + end + def self.from_id(id) BulletinCategory.find(id) rescue nil end diff --git a/vendor/built_in_modules/news/app/helpers/panel/news/back_end/news_bulletin_categorys_helper.rb b/vendor/built_in_modules/news/app/helpers/panel/news/back_end/news_bulletin_categorys_helper.rb index 74905640..4b896555 100644 --- a/vendor/built_in_modules/news/app/helpers/panel/news/back_end/news_bulletin_categorys_helper.rb +++ b/vendor/built_in_modules/news/app/helpers/panel/news/back_end/news_bulletin_categorys_helper.rb @@ -10,7 +10,7 @@ include ActionView::Helpers::UrlHelper oa = news_bulletin_category.get_object_auth_by_title(type) end # link_to t('announcement.bulletin.cate_auth'), edit_admin_object_auth_path(oa) -link_to t('announcement.bulletin.cate_auth'),panel_news_back_end_news_bulletin_category_setting_path(news_bulletin_category) + link_to t('announcement.bulletin.cate_auth'),admin_object_auth_ob_auth_path(oa) end diff --git a/vendor/built_in_modules/news/app/models/news_bulletin_category.rb b/vendor/built_in_modules/news/app/models/news_bulletin_category.rb index 45576589..b3dd7bc4 100644 --- a/vendor/built_in_modules/news/app/models/news_bulletin_category.rb +++ b/vendor/built_in_modules/news/app/models/news_bulletin_category.rb @@ -18,6 +18,10 @@ class NewsBulletinCategory has_many :news_bulletins + def pp_object + i18n_variable[I18n.locale] + end + def self.from_id(id) NewsBulletinCategory.find(id) rescue nil end From 7a6d30ad624c6d519baa3f45bd28c62449e0bf36 Mon Sep 17 00:00:00 2001 From: "Matthew K. Fu JuYuan" <matthewfu@gmail.com> Date: Fri, 11 May 2012 16:46:36 +0800 Subject: [PATCH 24/26] Remove unless files and change routes. --- .../new_interface_module_apps_controller.rb | 66 ------------------- .../_modal_list.html.erb | 42 ------------ .../_privilege_user.html.erb | 25 ------- .../setting.html.erb | 56 ---------------- .../new_interface_module_apps/setting.js.erb | 2 - .../update_setting.js.erb | 1 - .../user_list.js.erb | 2 - config/routes.rb | 11 +++- .../bulletin_category_setting_controller.rb | 64 ------------------ .../_privilege_user.html.erb | 25 ------- .../bulletin_category_setting/setting.js.erb | 2 - .../update_setting.js.erb | 1 - .../user_list.js.erb | 2 - .../announcement/config/routes.rb | 6 +- ...ws_bulletin_category_setting_controller.rb | 64 ------------------ .../_privilege_user.html.erb | 25 ------- .../setting.js.erb | 2 - .../update_setting.js.erb | 1 - .../user_list.js.erb | 2 - vendor/built_in_modules/news/config/routes.rb | 6 +- 20 files changed, 10 insertions(+), 395 deletions(-) delete mode 100644 app/controllers/admin/new_interface_module_apps_controller.rb delete mode 100644 app/views/admin/new_interface_module_apps/_modal_list.html.erb delete mode 100644 app/views/admin/new_interface_module_apps/_privilege_user.html.erb delete mode 100644 app/views/admin/new_interface_module_apps/setting.html.erb delete mode 100644 app/views/admin/new_interface_module_apps/setting.js.erb delete mode 100644 app/views/admin/new_interface_module_apps/update_setting.js.erb delete mode 100644 app/views/admin/new_interface_module_apps/user_list.js.erb delete mode 100644 vendor/built_in_modules/announcement/app/controllers/panel/announcement/back_end/bulletin_category_setting_controller.rb delete mode 100644 vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/_privilege_user.html.erb delete mode 100644 vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/setting.js.erb delete mode 100644 vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/update_setting.js.erb delete mode 100644 vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/user_list.js.erb delete mode 100644 vendor/built_in_modules/news/app/controllers/panel/news/back_end/news_bulletin_category_setting_controller.rb delete mode 100644 vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/_privilege_user.html.erb delete mode 100644 vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/setting.js.erb delete mode 100644 vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/update_setting.js.erb delete mode 100644 vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/user_list.js.erb diff --git a/app/controllers/admin/new_interface_module_apps_controller.rb b/app/controllers/admin/new_interface_module_apps_controller.rb deleted file mode 100644 index 8cf77e5e..00000000 --- a/app/controllers/admin/new_interface_module_apps_controller.rb +++ /dev/null @@ -1,66 +0,0 @@ -class Admin::NewInterfaceModuleAppsController < ApplicationController - before_filter :authenticate_user! - before_filter :is_admin? - include AdminHelper - - layout "new_admin" - - def setting - @sys_users = User.all(conditions: {admin: false}) - @module_app = ModuleApp.find(params[:module_app_id]) - @options_from_collection_for_select_bulletin_categorys = [@module_app].collect{|ma| [ma.title,ma.id] } - # if params.has_key? :category - # @bulletin_category = BulletinCategory.find params[:category][:id] - # else - # @bulletin_category = @bulletin_categorys.first - # end - @users_array = @module_app.managing_users rescue [] - - respond_to do |format| - format.html - format.js - end - end - - def update_setting - module_app = update_setting_by_params - if module_app.save! - flash[:notice] = "Update Done" - else - flash[:notice] = "Update Failed" - end - end - - def user_list - @module_app = ModuleApp.find params[:module_app][:id] - end - - protected - def update_setting_by_params - ma = ModuleApp.find params[:module_app][:id] - user_sat = User.find params[:users].keys - users_to_new = user_sat - ma.managing_users - users_to_remove = ma.managing_users - user_sat - - users_to_new.each do |new_user| - ma.assign_manager(new_user,current_user) - end - - users_to_remove.each do |remove_user| - ma.remove_manager(remove_user) - end - ma - end - - def get_categorys(id = nil) - @bulletin_categorys = [] - if(is_manager? || is_admin?) - @bulletin_categorys = (id ? BulletinCategory.find(id).to_a : BulletinCategory.excludes('disabled' => true)) - elsif is_sub_manager? - @bulletin_categorys = BulletinCategory.authed_for_user(current_user,'submit_new') - end - end - - - -end \ No newline at end of file diff --git a/app/views/admin/new_interface_module_apps/_modal_list.html.erb b/app/views/admin/new_interface_module_apps/_modal_list.html.erb deleted file mode 100644 index b5b0ebcd..00000000 --- a/app/views/admin/new_interface_module_apps/_modal_list.html.erb +++ /dev/null @@ -1,42 +0,0 @@ -<% if module_app -%> - -<div class="modal hide fade in" id="module_app-<%=module_app.id%>"> - <div class="modal-header"> - <a class="close" data-dismiss="modal">×</a> - <h3><%= t("admin.user_role.auth.manager") %></h3> - </div> - <div class="modal-body"> - <div class="clear"> - <% module_app.managing_users.each do |user| %> - <div class="checkbox clear checked"> - <div class='member-avatar'> - <% if user.avatar? %> - <%= image_tag(user.avatar.thumb.url,:class => "member-img") %> - <% else %> - <%= image_tag "person.png",:class => "member-img" %> - <% end %> - </div> - <%= label_tag "lab-user-#{user.id}", (user.name rescue ''),:class=>"member-name",:id=>nil -%> - </div> - <% end -%> - <divl> - </div> - <div class="modal-footer"> - <a href="#" class="btn" data-dismiss="modal"><%= t("modal.close") %></a> - </div> - <div> - <script type="text/javascript" src="/static/kernel.js"></script> - <script type="text/javascript"> - $(document).ready(function() { - - $("#module_app-<%=module_app.id%>").on("show", function () { - }); - $(".modal").on("hidden", function () { - $("#show_preview").remove(); - }); - }); - </script> - </div> -</div> - -<% end -%> \ No newline at end of file diff --git a/app/views/admin/new_interface_module_apps/_privilege_user.html.erb b/app/views/admin/new_interface_module_apps/_privilege_user.html.erb deleted file mode 100644 index 90f5cb65..00000000 --- a/app/views/admin/new_interface_module_apps/_privilege_user.html.erb +++ /dev/null @@ -1,25 +0,0 @@ -<%= content_tag :div ,:id => "users_checkbox_ary",:class => 'clear' do -%> - <% @sys_users.each do |sys_user| -%> - - <div class="checkblock"> - - <% sys_user.sub_roles.each do |sr| %> - <div class="for_unit" style="display:none;"> <%= sr.key %></div> - <% end %> - <%= content_tag :div,:data=>{'original-title'=>t('announcement.bulletin.approval_setting_window_title'),:content => "#{sys_user.sub_roles.collect{|sr| sr.i18n_variable[I18n.locale]}.join(',')}"},:class=>"checkbox clear" do %> - <div class="check-icon"> - </div> - <div class='member-avatar'> - <% if sys_user.avatar? %> - <%= image_tag(sys_user.avatar.thumb.url,:class => "member-img") %> - <% else %> - <%= image_tag "person.png",:class => "member-img" %> - <% end %> - </div> - <%= label_tag "lab-user-#{sys_user.id}", (sys_user.name rescue ''),:class=>"member-name",:id=>nil -%> - <%= check_box_tag "[users][#{sys_user.id}]", 'true',users.include?(sys_user),:class => "check" -%> - <%end -%> - </div> - - <% end -%> -<% end -%> \ No newline at end of file diff --git a/app/views/admin/new_interface_module_apps/setting.html.erb b/app/views/admin/new_interface_module_apps/setting.html.erb deleted file mode 100644 index 7d1179f0..00000000 --- a/app/views/admin/new_interface_module_apps/setting.html.erb +++ /dev/null @@ -1,56 +0,0 @@ -<% content_for :page_specific_css do %> - <%= stylesheet_link_tag "inc/permission-checkbox" %> -<% end %> -<% content_for :page_specific_javascript do %> - <%= javascript_include_tag "inc/permission-checkbox" %> - <%= javascript_include_tag "inc/search" %> - <%= javascript_include_tag "inc/modal-preview" %> -<% end %> -<%#= label_tag :fact_check_setting, t("announcement.bulletin.fact_check_setting") %> -<%= form_tag('', :remote => true,:class => "prevent_enter_submit_form") %> -<div class="subnav clear"> - <ul class="nav nav-pills filter pull-left"> - <li class="accordion-group"> - <div class="form-search" style="margin: 5px 10px;"> - <%= label_tag :module, t("module") %> - <%= select "module_app",'id',@options_from_collection_for_select_bulletin_categorys %> - <%= search_field_tag 'user_filter' %> - </div> - - </li> - </ul> - <%= link_to t("admin.user_role.auth.manager"), admin_module_app_manager_auth_show_path , :class=>'preview_trigger btn btn-success pull-right'%> - -</div> -<%#= label_tag :role, t("admin.roles") %> -<div class="clear"> -<%= content_tag :div do -%> - <% form_tag admin_module_app_manager_auth_proc_path do %> - <%= render :partial => "privilege_user", :locals => {:users => @users_array} %> - <div class="form-actions form-fixed pagination-right"> - <%= submit_tag "Update", :class => 'btn btn-primary' %> - </div> - <% end -%> -<% end -%> -</div> - -<script type="text/javascript" charset="utf-8"> -var availableTags = []; -$(document).ready(function() { - - $(".prevent_enter_submit_form").bind("keypress", function(e) { - if (e.keyCode == 13) { - return false; - } - }); - - $('#category_id').change(function() { - $.ajax({ - type: 'GET', - dataType: "script", - url:$(this).parents("from").attr("href"), - data:$(this).parents("form").serialize() - }); - }); -}); -</script> \ No newline at end of file diff --git a/app/views/admin/new_interface_module_apps/setting.js.erb b/app/views/admin/new_interface_module_apps/setting.js.erb deleted file mode 100644 index 0ca148da..00000000 --- a/app/views/admin/new_interface_module_apps/setting.js.erb +++ /dev/null @@ -1,2 +0,0 @@ -$("#users_checkbox_ary").replaceWith('<%= escape_javascript(render :partial => "privilege_user", :locals => {:users => @users_array})%>'); -permissionCheckbox(); \ No newline at end of file diff --git a/app/views/admin/new_interface_module_apps/update_setting.js.erb b/app/views/admin/new_interface_module_apps/update_setting.js.erb deleted file mode 100644 index 7486000a..00000000 --- a/app/views/admin/new_interface_module_apps/update_setting.js.erb +++ /dev/null @@ -1 +0,0 @@ -alert( "<% flash.each do |key, msg| %><%= msg %><% end%>"); \ No newline at end of file diff --git a/app/views/admin/new_interface_module_apps/user_list.js.erb b/app/views/admin/new_interface_module_apps/user_list.js.erb deleted file mode 100644 index 7caf1e39..00000000 --- a/app/views/admin/new_interface_module_apps/user_list.js.erb +++ /dev/null @@ -1,2 +0,0 @@ -$('#show_preview').html("<%= escape_javascript(render(:partial => 'modal_list',:locals => {:module_app => @module_app})) %>"); -var start_modal_with_id = "module_app-<%=@module_app.id%>" \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 63d70d30..d2294c17 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -16,6 +16,11 @@ Orbit::Application.routes.draw do resources :assets resources :app_auths resources :object_auths do + match 'new_interface/:ob_type/:title/new' => "object_auths_new_interface#new" ,:as => :init_ob_auth,:via => :get + match 'new_interface' => "object_auths_new_interface#setting" ,:as => :ob_auth,:via => :get + match 'new_interface' => "object_auths_new_interface#update_setting" ,:as => :ob_auth,:via => :post + match 'new_interface' => "object_auths_new_interface#user_list" ,:as => :ob_auth_show,:via => :put + collection do match 'new/:type/:obj_id',:action => 'new',:via => "get",:as => :init end @@ -62,9 +67,9 @@ Orbit::Application.routes.draw do end end resources :module_apps do - match 'manager_auth_proc' => "new_interface_module_apps#setting" ,:as => :manager_auth_proc,:via => :get - match 'manager_auth_proc' => "new_interface_module_apps#update_setting" ,:as => :manager_auth_proc,:via => :post - match 'manager_auth_proc' => "new_interface_module_apps#user_list" ,:as => :manager_auth_show,:via => :put + match 'manager_auth_proc' => "module_apps_new_interface#setting" ,:as => :manager_auth_proc,:via => :get + match 'manager_auth_proc' => "module_apps_new_interface#update_setting" ,:as => :manager_auth_proc,:via => :post + match 'manager_auth_proc' => "module_apps_new_interface#user_list" ,:as => :manager_auth_show,:via => :put resources :app_auths do member do match 'remove/:type/:target_id' ,:action=> 'remove',:via => "delete",:as =>:remove diff --git a/vendor/built_in_modules/announcement/app/controllers/panel/announcement/back_end/bulletin_category_setting_controller.rb b/vendor/built_in_modules/announcement/app/controllers/panel/announcement/back_end/bulletin_category_setting_controller.rb deleted file mode 100644 index 8903adb2..00000000 --- a/vendor/built_in_modules/announcement/app/controllers/panel/announcement/back_end/bulletin_category_setting_controller.rb +++ /dev/null @@ -1,64 +0,0 @@ -class Panel::Announcement::BackEnd::BulletinCategorySettingController < OrbitBackendController - before_filter :authenticate_user! - before_filter :for_app_manager - include AdminHelper - # layout 'admin' - def preview_and_approve - @bulletin = Bulletin.find params[:bulletin_id] - end - - # def approve - # - # end - - def setting - @sys_users = User.all(conditions: {admin: false}) - @bulletin_categorys = [] - @bulletin_categorys << BulletinCategory.find(params[:bulletin_category_id]) - @options_from_collection_for_select_bulletin_categorys = @bulletin_categorys.collect{|bc| [bc.i18n_variable[I18n.locale],bc.id] } - if params.has_key? :category - @bulletin_category = BulletinCategory.find params[:category][:id] - else - @bulletin_category = @bulletin_categorys.first - end - preload_object_auth = @bulletin_category.object_auths.where(title: 'submit').empty?? (@bulletin_category.object_auths.create! :title=> 'submit') : @bulletin_category.object_auths.where(title: 'submit') - @users_array = preload_object_auth.first.privilege_users rescue [] - respond_to do |format| - format.html - format.js - end - end - - def update_setting - object_auth = update_setting_by_params - if object_auth.save! - flash[:notice] = "Update Done" - else - flash[:notice] = "Update Failed" - end - end - - def user_list - @bulletin_category = BulletinCategory.find params[:category][:id] - end - - protected - def update_setting_by_params - category = BulletinCategory.find params[:category][:id] - privilege_users = params[:users].collect{|key,value| User.find key } rescue [] - object_auth_ary = category.object_auths.where(title: 'submit') || (category.object_auths.create :title=> 'submit') - object_auth = object_auth_ary.first - object_auth.privilege_users = privilege_users - object_auth - end - - def get_categorys(id = nil) - @bulletin_categorys = [] - if(is_manager? || is_admin?) - @bulletin_categorys = (id ? BulletinCategory.find(id).to_a : BulletinCategory.excludes('disabled' => true)) - elsif is_sub_manager? - @bulletin_categorys = BulletinCategory.authed_for_user(current_user,'submit_new') - end - end - -end diff --git a/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/_privilege_user.html.erb b/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/_privilege_user.html.erb deleted file mode 100644 index 90f5cb65..00000000 --- a/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/_privilege_user.html.erb +++ /dev/null @@ -1,25 +0,0 @@ -<%= content_tag :div ,:id => "users_checkbox_ary",:class => 'clear' do -%> - <% @sys_users.each do |sys_user| -%> - - <div class="checkblock"> - - <% sys_user.sub_roles.each do |sr| %> - <div class="for_unit" style="display:none;"> <%= sr.key %></div> - <% end %> - <%= content_tag :div,:data=>{'original-title'=>t('announcement.bulletin.approval_setting_window_title'),:content => "#{sys_user.sub_roles.collect{|sr| sr.i18n_variable[I18n.locale]}.join(',')}"},:class=>"checkbox clear" do %> - <div class="check-icon"> - </div> - <div class='member-avatar'> - <% if sys_user.avatar? %> - <%= image_tag(sys_user.avatar.thumb.url,:class => "member-img") %> - <% else %> - <%= image_tag "person.png",:class => "member-img" %> - <% end %> - </div> - <%= label_tag "lab-user-#{sys_user.id}", (sys_user.name rescue ''),:class=>"member-name",:id=>nil -%> - <%= check_box_tag "[users][#{sys_user.id}]", 'true',users.include?(sys_user),:class => "check" -%> - <%end -%> - </div> - - <% end -%> -<% end -%> \ No newline at end of file diff --git a/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/setting.js.erb b/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/setting.js.erb deleted file mode 100644 index 0ca148da..00000000 --- a/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/setting.js.erb +++ /dev/null @@ -1,2 +0,0 @@ -$("#users_checkbox_ary").replaceWith('<%= escape_javascript(render :partial => "privilege_user", :locals => {:users => @users_array})%>'); -permissionCheckbox(); \ No newline at end of file diff --git a/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/update_setting.js.erb b/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/update_setting.js.erb deleted file mode 100644 index 7486000a..00000000 --- a/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/update_setting.js.erb +++ /dev/null @@ -1 +0,0 @@ -alert( "<% flash.each do |key, msg| %><%= msg %><% end%>"); \ No newline at end of file diff --git a/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/user_list.js.erb b/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/user_list.js.erb deleted file mode 100644 index 4c8bf25d..00000000 --- a/vendor/built_in_modules/announcement/app/views/panel/announcement/back_end/bulletin_category_setting/user_list.js.erb +++ /dev/null @@ -1,2 +0,0 @@ -$('#show_preview').html("<%= escape_javascript(render(:partial => 'modal_list',:locals => {:bulletin_category => @bulletin_category})) %>"); -var start_modal_with_id = "bulletin_category-<%=@bulletin_category.id%>" \ No newline at end of file diff --git a/vendor/built_in_modules/announcement/config/routes.rb b/vendor/built_in_modules/announcement/config/routes.rb index c6a406b0..a9f1c496 100644 --- a/vendor/built_in_modules/announcement/config/routes.rb +++ b/vendor/built_in_modules/announcement/config/routes.rb @@ -21,11 +21,7 @@ Rails.application.routes.draw do match "file_quick_edit/:bulletin_id" => "bulletins#file_quick_edit" ,:as => :file_quick_edit end - resources :bulletin_categorys do - match 'submit_setting' => "bulletin_category_setting#setting" ,:as => :setting,:via => :get - match 'submit_setting' => "bulletin_category_setting#update_setting" ,:as => :setting,:via => :post - match 'submit_setting' => "bulletin_category_setting#user_list" ,:as => :user_list,:via => :put - end + resources :bulletin_categorys resources :bulletin_links, :controller => 'bulletin_links' do match "link_quick_edit/:bulletin_link_id" => "bulletin_links#link_quick_edit" ,:as => :link_quick_edit diff --git a/vendor/built_in_modules/news/app/controllers/panel/news/back_end/news_bulletin_category_setting_controller.rb b/vendor/built_in_modules/news/app/controllers/panel/news/back_end/news_bulletin_category_setting_controller.rb deleted file mode 100644 index 6ac76973..00000000 --- a/vendor/built_in_modules/news/app/controllers/panel/news/back_end/news_bulletin_category_setting_controller.rb +++ /dev/null @@ -1,64 +0,0 @@ -class Panel::News::BackEnd::NewsBulletinCategorySettingController < OrbitBackendController - before_filter :authenticate_user! - before_filter :for_app_manager - include AdminHelper - # layout 'admin' - # def preview_and_approve - # @bulletin = Bulletin.find params[:bulletin_id] - # end - - # def approve - # - # end - - def setting - @sys_users = User.all(conditions: {admin: false}) - @bulletin_categorys = [] - @bulletin_categorys << NewsBulletinCategory.find(params[:news_bulletin_category_id]) - @options_from_collection_for_select_bulletin_categorys = @bulletin_categorys.collect{|bc| [bc.i18n_variable[I18n.locale],bc.id] } - if params.has_key? :category - @bulletin_category = NewsBulletinCategory.find params[:category][:id] - else - @bulletin_category = @bulletin_categorys.first - end - preload_object_auth = @bulletin_category.object_auths.where(title: 'submit').empty?? (@bulletin_category.object_auths.create! :title=> 'submit') : @bulletin_category.object_auths.where(title: 'submit') - @users_array = preload_object_auth.first.privilege_users rescue [] - respond_to do |format| - format.html - format.js - end - end - - def update_setting - object_auth = update_setting_by_params - if object_auth.save! - flash[:notice] = "Update Done" - else - flash[:notice] = "Update Failed" - end - end - - def user_list - @bulletin_category = NewsBulletinCategory.find params[:category][:id] - end - - protected - def update_setting_by_params - category = NewsBulletinCategory.find params[:category][:id] - privilege_users = params[:users].collect{|key,value| User.find key } rescue [] - object_auth_ary = category.object_auths.where(title: 'submit') || (category.object_auths.create :title=> 'submit') - object_auth = object_auth_ary.first - object_auth.privilege_users = privilege_users - object_auth - end - - def get_categorys(id = nil) - @bulletin_categorys = [] - if(is_manager? || is_admin?) - @bulletin_categorys = (id ? NewsBulletinCategory.find(id).to_a : NewsBulletinCategory.excludes('disabled' => true)) - elsif is_sub_manager? - @bulletin_categorys = NewsBulletinCategory.authed_for_user(current_user,'submit_new') - end - end - -end diff --git a/vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/_privilege_user.html.erb b/vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/_privilege_user.html.erb deleted file mode 100644 index 90f5cb65..00000000 --- a/vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/_privilege_user.html.erb +++ /dev/null @@ -1,25 +0,0 @@ -<%= content_tag :div ,:id => "users_checkbox_ary",:class => 'clear' do -%> - <% @sys_users.each do |sys_user| -%> - - <div class="checkblock"> - - <% sys_user.sub_roles.each do |sr| %> - <div class="for_unit" style="display:none;"> <%= sr.key %></div> - <% end %> - <%= content_tag :div,:data=>{'original-title'=>t('announcement.bulletin.approval_setting_window_title'),:content => "#{sys_user.sub_roles.collect{|sr| sr.i18n_variable[I18n.locale]}.join(',')}"},:class=>"checkbox clear" do %> - <div class="check-icon"> - </div> - <div class='member-avatar'> - <% if sys_user.avatar? %> - <%= image_tag(sys_user.avatar.thumb.url,:class => "member-img") %> - <% else %> - <%= image_tag "person.png",:class => "member-img" %> - <% end %> - </div> - <%= label_tag "lab-user-#{sys_user.id}", (sys_user.name rescue ''),:class=>"member-name",:id=>nil -%> - <%= check_box_tag "[users][#{sys_user.id}]", 'true',users.include?(sys_user),:class => "check" -%> - <%end -%> - </div> - - <% end -%> -<% end -%> \ No newline at end of file diff --git a/vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/setting.js.erb b/vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/setting.js.erb deleted file mode 100644 index 0ca148da..00000000 --- a/vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/setting.js.erb +++ /dev/null @@ -1,2 +0,0 @@ -$("#users_checkbox_ary").replaceWith('<%= escape_javascript(render :partial => "privilege_user", :locals => {:users => @users_array})%>'); -permissionCheckbox(); \ No newline at end of file diff --git a/vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/update_setting.js.erb b/vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/update_setting.js.erb deleted file mode 100644 index 7486000a..00000000 --- a/vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/update_setting.js.erb +++ /dev/null @@ -1 +0,0 @@ -alert( "<% flash.each do |key, msg| %><%= msg %><% end%>"); \ No newline at end of file diff --git a/vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/user_list.js.erb b/vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/user_list.js.erb deleted file mode 100644 index 4c8bf25d..00000000 --- a/vendor/built_in_modules/news/app/views/panel/news/back_end/news_bulletin_category_setting/user_list.js.erb +++ /dev/null @@ -1,2 +0,0 @@ -$('#show_preview').html("<%= escape_javascript(render(:partial => 'modal_list',:locals => {:bulletin_category => @bulletin_category})) %>"); -var start_modal_with_id = "bulletin_category-<%=@bulletin_category.id%>" \ No newline at end of file diff --git a/vendor/built_in_modules/news/config/routes.rb b/vendor/built_in_modules/news/config/routes.rb index d718e7d6..5aa7118f 100644 --- a/vendor/built_in_modules/news/config/routes.rb +++ b/vendor/built_in_modules/news/config/routes.rb @@ -20,11 +20,7 @@ Rails.application.routes.draw do match "file_quick_edit/:news_bulletin_id" => "news_bulletins#file_quick_edit" ,:as => :file_quick_edit end - resources :news_bulletin_categorys do - match 'submit_setting' => "news_bulletin_category_setting#setting" ,:as => :setting,:via => :get - match 'submit_setting' => "news_bulletin_category_setting#update_setting" ,:as => :setting,:via => :post - match 'submit_setting' => "news_bulletin_category_setting#user_list" ,:as => :user_list,:via => :put - end + resources :news_bulletin_categorys resources :news_bulletin_links, :controller => 'news_bulletin_links' do match "link_quick_edit/:news_bulletin_link_id" => "news_bulletin_links#link_quick_edit" ,:as => :link_quick_edit From dfd2d82efbf9341640074663c659f43f8f3c6589 Mon Sep 17 00:00:00 2001 From: "Matthew K. Fu JuYuan" <matthewfu@gmail.com> Date: Fri, 11 May 2012 16:56:32 +0800 Subject: [PATCH 25/26] Restart job --- app/jobs/restart_server.rb | 8 ++++++++ config/resque_schedule.yml | 6 ++++++ 2 files changed, 14 insertions(+) create mode 100644 app/jobs/restart_server.rb diff --git a/app/jobs/restart_server.rb b/app/jobs/restart_server.rb new file mode 100644 index 00000000..53167fea --- /dev/null +++ b/app/jobs/restart_server.rb @@ -0,0 +1,8 @@ +class RestartServer + @queue = :high + + def self.perform() + CronMail.time_check("Going to restarting Orbit").deliver + %x[touch #{Rails.root}/tmp/restart] + end +end diff --git a/config/resque_schedule.yml b/config/resque_schedule.yml index 6929152e..60194101 100644 --- a/config/resque_schedule.yml +++ b/config/resque_schedule.yml @@ -10,6 +10,12 @@ nccu_daily_ldap_sync: args: description: Sync NCCU middle site with Orbit for LDAP data +nccu_daily_restart: + cron: * * */3 * * * + class: RestartServer + args: + description: Restart NCCU site + nccu_claender_sync: cron: * * [0,12] * * * class: NccuCalendar From b804ba4d962cf4b38be77bc07db890831f85a210 Mon Sep 17 00:00:00 2001 From: "Matthew K. Fu JuYuan" <matthewfu@gmail.com> Date: Fri, 11 May 2012 17:07:21 +0800 Subject: [PATCH 26/26] Fix for manager and admin can see all post in announcement. Haven't applied to news --- .../announcement/back_end/bulletins_controller.rb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/vendor/built_in_modules/announcement/app/controllers/panel/announcement/back_end/bulletins_controller.rb b/vendor/built_in_modules/announcement/app/controllers/panel/announcement/back_end/bulletins_controller.rb index 7d89183e..325f60f7 100644 --- a/vendor/built_in_modules/announcement/app/controllers/panel/announcement/back_end/bulletins_controller.rb +++ b/vendor/built_in_modules/announcement/app/controllers/panel/announcement/back_end/bulletins_controller.rb @@ -43,10 +43,12 @@ class Panel::Announcement::BackEnd::BulletinsController < OrbitBackendController @bulletin_file = BulletinFile.new @file_url = panel_announcement_back_end_bulletins_path - @bulletins.delete_if{ |bulletin| - bulletin.is_pending == true && (!bulletin.bulletin_category.authed_users('fact_check').include?(current_user) || bulletin.create_user_id!=current_user.id) - } - + if(!is_admin? || !is_manager?) + @bulletins.delete_if{ |bulletin| + bulletin.is_pending == true && (!bulletin.bulletin_category.authed_users('fact_check').include?(current_user) || bulletin.create_user_id!=current_user.id) + } + end + respond_to do |format| format.html # index.html.erb format.js { }