first commit

This commit is contained in:
编码猿
2024-09-27 01:28:38 +08:00
commit a9bde91e8e
2653 changed files with 701970 additions and 0 deletions

View File

@@ -0,0 +1 @@
ad35604f-b0f6-4a9f-868c-5be7a1bc5456

View File

@@ -0,0 +1 @@
df33aa55-4803-471c-8433-67d71c001a1b

View File

@@ -0,0 +1 @@
429b0bea-56d6-433c-8175-f896aee23802

View File

@@ -0,0 +1 @@
2e267447-1860-4e47-888e-19827d3cd38a

View File

@@ -0,0 +1,3 @@
.about {
color: red;
}

View File

@@ -0,0 +1,38 @@
.error {
display: flex;
align-items: center;
justify-content: center;
flex-direction: row;
}
.error img {
width: 270px;
margin-bottom: 20px;
}
.error .i-message {
margin-left: 19px;
}
.error .i-message .action {
margin-top: 10px;
}
.error .i-message .action a[href="/"] {
margin-right: 15px;
}
.error .i-message ul {
padding-left: 20px;
margin-top: 8px;
}
.error .i-message h3 {
font-size: 17px;
margin-bottom: 10px;
line-height: 27px;
font-weight: 500;
letter-spacing: 2px;
}
.error .i-message a {
color: #8d8d8d;
}
body,
html,
.error {
height: 100%;
}

View File

@@ -0,0 +1,4 @@
.register {
font-size: 30px;
color: green;
}

View File

@@ -0,0 +1,3 @@
.Test {
color: red;
}

View File

@@ -0,0 +1 @@
0fc03c51-4b6b-4a6c-adc2-ade3bd9367db

View File

@@ -0,0 +1 @@
985602a4-c3a9-46b9-9aa9-754d85db7413

View File

@@ -0,0 +1 @@
e1ffcee7-d2b8-48d7-a57d-3fd4e533a98a

Binary file not shown.

After

Width:  |  Height:  |  Size: 340 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 232 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 492 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 492 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@@ -0,0 +1 @@
c2a34f1e-dabb-4ccf-a9b0-dbe3135588cb

View File

@@ -0,0 +1,32 @@
requirejs.config({
baseUrl: '/js',
waitSeconds: 0,
paths: {
app: 'app',
jquery: 'lib/jquery.min',
swiper: 'lib/swiper/swiper.min',
zui: 'lib/zui/js/zui.min',
utils: 'utils/index',
config: 'config/index'
},
map: {
'*': {
'css': 'lib/css'
}
},
shim : { // 按需加载css
'app/index': { deps: ['css!/css/home/index.css','css!/js/lib/swiper/swiper.min.css'] },
'app/about': { deps: ['css!/css/home/about.css'] },
'app/register': { deps: ['css!/css/home/register.css'] }
}
});
// 读取每个页面自定义属性data-module获取js文件名然后自动加载并调用非对应页面的js文件中的 init 方法
requirejs(["jquery"],function ($) {
var module = $('.pages').attr('data-module');
if(module != undefined){
requirejs([ `app/${ module }` ], function (module) {
module.init();
})
}
});

View File

@@ -0,0 +1 @@
4765c3ab-e96b-4baf-b932-777ed1069641

View File

@@ -0,0 +1,12 @@
define(['jquery','utils'],function ($,utils) {
function about() {
}
about.prototype = {
init () {
}
};
return new about();
});

View File

@@ -0,0 +1,30 @@
define(['jquery','swiper','utils', 'zui'],function ($,swiper,utils) {
function Index() {
}
Index.prototype = {
init () {
new $.zui.Messager('zui弹窗。', {
icon: 'heart',
placement: 'center'
}).show();
},
//初始化 swiper 轮播图
newSwiper () {
// new swiper ('.swiper-container', {
// direction: 'horizontal',
// loop: true,
// autoplay: true,
// pagination: {
// el: '.swiper-pagination',
// clickable :true,
// }
// });
},
}
return new Index();
})

View File

@@ -0,0 +1,14 @@
define(['jquery','swiper','utils'],function ($,swiper,utils) {
function Register() {
}
Register.prototype = {
init () {
console.log("用户注册")
},
};
return new Register();
});

View File

@@ -0,0 +1 @@
4d771ed8-a00e-47ab-ac69-4f32d7793174

View File

@@ -0,0 +1,10 @@
/**
* 网站前端的 config 配置文件
*/
define([], function () {
return {
// 请求基地址
baseURL: 'http://www.geekhelp.cn/bmy/api'
}
})

View File

@@ -0,0 +1 @@
5f81b52a-66ad-4d15-9454-9c9186df3db5

View File

@@ -0,0 +1,169 @@
/*
* Require-CSS RequireJS css! loader plugin
* 0.1.10
* Guy Bedford 2014
* MIT
*/
/*
*
* Usage:
* require(['css!./mycssFile']);
*
* Tested and working in (up to latest versions as of March 2013):
* Android
* iOS 6
* IE 6 - 10
* Chrome 3 - 26
* Firefox 3.5 - 19
* Opera 10 - 12
*
* browserling.com used for virtual testing environment
*
* Credit to B Cavalier & J Hann for the IE 6 - 9 method,
* refined with help from Martin Cermak
*
* Sources that helped along the way:
* - https://developer.mozilla.org/en-US/docs/Browser_detection_using_the_user_agent
* - http://www.phpied.com/when-is-a-stylesheet-really-loaded/
* - https://github.com/cujojs/curl/blob/master/src/curl/plugin/css.js
*
*/
define(function() {
//>>excludeStart('excludeRequireCss', pragmas.excludeRequireCss)
if (typeof window == 'undefined')
return { load: function(n, r, load){ load() } };
var head = document.getElementsByTagName('head')[0];
var engine = window.navigator.userAgent.match(/Trident\/([^ ;]*)|AppleWebKit\/([^ ;]*)|Opera\/([^ ;]*)|rv\:([^ ;]*)(.*?)Gecko\/([^ ;]*)|MSIE\s([^ ;]*)|AndroidWebKit\/([^ ;]*)/) || 0;
// use <style> @import load method (IE < 9, Firefox < 18)
var useImportLoad = false;
// set to false for explicit <link> load checking when onload doesn't work perfectly (webkit)
var useOnload = true;
// trident / msie
if (engine[1] || engine[7])
useImportLoad = parseInt(engine[1]) < 6 || parseInt(engine[7]) <= 9;
// webkit
else if (engine[2] || engine[8] || 'WebkitAppearance' in document.documentElement.style)
useOnload = false;
// gecko
else if (engine[4])
useImportLoad = parseInt(engine[4]) < 18;
//>>excludeEnd('excludeRequireCss')
//main api object
var cssAPI = {};
//>>excludeStart('excludeRequireCss', pragmas.excludeRequireCss)
cssAPI.pluginBuilder = './css-builder';
// <style> @import load method
var curStyle, curSheet;
var createStyle = function () {
curStyle = document.createElement('style');
head.appendChild(curStyle);
curSheet = curStyle.styleSheet || curStyle.sheet;
}
var ieCnt = 0;
var ieLoads = [];
var ieCurCallback;
var createIeLoad = function(url) {
curSheet.addImport(url);
curStyle.onload = function(){ processIeLoad() };
ieCnt++;
if (ieCnt == 31) {
createStyle();
ieCnt = 0;
}
}
var processIeLoad = function() {
ieCurCallback();
var nextLoad = ieLoads.shift();
if (!nextLoad) {
ieCurCallback = null;
return;
}
ieCurCallback = nextLoad[1];
createIeLoad(nextLoad[0]);
}
var importLoad = function(url, callback) {
if (!curSheet || !curSheet.addImport)
createStyle();
if (curSheet && curSheet.addImport) {
// old IE
if (ieCurCallback) {
ieLoads.push([url, callback]);
}
else {
createIeLoad(url);
ieCurCallback = callback;
}
}
else {
// old Firefox
curStyle.textContent = '@import "' + url + '";';
var loadInterval = setInterval(function() {
try {
curStyle.sheet.cssRules;
clearInterval(loadInterval);
callback();
} catch(e) {}
}, 10);
}
}
// <link> load method
var linkLoad = function(url, callback) {
var link = document.createElement('link');
link.type = 'text/css';
link.rel = 'stylesheet';
if (useOnload)
link.onload = function() {
link.onload = function() {};
// for style dimensions queries, a short delay can still be necessary
setTimeout(callback, 7);
}
else
var loadInterval = setInterval(function() {
for (var i = 0; i < document.styleSheets.length; i++) {
var sheet = document.styleSheets[i];
if (sheet.href == link.href) {
clearInterval(loadInterval);
return callback();
}
}
}, 10);
link.href = url;
head.appendChild(link);
}
//>>excludeEnd('excludeRequireCss')
cssAPI.normalize = function(name, normalize) {
if (name.substr(name.length - 4, 4) == '.css')
name = name.substr(0, name.length - 4);
return normalize(name);
}
//>>excludeStart('excludeRequireCss', pragmas.excludeRequireCss)
cssAPI.load = function(cssId, req, load, config) {
(useImportLoad ? importLoad : linkLoad)(req.toUrl(cssId + '.css'), load);
}
//>>excludeEnd('excludeRequireCss')
return cssAPI;
});

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
5bc44bb9-5c1f-469b-b2d2-2d2af5a5c101

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
c442cfa6-404c-49b4-b24d-0780498e1c91

View File

@@ -0,0 +1 @@
67671134-a2dc-4eb5-b622-48c26de86b7c

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1 @@
b3e1de78-68eb-42a9-a8d5-f4165c940b0f

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 290 KiB

View File

@@ -0,0 +1 @@
7086563e-9be4-4c60-8b50-cb46c5554531

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
a24d0b39-db23-4f37-aacb-d1f42a26715d

View File

@@ -0,0 +1 @@
b1ef7413-7e2c-47fe-b42c-2b320e40211c

View File

@@ -0,0 +1,117 @@
/*!
* ZUI: Ajax 响应模拟工具 - v1.9.1 - 2019-05-10
* http://zui.sexy
* GitHub: https://github.com/easysoft/zui.git
* Copyright (c) 2019 cnezsoft.com; Licensed MIT
*/
/* ========================================================================
* ZUI: AjaxFake.js
* http://zui.sexy
* ========================================================================
* Copyright (c) 2017-2018 cnezsoft.com; Licensed MIT
* ======================================================================== */
(function($) {
'use strict';
var routers = [];
var ajax = $.ajax;
var getMatchRouter = function(url) {
for(var i = (routers.length - 1); i >= 0; --i) {
var router = routers[i];
if (router.urlMatch instanceof RegExp) {
if (router.urlMatch.test(url)) {
return router;
}
} else if (typeof router.urlMatch === 'function') {
if (router.urlMatch(url)) {
return router;
}
} else if (url.indexOf(router.urlMatch) === 0) {
return router;
}
}
};
var ajaxFake = function(options) {
var url = options.url;
var router = getMatchRouter(url);
if (router) {
var onSuccess = function(data, textStatus) {
var dataType = options.dataType;
if (dataType === 'json') {
if (typeof data === 'string') {
data = $.parseJSON(data);
}
} else {
if (typeof data !== 'string') {
data = JSON.stringify(data);
}
}
if (options.success) {
options.success(data, textStatus);
}
if (options.complete) {
options.complete(null, textStatus);
}
};
var onError = function(textStatus, errorThrown) {
if (options.error) {
options.error(null, textStatus, errorThrown);
}
if (options.complete) {
options.complete(null, textStatus);
}
};
if (options.beforeSend) {
options.beforeSend(null, options);
}
var processRouter = function() {
var result = $.isFunction(router.route) ? router.route(options, onSuccess, onError) : router.route;
if (result !== true) {
if (result === false) {
onError();
} else {
onSuccess(result);
}
}
console.groupCollapsed('FakeAjax: ' + url + ' %c' + (result === false ? 'Error' : 'Success'), (result === false) ? 'color: red' : 'color: green');
console.log('response', result);
console.log('ajax options', options);
console.groupEnd();
return result;
}
if (router.delay) {
setTimeout(processRouter, router.delay);
} else {
processRouter();
}
return router;
}
return ajax.apply(null, arguments);
};
var fakeServer = function(urlMatch, route, options) {
if (!$.ajax_origin) {
$.ajax_origin = ajax;
$.ajax = ajaxFake;
}
var router = {};
if ($.isPlainObject(urlMatch)) {
$.extend(router, urlMatch);
} else {
router.urlMatch = urlMatch;
router.route = route;
if ($.isPlainObject(options)) {
$.extend(router, options);
}
}
routers.push(router);
};
$.fakeServer = fakeServer;
}(jQuery));

