From 0f0e17ef00837f515d77580efab9136e4958fb3b Mon Sep 17 00:00:00 2001 From: manson Date: Mon, 12 May 2014 16:18:35 +0800 Subject: [PATCH] Tags & Categories --- app/assets/javascripts/admin/categories.js | 21 ++ app/assets/javascripts/admin/tags.js | 31 +- app/assets/javascripts/ckeditor/config.js.erb | 6 +- app/assets/javascripts/lib/tags.js.erb | 354 +++++++++--------- .../stylesheets/admin/categories.css.scss | 6 + app/assets/stylesheets/lib/tags-groups.css | 10 + .../admin/categories_controller.rb | 46 +++ app/controllers/admin/tags_controller.rb | 70 ++-- app/helpers/admin/categories_helper.rb | 2 + app/helpers/orbit_backend_helper.rb | 8 + app/helpers/orbit_helper.rb | 18 +- app/views/admin/categories/_category.html.erb | 9 + app/views/admin/categories/_index.html.erb | 22 ++ .../admin/categories/_select_form.html.erb | 56 +++ app/views/admin/categories/index.html.erb | 36 ++ app/views/admin/categories/index.js.erb | 3 + app/views/admin/tags/_index.html.erb | 11 +- app/views/admin/tags/_tag.html.erb | 24 +- app/views/admin/tags/_tag_form.html.erb | 62 +++ app/views/admin/tags/index.html.erb | 62 ++- app/views/admin/tags/index.js.erb | 3 +- app/views/admin/tags/new.html.erb | 1 - config/environment.rb | 19 + config/initializers/orbit_category.rb | 21 ++ config/initializers/orbit_tag.rb | 2 +- config/locales/en.yml | 1 + config/locales/zh_tw.yml | 9 +- config/routes.rb | 28 +- lib/orbit_app/helper/context_link_renderer.rb | 2 +- lib/orbit_app/module/side_bar.rb | 1 + .../thumb_Ruling_Digital-LOGO.jpg | Bin 7532 -> 0 bytes .../admin/categories_controller_test.rb | 7 + test/helpers/admin/categories_helper_test.rb | 4 + 33 files changed, 706 insertions(+), 249 deletions(-) create mode 100644 app/assets/javascripts/admin/categories.js create mode 100644 app/assets/stylesheets/admin/categories.css.scss create mode 100644 app/controllers/admin/categories_controller.rb create mode 100644 app/helpers/admin/categories_helper.rb create mode 100644 app/views/admin/categories/_category.html.erb create mode 100644 app/views/admin/categories/_index.html.erb create mode 100644 app/views/admin/categories/_select_form.html.erb create mode 100644 app/views/admin/categories/index.html.erb create mode 100644 app/views/admin/categories/index.js.erb create mode 100644 app/views/admin/tags/_tag_form.html.erb delete mode 100644 app/views/admin/tags/new.html.erb create mode 100644 config/initializers/orbit_category.rb delete mode 100644 public/assets/bulletin_file/file/535f7fd06d616e3889220000/thumb_Ruling_Digital-LOGO.jpg create mode 100644 test/controllers/admin/categories_controller_test.rb create mode 100644 test/helpers/admin/categories_helper_test.rb diff --git a/app/assets/javascripts/admin/categories.js b/app/assets/javascripts/admin/categories.js new file mode 100644 index 0000000..03cb492 --- /dev/null +++ b/app/assets/javascripts/admin/categories.js @@ -0,0 +1,21 @@ +$(function() { + $.pageslide.closeCallback(function(pageslide, item) { + $('.filter-item').removeClass("active"); + }); + $.pageslide.loadComplete(function(pageslide, item) { + $('.filter-item').removeClass("active"); + item.closest('li').addClass('active'); + if(item.data('id') == 'new') { + resetForm(); + pageslide.find('form').attr('action', '/admin/module_apps/' + item.data('module') + '/categories/'); + pageslide.find('form').attr('method', 'post'); + } + else { + setForm(item.data('form')); + pageslide.find('form').attr('action', '/admin/module_apps/' + item.data('module') + '/categories/' + item.data('id')); + pageslide.find('form').attr('method', 'put'); + console.log(item.data('disable')); + pageslide.find('input[type="checkbox"]').prop( 'checked', item.data('disable') ); + } + }); +}) \ No newline at end of file diff --git a/app/assets/javascripts/admin/tags.js b/app/assets/javascripts/admin/tags.js index 3283b23..54396f4 100644 --- a/app/assets/javascripts/admin/tags.js +++ b/app/assets/javascripts/admin/tags.js @@ -1,21 +1,40 @@ //= require lib/tags $(function() { + $('a[data-toggle="tab"]').click(function (e) { + e.preventDefault(); + $(this).tab('show'); + }); + + // $('#tags-list .filter-item.default .card').click(function(){ + // $('#removeDefaults').attr('rel', "<%= Rails.application.routes.url_helpers.remove_default_admin_tags_path %>" + "?module_app_id=" + $('#module_app_id').val() + "&ids=" + ids); + // $('#removeDefaults').removeClass('hide'); + // console.log("@@"); + // }); + $.pageslide.closeCallback(function(pageslide, item) { $('.filter-item').removeClass("active"); }); + $.pageslide.loadComplete(function(pageslide, item) { + $('.filter-item').removeClass("active"); + item.closest('li').addClass('active'); + + if(item.hasClass('btn')) { + $('#filter-default-tag').fastLiveFilter('.add-default-tags-list', '.filter-item', '.tag'); + } + if(item.data('id') == 'new') { resetForm(); - pageslide.find('form').attr('action', '/admin/tags/'); - pageslide.find('form').attr('method', 'post'); - } - else { + pageslide.find('form:eq(0)').attr('action', window.location.pathname); + pageslide.find('form:eq(0)').attr('method', 'post'); + }else { setForm(item.data('form')); - pageslide.find('form').attr('action', '/admin/tags/' + item.data('id')); - pageslide.find('form').attr('method', 'put'); + pageslide.find('form:eq(0)').attr('action', window.location.pathname + '/' + item.data('id')); + pageslide.find('form:eq(0)').attr('method', 'put'); } + }); }) \ No newline at end of file diff --git a/app/assets/javascripts/ckeditor/config.js.erb b/app/assets/javascripts/ckeditor/config.js.erb index 199ec32..1fe6b38 100644 --- a/app/assets/javascripts/ckeditor/config.js.erb +++ b/app/assets/javascripts/ckeditor/config.js.erb @@ -26,9 +26,9 @@ CKEDITOR.editorConfig = function( config ) { // config.filebrowserImageBrowseUrl = '/browser/browse.php?type=Images'; // config.filebrowserUploadUrl = '/uploader/upload.php'; - config.filebrowserBrowseUrl = "<%= Rails.application.routes.url_helpers.admin_assets_path(:module_app_id=>ModuleApp.where(:key=>'asset').first.id) %>"; - config.filebrowserImageBrowseUrl = "<%= Rails.application.routes.url_helpers.admin_assets_path(:type=>'image',:module_app_id=>ModuleApp.where(:key=>'asset').first.id) %>"; - // config.filebrowserUploadUrl = "<%= Rails.application.routes.url_helpers.file_upload_admin_assets_path %>"; + config.filebrowserBrowseUrl = "<%= Rails.application.routes.url_helpers.admin_assets_path(:module_app_id=>ModuleApp.where(:key=>'asset').first.id) rescue '' %>"; + config.filebrowserImageBrowseUrl = "<%= Rails.application.routes.url_helpers.admin_assets_path(:type=>'image',:module_app_id=>ModuleApp.where(:key=>'asset').first.id) rescue '' %>"; + // config.filebrowserUploadUrl = "<%#= Rails.application.routes.url_helpers.file_upload_admin_assets_path %>"; // config.contentsCss = '/orbit_4.0.1/assets/javascripts/lib/ckeditor/plugins/stylesheetparser/samples/assets/sample.css'; diff --git a/app/assets/javascripts/lib/tags.js.erb b/app/assets/javascripts/lib/tags.js.erb index b24d0d2..9cdc70b 100755 --- a/app/assets/javascripts/lib/tags.js.erb +++ b/app/assets/javascripts/lib/tags.js.erb @@ -1,207 +1,209 @@ function checkTagsQuantity() { - var $tagLead = $('.tag-lead'), - $tagsGroups = $('.tags-groups'); + var $tagLead = $('.tag-lead'), + $tagsGroups = $('.tags-groups'); - $tagsGroups.each(function(i) { - var $children = $(this).children().length; - $tagLead.eq(i).children('.badge').text($children); - }) + $tagsGroups.each(function(i) { + var $children = $(this).children().length; + $tagLead.eq(i).children('.badge').text($children); + }) } function checkedLength() { - var $tagsList = $('#tags-list'), - $moduleTags, - $defaultTags, - $toDefault; - function reload_links() { - if($('.default-tags').length) { - $moduleTags = $('.module-tags input[type="checkbox"]:checked'); - $defaultTags = $('.default-tags input[type="checkbox"]:checked'); + var $tagsList = $('#tags-list'), + $moduleTags, + $defaultTags, + $toDefault; + function reload_links() { + if($('.default-tags').length) { + $moduleTags = $('.module-tags input[type="checkbox"]:checked'); + $defaultTags = $('.default-tags input[type="checkbox"]:checked'); - if($moduleTags.length > 1 || $moduleTags.length+$defaultTags.length > 1) { - $('#mergerTags').removeClass('hide'); - } else { - $('#mergerTags').addClass('hide'); - }; + if($moduleTags.length > 1 || $moduleTags.length+$defaultTags.length > 1) { + $('#mergerTags').removeClass('hide'); + } else { + $('#mergerTags').addClass('hide'); + }; + } else { + $moduleTags = $('li.module input[type="checkbox"]:checked'); + $defaultTags = $('li.default input[type="checkbox"]:checked'); - if ($moduleTags.length > 0 || $defaultTags.length > 0) { - $('#deselect').removeClass('hide'); - var ids = new Array(); - $defaultTags.each(function(i) { - ids.push($defaultTags.eq(i).parent().siblings('.tag_id').val()); - }); - $moduleTags.each(function(i) { - ids.push($moduleTags.eq(i).parent().siblings('.tag_id').val()); - }); - $('#deleteTags').attr('rel', "<%= Rails.application.routes.url_helpers.delete_tags_admin_tags_path %>" + "?ids=" + ids); - $('#deleteTags').removeClass('hide'); - $('#deselect').on('click', deselect); - } else { - $('#deselect').addClass('hide'); - $('#deleteTags').attr('rel', ""); - $('#deleteTags').addClass('hide'); - $('#deselect').off('click', deselect); - }; + if($defaultTags.length > 0 || $moduleTags.length > 0) { + $('#deselect').removeClass('hide'); + $('#deselect').on('click', deselect); + if($defaultTags.length > 0 && $moduleTags.length > 0) { + $('#deleteTags').attr('rel', ""); + $('#deleteTags').addClass('hide'); + $('#removeDefaults').attr('rel', ""); + $('#removeDefaults').addClass('hide'); + $('#mergerTags').addClass('hide'); + } else if ($defaultTags.length > 0) { + var ids = new Array(); + $defaultTags.each(function(i) { + ids.push($defaultTags.eq(i).parent().siblings('.tag_id').val()); + }); + $('#removeDefaults').attr('href', "<%= Rails.application.routes.url_helpers.remove_default_admin_tags_path %>" + "?module_app_id=" + $('#module_app_id').val() + "&ids=" + ids); + $('#removeDefaults').removeClass('hide'); + } else { + var ids = new Array(); + $moduleTags.each(function(i) { + ids.push($moduleTags.eq(i).parent().siblings('.tag_id').val()); + }); + $('#deleteTags').attr('rel', "<%= Rails.application.routes.url_helpers.delete_tags_admin_tags_path %>" + "?ids=" + ids); + $('#deleteTags').removeClass('hide'); + if($moduleTags.length > 1) { + $('#mergerTags').removeClass('hide'); + } else { + $('#mergerTags').addClass('hide'); + }; + }; + } else { + $('#deselect').addClass('hide'); + $('#deleteTags').attr('rel', ""); + $('#deleteTags').addClass('hide'); + $('#removeDefaults').attr('rel', ""); + $('#removeDefaults').addClass('hide'); + $('#mergerTags').addClass('hide'); + $('#deselect').off('click', deselect); + }; + }; - if ($moduleTags.length > 0 && $defaultTags.length == 0) { - var ids = new Array(); - $moduleTags.each(function(i) { - ids.push($moduleTags.eq(i).parent().siblings('.tag_id').val()); - }); - $('#addDefault').attr('href', "<%= Rails.application.routes.url_helpers.add_to_default_admin_tags_path %>" + "?ids=" + ids); - $('#addDefault').removeClass('hide'); - } else { - $('#addDefault').attr('href', ""); - $('#addDefault').addClass('hide'); - }; - } else { - $moduleTags = $('.module-tags li.module input[type="checkbox"]:checked'); - $defaultTags = $('.module-tags li.default input[type="checkbox"]:checked'); - if($defaultTags.length > 0 || $moduleTags.length > 0) { - $('#deselect').removeClass('hide'); - $('#deselect').on('click', deselect); - if($defaultTags.length > 0 && $moduleTags.length > 0) { - $('#deleteTags').attr('rel', ""); - $('#deleteTags').addClass('hide'); - $('#removeDefaults').attr('rel', ""); - $('#removeDefaults').addClass('hide'); - $('#mergerTags').addClass('hide'); - } else if ($defaultTags.length > 0) { - var ids = new Array(); - $defaultTags.each(function(i) { - ids.push($defaultTags.eq(i).parent().siblings('.tag_id').val()); - }); - $('#removeDefaults').attr('rel', "<%= Rails.application.routes.url_helpers.remove_default_admin_tags_path %>" + "?module_app_id=" + $('#module_app_id').val() + "&ids=" + ids); - $('#removeDefaults').removeClass('hide'); - } else { - var ids = new Array(); - $moduleTags.each(function(i) { - ids.push($moduleTags.eq(i).parent().siblings('.tag_id').val()); - }); - $('#deleteTags').attr('rel', "<%= Rails.application.routes.url_helpers.delete_tags_admin_tags_path %>" + "?module_app_id=" + $('#module_app_id').val() + "&ids=" + ids); - $('#deleteTags').removeClass('hide'); - if($moduleTags.length > 1) { - $('#mergerTags').removeClass('hide'); - } else { - $('#mergerTags').addClass('hide'); - }; - }; - } else { - $('#deselect').addClass('hide'); - $('#deleteTags').attr('rel', ""); - $('#deleteTags').addClass('hide'); - $('#removeDefaults').attr('rel', ""); - $('#removeDefaults').addClass('hide'); - $('#mergerTags').addClass('hide'); - $('#deselect').off('click', deselect); - }; - }; - } - $tagsList.delegate('.card', 'click', function() { - reload_links(); - }); - $('#selectAllTags').on('click', function() { - $('.filter-item:not(".mark") input[type="checkbox"]').attr('checked', true); - $('.filter-item:not(".mark") .card').addClass('active'); - reload_links(); - }); - $('#deleteTags').on('click', function() { - $('#delete_tags .tags-groups').empty(); + if ($moduleTags.length > 0 && $defaultTags.length == 0) { + var ids = new Array(); + $moduleTags.each(function(i) { + ids.push($moduleTags.eq(i).parent().siblings('.tag_id').val()); + }); + $('#addDefault').attr('href', "<%= Rails.application.routes.url_helpers.add_to_default_admin_tags_path %>" + "?ids=" + ids); + $('#addDefault').removeClass('hide'); + } else { + $('#addDefault').attr('href', ""); + $('#addDefault').addClass('hide'); + }; + + if ($moduleTags.length > 0 || $defaultTags.length > 0) { + $('#deselect').removeClass('hide'); + var ids = new Array(); + $defaultTags.each(function(i) { + ids.push($defaultTags.eq(i).parent().siblings('.tag_id').val()); + }); + + $moduleTags.each(function(i) { + ids.push($moduleTags.eq(i).parent().siblings('.tag_id').val()); + }); + $('#deleteTags').attr('rel', "<%= Rails.application.routes.url_helpers.delete_tags_admin_tags_path %>" + "?ids=" + ids); + $('#deleteTags').removeClass('hide'); + $('#deselect').on('click', deselect); + } else { + $('#deselect').addClass('hide'); + $('#deleteTags').attr('rel', ""); + $('#deleteTags').addClass('hide'); + $('#deselect').off('click', deselect); + }; + } + $tagsList.delegate('.card', 'click', function() { + reload_links(); + }); + $('#selectAllTags').on('click', function() { + $('.filter-item:not(".mark") input[type="checkbox"]').attr('checked', true); + $('.filter-item:not(".mark") .card').addClass('active'); + reload_links(); + }); + $('#deleteTags').on('click', function() { + $('#delete_tags .tags-groups').empty(); $('#delete_tags a.delete-tags').attr("href", $(this).attr("rel")); if($defaultTags) { - $defaultTags.each(function(i) { - $defaultTags.eq(i).parents('.filter-item').clone().appendTo('#delete_tags .tags-groups'); - $('#delete_tags .tags-groups .filter-item').addClass('def'); - }); - } - $moduleTags.each(function(i) { - $moduleTags.eq(i).parents('.filter-item').clone().appendTo('#delete_tags .tags-groups'); - }); + $defaultTags.each(function(i) { + $defaultTags.eq(i).parents('.filter-item').clone().appendTo('#delete_tags .tags-groups'); + $('#delete_tags .tags-groups .filter-item').addClass('def'); + }); + } + $moduleTags.each(function(i) { + $moduleTags.eq(i).parents('.filter-item').clone().appendTo('#delete_tags .tags-groups'); + }); $('#delete_tags').modal('show', cleanTagInputs()); function cleanTagInputs(){ - var $tagsDelete = $('#delete_tags'), - $filterItem = $tagsDelete.find('.filter-item'); - $filterItem.find('.card, .amount').remove(); - $filterItem.find('a').removeAttr('class'); - $filterItem.find('a').removeAttr('href'); + var $tagsDelete = $('#delete_tags'), + $filterItem = $tagsDelete.find('.filter-item'); + $filterItem.find('.card, .amount').remove(); + $filterItem.find('a').removeAttr('class'); + $filterItem.find('a').removeAttr('href'); } - }); - $('#mergerTags').on('click', function() { - if($moduleTags || $defaultTags) { - if($moduleTags.length > 1 || $moduleTags.length+$defaultTags.length > 1) { - $('#tags-merger form').attr("action", $(this).attr("rel")); - mergerTags() - } - } - }); - $('#removeDefaults').on('click', function() { - $('#remove_defaults .tags-groups').empty(); + }); + $('#mergerTags').on('click', function() { + if($moduleTags || $defaultTags) { + if($moduleTags.length > 1 || $moduleTags.length+$defaultTags.length > 1) { + $('#tags-merger form').attr("action", $(this).attr("rel")); + mergerTags() + } + } + }); + $('#removeDefaults').on('click', function() { + $('#remove_defaults .tags-groups').empty(); $('#remove_defaults a.remove-defaults').attr("href", $(this).attr("rel")); - $defaultTags.each(function(i) { - $defaultTags.eq(i).parents('.filter-item').clone().appendTo('#remove_defaults .tags-groups'); - }); + $defaultTags.each(function(i) { + $defaultTags.eq(i).parents('.filter-item').clone().appendTo('#remove_defaults .tags-groups'); + }); $('#remove_defaults').modal('show', cleanTagInputs()); function cleanTagInputs(){ - var $removeDefaults = $('#remove_defaults'), - $filterItem = $removeDefaults.find('.filter-item'); - $filterItem.find('.card, .amount').remove(); - $filterItem.find('a').removeAttr('class'); - $filterItem.find('a').removeAttr('href'); + var $removeDefaults = $('#remove_defaults'), + $filterItem = $removeDefaults.find('.filter-item'); + $filterItem.find('.card, .amount').remove(); + $filterItem.find('a').removeAttr('class'); + $filterItem.find('a').removeAttr('href'); } - }); + }); - function deselect() { - $('.tags input[type="checkbox"]').attr('checked', false); - $('.card').removeClass('active'); - $('.bottomnav .toggable').not('.open-slide').addClass('hide'); - $('#deleteTags').attr('rel', "<%= Rails.application.routes.url_helpers.delete_tags_admin_tags_path %>"); - $('#addDefault').attr('href', "<%= Rails.application.routes.url_helpers.add_to_default_admin_tags_path %>"); - } + function deselect() { + $('.tags input[type="checkbox"]').attr('checked', false); + $('.card').removeClass('active'); + $('.bottomnav .toggable').not('.open-slide').addClass('hide'); + $('#deleteTags').attr('rel', "<%= Rails.application.routes.url_helpers.delete_tags_admin_tags_path %>"); + $('#addDefault').attr('href', "<%= Rails.application.routes.url_helpers.add_to_default_admin_tags_path %>"); + } } function addTagsTab() { - $('a[data-toggle="tab"]').click(function (e) { - e.preventDefault(); - $(this).tab('show'); - }) + $('a[data-toggle="tab"]').click(function (e) { + e.preventDefault(); + $(this).tab('show'); + }) } function mergerTags() { - var $moduleTags = $('.module-tags input[type="checkbox"]:checked'), - $defaultTags = $('.default-tags input[type="checkbox"]:checked'); + var $moduleTags = $('.module-tags input[type="checkbox"]:checked'), + $defaultTags = $('.default-tags input[type="checkbox"]:checked'); - $defaultTags.each(function(i) { - $defaultTags.eq(i).parents('.filter-item').clone().appendTo('#tags-merger .tags-groups'); - $('#tags-merger .tags-groups .filter-item').addClass('def'); - }); - $moduleTags.each(function(i) { - $moduleTags.eq(i).parents('.filter-item').clone().appendTo('#tags-merger .tags-groups'); - }); + $defaultTags.each(function(i) { + $defaultTags.eq(i).parents('.filter-item').clone().appendTo('#tags-merger .tags-groups'); + $('#tags-merger .tags-groups .filter-item').addClass('def'); + }); + $moduleTags.each(function(i) { + $moduleTags.eq(i).parents('.filter-item').clone().appendTo('#tags-merger .tags-groups'); + }); - $('#tags-merger').modal('show', changeTagName()); - function changeTagName() { - var $tagsMerger = $('#tags-merger'), - $newTagsName = $('.new-tags-name'), - $filterItem = $tagsMerger.find('.filter-item'); - $filterItem.find('.card, .amount').remove(); - $filterItem.find('a').removeAttr('class'); - $filterItem.find('a').removeAttr('href'); - $filterItem.on('click', function() { - $(this).find('.tag').each(function(i) { - $newTagsName.eq(i).val($(this).text()) - }); - }); - } + $('#tags-merger').modal('show', changeTagName()); + function changeTagName() { + var $tagsMerger = $('#tags-merger'), + $newTagsName = $('.new-tags-name'), + $filterItem = $tagsMerger.find('.filter-item'); + $filterItem.find('.card, .amount').remove(); + $filterItem.find('a').removeAttr('class'); + $filterItem.find('a').removeAttr('href'); + $filterItem.on('click', function() { + $(this).find('.tag').each(function(i) { + $newTagsName.eq(i).val($(this).text()) + }); + }); + } } $(function() { - if($('.default-tags').length) { - checkedLength(); - $('#tags-merger').on('hidden', function () { - $(this).find('.filter-item').remove(); - }); - } else { - checkedLength(); - }; + if($('.default-tags').length) { + checkedLength(); + $('#tags-merger').on('hidden', function () { + $(this).find('.filter-item').remove(); + }); + } else { + checkedLength(); + }; }); diff --git a/app/assets/stylesheets/admin/categories.css.scss b/app/assets/stylesheets/admin/categories.css.scss new file mode 100644 index 0000000..42f3561 --- /dev/null +++ b/app/assets/stylesheets/admin/categories.css.scss @@ -0,0 +1,6 @@ +// Place all the styles related to the admin/categories controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ +/* + *= require lib/tags-groups +*/ \ No newline at end of file diff --git a/app/assets/stylesheets/lib/tags-groups.css b/app/assets/stylesheets/lib/tags-groups.css index dff88fc..a1d47f1 100644 --- a/app/assets/stylesheets/lib/tags-groups.css +++ b/app/assets/stylesheets/lib/tags-groups.css @@ -55,6 +55,16 @@ .tags-groups li.active .amount { color: #8cb8be; } +.tags-groups li.add { + background-color: #cccccc; + cursor: pointer; +} +.tags-groups li.add a{ + color: #333333; +} +.tags-groups li.disabled { + background-color: #707070; +} .tags-groups li a { text-decoration: none; color: #ededed; diff --git a/app/controllers/admin/categories_controller.rb b/app/controllers/admin/categories_controller.rb new file mode 100644 index 0000000..9480e21 --- /dev/null +++ b/app/controllers/admin/categories_controller.rb @@ -0,0 +1,46 @@ +class Admin::CategoriesController < OrbitAdminController + before_action :setup_vars + + def index + unless @module_app.nil? + @categories = Kaminari.paginate_array(@module_app.categories).page(params[:page]).per(10) + end + end + + def create + category = @module_app.categories.build(category_params) + category.save + redirect_to request.referer, :status => 303 + end + + def create_in_form + @category = @module_app.categories.build(category_params) + @category.save + render :json => {:id=>@category.id.to_s, :title=>@category.title}.to_json ,:layout => false + end + + def update + @category = Category.find(params[:id]) + @category.update_attributes(category_params) + redirect_to request.referer, :status => 303 + end + + def toggle + category = Category.find(params[:id]) + category.disable = category.disable ? false : true + category.save! + redirect_to request.referer, :status => 303 + end + + private + + def setup_vars + @module_apps = params[:module_app_id].blank? ? ModuleApp.where(categorizable: true) : [ModuleApp.find(params[:module_app_id])] + @module_app = params[:module_app_id].blank? ? ModuleApp.find_by(:key=>'category') : ModuleApp.find(params[:module_app_id]) + end + + def category_params + params.require(:category).permit! + end + +end diff --git a/app/controllers/admin/tags_controller.rb b/app/controllers/admin/tags_controller.rb index 513c250..e991bd2 100644 --- a/app/controllers/admin/tags_controller.rb +++ b/app/controllers/admin/tags_controller.rb @@ -1,39 +1,31 @@ -class Admin::TagsController < ApplicationController +class Admin::TagsController < OrbitAdminController before_filter :setup_vars - layout "back_end" - def index @tag = Tag.new - @tags = Tag.where(:is_default=>true) - @module_apps = ModuleApp.where(taggable: true) - end - - def new - @tag = Tag.new - render layout: false - end - - def edit - @tag = Tag.find(params[:id]) - render layout: false + @tags = @is_module_tag ? @module_app.tags.where(:is_default=>true) : Tag.where(:is_default=>true) + @default_tags = Tag.where(:is_default=>true).not_in(:id => @module_app.tag_ids) end def create - @tag = Tag.new(tag_params.merge(is_default: true)) - if @tag.save - redirect_to admin_tags_url - else - @tag = Tag.new(tag_params) - flash.now[:error] = t('create.error.tag') - render :action => "new" - end + @tag = Tag.new(tag_params.merge(is_default: !@is_module_tag)) + if @tag.save + @module_app.tags << @tag if @is_module_tag + end + redirect_to request.referer, :status => 303 + end + + def create_in_form + @tag = Tag.new(tag_params.merge(is_default: !@is_module_tag)) + @tag.save + @module_app.tags << @tag + render :json => {:id=>@tag.id.to_s, :name=>@tag.name}.to_json ,:layout => false end def update @tag = Tag.find(params[:id]) if @tag.update_attributes(tag_params) - redirect_to action: :index, :status => 303 + redirect_to request.referer, :status => 303 else flash.now[:error] = t('update.error.tag') render :action => "edit" @@ -45,7 +37,15 @@ class Admin::TagsController < ApplicationController if tags tags.each(&:destroy) end - redirect_to admin_tags_url + redirect_to request.referer, :status => 303 + end + + def add_from_default + tags = Tag.find(params[:ids].split(',')) rescue nil + if tags + @module_app.tags << tags + end + redirect_to request.referer, :status => 303 end def add_to_default @@ -55,7 +55,17 @@ class Admin::TagsController < ApplicationController tag.update_attribute(:is_default, true) end end - redirect_to admin_tags_url + redirect_to request.referer, :status => 303 + end + + def remove_default + tags = Tag.find(params[:ids].split(',')) rescue nil + if tags + tags.each do |tag| + tag.update_attribute(:is_default, false) + end + end + redirect_to request.referer, :status => 303 end def merge @@ -88,17 +98,19 @@ class Admin::TagsController < ApplicationController new_tag.save - redirect_to admin_tags_url + redirect_to request.referer, :status => 303 end def tag_params - params.require(:tag).permit! + params.require(:tag).permit! unless params[:tag].blank? end protected def setup_vars - @module_app = ModuleApp.where(:key=>"tag").first + @is_module_tag = !params[:module_app_id].blank? + @module_apps = @is_module_tag ? [ModuleApp.find(params[:module_app_id])] : ModuleApp.where(categorizable: true) + @module_app = @is_module_tag ? ModuleApp.find(params[:module_app_id]) : ModuleApp.find_by(:key=>'tag') end end \ No newline at end of file diff --git a/app/helpers/admin/categories_helper.rb b/app/helpers/admin/categories_helper.rb new file mode 100644 index 0000000..f586acd --- /dev/null +++ b/app/helpers/admin/categories_helper.rb @@ -0,0 +1,2 @@ +module Admin::CategoriesHelper +end diff --git a/app/helpers/orbit_backend_helper.rb b/app/helpers/orbit_backend_helper.rb index 3691b0d..75857e8 100644 --- a/app/helpers/orbit_backend_helper.rb +++ b/app/helpers/orbit_backend_helper.rb @@ -78,6 +78,14 @@ module OrbitBackendHelper def is_filter_active?(field, value) params[:filters][field].include?(value.to_s) ? "active" : "" rescue "" end + + def select_category(f, module_app) + render :partial => '/admin/categories/select_form', :locals => {:f=> f, :module_app=>module_app } + end + + def select_tag(f, module_app, object) + render :partial => '/admin/tags/tag_form', :locals => {:f=> f, :module_app=>module_app, :object=>object } + end end diff --git a/app/helpers/orbit_helper.rb b/app/helpers/orbit_helper.rb index 1e81311..7733818 100644 --- a/app/helpers/orbit_helper.rb +++ b/app/helpers/orbit_helper.rb @@ -82,11 +82,19 @@ module OrbitHelper res << "
  • #{params[:type].underscore.humanize.capitalize} #{t(:authorization_)}
  • " end when 'categories' - res << "
  • #{@module_app.title}#{divider}
  • " - res << "
  • #{t(:categories)}
  • " - when 'module_tags' - res << "
  • #{@module_app.title}#{divider}
  • " - res << "
  • #{t(:tags)}
  • " + if @module_app.key!='category' + res << "
  • #{@module_app.title}#{divider}
  • " + res << "
  • #{t(:categories)}
  • " + else + res << "
  • #{@module_app.title}
  • " + end + when 'tags' + if @module_app.key!='tag' + res << "
  • #{@module_app.title}#{divider}
  • " + res << "
  • #{t(:tags)}
  • " + else + res << "
  • #{@module_app.title}
  • " + end else if params[:action].eql?('index') res << "
  • #{@module_app.title}
  • " diff --git a/app/views/admin/categories/_category.html.erb b/app/views/admin/categories/_category.html.erb new file mode 100644 index 0000000..6a07e3c --- /dev/null +++ b/app/views/admin/categories/_category.html.erb @@ -0,0 +1,9 @@ +
  • "> + <%= hidden_field_tag "ids[]", category.id, class: "category_id" %> + <%= link_to '#', class: "open-slide", data: {title: t(:edit_category), id: category.id.to_s, module: @mod.id.to_s, form: category.title_translations, disable: category.disable} do %> + <% if category.disable %> + + <% end %> + <%= category.title_translations.values.join(" / ") %> + <% end %> +
  • \ No newline at end of file diff --git a/app/views/admin/categories/_index.html.erb b/app/views/admin/categories/_index.html.erb new file mode 100644 index 0000000..b3ab042 --- /dev/null +++ b/app/views/admin/categories/_index.html.erb @@ -0,0 +1,22 @@ + +
    +
    + <% @module_apps.each do |mod| %> + <% + @mod = mod + categories = mod.categories + %> + <% icon_name = OrbitApp::Module::Registration.find_by_key(mod.key).get_icon_class rescue 'icons-daniel-bruce-2' %> +

    <%= mod.title %> <%= categories.count %>

    +
      +
    • + <%= link_to '#', class: "open-slide", data: {title: t(:add_category), id: 'new', module: mod.id.to_s} do %> + <%= t(:new_) %> + <% end %> +
    • + <%= render partial: "category", collection: categories %> +
    + <% end %> +
    +
    + \ No newline at end of file diff --git a/app/views/admin/categories/_select_form.html.erb b/app/views/admin/categories/_select_form.html.erb new file mode 100644 index 0000000..beb9227 --- /dev/null +++ b/app/views/admin/categories/_select_form.html.erb @@ -0,0 +1,56 @@ + + <%= f.select :category_id, module_app.categories.collect{|t| [ t.title, t.id ]} %> + + + + + + \ No newline at end of file diff --git a/app/views/admin/categories/index.html.erb b/app/views/admin/categories/index.html.erb new file mode 100644 index 0000000..04a7e12 --- /dev/null +++ b/app/views/admin/categories/index.html.erb @@ -0,0 +1,36 @@ +
    + <%= render 'index' %> +
    + +
    +
    + + + + +
    +
    +
    +
    + <%= form_for :category, url: nil, remote: true do |f| %> +
    + <%= f.fields_for :title_translations do |f| %> + <% Site.first.in_use_locales.each do |locale| %> + <%= label_tag "name-#{locale}", "#{t(:name)} (#{t(locale)})" %> + <%= f.text_field locale, :class => 'input-large', :value => (@category.title_translations[locale] rescue ''), placeholder: t(:name), id: locale %> + <% end %> + <% end %> + <%= label_tag "disable" do %> + <%= f.check_box :disable %> + <%= t(:disable) %> + <% end %> +
    + <%= t(:cancel) %> + <%= f.submit t(:submit), class: 'btn btn-primary btn-small' %> +
    +
    + <% end %> +
    +
    +
    +
    \ No newline at end of file diff --git a/app/views/admin/categories/index.js.erb b/app/views/admin/categories/index.js.erb new file mode 100644 index 0000000..641d1fa --- /dev/null +++ b/app/views/admin/categories/index.js.erb @@ -0,0 +1,3 @@ +$("#categories_index").html("<%= j render 'index' %>") +$.pageslide.close(); +openSlide(); \ No newline at end of file diff --git a/app/views/admin/tags/_index.html.erb b/app/views/admin/tags/_index.html.erb index 057ce16..955dd71 100644 --- a/app/views/admin/tags/_index.html.erb +++ b/app/views/admin/tags/_index.html.erb @@ -5,6 +5,7 @@ <%= link_to t(:delete_), '#', id: "deleteTags", class: "btn btn-danger toggable hide", rel: '' %> <%= link_to t(:merge), '#', id: "mergerTags", class: "btn btn-success toggable hide", rel: merge_admin_tags_path %> + <%= link_to t(:remove_default), '#', id: "removeDefaults", class: "btn btn-info toggable hide", method: :post, remote: true %> <%= link_to t(:add_to_default), add_to_default_admin_tags_path, id: "addDefault", class: "btn btn-info toggable hide", method: :post, remote: true %> <%= link_to content_tag(:i, nil, class: "icons-plus") + " " + t(:add), '#', class: "btn btn-primary open-slide", data: {title: t('new.tag'), id: 'new'} %> @@ -14,10 +15,12 @@
    -

    <%= t(:default) %> <%= @tags.count %>

    -
      - <%= render partial: "tag", collection: @tags %> -
    + <% unless @is_module_tag %> +

    <%= t(:default) %> <%= @tags.count %>

    +
      + <%= render partial: "tag", collection: @tags %> +
    + <% end %> <% @module_apps.each do |mod| %> <% @mod = mod diff --git a/app/views/admin/tags/_tag.html.erb b/app/views/admin/tags/_tag.html.erb index 6d050fc..23c2d74 100644 --- a/app/views/admin/tags/_tag.html.erb +++ b/app/views/admin/tags/_tag.html.erb @@ -1,20 +1,20 @@ -
  • - - <% unless defined?(in_module) && tag.is_default %> +
  • + <% if defined?(in_module) && tag.is_default && !@is_module_tag %> + + + <%= tag.get_module_tagging_count @mod.taggable_model %> + + <%= tag.show_names_slash %> + + <% else %>

    <%= hidden_field_tag "ids[]", tag.id, class: "tag_id" %> - <% end %> - - <% if defined?(in_module) && tag.is_default %> - - <%= tag.get_module_tagging_count @mod.taggable_model %> - <%= tag.show_names_slash %> - - <% else %> <%= link_to '#', class: "open-slide", data: {title: t('editing.tag'), id: tag.id.to_s, form: tag.name_translations} do %> - <%= tag.taggings.count %> + + <%= tag.taggings.count %> + <%= tag.show_names_slash %> <% end %> <% end %> diff --git a/app/views/admin/tags/_tag_form.html.erb b/app/views/admin/tags/_tag_form.html.erb new file mode 100644 index 0000000..79c902d --- /dev/null +++ b/app/views/admin/tags/_tag_form.html.erb @@ -0,0 +1,62 @@ +
    + + <% module_app.tags.each do |tag| %> + + <% end %> + +
    + + + + + \ No newline at end of file diff --git a/app/views/admin/tags/index.html.erb b/app/views/admin/tags/index.html.erb index 6d031fa..f341a3d 100644 --- a/app/views/admin/tags/index.html.erb +++ b/app/views/admin/tags/index.html.erb @@ -1,3 +1,5 @@ +<%= hidden_field_tag 'module_app_id', @module_app.id.to_s %> + <% content_for :right_nav do %>
    @@ -19,15 +21,59 @@
    - <%= form_for :tag, url: nil, remote: true do |f| %> -
    - <%= render :partial => "form", :locals => { :f => f } %> -
    - <%= t(:cancel) %> - <%= f.submit t(:submit), class: 'btn btn-primary btn-small' %> +
    + + <% if @is_module_tag %> + + <% end %> + +
    + +
    + <%= form_for :tag, url: nil, remote: true do |f| %> +
    + <%= render :partial => "form", :locals => { :f => f } %> +
    + <%= t(:cancel) %> + <%= f.submit t(:submit), class: 'btn btn-primary btn-small' %> +
    +
    + <% end %>
    -
    - <% end %> + + <% if @is_module_tag %> +
    + + <%= form_tag add_from_default_admin_module_app_tags_path(:module_app_id=>@module_app.id), id: "filter-default-tag", method: :post, remote: true do %> +
    + +
    + <%= t(:cancel) %> + <%= submit_tag t(:add), class: 'btn btn-primary btn-small' %> +
    +
    + <% end %> +
    + <% end %> +
    + +
  • diff --git a/app/views/admin/tags/index.js.erb b/app/views/admin/tags/index.js.erb index ac7e2ee..379573b 100644 --- a/app/views/admin/tags/index.js.erb +++ b/app/views/admin/tags/index.js.erb @@ -1,9 +1,10 @@ $("#delete_tags").modal('hide'); $("#tags-merger").modal('hide'); +$("#remove_defaults").modal('hide'); $("#tags_index").html("<%= j render 'index' %>") $.pageslide.close(); openSlide(); $('.card').cardCheck({ item: $('.card input[type="checkbox"]'), }); -checkedLength() \ No newline at end of file +checkedLength(); \ No newline at end of file diff --git a/app/views/admin/tags/new.html.erb b/app/views/admin/tags/new.html.erb deleted file mode 100644 index 41230ac..0000000 --- a/app/views/admin/tags/new.html.erb +++ /dev/null @@ -1 +0,0 @@ -<%= render 'new' %> diff --git a/config/environment.rb b/config/environment.rb index 40bba31..015b484 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -20,7 +20,26 @@ if Page.count == 0 end if User.count==0 + group = Workgroup.new + group.title = "Administrator" + group.key = 'admin' + group.save + + role = Role.new + role.key = 'admin' + role.title_translations = {:en=>'Administrator', :zh_tw=>'Administrator'} + role.save + + profile = MemberProfile.new + profile.first_name_translations = {:en=>'Digital', :zh_tw=>'Digital'} + profile.last_name_translations = {:en=>'Ruling', :zh_tw=>'Ruling'} + profile.save + + role.member_profiles << profile + user = User.new + user.workgroup = group + user.member_profile = profile user.user_name = "rulingcom" user.password = "bjo4xjp6" user.email = "orbit@rulingcom.com" diff --git a/config/initializers/orbit_category.rb b/config/initializers/orbit_category.rb new file mode 100644 index 0000000..22988c7 --- /dev/null +++ b/config/initializers/orbit_category.rb @@ -0,0 +1,21 @@ + OrbitApp.registration "Category", type: 'ModuleApp' do + module_label 'module_name.category' + base_url File.expand_path File.dirname(__FILE__) + + authorizable + + side_bar do + head_label_i18n 'module_name.category', icon_class: "icons-flow-cascade" + head_link_path "admin_categories_path" + active_for_controllers (['admin/categories']) + + # available_for [:admin, :manager] + + # context_link 'all', + # link_path: "admin_categorys_path", + # priority: 1, + # active_for_action: {categorys: :index}, + # available_for: [:admin, :manager] + + end + end diff --git a/config/initializers/orbit_tag.rb b/config/initializers/orbit_tag.rb index 13475b5..4a23af1 100644 --- a/config/initializers/orbit_tag.rb +++ b/config/initializers/orbit_tag.rb @@ -7,7 +7,7 @@ side_bar do head_label_i18n 'module_name.tag', icon_class: "icons-tag" head_link_path "admin_tags_path" - active_for_controllers ({public: ['admin/tags']}) + active_for_controllers (['admin/tags']) # available_for [:admin, :manager] diff --git a/config/locales/en.yml b/config/locales/en.yml index 69e7d5e..06720a0 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -667,6 +667,7 @@ en: module_name: tag: Tag + category: Category datetime_picker: date: diff --git a/config/locales/zh_tw.yml b/config/locales/zh_tw.yml index 0984455..c06ab0a 100644 --- a/config/locales/zh_tw.yml +++ b/config/locales/zh_tw.yml @@ -1,5 +1,7 @@ zh_tw: _locale: 中文 + en: 英文 + zh_tw: 中文 more: "更多" site_: 網站 site_info: 基本資訊 @@ -7,8 +9,10 @@ zh_tw: site_structure: 網站架構 sitemap: 網站地圖 site_name: 網站名稱 + submit: 送出 mobile_settings: 行動設定 modules: 網站模組 + name: 名稱 search_engine: 搜尋引擎 templates: 網站模版 preference: 系統偏好 @@ -17,8 +21,10 @@ zh_tw: locale: 位置 login: 登入 logout: 登出 + cancel: 取消 dashboard_: 儀表版 desktop: 桌面 + disable: 停用 password: 密碼 all: 全部 add: 新增 @@ -60,4 +66,5 @@ zh_tw: register: 註冊 registered: 已註冊 - + module_name: + category: 類別 diff --git a/config/routes.rb b/config/routes.rb index c148ad6..b2f1368 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -51,15 +51,41 @@ Orbit::Application.routes.draw do post 'toggle' end - resources :module_apps + resources :module_apps do + resources :categories do + collection do + post 'create_in_form' + end + member do + post 'toggle' + end + end + resources :tags do + collection do + post 'add_to_default' + post 'add_from_default' + post 'create_in_form' + post 'delete_tags' + post 'merge' + post 'remove_default' + post 'update_included_default' + end + end + end get 'authorizations(/:module(/:type(/:id)))' => 'authorizations#index', :as => :authorizations resources :authorizations resources :items + resources :categories do + member do + post 'toggle' + end + end resources :tags do collection do post 'add_to_default' + post 'add_from_default' post 'delete_tags' post 'merge' post 'remove_default' diff --git a/lib/orbit_app/helper/context_link_renderer.rb b/lib/orbit_app/helper/context_link_renderer.rb index c4aa62c..f578875 100644 --- a/lib/orbit_app/helper/context_link_renderer.rb +++ b/lib/orbit_app/helper/context_link_renderer.rb @@ -7,7 +7,7 @@ module ContextLinkRenderer @request = request @params = params @current_user = current_user - content_tag :li, link_to(content_tag(:span, I18n.t(@label_i18n)), Rails.application.routes.url_helpers.send(@path)), :class => ( active_actions[controller] == action ? 'active' : nil) + content_tag :li, link_to(content_tag(:span, I18n.t(@label_i18n)), Rails.application.routes.url_helpers.send(@path, @arg)), :class => ( active_actions[controller] == action ? 'active' : nil) end end \ No newline at end of file diff --git a/lib/orbit_app/module/side_bar.rb b/lib/orbit_app/module/side_bar.rb index 5ee4ee6..ecfb5d9 100644 --- a/lib/orbit_app/module/side_bar.rb +++ b/lib/orbit_app/module/side_bar.rb @@ -142,6 +142,7 @@ module OrbitApp @label_i18n = label_i18n @priority = options[:priority] || 0 @path = options[:link_path] || "" + @arg = options[:link_arg] || "" set_available_for_avoiding_sensitive_links(options[:available_for] ) @active_for_action = options[:active_for_action] || [] @active_for_app_auth = options[:active_for_app_auth] || [] diff --git a/public/assets/bulletin_file/file/535f7fd06d616e3889220000/thumb_Ruling_Digital-LOGO.jpg b/public/assets/bulletin_file/file/535f7fd06d616e3889220000/thumb_Ruling_Digital-LOGO.jpg deleted file mode 100644 index 56b5f49aecdbc9caed38c0ca8c84c1756120c29f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7532 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 diff --git a/test/controllers/admin/categories_controller_test.rb b/test/controllers/admin/categories_controller_test.rb new file mode 100644 index 0000000..1f3df16 --- /dev/null +++ b/test/controllers/admin/categories_controller_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class Admin::CategoriesControllerTest < ActionController::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/helpers/admin/categories_helper_test.rb b/test/helpers/admin/categories_helper_test.rb new file mode 100644 index 0000000..3b21c35 --- /dev/null +++ b/test/helpers/admin/categories_helper_test.rb @@ -0,0 +1,4 @@ +require 'test_helper' + +class Admin::CategoriesHelperTest < ActionView::TestCase +end