Vendored
+333
@@ -0,0 +1,333 @@
|
||||
/* =========================================================
|
||||
*
|
||||
* 在原作者的基础修改支持 bootstrap3
|
||||
*
|
||||
* check-type=
|
||||
* required 不能为空,并在后面自动加*号
|
||||
* url 表示 输入网址
|
||||
* date 日期格式 xxxx-xx-xx
|
||||
* mail 邮箱
|
||||
* number 数字,可以整型,浮点型。
|
||||
* char
|
||||
* chinese 中文
|
||||
* mail-message="扩展提示内容" , 可以扩展data-message,url-message
|
||||
* minlength="6" 表示长度大于等于6
|
||||
* range="2.1~3" 表示值在[2.1~3]之间,并check-type="number"
|
||||
* range="2.1,2,4,5" 表示值在只能填现数字,并check-type="number"
|
||||
*
|
||||
*
|
||||
* 例如:
|
||||
* $("form").validation(function(obj,params){
|
||||
* if (obj.id=='mail'){
|
||||
* $.post("/verifymail",{mail :$(obj).val()},function(data){
|
||||
* params.err = !data.success;
|
||||
* params.msg = data.msg;
|
||||
* });
|
||||
* }},
|
||||
* {reqmark:false}
|
||||
* );
|
||||
*
|
||||
*
|
||||
* 编号 版本号 作者 修改日期 修改内容
|
||||
* 1 1.0.0 mrlong 2013-10-2 创建文件
|
||||
× 2 1.0.1 mrlong 2013-10-5 callback显示提示的信息。
|
||||
* 3. 1.0.2 mrlong 2013-10-7 增加基本表单与内联表单样式。
|
||||
* 4. 1.0.3 mrlong 2013-11-04 修改支持IE8,不能Array.indexOf() 改为 $.inArray()
|
||||
* 5. 1.0.4 mrlong 2014-6-15 修改在textarea没有type时的错误,扩展valid()方法。
|
||||
*
|
||||
*
|
||||
/* =========================================================
|
||||
* bootstrap-validation.js
|
||||
* Original Idea: http:/www.newkou.org (Copyright 2012 Stefan Petre)
|
||||
* Updated by 不会飞的羊 (https://github.com/FateSheep/Validation-for-Bootstrap)
|
||||
* =========================================================
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* ========================================================= */
|
||||
!function($) {
|
||||
$.fn.validation = function(callback,options) {
|
||||
|
||||
if ( !this.length ) {
|
||||
if ( options && options.debug && window.console ) {
|
||||
console.warn( "Nothing selected, can't validate, returning nothing." );
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
return this.each(function() {
|
||||
globalOptions = $.extend({}, $.fn.validation.defaults, options);
|
||||
globalOptions.callback = callback;
|
||||
// Add novalidate tag if HTML5.
|
||||
$(this).attr( "novalidate", "novalidate" );
|
||||
fform_style = isformstyle(this);
|
||||
validationForm(this)
|
||||
});
|
||||
};
|
||||
|
||||
$.fn.valid=function(object,options){
|
||||
if (formState) { // 重复提交则返回
|
||||
return false;
|
||||
};
|
||||
$("#validerrmsg").remove();
|
||||
|
||||
var myobject;
|
||||
var myoptions;
|
||||
if (typeof object === 'object'){
|
||||
myobject = $(object);
|
||||
myoptions = options;
|
||||
}
|
||||
else{
|
||||
myoptions = object;
|
||||
};
|
||||
|
||||
formState = true;
|
||||
var validationError = false;
|
||||
//取出验证的
|
||||
$('input, textarea', this).each(function () {
|
||||
var el = $(this),
|
||||
controlGroup = el.parents('.form-group'),
|
||||
//check-type="required chinese" //支持多个,以空格隔开。
|
||||
valid = (el.attr('check-type')==undefined)?null:el.attr('check-type').split(' ');
|
||||
if (!controlGroup.hasClass('has-success') && valid != null && valid.length > 0) {
|
||||
if (!validateField(this, valid)) {
|
||||
if (wFocus == false) {
|
||||
scrollTo(0, el[0].offsetTop - 50);
|
||||
wFocus = true;
|
||||
}
|
||||
validationError = true;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
wFocus = false;
|
||||
formState = false;
|
||||
|
||||
//显示信息内容 2014-6-15
|
||||
//在最后的提交按钮增加提示内容
|
||||
if(myoptions !=null && validationError){
|
||||
if (myobject ==null){
|
||||
myobject = $('button:last[type=submit]');
|
||||
};
|
||||
myobject.after('<span id="validerrmsg" class="help-block" style="color: #FF0000;">'+myoptions+'</span>');
|
||||
|
||||
};
|
||||
//end
|
||||
|
||||
return !validationError;
|
||||
}
|
||||
|
||||
$.fn.validation.defaults = {
|
||||
validRules : [
|
||||
{name: 'required', validate: function(value) {return ($.trim(value) == '');}, defaultMsg: '请输入内容。'},
|
||||
//{name: 'number', validate: function(value) {return (!/^[0-9]\d*$/.test(value));}, defaultMsg: '请输入数字。'},
|
||||
{name: 'number', validate: function(value) {return (!/^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(value));}, defaultMsg: '请输入数字。'},
|
||||
//{name: 'mail', validate: function(value) {return (!/^[a-zA-Z0-9]{1}([\._a-zA-Z0-9-]+)(\.[_a-zA-Z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+){1,3}$/.test(value));}, defaultMsg: '请输入邮箱地址。'},
|
||||
{name: 'mail', validate: function(value) {return (!/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i.test(value));}, defaultMsg: '请输入邮箱地址。'},
|
||||
{name: 'char', validate: function(value) {return (!/^[a-z\_\-A-Z]*$/.test(value));}, defaultMsg: '请输入英文字符。'},
|
||||
{name: 'chinese', validate: function(value) {return (!/^[\u4e00-\u9fff]$/.test(value));}, defaultMsg: '请输入汉字。'},
|
||||
{name: 'url',validate:function(value){return(!/^(https?|s?ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value))},defaultMsg:'请输入网址'},
|
||||
{name: 'date',validate:function(value){return(/Invalid|NaN/.test(new Date(value).toString()));},defaultMsg:"日期格式XXXX-XX-XX。"}
|
||||
],
|
||||
reqmark:true,
|
||||
callback:null //function(obj,params){};
|
||||
};
|
||||
|
||||
var formState = false,
|
||||
fieldState = false,
|
||||
wFocus = false,
|
||||
fform_style=0, //0=表示基本表单 1=表示内联表单 2=水平排列的表单
|
||||
globalOptions = {};
|
||||
|
||||
function isformstyle(form){
|
||||
if($(form).hasClass('form-inline')){
|
||||
return 1;
|
||||
}
|
||||
else if($(form).hasClass('form-horizontal')){
|
||||
return 2;
|
||||
}
|
||||
else{
|
||||
return 0;
|
||||
};
|
||||
};
|
||||
|
||||
//验证字段
|
||||
var validateField = function(field, valid) {
|
||||
var el = $(field), error = false, errorMsg = '';
|
||||
var minlength=(el.attr('minlength')?el.attr('minlength'):null);
|
||||
var range=(el.attr('range')?el.attr('range'):null); //
|
||||
var msg;
|
||||
for (i = 0; i < valid.length; i++) {
|
||||
var x = true,
|
||||
flag = valid[i];
|
||||
msg = (el.attr(flag + '-message')==undefined)?null:el.attr(flag + '-message');
|
||||
|
||||
if (flag.substr(0, 1) == '!') {
|
||||
x = false;
|
||||
flag = flag.substr(1, flag.length - 1);
|
||||
}
|
||||
|
||||
var rules = globalOptions.validRules;
|
||||
for (j = 0; j < rules.length; j++) {
|
||||
var rule = rules[j];
|
||||
if (flag == rule.name) {
|
||||
var value;
|
||||
if (el.attr('type')!=null && el.attr('type')=='checkbox'){
|
||||
value = el.is(":checked")?'true':'';
|
||||
}
|
||||
else{
|
||||
value=el.val();
|
||||
};
|
||||
if (rule.validate.call(field, value) == x) {
|
||||
error = true;
|
||||
if (el.attr('type')!=null && el.attr('type').toLowerCase()=='file'){
|
||||
errorMsg = (msg == null)?'请选择文件。':msg;
|
||||
}
|
||||
else{
|
||||
errorMsg = (msg == null)?rule.defaultMsg:msg;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (error) {break;}
|
||||
}
|
||||
|
||||
//验证长度
|
||||
if ( minlength && !error){
|
||||
error = el.val().length < minlength;
|
||||
if (error && (msg==null || errorMsg=='')){
|
||||
errorMsg = '输入长度大于等于' + minlength;
|
||||
}
|
||||
};
|
||||
|
||||
//值区间
|
||||
if ($.inArray('number',valid)>=0 && range && !error){
|
||||
var values = range.split("~");
|
||||
|
||||
if(values.length==2){
|
||||
error = parseFloat(el.val())<parseFloat(values[0]) || parseFloat(el.val())>parseFloat(values[1]);
|
||||
if (error && (msg==null || errorMsg=='')){
|
||||
errorMsg = '输入值在[' + values[0] + '~' + values[1] + ']之间。';
|
||||
}
|
||||
}
|
||||
else{
|
||||
var values = range.split(",");
|
||||
if (values.length>0){
|
||||
//error = values.indexOf(el.val())<0;
|
||||
error = $.inArray(el.val(),values)<0;
|
||||
if (error && (msg==null || errorMsg=='')){
|
||||
errorMsg = '输入值为' +range +'的其中一个。';
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
//外部验证回调方法
|
||||
if (!error && globalOptions.callback){
|
||||
var params={
|
||||
msg:'',
|
||||
err:error
|
||||
};
|
||||
var b = $.ajaxSettings.async;
|
||||
$.ajaxSetup({async : false});
|
||||
globalOptions.callback(field,params);
|
||||
error = params.err;
|
||||
if (error && (msg==null || errorMsg=='')){
|
||||
errorMsg = params.msg;
|
||||
}
|
||||
else if(params.msg!=''){
|
||||
errorMsg = params.msg;
|
||||
}
|
||||
$.ajaxSetup({async : b});
|
||||
};
|
||||
|
||||
|
||||
var controlGroup = el.parents('.form-group');
|
||||
controlGroup.removeClass('has-error has-success');
|
||||
controlGroup.addClass(error==false?'has-success':'has-error');
|
||||
var form = el.parents("form");
|
||||
if(form){
|
||||
var fstyle = isformstyle(form);
|
||||
if(fstyle == 0){
|
||||
controlGroup.find("#valierr").remove();
|
||||
el.after('<span class="help-block" id="valierr">' + errorMsg +'</span>');
|
||||
}
|
||||
else if(fstyle == 1){
|
||||
|
||||
}
|
||||
else if (fstyle == 2){
|
||||
controlGroup.find("#valierr").remove();
|
||||
el.parent().after('<span class="help-block" id="valierr">' + errorMsg +'</span>');
|
||||
}
|
||||
};//end !form
|
||||
return !error;
|
||||
};
|
||||
|
||||
//表单验证方法
|
||||
var validationForm = function(obj) {
|
||||
|
||||
//1.丢失焦点事件
|
||||
$(obj).find('input, textarea').each(function(){
|
||||
var el = $(this);
|
||||
el.on('blur',function(){ // 失去焦点时
|
||||
valid = (el.attr('check-type')==undefined)?null:el.attr('check-type').split(' ');
|
||||
if (valid){
|
||||
validateField(this, valid);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
//2.如是文件选择则要处理onchange事件
|
||||
$(obj).find("input[type='file']").each(function(){
|
||||
var el = $(this);
|
||||
el.on('change',function(){ //
|
||||
valid = (el.attr('check-type')==undefined)?null:el.attr('check-type').split(' ');
|
||||
if (valid){
|
||||
validateField(this, valid);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
//3.设置必填的标志*号
|
||||
if (globalOptions.reqmark==true){
|
||||
if(fform_style==0){
|
||||
$(obj).find(".form-group>label").each(function(){
|
||||
var el=$(this);
|
||||
var controlGroup = el.parents('.form-group');
|
||||
controlGroup.removeClass('has-error has-success');
|
||||
controlGroup.find("#autoreqmark").remove();
|
||||
el.after('<span id="autoreqmark" style="color:#FF9966"> *</span>')
|
||||
});
|
||||
}
|
||||
else if(fform_style==1){
|
||||
|
||||
}
|
||||
else if(fform_style==2){
|
||||
|
||||
$(obj).find('input, textarea').each(function(){
|
||||
var el = $(this);
|
||||
var controlGroup = el.parents('.form-group');
|
||||
controlGroup.removeClass('has-error has-success');
|
||||
controlGroup.find("#valierr").remove();
|
||||
valid = (el.attr('check-type')==undefined)?null:el.attr('check-type').split(' ');
|
||||
if (valid){
|
||||
if ($.inArray('required',valid)>=0){
|
||||
el.parent().after('<span class="help-block" id="valierr" style="color:#FF9966">*</span>');
|
||||
}
|
||||
};
|
||||
});
|
||||
};
|
||||
};//end showrequired
|
||||
|
||||
};
|
||||
}(window.jQuery);
|
||||
Vendored
+1
File diff suppressed because one or more lines are too long
@@ -0,0 +1,144 @@
|
||||
/*
|
||||
Ajax 三级省市联动
|
||||
http://code.ciaoca.cn/
|
||||
日期:2012-7-18
|
||||
|
||||
settings 参数说明
|
||||
-----
|
||||
url:省市数据josn文件路径
|
||||
prov:默认省份
|
||||
city:默认城市
|
||||
dist:默认地区(县)
|
||||
nodata:无数据状态
|
||||
required:必选项
|
||||
------------------------------ */
|
||||
(function($){
|
||||
$.fn.citySelect=function(settings){
|
||||
if(this.length<1){return;};
|
||||
|
||||
// 默认值
|
||||
settings=$.extend({
|
||||
url:siteUrl+"public/js/city/city.min.js",
|
||||
prov:null,
|
||||
city:null,
|
||||
dist:null,
|
||||
nodata:null,
|
||||
required:true
|
||||
},settings);
|
||||
|
||||
var box_obj=this;
|
||||
var prov_obj=box_obj.find(".prov");
|
||||
var city_obj=box_obj.find(".city");
|
||||
var dist_obj=box_obj.find(".dist");
|
||||
var prov_val=settings.prov;
|
||||
var city_val=settings.city;
|
||||
var dist_val=settings.dist;
|
||||
var select_prehtml=(settings.required) ? "" : "<option value=''>请选择</option>";
|
||||
var city_json;
|
||||
|
||||
// 赋值市级函数
|
||||
var cityStart=function(){
|
||||
var prov_id=prov_obj.get(0).selectedIndex;
|
||||
if(!settings.required){
|
||||
prov_id--;
|
||||
};
|
||||
city_obj.empty().attr("disabled",true);
|
||||
dist_obj.empty().attr("disabled",true);
|
||||
|
||||
if(prov_id<0||typeof(city_json.citylist[prov_id].c)=="undefined"){
|
||||
if(settings.nodata=="none"){
|
||||
city_obj.css("display","none");
|
||||
dist_obj.css("display","none");
|
||||
}else if(settings.nodata=="hidden"){
|
||||
city_obj.css("visibility","hidden");
|
||||
dist_obj.css("visibility","hidden");
|
||||
};
|
||||
return;
|
||||
};
|
||||
|
||||
// 遍历赋值市级下拉列表
|
||||
temp_html=select_prehtml;
|
||||
$.each(city_json.citylist[prov_id].c,function(i,city){
|
||||
temp_html+="<option value='"+city.n+"'>"+city.n+"</option>";
|
||||
});
|
||||
city_obj.html(temp_html).attr("disabled",false).css({"display":"","visibility":""});
|
||||
distStart();
|
||||
};
|
||||
|
||||
// 赋值地区(县)函数
|
||||
var distStart=function(){
|
||||
var prov_id=prov_obj.get(0).selectedIndex;
|
||||
var city_id=city_obj.get(0).selectedIndex;
|
||||
if(!settings.required){
|
||||
prov_id--;
|
||||
city_id--;
|
||||
};
|
||||
dist_obj.empty().attr("disabled",true);
|
||||
|
||||
if(prov_id<0||city_id<0||typeof(city_json.citylist[prov_id].c[city_id].a)=="undefined"){
|
||||
if(settings.nodata=="none"){
|
||||
dist_obj.css("display","none");
|
||||
}else if(settings.nodata=="hidden"){
|
||||
dist_obj.css("visibility","hidden");
|
||||
};
|
||||
return;
|
||||
};
|
||||
|
||||
// 遍历赋值市级下拉列表
|
||||
temp_html=select_prehtml;
|
||||
$.each(city_json.citylist[prov_id].c[city_id].a,function(i,dist){
|
||||
temp_html+="<option value='"+dist.s+"'>"+dist.s+"</option>";
|
||||
});
|
||||
dist_obj.html(temp_html).attr("disabled",false).css({"display":"","visibility":""});
|
||||
};
|
||||
|
||||
var init=function(){
|
||||
// 遍历赋值省份下拉列表
|
||||
temp_html=select_prehtml;
|
||||
$.each(city_json.citylist,function(i,prov){
|
||||
temp_html+="<option value='"+prov.p+"'>"+prov.p+"</option>";
|
||||
});
|
||||
prov_obj.html(temp_html);
|
||||
|
||||
// 若有传入省份与市级的值,则选中。(setTimeout为兼容IE6而设置)
|
||||
setTimeout(function(){
|
||||
if(settings.prov!=null){
|
||||
prov_obj.val(settings.prov);
|
||||
cityStart();
|
||||
setTimeout(function(){
|
||||
if(settings.city!=null){
|
||||
city_obj.val(settings.city);
|
||||
distStart();
|
||||
setTimeout(function(){
|
||||
if(settings.dist!=null){
|
||||
dist_obj.val(settings.dist);
|
||||
};
|
||||
},1);
|
||||
};
|
||||
},1);
|
||||
};
|
||||
},1);
|
||||
|
||||
// 选择省份时发生事件
|
||||
prov_obj.bind("change",function(){
|
||||
cityStart();
|
||||
});
|
||||
|
||||
// 选择市级时发生事件
|
||||
city_obj.bind("change",function(){
|
||||
distStart();
|
||||
});
|
||||
};
|
||||
|
||||
// 设置省市json数据
|
||||
if(typeof(settings.url)=="string"){
|
||||
$.getJSON(settings.url,function(json){
|
||||
city_json=json;
|
||||
init();
|
||||
});
|
||||
}else{
|
||||
city_json=settings.url;
|
||||
init();
|
||||
};
|
||||
};
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,973 @@
|
||||
/*!
|
||||
* clipboard.js v2.0.6
|
||||
* https://clipboardjs.com/
|
||||
*
|
||||
* Licensed MIT © Zeno Rocha
|
||||
*/
|
||||
(function webpackUniversalModuleDefinition(root, factory) {
|
||||
if(typeof exports === 'object' && typeof module === 'object')
|
||||
module.exports = factory();
|
||||
else if(typeof define === 'function' && define.amd)
|
||||
define([], factory);
|
||||
else if(typeof exports === 'object')
|
||||
exports["ClipboardJS"] = factory();
|
||||
else
|
||||
root["ClipboardJS"] = factory();
|
||||
})(this, function() {
|
||||
return /******/ (function(modules) { // webpackBootstrap
|
||||
/******/ // The module cache
|
||||
/******/ var installedModules = {};
|
||||
/******/
|
||||
/******/ // The require function
|
||||
/******/ function __webpack_require__(moduleId) {
|
||||
/******/
|
||||
/******/ // Check if module is in cache
|
||||
/******/ if(installedModules[moduleId]) {
|
||||
/******/ return installedModules[moduleId].exports;
|
||||
/******/ }
|
||||
/******/ // Create a new module (and put it into the cache)
|
||||
/******/ var module = installedModules[moduleId] = {
|
||||
/******/ i: moduleId,
|
||||
/******/ l: false,
|
||||
/******/ exports: {}
|
||||
/******/ };
|
||||
/******/
|
||||
/******/ // Execute the module function
|
||||
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
|
||||
/******/
|
||||
/******/ // Flag the module as loaded
|
||||
/******/ module.l = true;
|
||||
/******/
|
||||
/******/ // Return the exports of the module
|
||||
/******/ return module.exports;
|
||||
/******/ }
|
||||
/******/
|
||||
/******/
|
||||
/******/ // expose the modules object (__webpack_modules__)
|
||||
/******/ __webpack_require__.m = modules;
|
||||
/******/
|
||||
/******/ // expose the module cache
|
||||
/******/ __webpack_require__.c = installedModules;
|
||||
/******/
|
||||
/******/ // define getter function for harmony exports
|
||||
/******/ __webpack_require__.d = function(exports, name, getter) {
|
||||
/******/ if(!__webpack_require__.o(exports, name)) {
|
||||
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
|
||||
/******/ }
|
||||
/******/ };
|
||||
/******/
|
||||
/******/ // define __esModule on exports
|
||||
/******/ __webpack_require__.r = function(exports) {
|
||||
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
|
||||
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
||||
/******/ }
|
||||
/******/ Object.defineProperty(exports, '__esModule', { value: true });
|
||||
/******/ };
|
||||
/******/
|
||||
/******/ // create a fake namespace object
|
||||
/******/ // mode & 1: value is a module id, require it
|
||||
/******/ // mode & 2: merge all properties of value into the ns
|
||||
/******/ // mode & 4: return value when already ns object
|
||||
/******/ // mode & 8|1: behave like require
|
||||
/******/ __webpack_require__.t = function(value, mode) {
|
||||
/******/ if(mode & 1) value = __webpack_require__(value);
|
||||
/******/ if(mode & 8) return value;
|
||||
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
|
||||
/******/ var ns = Object.create(null);
|
||||
/******/ __webpack_require__.r(ns);
|
||||
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
|
||||
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
|
||||
/******/ return ns;
|
||||
/******/ };
|
||||
/******/
|
||||
/******/ // getDefaultExport function for compatibility with non-harmony modules
|
||||
/******/ __webpack_require__.n = function(module) {
|
||||
/******/ var getter = module && module.__esModule ?
|
||||
/******/ function getDefault() { return module['default']; } :
|
||||
/******/ function getModuleExports() { return module; };
|
||||
/******/ __webpack_require__.d(getter, 'a', getter);
|
||||
/******/ return getter;
|
||||
/******/ };
|
||||
/******/
|
||||
/******/ // Object.prototype.hasOwnProperty.call
|
||||
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
|
||||
/******/
|
||||
/******/ // __webpack_public_path__
|
||||
/******/ __webpack_require__.p = "";
|
||||
/******/
|
||||
/******/
|
||||
/******/ // Load entry module and return exports
|
||||
/******/ return __webpack_require__(__webpack_require__.s = 6);
|
||||
/******/ })
|
||||
/************************************************************************/
|
||||
/******/ ([
|
||||
/* 0 */
|
||||
/***/ (function(module, exports) {
|
||||
|
||||
function select(element) {
|
||||
var selectedText;
|
||||
|
||||
if (element.nodeName === 'SELECT') {
|
||||
element.focus();
|
||||
|
||||
selectedText = element.value;
|
||||
}
|
||||
else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {
|
||||
var isReadOnly = element.hasAttribute('readonly');
|
||||
|
||||
if (!isReadOnly) {
|
||||
element.setAttribute('readonly', '');
|
||||
}
|
||||
|
||||
element.select();
|
||||
element.setSelectionRange(0, element.value.length);
|
||||
|
||||
if (!isReadOnly) {
|
||||
element.removeAttribute('readonly');
|
||||
}
|
||||
|
||||
selectedText = element.value;
|
||||
}
|
||||
else {
|
||||
if (element.hasAttribute('contenteditable')) {
|
||||
element.focus();
|
||||
}
|
||||
|
||||
var selection = window.getSelection();
|
||||
var range = document.createRange();
|
||||
|
||||
range.selectNodeContents(element);
|
||||
selection.removeAllRanges();
|
||||
selection.addRange(range);
|
||||
|
||||
selectedText = selection.toString();
|
||||
}
|
||||
|
||||
return selectedText;
|
||||
}
|
||||
|
||||
module.exports = select;
|
||||
|
||||
|
||||
/***/ }),
|
||||
/* 1 */
|
||||
/***/ (function(module, exports) {
|
||||
|
||||
function E () {
|
||||
// Keep this empty so it's easier to inherit from
|
||||
// (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)
|
||||
}
|
||||
|
||||
E.prototype = {
|
||||
on: function (name, callback, ctx) {
|
||||
var e = this.e || (this.e = {});
|
||||
|
||||
(e[name] || (e[name] = [])).push({
|
||||
fn: callback,
|
||||
ctx: ctx
|
||||
});
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
once: function (name, callback, ctx) {
|
||||
var self = this;
|
||||
function listener () {
|
||||
self.off(name, listener);
|
||||
callback.apply(ctx, arguments);
|
||||
};
|
||||
|
||||
listener._ = callback
|
||||
return this.on(name, listener, ctx);
|
||||
},
|
||||
|
||||
emit: function (name) {
|
||||
var data = [].slice.call(arguments, 1);
|
||||
var evtArr = ((this.e || (this.e = {}))[name] || []).slice();
|
||||
var i = 0;
|
||||
var len = evtArr.length;
|
||||
|
||||
for (i; i < len; i++) {
|
||||
evtArr[i].fn.apply(evtArr[i].ctx, data);
|
||||
}
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
off: function (name, callback) {
|
||||
var e = this.e || (this.e = {});
|
||||
var evts = e[name];
|
||||
var liveEvents = [];
|
||||
|
||||
if (evts && callback) {
|
||||
for (var i = 0, len = evts.length; i < len; i++) {
|
||||
if (evts[i].fn !== callback && evts[i].fn._ !== callback)
|
||||
liveEvents.push(evts[i]);
|
||||
}
|
||||
}
|
||||
|
||||
// Remove event from queue to prevent memory leak
|
||||
// Suggested by https://github.com/lazd
|
||||
// Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910
|
||||
|
||||
(liveEvents.length)
|
||||
? e[name] = liveEvents
|
||||
: delete e[name];
|
||||
|
||||
return this;
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = E;
|
||||
module.exports.TinyEmitter = E;
|
||||
|
||||
|
||||
/***/ }),
|
||||
/* 2 */
|
||||
/***/ (function(module, exports, __webpack_require__) {
|
||||
|
||||
var is = __webpack_require__(3);
|
||||
var delegate = __webpack_require__(4);
|
||||
|
||||
/**
|
||||
* Validates all params and calls the right
|
||||
* listener function based on its target type.
|
||||
*
|
||||
* @param {String|HTMLElement|HTMLCollection|NodeList} target
|
||||
* @param {String} type
|
||||
* @param {Function} callback
|
||||
* @return {Object}
|
||||
*/
|
||||
function listen(target, type, callback) {
|
||||
if (!target && !type && !callback) {
|
||||
throw new Error('Missing required arguments');
|
||||
}
|
||||
|
||||
if (!is.string(type)) {
|
||||
throw new TypeError('Second argument must be a String');
|
||||
}
|
||||
|
||||
if (!is.fn(callback)) {
|
||||
throw new TypeError('Third argument must be a Function');
|
||||
}
|
||||
|
||||
if (is.node(target)) {
|
||||
return listenNode(target, type, callback);
|
||||
}
|
||||
else if (is.nodeList(target)) {
|
||||
return listenNodeList(target, type, callback);
|
||||
}
|
||||
else if (is.string(target)) {
|
||||
return listenSelector(target, type, callback);
|
||||
}
|
||||
else {
|
||||
throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds an event listener to a HTML element
|
||||
* and returns a remove listener function.
|
||||
*
|
||||
* @param {HTMLElement} node
|
||||
* @param {String} type
|
||||
* @param {Function} callback
|
||||
* @return {Object}
|
||||
*/
|
||||
function listenNode(node, type, callback) {
|
||||
node.addEventListener(type, callback);
|
||||
|
||||
return {
|
||||
destroy: function() {
|
||||
node.removeEventListener(type, callback);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an event listener to a list of HTML elements
|
||||
* and returns a remove listener function.
|
||||
*
|
||||
* @param {NodeList|HTMLCollection} nodeList
|
||||
* @param {String} type
|
||||
* @param {Function} callback
|
||||
* @return {Object}
|
||||
*/
|
||||
function listenNodeList(nodeList, type, callback) {
|
||||
Array.prototype.forEach.call(nodeList, function(node) {
|
||||
node.addEventListener(type, callback);
|
||||
});
|
||||
|
||||
return {
|
||||
destroy: function() {
|
||||
Array.prototype.forEach.call(nodeList, function(node) {
|
||||
node.removeEventListener(type, callback);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an event listener to a selector
|
||||
* and returns a remove listener function.
|
||||
*
|
||||
* @param {String} selector
|
||||
* @param {String} type
|
||||
* @param {Function} callback
|
||||
* @return {Object}
|
||||
*/
|
||||
function listenSelector(selector, type, callback) {
|
||||
return delegate(document.body, selector, type, callback);
|
||||
}
|
||||
|
||||
module.exports = listen;
|
||||
|
||||
|
||||
/***/ }),
|
||||
/* 3 */
|
||||
/***/ (function(module, exports) {
|
||||
|
||||
/**
|
||||
* Check if argument is a HTML element.
|
||||
*
|
||||
* @param {Object} value
|
||||
* @return {Boolean}
|
||||
*/
|
||||
exports.node = function(value) {
|
||||
return value !== undefined
|
||||
&& value instanceof HTMLElement
|
||||
&& value.nodeType === 1;
|
||||
};
|
||||
|
||||
/**
|
||||
* Check if argument is a list of HTML elements.
|
||||
*
|
||||
* @param {Object} value
|
||||
* @return {Boolean}
|
||||
*/
|
||||
exports.nodeList = function(value) {
|
||||
var type = Object.prototype.toString.call(value);
|
||||
|
||||
return value !== undefined
|
||||
&& (type === '[object NodeList]' || type === '[object HTMLCollection]')
|
||||
&& ('length' in value)
|
||||
&& (value.length === 0 || exports.node(value[0]));
|
||||
};
|
||||
|
||||
/**
|
||||
* Check if argument is a string.
|
||||
*
|
||||
* @param {Object} value
|
||||
* @return {Boolean}
|
||||
*/
|
||||
exports.string = function(value) {
|
||||
return typeof value === 'string'
|
||||
|| value instanceof String;
|
||||
};
|
||||
|
||||
/**
|
||||
* Check if argument is a function.
|
||||
*
|
||||
* @param {Object} value
|
||||
* @return {Boolean}
|
||||
*/
|
||||
exports.fn = function(value) {
|
||||
var type = Object.prototype.toString.call(value);
|
||||
|
||||
return type === '[object Function]';
|
||||
};
|
||||
|
||||
|
||||
/***/ }),
|
||||
/* 4 */
|
||||
/***/ (function(module, exports, __webpack_require__) {
|
||||
|
||||
var closest = __webpack_require__(5);
|
||||
|
||||
/**
|
||||
* Delegates event to a selector.
|
||||
*
|
||||
* @param {Element} element
|
||||
* @param {String} selector
|
||||
* @param {String} type
|
||||
* @param {Function} callback
|
||||
* @param {Boolean} useCapture
|
||||
* @return {Object}
|
||||
*/
|
||||
function _delegate(element, selector, type, callback, useCapture) {
|
||||
var listenerFn = listener.apply(this, arguments);
|
||||
|
||||
element.addEventListener(type, listenerFn, useCapture);
|
||||
|
||||
return {
|
||||
destroy: function() {
|
||||
element.removeEventListener(type, listenerFn, useCapture);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Delegates event to a selector.
|
||||
*
|
||||
* @param {Element|String|Array} [elements]
|
||||
* @param {String} selector
|
||||
* @param {String} type
|
||||
* @param {Function} callback
|
||||
* @param {Boolean} useCapture
|
||||
* @return {Object}
|
||||
*/
|
||||
function delegate(elements, selector, type, callback, useCapture) {
|
||||
// Handle the regular Element usage
|
||||
if (typeof elements.addEventListener === 'function') {
|
||||
return _delegate.apply(null, arguments);
|
||||
}
|
||||
|
||||
// Handle Element-less usage, it defaults to global delegation
|
||||
if (typeof type === 'function') {
|
||||
// Use `document` as the first parameter, then apply arguments
|
||||
// This is a short way to .unshift `arguments` without running into deoptimizations
|
||||
return _delegate.bind(null, document).apply(null, arguments);
|
||||
}
|
||||
|
||||
// Handle Selector-based usage
|
||||
if (typeof elements === 'string') {
|
||||
elements = document.querySelectorAll(elements);
|
||||
}
|
||||
|
||||
// Handle Array-like based usage
|
||||
return Array.prototype.map.call(elements, function (element) {
|
||||
return _delegate(element, selector, type, callback, useCapture);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds closest match and invokes callback.
|
||||
*
|
||||
* @param {Element} element
|
||||
* @param {String} selector
|
||||
* @param {String} type
|
||||
* @param {Function} callback
|
||||
* @return {Function}
|
||||
*/
|
||||
function listener(element, selector, type, callback) {
|
||||
return function(e) {
|
||||
e.delegateTarget = closest(e.target, selector);
|
||||
|
||||
if (e.delegateTarget) {
|
||||
callback.call(element, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = delegate;
|
||||
|
||||
|
||||
/***/ }),
|
||||
/* 5 */
|
||||
/***/ (function(module, exports) {
|
||||
|
||||
var DOCUMENT_NODE_TYPE = 9;
|
||||
|
||||
/**
|
||||
* A polyfill for Element.matches()
|
||||
*/
|
||||
if (typeof Element !== 'undefined' && !Element.prototype.matches) {
|
||||
var proto = Element.prototype;
|
||||
|
||||
proto.matches = proto.matchesSelector ||
|
||||
proto.mozMatchesSelector ||
|
||||
proto.msMatchesSelector ||
|
||||
proto.oMatchesSelector ||
|
||||
proto.webkitMatchesSelector;
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds the closest parent that matches a selector.
|
||||
*
|
||||
* @param {Element} element
|
||||
* @param {String} selector
|
||||
* @return {Function}
|
||||
*/
|
||||
function closest (element, selector) {
|
||||
while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {
|
||||
if (typeof element.matches === 'function' &&
|
||||
element.matches(selector)) {
|
||||
return element;
|
||||
}
|
||||
element = element.parentNode;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = closest;
|
||||
|
||||
|
||||
/***/ }),
|
||||
/* 6 */
|
||||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||||
|
||||
"use strict";
|
||||
__webpack_require__.r(__webpack_exports__);
|
||||
|
||||
// EXTERNAL MODULE: ./node_modules/select/src/select.js
|
||||
var src_select = __webpack_require__(0);
|
||||
var select_default = /*#__PURE__*/__webpack_require__.n(src_select);
|
||||
|
||||
// CONCATENATED MODULE: ./src/clipboard-action.js
|
||||
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
||||
|
||||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||||
|
||||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Inner class which performs selection from either `text` or `target`
|
||||
* properties and then executes copy or cut operations.
|
||||
*/
|
||||
|
||||
var clipboard_action_ClipboardAction = function () {
|
||||
/**
|
||||
* @param {Object} options
|
||||
*/
|
||||
function ClipboardAction(options) {
|
||||
_classCallCheck(this, ClipboardAction);
|
||||
|
||||
this.resolveOptions(options);
|
||||
this.initSelection();
|
||||
}
|
||||
|
||||
/**
|
||||
* Defines base properties passed from constructor.
|
||||
* @param {Object} options
|
||||
*/
|
||||
|
||||
|
||||
_createClass(ClipboardAction, [{
|
||||
key: 'resolveOptions',
|
||||
value: function resolveOptions() {
|
||||
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
||||
|
||||
this.action = options.action;
|
||||
this.container = options.container;
|
||||
this.emitter = options.emitter;
|
||||
this.target = options.target;
|
||||
this.text = options.text;
|
||||
this.trigger = options.trigger;
|
||||
|
||||
this.selectedText = '';
|
||||
}
|
||||
|
||||
/**
|
||||
* Decides which selection strategy is going to be applied based
|
||||
* on the existence of `text` and `target` properties.
|
||||
*/
|
||||
|
||||
}, {
|
||||
key: 'initSelection',
|
||||
value: function initSelection() {
|
||||
if (this.text) {
|
||||
this.selectFake();
|
||||
} else if (this.target) {
|
||||
this.selectTarget();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a fake textarea element, sets its value from `text` property,
|
||||
* and makes a selection on it.
|
||||
*/
|
||||
|
||||
}, {
|
||||
key: 'selectFake',
|
||||
value: function selectFake() {
|
||||
var _this = this;
|
||||
|
||||
var isRTL = document.documentElement.getAttribute('dir') == 'rtl';
|
||||
|
||||
this.removeFake();
|
||||
|
||||
this.fakeHandlerCallback = function () {
|
||||
return _this.removeFake();
|
||||
};
|
||||
this.fakeHandler = this.container.addEventListener('click', this.fakeHandlerCallback) || true;
|
||||
|
||||
this.fakeElem = document.createElement('textarea');
|
||||
// Prevent zooming on iOS
|
||||
this.fakeElem.style.fontSize = '12pt';
|
||||
// Reset box model
|
||||
this.fakeElem.style.border = '0';
|
||||
this.fakeElem.style.padding = '0';
|
||||
this.fakeElem.style.margin = '0';
|
||||
// Move element out of screen horizontally
|
||||
this.fakeElem.style.position = 'absolute';
|
||||
this.fakeElem.style[isRTL ? 'right' : 'left'] = '-9999px';
|
||||
// Move element to the same position vertically
|
||||
var yPosition = window.pageYOffset || document.documentElement.scrollTop;
|
||||
this.fakeElem.style.top = yPosition + 'px';
|
||||
|
||||
this.fakeElem.setAttribute('readonly', '');
|
||||
this.fakeElem.value = this.text;
|
||||
|
||||
this.container.appendChild(this.fakeElem);
|
||||
|
||||
this.selectedText = select_default()(this.fakeElem);
|
||||
this.copyText();
|
||||
}
|
||||
|
||||
/**
|
||||
* Only removes the fake element after another click event, that way
|
||||
* a user can hit `Ctrl+C` to copy because selection still exists.
|
||||
*/
|
||||
|
||||
}, {
|
||||
key: 'removeFake',
|
||||
value: function removeFake() {
|
||||
if (this.fakeHandler) {
|
||||
this.container.removeEventListener('click', this.fakeHandlerCallback);
|
||||
this.fakeHandler = null;
|
||||
this.fakeHandlerCallback = null;
|
||||
}
|
||||
|
||||
if (this.fakeElem) {
|
||||
this.container.removeChild(this.fakeElem);
|
||||
this.fakeElem = null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Selects the content from element passed on `target` property.
|
||||
*/
|
||||
|
||||
}, {
|
||||
key: 'selectTarget',
|
||||
value: function selectTarget() {
|
||||
this.selectedText = select_default()(this.target);
|
||||
this.copyText();
|
||||
}
|
||||
|
||||
/**
|
||||
* Executes the copy operation based on the current selection.
|
||||
*/
|
||||
|
||||
}, {
|
||||
key: 'copyText',
|
||||
value: function copyText() {
|
||||
var succeeded = void 0;
|
||||
|
||||
try {
|
||||
succeeded = document.execCommand(this.action);
|
||||
} catch (err) {
|
||||
succeeded = false;
|
||||
}
|
||||
|
||||
this.handleResult(succeeded);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fires an event based on the copy operation result.
|
||||
* @param {Boolean} succeeded
|
||||
*/
|
||||
|
||||
}, {
|
||||
key: 'handleResult',
|
||||
value: function handleResult(succeeded) {
|
||||
this.emitter.emit(succeeded ? 'success' : 'error', {
|
||||
action: this.action,
|
||||
text: this.selectedText,
|
||||
trigger: this.trigger,
|
||||
clearSelection: this.clearSelection.bind(this)
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Moves focus away from `target` and back to the trigger, removes current selection.
|
||||
*/
|
||||
|
||||
}, {
|
||||
key: 'clearSelection',
|
||||
value: function clearSelection() {
|
||||
if (this.trigger) {
|
||||
this.trigger.focus();
|
||||
}
|
||||
document.activeElement.blur();
|
||||
window.getSelection().removeAllRanges();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the `action` to be performed which can be either 'copy' or 'cut'.
|
||||
* @param {String} action
|
||||
*/
|
||||
|
||||
}, {
|
||||
key: 'destroy',
|
||||
|
||||
|
||||
/**
|
||||
* Destroy lifecycle.
|
||||
*/
|
||||
value: function destroy() {
|
||||
this.removeFake();
|
||||
}
|
||||
}, {
|
||||
key: 'action',
|
||||
set: function set() {
|
||||
var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'copy';
|
||||
|
||||
this._action = action;
|
||||
|
||||
if (this._action !== 'copy' && this._action !== 'cut') {
|
||||
throw new Error('Invalid "action" value, use either "copy" or "cut"');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the `action` property.
|
||||
* @return {String}
|
||||
*/
|
||||
,
|
||||
get: function get() {
|
||||
return this._action;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the `target` property using an element
|
||||
* that will be have its content copied.
|
||||
* @param {Element} target
|
||||
*/
|
||||
|
||||
}, {
|
||||
key: 'target',
|
||||
set: function set(target) {
|
||||
if (target !== undefined) {
|
||||
if (target && (typeof target === 'undefined' ? 'undefined' : _typeof(target)) === 'object' && target.nodeType === 1) {
|
||||
if (this.action === 'copy' && target.hasAttribute('disabled')) {
|
||||
throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');
|
||||
}
|
||||
|
||||
if (this.action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {
|
||||
throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');
|
||||
}
|
||||
|
||||
this._target = target;
|
||||
} else {
|
||||
throw new Error('Invalid "target" value, use a valid Element');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the `target` property.
|
||||
* @return {String|HTMLElement}
|
||||
*/
|
||||
,
|
||||
get: function get() {
|
||||
return this._target;
|
||||
}
|
||||
}]);
|
||||
|
||||
return ClipboardAction;
|
||||
}();
|
||||
|
||||
/* harmony default export */ var clipboard_action = (clipboard_action_ClipboardAction);
|
||||
// EXTERNAL MODULE: ./node_modules/tiny-emitter/index.js
|
||||
var tiny_emitter = __webpack_require__(1);
|
||||
var tiny_emitter_default = /*#__PURE__*/__webpack_require__.n(tiny_emitter);
|
||||
|
||||
// EXTERNAL MODULE: ./node_modules/good-listener/src/listen.js
|
||||
var listen = __webpack_require__(2);
|
||||
var listen_default = /*#__PURE__*/__webpack_require__.n(listen);
|
||||
|
||||
// CONCATENATED MODULE: ./src/clipboard.js
|
||||
var clipboard_typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
||||
|
||||
var clipboard_createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||||
|
||||
function clipboard_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
||||
|
||||
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
||||
|
||||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Base class which takes one or more elements, adds event listeners to them,
|
||||
* and instantiates a new `ClipboardAction` on each click.
|
||||
*/
|
||||
|
||||
var clipboard_Clipboard = function (_Emitter) {
|
||||
_inherits(Clipboard, _Emitter);
|
||||
|
||||
/**
|
||||
* @param {String|HTMLElement|HTMLCollection|NodeList} trigger
|
||||
* @param {Object} options
|
||||
*/
|
||||
function Clipboard(trigger, options) {
|
||||
clipboard_classCallCheck(this, Clipboard);
|
||||
|
||||
var _this = _possibleConstructorReturn(this, (Clipboard.__proto__ || Object.getPrototypeOf(Clipboard)).call(this));
|
||||
|
||||
_this.resolveOptions(options);
|
||||
_this.listenClick(trigger);
|
||||
return _this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Defines if attributes would be resolved using internal setter functions
|
||||
* or custom functions that were passed in the constructor.
|
||||
* @param {Object} options
|
||||
*/
|
||||
|
||||
|
||||
clipboard_createClass(Clipboard, [{
|
||||
key: 'resolveOptions',
|
||||
value: function resolveOptions() {
|
||||
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
||||
|
||||
this.action = typeof options.action === 'function' ? options.action : this.defaultAction;
|
||||
this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;
|
||||
this.text = typeof options.text === 'function' ? options.text : this.defaultText;
|
||||
this.container = clipboard_typeof(options.container) === 'object' ? options.container : document.body;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a click event listener to the passed trigger.
|
||||
* @param {String|HTMLElement|HTMLCollection|NodeList} trigger
|
||||
*/
|
||||
|
||||
}, {
|
||||
key: 'listenClick',
|
||||
value: function listenClick(trigger) {
|
||||
var _this2 = this;
|
||||
|
||||
this.listener = listen_default()(trigger, 'click', function (e) {
|
||||
return _this2.onClick(e);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Defines a new `ClipboardAction` on each click event.
|
||||
* @param {Event} e
|
||||
*/
|
||||
|
||||
}, {
|
||||
key: 'onClick',
|
||||
value: function onClick(e) {
|
||||
var trigger = e.delegateTarget || e.currentTarget;
|
||||
|
||||
if (this.clipboardAction) {
|
||||
this.clipboardAction = null;
|
||||
}
|
||||
|
||||
this.clipboardAction = new clipboard_action({
|
||||
action: this.action(trigger),
|
||||
target: this.target(trigger),
|
||||
text: this.text(trigger),
|
||||
container: this.container,
|
||||
trigger: trigger,
|
||||
emitter: this
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Default `action` lookup function.
|
||||
* @param {Element} trigger
|
||||
*/
|
||||
|
||||
}, {
|
||||
key: 'defaultAction',
|
||||
value: function defaultAction(trigger) {
|
||||
return getAttributeValue('action', trigger);
|
||||
}
|
||||
|
||||
/**
|
||||
* Default `target` lookup function.
|
||||
* @param {Element} trigger
|
||||
*/
|
||||
|
||||
}, {
|
||||
key: 'defaultTarget',
|
||||
value: function defaultTarget(trigger) {
|
||||
var selector = getAttributeValue('target', trigger);
|
||||
|
||||
if (selector) {
|
||||
return document.querySelector(selector);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the support of the given action, or all actions if no action is
|
||||
* given.
|
||||
* @param {String} [action]
|
||||
*/
|
||||
|
||||
}, {
|
||||
key: 'defaultText',
|
||||
|
||||
|
||||
/**
|
||||
* Default `text` lookup function.
|
||||
* @param {Element} trigger
|
||||
*/
|
||||
value: function defaultText(trigger) {
|
||||
return getAttributeValue('text', trigger);
|
||||
}
|
||||
|
||||
/**
|
||||
* Destroy lifecycle.
|
||||
*/
|
||||
|
||||
}, {
|
||||
key: 'destroy',
|
||||
value: function destroy() {
|
||||
this.listener.destroy();
|
||||
|
||||
if (this.clipboardAction) {
|
||||
this.clipboardAction.destroy();
|
||||
this.clipboardAction = null;
|
||||
}
|
||||
}
|
||||
}], [{
|
||||
key: 'isSupported',
|
||||
value: function isSupported() {
|
||||
var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut'];
|
||||
|
||||
var actions = typeof action === 'string' ? [action] : action;
|
||||
var support = !!document.queryCommandSupported;
|
||||
|
||||
actions.forEach(function (action) {
|
||||
support = support && !!document.queryCommandSupported(action);
|
||||
});
|
||||
|
||||
return support;
|
||||
}
|
||||
}]);
|
||||
|
||||
return Clipboard;
|
||||
}(tiny_emitter_default.a);
|
||||
|
||||
/**
|
||||
* Helper function to retrieve attribute value.
|
||||
* @param {String} suffix
|
||||
* @param {Element} element
|
||||
*/
|
||||
|
||||
|
||||
function getAttributeValue(suffix, element) {
|
||||
var attribute = 'data-clipboard-' + suffix;
|
||||
|
||||
if (!element.hasAttribute(attribute)) {
|
||||
return;
|
||||
}
|
||||
|
||||
return element.getAttribute(attribute);
|
||||
}
|
||||
|
||||
/* harmony default export */ var clipboard = __webpack_exports__["default"] = (clipboard_Clipboard);
|
||||
|
||||
/***/ })
|
||||
/******/ ])["default"];
|
||||
});
|
||||
@@ -0,0 +1,339 @@
|
||||
function tsAlert(content){
|
||||
var html = '<div id="tsalert" class="alert alert-info text-center">'+content+' <span id="alert_daojishi"></span></div>';
|
||||
$('body').append(html);
|
||||
//倒计时
|
||||
var step = 10;
|
||||
var _res = setInterval(function() {
|
||||
step-=1;
|
||||
$('#alert_daojishi').html(step);
|
||||
if(step <= 0){
|
||||
$("#tsalert").detach();
|
||||
clearInterval(_res);//清除setInterval
|
||||
}
|
||||
},1000);
|
||||
}
|
||||
//提示
|
||||
function tsNotice(msg,title){
|
||||
|
||||
$('#myModal').modal('hide');
|
||||
|
||||
var chuangkou = '<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <div class="modal-title" id="myModalLabel">提示</div> <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">关闭</span></button> </div> <div class="modal-body"> </div> <div class="modal-footer"> <!--<button type="button" class="btn btn-primary btn-sm" data-dismiss="modal">关闭</button>--> </div> </div> </div> </div>';
|
||||
|
||||
$('body').prepend(chuangkou);
|
||||
|
||||
if(title==''){
|
||||
title = '提示';
|
||||
}
|
||||
$(".modal-body").html(msg);
|
||||
$(".modal-title").html(title);
|
||||
$('#myModal').modal('show');
|
||||
//return false;
|
||||
}
|
||||
|
||||
//签到
|
||||
function qianDao(){
|
||||
$.post(siteUrl+'index.php?app=user&ac=signin',function(rs){
|
||||
if(rs==2){
|
||||
tsNotice('请登录后再签到!');
|
||||
}else if(rs==1){
|
||||
$.get(siteUrl+'index.php?app=user&ac=signin&ts=ajax',function(rs){
|
||||
$("#qiandao").html(rs);
|
||||
})
|
||||
}else{
|
||||
tsNotice('签到失败!');
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
/*!刷新验证码*/
|
||||
function newgdcode(obj, url) {
|
||||
obj.src = url + "&nowtime=" + new Date().getTime()
|
||||
}
|
||||
|
||||
function changeImageCode() {
|
||||
var imgsrc = $("#imagecode")[0].src;
|
||||
$("#imagecode").attr('src',imgsrc+"&nowtime=" + new Date().getTime());
|
||||
}
|
||||
|
||||
/*!搜索点击*/
|
||||
function searchon() {
|
||||
$("#searchto").submit()
|
||||
}
|
||||
/*!用户关注*/
|
||||
function follow(userid, token) {
|
||||
$.post(siteUrl + "index.php?app=user&ac=follow&ts=do", {
|
||||
"userid": userid,
|
||||
"token": token
|
||||
},
|
||||
function(json) {
|
||||
if (json.status == 0) {
|
||||
tsNotice(json.msg);
|
||||
} else {
|
||||
if (json.status == 1) {
|
||||
tsNotice(json.msg);
|
||||
} else {
|
||||
if (json.status == 2) {
|
||||
tsNotice(json.msg);
|
||||
window.location.reload()
|
||||
}
|
||||
}
|
||||
}
|
||||
},'json')
|
||||
}
|
||||
/*!取消用户关注*/
|
||||
function unfollow(userid, token) {
|
||||
$.post(siteUrl + "index.php?app=user&ac=follow&ts=un", {
|
||||
"userid": userid,
|
||||
"token": token
|
||||
},
|
||||
function(json) {
|
||||
if (json.status == 0) {
|
||||
tsNotice(json.msg);
|
||||
} else {
|
||||
if (json.status == 1) {
|
||||
tsNotice(json.msg);
|
||||
window.location.reload()
|
||||
}
|
||||
}
|
||||
},'json')
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* POST数据,返回JSON
|
||||
* url 必需。规定把请求发送到哪个 URL。
|
||||
* datas 可选。映射或字符串值。规定连同请求发送到服务器的数据。
|
||||
*/
|
||||
function tsPost(url,datas){
|
||||
$.post(siteUrl+url,datas,function(rs){
|
||||
|
||||
if(rs.url){
|
||||
|
||||
//再来个提示
|
||||
tsNotice(rs.msg+'<br /><span class="text-danger" id="notice_daojishi">3</span>秒后自动跳转...');
|
||||
|
||||
var step = 3;
|
||||
var _res = setInterval(function() {
|
||||
|
||||
$('#notice_daojishi').html(step);
|
||||
step-=1;
|
||||
if(step <= 0){
|
||||
window.location = rs.url;
|
||||
clearInterval(_res);//清除setInterval
|
||||
}
|
||||
},1000);
|
||||
|
||||
}else{
|
||||
tsNotice(rs.msg);
|
||||
}
|
||||
|
||||
|
||||
},'json')
|
||||
}
|
||||
|
||||
jQuery(document).ready(function(){
|
||||
$('#comm-form').on('submit', function() {
|
||||
//alert(event.type);
|
||||
$('button[type="submit"]').html('发送中...');
|
||||
$('button[type="submit"]').attr("disabled", true);
|
||||
|
||||
$.ajax({
|
||||
cache: true,
|
||||
type: "POST",
|
||||
url:$(this).prop('action')+'&js=1',
|
||||
data:$(this).serialize(),
|
||||
dataType: "json",
|
||||
async: false,
|
||||
|
||||
error: function(request) {
|
||||
tsNotice('请求失败');
|
||||
$('button[type="submit"]').removeAttr("disabled");
|
||||
$('button[type="submit"]').html('重新提交');
|
||||
},
|
||||
|
||||
success: function(rs) {
|
||||
|
||||
if(rs.url){
|
||||
|
||||
//再来个提示
|
||||
tsNotice(rs.msg+'<br /><span class="text-danger" id="notice_daojishi">3</span>秒后自动跳转...');
|
||||
|
||||
var step = 3;
|
||||
var _res = setInterval(function() {
|
||||
|
||||
$('#notice_daojishi').html(step);
|
||||
step-=1;
|
||||
if(step <= 0){
|
||||
window.location = rs.url;
|
||||
clearInterval(_res);//清除setInterval
|
||||
}
|
||||
},1000);
|
||||
|
||||
|
||||
|
||||
}else{
|
||||
tsNotice(rs.msg);
|
||||
$('button[type="submit"]').removeAttr("disabled");
|
||||
$('button[type="submit"]').html('重新提交');
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
//前台提交验证
|
||||
$(function(){
|
||||
$("#comm-form").validation();
|
||||
//.注册
|
||||
$("#comm-submit").on('click',function(event){
|
||||
// 2.最后要调用 valid()方法。
|
||||
// valide(object,msg),提示信息显示,object位置后面增加提示信息。如不填object 则自动找最后一个button submit.
|
||||
// valide(msg)
|
||||
if ($("#comm-form").valid(this,'填写信息不完整。')==false){
|
||||
return false;
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
//发送手机验证码
|
||||
function sendPhoneCode(typeid,vaptcha_token,vaptcha_server){
|
||||
var phone = $("#myphone").val();
|
||||
var authcode = $("#authcode").val();
|
||||
if(phone==''){
|
||||
tsNotice('手机号码不能为空!');
|
||||
return false;
|
||||
}
|
||||
if(authcode==''){
|
||||
tsNotice('图片验证码不能为空!');
|
||||
return false;
|
||||
}
|
||||
$.post(siteUrl+'index.php?app=pubs&ac=phone',{'phone':phone,'authcode':authcode,'typeid':typeid,'vaptcha_token':vaptcha_token,'vaptcha_server':vaptcha_server},function(rs){
|
||||
if (rs.status == 0) {
|
||||
tsNotice(rs.msg);
|
||||
} else if(rs.status==1) {
|
||||
var step = 59;
|
||||
$('#mybtn').val('重新发送60');
|
||||
var _res = setInterval(function()
|
||||
{
|
||||
$("#mybtn").attr("disabled", true);//设置disabled属性
|
||||
$('#mybtn').html('重新发送'+step);
|
||||
step-=1;
|
||||
if(step <= 0){
|
||||
$("#mybtn").removeAttr("disabled"); //移除disabled属性
|
||||
$('#mybtn').html('获取验证码');
|
||||
clearInterval(_res);//清除setInterval
|
||||
}
|
||||
},1000);
|
||||
}
|
||||
|
||||
},'json');
|
||||
}
|
||||
|
||||
//发送Email验证码
|
||||
function sendEmailCode(typeid,vaptcha_token,vaptcha_server){
|
||||
var email = $("#myemail").val();
|
||||
var authcode = $("#authcode").val();
|
||||
if(email==''){
|
||||
tsNotice('Email不能为空!');
|
||||
return false;
|
||||
}
|
||||
$.post(siteUrl+'index.php?app=pubs&ac=email',{
|
||||
'email':email,
|
||||
'authcode':authcode,
|
||||
'typeid':typeid,
|
||||
'vaptcha_token':vaptcha_token,
|
||||
'vaptcha_server':vaptcha_server
|
||||
},function(rs){
|
||||
if (rs.status == 0) {
|
||||
tsNotice(rs.msg);
|
||||
} else if(rs.status==1) {
|
||||
var step = 59;
|
||||
$('#mybtn').val('重新发送60');
|
||||
var _res = setInterval(function()
|
||||
{
|
||||
$("#mybtn").attr("disabled", true);//设置disabled属性
|
||||
$('#mybtn').html('重新发送'+step);
|
||||
step-=1;
|
||||
if(step <= 0){
|
||||
$("#mybtn").removeAttr("disabled"); //移除disabled属性
|
||||
$('#mybtn').html('获取验证码');
|
||||
clearInterval(_res);//清除setInterval
|
||||
}
|
||||
},1000);
|
||||
}
|
||||
|
||||
},'json');
|
||||
}
|
||||
|
||||
function NumberCheck(t){
|
||||
var num = t.value;
|
||||
var re=/^\d*$/;
|
||||
if(!re.test(num)){
|
||||
isNaN(parseInt(num))?t.value=0:t.value=parseInt(num);
|
||||
}
|
||||
}
|
||||
|
||||
//图片预览
|
||||
function imgView () {
|
||||
var r= new FileReader();
|
||||
f=document.getElementById('img-file').files[0];
|
||||
|
||||
r.readAsDataURL(f);
|
||||
r.onload=function (e) {
|
||||
$("#img-view").show();
|
||||
document.getElementById('img-show').src=this.result;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 打开评论回复框
|
||||
* @param {Number} commentid 评论ID
|
||||
*/
|
||||
function commentOpen(commentid){
|
||||
$('#rcomment_'+commentid).toggle('fast');
|
||||
}
|
||||
/**
|
||||
* 回复评论
|
||||
* @param {*} rid 上级评论ID
|
||||
* @param {*} ptable
|
||||
* @param {*} pkey
|
||||
* @param {*} pid
|
||||
* @param {*} touid
|
||||
*/
|
||||
function recomment(commentid,referid,ptable,pkey,pid,touid){
|
||||
var content = $('#recontent_'+commentid).val();
|
||||
//console.log('#recontent_'+commentid)
|
||||
if(content==''){
|
||||
tsNotice('回复内容不能为空!');
|
||||
}else{
|
||||
|
||||
$('#recomm_btn_'+commentid).hide();
|
||||
|
||||
tsPost('index.php?app=comment&ac=add&js=1',{
|
||||
ptable:ptable,
|
||||
pkey:pkey,
|
||||
pid:pid,
|
||||
|
||||
referid:referid,
|
||||
touserid:touid,
|
||||
|
||||
content:content
|
||||
})
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 加载更多评论回复
|
||||
* @param {*} commentid
|
||||
* @param {*} userid //项目用户ID
|
||||
*/
|
||||
function loadRecomment(commentid,userid){
|
||||
$.get(siteUrl+'index.php?app=comment&ac=recomment&referid='+commentid+'&userid='+userid,function (rs) {
|
||||
$("#recomment_"+commentid).html(rs)
|
||||
})
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
* The MIT License
|
||||
* Copyright (c) 2012 Matias Meno <m@tias.me>
|
||||
*/
|
||||
.dropzone, .dropzone * {
|
||||
box-sizing: border-box; }
|
||||
|
||||
.dropzone {
|
||||
position: relative; }
|
||||
.dropzone .dz-preview {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
width: 120px;
|
||||
margin: 0.5em; }
|
||||
.dropzone .dz-preview .dz-progress {
|
||||
display: block;
|
||||
height: 15px;
|
||||
border: 1px solid #aaa; }
|
||||
.dropzone .dz-preview .dz-progress .dz-upload {
|
||||
display: block;
|
||||
height: 100%;
|
||||
width: 0;
|
||||
background: green; }
|
||||
.dropzone .dz-preview .dz-error-message {
|
||||
color: red;
|
||||
display: none; }
|
||||
.dropzone .dz-preview.dz-error .dz-error-message, .dropzone .dz-preview.dz-error .dz-error-mark {
|
||||
display: block; }
|
||||
.dropzone .dz-preview.dz-success .dz-success-mark {
|
||||
display: block; }
|
||||
.dropzone .dz-preview .dz-error-mark, .dropzone .dz-preview .dz-success-mark {
|
||||
position: absolute;
|
||||
display: none;
|
||||
left: 30px;
|
||||
top: 30px;
|
||||
width: 54px;
|
||||
height: 58px;
|
||||
left: 50%;
|
||||
margin-left: -27px; }
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,388 @@
|
||||
/*
|
||||
* The MIT License
|
||||
* Copyright (c) 2012 Matias Meno <m@tias.me>
|
||||
*/
|
||||
@-webkit-keyframes passing-through {
|
||||
0% {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateY(40px);
|
||||
-moz-transform: translateY(40px);
|
||||
-ms-transform: translateY(40px);
|
||||
-o-transform: translateY(40px);
|
||||
transform: translateY(40px); }
|
||||
30%, 70% {
|
||||
opacity: 1;
|
||||
-webkit-transform: translateY(0px);
|
||||
-moz-transform: translateY(0px);
|
||||
-ms-transform: translateY(0px);
|
||||
-o-transform: translateY(0px);
|
||||
transform: translateY(0px); }
|
||||
100% {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateY(-40px);
|
||||
-moz-transform: translateY(-40px);
|
||||
-ms-transform: translateY(-40px);
|
||||
-o-transform: translateY(-40px);
|
||||
transform: translateY(-40px); } }
|
||||
@-moz-keyframes passing-through {
|
||||
0% {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateY(40px);
|
||||
-moz-transform: translateY(40px);
|
||||
-ms-transform: translateY(40px);
|
||||
-o-transform: translateY(40px);
|
||||
transform: translateY(40px); }
|
||||
30%, 70% {
|
||||
opacity: 1;
|
||||
-webkit-transform: translateY(0px);
|
||||
-moz-transform: translateY(0px);
|
||||
-ms-transform: translateY(0px);
|
||||
-o-transform: translateY(0px);
|
||||
transform: translateY(0px); }
|
||||
100% {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateY(-40px);
|
||||
-moz-transform: translateY(-40px);
|
||||
-ms-transform: translateY(-40px);
|
||||
-o-transform: translateY(-40px);
|
||||
transform: translateY(-40px); } }
|
||||
@keyframes passing-through {
|
||||
0% {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateY(40px);
|
||||
-moz-transform: translateY(40px);
|
||||
-ms-transform: translateY(40px);
|
||||
-o-transform: translateY(40px);
|
||||
transform: translateY(40px); }
|
||||
30%, 70% {
|
||||
opacity: 1;
|
||||
-webkit-transform: translateY(0px);
|
||||
-moz-transform: translateY(0px);
|
||||
-ms-transform: translateY(0px);
|
||||
-o-transform: translateY(0px);
|
||||
transform: translateY(0px); }
|
||||
100% {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateY(-40px);
|
||||
-moz-transform: translateY(-40px);
|
||||
-ms-transform: translateY(-40px);
|
||||
-o-transform: translateY(-40px);
|
||||
transform: translateY(-40px); } }
|
||||
@-webkit-keyframes slide-in {
|
||||
0% {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateY(40px);
|
||||
-moz-transform: translateY(40px);
|
||||
-ms-transform: translateY(40px);
|
||||
-o-transform: translateY(40px);
|
||||
transform: translateY(40px); }
|
||||
30% {
|
||||
opacity: 1;
|
||||
-webkit-transform: translateY(0px);
|
||||
-moz-transform: translateY(0px);
|
||||
-ms-transform: translateY(0px);
|
||||
-o-transform: translateY(0px);
|
||||
transform: translateY(0px); } }
|
||||
@-moz-keyframes slide-in {
|
||||
0% {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateY(40px);
|
||||
-moz-transform: translateY(40px);
|
||||
-ms-transform: translateY(40px);
|
||||
-o-transform: translateY(40px);
|
||||
transform: translateY(40px); }
|
||||
30% {
|
||||
opacity: 1;
|
||||
-webkit-transform: translateY(0px);
|
||||
-moz-transform: translateY(0px);
|
||||
-ms-transform: translateY(0px);
|
||||
-o-transform: translateY(0px);
|
||||
transform: translateY(0px); } }
|
||||
@keyframes slide-in {
|
||||
0% {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateY(40px);
|
||||
-moz-transform: translateY(40px);
|
||||
-ms-transform: translateY(40px);
|
||||
-o-transform: translateY(40px);
|
||||
transform: translateY(40px); }
|
||||
30% {
|
||||
opacity: 1;
|
||||
-webkit-transform: translateY(0px);
|
||||
-moz-transform: translateY(0px);
|
||||
-ms-transform: translateY(0px);
|
||||
-o-transform: translateY(0px);
|
||||
transform: translateY(0px); } }
|
||||
@-webkit-keyframes pulse {
|
||||
0% {
|
||||
-webkit-transform: scale(1);
|
||||
-moz-transform: scale(1);
|
||||
-ms-transform: scale(1);
|
||||
-o-transform: scale(1);
|
||||
transform: scale(1); }
|
||||
10% {
|
||||
-webkit-transform: scale(1.1);
|
||||
-moz-transform: scale(1.1);
|
||||
-ms-transform: scale(1.1);
|
||||
-o-transform: scale(1.1);
|
||||
transform: scale(1.1); }
|
||||
20% {
|
||||
-webkit-transform: scale(1);
|
||||
-moz-transform: scale(1);
|
||||
-ms-transform: scale(1);
|
||||
-o-transform: scale(1);
|
||||
transform: scale(1); } }
|
||||
@-moz-keyframes pulse {
|
||||
0% {
|
||||
-webkit-transform: scale(1);
|
||||
-moz-transform: scale(1);
|
||||
-ms-transform: scale(1);
|
||||
-o-transform: scale(1);
|
||||
transform: scale(1); }
|
||||
10% {
|
||||
-webkit-transform: scale(1.1);
|
||||
-moz-transform: scale(1.1);
|
||||
-ms-transform: scale(1.1);
|
||||
-o-transform: scale(1.1);
|
||||
transform: scale(1.1); }
|
||||
20% {
|
||||
-webkit-transform: scale(1);
|
||||
-moz-transform: scale(1);
|
||||
-ms-transform: scale(1);
|
||||
-o-transform: scale(1);
|
||||
transform: scale(1); } }
|
||||
@keyframes pulse {
|
||||
0% {
|
||||
-webkit-transform: scale(1);
|
||||
-moz-transform: scale(1);
|
||||
-ms-transform: scale(1);
|
||||
-o-transform: scale(1);
|
||||
transform: scale(1); }
|
||||
10% {
|
||||
-webkit-transform: scale(1.1);
|
||||
-moz-transform: scale(1.1);
|
||||
-ms-transform: scale(1.1);
|
||||
-o-transform: scale(1.1);
|
||||
transform: scale(1.1); }
|
||||
20% {
|
||||
-webkit-transform: scale(1);
|
||||
-moz-transform: scale(1);
|
||||
-ms-transform: scale(1);
|
||||
-o-transform: scale(1);
|
||||
transform: scale(1); } }
|
||||
.dropzone, .dropzone * {
|
||||
box-sizing: border-box; }
|
||||
|
||||
.dropzone {
|
||||
min-height: 150px;
|
||||
border: 2px solid rgba(0, 0, 0, 0.3);
|
||||
background: white;
|
||||
padding: 20px 20px; }
|
||||
.dropzone.dz-clickable {
|
||||
cursor: pointer; }
|
||||
.dropzone.dz-clickable * {
|
||||
cursor: default; }
|
||||
.dropzone.dz-clickable .dz-message, .dropzone.dz-clickable .dz-message * {
|
||||
cursor: pointer; }
|
||||
.dropzone.dz-started .dz-message {
|
||||
display: none; }
|
||||
.dropzone.dz-drag-hover {
|
||||
border-style: solid; }
|
||||
.dropzone.dz-drag-hover .dz-message {
|
||||
opacity: 0.5; }
|
||||
.dropzone .dz-message {
|
||||
text-align: center;
|
||||
margin: 2em 0; }
|
||||
.dropzone .dz-preview {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
vertical-align: top;
|
||||
margin: 16px;
|
||||
min-height: 100px; }
|
||||
.dropzone .dz-preview:hover {
|
||||
z-index: 1000; }
|
||||
.dropzone .dz-preview:hover .dz-details {
|
||||
opacity: 1; }
|
||||
.dropzone .dz-preview.dz-file-preview .dz-image {
|
||||
border-radius: 20px;
|
||||
background: #999;
|
||||
background: linear-gradient(to bottom, #eee, #ddd); }
|
||||
.dropzone .dz-preview.dz-file-preview .dz-details {
|
||||
opacity: 1; }
|
||||
.dropzone .dz-preview.dz-image-preview {
|
||||
background: white; }
|
||||
.dropzone .dz-preview.dz-image-preview .dz-details {
|
||||
-webkit-transition: opacity 0.2s linear;
|
||||
-moz-transition: opacity 0.2s linear;
|
||||
-ms-transition: opacity 0.2s linear;
|
||||
-o-transition: opacity 0.2s linear;
|
||||
transition: opacity 0.2s linear; }
|
||||
.dropzone .dz-preview .dz-remove {
|
||||
font-size: 14px;
|
||||
text-align: center;
|
||||
display: block;
|
||||
cursor: pointer;
|
||||
border: none; }
|
||||
.dropzone .dz-preview .dz-remove:hover {
|
||||
text-decoration: underline; }
|
||||
.dropzone .dz-preview:hover .dz-details {
|
||||
opacity: 1; }
|
||||
.dropzone .dz-preview .dz-details {
|
||||
z-index: 20;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
opacity: 0;
|
||||
font-size: 13px;
|
||||
min-width: 100%;
|
||||
max-width: 100%;
|
||||
padding: 2em 1em;
|
||||
text-align: center;
|
||||
color: rgba(0, 0, 0, 0.9);
|
||||
line-height: 150%; }
|
||||
.dropzone .dz-preview .dz-details .dz-size {
|
||||
margin-bottom: 1em;
|
||||
font-size: 16px; }
|
||||
.dropzone .dz-preview .dz-details .dz-filename {
|
||||
white-space: nowrap; }
|
||||
.dropzone .dz-preview .dz-details .dz-filename:hover span {
|
||||
border: 1px solid rgba(200, 200, 200, 0.8);
|
||||
background-color: rgba(255, 255, 255, 0.8); }
|
||||
.dropzone .dz-preview .dz-details .dz-filename:not(:hover) {
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis; }
|
||||
.dropzone .dz-preview .dz-details .dz-filename:not(:hover) span {
|
||||
border: 1px solid transparent; }
|
||||
.dropzone .dz-preview .dz-details .dz-filename span, .dropzone .dz-preview .dz-details .dz-size span {
|
||||
background-color: rgba(255, 255, 255, 0.4);
|
||||
padding: 0 0.4em;
|
||||
border-radius: 3px; }
|
||||
.dropzone .dz-preview:hover .dz-image img {
|
||||
-webkit-transform: scale(1.05, 1.05);
|
||||
-moz-transform: scale(1.05, 1.05);
|
||||
-ms-transform: scale(1.05, 1.05);
|
||||
-o-transform: scale(1.05, 1.05);
|
||||
transform: scale(1.05, 1.05);
|
||||
-webkit-filter: blur(8px);
|
||||
filter: blur(8px); }
|
||||
.dropzone .dz-preview .dz-image {
|
||||
border-radius: 20px;
|
||||
overflow: hidden;
|
||||
width: 120px;
|
||||
height: 120px;
|
||||
position: relative;
|
||||
display: block;
|
||||
z-index: 10; }
|
||||
.dropzone .dz-preview .dz-image img {
|
||||
display: block; }
|
||||
.dropzone .dz-preview.dz-success .dz-success-mark {
|
||||
-webkit-animation: passing-through 3s cubic-bezier(0.77, 0, 0.175, 1);
|
||||
-moz-animation: passing-through 3s cubic-bezier(0.77, 0, 0.175, 1);
|
||||
-ms-animation: passing-through 3s cubic-bezier(0.77, 0, 0.175, 1);
|
||||
-o-animation: passing-through 3s cubic-bezier(0.77, 0, 0.175, 1);
|
||||
animation: passing-through 3s cubic-bezier(0.77, 0, 0.175, 1); }
|
||||
.dropzone .dz-preview.dz-error .dz-error-mark {
|
||||
opacity: 1;
|
||||
-webkit-animation: slide-in 3s cubic-bezier(0.77, 0, 0.175, 1);
|
||||
-moz-animation: slide-in 3s cubic-bezier(0.77, 0, 0.175, 1);
|
||||
-ms-animation: slide-in 3s cubic-bezier(0.77, 0, 0.175, 1);
|
||||
-o-animation: slide-in 3s cubic-bezier(0.77, 0, 0.175, 1);
|
||||
animation: slide-in 3s cubic-bezier(0.77, 0, 0.175, 1); }
|
||||
.dropzone .dz-preview .dz-success-mark, .dropzone .dz-preview .dz-error-mark {
|
||||
pointer-events: none;
|
||||
opacity: 0;
|
||||
z-index: 500;
|
||||
position: absolute;
|
||||
display: block;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
margin-left: -27px;
|
||||
margin-top: -27px; }
|
||||
.dropzone .dz-preview .dz-success-mark svg, .dropzone .dz-preview .dz-error-mark svg {
|
||||
display: block;
|
||||
width: 54px;
|
||||
height: 54px; }
|
||||
.dropzone .dz-preview.dz-processing .dz-progress {
|
||||
opacity: 1;
|
||||
-webkit-transition: all 0.2s linear;
|
||||
-moz-transition: all 0.2s linear;
|
||||
-ms-transition: all 0.2s linear;
|
||||
-o-transition: all 0.2s linear;
|
||||
transition: all 0.2s linear; }
|
||||
.dropzone .dz-preview.dz-complete .dz-progress {
|
||||
opacity: 0;
|
||||
-webkit-transition: opacity 0.4s ease-in;
|
||||
-moz-transition: opacity 0.4s ease-in;
|
||||
-ms-transition: opacity 0.4s ease-in;
|
||||
-o-transition: opacity 0.4s ease-in;
|
||||
transition: opacity 0.4s ease-in; }
|
||||
.dropzone .dz-preview:not(.dz-processing) .dz-progress {
|
||||
-webkit-animation: pulse 6s ease infinite;
|
||||
-moz-animation: pulse 6s ease infinite;
|
||||
-ms-animation: pulse 6s ease infinite;
|
||||
-o-animation: pulse 6s ease infinite;
|
||||
animation: pulse 6s ease infinite; }
|
||||
.dropzone .dz-preview .dz-progress {
|
||||
opacity: 1;
|
||||
z-index: 1000;
|
||||
pointer-events: none;
|
||||
position: absolute;
|
||||
height: 16px;
|
||||
left: 50%;
|
||||
top: 50%;
|
||||
margin-top: -8px;
|
||||
width: 80px;
|
||||
margin-left: -40px;
|
||||
background: rgba(255, 255, 255, 0.9);
|
||||
-webkit-transform: scale(1);
|
||||
border-radius: 8px;
|
||||
overflow: hidden; }
|
||||
.dropzone .dz-preview .dz-progress .dz-upload {
|
||||
background: #333;
|
||||
background: linear-gradient(to bottom, #666, #444);
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
width: 0;
|
||||
-webkit-transition: width 300ms ease-in-out;
|
||||
-moz-transition: width 300ms ease-in-out;
|
||||
-ms-transition: width 300ms ease-in-out;
|
||||
-o-transition: width 300ms ease-in-out;
|
||||
transition: width 300ms ease-in-out; }
|
||||
.dropzone .dz-preview.dz-error .dz-error-message {
|
||||
display: block; }
|
||||
.dropzone .dz-preview.dz-error:hover .dz-error-message {
|
||||
opacity: 1;
|
||||
pointer-events: auto; }
|
||||
.dropzone .dz-preview .dz-error-message {
|
||||
pointer-events: none;
|
||||
z-index: 1000;
|
||||
position: absolute;
|
||||
display: block;
|
||||
display: none;
|
||||
opacity: 0;
|
||||
-webkit-transition: opacity 0.3s ease;
|
||||
-moz-transition: opacity 0.3s ease;
|
||||
-ms-transition: opacity 0.3s ease;
|
||||
-o-transition: opacity 0.3s ease;
|
||||
transition: opacity 0.3s ease;
|
||||
border-radius: 8px;
|
||||
font-size: 13px;
|
||||
top: 130px;
|
||||
left: -10px;
|
||||
width: 140px;
|
||||
background: #be2626;
|
||||
background: linear-gradient(to bottom, #be2626, #a92222);
|
||||
padding: 0.5em 1.2em;
|
||||
color: white; }
|
||||
.dropzone .dz-preview .dz-error-message:after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: -6px;
|
||||
left: 64px;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-left: 6px solid transparent;
|
||||
border-right: 6px solid transparent;
|
||||
border-bottom: 6px solid #be2626; }
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,10 @@
|
||||
# Warning!
|
||||
|
||||
You shouldn't pull these files from the github master branch directly!
|
||||
|
||||
They might be outdated or not working at all since I normally only push them
|
||||
when I create a version release.
|
||||
|
||||
To be sure to get a proper release, please go to the
|
||||
[dropzone releases section on github](https://github.com/enyo/dropzone/releases/latest).
|
||||
|
||||
Vendored
+8
@@ -0,0 +1,8 @@
|
||||
/*
|
||||
HTML5 Shiv v3.6.2 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
|
||||
*/
|
||||
(function(l,f){function m(){var a=e.elements;return"string"==typeof a?a.split(" "):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag();
|
||||
a.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+m().join().replace(/\w+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c("'+a+'")'})+");return n}")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement("p");d=d.getElementsByTagName("head")[0]||d.documentElement;c.innerHTML="x<style>article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}</style>";
|
||||
c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="<xyz></xyz>";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode||
|
||||
"undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup main mark meter nav output progress section summary time video",version:"3.6.2",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f);if(g)return a.createDocumentFragment();
|
||||
for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d<h;d++)c.createElement(e[d]);return c}};l.html5=e;q(f)})(this,document);
|
||||
@@ -0,0 +1,53 @@
|
||||
//及时消息开始
|
||||
var newMessageRemind = {
|
||||
_step : 0,
|
||||
_title : document.title,
|
||||
_timer : null,
|
||||
//显示新消息提示
|
||||
show : function () {
|
||||
var temps = newMessageRemind._title.replace("【 】", "").replace("【新消息】", "");
|
||||
newMessageRemind._timer = setTimeout(function () {
|
||||
newMessageRemind.show();
|
||||
//这里写Cookie操作
|
||||
newMessageRemind._step++;
|
||||
if (newMessageRemind._step == 3) {
|
||||
newMessageRemind._step = 1
|
||||
};
|
||||
if (newMessageRemind._step == 1) {
|
||||
document.title = "【 】" + temps
|
||||
};
|
||||
if (newMessageRemind._step == 2) {
|
||||
document.title = "【新消息】" + temps
|
||||
};
|
||||
}, 800);
|
||||
return [newMessageRemind._timer, newMessageRemind._title];
|
||||
},
|
||||
//取消新消息提示
|
||||
clear : function () {
|
||||
clearTimeout(newMessageRemind._timer);
|
||||
document.title = newMessageRemind._title;
|
||||
//这里写Cookie操作
|
||||
}
|
||||
|
||||
};
|
||||
function clearNewMessageRemind() {
|
||||
newMessageRemind.clear();
|
||||
}
|
||||
|
||||
function evdata() {
|
||||
$.ajax({
|
||||
type : "GET",
|
||||
url : siteUrl + "index.php?app=message&ac=newmsg",
|
||||
success : function (msg) {
|
||||
if (msg == '0') {}
|
||||
else if (msg > 0) {
|
||||
$('#newmsg').html(msg);
|
||||
newMessageRemind.show();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
//及时消息结束
|
||||
|
||||
|
||||
evdata();
|
||||
@@ -0,0 +1,969 @@
|
||||
|
||||
(function($) {
|
||||
|
||||
|
||||
|
||||
$.fn.editable = function(target, options) {
|
||||
|
||||
|
||||
|
||||
if ('disable' == target) {
|
||||
|
||||
$(this).data('disabled.editable', true);
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
if ('enable' == target) {
|
||||
|
||||
$(this).data('disabled.editable', false);
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
if ('destroy' == target) {
|
||||
|
||||
$(this)
|
||||
|
||||
.unbind($(this).data('event.editable'))
|
||||
|
||||
.removeData('disabled.editable')
|
||||
|
||||
.removeData('event.editable');
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
var settings = $.extend({}, $.fn.editable.defaults, {target:target}, options);
|
||||
|
||||
|
||||
|
||||
/* setup some functions */
|
||||
|
||||
var plugin = $.editable.types[settings.type].plugin || function() { };
|
||||
|
||||
var submit = $.editable.types[settings.type].submit || function() { };
|
||||
|
||||
var buttons = $.editable.types[settings.type].buttons
|
||||
|
||||
|| $.editable.types['defaults'].buttons;
|
||||
|
||||
var content = $.editable.types[settings.type].content
|
||||
|
||||
|| $.editable.types['defaults'].content;
|
||||
|
||||
var element = $.editable.types[settings.type].element
|
||||
|
||||
|| $.editable.types['defaults'].element;
|
||||
|
||||
var reset = $.editable.types[settings.type].reset
|
||||
|
||||
|| $.editable.types['defaults'].reset;
|
||||
|
||||
var callback = settings.callback || function() { };
|
||||
|
||||
var onedit = settings.onedit || function() { };
|
||||
|
||||
var onsubmit = settings.onsubmit || function() { };
|
||||
|
||||
var onreset = settings.onreset || function() { };
|
||||
|
||||
var onerror = settings.onerror || reset;
|
||||
|
||||
|
||||
|
||||
/* show tooltip */
|
||||
|
||||
if (settings.tooltip) {
|
||||
|
||||
$(this).attr('title', settings.tooltip);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
settings.autowidth = 'auto' == settings.width;
|
||||
|
||||
settings.autoheight = 'auto' == settings.height;
|
||||
|
||||
|
||||
|
||||
return this.each(function() {
|
||||
|
||||
|
||||
|
||||
/* save this to self because this changes when scope changes */
|
||||
|
||||
var self = this;
|
||||
|
||||
|
||||
|
||||
/* inlined block elements lose their width and height after first edit */
|
||||
|
||||
/* save them for later use as workaround */
|
||||
|
||||
var savedwidth = $(self).width();
|
||||
|
||||
var savedheight = $(self).height();
|
||||
|
||||
|
||||
|
||||
/* save so it can be later used by $.editable('destroy') */
|
||||
|
||||
$(this).data('event.editable', settings.event);
|
||||
|
||||
|
||||
|
||||
/* if element is empty add something clickable (if requested) */
|
||||
|
||||
if (!$.trim($(this).html())) {
|
||||
|
||||
$(this).html(settings.placeholder);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
$(this).bind(settings.event, function(e) {
|
||||
|
||||
|
||||
|
||||
/* abort if disabled for this element */
|
||||
|
||||
if (true === $(this).data('disabled.editable')) {
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* prevent throwing an exeption if edit field is clicked again */
|
||||
|
||||
if (self.editing) {
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* abort if onedit hook returns false */
|
||||
|
||||
if (false === onedit.apply(this, [settings, self])) {
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* prevent default action and bubbling */
|
||||
|
||||
e.preventDefault();
|
||||
|
||||
e.stopPropagation();
|
||||
|
||||
|
||||
|
||||
/* remove tooltip */
|
||||
|
||||
if (settings.tooltip) {
|
||||
|
||||
$(self).removeAttr('title');
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* figure out how wide and tall we are, saved width and height */
|
||||
|
||||
/* are workaround for http://dev.jquery.com/ticket/2190 */
|
||||
|
||||
if (0 == $(self).width()) {
|
||||
|
||||
//$(self).css('visibility', 'hidden');
|
||||
|
||||
settings.width = savedwidth;
|
||||
|
||||
settings.height = savedheight;
|
||||
|
||||
} else {
|
||||
|
||||
if (settings.width != 'none') {
|
||||
|
||||
settings.width =
|
||||
|
||||
settings.autowidth ? $(self).width() : settings.width;
|
||||
|
||||
}
|
||||
|
||||
if (settings.height != 'none') {
|
||||
|
||||
settings.height =
|
||||
|
||||
settings.autoheight ? $(self).height() : settings.height;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//$(this).css('visibility', '');
|
||||
|
||||
|
||||
|
||||
/* remove placeholder text, replace is here because of IE */
|
||||
|
||||
if ($(this).html().toLowerCase().replace(/(;|")/g, '') ==
|
||||
|
||||
settings.placeholder.toLowerCase().replace(/(;|")/g, '')) {
|
||||
|
||||
$(this).html('');
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
self.editing = true;
|
||||
|
||||
self.revert = $(self).html();
|
||||
|
||||
$(self).html('');
|
||||
|
||||
|
||||
|
||||
/* create the form object */
|
||||
|
||||
var form = $('<form />');
|
||||
|
||||
|
||||
|
||||
/* apply css or style or both */
|
||||
|
||||
if (settings.cssclass) {
|
||||
|
||||
if ('inherit' == settings.cssclass) {
|
||||
|
||||
form.attr('class', $(self).attr('class'));
|
||||
|
||||
} else {
|
||||
|
||||
form.attr('class', settings.cssclass);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (settings.style) {
|
||||
|
||||
if ('inherit' == settings.style) {
|
||||
|
||||
form.attr('style', $(self).attr('style'));
|
||||
|
||||
/* IE needs the second line or display wont be inherited */
|
||||
|
||||
form.css('display', $(self).css('display'));
|
||||
|
||||
} else {
|
||||
|
||||
form.attr('style', settings.style);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* add main input element to form and store it in input */
|
||||
|
||||
var input = element.apply(form, [settings, self]);
|
||||
|
||||
|
||||
|
||||
/* set input content via POST, GET, given data or existing value */
|
||||
|
||||
var input_content;
|
||||
|
||||
|
||||
|
||||
if (settings.loadurl) {
|
||||
|
||||
var t = setTimeout(function() {
|
||||
|
||||
input.disabled = true;
|
||||
|
||||
content.apply(form, [settings.loadtext, settings, self]);
|
||||
|
||||
}, 100);
|
||||
|
||||
|
||||
|
||||
var loaddata = {};
|
||||
|
||||
loaddata[settings.id] = self.id;
|
||||
|
||||
if ($.isFunction(settings.loaddata)) {
|
||||
|
||||
$.extend(loaddata, settings.loaddata.apply(self, [self.revert, settings]));
|
||||
|
||||
} else {
|
||||
|
||||
$.extend(loaddata, settings.loaddata);
|
||||
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
|
||||
type : settings.loadtype,
|
||||
|
||||
url : settings.loadurl,
|
||||
|
||||
data : loaddata,
|
||||
|
||||
async : false,
|
||||
|
||||
success: function(result) {
|
||||
|
||||
window.clearTimeout(t);
|
||||
|
||||
input_content = result;
|
||||
|
||||
input.disabled = false;
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
} else if (settings.data) {
|
||||
|
||||
input_content = settings.data;
|
||||
|
||||
if ($.isFunction(settings.data)) {
|
||||
|
||||
input_content = settings.data.apply(self, [self.revert, settings]);
|
||||
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
input_content = self.revert;
|
||||
|
||||
}
|
||||
|
||||
content.apply(form, [input_content, settings, self]);
|
||||
|
||||
|
||||
|
||||
input.attr('name', settings.name);
|
||||
|
||||
|
||||
|
||||
/* add buttons to the form */
|
||||
|
||||
buttons.apply(form, [settings, self]);
|
||||
|
||||
|
||||
|
||||
/* add created form to self */
|
||||
|
||||
$(self).append(form);
|
||||
|
||||
|
||||
|
||||
/* attach 3rd party plugin if requested */
|
||||
|
||||
plugin.apply(form, [settings, self]);
|
||||
|
||||
|
||||
|
||||
/* focus to first visible form element */
|
||||
|
||||
$(':input:visible:enabled:first', form).focus();
|
||||
|
||||
|
||||
|
||||
/* highlight input contents when requested */
|
||||
|
||||
if (settings.select) {
|
||||
|
||||
input.select();
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* discard changes if pressing esc */
|
||||
|
||||
input.keydown(function(e) {
|
||||
|
||||
if (e.keyCode == 27) {
|
||||
|
||||
e.preventDefault();
|
||||
|
||||
//self.reset();
|
||||
|
||||
reset.apply(form, [settings, self]);
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
/* discard, submit or nothing with changes when clicking outside */
|
||||
|
||||
/* do nothing is usable when navigating with tab */
|
||||
|
||||
var t;
|
||||
|
||||
if ('cancel' == settings.onblur) {
|
||||
|
||||
input.blur(function(e) {
|
||||
|
||||
/* prevent canceling if submit was clicked */
|
||||
|
||||
t = setTimeout(function() {
|
||||
|
||||
reset.apply(form, [settings, self]);
|
||||
|
||||
}, 500);
|
||||
|
||||
});
|
||||
|
||||
} else if ('submit' == settings.onblur) {
|
||||
|
||||
input.blur(function(e) {
|
||||
|
||||
/* prevent double submit if submit was clicked */
|
||||
|
||||
t = setTimeout(function() {
|
||||
|
||||
form.submit();
|
||||
|
||||
}, 200);
|
||||
|
||||
});
|
||||
|
||||
} else if ($.isFunction(settings.onblur)) {
|
||||
|
||||
input.blur(function(e) {
|
||||
|
||||
settings.onblur.apply(self, [input.val(), settings]);
|
||||
|
||||
});
|
||||
|
||||
} else {
|
||||
|
||||
input.blur(function(e) {
|
||||
|
||||
/* TODO: maybe something here */
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
form.submit(function(e) {
|
||||
|
||||
|
||||
|
||||
if (t) {
|
||||
|
||||
clearTimeout(t);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* do no submit */
|
||||
|
||||
e.preventDefault();
|
||||
|
||||
|
||||
|
||||
/* call before submit hook. */
|
||||
|
||||
/* if it returns false abort submitting */
|
||||
|
||||
if (false !== onsubmit.apply(form, [settings, self])) {
|
||||
|
||||
/* custom inputs call before submit hook. */
|
||||
|
||||
/* if it returns false abort submitting */
|
||||
|
||||
if (false !== submit.apply(form, [settings, self])) {
|
||||
|
||||
|
||||
|
||||
/* check if given target is function */
|
||||
|
||||
if ($.isFunction(settings.target)) {
|
||||
|
||||
var str = settings.target.apply(self, [input.val(), settings]);
|
||||
|
||||
$(self).html(str);
|
||||
|
||||
self.editing = false;
|
||||
|
||||
callback.apply(self, [self.innerHTML, settings]);
|
||||
|
||||
/* TODO: this is not dry */
|
||||
|
||||
if (!$.trim($(self).html())) {
|
||||
|
||||
$(self).html(settings.placeholder);
|
||||
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
/* add edited content and id of edited element to POST */
|
||||
|
||||
var submitdata = {};
|
||||
|
||||
submitdata[settings.name] = input.val();
|
||||
|
||||
submitdata[settings.id] = self.id;
|
||||
|
||||
/* add extra data to be POST:ed */
|
||||
|
||||
if ($.isFunction(settings.submitdata)) {
|
||||
|
||||
$.extend(submitdata, settings.submitdata.apply(self, [self.revert, settings]));
|
||||
|
||||
} else {
|
||||
|
||||
$.extend(submitdata, settings.submitdata);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* quick and dirty PUT support */
|
||||
|
||||
if ('PUT' == settings.method) {
|
||||
|
||||
submitdata['_method'] = 'put';
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* show the saving indicator */
|
||||
|
||||
$(self).html(settings.indicator);
|
||||
|
||||
|
||||
|
||||
/* defaults for ajaxoptions */
|
||||
|
||||
var ajaxoptions = {
|
||||
|
||||
type : 'POST',
|
||||
|
||||
data : submitdata,
|
||||
|
||||
dataType: 'html',
|
||||
|
||||
url : settings.target,
|
||||
|
||||
success : function(result, status) {
|
||||
|
||||
if (ajaxoptions.dataType == 'html') {
|
||||
|
||||
$(self).html(result);
|
||||
|
||||
}
|
||||
|
||||
self.editing = false;
|
||||
|
||||
callback.apply(self, [result, settings]);
|
||||
|
||||
if (!$.trim($(self).html())) {
|
||||
|
||||
$(self).html(settings.placeholder);
|
||||
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
error : function(xhr, status, error) {
|
||||
|
||||
onerror.apply(form, [settings, self, xhr]);
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
/* override with what is given in settings.ajaxoptions */
|
||||
|
||||
$.extend(ajaxoptions, settings.ajaxoptions);
|
||||
|
||||
$.ajax(ajaxoptions);
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* show tooltip again */
|
||||
|
||||
$(self).attr('title', settings.tooltip);
|
||||
|
||||
|
||||
|
||||
return false;
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
/* privileged methods */
|
||||
|
||||
this.reset = function(form) {
|
||||
|
||||
/* prevent calling reset twice when blurring */
|
||||
|
||||
if (this.editing) {
|
||||
|
||||
/* before reset hook, if it returns false abort reseting */
|
||||
|
||||
if (false !== onreset.apply(form, [settings, self])) {
|
||||
|
||||
$(self).html(self.revert);
|
||||
|
||||
self.editing = false;
|
||||
|
||||
if (!$.trim($(self).html())) {
|
||||
|
||||
$(self).html(settings.placeholder);
|
||||
|
||||
}
|
||||
|
||||
/* show tooltip again */
|
||||
|
||||
if (settings.tooltip) {
|
||||
|
||||
$(self).attr('title', settings.tooltip);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
$.editable = {
|
||||
|
||||
types: {
|
||||
|
||||
defaults: {
|
||||
|
||||
element : function(settings, original) {
|
||||
|
||||
var input = $('<input type="hidden"></input>');
|
||||
|
||||
$(this).append(input);
|
||||
|
||||
return(input);
|
||||
|
||||
},
|
||||
|
||||
content : function(string, settings, original) {
|
||||
|
||||
$(':input:first', this).val(string);
|
||||
|
||||
},
|
||||
|
||||
reset : function(settings, original) {
|
||||
|
||||
original.reset(this);
|
||||
|
||||
},
|
||||
|
||||
buttons : function(settings, original) {
|
||||
|
||||
var form = this;
|
||||
|
||||
if (settings.submit) {
|
||||
|
||||
/* if given html string use that */
|
||||
|
||||
if (settings.submit.match(/>$/)) {
|
||||
|
||||
var submit = $(settings.submit).click(function() {
|
||||
|
||||
if (submit.attr("type") != "submit") {
|
||||
|
||||
form.submit();
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
/* otherwise use button with given string as text */
|
||||
|
||||
} else {
|
||||
|
||||
var submit = $('<button type="submit" />');
|
||||
|
||||
submit.html(settings.submit);
|
||||
|
||||
}
|
||||
|
||||
$(this).append(submit);
|
||||
|
||||
}
|
||||
|
||||
if (settings.cancel) {
|
||||
|
||||
/* if given html string use that */
|
||||
|
||||
if (settings.cancel.match(/>$/)) {
|
||||
|
||||
var cancel = $(settings.cancel);
|
||||
|
||||
/* otherwise use button with given string as text */
|
||||
|
||||
} else {
|
||||
|
||||
var cancel = $('<button type="cancel" />');
|
||||
|
||||
cancel.html(settings.cancel);
|
||||
|
||||
}
|
||||
|
||||
$(this).append(cancel);
|
||||
|
||||
|
||||
|
||||
$(cancel).click(function(event) {
|
||||
|
||||
//original.reset();
|
||||
|
||||
if ($.isFunction($.editable.types[settings.type].reset)) {
|
||||
|
||||
var reset = $.editable.types[settings.type].reset;
|
||||
|
||||
} else {
|
||||
|
||||
var reset = $.editable.types['defaults'].reset;
|
||||
|
||||
}
|
||||
|
||||
reset.apply(form, [settings, original]);
|
||||
|
||||
return false;
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
text: {
|
||||
|
||||
element : function(settings, original) {
|
||||
|
||||
var input = $('<input />');
|
||||
|
||||
if (settings.width != 'none') { input.width(settings.width); }
|
||||
|
||||
if (settings.height != 'none') { input.height(settings.height); }
|
||||
|
||||
/* https://bugzilla.mozilla.org/show_bug.cgi?id=236791 */
|
||||
|
||||
//input[0].setAttribute('autocomplete','off');
|
||||
|
||||
input.attr('autocomplete','off');
|
||||
|
||||
$(this).append(input);
|
||||
|
||||
return(input);
|
||||
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
textarea: {
|
||||
|
||||
element : function(settings, original) {
|
||||
|
||||
var textarea = $('<textarea />');
|
||||
|
||||
if (settings.rows) {
|
||||
|
||||
textarea.attr('rows', settings.rows);
|
||||
|
||||
} else if (settings.height != "none") {
|
||||
|
||||
textarea.height(settings.height);
|
||||
|
||||
}
|
||||
|
||||
if (settings.cols) {
|
||||
|
||||
textarea.attr('cols', settings.cols);
|
||||
|
||||
} else if (settings.width != "none") {
|
||||
|
||||
textarea.width(settings.width);
|
||||
|
||||
}
|
||||
|
||||
$(this).append(textarea);
|
||||
|
||||
return(textarea);
|
||||
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
select: {
|
||||
|
||||
element : function(settings, original) {
|
||||
|
||||
var select = $('<select />');
|
||||
|
||||
$(this).append(select);
|
||||
|
||||
return(select);
|
||||
|
||||
},
|
||||
|
||||
content : function(data, settings, original) {
|
||||
|
||||
/* If it is string assume it is json. */
|
||||
|
||||
if (String == data.constructor) {
|
||||
|
||||
eval ('var json = ' + data);
|
||||
|
||||
} else {
|
||||
|
||||
/* Otherwise assume it is a hash already. */
|
||||
|
||||
var json = data;
|
||||
|
||||
}
|
||||
|
||||
for (var key in json) {
|
||||
|
||||
if (!json.hasOwnProperty(key)) {
|
||||
|
||||
continue;
|
||||
|
||||
}
|
||||
|
||||
if ('selected' == key) {
|
||||
|
||||
continue;
|
||||
|
||||
}
|
||||
|
||||
var option = $('<option />').val(key).append(json[key]);
|
||||
|
||||
$('select', this).append(option);
|
||||
|
||||
}
|
||||
|
||||
/* Loop option again to set selected. IE needed this... */
|
||||
|
||||
$('select', this).children().each(function() {
|
||||
|
||||
if ($(this).val() == json['selected'] ||
|
||||
|
||||
$(this).text() == $.trim(original.revert)) {
|
||||
|
||||
$(this).attr('selected', 'selected');
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
|
||||
|
||||
/* Add new input type */
|
||||
|
||||
addInputType: function(name, input) {
|
||||
|
||||
$.editable.types[name] = input;
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
// publicly accessible defaults
|
||||
|
||||
$.fn.editable.defaults = {
|
||||
|
||||
name : 'value',
|
||||
|
||||
id : 'id',
|
||||
|
||||
type : 'text',
|
||||
|
||||
width : 'auto',
|
||||
|
||||
height : 'auto',
|
||||
|
||||
event : 'click.editable',
|
||||
|
||||
onblur : 'cancel',
|
||||
|
||||
loadtype : 'GET',
|
||||
|
||||
loadtext : 'Loading...',
|
||||
|
||||
placeholder: 'Click to edit',
|
||||
|
||||
loaddata : {},
|
||||
|
||||
submitdata : {},
|
||||
|
||||
ajaxoptions: {}
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
})(jQuery);
|
||||
|
||||
Vendored
+524
@@ -0,0 +1,524 @@
|
||||
/**
|
||||
* Created by qiniao on 15/11/15.
|
||||
*/
|
||||
/*!
|
||||
* jQuery Migrate - v1.2.1 - 2013-05-08
|
||||
* https://github.com/jquery/jquery-migrate
|
||||
* Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors; Licensed MIT
|
||||
*/
|
||||
(function( jQuery, window, undefined ) {
|
||||
// See http://bugs.jquery.com/ticket/13335
|
||||
// "use strict";
|
||||
|
||||
|
||||
var warnedAbout = {};
|
||||
|
||||
// List of warnings already given; public read only
|
||||
jQuery.migrateWarnings = [];
|
||||
|
||||
// Set to true to prevent console output; migrateWarnings still maintained
|
||||
// jQuery.migrateMute = false;
|
||||
|
||||
// Show a message on the console so devs know we're active
|
||||
if ( !jQuery.migrateMute && window.console && window.console.log ) {
|
||||
window.console.log("JQMIGRATE: Logging is active");
|
||||
}
|
||||
|
||||
// Set to false to disable traces that appear with warnings
|
||||
if ( jQuery.migrateTrace === undefined ) {
|
||||
jQuery.migrateTrace = true;
|
||||
}
|
||||
|
||||
// Forget any warnings we've already given; public
|
||||
jQuery.migrateReset = function() {
|
||||
warnedAbout = {};
|
||||
jQuery.migrateWarnings.length = 0;
|
||||
};
|
||||
|
||||
function migrateWarn( msg) {
|
||||
var console = window.console;
|
||||
if ( !warnedAbout[ msg ] ) {
|
||||
warnedAbout[ msg ] = true;
|
||||
jQuery.migrateWarnings.push( msg );
|
||||
if ( console && console.warn && !jQuery.migrateMute ) {
|
||||
console.warn( "JQMIGRATE: " + msg );
|
||||
if ( jQuery.migrateTrace && console.trace ) {
|
||||
console.trace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function migrateWarnProp( obj, prop, value, msg ) {
|
||||
if ( Object.defineProperty ) {
|
||||
// On ES5 browsers (non-oldIE), warn if the code tries to get prop;
|
||||
// allow property to be overwritten in case some other plugin wants it
|
||||
try {
|
||||
Object.defineProperty( obj, prop, {
|
||||
configurable: true,
|
||||
enumerable: true,
|
||||
get: function() {
|
||||
migrateWarn( msg );
|
||||
return value;
|
||||
},
|
||||
set: function( newValue ) {
|
||||
migrateWarn( msg );
|
||||
value = newValue;
|
||||
}
|
||||
});
|
||||
return;
|
||||
} catch( err ) {
|
||||
// IE8 is a dope about Object.defineProperty, can't warn there
|
||||
}
|
||||
}
|
||||
|
||||
// Non-ES5 (or broken) browser; just set the property
|
||||
jQuery._definePropertyBroken = true;
|
||||
obj[ prop ] = value;
|
||||
}
|
||||
|
||||
if ( document.compatMode === "BackCompat" ) {
|
||||
// jQuery has never supported or tested Quirks Mode
|
||||
migrateWarn( "jQuery is not compatible with Quirks Mode" );
|
||||
}
|
||||
|
||||
|
||||
var attrFn = jQuery( "<input/>", { size: 1 } ).attr("size") && jQuery.attrFn,
|
||||
oldAttr = jQuery.attr,
|
||||
valueAttrGet = jQuery.attrHooks.value && jQuery.attrHooks.value.get ||
|
||||
function() { return null; },
|
||||
valueAttrSet = jQuery.attrHooks.value && jQuery.attrHooks.value.set ||
|
||||
function() { return undefined; },
|
||||
rnoType = /^(?:input|button)$/i,
|
||||
rnoAttrNodeType = /^[238]$/,
|
||||
rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
|
||||
ruseDefault = /^(?:checked|selected)$/i;
|
||||
|
||||
// jQuery.attrFn
|
||||
migrateWarnProp( jQuery, "attrFn", attrFn || {}, "jQuery.attrFn is deprecated" );
|
||||
|
||||
jQuery.attr = function( elem, name, value, pass ) {
|
||||
var lowerName = name.toLowerCase(),
|
||||
nType = elem && elem.nodeType;
|
||||
|
||||
if ( pass ) {
|
||||
// Since pass is used internally, we only warn for new jQuery
|
||||
// versions where there isn't a pass arg in the formal params
|
||||
if ( oldAttr.length < 4 ) {
|
||||
migrateWarn("jQuery.fn.attr( props, pass ) is deprecated");
|
||||
}
|
||||
if ( elem && !rnoAttrNodeType.test( nType ) &&
|
||||
(attrFn ? name in attrFn : jQuery.isFunction(jQuery.fn[name])) ) {
|
||||
return jQuery( elem )[ name ]( value );
|
||||
}
|
||||
}
|
||||
|
||||
// Warn if user tries to set `type`, since it breaks on IE 6/7/8; by checking
|
||||
// for disconnected elements we don't warn on $( "<button>", { type: "button" } ).
|
||||
if ( name === "type" && value !== undefined && rnoType.test( elem.nodeName ) && elem.parentNode ) {
|
||||
migrateWarn("Can't change the 'type' of an input or button in IE 6/7/8");
|
||||
}
|
||||
|
||||
// Restore boolHook for boolean property/attribute synchronization
|
||||
if ( !jQuery.attrHooks[ lowerName ] && rboolean.test( lowerName ) ) {
|
||||
jQuery.attrHooks[ lowerName ] = {
|
||||
get: function( elem, name ) {
|
||||
// Align boolean attributes with corresponding properties
|
||||
// Fall back to attribute presence where some booleans are not supported
|
||||
var attrNode,
|
||||
property = jQuery.prop( elem, name );
|
||||
return property === true || typeof property !== "boolean" &&
|
||||
( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
|
||||
|
||||
name.toLowerCase() :
|
||||
undefined;
|
||||
},
|
||||
set: function( elem, value, name ) {
|
||||
var propName;
|
||||
if ( value === false ) {
|
||||
// Remove boolean attributes when set to false
|
||||
jQuery.removeAttr( elem, name );
|
||||
} else {
|
||||
// value is true since we know at this point it's type boolean and not false
|
||||
// Set boolean attributes to the same name and set the DOM property
|
||||
propName = jQuery.propFix[ name ] || name;
|
||||
if ( propName in elem ) {
|
||||
// Only set the IDL specifically if it already exists on the element
|
||||
elem[ propName ] = true;
|
||||
}
|
||||
|
||||
elem.setAttribute( name, name.toLowerCase() );
|
||||
}
|
||||
return name;
|
||||
}
|
||||
};
|
||||
|
||||
// Warn only for attributes that can remain distinct from their properties post-1.9
|
||||
if ( ruseDefault.test( lowerName ) ) {
|
||||
migrateWarn( "jQuery.fn.attr('" + lowerName + "') may use property instead of attribute" );
|
||||
}
|
||||
}
|
||||
|
||||
return oldAttr.call( jQuery, elem, name, value );
|
||||
};
|
||||
|
||||
// attrHooks: value
|
||||
jQuery.attrHooks.value = {
|
||||
get: function( elem, name ) {
|
||||
var nodeName = ( elem.nodeName || "" ).toLowerCase();
|
||||
if ( nodeName === "button" ) {
|
||||
return valueAttrGet.apply( this, arguments );
|
||||
}
|
||||
if ( nodeName !== "input" && nodeName !== "option" ) {
|
||||
migrateWarn("jQuery.fn.attr('value') no longer gets properties");
|
||||
}
|
||||
return name in elem ?
|
||||
elem.value :
|
||||
null;
|
||||
},
|
||||
set: function( elem, value ) {
|
||||
var nodeName = ( elem.nodeName || "" ).toLowerCase();
|
||||
if ( nodeName === "button" ) {
|
||||
return valueAttrSet.apply( this, arguments );
|
||||
}
|
||||
if ( nodeName !== "input" && nodeName !== "option" ) {
|
||||
migrateWarn("jQuery.fn.attr('value', val) no longer sets properties");
|
||||
}
|
||||
// Does not return so that setAttribute is also used
|
||||
elem.value = value;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
var matched, browser,
|
||||
oldInit = jQuery.fn.init,
|
||||
oldParseJSON = jQuery.parseJSON,
|
||||
// Note: XSS check is done below after string is trimmed
|
||||
rquickExpr = /^([^<]*)(<[\w\W]+>)([^>]*)$/;
|
||||
|
||||
// $(html) "looks like html" rule change
|
||||
jQuery.fn.init = function( selector, context, rootjQuery ) {
|
||||
var match;
|
||||
|
||||
if ( selector && typeof selector === "string" && !jQuery.isPlainObject( context ) &&
|
||||
(match = rquickExpr.exec( jQuery.trim( selector ) )) && match[ 0 ] ) {
|
||||
// This is an HTML string according to the "old" rules; is it still?
|
||||
if ( selector.charAt( 0 ) !== "<" ) {
|
||||
migrateWarn("$(html) HTML strings must start with '<' character");
|
||||
}
|
||||
if ( match[ 3 ] ) {
|
||||
migrateWarn("$(html) HTML text after last tag is ignored");
|
||||
}
|
||||
// Consistently reject any HTML-like string starting with a hash (#9521)
|
||||
// Note that this may break jQuery 1.6.x code that otherwise would work.
|
||||
if ( match[ 0 ].charAt( 0 ) === "#" ) {
|
||||
migrateWarn("HTML string cannot start with a '#' character");
|
||||
jQuery.error("JQMIGRATE: Invalid selector string (XSS)");
|
||||
}
|
||||
// Now process using loose rules; let pre-1.8 play too
|
||||
if ( context && context.context ) {
|
||||
// jQuery object as context; parseHTML expects a DOM object
|
||||
context = context.context;
|
||||
}
|
||||
if ( jQuery.parseHTML ) {
|
||||
return oldInit.call( this, jQuery.parseHTML( match[ 2 ], context, true ),
|
||||
context, rootjQuery );
|
||||
}
|
||||
}
|
||||
return oldInit.apply( this, arguments );
|
||||
};
|
||||
jQuery.fn.init.prototype = jQuery.fn;
|
||||
|
||||
// Let $.parseJSON(falsy_value) return null
|
||||
jQuery.parseJSON = function( json ) {
|
||||
if ( !json && json !== null ) {
|
||||
migrateWarn("jQuery.parseJSON requires a valid JSON string");
|
||||
return null;
|
||||
}
|
||||
return oldParseJSON.apply( this, arguments );
|
||||
};
|
||||
|
||||
jQuery.uaMatch = function( ua ) {
|
||||
ua = ua.toLowerCase();
|
||||
|
||||
var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
|
||||
/(webkit)[ \/]([\w.]+)/.exec( ua ) ||
|
||||
/(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
|
||||
/(msie) ([\w.]+)/.exec( ua ) ||
|
||||
ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
|
||||
[];
|
||||
|
||||
return {
|
||||
browser: match[ 1 ] || "",
|
||||
version: match[ 2 ] || "0"
|
||||
};
|
||||
};
|
||||
|
||||
// Don't clobber any existing jQuery.browser in case it's different
|
||||
if ( !jQuery.browser ) {
|
||||
matched = jQuery.uaMatch( navigator.userAgent );
|
||||
browser = {};
|
||||
|
||||
if ( matched.browser ) {
|
||||
browser[ matched.browser ] = true;
|
||||
browser.version = matched.version;
|
||||
}
|
||||
|
||||
// Chrome is Webkit, but Webkit is also Safari.
|
||||
if ( browser.chrome ) {
|
||||
browser.webkit = true;
|
||||
} else if ( browser.webkit ) {
|
||||
browser.safari = true;
|
||||
}
|
||||
|
||||
jQuery.browser = browser;
|
||||
}
|
||||
|
||||
// Warn if the code tries to get jQuery.browser
|
||||
migrateWarnProp( jQuery, "browser", jQuery.browser, "jQuery.browser is deprecated" );
|
||||
|
||||
jQuery.sub = function() {
|
||||
function jQuerySub( selector, context ) {
|
||||
return new jQuerySub.fn.init( selector, context );
|
||||
}
|
||||
jQuery.extend( true, jQuerySub, this );
|
||||
jQuerySub.superclass = this;
|
||||
jQuerySub.fn = jQuerySub.prototype = this();
|
||||
jQuerySub.fn.constructor = jQuerySub;
|
||||
jQuerySub.sub = this.sub;
|
||||
jQuerySub.fn.init = function init( selector, context ) {
|
||||
if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
|
||||
context = jQuerySub( context );
|
||||
}
|
||||
|
||||
return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
|
||||
};
|
||||
jQuerySub.fn.init.prototype = jQuerySub.fn;
|
||||
var rootjQuerySub = jQuerySub(document);
|
||||
migrateWarn( "jQuery.sub() is deprecated" );
|
||||
return jQuerySub;
|
||||
};
|
||||
|
||||
|
||||
// Ensure that $.ajax gets the new parseJSON defined in core.js
|
||||
jQuery.ajaxSetup({
|
||||
converters: {
|
||||
"text json": jQuery.parseJSON
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
var oldFnData = jQuery.fn.data;
|
||||
|
||||
jQuery.fn.data = function( name ) {
|
||||
var ret, evt,
|
||||
elem = this[0];
|
||||
|
||||
// Handles 1.7 which has this behavior and 1.8 which doesn't
|
||||
if ( elem && name === "events" && arguments.length === 1 ) {
|
||||
ret = jQuery.data( elem, name );
|
||||
evt = jQuery._data( elem, name );
|
||||
if ( ( ret === undefined || ret === evt ) && evt !== undefined ) {
|
||||
migrateWarn("Use of jQuery.fn.data('events') is deprecated");
|
||||
return evt;
|
||||
}
|
||||
}
|
||||
return oldFnData.apply( this, arguments );
|
||||
};
|
||||
|
||||
|
||||
var rscriptType = /\/(java|ecma)script/i,
|
||||
oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack;
|
||||
|
||||
jQuery.fn.andSelf = function() {
|
||||
migrateWarn("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()");
|
||||
return oldSelf.apply( this, arguments );
|
||||
};
|
||||
|
||||
// Since jQuery.clean is used internally on older versions, we only shim if it's missing
|
||||
if ( !jQuery.clean ) {
|
||||
jQuery.clean = function( elems, context, fragment, scripts ) {
|
||||
// Set context per 1.8 logic
|
||||
context = context || document;
|
||||
context = !context.nodeType && context[0] || context;
|
||||
context = context.ownerDocument || context;
|
||||
|
||||
migrateWarn("jQuery.clean() is deprecated");
|
||||
|
||||
var i, elem, handleScript, jsTags,
|
||||
ret = [];
|
||||
|
||||
jQuery.merge( ret, jQuery.buildFragment( elems, context ).childNodes );
|
||||
|
||||
// Complex logic lifted directly from jQuery 1.8
|
||||
if ( fragment ) {
|
||||
// Special handling of each script element
|
||||
handleScript = function( elem ) {
|
||||
// Check if we consider it executable
|
||||
if ( !elem.type || rscriptType.test( elem.type ) ) {
|
||||
// Detach the script and store it in the scripts array (if provided) or the fragment
|
||||
// Return truthy to indicate that it has been handled
|
||||
return scripts ?
|
||||
scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :
|
||||
fragment.appendChild( elem );
|
||||
}
|
||||
};
|
||||
|
||||
for ( i = 0; (elem = ret[i]) != null; i++ ) {
|
||||
// Check if we're done after handling an executable script
|
||||
if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) {
|
||||
// Append to fragment and handle embedded scripts
|
||||
fragment.appendChild( elem );
|
||||
if ( typeof elem.getElementsByTagName !== "undefined" ) {
|
||||
// handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
|
||||
jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript );
|
||||
|
||||
// Splice the scripts into ret after their former ancestor and advance our index beyond them
|
||||
ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
|
||||
i += jsTags.length;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
};
|
||||
}
|
||||
|
||||
var eventAdd = jQuery.event.add,
|
||||
eventRemove = jQuery.event.remove,
|
||||
eventTrigger = jQuery.event.trigger,
|
||||
oldToggle = jQuery.fn.toggle,
|
||||
oldLive = jQuery.fn.live,
|
||||
oldDie = jQuery.fn.die,
|
||||
ajaxEvents = "ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess",
|
||||
rajaxEvent = new RegExp( "\\b(?:" + ajaxEvents + ")\\b" ),
|
||||
rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
|
||||
hoverHack = function( events ) {
|
||||
if ( typeof( events ) !== "string" || jQuery.event.special.hover ) {
|
||||
return events;
|
||||
}
|
||||
if ( rhoverHack.test( events ) ) {
|
||||
migrateWarn("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'");
|
||||
}
|
||||
return events && events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
|
||||
};
|
||||
|
||||
// Event props removed in 1.9, put them back if needed; no practical way to warn them
|
||||
if ( jQuery.event.props && jQuery.event.props[ 0 ] !== "attrChange" ) {
|
||||
jQuery.event.props.unshift( "attrChange", "attrName", "relatedNode", "srcElement" );
|
||||
}
|
||||
|
||||
// Undocumented jQuery.event.handle was "deprecated" in jQuery 1.7
|
||||
if ( jQuery.event.dispatch ) {
|
||||
migrateWarnProp( jQuery.event, "handle", jQuery.event.dispatch, "jQuery.event.handle is undocumented and deprecated" );
|
||||
}
|
||||
|
||||
// Support for 'hover' pseudo-event and ajax event warnings
|
||||
jQuery.event.add = function( elem, types, handler, data, selector ){
|
||||
if ( elem !== document && rajaxEvent.test( types ) ) {
|
||||
migrateWarn( "AJAX events should be attached to document: " + types );
|
||||
}
|
||||
eventAdd.call( this, elem, hoverHack( types || "" ), handler, data, selector );
|
||||
};
|
||||
jQuery.event.remove = function( elem, types, handler, selector, mappedTypes ){
|
||||
eventRemove.call( this, elem, hoverHack( types ) || "", handler, selector, mappedTypes );
|
||||
};
|
||||
|
||||
jQuery.fn.error = function() {
|
||||
var args = Array.prototype.slice.call( arguments, 0);
|
||||
migrateWarn("jQuery.fn.error() is deprecated");
|
||||
args.splice( 0, 0, "error" );
|
||||
if ( arguments.length ) {
|
||||
return this.bind.apply( this, args );
|
||||
}
|
||||
// error event should not bubble to window, although it does pre-1.7
|
||||
this.triggerHandler.apply( this, args );
|
||||
return this;
|
||||
};
|
||||
|
||||
jQuery.fn.toggle = function( fn, fn2 ) {
|
||||
|
||||
// Don't mess with animation or css toggles
|
||||
if ( !jQuery.isFunction( fn ) || !jQuery.isFunction( fn2 ) ) {
|
||||
return oldToggle.apply( this, arguments );
|
||||
}
|
||||
migrateWarn("jQuery.fn.toggle(handler, handler...) is deprecated");
|
||||
|
||||
// Save reference to arguments for access in closure
|
||||
var args = arguments,
|
||||
guid = fn.guid || jQuery.guid++,
|
||||
i = 0,
|
||||
toggler = function( event ) {
|
||||
// Figure out which function to execute
|
||||
var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
|
||||
jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
|
||||
|
||||
// Make sure that clicks stop
|
||||
event.preventDefault();
|
||||
|
||||
// and execute the function
|
||||
return args[ lastToggle ].apply( this, arguments ) || false;
|
||||
};
|
||||
|
||||
// link all the functions, so any of them can unbind this click handler
|
||||
toggler.guid = guid;
|
||||
while ( i < args.length ) {
|
||||
args[ i++ ].guid = guid;
|
||||
}
|
||||
|
||||
return this.click( toggler );
|
||||
};
|
||||
|
||||
jQuery.fn.live = function( types, data, fn ) {
|
||||
migrateWarn("jQuery.fn.live() is deprecated");
|
||||
if ( oldLive ) {
|
||||
return oldLive.apply( this, arguments );
|
||||
}
|
||||
jQuery( this.context ).on( types, this.selector, data, fn );
|
||||
return this;
|
||||
};
|
||||
|
||||
jQuery.fn.die = function( types, fn ) {
|
||||
migrateWarn("jQuery.fn.die() is deprecated");
|
||||
if ( oldDie ) {
|
||||
return oldDie.apply( this, arguments );
|
||||
}
|
||||
jQuery( this.context ).off( types, this.selector || "**", fn );
|
||||
return this;
|
||||
};
|
||||
|
||||
// Turn global events into document-triggered events
|
||||
jQuery.event.trigger = function( event, data, elem, onlyHandlers ){
|
||||
if ( !elem && !rajaxEvent.test( event ) ) {
|
||||
migrateWarn( "Global events are undocumented and deprecated" );
|
||||
}
|
||||
return eventTrigger.call( this, event, data, elem || document, onlyHandlers );
|
||||
};
|
||||
jQuery.each( ajaxEvents.split("|"),
|
||||
function( _, name ) {
|
||||
jQuery.event.special[ name ] = {
|
||||
setup: function() {
|
||||
var elem = this;
|
||||
|
||||
// The document needs no shimming; must be !== for oldIE
|
||||
if ( elem !== document ) {
|
||||
jQuery.event.add( document, name + "." + jQuery.guid, function() {
|
||||
jQuery.event.trigger( name, null, elem, true );
|
||||
});
|
||||
jQuery._data( this, name, jQuery.guid++ );
|
||||
}
|
||||
return false;
|
||||
},
|
||||
teardown: function() {
|
||||
if ( this !== document ) {
|
||||
jQuery.event.remove( document, name + "." + jQuery._data( this, name ) );
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
})( jQuery, window );
|
||||
Vendored
+4
File diff suppressed because one or more lines are too long
@@ -0,0 +1,484 @@
|
||||
/*!
|
||||
* Nestable jQuery Plugin - Copyright (c) 2012 David Bushell - http://dbushell.com/
|
||||
* Dual-licensed under the BSD or MIT licenses
|
||||
*/
|
||||
;(function($, window, document, undefined)
|
||||
{
|
||||
var hasTouch = 'ontouchstart' in document;
|
||||
|
||||
/**
|
||||
* Detect CSS pointer-events property
|
||||
* events are normally disabled on the dragging element to avoid conflicts
|
||||
* https://github.com/ausi/Feature-detection-technique-for-pointer-events/blob/master/modernizr-pointerevents.js
|
||||
*/
|
||||
var hasPointerEvents = (function()
|
||||
{
|
||||
var el = document.createElement('div'),
|
||||
docEl = document.documentElement;
|
||||
if (!('pointerEvents' in el.style)) {
|
||||
return false;
|
||||
}
|
||||
el.style.pointerEvents = 'auto';
|
||||
el.style.pointerEvents = 'x';
|
||||
docEl.appendChild(el);
|
||||
var supports = window.getComputedStyle && window.getComputedStyle(el, '').pointerEvents === 'auto';
|
||||
docEl.removeChild(el);
|
||||
return !!supports;
|
||||
})();
|
||||
|
||||
var defaults = {
|
||||
listNodeName : 'ol',
|
||||
itemNodeName : 'li',
|
||||
rootClass : 'dd',
|
||||
listClass : 'dd-list',
|
||||
itemClass : 'dd-item',
|
||||
dragClass : 'dd-dragel',
|
||||
handleClass : 'dd-handle',
|
||||
collapsedClass : 'dd-collapsed',
|
||||
placeClass : 'dd-placeholder',
|
||||
noDragClass : 'dd-nodrag',
|
||||
emptyClass : 'dd-empty',
|
||||
expandBtnHTML : '<button data-action="expand" type="button">Expand</button>',
|
||||
collapseBtnHTML : '<button data-action="collapse" type="button">Collapse</button>',
|
||||
group : 0,
|
||||
maxDepth : 5,
|
||||
threshold : 20
|
||||
};
|
||||
|
||||
function Plugin(element, options)
|
||||
{
|
||||
this.w = $(document);
|
||||
this.el = $(element);
|
||||
this.options = $.extend({}, defaults, options);
|
||||
this.init();
|
||||
}
|
||||
|
||||
Plugin.prototype = {
|
||||
|
||||
init: function()
|
||||
{
|
||||
var list = this;
|
||||
|
||||
list.reset();
|
||||
|
||||
list.el.data('nestable-group', this.options.group);
|
||||
|
||||
list.placeEl = $('<div class="' + list.options.placeClass + '"/>');
|
||||
|
||||
$.each(this.el.find(list.options.itemNodeName), function(k, el) {
|
||||
list.setParent($(el));
|
||||
});
|
||||
|
||||
list.el.on('click', 'button', function(e) {
|
||||
if (list.dragEl) {
|
||||
return;
|
||||
}
|
||||
var target = $(e.currentTarget),
|
||||
action = target.data('action'),
|
||||
item = target.parent(list.options.itemNodeName);
|
||||
if (action === 'collapse') {
|
||||
list.collapseItem(item);
|
||||
}
|
||||
if (action === 'expand') {
|
||||
list.expandItem(item);
|
||||
}
|
||||
});
|
||||
|
||||
var onStartEvent = function(e)
|
||||
{
|
||||
var handle = $(e.target);
|
||||
if (!handle.hasClass(list.options.handleClass)) {
|
||||
if (handle.closest('.' + list.options.noDragClass).length) {
|
||||
return;
|
||||
}
|
||||
handle = handle.closest('.' + list.options.handleClass);
|
||||
}
|
||||
|
||||
if (!handle.length || list.dragEl) {
|
||||
return;
|
||||
}
|
||||
|
||||
list.isTouch = /^touch/.test(e.type);
|
||||
if (list.isTouch && e.touches.length !== 1) {
|
||||
return;
|
||||
}
|
||||
|
||||
e.preventDefault();
|
||||
list.dragStart(e.touches ? e.touches[0] : e);
|
||||
};
|
||||
|
||||
var onMoveEvent = function(e)
|
||||
{
|
||||
if (list.dragEl) {
|
||||
e.preventDefault();
|
||||
list.dragMove(e.touches ? e.touches[0] : e);
|
||||
}
|
||||
};
|
||||
|
||||
var onEndEvent = function(e)
|
||||
{
|
||||
if (list.dragEl) {
|
||||
e.preventDefault();
|
||||
list.dragStop(e.touches ? e.touches[0] : e);
|
||||
}
|
||||
};
|
||||
|
||||
if (hasTouch) {
|
||||
list.el[0].addEventListener('touchstart', onStartEvent, false);
|
||||
window.addEventListener('touchmove', onMoveEvent, false);
|
||||
window.addEventListener('touchend', onEndEvent, false);
|
||||
window.addEventListener('touchcancel', onEndEvent, false);
|
||||
}
|
||||
|
||||
list.el.on('mousedown', onStartEvent);
|
||||
list.w.on('mousemove', onMoveEvent);
|
||||
list.w.on('mouseup', onEndEvent);
|
||||
|
||||
},
|
||||
|
||||
serialize: function()
|
||||
{
|
||||
var data,
|
||||
depth = 0,
|
||||
list = this;
|
||||
step = function(level, depth)
|
||||
{
|
||||
var array = [ ],
|
||||
items = level.children(list.options.itemNodeName);
|
||||
items.each(function()
|
||||
{
|
||||
var li = $(this),
|
||||
item = $.extend({}, li.data()),
|
||||
sub = li.children(list.options.listNodeName);
|
||||
if (sub.length) {
|
||||
item.children = step(sub, depth + 1);
|
||||
}
|
||||
array.push(item);
|
||||
});
|
||||
return array;
|
||||
};
|
||||
data = step(list.el.find(list.options.listNodeName).first(), depth);
|
||||
return data;
|
||||
},
|
||||
|
||||
serialise: function()
|
||||
{
|
||||
return this.serialize();
|
||||
},
|
||||
|
||||
reset: function()
|
||||
{
|
||||
this.mouse = {
|
||||
offsetX : 0,
|
||||
offsetY : 0,
|
||||
startX : 0,
|
||||
startY : 0,
|
||||
lastX : 0,
|
||||
lastY : 0,
|
||||
nowX : 0,
|
||||
nowY : 0,
|
||||
distX : 0,
|
||||
distY : 0,
|
||||
dirAx : 0,
|
||||
dirX : 0,
|
||||
dirY : 0,
|
||||
lastDirX : 0,
|
||||
lastDirY : 0,
|
||||
distAxX : 0,
|
||||
distAxY : 0
|
||||
};
|
||||
this.isTouch = false;
|
||||
this.moving = false;
|
||||
this.dragEl = null;
|
||||
this.dragRootEl = null;
|
||||
this.dragDepth = 0;
|
||||
this.hasNewRoot = false;
|
||||
this.pointEl = null;
|
||||
},
|
||||
|
||||
expandItem: function(li)
|
||||
{
|
||||
li.removeClass(this.options.collapsedClass);
|
||||
li.children('[data-action="expand"]').hide();
|
||||
li.children('[data-action="collapse"]').show();
|
||||
li.children(this.options.listNodeName).show();
|
||||
},
|
||||
|
||||
collapseItem: function(li)
|
||||
{
|
||||
var lists = li.children(this.options.listNodeName);
|
||||
if (lists.length) {
|
||||
li.addClass(this.options.collapsedClass);
|
||||
li.children('[data-action="collapse"]').hide();
|
||||
li.children('[data-action="expand"]').show();
|
||||
li.children(this.options.listNodeName).hide();
|
||||
}
|
||||
},
|
||||
|
||||
expandAll: function()
|
||||
{
|
||||
var list = this;
|
||||
list.el.find(list.options.itemNodeName).each(function() {
|
||||
list.expandItem($(this));
|
||||
});
|
||||
},
|
||||
|
||||
collapseAll: function()
|
||||
{
|
||||
var list = this;
|
||||
list.el.find(list.options.itemNodeName).each(function() {
|
||||
list.collapseItem($(this));
|
||||
});
|
||||
},
|
||||
|
||||
setParent: function(li)
|
||||
{
|
||||
if (li.children(this.options.listNodeName).length) {
|
||||
li.prepend($(this.options.expandBtnHTML));
|
||||
li.prepend($(this.options.collapseBtnHTML));
|
||||
}
|
||||
li.children('[data-action="expand"]').hide();
|
||||
},
|
||||
|
||||
unsetParent: function(li)
|
||||
{
|
||||
li.removeClass(this.options.collapsedClass);
|
||||
li.children('[data-action]').remove();
|
||||
li.children(this.options.listNodeName).remove();
|
||||
},
|
||||
|
||||
dragStart: function(e)
|
||||
{
|
||||
var mouse = this.mouse,
|
||||
target = $(e.target),
|
||||
dragItem = target.closest(this.options.itemNodeName);
|
||||
|
||||
this.placeEl.css('height', dragItem.height());
|
||||
|
||||
mouse.offsetX = e.offsetX !== undefined ? e.offsetX : e.pageX - target.offset().left;
|
||||
mouse.offsetY = e.offsetY !== undefined ? e.offsetY : e.pageY - target.offset().top;
|
||||
mouse.startX = mouse.lastX = e.pageX;
|
||||
mouse.startY = mouse.lastY = e.pageY;
|
||||
|
||||
this.dragRootEl = this.el;
|
||||
|
||||
this.dragEl = $(document.createElement(this.options.listNodeName)).addClass(this.options.listClass + ' ' + this.options.dragClass);
|
||||
this.dragEl.css('width', dragItem.width());
|
||||
|
||||
dragItem.after(this.placeEl);
|
||||
dragItem[0].parentNode.removeChild(dragItem[0]);
|
||||
dragItem.appendTo(this.dragEl);
|
||||
|
||||
$(document.body).append(this.dragEl);
|
||||
this.dragEl.css({
|
||||
'left' : e.pageX - mouse.offsetX,
|
||||
'top' : e.pageY - mouse.offsetY
|
||||
});
|
||||
// total depth of dragging item
|
||||
var i, depth,
|
||||
items = this.dragEl.find(this.options.itemNodeName);
|
||||
for (i = 0; i < items.length; i++) {
|
||||
depth = $(items[i]).parents(this.options.listNodeName).length;
|
||||
if (depth > this.dragDepth) {
|
||||
this.dragDepth = depth;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
dragStop: function(e)
|
||||
{
|
||||
var el = this.dragEl.children(this.options.itemNodeName).first();
|
||||
el[0].parentNode.removeChild(el[0]);
|
||||
this.placeEl.replaceWith(el);
|
||||
|
||||
this.dragEl.remove();
|
||||
this.el.trigger('change');
|
||||
if (this.hasNewRoot) {
|
||||
this.dragRootEl.trigger('change');
|
||||
}
|
||||
this.reset();
|
||||
},
|
||||
|
||||
dragMove: function(e)
|
||||
{
|
||||
var list, parent, prev, next, depth,
|
||||
opt = this.options,
|
||||
mouse = this.mouse;
|
||||
|
||||
this.dragEl.css({
|
||||
'left' : e.pageX - mouse.offsetX,
|
||||
'top' : e.pageY - mouse.offsetY
|
||||
});
|
||||
|
||||
// mouse position last events
|
||||
mouse.lastX = mouse.nowX;
|
||||
mouse.lastY = mouse.nowY;
|
||||
// mouse position this events
|
||||
mouse.nowX = e.pageX;
|
||||
mouse.nowY = e.pageY;
|
||||
// distance mouse moved between events
|
||||
mouse.distX = mouse.nowX - mouse.lastX;
|
||||
mouse.distY = mouse.nowY - mouse.lastY;
|
||||
// direction mouse was moving
|
||||
mouse.lastDirX = mouse.dirX;
|
||||
mouse.lastDirY = mouse.dirY;
|
||||
// direction mouse is now moving (on both axis)
|
||||
mouse.dirX = mouse.distX === 0 ? 0 : mouse.distX > 0 ? 1 : -1;
|
||||
mouse.dirY = mouse.distY === 0 ? 0 : mouse.distY > 0 ? 1 : -1;
|
||||
// axis mouse is now moving on
|
||||
var newAx = Math.abs(mouse.distX) > Math.abs(mouse.distY) ? 1 : 0;
|
||||
|
||||
// do nothing on first move
|
||||
if (!mouse.moving) {
|
||||
mouse.dirAx = newAx;
|
||||
mouse.moving = true;
|
||||
return;
|
||||
}
|
||||
|
||||
// calc distance moved on this axis (and direction)
|
||||
if (mouse.dirAx !== newAx) {
|
||||
mouse.distAxX = 0;
|
||||
mouse.distAxY = 0;
|
||||
} else {
|
||||
mouse.distAxX += Math.abs(mouse.distX);
|
||||
if (mouse.dirX !== 0 && mouse.dirX !== mouse.lastDirX) {
|
||||
mouse.distAxX = 0;
|
||||
}
|
||||
mouse.distAxY += Math.abs(mouse.distY);
|
||||
if (mouse.dirY !== 0 && mouse.dirY !== mouse.lastDirY) {
|
||||
mouse.distAxY = 0;
|
||||
}
|
||||
}
|
||||
mouse.dirAx = newAx;
|
||||
|
||||
/**
|
||||
* move horizontal
|
||||
*/
|
||||
if (mouse.dirAx && mouse.distAxX >= opt.threshold) {
|
||||
// reset move distance on x-axis for new phase
|
||||
mouse.distAxX = 0;
|
||||
prev = this.placeEl.prev(opt.itemNodeName);
|
||||
// increase horizontal level if previous sibling exists and is not collapsed
|
||||
if (mouse.distX > 0 && prev.length && !prev.hasClass(opt.collapsedClass)) {
|
||||
// cannot increase level when item above is collapsed
|
||||
list = prev.find(opt.listNodeName).last();
|
||||
// check if depth limit has reached
|
||||
depth = this.placeEl.parents(opt.listNodeName).length;
|
||||
if (depth + this.dragDepth <= opt.maxDepth) {
|
||||
// create new sub-level if one doesn't exist
|
||||
if (!list.length) {
|
||||
list = $('<' + opt.listNodeName + '/>').addClass(opt.listClass);
|
||||
list.append(this.placeEl);
|
||||
prev.append(list);
|
||||
this.setParent(prev);
|
||||
} else {
|
||||
// else append to next level up
|
||||
list = prev.children(opt.listNodeName).last();
|
||||
list.append(this.placeEl);
|
||||
}
|
||||
}
|
||||
}
|
||||
// decrease horizontal level
|
||||
if (mouse.distX < 0) {
|
||||
// we can't decrease a level if an item preceeds the current one
|
||||
next = this.placeEl.next(opt.itemNodeName);
|
||||
if (!next.length) {
|
||||
parent = this.placeEl.parent();
|
||||
this.placeEl.closest(opt.itemNodeName).after(this.placeEl);
|
||||
if (!parent.children().length) {
|
||||
this.unsetParent(parent.parent());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var isEmpty = false;
|
||||
|
||||
// find list item under cursor
|
||||
if (!hasPointerEvents) {
|
||||
this.dragEl[0].style.visibility = 'hidden';
|
||||
}
|
||||
this.pointEl = $(document.elementFromPoint(e.pageX - document.body.scrollLeft, e.pageY - (window.pageYOffset || document.documentElement.scrollTop)));
|
||||
if (!hasPointerEvents) {
|
||||
this.dragEl[0].style.visibility = 'visible';
|
||||
}
|
||||
if (this.pointEl.hasClass(opt.handleClass)) {
|
||||
this.pointEl = this.pointEl.parent(opt.itemNodeName);
|
||||
}
|
||||
if (this.pointEl.hasClass(opt.emptyClass)) {
|
||||
isEmpty = true;
|
||||
}
|
||||
else if (!this.pointEl.length || !this.pointEl.hasClass(opt.itemClass)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// find parent list of item under cursor
|
||||
var pointElRoot = this.pointEl.closest('.' + opt.rootClass),
|
||||
isNewRoot = this.dragRootEl.data('nestable-id') !== pointElRoot.data('nestable-id');
|
||||
|
||||
/**
|
||||
* move vertical
|
||||
*/
|
||||
if (!mouse.dirAx || isNewRoot || isEmpty) {
|
||||
// check if groups match if dragging over new root
|
||||
if (isNewRoot && opt.group !== pointElRoot.data('nestable-group')) {
|
||||
return;
|
||||
}
|
||||
// check depth limit
|
||||
depth = this.dragDepth - 1 + this.pointEl.parents(opt.listNodeName).length;
|
||||
if (depth > opt.maxDepth) {
|
||||
return;
|
||||
}
|
||||
var before = e.pageY < (this.pointEl.offset().top + this.pointEl.height() / 2);
|
||||
parent = this.placeEl.parent();
|
||||
// if empty create new list to replace empty placeholder
|
||||
if (isEmpty) {
|
||||
list = $(document.createElement(opt.listNodeName)).addClass(opt.listClass);
|
||||
list.append(this.placeEl);
|
||||
this.pointEl.replaceWith(list);
|
||||
}
|
||||
else if (before) {
|
||||
this.pointEl.before(this.placeEl);
|
||||
}
|
||||
else {
|
||||
this.pointEl.after(this.placeEl);
|
||||
}
|
||||
if (!parent.children().length) {
|
||||
this.unsetParent(parent.parent());
|
||||
}
|
||||
if (!this.dragRootEl.find(opt.itemNodeName).length) {
|
||||
this.dragRootEl.append('<div class="' + opt.emptyClass + '"/>');
|
||||
}
|
||||
// parent root list has changed
|
||||
if (isNewRoot) {
|
||||
this.dragRootEl = pointElRoot;
|
||||
this.hasNewRoot = this.el[0] !== this.dragRootEl[0];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
$.fn.nestable = function(params)
|
||||
{
|
||||
var lists = this,
|
||||
retval = this;
|
||||
|
||||
lists.each(function()
|
||||
{
|
||||
var plugin = $(this).data("nestable");
|
||||
|
||||
if (!plugin) {
|
||||
$(this).data("nestable", new Plugin(this, params));
|
||||
$(this).data("nestable-id", new Date().getTime());
|
||||
} else {
|
||||
if (typeof params === 'string' && typeof plugin[params] === 'function') {
|
||||
retval = plugin[params]();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return retval || lists;
|
||||
};
|
||||
|
||||
})(window.jQuery || window.Zepto, window, document);
|
||||
@@ -0,0 +1,252 @@
|
||||
/*
|
||||
One Click Upload - jQuery Plugin
|
||||
--------------------------------
|
||||
|
||||
Copyright (c) 2008 Michael Mitchell - http://www.michaelmitchell.co.nz
|
||||
Copyright (c) 2011 Andrey Fedoseev <andrey.fedoseev@gmail.com> - http://andreyfedoseev.name
|
||||
Copyright (c) 2012 vol7ron <supervolting@gmail.com>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
*/
|
||||
|
||||
(function($) {
|
||||
$.fn.upload = function(options) {
|
||||
/** Merge the users options with our defaults */
|
||||
options = $.extend({
|
||||
name : 'file',
|
||||
enctype : 'multipart/form-data',
|
||||
action : '',
|
||||
autoSubmit : true,
|
||||
onSubmit : function() {},
|
||||
onComplete : function() {},
|
||||
onSelect : function() {},
|
||||
params : {}
|
||||
},
|
||||
options);
|
||||
|
||||
return new $.ocupload(this, options);
|
||||
};
|
||||
|
||||
$.ocupload = function(element, options) {
|
||||
/** Fix scope problems */
|
||||
var self = this;
|
||||
|
||||
/** A unique id so we can find our elements later */
|
||||
var id = new Date().getTime().toString();
|
||||
|
||||
/** Upload iframe */
|
||||
var iframe = $("<iframe></iframe>", {
|
||||
id : "iframe" + id,
|
||||
name : "iframe" + id
|
||||
}).css({
|
||||
display : "none"
|
||||
});
|
||||
|
||||
/** Form */
|
||||
var form = $("<form></form>", {
|
||||
method : "post",
|
||||
enctype : options.enctype,
|
||||
action : options.action,
|
||||
target : "iframe" + id
|
||||
}).css({
|
||||
margin : 0,
|
||||
padding : 0
|
||||
});
|
||||
|
||||
/** Get cursor type from the object ocupload was assigned to */
|
||||
/** TODO: Add parameter to init? cursor: auto, cursor: pointer etc */
|
||||
var element_cursor = element.css('cursor');
|
||||
|
||||
/** File Input */
|
||||
var input = $("<input>", {
|
||||
name : options.name + '[]',
|
||||
multiple : 'multiple',
|
||||
type : 'file'
|
||||
}).css({
|
||||
position : 'absolute',
|
||||
display : 'none',
|
||||
cursor : element_cursor,
|
||||
opacity : 0
|
||||
});
|
||||
|
||||
/** Put everything together */
|
||||
|
||||
element.wrap("<div></div>");
|
||||
form.append(input);
|
||||
element.after(form);
|
||||
element.after(iframe);
|
||||
element.click(function(){input.click()});
|
||||
|
||||
/** Find the container and make it nice and snug */
|
||||
var container = element.parent().css({
|
||||
position : 'relative',
|
||||
display : element.css('display'),
|
||||
height : element.outerHeight() + 'px',
|
||||
width : element.outerWidth() + 'px',
|
||||
overflow : 'hidden',
|
||||
cursor : element_cursor,
|
||||
margin : 0,
|
||||
padding : 0
|
||||
});
|
||||
|
||||
/** Get input dimensions so we can put it in the right place */
|
||||
var input_height = input.outerHeight(1);
|
||||
var input_width = input.outerWidth(1);
|
||||
|
||||
/** Watch for file selection */
|
||||
input.change(function() {
|
||||
/** Do something when a file is selected. */
|
||||
self.onSelect();
|
||||
|
||||
/** Submit the form automaticly after selecting the file */
|
||||
if (self.autoSubmit) {
|
||||
self.submit();
|
||||
}
|
||||
});
|
||||
|
||||
/** Methods */
|
||||
$.extend(this, {
|
||||
autoSubmit : options.autoSubmit, // vol7ron: changed 'true' to 'options.autoSubmit'
|
||||
onSubmit : options.onSubmit,
|
||||
onComplete : options.onComplete,
|
||||
onSelect : options.onSelect,
|
||||
|
||||
/** get filename */
|
||||
filename: function() {
|
||||
return input.attr('value');
|
||||
},
|
||||
|
||||
/** get/set params */
|
||||
params: function(params) {
|
||||
params = params ? params: false;
|
||||
if (params) {
|
||||
options.params = $.extend(options.params, params);
|
||||
}
|
||||
else {
|
||||
return options.params;
|
||||
}
|
||||
},
|
||||
|
||||
/** get/set name */
|
||||
name: function(name) {
|
||||
name = name ? name: false;
|
||||
if (name) {
|
||||
input.attr('name', value);
|
||||
}
|
||||
else {
|
||||
return input.attr('name');
|
||||
}
|
||||
},
|
||||
|
||||
/** get/set action */
|
||||
action: function(action) {
|
||||
action = action ? action: false;
|
||||
if (action) {
|
||||
form.attr('action', action);
|
||||
}
|
||||
else {
|
||||
return form.attr('action');
|
||||
}
|
||||
},
|
||||
|
||||
/** get/set enctype */
|
||||
enctype: function(enctype) {
|
||||
enctype = enctype ? enctype: false;
|
||||
if (enctype) {
|
||||
form.attr('enctype', enctype);
|
||||
}
|
||||
else {
|
||||
return form.attr('enctype');
|
||||
}
|
||||
},
|
||||
|
||||
/** set options */
|
||||
set: function(obj, value) {
|
||||
value = value ? value: false;
|
||||
function option(action, value) {
|
||||
switch (action) {
|
||||
case 'name': self.name(value);
|
||||
break;
|
||||
case 'action': self.action(value);
|
||||
break;
|
||||
case 'enctype': self.enctype(value);
|
||||
break;
|
||||
case 'params': self.params(value);
|
||||
break;
|
||||
case 'autoSubmit': self.autoSubmit = value;
|
||||
break;
|
||||
case 'onSubmit': self.onSubmit = value;
|
||||
break;
|
||||
case 'onComplete': self.onComplete = value;
|
||||
break;
|
||||
case 'onSelect': self.onSelect = value;
|
||||
break;
|
||||
default:
|
||||
throw new Error("[jQuery.ocupload.set] '" + action + "' is an invalid option.");
|
||||
}
|
||||
}
|
||||
|
||||
if (value) {
|
||||
option(obj, value);
|
||||
}
|
||||
else {
|
||||
$.each(obj, function(key, value) {
|
||||
option(key, value);
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
/** Submit the form */
|
||||
submit: function() {
|
||||
/** Do something before we upload */
|
||||
|
||||
// if onSubmit returns true, don't send to server (for debugging)
|
||||
var exit = this.onSubmit();
|
||||
if (exit)
|
||||
return;
|
||||
|
||||
$(".ocupload-" + id,form).remove(); // clear the previous used attributes in case loading multiple files
|
||||
|
||||
/** add additional paramters before sending */
|
||||
$.each(options.params, function(key, value) {
|
||||
form.append($("<input>",{
|
||||
type : "hidden",
|
||||
name : key,
|
||||
value : value,
|
||||
'class' : "ocupload-" + id // including the upload id
|
||||
}));
|
||||
|
||||
});
|
||||
|
||||
/** Submit the actual form */
|
||||
form.submit();
|
||||
|
||||
/** Do something after we are finished uploading */
|
||||
iframe.unbind().load(function() {
|
||||
/** Get a response from the server in plain text */
|
||||
var myFrame = document.getElementById(iframe.attr('name'));
|
||||
var response = $(myFrame.contentWindow.document.body).html();
|
||||
|
||||
/** Do something on complete */
|
||||
self.onComplete(response);
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,74 @@
|
||||
/**
|
||||
* jQuery upload v1.2
|
||||
* http://www.ponxu.com
|
||||
*
|
||||
* @author xwz
|
||||
*/
|
||||
(function($) {
|
||||
var noop = function(){ return true; };
|
||||
var frameCount = 0;
|
||||
|
||||
$.uploadDefault = {
|
||||
url: '',
|
||||
fileName: 'filedata',
|
||||
dataType: 'json',
|
||||
params: {},
|
||||
onSend: noop,
|
||||
onSubmit: noop,
|
||||
onComplate: noop
|
||||
};
|
||||
|
||||
$.upload = function(options) {
|
||||
var opts = $.extend(jQuery.uploadDefault, options);
|
||||
if (opts.url == '') {
|
||||
return;
|
||||
}
|
||||
|
||||
var canSend = opts.onSend();
|
||||
if (!canSend) {
|
||||
return;
|
||||
}
|
||||
|
||||
var frameName = 'upload_frame_' + (frameCount++);
|
||||
var iframe = $('<iframe style="position:absolute;top:-9999px" />').attr('name', frameName);
|
||||
var form = $('<form method="post" style="display:none;" enctype="multipart/form-data" />').attr('name', 'form_' + frameName);
|
||||
form.attr("target", frameName).attr('action', opts.url);
|
||||
|
||||
// form中增加数据域
|
||||
var formHtml = '<input type="file" name="' + opts.fileName + '" onchange="javascript:window.parent.onChooseFile(this);">';
|
||||
for (key in opts.params) {
|
||||
formHtml += '<input type="hidden" name="' + key + '" value="' + opts.params[key] + '">';
|
||||
}
|
||||
form.append(formHtml);
|
||||
|
||||
iframe.appendTo("body");
|
||||
//form.appendTo("body");
|
||||
form.appendTo(iframe);
|
||||
|
||||
form.submit(opts.onSubmit);
|
||||
|
||||
// iframe 在提交完成之后
|
||||
iframe.load(function() {
|
||||
var contents = $(this).contents().get(0);
|
||||
var data = $(contents).find('body').text();
|
||||
if ('json' == opts.dataType) {
|
||||
data = window.eval('(' + data + ')');
|
||||
}
|
||||
opts.onComplate(data);
|
||||
setTimeout(function() {
|
||||
iframe.remove();
|
||||
form.remove();
|
||||
}, 5000);
|
||||
});
|
||||
|
||||
// 文件框
|
||||
var fileInput = $('input[type=file][name=' + opts.fileName + ']', form);
|
||||
fileInput.click();
|
||||
};
|
||||
})(jQuery);
|
||||
|
||||
// 选中文件, 提交表单(开始上传)
|
||||
var onChooseFile = function(fileInputDOM) {
|
||||
var form = $(fileInputDOM).parent();
|
||||
form.submit();
|
||||
};
|
||||
@@ -0,0 +1,81 @@
|
||||
/**
|
||||
* author: leunpha
|
||||
* date: 2014-5-1
|
||||
* version 2.0
|
||||
* dependency: jquery.js
|
||||
*/
|
||||
$.fn.upload = function (options) {
|
||||
options = options || {};
|
||||
options.dom = this;
|
||||
$.upload(options);
|
||||
}
|
||||
$.upload = function (options) {
|
||||
var settings = {
|
||||
dom: "",
|
||||
action: "",
|
||||
fileName: "file",
|
||||
params: {},
|
||||
accept: ".jpg,.png",
|
||||
ieSubmitBtnText: "上传",
|
||||
complete: function () {
|
||||
},
|
||||
submit: function () {
|
||||
|
||||
}
|
||||
}
|
||||
settings = $.extend(settings, options);
|
||||
var ele = settings.dom;
|
||||
|
||||
var iframeName = "leunpha_iframe_v" + Math.random() * 100;
|
||||
var width = ele.outerWidth();
|
||||
var height = ele.outerHeight();
|
||||
var iframe = $("<iframe id='"+iframeName+"' name='"+iframeName+"' style='display:none;'></iframe>");
|
||||
var form = $("<form></form>");
|
||||
form.attr({
|
||||
target: iframeName,
|
||||
action: settings.action,
|
||||
method: "post",
|
||||
"class": "ajax_form",
|
||||
enctype: "multipart/form-data"
|
||||
}).css({
|
||||
width: width,
|
||||
height: height,
|
||||
position: "absolute",
|
||||
top: (ele.offset().top),
|
||||
left: (ele.offset().left)
|
||||
});
|
||||
var input = $("<input type='file'/>");
|
||||
input.attr({
|
||||
accept: settings.accept,
|
||||
name: settings.fileName
|
||||
})
|
||||
.css({
|
||||
opacity: 0,
|
||||
position: "absolute",
|
||||
width: width,
|
||||
height: height + "px",
|
||||
cursor: "pointer"
|
||||
});
|
||||
input.change(function () {
|
||||
settings.submit.call(form);
|
||||
$(this).parent("form").submit();
|
||||
});
|
||||
form.append(input);
|
||||
$("body").append(iframe);
|
||||
iframe.after(form);
|
||||
for (var param in settings.params) {
|
||||
var div = $("<input type='hidden'/>").attr({name: param, value: settings.params[param]});
|
||||
input.after(div)
|
||||
div = null;
|
||||
delete div;
|
||||
}
|
||||
iframe.load(function () {
|
||||
var im = document.getElementById(iframeName);
|
||||
|
||||
var text = $(im.contentWindow.document.body).text();
|
||||
|
||||
if (text) {
|
||||
settings.complete.call(null, text);
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
ul.tagit {
|
||||
padding: 1px 5px;
|
||||
overflow: auto;
|
||||
margin-left: inherit; /* usually we don't want the regular ul margins. */
|
||||
margin-right: inherit;
|
||||
}
|
||||
ul.tagit li {
|
||||
display: block;
|
||||
float: left;
|
||||
margin: 2px 5px 2px 0;
|
||||
}
|
||||
ul.tagit li.tagit-choice {
|
||||
position: relative;
|
||||
line-height: inherit;
|
||||
}
|
||||
input.tagit-hidden-field {
|
||||
display: none;
|
||||
}
|
||||
ul.tagit li.tagit-choice-read-only {
|
||||
padding: .2em .5em .2em .5em;
|
||||
}
|
||||
|
||||
ul.tagit li.tagit-choice-editable {
|
||||
padding: .2em 18px .2em .5em;
|
||||
}
|
||||
|
||||
ul.tagit li.tagit-new {
|
||||
padding: .25em 4px .25em 0;
|
||||
}
|
||||
|
||||
ul.tagit li.tagit-choice a.tagit-label {
|
||||
cursor: pointer;
|
||||
text-decoration: none;
|
||||
}
|
||||
ul.tagit li.tagit-choice .tagit-close {
|
||||
cursor: pointer;
|
||||
position: absolute;
|
||||
right: .1em;
|
||||
top: 50%;
|
||||
margin-top: -8px;
|
||||
line-height: 17px;
|
||||
}
|
||||
|
||||
/* used for some custom themes that don't need image icons */
|
||||
ul.tagit li.tagit-choice .tagit-close .text-icon {
|
||||
display: none;
|
||||
}
|
||||
|
||||
ul.tagit li.tagit-choice input {
|
||||
display: block;
|
||||
float: left;
|
||||
margin: 2px 5px 2px 0;
|
||||
}
|
||||
ul.tagit input[type="text"] {
|
||||
-moz-box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
|
||||
-moz-box-shadow: none;
|
||||
-webkit-box-shadow: none;
|
||||
box-shadow: none;
|
||||
|
||||
border: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
width: inherit;
|
||||
background-color: inherit;
|
||||
outline: none;
|
||||
}
|
||||
@@ -0,0 +1,98 @@
|
||||
|
||||
/* Optional scoped theme for tag-it which mimics the zendesk widget. */
|
||||
|
||||
|
||||
ul.tagit {
|
||||
border-style: solid;
|
||||
border-width: 1px;
|
||||
border-color: #C6C6C6;
|
||||
background: inherit;
|
||||
}
|
||||
ul.tagit li.tagit-choice {
|
||||
-moz-border-radius: 6px;
|
||||
border-radius: 6px;
|
||||
-webkit-border-radius: 6px;
|
||||
border: 1px solid #CAD8F3;
|
||||
|
||||
background: none;
|
||||
background-color: #DEE7F8;
|
||||
|
||||
font-weight: normal;
|
||||
}
|
||||
ul.tagit li.tagit-choice .tagit-label:not(a) {
|
||||
color: #555;
|
||||
}
|
||||
ul.tagit li.tagit-choice a.tagit-close {
|
||||
text-decoration: none;
|
||||
}
|
||||
ul.tagit li.tagit-choice .tagit-close {
|
||||
right: .4em;
|
||||
}
|
||||
ul.tagit li.tagit-choice .ui-icon {
|
||||
display: none;
|
||||
}
|
||||
ul.tagit li.tagit-choice .tagit-close .text-icon {
|
||||
display: inline;
|
||||
font-family: arial, sans-serif;
|
||||
font-size: 16px;
|
||||
line-height: 16px;
|
||||
color: #777;
|
||||
}
|
||||
ul.tagit li.tagit-choice:hover, ul.tagit li.tagit-choice.remove {
|
||||
background-color: #bbcef1;
|
||||
border-color: #6d95e0;
|
||||
}
|
||||
ul.tagit li.tagit-choice a.tagLabel:hover,
|
||||
ul.tagit li.tagit-choice a.tagit-close .text-icon:hover {
|
||||
color: #222;
|
||||
}
|
||||
ul.tagit input[type="text"] {
|
||||
color: #333333;
|
||||
background: none;
|
||||
}
|
||||
.ui-widget {
|
||||
font-size: 1.1em;
|
||||
}
|
||||
|
||||
/* Forked from a jQuery UI theme, so that we don't require the jQuery UI CSS as a dependency. */
|
||||
.tagit-autocomplete.ui-autocomplete { position: absolute; cursor: default; }
|
||||
* html .tagit-autocomplete.ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
|
||||
.tagit-autocomplete.ui-menu {
|
||||
list-style:none;
|
||||
padding: 2px;
|
||||
margin: 0;
|
||||
display:block;
|
||||
float: left;
|
||||
}
|
||||
.tagit-autocomplete.ui-menu .ui-menu {
|
||||
margin-top: -3px;
|
||||
}
|
||||
.tagit-autocomplete.ui-menu .ui-menu-item {
|
||||
margin:0;
|
||||
padding: 0;
|
||||
zoom: 1;
|
||||
float: left;
|
||||
clear: left;
|
||||
width: 100%;
|
||||
}
|
||||
.tagit-autocomplete.ui-menu .ui-menu-item a {
|
||||
text-decoration:none;
|
||||
display:block;
|
||||
padding:.2em .4em;
|
||||
line-height:1.5;
|
||||
zoom:1;
|
||||
}
|
||||
.tagit-autocomplete .ui-menu .ui-menu-item a.ui-state-hover,
|
||||
.tagit-autocomplete .ui-menu .ui-menu-item a.ui-state-active {
|
||||
font-weight: normal;
|
||||
margin: -1px;
|
||||
}
|
||||
.tagit-autocomplete.ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff 50% 50% repeat-x; color: #222222; }
|
||||
.tagit-autocomplete.ui-corner-all, .tagit-autocomplete .ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; -khtml-border-radius: 4px; border-radius: 4px; }
|
||||
.tagit-autocomplete .ui-state-hover, .tagit-autocomplete .ui-state-focus { border: 1px solid #999999; background: #dadada; font-weight: normal; color: #212121; }
|
||||
.tagit-autocomplete .ui-state-active { border: 1px solid #aaaaaa; }
|
||||
|
||||
.tagit-autocomplete .ui-widget-content { border: 1px solid #aaaaaa; }
|
||||
.tagit .ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px,1px,1px,1px); }
|
||||
|
||||
|
||||
Vendored
+591
@@ -0,0 +1,591 @@
|
||||
/*
|
||||
* jQuery UI Tag-it!
|
||||
*
|
||||
* @version v2.0 (06/2011)
|
||||
*
|
||||
* Copyright 2011, Levy Carneiro Jr.
|
||||
* Released under the MIT license.
|
||||
* http://aehlke.github.com/tag-it/LICENSE
|
||||
*
|
||||
* Homepage:
|
||||
* http://aehlke.github.com/tag-it/
|
||||
*
|
||||
* Authors:
|
||||
* Levy Carneiro Jr.
|
||||
* Martin Rehfeld
|
||||
* Tobias Schmidt
|
||||
* Skylar Challand
|
||||
* Alex Ehlke
|
||||
*
|
||||
* Maintainer:
|
||||
* Alex Ehlke - Twitter: @aehlke
|
||||
*
|
||||
* Dependencies:
|
||||
* jQuery v1.4+
|
||||
* jQuery UI v1.8+
|
||||
*/
|
||||
(function($) {
|
||||
|
||||
$.widget('ui.tagit', {
|
||||
options: {
|
||||
allowDuplicates : false,
|
||||
caseSensitive : true,
|
||||
fieldName : 'tags',
|
||||
placeholderText : null, // Sets `placeholder` attr on input field.
|
||||
readOnly : false, // Disables editing.
|
||||
removeConfirmation: false, // Require confirmation to remove tags.
|
||||
tagLimit : null, // Max number of tags allowed (null for unlimited).
|
||||
|
||||
// Used for autocomplete, unless you override `autocomplete.source`.
|
||||
availableTags : [],
|
||||
|
||||
// Use to override or add any options to the autocomplete widget.
|
||||
//
|
||||
// By default, autocomplete.source will map to availableTags,
|
||||
// unless overridden.
|
||||
autocomplete: {},
|
||||
|
||||
// Shows autocomplete before the user even types anything.
|
||||
showAutocompleteOnFocus: false,
|
||||
|
||||
// When enabled, quotes are unneccesary for inputting multi-word tags.
|
||||
allowSpaces: false,
|
||||
|
||||
// The below options are for using a single field instead of several
|
||||
// for our form values.
|
||||
//
|
||||
// When enabled, will use a single hidden field for the form,
|
||||
// rather than one per tag. It will delimit tags in the field
|
||||
// with singleFieldDelimiter.
|
||||
//
|
||||
// The easiest way to use singleField is to just instantiate tag-it
|
||||
// on an INPUT element, in which case singleField is automatically
|
||||
// set to true, and singleFieldNode is set to that element. This
|
||||
// way, you don't need to fiddle with these options.
|
||||
singleField: false,
|
||||
|
||||
// This is just used when preloading data from the field, and for
|
||||
// populating the field with delimited tags as the user adds them.
|
||||
singleFieldDelimiter: ',',
|
||||
|
||||
// Set this to an input DOM node to use an existing form field.
|
||||
// Any text in it will be erased on init. But it will be
|
||||
// populated with the text of tags as they are created,
|
||||
// delimited by singleFieldDelimiter.
|
||||
//
|
||||
// If this is not set, we create an input node for it,
|
||||
// with the name given in settings.fieldName.
|
||||
singleFieldNode: null,
|
||||
|
||||
// Whether to animate tag removals or not.
|
||||
animate: true,
|
||||
|
||||
// Optionally set a tabindex attribute on the input that gets
|
||||
// created for tag-it.
|
||||
tabIndex: null,
|
||||
|
||||
// Event callbacks.
|
||||
beforeTagAdded : null,
|
||||
afterTagAdded : null,
|
||||
|
||||
beforeTagRemoved : null,
|
||||
afterTagRemoved : null,
|
||||
|
||||
onTagClicked : null,
|
||||
onTagLimitExceeded : null,
|
||||
|
||||
|
||||
// DEPRECATED:
|
||||
//
|
||||
// /!\ These event callbacks are deprecated and WILL BE REMOVED at some
|
||||
// point in the future. They're here for backwards-compatibility.
|
||||
// Use the above before/after event callbacks instead.
|
||||
onTagAdded : null,
|
||||
onTagRemoved: null,
|
||||
// `autocomplete.source` is the replacement for tagSource.
|
||||
tagSource: null
|
||||
// Do not use the above deprecated options.
|
||||
},
|
||||
|
||||
_create: function() {
|
||||
// for handling static scoping inside callbacks
|
||||
var that = this;
|
||||
|
||||
// There are 2 kinds of DOM nodes this widget can be instantiated on:
|
||||
// 1. UL, OL, or some element containing either of these.
|
||||
// 2. INPUT, in which case 'singleField' is overridden to true,
|
||||
// a UL is created and the INPUT is hidden.
|
||||
if (this.element.is('input')) {
|
||||
this.tagList = $('<ul></ul>').insertAfter(this.element);
|
||||
this.options.singleField = true;
|
||||
this.options.singleFieldNode = this.element;
|
||||
this.element.addClass('tagit-hidden-field');
|
||||
} else {
|
||||
this.tagList = this.element.find('ul, ol').andSelf().last();
|
||||
}
|
||||
|
||||
this.tagInput = $('<input type="text" />').addClass('ui-widget-content');
|
||||
|
||||
if (this.options.readOnly) this.tagInput.attr('disabled', 'disabled');
|
||||
|
||||
if (this.options.tabIndex) {
|
||||
this.tagInput.attr('tabindex', this.options.tabIndex);
|
||||
}
|
||||
|
||||
if (this.options.placeholderText) {
|
||||
this.tagInput.attr('placeholder', this.options.placeholderText);
|
||||
}
|
||||
|
||||
if (!this.options.autocomplete.source) {
|
||||
this.options.autocomplete.source = function(search, showChoices) {
|
||||
var filter = search.term.toLowerCase();
|
||||
var choices = $.grep(this.options.availableTags, function(element) {
|
||||
// Only match autocomplete options that begin with the search term.
|
||||
// (Case insensitive.)
|
||||
return (element.toLowerCase().indexOf(filter) === 0);
|
||||
});
|
||||
if (!this.options.allowDuplicates) {
|
||||
choices = this._subtractArray(choices, this.assignedTags());
|
||||
}
|
||||
showChoices(choices);
|
||||
};
|
||||
}
|
||||
|
||||
if (this.options.showAutocompleteOnFocus) {
|
||||
this.tagInput.focus(function(event, ui) {
|
||||
that._showAutocomplete();
|
||||
});
|
||||
|
||||
if (typeof this.options.autocomplete.minLength === 'undefined') {
|
||||
this.options.autocomplete.minLength = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Bind autocomplete.source callback functions to this context.
|
||||
if ($.isFunction(this.options.autocomplete.source)) {
|
||||
this.options.autocomplete.source = $.proxy(this.options.autocomplete.source, this);
|
||||
}
|
||||
|
||||
// DEPRECATED.
|
||||
if ($.isFunction(this.options.tagSource)) {
|
||||
this.options.tagSource = $.proxy(this.options.tagSource, this);
|
||||
}
|
||||
|
||||
this.tagList
|
||||
.addClass('tagit')
|
||||
.addClass('ui-widget ui-widget-content ui-corner-all')
|
||||
// Create the input field.
|
||||
.append($('<li class="tagit-new"></li>').append(this.tagInput))
|
||||
.click(function(e) {
|
||||
var target = $(e.target);
|
||||
if (target.hasClass('tagit-label')) {
|
||||
var tag = target.closest('.tagit-choice');
|
||||
if (!tag.hasClass('removed')) {
|
||||
that._trigger('onTagClicked', e, {tag: tag, tagLabel: that.tagLabel(tag)});
|
||||
}
|
||||
} else {
|
||||
// Sets the focus() to the input field, if the user
|
||||
// clicks anywhere inside the UL. This is needed
|
||||
// because the input field needs to be of a small size.
|
||||
that.tagInput.focus();
|
||||
}
|
||||
});
|
||||
|
||||
// Single field support.
|
||||
var addedExistingFromSingleFieldNode = false;
|
||||
if (this.options.singleField) {
|
||||
if (this.options.singleFieldNode) {
|
||||
// Add existing tags from the input field.
|
||||
var node = $(this.options.singleFieldNode);
|
||||
var tags = node.val().split(this.options.singleFieldDelimiter);
|
||||
node.val('');
|
||||
$.each(tags, function(index, tag) {
|
||||
that.createTag(tag, null, true);
|
||||
addedExistingFromSingleFieldNode = true;
|
||||
});
|
||||
} else {
|
||||
// Create our single field input after our list.
|
||||
this.options.singleFieldNode = $('<input type="hidden" style="display:none;" value="" name="' + this.options.fieldName + '" />');
|
||||
this.tagList.after(this.options.singleFieldNode);
|
||||
}
|
||||
}
|
||||
|
||||
// Add existing tags from the list, if any.
|
||||
if (!addedExistingFromSingleFieldNode) {
|
||||
this.tagList.children('li').each(function() {
|
||||
if (!$(this).hasClass('tagit-new')) {
|
||||
that.createTag($(this).text(), $(this).attr('class'), true);
|
||||
$(this).remove();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Events.
|
||||
this.tagInput
|
||||
.keydown(function(event) {
|
||||
// Backspace is not detected within a keypress, so it must use keydown.
|
||||
if (event.which == $.ui.keyCode.BACKSPACE && that.tagInput.val() === '') {
|
||||
var tag = that._lastTag();
|
||||
if (!that.options.removeConfirmation || tag.hasClass('remove')) {
|
||||
// When backspace is pressed, the last tag is deleted.
|
||||
that.removeTag(tag);
|
||||
} else if (that.options.removeConfirmation) {
|
||||
tag.addClass('remove ui-state-highlight');
|
||||
}
|
||||
} else if (that.options.removeConfirmation) {
|
||||
that._lastTag().removeClass('remove ui-state-highlight');
|
||||
}
|
||||
|
||||
// Comma/Space/Enter are all valid delimiters for new tags,
|
||||
// except when there is an open quote or if setting allowSpaces = true.
|
||||
// Tab will also create a tag, unless the tag input is empty,
|
||||
// in which case it isn't caught.
|
||||
if (
|
||||
(event.which === $.ui.keyCode.COMMA && event.shiftKey === false) ||
|
||||
event.which === $.ui.keyCode.ENTER ||
|
||||
(
|
||||
event.which == $.ui.keyCode.TAB &&
|
||||
that.tagInput.val() !== ''
|
||||
) ||
|
||||
(
|
||||
event.which == $.ui.keyCode.SPACE &&
|
||||
that.options.allowSpaces !== true &&
|
||||
(
|
||||
$.trim(that.tagInput.val()).replace( /^s*/, '' ).charAt(0) != '"' ||
|
||||
(
|
||||
$.trim(that.tagInput.val()).charAt(0) == '"' &&
|
||||
$.trim(that.tagInput.val()).charAt($.trim(that.tagInput.val()).length - 1) == '"' &&
|
||||
$.trim(that.tagInput.val()).length - 1 !== 0
|
||||
)
|
||||
)
|
||||
)
|
||||
) {
|
||||
// Enter submits the form if there's no text in the input.
|
||||
if (!(event.which === $.ui.keyCode.ENTER && that.tagInput.val() === '')) {
|
||||
event.preventDefault();
|
||||
}
|
||||
|
||||
// Autocomplete will create its own tag from a selection and close automatically.
|
||||
if (!(that.options.autocomplete.autoFocus && that.tagInput.data('autocomplete-open'))) {
|
||||
that.tagInput.autocomplete('close');
|
||||
that.createTag(that._cleanedInput());
|
||||
}
|
||||
}
|
||||
}).blur(function(e){
|
||||
// Create a tag when the element loses focus.
|
||||
// If autocomplete is enabled and suggestion was clicked, don't add it.
|
||||
if (!that.tagInput.data('autocomplete-open')) {
|
||||
that.createTag(that._cleanedInput());
|
||||
}
|
||||
});
|
||||
|
||||
// Autocomplete.
|
||||
if (this.options.availableTags || this.options.tagSource || this.options.autocomplete.source) {
|
||||
var autocompleteOptions = {
|
||||
select: function(event, ui) {
|
||||
that.createTag(ui.item.value);
|
||||
// Preventing the tag input to be updated with the chosen value.
|
||||
return false;
|
||||
}
|
||||
};
|
||||
$.extend(autocompleteOptions, this.options.autocomplete);
|
||||
|
||||
// tagSource is deprecated, but takes precedence here since autocomplete.source is set by default,
|
||||
// while tagSource is left null by default.
|
||||
autocompleteOptions.source = this.options.tagSource || autocompleteOptions.source;
|
||||
|
||||
this.tagInput.autocomplete(autocompleteOptions).bind('autocompleteopen.tagit', function(event, ui) {
|
||||
that.tagInput.data('autocomplete-open', true);
|
||||
}).bind('autocompleteclose.tagit', function(event, ui) {
|
||||
that.tagInput.data('autocomplete-open', false);
|
||||
});
|
||||
|
||||
this.tagInput.autocomplete('widget').addClass('tagit-autocomplete');
|
||||
}
|
||||
},
|
||||
|
||||
destroy: function() {
|
||||
$.Widget.prototype.destroy.call(this);
|
||||
|
||||
this.element.unbind('.tagit');
|
||||
this.tagList.unbind('.tagit');
|
||||
|
||||
this.tagInput.removeData('autocomplete-open');
|
||||
|
||||
this.tagList.removeClass([
|
||||
'tagit',
|
||||
'ui-widget',
|
||||
'ui-widget-content',
|
||||
'ui-corner-all',
|
||||
'tagit-hidden-field'
|
||||
].join(' '));
|
||||
|
||||
if (this.element.is('input')) {
|
||||
this.element.removeClass('tagit-hidden-field');
|
||||
this.tagList.remove();
|
||||
} else {
|
||||
this.element.children('li').each(function() {
|
||||
if ($(this).hasClass('tagit-new')) {
|
||||
$(this).remove();
|
||||
} else {
|
||||
$(this).removeClass([
|
||||
'tagit-choice',
|
||||
'ui-widget-content',
|
||||
'ui-state-default',
|
||||
'ui-state-highlight',
|
||||
'ui-corner-all',
|
||||
'remove',
|
||||
'tagit-choice-editable',
|
||||
'tagit-choice-read-only'
|
||||
].join(' '));
|
||||
|
||||
$(this).text($(this).children('.tagit-label').text());
|
||||
}
|
||||
});
|
||||
|
||||
if (this.singleFieldNode) {
|
||||
this.singleFieldNode.remove();
|
||||
}
|
||||
}
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
_cleanedInput: function() {
|
||||
// Returns the contents of the tag input, cleaned and ready to be passed to createTag
|
||||
return $.trim(this.tagInput.val().replace(/^"(.*)"$/, '$1'));
|
||||
},
|
||||
|
||||
_lastTag: function() {
|
||||
return this.tagList.find('.tagit-choice:last:not(.removed)');
|
||||
},
|
||||
|
||||
_tags: function() {
|
||||
return this.tagList.find('.tagit-choice:not(.removed)');
|
||||
},
|
||||
|
||||
assignedTags: function() {
|
||||
// Returns an array of tag string values
|
||||
var that = this;
|
||||
var tags = [];
|
||||
if (this.options.singleField) {
|
||||
tags = $(this.options.singleFieldNode).val().split(this.options.singleFieldDelimiter);
|
||||
if (tags[0] === '') {
|
||||
tags = [];
|
||||
}
|
||||
} else {
|
||||
this._tags().each(function() {
|
||||
tags.push(that.tagLabel(this));
|
||||
});
|
||||
}
|
||||
return tags;
|
||||
},
|
||||
|
||||
_updateSingleTagsField: function(tags) {
|
||||
// Takes a list of tag string values, updates this.options.singleFieldNode.val to the tags delimited by this.options.singleFieldDelimiter
|
||||
$(this.options.singleFieldNode).val(tags.join(this.options.singleFieldDelimiter)).trigger('change');
|
||||
},
|
||||
|
||||
_subtractArray: function(a1, a2) {
|
||||
var result = [];
|
||||
for (var i = 0; i < a1.length; i++) {
|
||||
if ($.inArray(a1[i], a2) == -1) {
|
||||
result.push(a1[i]);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
},
|
||||
|
||||
tagLabel: function(tag) {
|
||||
// Returns the tag's string label.
|
||||
if (this.options.singleField) {
|
||||
return $(tag).find('.tagit-label:first').text();
|
||||
} else {
|
||||
return $(tag).find('input:first').val();
|
||||
}
|
||||
},
|
||||
|
||||
_showAutocomplete: function() {
|
||||
this.tagInput.autocomplete('search', '');
|
||||
},
|
||||
|
||||
_findTagByLabel: function(name) {
|
||||
var that = this;
|
||||
var tag = null;
|
||||
this._tags().each(function(i) {
|
||||
if (that._formatStr(name) == that._formatStr(that.tagLabel(this))) {
|
||||
tag = $(this);
|
||||
return false;
|
||||
}
|
||||
});
|
||||
return tag;
|
||||
},
|
||||
|
||||
_isNew: function(name) {
|
||||
return !this._findTagByLabel(name);
|
||||
},
|
||||
|
||||
_formatStr: function(str) {
|
||||
if (this.options.caseSensitive) {
|
||||
return str;
|
||||
}
|
||||
return $.trim(str.toLowerCase());
|
||||
},
|
||||
|
||||
_effectExists: function(name) {
|
||||
return Boolean($.effects && ($.effects[name] || ($.effects.effect && $.effects.effect[name])));
|
||||
},
|
||||
|
||||
createTag: function(value, additionalClass, duringInitialization) {
|
||||
var that = this;
|
||||
|
||||
value = $.trim(value);
|
||||
|
||||
if(this.options.preprocessTag) {
|
||||
value = this.options.preprocessTag(value);
|
||||
}
|
||||
|
||||
if (value === '') {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!this.options.allowDuplicates && !this._isNew(value)) {
|
||||
var existingTag = this._findTagByLabel(value);
|
||||
if (this._trigger('onTagExists', null, {
|
||||
existingTag: existingTag,
|
||||
duringInitialization: duringInitialization
|
||||
}) !== false) {
|
||||
if (this._effectExists('highlight')) {
|
||||
existingTag.effect('highlight');
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
if (this.options.tagLimit && this._tags().length >= this.options.tagLimit) {
|
||||
this._trigger('onTagLimitExceeded', null, {duringInitialization: duringInitialization});
|
||||
return false;
|
||||
}
|
||||
|
||||
var label = $(this.options.onTagClicked ? '<a class="tagit-label"></a>' : '<span class="tagit-label"></span>').text(value);
|
||||
|
||||
// Create tag.
|
||||
var tag = $('<li></li>')
|
||||
.addClass('tagit-choice ui-widget-content ui-state-default ui-corner-all')
|
||||
.addClass(additionalClass)
|
||||
.append(label);
|
||||
|
||||
if (this.options.readOnly){
|
||||
tag.addClass('tagit-choice-read-only');
|
||||
} else {
|
||||
tag.addClass('tagit-choice-editable');
|
||||
// Button for removing the tag.
|
||||
var removeTagIcon = $('<span></span>')
|
||||
.addClass('ui-icon ui-icon-close');
|
||||
var removeTag = $('<a><span class="text-icon">\xd7</span></a>') // \xd7 is an X
|
||||
.addClass('tagit-close')
|
||||
.append(removeTagIcon)
|
||||
.click(function(e) {
|
||||
// Removes a tag when the little 'x' is clicked.
|
||||
that.removeTag(tag);
|
||||
});
|
||||
tag.append(removeTag);
|
||||
}
|
||||
|
||||
// Unless options.singleField is set, each tag has a hidden input field inline.
|
||||
if (!this.options.singleField) {
|
||||
var escapedValue = label.html();
|
||||
tag.append('<input type="hidden" value="' + escapedValue + '" name="' + this.options.fieldName + '" class="tagit-hidden-field" />');
|
||||
}
|
||||
|
||||
if (this._trigger('beforeTagAdded', null, {
|
||||
tag: tag,
|
||||
tagLabel: this.tagLabel(tag),
|
||||
duringInitialization: duringInitialization
|
||||
}) === false) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.options.singleField) {
|
||||
var tags = this.assignedTags();
|
||||
tags.push(value);
|
||||
this._updateSingleTagsField(tags);
|
||||
}
|
||||
|
||||
// DEPRECATED.
|
||||
this._trigger('onTagAdded', null, tag);
|
||||
|
||||
this.tagInput.val('');
|
||||
|
||||
// Insert tag.
|
||||
this.tagInput.parent().before(tag);
|
||||
|
||||
this._trigger('afterTagAdded', null, {
|
||||
tag: tag,
|
||||
tagLabel: this.tagLabel(tag),
|
||||
duringInitialization: duringInitialization
|
||||
});
|
||||
|
||||
if (this.options.showAutocompleteOnFocus && !duringInitialization) {
|
||||
setTimeout(function () { that._showAutocomplete(); }, 0);
|
||||
}
|
||||
},
|
||||
|
||||
removeTag: function(tag, animate) {
|
||||
animate = typeof animate === 'undefined' ? this.options.animate : animate;
|
||||
|
||||
tag = $(tag);
|
||||
|
||||
// DEPRECATED.
|
||||
this._trigger('onTagRemoved', null, tag);
|
||||
|
||||
if (this._trigger('beforeTagRemoved', null, {tag: tag, tagLabel: this.tagLabel(tag)}) === false) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.options.singleField) {
|
||||
var tags = this.assignedTags();
|
||||
var removedTagLabel = this.tagLabel(tag);
|
||||
tags = $.grep(tags, function(el){
|
||||
return el != removedTagLabel;
|
||||
});
|
||||
this._updateSingleTagsField(tags);
|
||||
}
|
||||
|
||||
if (animate) {
|
||||
tag.addClass('removed'); // Excludes this tag from _tags.
|
||||
var hide_args = this._effectExists('blind') ? ['blind', {direction: 'horizontal'}, 'fast'] : ['fast'];
|
||||
|
||||
var thisTag = this;
|
||||
hide_args.push(function() {
|
||||
tag.remove();
|
||||
thisTag._trigger('afterTagRemoved', null, {tag: tag, tagLabel: thisTag.tagLabel(tag)});
|
||||
});
|
||||
|
||||
tag.fadeOut('fast').hide.apply(tag, hide_args).dequeue();
|
||||
} else {
|
||||
tag.remove();
|
||||
this._trigger('afterTagRemoved', null, {tag: tag, tagLabel: this.tagLabel(tag)});
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
removeTagByLabel: function(tagLabel, animate) {
|
||||
var toRemove = this._findTagByLabel(tagLabel);
|
||||
if (!toRemove) {
|
||||
throw "No such tag exists with the name '" + tagLabel + "'";
|
||||
}
|
||||
this.removeTag(toRemove, animate);
|
||||
},
|
||||
|
||||
removeAll: function() {
|
||||
// Removes all tags.
|
||||
var that = this;
|
||||
this._tags().each(function(index, tag) {
|
||||
that.removeTag(tag, false);
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
})(jQuery);
|
||||
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
(function(b){b.widget("ui.tagit",{options:{allowDuplicates:!1,caseSensitive:!0,fieldName:"tags",placeholderText:null,readOnly:!1,removeConfirmation:!1,tagLimit:null,availableTags:[],autocomplete:{},showAutocompleteOnFocus:!1,allowSpaces:!1,singleField:!1,singleFieldDelimiter:",",singleFieldNode:null,animate:!0,tabIndex:null,beforeTagAdded:null,afterTagAdded:null,beforeTagRemoved:null,afterTagRemoved:null,onTagClicked:null,onTagLimitExceeded:null,onTagAdded:null,onTagRemoved:null,tagSource:null},_create:function(){var a=
|
||||
this;this.element.is("input")?(this.tagList=b("<ul></ul>").insertAfter(this.element),this.options.singleField=!0,this.options.singleFieldNode=this.element,this.element.addClass("tagit-hidden-field")):this.tagList=this.element.find("ul, ol").andSelf().last();this.tagInput=b('<input type="text" />').addClass("ui-widget-content");this.options.readOnly&&this.tagInput.attr("disabled","disabled");this.options.tabIndex&&this.tagInput.attr("tabindex",this.options.tabIndex);this.options.placeholderText&&this.tagInput.attr("placeholder",
|
||||
this.options.placeholderText);this.options.autocomplete.source||(this.options.autocomplete.source=function(a,e){var d=a.term.toLowerCase(),c=b.grep(this.options.availableTags,function(a){return 0===a.toLowerCase().indexOf(d)});this.options.allowDuplicates||(c=this._subtractArray(c,this.assignedTags()));e(c)});this.options.showAutocompleteOnFocus&&(this.tagInput.focus(function(b,d){a._showAutocomplete()}),"undefined"===typeof this.options.autocomplete.minLength&&(this.options.autocomplete.minLength=
|
||||
0));b.isFunction(this.options.autocomplete.source)&&(this.options.autocomplete.source=b.proxy(this.options.autocomplete.source,this));b.isFunction(this.options.tagSource)&&(this.options.tagSource=b.proxy(this.options.tagSource,this));this.tagList.addClass("tagit").addClass("ui-widget ui-widget-content ui-corner-all").append(b('<li class="tagit-new"></li>').append(this.tagInput)).click(function(d){var c=b(d.target);c.hasClass("tagit-label")?(c=c.closest(".tagit-choice"),c.hasClass("removed")||a._trigger("onTagClicked",
|
||||
d,{tag:c,tagLabel:a.tagLabel(c)})):a.tagInput.focus()});var c=!1;if(this.options.singleField)if(this.options.singleFieldNode){var d=b(this.options.singleFieldNode),f=d.val().split(this.options.singleFieldDelimiter);d.val("");b.each(f,function(b,d){a.createTag(d,null,!0);c=!0})}else this.options.singleFieldNode=b('<input type="hidden" style="display:none;" value="" name="'+this.options.fieldName+'" />'),this.tagList.after(this.options.singleFieldNode);c||this.tagList.children("li").each(function(){b(this).hasClass("tagit-new")||
|
||||
(a.createTag(b(this).text(),b(this).attr("class"),!0),b(this).remove())});this.tagInput.keydown(function(c){if(c.which==b.ui.keyCode.BACKSPACE&&""===a.tagInput.val()){var d=a._lastTag();!a.options.removeConfirmation||d.hasClass("remove")?a.removeTag(d):a.options.removeConfirmation&&d.addClass("remove ui-state-highlight")}else a.options.removeConfirmation&&a._lastTag().removeClass("remove ui-state-highlight");if(c.which===b.ui.keyCode.COMMA&&!1===c.shiftKey||c.which===b.ui.keyCode.ENTER||c.which==
|
||||
b.ui.keyCode.TAB&&""!==a.tagInput.val()||c.which==b.ui.keyCode.SPACE&&!0!==a.options.allowSpaces&&('"'!=b.trim(a.tagInput.val()).replace(/^s*/,"").charAt(0)||'"'==b.trim(a.tagInput.val()).charAt(0)&&'"'==b.trim(a.tagInput.val()).charAt(b.trim(a.tagInput.val()).length-1)&&0!==b.trim(a.tagInput.val()).length-1))c.which===b.ui.keyCode.ENTER&&""===a.tagInput.val()||c.preventDefault(),a.options.autocomplete.autoFocus&&a.tagInput.data("autocomplete-open")||(a.tagInput.autocomplete("close"),a.createTag(a._cleanedInput()))}).blur(function(b){a.tagInput.data("autocomplete-open")||
|
||||
a.createTag(a._cleanedInput())});if(this.options.availableTags||this.options.tagSource||this.options.autocomplete.source)d={select:function(b,c){a.createTag(c.item.value);return!1}},b.extend(d,this.options.autocomplete),d.source=this.options.tagSource||d.source,this.tagInput.autocomplete(d).bind("autocompleteopen.tagit",function(b,c){a.tagInput.data("autocomplete-open",!0)}).bind("autocompleteclose.tagit",function(b,c){a.tagInput.data("autocomplete-open",!1)}),this.tagInput.autocomplete("widget").addClass("tagit-autocomplete")},
|
||||
destroy:function(){b.Widget.prototype.destroy.call(this);this.element.unbind(".tagit");this.tagList.unbind(".tagit");this.tagInput.removeData("autocomplete-open");this.tagList.removeClass("tagit ui-widget ui-widget-content ui-corner-all tagit-hidden-field");this.element.is("input")?(this.element.removeClass("tagit-hidden-field"),this.tagList.remove()):(this.element.children("li").each(function(){b(this).hasClass("tagit-new")?b(this).remove():(b(this).removeClass("tagit-choice ui-widget-content ui-state-default ui-state-highlight ui-corner-all remove tagit-choice-editable tagit-choice-read-only"),
|
||||
b(this).text(b(this).children(".tagit-label").text()))}),this.singleFieldNode&&this.singleFieldNode.remove());return this},_cleanedInput:function(){return b.trim(this.tagInput.val().replace(/^"(.*)"$/,"$1"))},_lastTag:function(){return this.tagList.find(".tagit-choice:last:not(.removed)")},_tags:function(){return this.tagList.find(".tagit-choice:not(.removed)")},assignedTags:function(){var a=this,c=[];this.options.singleField?(c=b(this.options.singleFieldNode).val().split(this.options.singleFieldDelimiter),
|
||||
""===c[0]&&(c=[])):this._tags().each(function(){c.push(a.tagLabel(this))});return c},_updateSingleTagsField:function(a){b(this.options.singleFieldNode).val(a.join(this.options.singleFieldDelimiter)).trigger("change")},_subtractArray:function(a,c){for(var d=[],f=0;f<a.length;f++)-1==b.inArray(a[f],c)&&d.push(a[f]);return d},tagLabel:function(a){return this.options.singleField?b(a).find(".tagit-label:first").text():b(a).find("input:first").val()},_showAutocomplete:function(){this.tagInput.autocomplete("search",
|
||||
"")},_findTagByLabel:function(a){var c=this,d=null;this._tags().each(function(f){if(c._formatStr(a)==c._formatStr(c.tagLabel(this)))return d=b(this),!1});return d},_isNew:function(a){return!this._findTagByLabel(a)},_formatStr:function(a){return this.options.caseSensitive?a:b.trim(a.toLowerCase())},_effectExists:function(a){return Boolean(b.effects&&(b.effects[a]||b.effects.effect&&b.effects.effect[a]))},createTag:function(a,c,d){var f=this;a=b.trim(a);this.options.preprocessTag&&(a=this.options.preprocessTag(a));
|
||||
if(""===a)return!1;if(!this.options.allowDuplicates&&!this._isNew(a))return a=this._findTagByLabel(a),!1!==this._trigger("onTagExists",null,{existingTag:a,duringInitialization:d})&&this._effectExists("highlight")&&a.effect("highlight"),!1;if(this.options.tagLimit&&this._tags().length>=this.options.tagLimit)return this._trigger("onTagLimitExceeded",null,{duringInitialization:d}),!1;var g=b(this.options.onTagClicked?'<a class="tagit-label"></a>':'<span class="tagit-label"></span>').text(a),e=b("<li></li>").addClass("tagit-choice ui-widget-content ui-state-default ui-corner-all").addClass(c).append(g);
|
||||
this.options.readOnly?e.addClass("tagit-choice-read-only"):(e.addClass("tagit-choice-editable"),c=b("<span></span>").addClass("ui-icon ui-icon-close"),c=b('<a><span class="text-icon">\u00d7</span></a>').addClass("tagit-close").append(c).click(function(a){f.removeTag(e)}),e.append(c));this.options.singleField||(g=g.html(),e.append('<input type="hidden" value="'+g+'" name="'+this.options.fieldName+'" class="tagit-hidden-field" />'));!1!==this._trigger("beforeTagAdded",null,{tag:e,tagLabel:this.tagLabel(e),
|
||||
duringInitialization:d})&&(this.options.singleField&&(g=this.assignedTags(),g.push(a),this._updateSingleTagsField(g)),this._trigger("onTagAdded",null,e),this.tagInput.val(""),this.tagInput.parent().before(e),this._trigger("afterTagAdded",null,{tag:e,tagLabel:this.tagLabel(e),duringInitialization:d}),this.options.showAutocompleteOnFocus&&!d&&setTimeout(function(){f._showAutocomplete()},0))},removeTag:function(a,c){c="undefined"===typeof c?this.options.animate:c;a=b(a);this._trigger("onTagRemoved",
|
||||
null,a);if(!1!==this._trigger("beforeTagRemoved",null,{tag:a,tagLabel:this.tagLabel(a)})){if(this.options.singleField){var d=this.assignedTags(),f=this.tagLabel(a),d=b.grep(d,function(a){return a!=f});this._updateSingleTagsField(d)}if(c){a.addClass("removed");var d=this._effectExists("blind")?["blind",{direction:"horizontal"},"fast"]:["fast"],g=this;d.push(function(){a.remove();g._trigger("afterTagRemoved",null,{tag:a,tagLabel:g.tagLabel(a)})});a.fadeOut("fast").hide.apply(a,d).dequeue()}else a.remove(),
|
||||
this._trigger("afterTagRemoved",null,{tag:a,tagLabel:this.tagLabel(a)})}},removeTagByLabel:function(a,b){var d=this._findTagByLabel(a);if(!d)throw"No such tag exists with the name '"+a+"'";this.removeTag(d,b)},removeAll:function(){var a=this;this._tags().each(function(b,d){a.removeTag(d,!1)})}})})(jQuery);
|
||||
@@ -0,0 +1,498 @@
|
||||
.clearfix:before,
|
||||
.clearfix:after,
|
||||
.container:before,ro
|
||||
.container:after,
|
||||
.row:before,
|
||||
.row:after {
|
||||
content: '.';
|
||||
display: block;
|
||||
overflow: hidden;
|
||||
visibility: hidden;
|
||||
font-size: 0;
|
||||
line-height: 0;
|
||||
width: 0;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
.clearfix:after,
|
||||
.container:after,
|
||||
.row:after {
|
||||
clear: both;
|
||||
}
|
||||
|
||||
.clearfix,
|
||||
.container,
|
||||
.row {
|
||||
zoom: 1;
|
||||
}
|
||||
|
||||
.container {
|
||||
width: 970px;
|
||||
padding-left: 0px;
|
||||
padding-right: 0px;
|
||||
}
|
||||
|
||||
.container-gap {
|
||||
margin-left: 15px;
|
||||
margin-right: 15px;
|
||||
}
|
||||
|
||||
.es-row-wrap .row {
|
||||
margin-left: 0;
|
||||
margin-right: 0;
|
||||
padding-left: 25px;
|
||||
padding-right: 25px;
|
||||
}
|
||||
|
||||
.row-6 {
|
||||
}
|
||||
|
||||
.row-6 .col-md-6 {
|
||||
width: 52%;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.row-8 .col-md-8 {
|
||||
width: 68%;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.es-row-wrap .col-md-12 {
|
||||
width: auto;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.row-12 .col-md-12 {
|
||||
width: auto;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.row-3-9 .col-md-3 {
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
width: 23%;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.row-3-9 .col-md-9 {
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
width: 74%;
|
||||
float: right;
|
||||
}
|
||||
|
||||
.row-9-3 .col-md-9 {
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
width: 74%;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.row-9-3 .col-md-3 {
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
width: 23%;
|
||||
float: right;
|
||||
}
|
||||
|
||||
.row-8-4 .col-md-8 {
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
width: 66%;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.row-8-4 .col-md-4 {
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
width: 32%;
|
||||
float: right;
|
||||
}
|
||||
|
||||
.row-5-7 .col-sm-5 {
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
width: 40%;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.row-5-7 .col-sm-5 .img-responsive {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.row-5-7 .col-sm-7 {
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
width: 58%;
|
||||
float: right;
|
||||
}
|
||||
|
||||
.es-row-wrap .page-header {
|
||||
margin-top: 10px;
|
||||
zoom:1;
|
||||
font-size: 20px;
|
||||
}
|
||||
|
||||
.es-row-wrap .page-header h1 {
|
||||
font-size: 25px;
|
||||
}
|
||||
|
||||
/*
|
||||
.col-sm-1, .col-md-1, .col-lg-1,
|
||||
.col-sm-2, .col-md-2, .col-lg-2,
|
||||
.col-sm-3, .col-md-3, .col-lg-3,
|
||||
.col-sm-4, .col-md-4, .col-lg-4,
|
||||
.col-sm-5, .col-md-5, .col-lg-5,
|
||||
.col-sm-6, .col-md-6, .col-lg-6,
|
||||
.col-sm-7, .col-md-7, .col-lg-7,
|
||||
.col-sm-8, .col-md-8, .col-lg-8,
|
||||
.col-sm-9, .col-md-9, .col-lg-9,
|
||||
.col-sm-10, .col-md-10, .col-lg-10,
|
||||
.col-sm-11, .col-md-11, .col-lg-11 {
|
||||
float: left;
|
||||
}
|
||||
|
||||
.col-sm-1, .col-md-1, .col-lg-1 {
|
||||
width: 8.333333333333332%;
|
||||
}
|
||||
|
||||
.col-sm-2, .col-md-2, .col-lg-2 {
|
||||
width: 16.666666666666664%;
|
||||
}
|
||||
|
||||
.col-sm-3, .col-md-3, .col-lg-3 {
|
||||
width: 25%;
|
||||
}
|
||||
|
||||
.col-sm-4, .col-md-4, .col-lg-4 {
|
||||
width: 33.33333333333333%;
|
||||
}
|
||||
|
||||
.col-sm-5, .col-md-5, .col-lg-5 {
|
||||
width: 41.66666666666667%;
|
||||
}
|
||||
|
||||
.col-sm-6, .col-md-6, .col-lg-6 {
|
||||
width: 50%;
|
||||
}
|
||||
|
||||
.col-sm-7, .col-md-7, .col-lg-7 {
|
||||
width: 58.333333333333336%;
|
||||
}
|
||||
|
||||
.col-sm-8, .col-md-8, .col-lg-8 {
|
||||
width: 66.66666666666666%;
|
||||
}
|
||||
|
||||
.col-sm-9, .col-md-9, .col-lg-9 {
|
||||
width: 75%;
|
||||
}
|
||||
|
||||
.col-sm-10, .col-md-10, .col-lg-10 {
|
||||
width: 83.33333333333334%;
|
||||
}
|
||||
|
||||
.col-sm-11, .col-md-11, .col-lg-11 {
|
||||
width: 91.66666666666666%;
|
||||
}
|
||||
|
||||
.col-sm-12, .col-md-12, .col-lg-12 {
|
||||
width: 100%;
|
||||
}*/
|
||||
|
||||
.nav {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
.nav li {
|
||||
position: relative;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.nav li a {
|
||||
position: relative;
|
||||
display: block;
|
||||
padding: 10px 15px;
|
||||
}
|
||||
|
||||
.nav li a:hover,
|
||||
.nav li a:focus {
|
||||
text-decoration: none;
|
||||
background-color: #eeeeee;
|
||||
}
|
||||
|
||||
.nav li.disabled a {
|
||||
color: #999999;
|
||||
}
|
||||
|
||||
.nav li.disabled a:hover,
|
||||
.nav li.disabled a:focus {
|
||||
color: #999999;
|
||||
text-decoration: none;
|
||||
cursor: not-allowed;
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
.nav .nav-divider {
|
||||
height: 1px;
|
||||
margin: 9px 0;
|
||||
overflow: hidden;
|
||||
background-color: #e5e5e5;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
.nav-tabs {
|
||||
}
|
||||
|
||||
.nav-tabs li {
|
||||
float: left;
|
||||
margin-bottom: -1px;
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
.nav-tabs li a {
|
||||
margin-right: 2px;
|
||||
line-height: 1.428571429;
|
||||
}
|
||||
|
||||
.nav-tabs li a:hover {
|
||||
border-color: #eeeeee #eeeeee #dddddd;
|
||||
}
|
||||
|
||||
.nav-tabs li.active {
|
||||
/*background: #fff;*/
|
||||
|
||||
}
|
||||
|
||||
.nav-tabs li.active a,
|
||||
.nav-tabs li.active a:hover,
|
||||
.nav-tabs li.active a:focus {
|
||||
color: #555555;
|
||||
cursor: default;
|
||||
background-color: #ffffff;
|
||||
border: 1px solid #dddddd;
|
||||
border-bottom-color: #fff;
|
||||
}
|
||||
|
||||
.nav-mini li a {
|
||||
padding: 1px 10px;
|
||||
}
|
||||
|
||||
.nav-pills li {
|
||||
float: left;
|
||||
}
|
||||
|
||||
.nav-pills li.active a,
|
||||
.nav-pills li.active a:hover,
|
||||
.nav-pills li.active a:focus {
|
||||
color: #ffffff;
|
||||
background-color: #428bca;
|
||||
}
|
||||
|
||||
.nav-stacked li {
|
||||
float: none;
|
||||
display: inline;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
|
||||
.navbar-brand {
|
||||
float: left;
|
||||
}
|
||||
|
||||
.navbar-toggle {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.navbar-collapse {
|
||||
float: left;
|
||||
display: block;
|
||||
border-top: 0;
|
||||
}
|
||||
|
||||
.navbar-right {
|
||||
float: right;
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.navbar-nav li {
|
||||
float: left;
|
||||
}
|
||||
|
||||
.navbar-nav li a {
|
||||
padding-top: 10px;
|
||||
padding-bottom: 10px;
|
||||
line-height: 20px;
|
||||
}
|
||||
|
||||
.navbar-inverse .navbar-nav li a {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.navbar-inverse .navbar-nav li a:hover,
|
||||
.navbar-inverse .navbar-nav li a:focus {
|
||||
background-color: #3a485d;
|
||||
}
|
||||
|
||||
|
||||
.tab-content .tab-pane {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.tab-content div.active {
|
||||
display: block;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* pagination
|
||||
*/
|
||||
.pagination {
|
||||
display: inline-block;
|
||||
padding-left: 0;
|
||||
margin: 20px 0;
|
||||
}
|
||||
|
||||
.pagination li {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
.pagination li a,
|
||||
.pagination li span {
|
||||
position: relative;
|
||||
float: left;
|
||||
padding: 6px 12px;
|
||||
margin-left: -1px;
|
||||
line-height: 1.428571429;
|
||||
text-decoration: none;
|
||||
background-color: #ffffff;
|
||||
border: 1px solid #dddddd;
|
||||
}
|
||||
|
||||
.pagination > li.first a,
|
||||
.pagination > li.first > span {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
.pagination li a:hover,
|
||||
.pagination li span:hover,
|
||||
.pagination li a:focus,
|
||||
.pagination li span:focus {
|
||||
background-color: #eeeeee;
|
||||
}
|
||||
|
||||
.pagination .active a,
|
||||
.pagination .active span,
|
||||
.pagination .active a:hover,
|
||||
.pagination .active span:hover,
|
||||
.pagination .active a:focus,
|
||||
.pagination .active span:focus {
|
||||
z-index: 2;
|
||||
color: #ffffff;
|
||||
cursor: default;
|
||||
background-color: #428bca;
|
||||
border-color: #428bca;
|
||||
}
|
||||
|
||||
.pagination .disabled span,
|
||||
.pagination .disabled span:hover,
|
||||
.pagination .disabled span:focus,
|
||||
.pagination .disabled a,
|
||||
.pagination .disabled a:hover,
|
||||
.pagination .disabled a:focus {
|
||||
color: #999999;
|
||||
cursor: default;
|
||||
background-color: #ffffff;
|
||||
border-color: #dddddd;
|
||||
}
|
||||
|
||||
.breadcrumb {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
.breadcrumb li {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
.breadcrumb .active {
|
||||
color: #999999;
|
||||
background: #f5f5f5;
|
||||
}
|
||||
|
||||
.popover .arrow {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.tooltip-arrow {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.panel-default .panel-heading {
|
||||
color: #333333;
|
||||
background-color: #f5f5f5;
|
||||
border-color: #dddddd;
|
||||
}
|
||||
|
||||
.modal {
|
||||
position: absolute;
|
||||
opacity: 1;
|
||||
filter: none;
|
||||
}
|
||||
|
||||
.modal-dialog {
|
||||
width: 600px;
|
||||
}
|
||||
|
||||
.modal-dialog-small {
|
||||
width: 480px;
|
||||
}
|
||||
|
||||
.modal-backdrop {
|
||||
display: none;
|
||||
opacity: 1;
|
||||
filter: none;
|
||||
}
|
||||
|
||||
.modal-header {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.modal-header button.close {
|
||||
position: absolute;
|
||||
right: 16px;
|
||||
top: 16px;
|
||||
float: none;
|
||||
background: #fff;
|
||||
color: #000;
|
||||
display: inline;
|
||||
}
|
||||
|
||||
.media-list {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
.media .pull-left .media-object {
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
.media, .media-body {
|
||||
word-break: break-all;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
|
||||
.form-control {
|
||||
padding: 0;
|
||||
line-height: 28px;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.row-6 .form-control {
|
||||
width: 413px;
|
||||
}
|
||||
|
||||
.row-8 .form-control {
|
||||
width: 575px;
|
||||
}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 699 B |
Binary file not shown.
|
After Width: | Height: | Size: 715 B |
Binary file not shown.
|
After Width: | Height: | Size: 667 B |
Binary file not shown.
|
After Width: | Height: | Size: 685 B |
Binary file not shown.
|
After Width: | Height: | Size: 631 B |
Vendored
+12
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
星标打分插件
|
||||
Vendored
+6
@@ -0,0 +1,6 @@
|
||||
/*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas. Dual MIT/BSD license */
|
||||
/*! NOTE: If you're already including a window.matchMedia polyfill via Modernizr or otherwise, you don't need this part */
|
||||
window.matchMedia=window.matchMedia||function(a){"use strict";var c,d=a.documentElement,e=d.firstElementChild||d.firstChild,f=a.createElement("body"),g=a.createElement("div");return g.id="mq-test-1",g.style.cssText="position:absolute;top:-100em",f.style.background="none",f.appendChild(g),function(a){return g.innerHTML='­<style media="'+a+'"> #mq-test-1 { width: 42px; }</style>',d.insertBefore(f,e),c=42===g.offsetWidth,d.removeChild(f),{matches:c,media:a}}}(document);
|
||||
|
||||
/*! Respond.js v1.3.0: min/max-width media query polyfill. (c) Scott Jehl. MIT/GPLv2 Lic. j.mp/respondjs */
|
||||
(function(a){"use strict";function x(){u(!0)}var b={};if(a.respond=b,b.update=function(){},b.mediaQueriesSupported=a.matchMedia&&a.matchMedia("only all").matches,!b.mediaQueriesSupported){var q,r,t,c=a.document,d=c.documentElement,e=[],f=[],g=[],h={},i=30,j=c.getElementsByTagName("head")[0]||d,k=c.getElementsByTagName("base")[0],l=j.getElementsByTagName("link"),m=[],n=function(){for(var b=0;l.length>b;b++){var c=l[b],d=c.href,e=c.media,f=c.rel&&"stylesheet"===c.rel.toLowerCase();d&&f&&!h[d]&&(c.styleSheet&&c.styleSheet.rawCssText?(p(c.styleSheet.rawCssText,d,e),h[d]=!0):(!/^([a-zA-Z:]*\/\/)/.test(d)&&!k||d.replace(RegExp.$1,"").split("/")[0]===a.location.host)&&m.push({href:d,media:e}))}o()},o=function(){if(m.length){var b=m.shift();v(b.href,function(c){p(c,b.href,b.media),h[b.href]=!0,a.setTimeout(function(){o()},0)})}},p=function(a,b,c){var d=a.match(/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi),g=d&&d.length||0;b=b.substring(0,b.lastIndexOf("/"));var h=function(a){return a.replace(/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,"$1"+b+"$2$3")},i=!g&&c;b.length&&(b+="/"),i&&(g=1);for(var j=0;g>j;j++){var k,l,m,n;i?(k=c,f.push(h(a))):(k=d[j].match(/@media *([^\{]+)\{([\S\s]+?)$/)&&RegExp.$1,f.push(RegExp.$2&&h(RegExp.$2))),m=k.split(","),n=m.length;for(var o=0;n>o;o++)l=m[o],e.push({media:l.split("(")[0].match(/(only\s+)?([a-zA-Z]+)\s?/)&&RegExp.$2||"all",rules:f.length-1,hasquery:l.indexOf("(")>-1,minw:l.match(/\(\s*min\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:l.match(/\(\s*max\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}u()},s=function(){var a,b=c.createElement("div"),e=c.body,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",e||(e=f=c.createElement("body"),e.style.background="none"),e.appendChild(b),d.insertBefore(e,d.firstChild),a=b.offsetWidth,f?d.removeChild(e):e.removeChild(b),a=t=parseFloat(a)},u=function(b){var h="clientWidth",k=d[h],m="CSS1Compat"===c.compatMode&&k||c.body[h]||k,n={},o=l[l.length-1],p=(new Date).getTime();if(b&&q&&i>p-q)return a.clearTimeout(r),r=a.setTimeout(u,i),void 0;q=p;for(var v in e)if(e.hasOwnProperty(v)){var w=e[v],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?t||s():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?t||s():1)),w.hasquery&&(z&&A||!(z||m>=x)||!(A||y>=m))||(n[w.media]||(n[w.media]=[]),n[w.media].push(f[w.rules]))}for(var C in g)g.hasOwnProperty(C)&&g[C]&&g[C].parentNode===j&&j.removeChild(g[C]);for(var D in n)if(n.hasOwnProperty(D)){var E=c.createElement("style"),F=n[D].join("\n");E.type="text/css",E.media=D,j.insertBefore(E,o.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(c.createTextNode(F)),g.push(E)}},v=function(a,b){var c=w();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))},w=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}();n(),b.update=n,a.addEventListener?a.addEventListener("resize",x,!1):a.attachEvent&&a.attachEvent("onresize",x)}})(this);
|
||||
+1608
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user