View File

@@ -0,0 +1,7 @@
/*!
* ZUI: Ajax 响应模拟工具 - v1.9.1 - 2019-05-10
* http://zui.sexy
* GitHub: https://github.com/easysoft/zui.git
* Copyright (c) 2019 cnezsoft.com; Licensed MIT
*/
!function(e){"use strict";var r=[],n=e.ajax,o=function(e){for(var n=r.length-1;n>=0;--n){var o=r[n];if(o.urlMatch instanceof RegExp){if(o.urlMatch.test(e))return o}else if("function"==typeof o.urlMatch){if(o.urlMatch(e))return o}else if(0===e.indexOf(o.urlMatch))return o}},t=function(r){var t=r.url,u=o(t);if(u){var l=function(n,o){var t=r.dataType;"json"===t?"string"==typeof n&&(n=e.parseJSON(n)):"string"!=typeof n&&(n=JSON.stringify(n)),r.success&&r.success(n,o),r.complete&&r.complete(null,o)},a=function(e,n){r.error&&r.error(null,e,n),r.complete&&r.complete(null,e)};r.beforeSend&&r.beforeSend(null,r);var c=function(){var n=e.isFunction(u.route)?u.route(r,l,a):u.route;return n!==!0&&(n===!1?a():l(n)),console.groupCollapsed("FakeAjax: "+t+" %c"+(n===!1?"Error":"Success"),n===!1?"color: red":"color: green"),console.log("response",n),console.log("ajax options",r),console.groupEnd(),n};return u.delay?setTimeout(c,u.delay):c(),u}return n.apply(null,arguments)},u=function(o,u,l){e.ajax_origin||(e.ajax_origin=n,e.ajax=t);var a={};e.isPlainObject(o)?e.extend(a,o):(a.urlMatch=o,a.route=u,e.isPlainObject(l)&&e.extend(a,l)),r.push(a)};e.fakeServer=u}(jQuery);

View File

@@ -0,0 +1 @@
56148a60-ef8e-4e84-b2aa-bf4431cc43fa

View File

@@ -0,0 +1,243 @@
/*!
* ZUI: 数组辅助方法 - v1.9.1 - 2019-05-10
* http://zui.sexy
* GitHub: https://github.com/easysoft/zui.git
* Copyright (c) 2019 cnezsoft.com; Licensed MIT
*/
/* ========================================================================
* ZUI: array.js
* Array Polyfill.
* http://zui.sexy
* ========================================================================
* Copyright (c) 2014-2016 cnezsoft.com; Licensed MIT
* ======================================================================== */
// Some polyfills copy from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array
(function() {
'use strict';
var STR_FUNCTION = 'function';
/**
* Calls a function for each element in the array.
*/
if(!Array.prototype.forEach) {
Array.prototype.forEach = function(fun /*, thisp*/ ) {
var len = this.length;
if(typeof fun != STR_FUNCTION)
throw new TypeError();
var thisp = arguments[1];
for(var i = 0; i < len; i++) {
if(i in this) {
fun.call(thisp, this[i], i, this);
}
}
};
}
/**
* Judge an object is an real array
*/
if(!Array.isArray) {
Array.isArray = function(obj) {
return Object.toString.call(obj) === '[object Array]';
};
}
/**
* Returns the last (greatest) index of an element within the array equal to the specified value, or -1 if none is found.
*/
if(!Array.prototype.lastIndexOf) {
Array.prototype.lastIndexOf = function(elt /*, from*/ ) {
var len = this.length;
var from = Number(arguments[1]);
if(isNaN(from)) {
from = len - 1;
} else {
from = (from < 0) ? Math.ceil(from) : Math.floor(from);
if(from < 0)
from += len;
else if(from >= len)
from = len - 1;
}
for(; from > -1; from--) {
if(from in this &&
this[from] === elt)
return from;
}
return -1;
};
}
/**
* Returns true if every element in this array satisfies the provided testing function.
*/
if(!Array.prototype.every) {
Array.prototype.every = function(fun /*, thisp*/ ) {
var len = this.length;
if(typeof fun != STR_FUNCTION)
throw new TypeError();
var thisp = arguments[1];
for(var i = 0; i < len; i++) {
if(i in this &&
!fun.call(thisp, this[i], i, this))
return false;
}
return true;
};
}
/**
* Creates a new array with all of the elements of this array for which the provided filtering function returns true.
*/
if(!Array.prototype.filter) {
Array.prototype.filter = function(fun /*, thisp*/ ) {
var len = this.length;
if(typeof fun != STR_FUNCTION)
throw new TypeError();
var res = [];
var thisp = arguments[1];
for(var i = 0; i < len; i++) {
if(i in this) {
var val = this[i]; // in case fun mutates this
if(fun.call(thisp, val, i, this))
res.push(val);
}
}
return res;
};
}
/**
* Returns the first (least) index of an element within the array equal to the specified value, or -1 if none is found.
*/
if(!Array.prototype.indexOf) {
Array.prototype.indexOf = function(elt /*, from*/ ) {
var len = this.length;
var from = Number(arguments[1]) || 0;
from = (from < 0) ? Math.ceil(from) : Math.floor(from);
if(from < 0)
from += len;
for(; from < len; from++) {
if(from in this &&
this[from] === elt)
return from;
}
return -1;
};
}
/**
* Creates a new array with the results of calling a provided function on every element in this array.
*/
if(!Array.prototype.map) {
Array.prototype.map = function(fun /*, thisp*/ ) {
var len = this.length;
if(typeof fun != STR_FUNCTION)
throw new TypeError();
var res = new Array(len);
var thisp = arguments[1];
for(var i = 0; i < len; i++) {
if(i in this)
res[i] = fun.call(thisp, this[i], i, this);
}
return res;
};
}
/**
* Creates a new array with the results match the condistions
* @param {plain object or function} conditions
* @param {array} result
* @return {array}
*/
if(!Array.prototype.where) {
Array.prototype.where = function(conditions, result) {
result = result || [];
var cdt, ok, objVal;
this.forEach(function(val) {
ok = true;
for(var key in conditions) {
cdt = conditions[key];
if(typeof cdt === STR_FUNCTION) {
ok = cdt(val);
} else {
objVal = val[key];
ok = (objVal && objVal === cdt);
}
if(!ok) break;
}
if(ok) result.push(val);
});
return result;
};
}
/**
* Return a object contains grouped result as object key
* @param {string} key
* @return {Object}
*/
if(!Array.prototype.groupBy) {
Array.prototype.groupBy = function(key) {
var result = {};
this.forEach(function(val) {
var keyName = val[key];
if(!keyName) {
keyName = 'unkown';
}
if(!result[keyName]) {
result[keyName] = [];
}
result[keyName].push(val);
});
return result;
};
}
/**
* Returns true if at least one element in this array satisfies the provided testing conditions.
* @param {function or plain object} conditions
* @return {Boolean}
*/
if(!Array.prototype.has) {
Array.prototype.has = function(conditions) {
var result = false,
cdt, ok, objVal;
this.forEach(function(val) {
ok = true;
for(var key in conditions) {
cdt = conditions[key];
if(typeof cdt === STR_FUNCTION) {
ok = cdt(val);
} else {
objVal = val[key];
ok = (objVal && objVal === cdt);
}
if(!ok) break;
}
if(ok) {
result = true;
return false;
}
});
return result;
};
}
}());

View File

@@ -0,0 +1,7 @@
/*!
* ZUI: 数组辅助方法 - v1.9.1 - 2019-05-10
* http://zui.sexy
* GitHub: https://github.com/easysoft/zui.git
* Copyright (c) 2019 cnezsoft.com; Licensed MIT
*/
!function(){"use strict";var r="function";Array.prototype.forEach||(Array.prototype.forEach=function(t){var o=this.length;if(typeof t!=r)throw new TypeError;for(var e=arguments[1],i=0;i<o;i++)i in this&&t.call(e,this[i],i,this)}),Array.isArray||(Array.isArray=function(r){return"[object Array]"===Object.toString.call(r)}),Array.prototype.lastIndexOf||(Array.prototype.lastIndexOf=function(r){var t=this.length,o=Number(arguments[1]);for(isNaN(o)?o=t-1:(o=o<0?Math.ceil(o):Math.floor(o),o<0?o+=t:o>=t&&(o=t-1));o>-1;o--)if(o in this&&this[o]===r)return o;return-1}),Array.prototype.every||(Array.prototype.every=function(t){var o=this.length;if(typeof t!=r)throw new TypeError;for(var e=arguments[1],i=0;i<o;i++)if(i in this&&!t.call(e,this[i],i,this))return!1;return!0}),Array.prototype.filter||(Array.prototype.filter=function(t){var o=this.length;if(typeof t!=r)throw new TypeError;for(var e=[],i=arguments[1],n=0;n<o;n++)if(n in this){var a=this[n];t.call(i,a,n,this)&&e.push(a)}return e}),Array.prototype.indexOf||(Array.prototype.indexOf=function(r){var t=this.length,o=Number(arguments[1])||0;for(o=o<0?Math.ceil(o):Math.floor(o),o<0&&(o+=t);o<t;o++)if(o in this&&this[o]===r)return o;return-1}),Array.prototype.map||(Array.prototype.map=function(t){var o=this.length;if(typeof t!=r)throw new TypeError;for(var e=new Array(o),i=arguments[1],n=0;n<o;n++)n in this&&(e[n]=t.call(i,this[n],n,this));return e}),Array.prototype.where||(Array.prototype.where=function(t,o){o=o||[];var e,i,n;return this.forEach(function(a){i=!0;for(var y in t)if(e=t[y],typeof e===r?i=e(a):(n=a[y],i=n&&n===e),!i)break;i&&o.push(a)}),o}),Array.prototype.groupBy||(Array.prototype.groupBy=function(r){var t={};return this.forEach(function(o){var e=o[r];e||(e="unkown"),t[e]||(t[e]=[]),t[e].push(o)}),t}),Array.prototype.has||(Array.prototype.has=function(t){var o,e,i,n=!1;return this.forEach(function(a){e=!0;for(var y in t)if(o=t[y],typeof o===r?e=o(a):(i=a[y],e=i&&i===o),!e)break;if(e)return n=!0,!1}),n})}();

