Tag management module completed

This commit is contained in:
chris 2013-04-26 18:34:46 +08:00
parent 218592c1f9
commit e028791d68
19 changed files with 201 additions and 155 deletions

View File

@ -1,25 +1,53 @@
function cardCheck() {
if($('.tags').length) {
var $card = $('.checkbox-card .card'),
$check = $card.children($('input[type="checkbox"]'));
$check.each(function(){
if($(this).attr('checked')) {
$(this).parent(".check").addClass("active");
}
})
} else {
var $card = $('.checkbox-card>li'),
$check = $('input[type="checkbox"]');
$check.each(function(){
if($(this).attr('checked')) {
$(this).parent("li").addClass("active");
}
})
}
$card.on('click', function() {
$(this).toggleClass('active')
});
}
// function cardCheck() {
// if($('.tags').length) {
// var $card = $('.checkbox-card .card'),
// $check = $card.children($('input[type="checkbox"]'));
// $check.each(function(){
// if($(this).attr('checked')) {
// $(this).parent(".check").addClass("active");
// }
// })
// } else {
// var $card = $('.checkbox-card>li'),
// $check = $('input[type="checkbox"]');
// $check.each(function(){
// if($(this).attr('checked')) {
// $(this).parent("li").addClass("active");
// }
// })
// }
// $card.on('click', function() {
// $(this).toggleClass('active')
// });
// }
// Focus first element
!function ($) {
$.fn.cardCheck = function(param) {
_defaultSettings = {
check: '',
};
_set = $.extend(_defaultSettings, param);
$card = $(this);
$check = _set.check;
$check.each(function(){
if($(this).attr('checked')) {
$(this).parent($card).addClass("active");
}
});
$card.on('click', function() {
$(this).toggleClass('active')
});
}
}(window.jQuery);
$(function(){
cardCheck();
if($('.tags').length) {
$('.card').cardCheck({
check: $('.card input[type="checkbox"]'),
});
} else {
$('.checkbox-card > li').cardCheck({
check: $('.checkbox-card > li input[type="checkbox"]'),
});
}
});

View File

@ -52,10 +52,12 @@
// if(showTags == 0) {
// $('#deselect, #deleteTags').addClass('hide')
// }
li.children('.card').removeClass('active').children('input').attr('checked', false);
if($('.tags input[type="checkbox"]:checked').length == 0) {
$('#deselect, #deleteTags, #addDefault').addClass('hide')
}
// li.children('.card').removeClass('active').children('input').attr('checked', false);
// if($('.tags input[type="checkbox"]:checked').length == 0) {
// $('#deselect, #deleteTags, #addDefault').addClass('hide')
// }
}
}
}

View File

@ -53,6 +53,13 @@
} else {
$viewPage.find('.content').load(url, function(){
$viewPage.clone(true).appendTo( $pageslide.empty() ).show();
if($('#filter-default-tag').length) {
$('#filter-default-tag').fastLiveFilter('.add-default-tags-list', '.filter-item', '.tag');
addTagsTab();
$('#view-page .card').cardCheck({
check: $('#view-page input[type="checkbox"]'),
});
};
});
}
@ -188,12 +195,12 @@
if($('#add-tags').length) {
$('.set_new').addClass('active in').siblings().removeClass('active in');
$('#pageslide .selete_defat .search-query').attr('id','filter-default-tag')
$('#filter-default-tag').fastLiveFilter('.add-defalt-tags-list', '.filter-item', '.tag');
$('.add-defalt-tags-list .filter-item').removeClass('mark');
}
// if($('#add-tags').length) {
// $('.set_new').addClass('active in').siblings().removeClass('active in');
// $('#pageslide .select_default .search-query').attr('id','filter-default-tag')
// $('#filter-default-tag').fastLiveFilter('.add-default-tags-list', '.filter-item', '.tag');
// $('.add-default-tags-list .filter-item').removeClass('mark');
// }
}
// Close the pageslide
@ -242,7 +249,9 @@
$pageslide.hide();
_sliding = false;
if( typeof callback != 'undefined' ) callback();
$body.css({'width': 'auto'})
$body.css({'width': 'auto'});
$('#view-page .content').empty();
$('#view-page .pane').remove();
});
}

View File

@ -233,9 +233,9 @@
// for Orbit
if($('#add-tags').length) {
$('.set_new').addClass('active in').siblings().removeClass('active in');
$('#pageslide .selete_defat .search-query').attr('id','filter-default-tag')
$('#filter-default-tag').fastLiveFilter('.add-defalt-tags-list', '.filter-item', '.tag');
$('.add-defalt-tags-list .filter-item').removeClass('mark');
$('#pageslide .select_default .search-query').attr('id','filter-default-tag')
$('#filter-default-tag').fastLiveFilter('.add-default-tags-list', '.filter-item', '.tag');
$('.add-default-tags-list .filter-item').removeClass('mark');
}
//
}

