UNPKG

zui

Version:

一个基于 Bootstrap 深度定制开源前端实践方案,帮助你快速构建现代跨屏应用。

122 lines (101 loc) 4.22 kB
/* ======================================================================== * ZUI: boards.js * http://zui.sexy * ======================================================================== * Copyright (c) 2014-2016 cnezsoft.com; Licensed MIT * ======================================================================== */ (function($) { 'use strict'; if(!$.fn.droppable) throw new Error('Droppable requires for boards'); var Boards = function(element, options) { this.$ = $(element); this.options = this.getOptions(options); this.getLang(); this.init(); }; Boards.DEFAULTS = { // lang: null, langs: { 'zh_cn': { append2end: '移动到末尾' }, 'zh_tw': { append2end: '移动到末尾' }, 'en': { append2end: 'Move to the end.' } } }; // default options Boards.prototype.getOptions = function(options) { options = $.extend({lang: $.zui.clientLang()}, Boards.DEFAULTS, this.$.data(), options); return options; }; Boards.prototype.getLang = function() { var options = this.options; this.lang = options.langs[options.lang] || options.langs[Boards.DEFAULTS.lang]; }; Boards.prototype.init = function() { var idSeed = 1; var lang = this.lang; this.$.find('.board-item:not(".disable-drop"), .board:not(".disable-drop")').each(function() { var $this = $(this); if($this.attr('id')) { $this.attr('data-id', $this.attr('id')); } else if(!$this.attr('data-id')) { $this.attr('data-id', 'board' + (idSeed++)); } if($this.hasClass('board')) { $this.find('.board-list').append('<div class="board-item board-item-empty"><i class="icon-plus"></i> {append2end}</div>'.format(lang)) .append('<div class="board-item board-item-shadow"></div>'.format(lang)); } }); this.bind(); }; Boards.prototype.bind = function(items) { var $boards = this.$, setting = this.options; $boards.droppable($.extend({ before: setting.before, target: '.board-item:not(".disable-drop, .board-item-shadow")', flex: true, selector: '.board-item:not(".disable-drop, .board-item-shadow")', start: function(e) { $boards.addClass('dragging').find('.board-item-shadow').height(e.element.outerHeight()); }, drag: function(e) { $boards.find('.board.drop-in-empty').removeClass('drop-in-empty'); if(e.isIn) { var board = e.target.closest('.board').addClass('drop-in'); var shadow = board.find('.board-item-shadow'); var target = e.target; $boards.addClass('drop-in').find('.board.drop-in').not(board).removeClass('drop-in'); shadow.insertBefore(target); board.toggleClass('drop-in-empty', target.hasClass('board-item-empty')); } }, drop: function(e) { if(e.isNew) { var result; if($.isFunction(setting['drop'])) { result = setting['drop'](e); } if(result !== false) e.element.insertBefore(e.target); } }, finish: function() { $boards.removeClass('dragging').removeClass('drop-in').find('.board.drop-in').removeClass('drop-in'); } }, setting.droppable)); }; $.fn.boards = function(option) { return this.each(function() { var $this = $(this); var data = $this.data('zui.boards'); var options = typeof option == 'object' && option; if(!data) $this.data('zui.boards', (data = new Boards(this, options))); if(typeof option == 'string') data[option](); }); }; $.fn.boards.Constructor = Boards; }(jQuery));