View File

@@ -0,0 +1 @@
2e9f2774-f6c3-463b-b385-fa85133aea72

View File

@@ -0,0 +1,102 @@
/*!
* ZUI: 看板 - v1.9.1 - 2019-05-10
* http://zui.sexy
* GitHub: https://github.com/easysoft/zui.git
* Copyright (c) 2019 cnezsoft.com; Licensed MIT
*/
.board-item {
padding: 6px 10px;
margin-bottom: 5px;
background: #fff;
border: 1px solid #ddd;
-webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, .05);
box-shadow: 0 1px 0 rgba(0, 0, 0, .05);
-webkit-transition: all .4s cubic-bezier(.175, .885, .32, 1);
-o-transition: all .4s cubic-bezier(.175, .885, .32, 1);
transition: all .4s cubic-bezier(.175, .885, .32, 1);
}
.board-item:hover {
-webkit-box-shadow: 0 1px 1 rgba(0, 0, 0, .1);
box-shadow: 0 1px 1 rgba(0, 0, 0, .1);
}
.board-item.board-item-empty {
display: none;
color: #808080;
border-style: dashed;
}
.board-item.board-item-shadow {
display: none;
padding: 0;
background: #ddd;
border: none;
border-color: #ddd;
-webkit-box-shadow: inset 0 0 4px rgba(0, 0, 0, .1);
box-shadow: inset 0 0 4px rgba(0, 0, 0, .1);
-webkit-transition: all .4s cubic-bezier(.175, .885, .32, 1);
-o-transition: all .4s cubic-bezier(.175, .885, .32, 1);
transition: all .4s cubic-bezier(.175, .885, .32, 1);
}
.board-item.drag-shadow {
width: 250px;
cursor: move;
background-color: #fff;
border-color: #c4c4c4;
-webkit-box-shadow: 1px 1px 15px rgba(0, 0, 0, .25);
box-shadow: 1px 1px 15px rgba(0, 0, 0, .25);
opacity: .9;
}
.board-item.drag-from {
background-color: #ebf2f9;
}
.board-list .board-item:last-child {
margin-bottom: 0;
}
.board {
float: left;
width: 250px;
margin-right: 10px;
}
.board.drop-in-empty .board-item-empty {
height: 0;
padding: 0;
margin: 0;
overflow: hidden;
border: transparent;
}
.board:last-child {
margin-right: 0;
}
.board > .panel-body {
padding: 5px;
background: #f1f1f1;
}
.boards:before,
.boards:after {
display: table;
content: " ";
}
.boards:after {
clear: both;
}
.boards.dragging .board.drop-in {
border-color: #c4c4c4;
-webkit-box-shadow: 1px 1px 15px rgba(0, 0, 0, .25);
box-shadow: 1px 1px 15px rgba(0, 0, 0, .25);
}
.boards.dragging .board.drop-in .board-item-shadow {
display: block;
}
.boards.dragging .board .board-item.board-item-empty {
display: block;
}
.boards.dragging .board-item.disable-drop {
display: none;
}
.boards.drop-in .board-item.drag-from {
height: 0;
padding: 0;
margin: 0;
overflow: hidden;
border: transparent;
}

View File

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

View File