View File

@ -13,11 +13,10 @@ function checkedLength() {
$moduleTags,
$defaultTags,
$toDefault;
$card.on('click', function() {
function reload_links() {
if($('.default-tags').length) {
$moduleTags = $('.module-tags input[type="checkbox"]:checked');
$defaultTags = $('.default-tags input[type="checkbox"]:checked');
var ids = new Array();
if($moduleTags.length > 1 || $moduleTags.length+$defaultTags.length > 1) {
$('#mergerTags').removeClass('hide');
@ -97,14 +96,14 @@ function checkedLength() {
$('#deselect').off('click', deselect);
};
};
})
$('#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()
}
}
}
$card.on('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();
@ -127,6 +126,14 @@ function checkedLength() {
$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();
$('#remove_defaults a.remove-defaults').attr("href", $(this).attr("rel"));
@ -154,7 +161,7 @@ function checkedLength() {
function addTagsTab() {
$('#add-tags .nav a').click(function (e) {
$('a[data-toggle="tab"]').click(function (e) {
e.preventDefault();
$(this).tab('show');
})
@ -198,5 +205,5 @@ $(function() {
} else {
checkedLength();
};
addTagsTab();
// addTagsTab();
});

View File

@ -20,8 +20,8 @@
#pageslide .content {
padding: 15px;
}
#pageslide #view-page .content,
#pageslide #view-page .pane {
#items #pageslide #view-page .content,
#items #pageslide #view-page .pane {
padding: 0px;
margin-top: 57px;
}

View File

@ -153,6 +153,6 @@
width: 199px;
margin-bottom: 5px;
}
#pageslide .add-defalt-tags-list {
#pageslide .add-default-tags-list {
margin-bottom: 0;
}

View File

@ -12,12 +12,12 @@ class Admin::ModuleTagsController < OrbitBackendController
helper 'admin/tags'
def index
@included_tags = @module_app.module_tags.where(is_default: true)
@tags = @module_app.module_tags
@default_tags = get_default_tags
end
def new
@default_tags = get_default_tags_without_included
@tag = ModuleTag.new
render layout: false
end
@ -73,7 +73,11 @@ class Admin::ModuleTagsController < OrbitBackendController
end
def update_included_default
@module_app.update_attribute(:module_tag_ids, (@module_app.module_tag_ids - get_default_tag_ids) << params[:ids])
default_tags = ModuleTag.find(params[:ids].split(',')) rescue nil
default_tags.each do |tag|
clone_tag_from_default(tag)
end
redirect_to admin_module_tags_url(module_app_id: @module_app_id)
end
protected
@ -84,8 +88,8 @@ class Admin::ModuleTagsController < OrbitBackendController
@module_app_id = @module_app.id rescue nil
end
def get_default_tags
ModuleTag.where(is_default: true)
def get_default_tags_without_included
ModuleTag.where(is_default: true, parent_id: nil) - @module_app.module_tags.where(is_default: true).map{|m| m.parent }
end
def get_default_tag_ids

View File

@ -50,11 +50,7 @@ class Admin::TagsController < OrbitBackendController
if module_tags
module_tags.each do |module_tag|
module_tag.update_attribute(:is_default, true)
new_tag = module_tag.clone
new_tag['_id'] = BSON::ObjectId.new
new_tag['module_app_id'] = @module_app.id
new_tag.save
module_tag.update_attribute(:parent_id, new_tag.id)
clone_tag_to_default(module_tag)
end
end
redirect_to admin_tags_url

View File

@ -64,13 +64,12 @@ class OrbitBackendController < ApplicationController
tag_array = @module_app.tags.inject([]){ |result, value|
result << [value.name, value]
}
params[:direction].eql?('asc') ? tag_array.sort : tag_array.sort.reverse!
params[:direction].eql?('asc') ? tag_array.sort! : tag_array.sort!.reverse!
sorted_objects = Array.new
tag_array.each do |x|
taggings = x[1].taggings
taggings.each {|tagging| sorted_objects << tagging.taggable }
end
# debugger
sorted_objects.flatten!
sorted_objects.uniq!
objects = get_with_nil(objects, option, sorted_objects)
@ -155,7 +154,7 @@ class OrbitBackendController < ApplicationController
def get_with_nil(objects, option, sorted_objects)
tmp = Array.new
objects.each { |object| tmp << [get_string_value_from_object(object), object] if (object.send(option).blank? || (object.send(option).size == 0 rescue nil)) }
sorted = params[:direction].eql?('asc') ? tmp.sort : tmp.sort.reverse!
sorted = params[:direction].eql?('asc') ? tmp.sort : tmp.sort.reverse
sorted_tmp = sorted.collect {|a| a[1] }
a = params[:direction].eql?('asc') ? (sorted_tmp + sorted_objects) : (sorted_objects + sorted_tmp)
a.flatten

View File

@ -3,7 +3,8 @@
<!-- footer -->
<div class="bottomnav clearfix">
<div class="action pull-right">
<button id="deselect" class="btn btn-inverse toggable hide"><%= t(:deselect) %></button>
<button id="selectAllTags" class="btn"><%= t(:select_all) %></button>
<button id="deselect" class="btn btn-inverse toggable hide"><%= t(:deselect_all) %></button>
<%= 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_module_tags_path(module_app_id: @module_app_id) %>
<%= link_to t(:remove_default), '#', id: "removeDefaults", class: "btn btn-info toggable hide", rel: '' %>

View File

@ -1,80 +1,49 @@
<div id="add-tags">
<legend>Add Tags</legend>
<ul class="nav nav-pills">
<li class="active"><a href=".set_new" data-toggle="tab">Create new</a></li>
<li><a href=".selete_defat" data-toggle="tab">Use Default</a></li>
</ul>
<div class="tab-content">
<div class="set_new tab-pane fade active in">
<%= form_for @tag, url: admin_module_tags_path(module_app_id: @module_app_id), remote: true, id: 'create_new_tags' do |f| %>
<fieldset>
<%= render partial: "admin/tags/form", :locals => { :f => f } %>
<div class="form-actions">
<a href="javascript:$.pageslide.close()" class="btn btn-small"><%= t(:cancel) %></a>
<%= f.submit t(:create_), class: 'btn btn-primary btn-small' %>
</div>
</fieldset>
<% end %>
<legend>Add Tags</legend>
<ul class="nav nav-pills">
<li class="active"><a href=".set_new" data-toggle="tab">Create new</a></li>
<li><a href=".select_default" data-toggle="tab">Use Default</a></li>
</ul>
<div class="tab-content">
<div class="set_new tab-pane fade active in">
<%= form_for @tag, url: admin_module_tags_path(module_app_id: @module_app_id), remote: true, id: 'create_new_tags' do |f| %>
<fieldset>
<%= render partial: "admin/tags/form", :locals => { :f => f } %>
<div class="form-actions">
<a href="javascript:$.pageslide.close()" class="btn btn-small"><%= t(:cancel) %></a>
<%= f.submit t(:create_), class: 'btn btn-primary btn-small' %>
</div>
</fieldset>
<% end %>
</div>
<div class="select_default tags tab-pane fade">
<input id="filter-default-tag" class="search-query" type="text" placeholder="Search Tags" value="">
<%= form_tag update_included_default_admin_module_tags_path(module_app_id: @module_app_id), id: "filter-default-tag", method: :post, remote: true do %>
<fieldset>
<ul class="add-default-tags-list tags-groups checkbox-card">
<% @default_tags.each do |module_tag| %>
<li class="filter-item default">
<p class="card pull-left">
<input type="checkbox">
<%= check_box_tag "ids[]", module_tag.id, false, class: "tag_id" %>
</p>
<a>
<span class="amount"><%= get_tagging_count(module_tag) %></span>
<%= show_names_slash(module_tag) %>
</a>
</li>
<% end %>
</ul>
<div class="form-actions">
<a href="javascript:$.pageslide.close()" class="btn btn-small"><%= t(:cancel) %></a>
<%= submit_tag t(:add), class: 'btn btn-primary btn-small' %>
</div>
</fieldset>
<% end %>
</div>
</div>
<div class="selete_defat tags tab-pane fade">
<input class="search-query" type="text" placeholder="Search Tags" value="">
<form id="use_default_tags">
<fieldset>
<ul class="add-defalt-tags-list tags-groups checkbox-card">
<li class="filter-item default">
<p class="card pull-left">
<input type="checkbox">
</p>
<a>
<span class="amount">8</span>
<span class="tag">Apple</span> / <span class="tag">蘋果</span>
</a>
</li>
<li class="filter-item default">
<p class="card pull-left">
<input type="checkbox">
</p>
<a>
<span class="amount">8</span>
<span class="tag">Bus</span> / <span class="tag">巴士</span>
</a>
</li>
<li class="filter-item default">
<p class="card pull-left">
<input type="checkbox">
</p>
<a>
<span class="amount">8</span>
<span class="tag">Cake</span> / <span class="tag">蛋糕</span>
</a>
</li>
<li class="filter-item default">
<p class="card pull-left">
<input type="checkbox">
</p>
<a>
<span class="amount">8</span>
<span class="tag">Dog</span> / <span class="tag">狗</span>
</a>
</li>
<li class="filter-item default">
<p class="card pull-left">
<input type="checkbox">
</p>
<a>
<span class="amount">8</span>
<span class="tag">Elephant</span> / <span class="tag">大象</span>
</a>
</li>
</ul>
<div class="form-actions">
<a href="javascript:$.pageslide.close()" class="btn btn-small">Cancel</a>
<a class="btn btn-primary btn-small">Submit</a>
</div>
</fieldset>
</form>
</div>
</div>
</div>

View File

@ -4,5 +4,7 @@ $("#remove_defaults").modal('hide');
$("#tags_index").html("<%= j render 'index' %>")
$.pageslide.close();
openSlide();
cardCheck();
$('.card').cardCheck({
check: $('.card input[type="checkbox"]'),
});
checkedLength()

View File

@ -1,7 +1,8 @@
<!-- footer -->
<div class="bottomnav clearfix">
<div class="action pull-right">
<button id="deselect" class="btn btn-inverse toggable hide"><%= t(:deselect) %></button>
<button id="selectAllTags" class="btn"><%= t(:select_all) %></button>
<button id="deselect" class="btn btn-inverse toggable hide"><%= t(:deselect_all) %></button>
<%= 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(:add_to_default), add_to_default_admin_tags_path, id: "addDefault", class: "btn btn-info toggable hide", method: :post, remote: true %>

View File

@ -3,5 +3,7 @@ $("#tags-merger").modal('hide');
$("#tags_index").html("<%= j render 'index' %>")
$.pageslide.close();
openSlide();
cardCheck();
$('.card').cardCheck({
check: $('.card input[type="checkbox"]'),
});
checkedLength()

View File

@ -25,11 +25,23 @@
</nav>
<section id="main-wrap">
<div class="wrap-inner">
<div id="filter" class="topnav clearfix">
<ul class="breadcrumb pull-left">
<li><a href="/orbit_4.0.1/admin/dashboards/dashboards.shtml">Dashboard</a> <span class="divider">/</span></li>
<li class="active">All</li>
</ul>
<div class="pull-right">
<input id="filter-input" class="search-query input-medium" type="text" placeholder="Search Tags" value="">
</div>
</div>
<%= yield %>
<div id="view-page" class="nano" style="display:none">
<div class="content">
</div>
</div>
<div id="pageslide">
<div id="view-page" class="nano" style="display:none">
<div class="content">
</div>
</div>
</div>
<%= javascript_include_tag "lib/jquery.pageslide.js" %>
</div>
</section>

View File

@ -5,7 +5,7 @@ en:
create:
error:
tag: Error when creating tag.
deselect: Deselect
deselect_all: Deselect all
editing:
tag: Editing tag
login_orbit: Log In to Orbit
@ -14,6 +14,7 @@ en:
tag: New tag
no_app: No module
remove_default: Remove default
select_all: Select all
tag:
add: Add tag
delete: Delete tags

View File

@ -116,6 +116,7 @@ Orbit::Application.routes.draw do
post 'delete_tags'
post 'merge'
post 'remove_default'
post 'update_included_default'
end
end

View File

@ -81,12 +81,21 @@ module OrbitTag
module Merging
protected
def create_tag(name, taggings, module_app, default=false)
new_tag = module_app.module_tags.create(name_translations: name, module_app_id: module_app.id, is_default: default)
taggings.each do |tagging|
tagging.taggable.taggings.create(tag_id: new_tag.tag.id) unless tagging.taggable.taggings.detect{|t| t.tag_id.eql?(new_tag.tag.id)}
end
new_tag
def clone_tag(module_tag, parent_id=nil, set_parent=nil)
new_tag = module_tag.clone
new_tag['_id'] = BSON::ObjectId.new
new_tag['module_app_id'] = @module_app.id
new_tag['parent_id'] = parent_id
new_tag.save
module_tag.update_attribute(:parent_id, new_tag.id) if set_parent
end
def clone_tag_from_default(default_tag)
clone_tag(default_tag, default_tag.id)
end
def clone_tag_to_default(default_tag)
clone_tag(default_tag, nil, true)
end
def merge_default_tags(name, tag_leases)
@ -123,7 +132,10 @@ module OrbitTag
def merge_tags(name, taggings, module_app_id, default=nil)
module_app = ModuleApp.find(module_app_id)
new_tag = create_tag(name, taggings, module_app, default)
new_tag = module_app.module_tags.create(name_translations: name, module_app_id: module_app.id, is_default: default)
taggings.each do |tagging|
tagging.taggable.taggings.create(tag_id: new_tag.tag.id) unless tagging.taggable.taggings.detect{|t| t.tag_id.eql?(new_tag.tag.id)}
end
new_tag
end