diff --git a/README.md b/README.md
index 27d4fe22a..0535be600 100644
--- a/README.md
+++ b/README.md
@@ -84,4 +84,4 @@
## 若依交流群
-QQ群: [](https://jq.qq.com/?_wv=1027&k=5HBAaYN) [](https://jq.qq.com/?_wv=1027&k=5cHeRVW) [](https://jq.qq.com/?_wv=1027&k=53R0L5Z) [](https://jq.qq.com/?_wv=1027&k=5g75dCU) [](https://jq.qq.com/?_wv=1027&k=58cPoHA) [](https://jq.qq.com/?_wv=1027&k=5Ofd4Pb) [](https://jq.qq.com/?_wv=1027&k=5yugASz) [](https://jq.qq.com/?_wv=1027&k=5Rf3d2P) [](https://jq.qq.com/?_wv=1027&k=5ZIjaeP) [](https://jq.qq.com/?_wv=1027&k=5CJw1jY) [](https://jq.qq.com/?_wv=1027&k=5omzbKc)
\ No newline at end of file
+QQ群: [](https://jq.qq.com/?_wv=1027&k=5HBAaYN) [](https://jq.qq.com/?_wv=1027&k=5cHeRVW) [](https://jq.qq.com/?_wv=1027&k=53R0L5Z) [](https://jq.qq.com/?_wv=1027&k=5g75dCU) [](https://jq.qq.com/?_wv=1027&k=58cPoHA) [](https://jq.qq.com/?_wv=1027&k=5Ofd4Pb) [](https://jq.qq.com/?_wv=1027&k=5yugASz) [](https://jq.qq.com/?_wv=1027&k=5Rf3d2P) [](https://jq.qq.com/?_wv=1027&k=5ZIjaeP) [](https://jq.qq.com/?_wv=1027&k=5CJw1jY) [](https://jq.qq.com/?_wv=1027&k=5omzbKc) [](https://jq.qq.com/?_wv=1027&k=qPIKBb7s)
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 5ea2133ec..1c494a23c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -16,16 +16,18 @@
UTF-8
UTF-8
1.8
+ 3.1.1
1.6.0
2.0.0
1.3.2
- 1.1.14
+ 1.1.22
1.19
2.3.2
2.9.2
1.2.5
1.2.73
- 3.9.1
+ 5.2.5
+ 5.5.0
2.5
1.3.3
3.17
@@ -40,7 +42,7 @@
org.springframework.boot
spring-boot-dependencies
- 2.1.1.RELEASE
+ 2.1.17.RELEASE
pom
import
@@ -108,6 +110,16 @@
${oshi.version}
+
+ net.java.dev.jna
+ jna
+
+
+
+ net.java.dev.jna
+ jna-platform
+
+
io.springfox
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/controller/DemoTableController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/controller/DemoTableController.java
index 3ca31e823..0af6a8d40 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/controller/DemoTableController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/controller/DemoTableController.java
@@ -214,6 +214,15 @@ public class DemoTableController extends BaseController
return prefix + "/reorder";
}
+ /**
+ * 表格列宽拖动
+ */
+ @GetMapping("/resizable")
+ public String resizable()
+ {
+ return prefix + "/resizable";
+ }
+
/**
* 表格行内编辑操作
*/
@@ -250,6 +259,15 @@ public class DemoTableController extends BaseController
return prefix + "/print";
}
+ /**
+ * 表格标题格式化
+ */
+ @GetMapping("/headerStyle")
+ public String headerStyle()
+ {
+ return prefix + "/headerStyle";
+ }
+
/**
* 表格其他操作
*/
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java
index 688c088b2..c18c860dd 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java
@@ -52,7 +52,7 @@ public class SysLogininforController extends BaseController
return getDataTable(list);
}
- @Log(title = "登陆日志", businessType = BusinessType.EXPORT)
+ @Log(title = "登录日志", businessType = BusinessType.EXPORT)
@RequiresPermissions("monitor:logininfor:export")
@PostMapping("/export")
@ResponseBody
@@ -60,11 +60,11 @@ public class SysLogininforController extends BaseController
{
List list = logininforService.selectLogininforList(logininfor);
ExcelUtil util = new ExcelUtil(SysLogininfor.class);
- return util.exportExcel(list, "登陆日志");
+ return util.exportExcel(list, "登录日志");
}
@RequiresPermissions("monitor:logininfor:remove")
- @Log(title = "登陆日志", businessType = BusinessType.DELETE)
+ @Log(title = "登录日志", businessType = BusinessType.DELETE)
@PostMapping("/remove")
@ResponseBody
public AjaxResult remove(String ids)
@@ -73,7 +73,7 @@ public class SysLogininforController extends BaseController
}
@RequiresPermissions("monitor:logininfor:remove")
- @Log(title = "登陆日志", businessType = BusinessType.CLEAN)
+ @Log(title = "登录日志", businessType = BusinessType.CLEAN)
@PostMapping("/clean")
@ResponseBody
public AjaxResult clean()
@@ -88,7 +88,7 @@ public class SysLogininforController extends BaseController
@ResponseBody
public AjaxResult unlock(String loginName)
{
- passwordService.unlock(loginName);
+ passwordService.clearLoginRecordCache(loginName);
return success();
}
}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java
index 8d17731a9..e01dc1c84 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java
@@ -76,7 +76,7 @@ public class SysUserOnlineController extends BaseController
}
if (sessionId.equals(ShiroUtils.getSessionId()))
{
- return error("当前登陆用户无法强退");
+ return error("当前登录用户无法强退");
}
onlineSessionDAO.delete(onlineSession);
online.setStatus(OnlineStatus.off_line);
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java
index 28d4bf068..030c8d6be 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java
@@ -1,12 +1,18 @@
package com.ruoyi.web.controller.system;
import java.util.List;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
import com.ruoyi.common.config.Global;
import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.utils.CookieUtils;
+import com.ruoyi.common.utils.ServletUtils;
+import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.util.ShiroUtils;
import com.ruoyi.system.domain.SysMenu;
import com.ruoyi.system.domain.SysUser;
@@ -39,18 +45,43 @@ public class SysIndexController extends BaseController
mmap.put("user", user);
mmap.put("sideTheme", configService.selectConfigByKey("sys.index.sideTheme"));
mmap.put("skinName", configService.selectConfigByKey("sys.index.skinName"));
+ mmap.put("ignoreFooter", configService.selectConfigByKey("sys.index.ignoreFooter"));
mmap.put("copyrightYear", Global.getCopyrightYear());
mmap.put("demoEnabled", Global.isDemoEnabled());
- return "index";
+
+ // 菜单导航显示风格
+ String menuStyle = configService.selectConfigByKey("sys.index.menuStyle");
+ // 移动端,默认使左侧导航菜单,否则取默认配置
+ String indexStyle = ServletUtils.checkAgentIsMobile(ServletUtils.getRequest().getHeader("User-Agent")) ? "index" : menuStyle;
+
+ // 优先Cookie配置导航菜单
+ Cookie[] cookies = ServletUtils.getRequest().getCookies();
+ for (Cookie cookie : cookies)
+ {
+ if (StringUtils.isNotEmpty(cookie.getName()) && "nav-style".equalsIgnoreCase(cookie.getName()))
+ {
+ indexStyle = cookie.getValue();
+ break;
+ }
+ }
+ String webIndex = "topnav".equalsIgnoreCase(indexStyle) ? "index-topnav" : "index";
+ return webIndex;
}
// 切换主题
@GetMapping("/system/switchSkin")
- public String switchSkin(ModelMap mmap)
+ public String switchSkin()
{
return "skin";
}
+ // 切换菜单
+ @GetMapping("/system/menuStyle/{style}")
+ public void menuStyle(@PathVariable String style, HttpServletResponse response)
+ {
+ CookieUtils.setCookie(response, "nav-style", style);
+ }
+
// 系统介绍
@GetMapping("/system/main")
public String main(ModelMap mmap)
diff --git a/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-fileinput/fileinput.css b/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-fileinput/fileinput.css
index 63a56c7af..f1cba91e6 100644
--- a/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-fileinput/fileinput.css
+++ b/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-fileinput/fileinput.css
@@ -1,11 +1,11 @@
/*!
- * bootstrap-fileinput v5.0.4
+ * bootstrap-fileinput v5.1.2
* http://plugins.krajee.com/file-input
*
* Krajee default styling for bootstrap-fileinput.
*
* Author: Kartik Visweswaran
- * Copyright: 2014 - 2019, Kartik Visweswaran, Krajee.com
+ * Copyright: 2014 - 2020, Kartik Visweswaran, Krajee.com
*
* Licensed under the BSD-3-Clause
* https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md
@@ -60,10 +60,9 @@
height: 16px;
}
-.krajee-default .file-thumb-progress .progress, .krajee-default .file-thumb-progress .progress-bar {
- height: 20px;
+.file-thumb-progress .progress, .file-thumb-progress .progress-bar {
font-family: Verdana, Helvetica, sans-serif;
- font-size: 9px;
+ font-size: 0.7rem;
}
.krajee-default .file-thumb-progress .progress, .kv-upload-progress .progress {
@@ -205,8 +204,8 @@
.krajee-default.file-preview-frame {
margin: 8px;
- border: 1px solid rgba(0,0,0,0.2);
- box-shadow: 0 0 10px 0 rgba(0,0,0,0.2);
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.2);
padding: 6px;
float: left;
text-align: center;
@@ -237,8 +236,8 @@
}
.krajee-default.file-preview-frame:not(.file-preview-error):hover {
- border: 1px solid rgba(0,0,0,0.3);
- box-shadow: 0 0 10px 0 rgba(0,0,0,0.4);
+ border: 1px solid rgba(0, 0, 0, 0.3);
+ box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.4);
}
.krajee-default .file-preview-text {
@@ -292,7 +291,6 @@
}
.krajee-default .file-thumb-progress {
- height: 11px;
top: 37px;
left: 0;
right: 0;
@@ -318,7 +316,7 @@
}
.kv-upload-progress .progress-bar {
- height: 20px;
+ height: 11px;
font-family: Verdana, Helvetica, sans-serif;
}
@@ -340,13 +338,13 @@
.file-zoom-dialog .btn-navigate {
padding: 0;
- margin: 0;
+ margin: -60px 0 0;
+ font-size: 60px;
background: transparent;
text-decoration: none;
outline: none;
opacity: 0.7;
- top: 45%;
- font-size: 4em;
+ top: 50%;
color: #1c94c4;
}
@@ -402,6 +400,7 @@
.file-drop-zone {
border: 1px dashed #aaa;
+ min-height: 260px;
border-radius: 4px;
text-align: center;
vertical-align: middle;
@@ -424,6 +423,7 @@
.file-drop-zone-title {
color: #aaa;
font-size: 1.6em;
+ text-align:center;
padding: 85px 10px;
cursor: default;
}
@@ -467,8 +467,8 @@
}
.file-zoom-content {
- height: 480px;
text-align: center;
+ min-height: 300px;
}
.file-zoom-content .file-preview-image {
@@ -532,19 +532,29 @@
padding-right: 20px;
}
-.file-sortable .file-drag-handle {
- cursor: move;
- opacity: 1;
+.clickable .file-drop-zone-title {
+ cursor: pointer;
}
.file-sortable .file-drag-handle:hover {
opacity: 0.7;
}
-.clickable .file-drop-zone-title {
- cursor: pointer;
+.file-sortable .file-drag-handle {
+ cursor: grab;
+ opacity: 1;
}
-.file-preview-initial.sortable-chosen {
+.file-grabbing, .file-grabbing * {
+ cursor: not-allowed !important;
+}
+
+.file-grabbing .file-preview-thumbnails * {
+ cursor: grabbing !important;
+}
+
+.file-preview-frame.sortable-chosen {
background-color: #d9edf7;
+ border-color: #17a2b8;
+ box-shadow: none !important;
}
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-fileinput/fileinput.js b/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-fileinput/fileinput.js
index c0723da97..0391d8399 100644
--- a/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-fileinput/fileinput.js
+++ b/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-fileinput/fileinput.js
@@ -1,26 +1,22 @@
/*!
- * bootstrap-fileinput v5.0.4
+ * bootstrap-fileinput v5.1.2
* http://plugins.krajee.com/file-input
*
* Author: Kartik Visweswaran
- * Copyright: 2014 - 2019, Kartik Visweswaran, Krajee.com
+ * Copyright: 2014 - 2020, Kartik Visweswaran, Krajee.com
*
* Licensed under the BSD-3-Clause
* https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md
*/
(function (factory) {
'use strict';
- //noinspection JSUnresolvedVariable
- if (typeof define === 'function' && define.amd) { // jshint ignore:line
- // AMD. Register as an anonymous module.
- define(['jquery'], factory); // jshint ignore:line
- } else { // noinspection JSUnresolvedVariable
- if (typeof module === 'object' && module.exports) { // jshint ignore:line
- // Node/CommonJS
- // noinspection JSUnresolvedVariable
- module.exports = factory(require('jquery')); // jshint ignore:line
+ if (typeof define === 'function' && define.amd) {
+ define(['jquery'], factory);
+ } else {
+ if (typeof module === 'object' && module.exports) {
+ //noinspection NpmUsedModulesInstalled
+ module.exports = factory(require('jquery'));
} else {
- // Browser globals
factory(window.jQuery);
}
}
@@ -41,22 +37,28 @@
return str;
};
+ if (!Array.prototype.flatMap) { // polyfill flatMap
+ Array.prototype.flatMap = function (lambda) {
+ return [].concat(this.map(lambda));
+ };
+ }
+
var $h, FileInput;
// fileinput helper object for all global variables and internal helper methods
- //noinspection JSUnresolvedVariable
$h = {
FRAMES: '.kv-preview-thumb',
SORT_CSS: 'file-sortable',
+ INIT_FLAG: 'init-',
OBJECT_PARAMS: ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n',
+ ' \n' +
+ ' \n' +
+ ' \n' +
+ ' \n' +
+ ' \n',
DEFAULT_PREVIEW: '\n' +
- '{previewFileIcon} \n' +
- '
',
+ '{previewFileIcon} \n' +
+ '',
MODAL_ID: 'kvFileinputModal',
MODAL_EVENTS: ['show', 'shown', 'hide', 'hidden', 'loaded'],
logMessages: {
@@ -65,25 +67,37 @@
badExifParser: 'Error loading the piexif.js library. {details}',
badInputType: 'The input "type" must be set to "file" for initializing the "bootstrap-fileinput" plugin.',
exifWarning: 'To avoid this warning, either set "autoOrientImage" to "false" OR ensure you have loaded ' +
- 'the "piexif.js" library correctly on your page before the "fileinput.js" script.',
+ 'the "piexif.js" library correctly on your page before the "fileinput.js" script.',
invalidChunkSize: 'Invalid upload chunk size: "{chunkSize}". Resumable uploads are disabled.',
invalidThumb: 'Invalid thumb frame with id: "{id}".',
noResumableSupport: 'The browser does not support resumable or chunk uploads.',
noUploadUrl: 'The "uploadUrl" is not set. Ajax uploads and resumable uploads have been disabled.',
- retryStatus: 'Retrying upload for chunk # {chunk} for {filename}... retry # {retry}.'
+ retryStatus: 'Retrying upload for chunk # {chunk} for {filename}... retry # {retry}.',
+ chunkQueueError: 'Could not push task to ajax pool for chunk index # {index}.',
+ resumableMaxRetriesReached: 'Maximum resumable ajax retries ({n}) reached.',
+ resumableRetryError: 'Could not retry the resumable request (try # {n})... aborting.',
+ resumableAborting: 'Aborting / cancelling the resumable request.'
+
},
objUrl: window.URL || window.webkitURL,
now: function () {
- return new Date();
+ return new Date().getTime();
},
round: function (num) {
num = parseFloat(num);
return isNaN(num) ? 0 : Math.floor(Math.round(num));
},
+ getArray: function (obj) {
+ var i, arr = [], len = obj && obj.length || 0;
+ for (i = 0; i < len; i++) {
+ arr.push(obj[i]);
+ }
+ return arr;
+ },
getFileRelativePath: function (file) {
/** @namespace file.relativePath */
/** @namespace file.webkitRelativePath */
- return String(file.relativePath || file.webkitRelativePath || $h.getFileName(file) || null);
+ return String(file.newPath || file.relativePath || file.webkitRelativePath || $h.getFileName(file) || null);
},
getFileId: function (file, generateFileId) {
@@ -99,6 +113,19 @@
}
return (file.size + '_' + relativePath.replace(/\s/img, '_'));
},
+ getFrameSelector: function (id, selector) {
+ selector = selector || '';
+ return '[id="' + id + '"]' + selector;
+ },
+ getZoomSelector: function (id, selector) {
+ return $h.getFrameSelector('zoom-' + id, selector);
+ },
+ getFrameElement: function ($element, id, selector) {
+ return $element.find($h.getFrameSelector(id, selector));
+ },
+ getZoomElement: function ($element, id, selector) {
+ return $element.find($h.getZoomSelector(id, selector));
+ },
getElapsed: function (seconds) {
var delta = seconds, out = '', result = {}, structure = {
year: 31536000,
@@ -109,7 +136,7 @@
minute: 60,
second: 1
};
- Object.keys(structure).forEach(function (key) {
+ $h.getObjectKeys(structure).forEach(function (key) {
result[key] = Math.floor(delta / structure[key]);
delta -= result[key] * structure[key];
});
@@ -168,6 +195,12 @@
div.parentNode.removeChild(div);
return status;
},
+ canOrientImage: function ($el) {
+ var $img = $(document.createElement('img')).css({width: '1px', height: '1px'}).insertAfter($el),
+ flag = $img.css('image-orientation');
+ $img.remove();
+ return !!flag;
+ },
canAssignFilesToInput: function () {
var input = document.createElement('input');
try {
@@ -196,8 +229,12 @@
$modal.appendTo($body);
}
},
+ isFunction: function (v) {
+ return typeof v === 'function';
+ },
isEmpty: function (value, trim) {
- return value === undefined || value === null || value.length === 0 || (trim && $.trim(value) === '');
+ return value === undefined || value === null || (!$h.isFunction(
+ value) && (value.length === 0 || (trim && $.trim(value) === '')));
},
isArray: function (a) {
return Array.isArray(a) || Object.prototype.toString.call(a) === '[object Array]';
@@ -279,7 +316,6 @@
(!!Blob.prototype.webkitSlice || !!Blob.prototype.mozSlice || !!Blob.prototype.slice || false);
},
dataURI2Blob: function (dataURI) {
- //noinspection JSUnresolvedVariable
var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder ||
window.MSBlobBuilder, canBlob = $h.hasBlobSupport(), byteStr, arrayBuffer, intArray, i, mimeStr, bb,
canProceed = (canBlob || BlobBuilder) && window.atob && window.ArrayBuffer && window.Uint8Array;
@@ -305,9 +341,7 @@
return bb.getBlob(mimeStr);
},
arrayBuffer2String: function (buffer) {
- //noinspection JSUnresolvedVariable
if (window.TextDecoder) {
- // noinspection JSUnresolvedFunction
return new TextDecoder('utf-8').decode(buffer);
}
var array = Array.prototype.slice.apply(new Uint8Array(buffer)), out = '', i = 0, len, c, char2, char3;
@@ -363,7 +397,7 @@
case 'ffd8ffe1':
case 'ffd8ffe2':
return 'image/jpeg';
- case '89504E47':
+ case '89504e47':
return 'image/png';
case '47494638':
return 'image/gif';
@@ -430,8 +464,92 @@
getElement: function (options, param, value) {
return ($h.isEmpty(options) || $h.isEmpty(options[param])) ? value : $(options[param]);
},
+ createElement: function (str, tag) {
+ tag = tag || 'div';
+ return $($.parseHTML('<' + tag + '>' + str + '' + tag + '>'));
+ },
uniqId: function () {
- return Math.round(new Date().getTime()) + '_' + Math.round(Math.random() * 100);
+ return (new Date().getTime() + Math.floor(Math.random() * Math.pow(10, 15))).toString(36);
+ },
+ parseEventCallback: function (str) {
+ return Function('\'use strict\'; return (function() { ' + str + ' });')(); // jshint ignore:line
+ },
+ cspBuffer: {
+ CSP_ATTRIB: 'data-csp-01928735', // a randomly named temporary attribute to store the CSP elem id
+ domEventsList: [
+ 'mousedown', 'mouseup', 'click', 'dblclick', 'mousemove', 'mouseover', 'mousewheel', 'mouseout',
+ 'contextmenu', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'keydown', 'keypress', 'keyup',
+ 'focus', 'blur', 'change', 'submit', 'scroll', 'resize', 'hashchange', 'load', 'unload',
+ 'cut', 'copy', 'paste'
+ ],
+ domElementEvents: {},
+ domElementsStyles: {},
+ stash: function (htmlString) {
+ var self = this, outerDom = $.parseHTML('' + htmlString + '
'), $el = $(outerDom);
+ $el.find('[style]').each(function (key, elem) {
+ var $elem = $(elem), styleString = $elem.attr('style'), id = $h.uniqId(), styles = {};
+ if (styleString && styleString.length) {
+ if (styleString.indexOf(';') === -1) {
+ styleString += ';';
+ }
+ styleString.slice(0, styleString.length - 1).split(';').map(function (str) {
+ str = str.split(':');
+ if (str[0]) {
+ styles[str[0]] = str[1] ? str[1] : '';
+ }
+ });
+ self.domElementsStyles[id] = styles;
+ $elem.removeAttr('style').attr(self.CSP_ATTRIB, id);
+ }
+ });
+ $el.filter('*').removeAttr('style'); // make sure all style attr are removed
+ $.each(self.domEventsList, function (key, eventName) { // handle onXXX events set as inline markup
+ var id, fn, event = 'on' + eventName, $inlineEvent = $el.find('[' + event + ']');
+ if ($inlineEvent.length) {
+ fn = $h.parseEventCallback($inlineEvent.attr(event));
+ if ($inlineEvent.attr(self.CSP_ATTRIB)) {
+ id = $inlineEvent.attr(self.CSP_ATTRIB);
+ } else {
+ id = $h.uniqId();
+ self.domElementEvents[id] = [];
+ }
+ self.domElementEvents[id].push({name: eventName + '.csp', handler: fn}); // special csp namespace
+ $inlineEvent.removeAttr(event).attr(self.CSP_ATTRIB, id);
+ }
+ });
+ var values = Object.values ? Object.values(outerDom) : Object.keys(outerDom).map(function (itm) {
+ return outerDom[itm];
+ });
+ return values.flatMap(function (elem) {
+ return elem.innerHTML;
+ }).join('');
+ },
+ apply: function (domElement) {
+ var self = this, $el = $(domElement);
+ $el.find('[' + self.CSP_ATTRIB + ']').each(function (key, elem) {
+ var $elem = $(elem), id = $elem.attr(self.CSP_ATTRIB), styles = self.domElementsStyles[id],
+ events = self.domElementEvents[id];
+ if (styles) {
+ $elem.css(styles);
+ }
+ if (events) {
+ $.each(events, function (key, event) {
+ if (event && event.name) {
+ $elem.off(event.name).on(event.name, event.handler);
+ }
+ });
+ }
+ $elem.removeAttr(self.CSP_ATTRIB);
+ });
+ self.domElementsStyles = {};
+ self.domElementEvents = {};
+ }
+ },
+ setHtml: function ($elem, htmlString) {
+ var buf = $h.cspBuffer;
+ $elem.html(buf.stash(htmlString));
+ buf.apply($elem);
+ return $elem;
},
htmlEncode: function (str, undefVal) {
if (str === undefined) {
@@ -468,18 +586,12 @@
return filePath.split(filePath.substring(sepIndex, sepIndex + 1)).pop();
},
checkFullScreen: function () {
- //noinspection JSUnresolvedVariable
return document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement ||
document.msFullscreenElement;
},
toggleFullScreen: function (maximize) {
- var doc = document, de = doc.documentElement;
- if (de && maximize && !$h.checkFullScreen()) {
- /** @namespace document.requestFullscreen */
- /** @namespace document.msRequestFullscreen */
- /** @namespace document.mozRequestFullScreen */
- /** @namespace document.webkitRequestFullscreen */
- /** @namespace Element.ALLOW_KEYBOARD_INPUT */
+ var doc = document, de = doc.documentElement, isFullScreen = $h.checkFullScreen();
+ if (de && maximize && !isFullScreen) {
if (de.requestFullscreen) {
de.requestFullscreen();
} else {
@@ -496,21 +608,19 @@
}
}
} else {
- /** @namespace document.exitFullscreen */
- /** @namespace document.msExitFullscreen */
- /** @namespace document.mozCancelFullScreen */
- /** @namespace document.webkitExitFullscreen */
- if (doc.exitFullscreen) {
- doc.exitFullscreen();
- } else {
- if (doc.msExitFullscreen) {
- doc.msExitFullscreen();
+ if (isFullScreen) {
+ if (doc.exitFullscreen) {
+ doc.exitFullscreen();
} else {
- if (doc.mozCancelFullScreen) {
- doc.mozCancelFullScreen();
+ if (doc.msExitFullscreen) {
+ doc.msExitFullscreen();
} else {
- if (doc.webkitExitFullscreen) {
- doc.webkitExitFullscreen();
+ if (doc.mozCancelFullScreen) {
+ doc.mozCancelFullScreen();
+ } else {
+ if (doc.webkitExitFullscreen) {
+ doc.webkitExitFullscreen();
+ }
}
}
}
@@ -534,13 +644,6 @@
}
return newArr;
},
- cleanZoomCache: function ($el) {
- var $cache = $el.closest('.kv-zoom-cache-theme');
- if (!$cache.length) {
- $cache = $el.closest('.kv-zoom-cache');
- }
- $cache.remove();
- },
closeButton: function (css) {
css = css ? 'close ' + css : 'close';
return '\n' +
@@ -576,6 +679,53 @@
el.style['-moz-transform'] = val;
el.style['-ms-transform'] = val;
el.style['-o-transform'] = val;
+ },
+ getObjectKeys: function (obj) {
+ var keys = [];
+ if (obj) {
+ $.each(obj, function (key) {
+ keys.push(key);
+ });
+ }
+ return keys;
+ },
+ getObjectSize: function (obj) {
+ return $h.getObjectKeys(obj).length;
+ },
+ /**
+ * Small dependency injection for the task manager
+ * https://gist.github.com/fearphage/4341799
+ */
+ whenAll: function (array) {
+ var s = [].slice, resolveValues = arguments.length === 1 && $h.isArray(array) ? array : s.call(arguments),
+ deferred = $.Deferred(), i, failed = 0, value, length = resolveValues.length,
+ remaining = length, rejectContexts, rejectValues, resolveContexts, updateFunc;
+ rejectContexts = rejectValues = resolveContexts = Array(length);
+ updateFunc = function (index, contexts, values) {
+ return function () {
+ if (values !== resolveValues) {
+ failed++;
+ }
+ deferred.notifyWith(contexts[index] = this, values[index] = s.call(arguments));
+ if (!(--remaining)) {
+ deferred[(!failed ? 'resolve' : 'reject') + 'With'](contexts, values);
+ }
+ };
+ };
+ for (i = 0; i < length; i++) {
+ if ((value = resolveValues[i]) && $.isFunction(value.promise)) {
+ value.promise()
+ .done(updateFunc(i, resolveContexts, resolveValues))
+ .fail(updateFunc(i, rejectContexts, rejectValues));
+ } else {
+ deferred.notifyWith(this, value);
+ --remaining;
+ }
+ }
+ if (!remaining) {
+ deferred.resolveWith(resolveContexts, resolveValues);
+ }
+ return deferred.promise();
}
};
FileInput = function (element, options) {
@@ -594,7 +744,7 @@
}
self.$element.removeClass('file-loading');
};
- //noinspection JSUnusedGlobalSymbols
+
FileInput.prototype = {
constructor: FileInput,
_cleanup: function () {
@@ -603,26 +753,157 @@
self.clearFileStack();
self.fileBatchCompleted = true;
self.isError = false;
+ self.isDuplicateError = false;
+ self.isPersistentError = false;
self.cancelling = false;
self.paused = false;
self.lastProgress = 0;
self._initAjax();
},
- _initAjax: function () {
+ _isAborted: function () {
var self = this;
+ return self.cancelling || self.paused;
+ },
+ _initAjax: function () {
+ var self = this, tm = self.taskManager = {
+ pool: {},
+ addPool: function (id) {
+ return (tm.pool[id] = new tm.TasksPool(id));
+ },
+ getPool: function (id) {
+ return tm.pool[id];
+ },
+ addTask: function (id, logic) { // add standalone task directly from task manager
+ return new tm.Task(id, logic);
+ },
+ TasksPool: function (id) {
+ var tp = this;
+ tp.id = id;
+ tp.cancelled = false;
+ tp.cancelledDeferrer = $.Deferred();
+ tp.tasks = {};
+ tp.addTask = function (id, logic) {
+ return (tp.tasks[id] = new tm.Task(id, logic));
+ };
+ tp.size = function () {
+ return $h.getObjectSize(tp.tasks);
+ };
+ tp.run = function (maxThreads) {
+ var i = 0, failed = false, task, tasksList = $h.getObjectKeys(tp.tasks).map(function (key) {
+ return tp.tasks[key];
+ }), tasksDone = [], deferred = $.Deferred(), enqueue, callback;
+
+ if (tp.cancelled) {
+ tp.cancelledDeferrer.resolve();
+ return deferred.reject();
+ }
+ // if run all at once
+ if (!maxThreads) {
+ var tasksDeferredList = $h.getObjectKeys(tp.tasks).map(function (key) {
+ return tp.tasks[key].deferred;
+ });
+ // when all are done
+ $h.whenAll(tasksDeferredList).done(function () {
+ var argv = $h.getArray(arguments);
+ if (!tp.cancelled) {
+ deferred.resolve.apply(null, argv);
+ tp.cancelledDeferrer.reject();
+ } else {
+ deferred.reject.apply(null, argv);
+ tp.cancelledDeferrer.resolve();
+ }
+ }).fail(function () {
+ var argv = $h.getArray(arguments);
+ deferred.reject.apply(null, argv);
+ if (!tp.cancelled) {
+ tp.cancelledDeferrer.reject();
+ } else {
+ tp.cancelledDeferrer.resolve();
+ }
+ });
+ // run all tasks
+ $.each(tp.tasks, function (id) {
+ task = tp.tasks[id];
+ task.run();
+ });
+ return deferred;
+ }
+ enqueue = function (task) {
+ $.when(task.deferred)
+ .fail(function () {
+ failed = true;
+ callback.apply(null, arguments);
+ })
+ .always(callback);
+ };
+ callback = function () {
+ var argv = $h.getArray(arguments);
+ // notify a task just ended
+ deferred.notify(argv);
+ tasksDone.push(argv);
+ if (tp.cancelled) {
+ deferred.reject.apply(null, tasksDone);
+ tp.cancelledDeferrer.resolve();
+ return;
+ }
+ if (tasksDone.length === tp.size()) {
+ if (failed) {
+ deferred.reject.apply(null, tasksDone);
+ } else {
+ deferred.resolve.apply(null, tasksDone);
+ }
+ }
+ // if there are any tasks remaining
+ if (tasksList.length) {
+ task = tasksList.shift();
+ enqueue(task);
+ task.run();
+ }
+ };
+ // run the first "maxThreads" tasks
+ while (tasksList.length && i++ < maxThreads) {
+ task = tasksList.shift();
+ enqueue(task);
+ task.run();
+ }
+ return deferred;
+ };
+ tp.cancel = function () {
+ tp.cancelled = true;
+ return tp.cancelledDeferrer;
+ };
+ },
+ Task: function (id, logic) {
+ var tk = this;
+ tk.id = id;
+ tk.deferred = $.Deferred();
+ tk.logic = logic;
+ tk.context = null;
+ tk.run = function () {
+ var argv = $h.getArray(arguments);
+ argv.unshift(tk.deferred); // add deferrer as first argument
+ logic.apply(tk.context, argv); // run task
+ return tk.deferred; // return deferrer
+ };
+ tk.runWithContext = function (context) {
+ tk.context = context;
+ return tk.run();
+ };
+ }
+ };
self.ajaxQueue = [];
self.ajaxRequests = [];
- self.ajaxQueueIntervalId = null;
- self.ajaxCurrentThreads = 0;
self.ajaxAborted = false;
},
_init: function (options, refreshMode) {
var self = this, f, $el = self.$element, $cont, t, tmp;
self.options = options;
+ self.canOrientImage = $h.canOrientImage($el);
$.each(options, function (key, value) {
switch (key) {
case 'minFileCount':
case 'maxFileCount':
+ case 'maxTotalFileCount':
case 'minFileSize':
case 'maxFileSize':
case 'maxFilePreviewSize':
@@ -642,6 +923,9 @@
break;
}
});
+ if (self.maxTotalFileCount > 0 && self.maxTotalFileCount < self.maxFileCount) {
+ self.maxTotalFileCount = self.maxFileCount;
+ }
if (self.rtl) { // swap buttons for rtl
tmp = self.previewZoomButtonIcons.prev;
self.previewZoomButtonIcons.prev = self.previewZoomButtonIcons.next;
@@ -661,6 +945,7 @@
if (!refreshMode) {
self._cleanup();
}
+ self.duplicateErrors = [];
self.$form = $el.closest('form');
self._initTemplateDefaults();
self.uploadFileAttr = !$h.isEmpty($el.attr('name')) ? $el.attr('name') : 'file_data';
@@ -719,8 +1004,9 @@
$h.addCss(self.$errorContainer, self.msgErrorClass);
}
if (!refreshMode) {
+ self._resetErrors();
self.$errorContainer.hide();
- self.previewInitId = 'preview-' + $h.uniqId();
+ self.previewInitId = 'thumb-' + $el.attr('id');
self._initPreviewCache();
self._initPreview(true);
self._initPreviewActions();
@@ -744,9 +1030,10 @@
},
_initFileManager: function () {
var self = this;
+ self.uploadStartTime = $h.now();
self.fileManager = {
stack: {},
- processed: [],
+ filesProcessed: [],
errors: [],
loadedImages: {},
totalImages: 0,
@@ -755,7 +1042,7 @@
uploadedSize: 0,
stats: {},
initStats: function (id) {
- var data = {started: $h.now().getTime()};
+ var data = {started: $h.now()};
if (id) {
self.fileManager.stats[id] = data;
} else {
@@ -763,11 +1050,9 @@
}
},
getUploadStats: function (id, loaded, total) {
- var fm = self.fileManager, started = id ? fm.stats[id] && fm.stats[id].started || null : null;
- if (!started) {
- started = $h.now().getTime();
- }
- var elapsed = ($h.now().getTime() - started) / 1000,
+ var fm = self.fileManager,
+ started = id ? fm.stats[id] && fm.stats[id].started || $h.now() : self.uploadStartTime;
+ var elapsed = ($h.now() - started) / 1000,
speeds = ['B/s', 'KB/s', 'MB/s', 'GB/s', 'TB/s', 'PB/s', 'EB/s', 'ZB/s', 'YB/s'],
bps = elapsed ? loaded / elapsed : 0, bitrate = self._getSize(bps, speeds),
pendingBytes = total - loaded,
@@ -864,25 +1149,27 @@
return files;
},
isPending: function (id) {
- return $.inArray(id, self.fileManager.processed) === -1 && self.fileManager.exists(id);
+ return $.inArray(id, self.fileManager.filesProcessed) === -1 && self.fileManager.exists(id);
},
isProcessed: function () {
- var processed = true, fm = self.fileManager;
+ var filesProcessed = true, fm = self.fileManager;
$.each(fm.stack, function (id) {
if (fm.isPending(id)) {
- processed = false;
+ filesProcessed = false;
}
});
- return processed;
+ return filesProcessed;
},
clear: function () {
var fm = self.fileManager;
+ self.isDuplicateError = false;
+ self.isPersistentError = false;
fm.totalFiles = null;
fm.totalSize = null;
fm.uploadedSize = 0;
fm.stack = {};
fm.errors = [];
- fm.processed = [];
+ fm.filesProcessed = [];
fm.stats = {};
fm.clearImages();
},
@@ -897,7 +1184,7 @@
delete self.fileManager.loadedImages[id];
},
getImageIdList: function () {
- return Object.keys(self.fileManager.loadedImages);
+ return $h.getObjectKeys(self.fileManager.loadedImages);
},
getImageCount: function () {
return self.fileManager.getImageIdList().length;
@@ -911,8 +1198,9 @@
getThumb: function (id) {
var $thumb = null;
self._getThumbs().each(function () {
- if ($(this).attr('data-fileid') === id) {
- $thumb = $(this);
+ var $t = $(this);
+ if ($t.attr('data-fileid') === id) {
+ $thumb = $t;
}
});
return $thumb;
@@ -922,7 +1210,7 @@
return self.fileManager.getIndex(id);
},
getIdList: function () {
- return Object.keys(self.fileManager.stack);
+ return $h.getObjectKeys(self.fileManager.stack);
},
getFile: function (id) {
return self.fileManager.stack[id] || null;
@@ -946,14 +1234,14 @@
}
},
setProcessed: function (id) {
- self.fileManager.processed.push(id);
+ self.fileManager.filesProcessed.push(id);
},
getProgress: function () {
- var total = self.fileManager.total(), processed = self.fileManager.processed.length;
+ var total = self.fileManager.total(), filesProcessed = self.fileManager.filesProcessed.length;
if (!total) {
return 0;
}
- return Math.ceil(processed / total * 100);
+ return Math.ceil(filesProcessed / total * 100);
},
setProgress: function (id, pct) {
@@ -976,7 +1264,7 @@
});
},
_initResumableUpload: function () {
- var self = this, opts = self.resumableUploadOptions, logs = $h.logMessages;
+ var self = this, opts = self.resumableUploadOptions, logs = $h.logMessages, rm, fm = self.fileManager;
if (!self.enableResumableUpload) {
return;
}
@@ -1002,20 +1290,16 @@
self.enableResumableUpload = false;
return;
}
- self.resumableManager = {
+ rm = self.resumableManager = {
init: function (id, f, index) {
- var rm = self.resumableManager, fm = self.fileManager;
- rm.currThreads = 0;
rm.logs = [];
rm.stack = [];
rm.error = '';
- rm.chunkIntervalId = null;
rm.id = id;
rm.file = f.file;
rm.fileName = f.name;
rm.fileIndex = index;
rm.completed = false;
- rm.testing = false;
rm.lastProgress = 0;
if (self.showPreview) {
rm.$thumb = fm.getThumb(id) || null;
@@ -1025,11 +1309,17 @@
rm.$btnDelete = rm.$thumb.find('.kv-file-remove');
}
}
- rm.chunkSize = self.resumableUploadOptions.chunkSize * 1024;
+ rm.chunkSize = opts.chunkSize * 1024;
rm.chunkCount = rm.getTotalChunks();
},
- logAjaxError: function (jqXHR, textStatus, errorThrown) {
- if (self.resumableUploadOptions.showErrorLog) {
+ setAjaxError: function (jqXHR, textStatus, errorThrown, isTest) {
+ if (jqXHR.responseJSON && jqXHR.responseJSON.error) {
+ errorThrown = jqXHR.responseJSON.error.toString();
+ }
+ if (!isTest) {
+ rm.error = errorThrown;
+ }
+ if (opts.showErrorLog) {
self._log(logs.ajaxError, {
status: jqXHR.status,
error: errorThrown,
@@ -1038,46 +1328,47 @@
}
},
reset: function () {
- var rm = self.resumableManager;
- rm.processed = {};
+ rm.stack = [];
+ rm.chunksProcessed = {};
},
setProcessed: function (status) {
- var rm = self.resumableManager, fm = self.fileManager, id = rm.id, msg,
- $thumb = rm.$thumb, $prog = rm.$progress, hasThumb = $thumb && $thumb.length,
+ var id = rm.id, msg, $thumb = rm.$thumb, $prog = rm.$progress, hasThumb = $thumb && $thumb.length,
params = {id: hasThumb ? $thumb.attr('id') : '', index: fm.getIndex(id), fileId: id};
rm.completed = true;
rm.lastProgress = 0;
- fm.uploadedSize += rm.file.size;
if (hasThumb) {
$thumb.removeClass('file-uploading');
}
if (status === 'success') {
+ fm.uploadedSize += rm.file.size;
if (self.showPreview) {
self._setProgress(101, $prog);
self._setThumbStatus($thumb, 'Success');
- self._initUploadSuccess(rm.processed[id].data, $thumb);
+ self._initUploadSuccess(rm.chunksProcessed[id].data, $thumb);
}
- self.fileManager.removeFile(id);
- delete rm.processed[id];
+ fm.removeFile(id);
+ delete rm.chunksProcessed[id];
self._raise('fileuploaded', [params.id, params.index, params.fileId]);
if (fm.isProcessed()) {
self._setProgress(101);
}
} else {
- if (self.showPreview) {
- self._setThumbStatus($thumb, 'Error');
- self._setPreviewError($thumb, true);
- self._setProgress(101, $prog, self.msgProgressError);
- self._setProgress(101, self.$progress, self.msgProgressError);
- self.cancelling = true;
- }
- if (!self.$errorContainer.find('li[data-file-id="' + params.fileId + '"]').length) {
- msg = self.msgResumableUploadRetriesExceeded.setTokens({
- file: rm.fileName,
- max: self.resumableUploadOptions.maxRetries,
- error: rm.error
- });
- self._showFileError(msg, params);
+ if (status !== 'cancel') {
+ if (self.showPreview) {
+ self._setThumbStatus($thumb, 'Error');
+ self._setPreviewError($thumb, true);
+ self._setProgress(101, $prog, self.msgProgressError);
+ self._setProgress(101, self.$progress, self.msgProgressError);
+ self.cancelling = true;
+ }
+ if (!self.$errorContainer.find('li[data-file-id="' + params.fileId + '"]').length) {
+ msg = self.msgResumableUploadRetriesExceeded.setTokens({
+ file: rm.fileName,
+ max: opts.maxRetries,
+ error: rm.error
+ });
+ self._showFileError(msg, params);
+ }
}
}
if (fm.isProcessed()) {
@@ -1085,20 +1376,16 @@
}
},
check: function () {
- var rm = self.resumableManager, status = true;
+ var status = true;
$.each(rm.logs, function (index, value) {
if (!value) {
status = false;
return false;
}
});
- if (status) {
- clearInterval(rm.chunkIntervalId);
- rm.setProcessed('success');
- }
},
processedResumables: function () {
- var logs = self.resumableManager.logs, i, count = 0;
+ var logs = rm.logs, i, count = 0;
if (!logs || !logs.length) {
return 0;
}
@@ -1110,32 +1397,31 @@
return count;
},
getUploadedSize: function () {
- var rm = self.resumableManager, size = rm.processedResumables() * rm.chunkSize;
+ var size = rm.processedResumables() * rm.chunkSize;
return size > rm.file.size ? rm.file.size : size;
},
getTotalChunks: function () {
- var rm = self.resumableManager, chunkSize = parseFloat(rm.chunkSize);
+ var chunkSize = parseFloat(rm.chunkSize);
if (!isNaN(chunkSize) && chunkSize > 0) {
return Math.ceil(rm.file.size / chunkSize);
}
return 0;
},
getProgress: function () {
- var rm = self.resumableManager, processed = rm.processedResumables(), total = rm.chunkCount;
+ var chunksProcessed = rm.processedResumables(), total = rm.chunkCount;
if (total === 0) {
return 0;
}
- return Math.ceil(processed / total * 100);
+ return Math.ceil(chunksProcessed / total * 100);
},
checkAborted: function (intervalId) {
- if (self.paused || self.cancelling) {
+ if (self._isAborted()) {
clearInterval(intervalId);
self.unlock();
}
},
upload: function () {
- var rm = self.resumableManager, fm = self.fileManager, ids = fm.getIdList(), flag = 'new',
- intervalId;
+ var ids = fm.getIdList(), flag = 'new', intervalId;
intervalId = setInterval(function () {
var id;
rm.checkAborted(intervalId);
@@ -1146,8 +1432,7 @@
fm.initStats(id);
if (fm.stack[id]) {
rm.init(id, fm.stack[id], fm.getIndex(id));
- rm.testUpload();
- rm.uploadResumable();
+ rm.processUpload();
}
}
if (!fm.isPending(id) && rm.completed) {
@@ -1180,23 +1465,28 @@
}, self.processDelay);
},
uploadResumable: function () {
- var i, rm = self.resumableManager, total = rm.chunkCount;
+ var i, pool, tm = self.taskManager, total = rm.chunkCount;
+ pool = tm.addPool(rm.id);
for (i = 0; i < total; i++) {
- rm.logs[i] = !!(rm.processed[rm.id] && rm.processed[rm.id][i]);
+ rm.logs[i] = !!(rm.chunksProcessed[rm.id] && rm.chunksProcessed[rm.id][i]);
+ if (!rm.logs[i]) {
+ rm.pushAjax(i, 0);
+ }
}
- for (i = 0; i < total; i++) {
- rm.pushAjax(i, 0);
- }
- rm.chunkIntervalId = setInterval(rm.loopAjax, self.queueDelay);
+ pool.run(opts.maxThreads)
+ .done(function () {
+ rm.setProcessed('success');
+ })
+ .fail(function () {
+ rm.setProcessed(pool.cancelled ? 'cancel' : 'error');
+ });
},
- testUpload: function () {
- var rm = self.resumableManager, opts = self.resumableUploadOptions, fd, f,
- fm = self.fileManager, id = rm.id, fnBefore, fnSuccess, fnError, fnComplete, outData;
+ processUpload: function () {
+ var fd, f, id = rm.id, fnBefore, fnSuccess, fnError, fnComplete, outData;
if (!opts.testUrl) {
- rm.testing = false;
+ rm.uploadResumable();
return;
}
- rm.testing = true;
fd = new FormData();
f = fm.stack[id];
self._setUploadData(fd, {
@@ -1218,42 +1508,58 @@
if (!data[chunksUploaded] || !$h.isArray(data[chunksUploaded])) {
self._raise('filetesterror', params);
} else {
- if (!rm.processed[id]) {
- rm.processed[id] = {};
+ if (!rm.chunksProcessed[id]) {
+ rm.chunksProcessed[id] = {};
}
$.each(data[chunksUploaded], function (key, index) {
rm.logs[index] = true;
- rm.processed[id][index] = true;
+ rm.chunksProcessed[id][index] = true;
});
- rm.processed[id].data = data;
+ rm.chunksProcessed[id].data = data;
self._raise('filetestsuccess', params);
}
- rm.testing = false;
+ rm.uploadResumable();
};
fnError = function (jqXHR, textStatus, errorThrown) {
outData = self._getOutData(fd, jqXHR);
self._raise('filetestajaxerror', [id, fm, rm, outData]);
- rm.logAjaxError(jqXHR, textStatus, errorThrown);
- rm.testing = false;
+ rm.setAjaxError(jqXHR, textStatus, errorThrown, true);
+ rm.uploadResumable();
};
fnComplete = function () {
self._raise('filetestcomplete', [id, fm, rm, self._getOutData(fd)]);
- rm.testing = false;
};
self._ajaxSubmit(fnBefore, fnSuccess, fnComplete, fnError, fd, id, rm.fileIndex, opts.testUrl);
},
pushAjax: function (index, retry) {
- self.resumableManager.stack.push([index, retry]);
+ var tm = self.taskManager, pool = tm.getPool(rm.id);
+ pool.addTask(pool.size() + 1, function (deferrer) {
+ // use fifo chunk stack
+ var arr = rm.stack.shift(), index;
+ index = arr[0];
+ if (!rm.chunksProcessed[rm.id] || !rm.chunksProcessed[rm.id][index]) {
+ rm.sendAjax(index, arr[1], deferrer);
+ } else {
+ self._log(logs.chunkQueueError, {index: index});
+ }
+ });
+ rm.stack.push([index, retry]);
},
- sendAjax: function (index, retry) {
- var fm = self.fileManager, rm = self.resumableManager, opts = self.resumableUploadOptions, f,
- chunkSize = rm.chunkSize, id = rm.id, file = rm.file, $thumb = rm.$thumb,
- $btnDelete = rm.$btnDelete;
- if (rm.processed[id] && rm.processed[id][index]) {
+ sendAjax: function (index, retry, deferrer) {
+ var f, chunkSize = rm.chunkSize, id = rm.id, file = rm.file, $thumb = rm.$thumb,
+ msgs = $h.logMessages, $btnDelete = rm.$btnDelete, logError = function (msg, tokens) {
+ if (tokens) {
+ msg = msg.setTokens(tokens);
+ }
+ msg = 'Error processing resumable ajax request. ' + msg;
+ self._log(msg);
+ deferrer.reject(msg);
+ };
+ if (rm.chunksProcessed[id] && rm.chunksProcessed[id][index]) {
return;
}
- rm.currThreads++;
if (retry > opts.maxRetries) {
+ logError(msgs.resumableMaxRetriesReached, {n: opts.maxRetries});
rm.setProcessed('error');
return;
}
@@ -1289,10 +1595,13 @@
self._raise('filechunkbeforesend', [id, index, retry, fm, rm, outData]);
};
fnSuccess = function (data, textStatus, jqXHR) {
+ if (self._isAborted()) {
+ logError(msgs.resumableAborting);
+ return;
+ }
outData = self._getOutData(fd, jqXHR, data);
var paramNames = self.uploadParamNames, chunkIndex = paramNames.chunkIndex || 'chunkIndex',
- opts = self.resumableUploadOptions, params = [id, index, retry, fm, rm, outData];
- rm.currThreads--;
+ params = [id, index, retry, fm, rm, outData];
if (data.error) {
if (opts.showErrorLog) {
self._log(logs.retryStatus, {
@@ -1306,47 +1615,36 @@
self._raise('filechunkerror', params);
} else {
rm.logs[data[chunkIndex]] = true;
- if (!rm.processed[id]) {
- rm.processed[id] = {};
+ if (!rm.chunksProcessed[id]) {
+ rm.chunksProcessed[id] = {};
}
- rm.processed[id][data[chunkIndex]] = true;
- rm.processed[id].data = data;
+ rm.chunksProcessed[id][data[chunkIndex]] = true;
+ rm.chunksProcessed[id].data = data;
+ deferrer.resolve.call(null, data);
self._raise('filechunksuccess', params);
rm.check();
}
};
fnError = function (jqXHR, textStatus, errorThrown) {
+ if (self._isAborted()) {
+ logError(msgs.resumableAborting);
+ return;
+ }
outData = self._getOutData(fd, jqXHR);
- rm.currThreads--;
- rm.error = errorThrown;
- rm.logAjaxError(jqXHR, textStatus, errorThrown);
+ rm.setAjaxError(jqXHR, textStatus, errorThrown);
self._raise('filechunkajaxerror', [id, index, retry, fm, rm, outData]);
- rm.pushAjax(index, retry + 1);
+ rm.pushAjax(index, retry + 1); // push another task
+ logError(msgs.resumableRetryError, {n: retry - 1}); // resolve the current task
};
fnComplete = function () {
- self._raise('filechunkcomplete', [id, index, retry, fm, rm, self._getOutData(fd)]);
+ if (!self._isAborted()) {
+ self._raise('filechunkcomplete', [id, index, retry, fm, rm, self._getOutData(fd)]);
+ }
};
self._ajaxSubmit(fnBefore, fnSuccess, fnComplete, fnError, fd, id, rm.fileIndex);
- },
- loopAjax: function () {
- var rm = self.resumableManager;
- if (rm.currThreads < self.resumableUploadOptions.maxThreads && !rm.testing) {
- var arr = rm.stack.shift(), index;
- if (typeof arr !== 'undefined') {
- index = arr[0];
- if (!rm.processed[rm.id] || !rm.processed[rm.id][index]) {
- rm.sendAjax(index, arr[1]);
- } else {
- if (rm.processedResumables() >= rm.getTotalChunks()) {
- rm.setProcessed('success');
- clearInterval(rm.chunkIntervalId);
- }
- }
- }
- }
}
};
- self.resumableManager.reset();
+ rm.reset();
},
_initTemplateDefaults: function () {
var self = this, tMain1, tMain2, tPreview, tFileIcon, tClose, tCaption, tBtnDefault, tBtnLink, tBtnBrowse,
@@ -1369,14 +1667,13 @@
tMain2 = '{preview}\n
\n
\n' +
'{remove}\n{cancel}\n{upload}\n{browse}\n';
tPreview = '\n' +
- ' {close}' +
- '
\n' +
- '
\n' +
+ ' {close}' +
+ '
\n' +
+ '
\n' +
'
\n' +
- '
' +
'
\n' +
'
\n' +
- '
\n' +
+ '
\n' +
'
';
tClose = $h.closeButton('fileinput-remove');
tFileIcon = '
';
@@ -1388,7 +1685,7 @@
//noinspection HtmlUnknownAttribute
tBtnDefault = '
{icon} {label} ';
- //noinspection HtmlUnknownAttribute
+ //noinspection HtmlUnknownTarget,HtmlUnknownAttribute
tBtnLink = '
{icon} {label} ';
//noinspection HtmlUnknownAttribute
tBtnBrowse = '
{icon} {label}
';
@@ -1447,7 +1744,7 @@
' data-fileid="{fileid}" data-template="{template}"';
tTagBef1 = tTagBef + '>
\n';
tTagBef2 = tTagBef + ' title="{caption}">
\n';
- tTagAft = '
{footer}\n
\n';
+ tTagAft = '
{footer}\n{zoomCache}\n';
tGeneric = '{content}\n';
tStyle = ' {style}';
tHtml = '{data}
\n';
@@ -1531,7 +1828,7 @@
audio: {width: '100%', height: '30px'},
flash: {width: '213px', height: '160px'},
object: {width: '213px', height: '160px'},
- pdf: {width: '100%', height: '160px'},
+ pdf: {width: '100%', height: '160px', 'position': 'relative'},
other: {width: '213px', height: '160px'}
},
previewSettingsSmall: {
@@ -1639,7 +1936,7 @@
indicatorNewTitle: 'Not uploaded yet',
indicatorSuccessTitle: 'Uploaded',
indicatorErrorTitle: 'Upload Error',
- indicatorLoadingTitle: 'Uploading ...',
+ indicatorLoadingTitle: 'Uploading …',
indicatorPausedTitle: 'Upload Paused'
}
};
@@ -1697,15 +1994,16 @@
return self.previewCache.data.content.length;
},
get: function (i, isDisabled) {
- var ind = 'init_' + i, data = self.previewCache.data, config = data.config[i], fileId,
- content = data.content[i], previewId = self.previewInitId + '-' + ind, out, $tmp, cat, ftr,
+ var ind = $h.INIT_FLAG + i, data = self.previewCache.data, config = data.config[i],
+ content = data.content[i], out, $tmp, cat, ftr,
fname, ftype, frameClass, asData = $h.ifSet('previewAsData', config, self.initialPreviewAsData),
a = config ? {title: config.title || null, alt: config.alt || null} : {title: null, alt: null},
- parseTemplate = function (cat, dat, fn, ft, id, ftr, ind, fc, t) {
- fc = ' file-preview-initial ' + $h.SORT_CSS + (fc ? ' ' + fc : '');
+ parseTemplate = function (cat, dat, fname, ftype, ftr, ind, fclass, t) {
+ var fc = ' file-preview-initial ' + $h.SORT_CSS + (fclass ? ' ' + fclass : ''),
+ id = self.previewInitId + '-' + ind,
+ fileId = config && config.fileId || id;
/** @namespace config.zoomData */
- fileId = config && config.fileId || 'file_' + id;
- return self._generatePreviewTemplate(cat, dat, fn, ft, id, fileId, false, null, fc,
+ return self._generatePreviewTemplate(cat, dat, fname, ftype, id, fileId, false, null, fc,
ftr, ind, t, a, config && config.zoomData || dat);
};
if (!content || !content.length) {
@@ -1718,9 +2016,9 @@
ftr = self.previewCache.footer(i, isDisabled, (config && config.size || null));
frameClass = $h.ifSet('frameClass', config);
if (asData) {
- out = parseTemplate(cat, content, fname, ftype, previewId, ftr, ind, frameClass);
+ out = parseTemplate(cat, content, fname, ftype, ftr, ind, frameClass);
} else {
- out = parseTemplate('generic', content, fname, ftype, previewId, ftr, ind, frameClass, cat)
+ out = parseTemplate('generic', content, fname, ftype, ftr, ind, frameClass, cat)
.setTokens({'content': data.content[i]});
}
if (data.tags.length && data.tags[i]) {
@@ -1728,7 +2026,7 @@
}
/** @namespace config.frameAttr */
if (!$h.isEmpty(config) && !$h.isEmpty(config.frameAttr)) {
- $tmp = $(document.createElement('div')).html(out);
+ $tmp = $h.createElement(out);
$tmp.find('.file-preview-initial').attr(config.frameAttr);
out = $tmp.html();
$tmp.remove();
@@ -1742,14 +2040,15 @@
self.previewCache.data = data;
},
add: function (content, config, tags, append) {
- var data = self.previewCache.data, index = content.length - 1;
+ var data = self.previewCache.data, index;
if (!content || !content.length) {
- return index;
+ return 0;
}
+ index = content.length - 1;
if (!$h.isArray(content)) {
content = content.split(self.initialPreviewDelimiter);
}
- if (append) {
+ if (append && data.content) {
index = data.content.push(content[0]) - 1;
data.config[index] = config;
data.tags[index] = tags;
@@ -1857,7 +2156,7 @@
dUrl = config.downloadUrl || downloadInitialUrl,
dFil = config.filename || config.caption || '',
initPreviewShowDwl = !!(dUrl),
- sDel = $h.ifSet('showRemove', config, $h.ifSet('showRemove', fs, initPreviewShowDel)),
+ sDel = $h.ifSet('showRemove', config, initPreviewShowDel),
sDwl = $h.ifSet('showDownload', config, $h.ifSet('showDownload', fs, initPreviewShowDwl)),
sZm = $h.ifSet('showZoom', config, $h.ifSet('showZoom', fs, true)),
sDrg = $h.ifSet('showDrag', config, $h.ifSet('showDrag', fs, true)),
@@ -1894,14 +2193,17 @@
},
_log: function (msg, tokens) {
var self = this, id = self.$element.attr('id');
+ if (!self.showConsoleLogs) {
+ return;
+ }
if (id) {
msg = '"' + id + '": ' + msg;
}
msg = 'bootstrap-fileinput: ' + msg;
if (typeof tokens === 'object') {
- msg.setTokens(tokens);
+ msg = msg.setTokens(tokens);
}
- if (typeof window.console.log !== 'undefined') {
+ if (window.console && typeof window.console.log !== 'undefined') {
window.console.log(msg);
} else {
window.alert(msg);
@@ -1919,7 +2221,7 @@
if ($errList.length) {
return true;
}
- $err = $(document.createElement('div')).html(self.$errorContainer.html());
+ $err = $h.createElement(self.$errorContainer.html());
$err.find('.kv-error-close').remove();
$err.find('ul').remove();
return !!$.trim($err.text()).length;
@@ -1952,7 +2254,7 @@
_addError: function (msg) {
var self = this, $error = self.$errorContainer;
if (msg && $error.length) {
- $error.html(self.errorCloseButton + msg);
+ $h.setHtml($error, self.errorCloseButton + msg);
self._handler($error.find('.kv-error-close'), 'click', function () {
setTimeout(function () {
if (self.showPreview && !self.getFrames().length) {
@@ -1971,6 +2273,9 @@
},
_resetErrors: function (fade) {
var self = this, $error = self.$errorContainer;
+ if (self.isPersistentError) {
+ return;
+ }
self.isError = false;
self.$container.removeClass('has-error');
self.$captionContainer.removeClass('is-invalid');
@@ -1992,19 +2297,20 @@
msg = self.msgFoldersNotAllowed.replace('{n}', folders);
self._addError(msg);
self._setValidationError();
- $error.fadeIn(800);
+ $error.fadeIn(self.fadeDelay);
self._raise('filefoldererror', [folders, msg]);
},
_showFileError: function (msg, params, event) {
var self = this, $error = self.$errorContainer, ev = event || 'fileuploaderror',
fId = params && params.fileId || '', e = params && params.id ?
'' + msg + ' ' : '' + msg + ' ';
+
if ($error.find('ul').length === 0) {
self._addError('');
} else {
$error.find('ul').append(e);
}
- $error.fadeIn(800);
+ $error.fadeIn(self.fadeDelay);
self._raise(ev, [params, msg]);
self._setValidationError('file-input-new');
return true;
@@ -2014,7 +2320,7 @@
params = params || {};
params.reader = self.reader;
self._addError(msg);
- $error.fadeIn(800);
+ $error.fadeIn(self.fadeDelay);
self._raise(ev, [params, msg]);
if (!self.isAjaxUpload) {
self._clearFileInput();
@@ -2027,26 +2333,35 @@
var self = this, label = self.minFileCount > 1 ? self.filePlural : self.fileSingle,
msg = self.msgFilesTooLess.replace('{n}', self.minFileCount).replace('{files}', label),
$error = self.$errorContainer;
- self._addError(msg);
+ msg = '' + msg + ' ';
+ if ($error.find('ul').length === 0) {
+ self._addError('');
+ } else {
+ $error.find('ul').append(msg);
+ }
self.isError = true;
self._updateFileDetails(0);
- $error.fadeIn(800);
+ $error.fadeIn(self.fadeDelay);
self._raise('fileerror', [params, msg]);
self._clearFileInput();
self._setValidationError();
},
_parseError: function (operation, jqXHR, errorThrown, fileName) {
/** @namespace jqXHR.responseJSON */
- var self = this, errMsg = $.trim(errorThrown + ''), textPre,
- text = jqXHR.responseJSON !== undefined && jqXHR.responseJSON.error !== undefined ?
- jqXHR.responseJSON.error : jqXHR.responseText;
+ var self = this, errMsg = $.trim(errorThrown + ''), textPre, errText, text;
+ errText = jqXHR.responseJSON && jqXHR.responseJSON.error ? jqXHR.responseJSON.error.toString() : '';
+ text = errText ? errText : jqXHR.responseText;
if (self.cancelling && self.msgUploadAborted) {
errMsg = self.msgUploadAborted;
}
if (self.showAjaxErrorDetails && text) {
- text = $.trim(text.replace(/\n\s*\n/g, '\n'));
- textPre = text.length ? '' + text + ' ' : '';
- errMsg += errMsg ? textPre : text;
+ if (errText) {
+ errMsg = $.trim(errText + '');
+ } else {
+ text = $.trim(text.replace(/\n\s*\n/g, '\n'));
+ textPre = text.length ? '' + text + ' ' : '';
+ errMsg += errMsg ? textPre : text;
+ }
}
if (!errMsg) {
errMsg = self.msgAjaxError.replace('{operation}', operation);
@@ -2086,10 +2401,10 @@
});
}
}
- return out;
+ return out || self.previewFileIcon;
},
_parseFilePreviewIcon: function (content, fname) {
- var self = this, icn = self._getPreviewIcon(fname) || self.previewFileIcon, out = content;
+ var self = this, icn = self._getPreviewIcon(fname), out = content;
if (out.indexOf('{previewFileIcon}') > -1) {
out = out.setTokens({'previewFileIconClass': self.previewFileIconClass, 'previewFileIcon': icn});
}
@@ -2209,6 +2524,9 @@
};
if (item.isFile) {
item.file(function (file) {
+ if (path) {
+ file.newPath = path + file.name;
+ }
files.push(file);
}, errorHandler);
} else {
@@ -2338,12 +2656,11 @@
return self._isFileSelectionValid() && !self._abort({});
},
_clearPreview: function () {
- var self = this, $p = self.$preview,
+ var self = this,
$thumbs = self.showUploadedThumbs ? self.getFrames(':not(.file-preview-success)') : self.getFrames();
$thumbs.each(function () {
var $thumb = $(this);
$thumb.remove();
- $h.cleanZoomCache($p.find('#zoom-' + $thumb.attr('id')));
});
if (!self.getFrames().length || !self.showPreview) {
self._resetUpload();
@@ -2351,48 +2668,72 @@
self._validateDefaultPreview();
},
_initSortable: function () {
- var self = this, $el = self.$preview, settings, selector = '.' + $h.SORT_CSS,
- rev = self.reversePreviewOrder;
- if (!window.KvSortable || $el.find(selector).length === 0) {
+ var self = this, $el = self.$preview, settings, selector = '.' + $h.SORT_CSS, $cont, $body = $('body'),
+ $html = $('html'), rev = self.reversePreviewOrder, Sortable = window.Sortable, beginGrab, endGrab;
+ if (!Sortable || $el.find(selector).length === 0) {
return;
}
- //noinspection JSUnusedGlobalSymbols
+ $cont = $body.length ? $body : ($html.length ? $html : self.$container);
+ beginGrab = function () {
+ $cont.addClass('file-grabbing');
+ };
+ endGrab = function () {
+ $cont.removeClass('file-grabbing');
+ };
settings = {
handle: '.drag-handle-init',
- dataIdAttr: 'data-preview-id',
- scroll: false,
+ dataIdAttr: 'data-fileid',
+ animation: 600,
draggable: selector,
+ scroll: false,
+ forceFallback: true,
+ onChoose: beginGrab,
+ onStart: beginGrab,
+ onUnchoose: endGrab,
+ onEnd: endGrab,
onSort: function (e) {
- var oldIndex = e.oldIndex, newIndex = e.newIndex, i = 0;
+ var oldIndex = e.oldIndex, newIndex = e.newIndex, i = 0, len = self.initialPreviewConfig.length,
+ exceedsLast = len > 0 && newIndex >= len, $item = $(e.item), $first;
+ if (exceedsLast) {
+ newIndex = len - 1;
+ }
self.initialPreview = $h.moveArray(self.initialPreview, oldIndex, newIndex, rev);
self.initialPreviewConfig = $h.moveArray(self.initialPreviewConfig, oldIndex, newIndex, rev);
self.previewCache.init();
self.getFrames('.file-preview-initial').each(function () {
- $(this).attr('data-fileindex', 'init_' + i);
+ $(this).attr('data-fileindex', $h.INIT_FLAG + i);
i++;
});
+ if (exceedsLast) {
+ $first = self.getFrames(':not(.file-preview-initial):first');
+ if ($first.length) {
+ $item.slideUp(function () {
+ $item.insertBefore($first).slideDown();
+ });
+ }
+ }
self._raise('filesorted', {
- previewId: $(e.item).attr('id'),
+ previewId: $item.attr('id'),
'oldIndex': oldIndex,
'newIndex': newIndex,
stack: self.initialPreviewConfig
});
- }
+ },
};
- if ($el.data('kvsortable')) {
- $el.kvsortable('destroy');
- }
$.extend(true, settings, self.fileActionSettings.dragSettings);
- $el.kvsortable(settings);
+ if (self.sortable) {
+ self.sortable.destroy();
+ }
+ self.sortable = Sortable.create($el[0], settings);
},
_setPreviewContent: function (content) {
var self = this;
- self.$preview.html(content);
+ $h.setHtml(self.$preview, content);
self._autoFitContent();
},
_initPreviewImageOrientations: function () {
- var self = this, i = 0;
- if (!self.autoOrientImageInitial) {
+ var self = this, i = 0, canOrientImage = self.canOrientImage;
+ if (!self.autoOrientImageInitial && !canOrientImage) {
return;
}
self.getFrames('.file-preview-initial').each(function () {
@@ -2401,8 +2742,12 @@
if (config && config.exif && config.exif.Orientation) {
id = $thumb.attr('id');
$img = $thumb.find('>.kv-file-content img');
- $zoomImg = self.$preview.find('#zoom-' + id + ' >.kv-file-content img');
- self.setImageOrientation($img, $zoomImg, config.exif.Orientation, $thumb);
+ $zoomImg = self._getZoom(id, ' >.kv-file-content img');
+ if (canOrientImage) {
+ $img.css('image-orientation', (self.autoOrientImageInitial ? 'from-image' : 'none'));
+ } else {
+ self.setImageOrientation($img, $zoomImg, config.exif.Orientation, $thumb);
+ }
}
i++;
});
@@ -2462,7 +2807,9 @@
};
$modal.on(event + '.bs.modal', function (e) {
var $btnFull = $modal.find('.btn-fullscreen'), $btnBord = $modal.find('.btn-borderless');
- self._raise('filezoom' + event, getParams(e));
+ if ($modal.data('fileinputPluginId') === self.$element.attr('id')) {
+ self._raise('filezoom' + event, getParams(e));
+ }
if (event === 'shown') {
$btnBord.removeClass('active').attr('aria-pressed', 'false');
$btnFull.removeClass('active').attr('aria-pressed', 'false');
@@ -2484,12 +2831,14 @@
}
self.$modal = $(modalId);
if (!self.$modal || !self.$modal.length) {
- $dialog = $(document.createElement('div')).html(modalMain).insertAfter(self.$container);
+ $dialog = $h.createElement($h.cspBuffer.stash(modalMain)).insertAfter(self.$container);
self.$modal = $(modalId).insertBefore($dialog);
+ $h.cspBuffer.apply(self.$modal);
$dialog.remove();
}
$h.initModal(self.$modal);
- self.$modal.html(self._getModalContent());
+ self.$modal.html($h.cspBuffer.stash(self._getModalContent()));
+ $h.cspBuffer.apply(self.$modal);
$.each($h.MODAL_EVENTS, function (key, event) {
self._listenModalEvent(event);
});
@@ -2569,7 +2918,7 @@
},
_setZoomContent: function ($frame, animate) {
var self = this, $content, tmplt, body, title, $body, $dataEl, config, previewId = $frame.attr('id'),
- $zoomPreview = self.$preview.find('#zoom-' + previewId), $modal = self.$modal, $tmp,
+ $zoomPreview = self._getZoom(previewId), $modal = self.$modal, $tmp,
$btnFull = $modal.find('.btn-fullscreen'), $btnBord = $modal.find('.btn-borderless'), cap, size,
$btnTogh = $modal.find('.btn-toggleheader');
tmplt = $zoomPreview.attr('data-template') || 'generic';
@@ -2583,7 +2932,7 @@
$modal.removeClass('kv-single-content');
if (animate) {
$tmp = $body.addClass('file-thumb-loading').clone().insertAfter($body);
- $body.html(body).hide();
+ $h.setHtml($body, body).hide();
$tmp.fadeOut('fast', function () {
$body.fadeIn('fast', function () {
$body.removeClass('file-thumb-loading');
@@ -2591,7 +2940,7 @@
$tmp.remove();
});
} else {
- $body.html(body);
+ $h.setHtml($body, body);
}
config = self.previewZoomSettings[tmplt];
if (config) {
@@ -2654,24 +3003,39 @@
}
});
},
- _zoomPreview: function ($btn) {
- var self = this, $frame, $modal = self.$modal;
- if (!$btn.length) {
- throw 'Cannot zoom to detailed preview!';
+ _showModal: function ($frame) {
+ var self = this, $modal = self.$modal;
+ if (!$frame || !$frame.length) {
+ return;
}
$h.initModal($modal);
- $modal.html(self._getModalContent());
- $frame = $btn.closest($h.FRAMES);
+ $h.setHtml($modal, self._getModalContent());
self._setZoomContent($frame);
+ $modal.data('fileinputPluginId', self.$element.attr('id'));
$modal.modal('show');
self._initZoomButtons();
},
+ _zoomPreview: function ($btn) {
+ var self = this, $frame;
+ if (!$btn.length) {
+ throw 'Cannot zoom to detailed preview!';
+ }
+ $frame = $btn.closest($h.FRAMES);
+ self._showModal($frame);
+ },
_zoomSlideShow: function (dir, previewId) {
- var self = this, $btn = self.$modal.find('.kv-zoom-actions .btn-' + dir), $targFrame, i,
- thumbs = self.getFrames().toArray(), len = thumbs.length, out;
+ var self = this, $btn = self.$modal.find('.kv-zoom-actions .btn-' + dir), $targFrame, i, $thumb,
+ thumbsData = self.getFrames().toArray(), thumbs = [], len = thumbsData.length, out;
if ($btn.attr('disabled')) {
return;
}
+ for (i = 0; i < len; i++) {
+ $thumb = $(thumbsData[i]);
+ if ($thumb && $thumb.length && $thumb.find('.kv-file-zoom:visible').length) {
+ thumbs.push(thumbsData[i]);
+ }
+ }
+ len = thumbs.length;
for (i = 0; i < len; i++) {
if ($(thumbs[i]).attr('id') === previewId) {
out = dir === 'prev' ? i - 1 : i + 1;
@@ -2698,7 +3062,7 @@
});
},
_inputFileCount: function () {
- return this.$element.get(0).files.length;
+ return this.$element[0].files.length;
},
_refreshPreview: function () {
var self = this, files;
@@ -2711,10 +3075,10 @@
self.fileManager.clear();
self._clearFileInput();
} else {
- files = self.$element.get(0).files;
+ files = self.$element[0].files;
}
} else {
- files = self.$element.get(0).files;
+ files = self.$element[0].files;
}
if (files && files.length) {
self.readFiles(files);
@@ -2750,15 +3114,15 @@
},
_resetUpload: function () {
var self = this;
- self.uploadCache = {content: [], config: [], tags: [], append: true};
+ self.uploadStartTime = $h.now();
+ self.uploadCache = [];
self.$btnUpload.removeAttr('disabled');
self._setProgress(0);
- self.$progress.hide();
+ self._hideProgress();
self._resetErrors(false);
self._initAjax();
self.fileManager.clearImages();
self._resetCanvas();
- self.cacheInitialPreview = {};
if (self.overwriteInitial) {
self.initialPreview = [];
self.initialPreviewConfig = [];
@@ -2781,13 +3145,28 @@
return !self.overwriteInitial && self.previewCache.count(true);
},
_resetPreview: function () {
- var self = this, out, cap;
+ var self = this, out, cap, $div, hasSuc = self.showUploadedThumbs, hasErr = !self.removeFromPreviewOnError,
+ includeProcessed = (hasSuc || hasErr) && self.isDuplicateError;
if (self.previewCache.count(true)) {
out = self.previewCache.out();
+ if (includeProcessed) {
+ $div = $h.createElement('').insertAfter(self.$container);
+ self.getFrames().each(function () {
+ var $thumb = $(this);
+ if ((hasSuc && $thumb.hasClass('file-preview-success')) ||
+ (hasErr && $thumb.hasClass('file-preview-error'))) {
+ $div.append($thumb);
+ }
+ });
+ }
self._setPreviewContent(out.content);
self._setInitThumbAttr();
cap = self.initialCaption ? self.initialCaption : out.caption;
self._setCaption(cap);
+ if (includeProcessed) {
+ $div.contents().appendTo(self.$preview);
+ $div.remove();
+ }
} else {
self._clearPreview();
self._initCaption();
@@ -2796,6 +3175,7 @@
self._initZoom();
self._initSortable();
}
+ self.isDuplicateError = false;
},
_clearDefaultPreview: function () {
var self = this;
@@ -2835,7 +3215,7 @@
return $h.replaceTags(template, self.customLayoutTags);
},
_getPreviewTemplate: function (t) {
- var self = this, template = self.previewTemplates[t];
+ var self = this, templates = self.previewTemplates, template = templates[t] || templates.other;
if ($h.isEmpty(self.customPreviewTags)) {
return template;
}
@@ -2861,11 +3241,17 @@
var self = this, strFiles = n === 1 ? self.fileSingle : self.filePlural;
return n > 0 ? self.msgSelected.replace('{n}', n).replace('{files}', strFiles) : self.msgNoFilesSelected;
},
- _getFrame: function (id) {
- var self = this, $frame = $('#' + id);
- if (!$frame.length) {
+ _getFrame: function (id, skipWarning) {
+ var self = this, $frame = $h.getFrameElement(self.$preview, id);
+ if (self.showPreview && !skipWarning && !$frame.length) {
+ self._log($h.logMessages.invalidThumb, {id: id});
+ }
+ return $frame;
+ },
+ _getZoom: function (id, selector) {
+ var self = this, $frame = $h.getZoomElement(self.$preview, id, selector);
+ if (self.showPreview && !$frame.length) {
self._log($h.logMessages.invalidThumb, {id: id});
- return null;
}
return $frame;
},
@@ -2873,6 +3259,10 @@
css = css || '';
return this.getFrames(':not(.file-preview-initial)' + css);
},
+ _getThumbId: function (fileId) {
+ var self = this;
+ return self.previewInitId + '-' + fileId;
+ },
_getExtraData: function (fileId, index) {
var self = this, data = self.uploadExtraData;
if (typeof self.uploadExtraData === 'function') {
@@ -2880,7 +3270,7 @@
}
return data;
},
- _initXhr: function (xhrobj, fileId, fileCount) {
+ _initXhr: function (xhrobj, fileId) {
var self = this, fm = self.fileManager, func = function (event) {
var pct = 0, total = event.total, loaded = event.loaded || event.position,
stats = fm.getUploadStats(fileId, loaded, total);
@@ -2889,7 +3279,7 @@
pct = $h.round(loaded / total * 100);
}
if (fileId) {
- self._setFileUploadStats(fileId, pct, fileCount, stats);
+ self._setFileUploadStats(fileId, pct, stats);
} else {
self._setProgress(pct, null, null, self._getStats(stats));
}
@@ -2932,7 +3322,7 @@
}
},
_ajaxSubmit: function (fnBefore, fnSuccess, fnComplete, fnError, formdata, fileId, index, vUrl) {
- var self = this, settings, defaults, data, processQueue;
+ var self = this, settings, defaults, data, ajaxTask;
if (!self._raise('filepreajax', [formdata, fileId, index])) {
return;
}
@@ -2957,7 +3347,7 @@
defaults = {
xhr: function () {
var xhrobj = $.ajaxSettings.xhr();
- return self._initXhr(xhrobj, fileId, self.fileManager.count());
+ return self._initXhr(xhrobj, fileId);
},
url: self._encodeURI(vUrl),
type: 'POST',
@@ -2968,31 +3358,23 @@
contentType: false
};
settings = $.extend(true, {}, defaults, self._ajaxSettings);
+ ajaxTask = self.taskManager.addTask(fileId + '-' + index, function () {
+ var self = this.self, config, xhr;
+ config = self.ajaxQueue.shift();
+ xhr = $.ajax(config);
+ self.ajaxRequests.push(xhr);
+ });
self.ajaxQueue.push(settings);
- processQueue = function () {
- var config, xhr;
- if (self.ajaxCurrentThreads < self.maxAjaxThreads) {
- config = self.ajaxQueue.shift();
- if (typeof config !== 'undefined') {
- self.ajaxCurrentThreads++;
- xhr = $.ajax(config).done(function () {
- clearInterval(self.ajaxQueueIntervalId);
- self.ajaxCurrentThreads--;
- });
- self.ajaxRequests.push(xhr);
- }
- }
- };
- self.ajaxQueueIntervalId = setInterval(processQueue, self.queueDelay);
-
+ ajaxTask.runWithContext({self: self});
},
_mergeArray: function (prop, content) {
var self = this, arr1 = $h.cleanArray(self[prop]), arr2 = $h.cleanArray(content);
self[prop] = arr1.concat(arr2);
},
_initUploadSuccess: function (out, $thumb, allFiles) {
- var self = this, append, data, index, $div, $newCache, content, config, tags, i;
+ var self = this, append, data, index, $div, $newCache, content, config, tags, id, i;
if (!self.showPreview || typeof out !== 'object' || $.isEmptyObject(out)) {
+ self._resetCaption();
return;
}
if (out.initialPreview !== undefined && out.initialPreview.length > 0) {
@@ -3013,10 +3395,10 @@
if (!allFiles) {
index = self.previewCache.add(content[0], config[0], tags[0], append);
data = self.previewCache.get(index, false);
- $div = $(document.createElement('div')).html(data).hide().insertAfter($thumb);
+ $div = $h.createElement(data).hide().appendTo($thumb);
$newCache = $div.find('.kv-zoom-cache');
if ($newCache && $newCache.length) {
- $newCache.insertAfter($thumb);
+ $newCache.appendTo($thumb);
}
$thumb.fadeOut('slow', function () {
var $newThumb = $div.find('.file-preview-frame');
@@ -3025,17 +3407,22 @@
}
self._initPreviewActions();
self._clearFileInput();
- $h.cleanZoomCache(self.$preview.find('#zoom-' + $thumb.attr('id')));
$thumb.remove();
$div.remove();
self._initSortable();
});
} else {
- i = $thumb.attr('data-fileindex');
- self.uploadCache.content[i] = content[0];
- self.uploadCache.config[i] = config[0] || [];
- self.uploadCache.tags[i] = tags[0] || [];
- self.uploadCache.append = append;
+ id = $thumb.attr('id');
+ i = self._getUploadCacheIndex(id);
+ if (i !== null) {
+ self.uploadCache[i] = {
+ id: id,
+ content: content[0],
+ config: config[0] || [],
+ tags: tags[0] || [],
+ append: append
+ };
+ }
}
} else {
self.previewCache.set(content, config, tags, append);
@@ -3043,6 +3430,17 @@
self._initPreviewActions();
}
}
+ self._resetCaption();
+ },
+ _getUploadCacheIndex: function (id) {
+ var self = this, i, len = self.uploadCache.length, config;
+ for (i = 0; i < len; i++) {
+ config = self.uploadCache[i];
+ if (config.id === id) {
+ return i;
+ }
+ }
+ return null;
},
_initSuccessThumbs: function () {
var self = this;
@@ -3050,7 +3448,7 @@
return;
}
self._getThumbs($h.FRAMES + '.file-preview-success').each(function () {
- var $thumb = $(this), $preview = self.$preview, $remove = $thumb.find('.kv-file-remove');
+ var $thumb = $(this), $remove = $thumb.find('.kv-file-remove');
$remove.removeAttr('disabled');
self._handler($remove, 'click', function () {
var id = $thumb.attr('id'),
@@ -3060,7 +3458,6 @@
return;
}
$thumb.fadeOut('slow', function () {
- $h.cleanZoomCache($preview.find('#zoom-' + id));
$thumb.remove();
if (!self.getFrames().length) {
self.reset();
@@ -3070,33 +3467,11 @@
});
},
_updateInitialPreview: function () {
- var self = this, u = self.uploadCache, i, j, len = 0, data = self.cacheInitialPreview;
- if (data && data.content) {
- len = data.content.length;
- }
+ var self = this, u = self.uploadCache;
if (self.showPreview) {
- self.previewCache.set(u.content, u.config, u.tags, u.append);
- if (len) {
- for (i = 0; i < u.content.length; i++) {
- j = i + len;
- data.content[j] = u.content[i];
- //noinspection JSUnresolvedVariable
- if (data.config.length) {
- data.config[j] = u.config[i];
- }
- if (data.tags.length) {
- data.tags[j] = u.tags[i];
- }
- }
- self.initialPreview = $h.cleanArray(data.content);
- self.initialPreviewConfig = $h.cleanArray(data.config);
- self.initialPreviewThumbTags = $h.cleanArray(data.tags);
- } else {
- self.initialPreview = u.content;
- self.initialPreviewConfig = u.config;
- self.initialPreviewThumbTags = u.tags;
- }
- self.cacheInitialPreview = {};
+ $.each(u, function (key, setting) {
+ self.previewCache.add(setting.content, setting.config, setting.tags, setting.append);
+ });
if (self.hasInitData) {
self._initPreview();
self._initPreviewActions();
@@ -3105,7 +3480,7 @@
},
_uploadSingle: function (i, id, isBatch) {
var self = this, fm = self.fileManager, count = fm.count(), formdata = new FormData(), outData,
- previewId = self.previewInitId + '-' + i, $thumb, chkComplete, $btnUpload, $btnDelete,
+ previewId = self._getThumbId(id), $thumb, chkComplete, $btnUpload, $btnDelete,
hasPostData = count > 0 || !$.isEmptyObject(self.uploadExtraData), uploadFailed, $prog, fnBefore,
errMsg, fnSuccess, fnComplete, fnError, updateUploadLog, op = self.ajaxOperations.uploadThumb,
fileObj = fm.getFile(id), params = {id: previewId, index: i, fileId: id},
@@ -3133,6 +3508,7 @@
fm.setProcessed(id);
if (fm.isProcessed()) {
self.fileBatchCompleted = true;
+ chkComplete();
}
};
chkComplete = function () {
@@ -3224,30 +3600,30 @@
if (isBatch) {
updateUploadLog();
}
- self._setProgress(101, $('#' + pid).find('.file-thumb-progress'), self.msgUploadError);
+ self._setProgress(101, self._getFrame(pid).find('.file-thumb-progress'),
+ self.msgUploadError);
}
}, self.processDelay);
};
fnComplete = function () {
- setTimeout(function () {
- if (self.showPreview) {
- $btnUpload.removeAttr('disabled');
- $btnDelete.removeAttr('disabled');
- $thumb.removeClass('file-uploading');
- }
- if (!isBatch) {
- self.unlock(false);
- self._clearFileInput();
- } else {
- chkComplete();
- }
- self._initSuccessThumbs();
- }, self.processDelay);
+ if (self.showPreview) {
+ $btnUpload.removeAttr('disabled');
+ $btnDelete.removeAttr('disabled');
+ $thumb.removeClass('file-uploading');
+ }
+ if (!isBatch) {
+ self.unlock(false);
+ self._clearFileInput();
+ } else {
+ chkComplete();
+ }
+ self._initSuccessThumbs();
};
fnError = function (jqXHR, textStatus, errorThrown) {
errMsg = self._parseError(op, jqXHR, errorThrown, self.fileManager.getFileName(id));
uploadFailed = true;
setTimeout(function () {
+ var $prog;
if (isBatch) {
updateUploadLog();
}
@@ -3257,8 +3633,9 @@
$btnUpload.hide();
}
$.extend(true, params, self._getOutData(formdata, jqXHR));
- self._setProgress(101, $prog, self.msgAjaxProgressError.replace('{operation}', op));
- self._setProgress(101, $thumb.find('.file-thumb-progress'), self.msgUploadError);
+ self._setProgress(101, self.$progress, self.msgAjaxProgressError.replace('{operation}', op));
+ $prog = self.showPreview && $thumb ? $thumb.find('.file-thumb-progress') : '';
+ self._setProgress(101, $prog, self.msgUploadError);
self._showFileError(errMsg, params);
}, self.processDelay);
};
@@ -3441,35 +3818,52 @@
},
_deleteFileIndex: function ($frame) {
var self = this, ind = $frame.attr('data-fileindex'), rev = self.reversePreviewOrder;
- if (ind.substring(0, 5) === 'init_') {
- ind = parseInt(ind.replace('init_', ''));
+ if (ind.substring(0, 5) === $h.INIT_FLAG) {
+ ind = parseInt(ind.replace($h.INIT_FLAG, ''));
self.initialPreview = $h.spliceArray(self.initialPreview, ind, rev);
self.initialPreviewConfig = $h.spliceArray(self.initialPreviewConfig, ind, rev);
self.initialPreviewThumbTags = $h.spliceArray(self.initialPreviewThumbTags, ind, rev);
self.getFrames().each(function () {
var $nFrame = $(this), nInd = $nFrame.attr('data-fileindex');
- if (nInd.substring(0, 5) === 'init_') {
- nInd = parseInt(nInd.replace('init_', ''));
+ if (nInd.substring(0, 5) === $h.INIT_FLAG) {
+ nInd = parseInt(nInd.replace($h.INIT_FLAG, ''));
if (nInd > ind) {
nInd--;
- $nFrame.attr('data-fileindex', 'init_' + nInd);
+ $nFrame.attr('data-fileindex', $h.INIT_FLAG + nInd);
}
}
});
- if (self.uploadAsync || self.enableResumableUpload) {
- self.cacheInitialPreview = self.getPreview();
- }
}
},
+ _resetCaption: function () {
+ var self = this;
+ setTimeout(function () {
+ var cap, n, chk = self.previewCache.count(true), len = self.fileManager.count(), file,
+ incomplete = ':not(.file-preview-success):not(.file-preview-error)',
+ hasThumb = self.showPreview && self.getFrames(incomplete).length;
+ if (len === 0 && chk === 0 && !hasThumb) {
+ self.reset();
+ } else {
+ n = chk + len;
+ if (n > 1) {
+ cap = self._getMsgSelected(n);
+ } else {
+ file = self.fileManager.getFirstFile();
+ cap = file ? file.nameFmt : '_';
+ }
+ self._setCaption(cap);
+ }
+ }, self.processDelay);
+ },
_initFileActions: function () {
- var self = this, $preview = self.$preview;
+ var self = this;
if (!self.showPreview) {
return;
}
self._initZoomButton();
self.getFrames(' .kv-file-remove').each(function () {
var $el = $(this), $frame = $el.closest($h.FRAMES), hasError, id = $frame.attr('id'),
- ind = $frame.attr('data-fileindex'), n, cap, status;
+ ind = $frame.attr('data-fileindex'), status;
self._handler($el, 'click', function () {
status = self._raise('filepreremove', [id, ind]);
if (status === false || !self._validateMinCount()) {
@@ -3478,7 +3872,6 @@
hasError = $frame.hasClass('file-preview-error');
$h.cleanMemory($frame);
$frame.fadeOut('slow', function () {
- $h.cleanZoomCache($preview.find('#zoom-' + id));
self.fileManager.remove($frame);
self._clearObjects($frame);
$frame.remove();
@@ -3491,20 +3884,7 @@
});
}
self._clearFileInput();
- var chk = self.previewCache.count(true), len = self.fileManager.count(),
- file, hasThumb = self.showPreview && self.getFrames().length;
- if (len === 0 && chk === 0 && !hasThumb) {
- self.reset();
- } else {
- n = chk + len;
- if (n > 1) {
- cap = self._getMsgSelected(n);
- } else {
- file = self.fileManager.getFirstFile();
- cap = file ? file.nameFmt : '_';
- }
- self._setCaption(cap);
- }
+ self._resetCaption();
self._raise('fileremoved', [id, ind]);
});
});
@@ -3512,12 +3892,12 @@
self.getFrames(' .kv-file-upload').each(function () {
var $el = $(this);
self._handler($el, 'click', function () {
- var $frame = $el.closest($h.FRAMES), id = $frame.attr('data-fileid');
- self.$progress.hide();
+ var $frame = $el.closest($h.FRAMES), fileId = $frame.attr('data-fileid');
+ self._hideProgress();
if ($frame.hasClass('file-preview-error') && !self.retryErrorUploads) {
return;
}
- self._uploadSingle(self.fileManager.getIndex(id), id, false);
+ self._uploadSingle(self.fileManager.getIndex(fileId), fileId, false);
});
});
},
@@ -3545,10 +3925,10 @@
}
var $frame = $el.closest($h.FRAMES), cache = self.previewCache.data, settings, params, config,
fileName, extraData, index = $frame.attr('data-fileindex');
- index = parseInt(index.replace('init_', ''));
+ index = parseInt(index.replace($h.INIT_FLAG, ''));
config = $h.isEmpty(cache.config) && $h.isEmpty(cache.config[index]) ? null : cache.config[index];
extraData = $h.isEmpty(config) || $h.isEmpty(config.extra) ? deleteExtraData : config.extra;
- fileName = config.filename || config.caption || '';
+ fileName = config && (config.filename || config.caption) || '';
if (typeof extraData === 'function') {
extraData = extraData();
}
@@ -3578,14 +3958,13 @@
}
$frame.removeClass('file-uploading').addClass('file-deleted');
$frame.fadeOut('slow', function () {
- index = parseInt(($frame.attr('data-fileindex')).replace('init_', ''));
+ index = parseInt(($frame.attr('data-fileindex')).replace($h.INIT_FLAG, ''));
self.previewCache.unset(index);
self._deleteFileIndex($frame);
n = self.previewCache.count(true);
cap = n > 0 ? self._getMsgSelected(n) : '';
self._setCaption(cap);
self._raise('filedeleted', [vKey, jqXHR, extraData]);
- $h.cleanZoomCache($preview.find('#zoom-' + $frame.attr('id')));
self._clearObjects($frame);
$frame.remove();
resetProgress();
@@ -3616,7 +3995,6 @@
}
self.ajaxAborted = false;
self._raise('filebeforedelete', [vKey, extraData]);
- //noinspection JSUnresolvedVariable,JSHint
if (self.ajaxAborted instanceof Promise) {
self.ajaxAborted.then(function (result) {
if (!result) {
@@ -3683,11 +4061,10 @@
) {
var self = this, caption = self.slug(fname), prevContent, zoomContent = '', styleAttribs = '',
screenW = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth,
- config, newCat = self.preferIconicPreview ? 'other' : cat, title = caption, alt = caption,
+ config, title = caption, alt = caption, typeCss = 'type-default', getContent,
footer = foot || self._renderFileFooter(cat, caption, size, 'auto', isError),
- hasIconSetting = self._getPreviewIcon(fname), typeCss = 'type-default',
- forcePrevIcon = hasIconSetting && self.preferIconicPreview,
- forceZoomIcon = hasIconSetting && self.preferIconicZoomPreview, getContent;
+ forcePrevIcon = self.preferIconicPreview, forceZoomIcon = self.preferIconicZoomPreview,
+ newCat = forcePrevIcon ? 'other' : cat;
config = screenW < 400 ? (self.previewSettingsSmall[newCat] || self.defaults.previewSettingsSmall[newCat]) :
(self.previewSettings[newCat] || self.defaults.previewSettings[newCat]);
if (config) {
@@ -3752,56 +4129,40 @@
zoomContent = self.sanitizeZoomCache(zoomContent);
}
prevContent = getContent((forcePrevIcon ? 'other' : cat), data, false, 'kv-preview-thumb');
- return prevContent + zoomContent;
+ return prevContent.setTokens({zoomCache: zoomContent});
},
_addToPreview: function ($preview, content) {
- var self = this;
- return self.reversePreviewOrder ? $preview.prepend(content) : $preview.append(content);
+ var self = this, $el;
+ content = $h.cspBuffer.stash(content);
+ $el = self.reversePreviewOrder ? $preview.prepend(content) : $preview.append(content);
+ $h.cspBuffer.apply($preview);
+ return $el;
},
- _previewDefault: function (file, previewId, isDisabled) {
+ _previewDefault: function (file, isDisabled) {
var self = this, $preview = self.$preview;
if (!self.showPreview) {
return;
}
var fname = $h.getFileName(file), ftype = file ? file.type : '', content, size = file.size || 0,
caption = self._getFileName(file, ''), isError = isDisabled === true && !self.isAjaxUpload,
- data = $h.createObjectURL(file), fileId = self.fileManager.getId(file);
+ data = $h.createObjectURL(file), fileId = self.fileManager.getId(file),
+ previewId = self._getThumbId(fileId);
self._clearDefaultPreview();
content = self._generatePreviewTemplate('other', data, fname, ftype, previewId, fileId, isError, size);
self._addToPreview($preview, content);
self._setThumbAttr(previewId, caption, size);
if (isDisabled === true && self.isAjaxUpload) {
- self._setThumbStatus($('#' + previewId), 'Error');
+ self._setThumbStatus(self._getFrame(previewId), 'Error');
}
},
- canPreview: function (file) {
- var self = this;
- if (!file || !self.showPreview || !self.$preview || !self.$preview.length) {
- return false;
- }
- var name = file.name || '', type = file.type || '', size = (file.size || 0) / 1000,
- cat = self._parseFileType(type, name), allowedTypes, allowedMimes, allowedExts, skipPreview,
- types = self.allowedPreviewTypes, mimes = self.allowedPreviewMimeTypes,
- exts = self.allowedPreviewExtensions || [], dTypes = self.disabledPreviewTypes,
- dMimes = self.disabledPreviewMimeTypes, dExts = self.disabledPreviewExtensions || [],
- maxSize = self.maxFilePreviewSize && parseFloat(self.maxFilePreviewSize) || 0,
- expAllExt = new RegExp('\\.(' + exts.join('|') + ')$', 'i'),
- expDisExt = new RegExp('\\.(' + dExts.join('|') + ')$', 'i');
- allowedTypes = !types || types.indexOf(cat) !== -1;
- allowedMimes = !mimes || mimes.indexOf(type) !== -1;
- allowedExts = !exts.length || $h.compare(name, expAllExt);
- skipPreview = (dTypes && dTypes.indexOf(cat) !== -1) || (dMimes && dMimes.indexOf(type) !== -1) ||
- (dExts.length && $h.compare(name, expDisExt)) || (maxSize && !isNaN(maxSize) && size > maxSize);
- return !skipPreview && (allowedTypes || allowedMimes || allowedExts);
- },
- _previewFile: function (i, file, theFile, previewId, data, fileInfo) {
+ _previewFile: function (i, file, theFile, data, fileInfo) {
if (!this.showPreview) {
return;
}
var self = this, fname = $h.getFileName(file), ftype = fileInfo.type, caption = fileInfo.name,
cat = self._parseFileType(ftype, fname), content, $preview = self.$preview, fsize = file.size || 0,
iData = (cat === 'text' || cat === 'html' || cat === 'image') ? theFile.target.result : data,
- fileId = self.fileManager.getId(file);
+ fileId = self.fileManager.getId(file), previewId = self._getThumbId(fileId);
/** @namespace window.DOMPurify */
if (cat === 'html' && self.purifyHtml && window.DOMPurify) {
iData = window.DOMPurify.sanitize(iData);
@@ -3809,13 +4170,13 @@
content = self._generatePreviewTemplate(cat, iData, fname, ftype, previewId, fileId, false, fsize);
self._clearDefaultPreview();
self._addToPreview($preview, content);
- var $thumb = $preview.find('#' + previewId), $img = $thumb.find('img'), id = $thumb.attr('data-fileid');
- self._validateImageOrientation($img, file, previewId, id, caption, ftype, fsize, iData);
+ var $thumb = self._getFrame(previewId);
+ self._validateImageOrientation($thumb.find('img'), file, previewId, fileId, caption, ftype, fsize, iData);
self._setThumbAttr(previewId, caption, fsize);
self._initSortable();
},
_setThumbAttr: function (id, caption, size) {
- var self = this, $frame = $('#' + id);
+ var self = this, $frame = self._getFrame(id);
if ($frame.length) {
size = size && size > 0 ? self._getSize(size) : '';
$frame.data({'caption': caption, 'size': size});
@@ -3829,7 +4190,7 @@
}
for (var i = 0; i < len; i++) {
config = data.config[i];
- previewId = self.previewInitId + '-' + 'init_' + i;
+ previewId = self.previewInitId + '-' + $h.INIT_FLAG + i;
caption = $h.ifSet('caption', config, $h.ifSet('filename', config));
size = $h.ifSet('size', config);
self._setThumbAttr(previewId, caption, size);
@@ -3837,9 +4198,9 @@
},
_slugDefault: function (text) {
// noinspection RegExpRedundantEscape
- return $h.isEmpty(text) ? '' : String(text).replace(/[\[\]\/\{}:;#%=\(\)\*\+\?\\\^\$\|<>&"']/g, '_');
+ return $h.isEmpty(text, true) ? '' : String(text).replace(/[\[\]\/\{}:;#%=\(\)\*\+\?\\\^\$\|<>&"']/g, '_');
},
- _updateFileDetails: function (numFiles) {
+ _updateFileDetails: function (numFiles, skipRaiseEvent) {
var self = this, $el = self.$element, label, n, log, nFiles, file,
name = ($h.isIE(9) && $h.findFileName($el.val())) || ($el[0].files[0] && $el[0].files[0].name);
if (!name && self.fileManager.count() > 0) {
@@ -3860,7 +4221,7 @@
}
self._setCaption(log, self.isError);
self.$container.removeClass('file-input-new file-input-ajax-new');
- if (arguments.length === 1) {
+ if (!skipRaiseEvent) {
self._raise('fileselect', [numFiles, label]);
}
if (self.previewCache.count(true)) {
@@ -3880,7 +4241,7 @@
if (status === 'Success') {
$thumb.find('.file-drag-handle').remove();
}
- $indicator.html(config[icon]);
+ $h.setHtml($indicator, config[icon]);
$indicator.attr('title', config[msg]);
$thumb.addClass(css);
if (status === 'Error' && !self.retryErrorUploads) {
@@ -3912,12 +4273,16 @@
}
stats = stats || '';
out = out.setTokens({stats: stats});
- $el.html(out);
+ $h.setHtml($el, out);
if (error) {
- $el.find('[role="progressbar"]').html(error);
+ $h.setHtml($el.find('[role="progressbar"]'), error);
}
}
},
+ _hasFiles: function () {
+ var el = this.$element[0];
+ return !!(el && el.files && el.files.length);
+ },
_setFileDropZoneTitle: function () {
var self = this, $zone = self.$container.find('.file-drop-zone'), title = self.dropZoneTitle, strFiles;
if (self.isClickable) {
@@ -3926,7 +4291,7 @@
}
$zone.find('.' + self.dropZoneTitleClass).remove();
if (!self.showPreview || $zone.length === 0 || self.fileManager.count() > 0 || !self.dropZoneEnabled ||
- (!self.isAjaxUpload && self.$element.files)) {
+ self.previewCache.count() > 0 || (!self.isAjaxUpload && self._hasFiles())) {
return;
}
if ($zone.find($h.FRAMES).length === 0 && $h.isEmpty(self.defaultPreviewContent)) {
@@ -3961,12 +4326,22 @@
self._setProgress(pct, $prog, null, self._getStats(stats));
obj.lastProgress = pct;
},
- _setFileUploadStats: function (id, pct, total, stats) {
+ _toggleResumableProgress: function (template, message) {
+ var self = this, $progress = self.$progress;
+ if ($progress && $progress.length) {
+ $h.setHtml($progress, template.setTokens({
+ percent: 101,
+ status: message,
+ stats: ''
+ }));
+ }
+ },
+ _setFileUploadStats: function (id, pct, stats) {
var self = this, $prog = self.$progress;
if (!self.showPreview && (!$prog || !$prog.length)) {
return;
}
- var fm = self.fileManager, $thumb = fm.getThumb(id), pctTot, rm = self.resumableManager,
+ var fm = self.fileManager, rm = self.resumableManager, $thumb = fm.getThumb(id), pctTot,
totUpSize = 0, totSize = fm.getTotalSize(), totStats = $.extend(true, {}, stats);
if (self.enableResumableUpload) {
var loaded = stats.loaded, currUplSize = rm.getUploadedSize(), currTotSize = rm.file.size, totLoaded;
@@ -3998,9 +4373,12 @@
}
return true;
},
- _getFileCount: function (fileCount) {
+ _getFileCount: function (fileCount, includeInitial) {
var self = this, addCount = 0;
- if (self.validateInitialCount && !self.overwriteInitial) {
+ if (includeInitial === undefined) {
+ includeInitial = self.validateInitialCount && !self.overwriteInitial;
+ }
+ if (includeInitial) {
addCount = self.previewCache.count(true);
fileCount += addCount;
}
@@ -4045,7 +4423,8 @@
icon = cfg.uploadRetryIcon;
title = cfg.uploadRetryTitle;
}
- $btn.attr('title', title).html(icon);
+ $btn.attr('title', title);
+ $h.setHtml($btn, icon);
},
_checkDimensions: function (i, chk, $img, $thumb, fname, type, params) {
var self = this, msg, dim, tag = chk === 'Small' ? 'min' : 'max', limit = self[tag + 'Image' + type],
@@ -4064,7 +4443,7 @@
self._setPreviewError($thumb);
},
_getExifObj: function (data) {
- var self = this, exifObj = null, error = $h.logMessages.exifWarning;
+ var self = this, exifObj, error = $h.logMessages.exifWarning;
if (data.slice(0, 23) !== 'data:image/jpeg;base64,' && data.slice(0, 22) !== 'data:image/jpg;base64,') {
exifObj = null;
return;
@@ -4102,7 +4481,7 @@
self.$preview.removeClass('hide-content');
$thumb.find('.kv-file-content').css('visibility', 'hidden');
}
- var img = $img.get(0), zoomImg = $zoomImg && $zoomImg.length ? $zoomImg.get(0) : null,
+ var img = $img[0], zoomImg = $zoomImg && $zoomImg.length ? $zoomImg[0] : null,
h = img.offsetHeight, w = img.offsetWidth, r = $h.getRotation(value);
if (isHidden) {
$thumb.find('.kv-file-content').css('visibility', 'visible');
@@ -4130,19 +4509,24 @@
});
},
_validateImageOrientation: function ($img, file, previewId, fileId, caption, ftype, fsize, iData) {
- var self = this, exifObj, value, autoOrientImage = self.autoOrientImage;
+ var self = this, exifObj, value, autoOrientImage = self.autoOrientImage, selector;
+ if (self.canOrientImage) {
+ $img.css('image-orientation', (autoOrientImage ? 'from-image' : 'none'));
+ return;
+ }
+ selector = $h.getZoomSelector(previewId, ' img');
exifObj = autoOrientImage ? self._getExifObj(iData) : null;
value = exifObj ? exifObj['0th'][piexif.ImageIFD.Orientation] : null; // jshint ignore:line
if (!value) {
self._validateImage(previewId, fileId, caption, ftype, fsize, iData, exifObj);
return;
}
- self.setImageOrientation($img, $('#zoom-' + previewId + ' img'), value, $('#' + previewId));
+ self.setImageOrientation($img, $(selector), value, self._getFrame(previewId));
self._raise('fileimageoriented', {'$img': $img, 'file': file});
self._validateImage(previewId, fileId, caption, ftype, fsize, iData, exifObj);
},
_validateImage: function (previewId, fileId, fname, ftype, fsize, iData, exifObj) {
- var self = this, $preview = self.$preview, params, w1, w2, $thumb = $preview.find('#' + previewId),
+ var self = this, $preview = self.$preview, params, w1, w2, $thumb = self._getFrame(previewId),
i = $thumb.attr('data-fileindex'), $img = $thumb.find('img');
fname = fname || 'Untitled';
$img.one('load', function () {
@@ -4264,8 +4648,7 @@
if (!(blob instanceof Blob)) {
throwError(self.msgImageResizeError, params, 'fileimageresizeerror');
}
- }
- catch (err) {
+ } catch (err) {
counter.val++;
if (counter.val === numImgs) {
self._raise('fileimagesresized', [undefined, undefined]);
@@ -4274,6 +4657,18 @@
throwError(msg, params, 'fileimageresizeexception');
}
},
+ _showProgress: function () {
+ var self = this;
+ if (self.$progress && self.$progress.length) {
+ self.$progress.show();
+ }
+ },
+ _hideProgress: function () {
+ var self = this;
+ if (self.$progress && self.$progress.length) {
+ self.$progress.hide();
+ }
+ },
_initBrowse: function ($container) {
var self = this, $el = self.$element;
if (self.showBrowse) {
@@ -4344,12 +4739,13 @@
}
self.$captionContainer.addClass('icon-visible');
self.$caption.attr('title', title).val(out);
- self.$captionIcon.html(icon);
+ $h.setHtml(self.$captionIcon, icon);
},
_createContainer: function () {
var self = this, attribs = {'class': 'file-input file-input-new' + (self.rtl ? ' kv-rtl' : '')},
- $container = $(document.createElement('div')).attr(attribs).html(self._renderMain());
- $container.insertBefore(self.$element);
+ $container = $h.createElement($h.cspBuffer.stash(self._renderMain()));
+ $h.cspBuffer.apply($container);
+ $container.insertBefore(self.$element).attr(attribs);
self._initBrowse($container);
if (self.theme) {
$container.addClass('theme-' + self.theme);
@@ -4359,7 +4755,7 @@
_refreshContainer: function () {
var self = this, $container = self.$container, $el = self.$element;
$el.insertAfter($container);
- $container.html(self._renderMain());
+ $h.setHtml($container, self._renderMain());
self._initBrowse($container);
self._validateDisabled();
},
@@ -4566,7 +4962,9 @@
if (self.isError && !self.isAjaxUpload) {
self.clear();
}
- self.$captionContainer.focus();
+ if (self.focusCaptionOnBrowse) {
+ self.$captionContainer.focus();
+ }
},
_change: function (e) {
var self = this;
@@ -4574,17 +4972,19 @@
return;
}
var $el = self.$element, isDragDrop = arguments.length > 1, isAjaxUpload = self.isAjaxUpload,
- tfiles, files = isDragDrop ? arguments[1] : $el.get(0).files, total,
- maxCount = !isAjaxUpload && $h.isEmpty($el.attr('multiple')) ? 1 : self.maxFileCount,
- len, ctr = self.fileManager.count(), isSingleUpload = $h.isEmpty($el.attr('multiple')),
- flagSingle = (isSingleUpload && ctr > 0),
+ tfiles, files = isDragDrop ? arguments[1] : $el[0].files, ctr = self.fileManager.count(),
+ total, initCount, len, isSingleUpl = $h.isEmpty($el.attr('multiple')),
+ maxCount = !isAjaxUpload && isSingleUpl ? 1 : self.maxFileCount, maxTotCount = self.maxTotalFileCount,
+ inclAll = maxTotCount > 0 && maxTotCount > maxCount, flagSingle = (isSingleUpl && ctr > 0),
throwError = function (mesg, file, previewId, index) {
var p1 = $.extend(true, {}, self._getOutData(null, {}, {}, files), {id: previewId, index: index}),
p2 = {id: previewId, index: index, file: file, files: files};
+ self.isPersistentError = true;
return isAjaxUpload ? self._showFileError(mesg, p1) : self._showError(mesg, p2);
},
- maxCountCheck = function (n, m) {
- var msg = self.msgFilesTooMany.replace('{m}', m).replace('{n}', n);
+ maxCountCheck = function (n, m, all) {
+ var msg = all ? self.msgTotalFilesTooMany : self.msgFilesTooMany;
+ msg = msg.replace('{m}', m).replace('{n}', n);
self.isError = throwError(msg, null, null, null);
self.$captionContainer.removeClass('icon-visible');
self._setCaption('', true);
@@ -4613,7 +5013,8 @@
}
self._resetErrors();
len = tfiles.length;
- total = self._getFileCount(isAjaxUpload ? (self.fileManager.count() + len) : len);
+ initCount = isAjaxUpload ? (self.fileManager.count() + len) : len;
+ total = self._getFileCount(initCount, inclAll ? false : undefined);
if (maxCount > 0 && total > maxCount) {
if (!self.autoReplace || len > maxCount) {
maxCountCheck((self.autoReplace && len > maxCount ? len : total), maxCount);
@@ -4623,6 +5024,18 @@
self._resetPreviewThumbs(isAjaxUpload);
}
} else {
+ if (inclAll) {
+ total = self._getFileCount(initCount, true);
+ if (maxTotCount > 0 && total > maxTotCount) {
+ if (!self.autoReplace || len > maxCount) {
+ maxCountCheck((self.autoReplace && len > maxTotCount ? len : total), maxTotCount, true);
+ return;
+ }
+ if (total > maxCount) {
+ self._resetPreviewThumbs(isAjaxUpload);
+ }
+ }
+ }
if (!isAjaxUpload || flagSingle) {
self._resetPreviewThumbs(false);
if (flagSingle) {
@@ -4657,13 +5070,12 @@
return;
}
if (!self.fileManager.getFile($thumb.attr('data-fileid'))) {
- $thumb.attr({'id': self.previewInitId + '-' + i, 'data-fileindex': i});
+ $thumb.attr({'data-fileindex': i});
i++;
} else {
- $thumb.attr({'id': 'uploaded-' + $h.uniqId(), 'data-fileindex': '-1'});
+ $thumb.attr({'data-fileindex': '-1'});
}
- self.$preview.find('#zoom-' + pid).attr({
- 'id': 'zoom-' + $thumb.attr('id'),
+ self._getZoom(pid).attr({
'data-fileindex': $thumb.attr('data-fileindex')
});
});
@@ -4682,6 +5094,29 @@
}
return true;
},
+ _canPreview: function (file) {
+ var self = this;
+ if (!file || !self.showPreview || !self.$preview || !self.$preview.length) {
+ return false;
+ }
+ var name = file.name || '', type = file.type || '', size = (file.size || 0) / 1000,
+ cat = self._parseFileType(type, name), allowedTypes, allowedMimes, allowedExts, skipPreview,
+ types = self.allowedPreviewTypes, mimes = self.allowedPreviewMimeTypes,
+ exts = self.allowedPreviewExtensions || [], dTypes = self.disabledPreviewTypes,
+ dMimes = self.disabledPreviewMimeTypes, dExts = self.disabledPreviewExtensions || [],
+ maxSize = self.maxFilePreviewSize && parseFloat(self.maxFilePreviewSize) || 0,
+ expAllExt = new RegExp('\\.(' + exts.join('|') + ')$', 'i'),
+ expDisExt = new RegExp('\\.(' + dExts.join('|') + ')$', 'i');
+ allowedTypes = !types || types.indexOf(cat) !== -1;
+ allowedMimes = !mimes || mimes.indexOf(type) !== -1;
+ allowedExts = !exts.length || $h.compare(name, expAllExt);
+ skipPreview = (dTypes && dTypes.indexOf(cat) !== -1) || (dMimes && dMimes.indexOf(type) !== -1) ||
+ (dExts.length && $h.compare(name, expDisExt)) || (maxSize && !isNaN(maxSize) && size > maxSize);
+ return !skipPreview && (allowedTypes || allowedMimes || allowedExts);
+ },
+ addToStack: function (file, id) {
+ this.fileManager.add(file, id);
+ },
clearFileStack: function () {
var self = this;
self.fileManager.clear();
@@ -4707,32 +5142,41 @@
getFileList: function () {
return this.fileManager.list();
},
- getFilesCount: function () {
+ getFilesCount: function (includeInitial) {
var self = this, len = self.isAjaxUpload ? self.fileManager.count() : self._inputFileCount();
+ if (includeInitial) {
+ len += self.previewCache.count(true);
+ }
return self._getFileCount(len);
},
readFiles: function (files) {
this.reader = new FileReader();
- var self = this, $el = self.$element, reader = self.reader,
- $container = self.$previewContainer, $status = self.$previewStatus, msgLoading = self.msgLoading,
- msgProgress = self.msgProgress, previewInitId = self.previewInitId, numFiles = files.length,
- settings = self.fileTypeSettings, ctr = self.fileManager.count(), readFile,
- fileTypes = self.allowedFileTypes, typLen = fileTypes ? fileTypes.length : 0,
+ var self = this, reader = self.reader, $container = self.$previewContainer,
+ $status = self.$previewStatus, msgLoading = self.msgLoading, msgProgress = self.msgProgress,
+ previewInitId = self.previewInitId, numFiles = files.length, settings = self.fileTypeSettings,
+ readFile, fileTypes = self.allowedFileTypes, typLen = fileTypes ? fileTypes.length : 0,
fileExt = self.allowedFileExtensions, strExt = $h.isEmpty(fileExt) ? '' : fileExt.join(', '),
throwError = function (msg, file, previewId, index, fileId) {
- var p1 = $.extend(true, {}, self._getOutData(null, {}, {}, files),
- {id: previewId, index: index, fileId: fileId}), $thumb = $('#' + previewId),
+ var $thumb, p1 = $.extend(true, {}, self._getOutData(null, {}, {}, files),
+ {id: previewId, index: index, fileId: fileId}),
p2 = {id: previewId, index: index, fileId: fileId, file: file, files: files};
- self._previewDefault(file, previewId, true);
+ self._previewDefault(file, true);
+ $thumb = self._getFrame(previewId, true);
if (self.isAjaxUpload) {
setTimeout(function () {
readFile(index + 1);
}, self.processDelay);
} else {
+ self.unlock();
numFiles = 0;
}
- self._initFileActions();
- $thumb.remove();
+ if (self.removeFromPreviewOnError && $thumb.length) {
+ $thumb.remove();
+ } else {
+ self._initFileActions();
+ $thumb.find('.kv-file-upload').remove();
+ }
+ self.isPersistentError = true;
self.isError = self.isAjaxUpload ? self._showFileError(msg, p1) : self._showError(msg, p2);
self._updateFileDetails(numFiles);
};
@@ -4744,12 +5188,27 @@
}
});
readFile = function (i) {
- if ($h.isEmpty($el.attr('multiple'))) {
- numFiles = 1;
- }
+ var $error = self.$errorContainer, errors, fm = self.fileManager;
if (i >= numFiles) {
- if (self.isAjaxUpload && self.fileManager.count() > 0) {
- self._raise('filebatchselected', [self.fileManager.stack]);
+ self.unlock();
+ if (self.duplicateErrors.length) {
+ errors = '' + self.duplicateErrors.join(' ') + ' ';
+ if ($error.find('ul').length === 0) {
+ $h.setHtml($error, self.errorCloseButton + '');
+ } else {
+ $error.find('ul').append(errors);
+ }
+ $error.fadeIn(self.fadeDelay);
+ self._handler($error.find('.kv-error-close'), 'click', function () {
+ $error.fadeOut(self.fadeDelay);
+ });
+ self.duplicateErrors = [];
+ }
+ if (self.isAjaxUpload) {
+ self._raise('filebatchselected', [fm.stack]);
+ if (fm.count() === 0 && !self.isError) {
+ self.reset();
+ }
} else {
self._raise('filebatchselected', [files]);
}
@@ -4757,11 +5216,12 @@
$status.html('');
return;
}
- var node = ctr + i, previewId = previewInitId + '-' + node, file = files[i], fSizeKB, j, msg, $thumb,
+ self.lock(true);
+ var file = files[i], previewId = previewInitId + '-' + self._getFileId(file), fSizeKB, j, msg,
fnText = settings.text, fnImage = settings.image, fnHtml = settings.html, typ, chk, typ1, typ2,
caption = self._getFileName(file, ''), fileSize = (file && file.size || 0) / 1000,
fileExtExpr = '', previewData = $h.createObjectURL(file), fileCount = 0,
- strTypes = '', fileId,
+ strTypes = '', fileId, canLoad, fileReaderAborted = false,
func, knownTypes = 0, isText, isHtml, isImage, txtFlag, processFileLoaded = function () {
var msg = msgProgress.setTokens({
'index': i + 1,
@@ -4774,12 +5234,14 @@
self._updateFileDetails(numFiles);
readFile(i + 1);
}, self.processDelay);
- self._raise('fileloaded', [file, previewId, i, reader]);
+ if (self._raise('fileloaded', [file, previewId, i, reader]) && self.isAjaxUpload) {
+ fm.add(file);
+ }
};
if (!file) {
return;
}
- fileId = self.fileManager.getId(file);
+ fileId = fm.getId(file);
if (typLen > 0) {
for (j = 0; j < typLen; j++) {
typ1 = fileTypes[j];
@@ -4800,6 +5262,25 @@
fileExtExpr = new RegExp('\\.(' + fileExt.join('|') + ')$', 'i');
}
fSizeKB = fileSize.toFixed(2);
+ if (self.isAjaxUpload && fm.exists(fileId) || self._getFrame(previewId, true).length) {
+ var p2 = {id: previewId, index: i, fileId: fileId, file: file, files: files};
+ msg = self.msgDuplicateFile.setTokens({name: caption, size: fSizeKB});
+ if (self.isAjaxUpload) {
+ self.duplicateErrors.push(msg);
+ self.isDuplicateError = true;
+ self._raise('fileduplicateerror', [file, fileId, caption, fSizeKB, previewId, i]);
+ readFile(i + 1);
+ self._updateFileDetails(numFiles);
+ } else {
+ self._showError(msg, p2);
+ self.unlock();
+ numFiles = 0;
+ self._clearFileInput();
+ self.reset();
+ self._updateFileDetails(numFiles);
+ }
+ return;
+ }
if (self.maxFileSize > 0 && fileSize > self.maxFileSize) {
msg = self.msgSizeTooLarge.setTokens({
'name': caption,
@@ -4840,26 +5321,20 @@
return;
}
}
- if (self.isAjaxUpload && self.fileManager.exists(fileId)) {
- msg = self.msgDuplicateFile.setTokens({name: caption, size: fSizeKB});
- throwError(msg, file, previewId, i, fileId);
- $thumb = $('#' + previewId);
- if ($thumb && $thumb.length) {
- $thumb.remove();
+ if (!self._canPreview(file)) {
+ canLoad = self.isAjaxUpload && self._raise('filebeforeload', [file, i, reader]);
+ if (self.isAjaxUpload && canLoad) {
+ fm.add(file);
}
- return;
- }
- if (!self.canPreview(file)) {
- if (self.isAjaxUpload) {
- self.fileManager.add(file);
- }
- if (self.showPreview) {
+ if (self.showPreview && canLoad) {
$container.addClass('file-thumb-loading');
- self._previewDefault(file, previewId);
+ self._previewDefault(file);
self._initFileActions();
}
setTimeout(function () {
- self._updateFileDetails(numFiles);
+ if (canLoad) {
+ self._updateFileDetails(numFiles);
+ }
readFile(i + 1);
self._raise('fileloaded', [file, previewId, i]);
}, 10);
@@ -4880,7 +5355,16 @@
self._errorHandler(theFileNew, caption);
};
newReader.onload = function (theFileNew) {
- self._previewFile(i, file, theFileNew, previewId, previewData, fileInfo);
+ if (self.isAjaxUpload && !self._raise('filebeforeload', [file, i, reader])) {
+ fileReaderAborted = true;
+ self._resetCaption();
+ reader.abort();
+ $status.html('');
+ $container.removeClass('file-thumb-loading');
+ self.enable();
+ return;
+ }
+ self._previewFile(i, file, theFileNew, previewData, fileInfo);
self._initFileActions();
processFileLoaded();
};
@@ -4896,7 +5380,7 @@
knownTypes++;
}
});
- if (knownTypes === 0) {// auto detect mime types from content if no known file types detected
+ if (knownTypes === 0) { // auto detect mime types from content if no known file types detected
uint = new Uint8Array(theFile.target.result);
for (j = 0; j < uint.length; j++) {
byte = uint[j].toString(16);
@@ -4918,7 +5402,16 @@
return;
}
}
- self._previewFile(i, file, theFile, previewId, previewData, fileInfo);
+ if (self.isAjaxUpload && !self._raise('filebeforeload', [file, i, reader])) {
+ fileReaderAborted = true;
+ self._resetCaption();
+ reader.abort();
+ $status.html('');
+ $container.removeClass('file-thumb-loading');
+ self.enable();
+ return;
+ }
+ self._previewFile(i, file, theFile, previewData, fileInfo);
self._initFileActions();
processFileLoaded();
};
@@ -4932,11 +5425,12 @@
'name': caption
});
setTimeout(function () {
- $status.html(msg);
+ if (!fileReaderAborted) {
+ $status.html(msg);
+ }
}, self.processDelay);
}
};
-
if (isText || isHtml) {
reader.readAsText(file, self.textEncoding);
} else {
@@ -4946,21 +5440,19 @@
reader.readAsArrayBuffer(file);
}
}
- self.fileManager.add(file);
};
readFile(0);
- self._updateFileDetails(numFiles, false);
+ self._updateFileDetails(numFiles, true);
},
- lock: function () {
+ lock: function (selectMode) {
var self = this, $container = self.$container;
self._resetErrors();
self.disable();
- $container.addClass('is-locked');
- if (self.showCancel) {
+ if (!selectMode && self.showCancel) {
$container.find('.fileinput-cancel').show();
}
- if (self.showPause) {
+ if (!selectMode && self.showPause) {
$container.find('.fileinput-pause').show();
}
self._raise('filelock', [self.fileManager.stack, self._getExtraData()]);
@@ -4986,26 +5478,18 @@
return self.$element;
},
resume: function () {
- var self = this, flag = false, $pr = self.$progress, rm = self.resumableManager;
+ var self = this, flag = false, rm = self.resumableManager;
if (!self.enableResumableUpload) {
return self.$element;
}
if (self.paused) {
- $pr.html(self.progressPauseTemplate.setTokens({
- percent: 101,
- status: self.msgUploadResume,
- stats: ''
- }));
+ self._toggleResumableProgress(self.progressPauseTemplate, self.msgUploadResume);
} else {
flag = true;
}
self.paused = false;
if (flag) {
- $pr.html(self.progressInfoTemplate.setTokens({
- percent: 101,
- status: self.msgUploadBegin,
- stats: ''
- }));
+ self._toggleResumableProgress(self.progressInfoTemplate, self.msgUploadBegin);
}
setTimeout(function () {
rm.upload();
@@ -5014,15 +5498,14 @@
},
pause: function () {
var self = this, rm = self.resumableManager, xhr = self.ajaxRequests, len = xhr.length, i,
- pct = rm.getProgress(), actions = self.fileActionSettings;
+ pct = rm.getProgress(), actions = self.fileActionSettings, tm = self.taskManager,
+ pool = tm.getPool(rm.id);
if (!self.enableResumableUpload) {
return self.$element;
- }
- if (rm.chunkIntervalId) {
- clearInterval(rm.chunkIntervalId);
- }
- if (self.ajaxQueueIntervalId) {
- clearInterval(self.ajaxQueueIntervalId);
+ } else {
+ if (pool) {
+ pool.cancel();
+ }
}
self._raise('fileuploadpaused', [self.fileManager, rm]);
if (len > 0) {
@@ -5051,17 +5534,19 @@
return self.$element;
},
cancel: function () {
- var self = this, xhr = self.ajaxRequests, rm = self.resumableManager, len = xhr.length, i;
- if (self.enableResumableUpload && rm.chunkIntervalId) {
- clearInterval(rm.chunkIntervalId);
+ var self = this, xhr = self.ajaxRequests,
+ rm = self.resumableManager, tm = self.taskManager,
+ pool = rm ? tm.getPool(rm.id) : undefined, len = xhr.length, i;
+
+ if (self.enableResumableUpload && pool) {
+ pool.cancel().done(function () {
+ self._setProgressCancelled();
+ });
rm.reset();
self._raise('fileuploadcancelled', [self.fileManager, rm]);
} else {
self._raise('fileuploadcancelled', [self.fileManager]);
}
- if (self.ajaxQueueIntervalId) {
- clearInterval(self.ajaxQueueIntervalId);
- }
self._initAjax();
if (len > 0) {
for (i = 0; i < len; i += 1) {
@@ -5097,6 +5582,8 @@
self._clearFileInput();
self._resetUpload();
self.clearFileStack();
+ self.isDuplicateError = false;
+ self.isPersistentError = false;
self._resetErrors(true);
if (self._hasInitialPreview()) {
self._showFileIcon();
@@ -5122,7 +5609,9 @@
}
}
self._hideFileIcon();
- self.$captionContainer.focus();
+ if (self.focusCaptionOnClear) {
+ self.$captionContainer.focus();
+ }
self._setFileDropZoneTitle();
self._raise('filecleared');
return self.$element;
@@ -5136,7 +5625,7 @@
self._resetPreview();
self.$container.find('.fileinput-filename').text('');
$h.addCss(self.$container, 'file-input-new');
- if (self.getFrames().length || self.dropZoneEnabled) {
+ if (self.getFrames().length) {
self.$container.removeClass('file-input-new');
}
self.clearFileStack();
@@ -5144,31 +5633,33 @@
return self.$element;
},
disable: function () {
- var self = this;
+ var self = this, $container = self.$container;
self.isDisabled = true;
self._raise('filedisabled');
self.$element.attr('disabled', 'disabled');
- self.$container.find('.kv-fileinput-caption').addClass('file-caption-disabled');
- self.$container.find('.fileinput-remove, .fileinput-upload, .file-preview-frame button')
+ $container.addClass('is-locked');
+ $h.addCss($container.find('.btn-file'), 'disabled');
+ $container.find('.kv-fileinput-caption').addClass('file-caption-disabled');
+ $container.find('.fileinput-remove, .fileinput-upload, .file-preview-frame button')
.attr('disabled', true);
- $h.addCss(self.$container.find('.btn-file'), 'disabled');
self._initDragDrop();
return self.$element;
},
enable: function () {
- var self = this;
+ var self = this, $container = self.$container;
self.isDisabled = false;
self._raise('fileenabled');
self.$element.removeAttr('disabled');
- self.$container.find('.kv-fileinput-caption').removeClass('file-caption-disabled');
- self.$container.find('.fileinput-remove, .fileinput-upload, .file-preview-frame button')
+ $container.removeClass('is-locked');
+ $container.find('.kv-fileinput-caption').removeClass('file-caption-disabled');
+ $container.find('.fileinput-remove, .fileinput-upload, .file-preview-frame button')
.removeAttr('disabled');
- self.$container.find('.btn-file').removeClass('disabled');
+ $container.find('.btn-file').removeClass('disabled');
self._initDragDrop();
return self.$element;
},
upload: function () {
- var self = this, fm = self.fileManager, totLen = fm.count(), i, outData, len,
+ var self = this, fm = self.fileManager, totLen = fm.count(), i, outData,
hasExtraData = !$.isEmptyObject(self._getExtraData());
if (!self.isAjaxUpload || self.isDisabled || !self._isFileSelectionValid(totLen)) {
return;
@@ -5180,9 +5671,8 @@
return;
}
self.cancelling = false;
- self.$progress.show();
+ self._showProgress();
self.lock();
- len = fm.count();
if (totLen === 0 && hasExtraData) {
self._setProgress(2);
self._uploadExtraOnly();
@@ -5195,15 +5685,13 @@
outData = self._getOutData(null);
self._raise('filebatchpreupload', [outData]);
self.fileBatchCompleted = false;
- self.uploadCache = {content: [], config: [], tags: [], append: true};
- for (i = 0; i < len; i++) {
- self.uploadCache.content[i] = null;
- self.uploadCache.config[i] = null;
- self.uploadCache.tags[i] = null;
- }
+ self.uploadCache = [];
+ $.each(self.getFileStack(), function (id) {
+ var previewId = self._getThumbId(id);
+ self.uploadCache.push({id: previewId, content: null, config: null, tags: null, append: true});
+ });
self.$preview.find('.file-preview-initial').removeClass($h.SORT_CSS);
self._initSortable();
- self.cacheInitialPreview = self.getPreview();
}
self._setProgress(2);
self.hasInitData = false;
@@ -5246,15 +5734,8 @@
return $el;
},
zoom: function (frameId) {
- var self = this, $frame = self._getFrame(frameId), $modal = self.$modal;
- if (!$frame) {
- return;
- }
- $h.initModal($modal);
- $modal.html(self._getModalContent());
- self._setZoomContent($frame);
- $modal.modal('show');
- self._initZoomButtons();
+ var self = this, $frame = self._getFrame(frameId);
+ self._showModal($frame);
},
getExif: function (frameId) {
var self = this, $frame = self._getFrame(frameId);
@@ -5296,7 +5777,7 @@
if (lang !== 'en' && !$h.isEmpty($.fn.fileinputLocales[lang])) {
l = $.fn.fileinputLocales[lang] || {};
}
- opt = $.extend(true, {}, $.fn.fileinput.defaults, t, $.fn.fileinputLocales.zh, l, options, self.data());
+ opt = $.extend(true, {}, $.fn.fileinput.defaults, t, $.fn.fileinputLocales.en, l, options, self.data());
data = new FileInput(this, opt);
self.data('fileinput', data);
}
@@ -5315,9 +5796,10 @@
}
};
- //noinspection HtmlUnknownAttribute
+ var IFRAME_ATTRIBS = 'class="kv-preview-data file-preview-pdf" src="{renderer}?file={data}" {style}';
+
$.fn.fileinput.defaults = {
- language: 'en',
+ language: 'zh',
showCaption: true,
showBrowse: true,
showPreview: true,
@@ -5328,6 +5810,7 @@
showPause: null,
showClose: true,
showUploadedThumbs: true,
+ showConsoleLogs: false,
browseOnZoneClick: false,
autoReplace: false,
autoOrientImage: function () { // applicable for JPEG images only and non ios safari
@@ -5340,6 +5823,8 @@
rtl: false,
hideThumbnailContent: false,
encodeUrl: true,
+ focusCaptionOnBrowse: true,
+ focusCaptionOnClear: true,
generateFileId: null,
previewClass: '',
captionClass: '',
@@ -5363,8 +5848,8 @@
deleteExtraData: {},
overwriteInitial: true,
sanitizeZoomCache: function (content) {
- var $container = $(document.createElement('div')).append(content);
- $container.find('input,select,.file-thumbnail-footer').remove();
+ var $container = $h.createElement(content);
+ $container.find('input,textarea,select,datalist,form,.file-thumbnail-footer').remove();
return $container.html();
},
previewZoomButtonIcons: {
@@ -5430,6 +5915,7 @@
retryCount: 'retryCount'
},
maxAjaxThreads: 5,
+ fadeDelay: 800,
processDelay: 100,
queueDelay: 10, // must be lesser than process delay
progressDelay: 0, // must be lesser than process delay
@@ -5458,6 +5944,7 @@
maxFilePreviewSize: 25600, // 25 MB
minFileCount: 0,
maxFileCount: 0,
+ maxTotalFileCount: 0,
validateInitialCount: false,
msgValidationErrorClass: 'text-danger',
msgValidationErrorIcon: ' ',
@@ -5491,12 +5978,11 @@
retryErrorUploads: true,
reversePreviewOrder: false,
usePdfRenderer: function () {
- //noinspection JSUnresolvedVariable
var isIE11 = !!window.MSInputMethodContext && !!document.documentMode;
return !!navigator.userAgent.match(/(iPod|iPhone|iPad|Android)/i) || isIE11;
},
pdfRendererUrl: '',
- pdfRendererTemplate: ''
+ pdfRendererTemplate: ''
};
// noinspection HtmlUnknownAttribute
@@ -5516,13 +6002,14 @@
msgNoFilesSelected: 'No files selected',
msgCancelled: 'Cancelled',
msgPaused: 'Paused',
- msgPlaceholder: 'Select {files}...',
+ msgPlaceholder: 'Select {files} ...',
msgZoomModalHeading: 'Detailed Preview',
msgFileRequired: 'You must select a file to upload.',
msgSizeTooSmall: 'File "{name}" ({size} KB ) is too small and must be larger than {minSize} KB .',
msgSizeTooLarge: 'File "{name}" ({size} KB ) exceeds maximum allowed upload size of {maxSize} KB .',
msgFilesTooLess: 'You must select at least {n} {files} to upload.',
msgFilesTooMany: 'Number of files selected for upload ({n}) exceeds maximum allowed limit of {m} .',
+ msgTotalFilesTooMany: 'You can upload a maximum of {m} files ({n} files detected).',
msgFileNotFound: 'File "{name}" not found!',
msgFileSecured: 'Security restrictions prevent reading the file "{name}".',
msgFileNotReadable: 'File "{name}" is not readable.',
@@ -5542,10 +6029,10 @@
'object': 'object'
},
msgUploadAborted: 'The file upload was aborted',
- msgUploadThreshold: 'Processing...',
- msgUploadBegin: 'Initializing...',
+ msgUploadThreshold: 'Processing …',
+ msgUploadBegin: 'Initializing …',
msgUploadEnd: 'Done',
- msgUploadResume: 'Resuming upload...',
+ msgUploadResume: 'Resuming upload …',
msgUploadEmpty: 'No valid data available for upload.',
msgUploadError: 'Upload Error',
msgDeleteError: 'Delete Error',
@@ -5584,7 +6071,7 @@
close: 'Close detailed preview'
}
};
-
+
$.fn.fileinputLocales.zh = {
fileSingle: '文件',
filePlural: '个文件',
diff --git a/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-fileinput/fileinput.min.css b/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-fileinput/fileinput.min.css
index add4f839c..6532aea57 100644
--- a/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-fileinput/fileinput.min.css
+++ b/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-fileinput/fileinput.min.css
@@ -1,12 +1,13 @@
/*!
- * bootstrap-fileinput v5.0.4
+ * bootstrap-fileinput v5.1.2
* http://plugins.krajee.com/file-input
*
* Krajee default styling for bootstrap-fileinput.
*
* Author: Kartik Visweswaran
- * Copyright: 2014 - 2019, Kartik Visweswaran, Krajee.com
+ * Copyright: 2014 - 2020, Kartik Visweswaran, Krajee.com
*
* Licensed under the BSD-3-Clause
* https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md
- */.btn-file input[type=file],.file-caption-icon,.file-no-browse,.file-preview .fileinput-remove,.file-zoom-dialog .btn-navigate,.file-zoom-dialog .floating-buttons,.krajee-default .file-thumb-progress{position:absolute}.file-loading input[type=file],input[type=file].file-loading{width:0;height:0}.file-no-browse{left:50%;bottom:20%;width:1px;height:1px;font-size:0;opacity:0;border:none;background:0 0;outline:0;box-shadow:none}.file-caption-icon,.file-input-ajax-new .fileinput-remove-button,.file-input-ajax-new .fileinput-upload-button,.file-input-ajax-new .no-browse .input-group-btn,.file-input-new .close,.file-input-new .file-preview,.file-input-new .fileinput-remove-button,.file-input-new .fileinput-upload-button,.file-input-new .glyphicon-file,.file-input-new .no-browse .input-group-btn,.file-zoom-dialog .modal-header:after,.file-zoom-dialog .modal-header:before,.hide-content .kv-file-content,.is-locked .fileinput-remove-button,.is-locked .fileinput-upload-button,.kv-hidden{display:none}.file-caption-icon .kv-caption-icon{line-height:inherit}.btn-file,.file-caption,.file-input,.file-loading:before,.file-preview,.file-zoom-dialog .modal-dialog,.krajee-default .file-thumbnail-footer,.krajee-default.file-preview-frame{position:relative}.file-error-message pre,.file-error-message ul,.krajee-default .file-actions,.krajee-default .file-other-error{text-align:left}.file-error-message pre,.file-error-message ul{margin:0}.krajee-default .file-drag-handle,.krajee-default .file-upload-indicator{float:left;margin-top:10px;width:16px;height:16px}.krajee-default .file-thumb-progress .progress,.krajee-default .file-thumb-progress .progress-bar{height:20px;font-family:Verdana,Helvetica,sans-serif;font-size:9px}.krajee-default .file-thumb-progress .progress,.kv-upload-progress .progress{background-color:#ccc}.krajee-default .file-caption-info,.krajee-default .file-size-info{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:160px;height:15px;margin:auto}.file-zoom-content>.file-object.type-flash,.file-zoom-content>.file-object.type-image,.file-zoom-content>.file-object.type-video{max-width:100%;max-height:100%;width:auto}.file-zoom-content>.file-object.type-flash,.file-zoom-content>.file-object.type-video{height:100%}.file-zoom-content>.file-object.type-default,.file-zoom-content>.file-object.type-html,.file-zoom-content>.file-object.type-pdf,.file-zoom-content>.file-object.type-text{width:100%}.file-loading:before{content:" Loading...";display:inline-block;padding-left:20px;line-height:16px;font-size:13px;font-variant:small-caps;color:#999;background:url(loading.gif) top left no-repeat}.file-object{margin:0 0 -5px;padding:0}.btn-file{overflow:hidden}.btn-file input[type=file]{top:0;left:0;min-width:100%;min-height:100%;text-align:right;opacity:0;background:none;cursor:inherit;display:block}.btn-file ::-ms-browse{font-size:10000px;width:100%;height:100%}.file-caption .file-caption-name{width:100%;margin:0;padding:0;box-shadow:none;border:none;background:0 0;outline:0}.file-caption.icon-visible .file-caption-icon{display:inline-block}.file-caption.icon-visible .file-caption-name{padding-left:15px}.file-caption-icon{left:8px}.file-error-message{color:#a94442;background-color:#f2dede;margin:5px;border:1px solid #ebccd1;border-radius:4px;padding:15px}.file-error-message pre{margin:5px 0}.file-caption-disabled{background-color:#eee;cursor:not-allowed;opacity:1}.file-preview{border-radius:5px;border:1px solid #ddd;padding:8px;width:100%;margin-bottom:5px}.file-preview .btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.file-preview .fileinput-remove{top:1px;right:1px;line-height:10px}.file-preview .clickable{cursor:pointer}.file-preview-image{font:40px Impact,Charcoal,sans-serif;color:green}.krajee-default.file-preview-frame{margin:8px;border:1px solid rgba(0,0,0,.2);box-shadow:0 0 10px 0 rgba(0,0,0,.2);padding:6px;float:left;text-align:center}.krajee-default.file-preview-frame .kv-file-content{width:213px;height:160px}.krajee-default .file-preview-other-frame{display:flex;align-items:center;justify-content:center}.krajee-default.file-preview-frame .kv-file-content.kv-pdf-rendered{width:400px}.krajee-default.file-preview-frame[data-template=audio] .kv-file-content{width:240px;height:55px}.krajee-default.file-preview-frame .file-thumbnail-footer{height:70px}.krajee-default.file-preview-frame:not(.file-preview-error):hover{border:1px solid rgba(0,0,0,.3);box-shadow:0 0 10px 0 rgba(0,0,0,.4)}.krajee-default .file-preview-text{display:block;color:#428bca;border:1px solid #ddd;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;outline:0;padding:8px;resize:none}.krajee-default .file-preview-html{border:1px solid #ddd;padding:8px;overflow:auto}.krajee-default .file-other-icon{font-size:6em;line-height:1}.krajee-default .file-footer-buttons{float:right}.krajee-default .file-footer-caption{display:block;text-align:center;padding-top:4px;font-size:11px;color:#777;margin-bottom:30px}.file-upload-stats{font-size:10px;text-align:center;width:100%}.kv-upload-progress .file-upload-stats{font-size:12px;margin:-10px 0 5px}.krajee-default .file-preview-error{opacity:.65;box-shadow:none}.krajee-default .file-thumb-progress{height:11px;top:37px;left:0;right:0}.krajee-default.kvsortable-ghost{background:#e1edf7;border:2px solid #a1abff}.krajee-default .file-preview-other:hover{opacity:.8}.krajee-default .file-preview-frame:not(.file-preview-error) .file-footer-caption:hover{color:#000}.kv-upload-progress .progress{height:20px;margin:10px 0;overflow:hidden}.kv-upload-progress .progress-bar{height:20px;font-family:Verdana,Helvetica,sans-serif}.file-zoom-dialog .file-other-icon{font-size:22em;font-size:50vmin}.file-zoom-dialog .modal-dialog{width:auto}.file-zoom-dialog .modal-header{display:flex;align-items:center;justify-content:space-between}.file-zoom-dialog .btn-navigate{padding:0;margin:0;background:0 0;text-decoration:none;outline:0;opacity:.7;top:45%;font-size:4em;color:#1c94c4}.file-zoom-dialog .btn-navigate:not([disabled]):hover{outline:0;box-shadow:none;opacity:.6}.file-zoom-dialog .floating-buttons{top:5px;right:10px}.file-zoom-dialog .btn-navigate[disabled]{opacity:.3}.file-zoom-dialog .btn-prev{left:1px}.file-zoom-dialog .btn-next{right:1px}.file-zoom-dialog .kv-zoom-title{font-weight:300;color:#999;max-width:50%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.file-input-ajax-new .no-browse .form-control,.file-input-new .no-browse .form-control{border-top-right-radius:4px;border-bottom-right-radius:4px}.file-caption-main{width:100%}.file-thumb-loading{background:url(loading.gif) center center no-repeat content-box!important}.file-drop-zone{border:1px dashed #aaa;border-radius:4px;text-align:center;vertical-align:middle;margin:12px 15px 12px 12px;padding:5px}.file-drop-zone.clickable:hover{border:2px dashed #999}.file-drop-zone.clickable:focus{border:2px solid #5acde2}.file-drop-zone .file-preview-thumbnails{cursor:default}.file-drop-zone-title{color:#aaa;font-size:1.6em;padding:85px 10px;cursor:default}.file-highlighted{border:2px dashed #999!important;background-color:#eee}.file-uploading{background:url(loading-sm.gif) center bottom 10px no-repeat;opacity:.65}.file-zoom-fullscreen .modal-dialog{min-width:100%;margin:0}.file-zoom-fullscreen .modal-content{border-radius:0;box-shadow:none;min-height:100vh}.file-zoom-fullscreen .modal-body{overflow-y:auto}.floating-buttons{z-index:3000}.floating-buttons .btn-kv{margin-left:3px;z-index:3000}.kv-zoom-actions .btn-kv{margin-left:3px}.file-zoom-content{height:480px;text-align:center}.file-zoom-content .file-preview-image,.file-zoom-content .file-preview-video{max-height:100%}.file-zoom-content>.file-object.type-image{height:auto;min-height:inherit}.file-zoom-content>.file-object.type-audio{width:auto;height:30px}@media (min-width:576px){.file-zoom-dialog .modal-dialog{max-width:500px}}@media (min-width:992px){.file-zoom-dialog .modal-lg{max-width:800px}}@media (max-width:767px){.file-preview-thumbnails{display:flex;justify-content:center;align-items:center;flex-direction:column}.file-zoom-dialog .modal-header{flex-direction:column}}@media (max-width:350px){.krajee-default.file-preview-frame:not([data-template=audio]) .kv-file-content{width:160px}}@media (max-width:420px){.krajee-default.file-preview-frame .kv-file-content.kv-pdf-rendered{width:100%}}.file-loading[dir=rtl]:before{background:url(loading.gif) top right no-repeat;padding-left:0;padding-right:20px}.file-sortable .file-drag-handle{cursor:move;opacity:1}.file-sortable .file-drag-handle:hover{opacity:.7}.clickable .file-drop-zone-title{cursor:pointer}.file-preview-initial.sortable-chosen{background-color:#d9edf7}
\ No newline at end of file
+ */
+ .file-loading input[type=file],input[type=file].file-loading{width:0;height:0}.file-no-browse{position:absolute;left:50%;bottom:20%;width:1px;height:1px;font-size:0;opacity:0;border:0;background:0;outline:0;box-shadow:none}.kv-hidden,.file-caption-icon,.file-zoom-dialog .modal-header:before,.file-zoom-dialog .modal-header:after,.file-input-new .file-preview,.file-input-new .close,.file-input-new .glyphicon-file,.file-input-new .fileinput-remove-button,.file-input-new .fileinput-upload-button,.file-input-new .no-browse .input-group-btn,.file-input-ajax-new .fileinput-remove-button,.file-input-ajax-new .fileinput-upload-button,.file-input-ajax-new .no-browse .input-group-btn,.hide-content .kv-file-content,.is-locked .fileinput-upload-button,.is-locked .fileinput-remove-button{display:none}.btn-file input[type=file],.file-caption-icon,.file-preview .fileinput-remove,.krajee-default .file-thumb-progress,.file-zoom-dialog .btn-navigate,.file-zoom-dialog .floating-buttons{position:absolute}.file-caption-icon .kv-caption-icon{line-height:inherit}.file-input,.file-loading:before,.btn-file,.file-caption,.file-preview,.krajee-default.file-preview-frame,.krajee-default .file-thumbnail-footer,.file-zoom-dialog .modal-dialog{position:relative}.file-error-message pre,.file-error-message ul,.krajee-default .file-actions,.krajee-default .file-other-error{text-align:left}.file-error-message pre,.file-error-message ul{margin:0}.krajee-default .file-drag-handle,.krajee-default .file-upload-indicator{float:left;margin-top:10px;width:16px;height:16px}.file-thumb-progress .progress,.file-thumb-progress .progress-bar{font-family:Verdana,Helvetica,sans-serif;font-size:.7rem}.krajee-default .file-thumb-progress .progress,.kv-upload-progress .progress{background-color:#ccc}.krajee-default .file-caption-info,.krajee-default .file-size-info{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:160px;height:15px;margin:auto}.file-zoom-content>.file-object.type-video,.file-zoom-content>.file-object.type-flash,.file-zoom-content>.file-object.type-image{max-width:100%;max-height:100%;width:auto}.file-zoom-content>.file-object.type-video,.file-zoom-content>.file-object.type-flash{height:100%}.file-zoom-content>.file-object.type-pdf,.file-zoom-content>.file-object.type-html,.file-zoom-content>.file-object.type-text,.file-zoom-content>.file-object.type-default{width:100%}.file-loading:before{content:" Loading...";display:inline-block;padding-left:20px;line-height:16px;font-size:13px;font-variant:small-caps;color:#999;background:transparent url(loading.gif) top left no-repeat}.file-object{margin:0 0 -5px 0;padding:0}.btn-file{overflow:hidden}.btn-file input[type=file]{top:0;left:0;min-width:100%;min-height:100%;text-align:right;opacity:0;background:none repeat scroll 0 0 transparent;cursor:inherit;display:block}.btn-file ::-ms-browse{font-size:10000px;width:100%;height:100%}.file-caption .file-caption-name{width:100%;margin:0;padding:0;box-shadow:none;border:0;background:0;outline:0}.file-caption.icon-visible .file-caption-icon{display:inline-block}.file-caption.icon-visible .file-caption-name{padding-left:15px}.file-caption-icon{left:8px}.file-error-message{color:#a94442;background-color:#f2dede;margin:5px;border:1px solid #ebccd1;border-radius:4px;padding:15px}.file-error-message pre{margin:5px 0}.file-caption-disabled{background-color:#eee;cursor:not-allowed;opacity:1}.file-preview{border-radius:5px;border:1px solid #ddd;padding:8px;width:100%;margin-bottom:5px}.file-preview .btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.file-preview .fileinput-remove{top:1px;right:1px;line-height:10px}.file-preview .clickable{cursor:pointer}.file-preview-image{font:40px Impact,Charcoal,sans-serif;color:#008000}.krajee-default.file-preview-frame{margin:8px;border:1px solid rgba(0,0,0,0.2);box-shadow:0 0 10px 0 rgba(0,0,0,0.2);padding:6px;float:left;text-align:center}.krajee-default.file-preview-frame .kv-file-content{width:213px;height:160px}.krajee-default .file-preview-other-frame{display:flex;align-items:center;justify-content:center}.krajee-default.file-preview-frame .kv-file-content.kv-pdf-rendered{width:400px}.krajee-default.file-preview-frame[data-template="audio"] .kv-file-content{width:240px;height:55px}.krajee-default.file-preview-frame .file-thumbnail-footer{height:70px}.krajee-default.file-preview-frame:not(.file-preview-error):hover{border:1px solid rgba(0,0,0,0.3);box-shadow:0 0 10px 0 rgba(0,0,0,0.4)}.krajee-default .file-preview-text{display:block;color:#428bca;border:1px solid #ddd;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;outline:0;padding:8px;resize:none}.krajee-default .file-preview-html{border:1px solid #ddd;padding:8px;overflow:auto}.krajee-default .file-other-icon{font-size:6em;line-height:1}.krajee-default .file-footer-buttons{float:right}.krajee-default .file-footer-caption{display:block;text-align:center;padding-top:4px;font-size:11px;color:#777;margin-bottom:30px}.file-upload-stats{font-size:10px;text-align:center;width:100%}.kv-upload-progress .file-upload-stats{font-size:12px;margin:-10px 0 5px}.krajee-default .file-preview-error{opacity:.65;box-shadow:none}.krajee-default .file-thumb-progress{top:37px;left:0;right:0}.krajee-default.kvsortable-ghost{background:#e1edf7;border:2px solid #a1abff}.krajee-default .file-preview-other:hover{opacity:.8}.krajee-default .file-preview-frame:not(.file-preview-error) .file-footer-caption:hover{color:#000}.kv-upload-progress .progress{height:20px;margin:10px 0;overflow:hidden}.kv-upload-progress .progress-bar{height:11px;font-family:Verdana,Helvetica,sans-serif}.file-zoom-dialog .file-other-icon{font-size:22em;font-size:50vmin}.file-zoom-dialog .modal-dialog{width:auto}.file-zoom-dialog .modal-header{display:flex;align-items:center;justify-content:space-between}.file-zoom-dialog .btn-navigate{padding:0;margin:-60px 0 0;font-size:60px;background:transparent;text-decoration:none;outline:0;opacity:.7;top:50%;color:#1c94c4}.file-zoom-dialog .btn-navigate:not([disabled]):hover{outline:0;box-shadow:none;opacity:.6}.file-zoom-dialog .floating-buttons{top:5px;right:10px}.file-zoom-dialog .btn-navigate[disabled]{opacity:.3}.file-zoom-dialog .btn-prev{left:1px}.file-zoom-dialog .btn-next{right:1px}.file-zoom-dialog .kv-zoom-title{font-weight:300;color:#999;max-width:50%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.file-input-new .no-browse .form-control{border-top-right-radius:4px;border-bottom-right-radius:4px}.file-input-ajax-new .no-browse .form-control{border-top-right-radius:4px;border-bottom-right-radius:4px}.file-caption-main{width:100%}.file-thumb-loading{background:transparent url(loading.gif) no-repeat scroll center center content-box!important}.file-drop-zone{border:1px dashed #aaa;min-height:260px;border-radius:4px;text-align:center;vertical-align:middle;margin:12px 15px 12px 12px;padding:5px}.file-drop-zone.clickable:hover{border:2px dashed #999}.file-drop-zone.clickable:focus{border:2px solid #5acde2}.file-drop-zone .file-preview-thumbnails{cursor:default}.file-drop-zone-title{color:#aaa;font-size:1.6em;text-align:center;padding:85px 10px;cursor:default}.file-highlighted{border:2px dashed #999!important;background-color:#eee}.file-uploading{background:url(loading-sm.gif) no-repeat center bottom 10px;opacity:.65}.file-zoom-fullscreen .modal-dialog{min-width:100%;margin:0}.file-zoom-fullscreen .modal-content{border-radius:0;box-shadow:none;min-height:100vh}.file-zoom-fullscreen .modal-body{overflow-y:auto}.floating-buttons{z-index:3000}.floating-buttons .btn-kv{margin-left:3px;z-index:3000}.kv-zoom-actions .btn-kv{margin-left:3px}.file-zoom-content{text-align:center;min-height:300px}.file-zoom-content .file-preview-image{max-height:100%}.file-zoom-content .file-preview-video{max-height:100%}.file-zoom-content>.file-object.type-image{height:auto;min-height:inherit}.file-zoom-content>.file-object.type-audio{width:auto;height:30px}@media(min-width:576px){.file-zoom-dialog .modal-dialog{max-width:500px}}@media(min-width:992px){.file-zoom-dialog .modal-lg{max-width:800px}}@media(max-width:767px){.file-preview-thumbnails{display:flex;justify-content:center;align-items:center;flex-direction:column}.file-zoom-dialog .modal-header{flex-direction:column}}@media(max-width:350px){.krajee-default.file-preview-frame:not([data-template="audio"]) .kv-file-content{width:160px}}@media(max-width:420px){.krajee-default.file-preview-frame .kv-file-content.kv-pdf-rendered{width:100%}}.file-loading[dir=rtl]:before{background:transparent url(loading.gif) top right no-repeat;padding-left:0;padding-right:20px}.clickable .file-drop-zone-title{cursor:pointer}.file-sortable .file-drag-handle:hover{opacity:.7}.file-sortable .file-drag-handle{cursor:grab;opacity:1}.file-grabbing,.file-grabbing *{cursor:not-allowed!important}.file-grabbing .file-preview-thumbnails *{cursor:grabbing!important}.file-preview-frame.sortable-chosen{background-color:#d9edf7;border-color:#17a2b8;box-shadow:none!important}
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-fileinput/fileinput.min.js b/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-fileinput/fileinput.min.js
index 2a2206afa..f6c53a835 100644
--- a/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-fileinput/fileinput.min.js
+++ b/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-fileinput/fileinput.min.js
@@ -1,10 +1,11 @@
/*!
- bootstrap-fileinput v5.0.4
- http://plugins.krajee.com/file-input
-
- Author: Kartik Visweswaran
- Copyright: 2014 - 2019, Kartik Visweswaran, Krajee.com
-
- Licensed under the BSD-3-Clause
- https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md
- */(function(factory){'use strict';if(typeof define==='function'&&define.amd){define(['jquery'],factory);}else{if(typeof module==='object'&&module.exports){module.exports=factory(require('jquery'));}else{factory(window.jQuery);}}}(function($){'use strict';$.fn.fileinputLocales={};$.fn.fileinputThemes={};String.prototype.setTokens=function(replacePairs){var str=this.toString(),key,re;for(key in replacePairs){if(replacePairs.hasOwnProperty(key)){re=new RegExp('\{'+key+'\}','g');str=str.replace(re,replacePairs[key]);}}return str;};var $h,FileInput;$h={FRAMES:'.kv-preview-thumb',SORT_CSS:'file-sortable',OBJECT_PARAMS:' \n'+' \n'+' \n'+' \n'+' \n'+' \n',DEFAULT_PREVIEW:'\n'+'{previewFileIcon} \n'+'
',MODAL_ID:'kvFileinputModal',MODAL_EVENTS:['show','shown','hide','hidden','loaded'],logMessages:{ajaxError:'{status}: {error}. Error Details: {text}.',badDroppedFiles:'Error scanning dropped files!',badExifParser:'Error loading the piexif.js library. {details}',badInputType:'The input "type" must be set to "file" for initializing the "bootstrap-fileinput" plugin.',exifWarning:'To avoid this warning, either set "autoOrientImage" to "false" OR ensure you have loaded '+'the "piexif.js" library correctly on your page before the "fileinput.js" script.',invalidChunkSize:'Invalid upload chunk size: "{chunkSize}". Resumable uploads are disabled.',invalidThumb:'Invalid thumb frame with id: "{id}".',noResumableSupport:'The browser does not support resumable or chunk uploads.',noUploadUrl:'The "uploadUrl" is not set. Ajax uploads and resumable uploads have been disabled.',retryStatus:'Retrying upload for chunk # {chunk} for {filename}... retry # {retry}.'},objUrl:window.URL||window.webkitURL,now:function(){return new Date();},round:function(num){num=parseFloat(num);return isNaN(num)?0:Math.floor(Math.round(num));},getFileRelativePath:function(file){return String(file.relativePath||file.webkitRelativePath||$h.getFileName(file)||null);},getFileId:function(file,generateFileId){var relativePath=$h.getFileRelativePath(file);if(typeof generateFileId==='function'){return generateFileId(file);}if(!file){return null;}if(!relativePath){return null;}return(file.size+'_'+relativePath.replace(/\s/img,'_'));},getElapsed:function(seconds){var delta=seconds,out='',result={},structure={year:31536000,month:2592000,week:604800,day:86400,hour:3600,minute:60,second:1};Object.keys(structure).forEach(function(key){result[key]=Math.floor(delta/structure[key]);delta-=result[key]*structure[key];});$.each(result,function(key,value){if(value>0){out+=(out?' ':'')+value+key.substring(0,1);}});return out;},debounce:function(func,delay){var inDebounce;return function(){var args=arguments,context=this;clearTimeout(inDebounce);inDebounce=setTimeout(function(){func.apply(context,args);},delay);};},stopEvent:function(e){e.stopPropagation();e.preventDefault();},getFileName:function(file){return file?(file.fileName||file.name||''):'';},createObjectURL:function(data){if($h.objUrl&&$h.objUrl.createObjectURL&&data){return $h.objUrl.createObjectURL(data);}return'';},revokeObjectURL:function(data){if($h.objUrl&&$h.objUrl.revokeObjectURL&&data){$h.objUrl.revokeObjectURL(data);}},compare:function(input,str,exact){return input!==undefined&&(exact?input===str:input.match(str));},isIE:function(ver){var div,status;if(navigator.appName!=='Microsoft Internet Explorer'){return false;}if(ver===10){return new RegExp('msie\\s'+ver,'i').test(navigator.userAgent);}div=document.createElement('div');div.innerHTML='';status=div.getElementsByTagName('i').length;document.body.appendChild(div);div.parentNode.removeChild(div);return status;},canAssignFilesToInput:function(){var input=document.createElement('input');try{input.type='file';input.files=null;return true;}catch(err){return false;}},getDragDropFolders:function(items){var i,item,len=items?items.length:0,folders=0;if(len>0&&items[0].webkitGetAsEntry()){for(i=0;i=0){byteStr=atob(dataURI.split(',')[1]);}else{byteStr=decodeURIComponent(dataURI.split(',')[1]);}arrayBuffer=new ArrayBuffer(byteStr.length);intArray=new Uint8Array(arrayBuffer);for(i=0;i>4){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:out+=String.fromCharCode(c);break;case 12:case 13:char2=array[i++];out+=String.fromCharCode(((c&0x1F)<<6)|(char2&0x3F));break;case 14:char2=array[i++];char3=array[i++];out+=String.fromCharCode(((c&0x0F)<<12)|((char2&0x3F)<<6)|((char3&0x3F)<<0));break;}}return out;},isHtml:function(str){var a=document.createElement('div');a.innerHTML=str;for(var c=a.childNodes,i=c.length;i--;){if(c[i].nodeType===1){return true;}}return false;},isSvg:function(str){return str.match(/^\s*<\?xml/i)&&(str.match(//g,'>').replace(/"/g,'"').replace(/'/g,''');},replaceTags:function(str,tags){var out=str;if(!tags){return out;}$.each(tags,function(key,value){if(typeof value==='function'){value=value();}out=out.split(key).join(value);});return out;},cleanMemory:function($thumb){var data=$thumb.is('img')?$thumb.attr('src'):$thumb.find('source').attr('src');$h.revokeObjectURL(data);},findFileName:function(filePath){var sepIndex=filePath.lastIndexOf('/');if(sepIndex===-1){sepIndex=filePath.lastIndexOf('\\');}return filePath.split(filePath.substring(sepIndex,sepIndex+1)).pop();},checkFullScreen:function(){return document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement;},toggleFullScreen:function(maximize){var doc=document,de=doc.documentElement;if(de&&maximize&&!$h.checkFullScreen()){if(de.requestFullscreen){de.requestFullscreen();}else{if(de.msRequestFullscreen){de.msRequestFullscreen();}else{if(de.mozRequestFullScreen){de.mozRequestFullScreen();}else{if(de.webkitRequestFullscreen){de.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);}}}}}else{if(doc.exitFullscreen){doc.exitFullscreen();}else{if(doc.msExitFullscreen){doc.msExitFullscreen();}else{if(doc.mozCancelFullScreen){doc.mozCancelFullScreen();}else{if(doc.webkitExitFullscreen){doc.webkitExitFullscreen();}}}}}},moveArray:function(arr,oldIndex,newIndex,reverseOrder){var newArr=$.extend(true,[],arr);if(reverseOrder){newArr.reverse();}if(newIndex>=newArr.length){var k=newIndex-newArr.length;while((k--)+1){newArr.push(undefined);}}newArr.splice(newIndex,0,newArr.splice(oldIndex,1)[0]);if(reverseOrder){newArr.reverse();}return newArr;},cleanZoomCache:function($el){var $cache=$el.closest('.kv-zoom-cache-theme');if(!$cache.length){$cache=$el.closest('.kv-zoom-cache');}$cache.remove();},closeButton:function(css){css=css?'close '+css:'close';return'\n'+' × \n'+' ';},getRotation:function(value){switch(value){case 2:return'rotateY(180deg)';case 3:return'rotate(180deg)';case 4:return'rotate(180deg) rotateY(180deg)';case 5:return'rotate(270deg) rotateY(180deg)';case 6:return'rotate(90deg)';case 7:return'rotate(90deg) rotateY(180deg)';case 8:return'rotate(270deg)';default:return'';}},setTransform:function(el,val){if(!el){return;}el.style.transform=val;el.style.webkitTransform=val;el.style['-moz-transform']=val;el.style['-ms-transform']=val;el.style['-o-transform']=val;}};FileInput=function(element,options){var self=this;self.$element=$(element);self.$parent=self.$element.parent();if(!self._validate()){return;}self.isPreviewable=$h.hasFileAPISupport();self.isIE9=$h.isIE(9);self.isIE10=$h.isIE(10);if(self.isPreviewable||self.isIE9){self._init(options);self._listen();}self.$element.removeClass('file-loading');};FileInput.prototype={constructor:FileInput,_cleanup:function(){var self=this;self.reader=null;self.clearFileStack();self.fileBatchCompleted=true;self.isError=false;self.cancelling=false;self.paused=false;self.lastProgress=0;self._initAjax();},_initAjax:function(){var self=this;self.ajaxQueue=[];self.ajaxRequests=[];self.ajaxQueueIntervalId=null;self.ajaxCurrentThreads=0;self.ajaxAborted=false;},_init:function(options,refreshMode){var self=this,f,$el=self.$element,$cont,t,tmp;self.options=options;$.each(options,function(key,value){switch(key){case'minFileCount':case'maxFileCount':case'minFileSize':case'maxFileSize':case'maxFilePreviewSize':case'resizeImageQuality':case'resizeIfSizeMoreThan':case'progressUploadThreshold':case'initialPreviewCount':case'zoomModalHeight':case'minImageHeight':case'maxImageHeight':case'minImageWidth':case'maxImageWidth':self[key]=$h.getNum(value);break;default:self[key]=value;break;}});if(self.rtl){tmp=self.previewZoomButtonIcons.prev;self.previewZoomButtonIcons.prev=self.previewZoomButtonIcons.next;self.previewZoomButtonIcons.next=tmp;}if(!isNaN(self.maxAjaxThreads)&&self.maxAjaxThreadsrm.file.size?rm.file.size:size;},getTotalChunks:function(){var rm=self.resumableManager,chunkSize=parseFloat(rm.chunkSize);if(!isNaN(chunkSize)&&chunkSize>0){return Math.ceil(rm.file.size/chunkSize);}return 0;},getProgress:function(){var rm=self.resumableManager,processed=rm.processedResumables(),total=rm.chunkCount;if(total===0){return 0;}return Math.ceil(processed/total*100);},checkAborted:function(intervalId){if(self.paused||self.cancelling){clearInterval(intervalId);self.unlock();}},upload:function(){var rm=self.resumableManager,fm=self.fileManager,ids=fm.getIdList(),flag='new',intervalId;intervalId=setInterval(function(){var id;rm.checkAborted(intervalId);if(flag==='new'){self.lock();flag='processing';id=ids.shift();fm.initStats(id);if(fm.stack[id]){rm.init(id,fm.stack[id],fm.getIndex(id));rm.testUpload();rm.uploadResumable();}}if(!fm.isPending(id)&&rm.completed){flag='new';}if(fm.isProcessed()){var $initThumbs=self.$preview.find('.file-preview-initial');if($initThumbs.length){$h.addCss($initThumbs,$h.SORT_CSS);self._initSortable();}clearInterval(intervalId);self._clearFileInput();self.unlock();setTimeout(function(){var data=self.previewCache.data;if(data){self.initialPreview=data.content;self.initialPreviewConfig=data.config;self.initialPreviewThumbTags=data.tags;}self._raise('filebatchuploadcomplete',[self.initialPreview,self.initialPreviewConfig,self.initialPreviewThumbTags,self._getExtraData()]);},self.processDelay);}},self.processDelay);},uploadResumable:function(){var i,rm=self.resumableManager,total=rm.chunkCount;for(i=0;iopts.maxRetries){rm.setProcessed('error');return;}var fd,outData,fnBefore,fnSuccess,fnError,fnComplete,slice=file.slice?'slice':(file.mozSlice?'mozSlice':(file.webkitSlice?'webkitSlice':'slice')),blob=file[slice](chunkSize*index,chunkSize*(index+1));fd=new FormData();f=fm.stack[id];self._setUploadData(fd,{chunkCount:rm.chunkCount,chunkIndex:index,chunkSize:chunkSize,chunkSizeStart:chunkSize*index,fileBlob:[blob,rm.fileName],fileId:id,fileName:rm.fileName,fileRelativePath:f.relativePath,fileSize:file.size,retryCount:retry});if(rm.$progress&&rm.$progress.length){rm.$progress.show();}fnBefore=function(jqXHR){outData=self._getOutData(fd,jqXHR);if(self.showPreview){if(!$thumb.hasClass('file-preview-success')){self._setThumbStatus($thumb,'Loading');$h.addCss($thumb,'file-uploading');}$btnDelete.attr('disabled',true);}self._raise('filechunkbeforesend',[id,index,retry,fm,rm,outData]);};fnSuccess=function(data,textStatus,jqXHR){outData=self._getOutData(fd,jqXHR,data);var paramNames=self.uploadParamNames,chunkIndex=paramNames.chunkIndex||'chunkIndex',opts=self.resumableUploadOptions,params=[id,index,retry,fm,rm,outData];rm.currThreads--;if(data.error){if(opts.showErrorLog){self._log(logs.retryStatus,{retry:retry+1,filename:rm.fileName,chunk:index});}rm.pushAjax(index,retry+1);rm.error=data.error;self._raise('filechunkerror',params);}else{rm.logs[data[chunkIndex]]=true;if(!rm.processed[id]){rm.processed[id]={};}rm.processed[id][data[chunkIndex]]=true;rm.processed[id].data=data;self._raise('filechunksuccess',params);rm.check();}};fnError=function(jqXHR,textStatus,errorThrown){outData=self._getOutData(fd,jqXHR);rm.currThreads--;rm.error=errorThrown;rm.logAjaxError(jqXHR,textStatus,errorThrown);self._raise('filechunkajaxerror',[id,index,retry,fm,rm,outData]);rm.pushAjax(index,retry+1);};fnComplete=function(){self._raise('filechunkcomplete',[id,index,retry,fm,rm,self._getOutData(fd)]);};self._ajaxSubmit(fnBefore,fnSuccess,fnComplete,fnError,fd,id,rm.fileIndex);},loopAjax:function(){var rm=self.resumableManager;if(rm.currThreads=rm.getTotalChunks()){rm.setProcessed('success');clearInterval(rm.chunkIntervalId);}}}}}};self.resumableManager.reset();},_initTemplateDefaults:function(){var self=this,tMain1,tMain2,tPreview,tFileIcon,tClose,tCaption,tBtnDefault,tBtnLink,tBtnBrowse,tModalMain,tModal,tProgress,tSize,tFooter,tActions,tActionDelete,tActionUpload,tActionDownload,tActionZoom,tActionDrag,tIndicator,tTagBef,tTagBef1,tTagBef2,tTagAft,tGeneric,tHtml,tImage,tText,tOffice,tGdocs,tVideo,tAudio,tFlash,tObject,tPdf,tOther,tStyle,tZoomCache,vDefaultDim,tStats;tMain1='{preview}\n'+'
\n'+'';tMain2='{preview}\n
\n
\n'+'{remove}\n{cancel}\n{upload}\n{browse}\n';tPreview='\n'+' {close}'+'
\n'+'
\n'+'
\n'+'
'+'
\n'+'
\n'+'
\n'+'
';tClose=$h.closeButton('fileinput-remove');tFileIcon=' ';tCaption='\n'+' \n'+' \n'+'
';tBtnDefault='{icon} {label} ';tBtnLink='{icon} {label} ';tBtnBrowse='{icon} {label}
';tModalMain='
';tModal='\n'+'
\n'+' \n'+'
\n'+'
\n'+'
\n'+'{prev} {next}\n'+'
\n'+'
\n'+'
\n';tProgress='\n'+'
\n'+' {status}\n'+'
\n'+'
{stats}';tStats=''+'{pendingTime} '+'{uploadSpeed} '+'
';tSize=' ({sizeText}) ';tFooter='';tActions='\n'+' \n'+'
\n'+'{drag}\n'+'
';tActionDelete='{removeIcon} \n';tActionUpload=''+'{uploadIcon} ';tActionDownload='{downloadIcon} ';tActionZoom='{zoomIcon} ';tActionDrag='{dragIcon} ';tIndicator='{indicator}
';tTagBef='\n';tTagBef2=tTagBef+' title="{caption}">
\n';tTagAft='
{footer}\n
\n';tGeneric='{content}\n';tStyle=' {style}';tHtml='
{data}
\n';tImage='
\n';tText='
\n';tOffice='
';tGdocs='
';tVideo='
\n'+'\n'+$h.DEFAULT_PREVIEW+'\n \n';tAudio='
\n\n'+$h.DEFAULT_PREVIEW+'\n \n';tFlash='
\n';tPdf='\n';tObject='\n'+' \n'+$h.OBJECT_PARAMS+' '+$h.DEFAULT_PREVIEW+'\n \n';tOther='\n'+$h.DEFAULT_PREVIEW+'\n
\n';tZoomCache='{zoomContent}
';vDefaultDim={width:'100%',height:'100%','min-height':'480px'};if(self._isPdfRendered()){tPdf=self.pdfRendererTemplate.replace('{renderer}',self._encodeURI(self.pdfRendererUrl));}self.defaults={layoutTemplates:{main1:tMain1,main2:tMain2,preview:tPreview,close:tClose,fileIcon:tFileIcon,caption:tCaption,modalMain:tModalMain,modal:tModal,progress:tProgress,stats:tStats,size:tSize,footer:tFooter,indicator:tIndicator,actions:tActions,actionDelete:tActionDelete,actionUpload:tActionUpload,actionDownload:tActionDownload,actionZoom:tActionZoom,actionDrag:tActionDrag,btnDefault:tBtnDefault,btnLink:tBtnLink,btnBrowse:tBtnBrowse,zoomCache:tZoomCache},previewMarkupTags:{tagBefore1:tTagBef1,tagBefore2:tTagBef2,tagAfter:tTagAft},previewContentTemplates:{generic:tGeneric,html:tHtml,image:tImage,text:tText,office:tOffice,gdocs:tGdocs,video:tVideo,audio:tAudio,flash:tFlash,object:tObject,pdf:tPdf,other:tOther},allowedPreviewTypes:['image','html','text','video','audio','flash','pdf','object'],previewTemplates:{},previewSettings:{image:{width:'auto',height:'auto','max-width':'100%','max-height':'100%'},html:{width:'213px',height:'160px'},text:{width:'213px',height:'160px'},office:{width:'213px',height:'160px'},gdocs:{width:'213px',height:'160px'},video:{width:'213px',height:'160px'},audio:{width:'100%',height:'30px'},flash:{width:'213px',height:'160px'},object:{width:'213px',height:'160px'},pdf:{width:'100%',height:'160px'},other:{width:'213px',height:'160px'}},previewSettingsSmall:{image:{width:'auto',height:'auto','max-width':'100%','max-height':'100%'},html:{width:'100%',height:'160px'},text:{width:'100%',height:'160px'},office:{width:'100%',height:'160px'},gdocs:{width:'100%',height:'160px'},video:{width:'100%',height:'auto'},audio:{width:'100%',height:'30px'},flash:{width:'100%',height:'auto'},object:{width:'100%',height:'auto'},pdf:{width:'100%',height:'160px'},other:{width:'100%',height:'160px'}},previewZoomSettings:{image:{width:'auto',height:'auto','max-width':'100%','max-height':'100%'},html:vDefaultDim,text:vDefaultDim,office:{width:'100%',height:'100%','max-width':'100%','min-height':'480px'},gdocs:{width:'100%',height:'100%','max-width':'100%','min-height':'480px'},video:{width:'auto',height:'100%','max-width':'100%'},audio:{width:'100%',height:'30px'},flash:{width:'auto',height:'480px'},object:{width:'auto',height:'100%','max-width':'100%','min-height':'480px'},pdf:vDefaultDim,other:{width:'auto',height:'100%','min-height':'480px'}},mimeTypeAliases:{'video/quicktime':'video/mp4'},fileTypeSettings:{image:function(vType,vName){return($h.compare(vType,'image.*')&&!$h.compare(vType,/(tiff?|wmf)$/i)||$h.compare(vName,/\.(gif|png|jpe?g)$/i));},html:function(vType,vName){return $h.compare(vType,'text/html')||$h.compare(vName,/\.(htm|html)$/i);},office:function(vType,vName){return $h.compare(vType,/(word|excel|powerpoint|office)$/i)||$h.compare(vName,/\.(docx?|xlsx?|pptx?|pps|potx?)$/i);},gdocs:function(vType,vName){return $h.compare(vType,/(word|excel|powerpoint|office|iwork-pages|tiff?)$/i)||$h.compare(vName,/\.(docx?|xlsx?|pptx?|pps|potx?|rtf|ods|odt|pages|ai|dxf|ttf|tiff?|wmf|e?ps)$/i);},text:function(vType,vName){return $h.compare(vType,'text.*')||$h.compare(vName,/\.(xml|javascript)$/i)||$h.compare(vName,/\.(txt|md|csv|nfo|ini|json|php|js|css)$/i);},video:function(vType,vName){return $h.compare(vType,'video.*')&&($h.compare(vType,/(ogg|mp4|mp?g|mov|webm|3gp)$/i)||$h.compare(vName,/\.(og?|mp4|webm|mp?g|mov|3gp)$/i));},audio:function(vType,vName){return $h.compare(vType,'audio.*')&&($h.compare(vName,/(ogg|mp3|mp?g|wav)$/i)||$h.compare(vName,/\.(og?|mp3|mp?g|wav)$/i));},flash:function(vType,vName){return $h.compare(vType,'application/x-shockwave-flash',true)||$h.compare(vName,/\.(swf)$/i);},pdf:function(vType,vName){return $h.compare(vType,'application/pdf',true)||$h.compare(vName,/\.(pdf)$/i);},object:function(){return true;},other:function(){return true;}},fileActionSettings:{showRemove:true,showUpload:true,showDownload:true,showZoom:true,showDrag:true,removeIcon:' ',removeClass:'btn btn-sm btn-kv btn-default btn-outline-secondary',removeErrorClass:'btn btn-sm btn-kv btn-danger',removeTitle:'Remove file',uploadIcon:' ',uploadClass:'btn btn-sm btn-kv btn-default btn-outline-secondary',uploadTitle:'Upload file',uploadRetryIcon:' ',uploadRetryTitle:'Retry upload',downloadIcon:' ',downloadClass:'btn btn-sm btn-kv btn-default btn-outline-secondary',downloadTitle:'Download file',zoomIcon:' ',zoomClass:'btn btn-sm btn-kv btn-default btn-outline-secondary',zoomTitle:'View Details',dragIcon:' ',dragClass:'text-info',dragTitle:'Move / Rearrange',dragSettings:{},indicatorNew:' ',indicatorSuccess:' ',indicatorError:' ',indicatorLoading:' ',indicatorPaused:' ',indicatorNewTitle:'Not uploaded yet',indicatorSuccessTitle:'Uploaded',indicatorErrorTitle:'Upload Error',indicatorLoadingTitle:'Uploading ...',indicatorPausedTitle:'Upload Paused'}};$.each(self.defaults,function(key,setting){if(key==='allowedPreviewTypes'){if(self.allowedPreviewTypes===undefined){self.allowedPreviewTypes=setting;}return;}self[key]=$.extend(true,{},setting,self[key]);});self._initPreviewTemplates();},_initPreviewTemplates:function(){var self=this,tags=self.previewMarkupTags,tagBef,tagAft=tags.tagAfter;$.each(self.previewContentTemplates,function(key,value){if($h.isEmpty(self.previewTemplates[key])){tagBef=tags.tagBefore2;if(key==='generic'||key==='image'||key==='html'||key==='text'){tagBef=tags.tagBefore1;}if(self._isPdfRendered()&&key==='pdf'){tagBef=tagBef.replace('kv-file-content','kv-file-content kv-pdf-rendered');}self.previewTemplates[key]=tagBef+value+tagAft;}});},_initPreviewCache:function(){var self=this;self.previewCache={data:{},init:function(){var content=self.initialPreview;if(content.length>0&&!$h.isArray(content)){content=content.split(self.initialPreviewDelimiter);}self.previewCache.data={content:content,config:self.initialPreviewConfig,tags:self.initialPreviewThumbTags};},count:function(skipNull){if(!self.previewCache.data||!self.previewCache.data.content){return 0;}if(skipNull){var chk=self.previewCache.data.content.filter(function(n){return n!==null;});return chk.length;}return self.previewCache.data.content.length;},get:function(i,isDisabled){var ind='init_'+i,data=self.previewCache.data,config=data.config[i],fileId,content=data.content[i],previewId=self.previewInitId+'-'+ind,out,$tmp,cat,ftr,fname,ftype,frameClass,asData=$h.ifSet('previewAsData',config,self.initialPreviewAsData),a=config?{title:config.title||null,alt:config.alt||null}:{title:null,alt:null},parseTemplate=function(cat,dat,fn,ft,id,ftr,ind,fc,t){fc=' file-preview-initial '+$h.SORT_CSS+(fc?' '+fc:'');fileId=config&&config.fileId||'file_'+id;return self._generatePreviewTemplate(cat,dat,fn,ft,id,fileId,false,null,fc,ftr,ind,t,a,config&&config.zoomData||dat);};if(!content||!content.length){return'';}isDisabled=isDisabled===undefined?true:isDisabled;cat=$h.ifSet('type',config,self.initialPreviewFileType||'generic');fname=$h.ifSet('filename',config,$h.ifSet('caption',config));ftype=$h.ifSet('filetype',config,cat);ftr=self.previewCache.footer(i,isDisabled,(config&&config.size||null));frameClass=$h.ifSet('frameClass',config);if(asData){out=parseTemplate(cat,content,fname,ftype,previewId,ftr,ind,frameClass);}else{out=parseTemplate('generic',content,fname,ftype,previewId,ftr,ind,frameClass,cat).setTokens({'content':data.content[i]});}if(data.tags.length&&data.tags[i]){out=$h.replaceTags(out,data.tags[i]);}if(!$h.isEmpty(config)&&!$h.isEmpty(config.frameAttr)){$tmp=$(document.createElement('div')).html(out);$tmp.find('.file-preview-initial').attr(config.frameAttr);out=$tmp.html();$tmp.remove();}return out;},clean:function(data){data.content=$h.cleanArray(data.content);data.config=$h.cleanArray(data.config);data.tags=$h.cleanArray(data.tags);self.previewCache.data=data;},add:function(content,config,tags,append){var data=self.previewCache.data,index=content.length-1;if(!content||!content.length){return index;}if(!$h.isArray(content)){content=content.split(self.initialPreviewDelimiter);}if(append){index=data.content.push(content[0])-1;data.config[index]=config;data.tags[index]=tags;}else{data.content=content;data.config=config;data.tags=tags;}self.previewCache.clean(data);return index;},set:function(content,config,tags,append){var data=self.previewCache.data,i,chk;if(!content||!content.length){return;}if(!$h.isArray(content)){content=content.split(self.initialPreviewDelimiter);}chk=content.filter(function(n){return n!==null;});if(!chk.length){return;}if(data.content===undefined){data.content=[];}if(data.config===undefined){data.config=[];}if(data.tags===undefined){data.tags=[];}if(append){for(i=0;i'+msg+'':''+msg+' ';if($error.find('ul').length===0){self._addError('');}else{$error.find('ul').append(e);}$error.fadeIn(800);self._raise(ev,[params,msg]);self._setValidationError('file-input-new');return true;},_showError:function(msg,params,event){var self=this,$error=self.$errorContainer,ev=event||'fileerror';params=params||{};params.reader=self.reader;self._addError(msg);$error.fadeIn(800);self._raise(ev,[params,msg]);if(!self.isAjaxUpload){self._clearFileInput();}self._setValidationError('file-input-new');self.$btnUpload.attr('disabled',true);return true;},_noFilesError:function(params){var self=this,label=self.minFileCount>1?self.filePlural:self.fileSingle,msg=self.msgFilesTooLess.replace('{n}',self.minFileCount).replace('{files}',label),$error=self.$errorContainer;self._addError(msg);self.isError=true;self._updateFileDetails(0);$error.fadeIn(800);self._raise('fileerror',[params,msg]);self._clearFileInput();self._setValidationError();},_parseError:function(operation,jqXHR,errorThrown,fileName){var self=this,errMsg=$.trim(errorThrown+''),textPre,text=jqXHR.responseJSON!==undefined&&jqXHR.responseJSON.error!==undefined?jqXHR.responseJSON.error:jqXHR.responseText;if(self.cancelling&&self.msgUploadAborted){errMsg=self.msgUploadAborted;}if(self.showAjaxErrorDetails&&text){text=$.trim(text.replace(/\n\s*\n/g,'\n'));textPre=text.length?''+text+' ':'';errMsg+=errMsg?textPre:text;}if(!errMsg){errMsg=self.msgAjaxError.replace('{operation}',operation);}self.cancelling=false;return fileName?''+fileName+': '+errMsg:errMsg;},_parseFileType:function(type,name){var self=this,isValid,vType,cat,i,types=self.allowedPreviewTypes||[];if(type==='application/text-plain'){return'text';}for(i=0;i-1){ext=fname.split('.').pop();if(self.previewFileIconSettings){out=self.previewFileIconSettings[ext]||self.previewFileIconSettings[ext.toLowerCase()]||null;}if(self.previewFileExtSettings){$.each(self.previewFileExtSettings,function(key,func){if(self.previewFileIconSettings[key]&&func(ext)){out=self.previewFileIconSettings[key];return;}});}}return out;},_parseFilePreviewIcon:function(content,fname){var self=this,icn=self._getPreviewIcon(fname)||self.previewFileIcon,out=content;if(out.indexOf('{previewFileIcon}')>-1){out=out.setTokens({'previewFileIconClass':self.previewFileIconClass,'previewFileIcon':icn});}return out;},_raise:function(event,params){var self=this,e=$.Event(event);if(params!==undefined){self.$element.trigger(e,params);}else{self.$element.trigger(e);}if(e.isDefaultPrevented()||e.result===false){return false;}switch(event){case'filebatchuploadcomplete':case'filebatchuploadsuccess':case'fileuploaded':case'fileclear':case'filecleared':case'filereset':case'fileerror':case'filefoldererror':case'fileuploaderror':case'filebatchuploaderror':case'filedeleteerror':case'filecustomerror':case'filesuccessremove':break;default:if(!self.ajaxAborted){self.ajaxAborted=e.result;}break;}return true;},_listenFullScreen:function(isFullScreen){var self=this,$modal=self.$modal,$btnFull,$btnBord;if(!$modal||!$modal.length){return;}$btnFull=$modal&&$modal.find('.btn-fullscreen');$btnBord=$modal&&$modal.find('.btn-borderless');if(!$btnFull.length||!$btnBord.length){return;}$btnFull.removeClass('active').attr('aria-pressed','false');$btnBord.removeClass('active').attr('aria-pressed','false');if(isFullScreen){$btnFull.addClass('active').attr('aria-pressed','true');}else{$btnBord.addClass('active').attr('aria-pressed','true');}if($modal.hasClass('file-zoom-fullscreen')){self._maximizeZoomDialog();}else{if(isFullScreen){self._maximizeZoomDialog();}else{$btnBord.removeClass('active').attr('aria-pressed','false');}}},_listen:function(){var self=this,$el=self.$element,$form=self.$form,$cont=self.$container,fullScreenEvents;self._handler($el,'click',function(e){if($el.hasClass('file-no-browse')){if($el.data('zoneClicked')){$el.data('zoneClicked',false);}else{e.preventDefault();}}});self._handler($el,'change',$.proxy(self._change,self));if(self.showBrowse){self._handler(self.$btnFile,'click',$.proxy(self._browse,self));}self._handler($cont.find('.fileinput-remove:not([disabled])'),'click',$.proxy(self.clear,self));self._handler($cont.find('.fileinput-cancel'),'click',$.proxy(self.cancel,self));self._handler($cont.find('.fileinput-pause'),'click',$.proxy(self.pause,self));self._initDragDrop();self._handler($form,'reset',$.proxy(self.clear,self));if(!self.isAjaxUpload){self._handler($form,'submit',$.proxy(self._submitForm,self));}self._handler(self.$container.find('.fileinput-upload'),'click',$.proxy(self._uploadClick,self));self._handler($(window),'resize',function(){self._listenFullScreen(screen.width===window.innerWidth&&screen.height===window.innerHeight);});fullScreenEvents='webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange';self._handler($(document),fullScreenEvents,function(){self._listenFullScreen($h.checkFullScreen());});self._autoFitContent();self._initClickable();self._refreshPreview();},_autoFitContent:function(){var width=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,self=this,config=width<400?(self.previewSettingsSmall||self.defaults.previewSettingsSmall):(self.previewSettings||self.defaults.previewSettings),sel;$.each(config,function(cat,settings){sel='.file-preview-frame .file-preview-'+cat;self.$preview.find(sel+'.kv-preview-data,'+sel+' .kv-preview-data').css(settings);});},_scanDroppedItems:function(item,files,path){path=path||'';var self=this,i,dirReader,readDir,errorHandler=function(e){self._log($h.logMessages.badDroppedFiles);self._log(e);};if(item.isFile){item.file(function(file){files.push(file);},errorHandler);}else{if(item.isDirectory){dirReader=item.createReader();readDir=function(){dirReader.readEntries(function(entries){if(entries&&entries.length>0){for(i=0;i-1;self._zoneDragDropInit(e);if(self.isDisabled||!hasFiles){e.originalEvent.dataTransfer.effectAllowed='none';e.originalEvent.dataTransfer.dropEffect='none';return;}if(self._raise('fileDragEnter',{'sourceEvent':e,'files':dataTransfer.types.Files})){$h.addCss(self.$dropZone,'file-highlighted');}},_zoneDragLeave:function(e){var self=this;self._zoneDragDropInit(e);if(self.isDisabled){return;}if(self._raise('fileDragLeave',{'sourceEvent':e})){self.$dropZone.removeClass('file-highlighted');}},_zoneDrop:function(e){var self=this,i,$el=self.$element,dataTransfer=e.originalEvent.dataTransfer,files=dataTransfer.files,items=dataTransfer.items,folders=$h.getDragDropFolders(items),processFiles=function(){if(!self.isAjaxUpload){self.changeTriggered=true;$el.get(0).files=files;setTimeout(function(){self.changeTriggered=false;$el.trigger('change'+self.namespace);},self.processDelay);}else{self._change(e,files);}self.$dropZone.removeClass('file-highlighted');};e.preventDefault();if(self.isDisabled||$h.isEmpty(files)){return;}if(!self._raise('fileDragDrop',{'sourceEvent':e,'files':files})){return;}if(folders>0){if(!self.isAjaxUpload){self._showFolderError(folders);return;}files=[];for(i=0;i.kv-file-content img');$zoomImg=self.$preview.find('#zoom-'+id+' >.kv-file-content img');self.setImageOrientation($img,$zoomImg,config.exif.Orientation,$thumb);}i++;});},_initPreview:function(isInit){var self=this,cap=self.initialCaption||'',out;if(!self.previewCache.count(true)){self._clearPreview();if(isInit){self._setCaption(cap);}else{self._initCaption();}return;}out=self.previewCache.out();cap=isInit&&self.initialCaption?self.initialCaption:out.caption;self._setPreviewContent(out.content);self._setInitThumbAttr();self._setCaption(cap);self._initSortable();if(!$h.isEmpty(out.content)){self.$container.removeClass('file-input-new');}self._initPreviewImageOrientations();},_getZoomButton:function(type){var self=this,label=self.previewZoomButtonIcons[type],css=self.previewZoomButtonClasses[type],title=' title="'+(self.previewZoomButtonTitles[type]||'')+'" ',params=title+(type==='close'?' data-dismiss="modal" aria-hidden="true"':'');if(type==='fullscreen'||type==='borderless'||type==='toggleheader'){params+=' data-toggle="button" aria-pressed="false" autocomplete="off"';}return''+label+' ';},_getModalContent:function(){var self=this;return self._getLayoutTemplate('modal').setTokens({'rtl':self.rtl?' kv-rtl':'','zoomFrameClass':self.frameClass,'heading':self.msgZoomModalHeading,'prev':self._getZoomButton('prev'),'next':self._getZoomButton('next'),'toggleheader':self._getZoomButton('toggleheader'),'fullscreen':self._getZoomButton('fullscreen'),'borderless':self._getZoomButton('borderless'),'close':self._getZoomButton('close')});},_listenModalEvent:function(event){var self=this,$modal=self.$modal,getParams=function(e){return{sourceEvent:e,previewId:$modal.data('previewId'),modal:$modal};};$modal.on(event+'.bs.modal',function(e){var $btnFull=$modal.find('.btn-fullscreen'),$btnBord=$modal.find('.btn-borderless');self._raise('filezoom'+event,getParams(e));if(event==='shown'){$btnBord.removeClass('active').attr('aria-pressed','false');$btnFull.removeClass('active').attr('aria-pressed','false');if($modal.hasClass('file-zoom-fullscreen')){self._maximizeZoomDialog();if($h.checkFullScreen()){$btnFull.addClass('active').attr('aria-pressed','true');}else{$btnBord.addClass('active').attr('aria-pressed','true');}}}});},_initZoom:function(){var self=this,$dialog,modalMain=self._getLayoutTemplate('modalMain'),modalId='#'+$h.MODAL_ID;if(!self.showPreview){return;}self.$modal=$(modalId);if(!self.$modal||!self.$modal.length){$dialog=$(document.createElement('div')).html(modalMain).insertAfter(self.$container);self.$modal=$(modalId).insertBefore($dialog);$dialog.remove();}$h.initModal(self.$modal);self.$modal.html(self._getModalContent());$.each($h.MODAL_EVENTS,function(key,event){self._listenModalEvent(event);});},_initZoomButtons:function(){var self=this,previewId=self.$modal.data('previewId')||'',$first,$last,thumbs=self.getFrames().toArray(),len=thumbs.length,$prev=self.$modal.find('.btn-prev'),$next=self.$modal.find('.btn-next');if(thumbs.length<2){$prev.hide();$next.hide();return;}else{$prev.show();$next.show();}if(!len){return;}$first=$(thumbs[0]);$last=$(thumbs[len-1]);$prev.removeAttr('disabled');$next.removeAttr('disabled');if($first.length&&$first.attr('id')===previewId){$prev.attr('disabled',true);}if($last.length&&$last.attr('id')===previewId){$next.attr('disabled',true);}},_maximizeZoomDialog:function(){var self=this,$modal=self.$modal,$head=$modal.find('.modal-header:visible'),$foot=$modal.find('.modal-footer:visible'),$body=$modal.find('.modal-body'),h=$(window).height(),diff=0;$modal.addClass('file-zoom-fullscreen');if($head&&$head.length){h-=$head.outerHeight(true);}if($foot&&$foot.length){h-=$foot.outerHeight(true);}if($body&&$body.length){diff=$body.outerHeight(true)-$body.height();h-=diff;}$modal.find('.kv-zoom-body').height(h);},_resizeZoomDialog:function(fullScreen){var self=this,$modal=self.$modal,$btnFull=$modal.find('.btn-fullscreen'),$btnBord=$modal.find('.btn-borderless');if($modal.hasClass('file-zoom-fullscreen')){$h.toggleFullScreen(false);if(!fullScreen){if(!$btnFull.hasClass('active')){$modal.removeClass('file-zoom-fullscreen');self.$modal.find('.kv-zoom-body').css('height',self.zoomModalHeight);}else{$btnFull.removeClass('active').attr('aria-pressed','false');}}else{if(!$btnFull.hasClass('active')){$modal.removeClass('file-zoom-fullscreen');self._resizeZoomDialog(true);if($btnBord.hasClass('active')){$btnBord.removeClass('active').attr('aria-pressed','false');}}}}else{if(!fullScreen){self._maximizeZoomDialog();return;}$h.toggleFullScreen(true);}$modal.focus();},_setZoomContent:function($frame,animate){var self=this,$content,tmplt,body,title,$body,$dataEl,config,previewId=$frame.attr('id'),$zoomPreview=self.$preview.find('#zoom-'+previewId),$modal=self.$modal,$tmp,$btnFull=$modal.find('.btn-fullscreen'),$btnBord=$modal.find('.btn-borderless'),cap,size,$btnTogh=$modal.find('.btn-toggleheader');tmplt=$zoomPreview.attr('data-template')||'generic';$content=$zoomPreview.find('.kv-file-content');body=$content.length?$content.html():'';cap=$frame.data('caption')||'';size=$frame.data('size')||'';title=cap+' '+size;$modal.find('.kv-zoom-title').attr('title',$('
').html(title).text()).html(title);$body=$modal.find('.kv-zoom-body');$modal.removeClass('kv-single-content');if(animate){$tmp=$body.addClass('file-thumb-loading').clone().insertAfter($body);$body.html(body).hide();$tmp.fadeOut('fast',function(){$body.fadeIn('fast',function(){$body.removeClass('file-thumb-loading');});$tmp.remove();});}else{$body.html(body);}config=self.previewZoomSettings[tmplt];if(config){$dataEl=$body.find('.kv-preview-data');$h.addCss($dataEl,'file-zoom-detail');$.each(config,function(key,value){$dataEl.css(key,value);if(($dataEl.attr('width')&&key==='width')||($dataEl.attr('height')&&key==='height')){$dataEl.removeAttr(key);}});}$modal.data('previewId',previewId);self._handler($modal.find('.btn-prev'),'click',function(){self._zoomSlideShow('prev',previewId);});self._handler($modal.find('.btn-next'),'click',function(){self._zoomSlideShow('next',previewId);});self._handler($btnFull,'click',function(){self._resizeZoomDialog(true);});self._handler($btnBord,'click',function(){self._resizeZoomDialog(false);});self._handler($btnTogh,'click',function(){var $header=$modal.find('.modal-header'),$floatBar=$modal.find('.modal-body .floating-buttons'),ht,$actions=$header.find('.kv-zoom-actions'),resize=function(height){var $body=self.$modal.find('.kv-zoom-body'),h=self.zoomModalHeight;if($modal.hasClass('file-zoom-fullscreen')){h=$body.outerHeight(true);if(!height){h=h-$header.outerHeight(true);}}$body.css('height',height?h+height:h);};if($header.is(':visible')){ht=$header.outerHeight(true);$header.slideUp('slow',function(){$actions.find('.btn').appendTo($floatBar);resize(ht);});}else{$floatBar.find('.btn').appendTo($actions);$header.slideDown('slow',function(){resize();});}$modal.focus();});self._handler($modal,'keydown',function(e){var key=e.which||e.keyCode,$prev=$(this).find('.btn-prev'),$next=$(this).find('.btn-next'),vId=$(this).data('previewId'),vPrevKey=self.rtl?39:37,vNextKey=self.rtl?37:39;if(key===vPrevKey&&$prev.length&&!$prev.attr('disabled')){self._zoomSlideShow('prev',vId);}if(key===vNextKey&&$next.length&&!$next.attr('disabled')){self._zoomSlideShow('next',vId);}});},_zoomPreview:function($btn){var self=this,$frame,$modal=self.$modal;if(!$btn.length){throw'Cannot zoom to detailed preview!';}$h.initModal($modal);$modal.html(self._getModalContent());$frame=$btn.closest($h.FRAMES);self._setZoomContent($frame);$modal.modal('show');self._initZoomButtons();},_zoomSlideShow:function(dir,previewId){var self=this,$btn=self.$modal.find('.kv-zoom-actions .btn-'+dir),$targFrame,i,thumbs=self.getFrames().toArray(),len=thumbs.length,out;if($btn.attr('disabled')){return;}for(i=0;i=len||!thumbs[out]){return;}$targFrame=$(thumbs[out]);if($targFrame.length){self._setZoomContent($targFrame,true);}self._initZoomButtons();self._raise('filezoom'+dir,{'previewId':previewId,modal:self.$modal});},_initZoomButton:function(){var self=this;self.$preview.find('.kv-file-zoom').each(function(){var $el=$(this);self._handler($el,'click',function(){self._zoomPreview($el);});});},_inputFileCount:function(){return this.$element.get(0).files.length;},_refreshPreview:function(){var self=this,files;if((!self._inputFileCount()&&!self.isAjaxUpload)||!self.showPreview||!self.isPreviewable){return;}if(self.isAjaxUpload){if(self.fileManager.count()>0){files=$.extend(true,{},self.fileManager.stack);self.fileManager.clear();self._clearFileInput();}else{files=self.$element.get(0).files;}}else{files=self.$element.get(0).files;}if(files&&files.length){self.readFiles(files);self._setFileDropZoneTitle();}},_clearObjects:function($el){$el.find('video audio').each(function(){this.pause();$(this).remove();});$el.find('img object div').each(function(){$(this).remove();});},_clearFileInput:function(){var self=this,$el=self.$element,$srcFrm,$tmpFrm,$tmpEl;if(!self._inputFileCount()){return;}$srcFrm=$el.closest('form');$tmpFrm=$(document.createElement('form'));$tmpEl=$(document.createElement('div'));$el.before($tmpEl);if($srcFrm.length){$srcFrm.after($tmpFrm);}else{$tmpEl.after($tmpFrm);}$tmpFrm.append($el).trigger('reset');$tmpEl.before($el).remove();$tmpFrm.remove();},_resetUpload:function(){var self=this;self.uploadCache={content:[],config:[],tags:[],append:true};self.$btnUpload.removeAttr('disabled');self._setProgress(0);self.$progress.hide();self._resetErrors(false);self._initAjax();self.fileManager.clearImages();self._resetCanvas();self.cacheInitialPreview={};if(self.overwriteInitial){self.initialPreview=[];self.initialPreviewConfig=[];self.initialPreviewThumbTags=[];self.previewCache.data={content:[],config:[],tags:[]};}},_resetCanvas:function(){var self=this;if(self.canvas&&self.imageCanvasContext){self.imageCanvasContext.clearRect(0,0,self.canvas.width,self.canvas.height);}},_hasInitialPreview:function(){var self=this;return!self.overwriteInitial&&self.previewCache.count(true);},_resetPreview:function(){var self=this,out,cap;if(self.previewCache.count(true)){out=self.previewCache.out();self._setPreviewContent(out.content);self._setInitThumbAttr();cap=self.initialCaption?self.initialCaption:out.caption;self._setCaption(cap);}else{self._clearPreview();self._initCaption();}if(self.showPreview){self._initZoom();self._initSortable();}},_clearDefaultPreview:function(){var self=this;self.$preview.find('.file-default-preview').remove();},_validateDefaultPreview:function(){var self=this;if(!self.showPreview||$h.isEmpty(self.defaultPreviewContent)){return;}self._setPreviewContent(''+self.defaultPreviewContent+'
');self.$container.removeClass('file-input-new');self._initClickable();},_resetPreviewThumbs:function(isAjax){var self=this,out;if(isAjax){self._clearPreview();self.clearFileStack();return;}if(self._hasInitialPreview()){out=self.previewCache.out();self._setPreviewContent(out.content);self._setInitThumbAttr();self._setCaption(out.caption);self._initPreviewActions();}else{self._clearPreview();}},_getLayoutTemplate:function(t){var self=this,template=self.layoutTemplates[t];if($h.isEmpty(self.customLayoutTags)){return template;}return $h.replaceTags(template,self.customLayoutTags);},_getPreviewTemplate:function(t){var self=this,template=self.previewTemplates[t];if($h.isEmpty(self.customPreviewTags)){return template;}return $h.replaceTags(template,self.customPreviewTags);},_getOutData:function(formdata,jqXHR,responseData,filesData){var self=this;jqXHR=jqXHR||{};responseData=responseData||{};filesData=filesData||self.fileManager.list();return{formdata:formdata,files:filesData,filenames:self.filenames,filescount:self.getFilesCount(),extra:self._getExtraData(),response:responseData,reader:self.reader,jqXHR:jqXHR};},_getMsgSelected:function(n){var self=this,strFiles=n===1?self.fileSingle:self.filePlural;return n>0?self.msgSelected.replace('{n}',n).replace('{files}',strFiles):self.msgNoFilesSelected;},_getFrame:function(id){var self=this,$frame=$('#'+id);if(!$frame.length){self._log($h.logMessages.invalidThumb,{id:id});return null;}return $frame;},_getThumbs:function(css){css=css||'';return this.getFrames(':not(.file-preview-initial)'+css);},_getExtraData:function(fileId,index){var self=this,data=self.uploadExtraData;if(typeof self.uploadExtraData==='function'){data=self.uploadExtraData(fileId,index);}return data;},_initXhr:function(xhrobj,fileId,fileCount){var self=this,fm=self.fileManager,func=function(event){var pct=0,total=event.total,loaded=event.loaded||event.position,stats=fm.getUploadStats(fileId,loaded,total);if(event.lengthComputable&&!self.enableResumableUpload){pct=$h.round(loaded/total*100);}if(fileId){self._setFileUploadStats(fileId,pct,fileCount,stats);}else{self._setProgress(pct,null,null,self._getStats(stats));}self._raise('fileajaxprogress',[stats]);};if(xhrobj.upload){if(self.progressDelay){func=$h.debounce(func,self.progressDelay);}xhrobj.upload.addEventListener('progress',func,false);}return xhrobj;},_initAjaxSettings:function(){var self=this;self._ajaxSettings=$.extend(true,{},self.ajaxSettings);self._ajaxDeleteSettings=$.extend(true,{},self.ajaxDeleteSettings);},_mergeAjaxCallback:function(funcName,srcFunc,type){var self=this,settings=self._ajaxSettings,flag=self.mergeAjaxCallbacks,targFunc;if(type==='delete'){settings=self._ajaxDeleteSettings;flag=self.mergeAjaxDeleteCallbacks;}targFunc=settings[funcName];if(flag&&typeof targFunc==='function'){if(flag==='before'){settings[funcName]=function(){targFunc.apply(this,arguments);srcFunc.apply(this,arguments);};}else{settings[funcName]=function(){srcFunc.apply(this,arguments);targFunc.apply(this,arguments);};}}else{settings[funcName]=srcFunc;}},_ajaxSubmit:function(fnBefore,fnSuccess,fnComplete,fnError,formdata,fileId,index,vUrl){var self=this,settings,defaults,data,processQueue;if(!self._raise('filepreajax',[formdata,fileId,index])){return;}formdata.append('initialPreview',JSON.stringify(self.initialPreview));formdata.append('initialPreviewConfig',JSON.stringify(self.initialPreviewConfig));formdata.append('initialPreviewThumbTags',JSON.stringify(self.initialPreviewThumbTags));self._initAjaxSettings();self._mergeAjaxCallback('beforeSend',fnBefore);self._mergeAjaxCallback('success',fnSuccess);self._mergeAjaxCallback('complete',fnComplete);self._mergeAjaxCallback('error',fnError);vUrl=vUrl||self.uploadUrlThumb||self.uploadUrl;if(typeof vUrl==='function'){vUrl=vUrl();}data=self._getExtraData(fileId,index)||{};if(typeof data==='object'){$.each(data,function(key,value){formdata.append(key,value);});}defaults={xhr:function(){var xhrobj=$.ajaxSettings.xhr();return self._initXhr(xhrobj,fileId,self.fileManager.count());},url:self._encodeURI(vUrl),type:'POST',dataType:'json',data:formdata,cache:false,processData:false,contentType:false};settings=$.extend(true,{},defaults,self._ajaxSettings);self.ajaxQueue.push(settings);processQueue=function(){var config,xhr;if(self.ajaxCurrentThreads0){self.hasInitData=true;content=out.initialPreview||[];config=out.initialPreviewConfig||[];tags=out.initialPreviewThumbTags||[];append=out.append===undefined||out.append;if(content.length>0&&!$h.isArray(content)){content=content.split(self.initialPreviewDelimiter);}if(content.length){self._mergeArray('initialPreview',content);self._mergeArray('initialPreviewConfig',config);self._mergeArray('initialPreviewThumbTags',tags);}if($thumb!==undefined){if(!allFiles){index=self.previewCache.add(content[0],config[0],tags[0],append);data=self.previewCache.get(index,false);$div=$(document.createElement('div')).html(data).hide().insertAfter($thumb);$newCache=$div.find('.kv-zoom-cache');if($newCache&&$newCache.length){$newCache.insertAfter($thumb);}$thumb.fadeOut('slow',function(){var $newThumb=$div.find('.file-preview-frame');if($newThumb&&$newThumb.length){$newThumb.insertBefore($thumb).fadeIn('slow').css('display:inline-block');}self._initPreviewActions();self._clearFileInput();$h.cleanZoomCache(self.$preview.find('#zoom-'+$thumb.attr('id')));$thumb.remove();$div.remove();self._initSortable();});}else{i=$thumb.attr('data-fileindex');self.uploadCache.content[i]=content[0];self.uploadCache.config[i]=config[0]||[];self.uploadCache.tags[i]=tags[0]||[];self.uploadCache.append=append;}}else{self.previewCache.set(content,config,tags,append);self._initPreview();self._initPreviewActions();}}},_initSuccessThumbs:function(){var self=this;if(!self.showPreview){return;}self._getThumbs($h.FRAMES+'.file-preview-success').each(function(){var $thumb=$(this),$preview=self.$preview,$remove=$thumb.find('.kv-file-remove');$remove.removeAttr('disabled');self._handler($remove,'click',function(){var id=$thumb.attr('id'),out=self._raise('filesuccessremove',[id,$thumb.attr('data-fileindex')]);$h.cleanMemory($thumb);if(out===false){return;}$thumb.fadeOut('slow',function(){$h.cleanZoomCache($preview.find('#zoom-'+id));$thumb.remove();if(!self.getFrames().length){self.reset();}});});});},_updateInitialPreview:function(){var self=this,u=self.uploadCache,i,j,len=0,data=self.cacheInitialPreview;if(data&&data.content){len=data.content.length;}if(self.showPreview){self.previewCache.set(u.content,u.config,u.tags,u.append);if(len){for(i=0;i0||!$.isEmptyObject(self.uploadExtraData),uploadFailed,$prog,fnBefore,errMsg,fnSuccess,fnComplete,fnError,updateUploadLog,op=self.ajaxOperations.uploadThumb,fileObj=fm.getFile(id),params={id:previewId,index:i,fileId:id},fileName=self.fileManager.getFileName(id,true);if(self.enableResumableUpload){return;}if(self.showPreview){$thumb=self.fileManager.getThumb(id);$prog=$thumb.find('.file-thumb-progress');$btnUpload=$thumb.find('.kv-file-upload');$btnDelete=$thumb.find('.kv-file-remove');$prog.show();}if(count===0||!hasPostData||(self.showPreview&&$btnUpload&&$btnUpload.hasClass('disabled'))||self._abort(params)){return;}updateUploadLog=function(){if(!uploadFailed){fm.removeFile(id);}else{fm.errors.push(id);}fm.setProcessed(id);if(fm.isProcessed()){self.fileBatchCompleted=true;}};chkComplete=function(){var $initThumbs;if(!self.fileBatchCompleted){return;}setTimeout(function(){var triggerReset=fm.count()===0,errCount=fm.errors.length;self._updateInitialPreview();self.unlock(triggerReset);if(triggerReset){self._clearFileInput();}$initThumbs=self.$preview.find('.file-preview-initial');if(self.uploadAsync&&$initThumbs.length){$h.addCss($initThumbs,$h.SORT_CSS);self._initSortable();}self._raise('filebatchuploadcomplete',[fm.stack,self._getExtraData()]);if(!self.retryErrorUploads||errCount===0){fm.clear();}self._setProgress(101);self.ajaxAborted=false;},self.processDelay);};fnBefore=function(jqXHR){outData=self._getOutData(formdata,jqXHR);fm.initStats(id);self.fileBatchCompleted=false;if(!isBatch){self.ajaxAborted=false;}if(self.showPreview){if(!$thumb.hasClass('file-preview-success')){self._setThumbStatus($thumb,'Loading');$h.addCss($thumb,'file-uploading');}$btnUpload.attr('disabled',true);$btnDelete.attr('disabled',true);}if(!isBatch){self.lock();}if(fm.errors.indexOf(id)!==-1){delete fm.errors[id];}self._raise('filepreupload',[outData,previewId,i]);$.extend(true,params,outData);if(self._abort(params)){jqXHR.abort();if(!isBatch){self._setThumbStatus($thumb,'New');$thumb.removeClass('file-uploading');$btnUpload.removeAttr('disabled');$btnDelete.removeAttr('disabled');self.unlock();}self._setProgressCancelled();}};fnSuccess=function(data,textStatus,jqXHR){var pid=self.showPreview&&$thumb.attr('id')?$thumb.attr('id'):previewId;outData=self._getOutData(formdata,jqXHR,data);$.extend(true,params,outData);setTimeout(function(){if($h.isEmpty(data)||$h.isEmpty(data.error)){if(self.showPreview){self._setThumbStatus($thumb,'Success');$btnUpload.hide();self._initUploadSuccess(data,$thumb,isBatch);self._setProgress(101,$prog);}self._raise('fileuploaded',[outData,pid,i]);if(!isBatch){self.fileManager.remove($thumb);}else{updateUploadLog();}}else{uploadFailed=true;errMsg=self._parseError(op,jqXHR,self.msgUploadError,self.fileManager.getFileName(id));self._showFileError(errMsg,params);self._setPreviewError($thumb,true);if(!self.retryErrorUploads){$btnUpload.hide();}if(isBatch){updateUploadLog();}self._setProgress(101,$('#'+pid).find('.file-thumb-progress'),self.msgUploadError);}},self.processDelay);};fnComplete=function(){setTimeout(function(){if(self.showPreview){$btnUpload.removeAttr('disabled');$btnDelete.removeAttr('disabled');$thumb.removeClass('file-uploading');}if(!isBatch){self.unlock(false);self._clearFileInput();}else{chkComplete();}self._initSuccessThumbs();},self.processDelay);};fnError=function(jqXHR,textStatus,errorThrown){errMsg=self._parseError(op,jqXHR,errorThrown,self.fileManager.getFileName(id));uploadFailed=true;setTimeout(function(){if(isBatch){updateUploadLog();}self.fileManager.setProgress(id,100);self._setPreviewError($thumb,true);if(!self.retryErrorUploads){$btnUpload.hide();}$.extend(true,params,self._getOutData(formdata,jqXHR));self._setProgress(101,$prog,self.msgAjaxProgressError.replace('{operation}',op));self._setProgress(101,$thumb.find('.file-thumb-progress'),self.msgUploadError);self._showFileError(errMsg,params);},self.processDelay);};formdata.append(self.uploadFileAttr,fileObj.file,fileName);self._setUploadData(formdata,{fileId:id});self._ajaxSubmit(fnBefore,fnSuccess,fnComplete,fnError,formdata,id,i);},_uploadBatch:function(){var self=this,fm=self.fileManager,total=fm.total(),params={},fnBefore,fnSuccess,fnError,fnComplete,hasPostData=total>0||!$.isEmptyObject(self.uploadExtraData),errMsg,setAllUploaded,formdata=new FormData(),op=self.ajaxOperations.uploadBatch;if(total===0||!hasPostData||self._abort(params)){return;}setAllUploaded=function(){self.fileManager.clear();self._clearFileInput();};fnBefore=function(jqXHR){self.lock();fm.initStats();var outData=self._getOutData(formdata,jqXHR);self.ajaxAborted=false;if(self.showPreview){self._getThumbs().each(function(){var $thumb=$(this),$btnUpload=$thumb.find('.kv-file-upload'),$btnDelete=$thumb.find('.kv-file-remove');if(!$thumb.hasClass('file-preview-success')){self._setThumbStatus($thumb,'Loading');$h.addCss($thumb,'file-uploading');}$btnUpload.attr('disabled',true);$btnDelete.attr('disabled',true);});}self._raise('filebatchpreupload',[outData]);if(self._abort(outData)){jqXHR.abort();self._getThumbs().each(function(){var $thumb=$(this),$btnUpload=$thumb.find('.kv-file-upload'),$btnDelete=$thumb.find('.kv-file-remove');if($thumb.hasClass('file-preview-loading')){self._setThumbStatus($thumb,'New');$thumb.removeClass('file-uploading');}$btnUpload.removeAttr('disabled');$btnDelete.removeAttr('disabled');});self._setProgressCancelled();}};fnSuccess=function(data,textStatus,jqXHR){var outData=self._getOutData(formdata,jqXHR,data),key=0,$thumbs=self._getThumbs(':not(.file-preview-success)'),keys=$h.isEmpty(data)||$h.isEmpty(data.errorkeys)?[]:data.errorkeys;if($h.isEmpty(data)||$h.isEmpty(data.error)){self._raise('filebatchuploadsuccess',[outData]);setAllUploaded();if(self.showPreview){$thumbs.each(function(){var $thumb=$(this);self._setThumbStatus($thumb,'Success');$thumb.removeClass('file-uploading');$thumb.find('.kv-file-upload').hide().removeAttr('disabled');});self._initUploadSuccess(data);}else{self.reset();}self._setProgress(101);}else{if(self.showPreview){$thumbs.each(function(){var $thumb=$(this);$thumb.removeClass('file-uploading');$thumb.find('.kv-file-upload').removeAttr('disabled');$thumb.find('.kv-file-remove').removeAttr('disabled');if(keys.length===0||$.inArray(key,keys)!==-1){self._setPreviewError($thumb,true);if(!self.retryErrorUploads){$thumb.find('.kv-file-upload').hide();self.fileManager.remove($thumb);}}else{$thumb.find('.kv-file-upload').hide();self._setThumbStatus($thumb,'Success');self.fileManager.remove($thumb);}if(!$thumb.hasClass('file-preview-error')||self.retryErrorUploads){key++;}});self._initUploadSuccess(data);}errMsg=self._parseError(op,jqXHR,self.msgUploadError);self._showFileError(errMsg,outData,'filebatchuploaderror');self._setProgress(101,self.$progress,self.msgUploadError);}};fnComplete=function(){self.unlock();self._initSuccessThumbs();self._clearFileInput();self._raise('filebatchuploadcomplete',[self.fileManager.stack,self._getExtraData()]);};fnError=function(jqXHR,textStatus,errorThrown){var outData=self._getOutData(formdata,jqXHR);errMsg=self._parseError(op,jqXHR,errorThrown);self._showFileError(errMsg,outData,'filebatchuploaderror');self.uploadFileCount=total-1;if(!self.showPreview){return;}self._getThumbs().each(function(){var $thumb=$(this);$thumb.removeClass('file-uploading');if(self.fileManager.getFile($thumb.attr('data-fileid'))){self._setPreviewError($thumb);}});self._getThumbs().removeClass('file-uploading');self._getThumbs(' .kv-file-upload').removeAttr('disabled');self._getThumbs(' .kv-file-delete').removeAttr('disabled');self._setProgress(101,self.$progress,self.msgAjaxProgressError.replace('{operation}',op));};var ctr=0;$.each(self.fileManager.stack,function(key,data){if(!$h.isEmpty(data.file)){formdata.append(self.uploadFileAttr,data.file,(data.nameFmt||('untitled_'+ctr)));}ctr++;});self._ajaxSubmit(fnBefore,fnSuccess,fnComplete,fnError,formdata);},_uploadExtraOnly:function(){var self=this,params={},fnBefore,fnSuccess,fnComplete,fnError,formdata=new FormData(),errMsg,op=self.ajaxOperations.uploadExtra;if(self._abort(params)){return;}fnBefore=function(jqXHR){self.lock();var outData=self._getOutData(formdata,jqXHR);self._raise('filebatchpreupload',[outData]);self._setProgress(50);params.data=outData;params.xhr=jqXHR;if(self._abort(params)){jqXHR.abort();self._setProgressCancelled();}};fnSuccess=function(data,textStatus,jqXHR){var outData=self._getOutData(formdata,jqXHR,data);if($h.isEmpty(data)||$h.isEmpty(data.error)){self._raise('filebatchuploadsuccess',[outData]);self._clearFileInput();self._initUploadSuccess(data);self._setProgress(101);}else{errMsg=self._parseError(op,jqXHR,self.msgUploadError);self._showFileError(errMsg,outData,'filebatchuploaderror');}};fnComplete=function(){self.unlock();self._clearFileInput();self._raise('filebatchuploadcomplete',[self.fileManager.stack,self._getExtraData()]);};fnError=function(jqXHR,textStatus,errorThrown){var outData=self._getOutData(formdata,jqXHR);errMsg=self._parseError(op,jqXHR,errorThrown);params.data=outData;self._showFileError(errMsg,outData,'filebatchuploaderror');self._setProgress(101,self.$progress,self.msgAjaxProgressError.replace('{operation}',op));};self._ajaxSubmit(fnBefore,fnSuccess,fnComplete,fnError,formdata);},_deleteFileIndex:function($frame){var self=this,ind=$frame.attr('data-fileindex'),rev=self.reversePreviewOrder;if(ind.substring(0,5)==='init_'){ind=parseInt(ind.replace('init_',''));self.initialPreview=$h.spliceArray(self.initialPreview,ind,rev);self.initialPreviewConfig=$h.spliceArray(self.initialPreviewConfig,ind,rev);self.initialPreviewThumbTags=$h.spliceArray(self.initialPreviewThumbTags,ind,rev);self.getFrames().each(function(){var $nFrame=$(this),nInd=$nFrame.attr('data-fileindex');if(nInd.substring(0,5)==='init_'){nInd=parseInt(nInd.replace('init_',''));if(nInd>ind){nInd--;$nFrame.attr('data-fileindex','init_'+nInd);}}});if(self.uploadAsync||self.enableResumableUpload){self.cacheInitialPreview=self.getPreview();}}},_initFileActions:function(){var self=this,$preview=self.$preview;if(!self.showPreview){return;}self._initZoomButton();self.getFrames(' .kv-file-remove').each(function(){var $el=$(this),$frame=$el.closest($h.FRAMES),hasError,id=$frame.attr('id'),ind=$frame.attr('data-fileindex'),n,cap,status;self._handler($el,'click',function(){status=self._raise('filepreremove',[id,ind]);if(status===false||!self._validateMinCount()){return false;}hasError=$frame.hasClass('file-preview-error');$h.cleanMemory($frame);$frame.fadeOut('slow',function(){$h.cleanZoomCache($preview.find('#zoom-'+id));self.fileManager.remove($frame);self._clearObjects($frame);$frame.remove();if(id&&hasError){self.$errorContainer.find('li[data-thumb-id="'+id+'"]').fadeOut('fast',function(){$(this).remove();if(!self._errorsExist()){self._resetErrors();}});}self._clearFileInput();var chk=self.previewCache.count(true),len=self.fileManager.count(),file,hasThumb=self.showPreview&&self.getFrames().length;if(len===0&&chk===0&&!hasThumb){self.reset();}else{n=chk+len;if(n>1){cap=self._getMsgSelected(n);}else{file=self.fileManager.getFirstFile();cap=file?file.nameFmt:'_';}self._setCaption(cap);}self._raise('fileremoved',[id,ind]);});});});self.getFrames(' .kv-file-upload').each(function(){var $el=$(this);self._handler($el,'click',function(){var $frame=$el.closest($h.FRAMES),id=$frame.attr('data-fileid');self.$progress.hide();if($frame.hasClass('file-preview-error')&&!self.retryErrorUploads){return;}self._uploadSingle(self.fileManager.getIndex(id),id,false);});});},_initPreviewActions:function(){var self=this,$preview=self.$preview,deleteExtraData=self.deleteExtraData||{},btnRemove=$h.FRAMES+' .kv-file-remove',settings=self.fileActionSettings,origClass=settings.removeClass,errClass=settings.removeErrorClass,resetProgress=function(){var hasFiles=self.isAjaxUpload?self.previewCache.count(true):self._inputFileCount();if(!self.getFrames().length&&!hasFiles){self._setCaption('');self.reset();self.initialCaption='';}};self._initZoomButton();$preview.find(btnRemove).each(function(){var $el=$(this),vUrl=$el.data('url')||self.deleteUrl,vKey=$el.data('key'),errMsg,fnBefore,fnSuccess,fnError,op=self.ajaxOperations.deleteThumb;if($h.isEmpty(vUrl)||vKey===undefined){return;}if(typeof vUrl==='function'){vUrl=vUrl();}var $frame=$el.closest($h.FRAMES),cache=self.previewCache.data,settings,params,config,fileName,extraData,index=$frame.attr('data-fileindex');index=parseInt(index.replace('init_',''));config=$h.isEmpty(cache.config)&&$h.isEmpty(cache.config[index])?null:cache.config[index];extraData=$h.isEmpty(config)||$h.isEmpty(config.extra)?deleteExtraData:config.extra;fileName=config.filename||config.caption||'';if(typeof extraData==='function'){extraData=extraData();}params={id:$el.attr('id'),key:vKey,extra:extraData};fnBefore=function(jqXHR){self.ajaxAborted=false;self._raise('filepredelete',[vKey,jqXHR,extraData]);if(self._abort()){jqXHR.abort();}else{$el.removeClass(errClass);$h.addCss($frame,'file-uploading');$h.addCss($el,'disabled '+origClass);}};fnSuccess=function(data,textStatus,jqXHR){var n,cap;if(!$h.isEmpty(data)&&!$h.isEmpty(data.error)){params.jqXHR=jqXHR;params.response=data;errMsg=self._parseError(op,jqXHR,self.msgDeleteError,fileName);self._showFileError(errMsg,params,'filedeleteerror');$frame.removeClass('file-uploading');$el.removeClass('disabled '+origClass).addClass(errClass);resetProgress();return;}$frame.removeClass('file-uploading').addClass('file-deleted');$frame.fadeOut('slow',function(){index=parseInt(($frame.attr('data-fileindex')).replace('init_',''));self.previewCache.unset(index);self._deleteFileIndex($frame);n=self.previewCache.count(true);cap=n>0?self._getMsgSelected(n):'';self._setCaption(cap);self._raise('filedeleted',[vKey,jqXHR,extraData]);$h.cleanZoomCache($preview.find('#zoom-'+$frame.attr('id')));self._clearObjects($frame);$frame.remove();resetProgress();});};fnError=function(jqXHR,textStatus,errorThrown){var errMsg=self._parseError(op,jqXHR,errorThrown,fileName);params.jqXHR=jqXHR;params.response={};self._showFileError(errMsg,params,'filedeleteerror');$frame.removeClass('file-uploading');$el.removeClass('disabled '+origClass).addClass(errClass);resetProgress();};self._initAjaxSettings();self._mergeAjaxCallback('beforeSend',fnBefore,'delete');self._mergeAjaxCallback('success',fnSuccess,'delete');self._mergeAjaxCallback('error',fnError,'delete');settings=$.extend(true,{},{url:self._encodeURI(vUrl),type:'POST',dataType:'json',data:$.extend(true,{},{key:vKey},extraData)},self._ajaxDeleteSettings);self._handler($el,'click',function(){if(!self._validateMinCount()){return false;}self.ajaxAborted=false;self._raise('filebeforedelete',[vKey,extraData]);if(self.ajaxAborted instanceof Promise){self.ajaxAborted.then(function(result){if(!result){$.ajax(settings);}});}else{if(!self.ajaxAborted){$.ajax(settings);}}});});},_hideFileIcon:function(){var self=this;if(self.overwriteInitial){self.$captionContainer.removeClass('icon-visible');}},_showFileIcon:function(){var self=this;$h.addCss(self.$captionContainer,'icon-visible');},_getSize:function(bytes,sizes){var self=this,size=parseFloat(bytes),i,func=self.fileSizeGetter,out;if(!$.isNumeric(bytes)||!$.isNumeric(size)){return'';}if(typeof func==='function'){out=func(size);}else{if(size===0){out='0.00 B';}else{i=Math.floor(Math.log(size)/Math.log(1024));if(!sizes){sizes=['B','KB','MB','GB','TB','PB','EB','ZB','YB'];}out=(size/Math.pow(1024,i)).toFixed(2)*1+' '+sizes[i];}}return self._getLayoutTemplate('size').replace('{sizeText}',out);},_getFileType:function(ftype){var self=this;return self.mimeTypeAliases[ftype]||ftype;},_generatePreviewTemplate:function(cat,data,fname,ftype,previewId,fileId,isError,size,frameClass,foot,ind,templ,attrs,zoomData){var self=this,caption=self.slug(fname),prevContent,zoomContent='',styleAttribs='',screenW=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,config,newCat=self.preferIconicPreview?'other':cat,title=caption,alt=caption,footer=foot||self._renderFileFooter(cat,caption,size,'auto',isError),hasIconSetting=self._getPreviewIcon(fname),typeCss='type-default',forcePrevIcon=hasIconSetting&&self.preferIconicPreview,forceZoomIcon=hasIconSetting&&self.preferIconicZoomPreview,getContent;config=screenW<400?(self.previewSettingsSmall[newCat]||self.defaults.previewSettingsSmall[newCat]):(self.previewSettings[newCat]||self.defaults.previewSettings[newCat]);if(config){$.each(config,function(key,val){styleAttribs+=key+':'+val+';';});}getContent=function(c,d,zoom,frameCss){var id=zoom?'zoom-'+previewId:previewId,tmplt=self._getPreviewTemplate(c),css=(frameClass||'')+' '+frameCss;if(self.frameClass){css=self.frameClass+' '+css;}if(zoom){css=css.replace(' '+$h.SORT_CSS,'');}tmplt=self._parseFilePreviewIcon(tmplt,fname);if(c==='text'){d=$h.htmlEncode(d);}if(cat==='object'&&!ftype){$.each(self.defaults.fileTypeSettings,function(key,func){if(key==='object'||key==='other'){return;}if(func(fname,ftype)){typeCss='type-'+key;}});}if(!$h.isEmpty(attrs)){if(attrs.title!==undefined&&attrs.title!==null){title=attrs.title;}if(attrs.alt!==undefined&&attrs.alt!==null){title=attrs.alt;}}return tmplt.setTokens({'previewId':id,'caption':caption,'title':title,'alt':alt,'frameClass':css,'type':self._getFileType(ftype),'fileindex':ind,'fileid':fileId||'','typeCss':typeCss,'footer':footer,'data':d,'template':templ||cat,'style':styleAttribs?'style="'+styleAttribs+'"':''});};ind=ind||previewId.slice(previewId.lastIndexOf('-')+1);if(self.fileActionSettings.showZoom){zoomContent=getContent((forceZoomIcon?'other':cat),zoomData?zoomData:data,true,'kv-zoom-thumb');}zoomContent='\n'+self._getLayoutTemplate('zoomCache').replace('{zoomContent}',zoomContent);if(typeof self.sanitizeZoomCache==='function'){zoomContent=self.sanitizeZoomCache(zoomContent);}prevContent=getContent((forcePrevIcon?'other':cat),data,false,'kv-preview-thumb');return prevContent+zoomContent;},_addToPreview:function($preview,content){var self=this;return self.reversePreviewOrder?$preview.prepend(content):$preview.append(content);},_previewDefault:function(file,previewId,isDisabled){var self=this,$preview=self.$preview;if(!self.showPreview){return;}var fname=$h.getFileName(file),ftype=file?file.type:'',content,size=file.size||0,caption=self._getFileName(file,''),isError=isDisabled===true&&!self.isAjaxUpload,data=$h.createObjectURL(file),fileId=self.fileManager.getId(file);self._clearDefaultPreview();content=self._generatePreviewTemplate('other',data,fname,ftype,previewId,fileId,isError,size);self._addToPreview($preview,content);self._setThumbAttr(previewId,caption,size);if(isDisabled===true&&self.isAjaxUpload){self._setThumbStatus($('#'+previewId),'Error');}},canPreview:function(file){var self=this;if(!file||!self.showPreview||!self.$preview||!self.$preview.length){return false;}var name=file.name||'',type=file.type||'',size=(file.size||0)/1000,cat=self._parseFileType(type,name),allowedTypes,allowedMimes,allowedExts,skipPreview,types=self.allowedPreviewTypes,mimes=self.allowedPreviewMimeTypes,exts=self.allowedPreviewExtensions||[],dTypes=self.disabledPreviewTypes,dMimes=self.disabledPreviewMimeTypes,dExts=self.disabledPreviewExtensions||[],maxSize=self.maxFilePreviewSize&&parseFloat(self.maxFilePreviewSize)||0,expAllExt=new RegExp('\\.('+exts.join('|')+')$','i'),expDisExt=new RegExp('\\.('+dExts.join('|')+')$','i');allowedTypes=!types||types.indexOf(cat)!==-1;allowedMimes=!mimes||mimes.indexOf(type)!==-1;allowedExts=!exts.length||$h.compare(name,expAllExt);skipPreview=(dTypes&&dTypes.indexOf(cat)!==-1)||(dMimes&&dMimes.indexOf(type)!==-1)||(dExts.length&&$h.compare(name,expDisExt))||(maxSize&&!isNaN(maxSize)&&size>maxSize);return!skipPreview&&(allowedTypes||allowedMimes||allowedExts);},_previewFile:function(i,file,theFile,previewId,data,fileInfo){if(!this.showPreview){return;}var self=this,fname=$h.getFileName(file),ftype=fileInfo.type,caption=fileInfo.name,cat=self._parseFileType(ftype,fname),content,$preview=self.$preview,fsize=file.size||0,iData=(cat==='text'||cat==='html'||cat==='image')?theFile.target.result:data,fileId=self.fileManager.getId(file);if(cat==='html'&&self.purifyHtml&&window.DOMPurify){iData=window.DOMPurify.sanitize(iData);}content=self._generatePreviewTemplate(cat,iData,fname,ftype,previewId,fileId,false,fsize);self._clearDefaultPreview();self._addToPreview($preview,content);var $thumb=$preview.find('#'+previewId),$img=$thumb.find('img'),id=$thumb.attr('data-fileid');self._validateImageOrientation($img,file,previewId,id,caption,ftype,fsize,iData);self._setThumbAttr(previewId,caption,fsize);self._initSortable();},_setThumbAttr:function(id,caption,size){var self=this,$frame=$('#'+id);if($frame.length){size=size&&size>0?self._getSize(size):'';$frame.data({'caption':caption,'size':size});}},_setInitThumbAttr:function(){var self=this,data=self.previewCache.data,len=self.previewCache.count(true),config,caption,size,previewId;if(len===0){return;}for(var i=0;i&"']/g,'_');},_updateFileDetails:function(numFiles){var self=this,$el=self.$element,label,n,log,nFiles,file,name=($h.isIE(9)&&$h.findFileName($el.val()))||($el[0].files[0]&&$el[0].files[0].name);if(!name&&self.fileManager.count()>0){file=self.fileManager.getFirstFile();label=file.nameFmt;}else{label=name?self.slug(name):'_';}n=self.isAjaxUpload?self.fileManager.count():numFiles;nFiles=self.previewCache.count(true)+n;log=n===1?label:self._getMsgSelected(nFiles);if(self.isError){self.$previewContainer.removeClass('file-thumb-loading');self.$previewStatus.html('');self.$captionContainer.removeClass('icon-visible');}else{self._showFileIcon();}self._setCaption(log,self.isError);self.$container.removeClass('file-input-new file-input-ajax-new');if(arguments.length===1){self._raise('fileselect',[numFiles,label]);}if(self.previewCache.count(true)){self._initPreviewActions();}},_setThumbStatus:function($thumb,status){var self=this;if(!self.showPreview){return;}var icon='indicator'+status,msg=icon+'Title',css='file-preview-'+status.toLowerCase(),$indicator=$thumb.find('.file-upload-indicator'),config=self.fileActionSettings;$thumb.removeClass('file-preview-success file-preview-error file-preview-paused file-preview-loading');if(status==='Success'){$thumb.find('.file-drag-handle').remove();}$indicator.html(config[icon]);$indicator.attr('title',config[msg]);$thumb.addClass(css);if(status==='Error'&&!self.retryErrorUploads){$thumb.find('.kv-file-upload').attr('disabled',true);}},_setProgressCancelled:function(){var self=this;self._setProgress(101,self.$progress,self.msgCancelled);},_setProgress:function(p,$el,error,stats){var self=this;$el=$el||self.$progress;if(!$el.length){return;}var pct=Math.min(p,100),out,pctLimit=self.progressUploadThreshold,t=p<=100?self.progressTemplate:self.progressCompleteTemplate,template=pct<100?self.progressTemplate:(error?(self.paused?self.progressPauseTemplate:self.progressErrorTemplate):t);if(p>=100){stats='';}if(!$h.isEmpty(template)){if(pctLimit&&pct>pctLimit&&p<=100){out=template.setTokens({'percent':pctLimit,'status':self.msgUploadThreshold});}else{out=template.setTokens({'percent':pct,'status':(p>100?self.msgUploadEnd:pct+'%')});}stats=stats||'';out=out.setTokens({stats:stats});$el.html(out);if(error){$el.find('[role="progressbar"]').html(error);}}},_setFileDropZoneTitle:function(){var self=this,$zone=self.$container.find('.file-drop-zone'),title=self.dropZoneTitle,strFiles;if(self.isClickable){strFiles=$h.isEmpty(self.$element.attr('multiple'))?self.fileSingle:self.filePlural;title+=self.dropZoneClickTitle.replace('{files}',strFiles);}$zone.find('.'+self.dropZoneTitleClass).remove();if(!self.showPreview||$zone.length===0||self.fileManager.count()>0||!self.dropZoneEnabled||(!self.isAjaxUpload&&self.$element.files)){return;}if($zone.find($h.FRAMES).length===0&&$h.isEmpty(self.defaultPreviewContent)){$zone.prepend(''+title+'
');}self.$container.removeClass('file-input-new');$h.addCss(self.$container,'file-input-ajax-new');},_getStats:function(stats){var self=this,pendingTime,t;if(!self.showUploadStats||!stats||!stats.bitrate){return'';}t=self._getLayoutTemplate('stats');pendingTime=(!stats.elapsed||!stats.bps)?self.msgCalculatingTime:self.msgPendingTime.setTokens({time:$h.getElapsed(Math.ceil(stats.pendingBytes/stats.bps))});return t.setTokens({uploadSpeed:stats.bitrate,pendingTime:pendingTime});},_setResumableProgress:function(pct,stats,$thumb){var self=this,rm=self.resumableManager,obj=$thumb?rm:self,$prog=$thumb?$thumb.find('.file-thumb-progress'):null;if(obj.lastProgress===0){obj.lastProgress=pct;}if(pct0&&self._getFileCount(len-1)=limit:dim<=limit;if(isValid){return;}msg=self['msgImage'+type+chk].setTokens({'name':fname,'size':limit});self._showFileError(msg,params);self._setPreviewError($thumb);},_getExifObj:function(data){var self=this,exifObj=null,error=$h.logMessages.exifWarning;if(data.slice(0,23)!=='data:image/jpeg;base64,'&&data.slice(0,22)!=='data:image/jpg;base64,'){exifObj=null;return;}try{exifObj=window.piexif?window.piexif.load(data):null;}catch(err){exifObj=null;error=err&&err.message||'';}if(!exifObj){self._log($h.logMessages.badExifParser,{details:error});}return exifObj;},setImageOrientation:function($img,$zoomImg,value,$thumb){var self=this,invalidImg=!$img||!$img.length,invalidZoomImg=!$zoomImg||!$zoomImg.length,$mark,isHidden=false,$div,zoomOnly=invalidImg&&$thumb&&$thumb.attr('data-template')==='image',ev;if(invalidImg&&invalidZoomImg){return;}ev='load.fileinputimageorient';if(zoomOnly){$img=$zoomImg;$zoomImg=null;$img.css(self.previewSettings.image);$div=$(document.createElement('div')).appendTo($thumb.find('.kv-file-content'));$mark=$(document.createElement('span')).insertBefore($img);$img.css('visibility','hidden').removeClass('file-zoom-detail').appendTo($div);}else{isHidden=!$img.is(':visible');}$img.off(ev).on(ev,function(){if(isHidden){self.$preview.removeClass('hide-content');$thumb.find('.kv-file-content').css('visibility','hidden');}var img=$img.get(0),zoomImg=$zoomImg&&$zoomImg.length?$zoomImg.get(0):null,h=img.offsetHeight,w=img.offsetWidth,r=$h.getRotation(value);if(isHidden){$thumb.find('.kv-file-content').css('visibility','visible');self.$preview.addClass('hide-content');}$img.data('orientation',value);if(zoomImg){$zoomImg.data('orientation',value);}if(value<5){$h.setTransform(img,r);$h.setTransform(zoomImg,r);return;}var offsetAngle=Math.atan(w/h),origFactor=Math.sqrt(Math.pow(h,2)+Math.pow(w,2)),scale=!origFactor?1:(h/Math.cos(Math.PI/2+offsetAngle))/origFactor,s=' scale('+Math.abs(scale)+')';$h.setTransform(img,r+s);$h.setTransform(zoomImg,r+s);if(zoomOnly){$img.css('visibility','visible').insertAfter($mark).addClass('file-zoom-detail');$mark.remove();$div.remove();}});},_validateImageOrientation:function($img,file,previewId,fileId,caption,ftype,fsize,iData){var self=this,exifObj,value,autoOrientImage=self.autoOrientImage;exifObj=autoOrientImage?self._getExifObj(iData):null;value=exifObj?exifObj['0th'][piexif.ImageIFD.Orientation]:null;if(!value){self._validateImage(previewId,fileId,caption,ftype,fsize,iData,exifObj);return;}self.setImageOrientation($img,$('#zoom-'+previewId+' img'),value,$('#'+previewId));self._raise('fileimageoriented',{'$img':$img,'file':file});self._validateImage(previewId,fileId,caption,ftype,fsize,iData,exifObj);},_validateImage:function(previewId,fileId,fname,ftype,fsize,iData,exifObj){var self=this,$preview=self.$preview,params,w1,w2,$thumb=$preview.find('#'+previewId),i=$thumb.attr('data-fileindex'),$img=$thumb.find('img');fname=fname||'Untitled';$img.one('load',function(){w1=$thumb.width();w2=$preview.width();if(w1>w2){$img.css('width','100%');}params={ind:i,id:previewId,fileId:fileId};self._checkDimensions(i,'Small',$img,$thumb,fname,'Width',params);self._checkDimensions(i,'Small',$img,$thumb,fname,'Height',params);if(!self.resizeImage){self._checkDimensions(i,'Large',$img,$thumb,fname,'Width',params);self._checkDimensions(i,'Large',$img,$thumb,fname,'Height',params);}self._raise('fileimageloaded',[previewId]);self.fileManager.addImage(fileId,{ind:i,img:$img,thumb:$thumb,pid:previewId,typ:ftype,siz:fsize,validated:false,imgData:iData,exifObj:exifObj});$thumb.data('exif',exifObj);self._validateAllImages();}).one('error',function(){self._raise('fileimageloaderror',[previewId]);}).each(function(){if(this.complete){$(this).trigger('load');}else{if(this.error){$(this).trigger('error');}}});},_validateAllImages:function(){var self=this,counter={val:0},numImgs=self.fileManager.getImageCount(),fsize,minSize=self.resizeIfSizeMoreThan;if(numImgs!==self.fileManager.totalImages){return;}self._raise('fileimagesloaded');if(!self.resizeImage){return;}$.each(self.fileManager.loadedImages,function(id,config){if(!config.validated){fsize=config.siz;if(fsize&&fsize>minSize*1000){self._getResizedImage(id,config,counter,numImgs);}config.validated=true;}});},_getResizedImage:function(id,config,counter,numImgs){var self=this,img=$(config.img)[0],width=img.naturalWidth,height=img.naturalHeight,blob,ratio=1,maxWidth=self.maxImageWidth||width,maxHeight=self.maxImageHeight||height,isValidImage=!!(width&&height),chkWidth,chkHeight,canvas=self.imageCanvas,dataURI,context=self.imageCanvasContext,type=config.typ,pid=config.pid,ind=config.ind,$thumb=config.thumb,throwError,msg,exifObj=config.exifObj,exifStr,file,params,evParams;throwError=function(msg,params,ev){if(self.isAjaxUpload){self._showFileError(msg,params,ev);}else{self._showError(msg,params,ev);}self._setPreviewError($thumb);};file=self.fileManager.getFile(id);params={id:pid,'index':ind,fileId:id};evParams=[id,pid,ind];if(!file||!isValidImage||(width<=maxWidth&&height<=maxHeight)){if(isValidImage&&file){self._raise('fileimageresized',evParams);}counter.val++;if(counter.val===numImgs){self._raise('fileimagesresized');}if(!isValidImage){throwError(self.msgImageResizeError,params,'fileimageresizeerror');return;}}type=type||self.resizeDefaultImageType;chkWidth=width>maxWidth;chkHeight=height>maxHeight;if(self.resizePreference==='width'){ratio=chkWidth?maxWidth/width:(chkHeight?maxHeight/height:1);}else{ratio=chkHeight?maxHeight/height:(chkWidth?maxWidth/width:1);}self._resetCanvas();width*=ratio;height*=ratio;canvas.width=width;canvas.height=height;try{context.drawImage(img,0,0,width,height);dataURI=canvas.toDataURL(type,self.resizeQuality);if(exifObj){exifStr=window.piexif.dump(exifObj);dataURI=window.piexif.insert(exifStr,dataURI);}blob=$h.dataURI2Blob(dataURI);self.fileManager.setFile(id,blob);self._raise('fileimageresized',evParams);counter.val++;if(counter.val===numImgs){self._raise('fileimagesresized',[undefined,undefined]);}if(!(blob instanceof Blob)){throwError(self.msgImageResizeError,params,'fileimageresizeerror');}}catch(err){counter.val++;if(counter.val===numImgs){self._raise('fileimagesresized',[undefined,undefined]);}msg=self.msgImageResizeException.replace('{errors}',err.message);throwError(msg,params,'fileimageresizeexception');}},_initBrowse:function($container){var self=this,$el=self.$element;if(self.showBrowse){self.$btnFile=$container.find('.btn-file').append($el);}else{$el.appendTo($container).attr('tabindex',-1);$h.addCss($el,'file-no-browse');}},_initClickable:function(){var self=this,$zone,$tmpZone;if(!self.isClickable){return;}$zone=self.$dropZone;if(!self.isAjaxUpload){$tmpZone=self.$preview.find('.file-default-preview');if($tmpZone.length){$zone=$tmpZone;}}$h.addCss($zone,'clickable');$zone.attr('tabindex',-1);self._handler($zone,'click',function(e){var $tar=$(e.target);if(!$(self.elErrorContainer+':visible').length&&(!$tar.parents('.file-preview-thumbnails').length||$tar.parents('.file-default-preview').length)){self.$element.data('zoneClicked',true).trigger('click');$zone.blur();}});},_initCaption:function(){var self=this,cap=self.initialCaption||'';if(self.overwriteInitial||$h.isEmpty(cap)){self.$caption.val('');return false;}self._setCaption(cap);return true;},_setCaption:function(content,isError){var self=this,title,out,icon,n,cap,file;if(!self.$caption.length){return;}self.$captionContainer.removeClass('icon-visible');if(isError){title=$(''+self.msgValidationError+'
').text();n=self.fileManager.count();if(n){file=self.fileManager.getFirstFile();cap=n===1&&file?file.nameFmt:self._getMsgSelected(n);}else{cap=self._getMsgSelected(self.msgNo);}out=$h.isEmpty(content)?cap:content;icon=''+self.msgValidationErrorIcon+' ';}else{if($h.isEmpty(content)){return;}title=$(''+content+'
').text();out=title;icon=self._getLayoutTemplate('fileIcon');}self.$captionContainer.addClass('icon-visible');self.$caption.attr('title',title).val(out);self.$captionIcon.html(icon);},_createContainer:function(){var self=this,attribs={'class':'file-input file-input-new'+(self.rtl?' kv-rtl':'')},$container=$(document.createElement('div')).attr(attribs).html(self._renderMain());$container.insertBefore(self.$element);self._initBrowse($container);if(self.theme){$container.addClass('theme-'+self.theme);}return $container;},_refreshContainer:function(){var self=this,$container=self.$container,$el=self.$element;$el.insertAfter($container);$container.html(self._renderMain());self._initBrowse($container);self._validateDisabled();},_validateDisabled:function(){var self=this;self.$caption.attr({readonly:self.isDisabled});},_renderMain:function(){var self=this,dropCss=self.dropZoneEnabled?' file-drop-zone':'file-drop-disabled',close=!self.showClose?'':self._getLayoutTemplate('close'),preview=!self.showPreview?'':self._getLayoutTemplate('preview').setTokens({'class':self.previewClass,'dropClass':dropCss}),css=self.isDisabled?self.captionClass+' file-caption-disabled':self.captionClass,caption=self.captionTemplate.setTokens({'class':css+' kv-fileinput-caption'});return self.mainTemplate.setTokens({'class':self.mainClass+(!self.showBrowse&&self.showCaption?' no-browse':''),'preview':preview,'close':close,'caption':caption,'upload':self._renderButton('upload'),'remove':self._renderButton('remove'),'cancel':self._renderButton('cancel'),'pause':self._renderButton('pause'),'browse':self._renderButton('browse')});},_renderButton:function(type){var self=this,tmplt=self._getLayoutTemplate('btnDefault'),css=self[type+'Class'],title=self[type+'Title'],icon=self[type+'Icon'],label=self[type+'Label'],status=self.isDisabled?' disabled':'',btnType='button';switch(type){case'remove':if(!self.showRemove){return'';}break;case'cancel':if(!self.showCancel){return'';}css+=' kv-hidden';break;case'pause':if(!self.showPause){return'';}css+=' kv-hidden';break;case'upload':if(!self.showUpload){return'';}if(self.isAjaxUpload&&!self.isDisabled){tmplt=self._getLayoutTemplate('btnLink').replace('{href}',self.uploadUrl);}else{btnType='submit';}break;case'browse':if(!self.showBrowse){return'';}tmplt=self._getLayoutTemplate('btnBrowse');break;default:return'';}css+=type==='browse'?' btn-file':' fileinput-'+type+' fileinput-'+type+'-button';if(!$h.isEmpty(label)){label=' '+label+' ';}return tmplt.setTokens({'type':btnType,'css':css,'title':title,'status':status,'icon':icon,'label':label});},_renderThumbProgress:function(){var self=this;return''+self.progressInfoTemplate.setTokens({percent:101,status:self.msgUploadBegin,stats:''})+'
';},_renderFileFooter:function(cat,caption,size,width,isError){var self=this,config=self.fileActionSettings,rem=config.showRemove,drg=config.showDrag,upl=config.showUpload,zoom=config.showZoom,out,params,template=self._getLayoutTemplate('footer'),tInd=self._getLayoutTemplate('indicator'),ind=isError?config.indicatorError:config.indicatorNew,title=isError?config.indicatorErrorTitle:config.indicatorNewTitle,indicator=tInd.setTokens({'indicator':ind,'indicatorTitle':title});size=self._getSize(size);params={type:cat,caption:caption,size:size,width:width,progress:'',indicator:indicator};if(self.isAjaxUpload){params.progress=self._renderThumbProgress();params.actions=self._renderFileActions(params,upl,false,rem,zoom,drg,false,false,false);}else{params.actions=self._renderFileActions(params,false,false,false,zoom,drg,false,false,false);}out=template.setTokens(params);out=$h.replaceTags(out,self.previewThumbTags);return out;},_renderFileActions:function(cfg,showUpl,showDwn,showDel,showZoom,showDrag,disabled,url,key,isInit,dUrl,dFile){var self=this;if(!cfg.type&&isInit){cfg.type='image';}if(self.enableResumableUpload){showUpl=false;}else{if(typeof showUpl==='function'){showUpl=showUpl(cfg);}}if(typeof showDwn==='function'){showDwn=showDwn(cfg);}if(typeof showDel==='function'){showDel=showDel(cfg);}if(typeof showZoom==='function'){showZoom=showZoom(cfg);}if(typeof showDrag==='function'){showDrag=showDrag(cfg);}if(!showUpl&&!showDwn&&!showDel&&!showZoom&&!showDrag){return'';}var vUrl=url===false?'':' data-url="'+url+'"',btnZoom='',btnDrag='',css,vKey=key===false?'':' data-key="'+key+'"',btnDelete='',btnUpload='',btnDownload='',template=self._getLayoutTemplate('actions'),config=self.fileActionSettings,otherButtons=self.otherActionButtons.setTokens({'dataKey':vKey,'key':key}),removeClass=disabled?config.removeClass+' disabled':config.removeClass;if(showDel){btnDelete=self._getLayoutTemplate('actionDelete').setTokens({'removeClass':removeClass,'removeIcon':config.removeIcon,'removeTitle':config.removeTitle,'dataUrl':vUrl,'dataKey':vKey,'key':key});}if(showUpl){btnUpload=self._getLayoutTemplate('actionUpload').setTokens({'uploadClass':config.uploadClass,'uploadIcon':config.uploadIcon,'uploadTitle':config.uploadTitle});}if(showDwn){btnDownload=self._getLayoutTemplate('actionDownload').setTokens({'downloadClass':config.downloadClass,'downloadIcon':config.downloadIcon,'downloadTitle':config.downloadTitle,'downloadUrl':dUrl||self.initialPreviewDownloadUrl});btnDownload=btnDownload.setTokens({'filename':dFile,'key':key});}if(showZoom){btnZoom=self._getLayoutTemplate('actionZoom').setTokens({'zoomClass':config.zoomClass,'zoomIcon':config.zoomIcon,'zoomTitle':config.zoomTitle});}if(showDrag&&isInit){css='drag-handle-init '+config.dragClass;btnDrag=self._getLayoutTemplate('actionDrag').setTokens({'dragClass':css,'dragTitle':config.dragTitle,'dragIcon':config.dragIcon});}return template.setTokens({'delete':btnDelete,'upload':btnUpload,'download':btnDownload,'zoom':btnZoom,'drag':btnDrag,'other':otherButtons});},_browse:function(e){var self=this;if(e&&e.isDefaultPrevented()||!self._raise('filebrowse')){return;}if(self.isError&&!self.isAjaxUpload){self.clear();}self.$captionContainer.focus();},_change:function(e){var self=this;if(self.changeTriggered){return;}var $el=self.$element,isDragDrop=arguments.length>1,isAjaxUpload=self.isAjaxUpload,tfiles,files=isDragDrop?arguments[1]:$el.get(0).files,total,maxCount=!isAjaxUpload&&$h.isEmpty($el.attr('multiple'))?1:self.maxFileCount,len,ctr=self.fileManager.count(),isSingleUpload=$h.isEmpty($el.attr('multiple')),flagSingle=(isSingleUpload&&ctr>0),throwError=function(mesg,file,previewId,index){var p1=$.extend(true,{},self._getOutData(null,{},{},files),{id:previewId,index:index}),p2={id:previewId,index:index,file:file,files:files};return isAjaxUpload?self._showFileError(mesg,p1):self._showError(mesg,p2);},maxCountCheck=function(n,m){var msg=self.msgFilesTooMany.replace('{m}',m).replace('{n}',n);self.isError=throwError(msg,null,null,null);self.$captionContainer.removeClass('icon-visible');self._setCaption('',true);self.$container.removeClass('file-input-new file-input-ajax-new');};self.reader=null;self._resetUpload();self._hideFileIcon();if(self.dropZoneEnabled){self.$container.find('.file-drop-zone .'+self.dropZoneTitleClass).remove();}if(!isAjaxUpload){if(e.target&&e.target.files===undefined){files=e.target.value?[{name:e.target.value.replace(/^.+\\/,'')}]:[];}else{files=e.target.files||{};}}tfiles=files;if($h.isEmpty(tfiles)||tfiles.length===0){if(!isAjaxUpload){self.clear();}self._raise('fileselectnone');return;}self._resetErrors();len=tfiles.length;total=self._getFileCount(isAjaxUpload?(self.fileManager.count()+len):len);if(maxCount>0&&total>maxCount){if(!self.autoReplace||len>maxCount){maxCountCheck((self.autoReplace&&len>maxCount?len:total),maxCount);return;}if(total>maxCount){self._resetPreviewThumbs(isAjaxUpload);}}else{if(!isAjaxUpload||flagSingle){self._resetPreviewThumbs(false);if(flagSingle){self.clearFileStack();}}else{if(isAjaxUpload&&ctr===0&&(!self.previewCache.count(true)||self.overwriteInitial)){self._resetPreviewThumbs(true);}}}self.readFiles(tfiles);},_abort:function(params){var self=this,data;if(self.ajaxAborted&&typeof self.ajaxAborted==='object'&&self.ajaxAborted.message!==undefined){data=$.extend(true,{},self._getOutData(null),params);data.abortData=self.ajaxAborted.data||{};data.abortMessage=self.ajaxAborted.message;self._setProgress(101,self.$progress,self.msgCancelled);self._showFileError(self.ajaxAborted.message,data,'filecustomerror');self.cancel();return true;}return!!self.ajaxAborted;},_resetFileStack:function(){var self=this,i=0;self._getThumbs().each(function(){var $thumb=$(this),ind=$thumb.attr('data-fileindex'),pid=$thumb.attr('id');if(ind==='-1'||ind===-1){return;}if(!self.fileManager.getFile($thumb.attr('data-fileid'))){$thumb.attr({'id':self.previewInitId+'-'+i,'data-fileindex':i});i++;}else{$thumb.attr({'id':'uploaded-'+$h.uniqId(),'data-fileindex':'-1'});}self.$preview.find('#zoom-'+pid).attr({'id':'zoom-'+$thumb.attr('id'),'data-fileindex':$thumb.attr('data-fileindex')});});},_isFileSelectionValid:function(cnt){var self=this;cnt=cnt||0;if(self.required&&!self.getFilesCount()){self.$errorContainer.html('');self._showFileError(self.msgFileRequired);return false;}if(self.minFileCount>0&&self._getFileCount(cnt)=numFiles){if(self.isAjaxUpload&&self.fileManager.count()>0){self._raise('filebatchselected',[self.fileManager.stack]);}else{self._raise('filebatchselected',[files]);}$container.removeClass('file-thumb-loading');$status.html('');return;}var node=ctr+i,previewId=previewInitId+'-'+node,file=files[i],fSizeKB,j,msg,$thumb,fnText=settings.text,fnImage=settings.image,fnHtml=settings.html,typ,chk,typ1,typ2,caption=self._getFileName(file,''),fileSize=(file&&file.size||0)/1000,fileExtExpr='',previewData=$h.createObjectURL(file),fileCount=0,strTypes='',fileId,func,knownTypes=0,isText,isHtml,isImage,txtFlag,processFileLoaded=function(){var msg=msgProgress.setTokens({'index':i+1,'files':numFiles,'percent':50,'name':caption});setTimeout(function(){$status.html(msg);self._updateFileDetails(numFiles);readFile(i+1);},self.processDelay);self._raise('fileloaded',[file,previewId,i,reader]);};if(!file){return;}fileId=self.fileManager.getId(file);if(typLen>0){for(j=0;j0&&fileSize>self.maxFileSize){msg=self.msgSizeTooLarge.setTokens({'name':caption,'size':fSizeKB,'maxSize':self.maxFileSize});throwError(msg,file,previewId,i,fileId);return;}if(self.minFileSize!==null&&fileSize<=$h.getNum(self.minFileSize)){msg=self.msgSizeTooSmall.setTokens({'name':caption,'size':fSizeKB,'minSize':self.minFileSize});throwError(msg,file,previewId,i,fileId);return;}if(!$h.isEmpty(fileTypes)&&$h.isArray(fileTypes)){for(j=0;j0){for(i=0;i0){for(i=0;i0)?self.initialCaption:'';self.$caption.attr('title','').val(cap);$h.addCss(self.$container,'file-input-new');self._validateDefaultPreview();}if(self.$container.find($h.FRAMES).length===0){if(!self._initCaption()){self.$captionContainer.removeClass('icon-visible');}}self._hideFileIcon();self.$captionContainer.focus();self._setFileDropZoneTitle();self._raise('filecleared');return self.$element;},reset:function(){var self=this;if(!self._raise('filereset')){return;}self.lastProgress=0;self._resetPreview();self.$container.find('.fileinput-filename').text('');$h.addCss(self.$container,'file-input-new');if(self.getFrames().length||self.dropZoneEnabled){self.$container.removeClass('file-input-new');}self.clearFileStack();self._setFileDropZoneTitle();return self.$element;},disable:function(){var self=this;self.isDisabled=true;self._raise('filedisabled');self.$element.attr('disabled','disabled');self.$container.find('.kv-fileinput-caption').addClass('file-caption-disabled');self.$container.find('.fileinput-remove, .fileinput-upload, .file-preview-frame button').attr('disabled',true);$h.addCss(self.$container.find('.btn-file'),'disabled');self._initDragDrop();return self.$element;},enable:function(){var self=this;self.isDisabled=false;self._raise('fileenabled');self.$element.removeAttr('disabled');self.$container.find('.kv-fileinput-caption').removeClass('file-caption-disabled');self.$container.find('.fileinput-remove, .fileinput-upload, .file-preview-frame button').removeAttr('disabled');self.$container.find('.btn-file').removeClass('disabled');self._initDragDrop();return self.$element;},upload:function(){var self=this,fm=self.fileManager,totLen=fm.count(),i,outData,len,hasExtraData=!$.isEmptyObject(self._getExtraData());if(!self.isAjaxUpload||self.isDisabled||!self._isFileSelectionValid(totLen)){return;}self.lastProgress=0;self._resetUpload();if(totLen===0&&!hasExtraData){self._showFileError(self.msgUploadEmpty);return;}self.cancelling=false;self.$progress.show();self.lock();len=fm.count();if(totLen===0&&hasExtraData){self._setProgress(2);self._uploadExtraOnly();return;}if(self.enableResumableUpload){return self.resume();}if(self.uploadAsync||self.enableResumableUpload){outData=self._getOutData(null);self._raise('filebatchpreupload',[outData]);self.fileBatchCompleted=false;self.uploadCache={content:[],config:[],tags:[],append:true};for(i=0;i',next:' ',toggleheader:' ',fullscreen:' ',borderless:' ',close:' '},previewZoomButtonClasses:{prev:'btn btn-navigate',next:'btn btn-navigate',toggleheader:'btn btn-sm btn-kv btn-default btn-outline-secondary',fullscreen:'btn btn-sm btn-kv btn-default btn-outline-secondary',borderless:'btn btn-sm btn-kv btn-default btn-outline-secondary',close:'btn btn-sm btn-kv btn-default btn-outline-secondary'},previewTemplates:{},previewContentTemplates:{},preferIconicPreview:false,preferIconicZoomPreview:false,allowedFileTypes:null,allowedFileExtensions:null,allowedPreviewTypes:undefined,allowedPreviewMimeTypes:null,allowedPreviewExtensions:null,disabledPreviewTypes:undefined,disabledPreviewExtensions:['msi','exe','com','zip','rar','app','vb','scr'],disabledPreviewMimeTypes:null,defaultPreviewContent:null,customLayoutTags:{},customPreviewTags:{},previewFileIcon:' ',previewFileIconClass:'file-other-icon',previewFileIconSettings:{},previewFileExtSettings:{},buttonLabelClass:'hidden-xs',browseIcon:' ',browseClass:'btn btn-primary',removeIcon:' ',removeClass:'btn btn-default btn-secondary',cancelIcon:' ',cancelClass:'btn btn-default btn-secondary',pauseIcon:' ',pauseClass:'btn btn-default btn-secondary',uploadIcon:' ',uploadClass:'btn btn-default btn-secondary',uploadUrl:null,uploadUrlThumb:null,uploadAsync:true,uploadParamNames:{chunkCount:'chunkCount',chunkIndex:'chunkIndex',chunkSize:'chunkSize',chunkSizeStart:'chunkSizeStart',chunksUploaded:'chunksUploaded',fileBlob:'fileBlob',fileId:'fileId',fileName:'fileName',fileRelativePath:'fileRelativePath',fileSize:'fileSize',retryCount:'retryCount'},maxAjaxThreads:5,processDelay:100,queueDelay:10,progressDelay:0,enableResumableUpload:false,resumableUploadOptions:{fallback:null,testUrl:null,chunkSize:2*1024,maxThreads:4,maxRetries:3,showErrorLog:true},uploadExtraData:{},zoomModalHeight:480,minImageWidth:null,minImageHeight:null,maxImageWidth:null,maxImageHeight:null,resizeImage:false,resizePreference:'width',resizeQuality:0.92,resizeDefaultImageType:'image/jpeg',resizeIfSizeMoreThan:0,minFileSize:0,maxFileSize:0,maxFilePreviewSize:25600,minFileCount:0,maxFileCount:0,validateInitialCount:false,msgValidationErrorClass:'text-danger',msgValidationErrorIcon:' ',msgErrorClass:'file-error-message',progressThumbClass:'progress-bar progress-bar-striped active',progressClass:'progress-bar bg-success progress-bar-success progress-bar-striped active',progressInfoClass:'progress-bar bg-info progress-bar-info progress-bar-striped active',progressCompleteClass:'progress-bar bg-success progress-bar-success',progressPauseClass:'progress-bar bg-primary progress-bar-primary progress-bar-striped active',progressErrorClass:'progress-bar bg-danger progress-bar-danger',progressUploadThreshold:99,previewFileType:'image',elCaptionContainer:null,elCaptionText:null,elPreviewContainer:null,elPreviewImage:null,elPreviewStatus:null,elErrorContainer:null,errorCloseButton:$h.closeButton('kv-error-close'),slugCallback:null,dropZoneEnabled:true,dropZoneTitleClass:'file-drop-zone-title',fileActionSettings:{},otherActionButtons:'',textEncoding:'UTF-8',ajaxSettings:{},ajaxDeleteSettings:{},showAjaxErrorDetails:true,mergeAjaxCallbacks:false,mergeAjaxDeleteCallbacks:false,retryErrorUploads:true,reversePreviewOrder:false,usePdfRenderer:function(){var isIE11=!!window.MSInputMethodContext&&!!document.documentMode;return!!navigator.userAgent.match(/(iPod|iPhone|iPad|Android)/i)||isIE11;},pdfRendererUrl:'',pdfRendererTemplate:''};$.fn.fileinputLocales.en={fileSingle:'file',filePlural:'files',browseLabel:'Browse …',removeLabel:'Remove',removeTitle:'Clear all unprocessed files',cancelLabel:'Cancel',cancelTitle:'Abort ongoing upload',pauseLabel:'Pause',pauseTitle:'Pause ongoing upload',uploadLabel:'Upload',uploadTitle:'Upload selected files',msgNo:'No',msgNoFilesSelected:'No files selected',msgCancelled:'Cancelled',msgPaused:'Paused',msgPlaceholder:'Select {files}...',msgZoomModalHeading:'Detailed Preview',msgFileRequired:'You must select a file to upload.',msgSizeTooSmall:'File "{name}" ({size} KB ) is too small and must be larger than {minSize} KB .',msgSizeTooLarge:'File "{name}" ({size} KB ) exceeds maximum allowed upload size of {maxSize} KB .',msgFilesTooLess:'You must select at least {n} {files} to upload.',msgFilesTooMany:'Number of files selected for upload ({n}) exceeds maximum allowed limit of {m} .',msgFileNotFound:'File "{name}" not found!',msgFileSecured:'Security restrictions prevent reading the file "{name}".',msgFileNotReadable:'File "{name}" is not readable.',msgFilePreviewAborted:'File preview aborted for "{name}".',msgFilePreviewError:'An error occurred while reading the file "{name}".',msgInvalidFileName:'Invalid or unsupported characters in file name "{name}".',msgInvalidFileType:'Invalid type for file "{name}". Only "{types}" files are supported.',msgInvalidFileExtension:'Invalid extension for file "{name}". Only "{extensions}" files are supported.',msgFileTypes:{'image':'image','html':'HTML','text':'text','video':'video','audio':'audio','flash':'flash','pdf':'PDF','object':'object'},msgUploadAborted:'The file upload was aborted',msgUploadThreshold:'Processing...',msgUploadBegin:'Initializing...',msgUploadEnd:'Done',msgUploadResume:'Resuming upload...',msgUploadEmpty:'No valid data available for upload.',msgUploadError:'Upload Error',msgDeleteError:'Delete Error',msgProgressError:'Error',msgValidationError:'Validation Error',msgLoading:'Loading file {index} of {files} …',msgProgress:'Loading file {index} of {files} - {name} - {percent}% completed.',msgSelected:'{n} {files} selected',msgFoldersNotAllowed:'Drag & drop files only! {n} folder(s) dropped were skipped.',msgImageWidthSmall:'Width of image file "{name}" must be at least {size} px.',msgImageHeightSmall:'Height of image file "{name}" must be at least {size} px.',msgImageWidthLarge:'Width of image file "{name}" cannot exceed {size} px.',msgImageHeightLarge:'Height of image file "{name}" cannot exceed {size} px.',msgImageResizeError:'Could not get the image dimensions to resize.',msgImageResizeException:'Error while resizing the image.{errors} ',msgAjaxError:'Something went wrong with the {operation} operation. Please try again later!',msgAjaxProgressError:'{operation} failed',msgDuplicateFile:'File "{name}" of same size "{size} KB" has already been selected earlier. Skipping duplicate selection.',msgResumableUploadRetriesExceeded:'Upload aborted beyond {max} retries for file {file} ! Error Details: {error} ',msgPendingTime:'{time} remaining',msgCalculatingTime:'calculating time remaining',ajaxOperations:{deleteThumb:'file delete',uploadThumb:'file upload',uploadBatch:'batch file upload',uploadExtra:'form data upload'},dropZoneTitle:'Drag & drop files here …',dropZoneClickTitle:' (or click to select {files})',previewZoomButtonTitles:{prev:'View previous file',next:'View next file',toggleheader:'Toggle header',fullscreen:'Toggle full screen',borderless:'Toggle borderless mode',close:'Close detailed preview'}};$.fn.fileinputLocales.zh={fileSingle:'文件',filePlural:'个文件',browseLabel:'选择 …',removeLabel:'移除',removeTitle:'清除选中文件',cancelLabel:'取消',cancelTitle:'取消进行中的上传',pauseLabel:'Pause',pauseTitle:'Pause ongoing upload',uploadLabel:'上传',uploadTitle:'上传选中文件',msgNo:'没有',msgNoFilesSelected:'未选择文件',msgPaused:'Paused',msgCancelled:'取消',msgPlaceholder:'选择 {files}...',msgZoomModalHeading:'详细预览',msgFileRequired:'必须选择一个文件上传.',msgSizeTooSmall:'文件 "{name}" ({size} KB ) 必须大于限定大小 {minSize} KB .',msgSizeTooLarge:'文件 "{name}" ({size} KB ) 超过了允许大小 {maxSize} KB .',msgFilesTooLess:'你必须选择最少 {n} {files} 来上传. ',msgFilesTooMany:'选择的上传文件个数 ({n}) 超出最大文件的限制个数 {m} .',msgFileNotFound:'文件 "{name}" 未找到!',msgFileSecured:'安全限制,为了防止读取文件 "{name}".',msgFileNotReadable:'文件 "{name}" 不可读.',msgFilePreviewAborted:'取消 "{name}" 的预览.',msgFilePreviewError:'读取 "{name}" 时出现了一个错误.',msgInvalidFileName:'文件名 "{name}" 包含非法字符.',msgInvalidFileType:'不正确的类型 "{name}". 只支持 "{types}" 类型的文件.',msgInvalidFileExtension:'不正确的文件扩展名 "{name}". 只支持 "{extensions}" 的文件扩展名.',msgFileTypes:{'image':'image','html':'HTML','text':'text','video':'video','audio':'audio','flash':'flash','pdf':'PDF','object':'object'},msgUploadAborted:'该文件上传被中止',msgUploadThreshold:'处理中...',msgUploadBegin:'正在初始化...',msgUploadEnd:'完成',msgUploadResume:'Resuming upload...',msgUploadEmpty:'无效的文件上传.',msgUploadError:'Upload Error',msgDeleteError:'Delete Error',msgProgressError:'上传出错',msgValidationError:'验证错误',msgLoading:'加载第 {index} 文件 共 {files} …',msgProgress:'加载第 {index} 文件 共 {files} - {name} - {percent}% 完成.',msgSelected:'{n} {files} 选中',msgFoldersNotAllowed:'只支持拖拽文件! 跳过 {n} 拖拽的文件夹.',msgImageWidthSmall:'图像文件的"{name}"的宽度必须是至少{size}像素.',msgImageHeightSmall:'图像文件的"{name}"的高度必须至少为{size}像素.',msgImageWidthLarge:'图像文件"{name}"的宽度不能超过{size}像素.',msgImageHeightLarge:'图像文件"{name}"的高度不能超过{size}像素.',msgImageResizeError:'无法获取的图像尺寸调整。',msgImageResizeException:'调整图像大小时发生错误。{errors} ',msgAjaxError:'{operation} 发生错误. 请重试!',msgAjaxProgressError:'{operation} 失败',msgDuplicateFile:'File "{name}" of same size "{size} KB" has already been selected earlier. Skipping duplicate selection.',msgResumableUploadRetriesExceeded:'Upload aborted beyond {max} retries for file {file} ! Error Details: {error} ',msgPendingTime:'{time} remaining',msgCalculatingTime:'calculating time remaining',ajaxOperations:{deleteThumb:'删除文件',uploadThumb:'上传文件',uploadBatch:'批量上传',uploadExtra:'表单数据上传'},dropZoneTitle:'拖拽文件到这里 … 支持多文件同时上传',dropZoneClickTitle:' (或点击{files}按钮选择文件)',fileActionSettings:{removeTitle:'删除文件',uploadTitle:'上传文件',downloadTitle:'下载文件',uploadRetryTitle:'重试',zoomTitle:'查看详情',dragTitle:'移动 / 重置',indicatorNewTitle:'没有上传',indicatorSuccessTitle:'上传',indicatorErrorTitle:'上传错误',indicatorPausedTitle:'Upload Paused',indicatorLoadingTitle:'上传 ...'},previewZoomButtonTitles:{prev:'预览上一个文件',next:'预览下一个文件',toggleheader:'缩放',fullscreen:'全屏',borderless:'无边界模式',close:'关闭当前预览'}};$.fn.fileinput.Constructor=FileInput;$(document).ready(function(){var $input=$('input.file[type=file]');if($input.length){$input.fileinput();}});}));
\ No newline at end of file
+ * bootstrap-fileinput v5.1.2
+ * http://plugins.krajee.com/file-input
+ *
+ * Author: Kartik Visweswaran
+ * Copyright: 2014 - 2020, Kartik Visweswaran, Krajee.com
+ *
+ * Licensed under the BSD-3-Clause
+ * https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md
+ */
+(function(factory){'use strict';if(typeof define==='function'&&define.amd){define(['jquery'],factory)}else{if(typeof module==='object'&&module.exports){module.exports=factory(require('jquery'))}else{factory(window.jQuery)}}}(function($){'use strict';$.fn.fileinputLocales={};$.fn.fileinputThemes={};String.prototype.setTokens=function(replacePairs){var str=this.toString(),key,re;for(key in replacePairs){if(replacePairs.hasOwnProperty(key)){re=new RegExp('\{'+key+'\}','g');str=str.replace(re,replacePairs[key])}}return str};if(!Array.prototype.flatMap){Array.prototype.flatMap=function(lambda){return[].concat(this.map(lambda))}}var $h,FileInput;$h={FRAMES:'.kv-preview-thumb',SORT_CSS:'file-sortable',INIT_FLAG:'init-',OBJECT_PARAMS:' \n \n \n \n \n \n',DEFAULT_PREVIEW:'\n{previewFileIcon} \n
',MODAL_ID:'kvFileinputModal',MODAL_EVENTS:['show','shown','hide','hidden','loaded'],logMessages:{ajaxError:'{status}: {error}. Error Details: {text}.',badDroppedFiles:'Error scanning dropped files!',badExifParser:'Error loading the piexif.js library. {details}',badInputType:'The input "type" must be set to "file" for initializing the "bootstrap-fileinput" plugin.',exifWarning:'To avoid this warning, either set "autoOrientImage" to "false" OR ensure you have loaded the "piexif.js" library correctly on your page before the "fileinput.js" script.',invalidChunkSize:'Invalid upload chunk size: "{chunkSize}". Resumable uploads are disabled.',invalidThumb:'Invalid thumb frame with id: "{id}".',noResumableSupport:'The browser does not support resumable or chunk uploads.',noUploadUrl:'The "uploadUrl" is not set. Ajax uploads and resumable uploads have been disabled.',retryStatus:'Retrying upload for chunk # {chunk} for {filename}... retry # {retry}.',chunkQueueError:'Could not push task to ajax pool for chunk index # {index}.',resumableMaxRetriesReached:'Maximum resumable ajax retries ({n}) reached.',resumableRetryError:'Could not retry the resumable request (try # {n})... aborting.',resumableAborting:'Aborting / cancelling the resumable request.'},objUrl:window.URL||window.webkitURL,now:function(){return new Date().getTime()},round:function(num){num=parseFloat(num);return isNaN(num)?0:Math.floor(Math.round(num))},getArray:function(obj){var i,arr=[],len=obj&&obj.length||0;for(i=0;i0){out+=(out?' ':'')+value+key.substring(0,1)}});return out},debounce:function(func,delay){var inDebounce;return function(){var args=arguments,context=this;clearTimeout(inDebounce);inDebounce=setTimeout(function(){func.apply(context,args)},delay)}},stopEvent:function(e){e.stopPropagation();e.preventDefault()},getFileName:function(file){return file?(file.fileName||file.name||''):''},createObjectURL:function(data){if($h.objUrl&&$h.objUrl.createObjectURL&&data){return $h.objUrl.createObjectURL(data)}return''},revokeObjectURL:function(data){if($h.objUrl&&$h.objUrl.revokeObjectURL&&data){$h.objUrl.revokeObjectURL(data)}},compare:function(input,str,exact){return input!==undefined&&(exact?input===str:input.match(str))},isIE:function(ver){var div,status;if(navigator.appName!=='Microsoft Internet Explorer'){return false}if(ver===10){return new RegExp('msie\\s'+ver,'i').test(navigator.userAgent)}div=document.createElement('div');div.innerHTML='';status=div.getElementsByTagName('i').length;document.body.appendChild(div);div.parentNode.removeChild(div);return status},canOrientImage:function($el){var $img=$(document.createElement('img')).css({width:'1px',height:'1px'}).insertAfter($el),flag=$img.css('image-orientation');$img.remove();return!!flag},canAssignFilesToInput:function(){var input=document.createElement('input');try{input.type='file';input.files=null;return true}catch(err){return false}},getDragDropFolders:function(items){var i,item,len=items?items.length:0,folders=0;if(len>0&&items[0].webkitGetAsEntry()){for(i=0;i=0){byteStr=atob(dataURI.split(',')[1])}else{byteStr=decodeURIComponent(dataURI.split(',')[1])}arrayBuffer=new ArrayBuffer(byteStr.length);intArray=new Uint8Array(arrayBuffer);for(i=0;i>4){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:out+=String.fromCharCode(c);break;case 12:case 13:char2=array[i++];out+=String.fromCharCode(((c&0x1F)<<6)|(char2&0x3F));break;case 14:char2=array[i++];char3=array[i++];out+=String.fromCharCode(((c&0x0F)<<12)|((char2&0x3F)<<6)|((char3&0x3F)<<0));break}}return out},isHtml:function(str){var a=document.createElement('div');a.innerHTML=str;for(var c=a.childNodes,i=c.length;i--;){if(c[i].nodeType===1){return true}}return false},isSvg:function(str){return str.match(/^\s*<\?xml/i)&&(str.match(/'+str+''+tag+'>'))},uniqId:function(){return(new Date().getTime()+Math.floor(Math.random()*Math.pow(10,15))).toString(36)},parseEventCallback:function(str){return Function('\'use strict\'; return (function() { '+str+' });')()},cspBuffer:{CSP_ATTRIB:'data-csp-01928735',domEventsList:['mousedown','mouseup','click','dblclick','mousemove','mouseover','mousewheel','mouseout','contextmenu','touchstart','touchmove','touchend','touchcancel','keydown','keypress','keyup','focus','blur','change','submit','scroll','resize','hashchange','load','unload','cut','copy','paste'],domElementEvents:{},domElementsStyles:{},stash:function(htmlString){var self=this,outerDom=$.parseHTML(''+htmlString+'
'),$el=$(outerDom);$el.find('[style]').each(function(key,elem){var $elem=$(elem),styleString=$elem.attr('style'),id=$h.uniqId(),styles={};if(styleString&&styleString.length){if(styleString.indexOf(';')===-1){styleString+=';'}styleString.slice(0,styleString.length-1).split(';').map(function(str){str=str.split(':');if(str[0]){styles[str[0]]=str[1]?str[1]:''}});self.domElementsStyles[id]=styles;$elem.removeAttr('style').attr(self.CSP_ATTRIB,id)}});$el.filter('*').removeAttr('style');$.each(self.domEventsList,function(key,eventName){var id,fn,event='on'+eventName,$inlineEvent=$el.find('['+event+']');if($inlineEvent.length){fn=$h.parseEventCallback($inlineEvent.attr(event));if($inlineEvent.attr(self.CSP_ATTRIB)){id=$inlineEvent.attr(self.CSP_ATTRIB)}else{id=$h.uniqId();self.domElementEvents[id]=[]}self.domElementEvents[id].push({name:eventName+'.csp',handler:fn});$inlineEvent.removeAttr(event).attr(self.CSP_ATTRIB,id)}});var values=Object.values?Object.values(outerDom):Object.keys(outerDom).map(function(itm){return outerDom[itm]});return values.flatMap(function(elem){return elem.innerHTML}).join('')},apply:function(domElement){var self=this,$el=$(domElement);$el.find('['+self.CSP_ATTRIB+']').each(function(key,elem){var $elem=$(elem),id=$elem.attr(self.CSP_ATTRIB),styles=self.domElementsStyles[id],events=self.domElementEvents[id];if(styles){$elem.css(styles)}if(events){$.each(events,function(key,event){if(event&&event.name){$elem.off(event.name).on(event.name,event.handler)}})}$elem.removeAttr(self.CSP_ATTRIB)});self.domElementsStyles={};self.domElementEvents={}}},setHtml:function($elem,htmlString){var buf=$h.cspBuffer;$elem.html(buf.stash(htmlString));buf.apply($elem);return $elem},htmlEncode:function(str,undefVal){if(str===undefined){return undefVal||null}return str.replace(/&/g,'&').replace(//g,'>').replace(/"/g,'"').replace(/'/g,''')},replaceTags:function(str,tags){var out=str;if(!tags){return out}$.each(tags,function(key,value){if(typeof value==='function'){value=value()}out=out.split(key).join(value)});return out},cleanMemory:function($thumb){var data=$thumb.is('img')?$thumb.attr('src'):$thumb.find('source').attr('src');$h.revokeObjectURL(data)},findFileName:function(filePath){var sepIndex=filePath.lastIndexOf('/');if(sepIndex===-1){sepIndex=filePath.lastIndexOf('\\')}return filePath.split(filePath.substring(sepIndex,sepIndex+1)).pop()},checkFullScreen:function(){return document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement},toggleFullScreen:function(maximize){var doc=document,de=doc.documentElement,isFullScreen=$h.checkFullScreen();if(de&&maximize&&!isFullScreen){if(de.requestFullscreen){de.requestFullscreen()}else{if(de.msRequestFullscreen){de.msRequestFullscreen()}else{if(de.mozRequestFullScreen){de.mozRequestFullScreen()}else{if(de.webkitRequestFullscreen){de.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT)}}}}}else{if(isFullScreen){if(doc.exitFullscreen){doc.exitFullscreen()}else{if(doc.msExitFullscreen){doc.msExitFullscreen()}else{if(doc.mozCancelFullScreen){doc.mozCancelFullScreen()}else{if(doc.webkitExitFullscreen){doc.webkitExitFullscreen()}}}}}}},moveArray:function(arr,oldIndex,newIndex,reverseOrder){var newArr=$.extend(true,[],arr);if(reverseOrder){newArr.reverse()}if(newIndex>=newArr.length){var k=newIndex-newArr.length;while((k--)+1){newArr.push(undefined)}}newArr.splice(newIndex,0,newArr.splice(oldIndex,1)[0]);if(reverseOrder){newArr.reverse()}return newArr},closeButton:function(css){css=css?'close '+css:'close';return'\n × \n '},getRotation:function(value){switch(value){case 2:return'rotateY(180deg)';case 3:return'rotate(180deg)';case 4:return'rotate(180deg) rotateY(180deg)';case 5:return'rotate(270deg) rotateY(180deg)';case 6:return'rotate(90deg)';case 7:return'rotate(90deg) rotateY(180deg)';case 8:return'rotate(270deg)';default:return''}},setTransform:function(el,val){if(!el){return}el.style.transform=val;el.style.webkitTransform=val;el.style['-moz-transform']=val;el.style['-ms-transform']=val;el.style['-o-transform']=val},getObjectKeys:function(obj){var keys=[];if(obj){$.each(obj,function(key){keys.push(key)})}return keys},getObjectSize:function(obj){return $h.getObjectKeys(obj).length},whenAll:function(array){var s=[].slice,resolveValues=arguments.length===1&&$h.isArray(array)?array:s.call(arguments),deferred=$.Deferred(),i,failed=0,value,length=resolveValues.length,remaining=length,rejectContexts,rejectValues,resolveContexts,updateFunc;rejectContexts=rejectValues=resolveContexts=Array(length);updateFunc=function(index,contexts,values){return function(){if(values!==resolveValues){failed++}deferred.notifyWith(contexts[index]=this,values[index]=s.call(arguments));if(!(--remaining)){deferred[(!failed?'resolve':'reject')+'With'](contexts,values)}}};for(i=0;i0&&self.maxTotalFileCountrm.file.size?rm.file.size:size},getTotalChunks:function(){var chunkSize=parseFloat(rm.chunkSize);if(!isNaN(chunkSize)&&chunkSize>0){return Math.ceil(rm.file.size/chunkSize)}return 0},getProgress:function(){var chunksProcessed=rm.processedResumables(),total=rm.chunkCount;if(total===0){return 0}return Math.ceil(chunksProcessed/total*100)},checkAborted:function(intervalId){if(self._isAborted()){clearInterval(intervalId);self.unlock()}},upload:function(){var ids=fm.getIdList(),flag='new',intervalId;intervalId=setInterval(function(){var id;rm.checkAborted(intervalId);if(flag==='new'){self.lock();flag='processing';id=ids.shift();fm.initStats(id);if(fm.stack[id]){rm.init(id,fm.stack[id],fm.getIndex(id));rm.processUpload()}}if(!fm.isPending(id)&&rm.completed){flag='new'}if(fm.isProcessed()){var $initThumbs=self.$preview.find('.file-preview-initial');if($initThumbs.length){$h.addCss($initThumbs,$h.SORT_CSS);self._initSortable()}clearInterval(intervalId);self._clearFileInput();self.unlock();setTimeout(function(){var data=self.previewCache.data;if(data){self.initialPreview=data.content;self.initialPreviewConfig=data.config;self.initialPreviewThumbTags=data.tags}self._raise('filebatchuploadcomplete',[self.initialPreview,self.initialPreviewConfig,self.initialPreviewThumbTags,self._getExtraData()])},self.processDelay)}},self.processDelay)},uploadResumable:function(){var i,pool,tm=self.taskManager,total=rm.chunkCount;pool=tm.addPool(rm.id);for(i=0;iopts.maxRetries){logError(msgs.resumableMaxRetriesReached,{n:opts.maxRetries});rm.setProcessed('error');return}var fd,outData,fnBefore,fnSuccess,fnError,fnComplete,slice=file.slice?'slice':(file.mozSlice?'mozSlice':(file.webkitSlice?'webkitSlice':'slice')),blob=file[slice](chunkSize*index,chunkSize*(index+1));fd=new FormData();f=fm.stack[id];self._setUploadData(fd,{chunkCount:rm.chunkCount,chunkIndex:index,chunkSize:chunkSize,chunkSizeStart:chunkSize*index,fileBlob:[blob,rm.fileName],fileId:id,fileName:rm.fileName,fileRelativePath:f.relativePath,fileSize:file.size,retryCount:retry});if(rm.$progress&&rm.$progress.length){rm.$progress.show()}fnBefore=function(jqXHR){outData=self._getOutData(fd,jqXHR);if(self.showPreview){if(!$thumb.hasClass('file-preview-success')){self._setThumbStatus($thumb,'Loading');$h.addCss($thumb,'file-uploading')}$btnDelete.attr('disabled',true)}self._raise('filechunkbeforesend',[id,index,retry,fm,rm,outData])};fnSuccess=function(data,textStatus,jqXHR){if(self._isAborted()){logError(msgs.resumableAborting);return}outData=self._getOutData(fd,jqXHR,data);var paramNames=self.uploadParamNames,chunkIndex=paramNames.chunkIndex||'chunkIndex',params=[id,index,retry,fm,rm,outData];if(data.error){if(opts.showErrorLog){self._log(logs.retryStatus,{retry:retry+1,filename:rm.fileName,chunk:index})}rm.pushAjax(index,retry+1);rm.error=data.error;self._raise('filechunkerror',params)}else{rm.logs[data[chunkIndex]]=true;if(!rm.chunksProcessed[id]){rm.chunksProcessed[id]={}}rm.chunksProcessed[id][data[chunkIndex]]=true;rm.chunksProcessed[id].data=data;deferrer.resolve.call(null,data);self._raise('filechunksuccess',params);rm.check()}};fnError=function(jqXHR,textStatus,errorThrown){if(self._isAborted()){logError(msgs.resumableAborting);return}outData=self._getOutData(fd,jqXHR);rm.setAjaxError(jqXHR,textStatus,errorThrown);self._raise('filechunkajaxerror',[id,index,retry,fm,rm,outData]);rm.pushAjax(index,retry+1);logError(msgs.resumableRetryError,{n:retry-1})};fnComplete=function(){if(!self._isAborted()){self._raise('filechunkcomplete',[id,index,retry,fm,rm,self._getOutData(fd)])}};self._ajaxSubmit(fnBefore,fnSuccess,fnComplete,fnError,fd,id,rm.fileIndex)}};rm.reset()},_initTemplateDefaults:function(){var self=this,tMain1,tMain2,tPreview,tFileIcon,tClose,tCaption,tBtnDefault,tBtnLink,tBtnBrowse,tModalMain,tModal,tProgress,tSize,tFooter,tActions,tActionDelete,tActionUpload,tActionDownload,tActionZoom,tActionDrag,tIndicator,tTagBef,tTagBef1,tTagBef2,tTagAft,tGeneric,tHtml,tImage,tText,tOffice,tGdocs,tVideo,tAudio,tFlash,tObject,tPdf,tOther,tStyle,tZoomCache,vDefaultDim,tStats;tMain1='{preview}\n
\n';tMain2='{preview}\n
\n
\n{remove}\n{cancel}\n{upload}\n{browse}\n';tPreview='';tClose=$h.closeButton('fileinput-remove');tFileIcon=' ';tCaption='\n \n \n
';tBtnDefault='{icon} {label} ';tBtnLink='{icon} {label} ';tBtnBrowse='{icon} {label}
';tModalMain='
';tModal='\n';tProgress='{stats}';tStats='{pendingTime} {uploadSpeed}
';tSize=' ({sizeText}) ';tFooter='';tActions='\n \n
\n{drag}\n
';tActionDelete='{removeIcon} \n';tActionUpload='{uploadIcon} ';tActionDownload='{downloadIcon} ';tActionZoom='{zoomIcon} ';tActionDrag='{dragIcon} ';tIndicator='{indicator}
';tTagBef='\n';tTagBef2=tTagBef+' title="{caption}">
\n';tTagAft='
{footer}\n{zoomCache}
\n';tGeneric='{content}\n';tStyle=' {style}';tHtml='
{data}
\n';tImage='
\n';tText='
\n';tOffice='
';tGdocs='
';tVideo='
\n\n'+$h.DEFAULT_PREVIEW+'\n \n';tAudio='
\n\n'+$h.DEFAULT_PREVIEW+'\n \n';tFlash='
\n';tPdf='\n';tObject='\n \n'+$h.OBJECT_PARAMS+' '+$h.DEFAULT_PREVIEW+'\n \n';tOther='\n'+$h.DEFAULT_PREVIEW+'\n
\n';tZoomCache='{zoomContent}
';vDefaultDim={width:'100%',height:'100%','min-height':'480px'};if(self._isPdfRendered()){tPdf=self.pdfRendererTemplate.replace('{renderer}',self._encodeURI(self.pdfRendererUrl))}self.defaults={layoutTemplates:{main1:tMain1,main2:tMain2,preview:tPreview,close:tClose,fileIcon:tFileIcon,caption:tCaption,modalMain:tModalMain,modal:tModal,progress:tProgress,stats:tStats,size:tSize,footer:tFooter,indicator:tIndicator,actions:tActions,actionDelete:tActionDelete,actionUpload:tActionUpload,actionDownload:tActionDownload,actionZoom:tActionZoom,actionDrag:tActionDrag,btnDefault:tBtnDefault,btnLink:tBtnLink,btnBrowse:tBtnBrowse,zoomCache:tZoomCache},previewMarkupTags:{tagBefore1:tTagBef1,tagBefore2:tTagBef2,tagAfter:tTagAft},previewContentTemplates:{generic:tGeneric,html:tHtml,image:tImage,text:tText,office:tOffice,gdocs:tGdocs,video:tVideo,audio:tAudio,flash:tFlash,object:tObject,pdf:tPdf,other:tOther},allowedPreviewTypes:['image','html','text','video','audio','flash','pdf','object'],previewTemplates:{},previewSettings:{image:{width:'auto',height:'auto','max-width':'100%','max-height':'100%'},html:{width:'213px',height:'160px'},text:{width:'213px',height:'160px'},office:{width:'213px',height:'160px'},gdocs:{width:'213px',height:'160px'},video:{width:'213px',height:'160px'},audio:{width:'100%',height:'30px'},flash:{width:'213px',height:'160px'},object:{width:'213px',height:'160px'},pdf:{width:'100%',height:'160px','position':'relative'},other:{width:'213px',height:'160px'}},previewSettingsSmall:{image:{width:'auto',height:'auto','max-width':'100%','max-height':'100%'},html:{width:'100%',height:'160px'},text:{width:'100%',height:'160px'},office:{width:'100%',height:'160px'},gdocs:{width:'100%',height:'160px'},video:{width:'100%',height:'auto'},audio:{width:'100%',height:'30px'},flash:{width:'100%',height:'auto'},object:{width:'100%',height:'auto'},pdf:{width:'100%',height:'160px'},other:{width:'100%',height:'160px'}},previewZoomSettings:{image:{width:'auto',height:'auto','max-width':'100%','max-height':'100%'},html:vDefaultDim,text:vDefaultDim,office:{width:'100%',height:'100%','max-width':'100%','min-height':'480px'},gdocs:{width:'100%',height:'100%','max-width':'100%','min-height':'480px'},video:{width:'auto',height:'100%','max-width':'100%'},audio:{width:'100%',height:'30px'},flash:{width:'auto',height:'480px'},object:{width:'auto',height:'100%','max-width':'100%','min-height':'480px'},pdf:vDefaultDim,other:{width:'auto',height:'100%','min-height':'480px'}},mimeTypeAliases:{'video/quicktime':'video/mp4'},fileTypeSettings:{image:function(vType,vName){return($h.compare(vType,'image.*')&&!$h.compare(vType,/(tiff?|wmf)$/i)||$h.compare(vName,/\.(gif|png|jpe?g)$/i))},html:function(vType,vName){return $h.compare(vType,'text/html')||$h.compare(vName,/\.(htm|html)$/i)},office:function(vType,vName){return $h.compare(vType,/(word|excel|powerpoint|office)$/i)||$h.compare(vName,/\.(docx?|xlsx?|pptx?|pps|potx?)$/i)},gdocs:function(vType,vName){return $h.compare(vType,/(word|excel|powerpoint|office|iwork-pages|tiff?)$/i)||$h.compare(vName,/\.(docx?|xlsx?|pptx?|pps|potx?|rtf|ods|odt|pages|ai|dxf|ttf|tiff?|wmf|e?ps)$/i)},text:function(vType,vName){return $h.compare(vType,'text.*')||$h.compare(vName,/\.(xml|javascript)$/i)||$h.compare(vName,/\.(txt|md|csv|nfo|ini|json|php|js|css)$/i)},video:function(vType,vName){return $h.compare(vType,'video.*')&&($h.compare(vType,/(ogg|mp4|mp?g|mov|webm|3gp)$/i)||$h.compare(vName,/\.(og?|mp4|webm|mp?g|mov|3gp)$/i))},audio:function(vType,vName){return $h.compare(vType,'audio.*')&&($h.compare(vName,/(ogg|mp3|mp?g|wav)$/i)||$h.compare(vName,/\.(og?|mp3|mp?g|wav)$/i))},flash:function(vType,vName){return $h.compare(vType,'application/x-shockwave-flash',true)||$h.compare(vName,/\.(swf)$/i)},pdf:function(vType,vName){return $h.compare(vType,'application/pdf',true)||$h.compare(vName,/\.(pdf)$/i)},object:function(){return true},other:function(){return true}},fileActionSettings:{showRemove:true,showUpload:true,showDownload:true,showZoom:true,showDrag:true,removeIcon:' ',removeClass:'btn btn-sm btn-kv btn-default btn-outline-secondary',removeErrorClass:'btn btn-sm btn-kv btn-danger',removeTitle:'Remove file',uploadIcon:' ',uploadClass:'btn btn-sm btn-kv btn-default btn-outline-secondary',uploadTitle:'Upload file',uploadRetryIcon:' ',uploadRetryTitle:'Retry upload',downloadIcon:' ',downloadClass:'btn btn-sm btn-kv btn-default btn-outline-secondary',downloadTitle:'Download file',zoomIcon:' ',zoomClass:'btn btn-sm btn-kv btn-default btn-outline-secondary',zoomTitle:'View Details',dragIcon:' ',dragClass:'text-info',dragTitle:'Move / Rearrange',dragSettings:{},indicatorNew:' ',indicatorSuccess:' ',indicatorError:' ',indicatorLoading:' ',indicatorPaused:' ',indicatorNewTitle:'Not uploaded yet',indicatorSuccessTitle:'Uploaded',indicatorErrorTitle:'Upload Error',indicatorLoadingTitle:'Uploading …',indicatorPausedTitle:'Upload Paused'}};$.each(self.defaults,function(key,setting){if(key==='allowedPreviewTypes'){if(self.allowedPreviewTypes===undefined){self.allowedPreviewTypes=setting}return}self[key]=$.extend(true,{},setting,self[key])});self._initPreviewTemplates()},_initPreviewTemplates:function(){var self=this,tags=self.previewMarkupTags,tagBef,tagAft=tags.tagAfter;$.each(self.previewContentTemplates,function(key,value){if($h.isEmpty(self.previewTemplates[key])){tagBef=tags.tagBefore2;if(key==='generic'||key==='image'||key==='html'||key==='text'){tagBef=tags.tagBefore1}if(self._isPdfRendered()&&key==='pdf'){tagBef=tagBef.replace('kv-file-content','kv-file-content kv-pdf-rendered')}self.previewTemplates[key]=tagBef+value+tagAft}})},_initPreviewCache:function(){var self=this;self.previewCache={data:{},init:function(){var content=self.initialPreview;if(content.length>0&&!$h.isArray(content)){content=content.split(self.initialPreviewDelimiter)}self.previewCache.data={content:content,config:self.initialPreviewConfig,tags:self.initialPreviewThumbTags}},count:function(skipNull){if(!self.previewCache.data||!self.previewCache.data.content){return 0}if(skipNull){var chk=self.previewCache.data.content.filter(function(n){return n!==null});return chk.length}return self.previewCache.data.content.length},get:function(i,isDisabled){var ind=$h.INIT_FLAG+i,data=self.previewCache.data,config=data.config[i],content=data.content[i],out,$tmp,cat,ftr,fname,ftype,frameClass,asData=$h.ifSet('previewAsData',config,self.initialPreviewAsData),a=config?{title:config.title||null,alt:config.alt||null}:{title:null,alt:null},parseTemplate=function(cat,dat,fname,ftype,ftr,ind,fclass,t){var fc=' file-preview-initial '+$h.SORT_CSS+(fclass?' '+fclass:''),id=self.previewInitId+'-'+ind,fileId=config&&config.fileId||id;return self._generatePreviewTemplate(cat,dat,fname,ftype,id,fileId,false,null,fc,ftr,ind,t,a,config&&config.zoomData||dat)};if(!content||!content.length){return''}isDisabled=isDisabled===undefined?true:isDisabled;cat=$h.ifSet('type',config,self.initialPreviewFileType||'generic');fname=$h.ifSet('filename',config,$h.ifSet('caption',config));ftype=$h.ifSet('filetype',config,cat);ftr=self.previewCache.footer(i,isDisabled,(config&&config.size||null));frameClass=$h.ifSet('frameClass',config);if(asData){out=parseTemplate(cat,content,fname,ftype,ftr,ind,frameClass)}else{out=parseTemplate('generic',content,fname,ftype,ftr,ind,frameClass,cat).setTokens({'content':data.content[i]})}if(data.tags.length&&data.tags[i]){out=$h.replaceTags(out,data.tags[i])}if(!$h.isEmpty(config)&&!$h.isEmpty(config.frameAttr)){$tmp=$h.createElement(out);$tmp.find('.file-preview-initial').attr(config.frameAttr);out=$tmp.html();$tmp.remove()}return out},clean:function(data){data.content=$h.cleanArray(data.content);data.config=$h.cleanArray(data.config);data.tags=$h.cleanArray(data.tags);self.previewCache.data=data},add:function(content,config,tags,append){var data=self.previewCache.data,index;if(!content||!content.length){return 0}index=content.length-1;if(!$h.isArray(content)){content=content.split(self.initialPreviewDelimiter)}if(append&&data.content){index=data.content.push(content[0])-1;data.config[index]=config;data.tags[index]=tags}else{data.content=content;data.config=config;data.tags=tags}self.previewCache.clean(data);return index},set:function(content,config,tags,append){var data=self.previewCache.data,i,chk;if(!content||!content.length){return}if(!$h.isArray(content)){content=content.split(self.initialPreviewDelimiter)}chk=content.filter(function(n){return n!==null});if(!chk.length){return}if(data.content===undefined){data.content=[]}if(data.config===undefined){data.config=[]}if(data.tags===undefined){data.tags=[]}if(append){for(i=0;i'+msg+'':''+msg+' ';if($error.find('ul').length===0){self._addError('')}else{$error.find('ul').append(e)}$error.fadeIn(self.fadeDelay);self._raise(ev,[params,msg]);self._setValidationError('file-input-new');return true},_showError:function(msg,params,event){var self=this,$error=self.$errorContainer,ev=event||'fileerror';params=params||{};params.reader=self.reader;self._addError(msg);$error.fadeIn(self.fadeDelay);self._raise(ev,[params,msg]);if(!self.isAjaxUpload){self._clearFileInput()}self._setValidationError('file-input-new');self.$btnUpload.attr('disabled',true);return true},_noFilesError:function(params){var self=this,label=self.minFileCount>1?self.filePlural:self.fileSingle,msg=self.msgFilesTooLess.replace('{n}',self.minFileCount).replace('{files}',label),$error=self.$errorContainer;msg=''+msg+' ';if($error.find('ul').length===0){self._addError('')}else{$error.find('ul').append(msg)}self.isError=true;self._updateFileDetails(0);$error.fadeIn(self.fadeDelay);self._raise('fileerror',[params,msg]);self._clearFileInput();self._setValidationError()},_parseError:function(operation,jqXHR,errorThrown,fileName){var self=this,errMsg=$.trim(errorThrown+''),textPre,errText,text;errText=jqXHR.responseJSON&&jqXHR.responseJSON.error?jqXHR.responseJSON.error.toString():'';text=errText?errText:jqXHR.responseText;if(self.cancelling&&self.msgUploadAborted){errMsg=self.msgUploadAborted}if(self.showAjaxErrorDetails&&text){if(errText){errMsg=$.trim(errText+'')}else{text=$.trim(text.replace(/\n\s*\n/g,'\n'));textPre=text.length?''+text+' ':'';errMsg+=errMsg?textPre:text}}if(!errMsg){errMsg=self.msgAjaxError.replace('{operation}',operation)}self.cancelling=false;return fileName?''+fileName+': '+errMsg:errMsg},_parseFileType:function(type,name){var self=this,isValid,vType,cat,i,types=self.allowedPreviewTypes||[];if(type==='application/text-plain'){return'text'}for(i=0;i-1){ext=fname.split('.').pop();if(self.previewFileIconSettings){out=self.previewFileIconSettings[ext]||self.previewFileIconSettings[ext.toLowerCase()]||null}if(self.previewFileExtSettings){$.each(self.previewFileExtSettings,function(key,func){if(self.previewFileIconSettings[key]&&func(ext)){out=self.previewFileIconSettings[key];return}})}}return out||self.previewFileIcon},_parseFilePreviewIcon:function(content,fname){var self=this,icn=self._getPreviewIcon(fname),out=content;if(out.indexOf('{previewFileIcon}')>-1){out=out.setTokens({'previewFileIconClass':self.previewFileIconClass,'previewFileIcon':icn})}return out},_raise:function(event,params){var self=this,e=$.Event(event);if(params!==undefined){self.$element.trigger(e,params)}else{self.$element.trigger(e)}if(e.isDefaultPrevented()||e.result===false){return false}switch(event){case'filebatchuploadcomplete':case'filebatchuploadsuccess':case'fileuploaded':case'fileclear':case'filecleared':case'filereset':case'fileerror':case'filefoldererror':case'fileuploaderror':case'filebatchuploaderror':case'filedeleteerror':case'filecustomerror':case'filesuccessremove':break;default:if(!self.ajaxAborted){self.ajaxAborted=e.result}break}return true},_listenFullScreen:function(isFullScreen){var self=this,$modal=self.$modal,$btnFull,$btnBord;if(!$modal||!$modal.length){return}$btnFull=$modal&&$modal.find('.btn-fullscreen');$btnBord=$modal&&$modal.find('.btn-borderless');if(!$btnFull.length||!$btnBord.length){return}$btnFull.removeClass('active').attr('aria-pressed','false');$btnBord.removeClass('active').attr('aria-pressed','false');if(isFullScreen){$btnFull.addClass('active').attr('aria-pressed','true')}else{$btnBord.addClass('active').attr('aria-pressed','true')}if($modal.hasClass('file-zoom-fullscreen')){self._maximizeZoomDialog()}else{if(isFullScreen){self._maximizeZoomDialog()}else{$btnBord.removeClass('active').attr('aria-pressed','false')}}},_listen:function(){var self=this,$el=self.$element,$form=self.$form,$cont=self.$container,fullScreenEvents;self._handler($el,'click',function(e){if($el.hasClass('file-no-browse')){if($el.data('zoneClicked')){$el.data('zoneClicked',false)}else{e.preventDefault()}}});self._handler($el,'change',$.proxy(self._change,self));if(self.showBrowse){self._handler(self.$btnFile,'click',$.proxy(self._browse,self))}self._handler($cont.find('.fileinput-remove:not([disabled])'),'click',$.proxy(self.clear,self));self._handler($cont.find('.fileinput-cancel'),'click',$.proxy(self.cancel,self));self._handler($cont.find('.fileinput-pause'),'click',$.proxy(self.pause,self));self._initDragDrop();self._handler($form,'reset',$.proxy(self.clear,self));if(!self.isAjaxUpload){self._handler($form,'submit',$.proxy(self._submitForm,self))}self._handler(self.$container.find('.fileinput-upload'),'click',$.proxy(self._uploadClick,self));self._handler($(window),'resize',function(){self._listenFullScreen(screen.width===window.innerWidth&&screen.height===window.innerHeight)});fullScreenEvents='webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange';self._handler($(document),fullScreenEvents,function(){self._listenFullScreen($h.checkFullScreen())});self._autoFitContent();self._initClickable();self._refreshPreview()},_autoFitContent:function(){var width=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,self=this,config=width<400?(self.previewSettingsSmall||self.defaults.previewSettingsSmall):(self.previewSettings||self.defaults.previewSettings),sel;$.each(config,function(cat,settings){sel='.file-preview-frame .file-preview-'+cat;self.$preview.find(sel+'.kv-preview-data,'+sel+' .kv-preview-data').css(settings)})},_scanDroppedItems:function(item,files,path){path=path||'';var self=this,i,dirReader,readDir,errorHandler=function(e){self._log($h.logMessages.badDroppedFiles);self._log(e)};if(item.isFile){item.file(function(file){if(path){file.newPath=path+file.name}files.push(file)},errorHandler)}else{if(item.isDirectory){dirReader=item.createReader();readDir=function(){dirReader.readEntries(function(entries){if(entries&&entries.length>0){for(i=0;i-1;self._zoneDragDropInit(e);if(self.isDisabled||!hasFiles){e.originalEvent.dataTransfer.effectAllowed='none';e.originalEvent.dataTransfer.dropEffect='none';return}if(self._raise('fileDragEnter',{'sourceEvent':e,'files':dataTransfer.types.Files})){$h.addCss(self.$dropZone,'file-highlighted')}},_zoneDragLeave:function(e){var self=this;self._zoneDragDropInit(e);if(self.isDisabled){return}if(self._raise('fileDragLeave',{'sourceEvent':e})){self.$dropZone.removeClass('file-highlighted')}},_zoneDrop:function(e){var self=this,i,$el=self.$element,dataTransfer=e.originalEvent.dataTransfer,files=dataTransfer.files,items=dataTransfer.items,folders=$h.getDragDropFolders(items),processFiles=function(){if(!self.isAjaxUpload){self.changeTriggered=true;$el.get(0).files=files;setTimeout(function(){self.changeTriggered=false;$el.trigger('change'+self.namespace)},self.processDelay)}else{self._change(e,files)}self.$dropZone.removeClass('file-highlighted')};e.preventDefault();if(self.isDisabled||$h.isEmpty(files)){return}if(!self._raise('fileDragDrop',{'sourceEvent':e,'files':files})){return}if(folders>0){if(!self.isAjaxUpload){self._showFolderError(folders);return}files=[];for(i=0;i0&&newIndex>=len,$item=$(e.item),$first;if(exceedsLast){newIndex=len-1}self.initialPreview=$h.moveArray(self.initialPreview,oldIndex,newIndex,rev);self.initialPreviewConfig=$h.moveArray(self.initialPreviewConfig,oldIndex,newIndex,rev);self.previewCache.init();self.getFrames('.file-preview-initial').each(function(){$(this).attr('data-fileindex',$h.INIT_FLAG+i);i++});if(exceedsLast){$first=self.getFrames(':not(.file-preview-initial):first');if($first.length){$item.slideUp(function(){$item.insertBefore($first).slideDown()})}}self._raise('filesorted',{previewId:$item.attr('id'),'oldIndex':oldIndex,'newIndex':newIndex,stack:self.initialPreviewConfig})},};$.extend(true,settings,self.fileActionSettings.dragSettings);if(self.sortable){self.sortable.destroy()}self.sortable=Sortable.create($el[0],settings)},_setPreviewContent:function(content){var self=this;$h.setHtml(self.$preview,content);self._autoFitContent()},_initPreviewImageOrientations:function(){var self=this,i=0,canOrientImage=self.canOrientImage;if(!self.autoOrientImageInitial&&!canOrientImage){return}self.getFrames('.file-preview-initial').each(function(){var $thumb=$(this),$img,$zoomImg,id,config=self.initialPreviewConfig[i];if(config&&config.exif&&config.exif.Orientation){id=$thumb.attr('id');$img=$thumb.find('>.kv-file-content img');$zoomImg=self._getZoom(id,' >.kv-file-content img');if(canOrientImage){$img.css('image-orientation',(self.autoOrientImageInitial?'from-image':'none'))}else{self.setImageOrientation($img,$zoomImg,config.exif.Orientation,$thumb)}}i++})},_initPreview:function(isInit){var self=this,cap=self.initialCaption||'',out;if(!self.previewCache.count(true)){self._clearPreview();if(isInit){self._setCaption(cap)}else{self._initCaption()}return}out=self.previewCache.out();cap=isInit&&self.initialCaption?self.initialCaption:out.caption;self._setPreviewContent(out.content);self._setInitThumbAttr();self._setCaption(cap);self._initSortable();if(!$h.isEmpty(out.content)){self.$container.removeClass('file-input-new')}self._initPreviewImageOrientations()},_getZoomButton:function(type){var self=this,label=self.previewZoomButtonIcons[type],css=self.previewZoomButtonClasses[type],title=' title="'+(self.previewZoomButtonTitles[type]||'')+'" ',params=title+(type==='close'?' data-dismiss="modal" aria-hidden="true"':'');if(type==='fullscreen'||type==='borderless'||type==='toggleheader'){params+=' data-toggle="button" aria-pressed="false" autocomplete="off"'}return''+label+' '},_getModalContent:function(){var self=this;return self._getLayoutTemplate('modal').setTokens({'rtl':self.rtl?' kv-rtl':'','zoomFrameClass':self.frameClass,'heading':self.msgZoomModalHeading,'prev':self._getZoomButton('prev'),'next':self._getZoomButton('next'),'toggleheader':self._getZoomButton('toggleheader'),'fullscreen':self._getZoomButton('fullscreen'),'borderless':self._getZoomButton('borderless'),'close':self._getZoomButton('close')})},_listenModalEvent:function(event){var self=this,$modal=self.$modal,getParams=function(e){return{sourceEvent:e,previewId:$modal.data('previewId'),modal:$modal}};$modal.on(event+'.bs.modal',function(e){var $btnFull=$modal.find('.btn-fullscreen'),$btnBord=$modal.find('.btn-borderless');if($modal.data('fileinputPluginId')===self.$element.attr('id')){self._raise('filezoom'+event,getParams(e))}if(event==='shown'){$btnBord.removeClass('active').attr('aria-pressed','false');$btnFull.removeClass('active').attr('aria-pressed','false');if($modal.hasClass('file-zoom-fullscreen')){self._maximizeZoomDialog();if($h.checkFullScreen()){$btnFull.addClass('active').attr('aria-pressed','true')}else{$btnBord.addClass('active').attr('aria-pressed','true')}}}})},_initZoom:function(){var self=this,$dialog,modalMain=self._getLayoutTemplate('modalMain'),modalId='#'+$h.MODAL_ID;if(!self.showPreview){return}self.$modal=$(modalId);if(!self.$modal||!self.$modal.length){$dialog=$h.createElement($h.cspBuffer.stash(modalMain)).insertAfter(self.$container);self.$modal=$(modalId).insertBefore($dialog);$h.cspBuffer.apply(self.$modal);$dialog.remove()}$h.initModal(self.$modal);self.$modal.html($h.cspBuffer.stash(self._getModalContent()));$h.cspBuffer.apply(self.$modal);$.each($h.MODAL_EVENTS,function(key,event){self._listenModalEvent(event)})},_initZoomButtons:function(){var self=this,previewId=self.$modal.data('previewId')||'',$first,$last,thumbs=self.getFrames().toArray(),len=thumbs.length,$prev=self.$modal.find('.btn-prev'),$next=self.$modal.find('.btn-next');if(thumbs.length<2){$prev.hide();$next.hide();return}else{$prev.show();$next.show()}if(!len){return}$first=$(thumbs[0]);$last=$(thumbs[len-1]);$prev.removeAttr('disabled');$next.removeAttr('disabled');if($first.length&&$first.attr('id')===previewId){$prev.attr('disabled',true)}if($last.length&&$last.attr('id')===previewId){$next.attr('disabled',true)}},_maximizeZoomDialog:function(){var self=this,$modal=self.$modal,$head=$modal.find('.modal-header:visible'),$foot=$modal.find('.modal-footer:visible'),$body=$modal.find('.modal-body'),h=$(window).height(),diff=0;$modal.addClass('file-zoom-fullscreen');if($head&&$head.length){h-=$head.outerHeight(true)}if($foot&&$foot.length){h-=$foot.outerHeight(true)}if($body&&$body.length){diff=$body.outerHeight(true)-$body.height();h-=diff}$modal.find('.kv-zoom-body').height(h)},_resizeZoomDialog:function(fullScreen){var self=this,$modal=self.$modal,$btnFull=$modal.find('.btn-fullscreen'),$btnBord=$modal.find('.btn-borderless');if($modal.hasClass('file-zoom-fullscreen')){$h.toggleFullScreen(false);if(!fullScreen){if(!$btnFull.hasClass('active')){$modal.removeClass('file-zoom-fullscreen');self.$modal.find('.kv-zoom-body').css('height',self.zoomModalHeight)}else{$btnFull.removeClass('active').attr('aria-pressed','false')}}else{if(!$btnFull.hasClass('active')){$modal.removeClass('file-zoom-fullscreen');self._resizeZoomDialog(true);if($btnBord.hasClass('active')){$btnBord.removeClass('active').attr('aria-pressed','false')}}}}else{if(!fullScreen){self._maximizeZoomDialog();return}$h.toggleFullScreen(true)}$modal.focus()},_setZoomContent:function($frame,animate){var self=this,$content,tmplt,body,title,$body,$dataEl,config,previewId=$frame.attr('id'),$zoomPreview=self._getZoom(previewId),$modal=self.$modal,$tmp,$btnFull=$modal.find('.btn-fullscreen'),$btnBord=$modal.find('.btn-borderless'),cap,size,$btnTogh=$modal.find('.btn-toggleheader');tmplt=$zoomPreview.attr('data-template')||'generic';$content=$zoomPreview.find('.kv-file-content');body=$content.length?$content.html():'';cap=$frame.data('caption')||'';size=$frame.data('size')||'';title=cap+' '+size;$modal.find('.kv-zoom-title').attr('title',$('
').html(title).text()).html(title);$body=$modal.find('.kv-zoom-body');$modal.removeClass('kv-single-content');if(animate){$tmp=$body.addClass('file-thumb-loading').clone().insertAfter($body);$h.setHtml($body,body).hide();$tmp.fadeOut('fast',function(){$body.fadeIn('fast',function(){$body.removeClass('file-thumb-loading')});$tmp.remove()})}else{$h.setHtml($body,body)}config=self.previewZoomSettings[tmplt];if(config){$dataEl=$body.find('.kv-preview-data');$h.addCss($dataEl,'file-zoom-detail');$.each(config,function(key,value){$dataEl.css(key,value);if(($dataEl.attr('width')&&key==='width')||($dataEl.attr('height')&&key==='height')){$dataEl.removeAttr(key)}})}$modal.data('previewId',previewId);self._handler($modal.find('.btn-prev'),'click',function(){self._zoomSlideShow('prev',previewId)});self._handler($modal.find('.btn-next'),'click',function(){self._zoomSlideShow('next',previewId)});self._handler($btnFull,'click',function(){self._resizeZoomDialog(true)});self._handler($btnBord,'click',function(){self._resizeZoomDialog(false)});self._handler($btnTogh,'click',function(){var $header=$modal.find('.modal-header'),$floatBar=$modal.find('.modal-body .floating-buttons'),ht,$actions=$header.find('.kv-zoom-actions'),resize=function(height){var $body=self.$modal.find('.kv-zoom-body'),h=self.zoomModalHeight;if($modal.hasClass('file-zoom-fullscreen')){h=$body.outerHeight(true);if(!height){h=h-$header.outerHeight(true)}}$body.css('height',height?h+height:h)};if($header.is(':visible')){ht=$header.outerHeight(true);$header.slideUp('slow',function(){$actions.find('.btn').appendTo($floatBar);resize(ht)})}else{$floatBar.find('.btn').appendTo($actions);$header.slideDown('slow',function(){resize()})}$modal.focus()});self._handler($modal,'keydown',function(e){var key=e.which||e.keyCode,$prev=$(this).find('.btn-prev'),$next=$(this).find('.btn-next'),vId=$(this).data('previewId'),vPrevKey=self.rtl?39:37,vNextKey=self.rtl?37:39;if(key===vPrevKey&&$prev.length&&!$prev.attr('disabled')){self._zoomSlideShow('prev',vId)}if(key===vNextKey&&$next.length&&!$next.attr('disabled')){self._zoomSlideShow('next',vId)}})},_showModal:function($frame){var self=this,$modal=self.$modal;if(!$frame||!$frame.length){return}$h.initModal($modal);$h.setHtml($modal,self._getModalContent());self._setZoomContent($frame);$modal.data('fileinputPluginId',self.$element.attr('id'));$modal.modal('show');self._initZoomButtons()},_zoomPreview:function($btn){var self=this,$frame;if(!$btn.length){throw'Cannot zoom to detailed preview!';}$frame=$btn.closest($h.FRAMES);self._showModal($frame)},_zoomSlideShow:function(dir,previewId){var self=this,$btn=self.$modal.find('.kv-zoom-actions .btn-'+dir),$targFrame,i,$thumb,thumbsData=self.getFrames().toArray(),thumbs=[],len=thumbsData.length,out;if($btn.attr('disabled')){return}for(i=0;i=len||!thumbs[out]){return}$targFrame=$(thumbs[out]);if($targFrame.length){self._setZoomContent($targFrame,true)}self._initZoomButtons();self._raise('filezoom'+dir,{'previewId':previewId,modal:self.$modal})},_initZoomButton:function(){var self=this;self.$preview.find('.kv-file-zoom').each(function(){var $el=$(this);self._handler($el,'click',function(){self._zoomPreview($el)})})},_inputFileCount:function(){return this.$element[0].files.length},_refreshPreview:function(){var self=this,files;if((!self._inputFileCount()&&!self.isAjaxUpload)||!self.showPreview||!self.isPreviewable){return}if(self.isAjaxUpload){if(self.fileManager.count()>0){files=$.extend(true,{},self.fileManager.stack);self.fileManager.clear();self._clearFileInput()}else{files=self.$element[0].files}}else{files=self.$element[0].files}if(files&&files.length){self.readFiles(files);self._setFileDropZoneTitle()}},_clearObjects:function($el){$el.find('video audio').each(function(){this.pause();$(this).remove()});$el.find('img object div').each(function(){$(this).remove()})},_clearFileInput:function(){var self=this,$el=self.$element,$srcFrm,$tmpFrm,$tmpEl;if(!self._inputFileCount()){return}$srcFrm=$el.closest('form');$tmpFrm=$(document.createElement('form'));$tmpEl=$(document.createElement('div'));$el.before($tmpEl);if($srcFrm.length){$srcFrm.after($tmpFrm)}else{$tmpEl.after($tmpFrm)}$tmpFrm.append($el).trigger('reset');$tmpEl.before($el).remove();$tmpFrm.remove()},_resetUpload:function(){var self=this;self.uploadStartTime=$h.now();self.uploadCache=[];self.$btnUpload.removeAttr('disabled');self._setProgress(0);self._hideProgress();self._resetErrors(false);self._initAjax();self.fileManager.clearImages();self._resetCanvas();if(self.overwriteInitial){self.initialPreview=[];self.initialPreviewConfig=[];self.initialPreviewThumbTags=[];self.previewCache.data={content:[],config:[],tags:[]}}},_resetCanvas:function(){var self=this;if(self.canvas&&self.imageCanvasContext){self.imageCanvasContext.clearRect(0,0,self.canvas.width,self.canvas.height)}},_hasInitialPreview:function(){var self=this;return!self.overwriteInitial&&self.previewCache.count(true)},_resetPreview:function(){var self=this,out,cap,$div,hasSuc=self.showUploadedThumbs,hasErr=!self.removeFromPreviewOnError,includeProcessed=(hasSuc||hasErr)&&self.isDuplicateError;if(self.previewCache.count(true)){out=self.previewCache.out();if(includeProcessed){$div=$h.createElement('').insertAfter(self.$container);self.getFrames().each(function(){var $thumb=$(this);if((hasSuc&&$thumb.hasClass('file-preview-success'))||(hasErr&&$thumb.hasClass('file-preview-error'))){$div.append($thumb)}})}self._setPreviewContent(out.content);self._setInitThumbAttr();cap=self.initialCaption?self.initialCaption:out.caption;self._setCaption(cap);if(includeProcessed){$div.contents().appendTo(self.$preview);$div.remove()}}else{self._clearPreview();self._initCaption()}if(self.showPreview){self._initZoom();self._initSortable()}self.isDuplicateError=false},_clearDefaultPreview:function(){var self=this;self.$preview.find('.file-default-preview').remove()},_validateDefaultPreview:function(){var self=this;if(!self.showPreview||$h.isEmpty(self.defaultPreviewContent)){return}self._setPreviewContent(''+self.defaultPreviewContent+'
');self.$container.removeClass('file-input-new');self._initClickable()},_resetPreviewThumbs:function(isAjax){var self=this,out;if(isAjax){self._clearPreview();self.clearFileStack();return}if(self._hasInitialPreview()){out=self.previewCache.out();self._setPreviewContent(out.content);self._setInitThumbAttr();self._setCaption(out.caption);self._initPreviewActions()}else{self._clearPreview()}},_getLayoutTemplate:function(t){var self=this,template=self.layoutTemplates[t];if($h.isEmpty(self.customLayoutTags)){return template}return $h.replaceTags(template,self.customLayoutTags)},_getPreviewTemplate:function(t){var self=this,templates=self.previewTemplates,template=templates[t]||templates.other;if($h.isEmpty(self.customPreviewTags)){return template}return $h.replaceTags(template,self.customPreviewTags)},_getOutData:function(formdata,jqXHR,responseData,filesData){var self=this;jqXHR=jqXHR||{};responseData=responseData||{};filesData=filesData||self.fileManager.list();return{formdata:formdata,files:filesData,filenames:self.filenames,filescount:self.getFilesCount(),extra:self._getExtraData(),response:responseData,reader:self.reader,jqXHR:jqXHR}},_getMsgSelected:function(n){var self=this,strFiles=n===1?self.fileSingle:self.filePlural;return n>0?self.msgSelected.replace('{n}',n).replace('{files}',strFiles):self.msgNoFilesSelected},_getFrame:function(id,skipWarning){var self=this,$frame=$h.getFrameElement(self.$preview,id);if(self.showPreview&&!skipWarning&&!$frame.length){self._log($h.logMessages.invalidThumb,{id:id})}return $frame},_getZoom:function(id,selector){var self=this,$frame=$h.getZoomElement(self.$preview,id,selector);if(self.showPreview&&!$frame.length){self._log($h.logMessages.invalidThumb,{id:id})}return $frame},_getThumbs:function(css){css=css||'';return this.getFrames(':not(.file-preview-initial)'+css)},_getThumbId:function(fileId){var self=this;return self.previewInitId+'-'+fileId},_getExtraData:function(fileId,index){var self=this,data=self.uploadExtraData;if(typeof self.uploadExtraData==='function'){data=self.uploadExtraData(fileId,index)}return data},_initXhr:function(xhrobj,fileId){var self=this,fm=self.fileManager,func=function(event){var pct=0,total=event.total,loaded=event.loaded||event.position,stats=fm.getUploadStats(fileId,loaded,total);if(event.lengthComputable&&!self.enableResumableUpload){pct=$h.round(loaded/total*100)}if(fileId){self._setFileUploadStats(fileId,pct,stats)}else{self._setProgress(pct,null,null,self._getStats(stats))}self._raise('fileajaxprogress',[stats])};if(xhrobj.upload){if(self.progressDelay){func=$h.debounce(func,self.progressDelay)}xhrobj.upload.addEventListener('progress',func,false)}return xhrobj},_initAjaxSettings:function(){var self=this;self._ajaxSettings=$.extend(true,{},self.ajaxSettings);self._ajaxDeleteSettings=$.extend(true,{},self.ajaxDeleteSettings)},_mergeAjaxCallback:function(funcName,srcFunc,type){var self=this,settings=self._ajaxSettings,flag=self.mergeAjaxCallbacks,targFunc;if(type==='delete'){settings=self._ajaxDeleteSettings;flag=self.mergeAjaxDeleteCallbacks}targFunc=settings[funcName];if(flag&&typeof targFunc==='function'){if(flag==='before'){settings[funcName]=function(){targFunc.apply(this,arguments);srcFunc.apply(this,arguments)}}else{settings[funcName]=function(){srcFunc.apply(this,arguments);targFunc.apply(this,arguments)}}}else{settings[funcName]=srcFunc}},_ajaxSubmit:function(fnBefore,fnSuccess,fnComplete,fnError,formdata,fileId,index,vUrl){var self=this,settings,defaults,data,ajaxTask;if(!self._raise('filepreajax',[formdata,fileId,index])){return}formdata.append('initialPreview',JSON.stringify(self.initialPreview));formdata.append('initialPreviewConfig',JSON.stringify(self.initialPreviewConfig));formdata.append('initialPreviewThumbTags',JSON.stringify(self.initialPreviewThumbTags));self._initAjaxSettings();self._mergeAjaxCallback('beforeSend',fnBefore);self._mergeAjaxCallback('success',fnSuccess);self._mergeAjaxCallback('complete',fnComplete);self._mergeAjaxCallback('error',fnError);vUrl=vUrl||self.uploadUrlThumb||self.uploadUrl;if(typeof vUrl==='function'){vUrl=vUrl()}data=self._getExtraData(fileId,index)||{};if(typeof data==='object'){$.each(data,function(key,value){formdata.append(key,value)})}defaults={xhr:function(){var xhrobj=$.ajaxSettings.xhr();return self._initXhr(xhrobj,fileId)},url:self._encodeURI(vUrl),type:'POST',dataType:'json',data:formdata,cache:false,processData:false,contentType:false};settings=$.extend(true,{},defaults,self._ajaxSettings);ajaxTask=self.taskManager.addTask(fileId+'-'+index,function(){var self=this.self,config,xhr;config=self.ajaxQueue.shift();xhr=$.ajax(config);self.ajaxRequests.push(xhr)});self.ajaxQueue.push(settings);ajaxTask.runWithContext({self:self})},_mergeArray:function(prop,content){var self=this,arr1=$h.cleanArray(self[prop]),arr2=$h.cleanArray(content);self[prop]=arr1.concat(arr2)},_initUploadSuccess:function(out,$thumb,allFiles){var self=this,append,data,index,$div,$newCache,content,config,tags,id,i;if(!self.showPreview||typeof out!=='object'||$.isEmptyObject(out)){self._resetCaption();return}if(out.initialPreview!==undefined&&out.initialPreview.length>0){self.hasInitData=true;content=out.initialPreview||[];config=out.initialPreviewConfig||[];tags=out.initialPreviewThumbTags||[];append=out.append===undefined||out.append;if(content.length>0&&!$h.isArray(content)){content=content.split(self.initialPreviewDelimiter)}if(content.length){self._mergeArray('initialPreview',content);self._mergeArray('initialPreviewConfig',config);self._mergeArray('initialPreviewThumbTags',tags)}if($thumb!==undefined){if(!allFiles){index=self.previewCache.add(content[0],config[0],tags[0],append);data=self.previewCache.get(index,false);$div=$h.createElement(data).hide().appendTo($thumb);$newCache=$div.find('.kv-zoom-cache');if($newCache&&$newCache.length){$newCache.appendTo($thumb)}$thumb.fadeOut('slow',function(){var $newThumb=$div.find('.file-preview-frame');if($newThumb&&$newThumb.length){$newThumb.insertBefore($thumb).fadeIn('slow').css('display:inline-block')}self._initPreviewActions();self._clearFileInput();$thumb.remove();$div.remove();self._initSortable()})}else{id=$thumb.attr('id');i=self._getUploadCacheIndex(id);if(i!==null){self.uploadCache[i]={id:id,content:content[0],config:config[0]||[],tags:tags[0]||[],append:append}}}}else{self.previewCache.set(content,config,tags,append);self._initPreview();self._initPreviewActions()}}self._resetCaption()},_getUploadCacheIndex:function(id){var self=this,i,len=self.uploadCache.length,config;for(i=0;i0||!$.isEmptyObject(self.uploadExtraData),uploadFailed,$prog,fnBefore,errMsg,fnSuccess,fnComplete,fnError,updateUploadLog,op=self.ajaxOperations.uploadThumb,fileObj=fm.getFile(id),params={id:previewId,index:i,fileId:id},fileName=self.fileManager.getFileName(id,true);if(self.enableResumableUpload){return}if(self.showPreview){$thumb=self.fileManager.getThumb(id);$prog=$thumb.find('.file-thumb-progress');$btnUpload=$thumb.find('.kv-file-upload');$btnDelete=$thumb.find('.kv-file-remove');$prog.show()}if(count===0||!hasPostData||(self.showPreview&&$btnUpload&&$btnUpload.hasClass('disabled'))||self._abort(params)){return}updateUploadLog=function(){if(!uploadFailed){fm.removeFile(id)}else{fm.errors.push(id)}fm.setProcessed(id);if(fm.isProcessed()){self.fileBatchCompleted=true;chkComplete()}};chkComplete=function(){var $initThumbs;if(!self.fileBatchCompleted){return}setTimeout(function(){var triggerReset=fm.count()===0,errCount=fm.errors.length;self._updateInitialPreview();self.unlock(triggerReset);if(triggerReset){self._clearFileInput()}$initThumbs=self.$preview.find('.file-preview-initial');if(self.uploadAsync&&$initThumbs.length){$h.addCss($initThumbs,$h.SORT_CSS);self._initSortable()}self._raise('filebatchuploadcomplete',[fm.stack,self._getExtraData()]);if(!self.retryErrorUploads||errCount===0){fm.clear()}self._setProgress(101);self.ajaxAborted=false},self.processDelay)};fnBefore=function(jqXHR){outData=self._getOutData(formdata,jqXHR);fm.initStats(id);self.fileBatchCompleted=false;if(!isBatch){self.ajaxAborted=false}if(self.showPreview){if(!$thumb.hasClass('file-preview-success')){self._setThumbStatus($thumb,'Loading');$h.addCss($thumb,'file-uploading')}$btnUpload.attr('disabled',true);$btnDelete.attr('disabled',true)}if(!isBatch){self.lock()}if(fm.errors.indexOf(id)!==-1){delete fm.errors[id]}self._raise('filepreupload',[outData,previewId,i]);$.extend(true,params,outData);if(self._abort(params)){jqXHR.abort();if(!isBatch){self._setThumbStatus($thumb,'New');$thumb.removeClass('file-uploading');$btnUpload.removeAttr('disabled');$btnDelete.removeAttr('disabled');self.unlock()}self._setProgressCancelled()}};fnSuccess=function(data,textStatus,jqXHR){var pid=self.showPreview&&$thumb.attr('id')?$thumb.attr('id'):previewId;outData=self._getOutData(formdata,jqXHR,data);$.extend(true,params,outData);setTimeout(function(){if($h.isEmpty(data)||$h.isEmpty(data.error)){if(self.showPreview){self._setThumbStatus($thumb,'Success');$btnUpload.hide();self._initUploadSuccess(data,$thumb,isBatch);self._setProgress(101,$prog)}self._raise('fileuploaded',[outData,pid,i]);if(!isBatch){self.fileManager.remove($thumb)}else{updateUploadLog()}}else{uploadFailed=true;errMsg=self._parseError(op,jqXHR,self.msgUploadError,self.fileManager.getFileName(id));self._showFileError(errMsg,params);self._setPreviewError($thumb,true);if(!self.retryErrorUploads){$btnUpload.hide()}if(isBatch){updateUploadLog()}self._setProgress(101,self._getFrame(pid).find('.file-thumb-progress'),self.msgUploadError)}},self.processDelay)};fnComplete=function(){if(self.showPreview){$btnUpload.removeAttr('disabled');$btnDelete.removeAttr('disabled');$thumb.removeClass('file-uploading')}if(!isBatch){self.unlock(false);self._clearFileInput()}else{chkComplete()}self._initSuccessThumbs()};fnError=function(jqXHR,textStatus,errorThrown){errMsg=self._parseError(op,jqXHR,errorThrown,self.fileManager.getFileName(id));uploadFailed=true;setTimeout(function(){var $prog;if(isBatch){updateUploadLog()}self.fileManager.setProgress(id,100);self._setPreviewError($thumb,true);if(!self.retryErrorUploads){$btnUpload.hide()}$.extend(true,params,self._getOutData(formdata,jqXHR));self._setProgress(101,self.$progress,self.msgAjaxProgressError.replace('{operation}',op));$prog=self.showPreview&&$thumb?$thumb.find('.file-thumb-progress'):'';self._setProgress(101,$prog,self.msgUploadError);self._showFileError(errMsg,params)},self.processDelay)};formdata.append(self.uploadFileAttr,fileObj.file,fileName);self._setUploadData(formdata,{fileId:id});self._ajaxSubmit(fnBefore,fnSuccess,fnComplete,fnError,formdata,id,i)},_uploadBatch:function(){var self=this,fm=self.fileManager,total=fm.total(),params={},fnBefore,fnSuccess,fnError,fnComplete,hasPostData=total>0||!$.isEmptyObject(self.uploadExtraData),errMsg,setAllUploaded,formdata=new FormData(),op=self.ajaxOperations.uploadBatch;if(total===0||!hasPostData||self._abort(params)){return}setAllUploaded=function(){self.fileManager.clear();self._clearFileInput()};fnBefore=function(jqXHR){self.lock();fm.initStats();var outData=self._getOutData(formdata,jqXHR);self.ajaxAborted=false;if(self.showPreview){self._getThumbs().each(function(){var $thumb=$(this),$btnUpload=$thumb.find('.kv-file-upload'),$btnDelete=$thumb.find('.kv-file-remove');if(!$thumb.hasClass('file-preview-success')){self._setThumbStatus($thumb,'Loading');$h.addCss($thumb,'file-uploading')}$btnUpload.attr('disabled',true);$btnDelete.attr('disabled',true)})}self._raise('filebatchpreupload',[outData]);if(self._abort(outData)){jqXHR.abort();self._getThumbs().each(function(){var $thumb=$(this),$btnUpload=$thumb.find('.kv-file-upload'),$btnDelete=$thumb.find('.kv-file-remove');if($thumb.hasClass('file-preview-loading')){self._setThumbStatus($thumb,'New');$thumb.removeClass('file-uploading')}$btnUpload.removeAttr('disabled');$btnDelete.removeAttr('disabled')});self._setProgressCancelled()}};fnSuccess=function(data,textStatus,jqXHR){var outData=self._getOutData(formdata,jqXHR,data),key=0,$thumbs=self._getThumbs(':not(.file-preview-success)'),keys=$h.isEmpty(data)||$h.isEmpty(data.errorkeys)?[]:data.errorkeys;if($h.isEmpty(data)||$h.isEmpty(data.error)){self._raise('filebatchuploadsuccess',[outData]);setAllUploaded();if(self.showPreview){$thumbs.each(function(){var $thumb=$(this);self._setThumbStatus($thumb,'Success');$thumb.removeClass('file-uploading');$thumb.find('.kv-file-upload').hide().removeAttr('disabled')});self._initUploadSuccess(data)}else{self.reset()}self._setProgress(101)}else{if(self.showPreview){$thumbs.each(function(){var $thumb=$(this);$thumb.removeClass('file-uploading');$thumb.find('.kv-file-upload').removeAttr('disabled');$thumb.find('.kv-file-remove').removeAttr('disabled');if(keys.length===0||$.inArray(key,keys)!==-1){self._setPreviewError($thumb,true);if(!self.retryErrorUploads){$thumb.find('.kv-file-upload').hide();self.fileManager.remove($thumb)}}else{$thumb.find('.kv-file-upload').hide();self._setThumbStatus($thumb,'Success');self.fileManager.remove($thumb)}if(!$thumb.hasClass('file-preview-error')||self.retryErrorUploads){key++}});self._initUploadSuccess(data)}errMsg=self._parseError(op,jqXHR,self.msgUploadError);self._showFileError(errMsg,outData,'filebatchuploaderror');self._setProgress(101,self.$progress,self.msgUploadError)}};fnComplete=function(){self.unlock();self._initSuccessThumbs();self._clearFileInput();self._raise('filebatchuploadcomplete',[self.fileManager.stack,self._getExtraData()])};fnError=function(jqXHR,textStatus,errorThrown){var outData=self._getOutData(formdata,jqXHR);errMsg=self._parseError(op,jqXHR,errorThrown);self._showFileError(errMsg,outData,'filebatchuploaderror');self.uploadFileCount=total-1;if(!self.showPreview){return}self._getThumbs().each(function(){var $thumb=$(this);$thumb.removeClass('file-uploading');if(self.fileManager.getFile($thumb.attr('data-fileid'))){self._setPreviewError($thumb)}});self._getThumbs().removeClass('file-uploading');self._getThumbs(' .kv-file-upload').removeAttr('disabled');self._getThumbs(' .kv-file-delete').removeAttr('disabled');self._setProgress(101,self.$progress,self.msgAjaxProgressError.replace('{operation}',op))};var ctr=0;$.each(self.fileManager.stack,function(key,data){if(!$h.isEmpty(data.file)){formdata.append(self.uploadFileAttr,data.file,(data.nameFmt||('untitled_'+ctr)))}ctr++});self._ajaxSubmit(fnBefore,fnSuccess,fnComplete,fnError,formdata)},_uploadExtraOnly:function(){var self=this,params={},fnBefore,fnSuccess,fnComplete,fnError,formdata=new FormData(),errMsg,op=self.ajaxOperations.uploadExtra;if(self._abort(params)){return}fnBefore=function(jqXHR){self.lock();var outData=self._getOutData(formdata,jqXHR);self._raise('filebatchpreupload',[outData]);self._setProgress(50);params.data=outData;params.xhr=jqXHR;if(self._abort(params)){jqXHR.abort();self._setProgressCancelled()}};fnSuccess=function(data,textStatus,jqXHR){var outData=self._getOutData(formdata,jqXHR,data);if($h.isEmpty(data)||$h.isEmpty(data.error)){self._raise('filebatchuploadsuccess',[outData]);self._clearFileInput();self._initUploadSuccess(data);self._setProgress(101)}else{errMsg=self._parseError(op,jqXHR,self.msgUploadError);self._showFileError(errMsg,outData,'filebatchuploaderror')}};fnComplete=function(){self.unlock();self._clearFileInput();self._raise('filebatchuploadcomplete',[self.fileManager.stack,self._getExtraData()])};fnError=function(jqXHR,textStatus,errorThrown){var outData=self._getOutData(formdata,jqXHR);errMsg=self._parseError(op,jqXHR,errorThrown);params.data=outData;self._showFileError(errMsg,outData,'filebatchuploaderror');self._setProgress(101,self.$progress,self.msgAjaxProgressError.replace('{operation}',op))};self._ajaxSubmit(fnBefore,fnSuccess,fnComplete,fnError,formdata)},_deleteFileIndex:function($frame){var self=this,ind=$frame.attr('data-fileindex'),rev=self.reversePreviewOrder;if(ind.substring(0,5)===$h.INIT_FLAG){ind=parseInt(ind.replace($h.INIT_FLAG,''));self.initialPreview=$h.spliceArray(self.initialPreview,ind,rev);self.initialPreviewConfig=$h.spliceArray(self.initialPreviewConfig,ind,rev);self.initialPreviewThumbTags=$h.spliceArray(self.initialPreviewThumbTags,ind,rev);self.getFrames().each(function(){var $nFrame=$(this),nInd=$nFrame.attr('data-fileindex');if(nInd.substring(0,5)===$h.INIT_FLAG){nInd=parseInt(nInd.replace($h.INIT_FLAG,''));if(nInd>ind){nInd--;$nFrame.attr('data-fileindex',$h.INIT_FLAG+nInd)}}})}},_resetCaption:function(){var self=this;setTimeout(function(){var cap,n,chk=self.previewCache.count(true),len=self.fileManager.count(),file,incomplete=':not(.file-preview-success):not(.file-preview-error)',hasThumb=self.showPreview&&self.getFrames(incomplete).length;if(len===0&&chk===0&&!hasThumb){self.reset()}else{n=chk+len;if(n>1){cap=self._getMsgSelected(n)}else{file=self.fileManager.getFirstFile();cap=file?file.nameFmt:'_'}self._setCaption(cap)}},self.processDelay)},_initFileActions:function(){var self=this;if(!self.showPreview){return}self._initZoomButton();self.getFrames(' .kv-file-remove').each(function(){var $el=$(this),$frame=$el.closest($h.FRAMES),hasError,id=$frame.attr('id'),ind=$frame.attr('data-fileindex'),status;self._handler($el,'click',function(){status=self._raise('filepreremove',[id,ind]);if(status===false||!self._validateMinCount()){return false}hasError=$frame.hasClass('file-preview-error');$h.cleanMemory($frame);$frame.fadeOut('slow',function(){self.fileManager.remove($frame);self._clearObjects($frame);$frame.remove();if(id&&hasError){self.$errorContainer.find('li[data-thumb-id="'+id+'"]').fadeOut('fast',function(){$(this).remove();if(!self._errorsExist()){self._resetErrors()}})}self._clearFileInput();self._resetCaption();self._raise('fileremoved',[id,ind])})})});self.getFrames(' .kv-file-upload').each(function(){var $el=$(this);self._handler($el,'click',function(){var $frame=$el.closest($h.FRAMES),fileId=$frame.attr('data-fileid');self._hideProgress();if($frame.hasClass('file-preview-error')&&!self.retryErrorUploads){return}self._uploadSingle(self.fileManager.getIndex(fileId),fileId,false)})})},_initPreviewActions:function(){var self=this,$preview=self.$preview,deleteExtraData=self.deleteExtraData||{},btnRemove=$h.FRAMES+' .kv-file-remove',settings=self.fileActionSettings,origClass=settings.removeClass,errClass=settings.removeErrorClass,resetProgress=function(){var hasFiles=self.isAjaxUpload?self.previewCache.count(true):self._inputFileCount();if(!self.getFrames().length&&!hasFiles){self._setCaption('');self.reset();self.initialCaption=''}};self._initZoomButton();$preview.find(btnRemove).each(function(){var $el=$(this),vUrl=$el.data('url')||self.deleteUrl,vKey=$el.data('key'),errMsg,fnBefore,fnSuccess,fnError,op=self.ajaxOperations.deleteThumb;if($h.isEmpty(vUrl)||vKey===undefined){return}if(typeof vUrl==='function'){vUrl=vUrl()}var $frame=$el.closest($h.FRAMES),cache=self.previewCache.data,settings,params,config,fileName,extraData,index=$frame.attr('data-fileindex');index=parseInt(index.replace($h.INIT_FLAG,''));config=$h.isEmpty(cache.config)&&$h.isEmpty(cache.config[index])?null:cache.config[index];extraData=$h.isEmpty(config)||$h.isEmpty(config.extra)?deleteExtraData:config.extra;fileName=config&&(config.filename||config.caption)||'';if(typeof extraData==='function'){extraData=extraData()}params={id:$el.attr('id'),key:vKey,extra:extraData};fnBefore=function(jqXHR){self.ajaxAborted=false;self._raise('filepredelete',[vKey,jqXHR,extraData]);if(self._abort()){jqXHR.abort()}else{$el.removeClass(errClass);$h.addCss($frame,'file-uploading');$h.addCss($el,'disabled '+origClass)}};fnSuccess=function(data,textStatus,jqXHR){var n,cap;if(!$h.isEmpty(data)&&!$h.isEmpty(data.error)){params.jqXHR=jqXHR;params.response=data;errMsg=self._parseError(op,jqXHR,self.msgDeleteError,fileName);self._showFileError(errMsg,params,'filedeleteerror');$frame.removeClass('file-uploading');$el.removeClass('disabled '+origClass).addClass(errClass);resetProgress();return}$frame.removeClass('file-uploading').addClass('file-deleted');$frame.fadeOut('slow',function(){index=parseInt(($frame.attr('data-fileindex')).replace($h.INIT_FLAG,''));self.previewCache.unset(index);self._deleteFileIndex($frame);n=self.previewCache.count(true);cap=n>0?self._getMsgSelected(n):'';self._setCaption(cap);self._raise('filedeleted',[vKey,jqXHR,extraData]);self._clearObjects($frame);$frame.remove();resetProgress()})};fnError=function(jqXHR,textStatus,errorThrown){var errMsg=self._parseError(op,jqXHR,errorThrown,fileName);params.jqXHR=jqXHR;params.response={};self._showFileError(errMsg,params,'filedeleteerror');$frame.removeClass('file-uploading');$el.removeClass('disabled '+origClass).addClass(errClass);resetProgress()};self._initAjaxSettings();self._mergeAjaxCallback('beforeSend',fnBefore,'delete');self._mergeAjaxCallback('success',fnSuccess,'delete');self._mergeAjaxCallback('error',fnError,'delete');settings=$.extend(true,{},{url:self._encodeURI(vUrl),type:'POST',dataType:'json',data:$.extend(true,{},{key:vKey},extraData)},self._ajaxDeleteSettings);self._handler($el,'click',function(){if(!self._validateMinCount()){return false}self.ajaxAborted=false;self._raise('filebeforedelete',[vKey,extraData]);if(self.ajaxAborted instanceof Promise){self.ajaxAborted.then(function(result){if(!result){$.ajax(settings)}})}else{if(!self.ajaxAborted){$.ajax(settings)}}})})},_hideFileIcon:function(){var self=this;if(self.overwriteInitial){self.$captionContainer.removeClass('icon-visible')}},_showFileIcon:function(){var self=this;$h.addCss(self.$captionContainer,'icon-visible')},_getSize:function(bytes,sizes){var self=this,size=parseFloat(bytes),i,func=self.fileSizeGetter,out;if(!$.isNumeric(bytes)||!$.isNumeric(size)){return''}if(typeof func==='function'){out=func(size)}else{if(size===0){out='0.00 B'}else{i=Math.floor(Math.log(size)/Math.log(1024));if(!sizes){sizes=['B','KB','MB','GB','TB','PB','EB','ZB','YB']}out=(size/Math.pow(1024,i)).toFixed(2)*1+' '+sizes[i]}}return self._getLayoutTemplate('size').replace('{sizeText}',out)},_getFileType:function(ftype){var self=this;return self.mimeTypeAliases[ftype]||ftype},_generatePreviewTemplate:function(cat,data,fname,ftype,previewId,fileId,isError,size,frameClass,foot,ind,templ,attrs,zoomData){var self=this,caption=self.slug(fname),prevContent,zoomContent='',styleAttribs='',screenW=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,config,title=caption,alt=caption,typeCss='type-default',getContent,footer=foot||self._renderFileFooter(cat,caption,size,'auto',isError),forcePrevIcon=self.preferIconicPreview,forceZoomIcon=self.preferIconicZoomPreview,newCat=forcePrevIcon?'other':cat;config=screenW<400?(self.previewSettingsSmall[newCat]||self.defaults.previewSettingsSmall[newCat]):(self.previewSettings[newCat]||self.defaults.previewSettings[newCat]);if(config){$.each(config,function(key,val){styleAttribs+=key+':'+val+';'})}getContent=function(c,d,zoom,frameCss){var id=zoom?'zoom-'+previewId:previewId,tmplt=self._getPreviewTemplate(c),css=(frameClass||'')+' '+frameCss;if(self.frameClass){css=self.frameClass+' '+css}if(zoom){css=css.replace(' '+$h.SORT_CSS,'')}tmplt=self._parseFilePreviewIcon(tmplt,fname);if(c==='text'){d=$h.htmlEncode(d)}if(cat==='object'&&!ftype){$.each(self.defaults.fileTypeSettings,function(key,func){if(key==='object'||key==='other'){return}if(func(fname,ftype)){typeCss='type-'+key}})}if(!$h.isEmpty(attrs)){if(attrs.title!==undefined&&attrs.title!==null){title=attrs.title}if(attrs.alt!==undefined&&attrs.alt!==null){title=attrs.alt}}return tmplt.setTokens({'previewId':id,'caption':caption,'title':title,'alt':alt,'frameClass':css,'type':self._getFileType(ftype),'fileindex':ind,'fileid':fileId||'','typeCss':typeCss,'footer':footer,'data':d,'template':templ||cat,'style':styleAttribs?'style="'+styleAttribs+'"':''})};ind=ind||previewId.slice(previewId.lastIndexOf('-')+1);if(self.fileActionSettings.showZoom){zoomContent=getContent((forceZoomIcon?'other':cat),zoomData?zoomData:data,true,'kv-zoom-thumb')}zoomContent='\n'+self._getLayoutTemplate('zoomCache').replace('{zoomContent}',zoomContent);if(typeof self.sanitizeZoomCache==='function'){zoomContent=self.sanitizeZoomCache(zoomContent)}prevContent=getContent((forcePrevIcon?'other':cat),data,false,'kv-preview-thumb');return prevContent.setTokens({zoomCache:zoomContent})},_addToPreview:function($preview,content){var self=this,$el;content=$h.cspBuffer.stash(content);$el=self.reversePreviewOrder?$preview.prepend(content):$preview.append(content);$h.cspBuffer.apply($preview);return $el},_previewDefault:function(file,isDisabled){var self=this,$preview=self.$preview;if(!self.showPreview){return}var fname=$h.getFileName(file),ftype=file?file.type:'',content,size=file.size||0,caption=self._getFileName(file,''),isError=isDisabled===true&&!self.isAjaxUpload,data=$h.createObjectURL(file),fileId=self.fileManager.getId(file),previewId=self._getThumbId(fileId);self._clearDefaultPreview();content=self._generatePreviewTemplate('other',data,fname,ftype,previewId,fileId,isError,size);self._addToPreview($preview,content);self._setThumbAttr(previewId,caption,size);if(isDisabled===true&&self.isAjaxUpload){self._setThumbStatus(self._getFrame(previewId),'Error')}},_previewFile:function(i,file,theFile,data,fileInfo){if(!this.showPreview){return}var self=this,fname=$h.getFileName(file),ftype=fileInfo.type,caption=fileInfo.name,cat=self._parseFileType(ftype,fname),content,$preview=self.$preview,fsize=file.size||0,iData=(cat==='text'||cat==='html'||cat==='image')?theFile.target.result:data,fileId=self.fileManager.getId(file),previewId=self._getThumbId(fileId);if(cat==='html'&&self.purifyHtml&&window.DOMPurify){iData=window.DOMPurify.sanitize(iData)}content=self._generatePreviewTemplate(cat,iData,fname,ftype,previewId,fileId,false,fsize);self._clearDefaultPreview();self._addToPreview($preview,content);var $thumb=self._getFrame(previewId);self._validateImageOrientation($thumb.find('img'),file,previewId,fileId,caption,ftype,fsize,iData);self._setThumbAttr(previewId,caption,fsize);self._initSortable()},_setThumbAttr:function(id,caption,size){var self=this,$frame=self._getFrame(id);if($frame.length){size=size&&size>0?self._getSize(size):'';$frame.data({'caption':caption,'size':size})}},_setInitThumbAttr:function(){var self=this,data=self.previewCache.data,len=self.previewCache.count(true),config,caption,size,previewId;if(len===0){return}for(var i=0;i&"']/g,'_')},_updateFileDetails:function(numFiles,skipRaiseEvent){var self=this,$el=self.$element,label,n,log,nFiles,file,name=($h.isIE(9)&&$h.findFileName($el.val()))||($el[0].files[0]&&$el[0].files[0].name);if(!name&&self.fileManager.count()>0){file=self.fileManager.getFirstFile();label=file.nameFmt}else{label=name?self.slug(name):'_'}n=self.isAjaxUpload?self.fileManager.count():numFiles;nFiles=self.previewCache.count(true)+n;log=n===1?label:self._getMsgSelected(nFiles);if(self.isError){self.$previewContainer.removeClass('file-thumb-loading');self.$previewStatus.html('');self.$captionContainer.removeClass('icon-visible')}else{self._showFileIcon()}self._setCaption(log,self.isError);self.$container.removeClass('file-input-new file-input-ajax-new');if(!skipRaiseEvent){self._raise('fileselect',[numFiles,label])}if(self.previewCache.count(true)){self._initPreviewActions()}},_setThumbStatus:function($thumb,status){var self=this;if(!self.showPreview){return}var icon='indicator'+status,msg=icon+'Title',css='file-preview-'+status.toLowerCase(),$indicator=$thumb.find('.file-upload-indicator'),config=self.fileActionSettings;$thumb.removeClass('file-preview-success file-preview-error file-preview-paused file-preview-loading');if(status==='Success'){$thumb.find('.file-drag-handle').remove()}$h.setHtml($indicator,config[icon]);$indicator.attr('title',config[msg]);$thumb.addClass(css);if(status==='Error'&&!self.retryErrorUploads){$thumb.find('.kv-file-upload').attr('disabled',true)}},_setProgressCancelled:function(){var self=this;self._setProgress(101,self.$progress,self.msgCancelled)},_setProgress:function(p,$el,error,stats){var self=this;$el=$el||self.$progress;if(!$el.length){return}var pct=Math.min(p,100),out,pctLimit=self.progressUploadThreshold,t=p<=100?self.progressTemplate:self.progressCompleteTemplate,template=pct<100?self.progressTemplate:(error?(self.paused?self.progressPauseTemplate:self.progressErrorTemplate):t);if(p>=100){stats=''}if(!$h.isEmpty(template)){if(pctLimit&&pct>pctLimit&&p<=100){out=template.setTokens({'percent':pctLimit,'status':self.msgUploadThreshold})}else{out=template.setTokens({'percent':pct,'status':(p>100?self.msgUploadEnd:pct+'%')})}stats=stats||'';out=out.setTokens({stats:stats});$h.setHtml($el,out);if(error){$h.setHtml($el.find('[role="progressbar"]'),error)}}},_hasFiles:function(){var el=this.$element[0];return!!(el&&el.files&&el.files.length)},_setFileDropZoneTitle:function(){var self=this,$zone=self.$container.find('.file-drop-zone'),title=self.dropZoneTitle,strFiles;if(self.isClickable){strFiles=$h.isEmpty(self.$element.attr('multiple'))?self.fileSingle:self.filePlural;title+=self.dropZoneClickTitle.replace('{files}',strFiles)}$zone.find('.'+self.dropZoneTitleClass).remove();if(!self.showPreview||$zone.length===0||self.fileManager.count()>0||!self.dropZoneEnabled||self.previewCache.count()>0||(!self.isAjaxUpload&&self._hasFiles())){return}if($zone.find($h.FRAMES).length===0&&$h.isEmpty(self.defaultPreviewContent)){$zone.prepend(''+title+'
')}self.$container.removeClass('file-input-new');$h.addCss(self.$container,'file-input-ajax-new')},_getStats:function(stats){var self=this,pendingTime,t;if(!self.showUploadStats||!stats||!stats.bitrate){return''}t=self._getLayoutTemplate('stats');pendingTime=(!stats.elapsed||!stats.bps)?self.msgCalculatingTime:self.msgPendingTime.setTokens({time:$h.getElapsed(Math.ceil(stats.pendingBytes/stats.bps))});return t.setTokens({uploadSpeed:stats.bitrate,pendingTime:pendingTime})},_setResumableProgress:function(pct,stats,$thumb){var self=this,rm=self.resumableManager,obj=$thumb?rm:self,$prog=$thumb?$thumb.find('.file-thumb-progress'):null;if(obj.lastProgress===0){obj.lastProgress=pct}if(pct0&&self._getFileCount(len-1)=limit:dim<=limit;if(isValid){return}msg=self['msgImage'+type+chk].setTokens({'name':fname,'size':limit});self._showFileError(msg,params);self._setPreviewError($thumb)},_getExifObj:function(data){var self=this,exifObj,error=$h.logMessages.exifWarning;if(data.slice(0,23)!=='data:image/jpeg;base64,'&&data.slice(0,22)!=='data:image/jpg;base64,'){exifObj=null;return}try{exifObj=window.piexif?window.piexif.load(data):null}catch(err){exifObj=null;error=err&&err.message||''}if(!exifObj){self._log($h.logMessages.badExifParser,{details:error})}return exifObj},setImageOrientation:function($img,$zoomImg,value,$thumb){var self=this,invalidImg=!$img||!$img.length,invalidZoomImg=!$zoomImg||!$zoomImg.length,$mark,isHidden=false,$div,zoomOnly=invalidImg&&$thumb&&$thumb.attr('data-template')==='image',ev;if(invalidImg&&invalidZoomImg){return}ev='load.fileinputimageorient';if(zoomOnly){$img=$zoomImg;$zoomImg=null;$img.css(self.previewSettings.image);$div=$(document.createElement('div')).appendTo($thumb.find('.kv-file-content'));$mark=$(document.createElement('span')).insertBefore($img);$img.css('visibility','hidden').removeClass('file-zoom-detail').appendTo($div)}else{isHidden=!$img.is(':visible')}$img.off(ev).on(ev,function(){if(isHidden){self.$preview.removeClass('hide-content');$thumb.find('.kv-file-content').css('visibility','hidden')}var img=$img[0],zoomImg=$zoomImg&&$zoomImg.length?$zoomImg[0]:null,h=img.offsetHeight,w=img.offsetWidth,r=$h.getRotation(value);if(isHidden){$thumb.find('.kv-file-content').css('visibility','visible');self.$preview.addClass('hide-content')}$img.data('orientation',value);if(zoomImg){$zoomImg.data('orientation',value)}if(value<5){$h.setTransform(img,r);$h.setTransform(zoomImg,r);return}var offsetAngle=Math.atan(w/h),origFactor=Math.sqrt(Math.pow(h,2)+Math.pow(w,2)),scale=!origFactor?1:(h/Math.cos(Math.PI/2+offsetAngle))/origFactor,s=' scale('+Math.abs(scale)+')';$h.setTransform(img,r+s);$h.setTransform(zoomImg,r+s);if(zoomOnly){$img.css('visibility','visible').insertAfter($mark).addClass('file-zoom-detail');$mark.remove();$div.remove()}})},_validateImageOrientation:function($img,file,previewId,fileId,caption,ftype,fsize,iData){var self=this,exifObj,value,autoOrientImage=self.autoOrientImage,selector;if(self.canOrientImage){$img.css('image-orientation',(autoOrientImage?'from-image':'none'));return}selector=$h.getZoomSelector(previewId,' img');exifObj=autoOrientImage?self._getExifObj(iData):null;value=exifObj?exifObj['0th'][piexif.ImageIFD.Orientation]:null;if(!value){self._validateImage(previewId,fileId,caption,ftype,fsize,iData,exifObj);return}self.setImageOrientation($img,$(selector),value,self._getFrame(previewId));self._raise('fileimageoriented',{'$img':$img,'file':file});self._validateImage(previewId,fileId,caption,ftype,fsize,iData,exifObj)},_validateImage:function(previewId,fileId,fname,ftype,fsize,iData,exifObj){var self=this,$preview=self.$preview,params,w1,w2,$thumb=self._getFrame(previewId),i=$thumb.attr('data-fileindex'),$img=$thumb.find('img');fname=fname||'Untitled';$img.one('load',function(){w1=$thumb.width();w2=$preview.width();if(w1>w2){$img.css('width','100%')}params={ind:i,id:previewId,fileId:fileId};self._checkDimensions(i,'Small',$img,$thumb,fname,'Width',params);self._checkDimensions(i,'Small',$img,$thumb,fname,'Height',params);if(!self.resizeImage){self._checkDimensions(i,'Large',$img,$thumb,fname,'Width',params);self._checkDimensions(i,'Large',$img,$thumb,fname,'Height',params)}self._raise('fileimageloaded',[previewId]);self.fileManager.addImage(fileId,{ind:i,img:$img,thumb:$thumb,pid:previewId,typ:ftype,siz:fsize,validated:false,imgData:iData,exifObj:exifObj});$thumb.data('exif',exifObj);self._validateAllImages()}).one('error',function(){self._raise('fileimageloaderror',[previewId])}).each(function(){if(this.complete){$(this).trigger('load')}else{if(this.error){$(this).trigger('error')}}})},_validateAllImages:function(){var self=this,counter={val:0},numImgs=self.fileManager.getImageCount(),fsize,minSize=self.resizeIfSizeMoreThan;if(numImgs!==self.fileManager.totalImages){return}self._raise('fileimagesloaded');if(!self.resizeImage){return}$.each(self.fileManager.loadedImages,function(id,config){if(!config.validated){fsize=config.siz;if(fsize&&fsize>minSize*1000){self._getResizedImage(id,config,counter,numImgs)}config.validated=true}})},_getResizedImage:function(id,config,counter,numImgs){var self=this,img=$(config.img)[0],width=img.naturalWidth,height=img.naturalHeight,blob,ratio=1,maxWidth=self.maxImageWidth||width,maxHeight=self.maxImageHeight||height,isValidImage=!!(width&&height),chkWidth,chkHeight,canvas=self.imageCanvas,dataURI,context=self.imageCanvasContext,type=config.typ,pid=config.pid,ind=config.ind,$thumb=config.thumb,throwError,msg,exifObj=config.exifObj,exifStr,file,params,evParams;throwError=function(msg,params,ev){if(self.isAjaxUpload){self._showFileError(msg,params,ev);}else{self._showError(msg,params,ev)}self._setPreviewError($thumb)};file=self.fileManager.getFile(id);params={id:pid,'index':ind,fileId:id};evParams=[id,pid,ind];if(!file||!isValidImage||(width<=maxWidth&&height<=maxHeight)){if(isValidImage&&file){self._raise('fileimageresized',evParams)}counter.val++;if(counter.val===numImgs){self._raise('fileimagesresized')}if(!isValidImage){throwError(self.msgImageResizeError,params,'fileimageresizeerror');return}}type=type||self.resizeDefaultImageType;chkWidth=width>maxWidth;chkHeight=height>maxHeight;if(self.resizePreference==='width'){ratio=chkWidth?maxWidth/width:(chkHeight?maxHeight/height:1)}else{ratio=chkHeight?maxHeight/height:(chkWidth?maxWidth/width:1)}self._resetCanvas();width*=ratio;height*=ratio;canvas.width=width;canvas.height=height;try{context.drawImage(img,0,0,width,height);dataURI=canvas.toDataURL(type,self.resizeQuality);if(exifObj){exifStr=window.piexif.dump(exifObj);dataURI=window.piexif.insert(exifStr,dataURI)}blob=$h.dataURI2Blob(dataURI);self.fileManager.setFile(id,blob);self._raise('fileimageresized',evParams);counter.val++;if(counter.val===numImgs){self._raise('fileimagesresized',[undefined,undefined])}if(!(blob instanceof Blob)){throwError(self.msgImageResizeError,params,'fileimageresizeerror');}}catch(err){counter.val++;if(counter.val===numImgs){self._raise('fileimagesresized',[undefined,undefined])}msg=self.msgImageResizeException.replace('{errors}',err.message);throwError(msg,params,'fileimageresizeexception');}},_showProgress:function(){var self=this;if(self.$progress&&self.$progress.length){self.$progress.show()}},_hideProgress:function(){var self=this;if(self.$progress&&self.$progress.length){self.$progress.hide()}},_initBrowse:function($container){var self=this,$el=self.$element;if(self.showBrowse){self.$btnFile=$container.find('.btn-file').append($el)}else{$el.appendTo($container).attr('tabindex',-1);$h.addCss($el,'file-no-browse')}},_initClickable:function(){var self=this,$zone,$tmpZone;if(!self.isClickable){return}$zone=self.$dropZone;if(!self.isAjaxUpload){$tmpZone=self.$preview.find('.file-default-preview');if($tmpZone.length){$zone=$tmpZone}}$h.addCss($zone,'clickable');$zone.attr('tabindex',-1);self._handler($zone,'click',function(e){var $tar=$(e.target);if(!$(self.elErrorContainer+':visible').length&&(!$tar.parents('.file-preview-thumbnails').length||$tar.parents('.file-default-preview').length)){self.$element.data('zoneClicked',true).trigger('click');$zone.blur()}})},_initCaption:function(){var self=this,cap=self.initialCaption||'';if(self.overwriteInitial||$h.isEmpty(cap)){self.$caption.val('');return false}self._setCaption(cap);return true},_setCaption:function(content,isError){var self=this,title,out,icon,n,cap,file;if(!self.$caption.length){return}self.$captionContainer.removeClass('icon-visible');if(isError){title=$(''+self.msgValidationError+'
').text();n=self.fileManager.count();if(n){file=self.fileManager.getFirstFile();cap=n===1&&file?file.nameFmt:self._getMsgSelected(n)}else{cap=self._getMsgSelected(self.msgNo)}out=$h.isEmpty(content)?cap:content;icon=''+self.msgValidationErrorIcon+' '}else{if($h.isEmpty(content)){return}title=$(''+content+'
').text();out=title;icon=self._getLayoutTemplate('fileIcon')}self.$captionContainer.addClass('icon-visible');self.$caption.attr('title',title).val(out);$h.setHtml(self.$captionIcon,icon)},_createContainer:function(){var self=this,attribs={'class':'file-input file-input-new'+(self.rtl?' kv-rtl':'')},$container=$h.createElement($h.cspBuffer.stash(self._renderMain()));$h.cspBuffer.apply($container);$container.insertBefore(self.$element).attr(attribs);self._initBrowse($container);if(self.theme){$container.addClass('theme-'+self.theme)}return $container},_refreshContainer:function(){var self=this,$container=self.$container,$el=self.$element;$el.insertAfter($container);$h.setHtml($container,self._renderMain());self._initBrowse($container);self._validateDisabled()},_validateDisabled:function(){var self=this;self.$caption.attr({readonly:self.isDisabled})},_renderMain:function(){var self=this,dropCss=self.dropZoneEnabled?' file-drop-zone':'file-drop-disabled',close=!self.showClose?'':self._getLayoutTemplate('close'),preview=!self.showPreview?'':self._getLayoutTemplate('preview').setTokens({'class':self.previewClass,'dropClass':dropCss}),css=self.isDisabled?self.captionClass+' file-caption-disabled':self.captionClass,caption=self.captionTemplate.setTokens({'class':css+' kv-fileinput-caption'});return self.mainTemplate.setTokens({'class':self.mainClass+(!self.showBrowse&&self.showCaption?' no-browse':''),'preview':preview,'close':close,'caption':caption,'upload':self._renderButton('upload'),'remove':self._renderButton('remove'),'cancel':self._renderButton('cancel'),'pause':self._renderButton('pause'),'browse':self._renderButton('browse')})},_renderButton:function(type){var self=this,tmplt=self._getLayoutTemplate('btnDefault'),css=self[type+'Class'],title=self[type+'Title'],icon=self[type+'Icon'],label=self[type+'Label'],status=self.isDisabled?' disabled':'',btnType='button';switch(type){case'remove':if(!self.showRemove){return''}break;case'cancel':if(!self.showCancel){return''}css+=' kv-hidden';break;case'pause':if(!self.showPause){return''}css+=' kv-hidden';break;case'upload':if(!self.showUpload){return''}if(self.isAjaxUpload&&!self.isDisabled){tmplt=self._getLayoutTemplate('btnLink').replace('{href}',self.uploadUrl)}else{btnType='submit'}break;case'browse':if(!self.showBrowse){return''}tmplt=self._getLayoutTemplate('btnBrowse');break;default:return''}css+=type==='browse'?' btn-file':' fileinput-'+type+' fileinput-'+type+'-button';if(!$h.isEmpty(label)){label=' '+label+' '}return tmplt.setTokens({'type':btnType,'css':css,'title':title,'status':status,'icon':icon,'label':label})},_renderThumbProgress:function(){var self=this;return''+self.progressInfoTemplate.setTokens({percent:101,status:self.msgUploadBegin,stats:''})+'
'},_renderFileFooter:function(cat,caption,size,width,isError){var self=this,config=self.fileActionSettings,rem=config.showRemove,drg=config.showDrag,upl=config.showUpload,zoom=config.showZoom,out,params,template=self._getLayoutTemplate('footer'),tInd=self._getLayoutTemplate('indicator'),ind=isError?config.indicatorError:config.indicatorNew,title=isError?config.indicatorErrorTitle:config.indicatorNewTitle,indicator=tInd.setTokens({'indicator':ind,'indicatorTitle':title});size=self._getSize(size);params={type:cat,caption:caption,size:size,width:width,progress:'',indicator:indicator};if(self.isAjaxUpload){params.progress=self._renderThumbProgress();params.actions=self._renderFileActions(params,upl,false,rem,zoom,drg,false,false,false)}else{params.actions=self._renderFileActions(params,false,false,false,zoom,drg,false,false,false)}out=template.setTokens(params);out=$h.replaceTags(out,self.previewThumbTags);return out},_renderFileActions:function(cfg,showUpl,showDwn,showDel,showZoom,showDrag,disabled,url,key,isInit,dUrl,dFile){var self=this;if(!cfg.type&&isInit){cfg.type='image'}if(self.enableResumableUpload){showUpl=false}else{if(typeof showUpl==='function'){showUpl=showUpl(cfg)}}if(typeof showDwn==='function'){showDwn=showDwn(cfg)}if(typeof showDel==='function'){showDel=showDel(cfg)}if(typeof showZoom==='function'){showZoom=showZoom(cfg)}if(typeof showDrag==='function'){showDrag=showDrag(cfg)}if(!showUpl&&!showDwn&&!showDel&&!showZoom&&!showDrag){return''}var vUrl=url===false?'':' data-url="'+url+'"',btnZoom='',btnDrag='',css,vKey=key===false?'':' data-key="'+key+'"',btnDelete='',btnUpload='',btnDownload='',template=self._getLayoutTemplate('actions'),config=self.fileActionSettings,otherButtons=self.otherActionButtons.setTokens({'dataKey':vKey,'key':key}),removeClass=disabled?config.removeClass+' disabled':config.removeClass;if(showDel){btnDelete=self._getLayoutTemplate('actionDelete').setTokens({'removeClass':removeClass,'removeIcon':config.removeIcon,'removeTitle':config.removeTitle,'dataUrl':vUrl,'dataKey':vKey,'key':key})}if(showUpl){btnUpload=self._getLayoutTemplate('actionUpload').setTokens({'uploadClass':config.uploadClass,'uploadIcon':config.uploadIcon,'uploadTitle':config.uploadTitle})}if(showDwn){btnDownload=self._getLayoutTemplate('actionDownload').setTokens({'downloadClass':config.downloadClass,'downloadIcon':config.downloadIcon,'downloadTitle':config.downloadTitle,'downloadUrl':dUrl||self.initialPreviewDownloadUrl});btnDownload=btnDownload.setTokens({'filename':dFile,'key':key})}if(showZoom){btnZoom=self._getLayoutTemplate('actionZoom').setTokens({'zoomClass':config.zoomClass,'zoomIcon':config.zoomIcon,'zoomTitle':config.zoomTitle})}if(showDrag&&isInit){css='drag-handle-init '+config.dragClass;btnDrag=self._getLayoutTemplate('actionDrag').setTokens({'dragClass':css,'dragTitle':config.dragTitle,'dragIcon':config.dragIcon})}return template.setTokens({'delete':btnDelete,'upload':btnUpload,'download':btnDownload,'zoom':btnZoom,'drag':btnDrag,'other':otherButtons})},_browse:function(e){var self=this;if(e&&e.isDefaultPrevented()||!self._raise('filebrowse')){return}if(self.isError&&!self.isAjaxUpload){self.clear()}if(self.focusCaptionOnBrowse){self.$captionContainer.focus()}},_change:function(e){var self=this;if(self.changeTriggered){return}var $el=self.$element,isDragDrop=arguments.length>1,isAjaxUpload=self.isAjaxUpload,tfiles,files=isDragDrop?arguments[1]:$el[0].files,ctr=self.fileManager.count(),total,initCount,len,isSingleUpl=$h.isEmpty($el.attr('multiple')),maxCount=!isAjaxUpload&&isSingleUpl?1:self.maxFileCount,maxTotCount=self.maxTotalFileCount,inclAll=maxTotCount>0&&maxTotCount>maxCount,flagSingle=(isSingleUpl&&ctr>0),throwError=function(mesg,file,previewId,index){var p1=$.extend(true,{},self._getOutData(null,{},{},files),{id:previewId,index:index}),p2={id:previewId,index:index,file:file,files:files};self.isPersistentError=true;return isAjaxUpload?self._showFileError(mesg,p1):self._showError(mesg,p2)},maxCountCheck=function(n,m,all){var msg=all?self.msgTotalFilesTooMany:self.msgFilesTooMany;msg=msg.replace('{m}',m).replace('{n}',n);self.isError=throwError(msg,null,null,null);self.$captionContainer.removeClass('icon-visible');self._setCaption('',true);self.$container.removeClass('file-input-new file-input-ajax-new')};self.reader=null;self._resetUpload();self._hideFileIcon();if(self.dropZoneEnabled){self.$container.find('.file-drop-zone .'+self.dropZoneTitleClass).remove()}if(!isAjaxUpload){if(e.target&&e.target.files===undefined){files=e.target.value?[{name:e.target.value.replace(/^.+\\/,'')}]:[]}else{files=e.target.files||{}}}tfiles=files;if($h.isEmpty(tfiles)||tfiles.length===0){if(!isAjaxUpload){self.clear()}self._raise('fileselectnone');return}self._resetErrors();len=tfiles.length;initCount=isAjaxUpload?(self.fileManager.count()+len):len;total=self._getFileCount(initCount,inclAll?false:undefined);if(maxCount>0&&total>maxCount){if(!self.autoReplace||len>maxCount){maxCountCheck((self.autoReplace&&len>maxCount?len:total),maxCount);return}if(total>maxCount){self._resetPreviewThumbs(isAjaxUpload)}}else{if(inclAll){total=self._getFileCount(initCount,true);if(maxTotCount>0&&total>maxTotCount){if(!self.autoReplace||len>maxCount){maxCountCheck((self.autoReplace&&len>maxTotCount?len:total),maxTotCount,true);return}if(total>maxCount){self._resetPreviewThumbs(isAjaxUpload)}}}if(!isAjaxUpload||flagSingle){self._resetPreviewThumbs(false);if(flagSingle){self.clearFileStack()}}else{if(isAjaxUpload&&ctr===0&&(!self.previewCache.count(true)||self.overwriteInitial)){self._resetPreviewThumbs(true)}}}self.readFiles(tfiles)},_abort:function(params){var self=this,data;if(self.ajaxAborted&&typeof self.ajaxAborted==='object'&&self.ajaxAborted.message!==undefined){data=$.extend(true,{},self._getOutData(null),params);data.abortData=self.ajaxAborted.data||{};data.abortMessage=self.ajaxAborted.message;self._setProgress(101,self.$progress,self.msgCancelled);self._showFileError(self.ajaxAborted.message,data,'filecustomerror');self.cancel();return true}return!!self.ajaxAborted},_resetFileStack:function(){var self=this,i=0;self._getThumbs().each(function(){var $thumb=$(this),ind=$thumb.attr('data-fileindex'),pid=$thumb.attr('id');if(ind==='-1'||ind===-1){return}if(!self.fileManager.getFile($thumb.attr('data-fileid'))){$thumb.attr({'data-fileindex':i});i++}else{$thumb.attr({'data-fileindex':'-1'})}self._getZoom(pid).attr({'data-fileindex':$thumb.attr('data-fileindex')})})},_isFileSelectionValid:function(cnt){var self=this;cnt=cnt||0;if(self.required&&!self.getFilesCount()){self.$errorContainer.html('');self._showFileError(self.msgFileRequired);return false}if(self.minFileCount>0&&self._getFileCount(cnt)maxSize);return!skipPreview&&(allowedTypes||allowedMimes||allowedExts)},addToStack:function(file,id){this.fileManager.add(file,id)},clearFileStack:function(){var self=this;self.fileManager.clear();self._initResumableUpload();if(self.enableResumableUpload){if(self.showPause===null){self.showPause=true}if(self.showCancel===null){self.showCancel=false}}else{self.showPause=false;if(self.showCancel===null){self.showCancel=true}}return self.$element},getFileStack:function(){return this.fileManager.stack},getFileList:function(){return this.fileManager.list()},getFilesCount:function(includeInitial){var self=this,len=self.isAjaxUpload?self.fileManager.count():self._inputFileCount();if(includeInitial){len+=self.previewCache.count(true)}return self._getFileCount(len)},readFiles:function(files){this.reader=new FileReader();var self=this,reader=self.reader,$container=self.$previewContainer,$status=self.$previewStatus,msgLoading=self.msgLoading,msgProgress=self.msgProgress,previewInitId=self.previewInitId,numFiles=files.length,settings=self.fileTypeSettings,readFile,fileTypes=self.allowedFileTypes,typLen=fileTypes?fileTypes.length:0,fileExt=self.allowedFileExtensions,strExt=$h.isEmpty(fileExt)?'':fileExt.join(', '),throwError=function(msg,file,previewId,index,fileId){var $thumb,p1=$.extend(true,{},self._getOutData(null,{},{},files),{id:previewId,index:index,fileId:fileId}),p2={id:previewId,index:index,fileId:fileId,file:file,files:files};self._previewDefault(file,true);$thumb=self._getFrame(previewId,true);if(self.isAjaxUpload){setTimeout(function(){readFile(index+1)},self.processDelay)}else{self.unlock();numFiles=0}if(self.removeFromPreviewOnError&&$thumb.length){$thumb.remove()}else{self._initFileActions();$thumb.find('.kv-file-upload').remove()}self.isPersistentError=true;self.isError=self.isAjaxUpload?self._showFileError(msg,p1):self._showError(msg,p2);self._updateFileDetails(numFiles)};self.fileManager.clearImages();$.each(files,function(key,file){var func=self.fileTypeSettings.image;if(func&&func(file.type)){self.fileManager.totalImages++}});readFile=function(i){var $error=self.$errorContainer,errors,fm=self.fileManager;if(i>=numFiles){self.unlock();if(self.duplicateErrors.length){errors=''+self.duplicateErrors.join(' ')+' ';if($error.find('ul').length===0){$h.setHtml($error,self.errorCloseButton+'')}else{$error.find('ul').append(errors)}$error.fadeIn(self.fadeDelay);self._handler($error.find('.kv-error-close'),'click',function(){$error.fadeOut(self.fadeDelay)});self.duplicateErrors=[]}if(self.isAjaxUpload){self._raise('filebatchselected',[fm.stack]);if(fm.count()===0&&!self.isError){self.reset()}}else{self._raise('filebatchselected',[files])}$container.removeClass('file-thumb-loading');$status.html('');return}self.lock(true);var file=files[i],previewId=previewInitId+'-'+self._getFileId(file),fSizeKB,j,msg,fnText=settings.text,fnImage=settings.image,fnHtml=settings.html,typ,chk,typ1,typ2,caption=self._getFileName(file,''),fileSize=(file&&file.size||0)/1000,fileExtExpr='',previewData=$h.createObjectURL(file),fileCount=0,strTypes='',fileId,canLoad,fileReaderAborted=false,func,knownTypes=0,isText,isHtml,isImage,txtFlag,processFileLoaded=function(){var msg=msgProgress.setTokens({'index':i+1,'files':numFiles,'percent':50,'name':caption});setTimeout(function(){$status.html(msg);self._updateFileDetails(numFiles);readFile(i+1)},self.processDelay);if(self._raise('fileloaded',[file,previewId,i,reader])&&self.isAjaxUpload){fm.add(file)}};if(!file){return}fileId=fm.getId(file);if(typLen>0){for(j=0;j0&&fileSize>self.maxFileSize){msg=self.msgSizeTooLarge.setTokens({'name':caption,'size':fSizeKB,'maxSize':self.maxFileSize});throwError(msg,file,previewId,i,fileId);return}if(self.minFileSize!==null&&fileSize<=$h.getNum(self.minFileSize)){msg=self.msgSizeTooSmall.setTokens({'name':caption,'size':fSizeKB,'minSize':self.minFileSize});throwError(msg,file,previewId,i,fileId);return}if(!$h.isEmpty(fileTypes)&&$h.isArray(fileTypes)){for(j=0;j0){for(i=0;i0){for(i=0;i0)?self.initialCaption:'';self.$caption.attr('title','').val(cap);$h.addCss(self.$container,'file-input-new');self._validateDefaultPreview()}if(self.$container.find($h.FRAMES).length===0){if(!self._initCaption()){self.$captionContainer.removeClass('icon-visible')}}self._hideFileIcon();if(self.focusCaptionOnClear){self.$captionContainer.focus()}self._setFileDropZoneTitle();self._raise('filecleared');return self.$element},reset:function(){var self=this;if(!self._raise('filereset')){return}self.lastProgress=0;self._resetPreview();self.$container.find('.fileinput-filename').text('');$h.addCss(self.$container,'file-input-new');if(self.getFrames().length){self.$container.removeClass('file-input-new')}self.clearFileStack();self._setFileDropZoneTitle();return self.$element},disable:function(){var self=this,$container=self.$container;self.isDisabled=true;self._raise('filedisabled');self.$element.attr('disabled','disabled');$container.addClass('is-locked');$h.addCss($container.find('.btn-file'),'disabled');$container.find('.kv-fileinput-caption').addClass('file-caption-disabled');$container.find('.fileinput-remove, .fileinput-upload, .file-preview-frame button').attr('disabled',true);self._initDragDrop();return self.$element},enable:function(){var self=this,$container=self.$container;self.isDisabled=false;self._raise('fileenabled');self.$element.removeAttr('disabled');$container.removeClass('is-locked');$container.find('.kv-fileinput-caption').removeClass('file-caption-disabled');$container.find('.fileinput-remove, .fileinput-upload, .file-preview-frame button').removeAttr('disabled');$container.find('.btn-file').removeClass('disabled');self._initDragDrop();return self.$element},upload:function(){var self=this,fm=self.fileManager,totLen=fm.count(),i,outData,hasExtraData=!$.isEmptyObject(self._getExtraData());if(!self.isAjaxUpload||self.isDisabled||!self._isFileSelectionValid(totLen)){return}self.lastProgress=0;self._resetUpload();if(totLen===0&&!hasExtraData){self._showFileError(self.msgUploadEmpty);return}self.cancelling=false;self._showProgress();self.lock();if(totLen===0&&hasExtraData){self._setProgress(2);self._uploadExtraOnly();return}if(self.enableResumableUpload){return self.resume()}if(self.uploadAsync||self.enableResumableUpload){outData=self._getOutData(null);self._raise('filebatchpreupload',[outData]);self.fileBatchCompleted=false;self.uploadCache=[];$.each(self.getFileStack(),function(id){var previewId=self._getThumbId(id);self.uploadCache.push({id:previewId,content:null,config:null,tags:null,append:true})});self.$preview.find('.file-preview-initial').removeClass($h.SORT_CSS);self._initSortable()}self._setProgress(2);self.hasInitData=false;if(self.uploadAsync){i=0;$.each(fm.stack,function(id){self._uploadSingle(i,id,true);i++});return}self._uploadBatch();return self.$element},destroy:function(){var self=this,$form=self.$form,$cont=self.$container,$el=self.$element,ns=self.namespace;$(document).off(ns);$(window).off(ns);if($form&&$form.length){$form.off(ns)}if(self.isAjaxUpload){self._clearFileInput()}self._cleanup();self._initPreviewCache();$el.insertBefore($cont).off(ns).removeData();$cont.off().remove();return $el},refresh:function(options){var self=this,$el=self.$element;if(typeof options!=='object'||$h.isEmpty(options)){options=self.options}else{options=$.extend(true,{},self.options,options)}self._init(options,true);self._listen();return $el},zoom:function(frameId){var self=this,$frame=self._getFrame(frameId);self._showModal($frame)},getExif:function(frameId){var self=this,$frame=self._getFrame(frameId);return $frame&&$frame.data('exif')||null},getFrames:function(cssFilter){var self=this,$frames;cssFilter=cssFilter||'';$frames=self.$preview.find($h.FRAMES+cssFilter);if(self.reversePreviewOrder){$frames=$($frames.get().reverse())}return $frames},getPreview:function(){var self=this;return{content:self.initialPreview,config:self.initialPreviewConfig,tags:self.initialPreviewThumbTags}}};$.fn.fileinput=function(option){if(!$h.hasFileAPISupport()&&!$h.isIE(9)){return}var args=Array.apply(null,arguments),retvals=[];args.shift();this.each(function(){var self=$(this),data=self.data('fileinput'),options=typeof option==='object'&&option,theme=options.theme||self.data('theme'),l={},t={},lang=options.language||self.data('language')||$.fn.fileinput.defaults.language||'en',opt;if(!data){if(theme){t=$.fn.fileinputThemes[theme]||{}}if(lang!=='en'&&!$h.isEmpty($.fn.fileinputLocales[lang])){l=$.fn.fileinputLocales[lang]||{}}opt=$.extend(true,{},$.fn.fileinput.defaults,t,$.fn.fileinputLocales.en,l,options,self.data());data=new FileInput(this,opt);self.data('fileinput',data)}if(typeof option==='string'){retvals.push(data[option].apply(data,args))}});switch(retvals.length){case 0:return this;case 1:return retvals[0];default:return retvals}};var IFRAME_ATTRIBS='class="kv-preview-data file-preview-pdf" src="{renderer}?file={data}" {style}';$.fn.fileinput.defaults={language:'zh',showCaption:true,showBrowse:true,showPreview:true,showRemove:true,showUpload:true,showUploadStats:true,showCancel:null,showPause:null,showClose:true,showUploadedThumbs:true,showConsoleLogs:false,browseOnZoneClick:false,autoReplace:false,autoOrientImage:function(){var ua=window.navigator.userAgent,webkit=!!ua.match(/WebKit/i),iOS=!!ua.match(/iP(od|ad|hone)/i),iOSSafari=iOS&&webkit&&!ua.match(/CriOS/i);return!iOSSafari},autoOrientImageInitial:true,required:false,rtl:false,hideThumbnailContent:false,encodeUrl:true,focusCaptionOnBrowse:true,focusCaptionOnClear:true,generateFileId:null,previewClass:'',captionClass:'',frameClass:'krajee-default',mainClass:'file-caption-main',mainTemplate:null,purifyHtml:true,fileSizeGetter:null,initialCaption:'',initialPreview:[],initialPreviewDelimiter:'*$$*',initialPreviewAsData:false,initialPreviewFileType:'image',initialPreviewConfig:[],initialPreviewThumbTags:[],previewThumbTags:{},initialPreviewShowDelete:true,initialPreviewDownloadUrl:'',removeFromPreviewOnError:false,deleteUrl:'',deleteExtraData:{},overwriteInitial:true,sanitizeZoomCache:function(content){var $container=$h.createElement(content);$container.find('input,textarea,select,datalist,form,.file-thumbnail-footer').remove();return $container.html()},previewZoomButtonIcons:{prev:' ',next:' ',toggleheader:' ',fullscreen:' ',borderless:' ',close:' '},previewZoomButtonClasses:{prev:'btn btn-navigate',next:'btn btn-navigate',toggleheader:'btn btn-sm btn-kv btn-default btn-outline-secondary',fullscreen:'btn btn-sm btn-kv btn-default btn-outline-secondary',borderless:'btn btn-sm btn-kv btn-default btn-outline-secondary',close:'btn btn-sm btn-kv btn-default btn-outline-secondary'},previewTemplates:{},previewContentTemplates:{},preferIconicPreview:false,preferIconicZoomPreview:false,allowedFileTypes:null,allowedFileExtensions:null,allowedPreviewTypes:undefined,allowedPreviewMimeTypes:null,allowedPreviewExtensions:null,disabledPreviewTypes:undefined,disabledPreviewExtensions:['msi','exe','com','zip','rar','app','vb','scr'],disabledPreviewMimeTypes:null,defaultPreviewContent:null,customLayoutTags:{},customPreviewTags:{},previewFileIcon:' ',previewFileIconClass:'file-other-icon',previewFileIconSettings:{},previewFileExtSettings:{},buttonLabelClass:'hidden-xs',browseIcon:' ',browseClass:'btn btn-primary',removeIcon:' ',removeClass:'btn btn-default btn-secondary',cancelIcon:' ',cancelClass:'btn btn-default btn-secondary',pauseIcon:' ',pauseClass:'btn btn-default btn-secondary',uploadIcon:' ',uploadClass:'btn btn-default btn-secondary',uploadUrl:null,uploadUrlThumb:null,uploadAsync:true,uploadParamNames:{chunkCount:'chunkCount',chunkIndex:'chunkIndex',chunkSize:'chunkSize',chunkSizeStart:'chunkSizeStart',chunksUploaded:'chunksUploaded',fileBlob:'fileBlob',fileId:'fileId',fileName:'fileName',fileRelativePath:'fileRelativePath',fileSize:'fileSize',retryCount:'retryCount'},maxAjaxThreads:5,fadeDelay:800,processDelay:100,queueDelay:10,progressDelay:0,enableResumableUpload:false,resumableUploadOptions:{fallback:null,testUrl:null,chunkSize:2*1024,maxThreads:4,maxRetries:3,showErrorLog:true},uploadExtraData:{},zoomModalHeight:480,minImageWidth:null,minImageHeight:null,maxImageWidth:null,maxImageHeight:null,resizeImage:false,resizePreference:'width',resizeQuality:0.92,resizeDefaultImageType:'image/jpeg',resizeIfSizeMoreThan:0,minFileSize:0,maxFileSize:0,maxFilePreviewSize:25600,minFileCount:0,maxFileCount:0,maxTotalFileCount:0,validateInitialCount:false,msgValidationErrorClass:'text-danger',msgValidationErrorIcon:' ',msgErrorClass:'file-error-message',progressThumbClass:'progress-bar progress-bar-striped active',progressClass:'progress-bar bg-success progress-bar-success progress-bar-striped active',progressInfoClass:'progress-bar bg-info progress-bar-info progress-bar-striped active',progressCompleteClass:'progress-bar bg-success progress-bar-success',progressPauseClass:'progress-bar bg-primary progress-bar-primary progress-bar-striped active',progressErrorClass:'progress-bar bg-danger progress-bar-danger',progressUploadThreshold:99,previewFileType:'image',elCaptionContainer:null,elCaptionText:null,elPreviewContainer:null,elPreviewImage:null,elPreviewStatus:null,elErrorContainer:null,errorCloseButton:$h.closeButton('kv-error-close'),slugCallback:null,dropZoneEnabled:true,dropZoneTitleClass:'file-drop-zone-title',fileActionSettings:{},otherActionButtons:'',textEncoding:'UTF-8',ajaxSettings:{},ajaxDeleteSettings:{},showAjaxErrorDetails:true,mergeAjaxCallbacks:false,mergeAjaxDeleteCallbacks:false,retryErrorUploads:true,reversePreviewOrder:false,usePdfRenderer:function(){var isIE11=!!window.MSInputMethodContext&&!!document.documentMode;return!!navigator.userAgent.match(/(iPod|iPhone|iPad|Android)/i)||isIE11},pdfRendererUrl:'',pdfRendererTemplate:''};$.fn.fileinputLocales.en={fileSingle:'file',filePlural:'files',browseLabel:'Browse …',removeLabel:'Remove',removeTitle:'Clear all unprocessed files',cancelLabel:'Cancel',cancelTitle:'Abort ongoing upload',pauseLabel:'Pause',pauseTitle:'Pause ongoing upload',uploadLabel:'Upload',uploadTitle:'Upload selected files',msgNo:'No',msgNoFilesSelected:'No files selected',msgCancelled:'Cancelled',msgPaused:'Paused',msgPlaceholder:'Select {files} ...',msgZoomModalHeading:'Detailed Preview',msgFileRequired:'You must select a file to upload.',msgSizeTooSmall:'File "{name}" ({size} KB ) is too small and must be larger than {minSize} KB .',msgSizeTooLarge:'File "{name}" ({size} KB ) exceeds maximum allowed upload size of {maxSize} KB .',msgFilesTooLess:'You must select at least {n} {files} to upload.',msgFilesTooMany:'Number of files selected for upload ({n}) exceeds maximum allowed limit of {m} .',msgTotalFilesTooMany:'You can upload a maximum of {m} files ({n} files detected).',msgFileNotFound:'File "{name}" not found!',msgFileSecured:'Security restrictions prevent reading the file "{name}".',msgFileNotReadable:'File "{name}" is not readable.',msgFilePreviewAborted:'File preview aborted for "{name}".',msgFilePreviewError:'An error occurred while reading the file "{name}".',msgInvalidFileName:'Invalid or unsupported characters in file name "{name}".',msgInvalidFileType:'Invalid type for file "{name}". Only "{types}" files are supported.',msgInvalidFileExtension:'Invalid extension for file "{name}". Only "{extensions}" files are supported.',msgFileTypes:{'image':'image','html':'HTML','text':'text','video':'video','audio':'audio','flash':'flash','pdf':'PDF','object':'object'},msgUploadAborted:'The file upload was aborted',msgUploadThreshold:'Processing …',msgUploadBegin:'Initializing …',msgUploadEnd:'Done',msgUploadResume:'Resuming upload …',msgUploadEmpty:'No valid data available for upload.',msgUploadError:'Upload Error',msgDeleteError:'Delete Error',msgProgressError:'Error',msgValidationError:'Validation Error',msgLoading:'Loading file {index} of {files} …',msgProgress:'Loading file {index} of {files} - {name} - {percent}% completed.',msgSelected:'{n} {files} selected',msgFoldersNotAllowed:'Drag & drop files only! {n} folder(s) dropped were skipped.',msgImageWidthSmall:'Width of image file "{name}" must be at least {size} px.',msgImageHeightSmall:'Height of image file "{name}" must be at least {size} px.',msgImageWidthLarge:'Width of image file "{name}" cannot exceed {size} px.',msgImageHeightLarge:'Height of image file "{name}" cannot exceed {size} px.',msgImageResizeError:'Could not get the image dimensions to resize.',msgImageResizeException:'Error while resizing the image.{errors} ',msgAjaxError:'Something went wrong with the {operation} operation. Please try again later!',msgAjaxProgressError:'{operation} failed',msgDuplicateFile:'File "{name}" of same size "{size} KB" has already been selected earlier. Skipping duplicate selection.',msgResumableUploadRetriesExceeded:'Upload aborted beyond {max} retries for file {file} ! Error Details: {error} ',msgPendingTime:'{time} remaining',msgCalculatingTime:'calculating time remaining',ajaxOperations:{deleteThumb:'file delete',uploadThumb:'file upload',uploadBatch:'batch file upload',uploadExtra:'form data upload'},dropZoneTitle:'Drag & drop files here …',dropZoneClickTitle:' (or click to select {files})',previewZoomButtonTitles:{prev:'View previous file',next:'View next file',toggleheader:'Toggle header',fullscreen:'Toggle full screen',borderless:'Toggle borderless mode',close:'Close detailed preview'}};$.fn.fileinputLocales.zh={fileSingle:'文件',filePlural:'个文件',browseLabel:'选择 …',removeLabel:'移除',removeTitle:'清除选中文件',cancelLabel:'取消',cancelTitle:'取消进行中的上传',pauseLabel:'Pause',pauseTitle:'Pause ongoing upload',uploadLabel:'上传',uploadTitle:'上传选中文件',msgNo:'没有',msgNoFilesSelected:'未选择文件',msgPaused:'Paused',msgCancelled:'取消',msgPlaceholder:'选择 {files}...',msgZoomModalHeading:'详细预览',msgFileRequired:'必须选择一个文件上传.',msgSizeTooSmall:'文件 "{name}" ({size} KB ) 必须大于限定大小 {minSize} KB .',msgSizeTooLarge:'文件 "{name}" ({size} KB ) 超过了允许大小 {maxSize} KB .',msgFilesTooLess:'你必须选择最少 {n} {files} 来上传. ',msgFilesTooMany:'选择的上传文件个数 ({n}) 超出最大文件的限制个数 {m} .',msgFileNotFound:'文件 "{name}" 未找到!',msgFileSecured:'安全限制,为了防止读取文件 "{name}".',msgFileNotReadable:'文件 "{name}" 不可读.',msgFilePreviewAborted:'取消 "{name}" 的预览.',msgFilePreviewError:'读取 "{name}" 时出现了一个错误.',msgInvalidFileName:'文件名 "{name}" 包含非法字符.',msgInvalidFileType:'不正确的类型 "{name}". 只支持 "{types}" 类型的文件.',msgInvalidFileExtension:'不正确的文件扩展名 "{name}". 只支持 "{extensions}" 的文件扩展名.',msgFileTypes:{'image':'image','html':'HTML','text':'text','video':'video','audio':'audio','flash':'flash','pdf':'PDF','object':'object'},msgUploadAborted:'该文件上传被中止',msgUploadThreshold:'处理中...',msgUploadBegin:'正在初始化...',msgUploadEnd:'完成',msgUploadResume:'Resuming upload...',msgUploadEmpty:'无效的文件上传.',msgUploadError:'Upload Error',msgDeleteError:'Delete Error',msgProgressError:'上传出错',msgValidationError:'验证错误',msgLoading:'加载第 {index} 文件 共 {files} …',msgProgress:'加载第 {index} 文件 共 {files} - {name} - {percent}% 完成.',msgSelected:'{n} {files} 选中',msgFoldersNotAllowed:'只支持拖拽文件! 跳过 {n} 拖拽的文件夹.',msgImageWidthSmall:'图像文件的"{name}"的宽度必须是至少{size}像素.',msgImageHeightSmall:'图像文件的"{name}"的高度必须至少为{size}像素.',msgImageWidthLarge:'图像文件"{name}"的宽度不能超过{size}像素.',msgImageHeightLarge:'图像文件"{name}"的高度不能超过{size}像素.',msgImageResizeError:'无法获取的图像尺寸调整。',msgImageResizeException:'调整图像大小时发生错误。{errors} ',msgAjaxError:'{operation} 发生错误. 请重试!',msgAjaxProgressError:'{operation} 失败',msgDuplicateFile:'File "{name}" of same size "{size} KB" has already been selected earlier. Skipping duplicate selection.',msgResumableUploadRetriesExceeded:'Upload aborted beyond {max} retries for file {file} ! Error Details: {error} ',msgPendingTime:'{time} remaining',msgCalculatingTime:'calculating time remaining',ajaxOperations:{deleteThumb:'删除文件',uploadThumb:'上传文件',uploadBatch:'批量上传',uploadExtra:'表单数据上传'},dropZoneTitle:'拖拽文件到这里 … 支持多文件同时上传',dropZoneClickTitle:' (或点击{files}按钮选择文件)',fileActionSettings:{removeTitle:'删除文件',uploadTitle:'上传文件',downloadTitle:'下载文件',uploadRetryTitle:'重试',zoomTitle:'查看详情',dragTitle:'移动 / 重置',indicatorNewTitle:'没有上传',indicatorSuccessTitle:'上传',indicatorErrorTitle:'上传错误',indicatorPausedTitle:'Upload Paused',indicatorLoadingTitle:'上传 ...'},previewZoomButtonTitles:{prev:'预览上一个文件',next:'预览下一个文件',toggleheader:'缩放',fullscreen:'全屏',borderless:'无边界模式',close:'关闭当前预览'}};$.fn.fileinput.Constructor=FileInput;$(document).ready(function(){var $input=$('input.file[type=file]');if($input.length){$input.fileinput()}})}));
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-table/extensions/resizable/bootstrap-table-resizable.min.js b/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-table/extensions/resizable/bootstrap-table-resizable.min.js
new file mode 100644
index 000000000..486633ea8
--- /dev/null
+++ b/ruoyi-admin/src/main/resources/static/ajax/libs/bootstrap-table/extensions/resizable/bootstrap-table-resizable.min.js
@@ -0,0 +1,9 @@
+/**
+ * bootstrap-table - An extended table to integration with some of the most widely used CSS frameworks. (Supports Bootstrap, Semantic UI, Bulma, Material Design, Foundation)
+ *
+ * @version v1.17.1
+ * @homepage https://bootstrap-table.com
+ * @author wenzhixin (http://wenzhixin.net.cn/)
+ * @license MIT
+ */
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(require("jquery")):"function"==typeof define&&define.amd?define(["jquery"],e):e((t=t||self).jQuery)}(this,(function(t){"use strict";t=t&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t;var e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function n(t,e){return t(e={exports:{}},e.exports),e.exports}var r=function(t){return t&&t.Math==Math&&t},o=r("object"==typeof globalThis&&globalThis)||r("object"==typeof window&&window)||r("object"==typeof self&&self)||r("object"==typeof e&&e)||Function("return this")(),i=function(t){try{return!!t()}catch(t){return!0}},u=!i((function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})),c={}.propertyIsEnumerable,f=Object.getOwnPropertyDescriptor,a={f:f&&!c.call({1:2},1)?function(t){var e=f(this,t);return!!e&&e.enumerable}:c},l=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}},s={}.toString,p=function(t){return s.call(t).slice(8,-1)},y="".split,h=i((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==p(t)?y.call(t,""):Object(t)}:Object,b=function(t){return h(function(t){if(null==t)throw TypeError("Can't call method on "+t);return t}(t))},g=function(t){return"object"==typeof t?null!==t:"function"==typeof t},d=function(t,e){if(!g(t))return t;var n,r;if(e&&"function"==typeof(n=t.toString)&&!g(r=n.call(t)))return r;if("function"==typeof(n=t.valueOf)&&!g(r=n.call(t)))return r;if(!e&&"function"==typeof(n=t.toString)&&!g(r=n.call(t)))return r;throw TypeError("Can't convert object to primitive value")},v={}.hasOwnProperty,m=function(t,e){return v.call(t,e)},w=o.document,S=g(w)&&g(w.createElement),j=!u&&!i((function(){return 7!=Object.defineProperty((t="div",S?w.createElement(t):{}),"a",{get:function(){return 7}}).a;var t})),O=Object.getOwnPropertyDescriptor,A={f:u?O:function(t,e){if(t=b(t),e=d(e,!0),j)try{return O(t,e)}catch(t){}if(m(t,e))return l(!a.f.call(t,e),t[e])}},P=function(t){if(!g(t))throw TypeError(String(t)+" is not an object");return t},T=Object.defineProperty,E={f:u?T:function(t,e,n){if(P(t),e=d(e,!0),P(n),j)try{return T(t,e,n)}catch(t){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(t[e]=n.value),t}},x=u?function(t,e,n){return E.f(t,e,l(1,n))}:function(t,e,n){return t[e]=n,t},M=function(t,e){try{x(o,t,e)}catch(n){o[t]=e}return e},_=o["__core-js_shared__"]||M("__core-js_shared__",{}),z=Function.toString;"function"!=typeof _.inspectSource&&(_.inspectSource=function(t){return z.call(t)});var C,V,k,I,F=_.inspectSource,L=o.WeakMap,N="function"==typeof L&&/native code/.test(F(L)),q=n((function(t){(t.exports=function(t,e){return _[t]||(_[t]=void 0!==e?e:{})})("versions",[]).push({version:"3.6.0",mode:"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})})),$=0,B=Math.random(),D=function(t){return"Symbol("+String(void 0===t?"":t)+")_"+(++$+B).toString(36)},G=q("keys"),W={},K=o.WeakMap;if(N){var Q=new K,R=Q.get,Y=Q.has,H=Q.set;C=function(t,e){return H.call(Q,t,e),e},V=function(t){return R.call(Q,t)||{}},k=function(t){return Y.call(Q,t)}}else{var J=G[I="state"]||(G[I]=D(I));W[J]=!0,C=function(t,e){return x(t,J,e),e},V=function(t){return m(t,J)?t[J]:{}},k=function(t){return m(t,J)}}var U,X,Z={set:C,get:V,has:k,enforce:function(t){return k(t)?V(t):C(t,{})},getterFor:function(t){return function(e){var n;if(!g(e)||(n=V(e)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return n}}},tt=n((function(t){var e=Z.get,n=Z.enforce,r=String(String).split("String");(t.exports=function(t,e,i,u){var c=!!u&&!!u.unsafe,f=!!u&&!!u.enumerable,a=!!u&&!!u.noTargetGet;"function"==typeof i&&("string"!=typeof e||m(i,"name")||x(i,"name",e),n(i).source=r.join("string"==typeof e?e:"")),t!==o?(c?!a&&t[e]&&(f=!0):delete t[e],f?t[e]=i:x(t,e,i)):f?t[e]=i:M(e,i)})(Function.prototype,"toString",(function(){return"function"==typeof this&&e(this).source||F(this)}))})),et=o,nt=function(t){return"function"==typeof t?t:void 0},rt=function(t,e){return arguments.length<2?nt(et[t])||nt(o[t]):et[t]&&et[t][e]||o[t]&&o[t][e]},ot=Math.ceil,it=Math.floor,ut=function(t){return isNaN(t=+t)?0:(t>0?it:ot)(t)},ct=Math.min,ft=function(t){return t>0?ct(ut(t),9007199254740991):0},at=Math.max,lt=Math.min,st=function(t,e){var n=ut(t);return n<0?at(n+e,0):lt(n,e)},pt=function(t){return function(e,n,r){var o,i=b(e),u=ft(i.length),c=st(r,u);if(t&&n!=n){for(;u>c;)if((o=i[c++])!=o)return!0}else for(;u>c;c++)if((t||c in i)&&i[c]===n)return t||c||0;return!t&&-1}},yt={includes:pt(!0),indexOf:pt(!1)}.indexOf,ht=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"].concat("length","prototype"),bt={f:Object.getOwnPropertyNames||function(t){return function(t,e){var n,r=b(t),o=0,i=[];for(n in r)!m(W,n)&&m(r,n)&&i.push(n);for(;e.length>o;)m(r,n=e[o++])&&(~yt(i,n)||i.push(n));return i}(t,ht)}},gt={f:Object.getOwnPropertySymbols},dt=rt("Reflect","ownKeys")||function(t){var e=bt.f(P(t)),n=gt.f;return n?e.concat(n(t)):e},vt=function(t,e){for(var n=dt(e),r=E.f,o=A.f,i=0;i=74)&&(U=It.match(/Chrome\/(\d+)/))&&(X=U[1]);var qt,$t=X&&+X,Bt=kt("species"),Dt=kt("species"),Gt=[].slice,Wt=Math.max;!function(t,e){var n,r,i,u,c,f=t.target,a=t.global,l=t.stat;if(n=a?o:l?o[f]||M(f,{}):(o[f]||{}).prototype)for(r in e){if(u=e[r],i=t.noTargetGet?(c=Tt(n,r))&&c.value:n[r],!Pt(a?r:f+(l?".":"#")+r,t.forced)&&void 0!==i){if(typeof u==typeof i)continue;vt(u,i)}(t.sham||i&&i.sham)&&x(u,"sham",!0),tt(n,r,u,t)}}({target:"Array",proto:!0,forced:(qt="slice",!($t>=51||!i((function(){var t=[];return(t.constructor={})[Bt]=function(){return{foo:1}},1!==t[qt](Boolean).foo}))))},{slice:function(t,e){var n,r,o,i=b(this),u=ft(i.length),c=st(t,u),f=st(void 0===e?u:e,u);if(Et(i)&&("function"!=typeof(n=i.constructor)||n!==Array&&!Et(n.prototype)?g(n)&&null===(n=n[Dt])&&(n=void 0):n=void 0,n===Array||void 0===n))return Gt.call(i,c,f);for(r=new(void 0===n?Array:n)(Wt(f-c,0)),o=0;c1?e-1:0),n=1;e>n;n++)i[n-1]=arguments[n];return this.each(function(){var e=$(this),n=e.data(a.DATA_API);if(n){if("string"==typeof t)return n[t].apply(n,i)}else n=new r["default"](e,t),e.data(a.DATA_API,n)})},$.resizableColumns=r["default"]},{"./class":2,"./constants":3}],2:[function(t,e,i){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(i,"__esModule",{value:!0});var s=function(){function t(t,e){for(var i=0;i "),this.$table.before(this.$handleContainer),this.$tableHeaders.each(function(e,i){var n=t.$tableHeaders.eq(e),s=t.$tableHeaders.eq(e+1);if(0!==s.length&&!n.is(r.SELECTOR_UNRESIZABLE)&&!s.is(r.SELECTOR_UNRESIZABLE)){$("
").data(r.DATA_TH,$(i)).appendTo(t.$handleContainer)}}),this.bindEvents(this.$handleContainer,["mousedown","touchstart"],"."+r.CLASS_HANDLE,this.onPointerDown.bind(this))}},{key:"assignPercentageWidths",value:function(){var t=this;this.$tableHeaders.each(function(e,i){var n=$(i);t.setWidth(n[0],n.outerWidth()/t.$table.width()*100)})}},{key:"syncHandleWidths",value:function(){var t=this,e=this.$handleContainer;e.width(this.$table.width()),e.find("."+r.CLASS_HANDLE).each(function(e,i){var n=$(i),s=t.options.resizeFromBody?t.$table.height():t.$table.find("thead").height(),a=n.data(r.DATA_TH).outerWidth()+(n.data(r.DATA_TH).offset().left-t.$handleContainer.offset().left);n.css({left:a,height:s})})}},{key:"saveColumnWidths",value:function(){var t=this;this.$tableHeaders.each(function(e,i){var n=$(i);t.options.store&&!n.is(r.SELECTOR_UNRESIZABLE)&&t.options.store.set(t.generateColumnId(n),t.parseWidth(i))})}},{key:"restoreColumnWidths",value:function(){var t=this;this.$tableHeaders.each(function(e,i){var n=$(i);if(t.options.store&&!n.is(r.SELECTOR_UNRESIZABLE)){var s=t.options.store.get(t.generateColumnId(n));null!=s&&t.setWidth(i,s)}})}},{key:"onPointerDown",value:function(t){if(1===t.which){this.operation&&this.onPointerUp(t);var e=$(t.currentTarget);if(!e.is(r.SELECTOR_UNRESIZABLE)){var i=e.index(),n=this.$tableHeaders.eq(i).not(r.SELECTOR_UNRESIZABLE),s=this.$tableHeaders.eq(i+1).not(r.SELECTOR_UNRESIZABLE),a=this.parseWidth(n[0]),o=this.parseWidth(s[0]);this.operation={$leftColumn:n,$rightColumn:s,$currentGrip:e,startX:this.getPointerX(t),widths:{left:a,right:o},newWidths:{left:a,right:o}},this.bindEvents(this.$ownerDocument,["mousemove","touchmove"],this.onPointerMove.bind(this)),this.bindEvents(this.$ownerDocument,["mouseup","touchend"],this.onPointerUp.bind(this)),this.$handleContainer.add(this.$table).addClass(r.CLASS_TABLE_RESIZING),n.add(s).add(e).addClass(r.CLASS_COLUMN_RESIZING),this.triggerEvent(r.EVENT_RESIZE_START,[n,s,a,o],t),t.preventDefault()}}}},{key:"onPointerMove",value:function(t){var e=this.operation;if(this.operation){var i=(this.getPointerX(t)-e.startX)/this.$table.width()*100;if(0!==i){var n=e.$leftColumn[0],s=e.$rightColumn[0],a=void 0,o=void 0;return i>0?(a=this.constrainWidth(e.widths.left+(e.widths.right-e.newWidths.right)),o=this.constrainWidth(e.widths.right-i)):0>i&&(a=this.constrainWidth(e.widths.left+i),o=this.constrainWidth(e.widths.right+(e.widths.left-e.newWidths.left))),n&&this.setWidth(n,a),s&&this.setWidth(s,o),e.newWidths.left=a,e.newWidths.right=o,this.triggerEvent(r.EVENT_RESIZE,[e.$leftColumn,e.$rightColumn,a,o],t)}}}},{key:"onPointerUp",value:function(t){var e=this.operation;if(this.operation)return this.unbindEvents(this.$ownerDocument,["mouseup","touchend","mousemove","touchmove"]),this.$handleContainer.add(this.$table).removeClass(r.CLASS_TABLE_RESIZING),e.$leftColumn.add(e.$rightColumn).add(e.$currentGrip).removeClass(r.CLASS_COLUMN_RESIZING),this.syncHandleWidths(),this.saveColumnWidths(),this.operation=null,this.triggerEvent(r.EVENT_RESIZE_STOP,[e.$leftColumn,e.$rightColumn,e.newWidths.left,e.newWidths.right],t)}},{key:"destroy",value:function(){var t=this.$table,e=this.$handleContainer.find("."+r.CLASS_HANDLE);return this.unbindEvents(this.$window.add(this.$ownerDocument).add(this.$table).add(e)),e.removeData(r.DATA_TH),t.removeData(r.DATA_API),this.$handleContainer.remove(),this.$handleContainer=null,this.$tableHeaders=null,this.$table=null,t}},{key:"bindEvents",value:function(t,e,i,n){"string"==typeof e?e+=this.ns:e=e.join(this.ns+" ")+this.ns,arguments.length>3?t.on(e,i,n):t.on(e,i)}},{key:"unbindEvents",value:function(t,e){"string"==typeof e?e+=this.ns:e=null!=e?e.join(this.ns+" ")+this.ns:this.ns,t.off(e)}},{key:"triggerEvent",value:function(t,e,i){var n=$.Event(t);return n.originalEvent&&(n.originalEvent=$.extend({},i)),this.$table.trigger(n,[this].concat(e||[]))}},{key:"generateColumnId",value:function(t){return this.$table.data(r.DATA_COLUMNS_ID)+"-"+t.data(r.DATA_COLUMN_ID)}},{key:"parseWidth",value:function(t){return t?parseFloat(t.style.width.replace("%","")):0}},{key:"setWidth",value:function(t,e){e=e.toFixed(2),e=e>0?e:0,t.style.width=e+"%"}},{key:"constrainWidth",value:function(t){return void 0!=this.options.minWidth&&(t=Math.max(this.options.minWidth,t)),void 0!=this.options.maxWidth&&(t=Math.min(this.options.maxWidth,t)),t}},{key:"getPointerX",value:function(t){return 0===t.type.indexOf("touch")?(t.originalEvent.touches[0]||t.originalEvent.changedTouches[0]).pageX:t.pageX}}]),t}();i["default"]=a,a.defaults={selector:function(t){return t.find("thead").length?r.SELECTOR_TH:r.SELECTOR_TD},store:window.store,syncHandlers:!0,resizeFromBody:!0,maxWidth:null,minWidth:.01},a.count=0,e.exports=i["default"]},{"./constants":3}],3:[function(t,e,i){"use strict";Object.defineProperty(i,"__esModule",{value:!0});var n="resizableColumns";i.DATA_API=n;var s="resizable-columns-id";i.DATA_COLUMNS_ID=s;var r="resizable-column-id";i.DATA_COLUMN_ID=r;var a="th";i.DATA_TH=a;var o="rc-table-resizing";i.CLASS_TABLE_RESIZING=o;var h="rc-column-resizing";i.CLASS_COLUMN_RESIZING=h;var l="rc-handle";i.CLASS_HANDLE=l;var d="rc-handle-container";i.CLASS_HANDLE_CONTAINER=d;var u="column:resize:start";i.EVENT_RESIZE_START=u;var c="column:resize";i.EVENT_RESIZE=c;var f="column:resize:stop";i.EVENT_RESIZE_STOP=f;var E="tr:first > th:visible";i.SELECTOR_TH=E;var v="tr:first > td:visible";i.SELECTOR_TD=v;var $="[data-noresize]";i.SELECTOR_UNRESIZABLE=$},{}],4:[function(t,e,i){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(i,"__esModule",{value:!0});{var s=t("./class"),r=n(s),a=t("./adapter");n(a)}i["default"]=r["default"],e.exports=i["default"]},{"./adapter":1,"./class":2}]},{},[4]);
+//# sourceMappingURL=jquery.resizableColumns.min.js.map
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/resources/static/ajax/libs/smartwizard/jquery.smartWizard.min.js b/ruoyi-admin/src/main/resources/static/ajax/libs/smartwizard/jquery.smartWizard.min.js
new file mode 100644
index 000000000..bdbcf7e7e
--- /dev/null
+++ b/ruoyi-admin/src/main/resources/static/ajax/libs/smartwizard/jquery.smartWizard.min.js
@@ -0,0 +1,13 @@
+"use strict";function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _defineProperties(t,e){for(var s=0;s ").addClass("toolbar toolbar-"+t).attr("role","toolbar"),e=!1!==this.options.toolbarSettings.showNextButton?v(" ").text(this.options.lang.next).addClass("btn sw-btn-next").attr("type","button"):null,i=!1!==this.options.toolbarSettings.showPreviousButton?v(" ").text(this.options.lang.previous).addClass("btn sw-btn-prev").attr("type","button"):null;return s.append(i,e),this.options.toolbarSettings.toolbarExtraButtons&&0this.current_index&&(l=-1*h,u=h),null==this.current_index&&this.container.height(n.outerHeight()),i&&(a=i.css("position"),r=i.css("left"),i.css("position","absolute").css("left",0).animate({left:l},this.options.transition.speed,this.options.transition.easing,function(){v(this).hide(),i.css("position",a).css("left",r)})),a=n.css("position"),r=n.css("left"),n.css("position","absolute").css("left",u).outerWidth(h).show().animate({left:0},this.options.transition.speed,this.options.transition.easing,function(){n.css("position",a).css("left",r),e()});break;case"slide-vertical":case"slide-v":var c,d,p=this.container.height(),f=p,_=-2*p;t>this.current_index&&(f=-1*p,_=p),i&&(c=i.css("position"),d=i.css("top"),i.css("position","absolute").css("top",0).animate({top:f},this.options.transition.speed,this.options.transition.easing,function(){v(this).hide(),i.css("position",c).css("top",d)})),c=n.css("position"),d=n.css("top"),n.css("position","absolute").css("top",_).show().animate({top:0},this.options.transition.speed,this.options.transition.easing,function(){n.css("position",c).css("top",d),e()});break;case"slide-swing":case"slide-s":i?i.slideUp("fast",this.options.transition.easing,function(){n.slideDown(s.options.transition.speed,s.options.transition.easing,function(){e()})}):n.slideDown(this.options.transition.speed,this.options.transition.easing,function(){e()});break;case"fade":i?i.fadeOut("fast",this.options.transition.easing,function(){n.fadeIn("fast",s.options.transition.easing,function(){e()})}):n.fadeIn(this.options.transition.speed,this.options.transition.easing,function(){e()});break;default:i&&i.hide(),n.show(),e()}}},{key:"_stopAnimations",value:function(){this.pages.finish(),this.container.finish()}},{key:"_setAnchor",value:function(t){this._resetCSSClass(this.current_index,"active"),!1!==this.options.anchorSettings.markDoneStep&&null!==this.current_index&&(this._setCSSClass(this.current_index,"done"),!1!==this.options.anchorSettings.removeDoneStepOnNavigateBack&&"backward"===this._getStepDirection(t)&&this._resetCSSClass(this.current_index,"done")),this._resetCSSClass(t,"done"),this._setCSSClass(t,"active")}},{key:"_setButtons",value:function(t){if(!this.options.cycleSteps)switch(this.main.find(".sw-btn-prev").removeClass("disabled"),this.main.find(".sw-btn-next").removeClass("disabled"),this._getStepPosition(t)){case"first":this.main.find(".sw-btn-prev").addClass("disabled");break;case"last":this.main.find(".sw-btn-next").addClass("disabled");break;default:!1===this._getNextShowable(t)&&this.main.find(".sw-btn-next").addClass("disabled"),!1===this._getPreviousShowable(t)&&this.main.find(".sw-btn-prev").addClass("disabled")}}},{key:"_getStepIndex",value:function(){var t=this._getURLHashIndex();return!1===t?this.options.selected:t}},{key:"_setTheme",value:function(t){this.main.removeClass(function(t,e){return(e.match(/(^|\s)sw-theme-\S+/g)||[]).join(" ")}).addClass("sw-theme-"+t)}},{key:"_setJustify",value:function(t){!0===t?this.main.addClass("sw-justified"):this.main.removeClass("sw-justified")}},{key:"_setDarkMode",value:function(t){!0===t?this.main.addClass("sw-dark"):this.main.removeClass("sw-dark")}},{key:"_keyNav",value:function(t){if(-1.tab-content{position:relative;overflow:hidden}.sw .toolbar{padding:.8rem}.sw .toolbar>.btn{display:inline-block;text-decoration:none;text-align:center;text-transform:none;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;margin-left:.2rem;margin-right:.2rem;cursor:pointer}.sw .toolbar>.btn.disabled,.sw .toolbar>.btn:disabled{opacity:.65}.sw>.nav{display:flex;flex-wrap:wrap;list-style:none;padding-left:0;margin-top:0;margin-bottom:0}@media screen and (max-width:640px){.sw>.nav{flex-direction:column!important;flex:1 auto}}.sw>.nav .nav-link{display:block;padding:.5rem 1rem;text-decoration:none}.sw>.nav .nav-link:active,.sw>.nav .nav-link:focus,.sw>.nav .nav-link:hover{text-decoration:none}.sw>.nav .nav-link::-moz-focus-inner{border:0!important}.sw>.nav .nav-link.disabled{color:#ccc!important;pointer-events:none;cursor:default}.sw>.nav .nav-link.hidden{display:none!important}.sw.sw-justified>.nav .nav-link,.sw.sw-justified>.nav>li{flex-basis:0;flex-grow:1;text-align:center}.sw.sw-dark{color:rgba(255,255,255,.95);background:#000}.sw.sw-loading{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.sw.sw-loading::after{content:"";display:block;position:absolute;opacity:1;top:0;left:0;height:100%;width:100%;background:rgba(255,255,255,.7);z-index:2;transition:all .2s ease}.sw.sw-loading::before{content:'';display:inline-block;position:absolute;top:45%;left:45%;width:2rem;height:2rem;border:10px solid #f3f3f3;border-top:10px solid #3498db;border-radius:50%;z-index:10;-webkit-animation:spin 1s linear infinite;animation:spin 1s linear infinite}@-webkit-keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.sw-theme-default{border:1px solid #eee}.sw-theme-default>.tab-content>.tab-pane{padding:10px}.sw-theme-default .toolbar>.btn{color:#fff;background-color:#17a2b8;border:1px solid #17a2b8;padding:.375rem .75rem;border-radius:.25rem;font-weight:400}.sw-theme-default>.nav{box-shadow:0 .125rem .25rem rgba(0,0,0,.1)!important}.sw-theme-default>.nav .nav-link{position:relative;height:100%;min-height:100%}.sw-theme-default>.nav .nav-link::after{content:"";position:absolute;height:2px;width:0;left:0;bottom:-1px;background:#999;transition:all .35s ease .15s}.sw-theme-default>.nav .nav-link.inactive{color:#999;cursor:not-allowed}.sw-theme-default>.nav .nav-link.active{color:#17a2b8!important;cursor:pointer}.sw-theme-default>.nav .nav-link.active::after{background:#17a2b8!important;width:100%}.sw-theme-default>.nav .nav-link.done{color:#5cb85c!important;cursor:pointer}.sw-theme-default>.nav .nav-link.done::after{background:#5cb85c;width:100%}.sw-theme-default>.nav .nav-link.disabled{color:#ddd!important;cursor:not-allowed}.sw-theme-default>.nav .nav-link.disabled::after{background:#ddd;width:100%}.sw-theme-default>.nav .nav-link.danger{color:#d9534f!important;cursor:pointer}.sw-theme-default>.nav .nav-link.danger::after{background:#d9534f;width:100%}.sw-theme-arrows{border:1px solid #eee}.sw-theme-arrows>.tab-content>.tab-pane{padding:10px}.sw-theme-arrows .toolbar>.btn{color:#fff;background-color:#17a2b8;border:1px solid #17a2b8;padding:.375rem .75rem;border-radius:.25rem;font-weight:400}.sw-theme-arrows>.nav{overflow:hidden;border-bottom:1px solid #eee}.sw-theme-arrows>.nav .nav-link{position:relative;height:100%;min-height:100%;margin-right:30px;margin-left:-30px;padding-left:40px}@media screen and (max-width:640px){.sw-theme-arrows>.nav .nav-link{overflow:hidden;margin-bottom:1px;margin-right:unset}}.sw-theme-arrows>.nav .nav-link::after{content:"";position:absolute;display:block;width:0;height:0;top:50%;left:100%;margin-top:-50px;border-top:50px solid transparent;border-bottom:50px solid transparent;border-left:30px solid #f8f8f8;z-index:2}.sw-theme-arrows>.nav .nav-link::before{content:" ";position:absolute;display:block;width:0;height:0;top:50%;left:100%;margin-top:-50px;margin-left:1px;border-top:50px solid transparent;border-bottom:50px solid transparent;border-left:30px solid #eee;z-index:1}.sw-theme-arrows>.nav .nav-link.inactive{color:#999;border-color:#f8f8f8;background:#f8f8f8;cursor:not-allowed}.sw-theme-arrows>.nav .nav-link.active{color:#fff;border-color:#5bc0de;background:#5bc0de;cursor:pointer}.sw-theme-arrows>.nav .nav-link.active::after{border-left-color:#5bc0de}.sw-theme-arrows>.nav .nav-link.done{color:#fff;border-color:#5cb85c;background:#5cb85c;cursor:pointer}.sw-theme-arrows>.nav .nav-link.done::after{border-left-color:#5cb85c}.sw-theme-arrows>.nav .nav-link.disabled{color:#eee;border-color:#f9f9f9;background:#f9f9f9;cursor:not-allowed}.sw-theme-arrows>.nav .nav-link.disabled::after{border-left-color:#f9f9f9}.sw-theme-arrows>.nav .nav-link.danger{color:#fff;border-color:#d9534f;background:#d9534f;cursor:pointer}.sw-theme-arrows>.nav .nav-link.danger::after{border-left-color:#d9534f}.sw-theme-arrows.sw-dark{color:rgba(255,255,255,.95);background:#000}.sw-theme-arrows.sw-dark>.nav{border-bottom:1px solid #555}.sw-theme-arrows.sw-dark>.nav .nav-link::after{border-left:30px solid #5f5f5f}.sw-theme-arrows.sw-dark>.nav .nav-link::before{border-left:30px solid #555}.sw-theme-arrows.sw-dark>.nav .nav-link.inactive{color:#fff;border-color:#5f5f5f;background:#5f5f5f}.sw-theme-arrows.sw-dark>.nav .nav-link.inactive::after{border-left-color:#5f5f5f}.sw-theme-arrows.sw-dark>.nav .nav-link.active{color:#fff;border-color:#010506;background:#0a2730}.sw-theme-arrows.sw-dark>.nav .nav-link.active::after{border-left-color:#0a2730}.sw-theme-arrows.sw-dark>.nav .nav-link.done{color:#fff;border-color:#000;background:#000}.sw-theme-arrows.sw-dark>.nav .nav-link.done::after{border-left-color:#000}.sw-theme-arrows.sw-dark>.nav .nav-link.disabled{color:#555!important;border-color:#f9f9f9;background:#474747}.sw-theme-arrows.sw-dark>.nav .nav-link.disabled::after{border-left-color:#474747}.sw-theme-arrows.sw-dark>.nav .nav-link.danger{color:#fff;border-color:#d9534f;background:#d9534f}.sw-theme-arrows.sw-dark>.nav .nav-link.danger::after{border-left-color:#d9534f}.sw-theme-dots>.tab-content>.tab-pane{padding:10px}.sw-theme-dots .toolbar>.btn{color:#fff;background-color:#17a2b8;border:1px solid #17a2b8;padding:.375rem .75rem;border-radius:.25rem;font-weight:400}.sw-theme-dots>.nav{position:relative;margin-bottom:10px}.sw-theme-dots>.nav::before{content:" ";position:absolute;top:18px;left:0;width:100%;height:5px;background-color:#eee;border-radius:3px;z-index:1}.sw-theme-dots>.nav .nav-link{position:relative;margin-top:40px}.sw-theme-dots>.nav .nav-link::before{content:" ";position:absolute;display:block;top:-36px;left:0;right:0;margin-left:auto;margin-right:auto;width:32px;height:32px;border-radius:50%;border:none;background:#f5f5f5;color:#428bca;text-decoration:none;z-index:98}.sw-theme-dots>.nav .nav-link::after{content:" ";position:absolute;display:block;top:-28px;left:0;right:0;margin-left:auto;margin-right:auto;width:16px;height:16px;border-radius:50%;z-index:99}.sw-theme-dots>.nav .nav-link.inactive{color:#999;cursor:not-allowed}.sw-theme-dots>.nav .nav-link.inactive::after{background-color:#999}.sw-theme-dots>.nav .nav-link.active{color:#5bc0de!important;cursor:pointer}.sw-theme-dots>.nav .nav-link.active::after{background-color:#5bc0de!important}.sw-theme-dots>.nav .nav-link.done{color:#5cb85c;cursor:pointer}.sw-theme-dots>.nav .nav-link.done::after{background-color:#5cb85c}.sw-theme-dots>.nav .nav-link.disabled{color:#f9f9f9;cursor:not-allowed}.sw-theme-dots>.nav .nav-link.disabled::after{background-color:#f9f9f9}.sw-theme-dots>.nav .nav-link.danger{color:#d9534f;cursor:pointer}.sw-theme-dots>.nav .nav-link.danger::after{background-color:#d9534f}.sw-theme-dots.sw-dark{color:rgba(255,255,255,.95);background:#000}.sw-theme-dots.sw-dark>.nav::before{background-color:#3c3c3c}.sw-theme-dots.sw-dark>.nav .nav-link::before{background:#434343;color:#000}.sw-theme-progress{border:1px solid #eee}.sw-theme-progress>.tab-content>.tab-pane{padding:10px}.sw-theme-progress .toolbar>.btn{color:#fff;background-color:#17a2b8;border:1px solid #17a2b8;padding:.375rem .75rem;border-radius:.25rem;font-weight:400}.sw-theme-progress>.nav{box-shadow:0 .125rem .25rem rgba(0,0,0,.1)!important}.sw-theme-progress>.nav .nav-link{position:relative;height:100%;min-height:100%;background:0 0;overflow:hidden;z-index:2}.sw-theme-progress>.nav .nav-link::after{content:"";position:absolute;height:150%;width:0;left:0;top:0;background:#fff;z-index:-1;transition:all .35s ease .1s}.sw-theme-progress>.nav .nav-link.inactive{color:#999;cursor:not-allowed}.sw-theme-progress>.nav .nav-link.active{color:#fff!important;cursor:pointer}.sw-theme-progress>.nav .nav-link.active::after{background-color:#5cb85c;width:100%}.sw-theme-progress>.nav .nav-link.done{color:#fff!important;cursor:pointer}.sw-theme-progress>.nav .nav-link.done::after{background:#5cb85c;width:100%}.sw-theme-progress>.nav .nav-link.disabled{color:#ddd!important;cursor:not-allowed}.sw-theme-progress>.nav .nav-link.disabled::after{background:#f9f9f9;width:100%}.sw-theme-progress>.nav .nav-link.danger{color:#fff!important;cursor:pointer}.sw-theme-progress>.nav .nav-link.danger::after{background:#d9534f;width:100%}.sw-theme-progress.sw-dark{color:rgba(255,255,255,.95)}.sw-theme-progress.sw-dark>.nav .nav-link.active{color:#fff}.sw-theme-progress.sw-dark>.nav .nav-link.active::after{background-color:#333}.sw-theme-progress.sw-dark>.nav .nav-link.done{color:#fff!important}.sw-theme-progress.sw-dark>.nav .nav-link.done::after{background:#333}.sw-theme-progress.sw-dark>.nav .nav-link.disabled{color:#2b2b2b!important}.sw-theme-progress.sw-dark>.nav .nav-link.disabled::after{background:#474747}.sw-theme-progress.sw-dark>.nav .nav-link.danger{color:#fff!important}.sw-theme-progress.sw-dark>.nav .nav-link.danger::after{background:#d9534f}
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/resources/static/ajax/libs/staps/jquery.steps.css b/ruoyi-admin/src/main/resources/static/ajax/libs/staps/jquery.steps.css
deleted file mode 100644
index 35184c092..000000000
--- a/ruoyi-admin/src/main/resources/static/ajax/libs/staps/jquery.steps.css
+++ /dev/null
@@ -1,381 +0,0 @@
-/*
- Common
-*/
-
-.wizard,
-.tabcontrol
-{
- display: block;
- width: 100%;
- overflow: hidden;
-}
-
-.wizard a,
-.tabcontrol a
-{
- outline: 0;
-}
-
-.wizard ul,
-.tabcontrol ul
-{
- list-style: none !important;
- padding: 0;
- margin: 0;
-}
-
-.wizard ul > li,
-.tabcontrol ul > li
-{
- display: block;
- padding: 0;
-}
-
-/* Accessibility */
-.wizard > .steps .current-info,
-.tabcontrol > .steps .current-info
-{
- position: absolute;
- left: -999em;
-}
-
-.wizard > .content > .title,
-.tabcontrol > .content > .title
-{
- position: absolute;
- left: -999em;
-}
-
-
-
-/*
- Wizard
-*/
-
-.wizard > .steps
-{
- position: relative;
- display: block;
- width: 100%;
-}
-
-.wizard.vertical > .steps
-{
- display: inline;
- float: left;
- width: 30%;
-}
-
-.wizard > .steps > ul > li
-{
- width: 25%;
-}
-
-.wizard > .steps > ul > li,
-.wizard > .actions > ul > li
-{
- float: left;
-}
-
-.wizard.vertical > .steps > ul > li
-{
- float: none;
- width: 100%;
-}
-
-.wizard > .steps a,
-.wizard > .steps a:hover,
-.wizard > .steps a:active
-{
- display: block;
- width: auto;
- margin: 0 0.5em 0.5em;
- padding: 8px;
- text-decoration: none;
-
- -webkit-border-radius: 5px;
- -moz-border-radius: 5px;
- border-radius: 5px;
-}
-
-.wizard > .steps .disabled a,
-.wizard > .steps .disabled a:hover,
-.wizard > .steps .disabled a:active
-{
- background: #eee;
- color: #aaa;
- cursor: default;
-}
-
-.wizard > .steps .current a,
-.wizard > .steps .current a:hover,
-.wizard > .steps .current a:active
-{
- background: #1AB394;
- color: #fff;
- cursor: default;
-}
-
-.wizard > .steps .done a,
-.wizard > .steps .done a:hover,
-.wizard > .steps .done a:active
-{
- background: #6fd1bd;
- color: #fff;
-}
-
-.wizard > .steps .error a,
-.wizard > .steps .error a:hover,
-.wizard > .steps .error a:active
-{
- background: #ED5565 ;
- color: #fff;
-}
-
-.wizard > .content
-{
- background: #eee;
- display: block;
- margin: 5px 5px 10px 5px;
- min-height: 120px;
- overflow: hidden;
- position: relative;
- width: auto;
-
- -webkit-border-radius: 5px;
- -moz-border-radius: 5px;
- border-radius: 5px;
-}
-
-.wizard-big.wizard > .content {
- min-height: 320px;
-}
-.wizard.vertical > .content
-{
- display: inline;
- float: left;
- margin: 0 2.5% 0.5em 2.5%;
- width: 65%;
-}
-
-.wizard > .content > .body
-{
- float: left;
- position: absolute;
- width: 95%;
- height: 95%;
- padding: 2.5%;
-}
-
-.wizard > .content > .body ul
-{
- list-style: disc !important;
-}
-
-.wizard > .content > .body ul > li
-{
- display: list-item;
-}
-
-.wizard > .content > .body > iframe
-{
- border: 0 none;
- width: 100%;
- height: 100%;
-}
-
-.wizard > .content > .body input
-{
- display: block;
- border: 1px solid #ccc;
-}
-
-.wizard > .content > .body input[type="checkbox"]
-{
- display: inline-block;
-}
-
-.wizard > .content > .body input.error
-{
- background: rgb(251, 227, 228);
- border: 1px solid #fbc2c4;
- color: #8a1f11;
-}
-
-.wizard > .content > .body label
-{
- display: inline-block;
- margin-bottom: 0.5em;
-}
-
-.wizard > .content > .body label.error
-{
- color: #8a1f11;
- display: inline-block;
- margin-left: 1.5em;
-}
-
-.wizard > .actions
-{
- position: relative;
- display: block;
- text-align: right;
- width: 100%;
-}
-
-.wizard.vertical > .actions
-{
- display: inline;
- float: right;
- margin: 0 2.5%;
- width: 95%;
-}
-
-.wizard > .actions > ul
-{
- display: inline-block;
- text-align: right;
-}
-
-.wizard > .actions > ul > li
-{
- margin: 0 0.5em;
-}
-
-.wizard.vertical > .actions > ul > li
-{
- margin: 0 0 0 1em;
-}
-
-.wizard > .actions a,
-.wizard > .actions a:hover,
-.wizard > .actions a:active
-{
- background: #1AB394;
- color: #fff;
- display: block;
- padding: 0.5em 1em;
- text-decoration: none;
-
- -webkit-border-radius: 5px;
- -moz-border-radius: 5px;
- border-radius: 5px;
-}
-
-.wizard > .actions .disabled a,
-.wizard > .actions .disabled a:hover,
-.wizard > .actions .disabled a:active
-{
- background: #eee;
- color: #aaa;
-}
-
-.wizard > .loading
-{
-}
-
-.wizard > .loading .spinner
-{
-}
-
-
-
-/*
- Tabcontrol
-*/
-
-.tabcontrol > .steps
-{
- position: relative;
- display: block;
- width: 100%;
-}
-
-.tabcontrol > .steps > ul
-{
- position: relative;
- margin: 6px 0 0 0;
- top: 1px;
- z-index: 1;
-}
-
-.tabcontrol > .steps > ul > li
-{
- float: left;
- margin: 5px 2px 0 0;
- padding: 1px;
-
- -webkit-border-top-left-radius: 5px;
- -webkit-border-top-right-radius: 5px;
- -moz-border-radius-topleft: 5px;
- -moz-border-radius-topright: 5px;
- border-top-left-radius: 5px;
- border-top-right-radius: 5px;
-}
-
-.tabcontrol > .steps > ul > li:hover
-{
- background: #edecec;
- border: 1px solid #bbb;
- padding: 0;
-}
-
-.tabcontrol > .steps > ul > li.current
-{
- background: #fff;
- border: 1px solid #bbb;
- border-bottom: 0 none;
- padding: 0 0 1px 0;
- margin-top: 0;
-}
-
-.tabcontrol > .steps > ul > li > a
-{
- color: #5f5f5f;
- display: inline-block;
- border: 0 none;
- margin: 0;
- padding: 10px 30px;
- text-decoration: none;
-}
-
-.tabcontrol > .steps > ul > li > a:hover
-{
- text-decoration: none;
-}
-
-.tabcontrol > .steps > ul > li.current > a
-{
- padding: 15px 30px 10px 30px;
-}
-
-.tabcontrol > .content
-{
- position: relative;
- display: inline-block;
- width: 100%;
- height: 35em;
- overflow: hidden;
- border-top: 1px solid #bbb;
- padding-top: 20px;
-}
-
-.tabcontrol > .content > .body
-{
- float: left;
- position: absolute;
- width: 95%;
- height: 95%;
- padding: 2.5%;
-}
-
-.tabcontrol > .content > .body ul
-{
- list-style: disc !important;
-}
-
-.tabcontrol > .content > .body ul > li
-{
- display: list-item;
-}
-label.error { position:inherit; }
diff --git a/ruoyi-admin/src/main/resources/static/ajax/libs/staps/jquery.steps.js b/ruoyi-admin/src/main/resources/static/ajax/libs/staps/jquery.steps.js
deleted file mode 100644
index 3ffcf50f7..000000000
--- a/ruoyi-admin/src/main/resources/static/ajax/libs/staps/jquery.steps.js
+++ /dev/null
@@ -1,2042 +0,0 @@
-/*!
- * jQuery Steps v1.1.0 - 09/04/2014
- * Copyright (c) 2014 Rafael Staib (http://www.jquery-steps.com)
- * Licensed under MIT http://www.opensource.org/licenses/MIT
- */
-;(function ($, undefined)
-{
-$.fn.extend({
- _aria: function (name, value)
- {
- return this.attr("aria-" + name, value);
- },
-
- _removeAria: function (name)
- {
- return this.removeAttr("aria-" + name);
- },
-
- _enableAria: function (enable)
- {
- return (enable == null || enable) ?
- this.removeClass("disabled")._aria("disabled", "false") :
- this.addClass("disabled")._aria("disabled", "true");
- },
-
- _showAria: function (show)
- {
- return (show == null || show) ?
- this.show()._aria("hidden", "false") :
- this.hide()._aria("hidden", "true");
- },
-
- _selectAria: function (select)
- {
- return (select == null || select) ?
- this.addClass("current")._aria("selected", "true") :
- this.removeClass("current")._aria("selected", "false");
- },
-
- _id: function (id)
- {
- return (id) ? this.attr("id", id) : this.attr("id");
- }
-});
-
-if (!String.prototype.format)
-{
- String.prototype.format = function()
- {
- var args = (arguments.length === 1 && $.isArray(arguments[0])) ? arguments[0] : arguments;
- var formattedString = this;
- for (var i = 0; i < args.length; i++)
- {
- var pattern = new RegExp("\\{" + i + "\\}", "gm");
- formattedString = formattedString.replace(pattern, args[i]);
- }
- return formattedString;
- };
-}
-
-/**
- * A global unique id count.
- *
- * @static
- * @private
- * @property _uniqueId
- * @type Integer
- **/
-var _uniqueId = 0;
-
-/**
- * The plugin prefix for cookies.
- *
- * @final
- * @private
- * @property _cookiePrefix
- * @type String
- **/
-var _cookiePrefix = "jQu3ry_5teps_St@te_";
-
-/**
- * Suffix for the unique tab id.
- *
- * @final
- * @private
- * @property _tabSuffix
- * @type String
- * @since 0.9.7
- **/
-var _tabSuffix = "-t-";
-
-/**
- * Suffix for the unique tabpanel id.
- *
- * @final
- * @private
- * @property _tabpanelSuffix
- * @type String
- * @since 0.9.7
- **/
-var _tabpanelSuffix = "-p-";
-
-/**
- * Suffix for the unique title id.
- *
- * @final
- * @private
- * @property _titleSuffix
- * @type String
- * @since 0.9.7
- **/
-var _titleSuffix = "-h-";
-
-/**
- * An error message for an "index out of range" error.
- *
- * @final
- * @private
- * @property _indexOutOfRangeErrorMessage
- * @type String
- **/
-var _indexOutOfRangeErrorMessage = "Index out of range.";
-
-/**
- * An error message for an "missing corresponding element" error.
- *
- * @final
- * @private
- * @property _missingCorrespondingElementErrorMessage
- * @type String
- **/
-var _missingCorrespondingElementErrorMessage = "One or more corresponding step {0} are missing.";
-
-/**
- * Adds a step to the cache.
- *
- * @static
- * @private
- * @method addStepToCache
- * @param wizard {Object} A jQuery wizard object
- * @param step {Object} The step object to add
- **/
-function addStepToCache(wizard, step)
-{
- getSteps(wizard).push(step);
-}
-
-function analyzeData(wizard, options, state)
-{
- var stepTitles = wizard.children(options.headerTag),
- stepContents = wizard.children(options.bodyTag);
-
- // Validate content
- if (stepTitles.length > stepContents.length)
- {
- throwError(_missingCorrespondingElementErrorMessage, "contents");
- }
- else if (stepTitles.length < stepContents.length)
- {
- throwError(_missingCorrespondingElementErrorMessage, "titles");
- }
-
- var startIndex = options.startIndex;
-
- state.stepCount = stepTitles.length;
-
- // Tries to load the saved state (step position)
- if (options.saveState && $.cookie)
- {
- var savedState = $.cookie(_cookiePrefix + getUniqueId(wizard));
- // Sets the saved position to the start index if not undefined or out of range
- var savedIndex = parseInt(savedState, 0);
- if (!isNaN(savedIndex) && savedIndex < state.stepCount)
- {
- startIndex = savedIndex;
- }
- }
-
- state.currentIndex = startIndex;
-
- stepTitles.each(function (index)
- {
- var item = $(this), // item == header
- content = stepContents.eq(index),
- modeData = content.data("mode"),
- mode = (modeData == null) ? contentMode.html : getValidEnumValue(contentMode,
- (/^\s*$/.test(modeData) || isNaN(modeData)) ? modeData : parseInt(modeData, 0)),
- contentUrl = (mode === contentMode.html || content.data("url") === undefined) ?
- "" : content.data("url"),
- contentLoaded = (mode !== contentMode.html && content.data("loaded") === "1"),
- step = $.extend({}, stepModel, {
- title: item.html(),
- content: (mode === contentMode.html) ? content.html() : "",
- contentUrl: contentUrl,
- contentMode: mode,
- contentLoaded: contentLoaded
- });
-
- addStepToCache(wizard, step);
- });
-}
-
-/**
- * Triggers the onCanceled event.
- *
- * @static
- * @private
- * @method cancel
- * @param wizard {Object} The jQuery wizard object
- **/
-function cancel(wizard)
-{
- wizard.triggerHandler("canceled");
-}
-
-function decreaseCurrentIndexBy(state, decreaseBy)
-{
- return state.currentIndex - decreaseBy;
-}
-
-/**
- * Removes the control functionality completely and transforms the current state to the initial HTML structure.
- *
- * @static
- * @private
- * @method destroy
- * @param wizard {Object} A jQuery wizard object
- **/
-function destroy(wizard, options)
-{
- var eventNamespace = getEventNamespace(wizard);
-
- // Remove virtual data objects from the wizard
- wizard.unbind(eventNamespace).removeData("uid").removeData("options")
- .removeData("state").removeData("steps").removeData("eventNamespace")
- .find(".actions a").unbind(eventNamespace);
-
- // Remove attributes and CSS classes from the wizard
- wizard.removeClass(options.clearFixCssClass + " vertical");
-
- var contents = wizard.find(".content > *");
-
- // Remove virtual data objects from panels and their titles
- contents.removeData("loaded").removeData("mode").removeData("url");
-
- // Remove attributes, CSS classes and reset inline styles on all panels and their titles
- contents.removeAttr("id").removeAttr("role").removeAttr("tabindex")
- .removeAttr("class").removeAttr("style")._removeAria("labelledby")
- ._removeAria("hidden");
-
- // Empty panels if the mode is set to 'async' or 'iframe'
- wizard.find(".content > [data-mode='async'],.content > [data-mode='iframe']").empty();
-
- var wizardSubstitute = $("<{0} class=\"{1}\">{0}>".format(wizard.get(0).tagName, wizard.attr("class")));
-
- var wizardId = wizard._id();
- if (wizardId != null && wizardId !== "")
- {
- wizardSubstitute._id(wizardId);
- }
-
- wizardSubstitute.html(wizard.find(".content").html());
- wizard.after(wizardSubstitute);
- wizard.remove();
-
- return wizardSubstitute;
-}
-
-/**
- * Triggers the onFinishing and onFinished event.
- *
- * @static
- * @private
- * @method finishStep
- * @param wizard {Object} The jQuery wizard object
- * @param state {Object} The state container of the current wizard
- **/
-function finishStep(wizard, state)
-{
- var currentStep = wizard.find(".steps li").eq(state.currentIndex);
-
- if (wizard.triggerHandler("finishing", [state.currentIndex]))
- {
- currentStep.addClass("done").removeClass("error");
- wizard.triggerHandler("finished", [state.currentIndex]);
- }
- else
- {
- currentStep.addClass("error");
- }
-}
-
-/**
- * Gets or creates if not exist an unique event namespace for the given wizard instance.
- *
- * @static
- * @private
- * @method getEventNamespace
- * @param wizard {Object} A jQuery wizard object
- * @return {String} Returns the unique event namespace for the given wizard
- */
-function getEventNamespace(wizard)
-{
- var eventNamespace = wizard.data("eventNamespace");
-
- if (eventNamespace == null)
- {
- eventNamespace = "." + getUniqueId(wizard);
- wizard.data("eventNamespace", eventNamespace);
- }
-
- return eventNamespace;
-}
-
-function getStepAnchor(wizard, index)
-{
- var uniqueId = getUniqueId(wizard);
-
- return wizard.find("#" + uniqueId + _tabSuffix + index);
-}
-
-function getStepPanel(wizard, index)
-{
- var uniqueId = getUniqueId(wizard);
-
- return wizard.find("#" + uniqueId + _tabpanelSuffix + index);
-}
-
-function getStepTitle(wizard, index)
-{
- var uniqueId = getUniqueId(wizard);
-
- return wizard.find("#" + uniqueId + _titleSuffix + index);
-}
-
-function getOptions(wizard)
-{
- return wizard.data("options");
-}
-
-function getState(wizard)
-{
- return wizard.data("state");
-}
-
-function getSteps(wizard)
-{
- return wizard.data("steps");
-}
-
-/**
- * Gets a specific step object by index.
- *
- * @static
- * @private
- * @method getStep
- * @param index {Integer} An integer that belongs to the position of a step
- * @return {Object} A specific step object
- **/
-function getStep(wizard, index)
-{
- var steps = getSteps(wizard);
-
- if (index < 0 || index >= steps.length)
- {
- throwError(_indexOutOfRangeErrorMessage);
- }
-
- return steps[index];
-}
-
-/**
- * Gets or creates if not exist an unique id from the given wizard instance.
- *
- * @static
- * @private
- * @method getUniqueId
- * @param wizard {Object} A jQuery wizard object
- * @return {String} Returns the unique id for the given wizard
- */
-function getUniqueId(wizard)
-{
- var uniqueId = wizard.data("uid");
-
- if (uniqueId == null)
- {
- uniqueId = wizard._id();
- if (uniqueId == null)
- {
- uniqueId = "steps-uid-".concat(_uniqueId);
- wizard._id(uniqueId);
- }
-
- _uniqueId++;
- wizard.data("uid", uniqueId);
- }
-
- return uniqueId;
-}
-
-/**
- * Gets a valid enum value by checking a specific enum key or value.
- *
- * @static
- * @private
- * @method getValidEnumValue
- * @param enumType {Object} Type of enum
- * @param keyOrValue {Object} Key as `String` or value as `Integer` to check for
- */
-function getValidEnumValue(enumType, keyOrValue)
-{
- validateArgument("enumType", enumType);
- validateArgument("keyOrValue", keyOrValue);
-
- // Is key
- if (typeof keyOrValue === "string")
- {
- var value = enumType[keyOrValue];
- if (value === undefined)
- {
- throwError("The enum key '{0}' does not exist.", keyOrValue);
- }
-
- return value;
- }
- // Is value
- else if (typeof keyOrValue === "number")
- {
- for (var key in enumType)
- {
- if (enumType[key] === keyOrValue)
- {
- return keyOrValue;
- }
- }
-
- throwError("Invalid enum value '{0}'.", keyOrValue);
- }
- // Type is not supported
- else
- {
- throwError("Invalid key or value type.");
- }
-}
-
-/**
- * Routes to the next step.
- *
- * @static
- * @private
- * @method goToNextStep
- * @param wizard {Object} The jQuery wizard object
- * @param options {Object} Settings of the current wizard
- * @param state {Object} The state container of the current wizard
- * @return {Boolean} Indicates whether the action executed
- **/
-function goToNextStep(wizard, options, state)
-{
- return paginationClick(wizard, options, state, increaseCurrentIndexBy(state, 1));
-}
-
-/**
- * Routes to the previous step.
- *
- * @static
- * @private
- * @method goToPreviousStep
- * @param wizard {Object} The jQuery wizard object
- * @param options {Object} Settings of the current wizard
- * @param state {Object} The state container of the current wizard
- * @return {Boolean} Indicates whether the action executed
- **/
-function goToPreviousStep(wizard, options, state)
-{
- return paginationClick(wizard, options, state, decreaseCurrentIndexBy(state, 1));
-}
-
-/**
- * Routes to a specific step by a given index.
- *
- * @static
- * @private
- * @method goToStep
- * @param wizard {Object} The jQuery wizard object
- * @param options {Object} Settings of the current wizard
- * @param state {Object} The state container of the current wizard
- * @param index {Integer} The position (zero-based) to route to
- * @return {Boolean} Indicates whether the action succeeded or failed
- **/
-function goToStep(wizard, options, state, index)
-{
- if (index < 0 || index >= state.stepCount)
- {
- throwError(_indexOutOfRangeErrorMessage);
- }
-
- if (options.forceMoveForward && index < state.currentIndex)
- {
- return;
- }
-
- var oldIndex = state.currentIndex;
- if (wizard.triggerHandler("stepChanging", [state.currentIndex, index]))
- {
- // Save new state
- state.currentIndex = index;
- saveCurrentStateToCookie(wizard, options, state);
-
- // Change visualisation
- refreshStepNavigation(wizard, options, state, oldIndex);
- refreshPagination(wizard, options, state);
- loadAsyncContent(wizard, options, state);
- startTransitionEffect(wizard, options, state, index, oldIndex, function()
- {
- wizard.triggerHandler("stepChanged", [index, oldIndex]);
- });
- }
- else
- {
- wizard.find(".steps li").eq(oldIndex).addClass("error");
- }
-
- return true;
-}
-
-function increaseCurrentIndexBy(state, increaseBy)
-{
- return state.currentIndex + increaseBy;
-}
-
-/**
- * Initializes the component.
- *
- * @static
- * @private
- * @method initialize
- * @param options {Object} The component settings
- **/
-function initialize(options)
-{
- /*jshint -W040 */
- var opts = $.extend(true, {}, defaults, options);
-
- return this.each(function ()
- {
- var wizard = $(this);
- var state = {
- currentIndex: opts.startIndex,
- currentStep: null,
- stepCount: 0,
- transitionElement: null
- };
-
- // Create data container
- wizard.data("options", opts);
- wizard.data("state", state);
- wizard.data("steps", []);
-
- analyzeData(wizard, opts, state);
- render(wizard, opts, state);
- registerEvents(wizard, opts);
-
- // Trigger focus
- if (opts.autoFocus && _uniqueId === 0)
- {
- getStepAnchor(wizard, opts.startIndex).focus();
- }
-
- wizard.triggerHandler("init", [opts.startIndex]);
- });
-}
-
-/**
- * Inserts a new step to a specific position.
- *
- * @static
- * @private
- * @method insertStep
- * @param wizard {Object} The jQuery wizard object
- * @param options {Object} Settings of the current wizard
- * @param state {Object} The state container of the current wizard
- * @param index {Integer} The position (zero-based) to add
- * @param step {Object} The step object to add
- * @example
- * $("#wizard").steps().insert(0, {
- * title: "Title",
- * content: "", // optional
- * contentMode: "async", // optional
- * contentUrl: "/Content/Step/1" // optional
- * });
- * @chainable
- **/
-function insertStep(wizard, options, state, index, step)
-{
- if (index < 0 || index > state.stepCount)
- {
- throwError(_indexOutOfRangeErrorMessage);
- }
-
- // TODO: Validate step object
-
- // Change data
- step = $.extend({}, stepModel, step);
- insertStepToCache(wizard, index, step);
- if (state.currentIndex !== state.stepCount && state.currentIndex >= index)
- {
- state.currentIndex++;
- saveCurrentStateToCookie(wizard, options, state);
- }
- state.stepCount++;
-
- var contentContainer = wizard.find(".content"),
- header = $("<{0}>{1}{0}>".format(options.headerTag, step.title)),
- body = $("<{0}>{0}>".format(options.bodyTag));
-
- if (step.contentMode == null || step.contentMode === contentMode.html)
- {
- body.html(step.content);
- }
-
- if (index === 0)
- {
- contentContainer.prepend(body).prepend(header);
- }
- else
- {
- getStepPanel(wizard, (index - 1)).after(body).after(header);
- }
-
- renderBody(wizard, state, body, index);
- renderTitle(wizard, options, state, header, index);
- refreshSteps(wizard, options, state, index);
- if (index === state.currentIndex)
- {
- refreshStepNavigation(wizard, options, state);
- }
- refreshPagination(wizard, options, state);
-
- return wizard;
-}
-
-/**
- * Inserts a step object to the cache at a specific position.
- *
- * @static
- * @private
- * @method insertStepToCache
- * @param wizard {Object} A jQuery wizard object
- * @param index {Integer} The position (zero-based) to add
- * @param step {Object} The step object to add
- **/
-function insertStepToCache(wizard, index, step)
-{
- getSteps(wizard).splice(index, 0, step);
-}
-
-/**
- * Handles the keyup DOM event for pagination.
- *
- * @static
- * @private
- * @event keyup
- * @param event {Object} An event object
- */
-function keyUpHandler(event)
-{
- var wizard = $(this),
- options = getOptions(wizard),
- state = getState(wizard);
-
- if (options.suppressPaginationOnFocus && wizard.find(":focus").is(":input"))
- {
- event.preventDefault();
- return false;
- }
-
- var keyCodes = { left: 37, right: 39 };
- if (event.keyCode === keyCodes.left)
- {
- event.preventDefault();
- goToPreviousStep(wizard, options, state);
- }
- else if (event.keyCode === keyCodes.right)
- {
- event.preventDefault();
- goToNextStep(wizard, options, state);
- }
-}
-
-/**
- * Loads and includes async content.
- *
- * @static
- * @private
- * @method loadAsyncContent
- * @param wizard {Object} A jQuery wizard object
- * @param options {Object} Settings of the current wizard
- * @param state {Object} The state container of the current wizard
- */
-function loadAsyncContent(wizard, options, state)
-{
- if (state.stepCount > 0)
- {
- var currentIndex = state.currentIndex,
- currentStep = getStep(wizard, currentIndex);
-
- if (!options.enableContentCache || !currentStep.contentLoaded)
- {
- switch (getValidEnumValue(contentMode, currentStep.contentMode))
- {
- case contentMode.iframe:
- wizard.find(".content > .body").eq(state.currentIndex).empty()
- .html("")
- .data("loaded", "1");
- break;
-
- case contentMode.async:
- var currentStepContent = getStepPanel(wizard, currentIndex)._aria("busy", "true")
- .empty().append(renderTemplate(options.loadingTemplate, { text: options.labels.loading }));
-
- $.ajax({ url: currentStep.contentUrl, cache: false }).done(function (data)
- {
- currentStepContent.empty().html(data)._aria("busy", "false").data("loaded", "1");
- wizard.triggerHandler("contentLoaded", [currentIndex]);
- });
- break;
- }
- }
- }
-}
-
-/**
- * Fires the action next or previous click event.
- *
- * @static
- * @private
- * @method paginationClick
- * @param wizard {Object} The jQuery wizard object
- * @param options {Object} Settings of the current wizard
- * @param state {Object} The state container of the current wizard
- * @param index {Integer} The position (zero-based) to route to
- * @return {Boolean} Indicates whether the event fired successfully or not
- **/
-function paginationClick(wizard, options, state, index)
-{
- var oldIndex = state.currentIndex;
-
- if (index >= 0 && index < state.stepCount && !(options.forceMoveForward && index < state.currentIndex))
- {
- var anchor = getStepAnchor(wizard, index),
- parent = anchor.parent(),
- isDisabled = parent.hasClass("disabled");
-
- // Enable the step to make the anchor clickable!
- parent._enableAria();
- anchor.click();
-
- // An error occured
- if (oldIndex === state.currentIndex && isDisabled)
- {
- // Disable the step again if current index has not changed; prevents click action.
- parent._enableAria(false);
- return false;
- }
-
- return true;
- }
-
- return false;
-}
-
-/**
- * Fires when a pagination click happens.
- *
- * @static
- * @private
- * @event click
- * @param event {Object} An event object
- */
-function paginationClickHandler(event)
-{
- event.preventDefault();
-
- var anchor = $(this),
- wizard = anchor.parent().parent().parent().parent(),
- options = getOptions(wizard),
- state = getState(wizard),
- href = anchor.attr("href");
-
- switch (href.substring(href.lastIndexOf("#") + 1))
- {
- case "cancel":
- cancel(wizard);
- break;
-
- case "finish":
- finishStep(wizard, state);
- break;
-
- case "next":
- goToNextStep(wizard, options, state);
- break;
-
- case "previous":
- goToPreviousStep(wizard, options, state);
- break;
- }
-}
-
-/**
- * Refreshs the visualization state for the entire pagination.
- *
- * @static
- * @private
- * @method refreshPagination
- * @param wizard {Object} A jQuery wizard object
- * @param options {Object} Settings of the current wizard
- * @param state {Object} The state container of the current wizard
- */
-function refreshPagination(wizard, options, state)
-{
- if (options.enablePagination)
- {
- var finish = wizard.find(".actions a[href$='#finish']").parent(),
- next = wizard.find(".actions a[href$='#next']").parent();
-
- if (!options.forceMoveForward)
- {
- var previous = wizard.find(".actions a[href$='#previous']").parent();
- previous._enableAria(state.currentIndex > 0);
- }
-
- if (options.enableFinishButton && options.showFinishButtonAlways)
- {
- finish._enableAria(state.stepCount > 0);
- next._enableAria(state.stepCount > 1 && state.stepCount > (state.currentIndex + 1));
- }
- else
- {
- finish._showAria(options.enableFinishButton && state.stepCount === (state.currentIndex + 1));
- next._showAria(state.stepCount === 0 || state.stepCount > (state.currentIndex + 1)).
- _enableAria(state.stepCount > (state.currentIndex + 1) || !options.enableFinishButton);
- }
- }
-}
-
-/**
- * Refreshs the visualization state for the step navigation (tabs).
- *
- * @static
- * @private
- * @method refreshStepNavigation
- * @param wizard {Object} A jQuery wizard object
- * @param options {Object} Settings of the current wizard
- * @param state {Object} The state container of the current wizard
- * @param [oldIndex] {Integer} The index of the prior step
- */
-function refreshStepNavigation(wizard, options, state, oldIndex)
-{
- var currentOrNewStepAnchor = getStepAnchor(wizard, state.currentIndex),
- currentInfo = $("" + options.labels.current + " "),
- stepTitles = wizard.find(".content > .title");
-
- if (oldIndex != null)
- {
- var oldStepAnchor = getStepAnchor(wizard, oldIndex);
- oldStepAnchor.parent().addClass("done").removeClass("error")._selectAria(false);
- stepTitles.eq(oldIndex).removeClass("current").next(".body").removeClass("current");
- currentInfo = oldStepAnchor.find(".current-info");
- currentOrNewStepAnchor.focus();
- }
-
- currentOrNewStepAnchor.prepend(currentInfo).parent()._selectAria().removeClass("done")._enableAria();
- stepTitles.eq(state.currentIndex).addClass("current").next(".body").addClass("current");
-}
-
-/**
- * Refreshes step buttons and their related titles beyond a certain position.
- *
- * @static
- * @private
- * @method refreshSteps
- * @param wizard {Object} A jQuery wizard object
- * @param options {Object} Settings of the current wizard
- * @param state {Object} The state container of the current wizard
- * @param index {Integer} The start point for refreshing ids
- */
-function refreshSteps(wizard, options, state, index)
-{
- var uniqueId = getUniqueId(wizard);
-
- for (var i = index; i < state.stepCount; i++)
- {
- var uniqueStepId = uniqueId + _tabSuffix + i,
- uniqueBodyId = uniqueId + _tabpanelSuffix + i,
- uniqueHeaderId = uniqueId + _titleSuffix + i,
- title = wizard.find(".title").eq(i)._id(uniqueHeaderId);
-
- wizard.find(".steps a").eq(i)._id(uniqueStepId)
- ._aria("controls", uniqueBodyId).attr("href", "#" + uniqueHeaderId)
- .html(renderTemplate(options.titleTemplate, { index: i + 1, title: title.html() }));
- wizard.find(".body").eq(i)._id(uniqueBodyId)
- ._aria("labelledby", uniqueHeaderId);
- }
-}
-
-function registerEvents(wizard, options)
-{
- var eventNamespace = getEventNamespace(wizard);
-
- wizard.bind("canceled" + eventNamespace, options.onCanceled);
- wizard.bind("contentLoaded" + eventNamespace, options.onContentLoaded);
- wizard.bind("finishing" + eventNamespace, options.onFinishing);
- wizard.bind("finished" + eventNamespace, options.onFinished);
- wizard.bind("init" + eventNamespace, options.onInit);
- wizard.bind("stepChanging" + eventNamespace, options.onStepChanging);
- wizard.bind("stepChanged" + eventNamespace, options.onStepChanged);
-
- if (options.enableKeyNavigation)
- {
- wizard.bind("keyup" + eventNamespace, keyUpHandler);
- }
-
- wizard.find(".actions a").bind("click" + eventNamespace, paginationClickHandler);
-}
-
-/**
- * Removes a specific step by an given index.
- *
- * @static
- * @private
- * @method removeStep
- * @param wizard {Object} A jQuery wizard object
- * @param options {Object} Settings of the current wizard
- * @param state {Object} The state container of the current wizard
- * @param index {Integer} The position (zero-based) of the step to remove
- * @return Indecates whether the item is removed.
- **/
-function removeStep(wizard, options, state, index)
-{
- // Index out of range and try deleting current item will return false.
- if (index < 0 || index >= state.stepCount || state.currentIndex === index)
- {
- return false;
- }
-
- // Change data
- removeStepFromCache(wizard, index);
- if (state.currentIndex > index)
- {
- state.currentIndex--;
- saveCurrentStateToCookie(wizard, options, state);
- }
- state.stepCount--;
-
- getStepTitle(wizard, index).remove();
- getStepPanel(wizard, index).remove();
- getStepAnchor(wizard, index).parent().remove();
-
- // Set the "first" class to the new first step button
- if (index === 0)
- {
- wizard.find(".steps li").first().addClass("first");
- }
-
- // Set the "last" class to the new last step button
- if (index === state.stepCount)
- {
- wizard.find(".steps li").eq(index).addClass("last");
- }
-
- refreshSteps(wizard, options, state, index);
- refreshPagination(wizard, options, state);
-
- return true;
-}
-
-function removeStepFromCache(wizard, index)
-{
- getSteps(wizard).splice(index, 1);
-}
-
-/**
- * Transforms the base html structure to a more sensible html structure.
- *
- * @static
- * @private
- * @method render
- * @param wizard {Object} A jQuery wizard object
- * @param options {Object} Settings of the current wizard
- * @param state {Object} The state container of the current wizard
- **/
-function render(wizard, options, state)
-{
- // Create a content wrapper and copy HTML from the intial wizard structure
- var wrapperTemplate = "<{0} class=\"{1}\">{2}{0}>",
- orientation = getValidEnumValue(stepsOrientation, options.stepsOrientation),
- verticalCssClass = (orientation === stepsOrientation.vertical) ? " vertical" : "",
- contentWrapper = $(wrapperTemplate.format(options.contentContainerTag, "content " + options.clearFixCssClass, wizard.html())),
- stepsWrapper = $(wrapperTemplate.format(options.stepsContainerTag, "steps " + options.clearFixCssClass, "")),
- stepTitles = contentWrapper.children(options.headerTag),
- stepContents = contentWrapper.children(options.bodyTag);
-
- // Transform the wizard wrapper and remove the inner HTML
- wizard.attr("role", "application").empty().append(stepsWrapper).append(contentWrapper)
- .addClass(options.cssClass + " " + options.clearFixCssClass + verticalCssClass);
-
- // Add WIA-ARIA support
- stepContents.each(function (index)
- {
- renderBody(wizard, state, $(this), index);
- });
-
- stepTitles.each(function (index)
- {
- renderTitle(wizard, options, state, $(this), index);
- });
-
- refreshStepNavigation(wizard, options, state);
- renderPagination(wizard, options, state);
-}
-
-/**
- * Transforms the body to a proper tabpanel.
- *
- * @static
- * @private
- * @method renderBody
- * @param wizard {Object} A jQuery wizard object
- * @param body {Object} A jQuery body object
- * @param index {Integer} The position of the body
- */
-function renderBody(wizard, state, body, index)
-{
- var uniqueId = getUniqueId(wizard),
- uniqueBodyId = uniqueId + _tabpanelSuffix + index,
- uniqueHeaderId = uniqueId + _titleSuffix + index;
-
- body._id(uniqueBodyId).attr("role", "tabpanel")._aria("labelledby", uniqueHeaderId)
- .addClass("body")._showAria(state.currentIndex === index);
-}
-
-/**
- * Renders a pagination if enabled.
- *
- * @static
- * @private
- * @method renderPagination
- * @param wizard {Object} A jQuery wizard object
- * @param options {Object} Settings of the current wizard
- * @param state {Object} The state container of the current wizard
- */
-function renderPagination(wizard, options, state)
-{
- if (options.enablePagination)
- {
- var pagination = "<{0} class=\"actions {1}\">{0}>",
- buttonTemplate = "{1} ",
- buttons = "";
-
- if (!options.forceMoveForward)
- {
- buttons += buttonTemplate.format("previous", options.labels.previous);
- }
-
- buttons += buttonTemplate.format("next", options.labels.next);
-
- if (options.enableFinishButton)
- {
- buttons += buttonTemplate.format("finish", options.labels.finish);
- }
-
- if (options.enableCancelButton)
- {
- buttons += buttonTemplate.format("cancel", options.labels.cancel);
- }
-
- wizard.append(pagination.format(options.actionContainerTag, options.clearFixCssClass,
- options.labels.pagination, buttons));
-
- refreshPagination(wizard, options, state);
- loadAsyncContent(wizard, options, state);
- }
-}
-
-/**
- * Renders a template and replaces all placeholder.
- *
- * @static
- * @private
- * @method renderTemplate
- * @param template {String} A template
- * @param substitutes {Object} A list of substitute
- * @return {String} The rendered template
- */
-function renderTemplate(template, substitutes)
-{
- var matches = template.match(/#([a-z]*)#/gi);
-
- for (var i = 0; i < matches.length; i++)
- {
- var match = matches[i],
- key = match.substring(1, match.length - 1);
-
- if (substitutes[key] === undefined)
- {
- throwError("The key '{0}' does not exist in the substitute collection!", key);
- }
-
- template = template.replace(match, substitutes[key]);
- }
-
- return template;
-}
-
-/**
- * Transforms the title to a step item button.
- *
- * @static
- * @private
- * @method renderTitle
- * @param wizard {Object} A jQuery wizard object
- * @param options {Object} Settings of the current wizard
- * @param state {Object} The state container of the current wizard
- * @param header {Object} A jQuery header object
- * @param index {Integer} The position of the header
- */
-function renderTitle(wizard, options, state, header, index)
-{
- var uniqueId = getUniqueId(wizard),
- uniqueStepId = uniqueId + _tabSuffix + index,
- uniqueBodyId = uniqueId + _tabpanelSuffix + index,
- uniqueHeaderId = uniqueId + _titleSuffix + index,
- stepCollection = wizard.find(".steps > ul"),
- title = renderTemplate(options.titleTemplate, {
- index: index + 1,
- title: header.html()
- }),
- stepItem = $("" + title + " ");
-
- stepItem._enableAria(options.enableAllSteps || state.currentIndex > index);
-
- if (state.currentIndex > index)
- {
- stepItem.addClass("done");
- }
-
- header._id(uniqueHeaderId).attr("tabindex", "-1").addClass("title");
-
- if (index === 0)
- {
- stepCollection.prepend(stepItem);
- }
- else
- {
- stepCollection.find("li").eq(index - 1).after(stepItem);
- }
-
- // Set the "first" class to the new first step button
- if (index === 0)
- {
- stepCollection.find("li").removeClass("first").eq(index).addClass("first");
- }
-
- // Set the "last" class to the new last step button
- if (index === (state.stepCount - 1))
- {
- stepCollection.find("li").removeClass("last").eq(index).addClass("last");
- }
-
- // Register click event
- stepItem.children("a").bind("click" + getEventNamespace(wizard), stepClickHandler);
-}
-
-/**
- * Saves the current state to a cookie.
- *
- * @static
- * @private
- * @method saveCurrentStateToCookie
- * @param wizard {Object} A jQuery wizard object
- * @param options {Object} Settings of the current wizard
- * @param state {Object} The state container of the current wizard
- */
-function saveCurrentStateToCookie(wizard, options, state)
-{
- if (options.saveState && $.cookie)
- {
- $.cookie(_cookiePrefix + getUniqueId(wizard), state.currentIndex);
- }
-}
-
-function startTransitionEffect(wizard, options, state, index, oldIndex, doneCallback)
-{
- var stepContents = wizard.find(".content > .body"),
- effect = getValidEnumValue(transitionEffect, options.transitionEffect),
- effectSpeed = options.transitionEffectSpeed,
- newStep = stepContents.eq(index),
- currentStep = stepContents.eq(oldIndex);
-
- switch (effect)
- {
- case transitionEffect.fade:
- case transitionEffect.slide:
- var hide = (effect === transitionEffect.fade) ? "fadeOut" : "slideUp",
- show = (effect === transitionEffect.fade) ? "fadeIn" : "slideDown";
-
- state.transitionElement = newStep;
- currentStep[hide](effectSpeed, function ()
- {
- var wizard = $(this)._showAria(false).parent().parent(),
- state = getState(wizard);
-
- if (state.transitionElement)
- {
- state.transitionElement[show](effectSpeed, function ()
- {
- $(this)._showAria();
- }).promise().done(doneCallback);
- state.transitionElement = null;
- }
- });
- break;
-
- case transitionEffect.slideLeft:
- var outerWidth = currentStep.outerWidth(true),
- posFadeOut = (index > oldIndex) ? -(outerWidth) : outerWidth,
- posFadeIn = (index > oldIndex) ? outerWidth : -(outerWidth);
-
- $.when(currentStep.animate({ left: posFadeOut }, effectSpeed,
- function () { $(this)._showAria(false); }),
- newStep.css("left", posFadeIn + "px")._showAria()
- .animate({ left: 0 }, effectSpeed)).done(doneCallback);
- break;
-
- default:
- $.when(currentStep._showAria(false), newStep._showAria())
- .done(doneCallback);
- break;
- }
-}
-
-/**
- * Fires when a step click happens.
- *
- * @static
- * @private
- * @event click
- * @param event {Object} An event object
- */
-function stepClickHandler(event)
-{
- event.preventDefault();
-
- var anchor = $(this),
- wizard = anchor.parent().parent().parent().parent(),
- options = getOptions(wizard),
- state = getState(wizard),
- oldIndex = state.currentIndex;
-
- if (anchor.parent().is(":not(.disabled):not(.current)"))
- {
- var href = anchor.attr("href"),
- position = parseInt(href.substring(href.lastIndexOf("-") + 1), 0);
-
- goToStep(wizard, options, state, position);
- }
-
- // If nothing has changed
- if (oldIndex === state.currentIndex)
- {
- getStepAnchor(wizard, oldIndex).focus();
- return false;
- }
-}
-
-function throwError(message)
-{
- if (arguments.length > 1)
- {
- message = message.format(Array.prototype.slice.call(arguments, 1));
- }
-
- throw new Error(message);
-}
-
-/**
- * Checks an argument for null or undefined and throws an error if one check applies.
- *
- * @static
- * @private
- * @method validateArgument
- * @param argumentName {String} The name of the given argument
- * @param argumentValue {Object} The argument itself
- */
-function validateArgument(argumentName, argumentValue)
-{
- if (argumentValue == null)
- {
- throwError("The argument '{0}' is null or undefined.", argumentName);
- }
-}
-
-/**
- * Represents a jQuery wizard plugin.
- *
- * @class steps
- * @constructor
- * @param [method={}] The name of the method as `String` or an JSON object for initialization
- * @param [params=]* {Array} Additional arguments for a method call
- * @chainable
- **/
-$.fn.steps = function (method)
-{
- if ($.fn.steps[method])
- {
- return $.fn.steps[method].apply(this, Array.prototype.slice.call(arguments, 1));
- }
- else if (typeof method === "object" || !method)
- {
- return initialize.apply(this, arguments);
- }
- else
- {
- $.error("Method " + method + " does not exist on jQuery.steps");
- }
-};
-
-/**
- * Adds a new step.
- *
- * @method add
- * @param step {Object} The step object to add
- * @chainable
- **/
-$.fn.steps.add = function (step)
-{
- var state = getState(this);
- return insertStep(this, getOptions(this), state, state.stepCount, step);
-};
-
-/**
- * Removes the control functionality completely and transforms the current state to the initial HTML structure.
- *
- * @method destroy
- * @chainable
- **/
-$.fn.steps.destroy = function ()
-{
- return destroy(this, getOptions(this));
-};
-
-/**
- * Triggers the onFinishing and onFinished event.
- *
- * @method finish
- **/
-$.fn.steps.finish = function ()
-{
- finishStep(this, getState(this));
-};
-
-/**
- * Gets the current step index.
- *
- * @method getCurrentIndex
- * @return {Integer} The actual step index (zero-based)
- * @for steps
- **/
-$.fn.steps.getCurrentIndex = function ()
-{
- return getState(this).currentIndex;
-};
-
-/**
- * Gets the current step object.
- *
- * @method getCurrentStep
- * @return {Object} The actual step object
- **/
-$.fn.steps.getCurrentStep = function ()
-{
- return getStep(this, getState(this).currentIndex);
-};
-
-/**
- * Gets a specific step object by index.
- *
- * @method getStep
- * @param index {Integer} An integer that belongs to the position of a step
- * @return {Object} A specific step object
- **/
-$.fn.steps.getStep = function (index)
-{
- return getStep(this, index);
-};
-
-/**
- * Inserts a new step to a specific position.
- *
- * @method insert
- * @param index {Integer} The position (zero-based) to add
- * @param step {Object} The step object to add
- * @example
- * $("#wizard").steps().insert(0, {
- * title: "Title",
- * content: "", // optional
- * contentMode: "async", // optional
- * contentUrl: "/Content/Step/1" // optional
- * });
- * @chainable
- **/
-$.fn.steps.insert = function (index, step)
-{
- return insertStep(this, getOptions(this), getState(this), index, step);
-};
-
-/**
- * Routes to the next step.
- *
- * @method next
- * @return {Boolean} Indicates whether the action executed
- **/
-$.fn.steps.next = function ()
-{
- return goToNextStep(this, getOptions(this), getState(this));
-};
-
-/**
- * Routes to the previous step.
- *
- * @method previous
- * @return {Boolean} Indicates whether the action executed
- **/
-$.fn.steps.previous = function ()
-{
- return goToPreviousStep(this, getOptions(this), getState(this));
-};
-
-/**
- * Removes a specific step by an given index.
- *
- * @method remove
- * @param index {Integer} The position (zero-based) of the step to remove
- * @return Indecates whether the item is removed.
- **/
-$.fn.steps.remove = function (index)
-{
- return removeStep(this, getOptions(this), getState(this), index);
-};
-
-/**
- * Sets a specific step object by index.
- *
- * @method setStep
- * @param index {Integer} An integer that belongs to the position of a step
- * @param step {Object} The step object to change
- **/
-$.fn.steps.setStep = function (index, step)
-{
- throw new Error("Not yet implemented!");
-};
-
-/**
- * Skips an certain amount of steps.
- *
- * @method skip
- * @param count {Integer} The amount of steps that should be skipped
- * @return {Boolean} Indicates whether the action executed
- **/
-$.fn.steps.skip = function (count)
-{
- throw new Error("Not yet implemented!");
-};
-
-/**
- * An enum represents the different content types of a step and their loading mechanisms.
- *
- * @class contentMode
- * @for steps
- **/
-var contentMode = $.fn.steps.contentMode = {
- /**
- * HTML embedded content
- *
- * @readOnly
- * @property html
- * @type Integer
- * @for contentMode
- **/
- html: 0,
-
- /**
- * IFrame embedded content
- *
- * @readOnly
- * @property iframe
- * @type Integer
- * @for contentMode
- **/
- iframe: 1,
-
- /**
- * Async embedded content
- *
- * @readOnly
- * @property async
- * @type Integer
- * @for contentMode
- **/
- async: 2
-};
-
-/**
- * An enum represents the orientation of the steps navigation.
- *
- * @class stepsOrientation
- * @for steps
- **/
-var stepsOrientation = $.fn.steps.stepsOrientation = {
- /**
- * Horizontal orientation
- *
- * @readOnly
- * @property horizontal
- * @type Integer
- * @for stepsOrientation
- **/
- horizontal: 0,
-
- /**
- * Vertical orientation
- *
- * @readOnly
- * @property vertical
- * @type Integer
- * @for stepsOrientation
- **/
- vertical: 1
-};
-
-/**
- * An enum that represents the various transition animations.
- *
- * @class transitionEffect
- * @for steps
- **/
-var transitionEffect = $.fn.steps.transitionEffect = {
- /**
- * No transition animation
- *
- * @readOnly
- * @property none
- * @type Integer
- * @for transitionEffect
- **/
- none: 0,
-
- /**
- * Fade in transition
- *
- * @readOnly
- * @property fade
- * @type Integer
- * @for transitionEffect
- **/
- fade: 1,
-
- /**
- * Slide up transition
- *
- * @readOnly
- * @property slide
- * @type Integer
- * @for transitionEffect
- **/
- slide: 2,
-
- /**
- * Slide left transition
- *
- * @readOnly
- * @property slideLeft
- * @type Integer
- * @for transitionEffect
- **/
- slideLeft: 3
-};
-
-var stepModel = $.fn.steps.stepModel = {
- title: "",
- content: "",
- contentUrl: "",
- contentMode: contentMode.html,
- contentLoaded: false
-};
-
-/**
- * An object that represents the default settings.
- * There are two possibities to override the sub-properties.
- * Either by doing it generally (global) or on initialization.
- *
- * @static
- * @class defaults
- * @for steps
- * @example
- * // Global approach
- * $.steps.defaults.headerTag = "h3";
- * @example
- * // Initialization approach
- * $("#wizard").steps({ headerTag: "h3" });
- **/
-var defaults = $.fn.steps.defaults = {
- /**
- * The header tag is used to find the step button text within the declared wizard area.
- *
- * @property headerTag
- * @type String
- * @default "h1"
- * @for defaults
- **/
- headerTag: "h1",
-
- /**
- * The body tag is used to find the step content within the declared wizard area.
- *
- * @property bodyTag
- * @type String
- * @default "div"
- * @for defaults
- **/
- bodyTag: "div",
-
- /**
- * The content container tag which will be used to wrap all step contents.
- *
- * @property contentContainerTag
- * @type String
- * @default "div"
- * @for defaults
- **/
- contentContainerTag: "div",
-
- /**
- * The action container tag which will be used to wrap the pagination navigation.
- *
- * @property actionContainerTag
- * @type String
- * @default "div"
- * @for defaults
- **/
- actionContainerTag: "div",
-
- /**
- * The steps container tag which will be used to wrap the steps navigation.
- *
- * @property stepsContainerTag
- * @type String
- * @default "div"
- * @for defaults
- **/
- stepsContainerTag: "div",
-
- /**
- * The css class which will be added to the outer component wrapper.
- *
- * @property cssClass
- * @type String
- * @default "wizard"
- * @for defaults
- * @example
- *
- * ...
- *
- **/
- cssClass: "wizard",
-
- /**
- * The css class which will be used for floating scenarios.
- *
- * @property clearFixCssClass
- * @type String
- * @default "clearfix"
- * @for defaults
- **/
- clearFixCssClass: "clearfix",
-
- /**
- * Determines whether the steps are vertically or horizontally oriented.
- *
- * @property stepsOrientation
- * @type stepsOrientation
- * @default horizontal
- * @for defaults
- * @since 1.0.0
- **/
- stepsOrientation: stepsOrientation.horizontal,
-
- /*
- * Tempplates
- */
-
- /**
- * The title template which will be used to create a step button.
- *
- * @property titleTemplate
- * @type String
- * @default "#index#. #title#"
- * @for defaults
- **/
- titleTemplate: "#index#. #title#",
-
- /**
- * The loading template which will be used to create the loading animation.
- *
- * @property loadingTemplate
- * @type String
- * @default " #text#"
- * @for defaults
- **/
- loadingTemplate: " #text#",
-
- /*
- * Behaviour
- */
-
- /**
- * Sets the focus to the first wizard instance in order to enable the key navigation from the begining if `true`.
- *
- * @property autoFocus
- * @type Boolean
- * @default false
- * @for defaults
- * @since 0.9.4
- **/
- autoFocus: false,
-
- /**
- * Enables all steps from the begining if `true` (all steps are clickable).
- *
- * @property enableAllSteps
- * @type Boolean
- * @default false
- * @for defaults
- **/
- enableAllSteps: false,
-
- /**
- * Enables keyboard navigation if `true` (arrow left and arrow right).
- *
- * @property enableKeyNavigation
- * @type Boolean
- * @default true
- * @for defaults
- **/
- enableKeyNavigation: true,
-
- /**
- * Enables pagination if `true`.
- *
- * @property enablePagination
- * @type Boolean
- * @default true
- * @for defaults
- **/
- enablePagination: true,
-
- /**
- * Suppresses pagination if a form field is focused.
- *
- * @property suppressPaginationOnFocus
- * @type Boolean
- * @default true
- * @for defaults
- **/
- suppressPaginationOnFocus: true,
-
- /**
- * Enables cache for async loaded or iframe embedded content.
- *
- * @property enableContentCache
- * @type Boolean
- * @default true
- * @for defaults
- **/
- enableContentCache: true,
-
- /**
- * Shows the cancel button if enabled.
- *
- * @property enableCancelButton
- * @type Boolean
- * @default false
- * @for defaults
- **/
- enableCancelButton: false,
-
- /**
- * Shows the finish button if enabled.
- *
- * @property enableFinishButton
- * @type Boolean
- * @default true
- * @for defaults
- **/
- enableFinishButton: true,
-
- /**
- * Not yet implemented.
- *
- * @property preloadContent
- * @type Boolean
- * @default false
- * @for defaults
- **/
- preloadContent: false,
-
- /**
- * Shows the finish button always (on each step; right beside the next button) if `true`.
- * Otherwise the next button will be replaced by the finish button if the last step becomes active.
- *
- * @property showFinishButtonAlways
- * @type Boolean
- * @default false
- * @for defaults
- **/
- showFinishButtonAlways: false,
-
- /**
- * Prevents jumping to a previous step.
- *
- * @property forceMoveForward
- * @type Boolean
- * @default false
- * @for defaults
- **/
- forceMoveForward: false,
-
- /**
- * Saves the current state (step position) to a cookie.
- * By coming next time the last active step becomes activated.
- *
- * @property saveState
- * @type Boolean
- * @default false
- * @for defaults
- **/
- saveState: false,
-
- /**
- * The position to start on (zero-based).
- *
- * @property startIndex
- * @type Integer
- * @default 0
- * @for defaults
- **/
- startIndex: 0,
-
- /*
- * Animation Effect Configuration
- */
-
- /**
- * The animation effect which will be used for step transitions.
- *
- * @property transitionEffect
- * @type transitionEffect
- * @default none
- * @for defaults
- **/
- transitionEffect: transitionEffect.none,
-
- /**
- * Animation speed for step transitions (in milliseconds).
- *
- * @property transitionEffectSpeed
- * @type Integer
- * @default 200
- * @for defaults
- **/
- transitionEffectSpeed: 200,
-
- /*
- * Events
- */
-
- /**
- * Fires before the step changes and can be used to prevent step changing by returning `false`.
- * Very useful for form validation.
- *
- * @property onStepChanging
- * @type Event
- * @default function (event, currentIndex, newIndex) { return true; }
- * @for defaults
- **/
- onStepChanging: function (event, currentIndex, newIndex) { return true; },
-
- /**
- * Fires after the step has change.
- *
- * @property onStepChanged
- * @type Event
- * @default function (event, currentIndex, priorIndex) { }
- * @for defaults
- **/
- onStepChanged: function (event, currentIndex, priorIndex) { },
-
- /**
- * Fires after cancelation.
- *
- * @property onCanceled
- * @type Event
- * @default function (event) { }
- * @for defaults
- **/
- onCanceled: function (event) { },
-
- /**
- * Fires before finishing and can be used to prevent completion by returning `false`.
- * Very useful for form validation.
- *
- * @property onFinishing
- * @type Event
- * @default function (event, currentIndex) { return true; }
- * @for defaults
- **/
- onFinishing: function (event, currentIndex) { return true; },
-
- /**
- * Fires after completion.
- *
- * @property onFinished
- * @type Event
- * @default function (event, currentIndex) { }
- * @for defaults
- **/
- onFinished: function (event, currentIndex) { },
-
- /**
- * Fires after async content is loaded.
- *
- * @property onContentLoaded
- * @type Event
- * @default function (event, index) { }
- * @for defaults
- **/
- onContentLoaded: function (event, currentIndex) { },
-
- /**
- * Fires when the wizard is initialized.
- *
- * @property onInit
- * @type Event
- * @default function (event) { }
- * @for defaults
- **/
- onInit: function (event, currentIndex) { },
-
- /**
- * Contains all labels.
- *
- * @property labels
- * @type Object
- * @for defaults
- **/
- labels: {
- /**
- * Label for the cancel button.
- *
- * @property cancel
- * @type String
- * @default "Cancel"
- * @for defaults
- **/
- cancel: "取消",
-
- /**
- * This label is important for accessability reasons.
- * Indicates which step is activated.
- *
- * @property current
- * @type String
- * @default "current step:"
- * @for defaults
- **/
- current: "当前步骤::",
-
- /**
- * This label is important for accessability reasons and describes the kind of navigation.
- *
- * @property pagination
- * @type String
- * @default "Pagination"
- * @for defaults
- * @since 0.9.7
- **/
- pagination: "分页",
-
- /**
- * Label for the finish button.
- *
- * @property finish
- * @type String
- * @default "Finish"
- * @for defaults
- **/
- finish: "完成",
-
- /**
- * Label for the next button.
- *
- * @property next
- * @type String
- * @default "Next"
- * @for defaults
- **/
- next: "下一步",
-
- /**
- * Label for the previous button.
- *
- * @property previous
- * @type String
- * @default "Previous"
- * @for defaults
- **/
- previous: "上一步",
-
- /**
- * Label for the loading animation.
- *
- * @property loading
- * @type String
- * @default "Loading ..."
- * @for defaults
- **/
- loading: "加载中 ..."
- }
-};
-})(jQuery);
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/resources/static/ajax/libs/staps/jquery.steps.min.js b/ruoyi-admin/src/main/resources/static/ajax/libs/staps/jquery.steps.min.js
deleted file mode 100644
index 8e617bf91..000000000
--- a/ruoyi-admin/src/main/resources/static/ajax/libs/staps/jquery.steps.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
- * jQuery Steps v1.1.0 - 09/04/2014
- * Copyright (c) 2014 Rafael Staib (http://www.jquery-steps.com)
- * Licensed under MIT http://www.opensource.org/licenses/MIT
- */
-(function($,undefined){$.fn.extend({_aria:function(name,value){return this.attr("aria-"+name,value)},_removeAria:function(name){return this.removeAttr("aria-"+name)},_enableAria:function(enable){return(enable==null||enable)?this.removeClass("disabled")._aria("disabled","false"):this.addClass("disabled")._aria("disabled","true")},_showAria:function(show){return(show==null||show)?this.show()._aria("hidden","false"):this.hide()._aria("hidden","true")},_selectAria:function(select){return(select==null||select)?this.addClass("current")._aria("selected","true"):this.removeClass("current")._aria("selected","false")},_id:function(id){return(id)?this.attr("id",id):this.attr("id")}});if(!String.prototype.format){String.prototype.format=function(){var args=(arguments.length===1&&$.isArray(arguments[0]))?arguments[0]:arguments;var formattedString=this;for(var i=0;istepContents.length){throwError(_missingCorrespondingElementErrorMessage,"contents")}else{if(stepTitles.length *");contents.removeData("loaded").removeData("mode").removeData("url");contents.removeAttr("id").removeAttr("role").removeAttr("tabindex").removeAttr("class").removeAttr("style")._removeAria("labelledby")._removeAria("hidden");wizard.find(".content > [data-mode='async'],.content > [data-mode='iframe']").empty();var wizardSubstitute=$('<{0} class="{1}">{0}>'.format(wizard.get(0).tagName,wizard.attr("class")));var wizardId=wizard._id();if(wizardId!=null&&wizardId!==""){wizardSubstitute._id(wizardId)}wizardSubstitute.html(wizard.find(".content").html());wizard.after(wizardSubstitute);wizard.remove();return wizardSubstitute}function finishStep(wizard,state){var currentStep=wizard.find(".steps li").eq(state.currentIndex);if(wizard.triggerHandler("finishing",[state.currentIndex])){currentStep.addClass("done").removeClass("error");wizard.triggerHandler("finished",[state.currentIndex])}else{currentStep.addClass("error")}}function getEventNamespace(wizard){var eventNamespace=wizard.data("eventNamespace");if(eventNamespace==null){eventNamespace="."+getUniqueId(wizard);wizard.data("eventNamespace",eventNamespace)}return eventNamespace}function getStepAnchor(wizard,index){var uniqueId=getUniqueId(wizard);return wizard.find("#"+uniqueId+_tabSuffix+index)}function getStepPanel(wizard,index){var uniqueId=getUniqueId(wizard);return wizard.find("#"+uniqueId+_tabpanelSuffix+index)}function getStepTitle(wizard,index){var uniqueId=getUniqueId(wizard);return wizard.find("#"+uniqueId+_titleSuffix+index)}function getOptions(wizard){return wizard.data("options")}function getState(wizard){return wizard.data("state")}function getSteps(wizard){return wizard.data("steps")}function getStep(wizard,index){var steps=getSteps(wizard);if(index<0||index>=steps.length){throwError(_indexOutOfRangeErrorMessage)}return steps[index]}function getUniqueId(wizard){var uniqueId=wizard.data("uid");if(uniqueId==null){uniqueId=wizard._id();if(uniqueId==null){uniqueId="steps-uid-".concat(_uniqueId);wizard._id(uniqueId)}_uniqueId++;wizard.data("uid",uniqueId)}return uniqueId}function getValidEnumValue(enumType,keyOrValue){validateArgument("enumType",enumType);validateArgument("keyOrValue",keyOrValue);if(typeof keyOrValue==="string"){var value=enumType[keyOrValue];if(value===undefined){throwError("The enum key '{0}' does not exist.",keyOrValue)}return value}else{if(typeof keyOrValue==="number"){for(var key in enumType){if(enumType[key]===keyOrValue){return keyOrValue}}throwError("Invalid enum value '{0}'.",keyOrValue)}else{throwError("Invalid key or value type.")}}}function goToNextStep(wizard,options,state){return paginationClick(wizard,options,state,increaseCurrentIndexBy(state,1))}function goToPreviousStep(wizard,options,state){return paginationClick(wizard,options,state,decreaseCurrentIndexBy(state,1))}function goToStep(wizard,options,state,index){if(index<0||index>=state.stepCount){throwError(_indexOutOfRangeErrorMessage)}if(options.forceMoveForward&&indexstate.stepCount){throwError(_indexOutOfRangeErrorMessage)}step=$.extend({},stepModel,step);insertStepToCache(wizard,index,step);if(state.currentIndex!==state.stepCount&&state.currentIndex>=index){state.currentIndex++;saveCurrentStateToCookie(wizard,options,state)}state.stepCount++;var contentContainer=wizard.find(".content"),header=$("<{0}>{1}{0}>".format(options.headerTag,step.title)),body=$("<{0}>{0}>".format(options.bodyTag));if(step.contentMode==null||step.contentMode===contentMode.html){body.html(step.content)}if(index===0){contentContainer.prepend(body).prepend(header)}else{getStepPanel(wizard,(index-1)).after(body).after(header)}renderBody(wizard,state,body,index);renderTitle(wizard,options,state,header,index);refreshSteps(wizard,options,state,index);if(index===state.currentIndex){refreshStepNavigation(wizard,options,state)}refreshPagination(wizard,options,state);return wizard}function insertStepToCache(wizard,index,step){getSteps(wizard).splice(index,0,step)}function keyUpHandler(event){var wizard=$(this),options=getOptions(wizard),state=getState(wizard);if(options.suppressPaginationOnFocus&&wizard.find(":focus").is(":input")){event.preventDefault();return false}var keyCodes={left:37,right:39};if(event.keyCode===keyCodes.left){event.preventDefault();goToPreviousStep(wizard,options,state)}else{if(event.keyCode===keyCodes.right){event.preventDefault();goToNextStep(wizard,options,state)}}}function loadAsyncContent(wizard,options,state){if(state.stepCount>0){var currentIndex=state.currentIndex,currentStep=getStep(wizard,currentIndex);if(!options.enableContentCache||!currentStep.contentLoaded){switch(getValidEnumValue(contentMode,currentStep.contentMode)){case contentMode.iframe:wizard.find(".content > .body").eq(state.currentIndex).empty().html('').data("loaded","1");break;case contentMode.async:var currentStepContent=getStepPanel(wizard,currentIndex)._aria("busy","true").empty().append(renderTemplate(options.loadingTemplate,{text:options.labels.loading}));$.ajax({url:currentStep.contentUrl,cache:false}).done(function(data){currentStepContent.empty().html(data)._aria("busy","false").data("loaded","1");wizard.triggerHandler("contentLoaded",[currentIndex])});break}}}}function paginationClick(wizard,options,state,index){var oldIndex=state.currentIndex;if(index>=0&&index0)}if(options.enableFinishButton&&options.showFinishButtonAlways){finish._enableAria(state.stepCount>0);next._enableAria(state.stepCount>1&&state.stepCount>(state.currentIndex+1))}else{finish._showAria(options.enableFinishButton&&state.stepCount===(state.currentIndex+1));next._showAria(state.stepCount===0||state.stepCount>(state.currentIndex+1))._enableAria(state.stepCount>(state.currentIndex+1)||!options.enableFinishButton)}}}function refreshStepNavigation(wizard,options,state,oldIndex){var currentOrNewStepAnchor=getStepAnchor(wizard,state.currentIndex),currentInfo=$(''+options.labels.current+" "),stepTitles=wizard.find(".content > .title");if(oldIndex!=null){var oldStepAnchor=getStepAnchor(wizard,oldIndex);oldStepAnchor.parent().addClass("done").removeClass("error")._selectAria(false);stepTitles.eq(oldIndex).removeClass("current").next(".body").removeClass("current");currentInfo=oldStepAnchor.find(".current-info");currentOrNewStepAnchor.focus()}currentOrNewStepAnchor.prepend(currentInfo).parent()._selectAria().removeClass("done")._enableAria();stepTitles.eq(state.currentIndex).addClass("current").next(".body").addClass("current")}function refreshSteps(wizard,options,state,index){var uniqueId=getUniqueId(wizard);for(var i=index;i=state.stepCount||state.currentIndex===index){return false}removeStepFromCache(wizard,index);if(state.currentIndex>index){state.currentIndex--;saveCurrentStateToCookie(wizard,options,state)}state.stepCount--;getStepTitle(wizard,index).remove();getStepPanel(wizard,index).remove();getStepAnchor(wizard,index).parent().remove();if(index===0){wizard.find(".steps li").first().addClass("first")}if(index===state.stepCount){wizard.find(".steps li").eq(index).addClass("last")}refreshSteps(wizard,options,state,index);refreshPagination(wizard,options,state);return true}function removeStepFromCache(wizard,index){getSteps(wizard).splice(index,1)}function render(wizard,options,state){var wrapperTemplate='<{0} class="{1}">{2}{0}>',orientation=getValidEnumValue(stepsOrientation,options.stepsOrientation),verticalCssClass=(orientation===stepsOrientation.vertical)?" vertical":"",contentWrapper=$(wrapperTemplate.format(options.contentContainerTag,"content "+options.clearFixCssClass,wizard.html())),stepsWrapper=$(wrapperTemplate.format(options.stepsContainerTag,"steps "+options.clearFixCssClass,'')),stepTitles=contentWrapper.children(options.headerTag),stepContents=contentWrapper.children(options.bodyTag);wizard.attr("role","application").empty().append(stepsWrapper).append(contentWrapper).addClass(options.cssClass+" "+options.clearFixCssClass+verticalCssClass);stepContents.each(function(index){renderBody(wizard,state,$(this),index)});stepTitles.each(function(index){renderTitle(wizard,options,state,$(this),index)});refreshStepNavigation(wizard,options,state);renderPagination(wizard,options,state)}function renderBody(wizard,state,body,index){var uniqueId=getUniqueId(wizard),uniqueBodyId=uniqueId+_tabpanelSuffix+index,uniqueHeaderId=uniqueId+_titleSuffix+index;body._id(uniqueBodyId).attr("role","tabpanel")._aria("labelledby",uniqueHeaderId).addClass("body")._showAria(state.currentIndex===index)}function renderPagination(wizard,options,state){if(options.enablePagination){var pagination='<{0} class="actions {1}">{0}>',buttonTemplate='{1} ',buttons="";if(!options.forceMoveForward){buttons+=buttonTemplate.format("previous",options.labels.previous)}buttons+=buttonTemplate.format("next",options.labels.next);if(options.enableFinishButton){buttons+=buttonTemplate.format("finish",options.labels.finish)}if(options.enableCancelButton){buttons+=buttonTemplate.format("cancel",options.labels.cancel)}wizard.append(pagination.format(options.actionContainerTag,options.clearFixCssClass,options.labels.pagination,buttons));refreshPagination(wizard,options,state);loadAsyncContent(wizard,options,state)}}function renderTemplate(template,substitutes){var matches=template.match(/#([a-z]*)#/gi);for(var i=0;i ul"),title=renderTemplate(options.titleTemplate,{index:index+1,title:header.html()}),stepItem=$(''+title+" ");stepItem._enableAria(options.enableAllSteps||state.currentIndex>index);if(state.currentIndex>index){stepItem.addClass("done")}header._id(uniqueHeaderId).attr("tabindex","-1").addClass("title");if(index===0){stepCollection.prepend(stepItem)}else{stepCollection.find("li").eq(index-1).after(stepItem)}if(index===0){stepCollection.find("li").removeClass("first").eq(index).addClass("first")}if(index===(state.stepCount-1)){stepCollection.find("li").removeClass("last").eq(index).addClass("last")}stepItem.children("a").bind("click"+getEventNamespace(wizard),stepClickHandler)}function saveCurrentStateToCookie(wizard,options,state){if(options.saveState&&$.cookie){$.cookie(_cookiePrefix+getUniqueId(wizard),state.currentIndex)}}function startTransitionEffect(wizard,options,state,index,oldIndex,doneCallback){var stepContents=wizard.find(".content > .body"),effect=getValidEnumValue(transitionEffect,options.transitionEffect),effectSpeed=options.transitionEffectSpeed,newStep=stepContents.eq(index),currentStep=stepContents.eq(oldIndex);switch(effect){case transitionEffect.fade:case transitionEffect.slide:var hide=(effect===transitionEffect.fade)?"fadeOut":"slideUp",show=(effect===transitionEffect.fade)?"fadeIn":"slideDown";state.transitionElement=newStep;currentStep[hide](effectSpeed,function(){var wizard=$(this)._showAria(false).parent().parent(),state=getState(wizard);if(state.transitionElement){state.transitionElement[show](effectSpeed,function(){$(this)._showAria()}).promise().done(doneCallback);state.transitionElement=null}});break;case transitionEffect.slideLeft:var outerWidth=currentStep.outerWidth(true),posFadeOut=(index>oldIndex)?-(outerWidth):outerWidth,posFadeIn=(index>oldIndex)?outerWidth:-(outerWidth);$.when(currentStep.animate({left:posFadeOut},effectSpeed,function(){$(this)._showAria(false)}),newStep.css("left",posFadeIn+"px")._showAria().animate({left:0},effectSpeed)).done(doneCallback);break;default:$.when(currentStep._showAria(false),newStep._showAria()).done(doneCallback);break}}function stepClickHandler(event){event.preventDefault();var anchor=$(this),wizard=anchor.parent().parent().parent().parent(),options=getOptions(wizard),state=getState(wizard),oldIndex=state.currentIndex;if(anchor.parent().is(":not(.disabled):not(.current)")){var href=anchor.attr("href"),position=parseInt(href.substring(href.lastIndexOf("-")+1),0);goToStep(wizard,options,state,position)}if(oldIndex===state.currentIndex){getStepAnchor(wizard,oldIndex).focus();return false}}function throwError(message){if(arguments.length>1){message=message.format(Array.prototype.slice.call(arguments,1))}throw new Error(message)}function validateArgument(argumentName,argumentValue){if(argumentValue==null){throwError("The argument '{0}' is null or undefined.",argumentName)}}$.fn.steps=function(method){if($.fn.steps[method]){return $.fn.steps[method].apply(this,Array.prototype.slice.call(arguments,1))}else{if(typeof method==="object"||!method){return initialize.apply(this,arguments)}else{$.error("Method "+method+" does not exist on jQuery.steps")}}};$.fn.steps.add=function(step){var state=getState(this);return insertStep(this,getOptions(this),state,state.stepCount,step)};$.fn.steps.destroy=function(){return destroy(this,getOptions(this))};$.fn.steps.finish=function(){finishStep(this,getState(this))};$.fn.steps.getCurrentIndex=function(){return getState(this).currentIndex};$.fn.steps.getCurrentStep=function(){return getStep(this,getState(this).currentIndex)};$.fn.steps.getStep=function(index){return getStep(this,index)};$.fn.steps.insert=function(index,step){return insertStep(this,getOptions(this),getState(this),index,step)};$.fn.steps.next=function(){return goToNextStep(this,getOptions(this),getState(this))};$.fn.steps.previous=function(){return goToPreviousStep(this,getOptions(this),getState(this))};$.fn.steps.remove=function(index){return removeStep(this,getOptions(this),getState(this),index)};$.fn.steps.setStep=function(index,step){throw new Error("Not yet implemented!")};$.fn.steps.skip=function(count){throw new Error("Not yet implemented!")};var contentMode=$.fn.steps.contentMode={html:0,iframe:1,async:2};var stepsOrientation=$.fn.steps.stepsOrientation={horizontal:0,vertical:1};var transitionEffect=$.fn.steps.transitionEffect={none:0,fade:1,slide:2,slideLeft:3};var stepModel=$.fn.steps.stepModel={title:"",content:"",contentUrl:"",contentMode:contentMode.html,contentLoaded:false};var defaults=$.fn.steps.defaults={headerTag:"h1",bodyTag:"div",contentContainerTag:"div",actionContainerTag:"div",stepsContainerTag:"div",cssClass:"wizard",clearFixCssClass:"clearfix",stepsOrientation:stepsOrientation.horizontal,titleTemplate:'#index#. #title#',loadingTemplate:' #text#',autoFocus:false,enableAllSteps:false,enableKeyNavigation:true,enablePagination:true,suppressPaginationOnFocus:true,enableContentCache:true,enableCancelButton:false,enableFinishButton:true,preloadContent:false,showFinishButtonAlways:false,forceMoveForward:false,saveState:false,startIndex:0,transitionEffect:transitionEffect.none,transitionEffectSpeed:200,onStepChanging:function(event,currentIndex,newIndex){return true},onStepChanged:function(event,currentIndex,priorIndex){},onCanceled:function(event){},onFinishing:function(event,currentIndex){return true},onFinished:function(event,currentIndex){},onContentLoaded:function(event,currentIndex){},onInit:function(event,currentIndex){},labels:{cancel:"取消",current:"当前步骤::",pagination:"分页",finish:"完成",next:"下一步",previous:"上一步",loading:"加载中 ..."}}})(jQuery);
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/resources/static/css/skins.css b/ruoyi-admin/src/main/resources/static/css/skins.css
index 5dc356160..e55a3edde 100644
--- a/ruoyi-admin/src/main/resources/static/css/skins.css
+++ b/ruoyi-admin/src/main/resources/static/css/skins.css
@@ -4,6 +4,14 @@
* NAME - blue/green/purple/red/yellow
*
*/
+.nav-tabs {
+ border-bottom: 0px;
+}
+
+.navbar .navbar-toolbar>li>a {
+ border: none !important;
+}
+
/** 蓝色主题 skin-blue **/
.navbar, .skin-blue .navbar {
background-color: #3c8dbc
@@ -93,7 +101,7 @@
background: #1a2226
}
-.skin-blue .nav>li.active {
+.skin-blue .nav:not(.navbar-toolbar)>li.active {
color: #fff;
background: #293846;
border-left: 3px solid #3c8dbc;
@@ -103,6 +111,13 @@
border-left: none;
}
+.skin-blue .dropdown-menu > .active > a, .skin-blue .dropdown-menu > .active > a:hover, .skin-blue .dropdown-menu > .active > a:focus {
+ color: #fff !important;
+ text-decoration: none;
+ outline: 0;
+ background-color: #3c8dbc;
+}
+
.skin-blue .sidebar a {
color: #b8c7ce
}
@@ -268,7 +283,7 @@
background: #1a2226;
}
-.skin-green .nav>li.active {
+.skin-green .nav:not(.navbar-toolbar)>li.active {
color: #fff;
background: #293846;
border-left: 3px solid #00a65a;
@@ -278,6 +293,13 @@
border-left: none;
}
+.skin-green .dropdown-menu > .active > a, .skin-green .dropdown-menu > .active > a:hover, .skin-green .dropdown-menu > .active > a:focus {
+ color: #fff !important;
+ text-decoration: none;
+ outline: 0;
+ background-color: #00a65a;
+}
+
.skin-green .sidebar a {
color: #b8c7ce
}
@@ -415,7 +437,7 @@
background: #1a2226
}
-.skin-red .nav>li.active {
+.skin-red .nav:not(.navbar-toolbar)>li.active {
color: #fff;
border-left: 3px solid #dd4b39;
background: #293846;
@@ -425,6 +447,13 @@
border-left: none;
}
+.skin-red .dropdown-menu > .active > a, .skin-red .dropdown-menu > .active > a:hover, .skin-red .dropdown-menu > .active > a:focus {
+ color: #fff !important;
+ text-decoration: none;
+ outline: 0;
+ background-color: #dd4b39;
+}
+
.skin-red .content-tabs {
border-bottom: 1px solid #e5e5e5;
}
@@ -566,7 +595,7 @@
background: #1a2226
}
-.skin-yellow .nav>li.active {
+.skin-yellow .nav:not(.navbar-toolbar)>li.active {
color: #fff;
background: #293846;
border-left: 3px solid #f39c12;
@@ -576,6 +605,13 @@
border-left: none;
}
+.skin-yellow .dropdown-menu > .active > a, .skin-yellow .dropdown-menu > .active > a:hover, .skin-yellow .dropdown-menu > .active > a:focus {
+ color: #fff !important;
+ text-decoration: none;
+ outline: 0;
+ background-color: #f39c12;
+}
+
.skin-yellow .content-tabs {
border-bottom: 1px solid #e5e5e5;
}
@@ -717,7 +753,7 @@
background: #1a2226
}
-.skin-purple .nav>li.active {
+.skin-purple .nav:not(.navbar-toolbar)>li.active {
color: #fff;
background: #293846;
border-left: 3px solid #605ca8;
@@ -727,6 +763,13 @@
border-left: none;
}
+.skin-purple .dropdown-menu > .active > a, .skin-purple .dropdown-menu > .active > a:hover, .skin-purple .dropdown-menu > .active > a:focus {
+ color: #fff !important;
+ text-decoration: none;
+ outline: 0;
+ background-color: #605ca8;
+}
+
.skin-purple .content-tabs {
border-bottom: 1px solid #e5e5e5;
}
@@ -790,7 +833,7 @@
color: #fff
}
-.theme-dark .nav>li.active {
+.theme-dark .nav:not(.navbar-toolbar)>li.active {
background: #293846;
}
@@ -812,7 +855,7 @@
color: #555
}
-.theme-light .nav>li.active{
+.theme-light .nav:not(.navbar-toolbar)>li.active{
background: #f9fafc;
}
@@ -903,7 +946,7 @@
color: #a3b1cc
}
-.theme-blue .nav>li.active{
+.theme-blue .nav:not(.navbar-toolbar)>li.active{
background-color: rgba(15,41,80,1);
}
diff --git a/ruoyi-admin/src/main/resources/static/css/style.css b/ruoyi-admin/src/main/resources/static/css/style.css
index c9a889a8c..5f79f3220 100644
--- a/ruoyi-admin/src/main/resources/static/css/style.css
+++ b/ruoyi-admin/src/main/resources/static/css/style.css
@@ -46,7 +46,7 @@ a:focus {
/*white-space: nowrap;*/
}
-.nav.navbar-right>li>a {
+.nav.navbar-right>li>a, .nav.navbar-left>li>a {
color: #fff;
font-size: 14px;
height: 50px;
@@ -57,7 +57,7 @@ a:focus {
color: #ffffff;
}
-.nav.navbar-right>li>a>.label {
+.nav.navbar-right>li>a>.label, .nav.navbar-left>li>a>.label {
position: absolute;
top: 9px;
right: 5px;
@@ -66,7 +66,7 @@ a:focus {
padding: 2px 4px;
line-height: .9;
}
-.nav.navbar-right>li>a:hover {
+.nav.navbar-right>li>a:hover, .nav.navbar-left>li>a:hover {
background-color: #367fa9;
color: #fff;
}
@@ -280,6 +280,8 @@ body.body-small .navbar-top-links li:last-child {
.nav-second-level li, .nav-third-level li {
border-bottom: none !important;
+ padding-left: 2px;
+ padding-right: 2px;
}
.nav-second-level li a {
@@ -288,7 +290,7 @@ body.body-small .navbar-top-links li:last-child {
}
.nav-third-level li a {
- padding-left: 62px;
+ padding-left: 70px;
}
.nav-second-level li:last-child {
@@ -307,6 +309,10 @@ body.mini-navbar .navbar-default .nav>li>.nav-second-level li a {
border-radius: 0 2px 2px 0;
}
+body.mini-navbar .navbar-default .nav>li>.nav-third-level li a {
+ padding-left: 31px;
+}
+
.fixed-nav .slimScrollDiv #side-menu {
padding-bottom: 60px;
position: relative;
@@ -473,13 +479,12 @@ body.body-small.fixed-sidebar.mini-navbar .navbar-static-side {
border-left-width: 0;
}
-/*伸缩菜单*/
+/* 伸缩菜单 */
.fixed-sidebar.mini-navbar .nav li:hover>a> span.nav-label {
top: 0px;
padding: 10px 10px 10px 10px;
text-align: center;
background-color: #243747;
- border-bottom: dashed 1px #fff;
}
.fixed-sidebar.mini-navbar .nav li:hover>.nav-second-level {
@@ -495,6 +500,15 @@ body.body-small.fixed-sidebar.mini-navbar .navbar-static-side {
min-width: 140px;
border-radius: 2px;
}
+
+.fixed-sidebar.mini-navbar .nav li.active:hover>.nav-second-level, .fixed-sidebar.mini-navbar .nav li.active:hover>a> span.nav-label {
+ left: 67px;
+}
+
+.fixed-sidebar.mini-navbar .nav .nav-second-level a> span, .fixed-sidebar.mini-navbar .nav .nav-third-level a> span {
+ display: inline-block;
+}
+
/*伸缩菜单结束*/
body.fixed-sidebar.mini-navbar .navbar-default .nav>li>.nav-second-level li a {
@@ -1161,6 +1175,8 @@ button.dim:active:before {
/* TOOLTIPS */
.tooltip-inner {
background-color: #2F4050;
+ word-break: break-all;
+ overflow-wrap: break-word;
}
.tooltip.top .tooltip-arrow {
@@ -3254,7 +3270,7 @@ body.body-small .footer.fixed {
position: relative;
height: 39px;
background: #fafafa;
- line-height: 38px;
+ line-height: 39px;
}
.content-tabs .roll-nav, .page-tabs-list {
@@ -6873,7 +6889,7 @@ body.rtls .top-navigation .footer.fixed, body.rtls.top-navigation .footer.fixed
}
.navbar-header {
- width: 10%;
+ /* width: 10%; */
height: 50px;
}
diff --git a/ruoyi-admin/src/main/resources/static/js/resize-tabs.js b/ruoyi-admin/src/main/resources/static/js/resize-tabs.js
new file mode 100644
index 000000000..992f7d292
--- /dev/null
+++ b/ruoyi-admin/src/main/resources/static/js/resize-tabs.js
@@ -0,0 +1 @@
+(function(c,a,e){var b,d="resizeTabs",f={navSelector:".nav-tabs",itemSelector:">li",dropdownSelector:">.dropdown",dropdownItemSelector:"li",tabParentSelector:"",tabSelector:".tab-pane",activeClassName:"active",noNavClassName:".no-menu",fnCallback:""};b=function(j,i){var h=this.$tabs=e(j),k=this.options=e.extend(true,{},f,i),g=this.$nav=h.find(k.navSelector),l=this.$dropdown=g.find(k.dropdownSelector);this.$items=g.find(k.itemSelector).filter(function(){return !e(this).is(l)});this.$dropdownItems=l.find(k.dropdownItemSelector);if(k.tabParentSelector!==""){this.$tabPanel=e(k.tabParentSelector).find(k.tabSelector)}else{this.$tabPanel=h.find(k.tabSelector)}this.init()};b.prototype={init:function(){var j=this.itemsLenth=this.$items.length,h;if(j===0){throw"There should be some tags here "}if(this.$dropdown.length===0){this.flag=true;this.$nav.append(''+''+' ');this.$dropdown=this.$nav.find(this.options.dropdownSelector);this.$dropdown.css("opacity",0);h=this.$dropdown.width();h=h===0?90:h;this.$dropdown.addClass("hidden").css("opacity",1)}else{h=this.$dropdown.width()}this.breakpoints=[];for(var g=0;gli"+h.options.noNavClassName+":first").before(h.$items.eq(o).prop("outerHTML"))}h.$items.eq(o).hide()}},n=function(p){for(var o=0;oli").show();break}}h.$dropdownItems=h.$dropdown.find(h.options.dropdownItemSelector)};for(;jl){break}}this.$items.removeClass(g);this.$dropdownItems.removeClass(g);this.$dropdown.removeClass(g);if(j===this.breakpoints.length){if(this.flag){this.$dropdown.addClass("hidden")}else{this.$dropdown.find("ul>li:not(li"+this.options.noNavClassName+")").remove()}this.$items.show();if(m!=-1){this.$items.eq(m-1).addClass(g)}}else{this.$dropdown.removeClass("hidden");if(this.flag){this.$dropdown.find("ul>li").remove()}else{this.$dropdown.find("ul>li:not(li"+this.options.noNavClassName+")").remove()}n(j);if(mi {
+ color: #ed5565;
+}
+
.input-group.date label.error {
z-index:99;
right: 3px
@@ -439,6 +443,14 @@ label.error {
background-position: -180px 0
}
+/* ztree */
+div.ztree-border {
+ margin-top: 10px;
+ border: 1px solid #e5e6e7;
+ background: #FFFFFF none;
+ border-radius:4px;
+}
+
/* 切换开关 */
.toggle-switch {
display: -webkit-inline-box;
@@ -868,6 +880,26 @@ label {
height: 32px!important;
}
+/** 表格列宽拖动样式 **/
+.rc-handle-container {
+ position: relative;
+}
+.rc-handle {
+ position: absolute;
+ width: 7px;
+ cursor: ew-resize;
+ margin-left: -3px;
+ z-index: 2;
+}
+table.rc-table-resizing {
+ cursor: ew-resize;
+}
+table.rc-table-resizing thead,
+table.rc-table-resizing thead > th,
+table.rc-table-resizing thead > th > a {
+ cursor: ew-resize;
+}
+
/** 表格冻结列样式 **/
.fixed-columns, .fixed-columns-right {
position: absolute;
@@ -1056,6 +1088,23 @@ label {
visibility: visible;
}
+/* 设置菜单样式 */
+.menu-content {
+ padding: 10px 10px 10px 25px !important;
+}
+
+.tab-content > .tab-pane {
+ display: none;
+}
+
+.tab-content > .active {
+ display: block;
+}
+
+.height-full {
+ height: 100% !important;
+}
+
/* 设置滚动条样式 */
::-webkit-scrollbar {
width:10px!important;
diff --git a/ruoyi-admin/src/main/resources/static/ruoyi/index.js b/ruoyi-admin/src/main/resources/static/ruoyi/index.js
index 705e82e47..a4ff28f13 100644
--- a/ruoyi-admin/src/main/resources/static/ruoyi/index.js
+++ b/ruoyi-admin/src/main/resources/static/ruoyi/index.js
@@ -81,6 +81,13 @@ function syncMenuTab(dataId) {
$dataObj.parents("li").addClass("active").siblings().removeClass("active").find('li').removeClass("active");
$dataObj.parents("ul").css('height', 'auto').height();
$dataObj.click();
+ // 顶部菜单同步处理
+ var tabStr = $dataObj.parents(".tab-pane").attr("id");
+ if ($.common.isNotEmpty(tabStr)) {
+ var sepIndex = tabStr.lastIndexOf('_');
+ var menuId = tabStr.substring(sepIndex + 1, tabStr.length);
+ $("#tab_" + menuId + " a").click();
+ }
}
}
}
@@ -256,6 +263,7 @@ $(function() {
var $dataObj = $('a[href$="' + decodeURI(dataUrl) + '"]');
if (!$dataObj.hasClass("noactive")) {
+ $('.tab-pane li').removeClass("active");
$('.nav ul').removeClass("in");
$dataObj.parents("ul").addClass("in")
$dataObj.parents("li").addClass("active").siblings().removeClass("active").find('li').removeClass("active");
diff --git a/ruoyi-admin/src/main/resources/static/ruoyi/js/ry-ui.js b/ruoyi-admin/src/main/resources/static/ruoyi/js/ry-ui.js
index 2898fa4d7..858e519e2 100644
--- a/ruoyi-admin/src/main/resources/static/ruoyi/js/ry-ui.js
+++ b/ruoyi-admin/src/main/resources/static/ruoyi/js/ry-ui.js
@@ -131,6 +131,7 @@ var table = {
queryParams: options.queryParams, // 传递参数(*)
rowStyle: options.rowStyle, // 通过自定义函数设置行样式
footerStyle: options.footerStyle, // 通过自定义函数设置页脚样式
+ headerStyle: options.headerStyle, // 通过自定义函数设置标题样式
columns: options.columns, // 显示列信息(*)
data: options.data, // 被加载的数据
responseHandler: $.table.responseHandler, // 在加载服务器发送来的数据之前处理函数
@@ -191,6 +192,11 @@ var table = {
$(optionsIds).on(TABLE_EVENTS, function () {
table.set($(this).attr("id"));
});
+ // 在表格体渲染完成,并在 DOM 中可见后触发(事件)
+ $(optionsIds).on("post-body.bs.table", function (e, args) {
+ // 浮动提示框特效
+ $(".table [data-toggle='tooltip']").tooltip();
+ });
// 选中、取消、全部选中、全部取消(事件)
$(optionsIds).on("check.bs.table check-all.bs.table uncheck.bs.table uncheck-all.bs.table", function (e, rowsAfter, rowsBefore) {
// 复选框分页保留保存选中数组
@@ -269,8 +275,6 @@ var table = {
if (typeof table.options.onLoadSuccess == "function") {
table.options.onLoadSuccess(data);
}
- // 浮动提示框特效
- $(".table [data-toggle='tooltip']").tooltip();
},
// 表格销毁
destroy: function (tableId) {
@@ -718,9 +722,13 @@ var table = {
$.modal.alert(content, modal_status.WARNING);
},
// 关闭窗体
- close: function () {
- var index = parent.layer.getFrameIndex(window.name);
- parent.layer.close(index);
+ close: function (index) {
+ if($.common.isEmpty(index)){
+ var index = parent.layer.getFrameIndex(window.name);
+ parent.layer.close(index);
+ } else {
+ layer.close(index);
+ }
},
// 关闭全部窗体
closeAll: function () {
@@ -1257,6 +1265,7 @@ var table = {
check: {
enable: false, // 置 zTree 的节点上是否显示 checkbox / radio
nocheckInherit: true, // 设置子节点是否自动继承
+ chkboxType: { "Y": "ps", "N": "ps" } // 父子节点的关联关系
},
data: {
key: {
@@ -1481,7 +1490,7 @@ var table = {
flag = false;
return '';
}
- return arg;
+ return arg == null ? '' : arg;
});
return flag ? str : '';
},
diff --git a/ruoyi-admin/src/main/resources/templates/demo/form/tabs_panels.html b/ruoyi-admin/src/main/resources/templates/demo/form/tabs_panels.html
index 7e52e1986..d8cdf2a31 100644
--- a/ruoyi-admin/src/main/resources/templates/demo/form/tabs_panels.html
+++ b/ruoyi-admin/src/main/resources/templates/demo/form/tabs_panels.html
@@ -334,7 +334,7 @@
超大屏幕
-
Bootstrap 支持的另一个特性,超大屏幕(Jumbotron)。顾名思义该组件可以增加标题的大小,并为登陆页面内容添加更多的外边距(margin)。使用超大屏幕(Jumbotron)的步骤如下:
+
Bootstrap 支持的另一个特性,超大屏幕(Jumbotron)。顾名思义该组件可以增加标题的大小,并为登录页面内容添加更多的外边距(margin)。使用超大屏幕(Jumbotron)的步骤如下:
创建一个带有 class .jumbotron. 的容器
diff --git a/ruoyi-admin/src/main/resources/templates/demo/form/upload.html b/ruoyi-admin/src/main/resources/templates/demo/form/upload.html
index 2188a213c..4292d2329 100644
--- a/ruoyi-admin/src/main/resources/templates/demo/form/upload.html
+++ b/ruoyi-admin/src/main/resources/templates/demo/form/upload.html
@@ -49,6 +49,14 @@
"/img/profile.jpg"
]
});
+
+ $("#fileinput-demo-1").on("fileuploaded", function(event, data, proviewId, index) {
+ console.info(event);
+ console.info(data);
+ console.info(proviewId);
+ console.info(index);
+ });
+
});
-
-
-
-
-
-
-
基础表单向导
-
-
-
- 这是一个简单的表单向导示例
-
-
-
第一步
-
+
+
+
+
+
+
+ 表单向导
+ https://github.com/techlab/jquery-smartwizard
+
+
+
+
+
+
+ 选择样式:
+
+ Default
+ Arrows
+ Dots
+ Progress
+
+
+
+
+
+
+
-
第二步
-
+
+
+
+
+
+
+
+
+
1、如果需要工具栏在页面底部显示, 将style中下面的部分取消注释
.sw>.toolbar-bottom
+
2、如果设置了自动调节高度为false, 将style中下面的部分取消注释
.sw>.tab-content
+
3、工具栏的按钮样式会被表单插件中.btn样式覆盖导致bootstrap中的按钮样式无效, 如果需要改变按钮样式可以自己定义并提高优先级
+
+
+
+
+
测试多行显示
+
+$('#smartwizard').smartWizard({
+ selected: 0, // Initial selected step, 0 = first step
+ theme: 'default', // theme for the wizard, related css need to include for other than default theme
+ justified: true, // Nav menu justification. true/false
+ darkMode:false, // Enable/disable Dark Mode if the theme supports. true/false
+ autoAdjustHeight: true, // Automatically adjust content height
+ cycleSteps: false, // Allows to cycle the navigation of steps
+ backButtonSupport: true, // Enable the back button support
+ enableURLhash: true, // Enable selection of the step based on url hash
+ transition: {
+ animation: 'none', // Effect on navigation, none/fade/slide-horizontal/slide-vertical/slide-swing
+ speed: '400', // Transion animation speed
+ easing:'' // Transition animation easing. Not supported without a jQuery easing plugin
+ },
+ toolbarSettings: {
+ toolbarPosition: 'bottom', // none, top, bottom, both
+ toolbarButtonPosition: 'right', // left, right, center
+ showNextButton: true, // show/hide a Next button
+ showPreviousButton: true, // show/hide a Previous button
+ toolbarExtraButtons: [] // Extra buttons to show on toolbar, array of jQuery input/buttons elements
+ },
+ anchorSettings: {
+ anchorClickable: true, // Enable/Disable anchor navigation
+ enableAllAnchors: false, // Activates all anchors clickable all times
+ markDoneStep: true, // Add done state on navigation
+ markAllPreviousStepsAsDone: true, // When a step selected by url hash, all previous steps are marked done
+ removeDoneStepOnNavigateBack: false, // While navigate back done step after active step will be cleared
+ enableAnchorOnDoneStep: true // Enable/Disable the done steps navigation
+ },
+ keyboardSettings: {
+ keyNavigation: true, // Enable/Disable keyboard navigation(left and right keys are used if enabled)
+ keyLeft: [37], // Left key code
+ keyRight: [39] // Right key code
+ },
+ lang: { // Language variables for button
+ next: 'Next',
+ previous: 'Previous'
+ },
+ disabledSteps: [], // Array Steps disabled
+ errorSteps: [], // Highlight step with errors
+ hiddenSteps: [] // Hidden steps
+});
+
+
+
+
+
+
+
+
-
第三步
-
-
+
+
+
+
+
diff --git a/ruoyi-admin/src/main/resources/templates/demo/form/wizard.html b/ruoyi-admin/src/main/resources/templates/demo/form/wizard.html
index 428f330ec..ffcdde1fc 100644
--- a/ruoyi-admin/src/main/resources/templates/demo/form/wizard.html
+++ b/ruoyi-admin/src/main/resources/templates/demo/form/wizard.html
@@ -1,192 +1,332 @@