@@ -0,0 +1,6 @@
/*!
* ZUI: 看板 - v1.9.1 - 2019-05-10
* http://zui.sexy
* GitHub: https://github.com/easysoft/zui.git
* Copyright (c) 2019 cnezsoft.com; Licensed MIT
*/.board-item{padding:6px 10px;margin-bottom:5px;background:#fff;border:1px solid #ddd;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.05);box-shadow:0 1px 0 rgba(0,0,0,.05);-webkit-transition:all .4s cubic-bezier(.175,.885,.32,1);-o-transition:all .4s cubic-bezier(.175,.885,.32,1);transition:all .4s cubic-bezier(.175,.885,.32,1)}.board-item:hover{-webkit-box-shadow:0 1px 1 rgba(0,0,0,.1);box-shadow:0 1px 1 rgba(0,0,0,.1)}.board-item.board-item-empty{display:none;color:grey;border-style:dashed}.board-item.board-item-shadow{display:none;padding:0;background:#ddd;border:none;border-color:#ddd;-webkit-box-shadow:inset 0 0 4px rgba(0,0,0,.1);box-shadow:inset 0 0 4px rgba(0,0,0,.1);-webkit-transition:all .4s cubic-bezier(.175,.885,.32,1);-o-transition:all .4s cubic-bezier(.175,.885,.32,1);transition:all .4s cubic-bezier(.175,.885,.32,1)}.board-item.drag-shadow{width:250px;cursor:move;background-color:#fff;border-color:#c4c4c4;-webkit-box-shadow:1px 1px 15px rgba(0,0,0,.25);box-shadow:1px 1px 15px rgba(0,0,0,.25);opacity:.9}.board-item.drag-from{background-color:#ebf2f9}.board-list .board-item:last-child{margin-bottom:0}.board{float:left;width:250px;margin-right:10px}.board.drop-in-empty .board-item-empty{height:0;padding:0;margin:0;overflow:hidden;border:transparent}.board:last-child{margin-right:0}.board>.panel-body{padding:5px;background:#f1f1f1}.boards:after,.boards:before{display:table;content:" "}.boards:after{clear:both}.boards.dragging .board.drop-in{border-color:#c4c4c4;-webkit-box-shadow:1px 1px 15px rgba(0,0,0,.25);box-shadow:1px 1px 15px rgba(0,0,0,.25)}.boards.dragging .board.drop-in .board-item-shadow{display:block}.boards.dragging .board .board-item.board-item-empty{display:block}.boards.dragging .board-item.disable-drop{display:none}.boards.drop-in .board-item.drag-from{height:0;padding:0;margin:0;overflow:hidden;border:transparent}

View File

@@ -0,0 +1,7 @@
/*!
* ZUI: 看板 - v1.9.1 - 2019-05-10
* http://zui.sexy
* GitHub: https://github.com/easysoft/zui.git
* Copyright (c) 2019 cnezsoft.com; Licensed MIT
*/
!function(t){"use strict";if(!t.fn.droppable)throw new Error("Droppable requires for boards");var o=function(o,a){this.$=t(o),this.options=this.getOptions(a),this.getLang(),this.init()};o.DEFAULTS={langs:{zh_cn:{append2end:"移动到末尾"},zh_tw:{append2end:"移动到末尾"},en:{append2end:"Move to the end."}}},o.prototype.getOptions=function(a){return a=t.extend({lang:t.zui.clientLang()},o.DEFAULTS,this.$.data(),a)},o.prototype.getLang=function(){var t=this.options;this.lang=t.langs[t.lang]||t.langs[o.DEFAULTS.lang]},o.prototype.init=function(){var o=1,a=this.lang;this.$.find('.board-item:not(".disable-drop"), .board:not(".disable-drop")').each(function(){var i=t(this);i.attr("id")?i.attr("data-id",i.attr("id")):i.attr("data-id")||i.attr("data-id","board"+o++),i.hasClass("board")&&i.find(".board-list").append('<div class="board-item board-item-empty"><i class="icon-plus"></i> {append2end}</div>'.format(a)).append('<div class="board-item board-item-shadow"></div>'.format(a))}),this.bind()},o.prototype.bind=function(o){var a=this.$,i=this.options;a.droppable(t.extend({before:i.before,target:'.board-item:not(".disable-drop, .board-item-shadow")',flex:!0,selector:'.board-item:not(".disable-drop, .board-item-shadow")',start:function(t){a.addClass("dragging").find(".board-item-shadow").height(t.element.outerHeight())},drag:function(t){if(a.find(".board.drop-in-empty").removeClass("drop-in-empty"),t.isIn){var o=t.target.closest(".board").addClass("drop-in"),i=o.find(".board-item-shadow"),e=t.target;a.addClass("drop-in").find(".board.drop-in").not(o).removeClass("drop-in"),i.insertBefore(e),o.toggleClass("drop-in-empty",e.hasClass("board-item-empty"))}},drop:function(o){if(o.isNew){var a;t.isFunction(i.drop)&&(a=i.drop(o)),a!==!1&&o.element.insertBefore(o.target)}},finish:function(){a.removeClass("dragging").removeClass("drop-in").find(".board.drop-in").removeClass("drop-in")}},i.droppable))},t.fn.boards=function(a){return this.each(function(){var i=t(this),e=i.data("zui.boards"),n="object"==typeof a&&a;e||i.data("zui.boards",e=new o(this,n)),"string"==typeof a&&e[a]()})},t.fn.boards.Constructor=o}(jQuery);

View File

@@ -0,0 +1 @@
9a1bd055-15ce-4244-ae7a-73d0c3e802e9

View File

@@ -0,0 +1,3 @@
.bootbox.modal .modal-dialog {
width: 400px;
}

View File

@@ -0,0 +1,847 @@
/* ========================================================================
* Bootbox: bootbox.js [v4.4.0]
* http://bootboxjs.com/
*
* ZUI: The file has been changed in ZUI. It will not keep update with the
* official version in the future.
* http://zui.sexy
* ========================================================================
* http://bootboxjs.com/license.txt
* Improvement in ZUI:
* 1. Determine client language and apply setting automatically.
* 2. Changed button position.
* ======================================================================== */
/*! bootbox.js v4.4.0 http://bootboxjs.com/license.txt */
// @see https://github.com/makeusabrew/bootbox/issues/180
// @see https://github.com/makeusabrew/bootbox/issues/186
(function(root, factory) {
'use strict';
if(typeof define === "function" && define.amd) {
// AMD. Register as an anonymous module.
define(["jquery"], factory);
} else if(typeof exports === "object") {
// Node. Does not work with strict CommonJS, but
// only CommonJS-like environments that support module.exports,
// like Node.
module.exports = factory(require("jquery"));
} else {
// Browser globals (root is window)
root.bootbox = factory(root.jQuery);
}
}(this, function init($, undefined) {
'use strict';
// the base DOM structure needed to create a modal
var templates = {
dialog: "<div class='bootbox modal' tabindex='-1' role='dialog'>" +
"<div class='modal-dialog'>" +
"<div class='modal-content'>" +
"<div class='modal-body'><div class='bootbox-body'></div></div>" +
"</div>" +
"</div>" +
"</div>",
header: "<div class='modal-header'>" +
"<h4 class='modal-title'></h4>" +
"</div>",
footer: "<div class='modal-footer'></div>",
closeButton: "<button type='button' class='bootbox-close-button close' data-dismiss='modal' aria-hidden='true'>&times;</button>",
form: "<form class='bootbox-form'></form>",
inputs: {
text: "<input class='bootbox-input bootbox-input-text form-control' autocomplete=off type=text />",
textarea: "<textarea class='bootbox-input bootbox-input-textarea form-control'></textarea>",
email: "<input class='bootbox-input bootbox-input-email form-control' autocomplete='off' type='email' />",
select: "<select class='bootbox-input bootbox-input-select form-control'></select>",
checkbox: "<div class='checkbox'><label><input class='bootbox-input bootbox-input-checkbox' type='checkbox' /></label></div>",
date: "<input class='bootbox-input bootbox-input-date form-control' autocomplete=off type='date' />",
time: "<input class='bootbox-input bootbox-input-time form-control' autocomplete=off type='time' />",
number: "<input class='bootbox-input bootbox-input-number form-control' autocomplete=off type='number' />",
password: "<input class='bootbox-input bootbox-input-password form-control' autocomplete='off' type='password' />"
}
};
var defaults = {
// default language
locale: $.zui && $.zui.clientLang ? $.zui.clientLang() : 'zh_cn',
// show backdrop or not. Default to static so user has to interact with dialog
backdrop: "static",
// animate the modal in/out
animate: true,
// additional class string applied to the top level dialog
className: null,
// whether or not to include a close button
closeButton: true,
// show the dialog immediately by default
show: true,
// dialog container
container: "body"
};
// our public object; augmented after our private API
var exports = {};
/**
* @private
*/
function _t(key) {
var locale = locales[defaults.locale];
return locale ? locale[key] : locales.en[key];
}
function processCallback(e, dialog, callback) {
e.stopPropagation();
e.preventDefault();
// by default we assume a callback will get rid of the dialog,
// although it is given the opportunity to override this
// so, if the callback can be invoked and it *explicitly returns false*
// then we'll set a flag to keep the dialog active...
var preserveDialog = $.isFunction(callback) && callback.call(dialog, e) === false;
// ... otherwise we'll bin it
if(!preserveDialog) {
dialog.modal("hide");
}
}
function getKeyLength(obj) {
// @TODO defer to Object.keys(x).length if available?
var k, t = 0;
for(k in obj) {
t++;
}
return t;
}
function each(collection, iterator) {
var index = 0;
$.each(collection, function(key, value) {
iterator(key, value, index++);
});
}
function sanitize(options) {
var buttons;
var total;
if(typeof options !== "object") {
throw new Error("Please supply an object of options");
}
if(!options.message) {
throw new Error("Please specify a message");
}
// make sure any supplied options take precedence over defaults
options = $.extend({}, defaults, options);
if(!options.buttons) {
options.buttons = {};
}
buttons = options.buttons;
total = getKeyLength(buttons);
each(buttons, function(key, button, index) {
if($.isFunction(button)) {
// short form, assume value is our callback. Since button
// isn't an object it isn't a reference either so re-assign it
button = buttons[key] = {
callback: button
};
}
// before any further checks make sure by now button is the correct type
if($.type(button) !== "object") {
throw new Error("button with key " + key + " must be an object");
}
if(!button.label) {
// the lack of an explicit label means we'll assume the key is good enough
button.label = key;
}
if(!button.className) {
if((total === 2 && (key === 'ok' || key === 'confirm')) || total === 1) {
// always add a primary to the main option in a two-button dialog
button.className = "btn-primary";
} else {
button.className = "btn-default";
}
}
});
return options;
}
/**
* map a flexible set of arguments into a single returned object
* if args.length is already one just return it, otherwise
* use the properties argument to map the unnamed args to
* object properties
* so in the latter case:
* mapArguments(["foo", $.noop], ["message", "callback"])
* -> { message: "foo", callback: $.noop }
*/
function mapArguments(args, properties) {
var argn = args.length;
var options = {};
if(argn < 1 || argn > 2) {
throw new Error("Invalid argument length");
}
if(argn === 2 || typeof args[0] === "string") {
options[properties[0]] = args[0];
options[properties[1]] = args[1];
} else {
options = args[0];
}
return options;
}
/**
* merge a set of default dialog options with user supplied arguments
*/
function mergeArguments(defaults, args, properties) {
return $.extend(
// deep merge
true,
// ensure the target is an empty, unreferenced object
{},
// the base options object for this type of dialog (often just buttons)
defaults,
// args could be an object or array; if it's an array properties will
// map it to a proper options object
mapArguments(
args,
properties
)
);
}
/**
* this entry-level method makes heavy use of composition to take a simple
* range of inputs and return valid options suitable for passing to bootbox.dialog
*/
function mergeDialogOptions(className, labels, properties, args) {
// build up a base set of dialog properties
var baseOptions = {
className: "bootbox-" + className,
buttons: createLabels.apply(null, labels)
};
// ensure the buttons properties generated, *after* merging
// with user args are still valid against the supplied labels
return validateButtons(
// merge the generated base properties with user supplied arguments
mergeArguments(
baseOptions,
args,
// if args.length > 1, properties specify how each arg maps to an object key
properties
),
labels
);
}
/**
* from a given list of arguments return a suitable object of button labels
* all this does is normalise the given labels and translate them where possible
* e.g. "ok", "confirm" -> { ok: "OK, cancel: "Annuleren" }
*/
function createLabels() {
var buttons = {};
for(var i = 0, j = arguments.length; i < j; i++) {
var argument = arguments[i];
var key = argument.toLowerCase();
var value = argument.toUpperCase();
buttons[key] = {
label: _t(value)
};
}
return buttons;
}
function validateButtons(options, buttons) {
var allowedButtons = {};
each(buttons, function(key, value) {
allowedButtons[value] = true;
});
each(options.buttons, function(key) {
if(allowedButtons[key] === undefined) {
throw new Error("button key " + key + " is not allowed (options are " + buttons.join("\n") + ")");
}
});
return options;
}
exports.alert = function() {
var options;
options = mergeDialogOptions("alert", ["ok"], ["message", "callback"], arguments);
if(options.callback && !$.isFunction(options.callback)) {
throw new Error("alert requires callback property to be a function when provided");
}
/**
* overrides
*/
options.buttons.ok.callback = options.onEscape = function() {
if($.isFunction(options.callback)) {
return options.callback.call(this);
}
return true;
};
return exports.dialog(options);
};
exports.confirm = function() {
var options;
// ZUI change begin
options = mergeDialogOptions("confirm", ["confirm", "cancel"], ["message", "callback"], arguments);
// OLD WAY: options = mergeDialogOptions("confirm", ["cancel", "confirm"], ["message", "callback"], arguments);
// ZUI change end
/**
* overrides; undo anything the user tried to set they shouldn't have
*/
options.buttons.cancel.callback = options.onEscape = function() {
return options.callback.call(this, false);
};
options.buttons.confirm.callback = function() {
return options.callback.call(this, true);
};
// confirm specific validation
if(!$.isFunction(options.callback)) {
throw new Error("confirm requires a callback");
}
return exports.dialog(options);
};
exports.prompt = function() {
var options;
var defaults;
var dialog;
var form;
var input;
var shouldShow;
var inputOptions;
// we have to create our form first otherwise
// its value is undefined when gearing up our options
// @TODO this could be solved by allowing message to
// be a function instead...
form = $(templates.form);
// prompt defaults are more complex than others in that
// users can override more defaults
// @TODO I don't like that prompt has to do a lot of heavy
// lifting which mergeDialogOptions can *almost* support already
// just because of 'value' and 'inputType' - can we refactor?
defaults = {
className: "bootbox-prompt",
buttons: createLabels("cancel", "confirm"),
value: "",
inputType: "text"
};
options = validateButtons(
// ZUI change begin
mergeArguments(defaults, arguments, ["title", "callback"]), ["confirm", "cancel"]
// OLD WAY: mergeArguments(defaults, arguments, ["title", "callback"]), ["cancel", "confirm"]arguments);
// ZUI change end
);
// capture the user's show value; we always set this to false before
// spawning the dialog to give us a chance to attach some handlers to
// it, but we need to make sure we respect a preference not to show it
shouldShow = (options.show === undefined) ? true : options.show;
/**
* overrides; undo anything the user tried to set they shouldn't have
*/
options.message = form;
options.buttons.cancel.callback = options.onEscape = function() {
return options.callback.call(this, null);
};
options.buttons.confirm.callback = function() {
var value;
switch(options.inputType) {
case "text":
case "textarea":
case "email":
case "select":
case "date":
case "time":
case "number":
case "password":
value = input.val();
break;
case "checkbox":
var checkedItems = input.find("input:checked");
// we assume that checkboxes are always multiple,
// hence we default to an empty array
value = [];
each(checkedItems, function(_, item) {
value.push($(item).val());
});
break;
}
return options.callback.call(this, value);
};
options.show = false;
// prompt specific validation
if(!options.title) {
throw new Error("prompt requires a title");
}
if(!$.isFunction(options.callback)) {
throw new Error("prompt requires a callback");
}
if(!templates.inputs[options.inputType]) {
throw new Error("invalid prompt type");
}
// create the input based on the supplied type
input = $(templates.inputs[options.inputType]);
switch(options.inputType) {
case "text":
case "textarea":
case "email":
case "date":
case "time":
case "number":
case "password":
input.val(options.value);
break;
case "select":
var groups = {};
inputOptions = options.inputOptions || [];
if(!$.isArray(inputOptions)) {
throw new Error("Please pass an array of input options");
}
if(!inputOptions.length) {
throw new Error("prompt with select requires options");
}
each(inputOptions, function(_, option) {
// assume the element to attach to is the input...
var elem = input;
if(option.value === undefined || option.text === undefined) {
throw new Error("given options in wrong format");
}
// ... but override that element if this option sits in a group
if(option.group) {
// initialise group if necessary
if(!groups[option.group]) {
groups[option.group] = $("<optgroup/>").attr("label", option.group);
}
elem = groups[option.group];
}
elem.append("<option value='" + option.value + "'>" + option.text + "</option>");
});
each(groups, function(_, group) {
input.append(group);
});
// safe to set a select's value as per a normal input
input.val(options.value);
break;
case "checkbox":
var values = $.isArray(options.value) ? options.value : [options.value];
inputOptions = options.inputOptions || [];
if(!inputOptions.length) {
throw new Error("prompt with checkbox requires options");
}
if(!inputOptions[0].value || !inputOptions[0].text) {
throw new Error("given options in wrong format");
}
// checkboxes have to nest within a containing element, so
// they break the rules a bit and we end up re-assigning
// our 'input' element to this container instead
input = $("<div/>");
each(inputOptions, function(_, option) {
var checkbox = $(templates.inputs[options.inputType]);
checkbox.find("input").attr("value", option.value);
checkbox.find("label").append(option.text);
// we've ensured values is an array so we can always iterate over it
each(values, function(_, value) {
if(value === option.value) {
checkbox.find("input").prop("checked", true);
}
});
input.append(checkbox);
});
break;
}
// @TODO provide an attributes option instead
// and simply map that as keys: vals
if(options.placeholder) {
input.attr("placeholder", options.placeholder);
}
if(options.pattern) {
input.attr("pattern", options.pattern);
}
if(options.maxlength) {
input.attr("maxlength", options.maxlength);
}
// now place it in our form
form.append(input);
form.on("submit", function(e) {
e.preventDefault();
// Fix for SammyJS (or similar JS routing library) hijacking the form post.
e.stopPropagation();
// @TODO can we actually click *the* button object instead?
// e.g. buttons.confirm.click() or similar
dialog.find(".btn-primary").click();
});
dialog = exports.dialog(options);
// clear the existing handler focusing the submit button...
dialog.off("shown.zui.modal");
// ...and replace it with one focusing our input, if possible
dialog.on("shown.zui.modal", function() {
// need the closure here since input isn't
// an object otherwise
input.focus();
});
if(shouldShow === true) {
dialog.modal("show");
}
return dialog;
};
exports.dialog = function(options) {
options = sanitize(options);
var dialog = $(templates.dialog);
var innerDialog = dialog.find(".modal-dialog");
var body = dialog.find(".modal-body");
var buttons = options.buttons;
var buttonStr = "";
var callbacks = {
onEscape: options.onEscape
};
if($.fn.modal === undefined) {
throw new Error(
"$.fn.modal is not defined; please double check you have included " +
"the Bootstrap JavaScript library. See http://getbootstrap.com/javascript/ " +
"for more details."
);
}
each(buttons, function(key, button) {
// @TODO I don't like this string appending to itself; bit dirty. Needs reworking
// can we just build up button elements instead? slower but neater. Then button
// can just become a template too
buttonStr += "<button data-bb-handler='" + key + "' type='button' class='btn " + button.className + "'>" + button.label + "</button>";
callbacks[key] = button.callback;
});
body.find(".bootbox-body").html(options.message);
if(options.animate === true) {
dialog.addClass("fade");
}
if(options.className) {
dialog.addClass(options.className);
}
if(options.size === "large") {
innerDialog.addClass("modal-lg");
} else if(options.size === "small") {
innerDialog.addClass("modal-sm");
}
if(options.title) {
body.before(templates.header);
}
if(options.closeButton) {
var closeButton = $(templates.closeButton);
if(options.title) {
dialog.find(".modal-header").prepend(closeButton);
} else {
closeButton.css("margin-top", "-10px").prependTo(body);
}
}
if(options.title) {
dialog.find(".modal-title").html(options.title);
}
if(buttonStr.length) {
body.after(templates.footer);
dialog.find(".modal-footer").html(buttonStr);
}
/**
* Bootstrap event listeners; used handle extra
* setup & teardown required after the underlying
* modal has performed certain actions
*/
dialog.on("hidden.zui.modal", function(e) {
// ensure we don't accidentally intercept hidden events triggered
// by children of the current dialog. We shouldn't anymore now BS
// namespaces its events; but still worth doing
if(e.target === this) {
dialog.remove();
}
});
/*
dialog.on("show.zui.modal", function() {
// sadly this doesn't work; show is called *just* before
// the backdrop is added so we'd need a setTimeout hack or
// otherwise... leaving in as would be nice
if (options.backdrop) {
dialog.next(".modal-backdrop").addClass("bootbox-backdrop");
}
});
*/
dialog.on("shown.zui.modal", function() {
dialog.find(".btn-primary:first").focus();
});
/**
* Bootbox event listeners; experimental and may not last
* just an attempt to decouple some behaviours from their
* respective triggers
*/
if(options.backdrop !== "static") {
// A boolean true/false according to the Bootstrap docs
// should show a dialog the user can dismiss by clicking on
// the background.
// We always only ever pass static/false to the actual
// $.modal function because with `true` we can't trap
// this event (the .modal-backdrop swallows it)
// However, we still want to sort of respect true
// and invoke the escape mechanism instead
dialog.on("click.dismiss.zui.modal", function(e) {
// @NOTE: the target varies in >= 3.3.x releases since the modal backdrop
// moved *inside* the outer dialog rather than *alongside* it
if(dialog.children(".modal-backdrop").length) {
e.currentTarget = dialog.children(".modal-backdrop").get(0);
}
if(e.target !== e.currentTarget) {
return;
}
dialog.trigger("escape.close.bb");
});
}
dialog.on("escape.close.bb", function(e) {
if(callbacks.onEscape) {
processCallback(e, dialog, callbacks.onEscape);
}
});
/**
* Standard jQuery event listeners; used to handle user
* interaction with our dialog
*/
dialog.on("click", ".modal-footer button", function(e) {
var callbackKey = $(this).data("bb-handler");
processCallback(e, dialog, callbacks[callbackKey]);
});
dialog.on("click", ".bootbox-close-button", function(e) {
// onEscape might be falsy but that's fine; the fact is
// if the user has managed to click the close button we
// have to close the dialog, callback or not
processCallback(e, dialog, callbacks.onEscape);
});
dialog.on("keyup", function(e) {
if(e.which === 27) {
dialog.trigger("escape.close.bb");
}
});
// the remainder of this method simply deals with adding our
// dialogent to the DOM, augmenting it with Bootstrap's modal
// functionality and then giving the resulting object back
// to our caller
$(options.container).append(dialog);
dialog.modal({
backdrop: options.backdrop ? "static" : false,
keyboard: false,
show: false
});
if(options.show) {
dialog.modal("show");
}
// @TODO should we return the raw element here or should
// we wrap it in an object on which we can expose some neater
// methods, e.g. var d = bootbox.alert(); d.hide(); instead
// of d.modal("hide");
/*
function BBDialog(elem) {
this.elem = elem;
}
BBDialog.prototype = {
hide: function() {
return this.elem.modal("hide");
},
show: function() {
return this.elem.modal("show");
}
};
*/
return dialog;
};
exports.setDefaults = function() {
var values = {};
if(arguments.length === 2) {
// allow passing of single key/value...
values[arguments[0]] = arguments[1];
} else {
// ... and as an object too
values = arguments[0];
}
$.extend(defaults, values);
};
exports.hideAll = function() {
$(".bootbox").modal("hide");
return exports;
};
/**
* standard locales. Please add more according to ISO 639-1 standard. Multiple language variants are
* unlikely to be required. If this gets too large it can be split out into separate JS files.
*/
var locales = {
en: {
OK: "OK",
CANCEL: "Cancel",
CONFIRM: "OK"
},
zh_cn: {
OK: "确认",
CANCEL: "取消",
CONFIRM: "确认"
},
zh_tw: {
OK: "確認",
CANCEL: "取消",
CONFIRM: "確認"
}
};
exports.addLocale = function(name, values) {
$.each(["OK", "CANCEL", "CONFIRM"], function(_, v) {
if(!values[v]) {
throw new Error("Please supply a translation for '" + v + "'");
}
});
locales[name] = {
OK: values.OK,
CANCEL: values.CANCEL,
CONFIRM: values.CONFIRM
};
return exports;
};
exports.removeLocale = function(name) {
delete locales[name];
return exports;
};
exports.setLocale = function(name) {
return exports.setDefaults("locale", name);
};
exports.init = function(_$) {
return init(_$ || $);
};
return exports;
}));

View File

@@ -0,0 +1 @@
.bootbox.modal .modal-dialog{width:400px}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
72e34dfb-a649-4eaf-a2ac-ed1c6a4f49df

View File

@@ -0,0 +1,156 @@
/*!
* ZUI: 日历 - v1.9.1 - 2019-05-10
* http://zui.sexy
* GitHub: https://github.com/easysoft/zui.git
* Copyright (c) 2019 cnezsoft.com; Licensed MIT
*/
.calendar {
margin-bottom: 20px;
}
.calendar > header {
margin-bottom: 10px;
}
.calendar > header .btn-toolbar > .btn-group {
margin-right: 10px;
}
.calendar > header .calendar-caption {
line-height: 30px;
}
.calendar .table {
margin-bottom: 0;
table-layout: fixed;
}
.calendar .table > thead > tr > th,
.calendar .table > tbody > tr > td {
width: 14.28571428571429%;
padding: 0;
}
.calendar .table > thead > tr > th {
color: #808080;
text-align: center;
background-color: #fff;
}
.calendar .weekends-empty .table > thead > tr > th,
.calendar .weekends-empty .table > tbody > tr > td {
width: 20%;
}
.calendar .weekends-empty .table > thead > tr > th.weekend-head,
.calendar .weekends-empty .table > tbody > tr > td.weekend-day {
width: 40px;
min-width: 40px;
}
.calendar .day {
opacity: .7;
}
.calendar .day > .heading {
padding: 2px 5px;
text-align: right;
}
.calendar .day > .heading > .month {
padding: 1px 2px;
color: #fff;
background-color: #b3b3b3;
border-radius: 3px;
}
.calendar .day > .content {
height: 100%;
min-height: 70px;
}
.calendar .cell-day {
background-color: #f1f1f1;
}
.calendar .cell-day.past > .day > .content {
opacity: .7;
}
.calendar .cell-day.current-month {
background: none;
}
.calendar .cell-day.current-month > .day {
opacity: 1;
}
.calendar .cell-day.current {
background-color: #fff0d5;
-webkit-box-shadow: inset 1px 1px 0 #808080, inset -1px -1px 0 #808080;
box-shadow: inset 1px 1px 0 #808080, inset -1px -1px 0 #808080;
}
.calendar .cell-day.current > .day > .content {
padding: 0;
}
.calendar .cell-day.current > .day > .heading {
background-color: rgba(0, 0, 0, .1);
}
.calendar .cell-day.drop-to {
background-color: #fff0d5;
opacity: 1;
}
.calendar .event {
padding: 1px 5px;
margin: 0 1px 1px;
color: #fff;
cursor: pointer;
background-color: #3280fc;
opacity: .95;
-webkit-transition: all .4s cubic-bezier(.175, .885, .32, 1);
-o-transition: all .4s cubic-bezier(.175, .885, .32, 1);
transition: all .4s cubic-bezier(.175, .885, .32, 1);
}
a.calendar .event:hover {
background-color: #0462f7;
}
.calendar .event:hover {
opacity: 1;
}
.calendar .event.drag-shadow {
cursor: move;
}
.calendar .event.drag-from {
opacity: .25;
}
.calendar .event.color-red {
color: #fff;
background-color: #ea644a;
}
a.calendar .event.color-red:hover {
background-color: #e53d1c;
}
.calendar .event.color-green {
color: #fff;
background-color: #38b03f;
}
a.calendar .event.color-green:hover {
background-color: #2c8931;
}
.calendar .event.color-yellow {
color: #fff;
background-color: #f1a325;
}
a.calendar .event.color-yellow:hover {
background-color: #d5890e;
}
.calendar .event.color-blue {
color: #fff;
background-color: #03b8cf;
}
a.calendar .event.color-blue:hover {
background-color: #028b9d;
}
.calendar .event.color-brown {
color: #fff;
background-color: #bd7b46;
}
a.calendar .event.color-brown:hover {
background-color: #996337;
}
.calendar .event.color-purple {
color: #fff;
background-color: #8666b8;
}
a.calendar .event.color-purple:hover {
background-color: #6c4aa1;
}
.calendar.limit-event-title .event {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}

View File

@@ -0,0 +1,738 @@
/*!
* ZUI: 日历 - v1.9.1 - 2019-05-10
* http://zui.sexy
* GitHub: https://github.com/easysoft/zui.git
* Copyright (c) 2019 cnezsoft.com; Licensed MIT
*/
/* ========================================================================
* ZUI: calendar.js
* http://zui.sexy
* ========================================================================
* Copyright (c) 2014 cnezsoft.com; Licensed MIT
* ======================================================================== */
(function($, window) {
'use strict';
var NAME = 'zui.calendar';
var NUMBER_TYPE_NAME = 'number';
var STRING_TYPE_NAME = 'string';
var UNDEFINED_TYPE_NAME = 'undefined';
var presetColors = {
"primary": 1,
"green": 2,
"red": 3,
"blue": 4,
"yellow": 5,
"brown": 6,
"purple": 7
};
var getNearbyLastWeekDay = function(date, lastWeek) {
lastWeek = lastWeek || 1;
var d = date.clone();
while(d.getDay() != lastWeek) {
d.addDays(-1);
}
d.clearTime();
return d;
},
getFirstDayOfMonth = function(date) {
var d = date.clone();
d.setDate(1);
return d;
},
calculateDays = function(start, end) {
var s = start.clone().clearTime();
var e = end.clone().clearTime();
return Math.round((e.getTime() - s.getTime()) / Date.ONEDAY_TICKS) + 1;
},
everyDayTo = function(start, end, callback) {
var a = start.clone();
var i = 0;
while(a <= end) {
callback(a.clone(), i++);
a.addDays(1);
}
};
var Calendar = function(element, options) {
this.name = NAME;
this.$ = $(element);
this.id = this.$.attr('id') || (NAME + $.zui.uuid());
this.$.attr('id', this.id);
this.storeName = NAME + '.' + this.id;
this.getOptions(options);
this.getLang();
this.resetData(this.options.data);
this.storeData = $.zui.store.pageGet(this.storeName, {
date: 'today',
view: 'month'
});
this.date = this.options.startDate || 'today';
this.view = this.options.startView || 'month';
this.$.toggleClass('limit-event-title', options.limitEventTitle);
if(this.options.withHeader) {
var $header = this.$.children('.calender-header');
if(!$header.length) {
$header = $('<header class="calender-header"><div class="btn-toolbar"><div class="btn-group"><button type="button" class="btn btn-today">{today}</button></div><div class="btn-group"><button type="button" class="btn btn-prev"><i class="icon-chevron-left"></i></button><button type="button" class="btn btn-next"><i class="icon-chevron-right"></i></button></div><div class="btn-group"><span class="calendar-caption"></span></div></div></header>'.format(this.lang));
this.$.append($header);
}
this.$caption = $header.find('.calendar-caption');
this.$todayBtn = $header.find('.btn-today');
this.$header = $header;
}
var $views = this.$.children('.calendar-views');
if(!$views.length) {
$views = $('<div class="calendar-views"></div>');
this.$.append($views);
}
this.$views = $views;
this.display();
this.bindEvents();
};
// default options
Calendar.DEFAULTS = {
langs: {
zh_cn: {
weekNames: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'],
monthNames: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],
today: '今天',
year: '{0}年',
month: '{0}月',
yearMonth: '{0}年{1}月'
},
zh_tw: {
weekNames: ['週一', '週二', '週三', '週四', '週五', '週六', '週日'],
monthNames: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],
today: '今天',
year: '{0}年',
month: '{0}月',
yearMonth: '{0}年{1}月'
},
en: {
weekNames: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
monthNames: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'June', 'July', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
today: 'Today',
year: '{0}',
month: '{0}',
yearMonth: '{2}, {0}'
}
},
data: {
calendars: {
defaultCal: {
color: '#229F24'
}
},
events: []
},
// startView: "month", // default view when load complete
// startDate: 'today', // default date when load complete
limitEventTitle: true,
storage: true,
withHeader: true,
dragThenDrop: true, // drag an event and drop at another day,
// hideEmptyWeekends: false // Auto hide empty weekends
};
Calendar.prototype.resetData = function(data) {
var that = this;
that.data = data = data || that.data;
if (data.calendars) {
this.calendars = {};
that.addCalendars(data.calendars, true);
}
if (data.events) {
this.events = [];
that.addEvents(data.events, true);
}
that.sortEvents();
};
// Sort events by start datetime
Calendar.prototype.sortEvents = function() {
var that = this;
var events = that.events;
if(!$.isArray(events)) {
events = [];
}
events.sort(that.options.eventSorter || function(a, b) {
if (a.allDay) {
return 1;
} else if (b.allDay) {
return -1;
}
var result = a.start > b.start ? 1 : (a.start < b.start ? (-1) : 0);
if (result === 0) {
result = a.id < b.id ? (-1) : 1;
}
return result;
});
that.events = events;
};
Calendar.prototype.bindEvents = function() {
var $e = this.$,
that = this;
$e.on('click', '.btn-today', function() {
that.date = new Date();
that.display();
$e.callComEvent(that, 'clickTodayBtn');
}).on('click', '.btn-next', function() {
if(that.view === 'month') {
that.date.addMonths(1);
}
that.display();
$e.callComEvent(that, 'clickNextBtn');
}).on('click', '.btn-prev', function() {
if(that.view === 'month') {
that.date.addMonths(-1);
}
that.display();
$e.callComEvent(that, 'clickPrevBtn');
}).on('click', '.event', function(event) {
$e.callComEvent(that, 'clickEvent', {
element: this,
event: $(this).data('event'),
events: that.events
});
event.stopPropagation();
}).on('click', '.cell-day', function() {
$e.callComEvent(that, 'clickCell', {
element: this,
view: that.view,
date: new Date($(this).children('.day').attr('data-date')),
events: that.events
});
});
};
Calendar.prototype.addCalendars = function(calendars, silence) {
var that = this;
if(!that.calendars) that.calendars = {};
if($.isPlainObject(calendars)) {
calendars = [calendars];
}
$.each(calendars, function(index, cal) {
if(!silence && false === that.$.callComEvent(this, 'beforeAddCalendars', {
newCalendar: cal,
data: that.data
})) {
return;
}
if(!cal.color) cal.color = 'primary';
if(!presetColors[cal.color.toLowerCase()]) {
var c = new $.zui.Color(cal.color);
cal.textColor = c.contrast().hexStr();
} else {
cal.presetColor = true;
}
that.calendars[cal.name] = cal;
});
if(!silence) {
that.display();
that.$.callComEvent(that, 'addCalendars', {
newCalendars: calendars,
data: that.data
});
}
};
Calendar.prototype.addEvents = function(events, silence) {
var that = this;
if(!that.events) that.events = [];
if($.isPlainObject(events)) {
events = [events];
}
$.each(events, function(index, e) {
if(!silence && false === that.$.callComEvent(that, 'beforeAddEvent', {
newEvent: e,
data: that.data
})) {
return;
}
var startType = typeof e.start;
var endType = typeof e.end;
if(startType === NUMBER_TYPE_NAME || startType === STRING_TYPE_NAME) {
e.start = new Date(e.start);
}
if(endType === NUMBER_TYPE_NAME || endType === STRING_TYPE_NAME) {
e.end = new Date(e.end);
}
if(typeof e.id === UNDEFINED_TYPE_NAME) {
e.id = $.zui.uuid();
}
if(e.allDay) {
e.start.clearTime();
if (!e.end) {
e.end = e.start.clone();
}
e.end.clearTime().addDays(1).addMilliseconds(-1);
}
e.days = calculateDays(e.start, e.end);
that.events.push(e);
});
if(!silence) {
that.sortEvents();
that.display();
that.$.callComEvent(that, 'addEvents', {
newEvents: events,
data: that.data
});
}
};
Calendar.prototype.getEvent = function(id) {
var events = this.events;
for(var i = 0; i < events.length; i++) {
if(events[i].id == id) {
return events[i];
}
}
return null;
};
Calendar.prototype.updateEvents = function(events) {
var eventsParams = {
data: this.data,
changes: []
},
that = this;
if($.isPlainObject(events)) {
events = [events];
}
var event, chgs, eventParam;
$.each(events, function(index, changes) {
event = changes.event;
chgs = changes.changes;
eventParam = {
event: event,
changes: []
};
if(typeof event === STRING_TYPE_NAME) {
event = that.getEvent(event);
}
if(event) {
if($.isPlainObject(chgs)) {
chgs = [chgs];
}
$.each(changes, function(idx, chge) {
if(false !== that.$.callComEvent(that, 'beforeChange', {
event: event,
change: chge.change,
to: chge.to,
from: event[chge.change]
})) {
eventParam.changes.push($.extend(true, {}, chge, {
from: event[chge.change]
}));
event[chge.change] = chge.to;
}
});
}
eventsParams.changes.push(eventParam);
});
that.sortEvents();
that.display();
that.$.callComEvent(that, 'change', eventsParams);
};
Calendar.prototype.removeEvents = function(events) {
if(!$.isArray(events)) {
events = [events];
}
var id, event, idx, evts = this.events,
that = this,
removedEvents = [];
$.each(events, function(index, value) {
id = $.isPlainObject(value) ? value.id : value;
idx = -1;
for(var i = 0; i < evts.length; i++) {
if(evts[i].id == id) {
idx = i;
event = evts[i];
break;
}
}
if(idx >= 0 && fasle !== that.$.callComEvent(that, 'beforeRemoveEvent', {
event: event,
eventId: id,
data: that.data
})) {
evts.splice(idx, 1);
removedEvents.push(event);
}
});
that.sortEvents();
that.display();
that.$.callComEvent(that, 'removeEvents', {
removedEvents: removedEvents,
data: that.data
});
};
Calendar.prototype.getOptions = function(options) {
this.options = $.extend(true, {}, Calendar.DEFAULTS, this.$.data(), options, true);
};
Calendar.prototype.getLang = function() {
this.lang = this.options.langs[(this.options.lang || ($.zui && $.zui.clientLang ? $.zui.clientLang() : 'zh_cn')).replace('-', '_')];
};
Calendar.prototype.display = function(view, date) {
var that = this;
var viewType = typeof view;
var dateType = typeof date;
if(viewType === UNDEFINED_TYPE_NAME) {
view = that.view;
} else {
that.view = view;
}
if(dateType === UNDEFINED_TYPE_NAME) {
date = that.date;
} else {
that.date = date;
}
if(date === 'today') {
date = new Date();
that.date = date;
}
if(typeof date === STRING_TYPE_NAME) {
date = new Date(date);
that.date = date;
}
if(that.options.storage) {
$.zui.store.pageSet(that.storeName, {
date: date,
view: view
});
}
var eventPramas = {
view: view,
date: date
};
var doDisplay = function() {
switch(view) {
case 'month':
that.displayMonth(date);
break;
}
that.$.callComEvent(that, 'display', eventPramas);
};
var beforeDisplayResult = that.$.callComEvent(that, 'beforeDisplay', [eventPramas, doDisplay]);
if (beforeDisplayResult !== false) {
doDisplay();
}
};
Calendar.prototype.displayMonth = function(date) {
var that = this;
date = date || that.date;
var options = that.options,
lang = that.lang,
i,
$views = that.$views,
$e = that.$;
var $view = that.$monthView;
if(!$view || !$view.length) {
$view = $('<div class="calendar-view month"><table class="table table-bordered"><thead><tr class="week-head"></tr></thead><tbody class="month-days"></tbody></table></div>');
var $weekHead = $view.find('.week-head'),
$monthDays = $view.find('.month-days'),
$tr;
for(i = 0; i < 7; i++) {
$('<th>' + lang.weekNames[i] + '</th>').toggleClass('weekend-head', i >= 5).appendTo($weekHead);
}
for(i = 0; i < 6; i++) {
$tr = $('<tr class="week-days"></tr>');
for(var j = 0; j < 7; j++) {
$('<td class="cell-day"><div class="day"><div class="heading"><span class="month"></span> <span class="number"></span></div><div class="content"><div class="events"></div></div></div></td>').toggleClass('weekend-day', j >= 5).appendTo($tr);
}
$monthDays.append($tr);
}
$views.append($view);
that.$monthView = $view;
}
var $weeks = $view.find('.week-days'),
$days = $view.find('.day'),
firstDayOfMonth = getFirstDayOfMonth(date),
// lastDayOfMonth = getLastDayOfMonth(date),
$week,
$day,
$cell,
year,
day,
month,
today = new Date();
var firstDay = getNearbyLastWeekDay(firstDayOfMonth),
thisYear = date.getFullYear(),
thisMonth = date.getMonth(),
todayMonth = today.getMonth(),
todayYear = today.getFullYear(),
todayDate = today.getDate();
var lastDay = firstDay.clone().addDays(6 * 7).addMilliseconds(-1),
printDate = firstDay.clone().addDays(1).addMilliseconds(-1);
var events = that.getEvents(firstDay, lastDay),
calendars = that.calendars,
printDateId, isFirstDayOfWeek, $event, cal, $dayEvents;
var isEmptyWeekends = true;
$weeks.each(function(weekIdx) {
$week = $(this);
$week.find('.day').each(function(dayIndex) {
isFirstDayOfWeek = dayIndex === 0;
$day = $(this);
$cell = $day.closest('.cell-day');
year = printDate.getFullYear();
day = printDate.getDate();
month = printDate.getMonth();
printDateId = printDate.toDateString();
$day.attr('data-date', printDateId).data('date', printDate.clone());
$day.find('.heading > .number').text(day);
$day.find('.heading > .month')
.toggle((weekIdx === 0 && dayIndex === 0) || day === 1)
.text(((month === 0 && day === 1) ? (lang.year.format(year) + ' ') : '') + lang.monthNames[month]);
$cell.toggleClass('current-month', month === thisMonth);
$cell.toggleClass('current', (day === todayDate && month === todayMonth && year === todayYear));
$cell.toggleClass('past', printDate < today);
$cell.toggleClass('future', printDate > today);
$dayEvents = $day.find('.events').empty();
var dayEvents = events[printDateId];
if(dayEvents) {
var eventsMap = dayEvents.events,
stripCount = 0,
e;
for(i = 0; i <= dayEvents.maxPos; ++i) {
e = eventsMap[i];
if(!e || (e.placeholder && !isFirstDayOfWeek)) {
stripCount++;
continue;
}
if (isEmptyWeekends && dayIndex >= 5) {
isEmptyWeekends = false;
}
if (options.eventCreator) {
$event = options.eventCreator(e, $cell, that);
} else {
$event = $('<div data-id="' + e.id + '" class="event" title="' + e.desc + '"><span class="time">' + e.start.format('hh:mm') + '</span> <span class="title">' + e.title + '</span></div>');
$event.find('.time').toggle(!e.allDay);
$event.data('event', e);
$event.attr('data-days', e.days);
}
$event.toggleClass('event-all-day', !!e.allDay).data('event', e).attr('data-days', e.days);
if(e.calendar) {
cal = calendars[e.calendar];
if(cal) {
if(cal.presetColor) {
$event.addClass('color-' + cal.color);
} else {
$event.css({
'background-color': cal.color,
color: cal.textColor
});
}
}
}
if(e.days) {
if(!e.placeholder) {
$event.css('width', Math.min(7 - dayIndex, e.days) + '00%');
} else if(isFirstDayOfWeek) {
$event.css('width', Math.min(7, e.days - e.holderPos) + '00%');
}
}
if(stripCount > 0) {
$event.css('margin-top', stripCount * 22);
stripCount = 0;
}
$dayEvents.append($event);
}
}
if (options.dayFormater) {
options.dayFormater($cell, printDate, dayEvents, that);
}
printDate.addDays(1);
});
});
if (options.hideEmptyWeekends) {
$view.toggleClass('weekends-empty', isEmptyWeekends);
}
if(options.withHeader) {
that.$caption.text(lang.yearMonth.format(thisYear, thisMonth + 1, lang.monthNames[thisMonth]));
that.$todayBtn.toggleClass('disabled', thisMonth === todayMonth && thisYear === todayYear);
}
if(options.dragThenDrop) {
if(!$.fn.droppable) {
return console.error('Calendar dragThenDrop option requires droppable.js');
}
if(!$view.data('zui.droppable')) {
$view.droppable($.extend({
target: '.cell-day',
selector: '.event',
flex: true,
start: function() {
that.$.addClass('event-dragging');
},
drop: function(e) {
var et = e.element.data('event'),
newDate = e.target.children('.day').attr('data-date');
if(!et || !newDate) return;
var startDate = et.start.clone();
if(startDate.toDateString() != newDate) {
newDate = new Date(newDate);
newDate.setHours(startDate.getHours());
newDate.setMinutes(startDate.getMinutes());
newDate.setSeconds(startDate.getSeconds());
if(false !== that.$.callComEvent(that, 'beforeChange', {
event: et,
change: 'start',
to: newDate
})) {
var oldEnd = et.end.clone();
et.end.addMilliseconds(et.end.getTime() - startDate.getTime());
et.start = newDate;
that.display();
that.$.callComEvent(that, 'change', {
data: that.data,
changes: [{
event: et,
changes: [{
change: 'start',
from: startDate,
to: et.start
}, {
change: 'end',
from: oldEnd,
to: et.end
}]
}]
});
}
}
},
finish: function() {
that.$.removeClass('event-dragging');
}
}, ($.isPlainObject(options.dragThenDrop)) ? options.dragThenDrop : null));
}
}
};
Calendar.prototype.getEvents = function(start, end) {
var events = {};
var calendars = this.calendars;
var addEventToDay = function(day, event, position) {
var dayId = day.toDateString();
var dayEvents = events[dayId];
if(!dayEvents) {
dayEvents = {
maxPos: -1,
events: {}
};
}
if(typeof position === 'undefined') {
for(var i = 0; i < 100; ++i) {
if(!dayEvents.events[i]) {
position = i;
break;
}
}
}
dayEvents.maxPos = Math.max(position, dayEvents.maxPos);
dayEvents.events[position] = event;
events[dayId] = dayEvents;
return position;
};
$.each(this.events, function(index, e) {
if(e.start >= start && e.start <= end) {
var position = addEventToDay(e.start, e);
if(e.days > 1) {
var placeholder = $.extend({
placeholder: true
}, e);
everyDayTo(e.start.clone().addDays(1), e.end, function(thisDay, i) {
addEventToDay(thisDay.clone(), $.extend({
holderPos: i
}, placeholder), position);
});
}
}
});
return events;
};
$.fn.calendar = function(option) {
return this.each(function() {
var $this = $(this);
var data = $this.data(NAME);
var options = typeof option == 'object' && option;
if(!data) $this.data(NAME, (data = new Calendar(this, options)));
if(typeof option == STRING_TYPE_NAME) data[option]();
});
};
$.fn.calendar.Constructor = Calendar;
}(jQuery, window));

View File

@@ -0,0 +1,6 @@
/*!
* ZUI: 日历 - v1.9.1 - 2019-05-10
* http://zui.sexy
* GitHub: https://github.com/easysoft/zui.git
* Copyright (c) 2019 cnezsoft.com; Licensed MIT
*/.calendar{margin-bottom:20px}.calendar>header{margin-bottom:10px}.calendar>header .btn-toolbar>.btn-group{margin-right:10px}.calendar>header .calendar-caption{line-height:30px}.calendar .table{margin-bottom:0;table-layout:fixed}.calendar .table>tbody>tr>td,.calendar .table>thead>tr>th{width:14.28571428571429%;padding:0}.calendar .table>thead>tr>th{color:grey;text-align:center;background-color:#fff}.calendar .weekends-empty .table>tbody>tr>td,.calendar .weekends-empty .table>thead>tr>th{width:20%}.calendar .weekends-empty .table>tbody>tr>td.weekend-day,.calendar .weekends-empty .table>thead>tr>th.weekend-head{width:40px;min-width:40px}.calendar .day{opacity:.7}.calendar .day>.heading{padding:2px 5px;text-align:right}.calendar .day>.heading>.month{padding:1px 2px;color:#fff;background-color:#b3b3b3;border-radius:3px}.calendar .day>.content{height:100%;min-height:70px}.calendar .cell-day{background-color:#f1f1f1}.calendar .cell-day.past>.day>.content{opacity:.7}.calendar .cell-day.current-month{background:0 0}.calendar .cell-day.current-month>.day{opacity:1}.calendar .cell-day.current{background-color:#fff0d5;-webkit-box-shadow:inset 1px 1px 0 grey,inset -1px -1px 0 grey;box-shadow:inset 1px 1px 0 grey,inset -1px -1px 0 grey}.calendar .cell-day.current>.day>.content{padding:0}.calendar .cell-day.current>.day>.heading{background-color:rgba(0,0,0,.1)}.calendar .cell-day.drop-to{background-color:#fff0d5;opacity:1}.calendar .event{padding:1px 5px;margin:0 1px 1px;color:#fff;cursor:pointer;background-color:#3280fc;opacity:.95;-webkit-transition:all .4s cubic-bezier(.175,.885,.32,1);-o-transition:all .4s cubic-bezier(.175,.885,.32,1);transition:all .4s cubic-bezier(.175,.885,.32,1)}a.calendar .event:hover{background-color:#0462f7}.calendar .event:hover{opacity:1}.calendar .event.drag-shadow{cursor:move}.calendar .event.drag-from{opacity:.25}.calendar .event.color-red{color:#fff;background-color:#ea644a}a.calendar .event.color-red:hover{background-color:#e53d1c}.calendar .event.color-green{color:#fff;background-color:#38b03f}a.calendar .event.color-green:hover{background-color:#2c8931}.calendar .event.color-yellow{color:#fff;background-color:#f1a325}a.calendar .event.color-yellow:hover{background-color:#d5890e}.calendar .event.color-blue{color:#fff;background-color:#03b8cf}a.calendar .event.color-blue:hover{background-color:#028b9d}.calendar .event.color-brown{color:#fff;background-color:#bd7b46}a.calendar .event.color-brown:hover{background-color:#996337}.calendar .event.color-purple{color:#fff;background-color:#8666b8}a.calendar .event.color-purple:hover{background-color:#6c4aa1}.calendar.limit-event-title .event{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
8dea4730-7315-4fa6-924c-091fde301968

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
c4e853fd-4f2b-4f62-b560-39aaeed10a01

View File

@@ -0,0 +1,472 @@
/*!
* Chosen, a Select Box Enhancer for jQuery and Prototype
* by Patrick Filler for Harvest, http://getharvest.com
*
* Copyright (c) 2011-2016 Harvest http://getharvest.com
* MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md
*/
.chosen-container {
position: relative;
display: inline-block;
font-size: 13px;
vertical-align: middle;
zoom: 1;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
*display: inline;
}
.chosen-container .chosen-drop {
position: absolute;
top: 100%;
z-index: 1010;
display: none;
width: 100%;
background: #fff;
border: 1px solid #cbcbcb;
border: 1px solid rgba(0, 0, 0, .15);
border-top: 0;
-webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
}
.chosen-container .chosen-drop.chosen-drop-size-limited {
border-top: 1px solid rgba(0, 0, 0, .15);
}
.chosen-container .chosen-drop.chosen-auto-max-width {
min-width: 100%;
border-top: 1px solid rgba(0, 0, 0, .15);
opacity: .5;
}
.chosen-container .chosen-drop.chosen-auto-max-width > .chosen-results > li {
display: inline-block;
white-space: nowrap;
}
.chosen-container .chosen-drop.chosen-auto-max-width.in {
opacity: 1;
}
.chosen-container .chosen-drop.chosen-auto-max-width.in > .chosen-results > li {
display: block;
white-space: normal;
}
.chosen-container.chosen-with-drop .chosen-drop {
display: block;
}
.chosen-container a {
cursor: pointer;
}
.chosen-container.chosen-up .chosen-drop {
top: inherit;
bottom: 100%;
margin-top: auto;
margin-bottom: -1px;
border-radius: 2px 2px 0 0;
-webkit-box-shadow: 0 -3px 5px rgba(0, 0, 0, .175);
box-shadow: 0 -3px 5px rgba(0, 0, 0, .175);
}
.chosen-container.chosen-highlight-selected .result-selected {
color: #3280fc;
background: #ebf2f9;
}
.chosen-container-single .chosen-single {
display: block;
width: 100%;
height: 32px;
padding: 5px 8px;
overflow: hidden;
line-height: 1.53846154;
color: #222;
text-decoration: none;
white-space: nowrap;
vertical-align: middle;
background-color: #fff;
-webkit-background-clip: padding-box;
background-clip: padding-box;
border: 1px solid #ccc;
border-radius: 4px;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
-webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;
-o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;
transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;
}
.chosen-container-single .chosen-default {
color: #808080;
}
.chosen-container-single .chosen-single > span {
display: block;
margin-right: 26px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.chosen-container-single .chosen-single-with-deselect span {
margin-right: 38px;
}
.chosen-container-single .chosen-single abbr {
position: absolute;
top: 7px;
right: 24px;
display: block;
width: 20px;
height: 20px;
font-size: 19.5px;
font-weight: bold;
line-height: 14px;
color: #000;
text-align: center;
text-shadow: 0 1px 0 #fff;
filter: alpha(opacity=20);
opacity: .2;
}
.chosen-container-single .chosen-single abbr:before {
content: '×';
}
.chosen-container-single .chosen-single abbr:hover,
.chosen-container-single .chosen-single abbr:focus {
color: #000;
text-decoration: none;
cursor: pointer;
filter: alpha(opacity=50);
opacity: .5;
}
.chosen-container-single .chosen-single div {
position: absolute;
top: 0;
right: 0;
display: block;
height: 100%;
padding: 5px 8px;
}
.chosen-container-single .chosen-single div b {
display: inline-block;
width: 0;
height: 0;
margin-bottom: 2px;
margin-left: 2px;
vertical-align: middle;
border-top: 4px dashed;
border-top: 4px solid \9;
border-right: 4px solid transparent;
border-left: 4px solid transparent;
}
.chosen-container-single .chosen-search {
position: relative;
z-index: 1010;
padding: 3px 4px;
margin: 0;
white-space: nowrap;
}
.chosen-container-single .chosen-search input[type="text"] {
width: 100%;
height: 27px;
padding: 2px 26px 2px 8px;
margin: 1px 0;
font-size: 12px;
line-height: 1.5;
background-color: #fff;
border: 1px solid #ccc;
border-radius: 4px;
outline: 0;
}
.chosen-container-single .chosen-search input[type="text"]:focus {
border-color: #145ccd;
}
.chosen-container-single .chosen-search:before {
position: absolute;
top: 10px;
right: 10px;
display: block;
font-family: ZenIcon;
font-size: 14px;
font-style: normal;
font-weight: normal;
font-variant: normal;
line-height: 1;
color: #808080;
text-transform: none;
content: '\e603';
speak: none;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.chosen-container-single .chosen-drop {
margin-top: -1px;
-webkit-background-clip: padding-box;
background-clip: padding-box;
border-radius: 0 0 4px 4px;
}
.chosen-container-single.chosen-container-single-nosearch .chosen-search {
position: absolute;
left: -9999px;
}
.chosen-container .chosen-results {
position: relative;
max-height: 240px;
padding: 0;
margin: 0;
overflow-x: hidden;
overflow-y: auto;
-webkit-overflow-scrolling: touch;
}
.chosen-container .chosen-results li {
display: none;
padding: 5px 10px;
margin: 0;
line-height: 15px;
list-style: none;
-webkit-transition: background-color .2s cubic-bezier(.175, .885, .32, 1);
-o-transition: background-color .2s cubic-bezier(.175, .885, .32, 1);
transition: background-color .2s cubic-bezier(.175, .885, .32, 1);
-webkit-touch-callout: none;
}
.chosen-container .chosen-results li.active-result {
display: list-item;
cursor: pointer;
}
.chosen-container .chosen-results li.disabled-result {
display: list-item;
color: #ccc;
cursor: default;
}
.chosen-container .chosen-results li.highlighted {
color: #fff;
background-color: #3280fc;
}
.chosen-container .chosen-results li.no-results {
display: list-item;
background: #f4f4f4;
}
.chosen-container .chosen-results li.group-result {
display: list-item;
font-weight: bold;
cursor: default;
}
.chosen-container .chosen-results li.group-option {
padding-left: 15px;
}
.chosen-container .chosen-results li em {
font-style: normal;
text-decoration: underline;
}
.chosen-container-multi .chosen-choices {
position: relative;
width: 100%;
min-height: 32px;
min-height: 30px \0;
padding: 0;
margin: 0;
overflow: hidden;
cursor: text;
background-color: #fff;
border: 1px solid #ccc;
border-radius: 4px;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
-webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;
-o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;
transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;
}
.chosen-container-multi .chosen-choices:before,
.chosen-container-multi .chosen-choices:after {
display: table;
content: " ";
}
.chosen-container-multi .chosen-choices:after {
clear: both;
}
.chosen-container-multi .chosen-choices li {
display: block;
float: left;
padding: 0 6px;
margin: 5px 0 0 6px;
list-style: none;
}
.chosen-container-multi .chosen-choices li.search-field {
padding: 0;
margin-bottom: 4px;
white-space: nowrap;
}
.chosen-container-multi .chosen-choices li.search-field input[type="text"] {
height: 20px;
font-size: 100%;
color: #808080;
background: transparent !important;
border: 0 !important;
border-radius: 0;
outline: 0;
-webkit-box-shadow: none;
box-shadow: none;
}
.chosen-container-multi .chosen-choices li.search-field .default {
color: #999;
}
.chosen-container-multi .chosen-choices li.search-field:before {
position: absolute;
right: 8px;
bottom: 8px;
display: block;
font-family: ZenIcon;
font-size: 14px;
font-style: normal;
font-weight: normal;
font-variant: normal;
line-height: 1;
color: #808080;
text-transform: none;
content: '\e603';
opacity: 0;
-webkit-transition: opacity .2s cubic-bezier(.175, .885, .32, 1);
-o-transition: opacity .2s cubic-bezier(.175, .885, .32, 1);
transition: opacity .2s cubic-bezier(.175, .885, .32, 1);
speak: none;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.chosen-container-multi .chosen-choices li.search-choice {
position: relative;
padding: 3px 20px 3px 5px;
line-height: 12px;
cursor: default;
background-color: #f1f1f1;
-webkit-background-clip: padding-box;
background-clip: padding-box;
border: 1px solid #ddd;
border-radius: 3px;
-webkit-box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, .05);
box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, .05);
-webkit-transition: all .4s cubic-bezier(.175, .885, .32, 1);
-o-transition: all .4s cubic-bezier(.175, .885, .32, 1);
transition: all .4s cubic-bezier(.175, .885, .32, 1);
}
.chosen-container-multi .chosen-choices li.search-choice:hover {
background-color: #fff;
border-color: #c4c4c4;
-webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, .1);
box-shadow: 0 1px 0 rgba(0, 0, 0, .1);
}
.chosen-container-multi .chosen-choices li.search-choice .search-choice-close {
position: absolute;
top: 0;
right: 0;
display: block;
width: 20px;
height: 20px;
font-size: 15.6px;
font-weight: bold;
line-height: 14px;
color: #000;
text-align: center;
text-shadow: 0 1px 0 #fff;
filter: alpha(opacity=20);
opacity: .2;
}
.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:before {
content: '×';
}
.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover,
.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:focus {
color: #000;
text-decoration: none;
cursor: pointer;
filter: alpha(opacity=50);
opacity: .5;
}
.chosen-container-multi .chosen-choices li.search-choice-disabled {
padding-right: 5px;
color: #666;
background-color: #e4e4e4;
border: 1px solid #ccc;
}
.chosen-container-multi .chosen-choices li.search-choice-focus {
background: #d4d4d4;
}
.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close {
background-position: -42px -10px;
}
.chosen-container-multi .chosen-results {
padding: 5px 0;
margin: 0;
}
.chosen-container-multi .chosen-drop .result-selected {
display: list-item;
color: #ccc;
cursor: default;
}
.chosen-container-active .chosen-single {
border-color: #145ccd;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(20, 92, 205, .6);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(20, 92, 205, .6);
}
.chosen-container-active.chosen-with-drop .chosen-single {
border: 1px solid #cbcbcb;
border: 1px solid rgba(0, 0, 0, .15);
border-bottom-right-radius: 0;
border-bottom-left-radius: 0;
-webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
}
.chosen-container-active.chosen-with-drop .chosen-single div {
background: transparent;
border-left: none;
}
.chosen-container-active.chosen-with-drop .chosen-single div b {
content: "";
border-top: 0 dotted;
border-bottom: 4px solid;
}
.chosen-container-active.chosen-with-drop.chosen-up .chosen-single {
border-top-left-radius: 0;
border-top-right-radius: 0;
border-bottom-right-radius: 4px;
border-bottom-left-radius: 4px;
-webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
}
.chosen-container-active .chosen-choices {
border-color: #145ccd;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(20, 92, 205, .6);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(20, 92, 205, .6);
}
.chosen-container-active .chosen-choices li.search-field input[type="text"] {
color: #111 !important;
}
.chosen-container-active .chosen-choices li.search-field:before {
opacity: 1;
}
.chosen-disabled {
cursor: default;
opacity: .5 !important;
}
.chosen-disabled .chosen-single {
cursor: default;
}
.chosen-disabled .chosen-choices .search-choice .search-choice-close {
cursor: default;
}
.chosen-compact.chosen-container-single .chosen-single > .chosen-search {
left: 0;
display: none;
padding: 3px 4px;
opacity: 0;
}
.chosen-compact.chosen-container-single .chosen-single > .chosen-search > input {
height: 25px;
padding: 2px 26px 2px 4px;
font-size: inherit;
}
.chosen-compact.chosen-container-single .chosen-single > .chosen-search:before {
top: 9px;
}
.chosen-compact.chosen-with-search.chosen-with-drop .chosen-single > .chosen-search {
display: block;
opacity: 1;
}

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
6a9fde46-66da-411d-9445-83a09c3b02ba

View File

@@ -0,0 +1,27 @@
/*!
* ZUI: 图标选择器 - v1.9.1 - 2019-05-10
* http://zui.sexy
* GitHub: https://github.com/easysoft/zui.git
* Copyright (c) 2019 cnezsoft.com; Licensed MIT
*/
.chosen-container.chosen-icons .chosen-results {
padding: 5px;
}
.chosen-container.chosen-icons .chosen-results li {
border-radius: 4px;
}
.chosen-container.chosen-icons .chosen-results li.group-result {
padding: 5px 0;
font-size: 12px;
color: #666;
border-radius: 0;
}
.chosen-container.chosen-icons .chosen-results li.group-option {
display: inline-block;
width: 30px;
padding: 8px;
font-size: 14px;
line-height: 14px;
text-align: center;
}

Some files were not shown because too many files have changed in this diff Show More