From d863f93d10ed33ac3cc2c31d9623642ef4520cab Mon Sep 17 00:00:00 2001 From: Karson Date: Thu, 8 Mar 2018 14:44:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=91=BD=E4=BB=A4=E8=A1=8C?= =?UTF-8?q?=E4=B8=80=E9=94=AE=E7=94=9F=E6=88=90API=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=20=E6=96=B0=E5=A2=9E=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E7=BB=91=E5=AE=9A=E4=BA=8C=E7=BA=A7=E5=9F=9F=E5=90=8D=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=20=E6=96=B0=E5=A2=9E=E5=8A=A0=E8=BD=BDJS=E5=85=AC?= =?UTF-8?q?=E7=94=A8=E6=A8=A1=E5=9D=97=20=E6=96=B0=E5=A2=9E=E5=91=BD?= =?UTF-8?q?=E4=BB=A4=E8=A1=8C=E5=88=9B=E5=BB=BA=E6=8F=92=E4=BB=B6=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E7=94=9F=E6=88=90=E8=8F=9C=E5=8D=95=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=20=E6=96=B0=E5=A2=9E=E5=90=8E=E5=8F=B0=E8=8F=9C=E5=8D=95Fast.a?= =?UTF-8?q?pi.refreshmenu=20=E6=96=B0=E5=A2=9E=E5=90=8E=E5=8F=B0=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E5=9C=A8=E6=95=B0=E6=8D=AE=E5=8F=98=E6=9B=B4=E5=90=8E?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=88=B7=E6=96=B0=E7=9A=84=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=20=E6=96=B0=E5=A2=9Erequire.min.js=E5=8E=8B=E7=BC=A9=E7=89=88?= =?UTF-8?q?=20=E6=96=B0=E5=A2=9E=E4=BB=8EHeaders=E4=B8=AD=E8=AF=BB?= =?UTF-8?q?=E5=8F=96=E6=8E=88=E6=9D=83token=E7=9A=84=E5=8A=9F=E8=83=BD=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9EForm.events.daterangepicker=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E5=8C=BA=E5=88=AB=E4=BA=8B=E4=BB=B6=20=E6=96=B0=E5=A2=9EForm?= =?UTF-8?q?=E8=A1=A8=E5=8D=95=E6=8F=90=E7=A4=BA=E6=88=90=E5=8A=9F=E5=92=8C?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E7=9A=84=E5=9B=9E=E8=B0=83=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=20=E6=96=B0=E5=A2=9EFast.api.getrowbyid=E5=92=8CFast.api.getro?= =?UTF-8?q?wbyindex=E6=96=B9=E6=B3=95=20=E6=96=B0=E5=A2=9Ecommonsearch?= =?UTF-8?q?=E7=9A=84find=5Fin=5Fset=E7=B1=BB=E5=9E=8B=E6=90=9C=E7=B4=A2=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9EMenu::export=E7=9A=84=E6=96=B9=E6=B3=95=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9Ephp=20think=20api=E4=B8=80=E9=94=AE=E7=94=9F?= =?UTF-8?q?=E6=88=90API=E6=96=87=E6=A1=A3=E5=8A=9F=E8=83=BD=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9Ephp=20think=20min=E7=9A=84=E5=8E=8B=E7=BC=A9=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E5=92=8C=E8=B0=83=E8=AF=95=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 优化API模块生产环境下错误信息的显示 优化移动端显示移除顶部Logo一行 优化bower.json和composer.json的版本依赖 优化插件管理列表显示 优化后台控制区多作的选项卡数据 优化CRUD生成的复选框样式及文字 优化规则管理的列表显示 优化第三方前端资源,移除冗余资源 修复在启用域名部署下的BUG 修复API初始化接口的BUG 修复会员积分日志模型BUG 修复多语言切换不存在的BUG 修复Backend.php中multi操作不触发模型事件的BUG --- .bowerrc | 8 +- README.md | 4 +- application/admin/command/Addon.php | 69 +- .../admin/command/Addon/stubs/addon.stub | 5 + .../admin/command/Addon/stubs/controller.stub | 15 + .../admin/command/Addon/stubs/info.stub | 2 +- application/admin/command/Api.php | 178 + application/admin/command/Api/lang/zh-cn.php | 21 + .../admin/command/Api/library/Builder.php | 216 + .../admin/command/Api/library/Extractor.php | 549 +++ .../admin/command/Api/template/index.html | 460 ++ application/admin/command/Crud.php | 9 +- application/admin/command/Install.php | 2 + .../admin/command/Install/fastadmin.sql | 52 +- application/admin/command/Menu.php | 1 - application/admin/command/Min.php | 15 +- application/admin/command/Min/stubs/css.stub | 3 +- application/admin/command/Min/stubs/js.stub | 3 +- application/admin/controller/Addon.php | 8 +- application/admin/controller/Index.php | 12 +- application/admin/lang/zh-cn/auth/rule.php | 2 +- application/admin/lang/zh-cn/user/user.php | 2 + application/admin/library/Auth.php | 8 +- application/admin/library/traits/Backend.php | 3 +- application/admin/model/AuthRule.php | 9 + application/admin/view/addon/index.html | 14 +- application/admin/view/auth/rule/add.html | 2 +- application/admin/view/auth/rule/index.html | 15 +- application/admin/view/category/index.html | 2 +- application/admin/view/common/control.html | 142 +- application/admin/view/common/header.html | 2 +- application/admin/view/common/menu.html | 8 +- application/admin/view/common/script.html | 2 +- application/admin/view/user/rule/index.html | 2 +- application/api/config.php | 3 +- application/api/controller/Common.php | 4 +- application/api/library/ExceptionHandle.php | 40 + application/command.php | 1 + application/common.php | 39 +- application/common/behavior/Common.php | 5 + application/common/controller/Api.php | 39 +- application/common/controller/Backend.php | 21 +- application/common/controller/Frontend.php | 3 +- application/common/lang/zh-cn/addon.php | 103 +- application/common/library/Menu.php | 28 +- application/{api => common}/model/Area.php | 2 +- application/common/model/ScoreLog.php | 2 +- application/common/model/Version.php | 54 + application/config.php | 2 +- application/index/lang/zh-cn.php | 2 +- application/index/view/common/script.html | 2 +- application/index/view/index/index.html | 2 - bower.json | 24 +- composer.json | 4 +- public/api.html | 2878 ++++++++++++ public/assets/css/backend.css | 28 +- public/assets/css/backend.min.css | 2 +- public/assets/css/frontend.css | 10 +- public/assets/css/frontend.min.css | 2 +- public/assets/js/backend-init.js | 3 + public/assets/js/backend.js | 3 + public/assets/js/backend/addon.js | 339 +- public/assets/js/backend/auth/rule.js | 28 +- public/assets/js/backend/index.js | 78 +- public/assets/js/backend/user/rule.js | 2 +- .../assets/js/bootstrap-table-commonsearch.js | 2 +- public/assets/js/bootstrap-table-template.js | 1 + public/assets/js/fast.js | 3 +- public/assets/js/frontend-init.js | 3 + public/assets/js/require-backend.js | 19 +- public/assets/js/require-backend.min.js | 4171 ++++++----------- public/assets/js/require-form.js | 66 +- public/assets/js/require-frontend.js | 17 +- public/assets/js/require-frontend.min.js | 1330 +----- public/assets/js/require-table.js | 70 +- public/assets/js/require.min.js | 2 + public/assets/less/backend.less | 25 +- public/assets/less/frontend.less | 11 +- 78 files changed, 6601 insertions(+), 4717 deletions(-) create mode 100644 application/admin/command/Addon/stubs/controller.stub create mode 100644 application/admin/command/Api.php create mode 100644 application/admin/command/Api/lang/zh-cn.php create mode 100644 application/admin/command/Api/library/Builder.php create mode 100644 application/admin/command/Api/library/Extractor.php create mode 100644 application/admin/command/Api/template/index.html create mode 100644 application/api/library/ExceptionHandle.php rename application/{api => common}/model/Area.php (95%) create mode 100644 application/common/model/Version.php create mode 100644 public/api.html create mode 100644 public/assets/js/backend-init.js create mode 100644 public/assets/js/frontend-init.js create mode 100644 public/assets/js/require.min.js diff --git a/.bowerrc b/.bowerrc index d25737ea..d4c450c7 100644 --- a/.bowerrc +++ b/.bowerrc @@ -1,3 +1,9 @@ { - "directory" : "public/assets/libs" + "directory" : "public/assets/libs", + "ignoredDependencies": [ + "file-saver", + "html2canvas", + "jspdf", + "jspdf-autotable" + ] } \ No newline at end of file diff --git a/README.md b/README.md index 82590623..c28f5b4b 100644 --- a/README.md +++ b/README.md @@ -16,10 +16,12 @@ FastAdmin是一款基于ThinkPHP5+Bootstrap的极速后台开发框架。 * 基于`Bower`进行前端组件包管理 * 数据库表一键生成`CRUD`,包括控制器、模型、视图、JS、语言包、菜单等 * 一键压缩打包JS和CSS文件,一键CDN静态资源部署 +* 一键生成API接口文档 * 强大的插件扩展功能,在线安装卸载升级插件 * 共用同一账号体系的Web端会员中心权限验证和API接口会员权限验证 +* 二级域名部署支持,同时域名支持绑定到插件 * 多语言支持,服务端及客户端支持 -* 强大的第三方插件支持(CMS、博客、文档生成) +* 强大的第三方模块支持(CMS、博客、文档生成) * 整合第三方短信接口(阿里云、创蓝短信) * 无缝整合第三方云存储(七牛、阿里云OSS、又拍云)功能 * 第三方登录(QQ、微信、微博)整合 diff --git a/application/admin/command/Addon.php b/application/admin/command/Addon.php index 216ac47e..0231d914 100644 --- a/application/admin/command/Addon.php +++ b/application/admin/command/Addon.php @@ -2,14 +2,17 @@ namespace app\admin\command; +use app\common\library\Menu; use think\addons\AddonException; use think\addons\Service; +use think\Config; use think\console\Command; use think\console\Input; use think\console\input\Option; use think\console\Output; use think\Db; use think\Exception; +use think\exception\PDOException; class Addon extends Command { @@ -63,14 +66,43 @@ class Addon extends Command rmdirs($addonDir); } mkdir($addonDir); + mkdir($addonDir . DS . 'controller'); + $menuList = Menu::export($name); + $createMenu = $this->getCreateMenu($menuList); + $prefix = Config::get('database.prefix'); + $createTableSql = ''; + try + { + $result = Db::query("SHOW CREATE TABLE `" . $prefix . $name . "`;"); + if (isset($result[0]) && isset($result[0]['Create Table'])) + { + $createTableSql = $result[0]['Create Table']; + } + } + catch (PDOException $e) + { + + } + $data = [ - 'name' => $name, - 'addon' => $name, - 'addonClassName' => ucfirst($name) + 'name' => $name, + 'addon' => $name, + 'addonClassName' => ucfirst($name), + 'addonInstallMenu' => $createMenu ? "\$menu = " . var_export_short($createMenu, "\t") . ";\n\tMenu::create(\$menu);" : '', + 'addonUninstallMenu' => $menuList ? 'Menu::delete("' . $name . '");' : '', + 'addonEnableMenu' => $menuList ? 'Menu::enable("' . $name . '");' : '', + 'addonDisableMenu' => $menuList ? 'Menu::disable("' . $name . '");' : '', ]; $this->writeToFile("addon", $data, $addonDir . ucfirst($name) . '.php'); $this->writeToFile("config", $data, $addonDir . 'config.php'); $this->writeToFile("info", $data, $addonDir . 'info.ini'); + $this->writeToFile("controller", $data, $addonDir . 'controller' . DS . 'Index.php'); + if ($createTableSql) + { + $createTableSql = str_replace("`" . $prefix, '`__PREFIX__', $createTableSql); + file_put_contents($addonDir . 'install.sql', $createTableSql); + } + $output->info("Create Successed!"); break; case 'disable': @@ -256,6 +288,37 @@ class Addon extends Command } } + /** + * 获取创建菜单的数组 + * @param array $menu + * @return array + */ + protected function getCreateMenu($menu) + { + $result = []; + foreach ($menu as $k => & $v) + { + $arr = [ + 'name' => $v['name'], + 'title' => $v['title'], + ]; + if ($v['icon'] != 'fa fa-circle-o') + { + $arr['icon'] = $v['icon']; + } + if ($v['ismenu']) + { + $arr['ismenu'] = $v['ismenu']; + } + if (isset($v['childlist']) && $v['childlist']) + { + $arr['sublist'] = $this->getCreateMenu($v['childlist']); + } + $result[] = $arr; + } + return $result; + } + /** * 写入到文件 * @param string $name diff --git a/application/admin/command/Addon/stubs/addon.stub b/application/admin/command/Addon/stubs/addon.stub index eb5e4b0c..824e02c1 100644 --- a/application/admin/command/Addon/stubs/addon.stub +++ b/application/admin/command/Addon/stubs/addon.stub @@ -2,6 +2,7 @@ namespace addons\{%name%}; +use app\common\library\Menu; use think\Addons; /** @@ -16,6 +17,7 @@ class {%addonClassName%} extends Addons */ public function install() { + {%addonInstallMenu%} return true; } @@ -25,6 +27,7 @@ class {%addonClassName%} extends Addons */ public function uninstall() { + {%addonUninstallMenu%} return true; } @@ -34,6 +37,7 @@ class {%addonClassName%} extends Addons */ public function enable() { + {%addonEnableMenu%} return true; } @@ -43,6 +47,7 @@ class {%addonClassName%} extends Addons */ public function disable() { + {%addonDisableMenu%} return true; } diff --git a/application/admin/command/Addon/stubs/controller.stub b/application/admin/command/Addon/stubs/controller.stub new file mode 100644 index 00000000..d79476f2 --- /dev/null +++ b/application/admin/command/Addon/stubs/controller.stub @@ -0,0 +1,15 @@ +error("当前插件暂无前台页面"); + } + +} diff --git a/application/admin/command/Addon/stubs/info.stub b/application/admin/command/Addon/stubs/info.stub index 599bf2a5..d01e0cb5 100644 --- a/application/admin/command/Addon/stubs/info.stub +++ b/application/admin/command/Addon/stubs/info.stub @@ -1,5 +1,5 @@ name = {%name%} -title = 插件名称 +title = 插件名称({%name%}) intro = FastAdmin插件 author = yourname website = http://www.fastadmin.net diff --git a/application/admin/command/Api.php b/application/admin/command/Api.php new file mode 100644 index 00000000..28885148 --- /dev/null +++ b/application/admin/command/Api.php @@ -0,0 +1,178 @@ +setName('api') + ->addOption('url', 'u', Option::VALUE_OPTIONAL, 'default api url', '') + ->addOption('module', 'm', Option::VALUE_OPTIONAL, 'module name(admin/index/api)', 'api') + ->addOption('output', 'o', Option::VALUE_OPTIONAL, 'output index file name', 'api.html') + ->addOption('template', 'e', Option::VALUE_OPTIONAL, '', 'index.html') + ->addOption('force', 'f', Option::VALUE_OPTIONAL, 'force override general file', false) + ->addOption('title', 't', Option::VALUE_OPTIONAL, 'document title', $site['name']) + ->addOption('author', 'a', Option::VALUE_OPTIONAL, 'document author', $site['name']) + ->addOption('class', 'c', Option::VALUE_OPTIONAL | Option::VALUE_IS_ARRAY, 'extend class', null) + ->addOption('language', 'l', Option::VALUE_OPTIONAL, 'language', 'zh-cn') + ->setDescription('Compress js and css file'); + } + + protected function execute(Input $input, Output $output) + { + $apiDir = __DIR__ . DS . 'Api' . DS; + + $force = $input->getOption('force'); + $url = $input->getOption('url'); + $language = $input->getOption('language'); + $langFile = $apiDir . 'lang' . DS . $language . '.php'; + if (!is_file($langFile)) + { + throw new Exception('language file not found'); + } + $lang = include $langFile; + // 目标目录 + $output_dir = ROOT_PATH . 'public' . DS; + $output_file = $output_dir . $input->getOption('output'); + if (is_file($output_file) && !$force) + { + throw new Exception("api index file already exists!\nIf you need to rebuild again, use the parameter --force=true "); + } + // 模板文件 + $template_dir = $apiDir . 'template' . DS; + $template_file = $template_dir . $input->getOption('template'); + if (!is_file($template_file)) + { + throw new Exception('template file not found'); + } + // 额外的类 + $classes = $input->getOption('class'); + // 标题 + $title = $input->getOption('title'); + // 作者 + $author = $input->getOption('author'); + // 模块 + $module = $input->getOption('module'); + + $moduleDir = APP_PATH . $module . DS; + if (!is_dir($moduleDir)) + { + throw new Exception('module not found'); + } + $controllerDir = $moduleDir . Config::get('url_controller_layer') . DS; + $files = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($controllerDir), \RecursiveIteratorIterator::LEAVES_ONLY + ); + + foreach ($files as $name => $file) + { + if (!$file->isDir()) + { + $filePath = $file->getRealPath(); + $classes[] = $this->get_class_from_file($filePath); + } + } + + $config = [ + 'title' => $title, + 'author' => $author, + 'description' => '', + 'apiurl' => $url, + ]; + $builder = new Builder($classes); + $content = $builder->render($template_file, ['config' => $config, 'lang' => $lang]); + + if (!file_put_contents($output_file, $content)) + { + throw new Exception('Cannot save the content to ' . $output_file); + } + $output->info("Build Successed!"); + } + + /** + * get full qualified class name + * + * @param string $path_to_file + * @author JBYRNE http://jarretbyrne.com/2015/06/197/ + * @return string + */ + protected function get_class_from_file($path_to_file) + { + //Grab the contents of the file + $contents = file_get_contents($path_to_file); + + //Start with a blank namespace and class + $namespace = $class = ""; + + //Set helper values to know that we have found the namespace/class token and need to collect the string values after them + $getting_namespace = $getting_class = false; + + //Go through each token and evaluate it as necessary + foreach (token_get_all($contents) as $token) + { + + //If this token is the namespace declaring, then flag that the next tokens will be the namespace name + if (is_array($token) && $token[0] == T_NAMESPACE) + { + $getting_namespace = true; + } + + //If this token is the class declaring, then flag that the next tokens will be the class name + if (is_array($token) && $token[0] == T_CLASS) + { + $getting_class = true; + } + + //While we're grabbing the namespace name... + if ($getting_namespace === true) + { + + //If the token is a string or the namespace separator... + if (is_array($token) && in_array($token[0], [T_STRING, T_NS_SEPARATOR])) + { + + //Append the token's value to the name of the namespace + $namespace .= $token[1]; + } + else if ($token === ';') + { + + //If the token is the semicolon, then we're done with the namespace declaration + $getting_namespace = false; + } + } + + //While we're grabbing the class name... + if ($getting_class === true) + { + + //If the token is a string, it's the name of the class + if (is_array($token) && $token[0] == T_STRING) + { + + //Store the token's value as the class name + $class = $token[1]; + + //Got what we need, stope here + break; + } + } + } + + //Build the fully-qualified class name and return it + return $namespace ? $namespace . '\\' . $class : $class; + } + +} diff --git a/application/admin/command/Api/lang/zh-cn.php b/application/admin/command/Api/lang/zh-cn.php new file mode 100644 index 00000000..3bec9919 --- /dev/null +++ b/application/admin/command/Api/lang/zh-cn.php @@ -0,0 +1,21 @@ + '基础信息', + 'Sandbox' => '在线测试', + 'Sampleoutput' => '返回示例', + 'Headers' => 'Headers', + 'Parameters' => '参数', + 'Body' => '正文', + 'Name' => '名称', + 'Type' => '类型', + 'Required' => '必选', + 'Description' => '描述', + 'Send' => '提交', + 'Tokentips' => 'Token在会员注册或登录后都会返回,WEB端同时存在于Cookie中', + 'Apiurltips' => 'API接口URL', + 'Savetips' => '点击保存后Token和Api url都将保存在本地Localstorage中', + 'ReturnHeaders' => '响应头', + 'ReturnParameters' => '返回参数', + 'Response' => '响应输出', +]; diff --git a/application/admin/command/Api/library/Builder.php b/application/admin/command/Api/library/Builder.php new file mode 100644 index 00000000..6769a913 --- /dev/null +++ b/application/admin/command/Api/library/Builder.php @@ -0,0 +1,216 @@ + + * @author Karson + */ +class Builder +{ + + /** + * + * @var \think\View + */ + public $view = null; + + /** + * parse classes + * @var array + */ + protected $classes = []; + + /** + * + * @param array $classes + */ + public function __construct($classes = []) + { + $this->classes = array_merge($this->classes, $classes); + $this->view = \think\View::instance(Config::get('template'), Config::get('view_replace_str')); + } + + protected function extractAnnotations() + { + $st_output = []; + foreach ($this->classes as $class) + { + $st_output[] = Extractor::getAllClassAnnotations($class); + } + return end($st_output); + } + + protected function generateHeadersTemplate($docs) + { + if (!isset($docs['ApiHeaders'])) + { + return []; + } + + $headerslist = array(); + foreach ($docs['ApiHeaders'] as $params) + { + $tr = array( + 'name' => $params['name'], + 'type' => $params['type'], + 'sample' => isset($params['sample']) ? $params['sample'] : '', + 'required' => isset($params['required']) ? $params['required'] : false, + 'description' => isset($params['description']) ? $params['description'] : '', + ); + $headerslist[] = $tr; + } + + return $headerslist; + } + + protected function generateParamsTemplate($docs) + { + if (!isset($docs['ApiParams'])) + { + return []; + } + + $paramslist = array(); + foreach ($docs['ApiParams'] as $params) + { + $tr = array( + 'name' => $params['name'], + 'type' => isset($params['type']) ? $params['type'] : 'string', + 'sample' => isset($params['sample']) ? $params['sample'] : '', + 'required' => isset($params['required']) ? $params['required'] : true, + 'description' => isset($params['description']) ? $params['description'] : '', + ); + $paramslist[] = $tr; + } + + return $paramslist; + } + + protected function generateReturnHeadersTemplate($docs) + { + if (!isset($docs['ApiReturnHeaders'])) + { + return []; + } + + $headerslist = array(); + foreach ($docs['ApiReturnHeaders'] as $params) + { + $tr = array( + 'name' => $params['name'], + 'type' => 'string', + 'sample' => isset($params['sample']) ? $params['sample'] : '', + 'required' => isset($params['required']) && $params['required'] ? 'Yes' : 'No', + 'description' => isset($params['description']) ? $params['description'] : '', + ); + $headerslist[] = $tr; + } + + return $headerslist; + } + + protected function generateReturnParamsTemplate($st_params) + { + if (!isset($st_params['ApiReturnParams'])) + { + return []; + } + + $paramslist = array(); + foreach ($st_params['ApiReturnParams'] as $params) + { + $tr = array( + 'name' => $params['name'], + 'type' => isset($params['type']) ? $params['type'] : 'string', + 'sample' => isset($params['sample']) ? $params['sample'] : '', + 'description' => isset($params['description']) ? $params['description'] : '', + ); + $paramslist[] = $tr; + } + + return $paramslist; + } + + protected function generateBadgeForMethod($data) + { + $method = strtoupper(is_array($data['ApiMethod'][0]) ? $data['ApiMethod'][0]['data'] : $data['ApiMethod'][0]); + $labes = array( + 'POST' => 'label-primary', + 'GET' => 'label-success', + 'PUT' => 'label-warning', + 'DELETE' => 'label-danger', + 'PATCH' => 'label-default', + 'OPTIONS' => 'label-info' + ); + + return isset($labes[$method]) ? $labes[$method] : $labes['GET']; + } + + public function parse() + { + $annotations = $this->extractAnnotations(); + + $counter = 0; + $section = null; + $docslist = []; + foreach ($annotations as $class => $methods) + { + foreach ($methods as $name => $docs) + { + if (isset($docs['ApiSector'][0])) + { + $section = is_array($docs['ApiSector'][0]) ? $docs['ApiSector'][0]['data'] : $docs['ApiSector'][0]; + } + else + { + $section = $class; + } + if (0 === count($docs)) + { + continue; + } + + $docslist[$section][] = [ + 'id' => $counter, + 'method' => is_array($docs['ApiMethod'][0]) ? $docs['ApiMethod'][0]['data'] : $docs['ApiMethod'][0], + 'method_label' => $this->generateBadgeForMethod($docs), + 'section' => $section, + 'route' => is_array($docs['ApiRoute'][0]) ? $docs['ApiRoute'][0]['data'] : $docs['ApiRoute'][0], + 'summary' => is_array($docs['ApiSummary'][0]) ? $docs['ApiSummary'][0]['data'] : $docs['ApiSummary'][0], + 'body' => isset($docs['ApiBody'][0]) ? is_array($docs['ApiBody'][0]) ? $docs['ApiBody'][0]['data'] : $docs['ApiBody'][0] : '', + 'headerslist' => $this->generateHeadersTemplate($docs), + 'paramslist' => $this->generateParamsTemplate($docs), + 'returnheaderslist' => $this->generateReturnHeadersTemplate($docs), + 'returnparamslist' => $this->generateReturnParamsTemplate($docs), + 'return' => isset($docs['ApiReturn']) ? is_array($docs['ApiReturn'][0]) ? $docs['ApiReturn'][0]['data'] : $docs['ApiReturn'][0] : '', + ]; + $counter++; + } + } + + return $docslist; + } + + public function getView() + { + return $this->view; + } + + /** + * 渲染 + * @param string $template + * @param array $vars + * @return string + */ + public function render($template, $vars = []) + { + $docslist = $this->parse(); + + return $this->view->display(file_get_contents($template), array_merge($vars, ['docslist' => $docslist])); + } + +} diff --git a/application/admin/command/Api/library/Extractor.php b/application/admin/command/Api/library/Extractor.php new file mode 100644 index 00000000..bf16eb00 --- /dev/null +++ b/application/admin/command/Api/library/Extractor.php @@ -0,0 +1,549 @@ + + */ +class Extractor +{ + + /** + * Static array to store already parsed annotations + * @var array + */ + private static $annotationCache; + + /** + * Indicates that annotations should has strict behavior, 'false' by default + * @var boolean + */ + private $strict = false; + + /** + * Stores the default namespace for Objects instance, usually used on methods like getMethodAnnotationsObjects() + * @var string + */ + public $defaultNamespace = ''; + + /** + * Sets strict variable to true/false + * @param bool $value boolean value to indicate that annotations to has strict behavior + */ + public function setStrict($value) + { + $this->strict = (bool) $value; + } + + /** + * Sets default namespace to use in object instantiation + * @param string $namespace default namespace + */ + public function setDefaultNamespace($namespace) + { + $this->defaultNamespace = $namespace; + } + + /** + * Gets default namespace used in object instantiation + * @return string $namespace default namespace + */ + public function getDefaultAnnotationNamespace() + { + return $this->defaultNamespace; + } + + /** + * Gets all anotations with pattern @SomeAnnotation() from a given class + * + * @param string $className class name to get annotations + * @return array self::$annotationCache all annotated elements + */ + public static function getClassAnnotations($className) + { + if (!isset(self::$annotationCache[$className])) + { + $class = new \ReflectionClass($className); + self::$annotationCache[$className] = self::parseAnnotations($class->getDocComment()); + } + + return self::$annotationCache[$className]; + } + + public static function getAllClassAnnotations($className) + { + $class = new \ReflectionClass($className); + + foreach ($class->getMethods() as $object) + { + self::$annotationCache['annotations'][$className][$object->name] = self::getMethodAnnotations($className, $object->name); + } + + return self::$annotationCache['annotations']; + } + + /** + * Gets all anotations with pattern @SomeAnnotation() from a determinated method of a given class + * + * @param string $className class name + * @param string $methodName method name to get annotations + * @return array self::$annotationCache all annotated elements of a method given + */ + public static function getMethodAnnotations($className, $methodName) + { + if (!isset(self::$annotationCache[$className . '::' . $methodName])) + { + try + { + $method = new \ReflectionMethod($className, $methodName); + $class = new \ReflectionClass($className); + if (!$method->isPublic() || $method->isConstructor()) + { + $annotations = array(); + } + else + { + $annotations = self::consolidateAnnotations($method, $class); + } + } + catch (\ReflectionException $e) + { + $annotations = array(); + } + + self::$annotationCache[$className . '::' . $methodName] = $annotations; + } + + return self::$annotationCache[$className . '::' . $methodName]; + } + + /** + * Gets all anotations with pattern @SomeAnnotation() from a determinated method of a given class + * and instance its abcAnnotation class + * + * @param string $className class name + * @param string $methodName method name to get annotations + * @return array self::$annotationCache all annotated objects of a method given + */ + public function getMethodAnnotationsObjects($className, $methodName) + { + $annotations = $this->getMethodAnnotations($className, $methodName); + $objects = array(); + + $i = 0; + + foreach ($annotations as $annotationClass => $listParams) + { + $annotationClass = ucfirst($annotationClass); + $class = $this->defaultNamespace . $annotationClass . 'Annotation'; + + // verify is the annotation class exists, depending if Annotations::strict is true + // if not, just skip the annotation instance creation. + if (!class_exists($class)) + { + if ($this->strict) + { + throw new Exception(sprintf('Runtime Error: Annotation Class Not Found: %s', $class)); + } + else + { + // silent skip & continue + continue; + } + } + + if (empty($objects[$annotationClass])) + { + $objects[$annotationClass] = new $class(); + } + + foreach ($listParams as $params) + { + if (is_array($params)) + { + foreach ($params as $key => $value) + { + $objects[$annotationClass]->set($key, $value); + } + } + else + { + $objects[$annotationClass]->set($i++, $params); + } + } + } + + return $objects; + } + + private static function consolidateAnnotations($method, $class) + { + $dockblockClass = $class->getDocComment(); + $docblockMethod = $method->getDocComment(); + $methodName = $method->getName(); + + $methodAnnotations = self::parseAnnotations($docblockMethod); + $classAnnotations = self::parseAnnotations($dockblockClass); + if (isset($methodAnnotations['ApiInternal']) || $methodName == '_initialize' || $methodName == '_empty') + { + return []; + } + + $properties = $class->getDefaultProperties(); + $noNeedLogin = isset($properties['noNeedLogin']) ? is_array($properties['noNeedLogin']) ? $properties['noNeedLogin'] : [$properties['noNeedLogin']] : []; + $noNeedRight = isset($properties['noNeedRight']) ? is_array($properties['noNeedRight']) ? $properties['noNeedRight'] : [$properties['noNeedRight']] : []; + + preg_match_all("/\*[\s]+(.*)(\\r\\n|\\r|\\n)/U", str_replace('/**', '', $docblockMethod), $methodArr); + preg_match_all("/\*[\s]+(.*)(\\r\\n|\\r|\\n)/U", str_replace('/**', '', $dockblockClass), $classArr); + + $methodTitle = isset($methodArr[1]) && isset($methodArr[1][0]) ? $methodArr[1][0] : ''; + $classTitle = isset($classArr[1]) && isset($classArr[1][0]) ? $classArr[1][0] : ''; + + if (!isset($methodAnnotations['ApiMethod'])) + { + $methodAnnotations['ApiMethod'] = ['get']; + } + if (!isset($methodAnnotations['ApiSummary'])) + { + $methodAnnotations['ApiSummary'] = [$methodTitle]; + } + + if ($methodAnnotations) + { + foreach ($classAnnotations as $name => $valueClass) + { + if (count($valueClass) !== 1) + { + continue; + } + + if ($name === 'ApiRoute') + { + if (isset($methodAnnotations[$name])) + { + $methodAnnotations[$name] = [rtrim($valueClass[0], '/') . $methodAnnotations[$name][0]]; + } + else + { + $methodAnnotations[$name] = [rtrim($valueClass[0], '/') . '/' . $method->getName()]; + } + } + + if ($name === 'ApiSector') + { + $methodAnnotations[$name] = $valueClass; + } + } + } + if (!isset($methodAnnotations['ApiTitle'])) + { + $methodAnnotations['ApiTitle'] = [$methodTitle]; + } + if (!isset($methodAnnotations['ApiRoute'])) + { + $urlArr = []; + $className = $class->getName(); + + list($prefix, $suffix) = explode('\\' . \think\Config::get('url_controller_layer') . '\\', $className); + $prefixArr = explode('\\', $prefix); + $suffixArr = explode('\\', $suffix); + if ($prefixArr[0] == \think\Config::get('app_namespace')) + { + $prefixArr[0] = ''; + } + $urlArr = array_merge($urlArr, $prefixArr); + $urlArr[] = implode('.', array_map(function($item) { + return \think\Loader::parseName($item); + }, $suffixArr)); + $urlArr[] = $method->getName(); + $methodAnnotations['ApiRoute'] = [implode('/', $urlArr)]; + } + if (!isset($methodAnnotations['ApiSector'])) + { + $methodAnnotations['ApiSector'] = isset($classAnnotations['ApiSector']) ? $classAnnotations['ApiSector'] : [$classTitle]; + } + if (!isset($methodAnnotations['ApiParams'])) + { + $params = self::parseCustomAnnotations($docblockMethod, 'param'); + foreach ($params as $k => $v) + { + $arr = explode(' ', preg_replace("/[\s]+/", " ", $v)); + $methodAnnotations['ApiParams'][] = [ + 'name' => isset($arr[1]) ? str_replace('$', '', $arr[1]) : '', + 'nullable' => false, + 'type' => isset($arr[0]) ? $arr[0] : 'string', + 'description' => isset($arr[2]) ? $arr[2] : '' + ]; + } + } + $methodAnnotations['ApiPermissionLogin'] = [!in_array('*', $noNeedLogin) && !in_array($methodName, $noNeedLogin)]; + $methodAnnotations['ApiPermissionRight'] = [!in_array('*', $noNeedRight) && !in_array($methodName, $noNeedRight)]; + return $methodAnnotations; + } + + /** + * Parse annotations + * + * @param string $docblock + * @param string $name + * @return array parsed annotations params + */ + private static function parseCustomAnnotations($docblock, $name = 'param') + { + $annotations = array(); + + $docblock = substr($docblock, 3, -2); + if (preg_match_all('/@' . $name . '(?:\s*(?:\(\s*)?(.*?)(?:\s*\))?)??\s*(?:\n|\*\/)/', $docblock, $matches)) + { + foreach ($matches[1] as $k => $v) + { + $annotations[] = $v; + } + } + return $annotations; + } + + /** + * Parse annotations + * + * @param string $docblock + * @return array parsed annotations params + */ + private static function parseAnnotations($docblock) + { + $annotations = array(); + + // Strip away the docblock header and footer to ease parsing of one line annotations + $docblock = substr($docblock, 3, -2); + if (preg_match_all('/@(?[A-Za-z_-]+)[\s\t]*\((?(?:(?!\)).)*)\)\r?/s', $docblock, $matches)) + { + $numMatches = count($matches[0]); + + for ($i = 0; $i < $numMatches; ++$i) + { + // annotations has arguments + if (isset($matches['args'][$i])) + { + $argsParts = trim($matches['args'][$i]); + $name = $matches['name'][$i]; + $value = self::parseArgs($argsParts); + } + else + { + $value = array(); + } + + $annotations[$name][] = $value; + } + } + + return $annotations; + } + + /** + * Parse individual annotation arguments + * + * @param string $content arguments string + * @return array annotated arguments + */ + private static function parseArgs($content) + { + // Replace initial stars + $content = preg_replace('/^\s*\*/m', '', $content); + + $data = array(); + $len = strlen($content); + $i = 0; + $var = ''; + $val = ''; + $level = 1; + + $prevDelimiter = ''; + $nextDelimiter = ''; + $nextToken = ''; + $composing = false; + $type = 'plain'; + $delimiter = null; + $quoted = false; + $tokens = array('"', '"', '{', '}', ',', '='); + + while ($i <= $len) + { + $prev_c = substr($content, $i - 1, 1); + $c = substr($content, $i++, 1); + + if ($c === '"' && $prev_c !== "\\") + { + $delimiter = $c; + //open delimiter + if (!$composing && empty($prevDelimiter) && empty($nextDelimiter)) + { + $prevDelimiter = $nextDelimiter = $delimiter; + $val = ''; + $composing = true; + $quoted = true; + } + else + { + // close delimiter + if ($c !== $nextDelimiter) + { + throw new Exception(sprintf( + "Parse Error: enclosing error -> expected: [%s], given: [%s]", $nextDelimiter, $c + )); + } + + // validating syntax + if ($i < $len) + { + if (',' !== substr($content, $i, 1) && '\\' !== $prev_c) + { + throw new Exception(sprintf( + "Parse Error: missing comma separator near: ...%s<--", substr($content, ($i - 10), $i) + )); + } + } + + $prevDelimiter = $nextDelimiter = ''; + $composing = false; + $delimiter = null; + } + } + elseif (!$composing && in_array($c, $tokens)) + { + switch ($c) + { + case '=': + $prevDelimiter = $nextDelimiter = ''; + $level = 2; + $composing = false; + $type = 'assoc'; + $quoted = false; + break; + case ',': + $level = 3; + + // If composing flag is true yet, + // it means that the string was not enclosed, so it is parsing error. + if ($composing === true && !empty($prevDelimiter) && !empty($nextDelimiter)) + { + throw new Exception(sprintf( + "Parse Error: enclosing error -> expected: [%s], given: [%s]", $nextDelimiter, $c + )); + } + + $prevDelimiter = $nextDelimiter = ''; + break; + case '{': + $subc = ''; + $subComposing = true; + + while ($i <= $len) + { + $c = substr($content, $i++, 1); + + if (isset($delimiter) && $c === $delimiter) + { + throw new Exception(sprintf( + "Parse Error: Composite variable is not enclosed correctly." + )); + } + + if ($c === '}') + { + $subComposing = false; + break; + } + $subc .= $c; + } + + // if the string is composing yet means that the structure of var. never was enclosed with '}' + if ($subComposing) + { + throw new Exception(sprintf( + "Parse Error: Composite variable is not enclosed correctly. near: ...%s'", $subc + )); + } + + $val = self::parseArgs($subc); + break; + } + } + else + { + if ($level == 1) + { + $var .= $c; + } + elseif ($level == 2) + { + $val .= $c; + } + } + + if ($level === 3 || $i === $len) + { + if ($type == 'plain' && $i === $len) + { + $data = self::castValue($var); + } + else + { + $data[trim($var)] = self::castValue($val, !$quoted); + } + + $level = 1; + $var = $val = ''; + $composing = false; + $quoted = false; + } + } + + return $data; + } + + /** + * Try determinate the original type variable of a string + * + * @param string $val string containing possibles variables that can be cast to bool or int + * @param boolean $trim indicate if the value passed should be trimmed after to try cast + * @return mixed returns the value converted to original type if was possible + */ + private static function castValue($val, $trim = false) + { + if (is_array($val)) + { + foreach ($val as $key => $value) + { + $val[$key] = self::castValue($value); + } + } + elseif (is_string($val)) + { + if ($trim) + { + $val = trim($val); + } + $val = stripslashes($val); + $tmp = strtolower($val); + + if ($tmp === 'false' || $tmp === 'true') + { + $val = $tmp === 'true'; + } + elseif (is_numeric($val)) + { + return $val + 0; + } + + unset($tmp); + } + + return $val; + } + +} diff --git a/application/admin/command/Api/template/index.html b/application/admin/command/Api/template/index.html new file mode 100644 index 00000000..4a433b04 --- /dev/null +++ b/application/admin/command/Api/template/index.html @@ -0,0 +1,460 @@ + + + + + + + + + {$config.title} + + + + + + + +
+
+ {foreach name="docslist" id="docs"} +

{$key}

+
+ {foreach name="docs" id="api" } +
+
+

+ {$api.method|strtoupper} {$api.route} +

+
+
+
+ + + + + +
+ +
+
+ {$api.summary} +
+
+
{$lang.Headers}
+
+ {if $api.headerslist} + + + + + + + + + + + {foreach name="api['headerslist']" id="header"} + + + + + + + {/foreach} + +
{$lang.Name}{$lang.Type}{$lang.Required}{$lang.Description}
{$header.name}{$header.type}{$header.required?'是':'否'}{$header.description}
+ {else /} + 无 + {/if} +
+
+
+
{$lang.Parameters}
+
+ {if $api.paramslist} + + + + + + + + + + + {foreach name="api['paramslist']" id="param"} + + + + + + + {/foreach} + +
{$lang.Name}{$lang.Type}{$lang.Required}{$lang.Description}
{$param.name}{$param.type}{:$param.required?'是':'否'}{$param.description}
+ {else /} + 无 + {/if} +
+
+
+
{$lang.Body}
+
+ {$api.body|default='无'} +
+
+
+ +
+
+
+ {if $api.headerslist} +
+
{$lang.Headers}
+
+
+ {foreach name="api['headerslist']" id="param"} +
+ + +
+ {/foreach} +
+
+
+ {/if} +
+
{$lang.Parameters}
+
+
+ {if $api.paramslist} + {foreach name="api['paramslist']" id="param"} +
+ + +
+ {/foreach} + {else /} +
+ 无 +
+ {/if} +
+ +
+
+
+
+
+
{$lang.Response}
+
+
+
+

+                                                            

+                                                        
+
+
+
+
+
{$lang.ReturnParameters}
+
+ {if $api.returnparamslist} + + + + + + + + + + {foreach name="api['returnparamslist']" id="param"} + + + + + + {/foreach} + +
{$lang.Name}{$lang.Type}{$lang.Description}
{$param.name}{$param.type}{$param.description}
+ {else /} + 无 + {/if} +
+
+
+
+
+ +
+
+
+
{$api.return|default='无'}
+
+
+
+ +
+
+
+
+ {/foreach} + {/foreach} +
+ +
+ + + +
+ + + + + + diff --git a/application/admin/command/Crud.php b/application/admin/command/Crud.php index 5c63cb17..94e3c266 100644 --- a/application/admin/command/Crud.php +++ b/application/admin/command/Crud.php @@ -580,8 +580,8 @@ class Crud extends Command } $formAddElement = $formEditElement = Form::hidden($fieldName, $no, array_merge(['checked' => ''], $attrArr)); $attrArr['id'] = $fieldName . "-switch"; - $formAddElement .= sprintf(Form::label("{$attrArr['id']}", "%s abcdefg"), Form::checkbox($fieldName, $yes, $defaultValue === $yes, $attrArr)); - $formEditElement .= sprintf(Form::label("{$attrArr['id']}", "%s abcdefg"), Form::checkbox($fieldName, $yes, 0, $attrArr)); + $formAddElement .= sprintf(Form::label("{$attrArr['id']}", "%s {:__('Yes')}", ['class'=>'control-label']), Form::checkbox($fieldName, $yes, $defaultValue === $yes, $attrArr)); + $formEditElement .= sprintf(Form::label("{$attrArr['id']}", "%s {:__('Yes')}", ['class'=>'control-label']), Form::checkbox($fieldName, $yes, 0, $attrArr)); $formEditElement = str_replace('type="checkbox"', 'type="checkbox" {in name="' . "\$row.{$field}" . '" value="' . $yes . '"}checked{/in}', $formEditElement); } else if ($inputType == 'citypicker') @@ -963,6 +963,7 @@ EOD; if ($content || !Lang::has($field)) { $itemArr = []; + $content = str_replace(',', ',', $content); if (stripos($content, ':') !== false && stripos($content, ',') && stripos($content, '=') !== false) { list($fieldLang, $item) = explode(':', $content); @@ -997,6 +998,7 @@ EOD; /** * 读取数据和语言数组列表 * @param array $arr + * @param boolean $withTpl * @return array */ protected function getLangArray($arr, $withTpl = TRUE) @@ -1035,6 +1037,7 @@ EOD; protected function getItemArray($item, $field, $comment) { $itemArr = []; + $comment = str_replace(',', ',', $comment); if (stripos($comment, ':') !== false && stripos($comment, ',') && stripos($comment, '=') !== false) { list($fieldLang, $item) = explode(':', $comment); @@ -1255,7 +1258,7 @@ EOD; { $html .= ", operate:'RANGE', addclass:'datetimerange'"; } - else if (in_array($datatype,['float', 'double', 'decimal'])) + else if (in_array($datatype, ['float', 'double', 'decimal'])) { $html .= ", operate:'BETWEEN'"; } diff --git a/application/admin/command/Install.php b/application/admin/command/Install.php index 4fd17c0e..149aefd1 100644 --- a/application/admin/command/Install.php +++ b/application/admin/command/Install.php @@ -80,6 +80,8 @@ class Install extends Command $config = preg_replace_callback("/'(hostname|database|username|password|hostport|prefix)'(\s+)=>(\s+)Env::get\((.*)\)\,/", $callback, $config); // 写入数据库配置 file_put_contents($dbConfigFile, $config); + + \think\Cache::rm('__menu__'); $output->info("Install Successed!"); } diff --git a/application/admin/command/Install/fastadmin.sql b/application/admin/command/Install/fastadmin.sql index b2d8c410..cffeab3a 100755 --- a/application/admin/command/Install/fastadmin.sql +++ b/application/admin/command/Install/fastadmin.sql @@ -4,7 +4,7 @@ 官网: http://www.fastadmin.net 演示: http://demo.fastadmin.net - Date: 2017年09月15日 + Date: 2018年03月07日 */ SET FOREIGN_KEY_CHECKS = 0; @@ -396,6 +396,9 @@ BEGIN; INSERT INTO `fa_test` VALUES (1, 0, 12, '12,13', 'monday', 'hot,index', 'male', 'music,reading', '我是一篇测试文章', '

我是测试内容

', '/assets/img/avatar.png', '/assets/img/avatar.png,/assets/img/qrcode.png', '/assets/img/avatar.png', '关键字', '描述', '广西壮族自治区/百色市/平果县', 0.00, 0, '2017-07-10', '2017-07-10 18:24:45', 2017, '18:24:45', 1499682285, 1499682526, 1499682526, 0, 1, 'normal', '1'); COMMIT; +-- ---------------------------- +-- Table structure for fa_user +-- ---------------------------- DROP TABLE IF EXISTS `fa_user`; CREATE TABLE `fa_user` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', @@ -431,10 +434,16 @@ CREATE TABLE `fa_user` ( KEY `mobile` (`mobile`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='会员表'; +-- ---------------------------- +-- Records of fa_user +-- ---------------------------- BEGIN; INSERT INTO `fa_user` VALUES (1, 1, 'admin', 'admin', 'c13f62012fd6a8fdf06b3452a94430e5', 'rpR6Bv', 'admin@163.com', '13888888888', '/assets/img/avatar.png', 0, 0, '2017-04-15', '', 0, 1, 1, 1516170492, 1516171614, '127.0.0.1', 0, '127.0.0.1', 1491461418, 0, 1516171614, '', 'normal',''); COMMIT; +-- ---------------------------- +-- Table structure for fa_user_group +-- ---------------------------- DROP TABLE IF EXISTS `fa_user_group`; CREATE TABLE `fa_user_group` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, @@ -446,10 +455,16 @@ CREATE TABLE `fa_user_group` ( PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='会员组表'; +-- ---------------------------- +-- Records of fa_user_group +-- ---------------------------- BEGIN; INSERT INTO `fa_user_group` VALUES (1, '默认组', '1,2,3,4,5,6,7,8,9,10,11,12', 1515386468, 1516168298, 'normal'); COMMIT; +-- ---------------------------- +-- Table structure for fa_user_rule +-- ---------------------------- DROP TABLE IF EXISTS `fa_user_rule`; CREATE TABLE `fa_user_rule` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, @@ -465,6 +480,9 @@ CREATE TABLE `fa_user_rule` ( PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8 COMMENT='会员规则表'; +-- ---------------------------- +-- Records of fa_user_rule +-- ---------------------------- BEGIN; INSERT INTO `fa_user_rule` VALUES (1, 0, 'index', '前台', '', 1, 1516168079, 1516168079, 1, 'normal'); INSERT INTO `fa_user_rule` VALUES (2, 0, 'api', 'API接口', '', 1, 1516168062, 1516168062, 2, 'normal'); @@ -480,6 +498,9 @@ INSERT INTO `fa_user_rule` VALUES (11, 4, 'api/user/index', '会员中心', '', INSERT INTO `fa_user_rule` VALUES (12, 4, 'api/user/profile', '个人资料', '', 0, 1516015012, 1516015012, 3, 'normal'); COMMIT; +-- ---------------------------- +-- Table structure for fa_user_score_log +-- ---------------------------- DROP TABLE IF EXISTS `fa_user_score_log`; CREATE TABLE `fa_user_score_log` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, @@ -492,6 +513,9 @@ CREATE TABLE `fa_user_score_log` ( PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='会员积分变动表'; +-- ---------------------------- +-- Table structure for fa_user_token +-- ---------------------------- DROP TABLE IF EXISTS `fa_user_token`; CREATE TABLE `fa_user_token` ( `token` varchar(50) NOT NULL COMMENT 'Token', @@ -501,4 +525,30 @@ CREATE TABLE `fa_user_token` ( PRIMARY KEY (`token`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='会员Token表'; +-- ---------------------------- +-- Table structure for fa_version +-- ---------------------------- +DROP TABLE IF EXISTS `fa_version`; +CREATE TABLE `fa_version` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID', + `oldversion` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '旧版本号', + `newversion` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '新版本号', + `packagesize` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '包大小', + `content` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '升级内容', + `downloadurl` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '下载地址', + `enforce` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '强制更新', + `createtime` int(10) NOT NULL DEFAULT 0 COMMENT '创建时间', + `updatetime` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间', + `weigh` int(10) NOT NULL DEFAULT 0 COMMENT '权重', + `status` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '状态', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '版本表' ROW_FORMAT = Compact; + +-- ---------------------------- +-- Table structure for fa_version +-- ---------------------------- +BEGIN; +INSERT INTO `fa_version` (`id`, `oldversion`, `newversion`, `packagesize`, `content`, `downloadurl`, `enforce`, `createtime`, `updatetime`, `weigh`, `status`) VALUES +(1, '1.1.1,2', '1.2.1', '20M', '更新内容', 'http://www.fastadmin.net/download.html', 1, 1520425318, 0, 0, 'normal'); +COMMIT; SET FOREIGN_KEY_CHECKS = 1; diff --git a/application/admin/command/Menu.php b/application/admin/command/Menu.php index 834f31ba..3b501565 100755 --- a/application/admin/command/Menu.php +++ b/application/admin/command/Menu.php @@ -56,7 +56,6 @@ class Menu extends Command { throw new Exception("There is no menu to delete"); } - $readyMenu = []; $output->info("Are you sure you want to delete all those menu? Type 'yes' to continue: "); $line = fgets(STDIN); if (trim($line) != 'yes') diff --git a/application/admin/command/Min.php b/application/admin/command/Min.php index cec70732..209d2081 100644 --- a/application/admin/command/Min.php +++ b/application/admin/command/Min.php @@ -27,6 +27,7 @@ class Min extends Command ->setName('min') ->addOption('module', 'm', Option::VALUE_REQUIRED, 'module name(frontend or backend),use \'all\' when build all modules', null) ->addOption('resource', 'r', Option::VALUE_REQUIRED, 'resource name(js or css),use \'all\' when build all resources', null) + ->addOption('optimize', 'o', Option::VALUE_OPTIONAL, 'optimize type(uglify|closure|none)', 'none') ->setDescription('Compress js and css file'); } @@ -34,6 +35,7 @@ class Min extends Command { $module = $input->getOption('module') ?: ''; $resource = $input->getOption('resource') ?: ''; + $optimize = $input->getOption('optimize') ?: 'none'; if (!$module || !in_array($module, ['frontend', 'backend', 'all'])) { @@ -89,6 +91,7 @@ class Min extends Command 'cssBaseUrl' => $this->options['cssBaseUrl'], 'jsBasePath' => str_replace(DS, '/', ROOT_PATH . $this->options['jsBaseUrl']), 'cssBasePath' => str_replace(DS, '/', ROOT_PATH . $this->options['cssBaseUrl']), + 'optimize' => $optimize, 'ds' => DS, ]; @@ -117,11 +120,19 @@ class Min extends Command $output->info("Compress " . $data["{$res}BaseName"] . ".{$res}"); // 执行压缩 - echo exec("{$nodeExec} \"{$minPath}r.js\" -o \"{$tempFile}\" >> \"{$minPath}node.log\""); + $command = "{$nodeExec} \"{$minPath}r.js\" -o \"{$tempFile}\" >> \"{$minPath}node.log\""; + if ($output->isDebug()) + { + $output->warning($command); + } + echo exec($command); } } - @unlink($tempFile); + if (!$output->isDebug()) + { + @unlink($tempFile); + } $output->info("Build Successed!"); } diff --git a/application/admin/command/Min/stubs/css.stub b/application/admin/command/Min/stubs/css.stub index e2cafa3b..17211a15 100644 --- a/application/admin/command/Min/stubs/css.stub +++ b/application/admin/command/Min/stubs/css.stub @@ -1,5 +1,6 @@ ({ cssIn: "{%cssBasePath%}{%cssBaseName%}.css", out: "{%cssBasePath%}{%cssBaseName%}.min.css", - optimizeCss: "default" + optimizeCss: "default", + optimize: "{%optimize%}" }) \ No newline at end of file diff --git a/application/admin/command/Min/stubs/js.stub b/application/admin/command/Min/stubs/js.stub index 67a49a4e..8e7a210f 100644 --- a/application/admin/command/Min/stubs/js.stub +++ b/application/admin/command/Min/stubs/js.stub @@ -2,7 +2,8 @@ {%config%} , optimizeCss: "standard", - optimize: "none", //可使用uglify|closure|none + optimize: "{%optimize%}", //可使用uglify|closure|none + preserveLicenseComments: false, removeCombined: false, baseUrl: "{%jsBasePath%}", //JS文件所在的基础目录 name: "{%jsBaseName%}", //来源文件,不包含后缀 diff --git a/application/admin/controller/Addon.php b/application/admin/controller/Addon.php index 7f914c69..4f2f5a6a 100644 --- a/application/admin/controller/Addon.php +++ b/application/admin/controller/Addon.php @@ -5,6 +5,7 @@ namespace app\admin\controller; use app\common\controller\Backend; use think\addons\AddonException; use think\addons\Service; +use think\Cache; use think\Config; use think\Exception; @@ -190,6 +191,7 @@ class Addon extends Backend $action = $action == 'enable' ? $action : 'disable'; //调用启用、禁用的方法 Service::$action($name, $force); + Cache::rm('__menu__'); $this->success(__('Operate successful')); } catch (AddonException $e) @@ -314,6 +316,7 @@ class Addon extends Backend ]; //调用更新的方法 Service::upgrade($name, $extend); + Cache::rm('__menu__'); $this->success(__('Operate successful')); } catch (AddonException $e) @@ -370,7 +373,10 @@ class Addon extends Backend $list[] = $v; } $total = count($list); - $list = array_slice($list, $offset, $limit); + if ($limit) + { + $list = array_slice($list, $offset, $limit); + } $result = array("total" => $total, "rows" => $list); $callback = $this->request->get('callback') ? "jsonp" : "json"; diff --git a/application/admin/controller/Index.php b/application/admin/controller/Index.php index 71bf769f..80d5ee4d 100644 --- a/application/admin/controller/Index.php +++ b/application/admin/controller/Index.php @@ -29,13 +29,21 @@ class Index extends Backend */ public function index() { - // + //左侧菜单 $menulist = $this->auth->getSidebar([ 'dashboard' => 'hot', 'addon' => ['new', 'red', 'badge'], - 'auth/rule' => 'side', + 'auth/rule' => __('Menu'), 'general' => ['new', 'purple'], ], $this->view->site['fixedpage']); + $action = $this->request->request('action'); + if ($this->request->isPost()) + { + if ($action == 'refreshmenu') + { + $this->success('', null, ['menulist' => $menulist]); + } + } $this->view->assign('menulist', $menulist); $this->view->assign('title', __('Home')); return $this->view->fetch(); diff --git a/application/admin/lang/zh-cn/auth/rule.php b/application/admin/lang/zh-cn/auth/rule.php index 574be8a6..ce973a0e 100644 --- a/application/admin/lang/zh-cn/auth/rule.php +++ b/application/admin/lang/zh-cn/auth/rule.php @@ -13,6 +13,6 @@ return [ 'Menu tips' => '规则任意,不可重复,仅做层级显示,无需匹配控制器和方法', 'Node tips' => '控制器/方法名', 'The non-menu rule must have parent' => '非菜单规则节点必须有父级', - 'If not necessary, use the command line to build rule' => '非必要情况下请直接使用命令行php think menu来生成', + 'If not necessary, use the command line to build rule' => '非必要情况下请直接使用命令行php think menu来生成', 'Name only supports letters, numbers, underscore and slash' => 'URL规则只能是小写字母、数字、下划线和/组成', ]; diff --git a/application/admin/lang/zh-cn/user/user.php b/application/admin/lang/zh-cn/user/user.php index 1d8dd7ab..e825f263 100644 --- a/application/admin/lang/zh-cn/user/user.php +++ b/application/admin/lang/zh-cn/user/user.php @@ -12,6 +12,8 @@ return [ 'Avatar' => '头像', 'Level' => '等级', 'Gender' => '性别', + 'Male' => '男', + 'FeMale' => '女', 'Birthday' => '生日', 'Bio' => '格言', 'Score' => '积分', diff --git a/application/admin/library/Auth.php b/application/admin/library/Auth.php index 5b428c29..1f59057b 100644 --- a/application/admin/library/Auth.php +++ b/application/admin/library/Auth.php @@ -273,7 +273,7 @@ class Auth extends \fast\Auth $groupIds[] = $v['id']; } // 取出所有分组 - $groupList = model('AuthGroup')->all(['status' => 'normal']); + $groupList = \app\admin\model\AuthGroup::where(['status' => 'normal'])->select(); $objList = []; foreach ($groups as $K => $v) { @@ -310,8 +310,8 @@ class Auth extends \fast\Auth if (!$this->isSuperAdmin()) { $groupIds = $this->getChildrenGroupIds(false); - $authGroupList = model('AuthGroupAccess') - ->field('uid,group_id') + $authGroupList = \app\admin\model\AuthGroupAccess:: + field('uid,group_id') ->where('group_id', 'in', $groupIds) ->select(); @@ -407,7 +407,7 @@ class Auth extends \fast\Auth $select_id = 0; $pinyin = new \Overtrue\Pinyin\Pinyin('Overtrue\Pinyin\MemoryFileDictLoader'); // 必须将结果集转换为数组 - $ruleList = collection(model('AuthRule')->where('status', 'normal')->where('ismenu', 1)->order('weigh', 'desc')->cache("__menu__")->select())->toArray(); + $ruleList = collection(\app\admin\model\AuthRule::where('status', 'normal')->where('ismenu', 1)->order('weigh', 'desc')->cache("__menu__")->select())->toArray(); foreach ($ruleList as $k => &$v) { if (!in_array($v['name'], $userRule)) diff --git a/application/admin/library/traits/Backend.php b/application/admin/library/traits/Backend.php index 4e2627d8..8645e58b 100644 --- a/application/admin/library/traits/Backend.php +++ b/application/admin/library/traits/Backend.php @@ -267,7 +267,8 @@ trait Backend { $this->model->where($this->dataLimitField, 'in', $adminIds); } - $count = $this->model->where($this->model->getPk(), 'in', $ids)->update($values); + $this->model->where($this->model->getPk(), 'in', $ids); + $count = $this->model->allowField(true)->isUpdate(true)->save($values); if ($count) { $this->success(); diff --git a/application/admin/model/AuthRule.php b/application/admin/model/AuthRule.php index 8303f888..198b9f0d 100644 --- a/application/admin/model/AuthRule.php +++ b/application/admin/model/AuthRule.php @@ -2,6 +2,7 @@ namespace app\admin\model; +use think\Cache; use think\Model; class AuthRule extends Model @@ -13,8 +14,16 @@ class AuthRule extends Model protected $createTime = 'createtime'; protected $updateTime = 'updatetime'; + protected static function init() + { + self::afterWrite(function ($row) { + Cache::rm('__menu__'); + }); + } + public function getTitleAttr($value, $data) { return __($value); } + } diff --git a/application/admin/view/addon/index.html b/application/admin/view/addon/index.html index ba6aae28..e22e7e9b 100644 --- a/application/admin/view/addon/index.html +++ b/application/admin/view/addon/index.html @@ -10,6 +10,12 @@ .payimg .alipaycode {position:absolute;left:265px;top:442px;} .payimg .wechatcode {position:absolute;left:660px;top:442px;} .thumbnail img{width:100%;} + .fixed-table-toolbar .pull-right.search { + min-width: 300px; + } + .status-disabled .noimage { + background:#d2d6de; + }
@@ -158,10 +164,10 @@ \ No newline at end of file + \ No newline at end of file diff --git a/application/admin/view/user/rule/index.html b/application/admin/view/user/rule/index.html index ed91b6ef..b796d3b1 100644 --- a/application/admin/view/user/rule/index.html +++ b/application/admin/view/user/rule/index.html @@ -6,7 +6,7 @@
- {:build_toolbar()} + {:build_toolbar('refresh,add,edit,del')} ",success:function(e,i){s.bigimg=e.find(".layui-layer-phimg"),s.imgsee=e.find(".layui-layer-imguide,.layui-layer-imgbar"),s.event(e),t.tab&&t.tab(u[d],e),"function"==typeof y&&y(e)},end:function(){s.end=!0,i(document).off("keyup",s.keyup)}},t))},function(){r.close(s.loadi),r.msg("当前图片地址异常
是否继续查看下一张?",{time:3e4,btn:["下一张","不看了"],yes:function(){u.length>1&&s.imgnext(!0,!0)}})})}},o.run=function(t){i=t,n=i(e),l.html=i("html"),r.open=function(e){var t=new s(e);return t.index}},e.layui&&layui.define?(r.ready(),layui.define("jquery",function(t){r.path=layui.cache.dir,o.run(layui.$),e.layer=r,t("layer",r)})):"function"==typeof define&&define.amd?define('layer',["jquery"],function(){return o.run(e.jQuery),r}):function(){o.run(e.jQuery),r.ready()}()}(window); /* * Toastr * Copyright 2012-2015 @@ -2124,8 +818,7 @@ define('fast',['jquery', 'bootstrap', 'toastr', 'layer', 'lang'], function ($, u options.area = [top.$(".tab-pane.active").width() + "px", top.$(".tab-pane.active").height() + "px"]; options.offset = [top.$(".tab-pane.active").scrollTop() + "px", "0px"]; } - Layer.open(options); - return false; + return Layer.open(options); }, //关闭窗口并回传数据 close: function (data) { @@ -2281,10 +974,6 @@ define('fast',['jquery', 'bootstrap', 'toastr', 'layer', 'lang'], function ($, u }); //! moment.js -//! version : 2.19.3 -//! authors : Tim Wood, Iskren Chernev, Moment.js contributors -//! license : MIT -//! momentjs.com ;(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : @@ -2941,8 +1630,7 @@ var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123 // any word (or two) characters or numbers including two/three word month in arabic. // includes scottish gaelic two word and hyphenated months -var matchWord = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i; - +var matchWord = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i; var regexes = {}; @@ -4056,10 +2744,6 @@ function localeMeridiem (hours, minutes, isLower) { // this rule. var getSetHour = makeGetSet('Hours', true); -// months -// week -// weekdays -// meridiem var baseConfig = { calendar: defaultCalendar, longDateFormat: defaultLongDateFormat, @@ -4113,7 +2797,7 @@ function chooseLocale(names) { } i++; } - return null; + return globalLocale; } function loadLocale(name) { @@ -4148,6 +2832,12 @@ function getSetGlobalLocale (key, values) { // moment.duration._locale = moment._locale = data; globalLocale = data; } + else { + if ((typeof console !== 'undefined') && console.warn) { + //warn user if arguments are passed but the locale could not be set + console.warn('Locale ' + key + ' not found. Did you forget to load it?'); + } + } } return globalLocale._abbr; @@ -4155,7 +2845,7 @@ function getSetGlobalLocale (key, values) { function defineLocale (name, config) { if (config !== null) { - var parentConfig = baseConfig; + var locale, parentConfig = baseConfig; config.abbr = name; if (locales[name] != null) { deprecateSimple('defineLocaleOverride', @@ -4168,14 +2858,19 @@ function defineLocale (name, config) { if (locales[config.parentLocale] != null) { parentConfig = locales[config.parentLocale]._config; } else { - if (!localeFamilies[config.parentLocale]) { - localeFamilies[config.parentLocale] = []; + locale = loadLocale(config.parentLocale); + if (locale != null) { + parentConfig = locale._config; + } else { + if (!localeFamilies[config.parentLocale]) { + localeFamilies[config.parentLocale] = []; + } + localeFamilies[config.parentLocale].push({ + name: name, + config: config + }); + return null; } - localeFamilies[config.parentLocale].push({ - name: name, - config: config - }); - return null; } } locales[name] = new Locale(mergeConfigs(parentConfig, config)); @@ -4311,7 +3006,7 @@ function currentDateArray(config) { // note: all values past the year are optional and will default to the lowest possible value. // [year, month, day , hour, minute, second, millisecond] function configFromArray (config) { - var i, date, input = [], currentDate, yearToUse; + var i, date, input = [], currentDate, expectedWeekday, yearToUse; if (config._d) { return; @@ -4361,6 +3056,8 @@ function configFromArray (config) { } config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input); + expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay(); + // Apply timezone offset from input. The actual utcOffset can be changed // with parseZone. if (config._tzm != null) { @@ -4372,7 +3069,7 @@ function configFromArray (config) { } // check for mismatching day of week - if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== config._d.getDay()) { + if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) { getParsingFlags(config).weekdayMismatch = true; } } @@ -5521,7 +4218,7 @@ function isSameOrBefore (input, units) { function diff (input, units, asFloat) { var that, zoneDelta, - delta, output; + output; if (!this.isValid()) { return NaN; @@ -5580,19 +4277,24 @@ function toString () { return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); } -function toISOString() { +function toISOString(keepOffset) { if (!this.isValid()) { return null; } - var m = this.clone().utc(); + var utc = keepOffset !== true; + var m = utc ? this.clone().utc() : this; if (m.year() < 0 || m.year() > 9999) { - return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); + return formatMoment(m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ'); } if (isFunction(Date.prototype.toISOString)) { // native implementation is ~50x faster, use it when we can - return this.toDate().toISOString(); + if (utc) { + return this.toDate().toISOString(); + } else { + return new Date(this.valueOf() + this.utcOffset() * 60 * 1000).toISOString().replace('Z', formatMoment(m, 'Z')); + } } - return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); + return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ'); } /** @@ -5948,7 +4650,7 @@ addRegexToken('Do', function (isStrict, locale) { addParseToken(['D', 'DD'], DATE); addParseToken('Do', function (input, array) { - array[DATE] = toInt(input.match(match1to2)[0], 10); + array[DATE] = toInt(input.match(match1to2)[0]); }); // MOMENTS @@ -6143,48 +4845,26 @@ proto.toString = toString; proto.unix = unix; proto.valueOf = valueOf; proto.creationData = creationData; - -// Year proto.year = getSetYear; proto.isLeapYear = getIsLeapYear; - -// Week Year proto.weekYear = getSetWeekYear; proto.isoWeekYear = getSetISOWeekYear; - -// Quarter proto.quarter = proto.quarters = getSetQuarter; - -// Month proto.month = getSetMonth; proto.daysInMonth = getDaysInMonth; - -// Week proto.week = proto.weeks = getSetWeek; proto.isoWeek = proto.isoWeeks = getSetISOWeek; proto.weeksInYear = getWeeksInYear; proto.isoWeeksInYear = getISOWeeksInYear; - -// Day proto.date = getSetDayOfMonth; proto.day = proto.days = getSetDayOfWeek; proto.weekday = getSetLocaleDayOfWeek; proto.isoWeekday = getSetISODayOfWeek; proto.dayOfYear = getSetDayOfYear; - -// Hour proto.hour = proto.hours = getSetHour; - -// Minute proto.minute = proto.minutes = getSetMinute; - -// Second proto.second = proto.seconds = getSetSecond; - -// Millisecond proto.millisecond = proto.milliseconds = getSetMillisecond; - -// Offset proto.utcOffset = getSetOffset; proto.utc = setOffsetToUTC; proto.local = setOffsetToLocal; @@ -6195,12 +4875,8 @@ proto.isLocal = isLocal; proto.isUtcOffset = isUtcOffset; proto.isUtc = isUtc; proto.isUTC = isUtc; - -// Timezone proto.zoneAbbr = getZoneAbbr; proto.zoneName = getZoneName; - -// Deprecations proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth); proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth); proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear); @@ -6231,19 +4907,15 @@ proto$1.relativeTime = relativeTime; proto$1.pastFuture = pastFuture; proto$1.set = set; -// Month proto$1.months = localeMonths; proto$1.monthsShort = localeMonthsShort; proto$1.monthsParse = localeMonthsParse; proto$1.monthsRegex = monthsRegex; proto$1.monthsShortRegex = monthsShortRegex; - -// Week proto$1.week = localeWeek; proto$1.firstDayOfYear = localeFirstDayOfYear; proto$1.firstDayOfWeek = localeFirstDayOfWeek; -// Day of Week proto$1.weekdays = localeWeekdays; proto$1.weekdaysMin = localeWeekdaysMin; proto$1.weekdaysShort = localeWeekdaysShort; @@ -6253,7 +4925,6 @@ proto$1.weekdaysRegex = weekdaysRegex; proto$1.weekdaysShortRegex = weekdaysShortRegex; proto$1.weekdaysMinRegex = weekdaysMinRegex; -// Hours proto$1.isPM = localeIsPM; proto$1.meridiem = localeMeridiem; @@ -6360,6 +5031,7 @@ getSetGlobalLocale('en', { }); // Side effect imports + hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale); hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale); @@ -6735,7 +5407,6 @@ proto$2.toJSON = toISOString$1; proto$2.locale = locale; proto$2.localeData = localeData; -// Deprecations proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1); proto$2.lang = lang; @@ -6760,7 +5431,7 @@ addParseToken('x', function (input, array, config) { // Side effect imports -hooks.version = '2.19.3'; +hooks.version = '2.21.0'; setHookCallback(createLocal); @@ -6792,6 +5463,19 @@ hooks.relativeTimeThreshold = getSetRelativeTimeThreshold; hooks.calendarFormat = getCalendarFormat; hooks.prototype = proto; +// currently HTML5 input type only supports 24-hour formats +hooks.HTML5_FMT = { + DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // + DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // + DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // + DATE: 'YYYY-MM-DD', // + TIME: 'HH:mm', // + TIME_SECONDS: 'HH:mm:ss', // + TIME_MS: 'HH:mm:ss.SSS', // + WEEK: 'YYYY-[W]WW', // + MONTH: 'YYYY-MM' // +}; + return hooks; }))); @@ -6899,6 +5583,9 @@ define('backend',['fast', 'moment'], function (Fast, Moment) { url = url.replace(/\{ids\}/g, ids); } return url; + }, + refreshmenu: function () { + top.window.$(".sidebar-menu").trigger("refresh"); } }, init: function () { @@ -7031,11 +5718,11 @@ define('backend',['fast', 'moment'], function (Fast, Moment) { Backend.init(); return Backend; +}); +define('backend-init',['backend'], function (Backend) { + }); //! moment.js locale configuration -//! locale : Chinese (China) [zh-cn] -//! author : suupic : https://github.com/suupic -//! author : Zeno Zeng : https://github.com/zenozeng ;(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' @@ -7054,14 +5741,14 @@ var zhCn = moment.defineLocale('zh-cn', { longDateFormat : { LT : 'HH:mm', LTS : 'HH:mm:ss', - L : 'YYYY年MMMD日', - LL : 'YYYY年MMMD日', - LLL : 'YYYY年MMMD日Ah点mm分', - LLLL : 'YYYY年MMMD日ddddAh点mm分', - l : 'YYYY年MMMD日', - ll : 'YYYY年MMMD日', - lll : 'YYYY年MMMD日 HH:mm', - llll : 'YYYY年MMMD日dddd HH:mm' + L : 'YYYY/MM/DD', + LL : 'YYYY年M月D日', + LLL : 'YYYY年M月D日Ah点mm分', + LLLL : 'YYYY年M月D日ddddAh点mm分', + l : 'YYYY/M/D', + ll : 'YYYY年M月D日', + lll : 'YYYY年M月D日 HH:mm', + llll : 'YYYY年M月D日dddd HH:mm' }, meridiemParse: /凌晨|早上|上午|中午|下午|晚上/, meridiemHour: function (hour, meridiem) { @@ -7122,6 +5809,7 @@ var zhCn = moment.defineLocale('zh-cn', { future : '%s内', past : '%s前', s : '几秒', + ss : '%d 秒', m : '1 分钟', mm : '%d 分钟', h : '1 小时', @@ -7213,227 +5901,83 @@ define("bootstrap-table-lang", ["bootstrap-table"], (function (global) { }; }(this))); -/** - * @author: Dennis Hernández - * @webSite: http://djhvscf.github.io/Blog - * @version: v1.1.0 - */ - -!function ($) { - - 'use strict'; - - var showHideColumns = function (that, checked) { - if (that.options.columnsHidden.length > 0 ) { - $.each(that.columns, function (i, column) { - if (that.options.columnsHidden.indexOf(column.field) !== -1) { - if (column.visible !== checked) { - that.toggleColumn($.fn.bootstrapTable.utils.getFieldIndex(that.columns, column.field), checked, true); - } - } - }); - } - }; - - var resetView = function (that) { - if (that.options.height || that.options.showFooter) { - setTimeout(function(){ - that.resetView.call(that); - }, 1); - } - }; - - var changeView = function (that, width, height) { - if (that.options.minHeight) { - if ((width <= that.options.minWidth) && (height <= that.options.minHeight)) { - conditionCardView(that); - } else if ((width > that.options.minWidth) && (height > that.options.minHeight)) { - conditionFullView(that); - } - } else { - if (width <= that.options.minWidth) { - conditionCardView(that); - } else if (width > that.options.minWidth) { - conditionFullView(that); - } - } - - resetView(that); - }; - - var conditionCardView = function (that) { - changeTableView(that, false); - showHideColumns(that, false); - }; - - var conditionFullView = function (that) { - changeTableView(that, true); - showHideColumns(that, true); - }; - - var changeTableView = function (that, cardViewState) { - that.options.cardView = cardViewState; - that.toggleView(); - }; - - var debounce = function(func,wait) { - var timeout; - return function() { - var context = this, - args = arguments; - var later = function() { - timeout = null; - func.apply(context,args); - }; - clearTimeout(timeout); - timeout = setTimeout(later, wait); - }; - }; - - $.extend($.fn.bootstrapTable.defaults, { - mobileResponsive: false, - minWidth: 562, - minHeight: undefined, - heightThreshold: 100, // just slightly larger than mobile chrome's auto-hiding toolbar - checkOnInit: true, - columnsHidden: [] - }); - - var BootstrapTable = $.fn.bootstrapTable.Constructor, - _init = BootstrapTable.prototype.init; - - BootstrapTable.prototype.init = function () { - _init.apply(this, Array.prototype.slice.apply(arguments)); - - if (!this.options.mobileResponsive) { - return; - } - - if (!this.options.minWidth) { - return; - } - - if (this.options.minWidth < 100 && this.options.resizable) { - console.log("The minWidth when the resizable extension is active should be greater or equal than 100"); - this.options.minWidth = 100; - } - - var that = this, - old = { - width: $(window).width(), - height: $(window).height() - }; - - $(window).on('resize orientationchange',debounce(function (evt) { - // reset view if height has only changed by at least the threshold. - var height = $(this).height(), - width = $(this).width(); - - if (Math.abs(old.height - height) > that.options.heightThreshold || old.width != width) { - changeView(that, width, height); - old = { - width: width, - height: height - }; - } - },200)); - - if (this.options.checkOnInit) { - var height = $(window).height(), - width = $(window).width(); - changeView(this, width, height); - old = { - width: width, - height: height - }; - } - }; -}(jQuery); - -define("bootstrap-table-mobile", ["bootstrap-table"], (function (global) { - return function () { - var ret, fn; - return ret || global.$.fn.bootstrapTable.defaults; - }; -}(this))); - /* tableExport.jquery.plugin - Version 1.9.8 + Version 1.9.9 - Copyright (c) 2015-2017 hhurz, https://github.com/hhurz + Copyright (c) 2015-2018 hhurz, https://github.com/hhurz Original Work Copyright (c) 2014 Giri Raj Licensed under the MIT License */ -var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.findInternal=function(c,f,u){c instanceof String&&(c=String(c));for(var C=c.length,D=0;Dk&&"undefined"!=typeof Q[k]&&-1!=c.inArray(Q[k],a.ignoreColumn))&&(r=!0):r=!0;return r}function B(b,e,k,r,g){if("function"===typeof g){var h=!1;"function"===typeof a.onIgnoreRow&&(h=a.onIgnoreRow(c(b),k));if(!1===h&&-1==c.inArray(k,a.ignoreRow)&&-1==c.inArray(k-r,a.ignoreRow)&&P(c(b))){var x=c(b).find(e),q=0;x.each(function(b){var e=c(this),a,h=parseInt(this.getAttribute("colspan")),r=parseInt(this.getAttribute("rowspan")); -G.forEach(function(b){if(k>=b.s.r&&k<=b.e.r&&q>=b.s.c&&q<=b.e.c)for(a=0;a<=b.e.c-b.s.c;++a)g(null,k,q++)});if(!1===za(e,x.length,b)){if(r||h)h=h||1,G.push({s:{r:k,c:q},e:{r:k+(r||1)-1,c:q+h-1}});g(this,k,q++)}if(h)for(a=0;a=b.s.r&&k<=b.e.r&&q>=b.s.c&&q<=b.e.c)for(Y=0;Y<=b.e.c-b.s.c;++Y)g(null,k,q++)})}}}function la(b,e){!0===a.consoleLog&&console.log(b.output());if("string"===a.outputMode)return b.output();if("base64"===a.outputMode)return L(b.output()); -if("window"===a.outputMode)window.URL=window.URL||window.webkitURL,window.open(window.URL.createObjectURL(b.output("blob")));else try{var k=b.output("blob");saveAs(k,a.fileName+".pdf")}catch(r){H(a.fileName+".pdf","data:application/pdf"+(e?"":";base64")+",",e?b.output("blob"):b.output())}}function ma(b,e,a){var k=0;"undefined"!==typeof a&&(k=a.colspan);if(0<=k){for(var g=b.width,c=b.textPos.x,x=e.table.columns.indexOf(e.column),q=1;qx&&(f=Math.min(b.width,this.width),l=this.height*f/this.width);f*=d;l*=d;lb.textPos.x&&k+f>b.textPos.x+b.width){if(0<=".,!%*;:=-".indexOf(d.charAt(0))){var l=d.charAt(0);f=a.doc.getStringUnitWidth(l)*a.doc.internal.getFontSize();k+f<=b.textPos.x+b.width&&(a.doc.autoTableText(l,k,g,h),d=d.substring(1,d.length));f=a.doc.getStringUnitWidth(d)*a.doc.internal.getFontSize()}k= -b.textPos.x;g+=a.doc.internal.getFontSize()}for(;d.length&&k+f>b.textPos.x+b.width;)d=d.substring(0,d.length-1),f=a.doc.getStringUnitWidth(d)*a.doc.internal.getFontSize();a.doc.autoTableText(d,k,g,h);k+=f}if(x||q)c(e).is("b")?x=!1:c(e).is("i")&&(q=!1),a.doc.setFontType(x||q?x?"bold":"italic":"normal");e=e.nextSibling}b.textPos.x=k;b.textPos.y=g}else a.doc.autoTableText(b.text,b.textPos.x,b.textPos.y,h)}}function ba(b,a,c){return b.replace(new RegExp(a.replace(/([.*+?^=!:${}()|\[\]\/\\])/g,"\\$1"), -"g"),c)}function ea(b){b=ba(b||"0",a.numbers.html.thousandsSeparator,"");b=ba(b,a.numbers.html.decimalMark,".");return"number"===typeof b||!1!==jQuery.isNumeric(b)?b:!1}function Ba(b){-1/gi,"\u2060"),m=c("
").html(n).contents();d=!1;n="";c.each(m.text().split("\u2028"),function(b,a){0d?1:0)).split(".");1==m.length&&(m[1]="");var p=3d?"-":"")+(a.numbers.output.thousandsSeparator?(p?m[0].substr(0,p)+a.numbers.output.thousandsSeparator:"")+m[0].substr(p).replace(/(\d{3})(?=\d)/g,"$1"+a.numbers.output.thousandsSeparator):m[0])+(m[1].length?a.numbers.output.decimalMark+m[1]:"")}}else r=h;!0===a.escape&&(r=escape(r));"function"===typeof a.onCellData&&(r=a.onCellData(g,e,k,r))}return r}function Ca(b,a,c){return a+"-"+c.toLowerCase()} -function Z(b,a){(b=/^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/.exec(b))&&(a=[parseInt(b[1]),parseInt(b[2]),parseInt(b[3])]);return a}function ra(b){var a=M(b,"text-align"),k=M(b,"font-weight"),r=M(b,"font-style"),g="";"start"==a&&(a="rtl"==M(b,"direction")?"right":"left");700<=k&&(g="bold");"italic"==r&&(g+=r);""===g&&(g="normal");a={style:{align:a,bcolor:Z(M(b,"background-color"),[255,255,255]),color:Z(M(b,"color"),[0,0,0]),fstyle:g},colspan:parseInt(c(b).attr("colspan"))||0,rowspan:parseInt(c(b).attr("rowspan"))|| -0};null!==b&&(b=b.getBoundingClientRect(),a.rect={width:b.width,height:b.height});return a}function M(b,a){try{return window.getComputedStyle?(a=a.replace(/([a-z])([A-Z])/,Ca),window.getComputedStyle(b,null).getPropertyValue(a)):b.currentStyle?b.currentStyle[a]:b.style[a]}catch(k){}return""}function aa(b,a,c){a=M(b,a).match(/\d+/);if(null!==a){a=a[0];b=b.parentElement;var e=document.createElement("div");e.style.overflow="hidden";e.style.visibility="hidden";b.appendChild(e);e.style.width=100+c;c=100/ -e.offsetWidth;b.removeChild(e);return a*c}return 0}function fa(){if(!(this instanceof fa))return new fa;this.SheetNames=[];this.Sheets={}}function sa(b){for(var a=new ArrayBuffer(b.length),c=new Uint8Array(a),d=0;d!=b.length;++d)c[d]=b.charCodeAt(d)&255;return a}function Da(b){for(var a={},c={s:{c:1E7,r:1E7},e:{c:0,r:0}},d=0;d!=b.length;++d)for(var g=0;g!=b[d].length;++g){c.s.r>d&&(c.s.r=d);c.s.c>g&&(c.s.c=g);c.e.rc.s.c&&(a["!ref"]=XLSX.utils.encode_range(c));return a}function oa(b){var a=0,c;if(0===b.length)return a;var d=0;for(c=b.length;dh?g+=String.fromCharCode(h):(127h?g+=String.fromCharCode(h>>6|192):(g+=String.fromCharCode(h>>12|224),g+=String.fromCharCode(h>>6&63|128)),g+=String.fromCharCode(h&63|128))}a=g}for(;d>2;f=(f&3)<<4|g>>4;var q=(g&15)<<2|b>>6;var l=b&63;isNaN(g)?q=l=64:isNaN(b)&&(l=64);c=c+ -"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(h)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(f)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(q)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(l)}return c}var a={consoleLog:!1,csvEnclosure:'"',csvSeparator:",",csvUseBOM:!0,displayTableName:!1,escape:!1,excelFileFormat:"xlshtml",excelRTL:!1,excelstyles:[],exportHiddenCells:!1,fileName:"tableExport", -htmlContent:!1,ignoreColumn:[],ignoreRow:[],jsonScope:"all",jspdf:{orientation:"p",unit:"pt",format:"a4",margins:{left:20,right:10,top:10,bottom:10},onDocCreated:null,autotable:{styles:{cellPadding:2,rowHeight:12,fontSize:8,fillColor:255,textColor:50,fontStyle:"normal",overflow:"ellipsize",halign:"left",valign:"middle"},headerStyles:{fillColor:[52,73,94],textColor:255,fontStyle:"bold",halign:"center"},alternateRowStyles:{fillColor:245},tableExport:{doc:null,onAfterAutotable:null,onBeforeAutotable:null, -onAutotableText:null,onTable:null,outputImages:!0}}},numbers:{html:{decimalMark:".",thousandsSeparator:","},output:{decimalMark:".",thousandsSeparator:","}},onCellData:null,onCellHtmlData:null,onIgnoreRow:null,onMsoNumberFormat:null,outputMode:"file",pdfmake:{enabled:!1,docDefinition:{pageOrientation:"portrait",defaultStyle:{font:"Roboto"}},fonts:{}},tbodySelector:"tr",tfootSelector:"tr",theadSelector:"tr",tableName:"Table",type:"csv",worksheetName:""},v=this,ca=null,p=[],t=[],l=0,m="",Q=[],G=[], -K=[],R=!1;c.extend(!0,a,f);Q=O(v);if("csv"==a.type||"tsv"==a.type||"txt"==a.type){var I="",U=0;G=[];l=0;var ha=function(b,e,k){b.each(function(){m="";B(this,e,l,k+b.length,function(b,c,e){var g=m,h="";if(null!==b)if(b=z(b,c,e),c=null===b||""===b?"":b.toString(),"tsv"==a.type)b instanceof Date&&b.toLocaleString(),h=ba(c,"\t"," ");else if(b instanceof Date)h=a.csvEnclosure+b.toLocaleString()+a.csvEnclosure;else if(h=ba(c,a.csvEnclosure,a.csvEnclosure+a.csvEnclosure),0<=h.indexOf(a.csvSeparator)||/[\r\n ]/g.test(h))h= -a.csvEnclosure+h+a.csvEnclosure;m=g+(h+("tsv"==a.type?"\t":a.csvSeparator))});m=c.trim(m).substring(0,m.length-1);0"+z(a,c,d)+""});l++});J+="";var ta=1;t=u(c(v));c(t).each(function(){var a=1;m="";B(this,"td,th",l,p.length+t.length,function(b,c,d){m+=""+z(b,c,d)+"";a++});0"!=m&&(J+=''+m+"",ta++);l++});J+="";!0===a.consoleLog&&console.log(J);if("string"===a.outputMode)return J; -if("base64"===a.outputMode)return L(J);try{A=new Blob([J],{type:"application/xml;charset=utf-8"}),saveAs(A,a.fileName+".xml")}catch(b){H(a.fileName+".xml","data:application/xml;charset=utf-8;base64,",J)}}else if("excel"===a.type&&"xmlss"===a.excelFileFormat){var ja=[],F=[];c(v).filter(function(){return P(c(this))}).each(function(){function b(a,b,e){var g=[];c(a).each(function(){var b=0,h=0;m="";B(this,"td,th",l,e+a.length,function(a,e,d){if(null!==a){var k="";e=z(a,e,d);d="String";if(!1!==jQuery.isNumeric(e))d= -"Number";else{var f=Ba(e);!1!==f&&(e=f,d="Number",k+=' ss:StyleID="pct1"')}"Number"!==d&&(e=e.replace(/\n/g,"
"));f=parseInt(a.getAttribute("colspan"));a=parseInt(a.getAttribute("rowspan"));g.forEach(function(a){if(l>=a.s.r&&l<=a.e.r&&h>=a.s.c&&h<=a.e.c)for(var c=0;c<=a.e.c-a.s.c;++c)h++,b++});if(a||f)a=a||1,f=f||1,g.push({s:{r:l,c:h},e:{r:l+a-1,c:h+f-1}});1'+c("
").text(e).html()+"\r";h++}});0\r'+m+"\r");l++});return a.length}var e=c(this),d="";"string"===typeof a.worksheetName&&a.worksheetName.length?d=a.worksheetName+" "+(F.length+1):"undefined"!==typeof a.worksheetName[F.length]&&(d=a.worksheetName[F.length]);d.length||(d=e.find("caption").text()||"");d.length||(d="Table "+(F.length+1));d=d.replace(/[\\\/[\]*:?'"]/g,"").substring(0,31).trim(); -F.push(c("
").text(d).html());!1===a.exportHiddenCells&&(K=e.find("tr, th, td").filter(":hidden"),R=0\r";d=0;d+=b(e.find("thead").first().find(a.theadSelector),"th,td",d);b(u(e),"td,th",d);E+="\r";ja.push(E);!0===a.consoleLog&&console.log(E)});f={};for(var y={},n,N,T=0,Y=F.length;T\r\r\r\r '+ +(function(c){c.fn.tableExport=function(h){function u(b){var d=[];C(b,"tbody").each(function(){d.push.apply(d,D(c(this),a.tbodySelector).toArray())});a.tfootSelector.length&&C(b,"tfoot").each(function(){d.push.apply(d,D(c(this),a.tfootSelector).toArray())});return d}function C(b,d){var a=b.parents("table").length;return b.find(d).filter(function(){return c(this).closest("table").parents("table").length===a})}function D(b,d){return b.find(d).filter(function(){return 0===c(this).find("table").length&& +1===c(this).parents("table").length})}function O(b){var d=[];c(b).find("thead").first().find("th").each(function(b,a){void 0!==c(a).attr("data-field")?d[b]=c(a).attr("data-field"):d[b]=b.toString()});return d}function P(b){var d="undefined"!==typeof b[0].cellIndex,a="undefined"!==typeof b[0].rowIndex,p=d||a?Aa(b):b.is(":visible"),g=b.data("tableexport-display");d&&"none"!=g&&"always"!=g&&(b=c(b[0].parentNode),a="undefined"!==typeof b[0].rowIndex,g=b.data("tableexport-display"));a&&"none"!=g&&"always"!= +g&&(g=b.closest("table").data("tableexport-display"));return"none"!==g&&(1==p||"always"==g)}function Aa(b){var d=[];T&&(d=K.filter(function(){var d=!1;this.nodeType==b[0].nodeType&&("undefined"!==typeof this.rowIndex&&this.rowIndex==b[0].rowIndex?d=!0:"undefined"!==typeof this.cellIndex&&this.cellIndex==b[0].cellIndex&&"undefined"!==typeof this.parentNode.rowIndex&&"undefined"!==typeof b[0].parentNode.rowIndex&&this.parentNode.rowIndex==b[0].parentNode.rowIndex&&(d=!0));return d}));return 0==T||0== +d.length}function Ba(b,d,f){var p=!1;P(b)?0f&&"undefined"!=typeof Q[f]&&-1!=c.inArray(Q[f],a.ignoreColumn))&&(p=!0):p=!0;return p}function B(b,d,f,p,g){if("function"===typeof g){var l=!1;"function"===typeof a.onIgnoreRow&&(l=a.onIgnoreRow(c(b),f));if(!1===l&&-1==c.inArray(f,a.ignoreRow)&&-1==c.inArray(f-p,a.ignoreRow)&&P(c(b))){var x=c(b).find(d),r=0;x.each(function(b){var d=c(this),a,l=R(this),p= +S(this);c.each(G,function(){if(f>=this.s.r&&f<=this.e.r&&r>=this.s.c&&r<=this.e.c)for(a=0;a<=this.e.c-this.s.c;++a)g(null,f,r++)});if(!1===Ba(d,x.length,b)){if(p||l)l=l||1,G.push({s:{r:f,c:r},e:{r:f+(p||1)-1,c:r+l-1}});g(this,f,r++)}if(l)for(a=0;a=this.s.r&&f<=this.e.r&&r>=this.s.c&&r<=this.e.c)for(aa=0;aa<=this.e.c-this.s.c;++aa)g(null,f,r++)})}}}function na(b,d){!0===a.consoleLog&&console.log(b.output());if("string"===a.outputMode)return b.output(); +if("base64"===a.outputMode)return L(b.output());if("window"===a.outputMode)window.URL=window.URL||window.webkitURL,window.open(window.URL.createObjectURL(b.output("blob")));else try{var f=b.output("blob");saveAs(f,a.fileName+".pdf")}catch(p){H(a.fileName+".pdf","data:application/pdf"+(d?"":";base64")+",",d?b.output("blob"):b.output())}}function oa(b,d,a){var f=0;"undefined"!==typeof a&&(f=a.colspan);if(0<=f){for(var g=b.width,c=b.textPos.x,x=d.table.columns.indexOf(d.column),r=1;rx&&(h=Math.min(b.width,this.width),k=this.height*h/this.width);h*=e;k*=e;kb.textPos.x&&d+h>b.textPos.x+b.width){if(0<=".,!%*;:=-".indexOf(e.charAt(0))){var k=e.charAt(0);h=f.doc.getStringUnitWidth(k)*f.doc.internal.getFontSize();d+h<=b.textPos.x+b.width&&(f.doc.autoTableText(k,d,g,l),e=e.substring(1,e.length));h=f.doc.getStringUnitWidth(e)*f.doc.internal.getFontSize()}d= +b.textPos.x;g+=f.doc.internal.getFontSize()}for(;e.length&&d+h>b.textPos.x+b.width;)e=e.substring(0,e.length-1),h=f.doc.getStringUnitWidth(e)*f.doc.internal.getFontSize();f.doc.autoTableText(e,d,g,l);d+=h}if(x||r)c(a).is("b")?x=!1:c(a).is("i")&&(r=!1),f.doc.setFontType(x||r?x?"bold":"italic":"normal");a=a.nextSibling}b.textPos.x=d;b.textPos.y=g}else f.doc.autoTableText(b.text,b.textPos.x,b.textPos.y,l)}}function da(b,a,c){return b.replace(new RegExp(a.replace(/([.*+?^=!:${}()|\[\]\/\\])/g,"\\$1"), +"g"),c)}function ha(b){b=da(b||"0",a.numbers.html.thousandsSeparator,"");b=da(b,a.numbers.html.decimalMark,".");return"number"===typeof b||!1!==jQuery.isNumeric(b)?b:!1}function Da(b){-1/gi,"\u2060"),m=c("
").html(n).contents();e=!1;n="";c.each(m.text().split("\u2028"),function(b,a){0e?1:0)).split(".");1==m.length&&(m[1]="");var q=3e?"-":"")+(a.numbers.output.thousandsSeparator?(q?m[0].substr(0,q)+a.numbers.output.thousandsSeparator:"")+m[0].substr(q).replace(/(\d{3})(?=\d)/g,"$1"+a.numbers.output.thousandsSeparator):m[0])+(m[1].length?a.numbers.output.decimalMark+m[1]:"")}}else p=l;!0===a.escape&&(p=escape(p));"function"===typeof a.onCellData&&(p=a.onCellData(g,d,f,p))}return p}function Ea(b,a,c){return a+"-"+c.toLowerCase()} +function ba(b,a){(b=/^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/.exec(b))&&(a=[parseInt(b[1]),parseInt(b[2]),parseInt(b[3])]);return a}function ta(b){var a=M(b,"text-align"),c=M(b,"font-weight"),p=M(b,"font-style"),g="";"start"==a&&(a="rtl"==M(b,"direction")?"right":"left");700<=c&&(g="bold");"italic"==p&&(g+=p);""===g&&(g="normal");a={style:{align:a,bcolor:ba(M(b,"background-color"),[255,255,255]),color:ba(M(b,"color"),[0,0,0]),fstyle:g},colspan:R(b),rowspan:S(b)};null!==b&&(b=b.getBoundingClientRect(), +a.rect={width:b.width,height:b.height});return a}function R(b){var a=c(b).data("tableexport-colspan");"undefined"==typeof a&&c(b).is("[colspan]")&&(a=c(b).attr("colspan"));return parseInt(a)||0}function S(b){var a=c(b).data("tableexport-rowspan");"undefined"==typeof a&&c(b).is("[rowspan]")&&(a=c(b).attr("rowspan"));return parseInt(a)||0}function M(b,a){try{return window.getComputedStyle?(a=a.replace(/([a-z])([A-Z])/,Ea),window.getComputedStyle(b,null).getPropertyValue(a)):b.currentStyle?b.currentStyle[a]: +b.style[a]}catch(f){}return""}function ca(b,a,c){a=M(b,a).match(/\d+/);if(null!==a){a=a[0];b=b.parentElement;var d=document.createElement("div");d.style.overflow="hidden";d.style.visibility="hidden";b.appendChild(d);d.style.width=100+c;c=100/d.offsetWidth;b.removeChild(d);return a*c}return 0}function ia(){if(!(this instanceof ia))return new ia;this.SheetNames=[];this.Sheets={}}function ua(a){for(var b=new ArrayBuffer(a.length),c=new Uint8Array(b),e=0;e!=a.length;++e)c[e]=a.charCodeAt(e)&255;return b} +function Fa(a){for(var b={},c={s:{c:1E7,r:1E7},e:{c:0,r:0}},e=0;e!=a.length;++e)for(var g=0;g!=a[e].length;++g){c.s.r>e&&(c.s.r=e);c.s.c>g&&(c.s.c=g);c.e.rc.s.c&& +(b["!ref"]=XLSX.utils.encode_range(c));return b}function qa(a){var b=0,c;if(0===a.length)return b;var e=0;for(c=a.length;el?g+=String.fromCharCode(l):(127l?g+=String.fromCharCode(l>>6|192):(g+=String.fromCharCode(l>>12|224),g+=String.fromCharCode(l>>6&63|128)),g+=String.fromCharCode(l&63|128))}a=g}for(;e>2;h=(h&3)<<4|g>>4;var r=(g&15)<<2|b>>6;var k=b&63;isNaN(g)?r=k=64:isNaN(b)&&(k=64);c=c+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(l)+ +"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(h)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(r)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(k)}return c}var a={consoleLog:!1,csvEnclosure:'"',csvSeparator:",",csvUseBOM:!0,displayTableName:!1,escape:!1,excelFileFormat:"xlshtml",excelRTL:!1,excelstyles:[],exportHiddenCells:!1,fileName:"tableExport",htmlContent:!1,ignoreColumn:[],ignoreRow:[],jsonScope:"all",jspdf:{orientation:"p", +unit:"pt",format:"a4",margins:{left:20,right:10,top:10,bottom:10},onDocCreated:null,autotable:{styles:{cellPadding:2,rowHeight:12,fontSize:8,fillColor:255,textColor:50,fontStyle:"normal",overflow:"ellipsize",halign:"left",valign:"middle"},headerStyles:{fillColor:[52,73,94],textColor:255,fontStyle:"bold",halign:"center"},alternateRowStyles:{fillColor:245},tableExport:{doc:null,onAfterAutotable:null,onBeforeAutotable:null,onAutotableText:null,onTable:null,outputImages:!0}}},numbers:{html:{decimalMark:".", +thousandsSeparator:","},output:{decimalMark:".",thousandsSeparator:","}},onCellData:null,onCellHtmlData:null,onIgnoreRow:null,onMsoNumberFormat:null,outputMode:"file",pdfmake:{enabled:!1,docDefinition:{pageOrientation:"portrait",defaultStyle:{font:"Roboto"}},fonts:{}},tbodySelector:"tr",tfootSelector:"tr",theadSelector:"tr",tableName:"Table",type:"csv",worksheetName:""},v=this,ea=null,q=[],t=[],k=0,m="",Q=[],G=[],K=[],T=!1;c.extend(!0,a,h);Q=O(v);if("csv"==a.type||"tsv"==a.type||"txt"==a.type){var I= +"",W=0;G=[];k=0;var ja=function(b,d,f){b.each(function(){m="";B(this,d,k,f+b.length,function(b,c,d){var g=m,f="";if(null!==b)if(b=z(b,c,d),c=null===b||""===b?"":b.toString(),"tsv"==a.type)b instanceof Date&&b.toLocaleString(),f=da(c,"\t"," ");else if(b instanceof Date)f=a.csvEnclosure+b.toLocaleString()+a.csvEnclosure;else if(f=da(c,a.csvEnclosure,a.csvEnclosure+a.csvEnclosure),0<=f.indexOf(a.csvSeparator)||/[\r\n ]/g.test(f))f=a.csvEnclosure+f+a.csvEnclosure;m=g+(f+("tsv"==a.type?"\t":a.csvSeparator))}); +m=c.trim(m).substring(0,m.length-1);0"});k++});J+="";var va=1;t=u(c(v));c(t).each(function(){var a=1;m="";B(this,"td,th",k,q.length+t.length,function(b,c,e){m+=""+z(b,c,e)+"";a++});0"!=m&&(J+=''+m+"",va++);k++});J+="";!0===a.consoleLog&&console.log(J);if("string"===a.outputMode)return J;if("base64"===a.outputMode)return L(J);try{A= +new Blob([J],{type:"application/xml;charset=utf-8"}),saveAs(A,a.fileName+".xml")}catch(b){H(a.fileName+".xml","data:application/xml;charset=utf-8;base64,",J)}}else if("excel"===a.type&&"xmlss"===a.excelFileFormat){var la=[],F=[];c(v).filter(function(){return P(c(this))}).each(function(){function b(a,b,d){var g=[];c(a).each(function(){var b=0,f=0;m="";B(this,"td,th",k,d+a.length,function(a,d,l){if(null!==a){var e="";d=z(a,d,l);l="String";if(!1!==jQuery.isNumeric(d))l="Number";else{var h=Da(d);!1!== +h&&(d=h,l="Number",e+=' ss:StyleID="pct1"')}"Number"!==l&&(d=d.replace(/\n/g,"
"));h=R(a);a=S(a);c.each(g,function(){if(k>=this.s.r&&k<=this.e.r&&f>=this.s.c&&f<=this.e.c)for(var a=0;a<=this.e.c-this.s.c;++a)f++,b++});if(a||h)a=a||1,h=h||1,g.push({s:{r:k,c:f},e:{r:k+a-1,c:f+h-1}});1'+c("
").text(d).html()+"\r"; +f++}});0\r'+m+"\r");k++});return a.length}var d=c(this),f="";"string"===typeof a.worksheetName&&a.worksheetName.length?f=a.worksheetName+" "+(F.length+1):"undefined"!==typeof a.worksheetName[F.length]&&(f=a.worksheetName[F.length]);f.length||(f=d.find("caption").text()||"");f.length||(f="Table "+(F.length+1));f=c.trim(f.replace(/[\\\/[\]*:?'"]/g,"").substring(0,31));F.push(c("
").text(f).html());!1===a.exportHiddenCells&&(K=d.find("tr, th, td").filter(":hidden"), +T=0\r";f=0;f+=b(d.find("thead").first().find(a.theadSelector),"th,td",f);b(u(d),"td,th",f);E+="\r";la.push(E);!0===a.consoleLog&&console.log(E)});h={};for(var y={},n,N,V=0,aa=F.length;V\r\r\r\r '+ (new Date).toISOString()+'\r\r\r \r\r\r 9000\r 13860\r 0\r 0\r False\r False\r\r\r \r \r \r\r'; -for(y=0;y\r'+ja[y],f=a.excelRTL?f+'\r\r\r':f+'\r',f+="\r";f+="\r";!0===a.consoleLog&&console.log(f);if("string"===a.outputMode)return f;if("base64"===a.outputMode)return L(f);try{A=new Blob([f],{type:"application/xml;charset=utf-8"}), -saveAs(A,a.fileName+".xml")}catch(b){H(a.fileName+".xml","data:application/xml;charset=utf-8;base64,",f)}}else if("excel"==a.type||"xls"==a.type||"word"==a.type||"doc"==a.type){f="excel"==a.type||"xls"==a.type?"excel":"word";y="excel"==f?"xls":"doc";n='xmlns:x="urn:schemas-microsoft-com:office:'+f+'"';var E="",V="";c(v).filter(function(){return P(c(this))}).each(function(){var b=c(this);""===V&&(V=a.worksheetName||b.find("caption").text()||"Table",V=V.replace(/[\\\/[\]*:?'"]/g,"").substring(0,31).trim()); -!1===a.exportHiddenCells&&(K=b.find("tr, th, td").filter(":hidden"),R=0";p=b.find("thead").first().find(a.theadSelector);p.each(function(){m="";B(this,"th,td",l,p.length,function(b,d,f){if(null!==b){var e="";m+=""}});0"+m+"");l++});E+="";t=u(b);c(t).each(function(){var b=c(this);m="";B(this,"td,th",l,p.length+t.length,function(e,d,g){if(null!==e){var h=z(e,d,g),k="",f=c(e).data("tableexport-msonumberformat");"undefined"==typeof f&&"function"===typeof a.onMsoNumberFormat&&(f=a.onMsoNumberFormat(e,d,g));"undefined"!=typeof f&&""!==f&&(k="style=\"mso-number-format:'"+ -f+"'");for(var l in a.excelstyles)a.excelstyles.hasOwnProperty(l)&&(f=c(e).css(a.excelstyles[l]),""===f&&(f=b.css(a.excelstyles[l])),""!==f&&"0px none rgb(0, 0, 0)"!=f&&"rgba(0, 0, 0, 0)"!=f&&(k+=""===k?'style="':";",k+=a.excelstyles[l]+":"+f));m+=""));m+=">"+h+""}});0"+ -m+"");l++});a.displayTableName&&(E+=""+z(c("

"+a.tableName+"

"))+"");E+="";!0===a.consoleLog&&console.log(E)});n=''+('')+"";"excel"===f&&(n+="\x3c!--[if gte mso 9]>",n+="",n+="",n+="",n+="", -n+="",n+=V,n+="",n+="",n+="",a.excelRTL&&(n+=""),n+="",n+="",n+="",n+="",n+="",n+="br {mso-data-placement:same-cell;}";n+="";n+="";n+=E;n+="";n+="";!0===a.consoleLog&&console.log(n);if("string"===a.outputMode)return n;if("base64"===a.outputMode)return L(n);try{A=new Blob([n], -{type:"application/vnd.ms-"+a.type}),saveAs(A,a.fileName+"."+y)}catch(b){H(a.fileName+"."+y,"data:application/vnd.ms-"+f+";base64,",n)}}else if("xlsx"==a.type){var ua=[],ka=[];l=0;t=c(v).find("thead").first().find(a.theadSelector);t.push.apply(t,u(c(v)));c(t).each(function(){var b=[];B(this,"th,td",l,t.length,function(c,d,f){if("undefined"!==typeof c&&null!==c){f=z(c,d,f);d=parseInt(c.getAttribute("colspan"));c=parseInt(c.getAttribute("rowspan"));ka.forEach(function(a){if(l>=a.s.r&&l<=a.e.r&&b.length>= -a.s.c&&b.length<=a.e.c)for(var c=0;c<=a.e.c-a.s.c;++c)b.push(null)});if(c||d)d=d||1,ka.push({s:{r:l,c:b.length},e:{r:l+(c||1)-1,c:b.length+d-1}});"function"!==typeof a.onCellData&&""!==f&&f==+f&&(f=+f);b.push(""!==f?f:null);if(d)for(c=0;cxa){a>W.a0[0]&&(da="a0",X="l");for(var d in W)W.hasOwnProperty(d)&&W[d][1]>a&&(da=d,X="l",W[d][0]>a&&(X="p"));xa=a}}});a.jspdf.format=""===da?"a4":da;a.jspdf.orientation=""===X?"w":X}if(null==d.doc&&(d.doc=new jsPDF(a.jspdf.orientation,a.jspdf.unit,a.jspdf.format), -"function"===typeof a.jspdf.onDocCreated))a.jspdf.onDocCreated(d.doc);!0===d.outputImages&&(d.images={});"undefined"!=typeof d.images&&(c(v).filter(function(){return P(c(this))}).each(function(){var b=0;G=[];!1===a.exportHiddenCells&&(K=c(this).find("tr, th, td").filter(":hidden"),R=0a.styles.rowHeight&&(a.styles.rowHeight=f)}"undefined"!=typeof g.style&&!0!==g.style.hidden&&(a.styles.halign=g.style.align,"inherit"===e.styles.fillColor&&(a.styles.fillColor=g.style.bcolor), -"inherit"===e.styles.textColor&&(a.styles.textColor=g.style.color),"inherit"===e.styles.fontStyle&&(a.styles.fontStyle=g.style.fstyle))}});"function"!==typeof e.createdCell&&(e.createdCell=function(a,b){b=d.rowoptions[b.row.index+":"+b.column.dataKey];"undefined"!=typeof b&&"undefined"!=typeof b.style&&!0!==b.style.hidden&&(a.styles.halign=b.style.align,"inherit"===e.styles.fillColor&&(a.styles.fillColor=b.style.bcolor),"inherit"===e.styles.textColor&&(a.styles.textColor=b.style.color),"inherit"=== -e.styles.fontStyle&&(a.styles.fontStyle=b.style.fstyle))});"function"!==typeof e.drawHeaderCell&&(e.drawHeaderCell=function(a,b){var c=d.columns[b.column.dataKey];return(!0!==c.style.hasOwnProperty("hidden")||!0!==c.style.hidden)&&0<=c.rowIndex?ma(a,b,c):!1});"function"!==typeof e.drawCell&&(e.drawCell=function(a,b){var c=d.rowoptions[b.row.index+":"+b.column.dataKey];if(ma(a,b,c))if(d.doc.rect(a.x,a.y,a.width,a.height,a.styles.fillStyle),"undefined"!=typeof c&&"undefined"!=typeof c.kids&&0d.dh||"undefined"==typeof d.dh)d.dh=b;d.dw=a.width/c.rect.width;b=a.textPos.y;pa(a,c.kids,d);a.textPos.y=b;qa(a,c.kids,d)}else qa(a,{},d);return!1});d.headerrows=[];p=c(this).find("thead").find(a.theadSelector);p.each(function(){b=0;d.headerrows[l]=[];B(this,"th,td",l,p.length,function(a,c,e){var f=ra(a);f.title=z(a,c,e);f.key=b++;f.rowIndex=l;d.headerrows[l].push(f)});l++});if(0\r'+la[y],h=a.excelRTL?h+'\r\r\r':h+'\r',h+="\r";h+="\r";!0===a.consoleLog&&console.log(h);if("string"===a.outputMode)return h;if("base64"===a.outputMode)return L(h);try{A=new Blob([h],{type:"application/xml;charset=utf-8"}), +saveAs(A,a.fileName+".xml")}catch(b){H(a.fileName+".xml","data:application/xml;charset=utf-8;base64,",h)}}else if("excel"==a.type||"xls"==a.type||"word"==a.type||"doc"==a.type){h="excel"==a.type||"xls"==a.type?"excel":"word";y="excel"==h?"xls":"doc";n='xmlns:x="urn:schemas-microsoft-com:office:'+h+'"';var E="",X="";c(v).filter(function(){return P(c(this))}).each(function(){var b=c(this);""===X&&(X=a.worksheetName||b.find("caption").text()||"Table",X=c.trim(X.replace(/[\\\/[\]*:?'"]/g,"").substring(0, +31)));!1===a.exportHiddenCells&&(K=b.find("tr, th, td").filter(":hidden"),T=0";q=b.find("thead").first().find(a.theadSelector);q.each(function(){m="";B(this,"th,td",k,q.length,function(b,f,e){if(null!==b){var g="";m+=""}});0"+m+"");k++});E+="";t=u(b);c(t).each(function(){var b=c(this);m="";B(this,"td,th",k,q.length+t.length,function(d,e,g){if(null!==d){var f=z(d,e,g),h="",k=c(d).data("tableexport-msonumberformat");"undefined"==typeof k&&"function"===typeof a.onMsoNumberFormat&&(k=a.onMsoNumberFormat(d,e,g));"undefined"!=typeof k&&""!==k&&(h="style=\"mso-number-format:'"+k+"'");for(var p in a.excelstyles)a.excelstyles.hasOwnProperty(p)&& +(k=c(d).css(a.excelstyles[p]),""===k&&(k=b.css(a.excelstyles[p])),""!==k&&"0px none rgb(0, 0, 0)"!=k&&"rgba(0, 0, 0, 0)"!=k&&(h+=""===h?'style="':";",h+=a.excelstyles[p]+":"+k));m+=""));m+=">"+f+""}});0"+m+"");k++});a.displayTableName&&(E+=""+z(c("

"+a.tableName+"

"))+""); +E+="";!0===a.consoleLog&&console.log(E)});n=''+('')+"";"excel"===h&&(n+="\x3c!--[if gte mso 9]>",n+="",n+="",n+="",n+="",n+="",n+=X,n+="",n+="",n+="",a.excelRTL&&(n+=""), +n+="",n+="",n+="",n+="",n+="",n+="br {mso-data-placement:same-cell;}";n+="";n+="";n+=E;n+="";n+="";!0===a.consoleLog&&console.log(n);if("string"===a.outputMode)return n;if("base64"===a.outputMode)return L(n);try{A=new Blob([n],{type:"application/vnd.ms-"+a.type}),saveAs(A,a.fileName+"."+y)}catch(b){H(a.fileName+"."+y,"data:application/vnd.ms-"+h+";base64,", +n)}}else if("xlsx"==a.type){var wa=[],ma=[];k=0;t=c(v).find("thead").first().find(a.theadSelector).toArray();t.push.apply(t,u(c(v)));c(t).each(function(){var b=[];B(this,"th,td",k,t.length,function(d,e,h){if("undefined"!==typeof d&&null!==d){h=z(d,e,h);e=R(d);d=S(d);c.each(ma,function(){if(k>=this.s.r&&k<=this.e.r&&b.length>=this.s.c&&b.length<=this.e.c)for(var a=0;a<=this.e.c-this.s.c;++a)b.push(null)});if(d||e)e=e||1,ma.push({s:{r:k,c:b.length},e:{r:k+(d||1)-1,c:b.length+e-1}});"function"!==typeof a.onCellData&& +""!==h&&h==+h&&(h=+h);b.push(""!==h?h:null);if(e)for(d=0;dza){a>Y.a0[0]&&(fa="a0",Z="l");for(var d in Y)Y.hasOwnProperty(d)&&Y[d][1]>a&&(fa=d,Z="l",Y[d][0]>a&&(Z="p"));za=a}}});a.jspdf.format=""===fa?"a4":fa;a.jspdf.orientation=""===Z?"w":Z}if(null==e.doc&&(e.doc=new jsPDF(a.jspdf.orientation,a.jspdf.unit,a.jspdf.format),"function"===typeof a.jspdf.onDocCreated))a.jspdf.onDocCreated(e.doc);!0===e.outputImages&&(e.images={});"undefined"!=typeof e.images&&(c(v).filter(function(){return P(c(this))}).each(function(){var b= +0;G=[];!1===a.exportHiddenCells&&(K=c(this).find("tr, th, td").filter(":hidden"),T=0a.styles.rowHeight&&(a.styles.rowHeight=f)}"undefined"!=typeof g.style&&!0!==g.style.hidden&&(a.styles.halign=g.style.align,"inherit"===d.styles.fillColor&&(a.styles.fillColor=g.style.bcolor),"inherit"===d.styles.textColor&&(a.styles.textColor=g.style.color),"inherit"===d.styles.fontStyle&&(a.styles.fontStyle=g.style.fstyle))}});"function"!==typeof d.createdCell&&(d.createdCell= +function(a,b){b=e.rowoptions[b.row.index+":"+b.column.dataKey];"undefined"!=typeof b&&"undefined"!=typeof b.style&&!0!==b.style.hidden&&(a.styles.halign=b.style.align,"inherit"===d.styles.fillColor&&(a.styles.fillColor=b.style.bcolor),"inherit"===d.styles.textColor&&(a.styles.textColor=b.style.color),"inherit"===d.styles.fontStyle&&(a.styles.fontStyle=b.style.fstyle))});"function"!==typeof d.drawHeaderCell&&(d.drawHeaderCell=function(a,b){var c=e.columns[b.column.dataKey];return(!0!==c.style.hasOwnProperty("hidden")|| +!0!==c.style.hidden)&&0<=c.rowIndex?oa(a,b,c):!1});"function"!==typeof d.drawCell&&(d.drawCell=function(a,b){var c=e.rowoptions[b.row.index+":"+b.column.dataKey];if(oa(a,b,c))if(e.doc.rect(a.x,a.y,a.width,a.height,a.styles.fillStyle),"undefined"!=typeof c&&"undefined"!=typeof c.kids&&0e.dh||"undefined"==typeof e.dh)e.dh=b;e.dw=a.width/c.rect.width;b=a.textPos.y;ra(a,c.kids,e);a.textPos.y=b;sa(a,c.kids,e)}else sa(a,{},e);return!1});e.headerrows=[];q=c(this).find("thead").find(a.theadSelector); +q.each(function(){b=0;e.headerrows[k]=[];B(this,"th,td",k,q.length,function(a,c,d){var g=ta(a);g.title=z(a,c,d);g.key=b++;g.rowIndex=k;e.headerrows[k].push(g)});k++});if(01)throw new TypeError("isEnabled expects a single character string parameter");switch(a){case"y":return i.indexOf("Y")!==-1;case"M":return i.indexOf("M")!==-1;case"d":return i.toLowerCase().indexOf("d")!==-1;case"h":case"H":return i.toLowerCase().indexOf("h")!==-1;case"m":return i.indexOf("m")!==-1;case"s":return i.indexOf("s")!==-1;default:return!1}},A=function(){return z("h")||z("m")||z("s")},B=function(){return z("y")||z("M")||z("d")},C=function(){var b=a("").append(a("").append(a("").addClass("prev").attr("data-action","previous").append(a("").addClass(d.icons.previous))).append(a("").addClass("picker-switch").attr("data-action","pickerSwitch").attr("colspan",d.calendarWeeks?"6":"5")).append(a("").addClass("next").attr("data-action","next").append(a("").addClass(d.icons.next)))),c=a("").append(a("").append(a("").attr("colspan",d.calendarWeeks?"8":"7")));return[a("
").addClass("datepicker-days").append(a("").addClass("table-condensed").append(b).append(a(""))),a("
").addClass("datepicker-months").append(a("
").addClass("table-condensed").append(b.clone()).append(c.clone())),a("
").addClass("datepicker-years").append(a("
").addClass("table-condensed").append(b.clone()).append(c.clone())),a("
").addClass("datepicker-decades").append(a("
").addClass("table-condensed").append(b.clone()).append(c.clone()))]},D=function(){var b=a(""),c=a(""),e=a("");return z("h")&&(b.append(a("
").append(a("").attr({href:"#",tabindex:"-1",title:d.tooltips.incrementHour}).addClass("btn").attr("data-action","incrementHours").append(a("").addClass(d.icons.up)))),c.append(a("").append(a("").addClass("timepicker-hour").attr({"data-time-component":"hours",title:d.tooltips.pickHour}).attr("data-action","showHours"))),e.append(a("").append(a("").attr({href:"#",tabindex:"-1",title:d.tooltips.decrementHour}).addClass("btn").attr("data-action","decrementHours").append(a("").addClass(d.icons.down))))),z("m")&&(z("h")&&(b.append(a("").addClass("separator")),c.append(a("").addClass("separator").html(":")),e.append(a("").addClass("separator"))),b.append(a("").append(a("").attr({href:"#",tabindex:"-1",title:d.tooltips.incrementMinute}).addClass("btn").attr("data-action","incrementMinutes").append(a("").addClass(d.icons.up)))),c.append(a("").append(a("").addClass("timepicker-minute").attr({"data-time-component":"minutes",title:d.tooltips.pickMinute}).attr("data-action","showMinutes"))),e.append(a("").append(a("").attr({href:"#",tabindex:"-1",title:d.tooltips.decrementMinute}).addClass("btn").attr("data-action","decrementMinutes").append(a("").addClass(d.icons.down))))),z("s")&&(z("m")&&(b.append(a("").addClass("separator")),c.append(a("").addClass("separator").html(":")),e.append(a("").addClass("separator"))),b.append(a("").append(a("").attr({href:"#",tabindex:"-1",title:d.tooltips.incrementSecond}).addClass("btn").attr("data-action","incrementSeconds").append(a("").addClass(d.icons.up)))),c.append(a("").append(a("").addClass("timepicker-second").attr({"data-time-component":"seconds",title:d.tooltips.pickSecond}).attr("data-action","showSeconds"))),e.append(a("").append(a("").attr({href:"#",tabindex:"-1",title:d.tooltips.decrementSecond}).addClass("btn").attr("data-action","decrementSeconds").append(a("").addClass(d.icons.down))))),h||(b.append(a("").addClass("separator")),c.append(a("").append(a("").addClass("separator"))),a("
").addClass("timepicker-picker").append(a("").addClass("table-condensed").append([b,c,e]))},E=function(){var b=a("
").addClass("timepicker-hours").append(a("
").addClass("table-condensed")),c=a("
").addClass("timepicker-minutes").append(a("
").addClass("table-condensed")),d=a("
").addClass("timepicker-seconds").append(a("
").addClass("table-condensed")),e=[D()];return z("h")&&e.push(b),z("m")&&e.push(c),z("s")&&e.push(d),e},F=function(){var b=[];return d.showTodayButton&&b.push(a("
").append(a("").attr({"data-action":"today",title:d.tooltips.today}).append(a("").addClass(d.icons.today)))),!d.sideBySide&&B()&&A()&&b.push(a("").append(a("").attr({"data-action":"togglePicker",title:d.tooltips.selectTime}).append(a("").addClass(d.icons.time)))),d.showClear&&b.push(a("").append(a("").attr({"data-action":"clear",title:d.tooltips.clear}).append(a("").addClass(d.icons.clear)))),d.showClose&&b.push(a("").append(a("").attr({"data-action":"close",title:d.tooltips.close}).append(a("").addClass(d.icons.close)))),a("").addClass("table-condensed").append(a("").append(a("").append(b)))},G=function(){var b=a("
").addClass("bootstrap-datetimepicker-widget dropdown-menu"),c=a("
").addClass("datepicker").append(C()),e=a("
").addClass("timepicker").append(E()),f=a("
    ").addClass("list-unstyled"),g=a("
  • ").addClass("picker-switch"+(d.collapse?" accordion-toggle":"")).append(F());return d.inline&&b.removeClass("dropdown-menu"),h&&b.addClass("usetwentyfour"),z("s")&&!h&&b.addClass("wider"),d.sideBySide&&B()&&A()?(b.addClass("timepicker-sbs"),"top"===d.toolbarPlacement&&b.append(g),b.append(a("
    ").addClass("row").append(c.addClass("col-md-6")).append(e.addClass("col-md-6"))),"bottom"===d.toolbarPlacement&&b.append(g),b):("top"===d.toolbarPlacement&&f.append(g),B()&&f.append(a("
  • ").addClass(d.collapse&&A()?"collapse in":"").append(c)),"default"===d.toolbarPlacement&&f.append(g),A()&&f.append(a("
  • ").addClass(d.collapse&&B()?"collapse":"").append(e)),"bottom"===d.toolbarPlacement&&f.append(g),b.append(f))},H=function(){var b,e={};return b=c.is("input")||d.inline?c.data():c.find("input").data(),b.dateOptions&&b.dateOptions instanceof Object&&(e=a.extend(!0,e,b.dateOptions)),a.each(d,function(a){var c="date"+a.charAt(0).toUpperCase()+a.slice(1);void 0!==b[c]&&(e[a]=b[c])}),e},I=function(){var b,e=(n||c).position(),f=(n||c).offset(),g=d.widgetPositioning.vertical,h=d.widgetPositioning.horizontal;if(d.widgetParent)b=d.widgetParent.append(o);else if(c.is("input"))b=c.after(o).parent();else{if(d.inline)return void(b=c.append(o));b=c,c.children().first().after(o)}if("auto"===g&&(g=f.top+1.5*o.height()>=a(window).height()+a(window).scrollTop()&&o.height()+c.outerHeight()a(window).width()?"right":"left"),"top"===g?o.addClass("top").removeClass("bottom"):o.addClass("bottom").removeClass("top"),"right"===h?o.addClass("pull-right"):o.removeClass("pull-right"),"static"===b.css("position")&&(b=b.parents().filter(function(){return"static"!==a(this).css("position")}).first()),0===b.length)throw new Error("datetimepicker component should be placed within a non-static positioned container");o.css({top:"top"===g?"auto":e.top+c.outerHeight(),bottom:"top"===g?b.outerHeight()-(b===c?0:e.top):"auto",left:"left"===h?b===c?0:e.left:"auto",right:"left"===h?"auto":b.outerWidth()-c.outerWidth()-(b===c?0:e.left)})},J=function(a){"dp.change"===a.type&&(a.date&&a.date.isSame(a.oldDate)||!a.date&&!a.oldDate)||c.trigger(a)},K=function(a){"y"===a&&(a="YYYY"),J({type:"dp.update",change:a,viewDate:f.clone()})},L=function(a){o&&(a&&(k=Math.max(p,Math.min(3,k+a))),o.find(".datepicker > div").hide().filter(".datepicker-"+q[k].clsName).show())},M=function(){var b=a("
"),c=f.clone().startOf("w").startOf("d");for(d.calendarWeeks===!0&&b.append(a(""),d.calendarWeeks&&c.append('"),j.push(c)),k=["day"],b.isBefore(f,"M")&&k.push("old"),b.isAfter(f,"M")&&k.push("new"),b.isSame(e,"d")&&!m&&k.push("active"),R(b,"d")||k.push("disabled"),b.isSame(y(),"d")&&k.push("today"),0!==b.day()&&6!==b.day()||k.push("weekend"),J({type:"dp.classify",date:b,classNames:k}),c.append('"),b.add(1,"d");h.find("tbody").empty().append(j),T(),U(),V()}},X=function(){var b=o.find(".timepicker-hours table"),c=f.clone().startOf("d"),d=[],e=a("");for(f.hour()>11&&!h&&c.hour(12);c.isSame(f,"d")&&(h||f.hour()<12&&c.hour()<12||f.hour()>11);)c.hour()%4===0&&(e=a(""),d.push(e)),e.append('"),c.add(1,"h");b.empty().append(d)},Y=function(){for(var b=o.find(".timepicker-minutes table"),c=f.clone().startOf("h"),e=[],g=a(""),h=1===d.stepping?5:d.stepping;f.isSame(c,"h");)c.minute()%(4*h)===0&&(g=a(""),e.push(g)),g.append('"),c.add(h,"m");b.empty().append(e)},Z=function(){for(var b=o.find(".timepicker-seconds table"),c=f.clone().startOf("m"),d=[],e=a("");f.isSame(c,"m");)c.second()%20===0&&(e=a(""),d.push(e)),e.append('"),c.add(5,"s");b.empty().append(d)},$=function(){var a,b,c=o.find(".timepicker span[data-time-component]");h||(a=o.find(".timepicker [data-action=togglePeriod]"),b=e.clone().add(e.hours()>=12?-12:12,"h"),a.text(e.format("A")),R(b,"h")?a.removeClass("disabled"):a.addClass("disabled")),c.filter("[data-time-component=hours]").text(e.format(h?"HH":"hh")),c.filter("[data-time-component=minutes]").text(e.format("mm")),c.filter("[data-time-component=seconds]").text(e.format("ss")),X(),Y(),Z()},_=function(){o&&(W(),$())},aa=function(a){var b=m?null:e;if(!a)return m=!0,g.val(""),c.data("date",""),J({type:"dp.change",date:!1,oldDate:b}),void _();if(a=a.clone().locale(d.locale),x()&&a.tz(d.timeZone),1!==d.stepping)for(a.minutes(Math.round(a.minutes()/d.stepping)*d.stepping).seconds(0);d.minDate&&a.isBefore(d.minDate);)a.add(d.stepping,"minutes");R(a)?(e=a,f=e.clone(),g.val(e.format(i)),c.data("date",e.format(i)),m=!1,_(),J({type:"dp.change",date:e.clone(),oldDate:b})):(d.keepInvalid?J({type:"dp.change",date:a,oldDate:b}):g.val(m?"":e.format(i)),J({type:"dp.error",date:a,oldDate:b}))},ba=function(){var b=!1;return o?(o.find(".collapse").each(function(){var c=a(this).data("collapse");return!c||!c.transitioning||(b=!0,!1)}),b?l:(n&&n.hasClass("btn")&&n.toggleClass("active"),o.hide(),a(window).off("resize",I),o.off("click","[data-action]"),o.off("mousedown",!1),o.remove(),o=!1,J({type:"dp.hide",date:e.clone()}),g.blur(),f=e.clone(),l)):l},ca=function(){aa(null)},da=function(a){return void 0===d.parseInputDate?(!b.isMoment(a)||a instanceof Date)&&(a=y(a)):a=d.parseInputDate(a),a},ea={next:function(){var a=q[k].navFnc;f.add(q[k].navStep,a),W(),K(a)},previous:function(){var a=q[k].navFnc;f.subtract(q[k].navStep,a),W(),K(a)},pickerSwitch:function(){L(1)},selectMonth:function(b){var c=a(b.target).closest("tbody").find("span").index(a(b.target));f.month(c),k===p?(aa(e.clone().year(f.year()).month(f.month())),d.inline||ba()):(L(-1),W()),K("M")},selectYear:function(b){var c=parseInt(a(b.target).text(),10)||0;f.year(c),k===p?(aa(e.clone().year(f.year())),d.inline||ba()):(L(-1),W()),K("YYYY")},selectDecade:function(b){var c=parseInt(a(b.target).data("selection"),10)||0;f.year(c),k===p?(aa(e.clone().year(f.year())),d.inline||ba()):(L(-1),W()),K("YYYY")},selectDay:function(b){var c=f.clone();a(b.target).is(".old")&&c.subtract(1,"M"),a(b.target).is(".new")&&c.add(1,"M"),aa(c.date(parseInt(a(b.target).text(),10))),A()||d.keepOpen||d.inline||ba()},incrementHours:function(){var a=e.clone().add(1,"h");R(a,"h")&&aa(a)},incrementMinutes:function(){var a=e.clone().add(d.stepping,"m");R(a,"m")&&aa(a)},incrementSeconds:function(){var a=e.clone().add(1,"s");R(a,"s")&&aa(a)},decrementHours:function(){var a=e.clone().subtract(1,"h");R(a,"h")&&aa(a)},decrementMinutes:function(){var a=e.clone().subtract(d.stepping,"m");R(a,"m")&&aa(a)},decrementSeconds:function(){var a=e.clone().subtract(1,"s");R(a,"s")&&aa(a)},togglePeriod:function(){aa(e.clone().add(e.hours()>=12?-12:12,"h"))},togglePicker:function(b){var c,e=a(b.target),f=e.closest("ul"),g=f.find(".in"),h=f.find(".collapse:not(.in)");if(g&&g.length){if(c=g.data("collapse"),c&&c.transitioning)return;g.collapse?(g.collapse("hide"),h.collapse("show")):(g.removeClass("in"),h.addClass("in")),e.is("span")?e.toggleClass(d.icons.time+" "+d.icons.date):e.find("span").toggleClass(d.icons.time+" "+d.icons.date)}},showPicker:function(){o.find(".timepicker > div:not(.timepicker-picker)").hide(),o.find(".timepicker .timepicker-picker").show()},showHours:function(){o.find(".timepicker .timepicker-picker").hide(),o.find(".timepicker .timepicker-hours").show()},showMinutes:function(){o.find(".timepicker .timepicker-picker").hide(),o.find(".timepicker .timepicker-minutes").show()},showSeconds:function(){o.find(".timepicker .timepicker-picker").hide(),o.find(".timepicker .timepicker-seconds").show()},selectHour:function(b){var c=parseInt(a(b.target).text(),10);h||(e.hours()>=12?12!==c&&(c+=12):12===c&&(c=0)),aa(e.clone().hours(c)),ea.showPicker.call(l)},selectMinute:function(b){aa(e.clone().minutes(parseInt(a(b.target).text(),10))),ea.showPicker.call(l)},selectSecond:function(b){aa(e.clone().seconds(parseInt(a(b.target).text(),10))),ea.showPicker.call(l)},clear:ca,today:function(){var a=y();R(a,"d")&&aa(a)},close:ba},fa=function(b){return!a(b.currentTarget).is(".disabled")&&(ea[a(b.currentTarget).data("action")].apply(l,arguments),!1)},ga=function(){var b,c={year:function(a){return a.month(0).date(1).hours(0).seconds(0).minutes(0)},month:function(a){return a.date(1).hours(0).seconds(0).minutes(0)},day:function(a){return a.hours(0).seconds(0).minutes(0)},hour:function(a){return a.seconds(0).minutes(0)},minute:function(a){return a.seconds(0)}};return g.prop("disabled")||!d.ignoreReadonly&&g.prop("readonly")||o?l:(void 0!==g.val()&&0!==g.val().trim().length?aa(da(g.val().trim())):m&&d.useCurrent&&(d.inline||g.is("input")&&0===g.val().trim().length)&&(b=y(),"string"==typeof d.useCurrent&&(b=c[d.useCurrent](b)),aa(b)),o=G(),M(),S(),o.find(".timepicker-hours").hide(),o.find(".timepicker-minutes").hide(),o.find(".timepicker-seconds").hide(),_(),L(),a(window).on("resize",I),o.on("click","[data-action]",fa),o.on("mousedown",!1),n&&n.hasClass("btn")&&n.toggleClass("active"),I(),o.show(),d.focusOnShow&&!g.is(":focus")&&g.focus(),J({type:"dp.show"}),l)},ha=function(){return o?ba():ga()},ia=function(a){var b,c,e,f,g=null,h=[],i={},j=a.which,k="p";w[j]=k;for(b in w)w.hasOwnProperty(b)&&w[b]===k&&(h.push(b),parseInt(b,10)!==j&&(i[b]=!0));for(b in d.keyBinds)if(d.keyBinds.hasOwnProperty(b)&&"function"==typeof d.keyBinds[b]&&(e=b.split(" "),e.length===h.length&&v[j]===e[e.length-1])){for(f=!0,c=e.length-2;c>=0;c--)if(!(v[e[c]]in i)){f=!1;break}if(f){g=d.keyBinds[b];break}}g&&(g.call(l,o),a.stopPropagation(),a.preventDefault())},ja=function(a){w[a.which]="r",a.stopPropagation(),a.preventDefault()},ka=function(b){var c=a(b.target).val().trim(),d=c?da(c):null;return aa(d),b.stopImmediatePropagation(),!1},la=function(){g.on({change:ka,blur:d.debug?"":ba,keydown:ia,keyup:ja,focus:d.allowInputToggle?ga:""}),c.is("input")?g.on({focus:ga}):n&&(n.on("click",ha),n.on("mousedown",!1))},ma=function(){g.off({change:ka,blur:blur,keydown:ia,keyup:ja,focus:d.allowInputToggle?ba:""}),c.is("input")?g.off({focus:ga}):n&&(n.off("click",ha),n.off("mousedown",!1))},na=function(b){var c={};return a.each(b,function(){var a=da(this);a.isValid()&&(c[a.format("YYYY-MM-DD")]=!0)}),!!Object.keys(c).length&&c},oa=function(b){var c={};return a.each(b,function(){c[this]=!0}),!!Object.keys(c).length&&c},pa=function(){var a=d.format||"L LT";i=a.replace(/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,function(a){var b=e.localeData().longDateFormat(a)||a;return b.replace(/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,function(a){return e.localeData().longDateFormat(a)||a})}),j=d.extraFormats?d.extraFormats.slice():[],j.indexOf(a)<0&&j.indexOf(i)<0&&j.push(i),h=i.toLowerCase().indexOf("a")<1&&i.replace(/\[.*?\]/g,"").indexOf("h")<1,z("y")&&(p=2),z("M")&&(p=1),z("d")&&(p=0),k=Math.max(p,k),m||aa(e)};if(l.destroy=function(){ba(),ma(),c.removeData("DateTimePicker"),c.removeData("date")},l.toggle=ha,l.show=ga,l.hide=ba,l.disable=function(){return ba(),n&&n.hasClass("btn")&&n.addClass("disabled"),g.prop("disabled",!0),l},l.enable=function(){return n&&n.hasClass("btn")&&n.removeClass("disabled"),g.prop("disabled",!1),l},l.ignoreReadonly=function(a){if(0===arguments.length)return d.ignoreReadonly;if("boolean"!=typeof a)throw new TypeError("ignoreReadonly () expects a boolean parameter");return d.ignoreReadonly=a,l},l.options=function(b){if(0===arguments.length)return a.extend(!0,{},d);if(!(b instanceof Object))throw new TypeError("options() options parameter should be an object");return a.extend(!0,d,b),a.each(d,function(a,b){if(void 0===l[a])throw new TypeError("option "+a+" is not recognized!");l[a](b)}),l},l.date=function(a){if(0===arguments.length)return m?null:e.clone();if(!(null===a||"string"==typeof a||b.isMoment(a)||a instanceof Date))throw new TypeError("date() parameter must be one of [null, string, moment or Date]");return aa(null===a?null:da(a)),l},l.format=function(a){if(0===arguments.length)return d.format;if("string"!=typeof a&&("boolean"!=typeof a||a!==!1))throw new TypeError("format() expects a string or boolean:false parameter "+a);return d.format=a,i&&pa(),l},l.timeZone=function(a){if(0===arguments.length)return d.timeZone;if("string"!=typeof a)throw new TypeError("newZone() expects a string parameter");return d.timeZone=a,l},l.dayViewHeaderFormat=function(a){if(0===arguments.length)return d.dayViewHeaderFormat;if("string"!=typeof a)throw new TypeError("dayViewHeaderFormat() expects a string parameter");return d.dayViewHeaderFormat=a,l},l.extraFormats=function(a){if(0===arguments.length)return d.extraFormats;if(a!==!1&&!(a instanceof Array))throw new TypeError("extraFormats() expects an array or false parameter");return d.extraFormats=a,j&&pa(),l},l.disabledDates=function(b){if(0===arguments.length)return d.disabledDates?a.extend({},d.disabledDates):d.disabledDates;if(!b)return d.disabledDates=!1,_(),l;if(!(b instanceof Array))throw new TypeError("disabledDates() expects an array parameter");return d.disabledDates=na(b),d.enabledDates=!1,_(),l},l.enabledDates=function(b){if(0===arguments.length)return d.enabledDates?a.extend({},d.enabledDates):d.enabledDates;if(!b)return d.enabledDates=!1,_(),l;if(!(b instanceof Array))throw new TypeError("enabledDates() expects an array parameter");return d.enabledDates=na(b),d.disabledDates=!1,_(),l},l.daysOfWeekDisabled=function(a){if(0===arguments.length)return d.daysOfWeekDisabled.splice(0);if("boolean"==typeof a&&!a)return d.daysOfWeekDisabled=!1,_(),l;if(!(a instanceof Array))throw new TypeError("daysOfWeekDisabled() expects an array parameter");if(d.daysOfWeekDisabled=a.reduce(function(a,b){return b=parseInt(b,10),b>6||b<0||isNaN(b)?a:(a.indexOf(b)===-1&&a.push(b),a)},[]).sort(),d.useCurrent&&!d.keepInvalid){for(var b=0;!R(e,"d");){if(e.add(1,"d"),31===b)throw"Tried 31 times to find a valid date";b++}aa(e)}return _(),l},l.maxDate=function(a){if(0===arguments.length)return d.maxDate?d.maxDate.clone():d.maxDate;if("boolean"==typeof a&&a===!1)return d.maxDate=!1,_(),l;"string"==typeof a&&("now"!==a&&"moment"!==a||(a=y()));var b=da(a);if(!b.isValid())throw new TypeError("maxDate() Could not parse date parameter: "+a);if(d.minDate&&b.isBefore(d.minDate))throw new TypeError("maxDate() date parameter is before options.minDate: "+b.format(i));return d.maxDate=b,d.useCurrent&&!d.keepInvalid&&e.isAfter(a)&&aa(d.maxDate),f.isAfter(b)&&(f=b.clone().subtract(d.stepping,"m")),_(),l},l.minDate=function(a){if(0===arguments.length)return d.minDate?d.minDate.clone():d.minDate;if("boolean"==typeof a&&a===!1)return d.minDate=!1,_(),l;"string"==typeof a&&("now"!==a&&"moment"!==a||(a=y()));var b=da(a);if(!b.isValid())throw new TypeError("minDate() Could not parse date parameter: "+a);if(d.maxDate&&b.isAfter(d.maxDate))throw new TypeError("minDate() date parameter is after options.maxDate: "+b.format(i));return d.minDate=b,d.useCurrent&&!d.keepInvalid&&e.isBefore(a)&&aa(d.minDate),f.isBefore(b)&&(f=b.clone().add(d.stepping,"m")),_(),l},l.defaultDate=function(a){if(0===arguments.length)return d.defaultDate?d.defaultDate.clone():d.defaultDate;if(!a)return d.defaultDate=!1,l;"string"==typeof a&&(a="now"===a||"moment"===a?y():y(a));var b=da(a);if(!b.isValid())throw new TypeError("defaultDate() Could not parse date parameter: "+a);if(!R(b))throw new TypeError("defaultDate() date passed is invalid according to component setup validations");return d.defaultDate=b,(d.defaultDate&&d.inline||""===g.val().trim())&&aa(d.defaultDate),l},l.locale=function(a){if(0===arguments.length)return d.locale;if(!b.localeData(a))throw new TypeError("locale() locale "+a+" is not loaded from moment locales!");return d.locale=a,e.locale(d.locale),f.locale(d.locale),i&&pa(),o&&(ba(),ga()),l},l.stepping=function(a){return 0===arguments.length?d.stepping:(a=parseInt(a,10),(isNaN(a)||a<1)&&(a=1),d.stepping=a,l)},l.useCurrent=function(a){var b=["year","month","day","hour","minute"];if(0===arguments.length)return d.useCurrent;if("boolean"!=typeof a&&"string"!=typeof a)throw new TypeError("useCurrent() expects a boolean or string parameter");if("string"==typeof a&&b.indexOf(a.toLowerCase())===-1)throw new TypeError("useCurrent() expects a string parameter of "+b.join(", "));return d.useCurrent=a,l},l.collapse=function(a){if(0===arguments.length)return d.collapse;if("boolean"!=typeof a)throw new TypeError("collapse() expects a boolean parameter");return d.collapse===a?l:(d.collapse=a,o&&(ba(),ga()),l)},l.icons=function(b){if(0===arguments.length)return a.extend({},d.icons);if(!(b instanceof Object))throw new TypeError("icons() expects parameter to be an Object");return a.extend(d.icons,b),o&&(ba(),ga()),l},l.tooltips=function(b){if(0===arguments.length)return a.extend({},d.tooltips);if(!(b instanceof Object))throw new TypeError("tooltips() expects parameter to be an Object");return a.extend(d.tooltips,b),o&&(ba(),ga()),l},l.useStrict=function(a){if(0===arguments.length)return d.useStrict;if("boolean"!=typeof a)throw new TypeError("useStrict() expects a boolean parameter");return d.useStrict=a,l},l.sideBySide=function(a){if(0===arguments.length)return d.sideBySide;if("boolean"!=typeof a)throw new TypeError("sideBySide() expects a boolean parameter");return d.sideBySide=a,o&&(ba(),ga()),l},l.viewMode=function(a){if(0===arguments.length)return d.viewMode;if("string"!=typeof a)throw new TypeError("viewMode() expects a string parameter");if(r.indexOf(a)===-1)throw new TypeError("viewMode() parameter must be one of ("+r.join(", ")+") value");return d.viewMode=a,k=Math.max(r.indexOf(a),p),L(),l},l.toolbarPlacement=function(a){if(0===arguments.length)return d.toolbarPlacement;if("string"!=typeof a)throw new TypeError("toolbarPlacement() expects a string parameter");if(u.indexOf(a)===-1)throw new TypeError("toolbarPlacement() parameter must be one of ("+u.join(", ")+") value");return d.toolbarPlacement=a,o&&(ba(),ga()),l},l.widgetPositioning=function(b){if(0===arguments.length)return a.extend({},d.widgetPositioning);if("[object Object]"!=={}.toString.call(b))throw new TypeError("widgetPositioning() expects an object variable");if(b.horizontal){if("string"!=typeof b.horizontal)throw new TypeError("widgetPositioning() horizontal variable must be a string");if(b.horizontal=b.horizontal.toLowerCase(),t.indexOf(b.horizontal)===-1)throw new TypeError("widgetPositioning() expects horizontal parameter to be one of ("+t.join(", ")+")");d.widgetPositioning.horizontal=b.horizontal}if(b.vertical){if("string"!=typeof b.vertical)throw new TypeError("widgetPositioning() vertical variable must be a string");if(b.vertical=b.vertical.toLowerCase(),s.indexOf(b.vertical)===-1)throw new TypeError("widgetPositioning() expects vertical parameter to be one of ("+s.join(", ")+")");d.widgetPositioning.vertical=b.vertical}return _(),l},l.calendarWeeks=function(a){if(0===arguments.length)return d.calendarWeeks;if("boolean"!=typeof a)throw new TypeError("calendarWeeks() expects parameter to be a boolean value");return d.calendarWeeks=a,_(),l},l.showTodayButton=function(a){if(0===arguments.length)return d.showTodayButton;if("boolean"!=typeof a)throw new TypeError("showTodayButton() expects a boolean parameter");return d.showTodayButton=a,o&&(ba(),ga()),l},l.showClear=function(a){if(0===arguments.length)return d.showClear;if("boolean"!=typeof a)throw new TypeError("showClear() expects a boolean parameter");return d.showClear=a,o&&(ba(),ga()),l},l.widgetParent=function(b){if(0===arguments.length)return d.widgetParent;if("string"==typeof b&&(b=a(b)),null!==b&&"string"!=typeof b&&!(b instanceof a))throw new TypeError("widgetParent() expects a string or a jQuery object parameter");return d.widgetParent=b,o&&(ba(),ga()),l},l.keepOpen=function(a){if(0===arguments.length)return d.keepOpen;if("boolean"!=typeof a)throw new TypeError("keepOpen() expects a boolean parameter");return d.keepOpen=a,l},l.focusOnShow=function(a){if(0===arguments.length)return d.focusOnShow;if("boolean"!=typeof a)throw new TypeError("focusOnShow() expects a boolean parameter");return d.focusOnShow=a,l},l.inline=function(a){if(0===arguments.length)return d.inline;if("boolean"!=typeof a)throw new TypeError("inline() expects a boolean parameter");return d.inline=a,l},l.clear=function(){return ca(),l},l.keyBinds=function(a){return 0===arguments.length?d.keyBinds:(d.keyBinds=a,l)},l.getMoment=function(a){return y(a)},l.debug=function(a){if("boolean"!=typeof a)throw new TypeError("debug() expects a boolean parameter");return d.debug=a,l},l.allowInputToggle=function(a){if(0===arguments.length)return d.allowInputToggle;if("boolean"!=typeof a)throw new TypeError("allowInputToggle() expects a boolean parameter");return d.allowInputToggle=a,l},l.showClose=function(a){if(0===arguments.length)return d.showClose;if("boolean"!=typeof a)throw new TypeError("showClose() expects a boolean parameter");return d.showClose=a,l},l.keepInvalid=function(a){if(0===arguments.length)return d.keepInvalid;if("boolean"!=typeof a)throw new TypeError("keepInvalid() expects a boolean parameter"); return d.keepInvalid=a,l},l.datepickerInput=function(a){if(0===arguments.length)return d.datepickerInput;if("string"!=typeof a)throw new TypeError("datepickerInput() expects a string parameter");return d.datepickerInput=a,l},l.parseInputDate=function(a){if(0===arguments.length)return d.parseInputDate;if("function"!=typeof a)throw new TypeError("parseInputDate() sholud be as function");return d.parseInputDate=a,l},l.disabledTimeIntervals=function(b){if(0===arguments.length)return d.disabledTimeIntervals?a.extend({},d.disabledTimeIntervals):d.disabledTimeIntervals;if(!b)return d.disabledTimeIntervals=!1,_(),l;if(!(b instanceof Array))throw new TypeError("disabledTimeIntervals() expects an array parameter");return d.disabledTimeIntervals=b,_(),l},l.disabledHours=function(b){if(0===arguments.length)return d.disabledHours?a.extend({},d.disabledHours):d.disabledHours;if(!b)return d.disabledHours=!1,_(),l;if(!(b instanceof Array))throw new TypeError("disabledHours() expects an array parameter");if(d.disabledHours=oa(b),d.enabledHours=!1,d.useCurrent&&!d.keepInvalid){for(var c=0;!R(e,"h");){if(e.add(1,"h"),24===c)throw"Tried 24 times to find a valid date";c++}aa(e)}return _(),l},l.enabledHours=function(b){if(0===arguments.length)return d.enabledHours?a.extend({},d.enabledHours):d.enabledHours;if(!b)return d.enabledHours=!1,_(),l;if(!(b instanceof Array))throw new TypeError("enabledHours() expects an array parameter");if(d.enabledHours=oa(b),d.disabledHours=!1,d.useCurrent&&!d.keepInvalid){for(var c=0;!R(e,"h");){if(e.add(1,"h"),24===c)throw"Tried 24 times to find a valid date";c++}aa(e)}return _(),l},l.viewDate=function(a){if(0===arguments.length)return f.clone();if(!a)return f=e.clone(),l;if(!("string"==typeof a||b.isMoment(a)||a instanceof Date))throw new TypeError("viewDate() parameter must be one of [string, moment or Date]");return f=da(a),K(),l},c.is("input"))g=c;else if(g=c.find(d.datepickerInput),0===g.length)g=c.find("input");else if(!g.is("input"))throw new Error('CSS class "'+d.datepickerInput+'" cannot be applied to non input element');if(c.hasClass("input-group")&&(n=0===c.find(".datepickerbutton").length?c.find(".input-group-addon"):c.find(".datepickerbutton")),!d.inline&&!g.is("input"))throw new Error("Could not initialize DateTimePicker without an input element");return e=y(),f=e.clone(),a.extend(!0,d,H()),l.options(d),pa(),la(),g.prop("disabled")&&l.disable(),g.is("input")&&0!==g.val().trim().length?aa(da(g.val().trim())):d.defaultDate&&void 0===g.attr("placeholder")&&aa(d.defaultDate),d.inline&&ga(),l};return a.fn.datetimepicker=function(b){b=b||{};var d,e=Array.prototype.slice.call(arguments,1),f=!0,g=["destroy","hide","show","toggle"];if("object"==typeof b)return this.each(function(){var d,e=a(this);e.data("DateTimePicker")||(d=a.extend(!0,{},a.fn.datetimepicker.defaults,b),e.data("DateTimePicker",c(e,d)))});if("string"==typeof b)return this.each(function(){var c=a(this),g=c.data("DateTimePicker");if(!g)throw new Error('bootstrap-datetimepicker("'+b+'") method was called on an element that is not using DateTimePicker');d=g[b].apply(g,e),f=d===g}),f||a.inArray(b,g)>-1?this:d;throw new TypeError("Invalid arguments for DateTimePicker: "+b)},a.fn.datetimepicker.defaults={timeZone:"",format:!1,dayViewHeaderFormat:"MMMM YYYY",extraFormats:!1,stepping:1,minDate:!1,maxDate:!1,useCurrent:!0,collapse:!0,locale:b.locale(),defaultDate:!1,disabledDates:!1,enabledDates:!1,icons:{time:"glyphicon glyphicon-time",date:"glyphicon glyphicon-calendar",up:"glyphicon glyphicon-chevron-up",down:"glyphicon glyphicon-chevron-down",previous:"glyphicon glyphicon-chevron-left",next:"glyphicon glyphicon-chevron-right",today:"glyphicon glyphicon-screenshot",clear:"glyphicon glyphicon-trash",close:"glyphicon glyphicon-remove"},tooltips:{today:"Go to today",clear:"Clear selection",close:"Close the picker",selectMonth:"Select Month",prevMonth:"Previous Month",nextMonth:"Next Month",selectYear:"Select Year",prevYear:"Previous Year",nextYear:"Next Year",selectDecade:"Select Decade",prevDecade:"Previous Decade",nextDecade:"Next Decade",prevCentury:"Previous Century",nextCentury:"Next Century",pickHour:"Pick Hour",incrementHour:"Increment Hour",decrementHour:"Decrement Hour",pickMinute:"Pick Minute",incrementMinute:"Increment Minute",decrementMinute:"Decrement Minute",pickSecond:"Pick Second",incrementSecond:"Increment Second",decrementSecond:"Decrement Second",togglePeriod:"Toggle Period",selectTime:"Select Time"},useStrict:!1,sideBySide:!1,daysOfWeekDisabled:!1,calendarWeeks:!1,viewMode:"days",toolbarPlacement:"default",showTodayButton:!1,showClear:!1,showClose:!1,widgetPositioning:{horizontal:"auto",vertical:"auto"},widgetParent:null,ignoreReadonly:!1,keepOpen:!1,focusOnShow:!0,inline:!1,keepInvalid:!1,datepickerInput:".datepickerinput",keyBinds:{up:function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")?this.date(b.clone().subtract(7,"d")):this.date(b.clone().add(this.stepping(),"m"))}},down:function(a){if(!a)return void this.show();var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")?this.date(b.clone().add(7,"d")):this.date(b.clone().subtract(this.stepping(),"m"))},"control up":function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")?this.date(b.clone().subtract(1,"y")):this.date(b.clone().add(1,"h"))}},"control down":function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")?this.date(b.clone().add(1,"y")):this.date(b.clone().subtract(1,"h"))}},left:function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")&&this.date(b.clone().subtract(1,"d"))}},right:function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")&&this.date(b.clone().add(1,"d"))}},pageUp:function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")&&this.date(b.clone().subtract(1,"M"))}},pageDown:function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")&&this.date(b.clone().add(1,"M"))}},enter:function(){this.hide()},escape:function(){this.hide()},"control space":function(a){a&&a.find(".timepicker").is(":visible")&&a.find('.btn[data-action="togglePeriod"]').click()},t:function(){this.date(this.getMoment())},delete:function(){this.clear()}},debug:!1,allowInputToggle:!1,disabledTimeIntervals:!1,disabledHours:!1,enabledHours:!1,viewDate:!1},a.fn.datetimepicker}); /** -* @version: 2.1.25 +* @version: 2.1.27 * @author: Dan Grossman http://www.dangrossman.info/ * @copyright: Copyright (c) 2012-2017 Dan Grossman. All rights reserved. * @license: Licensed under the MIT license. See http://www.opensource.org/licenses/mit-license.php -* @website: https://www.daterangepicker.com/ +* @website: http://www.daterangepicker.com/ */ // Follow the UMD template https://github.com/umdjs/umd/blob/master/templates/returnExportsGlobal.js (function (root, factory) { if (typeof define === 'function' && define.amd) { // AMD. Make globaly available as well define('bootstrap-daterangepicker',['moment', 'jquery'], function (moment, jquery) { - return (root.daterangepicker = factory(moment, jquery)); + if (!jquery.fn) jquery.fn = {}; // webpack server rendering + return factory(moment, jquery); }); } else if (typeof module === 'object' && module.exports) { // Node / Browserify @@ -7480,7 +6025,8 @@ return d.keepInvalid=a,l},l.datepickerInput=function(a){if(0===arguments.length) jQuery = require('jquery'); if (!jQuery.fn) jQuery.fn = {}; } - module.exports = factory(require('moment'), jQuery); + var moment = (typeof window != 'undefined' && typeof window.moment != 'undefined') ? window.moment : require('moment'); + module.exports = factory(moment, jQuery); } else { // Browser globals root.daterangepicker = factory(root.moment, root.jQuery); @@ -7882,7 +6428,8 @@ return d.keepInvalid=a,l},l.datepickerInput=function(a){if(0===arguments.length) .on('click.daterangepicker', '.daterangepicker_input input', $.proxy(this.showCalendars, this)) .on('focus.daterangepicker', '.daterangepicker_input input', $.proxy(this.formInputsFocused, this)) .on('blur.daterangepicker', '.daterangepicker_input input', $.proxy(this.formInputsBlurred, this)) - .on('change.daterangepicker', '.daterangepicker_input input', $.proxy(this.formInputsChanged, this)); + .on('change.daterangepicker', '.daterangepicker_input input', $.proxy(this.formInputsChanged, this)) + .on('keydown.daterangepicker', '.daterangepicker_input input', $.proxy(this.formInputsKeydown, this)); this.container.find('.ranges') .on('click.daterangepicker', 'button.applyBtn', $.proxy(this.clickApply, this)) @@ -7896,10 +6443,11 @@ return d.keepInvalid=a,l},l.datepickerInput=function(a){if(0===arguments.length) 'click.daterangepicker': $.proxy(this.show, this), 'focus.daterangepicker': $.proxy(this.show, this), 'keyup.daterangepicker': $.proxy(this.elementChanged, this), - 'keydown.daterangepicker': $.proxy(this.keydown, this) + 'keydown.daterangepicker': $.proxy(this.keydown, this) //IE 11 compatibility }); } else { this.element.on('click.daterangepicker', $.proxy(this.toggle, this)); + this.element.on('keydown.daterangepicker', $.proxy(this.toggle, this)); } // @@ -7959,7 +6507,7 @@ return d.keepInvalid=a,l},l.datepickerInput=function(a){if(0===arguments.length) this.endDate = moment(endDate); if (!this.timePicker) - this.endDate = this.endDate.endOf('day'); + this.endDate = this.endDate.add(1,'d').startOf('day').subtract(1,'second'); if (this.timePicker && this.timePickerIncrement) this.endDate.minute(Math.round(this.endDate.minute() / this.timePickerIncrement) * this.timePickerIncrement); @@ -8830,8 +7378,10 @@ return d.keepInvalid=a,l},l.datepickerInput=function(a){if(0===arguments.length) var customRange = true; var i = 0; for (var range in this.ranges) { - if (this.timePicker) { - if (this.startDate.isSame(this.ranges[range][0]) && this.endDate.isSame(this.ranges[range][1])) { + if (this.timePicker) { + var format = this.timePickerSeconds ? "YYYY-MM-DD hh:mm:ss" : "YYYY-MM-DD hh:mm"; + //ignore times when comparing dates if time picker seconds is not enabled + if (this.startDate.format(format) == this.ranges[range][0].format(format) && this.endDate.format(format) == this.ranges[range][1].format(format)) { customRange = false; this.chosenLabel = this.container.find('.ranges li:eq(' + i + ')').addClass('active').html(); break; @@ -9020,10 +7570,22 @@ return d.keepInvalid=a,l},l.datepickerInput=function(a){if(0===arguments.length) }, + formInputsKeydown: function(e) { + // This function ensures that if the 'enter' key was pressed in the input, then the calendars + // are updated with the startDate and endDate. + // This behaviour is automatic in Chrome/Firefox/Edge but not in IE 11 hence why this exists. + // Other browsers and versions of IE are untested and the behaviour is unknown. + if (e.keyCode === 13) { + // Prevent the calendar from being updated twice on Chrome/Firefox/Edge + e.preventDefault(); + this.formInputsChanged(e); + } + }, + + elementChanged: function() { if (!this.element.is('input')) return; if (!this.element.val().length) return; - if (this.element.val().length < this.locale.format.length) return; var dateString = this.element.val().split(this.locale.separator), start = null, @@ -9051,6 +7613,14 @@ return d.keepInvalid=a,l},l.datepickerInput=function(a){if(0===arguments.length) if ((e.keyCode === 9) || (e.keyCode === 13)) { this.hide(); } + + //hide on esc and prevent propagation + if (e.keyCode === 27) { + e.preventDefault(); + e.stopPropagation(); + + this.hide(); + } }, updateElement: function() { @@ -9072,11 +7642,12 @@ return d.keepInvalid=a,l},l.datepickerInput=function(a){if(0===arguments.length) }; $.fn.daterangepicker = function(options, callback) { + var implementOptions = $.extend(true, {}, $.fn.daterangepicker.defaultOptions, options); this.each(function() { var el = $(this); if (el.data('daterangepicker')) el.data('daterangepicker').remove(); - el.data('daterangepicker', new DateRangePicker(el, options, callback)); + el.data('daterangepicker', new DateRangePicker(el, implementOptions, callback)); }); return this; }; @@ -9191,7 +7762,7 @@ return d.keepInvalid=a,l},l.datepickerInput=function(a){if(0===arguments.length) var createFormCommon = function (pColumns, that) { var htmlForm = []; - var opList = ['=', '>', '>=', '<', '<=', '!=', 'LIKE', 'LIKE %...%', 'NOT LIKE', 'IN', 'NOT IN', 'IN(...)', 'NOT IN(...)', 'BETWEEN', 'NOT BETWEEN', 'RANGE', 'NOT RANGE', 'IS NULL', 'IS NOT NULL']; + var opList = ['=', '>', '>=', '<', '<=', '!=', 'FIND_IN_SET', 'LIKE', 'LIKE %...%', 'NOT LIKE', 'IN', 'NOT IN', 'IN(...)', 'NOT IN(...)', 'BETWEEN', 'NOT BETWEEN', 'RANGE', 'NOT RANGE', 'IS NULL', 'IS NOT NULL']; htmlForm.push(sprintf('', that.options.actionForm)); htmlForm.push('
'); if (that.options.titleForm.length > 0) @@ -9554,6 +8125,7 @@ define("bootstrap-table-commonsearch", ["bootstrap-table"], (function (global) { if (!that.options.templateView) { return; } + that.options.cardView = true; }; @@ -9600,7 +8172,7 @@ define("bootstrap-table-template", ["bootstrap-table","template"], (function (gl }; }(this))); -define('table',['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table', 'bootstrap-table-lang', 'bootstrap-table-mobile', 'bootstrap-table-export', 'bootstrap-table-commonsearch', 'bootstrap-table-template'], function ($, undefined, Moment) { +define('table',['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table', 'bootstrap-table-lang', 'bootstrap-table-export', 'bootstrap-table-commonsearch', 'bootstrap-table-template'], function ($, undefined, Moment) { var Table = { list: {}, // Bootstrap-table 基础配置 @@ -9634,7 +8206,6 @@ define('table',['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstr paginationPreText: __("Previous"), paginationNextText: __("Next"), paginationLastText: __("Last"), - mobileResponsive: true, //是否自适应移动端 cardView: false, //卡片视图 checkOnInit: true, //是否在初始化时判断 escape: true, //是否对内容进行转义 @@ -9754,7 +8325,7 @@ define('table',['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstr } }); // 处理选中筛选框后按钮的状态统一变更 - table.on('check.bs.table uncheck.bs.table check-all.bs.table uncheck-all.bs.table fa.event.check', function () { + table.on('check.bs.table uncheck.bs.table check-all.bs.table uncheck-all.bs.table', function () { var ids = Table.api.selectedids(table); $(Table.config.disabledbtn, toolbar).toggleClass('disabled', !ids.length); }); @@ -9778,7 +8349,7 @@ define('table',['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstr Fast.api.ajax({ url: options.extend.import_url, data: {file: data.url}, - }, function () { + }, function (data, ret) { table.bootstrapTable('refresh'); }); }); @@ -9819,7 +8390,8 @@ define('table',['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstr $("tbody", table).dragsort({ itemSelector: 'tr:visible', dragSelector: "a.btn-dragsort", - dragEnd: function () { + dragEnd: function (a, b) { + var element = $("a.btn-dragsort", this); var data = table.bootstrapTable('getData'); var current = data[parseInt($(this).data("index"))]; var options = table.bootstrapTable('getOptions'); @@ -9840,7 +8412,21 @@ define('table',['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstr table: options.extend.table } }; - Fast.api.ajax(params, function (data) { + Fast.api.ajax(params, function (data, ret) { + var success = $(element).data("success") || $.noop; + if (typeof success === 'function') { + if (false === success.call(element, data, ret)) { + return false; + } + } + table.bootstrapTable('refresh'); + }, function () { + var error = $(element).data("error") || $.noop; + if (typeof error === 'function') { + if (false === error.call(element, data, ret)) { + return false; + } + } table.bootstrapTable('refresh'); }); }, @@ -9848,7 +8434,9 @@ define('table',['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstr }); }); $(table).on("click", "input[data-id][name='checkbox']", function (e) { - table.trigger('fa.event.check'); + var ids = $(this).data("id"); + var row = Table.api.getrowbyid(ids); + table.trigger('check.bs.table', [row, this]); }); $(table).on("click", "[data-id].btn-change", function (e) { e.preventDefault(); @@ -9857,14 +8445,7 @@ define('table',['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstr $(table).on("click", "[data-id].btn-edit", function (e) { e.preventDefault(); var ids = $(this).data("id"); - var row = {}; - var options = table.bootstrapTable("getOptions"); - $.each(table.bootstrapTable('getData'), function (i, j) { - if (j[options.pk] == ids) { - row = j; - return false; - } - }); + var row = Table.api.getrowbyid(ids); row.ids = ids; var url = Table.api.replaceurl(options.extend.edit_url, row, table); Fast.api.open(url, __('Edit'), $(this).data() || {}); @@ -9895,8 +8476,21 @@ define('table',['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstr url = this.replaceurl(url, {ids: ids}, table); var params = typeof data.params !== "undefined" ? (typeof data.params == 'object' ? $.param(data.params) : data.params) : ''; var options = {url: url, data: {action: action, ids: ids, params: params}}; - Fast.api.ajax(options, function (data) { + Fast.api.ajax(options, function (data, ret) { + var success = $(element).data("success") || $.noop; + if (typeof success === 'function') { + if (false === success.call(element, data, ret)) { + return false; + } + } table.bootstrapTable('refresh'); + }, function (data, ret) { + var error = $(element).data("error") || $.noop; + if (typeof error === 'function') { + if (false === error.call(element, data, ret)) { + return false; + } + } }); }, // 单元格元素事件 @@ -10123,6 +8717,22 @@ define('table',['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstr index = parseInt(index); var data = table.bootstrapTable('getData'); return typeof data[index] !== 'undefined' ? data[index] : null; + }, + // 根据行索引获取行数据 + getrowbyindex: function (table, index) { + return Table.api.getrowdata(table, index); + }, + // 根据主键ID获取行数据 + getrowbyid: function (table, id) { + var row = {}; + var options = table.bootstrapTable("getOptions"); + $.each(table.bootstrapTable('getData'), function (i, j) { + if (j[options.pk] == id) { + row = j; + return false; + } + }); + return row; } }, }; @@ -10482,7 +9092,7 @@ define('upload',['jquery', 'bootstrap', 'plupload', 'template'], function ($, un return Upload; }); -/*! nice-validator 1.1.2 +/*! nice-validator 1.1.3 * (c) 2012-2017 Jony Zhang , MIT Licensed * https://github.com/niceue/nice-validator */ @@ -10999,7 +9609,7 @@ define('upload',['jquery', 'bootstrap', 'plupload', 'template'], function ($, un var me = this, opt = me.options, form = e.target, - canSubmit = e.type === 'submit' && !e.isDefaultPrevented(); + canSubmit = e.type === 'submit' && form.tagName === 'FORM' && !e.isDefaultPrevented(); e.preventDefault(); @@ -11374,6 +9984,9 @@ define('upload',['jquery', 'bootstrap', 'plupload', 'template'], function ($, un isValid = true; } } + else { + isValid = !!ret + } rule = field._rules[field._i]; if (rule.not) { @@ -11769,7 +10382,7 @@ define('upload',['jquery', 'bootstrap', 'plupload', 'template'], function ($, un msgHide.call(me, $msgbox, msgOpt.type); } else { $msgbox[0].style.display = 'none'; - $msgbox[0].innerHTML = null; + $msgbox[0].innerHTML = ''; } }, @@ -12810,6 +11423,9 @@ define('form',['jquery', 'bootstrap', 'upload', 'validator'], function ($, undef Form.api.submit($(ret), function (data, ret) { that.holdSubmit(false); submitBtn.removeClass("disabled"); + if (false === $(this).triggerHandler("success.form", [data, ret])) { + return false; + } if (typeof success === 'function') { if (false === success.call($(this), data, ret)) { return false; @@ -12824,6 +11440,9 @@ define('form',['jquery', 'bootstrap', 'upload', 'validator'], function ($, undef return false; }, function (data, ret) { that.holdSubmit(false); + if (false === $(this).triggerHandler("error.form", [data, ret])) { + return false; + } submitBtn.removeClass("disabled"); if (typeof error === 'function') { if (false === error.call($(this), data, ret)) { @@ -12851,13 +11470,25 @@ define('form',['jquery', 'bootstrap', 'upload', 'validator'], function ($, undef if ($(".selectpage", form).size() > 0) { require(['selectpage'], function () { $('.selectpage', form).selectPage({ - source: 'ajax/selectpage', + eAjaxSuccess: function (data) { + data.list = typeof data.rows !== 'undefined' ? data.rows : (typeof data.list !== 'undefined' ? data.list : []); + data.totalRow = typeof data.total !== 'undefined' ? data.total : (typeof data.totalRow !== 'undefined' ? data.totalRow : data.list.length); + return data; + } }); }); //给隐藏的元素添加上validate验证触发事件 - $(form).on("change", ".selectpage-input-hidden", function () { + $(document).on("change", ".sp_hidden", function () { $(this).trigger("validate"); }); + $(document).on("change", ".sp_input", function () { + $(this).closest(".sp_container").find(".sp_hidden").trigger("change"); + }); + $(form).on("reset", function () { + setTimeout(function () { + $('.selectpage', form).selectPageClear(); + }, 1); + }); } }, cxselect: function (form) { @@ -12902,6 +11533,48 @@ define('form',['jquery', 'bootstrap', 'upload', 'validator'], function ($, undef }); } }, + daterangepicker: function (form) { + //绑定日期时间元素事件 + if ($(".datetimerange", form).size() > 0) { + require(['bootstrap-daterangepicker'], function () { + var ranges = {}; + ranges[__('Today')] = [Moment().startOf('day'), Moment().endOf('day')]; + ranges[__('Yesterday')] = [Moment().subtract(1, 'days').startOf('day'), Moment().subtract(1, 'days').endOf('day')]; + ranges[__('Last 7 Days')] = [Moment().subtract(6, 'days').startOf('day'), Moment().endOf('day')]; + ranges[__('Last 30 Days')] = [Moment().subtract(29, 'days').startOf('day'), Moment().endOf('day')]; + ranges[__('This Month')] = [Moment().startOf('month'), Moment().endOf('month')]; + ranges[__('Last Month')] = [Moment().subtract(1, 'month').startOf('month'), Moment().subtract(1, 'month').endOf('month')]; + var options = { + timePicker: false, + autoUpdateInput: false, + timePickerSeconds: true, + timePicker24Hour: true, + autoApply: true, + locale: { + format: 'YYYY-MM-DD HH:mm:ss', + customRangeLabel: __("Custom Range"), + applyLabel: __("Apply"), + cancelLabel: __("Clear"), + }, + ranges: ranges, + }; + var origincallback = function (start, end) { + $(this.element).val(start.format(options.locale.format) + " - " + end.format(options.locale.format)); + $(this.element).trigger('blur'); + }; + $(".datetimerange", form).each(function () { + var callback = typeof $(this).data('callback') == 'function' ? $(this).data('callback') : origincallback; + $(this).on('apply.daterangepicker', function (ev, picker) { + callback.call(picker, picker.startDate, picker.endDate); + }); + $(this).on('cancel.daterangepicker', function (ev, picker) { + $(this).val('').trigger('blur'); + }); + $(this).daterangepicker($.extend({}, options, $(this).data()), callback); + }); + }); + } + }, plupload: function (form) { //绑定plupload上传元素事件 if ($(".plupload", form).size() > 0) { @@ -13057,6 +11730,8 @@ define('form',['jquery', 'bootstrap', 'upload', 'validator'], function ($, undef events.selectpicker(form); + events.daterangepicker(form); + events.selectpage(form); events.cxselect(form); @@ -13676,304 +12351,188 @@ define("addtabs", function(){}); /** * @summary SelectPage - * @desc 基于jQuery及使用Bootstrap环境开发的,下拉列表带输入快速查找及结果分页展示的多功能选择器 + * @desc Simple and powerful selection plugin * @file selectpage.js - * @version 2.7 + * @version 2.18 * @author TerryZeng * @contact https://terryz.github.io/ * @license MIT License * - * 插件的部分功能使用、借鉴了 - * jQuery Plugin: jquery.ajax-combobox - * 作者:Yuusaku Miyazaki (宮崎 雄策) - * - * 插件依赖: - * jQuery1.x - * font-awesome(图标库) - * - * 基本功能: - * 可实时搜索的下拉列表 - * 对待选择的下拉项目可进行分页 - * 可使用键盘快捷分页操作 - * 使用标签的方式支持下拉项目多选 - * - * 修改记录: - * 2016.04.20 - * 增加参数autoSelectFirst(是否自动选择列表中的第一项内容) - * 解决下拉分页有初始化内容,并删除部分关键字时显示的结果集列表不足一页时,分页栏没有被生成的问题 - * 增加参数autoFillResult(是否自动填充内容) - * 增加参数noResultClean(是否清空无匹配结果的输入关键字) - * 2016.06.29 - * 修复分页栏鼠标点击时跳转的页数不正常的问题 - * 2016.08.04 - * 修复因宽度变化导致下拉触发按钮位置在出现下拉列表后发生偏移,原因是原控件的触发按钮是在输入框外部扩展,现已移入输入框内部 - * 2016.08.10 - * 弹出下拉列表时,若有已选中的项目,则将已选中的项目进行高亮,否则对第一行进行高亮 - * 下拉列表展开时,鼠标点击列表区域外,若当前列表已有选中项目,则直接隐藏列表;若当前列表没有默认选中项目,则使用当前高亮项目的内容进行设置 - * 2016.08.12 - * 解决控件对于原始input设置的样式(bootstrap原生提供的宽度样式),宽度显示不正常的问题 - * 增加若设置了formatItem格式函数,则进行匹配的数据源从showField改为formatItem后的结果进行匹配 - * 2016.10 - * 增加光标进入输入框时,打开下拉列表的功能 - * 2017.01.16 - * 解决输入关键进行搜索并有匹配结果时,失去焦点后,没有自动选中第一项 - * 2017.01.19 - * 取消在输入状态时,判断到输入框里内容为空时,隐藏下拉列表的操作 - * 在展示下拉列表时,判断默认与输入框左对齐的列表是否会超出屏幕边界,是则右对齐,否则默认左对齐 - * 2017.01.20 - * 增加下拉列表展示之前判断列表的面板是否会超出底部区域,若超出则将列表向上对齐展示 - * 处理下拉列表显示一次操作显示多次的问题 - * 增加控件已有选中值时,在显示下拉列表时,直接跳转到该项目所在的页 - * 修复一些点击输入框出现下拉列表的Bug - * 2017.03.24 - * 解决下拉分页插件向上浮动时位置不正确的问题 - * 解决下拉分页插件在已有选中值时,再次点击输入框后,打开的列表分页栏翻页功能无效的问题 - * 2017.04.21 - * 解决打开noResultClean参数,没有匹配输入关键词的项目时,列表不隐藏的问题 - * 2017.04.24 - * 解决控件在设置disabled="disabled"禁用状态时,点击向下的三角尖也可以打开列表的问题 - * 增加控件在已有选中项目时,直接删除输入框中的内容,作为清空控件内容的功能 - * 修改失去焦点的范围从document.body到document - * 优化键盘输入捕捉的方式 - * 原列表有多页的情况下,再输入关键字,没有匹配到任何项目时,分页条的下一页,最后一页为可点击的样式,且分页信息的内容也不正确 - * 2017.05 - * 代码重构 - * 增加多项选择东西,并以标签(Tag)的形式展现在输入框中 - * 修正插件外框宽度问题 - * 修改选中事件回调的入参从key,value改为选中行的原始数据对象,以便更灵活的数据处理 - * 2017.06 - * 修复部分样式问题 - * 2017.06.13 - * 改名SelectPage - * 2017.06.24 - * 增加Bootstrap3样式支持 - * 2017.08.08 - * 修复界面上排版内容较少时,列表会向上展示开的问题 - * 增加多选模式下的控制按钮区域,功能:“全选本页”、“取消本页”、“清空全部” - * 修复最大宽度下超出父容器的宽度问题 - * 修复ajax模式报错的问题 - * 增加eAjaxSuccess请求成功后的数据处理回调 - * 2017.08.13(v2.0) - * 代码重构 - * 修改默认样式,使用更简洁的风格 - * 增加maxSelectLimit参数,设置多选模式下最大选择个数限制 - * 增加eTagRemove回调函数,在多选模式下,移除标签时触发的回调 - * 优化错误信息展示的交互方式 - * 增加初始化选中项目时(多选模式),允许设置多个内容,例如:data-init="1,2,3,4" - * 修复键盘操作分页部分情况下会失效的问题 - * 增加selectToCloseList参数,用于设置在多选模式下,选择项目后不关闭列表 - * 修复selectToCloseList:false状态下,键盘操作会失去焦点,操作不连贯的问题 - * 增加$.fn.selectPageClear的API,用于清空控件所有已选中的项目 - * 增加$.fn.selectPageText的API,用于获得已选择的项目文本内容 - * 增加$.fn.selectPageData的API,用于动态修改插件数据源 - * 增加$.fn.SelectedRefresh的API,用于在使用.val()的方式修改了插件的选中项目后,刷新显示在输入框中的文本内容 - * 优化控件内部对象缓存机制 - * 去除快速使用脚本b.selectpage.js - * 初始化入口从原来的$('').bSelectPage({})修改为$('').selectPage({}) - * 重新调整参数名称 - * 修正Bootstrap3下控件宽度、高度应用的BUG - * 2017.08.19(v2.2) - * 增加为原始输入框的value属性设置初始化值,以初始化插件选中项目 - * 修复多选模式下关闭标签出错的问题 - * 修复输入查询关键字后失去焦点,再次获得焦点时,插件没有根据已存在的关键进行过滤 - * 增加inputDelay配置项目,设置ajax数据源模式下,延迟输入查询的时间,避免在单位时间内连续输入发起的连续ajax查询,单位:秒,默认值:0.5 - * 修正对数字类型的列进行排序时,仍然以字符串的方式进行排序 - * 2017.08.23(v2.3) - * 修复在查询关键字状态下,分页数据没有被更新,导致分页按钮功能不正常问题 - * 清理整理内部对象 - * 修复多选模式下,若设置了最大选中项目个数,点击“全选本页”按钮时,仅选中指定的最大数量 - * 增加selectpage.base.css兼容无UI框架的方案,但建议要至少使用normalize.css - * 2017.08.26(v2.4) - * 增加pagination参数,指定稿件是否使用分页加载数据,以及显示分页栏 - * 增加listSize参数,指定了不使用分页的列表,显示的高度,单位为个(选项个数),默认显示10个项目的高度 - * 设置selectOnly:true的情况下,输入框为只读模式,不允许输入查询过滤 - * 修复多选模式下及设置了最大选中项目时,选中了项目再次点击“全选本页”按钮会在已选择的基础上增加最大选中项目个数的项目 - * 调整下拉列表样式及位置 - * 增加单选模式下,选中项目后,自动显示清空按钮 - * 修复多选模式下,移除本页和清除所有两个按钮点击后,回调出错的问题 - * 增加搜索无结果时显示提示信息 - * 2017.09.07(v2.5) - * 修复多选模式下,初始化项目的显示文本没有使用formatItem回调进行格式化 - * 修复ajax数据源模式下,输入查询关键字时,翻页始终为第一页的问题 - * 2017.09.07(v2.6) - * 修复单选模式下初始化项目的显示文本没有使用formatItem回调格式化的问题 - * 修复单选模式存在初始化项目时,再打开下拉列表时,仅显示匹配的项目一条数据的问题 - * 修复多选模式下,动态修改选中值selectPageRefresh功能无效 - * 2017.09.12(v2.7) - * 增加eClear回调,单选模式下,清除按钮的功能回调 - * 单选,多选模式下,输入框禁用或只读状态,不显示清除按钮 - * 2017.09.23(v2.8) - * 调整部分样式 - * 修复可视区域高度较小时,列表始终会向上展开的问题 - * 分离键盘事件处理,对键盘输入精准控制 - * 优化区域外点击处理 - * 优化数据展示渲染效率 - * 优化列表位置定位的准确性 */ ; -(function (factory) { - if (typeof define === "function" && define.amd) { - // AMD模式 - define('selectpage',["jquery"], factory); - } else { - // 全局模式 - factory(jQuery); - } -}(function ($) { +(function ($) { "use strict"; /** - * @desc 默认参数集 + * Default options */ var defaults = { /** - * @desc 数据源(String:Ajax查询的URL|Object:JSON格式的数据源) + * Data source * @type {string|Object} - * @example - * string:服务端请求的URL地址 - * Object:JSON格式数组,推荐格式:[{a:1,b:2,c:3},{...}] + * + * string:server side request url address + * Object:JSON array,format:[{a:1,b:2,c:3},{...}] */ data: undefined, /** - * @desc 插件显示语言 ('ja', 'en', 'es', 'pt-br'等) - * @type string 默认'cn' + * Language ('cn', 'en', 'ja', 'es', 'pt-br') + * @type string + * @default 'cn' */ lang: 'cn', /** - * @desc 是否为多选模式(标签模式) - * @type boolean 默认值false + * Multiple select mode(tags) + * @type boolean + * @default false */ multiple: false, /** - * @desc 是否分页 - * @type boolean 默认值 true + * pagination or not + * @type boolean + * @default true */ pagination: true, /** - * @desc 关闭分页的状态下,列表显示的项目个数,其它的项目以滚动条滚动方式展现 - * @type number 默认值 10 + * Show up menu button + * @type boolean + * @default true + */ + dropButton: true, + /** + * Result list visible size in pagination bar close + * @type number + * @default 10 */ listSize: 10, /** - * @desc 是否启用多选模式的控制按钮区域 - * 仅multiple: true模式下可用 - * @type boolean 默认值true + * Show control bar in multiple select mode + * @type boolean + * @default true */ multipleControlbar: true, /** - * @desc 多选模式下最大选择个数,0为不限制 - * @type number 默认0 + * Max selected item limited in multiple select mode + * @type number + * @default 0(unlimited) */ maxSelectLimit: 0, /** - * @desc 选中项目后关闭列表 - * 该设置仅在多选模式下multiple:true有效 - * @type boolean 默认值true + * Select result item to close list, work on multiple select mode + * @type boolean + * @default false */ - selectToCloseList: true, + selectToCloseList: false, /** - * @desc 插件初始值指定,该值会与option.keyField字段进行匹配,若匹配到,则自动设置选中并高亮 + * Init selected item key, the result will match to option.keyField option * @type string */ initRecord: undefined, /** - * @desc 使用ajax方式获取数据时,使用该参数设置对应的数据表名 + * The table parameter in server side mode * @type string */ dbTable: 'tbl', /** - * @desc 值字段,通常该字段的内容会自动保存在隐藏域中 - * @type string 默认值为'id' + * The value field, the value will fill to hidden element + * @type string + * @default 'id' */ keyField: 'id', /** - * @desc 结果集中用于显示的属性名 - * @type string 默认字段为'name' + * The show text field, the text will show to input element or tags(multiple mode) + * @type string + * @default 'name' */ showField: 'name', /** - * @desc 查询字段,仅为使用URL(ajax)方式查询服务端时,设置后端查询的字段,不设置则默认使用showField设置的字段 + * Actually used to search field * @type string */ searchField: undefined, /** - * @desc 查询方式 ('AND' or 'OR') - * @type string 默认为'AND' + * Search type ('AND' or 'OR') + * @type string + * @default 'AND' */ andOr: 'AND', /** - * @desc 数据排序方式 - * @type array 若不设置则默认对showField指定的字段进行排序 + * Result sort type + * @type array - if not set, will default used showField field * @example - * orderBy : ['id desc']//对ID字段进行降序排序 + * orderBy : ['id desc'] */ orderBy: undefined, /** - * @desc 每页显示的记录数 + * Page size * @type number + * @default 10 */ pageSize: 10, /** - * @desc 使用URL进行AJAX查询时,可传递查询参数 + * Server side request parameters * @type function * @return object * @example params : function(){return {'name':'aa','sex':1};} */ params: undefined, /** - * 列表项目显示内容格式化 - * 参数类型:function - * @type boolean - * @param data {object} 行数据object格式 + * Custom result list item show text + * @type function + * @param data {object} row data * @return string */ formatItem: undefined, /** - * 是否在输入框获得焦点时,展开下拉窗口 - * @type boolean 默认值true + * Have some highlight item and lost focus, auto select the highlight item + * @type boolean + * @default false */ - focusDropList: true, + autoFillResult: false, /** - * 是否自动选择列表中的第一项内容(输入关键字查询模式,直接使用鼠标下拉并不触发) - * @type boolean 默认值false + * Auto select first item in show up result list or search result + * depend on `autoFillResult` option set to true + * @type boolean + * @default false */ - autoSelectFirst: true, + autoSelectFirst: false, /** - * 是否自动填充内容 - * 若有列表项目被高亮显示,在焦点离开控件后,自动设置该项为选中内容 - * @type boolean 默认值false - */ - autoFillResult: true, - /** - * 是否清空输入关键字 - * 在输入框中输入内容进行查询,但没有匹配的内容返回,在焦点离开控件后,自动清空输入框输入的内容 - * @type boolean 默认值false + * Whether clear input element text when enter some keywords to search and no result return + * @type boolean + * @default true */ noResultClean: true, /** - * @desc 只选择模式 + * Select only mode * @type boolean */ selectOnly: false, /** - * @desc 输入关键字查询延迟(仅ajax数据源模式下可用) - * @type number 默认值:0.5秒 + * Input to search delay time, work on ajax data source + * @type number + * @default 0.5 */ inputDelay: 0.5, /** - * -----------------------------------------事件回调-------------------------------------------- + * -----------------------------------------Callback-------------------------------------------- */ /** + * Result list item selected callback * @type function - * @param object - * @param dom + * @param object - selected item json data + * @param self - plugin object */ eSelect: undefined, /** - * ajax请求模式,请求成功后的数据处理回调 - * 回调的功能用于自定义处理服务端返回的数据 + * Before result list show up callback, you can do anything prepared + * @param self - plugin object + */ + eOpen: undefined, + /** + * Server side return data convert callback * @type function - * @param data {object} ajax服务端返回的json数据 - * @return {object} 函数返回的数据结构如下: + * @param data {object} server side return data + * @param self {object} plugin object + * @return {object} return data format: * @example * { * list : [{name:'aa',sex:1},{name:'bb',sex:1}...], @@ -13982,27 +12541,28 @@ define("addtabs", function(){}); */ eAjaxSuccess: undefined, /** - * 多选模式下,关闭标签是的回调函数 + * Close selected item tag callback (multiple mode) * @type function - * @param removeCount 被移除的个数 + * @param removeCount {number} remove item count + * @param self {object} plugin object */ eTagRemove: undefined, /** - * 单选模式下,选中项目后的清除按钮功能回调 + * Clear selected item callback(single select mode) * @type function + * @param self {object} plugin object */ eClear: undefined }; /** + * SelectPage class definition * @constructor - * @classdesc 插件初始化 - * @param {Object} input - 插件的初始化输入框元素。 - * @param {Object} option - 初始化参数 + * @param {Object} input - input element + * @param {Object} option */ var SelectPage = function (input, option) { - var option = $.extend({}, option, $(input).data()); //特殊字段处理 $.each({data: 'source', keyField: 'primaryKey', showField: 'field', pageSize: 'perPage'}, function (i, j) { if (typeof option[j] !== 'undefined') { @@ -14011,11 +12571,10 @@ define("addtabs", function(){}); } }); this.setOption(option); - this.setLanguage(); this.setCssClass(); this.setProp(); - this.setElem(input, option); + this.setElem(input); this.setButtonAttrDefault(); this.setInitRecord(); @@ -14025,69 +12584,55 @@ define("addtabs", function(){}); this.eWhole(); }; /** - * 插件版本号 + * Plugin version number */ - SelectPage.version = '2.7'; + SelectPage.version = '2.18'; /** - * 插件缓存内部对象的KEY + * Plugin object cache key */ SelectPage.dataKey = 'selectPageObject'; /** - * 全局范围设置当前点击是否为插件自身的标识 - */ - SelectPage.objStatusKey = 'selectPage-self-mark'; - /** - * 全局范围设置当前点击的selectpage的索引下标 - */ - SelectPage.objStatusIndex = 'selectPage-self-index'; - /** - * @desc 参数初始化 - * @param {Object} option - 参数集 + * Options set + * @param {Object} option */ SelectPage.prototype.setOption = function (option) { + //use showField to default + option.searchField = option.searchField || option.showField; - //若没有设置搜索字段,则使用显示字段作为搜索字段 - option.searchField = (option.searchField === undefined) ? option.showField : option.searchField; - - //统一大写 option.andOr = option.andOr.toUpperCase(); if (option.andOr !== 'AND' && option.andOr !== 'OR') option.andOr = 'AND'; - //将参数内容从使用","分隔的字符串转换为数组 + //support multiple field set var arr = ['searchField']; for (var i = 0; i < arr.length; i++) { option[arr[i]] = this.strToArray(option[arr[i]]); } - //设置排序字段 - option.orderBy = (option.orderBy === undefined) ? option.searchField : option.orderBy; + //set default order field + option.orderBy = option.orderBy || option.showField; - //设置多字段排序 - //例: [ ['id', 'ASC'], ['name', 'DESC'] ] + //set multiple order field + //example: [ ['id', 'ASC'], ['name', 'DESC'] ] option.orderBy = this.setOrderbyOption(option.orderBy, option.showField); - //多选模式下,若设置了选择项目不关闭列表功能,则强制关闭自动选择第一项功能和自动选中高亮的项目功能 - //原因是打开了会总是莫明选择了第一项,体验不佳 + //close auto fill result and auto select first in multiple mode and select item not close list if (option.multiple && !option.selectToCloseList) { option.autoFillResult = false; option.autoSelectFirst = false; } - - if ($.type(option.data) === 'string') { - option.autoSelectFirst = false; - } - //若不需要分页功能,则将所有数据都显示出来,上限200项 + //show all item when pagination bar close, limited 200 if (!option.pagination) option.pageSize = 200; if ($.type(option.listSize) !== 'number' || option.listSize < 0) option.listSize = 10; + this.option = option; }; /** - * @desc 字符串转换为数组 - * @param str {string} - 字符串 - * @return {Array} - 数组 + * String convert to array + * @param str {string} + * @return {Array} */ SelectPage.prototype.strToArray = function (str) { if (!str) @@ -14096,10 +12641,10 @@ define("addtabs", function(){}); }; /** - * @desc 设置多字段排序 - * @param {Array} arg_order - 排序顺序 - * @param {string} arg_field - 字段 - * @return {Array} - 处理后的排序字段内容 + * Set order field + * @param {Array} arg_order + * @param {string} arg_field + * @return {Array} */ SelectPage.prototype.setOrderbyOption = function (arg_order, arg_field) { var arr = [], orders = []; @@ -14116,39 +12661,12 @@ define("addtabs", function(){}); }; /** - * @desc 界面文字国际化 + * i18n */ SelectPage.prototype.setLanguage = function () { - var message; - switch (this.option.lang) { - // German - case 'de': - message = { - add_btn: 'Hinzufügen-Button', - add_title: 'Box hinzufügen', - del_btn: 'Löschen-Button', - del_title: 'Box löschen', - next: 'Nächsten', - next_title: 'Nächsten' + this.option.pageSize + ' (Pfeil-rechts)', - prev: 'Vorherigen', - prev_title: 'Vorherigen' + this.option.pageSize + ' (Pfeil-links)', - first_title: 'Ersten (Umschalt + Pfeil-links)', - last_title: 'Letzten (Umschalt + Pfeil-rechts)', - get_all_btn: 'alle (Pfeil-runter)', - get_all_alt: '(Button)', - close_btn: 'Schließen (Tab)', - close_alt: '(Button)', - loading: 'lade...', - loading_alt: '(lade)', - page_info: 'num_page_top - num_page_end von cnt_whole', - select_ng: 'Achtung: Bitte wählen Sie aus der Liste aus.', - select_ok: 'OK : Richtig ausgewählt.', - not_found: 'nicht gefunden', - ajax_error: 'Bei der Verbindung zum Server ist ein Fehler aufgetreten.' - }; - break; - - // English + var message, p = this.option; + switch (p.lang) { + // English case 'en': message = { add_btn: 'Add button', @@ -14156,9 +12674,9 @@ define("addtabs", function(){}); del_btn: 'Del button', del_title: 'delete a box', next: 'Next', - next_title: 'Next' + this.option.pageSize + ' (Right key)', + next_title: 'Next' + p.pageSize + ' (Right key)', prev: 'Prev', - prev_title: 'Prev' + this.option.pageSize + ' (Left key)', + prev_title: 'Prev' + p.pageSize + ' (Left key)', first_title: 'First (Shift + Left key)', last_title: 'Last (Shift + Right key)', get_all_btn: 'Get All (Down key)', @@ -14167,25 +12685,30 @@ define("addtabs", function(){}); close_alt: '(button)', loading: 'loading...', loading_alt: '(loading)', - page_info: 'num_page_top - num_page_end of cnt_whole', + page_info: 'page_num of page_count', select_ng: 'Attention : Please choose from among the list.', select_ok: 'OK : Correctly selected.', not_found: 'not found', - ajax_error: 'An error occurred while connecting to server.' + ajax_error: 'An error occurred while connecting to server.', + clear: 'Clear content', + select_all: 'Select current page', + unselect_all: 'Clear current page', + clear_all: 'Clear all selected', + max_selected: 'You can only select up to max_selected_limit items' }; break; - // 中文 case 'cn': + default: message = { add_btn: '添加按钮', add_title: '添加区域', del_btn: '删除按钮', del_title: '删除区域', next: '下一页', - next_title: '下' + this.option.pageSize + ' (→)', + next_title: '下' + p.pageSize + ' (→)', prev: '上一页', - prev_title: '上' + this.option.pageSize + ' (←)', + prev_title: '上' + p.pageSize + ' (←)', first_title: '首页 (Shift + ←)', last_title: '尾页 (Shift + →)', get_all_btn: '获得全部 (↓)', @@ -14194,92 +12717,16 @@ define("addtabs", function(){}); close_alt: '(按钮)', loading: '读取中...', loading_alt: '(读取中)', - page_info: 'num_page_top - num_page_end (共 cnt_whole)', + page_info: '第 page_num 页(共page_count页)', select_ng: '请注意:请从列表中选择.', select_ok: 'OK : 已经选择.', not_found: '无查询结果', - ajax_error: '连接到服务器时发生错误!' - }; - break; - - // Spanish - case 'es': - message = { - add_btn: 'Agregar boton', - add_title: 'Agregar una opcion', - del_btn: 'Borrar boton', - del_title: 'Borrar una opcion', - next: 'Siguiente', - next_title: 'Proximas ' + this.option.pageSize + ' (tecla derecha)', - prev: 'Anterior', - prev_title: 'Anteriores ' + this.option.pageSize + ' (tecla izquierda)', - first_title: 'Primera (Shift + Left)', - last_title: 'Ultima (Shift + Right)', - get_all_btn: 'Ver todos (tecla abajo)', - get_all_alt: '(boton)', - close_btn: 'Cerrar (tecla TAB)', - close_alt: '(boton)', - loading: 'Cargando...', - loading_alt: '(Cargando)', - page_info: 'num_page_top - num_page_end de cnt_whole', - select_ng: 'Atencion: Elija una opcion de la lista.', - select_ok: 'OK: Correctamente seleccionado.', - not_found: 'no encuentre', - ajax_error: 'Un error ocurrió mientras conectando al servidor.' - }; - break; - - // Brazilian Portuguese - case 'pt-br': - message = { - add_btn: 'Adicionar botão', - add_title: 'Adicionar uma caixa', - del_btn: 'Apagar botão', - del_title: 'Apagar uma caixa', - next: 'Próxima', - next_title: 'Próxima ' + this.option.pageSize + ' (tecla direita)', - prev: 'Anterior', - prev_title: 'Anterior ' + this.option.pageSize + ' (tecla esquerda)', - first_title: 'Primeira (Shift + Left)', - last_title: 'Última (Shift + Right)', - get_all_btn: 'Ver todos (Seta para baixo)', - get_all_alt: '(botão)', - close_btn: 'Fechar (tecla TAB)', - close_alt: '(botão)', - loading: 'Carregando...', - loading_alt: '(Carregando)', - page_info: 'num_page_top - num_page_end de cnt_whole', - select_ng: 'Atenção: Escolha uma opção da lista.', - select_ok: 'OK: Selecionado Corretamente.', - not_found: 'não encontrado', - ajax_error: 'Um erro aconteceu enquanto conectando a servidor.' - }; - break; - - // Japanese - case 'ja': - message = { - add_btn: '追加ボタン', - add_title: '入力ボックスを追加します', - del_btn: '削除ボタン', - del_title: '入力ボックスを削除します', - next: '次へ', - next_title: '次の' + this.option.pageSize + '件 (右キー)', - prev: '前へ', - prev_title: '前の' + this.option.pageSize + '件 (左キー)', - first_title: '最初のページへ (Shift + 左キー)', - last_title: '最後のページへ (Shift + 右キー)', - get_all_btn: '全件取得 (下キー)', - get_all_alt: '画像:ボタン', - close_btn: '閉じる (Tabキー)', - close_alt: '画像:ボタン', - loading: '読み込み中...', - loading_alt: '画像:読み込み中...', - page_info: 'num_page_top - num_page_end 件 (全 cnt_whole 件)', - select_ng: '注意 : リストの中から選択してください', - select_ok: 'OK : 正しく選択されました。', - not_found: '(0 件)', - ajax_error: 'サーバとの通信でエラーが発生しました。' + ajax_error: '连接到服务器时发生错误!', + clear: '清除内容', + select_all: '选择当前页项目', + unselect_all: '取消选择当前页项目', + clear_all: '清除全部已选择项目', + max_selected: '最多只能选择 max_selected_limit 个项目' }; break; } @@ -14287,20 +12734,19 @@ define("addtabs", function(){}); }; /** - * @desc CSS样式表名称字义 + * Css classname defined */ SelectPage.prototype.setCssClass = function () { var css_class = { container: 'sp_container', - // SelectPage最外层DIV的打开状态 container_open: 'sp_container_open', re_area: 'sp_result_area', + result_open: 'sp_result_area_open', control_box: 'sp_control_box', - //标签及输入框的 + //multiple select mode element_box: 'sp_element_box', - // 分页导航 - navi: 'pagination', - // 下拉结果列表 + navi: 'sp_navi', + //result list results: 'sp_results', re_off: 'sp_results_off', select: 'sp_over', @@ -14309,154 +12755,214 @@ define("addtabs", function(){}); selected: 'sp_selected', input_off: 'sp_input_off', message_box: 'sp_message_box', - // 多选模式的禁用状态样式 disabled: 'sp_disabled', button: 'sp_button', btn_on: 'sp_btn_on', btn_out: 'sp_btn_out', input: 'sp_input', - clear_btn: 'sp_clear_btn' + clear_btn: 'sp_clear_btn', + align_right: 'sp_align_right' }; this.css_class = css_class; }; /** - * @desc 设置属性默认值 + * Plugin inner properties */ SelectPage.prototype.setProp = function () { this.prop = { - //当前页 + //input disabled status + disabled: false, current_page: 1, - //总页数 + //total page max_page: 1, - //是否正在Ajax请求 + //ajax data loading status is_loading: false, xhr: false, - //使用键盘进行分页 key_paging: false, - //使用键盘进行选择 key_select: false, - //上一个选择的项目值 + //last selected item value prev_value: '', - //选中项目的文本内容 + //last selected item text selected_text: '', - //上一次键盘输入的时间 - last_input_time: undefined + last_input_time: undefined, + init_set: false }; this.template = { tag: { - content: '
  • #item_text#×
  • ', + content: '
  • #item_text#
  • ', textKey: '#item_text#', valueKey: '#item_value#' + }, + page: { + current: 'page_num', + total: 'page_count' + }, + msg: { + maxSelectLimit: 'max_selected_limit' } }; }; /** - * @desc 插件HTML结构生成 - * @param {Object} combo_input - 输入框源对象 - * @param {Object} option - 插件参数 + * Get the actual width/height of invisible DOM elements with jQuery. + * Source code come from dreamerslab/jquery.actual + * @param element + * @param method + * @returns {*} */ - SelectPage.prototype.setElem = function (combo_input, option) { - // 1. 生成、替换DOM对象 - var elem = {};//本体 - var orgWidth = $(combo_input).outerWidth(); + SelectPage.prototype.elementRealSize = function (element, method) { + var defaults = { + absolute: false, + clone: false, + includeMargin: false, + display: 'block' + }; + var configs = defaults, $target = element.eq(0), fix, restore, tmp = [], style = '', $hidden; - elem.combo_input = $(combo_input).attr({'autocomplete': 'off'}).addClass(this.css_class.input).wrap('
    '); - //只选择模式设置输入框为只读状态 - if (option.selectOnly) - $(elem.combo_input).prop('readonly', true); - elem.container = $(elem.combo_input).parent().addClass(this.css_class.container); - if ($(elem.combo_input).prop('disabled')) { - if (option.multiple) - $(elem.container).addClass(this.css_class.disabled); + fix = function () { + // get all hidden parents + $hidden = $target.parents().addBack().filter(':hidden'); + style += 'visibility: hidden !important; display: ' + configs.display + ' !important; '; + + if (configs.absolute === true) + style += 'position: absolute !important;'; + + // save the origin style props + // set the hidden el css to be got the actual value later + $hidden.each(function () { + // Save original style. If no style was set, attr() returns undefined + var $this = $(this), thisStyle = $this.attr('style'); + tmp.push(thisStyle); + // Retain as much of the original style as possible, if there is one + $this.attr('style', thisStyle ? thisStyle + ';' + style : style); + }); + }; + + restore = function () { + // restore origin style values + $hidden.each(function (i) { + var $this = $(this), _tmp = tmp[ i ]; + + if (_tmp === undefined) + $this.removeAttr('style'); + else + $this.attr('style', _tmp); + }); + }; + + fix(); + // get the actual value with user specific methed + // it can be 'width', 'height', 'outerWidth', 'innerWidth'... etc + // configs.includeMargin only works for 'outerWidth' and 'outerHeight' + var actual = /(outer)/.test(method) ? + $target[ method ](configs.includeMargin) : + $target[ method ](); + + restore(); + // IMPORTANT, this plugin only return the value of the first element + return actual; + }; + + /** + * Dom building + * @param {Object} combo_input - original input element + */ + SelectPage.prototype.setElem = function (combo_input) { + // 1. build Dom object + var elem = {}, p = this.option, css = this.css_class, msg = this.message, input = $(combo_input); + var orgWidth = input.outerWidth(); + // fix input width in hidden situation + if (orgWidth <= 0) + orgWidth = this.elementRealSize(input, 'outerWidth'); + if (orgWidth < 150) + orgWidth = 150; + + elem.combo_input = input.attr({'autocomplete': 'off'}).addClass(css.input).wrap('
    '); + if (p.selectOnly) + elem.combo_input.prop('readonly', true); + elem.container = elem.combo_input.parent().addClass(css.container); + if (elem.combo_input.prop('disabled')) { + if (p.multiple) + elem.container.addClass(css.disabled); else - $(elem.combo_input).addClass(this.css_class.input_off); + elem.combo_input.addClass(css.input_off); } - //$(elem.container).width(orgWidth); + // set outer box width + elem.container.width(orgWidth); - elem.button = $('
    ').addClass(this.css_class.button); - //bootstrap风格的向下三角箭头 - elem.dropdown = $(''); - //单选模式下清除的按钮X - elem.clear_btn = $('
    ').append('×').addClass(this.css_class.clear_btn).attr('title', '清除内容'); + elem.button = $('
    ').addClass(css.button); + //drop down button + elem.dropdown = $(''); + //clear button 'X' in single mode + elem.clear_btn = $('
    ').html($('').addClass('spfont sp-close')).addClass(css.clear_btn).attr('title', msg.clear); + if (!p.dropButton) + elem.clear_btn.addClass(css.align_right); - //多选模式下带标签显示及文本输入的组合框 - elem.element_box = $('
      ').addClass(this.css_class.element_box); - if (option.multiple && option.multipleControlbar) - elem.control = $('
      ').addClass(this.css_class.control_box); - //结果集列表 - elem.result_area = $('
      ').addClass(this.css_class.re_area); - //列表中的分页栏pagination - if (option.pagination) - elem.navi = $('
        ').addClass(this.css_class.navi).addClass("hide"); - elem.results = $('
          ').addClass(this.css_class.results); + //main box in multiple mode + elem.element_box = $('
            ').addClass(css.element_box); + if (p.multiple && p.multipleControlbar) + elem.control = $('
            ').addClass(css.control_box); + //result list box + elem.result_area = $('
            ').addClass(css.re_area); + //pagination bar + if (p.pagination) + elem.navi = $('
            ').addClass('sp_pagination').append('
              '); + elem.results = $('
                ').addClass(css.results); - /** - * 将原输入框的Name交换到Hidden中,因为具体需要保存传递到后端的是ID,而非Title - */ - var namePrefix = '_text'; - //将keyField的值放入"input:hidden" - var input_id = ($(elem.combo_input).attr('id') !== undefined) ? $(elem.combo_input).attr('id') : $(elem.combo_input).attr('name'); - var input_name = ($(elem.combo_input).attr('name') !== undefined) ? $(elem.combo_input).attr('name') : 'selectPage'; - var hidden_name = input_name, + var namePrefix = '_text', + input_id = elem.combo_input.attr('id') || elem.combo_input.attr('name'), + input_name = elem.combo_input.attr('name') || 'selectPage', + hidden_name = input_name, hidden_id = input_id; - // CakePHP使用的措施 例:data[search][user] -> data[search][user_primary_key] - if (input_name.match(/\]$/)) - input_name = input_name.replace(/\]?$/, namePrefix); - else - input_name += namePrefix; - if (input_id.match(/\]$/)) - input_id = input_id.replace(/\]?$/, namePrefix); - else - input_id += namePrefix; - - //将输入框的Name与Hidden的Name进行交换,使得可以将项目的具体ID被保存到后端进行处理 + //switch the id and name attributes of input/hidden element elem.hidden = $('').attr({ name: hidden_name, id: hidden_id }).val(''); - $(elem.combo_input).attr({ - name: input_name, - id: input_id + elem.combo_input.attr({ + name: input_name + namePrefix, + id: input_id + namePrefix }); - // 2. DOM内容放置 - $(elem.container).append(elem.button).append(elem.result_area).append(elem.hidden); - $(elem.button).append(elem.dropdown); - $(elem.result_area).append(elem.results); - if (option.pagination) - $(elem.result_area).append(elem.navi); - - //多选模式下的特殊处理 - if (option.multiple) { - if (option.multipleControlbar) { - $(elem.control).append(''); - $(elem.control).append(''); - $(elem.control).append(''); - $(elem.result_area).prepend(elem.control); - } - $(elem.container).addClass('sp_container_combo'); - $(elem.combo_input).addClass('sp_combo_input').before($(elem.element_box)); - var li = $('
              • ').addClass('input_box'); - $(li).append($(elem.combo_input)); - $(elem.element_box).append($(li)); - if ($(elem.combo_input).attr('placeholder')) - $(elem.combo_input).attr('placeholder_bak', $(elem.combo_input).attr('placeholder')); + // 2. DOM element put + elem.container.append(elem.hidden); + if (p.dropButton) { + elem.container.append(elem.button) + elem.button.append(elem.dropdown); } - - if ($(elem.container).parent().hasClass("input-group")) { - $(elem.container).height($(elem.container).parent().height()); + $(document.body).append(elem.result_area); + elem.result_area.append(elem.results); + if (p.pagination) + elem.result_area.append(elem.navi); + + //Multiple select mode + if (p.multiple) { + if (p.multipleControlbar) { + elem.control.append(''); + elem.control.append(''); + elem.control.append(''); + elem.control_text = $('

                '); + elem.control.append(elem.control_text); + elem.result_area.prepend(elem.control); + } + elem.container.addClass('sp_container_combo'); + elem.combo_input.addClass('sp_combo_input').before(elem.element_box); + var li = $('

              • ').addClass('input_box'); + li.append(elem.combo_input); + elem.element_box.append(li); + if (elem.combo_input.attr('placeholder')) + elem.combo_input.attr('placeholder_bak', elem.combo_input.attr('placeholder')); } this.elem = elem; }; /** - * @desc 将控件的部分内容设置为默认状态 + * Drop down button set to default */ SelectPage.prototype.setButtonAttrDefault = function () { /* @@ -14475,66 +12981,64 @@ define("addtabs", function(){}); } } */ - $(this.elem.button).attr('title', this.message.get_all_btn); - //按钮的title属性修改 - $(this.elem.button).attr('title', this.message.close_btn); + //this.elem.button.attr('title', this.message.get_all_btn); + if (this.option.dropButton) + this.elem.button.attr('title', this.message.close_btn); }; /** - * @desc 为插件设置初始化的选中值(若有指定的话),执行第一步,数据匹配 + * Set item need selected after init + * set selected item ways: + * + * */ SelectPage.prototype.setInitRecord = function (refresh) { - var self = this; - if ($.type($(self.elem.combo_input).data('init')) != 'undefined') - self.option.initRecord = String($(self.elem.combo_input).data('init')); - //若在输入框中放入了初始化值,则将它放到隐藏域中进行选中项目初始化 - //若输入框设置了初始值,同时又设置了data-init属性,那么以data-init属性为优先选择 - if (!self.option.initRecord) - if ($(self.elem.combo_input).val()) - self.option.initRecord = $(self.elem.combo_input).val(); - $(self.elem.combo_input).val(''); - if ((refresh && $(self.elem.hidden).val()) || $.type(self.option.initRecord) === 'string') { - // 初始的KEY值放入隐藏域 - if (!refresh) - $(self.elem.hidden).val(self.option.initRecord); - //将初始值放入控件 - if (typeof self.option.data === 'object') {//json数据源模式 + var self = this, p = self.option, el = self.elem, key = ''; + if ($.type(el.combo_input.data('init')) != 'undefined') + p.initRecord = String(el.combo_input.data('init')); + //data-init and value attribute can be init plugin selected item + //but, if set data-init and value attribute in the same time, plugin will choose data-init attribute first + if (!refresh && !p.initRecord && el.combo_input.val()) + p.initRecord = el.combo_input.val(); + el.combo_input.val(''); + if (!refresh) + el.hidden.val(p.initRecord); + key = refresh && el.hidden.val() ? el.hidden.val() : p.initRecord; + if (key) { + if (typeof p.data === 'object') { var data = new Array(); - var keyarr = refresh ? $(self.elem.hidden).val().split(',') : self.option.initRecord.split(','); + var keyarr = key.split(','); $.each(keyarr, function (index, row) { - for (var i = 0; i < self.option.data.length; i++) { - if (self.option.data[i][self.option.keyField] == row) { - data.push(self.option.data[i]); + for (var i = 0; i < p.data.length; i++) { + if (p.data[i][p.keyField] == row) { + data.push(p.data[i]); break; } } }); - //在单选模式下,若使用了多选模式的初始化值(“key1,key2,...”多选方式),则不进行初始化选中操作 - if (!self.option.multiple && data.length > 1) - data = null; + if (!p.multiple && data.length > 1) + data = [data[0]]; self.afterInit(self, data); - } else {//ajax数据源模式 + } else {//ajax data source mode to init selected item $.ajax({ dataType: 'json', type: 'POST', - url: self.option.data, + url: p.data, data: { - searchTable: self.option.dbTable, - searchKey: self.option.keyField, - searchValue: refresh ? $(self.elem.hidden).val() : self.option.initRecord, - field: self.option.showField, - order_by: self.option.orderBy, - pkey_name: self.option.keyField, - pkey_value: refresh ? $(self.elem.hidden).val() : self.option.initRecord + searchTable: p.dbTable, + searchKey: p.keyField, + searchValue: key, + orderBy: p.orderBy, + showField: p.showField, + keyField: p.keyField, + keyValue: key, + searchField: p.searchField }, - success: function (returnData) { - var data; - if (self.option.eAjaxSuccess && $.isFunction(self.option.eAjaxSuccess)) { - data = self.option.eAjaxSuccess(returnData); - } else { - data = returnData; - } - self.afterInit(self, typeof data.rows !== 'undefined' ? data.rows : (typeof data.list !== 'undefined' ? data.list : [])); + success: function (json) { + var d = null; + if (p.eAjaxSuccess && $.isFunction(p.eAjaxSuccess)) + d = p.eAjaxSuccess(json); + self.afterInit(self, d.list); }, error: function (jqXHR, textStatus, errorThrown) { self.ajaxErrorNotify(self, errorThrown); @@ -14545,280 +13049,221 @@ define("addtabs", function(){}); }; /** - * @desc 匹配后的数据在插件中进行展示 - * @param {Object} self - 插件的内部对象 - * @param {Object} data - 列表数据 + * Selected item set to plugin + * @param {Object} self + * @param {Object} data - selected item data */ SelectPage.prototype.afterInit = function (self, data) { - if (!data) + if (!data || ($.isArray(data) && data.length === 0)) return; if (!$.isArray(data)) data = [data]; - if (data.length === 0) - return; + var p = self.option, css = self.css_class; + var getText = function (row) { - var text = row[self.option.showField]; - if (self.option.formatItem && $.isFunction(self.option.formatItem)) { + var text = row[p.showField]; + if (p.formatItem && $.isFunction(p.formatItem)) { try { - text = self.option.formatItem(row); + text = p.formatItem(row); } catch (e) { } } return text; }; - if (self.option.multiple) {//多选模式初始化 + if (p.multiple) { + self.prop.init_set = true; self.clearAll(self); $.each(data, function (i, row) { - var item = {text: getText(row), value: row[self.option.keyField]}; + var item = {text: getText(row), value: row[p.keyField]}; if (!self.isAlreadySelected(self, item)) self.addNewTag(self, item); }); self.tagValuesSet(self); self.inputResize(self); - } else {//单选模式初始化 + console.log(self.elem.hidden.blur()); + self.prop.init_set = false; + } else { var row = data[0]; - $(self.elem.combo_input).val(getText(row)); - $(self.elem.hidden).val(row[self.option.keyField]); + self.elem.combo_input.val(getText(row)); + self.elem.hidden.val(row[p.keyField]); self.prop.prev_value = getText(row); self.prop.selected_text = getText(row); - if (self.option.selectOnly) { - $(self.elem.combo_input).attr('title', self.message.select_ok).removeClass(self.css_class.select_ng).addClass(self.css_class.select_ok); + if (p.selectOnly) { + self.elem.combo_input.attr('title', self.message.select_ok).removeClass(css.select_ng).addClass(css.select_ok); } self.putClearButton(); } }; /** - * @desc 下拉按钮的事件处理 + * Drop down button event bind */ SelectPage.prototype.eDropdownButton = function () { var self = this; - $(self.elem.button).mouseup(function (ev) { - ev.stopPropagation(); - if ($(self.elem.result_area).is(':hidden') && !$(self.elem.combo_input).prop('disabled')) { - $(self.elem.combo_input).focus(); - } else - self.hideResults(self); - }).mouseout(); // default: mouseout + if (self.option.dropButton) { + self.elem.button.mouseup(function (ev) { + ev.stopPropagation(); + if (self.elem.result_area.is(':hidden') && !self.elem.combo_input.prop('disabled')) { + self.elem.combo_input.focus(); + } else + self.hideResults(self); + }); + } }; /** - * @desc 输入框的事件绑定 + * Events bind */ SelectPage.prototype.eInput = function () { - var self = this; + var self = this, p = self.option, el = self.elem, msg = self.message; var showList = function () { self.prop.page_move = false; self.suggest(self); self.setCssFocusedInput(self); }; - $(self.elem.combo_input).keyup(function (e) { + el.combo_input.keyup(function (e) { self.processKey(self, e); }).keydown(function (e) { self.processControl(self, e); }).focus(function (e) { - //增加输入框获得焦点后,显示数据列表 - if ($(self.elem.result_area).is(':hidden')) { + //When focus on input, show the result list + if (el.result_area.is(':hidden')) { e.stopPropagation(); self.prop.first_show = true; showList(); } }); - $(self.elem.container).on('click.SelectPage', 'div.' + self.css_class.clear_btn, function (e) { + el.container.on('click.SelectPage', 'div.' + self.css_class.clear_btn, function (e) { e.stopPropagation(); - self.clearAll(self); - $(self.elem.clear_btn).remove(); - if (self.option.eClear && $.isFunction(self.option.eClear)) - self.option.eClear(); + if (!self.disabled(self)) { + self.clearAll(self); + self.elem.hidden.change(); + if (p.eClear && $.isFunction(p.eClear)) + p.eClear(self); + } }); - if (self.option.multiple) { - if (self.option.multipleControlbar) { - //全选本页按钮 - $('.sp_select_all', self.elem.control).on('click.SelectPage', function (e) { + el.result_area.on('mousedown.SelectPage', function (e) { + e.stopPropagation(); + }); + if (p.multiple) { + if (p.multipleControlbar) { + //Select all item of current page + el.control.find('.sp_select_all').on('click.SelectPage', function (e) { self.selectAllLine(self); + }).hover(function () { + el.control_text.html(msg.select_all); + }, function () { + el.control_text.html(''); }); - //取消全选本页按钮 - $('.sp_unselect_all', self.elem.control).on('click.SelectPage', function (e) { - self.unselectAllLine(self); + //Cancel select all item of current page + el.control.find('.sp_unselect_all').on('click.SelectPage', function (e) { + self.unSelectAllLine(self); + }).hover(function () { + el.control_text.html(msg.unselect_all); + }, function () { + el.control_text.html(''); }); - //清除全部按钮 - $('.sp_clear_all', self.elem.control).on('click.SelectPage', function (e) { + //Clear all selected item + el.control.find('.sp_clear_all').on('click.SelectPage', function (e) { self.clearAll(self); + }).hover(function () { + el.control_text.html(msg.clear_all); + }, function () { + el.control_text.html(''); }); } - $(self.elem.element_box).on('click.SelectPage', function (e) { + el.element_box.on('click.SelectPage', function (e) { var srcEl = e.target || e.srcElement; if ($(srcEl).is('ul')) - $(self.elem.combo_input).focus(); + el.combo_input.focus(); }); - //标签关闭操作 - //关闭同时需要将该标签的key从已保存的隐藏域中删除 - $(self.elem.element_box).on('click.SelectPage', 'span.tag_close', function () { + //Tag close + el.element_box.on('click.SelectPage', 'span.tag_close', function () { var li = $(this).closest('li'); self.removeTag(self, li); showList(); - if (self.option.eTagRemove && $.isFunction(self.option.eTagRemove)) - self.option.eTagRemove(1); + if (p.eTagRemove && $.isFunction(p.eTagRemove)) + p.eTagRemove(1, self); }); self.inputResize(self); } }; /** - * 插件之外区域的事件处理 + * Out of plugin area click event handler */ SelectPage.prototype.eWhole = function () { - var self = this; - /* - //如果是点击了控件本身则不响应外部鼠标点击事件 - $(self.elem.container).mousedown(function() { - var thisindex = $('div.sp_container').index(this); - var lastindex = $(document.body).data(SelectPage.objStatusIndex); - if(lastindex != undefined && thisindex != lastindex) - $(document.body).data(SelectPage.objStatusKey,false); - else - $(document.body).data(SelectPage.objStatusKey,true); - $(document.body).data(SelectPage.objStatusIndex,thisindex); - }); - */ - //控件外部的鼠标点击事件处理 - $(document).off('mousedown.selectPage').on('mousedown.selectPage', function (e) { + var self = this, css = self.css_class; + var cleanContent = function (obj) { + obj.elem.combo_input.val(''); + if (!obj.option.multiple) + obj.elem.hidden.val(''); + obj.prop.selected_text = ''; + }; + + //Out of plugin area + $(document.body).off('mousedown.selectPage').on('mousedown.selectPage', function (e) { var ele = e.target || e.srcElement; - var sm = $(ele).closest('div.' + self.css_class.container); - - //清除内容 - var cleanContent = function (obj) { - $(obj.elem.combo_input).val(''); - if (!obj.option.multiple) - $(obj.elem.hidden).val(''); - obj.prop.selected_text = ''; - }; - - //列表是打开的状态 - $('div.' + self.css_class.container + '.' + self.css_class.container_open).each(function () { - if (this == sm[0]) + var sp = $(ele).closest('div.' + css.container); + //Open status result list + $('div.' + css.container + '.' + css.container_open).each(function () { + if (this == sp[0]) return; - var d = $('input.' + self.css_class.input, this).data(SelectPage.dataKey); + var $this = $(this), d = $this.find('input.' + css.input).data(SelectPage.dataKey); - - //若控件已有选中的的项目,而文本输入框中清空了关键字,则清空控件已选中的项目 - if (!$(d.elem.combo_input).val() && $(d.elem.hidden).val() && !d.option.multiple) { - d.prop.current_page = 1;//重置当前页为1 + if (!d.elem.combo_input.val() && d.elem.hidden.val() && !d.option.multiple) { + d.prop.current_page = 1;//reset page to 1 cleanContent(d); d.hideResults(d); return true; } - //匹配项且高亮时,下拉分页控件失去焦点后,自动选择该项目 - if ($('li', $(d.elem.results)).size() > 0) { - if (d.option.autoFillResult) {//打开自动内容填充功能 - //若已有选中项目,则直接隐藏列表 - if ($('li.sp_selected', $(d.elem.results)).size() > 0) { + if (d.elem.results.find('li').not('.' + css.message_box).size()) { + if (d.option.autoFillResult) { + //have selected item, then hide result list + if (d.elem.hidden.val()) d.hideResults(d); - } else if ($('li.sp_over', $(d.elem.results)).size() > 0) { - //若控件已有选中的值,则忽略高亮的项目 - if ($(d.elem.hidden).val()) - d.hideResults(d); - //若没有已选中的项目,且列表中有高亮项目时,选中当前高亮的行 - else - d.selectCurrentLine(d, true); + else if (d.elem.results.find('li.sp_over').size()) { + //no one selected and have highlight item, select the highlight item + d.selectCurrentLine(d, true); } else if (d.option.autoSelectFirst) { - //若控件已有选中的值,则忽略自动选择第一项的功能 - if ($(d.elem.hidden).val()) - d.hideResults(d); - else { - //对于没有选中,没有高亮的情况,若插件设置了自动选中第一项时,则选中第一项 - d.nextLine(d); - //self.nextLine(self); - d.selectCurrentLine(d, true); - } + //no one selected, no one highlight, select the first item + d.nextLine(d); + d.selectCurrentLine(d, true); } else d.hideResults(d); } else d.hideResults(d); } else { - //无匹配项目时,自动清空用户输入的关键词 + //when no one item match, clear search keywords if (d.option.noResultClean) cleanContent(d); else { if (!d.option.multiple) - $(d.elem.hidden).val(''); + d.elem.hidden.val(''); } d.hideResults(d); } }); - /* - if ($(document.body).data(SelectPage.objStatusKey)) $(document.body).data(SelectPage.objStatusKey,false); - else { - //清除内容 - var cleanContent = function(obj){ - $(obj.elem.combo_input).val(''); - if(!obj.option.multiple) $(obj.elem.hidden).val(''); - obj.prop.selected_text = ''; - }; - //列表是打开的状态 - $('div.' + self.css_class.container + '.' + self.css_class.container_open).each(function(){ - var d = $('input.'+self.css_class.input,this).data(SelectPage.dataKey); - - //若控件已有选中的的项目,而文本输入框中清空了关键字,则清空控件已选中的项目 - if(!$(d.elem.combo_input).val() && $(d.elem.hidden).val() && !d.option.multiple){ - d.prop.current_page = 1;//重置当前页为1 - cleanContent(d); - d.hideResults(d); - return true; - } - //匹配项且高亮时,下拉分页控件失去焦点后,自动选择该项目 - if ($('li', $(d.elem.results)).size() > 0) { - if(d.option.autoFillResult) {//打开自动内容填充功能 - //若已有选中项目,则直接隐藏列表 - if ($('li.sp_selected', $(d.elem.results)).size() > 0) { - d.hideResults(d); - }else if($('li.sp_over', $(d.elem.results)).size() > 0){ - //若控件已有选中的值,则忽略高亮的项目 - if($(d.elem.hidden).val()) d.hideResults(d); - //若没有已选中的项目,且列表中有高亮项目时,选中当前高亮的行 - else d.selectCurrentLine(d, true); - }else if(d.option.autoSelectFirst){ - //若控件已有选中的值,则忽略自动选择第一项的功能 - if($(d.elem.hidden).val()) d.hideResults(d); - else{ - //对于没有选中,没有高亮的情况,若插件设置了自动选中第一项时,则选中第一项 - d.nextLine(d); - //self.nextLine(self); - d.selectCurrentLine(d, true); - } - }else d.hideResults(d); - }else d.hideResults(d); - } else { - //无匹配项目时,自动清空用户输入的关键词 - if (d.option.noResultClean) cleanContent(d); - else{ - if(!d.option.multiple) $(d.elem.hidden).val(''); - } - d.hideResults(d); - } - }); - } - */ }); }; /** - * @desc 结果列表的事件处理 + * Result list event bind */ SelectPage.prototype.eResultList = function () { - var self = this; - $(self.elem.results).children('li').mouseenter(function () { + var self = this, css = this.css_class; + self.elem.results.children('li').hover(function () { if (self.prop.key_select) { self.prop.key_select = false; return; } - if (!$(this).hasClass(self.css_class.selected) && !$(this).hasClass('sp_message_box')) { - $(this).addClass(self.css_class.select); + if (!$(this).hasClass(css.selected) && !$(this).hasClass(css.message_box)) { + $(this).addClass(css.select); self.setCssFocusedResults(self); } - }).mouseleave(function () { - $(this).removeClass(self.css_class.select); + }, function () { + $(this).removeClass(css.select); }).click(function (e) { if (self.prop.key_select) { self.prop.key_select = false; @@ -14827,37 +13272,66 @@ define("addtabs", function(){}); e.preventDefault(); e.stopPropagation(); - if (!$(this).hasClass(self.css_class.selected)) + if (!$(this).hasClass(css.selected)) self.selectCurrentLine(self, false); }); }; /** - * @desc 分页导航按钮的事件处理 + * Reposition result list when list beyond the visible area */ - SelectPage.prototype.ehNaviPaging = function () { + SelectPage.prototype.eScroll = function () { + var self = this, css = this.css_class; + $(window).on('scroll.SelectPage', function (e) { + $('div.' + css.container + '.' + css.container_open).each(function () { + var $this = $(this), d = $this.find('input.' + css.input).data(SelectPage.dataKey), + offset = d.elem.result_area.offset(), + screenScrollTop = $(window).scrollTop(), + docHeight = $(document).height(), + viewHeight = $(window).height(), + listHeight = d.elem.result_area.outerHeight(), + listBottom = offset.top + listHeight, + hasOverflow = docHeight > viewHeight, + down = d.elem.result_area.hasClass('shadowDown'); + if (hasOverflow) { + if (down) {//open down + if (listBottom > (viewHeight + screenScrollTop)) + d.calcResultsSize(d); + } else {//open up + if (offset.top < screenScrollTop) + d.calcResultsSize(d); + } + } + }); + }); + }; + + /** + * Page bar button event bind + */ + SelectPage.prototype.ePaging = function () { var self = this; if (!self.option.pagination) return; - $('li.csFirstPage', $(self.elem.navi)).off('click').on('click', function (ev) { + self.elem.navi.find('li.csFirstPage').off('click').on('click', function (ev) { //$(self.elem.combo_input).focus(); ev.preventDefault(); self.firstPage(self); }); - $('li.csPreviousPage', $(self.elem.navi)).off('click').on('click', function (ev) { + self.elem.navi.find('li.csPreviousPage').off('click').on('click', function (ev) { //$(self.elem.combo_input).focus(); ev.preventDefault(); self.prevPage(self); }); - $('li.csNextPage', $(self.elem.navi)).off('click').on('click', function (ev) { + self.elem.navi.find('li.csNextPage').off('click').on('click', function (ev) { //$(self.elem.combo_input).focus(); ev.preventDefault(); self.nextPage(self); }); - $('li.csLastPage', $(self.elem.navi)).off('click').on('click', function (ev) { + self.elem.navi.find('li.csLastPage').off('click').on('click', function (ev) { //$(self.elem.combo_input).focus(); ev.preventDefault(); self.lastPage(self); @@ -14865,68 +13339,79 @@ define("addtabs", function(){}); }; /** - * @desc Ajax请求失败的处理 - * @param {Object} self - 插件内部对象 - * @param {string} errorThrown - Ajax的错误输出内容 + * Ajax request fail + * @param {Object} self + * @param {string} errorThrown */ SelectPage.prototype.ajaxErrorNotify = function (self, errorThrown) { self.showMessage(self.message.ajax_error); }; /** - * @desc 交互消息显示 - * @param {Object} self - 插件内部对象 - * @param msg {string} 需要提示的文本 + * Message box + * @param {Object} self + * @param msg {string} the text need to show */ SelectPage.prototype.showMessage = function (self, msg) { if (!msg) return; - var msgLi = '
              • ' + msg + '
              • '; - $(self.elem.results).empty().append(msgLi); + var msgLi = '
              • ' + msg + '
              • '; + self.elem.results.empty().append(msgLi).show(); self.calcResultsSize(self); - $(self.elem.container).addClass(self.css_class.container_open); - $(self.elem.control).hide(); + self.setOpenStatus(self, true); + self.elem.control.hide(); if (self.option.pagination) - $(self.elem.navi).hide(); + self.elem.navi.hide(); }; /** - * @desc 窗口滚动处理 - * @param {Object} self - 插件内部对象 - * @param {boolean} enforce - 是否定位到输入框的位置 + * @desc Scroll + * @param {Object} self + * @param {boolean} enforce */ SelectPage.prototype.scrollWindow = function (self, enforce) { - var current_result = self.getCurrentLine(self); + var current_result = self.getCurrentLine(self), + target_top = (current_result && !enforce) ? current_result.offset().top : self.elem.container.offset().top, + target_size; - var target_top = (current_result && !enforce) ? current_result.offset().top : $(self.elem.container).offset().top; - var target_size; - - self.prop.size_li = $(self.elem.results).children('li:first').outerHeight(); + self.prop.size_li = self.elem.results.children('li:first').outerHeight(); target_size = self.prop.size_li; - var client_height = $(window).height(); - var scroll_top = $(window).scrollTop(); - var scroll_bottom = scroll_top + client_height - target_size; - - // 滚动处理 - var gap; - if ($(current_result).length) { + var gap, client_height = $(window).height(), + scroll_top = $(window).scrollTop(), + scroll_bottom = scroll_top + client_height - target_size; + if (current_result.length) { if (target_top < scroll_top || target_size > client_height) { - //滚动到顶部 + //scroll to top gap = target_top - scroll_top; } else if (target_top > scroll_bottom) { - //向下滚动 + //scroll down gap = target_top - scroll_bottom; } else - return; //不进行滚动 + return; //do not scroll } else if (target_top < scroll_top) gap = target_top - scroll_top; window.scrollBy(0, gap); }; + /** + * change css class by status + * @param self + * @param status {boolean} true: open, false: close + */ + SelectPage.prototype.setOpenStatus = function (self, status) { + var el = self.elem, css = self.css_class; + if (status) { + el.container.addClass(css.container_open); + el.result_area.addClass(css.result_open); + } else { + el.container.removeClass(css.container_open); + el.result_area.removeClass(css.result_open); + } + }; /** - * @desc 输入框获得焦点的样式设置 - * @param {Object} self - 插件内部对象 + * input element in focus css class set + * @param {Object} self */ SelectPage.prototype.setCssFocusedInput = function (self) { //$(self.elem.results).addClass(self.css_class.re_off); @@ -14934,8 +13419,8 @@ define("addtabs", function(){}); }; /** - * @desc 设置结果列表高亮,输入框失去焦点 - * @param {Object} self - 插件内部对象 + * set result list get focus and input element lost focus + * @param {Object} self */ SelectPage.prototype.setCssFocusedResults = function (self) { //$(self.elem.results).removeClass(self.css_class.re_off); @@ -14943,11 +13428,11 @@ define("addtabs", function(){}); }; /** - * @desc 输入框输入值的变化监控 - * @param {Object} self - 插件内部对象 + * Quick search input keywords listener + * @param {Object} self */ SelectPage.prototype.checkValue = function (self) { - var now_value = $(self.elem.combo_input).val(); + var now_value = self.elem.combo_input.val(); if (now_value != self.prop.prev_value) { self.prop.prev_value = now_value; self.prop.first_show = false; @@ -14955,8 +13440,9 @@ define("addtabs", function(){}); if (self.option.selectOnly) self.setButtonAttrDefault(); if (!self.option.multiple && !now_value) { - self.clearAll(self); - $(self.elem.clear_btn).remove(); + self.elem.combo_input.val(''); + self.elem.hidden.val(''); + self.elem.clear_btn.remove(); } self.suggest(self); @@ -14964,9 +13450,9 @@ define("addtabs", function(){}); }; /** - * @desc 文本输入框键盘事件处理(普通字符输入处理) - * @param {Object} self - 插件内部对象 - * @param {Object} e - 事件event对象 + * Input handle(regular input) + * @param {Object} self + * @param {Object} e - event object */ SelectPage.prototype.processKey = function (self, e) { if ($.inArray(e.keyCode, [37, 38, 39, 40, 27, 9, 13]) === -1) { @@ -14986,63 +13472,50 @@ define("addtabs", function(){}); } /** - * @desc 文本输入框键盘事件处理(控制键处理) - * @param {Object} self - 插件内部对象 - * @param {Object} e - 事件event对象 + * Input handle(control key) + * @param {Object} self + * @param {Object} e - event object */ SelectPage.prototype.processControl = function (self, e) { - if (($.inArray(e.keyCode, [37, 38, 39, 40, 27, 9]) > -1 && $(self.elem.result_area).is(':visible')) || + if (($.inArray(e.keyCode, [37, 38, 39, 40, 27, 9]) > -1 && self.elem.result_area.is(':visible')) || ($.inArray(e.keyCode, [13, 9]) > -1 && self.getCurrentLine(self))) { e.preventDefault(); e.stopPropagation(); e.cancelBubble = true; e.returnValue = false; switch (e.keyCode) { - case 37: - // left + case 37:// left if (e.shiftKey) self.firstPage(self); else self.prevPage(self); break; - - case 38: - // up + case 38:// up self.prop.key_select = true; self.prevLine(self); break; - - case 39: - // right + case 39:// right if (e.shiftKey) self.lastPage(self); else self.nextPage(self); break; - - case 40: - // down - if ($(self.elem.results).children('li').length) { + case 40:// down + if (self.elem.results.children('li').length) { self.prop.key_select = true; self.nextLine(self); } else self.suggest(self); break; - - case 9: - // tab + case 9:// tab self.prop.key_paging = true; self.selectCurrentLine(self, true); //self.hideResults(self); break; - - case 13: - // return + case 13:// return self.selectCurrentLine(self, true); break; - - case 27: - // escape + case 27:// escape self.prop.key_paging = true; self.hideResults(self); break; @@ -15051,8 +13524,8 @@ define("addtabs", function(){}); }; /** - * @desc 中断Ajax请求 - * @param {Object} self - 插件内部对象 + * Abort Ajax request + * @param {Object} self */ SelectPage.prototype.abortAjax = function (self) { if (self.prop.xhr) { @@ -15062,13 +13535,11 @@ define("addtabs", function(){}); }; /** - * @desc 数据查询 - * @param {Object} self - 插件内部对象 + * Suggest result of search keywords + * @param {Object} self */ SelectPage.prototype.suggest = function (self) { - //搜索关键字 - var q_word; - var val = $.trim($(self.elem.combo_input).val()); + var q_word, val = $.trim(self.elem.combo_input.val()); if (self.option.multiple) q_word = val; else { @@ -15078,11 +13549,15 @@ define("addtabs", function(){}); q_word = val; } q_word = q_word.split(/[\s ]+/); - self.abortAjax(self); - self.setLoading(self); - var which_page_num = self.prop.current_page > 0 ? self.prop.current_page : 1; - // 数据查询 + //Before show up result list callback + if (self.option.eOpen && $.isFunction(self.option.eOpen)) + self.option.eOpen.call(self); + + self.abortAjax(self); + //self.setLoading(self); + var which_page_num = self.prop.current_page || 1; + if (typeof self.option.data == 'object') self.searchForJson(self, q_word, which_page_num); else @@ -15090,51 +13565,40 @@ define("addtabs", function(){}); }; /** - * @private - * @desc 读取中状态显示 - * @param {Object} self - 插件内部对象 + * Loading + * @param {Object} self */ SelectPage.prototype.setLoading = function (self) { - //加载中的状态提示 - if ($(self.elem.results).html() === '') { + if (self.elem.results.html() === '') { //self.calcResultsSize(self); - $(self.elem.container).addClass(self.css_class.container_open); + self.setOpenStatus(self, true); } }; /** - * @desc 服务端数据查询 - * @param {Object} self - 插件内部对象 - * @param {Array} q_word - 查询关键字 - * @param {number} which_page_num - 目标页 + * Search for ajax + * @param {Object} self + * @param {Array} q_word - query keyword + * @param {number} which_page_num - target page number */ SelectPage.prototype.searchForDb = function (self, q_word, which_page_num) { - if (!self.option.eAjaxSuccess || !$.isFunction(self.option.eAjaxSuccess)) + var p = self.option; + if (!p.eAjaxSuccess || !$.isFunction(p.eAjaxSuccess)) self.hideResults(self); - /** - * 增加自定义查询参数 - */ - var _paramsFunc = self.option.params; - var _params = {}; - //原始参数 - var searchKey = self.option.searchField; - //若有查询关键字,则重置当前页码为1 - if (q_word.length > 0 && q_word[0] && q_word[0] !== self.prop.prev_value) + var _paramsFunc = p.params, _params = {}, searchKey = p.searchField; + //when have new query keyword, then reset page number to 1. + if (q_word.length && q_word[0] && q_word[0] !== self.prop.prev_value) which_page_num = 1; var _orgParams = { q_word: q_word, pageNumber: which_page_num, - pageSize: self.option.pageSize, - andOr: self.option.andOr, - orderBy: self.option.orderBy, - searchTable: self.option.dbTable, - page: which_page_num, - per_page: self.option.pageSize, - and_or: self.option.andOr, - order_by: self.option.orderBy, - field: self.option.showField, - pkey_name: self.option.keyField, - search_field: searchKey + pageSize: p.pageSize, + andOr: p.andOr, + orderBy: p.orderBy, + searchTable: p.dbTable, + showField: self.option.showField, + keyField: self.option.keyField, + searchField: self.option.searchField }; _orgParams[searchKey] = q_word[0]; if (_paramsFunc) { @@ -15144,33 +13608,32 @@ define("addtabs", function(){}); } else { _params = _orgParams; } - } else { + } else _params = _orgParams; - } - //增加自定义查询参数End self.prop.xhr = $.ajax({ dataType: 'json', - url: self.option.data, + url: p.data, type: 'POST', data: _params, success: function (returnData) { if (!returnData || !$.isPlainObject(returnData)) { self.hideResults(self); - self.ajaxErrorNotify(self); + self.ajaxErrorNotify(self, errorThrown); return; } - var data; - if (self.option.eAjaxSuccess && $.isFunction(self.option.eAjaxSuccess)) { - data = self.option.eAjaxSuccess(returnData); - } else { - data = returnData; + var data = {}, json = {}; + try { + data = p.eAjaxSuccess(returnData); + json.originalResult = data.list; + json.cnt_whole = data.totalRow; + } catch (e) { + self.showMessage(self, self.message.ajax_error); + return; } - - //数据结构处理 - var json = {}; - json.originalResult = typeof data.rows !== 'undefined' ? data.rows : (typeof data.list !== 'undefined' ? data.list : []); - json.cnt_whole = typeof data.total !== 'undefined' ? data.total : (typeof data.totalRow !== 'undefined' ? data.totalRow : data.list.length); - + if(self.elem.navi) { + $(self.elem.navi).toggleClass("hide", json.cnt_whole <= json.originalResult.length); + } + json.candidate = []; json.keyField = []; if (typeof json.originalResult != 'object') { @@ -15181,10 +13644,10 @@ define("addtabs", function(){}); json.cnt_page = json.originalResult.length; for (var i = 0; i < json.cnt_page; i++) { for (var key in json.originalResult[i]) { - if (key == self.option.keyField) { + if (key == p.keyField) { json.keyField.push(json.originalResult[i][key]); } - if (key == self.option.showField) { + if (key == p.showField) { json.candidate.push(json.originalResult[i][key]); } } @@ -15204,20 +13667,15 @@ define("addtabs", function(){}); }; /** - * @desc 对JSON源数据进行搜索 - * @param {Object} self - 插件内部对象 - * @param {Array} q_word - 搜索关键字 - * @param {number} which_page_num - 目标页数 + * Search for json data source + * @param {Object} self + * @param {Array} q_word + * @param {number} which_page_num */ SelectPage.prototype.searchForJson = function (self, q_word, which_page_num) { - var matched = []; - var esc_q = []; - var sorted = []; - var json = {}; - var i = 0; - var arr_reg = []; + var p = self.option, matched = [], esc_q = [], sorted = [], json = {}, i = 0, arr_reg = []; - //查询条件过滤 + //query keyword filter do { //'/\W/g'正则代表全部不是字母,数字,下划线,汉字的字符 //将非法字符进行转义 @@ -15227,20 +13685,19 @@ define("addtabs", function(){}); } while (i < q_word.length); // SELECT * FROM data WHERE field LIKE q_word; - for (i = 0; i < self.option.data.length; i++) { - var flag = false; - var row = self.option.data[i]; + for (i = 0; i < p.data.length; i++) { + var flag = false, row = p.data[i], itemText; for (var j = 0; j < arr_reg.length; j++) { - var itemText = row[self.option.showField];//默认获取showField字段的文本 - if (self.option.formatItem && $.isFunction(self.option.formatItem)) - itemText = self.option.formatItem(row); + itemText = row[p.searchField]; + if (p.formatItem && $.isFunction(p.formatItem)) + itemText = p.formatItem(row); if (itemText.match(arr_reg[j])) { flag = true; - if (self.option.andOr == 'OR') + if (p.andOr == 'OR') break; } else { flag = false; - if (self.option.andOr == 'AND') + if (p.andOr == 'AND') break; } } @@ -15248,14 +13705,12 @@ define("addtabs", function(){}); matched.push(row); } - // (CASE WHEN ...) 然后 く order 指定列 - var reg1 = new RegExp('^' + esc_q[0] + '$', 'gi'); - var reg2 = new RegExp('^' + esc_q[0], 'gi'); - var matched1 = []; - var matched2 = []; - var matched3 = []; + // (CASE WHEN ...) then く order some column + var reg1 = new RegExp('^' + esc_q[0] + '$', 'gi'), + reg2 = new RegExp('^' + esc_q[0], 'gi'), + matched1 = [], matched2 = [], matched3 = []; for (i = 0; i < matched.length; i++) { - var orderField = self.option.orderBy[0][0]; + var orderField = p.orderBy[0][0]; var orderValue = String(matched[i][orderField]); if (orderValue.match(reg1)) { matched1.push(matched[i]); @@ -15266,7 +13721,7 @@ define("addtabs", function(){}); } } - if (self.option.orderBy[0][1].match(/^asc$/i)) { + if (p.orderBy[0][1].match(/^asc$/i)) { matched1 = self.sortAsc(self, matched1); matched2 = self.sortAsc(self, matched2); matched3 = self.sortAsc(self, matched3); @@ -15277,7 +13732,6 @@ define("addtabs", function(){}); } sorted = sorted.concat(matched1).concat(matched2).concat(matched3); - //若没有匹配项目,则结束搜索 /* if (sorted.length === undefined || sorted.length === 0 ) { self.notFoundSearch(self); @@ -15285,51 +13739,50 @@ define("addtabs", function(){}); } */ json.cnt_whole = sorted.length; - //page_move参数用于区别数据加载是在初始化列表还是在进行分页的翻页操作 + //page_move used to distinguish between init plugin or page moving if (!self.prop.page_move) { - //仅单选模式进行选中项目定位页功能 - if (!self.option.multiple) { - //若控件当前已有选中值,则获得该项目所在的页数,并跳转到该页进行显示 - var currentValue = $(self.elem.hidden).val(); + //only single mode can be used page number relocation + if (!p.multiple) { + //get selected item belong page number + var currentValue = self.elem.hidden.val(); if ($.type(currentValue) !== 'undefined' && $.trim(currentValue) !== '') { var index = 0; $.each(sorted, function (i, row) { - if (row[self.option.keyField] == currentValue) { + if (row[p.keyField] == currentValue) { index = i + 1; return false; } }); - which_page_num = Math.ceil(index / self.option.pageSize); + which_page_num = Math.ceil(index / p.pageSize); if (which_page_num < 1) which_page_num = 1; self.prop.current_page = which_page_num; } } } else { - //过滤后的数据个数不足一页显示的个数时,强制设置页码 - if (sorted.length <= ((which_page_num - 1) * self.option.pageSize)) { + //set page number to 1 when result number less then page size + if (sorted.length <= ((which_page_num - 1) * p.pageSize)) { which_page_num = 1; self.prop.current_page = 1; } } - // LIMIT xx OFFSET xx - var start = (which_page_num - 1) * self.option.pageSize; - var end = start + self.option.pageSize; - //储存原始行数据,包括所有属性 + //LIMIT xx OFFSET xx + var start = (which_page_num - 1) * p.pageSize, end = start + p.pageSize; + //save original data json.originalResult = []; - // 查询后的数据处理 + //after data filter handle for (i = start; i < end; i++) { if (sorted[i] === undefined) break; json.originalResult.push(sorted[i]); for (var key in sorted[i]) { - if (key == self.option.keyField) { + if (key == p.keyField) { if (json.keyField === undefined) json.keyField = []; json.keyField.push(sorted[i][key]); } - if (key == self.option.showField) { + if (key == p.showField) { if (json.candidate === undefined) json.candidate = []; json.candidate.push(sorted[i][key]); @@ -15344,326 +13797,302 @@ define("addtabs", function(){}); }; /** - * @desc 升序排序 - * @param {Object} self - 插件内部对象 - * @param {Array} arr - 结果集数组 + * Set order asc + * @param {Object} self + * @param {Array} arr - result array */ SelectPage.prototype.sortAsc = function (self, arr) { arr.sort(function (a, b) { - var valA = a[self.option.orderBy[0][0]]; - var valB = b[self.option.orderBy[0][0]]; + var valA = a[self.option.orderBy[0][0]], valB = b[self.option.orderBy[0][0]]; return $.type(valA) === 'number' ? valA - valB : String(valA).localeCompare(String(valB)); }); return arr; }; /** - * @desc 降序排序 - * @param {Object} self - 插件内部对象 - * @param {Array} arr - 结果集数组 + * Set order desc + * @param {Object} self + * @param {Array} arr - result array */ SelectPage.prototype.sortDesc = function (self, arr) { arr.sort(function (a, b) { - var valA = a[self.option.orderBy[0][0]]; - var valB = b[self.option.orderBy[0][0]]; + var valA = a[self.option.orderBy[0][0]], valB = b[self.option.orderBy[0][0]]; return $.type(valA) === 'number' ? valB - valA : String(valB).localeCompare(String(valA)); }); return arr; }; /** - * @desc 查询无结果的处理 - * @param {Object} self - 插件内部对象 + * Not result found handle + * @param {Object} self */ SelectPage.prototype.notFoundSearch = function (self) { - $(self.elem.results).empty(); + self.elem.results.empty(); self.calcResultsSize(self); - $(self.elem.container).addClass(self.css_class.container_open); + self.setOpenStatus(self, true); self.setCssFocusedInput(self); }; /** - * @desc 查询结果处理 - * @param {Object} self - 插件内部对象 - * @param {Object} json - 数据结果 - * @param {Array} q_word - 查询关键字 - * @param {number} which_page_num - 目标页 + * Prepare data to show + * @param {Object} self + * @param {Object} json - data result + * @param {Array} q_word - query keyword + * @param {number} which_page_num - target page number */ SelectPage.prototype.prepareResults = function (self, json, q_word, which_page_num) { - //处理分页栏 if (self.option.pagination) self.setNavi(self, json.cnt_whole, json.cnt_page, which_page_num); if (!json.keyField) json.keyField = false; - //仅选择模式 if (self.option.selectOnly && json.candidate.length === 1 && json.candidate[0] == q_word[0]) { - $(self.elem.hidden).val(json.keyField[0]); + self.elem.hidden.val(json.keyField[0]); this.setButtonAttrDefault(); } - //是否是输入关键词进行查找 var is_query = false; - if (q_word && q_word.length > 0 && q_word[0]) + if (q_word && q_word.length && q_word[0]) is_query = true; - //显示结果列表 self.displayResults(self, json, is_query); }; /** - * @desc 生成分页栏 - * @param {Object} self - 插件内部对象 - * @param {number} cnt_whole - 数据总条数 - * @param {number} cnt_page - 页面显示记录数 - * @param {number} page_num - 当前页数 + * Build page bar + * @param {Object} self + * @param {number} cnt_whole - total record count + * @param {number} cnt_page + * @param {number} page_num - current page number */ SelectPage.prototype.setNavi = function (self, cnt_whole, cnt_page, page_num) { + var msg = self.message; /** - * 生成分页条 + * build pagination bar */ var buildPageNav = function (self, pagebar, page_num, last_page) { - if ($('li', $(pagebar)).size() == 0) { - $(pagebar).empty(); - //处理当当前页码为1时,首页和上一页按钮不允许点击 - var btnclass = '', isNewFontAwesome = true; - //判断是否使用了font-awesome3.2.1 - $.each(document.styleSheets, function (i, n) { - if (n && n.href && n.href.indexOf('font-awesome-3.2.1') != -1) { - isNewFontAwesome = false; - return false; - } - }); - //为不同版本图标设置样式 - var iconFist = 'fa fa-angle-double-left', iconPrev = 'fa fa-angle-left', iconNext = 'fa fa-angle-right', iconLast = 'fa fa-angle-double-right'; - if (!isNewFontAwesome) { - iconFist = 'icon-step-backward'; - iconPrev = 'icon-backward'; - iconNext = 'icon-forward'; - iconLast = 'icon-step-forward'; - } + var updatePageInfo = function () { + var pageInfo = msg.page_info; + return pageInfo.replace(self.template.page.current, page_num).replace(self.template.page.total, last_page); + }; + if (pagebar.find('li').size() === 0) { + pagebar.hide().empty(); + var iconFist = 'spfont sp-first', + iconPrev = 'spfont sp-previous', + iconNext = 'spfont sp-next', + iconLast = 'spfont sp-last'; - if (page_num == 1) - btnclass = ' disabled '; - //首页 - $(pagebar).append('
              • '); - //上一页 - $(pagebar).append('
              • '); - var pageInfo = '第 ' + page_num + ' 页(共' + last_page + '页)'; - //设置分页信息 - $(pagebar).append('
              • ' + pageInfo + '
              • '); + pagebar.append('
              • '); + pagebar.append('
              • '); + //pagination information + pagebar.append('
              • ' + updatePageInfo() + '
              • '); - if (page_num == last_page) - btnclass = ' disabled '; - else - btnclass = ''; - //首页 - $(pagebar).append('
              • '); - //上一页 - $(pagebar).append('
              • '); + pagebar.append('
              • '); + pagebar.append('
              • '); + pagebar.show(); + } else { + pagebar.find('li.pageInfoBox a').html(updatePageInfo()); } }; - var pagebar = $(self.elem.navi); - var last_page = Math.ceil(cnt_whole / self.option.pageSize); //计算总页数 - if (last_page == 0) + var pagebar = self.elem.navi.find('ul'), + last_page = Math.ceil(cnt_whole / self.option.pageSize); //calculate total page + if (last_page === 0) page_num = 0; else { if (last_page < page_num) page_num = last_page; - else if (page_num == 0) + else if (page_num === 0) page_num = 1; } - self.prop.current_page = page_num;//更新当前页参数 - self.prop.max_page = last_page;//更新总页数参数 + self.prop.current_page = page_num;//update current page number + self.prop.max_page = last_page;//update page count buildPageNav(self, pagebar, page_num, last_page); - //刷新分页信息 - var pageInfoBox = $('li.pageInfoBox', $(pagebar)); - var pageInfo = '第 ' + page_num + ' 页(共' + last_page + '页)'; - $(pageInfoBox).html(' ' + pageInfo + ' '); - //更新分页样式 - var dClass = 'disabled'; - var first = $('li.csFirstPage', $(pagebar)); - var previous = $('li.csPreviousPage', $(pagebar)); - var next = $('li.csNextPage', $(pagebar)); - var last = $('li.csLastPage', $(pagebar)); - //处理首页,上一页按钮样式 + //update paging status + var dClass = 'disabled', + first = pagebar.find('li.csFirstPage'), + previous = pagebar.find('li.csPreviousPage'), + next = pagebar.find('li.csNextPage'), + last = pagebar.find('li.csLastPage'); + //first and previous if (page_num === 1 || page_num === 0) { - if (!$(first).hasClass(dClass)) - $(first).addClass(dClass); - if (!$(previous).hasClass(dClass)) - $(previous).addClass(dClass); + if (!first.hasClass(dClass)) + first.addClass(dClass); + if (!previous.hasClass(dClass)) + previous.addClass(dClass); } else { - if ($(first).hasClass(dClass)) - $(first).removeClass(dClass); - if ($(previous).hasClass(dClass)) - $(previous).removeClass(dClass); + if (first.hasClass(dClass)) + first.removeClass(dClass); + if (previous.hasClass(dClass)) + previous.removeClass(dClass); } - //处理下一页,最后一页按钮的样式 - if (page_num == last_page || last_page == 0) { - if (!$(next).hasClass(dClass)) - $(next).addClass(dClass); - if (!$(last).hasClass(dClass)) - $(last).addClass(dClass); + //next and last + if (page_num === last_page || last_page === 0) { + if (!next.hasClass(dClass)) + next.addClass(dClass); + if (!last.hasClass(dClass)) + last.addClass(dClass); } else { - if ($(next).hasClass(dClass)) - $(next).removeClass(dClass); - if ($(last).hasClass(dClass)) - $(last).removeClass(dClass); + if (next.hasClass(dClass)) + next.removeClass(dClass); + if (last.hasClass(dClass)) + last.removeClass(dClass); } if (last_page > 1) - self.ehNaviPaging(); //导航按钮的事件设置 + self.ePaging(); //pagination event bind }; /** - * @desc 显示结果集列表 - * @param {Object} self - 插件内部对象 - * @param {Object} json 源数据 - * @param {boolean} is_query - 是否是通过关键字搜索(用于区分是鼠标点击下拉还是输入框输入关键字进行查找) + * Render result list + * @param {Object} self + * @param {Object} json - result data + * @param {boolean} is_query - used to different from search to open and just click to open */ SelectPage.prototype.displayResults = function (self, json, is_query) { - $(self.elem.results).empty(); - if (self.option.multiple && $.type(self.option.maxSelectLimit) === 'number' && self.option.maxSelectLimit > 0) { - var selectedSize = $('li.selected_tag', self.elem.element_box).size(); - if (selectedSize > 0 && selectedSize >= self.option.maxSelectLimit) { - self.showMessage(self, '最多只能选择 ' + self.option.maxSelectLimit + ' 个项目'); + var p = self.option, el = self.elem; + el.results.hide().empty(); + if (p.multiple && $.type(p.maxSelectLimit) === 'number' && p.maxSelectLimit > 0) { + var selectedSize = el.element_box.find('li.selected_tag').size(); + if (selectedSize > 0 && selectedSize >= p.maxSelectLimit) { + var msg = self.message.max_selected; + self.showMessage(self, msg.replace(self.template.msg.maxSelectLimit, p.maxSelectLimit)); return; } } - if (json.candidate.length > 0) { - var arr_candidate = json.candidate; - var arr_primary_key = json.keyField; - var keystr = $(self.elem.hidden).val(); - var keyArr = keystr ? keystr.split(',') : new Array(); + if (json.candidate.length) { + var arr_candidate = json.candidate, + arr_primary_key = json.keyField, + keystr = el.hidden.val(), + keyArr = keystr ? keystr.split(',') : new Array(), + itemText = ''; for (var i = 0; i < arr_candidate.length; i++) { - var itemText = ''; - if (self.option.formatItem && $.isFunction(self.option.formatItem)) { + if (p.formatItem && $.isFunction(p.formatItem)) { try { - itemText = self.option.formatItem(json.originalResult[i]); + itemText = p.formatItem(json.originalResult[i]); } catch (e) { console.error('formatItem内容格式化函数内容设置不正确!'); itemText = arr_candidate[i]; } } else itemText = arr_candidate[i]; - //XSS対策 var list = $('
              • ').html(itemText).attr({ - pkey: arr_primary_key[i], - title: itemText + pkey: arr_primary_key[i] }); + if (!p.formatItem) + list.attr('title', itemText); - //选中项目设置高亮样式 + //Set selected item highlight if ($.inArray(arr_primary_key[i].toString(), keyArr) !== -1) { - $(list).addClass(self.css_class.selected); + list.addClass(self.css_class.selected); } - //缓存原始行对象 - $(list).data('dataObj', json.originalResult[i]); - $(self.elem.results).append(list); + //cache item data + list.data('dataObj', json.originalResult[i]); + el.results.append(list); } } else { - var li = '
              • ' + self.message.not_found + '
              • '; - $(self.elem.results).append(li); + var li = '
              • ' + + self.message.not_found + '
              • '; + el.results.append(li); } + el.results.show(); - if (self.option.multiple && self.option.multipleControlbar) - $(self.elem.control).show(); - if (self.option.pagination) - $(self.elem.navi).toggleClass("hide", json.cnt_whole <= json.cnt_page); - - //显示结果集列表并调整位置 + if (p.multiple && p.multipleControlbar) + el.control.show(); + if (p.pagination) + el.navi.show(); self.calcResultsSize(self); - $(self.elem.container).addClass(self.css_class.container_open); + self.setOpenStatus(self, true); - //结果集列表事件绑定 + //Result item event bind self.eResultList(); - //若是键盘输入关键字进行查询且有内容时,列表自动选中第一行(autoSelectFirst为true时) - if (is_query && json.candidate.length > 0 && self.option.autoSelectFirst) + //scrolling listen + self.eScroll(); + //auto highlight first item in search, have result and set autoSelectFirst to true situation + if (is_query && json.candidate.length && p.autoSelectFirst) self.nextLine(self); }; /** - * @desc 处理结果列表尺寸及位置 - * @param {Object} self - 插件内部对象 + * Calculate result list size and position + * @param {Object} self */ SelectPage.prototype.calcResultsSize = function (self) { + var p = self.option, el = self.elem; var rePosition = function () { - if ($(self.elem.container).css('position') === 'static') { + if (el.container.css('position') === 'static') { // position: static - var offset = $(self.elem.combo_input).offset(); - $(self.elem.result_area).css({ - top: offset.top + $(self.elem.combo_input).outerHeight() + 'px', + var offset = el.combo_input.offset(); + el.result_area.css({ + top: offset.top + el.combo_input.outerHeight() + 'px', left: offset.left + 'px' }); } else { - if (!self.option.pagination) { - var itemHeight = $('li:first', self.elem.results).outerHeight(true); - var listHeight = itemHeight * self.option.listSize; - $(self.elem.results).css({ + if (!p.pagination) { + var itemHeight = el.results.find('li:first').outerHeight(true), + listHeight = itemHeight * p.listSize; + el.results.css({ 'max-height': listHeight, 'overflow-y': 'auto' }); } - //在展示下拉列表时,判断默认与输入框左对齐的列表是否会超出屏幕边界,是则右对齐,否则默认左对齐 - var docWidth = $(document).width(); - var docHeight = $(document).height();//文档全部高度 - var viewHeight = $(window).height();//可视区域高度 - var offset = $(self.elem.container).offset(); - var screenScrollTop = $(window).scrollTop(); - var listWidth = $(self.elem.result_area).outerWidth(); - //当前状态,列表并未被显示,数据未被填充,列表并未展现最终高度,所以只能使用默认一页显示10条数据的固定高度进行计算 - var listHeight = $(self.elem.result_area).outerHeight(); - //默认方向的坐标,在多选模式下,因为外框架是DIV,所以需要向左靠一个像素 - var defaultLeft = self.option.multiple ? -1 : 0; - //输入框高度 - var inputHeight = $(self.elem.container).outerHeight(); - var left = (offset.left + listWidth) > docWidth ? -(listWidth - $(self.elem.container).outerWidth()) : defaultLeft; - //控件在全文档范围中的实际TOP(非当前可视区域中的相对TOP) - var screenTop = offset.top;//$(self.elem.container).scrollTop();//offset.top - screenScrollTop; - var top = 0, dist = 5;//设置偏移量,让列表与输入框有5px的间距 - //列表展开后的坐标高度 - var listBottom = screenTop + inputHeight + listHeight + dist; - var hasOverflow = docHeight > viewHeight; + //handle result list show up side(left, right, up or down) + var docWidth = $(document).width(), + docHeight = $(document).height(), //the document full height + viewHeight = $(window).height(), //browser visible area height + offset = el.container.offset(), + screenScrollTop = $(window).scrollTop(), + listWidth = el.result_area.outerWidth(), + //result list height + listHeight = el.result_area.outerHeight(), + //default left used input element left + defaultLeft = offset.left, //p.multiple ? -1 : 0; + //input element height + inputHeight = el.container.outerHeight(), + left = (offset.left + listWidth) > docWidth ? + defaultLeft - (listWidth - el.container.outerWidth()) : + defaultLeft, + //the actual top coordinate of input element(outer div) + screenTop = offset.top, //$(el.container).scrollTop();//offset.top - screenScrollTop; + top = 0, dist = 5, //set distance between input element and result list + //the actual top coordinate of result list + listBottom = screenTop + inputHeight + listHeight + dist, + hasOverflow = docHeight > viewHeight; if ((screenTop - screenScrollTop - dist > listHeight) && (hasOverflow && listBottom > (viewHeight + screenScrollTop)) || (!hasOverflow && listBottom > viewHeight)) { - //控件当前位置+控件高度+列表高度超过实际body高度 - //列表则需要向上展示 - top = -(listHeight + 1) - dist; - $(self.elem.result_area).removeClass('shadowUp shadowDown').addClass('shadowUp'); + //open up + top = offset.top - listHeight - dist; + el.result_area.removeClass('shadowUp shadowDown').addClass('shadowUp'); } else { - //列表正常向下展示 - top = self.option.multiple ? $(self.elem.container).innerHeight() + 1 : $(self.elem.container).outerHeight(); - $(self.elem.result_area).removeClass('shadowUp shadowDown').addClass('shadowDown'); + //open down + top = offset.top + (p.multiple ? el.container.outerHeight() : inputHeight); + el.result_area.removeClass('shadowUp shadowDown').addClass('shadowDown'); top += dist; } - /* - $(self.elem.result_area).css({ - top : top + 'px', - left: left + 'px' - }); - */ return { - top: top + 'px', - left: left + 'px' + top: top + 'px', left: left + 'px' }; } }; - if ($(self.elem.result_area).is(':visible')) { - $(self.elem.result_area).css(rePosition()); + if (el.result_area.is(':visible')) { + el.result_area.css(rePosition()); } else { - $(self.elem.result_area).show(1, function () { - $(this).css(rePosition()); + var pss = rePosition(); + el.result_area.css(pss).show(1, function () { + var repss = rePosition(); + if (pss.top !== repss.top || pss.left !== repss.left) + el.result_area.css(repss); }); } }; /** - * @desc 隐藏结果列表 - * @param {Object} self - 插件内部对象 + * hide result list + * @param {Object} self */ SelectPage.prototype.hideResults = function (self) { if (self.prop.key_paging) { @@ -15676,17 +14105,37 @@ define("addtabs", function(){}); //self.selectCurrentLine(self, true); } - $(self.elem.results).empty(); - $(self.elem.result_area).hide(); - $(self.elem.container).removeClass(self.css_class.container_open); + self.elem.results.empty(); + self.elem.result_area.hide(); + self.setOpenStatus(self, false); + //unbind window scroll listen + $(window).off('scroll.SelectPage'); self.abortAjax(self); - self.setButtonAttrDefault(); // 按钮title属性初期化 + self.setButtonAttrDefault(); }; /** - * @desc 跳转到首页 - * @param {Object} self - 插件内部对象 + * set plugin to disabled / enabled + * @param self + * @param disabled + */ + SelectPage.prototype.disabled = function (self, disabled) { + var p = self.option, el = self.elem; + if ($.type(disabled) === 'undefined') + return el.combo_input.prop('disabled'); + if ($.type(disabled) === 'boolean') { + el.combo_input.prop('disabled', disabled); + if (disabled) + el.container.addClass(self.css_class.disabled); + else + el.container.removeClass(self.css_class.disabled); + } + }; + + /** + * Go fist page + * @param {Object} self */ SelectPage.prototype.firstPage = function (self) { if (self.prop.current_page > 1) { @@ -15697,8 +14146,8 @@ define("addtabs", function(){}); }; /** - * @desc 跳转到上一页 - * @param {Object} self - 插件内部对象 + * Go previous page + * @param {Object} self */ SelectPage.prototype.prevPage = function (self) { if (self.prop.current_page > 1) { @@ -15709,8 +14158,8 @@ define("addtabs", function(){}); }; /** - * @desc 跳转到下一页 - * @param {Object} self - 插件内部对象 + * Go next page + * @param {Object} self */ SelectPage.prototype.nextPage = function (self) { if (self.prop.current_page < self.prop.max_page) { @@ -15721,8 +14170,8 @@ define("addtabs", function(){}); }; /** - * @desc 跳转到尾页 - * @param {Object} self - 插件内部对象 + * Go last page + * @param {Object} self */ SelectPage.prototype.lastPage = function (self) { if (self.prop.current_page < self.prop.max_page) { @@ -15732,169 +14181,171 @@ define("addtabs", function(){}); } }; /** - * @desc 跳转到指定页 + * do something after select/unSelect action * @param {Object} self - * @param {number} page 目标页数 - */ - SelectPage.prototype.goPage = function (self, page) { - if (typeof (page) === 'undefined') - page = 1; - if (self.prop.current_page < self.prop.max_page) { - self.prop.current_page = page; - self.prop.page_move = true; - self.suggest(self); - } - }; - /** - * @desc 操作结束后的一些收尾工作 */ SelectPage.prototype.afterAction = function (self) { self.inputResize(self); - $(self.elem.combo_input).trigger("change"); - $(self.elem.hidden).trigger("change"); + self.elem.combo_input.change(); self.setCssFocusedInput(self); + if (self.prop.init_set) + return; if (self.option.multiple) { if (self.option.selectToCloseList) { self.hideResults(self); - $(self.elem.combo_input).blur(); + self.elem.combo_input.blur(); } else { self.suggest(self); - $(self.elem.combo_input).focus(); + self.elem.combo_input.focus(); } } else { self.hideResults(self); - $(self.elem.combo_input).blur(); + self.elem.combo_input.blur(); } }; /** - * @desc 选择当前行 - * @param {Object} self - 插件内部对象 - * @param {boolean} is_enter_key - 是否为回车键 + * Select current list item + * @param {Object} self + * @param {boolean} is_enter_key */ SelectPage.prototype.selectCurrentLine = function (self, is_enter_key) { self.scrollWindow(self, true); - var current = self.getCurrentLine(self); + var p = self.option, current = self.getCurrentLine(self); if (current) { - if (!self.option.multiple) { - $(self.elem.combo_input).val($(current).text()); - $(self.elem.hidden).val($(current).attr('pkey')); + if (!p.multiple) { + self.elem.combo_input.val(current.text()); + self.elem.hidden.val(current.attr('pkey')); } else { - //多选模式的项目选择处理 - $(self.elem.combo_input).val(''); - var item = {text: $(current).text(), value: $(current).attr('pkey')}; + //build tags in multiple selection mode + self.elem.combo_input.val(''); + var item = {text: current.text(), value: current.attr('pkey')}; if (!self.isAlreadySelected(self, item)) { self.addNewTag(self, item); self.tagValuesSet(self); } } - if (self.option.selectOnly) + if (p.selectOnly) self.setButtonAttrDefault(); - //项目选择回调函数触发 - if (self.option.eSelect && $.isFunction(self.option.eSelect)) - self.option.eSelect($(current).data('dataObj')); + //Select item callback + if (p.eSelect && $.isFunction(p.eSelect)) + p.eSelect(current.data('dataObj'), self); - self.prop.prev_value = $(self.elem.combo_input).val(); - self.prop.selected_text = $(self.elem.combo_input).val(); + self.prop.prev_value = self.elem.combo_input.val(); + self.prop.selected_text = self.elem.combo_input.val(); self.putClearButton(); } self.afterAction(self); }; /** - * 单选模式下选中项目后,显示清空按钮 + * Show clear button when item selected in single selection mode */ SelectPage.prototype.putClearButton = function () { - if (!this.option.multiple && !$(this.elem.combo_input).prop('disabled')) - $(this.elem.container).append(this.elem.clear_btn); + if (!this.option.multiple && !this.elem.combo_input.prop('disabled')) + this.elem.container.append(this.elem.clear_btn); }; /** - * @desc 全选当前页的行 - * @param {Object} self - 插件内部对象 + * Select all list item + * @param {Object} self */ SelectPage.prototype.selectAllLine = function (self) { - var jsonarr = new Array(); - $('li', self.elem.results).each(function (i, row) { - var item = {text: $(row).text(), value: $(row).attr('pkey')}; + var p = self.option, jsonarr = new Array(); + self.elem.results.find('li').each(function (i, row) { + var $row = $(row); + var item = {text: $row.text(), value: $row.attr('pkey')}; if (!self.isAlreadySelected(self, item)) { self.addNewTag(self, item); self.tagValuesSet(self); } - jsonarr.push($(row).data('dataObj')); - //若有最大选择数量限制,则添加最大个数后,不再添加 - if ($.type(self.option.maxSelectLimit) === 'number' && - self.option.maxSelectLimit > 0 && - self.option.maxSelectLimit === $('li.selected_tag', self.elem.element_box).size()) { + jsonarr.push($row.data('dataObj')); + //limited max selected items + if ($.type(p.maxSelectLimit) === 'number' && + p.maxSelectLimit > 0 && + p.maxSelectLimit === self.elem.element_box.find('li.selected_tag').size()) { return false; } }); - if (self.option.eSelect && $.isFunction(self.option.eSelect)) - self.option.eSelect(jsonarr); + if (p.eSelect && $.isFunction(p.eSelect)) + p.eSelect(jsonarr, self); self.afterAction(self); }; /** - * @desc 取消选择本页全部项目 - * @param {Object} self - 插件内部对象 + * Cancel select all item in current page + * @param {Object} self */ - SelectPage.prototype.unselectAllLine = function (self) { - var size = $('li', self.elem.results).size(); - $('li', self.elem.results).each(function (i, row) { + SelectPage.prototype.unSelectAllLine = function (self) { + var p = self.option, size = self.elem.results.find('li').size(); + self.elem.results.find('li').each(function (i, row) { var key = $(row).attr('pkey'); - var tag = $('li.selected_tag[itemvalue="' + key + '"]', self.elem.element_box); + var tag = self.elem.element_box.find('li.selected_tag[itemvalue="' + key + '"]'); self.removeTag(self, tag); }); self.afterAction(self); - if (self.option.eTagRemove && $.isFunction(self.option.eTagRemove)) - self.option.eTagRemove(size); + if (p.eTagRemove && $.isFunction(p.eTagRemove)) + p.eTagRemove(size, self); }; /** - * @desc 清除所有选中的项目 - * @param {Object} self - 插件内部对象 + * Clear all selected items + * @param {Object} self */ SelectPage.prototype.clearAll = function (self) { - var size = 0; - if (self.option.multiple) { - size = $('li.selected_tag', self.elem.element_box).size(); - $('li.selected_tag', self.elem.element_box).remove(); + var p = self.option, size = 0; + if (p.multiple) { + size = self.elem.element_box.find('li.selected_tag').size(); + self.elem.element_box.find('li.selected_tag').remove(); } - $(self.elem.combo_input).val(''); - $(self.elem.hidden).val(''); + self.reset(self); self.afterAction(self); - if (self.option.multiple) { - if (self.option.eTagRemove && $.isFunction(self.option.eTagRemove)) - self.option.eTagRemove(size); + + if (!p.multiple) + self.elem.clear_btn.remove(); + if (p.multiple) { + if (p.eTagRemove && $.isFunction(p.eTagRemove)) + p.eTagRemove(size, self); } }; /** - * @desc 获得当前行对象 - * @param {Object} self - 插件内部对象 + * reset + */ + SelectPage.prototype.reset = function (self) { + self.elem.combo_input.val(''); + self.elem.hidden.val(''); + self.prop.prev_value = ''; + self.prop.selected_text = ''; + self.prop.current_page = 1; + }; + + /** + * Get current highlight item + * @param {Object} self */ SelectPage.prototype.getCurrentLine = function (self) { - if ($(self.elem.result_area).is(':hidden')) + if (self.elem.result_area.is(':hidden')) return false; - var obj = $('li.' + self.css_class.select, self.elem.results); - if ($(obj).size()) + var obj = self.elem.results.find('li.' + self.css_class.select); + if (obj.size()) return obj; else return false; }; /** - * @desc 多选模式下判断当前选中项目是否已经存在已选中列表中 - * @param {Object} self - 插件内部对象 - * @param {Object} item - 选中行对象 + * Check the result item is already selected or not + * @param {Object} self + * @param {Object} item - item info */ SelectPage.prototype.isAlreadySelected = function (self, item) { var isExist = false; if (item.value) { - var keys = $(self.elem.hidden).val(); + var keys = self.elem.hidden.val(); if (keys) { var karr = keys.split(','); - if (karr && karr.length > 0 && $.inArray(item.value, karr) != -1) + if (karr && karr.length && $.inArray(item.value, karr) != -1) isExist = true; } } @@ -15902,9 +14353,9 @@ define("addtabs", function(){}); }; /** - * @desc 多选模式下增加一个标签 - * @param {Object} self - 插件内部对象 - * @param {Object} item - 选中行对象 + * Add a new tag in multiple selection mode + * @param {Object} self + * @param {Object} item */ SelectPage.prototype.addNewTag = function (self, item) { if (!self.option.multiple || !item) @@ -15913,75 +14364,71 @@ define("addtabs", function(){}); tmp = tmp.replace(self.template.tag.textKey, item.text); tmp = tmp.replace(self.template.tag.valueKey, item.value); tag = $(tmp); - if ($(self.elem.combo_input).prop('disabled')) - $('span.tag_close', tag).hide(); - $(self.elem.combo_input).closest('li').before(tag); + if (self.elem.combo_input.prop('disabled')) + tag.find('span.tag_close').hide(); + self.elem.combo_input.closest('li').before(tag); }; /** - * @desc 多选模式下移除一个标签 - * @param {Object} self - 插件内部对象 - * @param {Object} item - 标签对象 + * Remove a tag in multiple selection mode + * @param {Object} self + * @param {Object} item */ SelectPage.prototype.removeTag = function (self, item) { var key = $(item).attr('itemvalue'); - var keys = $(self.elem.hidden).val(); - //从已保存的key列表中删除该标签对应的项目 + var keys = self.elem.hidden.val(); if ($.type(key) != 'undefined' && keys) { - var keyarr = keys.split(','); - var index = $.inArray(key.toString(), keyarr); + var keyarr = keys.split(','), + index = $.inArray(key.toString(), keyarr); if (index != -1) { keyarr.splice(index, 1); - $(self.elem.hidden).val(keyarr.toString()); + self.elem.hidden.val(keyarr.toString()); } } $(item).remove(); - self.inputResize(self); + self.afterAction(self); }; /** - * @desc 多选模式下标签结果值放入隐藏域 - * @param {Object} self - 插件内部对象 + * Selected item value(keyField) put in to hidden element + * @param {Object} self */ SelectPage.prototype.tagValuesSet = function (self) { if (!self.option.multiple) return; - var tags = $('li.selected_tag', $(self.elem.element_box)); - if (tags && $(tags).size() > 0) { + var tags = self.elem.element_box.find('li.selected_tag'); + if (tags && tags.size()) { var result = new Array(); $.each(tags, function (i, li) { var v = $(li).attr('itemvalue'); if ($.type(v) !== 'undefined') result.push(v); }); - if (result.length > 0) { - $(self.elem.hidden).val(result.join(',')); + if (result.length) { + self.elem.hidden.val(result.join(',')); } } }; /** - * @desc 多选模式下输入框根据输入内容调整输入框宽度 - * @param {Object} self - 插件内部对象 + * auto resize input element width in multiple select mode + * @param {Object} self */ SelectPage.prototype.inputResize = function (self) { if (!self.option.multiple) return; - var width = ''; - var inputLi = self.elem.combo_input.closest('li'); - //设置默认宽度 + var width = '', + inputLi = self.elem.combo_input.closest('li'); var setDefaultSize = function (self, inputLi) { inputLi.removeClass('full_width'); - var minimumWidth = self.elem.combo_input.val().length + 1; - var width = (minimumWidth * 0.75) + 'em'; - self.elem.combo_input.css('width', width); - self.elem.combo_input.removeAttr('placeholder'); + var minimumWidth = self.elem.combo_input.val().length + 1, + width = (minimumWidth * 0.75) + 'em'; + self.elem.combo_input.css('width', width).removeAttr('placeholder'); }; - if ($('li.selected_tag', $(self.elem.element_box)).size() === 0) { + if (self.elem.element_box.find('li.selected_tag').size() === 0) { if (self.elem.combo_input.attr('placeholder_bak')) { if (!inputLi.hasClass('full_width')) inputLi.addClass('full_width'); - self.elem.combo_input.attr('placeholder', self.elem.combo_input.attr('placeholder_bak')); - self.elem.combo_input.removeAttr('style'); + self.elem.combo_input.attr('placeholder', self.elem.combo_input.attr('placeholder_bak')).removeAttr('style'); } else setDefaultSize(self, inputLi); } else @@ -15989,22 +14436,21 @@ define("addtabs", function(){}); }; /** - * @desc 选择下一行 - * @param {Object} self - 插件内部对象 + * Move to next line + * @param {Object} self */ SelectPage.prototype.nextLine = function (self) { - var obj = self.getCurrentLine(self); - var idx; + var obj = self.getCurrentLine(self), idx; if (!obj) idx = -1; else { - idx = $(self.elem.results).children('li').index(obj); - $(obj).removeClass(self.css_class.select); + idx = self.elem.results.children('li').index(obj); + obj.removeClass(self.css_class.select); } idx++; - if (idx < $(self.elem.results).children('li').length) { - var next = $(self.elem.results).children('li').eq(idx); - $(next).addClass(self.css_class.select); + if (idx < self.elem.results.children('li').length) { + var next = self.elem.results.children('li').eq(idx); + next.addClass(self.css_class.select); self.setCssFocusedResults(self); } else self.setCssFocusedInput(self); @@ -16012,22 +14458,21 @@ define("addtabs", function(){}); }; /** - * @desc 选择上一行 - * @param {Object} self - 插件内部对象 + * Move to previous line + * @param {Object} self */ SelectPage.prototype.prevLine = function (self) { - var obj = self.getCurrentLine(self); - var idx; + var obj = self.getCurrentLine(self), idx; if (!obj) - idx = $(self.elem.results).children('li').length; + idx = self.elem.results.children('li').length; else { - idx = $(self.elem.results).children('li').index(obj); - $(obj).removeClass(self.css_class.select); + idx = self.elem.results.children('li').index(obj); + obj.removeClass(self.css_class.select); } idx--; if (idx > -1) { - var prev = $(self.elem.results).children('li').eq(idx); - $(prev).addClass(self.css_class.select); + var prev = self.elem.results.children('li').eq(idx); + prev.addClass(self.css_class.select); self.setCssFocusedResults(self); } else self.setCssFocusedInput(self); @@ -16036,10 +14481,9 @@ define("addtabs", function(){}); /** - * @desc 下拉分页查询控件初始化入口 + * SelectPage plugin definition * @global - * @memberof jQuery,bootstrap2,bootstrap3 - * @param option {Object} 初始化参数集 + * @param option {Object} init plugin option */ function Plugin(option) { return this.each(function () { @@ -16052,30 +14496,34 @@ define("addtabs", function(){}); } /** - * 获得稿件内部对象 + * Get plugin object * @param {object} obj * @returns */ function getPlugin(obj) { - var container = $(obj).closest('div.sp_container'); - return $('input.sp_input', container); + return $(obj).closest('div.sp_container').find('input.sp_input'); } /** - * @desc 清除所有模式下选择的项目 + * Clear all selected item */ function ClearSelected() { return this.each(function () { var $this = getPlugin(this), data = $this.data(SelectPage.dataKey); - if (data) + if (data) { + data.prop.init_set = true; data.clearAll(data); + data.prop.init_set = false; + } }); } /** - * 刷新选中项目内容 - * 使用场景:使用$().val('xxx')修改插件的选中项目ID,此时需要刷新插件在输入框中的显示文本 + * Refresh result list + * use case: + * 1.use $(obj).val('xxx') to modify selectpage selected item key + * 2.refresh selected item show content/tag text */ function SelectedRefresh() { return this.each(function () { @@ -16087,15 +14535,14 @@ define("addtabs", function(){}); } /** - * 修改插件数据源 - * 仅在json数据源模式有效 - * @param {array} data + * Modify plugin datasource, only work on json datasource mode + * @param {array} data - new datasource * @example * [{name:'aa',sex:1},{name:'bb',sex:0},{...}] */ function ModifyDataSource(data) { return this.each(function () { - if (data && $.isArray(data) && data.length > 0) { + if (data && $.isArray(data)) { var $this = getPlugin(this), plugin = $this.data(SelectPage.dataKey); if (plugin) { @@ -16107,29 +14554,43 @@ define("addtabs", function(){}); } /** - * @desc 获得选中项目的文本 + * Get plugin disabled status or Modify plugin disabled status + * @param disabled {boolean} set disabled status + */ + function PluginDisabled(disabled) { + var status = false; + this.each(function () { + var $this = getPlugin(this), + plugin = $this.data(SelectPage.dataKey); + if (plugin) { + if ($.type(disabled) !== 'undefined') + plugin.disabled(plugin, disabled); + else + status = plugin.disabled(plugin); + } + }); + return status; + } + + /** + * Get selected item text * @returns {string} */ function GetInputText() { var str = ''; this.each(function () { var $this = getPlugin(this), data = $this.data(SelectPage.dataKey); - if (data) - str += data.elem.combo_input.val(); - }); - return str; - } - - /** - * @desc 获得选中项目的数据 - * @returns {String} - */ - function GetInputValue() { - var str = ''; - this.each(function () { - var $this = getPlugin(this), data = $this.data(SelectPage.dataKey); - if (data) - str += data.elem.hidden.val(); + if (data) { + if (data.option.multiple) { + var tags = []; + data.elem.element_box.find('li.selected_tag').each(function (i, tag) { + tags.push($(tag).text()); + }); + str += tags.toString(); + } else { + str += data.elem.combo_input.val(); + } + } }); return str; } @@ -16141,14 +14602,16 @@ define("addtabs", function(){}); $.fn.selectPageClear = ClearSelected; $.fn.selectPageRefresh = SelectedRefresh; $.fn.selectPageData = ModifyDataSource; + $.fn.selectPageDisabled = PluginDisabled; $.fn.selectPageText = GetInputText; - $.fn.selectPageValue = GetInputValue; - // 处理新旧版本冲突 + // SelectPage no conflict // ================= $.fn.selectPage.noConflict = function () { $.fn.selectPage = old; return this; }; -})); +})(window.jQuery); + +define("selectpage", function(){}); diff --git a/public/assets/js/require-form.js b/public/assets/js/require-form.js index b49f36fe..0747213b 100755 --- a/public/assets/js/require-form.js +++ b/public/assets/js/require-form.js @@ -40,6 +40,9 @@ define(['jquery', 'bootstrap', 'upload', 'validator'], function ($, undefined, U Form.api.submit($(ret), function (data, ret) { that.holdSubmit(false); submitBtn.removeClass("disabled"); + if (false === $(this).triggerHandler("success.form", [data, ret])) { + return false; + } if (typeof success === 'function') { if (false === success.call($(this), data, ret)) { return false; @@ -54,6 +57,9 @@ define(['jquery', 'bootstrap', 'upload', 'validator'], function ($, undefined, U return false; }, function (data, ret) { that.holdSubmit(false); + if (false === $(this).triggerHandler("error.form", [data, ret])) { + return false; + } submitBtn.removeClass("disabled"); if (typeof error === 'function') { if (false === error.call($(this), data, ret)) { @@ -81,13 +87,25 @@ define(['jquery', 'bootstrap', 'upload', 'validator'], function ($, undefined, U if ($(".selectpage", form).size() > 0) { require(['selectpage'], function () { $('.selectpage', form).selectPage({ - source: 'ajax/selectpage', + eAjaxSuccess: function (data) { + data.list = typeof data.rows !== 'undefined' ? data.rows : (typeof data.list !== 'undefined' ? data.list : []); + data.totalRow = typeof data.total !== 'undefined' ? data.total : (typeof data.totalRow !== 'undefined' ? data.totalRow : data.list.length); + return data; + } }); }); //给隐藏的元素添加上validate验证触发事件 - $(form).on("change", ".selectpage-input-hidden", function () { + $(document).on("change", ".sp_hidden", function () { $(this).trigger("validate"); }); + $(document).on("change", ".sp_input", function () { + $(this).closest(".sp_container").find(".sp_hidden").trigger("change"); + }); + $(form).on("reset", function () { + setTimeout(function () { + $('.selectpage', form).selectPageClear(); + }, 1); + }); } }, cxselect: function (form) { @@ -132,6 +150,48 @@ define(['jquery', 'bootstrap', 'upload', 'validator'], function ($, undefined, U }); } }, + daterangepicker: function (form) { + //绑定日期时间元素事件 + if ($(".datetimerange", form).size() > 0) { + require(['bootstrap-daterangepicker'], function () { + var ranges = {}; + ranges[__('Today')] = [Moment().startOf('day'), Moment().endOf('day')]; + ranges[__('Yesterday')] = [Moment().subtract(1, 'days').startOf('day'), Moment().subtract(1, 'days').endOf('day')]; + ranges[__('Last 7 Days')] = [Moment().subtract(6, 'days').startOf('day'), Moment().endOf('day')]; + ranges[__('Last 30 Days')] = [Moment().subtract(29, 'days').startOf('day'), Moment().endOf('day')]; + ranges[__('This Month')] = [Moment().startOf('month'), Moment().endOf('month')]; + ranges[__('Last Month')] = [Moment().subtract(1, 'month').startOf('month'), Moment().subtract(1, 'month').endOf('month')]; + var options = { + timePicker: false, + autoUpdateInput: false, + timePickerSeconds: true, + timePicker24Hour: true, + autoApply: true, + locale: { + format: 'YYYY-MM-DD HH:mm:ss', + customRangeLabel: __("Custom Range"), + applyLabel: __("Apply"), + cancelLabel: __("Clear"), + }, + ranges: ranges, + }; + var origincallback = function (start, end) { + $(this.element).val(start.format(options.locale.format) + " - " + end.format(options.locale.format)); + $(this.element).trigger('blur'); + }; + $(".datetimerange", form).each(function () { + var callback = typeof $(this).data('callback') == 'function' ? $(this).data('callback') : origincallback; + $(this).on('apply.daterangepicker', function (ev, picker) { + callback.call(picker, picker.startDate, picker.endDate); + }); + $(this).on('cancel.daterangepicker', function (ev, picker) { + $(this).val('').trigger('blur'); + }); + $(this).daterangepicker($.extend({}, options, $(this).data()), callback); + }); + }); + } + }, plupload: function (form) { //绑定plupload上传元素事件 if ($(".plupload", form).size() > 0) { @@ -287,6 +347,8 @@ define(['jquery', 'bootstrap', 'upload', 'validator'], function ($, undefined, U events.selectpicker(form); + events.daterangepicker(form); + events.selectpage(form); events.cxselect(form); diff --git a/public/assets/js/require-frontend.js b/public/assets/js/require-frontend.js index ddc83098..beaf9ef4 100644 --- a/public/assets/js/require-frontend.js +++ b/public/assets/js/require-frontend.js @@ -7,7 +7,7 @@ require.config({ } ], //在打包压缩时将会把include中的模块合并到主文件中 - include: ['css', 'layer', 'toastr', 'fast', 'frontend'], + include: ['css', 'layer', 'toastr', 'fast', 'frontend', 'frontend-init'], paths: { 'lang': "empty:", 'form': 'require-form', @@ -34,22 +34,20 @@ require.config({ 'bootstrap-table-mobile': '../libs/bootstrap-table/dist/extensions/mobile/bootstrap-table-mobile', 'bootstrap-table-lang': '../libs/bootstrap-table/dist/locale/bootstrap-table-zh-CN', 'tableexport': '../libs/tableExport.jquery.plugin/tableExport.min', - 'dragsort': '../libs/dragsort/jquery.dragsort', - 'qrcode': '../libs/jquery-qrcode/jquery.qrcode.min', + 'dragsort': '../libs/fastadmin-dragsort/jquery.dragsort', 'sortable': '../libs/Sortable/Sortable.min', - 'addtabs': '../libs/jquery-addtabs/jquery.addtabs', + 'addtabs': '../libs/fastadmin-addtabs/jquery.addtabs', 'slimscroll': '../libs/jquery-slimscroll/jquery.slimscroll', - 'summernote': '../libs/summernote/dist/lang/summernote-zh-CN.min', 'validator-core': '../libs/nice-validator/dist/jquery.validator', 'validator-lang': '../libs/nice-validator/dist/local/zh-CN', 'plupload': '../libs/plupload/js/plupload.min', 'toastr': '../libs/toastr/toastr', 'jstree': '../libs/jstree/dist/jstree.min', - 'layer': '../libs/layer/src/layer', + 'layer': '../libs/layer/dist/layer', 'cookie': '../libs/jquery.cookie/jquery.cookie', - 'cxselect': '../libs/jquery-cxselect/js/jquery.cxselect', + 'cxselect': '../libs/fastadmin-cxselect/js/jquery.cxselect', 'template': '../libs/art-template/dist/template-native', - 'selectpage': '../libs/selectpage/selectpage', + 'selectpage': '../libs/fastadmin-selectpage/selectpage', 'citypicker': '../libs/city-picker/dist/js/city-picker.min', 'citypicker-data': '../libs/city-picker/dist/js/city-picker.data', }, @@ -106,7 +104,6 @@ require.config({ ], 'bootstrap-select': ['css!../libs/bootstrap-select/dist/css/bootstrap-select.min.css', ], 'bootstrap-select-lang': ['bootstrap-select'], - 'summernote': ['../libs/summernote/dist/summernote.min', 'css!../libs/summernote/dist/summernote.css'], // 'toastr': ['css!../libs/toastr/toastr.min.css'], 'jstree': ['css!../libs/jstree/dist/themes/default/style.css', ], 'plupload': { @@ -116,7 +113,7 @@ require.config({ // 'layer': ['css!../libs/layer/dist/theme/default/layer.css'], // 'validator-core': ['css!../libs/nice-validator/dist/jquery.validator.css'], 'validator-lang': ['validator-core'], -// 'selectpage': ['css!../libs/selectpage/selectpage.css'], +// 'selectpage': ['css!../libs/fastadmin-selectpage/selectpage.css'], 'citypicker': ['citypicker-data', 'css!../libs/city-picker/dist/css/city-picker.css'] }, baseUrl: requirejs.s.contexts._.config.config.site.cdnurl + '/assets/js/', //资源基础路径 diff --git a/public/assets/js/require-frontend.min.js b/public/assets/js/require-frontend.min.js index 3b7eca91..b3ee9a4b 100644 --- a/public/assets/js/require-frontend.min.js +++ b/public/assets/js/require-frontend.min.js @@ -21,7 +21,7 @@ require.config({ } ], //在打包压缩时将会把include中的模块合并到主文件中 - include: ['css', 'layer', 'toastr', 'fast', 'frontend'], + include: ['css', 'layer', 'toastr', 'fast', 'frontend', 'frontend-init'], paths: { 'lang': "empty:", 'form': 'require-form', @@ -48,22 +48,20 @@ require.config({ 'bootstrap-table-mobile': '../libs/bootstrap-table/dist/extensions/mobile/bootstrap-table-mobile', 'bootstrap-table-lang': '../libs/bootstrap-table/dist/locale/bootstrap-table-zh-CN', 'tableexport': '../libs/tableExport.jquery.plugin/tableExport.min', - 'dragsort': '../libs/dragsort/jquery.dragsort', - 'qrcode': '../libs/jquery-qrcode/jquery.qrcode.min', + 'dragsort': '../libs/fastadmin-dragsort/jquery.dragsort', 'sortable': '../libs/Sortable/Sortable.min', - 'addtabs': '../libs/jquery-addtabs/jquery.addtabs', + 'addtabs': '../libs/fastadmin-addtabs/jquery.addtabs', 'slimscroll': '../libs/jquery-slimscroll/jquery.slimscroll', - 'summernote': '../libs/summernote/dist/lang/summernote-zh-CN.min', 'validator-core': '../libs/nice-validator/dist/jquery.validator', 'validator-lang': '../libs/nice-validator/dist/local/zh-CN', 'plupload': '../libs/plupload/js/plupload.min', 'toastr': '../libs/toastr/toastr', 'jstree': '../libs/jstree/dist/jstree.min', - 'layer': '../libs/layer/src/layer', + 'layer': '../libs/layer/dist/layer', 'cookie': '../libs/jquery.cookie/jquery.cookie', - 'cxselect': '../libs/jquery-cxselect/js/jquery.cxselect', + 'cxselect': '../libs/fastadmin-cxselect/js/jquery.cxselect', 'template': '../libs/art-template/dist/template-native', - 'selectpage': '../libs/selectpage/selectpage', + 'selectpage': '../libs/fastadmin-selectpage/selectpage', 'citypicker': '../libs/city-picker/dist/js/city-picker.min', 'citypicker-data': '../libs/city-picker/dist/js/city-picker.data', }, @@ -120,7 +118,6 @@ require.config({ ], 'bootstrap-select': ['css!../libs/bootstrap-select/dist/css/bootstrap-select.min.css', ], 'bootstrap-select-lang': ['bootstrap-select'], - 'summernote': ['../libs/summernote/dist/summernote.min', 'css!../libs/summernote/dist/summernote.css'], // 'toastr': ['css!../libs/toastr/toastr.min.css'], 'jstree': ['css!../libs/jstree/dist/themes/default/style.css', ], 'plupload': { @@ -130,7 +127,7 @@ require.config({ // 'layer': ['css!../libs/layer/dist/theme/default/layer.css'], // 'validator-core': ['css!../libs/nice-validator/dist/jquery.validator.css'], 'validator-lang': ['validator-core'], -// 'selectpage': ['css!../libs/selectpage/selectpage.css'], +// 'selectpage': ['css!../libs/fastadmin-selectpage/selectpage.css'], 'citypicker': ['citypicker-data', 'css!../libs/city-picker/dist/css/city-picker.css'] }, baseUrl: requirejs.s.contexts._.config.config.site.cdnurl + '/assets/js/', //资源基础路径 @@ -176,1311 +173,8 @@ require(['jquery', 'bootstrap'], function ($, undefined) { define("require-frontend", function(){}); define('../libs/require-css/css.min',[],function(){if("undefined"==typeof window)return{load:function(a,b,c){c()}};var a=document.getElementsByTagName("head")[0],b=window.navigator.userAgent.match(/Trident\/([^ ;]*)|AppleWebKit\/([^ ;]*)|Opera\/([^ ;]*)|rv\:([^ ;]*)(.*?)Gecko\/([^ ;]*)|MSIE\s([^ ;]*)|AndroidWebKit\/([^ ;]*)/)||0,c=!1,d=!0;b[1]||b[7]?c=parseInt(b[1])<6||parseInt(b[7])<=9:b[2]||b[8]?d=!1:b[4]&&(c=parseInt(b[4])<18);var e={};e.pluginBuilder="./css-builder";var f,g,h,i=function(){f=document.createElement("style"),a.appendChild(f),g=f.styleSheet||f.sheet},j=0,k=[],l=function(a){g.addImport(a),f.onload=function(){m()},j++,31==j&&(i(),j=0)},m=function(){h();var a=k.shift();return a?(h=a[1],void l(a[0])):void(h=null)},n=function(a,b){if(g&&g.addImport||i(),g&&g.addImport)h?k.push([a,b]):(l(a),h=b);else{f.textContent='@import "'+a+'";';var c=setInterval(function(){try{f.sheet.cssRules,clearInterval(c),b()}catch(a){}},10)}},o=function(b,c){var e=document.createElement("link");if(e.type="text/css",e.rel="stylesheet",d)e.onload=function(){e.onload=function(){},setTimeout(c,7)};else var f=setInterval(function(){for(var a=0;a 0; i--){ - if(js[i].readyState === 'interactive'){ - src = js[i].src; - break; - } - } - return src || js[last].src; - }(); - return jsPath.substring(0, jsPath.lastIndexOf('/') + 1); - }(), - - config: {}, end: {}, minIndex: 0, minLeft: [], - btn: ['确定', '取消'], - - //五种原始层模式 - type: ['dialog', 'page', 'iframe', 'loading', 'tips'], - - //获取节点的style属性值 - getStyle: function(node, name){ - var style = node.currentStyle ? node.currentStyle : window.getComputedStyle(node, null); - return style[style.getPropertyValue ? 'getPropertyValue' : 'getAttribute'](name); - }, - - //载入CSS配件 - link: function(href, fn, cssname){ - - //未设置路径,则不主动加载css - if(!layer.path) return; - - var head = document.getElementsByTagName("head")[0], link = document.createElement('link'); - if(typeof fn === 'string') cssname = fn; - var app = (cssname || href).replace(/\.|\//g, ''); - var id = 'layuicss-'+ app, timeout = 0; - - link.rel = 'stylesheet'; - link.href = layer.path + href; - link.id = id; - - if(!document.getElementById(id)){ - head.appendChild(link); - } - - if(typeof fn !== 'function') return; - - //轮询css是否加载完毕 - (function poll() { - if(++timeout > 8 * 1000 / 100){ - return window.console && console.error('layer.css: Invalid'); - }; - parseInt(ready.getStyle(document.getElementById(id), 'width')) === 1989 ? fn() : setTimeout(poll, 100); - }()); - } -}; - -//默认内置方法。 -var layer = { - v: '3.1.1', - ie: function(){ //ie版本 - var agent = navigator.userAgent.toLowerCase(); - return (!!window.ActiveXObject || "ActiveXObject" in window) ? ( - (agent.match(/msie\s(\d+)/) || [])[1] || '11' //由于ie11并没有msie的标识 - ) : false; - }(), - index: (window.layer && window.layer.v) ? 100000 : 0, - path: ready.getPath, - config: function(options, fn){ - options = options || {}; - layer.cache = ready.config = $.extend({}, ready.config, options); - layer.path = ready.config.path || layer.path; - typeof options.extend === 'string' && (options.extend = [options.extend]); - - if(ready.config.path) layer.ready(); - - if(!options.extend) return this; - - isLayui - ? layui.addcss('modules/layer/' + options.extend) - : ready.link('theme/' + options.extend); - - return this; - }, - - //主体CSS等待事件 - ready: function(callback){ - var cssname = 'layer', ver = '' - ,path = (isLayui ? 'modules/layer/' : 'theme/') + 'default/layer.css?v='+ layer.v + ver; - isLayui ? layui.addcss(path, callback, cssname) : ready.link(path, callback, cssname); - return this; - }, - - //各种快捷引用 - alert: function(content, options, yes){ - var type = typeof options === 'function'; - if(type) yes = options; - return layer.open($.extend({ - content: content, - yes: yes - }, type ? {} : options)); - }, - - confirm: function(content, options, yes, cancel){ - var type = typeof options === 'function'; - if(type){ - cancel = yes; - yes = options; - } - return layer.open($.extend({ - content: content, - btn: ready.btn, - yes: yes, - btn2: cancel - }, type ? {} : options)); - }, - - msg: function(content, options, end){ //最常用提示层 - var type = typeof options === 'function', rskin = ready.config.skin; - var skin = (rskin ? rskin + ' ' + rskin + '-msg' : '')||'layui-layer-msg'; - var anim = doms.anim.length - 1; - if(type) end = options; - return layer.open($.extend({ - content: content, - time: 3000, - shade: false, - skin: skin, - title: false, - closeBtn: false, - btn: false, - resize: false, - end: end - }, (type && !ready.config.skin) ? { - skin: skin + ' layui-layer-hui', - anim: anim - } : function(){ - options = options || {}; - if(options.icon === -1 || options.icon === undefined && !ready.config.skin){ - options.skin = skin + ' ' + (options.skin||'layui-layer-hui'); - } - return options; - }())); - }, - - load: function(icon, options){ - return layer.open($.extend({ - type: 3, - icon: icon || 0, - resize: false, - shade: 0.01 - }, options)); - }, - - tips: function(content, follow, options){ - return layer.open($.extend({ - type: 4, - content: [content, follow], - closeBtn: false, - time: 3000, - shade: false, - resize: false, - fixed: false, - maxWidth: 210 - }, options)); - } -}; - -var Class = function(setings){ - var that = this; - that.index = ++layer.index; - that.config = $.extend({}, that.config, ready.config, setings); - document.body ? that.creat() : setTimeout(function(){ - that.creat(); - }, 30); -}; - -Class.pt = Class.prototype; - -//缓存常用字符 -var doms = ['layui-layer', '.layui-layer-title', '.layui-layer-main', '.layui-layer-dialog', 'layui-layer-iframe', 'layui-layer-content', 'layui-layer-btn', 'layui-layer-close']; -doms.anim = ['layer-anim-00', 'layer-anim-01', 'layer-anim-02', 'layer-anim-03', 'layer-anim-04', 'layer-anim-05', 'layer-anim-06']; - -//默认配置 -Class.pt.config = { - type: 0, - shade: 0.3, - fixed: true, - move: doms[1], - title: '信息', - offset: 'auto', - area: 'auto', - closeBtn: 1, - time: 0, //0表示不自动关闭 - zIndex: 19891014, - maxWidth: 360, - anim: 0, - isOutAnim: true, - icon: -1, - moveType: 1, - resize: true, - scrollbar: true, //是否允许浏览器滚动条 - tips: 2 -}; - -//容器 -Class.pt.vessel = function(conType, callback){ - var that = this, times = that.index, config = that.config; - var zIndex = config.zIndex + times, titype = typeof config.title === 'object'; - var ismax = config.maxmin && (config.type === 1 || config.type === 2); - var titleHTML = (config.title ? '
                ' - + (titype ? config.title[0] : config.title) - + '
                ' : ''); - - config.zIndex = zIndex; - callback([ - //遮罩 - config.shade ? ('
                ') : '', - - //主体 - '
                ' - + (conType && config.type != 2 ? '' : titleHTML) - + '
                ' - + (config.type == 0 && config.icon !== -1 ? '' : '') - + (config.type == 1 && conType ? '' : (config.content||'')) - + '
                ' - + ''+ function(){ - var closebtn = ismax ? '' : ''; - config.closeBtn && (closebtn += ''); - return closebtn; - }() + '' - + (config.btn ? function(){ - var button = ''; - typeof config.btn === 'string' && (config.btn = [config.btn]); - for(var i = 0, len = config.btn.length; i < len; i++){ - button += ''+ config.btn[i] +'' - } - return '
                '+ button +'
                ' - }() : '') - + (config.resize ? '' : '') - + '
                ' - ], titleHTML, $('
                ')); - return that; -}; - -//创建骨架 -Class.pt.creat = function(){ - var that = this - ,config = that.config - ,times = that.index, nodeIndex - ,content = config.content - ,conType = typeof content === 'object' - ,body = $('body'); - - if(config.id && $('#'+config.id)[0]) return; - - if(typeof config.area === 'string'){ - config.area = config.area === 'auto' ? ['', ''] : [config.area, '']; - } - - //anim兼容旧版shift - if(config.shift){ - config.anim = config.shift; - } - - if(layer.ie == 6){ - config.fixed = false; - } - - switch(config.type){ - case 0: - config.btn = ('btn' in config) ? config.btn : ready.btn[0]; - layer.closeAll('dialog'); - break; - case 2: - var content = config.content = conType ? config.content : [config.content||'http://layer.layui.com', 'auto']; - config.content = ''; - break; - case 3: - delete config.title; - delete config.closeBtn; - config.icon === -1 && (config.icon === 0); - layer.closeAll('loading'); - break; - case 4: - conType || (config.content = [config.content, 'body']); - config.follow = config.content[1]; - config.content = config.content[0] + ''; - delete config.title; - config.tips = typeof config.tips === 'object' ? config.tips : [config.tips, true]; - config.tipsMore || layer.closeAll('tips'); - break; - } - - //建立容器 - that.vessel(conType, function(html, titleHTML, moveElem){ - body.append(html[0]); - conType ? function(){ - (config.type == 2 || config.type == 4) ? function(){ - $('body').append(html[1]); - }() : function(){ - if(!content.parents('.'+doms[0])[0]){ - content.data('display', content.css('display')).show().addClass('layui-layer-wrap').wrap(html[1]); - $('#'+ doms[0] + times).find('.'+doms[5]).before(titleHTML); - } - }(); - }() : body.append(html[1]); - $('.layui-layer-move')[0] || body.append(ready.moveElem = moveElem); - that.layero = $('#'+ doms[0] + times); - config.scrollbar || doms.html.css('overflow', 'hidden').attr('layer-full', times); - }).auto(times); - - //遮罩 - $('#layui-layer-shade'+ that.index).css({ - 'background-color': config.shade[1] || '#000' - ,'opacity': config.shade[0]||config.shade - }); - - config.type == 2 && layer.ie == 6 && that.layero.find('iframe').attr('src', content[0]); - - //坐标自适应浏览器窗口尺寸 - config.type == 4 ? that.tips() : that.offset(); - if(config.fixed){ - win.on('resize', function(){ - that.offset(); - (/^\d+%$/.test(config.area[0]) || /^\d+%$/.test(config.area[1])) && that.auto(times); - config.type == 4 && that.tips(); - }); - } - - config.time <= 0 || setTimeout(function(){ - layer.close(that.index) - }, config.time); - that.move().callback(); - - //为兼容jQuery3.0的css动画影响元素尺寸计算 - if(doms.anim[config.anim]){ - var animClass = 'layer-anim '+ doms.anim[config.anim]; - that.layero.addClass(animClass).one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', function(){ - $(this).removeClass(animClass); - }); - }; - - //记录关闭动画 - if(config.isOutAnim){ - that.layero.data('isOutAnim', true); - } -}; - -//自适应 -Class.pt.auto = function(index){ - var that = this, config = that.config, layero = $('#'+ doms[0] + index); - - if(config.area[0] === '' && config.maxWidth > 0){ - //为了修复IE7下一个让人难以理解的bug - if(layer.ie && layer.ie < 8 && config.btn){ - layero.width(layero.innerWidth()); - } - layero.outerWidth() > config.maxWidth && layero.width(config.maxWidth); - } - - var area = [layero.innerWidth(), layero.innerHeight()] - ,titHeight = layero.find(doms[1]).outerHeight() || 0 - ,btnHeight = layero.find('.'+doms[6]).outerHeight() || 0 - ,setHeight = function(elem){ - elem = layero.find(elem); - elem.height(area[1] - titHeight - btnHeight - 2*(parseFloat(elem.css('padding-top'))|0)); - }; - - switch(config.type){ - case 2: - setHeight('iframe'); - break; - default: - if(config.area[1] === ''){ - if(config.maxHeight > 0 && layero.outerHeight() > config.maxHeight){ - area[1] = config.maxHeight; - setHeight('.'+doms[5]); - } else if(config.fixed && area[1] >= win.height()){ - area[1] = win.height(); - setHeight('.'+doms[5]); - } - } else { - setHeight('.'+doms[5]); - } - break; - }; - - return that; -}; - -//计算坐标 -Class.pt.offset = function(){ - var that = this, config = that.config, layero = that.layero; - var area = [layero.outerWidth(), layero.outerHeight()]; - var type = typeof config.offset === 'object'; - that.offsetTop = (win.height() - area[1])/2; - that.offsetLeft = (win.width() - area[0])/2; - - if(type){ - that.offsetTop = config.offset[0]; - that.offsetLeft = config.offset[1]||that.offsetLeft; - } else if(config.offset !== 'auto'){ - - if(config.offset === 't'){ //上 - that.offsetTop = 0; - } else if(config.offset === 'r'){ //右 - that.offsetLeft = win.width() - area[0]; - } else if(config.offset === 'b'){ //下 - that.offsetTop = win.height() - area[1]; - } else if(config.offset === 'l'){ //左 - that.offsetLeft = 0; - } else if(config.offset === 'lt'){ //左上角 - that.offsetTop = 0; - that.offsetLeft = 0; - } else if(config.offset === 'lb'){ //左下角 - that.offsetTop = win.height() - area[1]; - that.offsetLeft = 0; - } else if(config.offset === 'rt'){ //右上角 - that.offsetTop = 0; - that.offsetLeft = win.width() - area[0]; - } else if(config.offset === 'rb'){ //右下角 - that.offsetTop = win.height() - area[1]; - that.offsetLeft = win.width() - area[0]; - } else { - that.offsetTop = config.offset; - } - - } - - if(!config.fixed){ - that.offsetTop = /%$/.test(that.offsetTop) ? - win.height()*parseFloat(that.offsetTop)/100 - : parseFloat(that.offsetTop); - that.offsetLeft = /%$/.test(that.offsetLeft) ? - win.width()*parseFloat(that.offsetLeft)/100 - : parseFloat(that.offsetLeft); - that.offsetTop += win.scrollTop(); - that.offsetLeft += win.scrollLeft(); - } - - if(layero.attr('minLeft')){ - that.offsetTop = win.height() - (layero.find(doms[1]).outerHeight() || 0); - that.offsetLeft = layero.css('left'); - } - - layero.css({top: that.offsetTop, left: that.offsetLeft}); -}; - -//Tips -Class.pt.tips = function(){ - var that = this, config = that.config, layero = that.layero; - var layArea = [layero.outerWidth(), layero.outerHeight()], follow = $(config.follow); - if(!follow[0]) follow = $('body'); - var goal = { - width: follow.outerWidth(), - height: follow.outerHeight(), - top: follow.offset().top, - left: follow.offset().left - }, tipsG = layero.find('.layui-layer-TipsG'); - - var guide = config.tips[0]; - config.tips[1] || tipsG.remove(); - - goal.autoLeft = function(){ - if(goal.left + layArea[0] - win.width() > 0){ - goal.tipLeft = goal.left + goal.width - layArea[0]; - tipsG.css({right: 12, left: 'auto'}); - } else { - goal.tipLeft = goal.left; - }; - }; - - //辨别tips的方位 - goal.where = [function(){ //上 - goal.autoLeft(); - goal.tipTop = goal.top - layArea[1] - 10; - tipsG.removeClass('layui-layer-TipsB').addClass('layui-layer-TipsT').css('border-right-color', config.tips[1]); - }, function(){ //右 - goal.tipLeft = goal.left + goal.width + 10; - goal.tipTop = goal.top; - tipsG.removeClass('layui-layer-TipsL').addClass('layui-layer-TipsR').css('border-bottom-color', config.tips[1]); - }, function(){ //下 - goal.autoLeft(); - goal.tipTop = goal.top + goal.height + 10; - tipsG.removeClass('layui-layer-TipsT').addClass('layui-layer-TipsB').css('border-right-color', config.tips[1]); - }, function(){ //左 - goal.tipLeft = goal.left - layArea[0] - 10; - goal.tipTop = goal.top; - tipsG.removeClass('layui-layer-TipsR').addClass('layui-layer-TipsL').css('border-bottom-color', config.tips[1]); - }]; - goal.where[guide-1](); - - /* 8*2为小三角形占据的空间 */ - if(guide === 1){ - goal.top - (win.scrollTop() + layArea[1] + 8*2) < 0 && goal.where[2](); - } else if(guide === 2){ - win.width() - (goal.left + goal.width + layArea[0] + 8*2) > 0 || goal.where[3]() - } else if(guide === 3){ - (goal.top - win.scrollTop() + goal.height + layArea[1] + 8*2) - win.height() > 0 && goal.where[0](); - } else if(guide === 4){ - layArea[0] + 8*2 - goal.left > 0 && goal.where[1]() - } - - layero.find('.'+doms[5]).css({ - 'background-color': config.tips[1], - 'padding-right': (config.closeBtn ? '30px' : '') - }); - layero.css({ - left: goal.tipLeft - (config.fixed ? win.scrollLeft() : 0), - top: goal.tipTop - (config.fixed ? win.scrollTop() : 0) - }); -} - -//拖拽层 -Class.pt.move = function(){ - var that = this - ,config = that.config - ,_DOC = $(document) - ,layero = that.layero - ,moveElem = layero.find(config.move) - ,resizeElem = layero.find('.layui-layer-resize') - ,dict = {}; - - if(config.move){ - moveElem.css('cursor', 'move'); - } - - moveElem.on('mousedown', function(e){ - e.preventDefault(); - if(config.move){ - dict.moveStart = true; - dict.offset = [ - e.clientX - parseFloat(layero.css('left')) - ,e.clientY - parseFloat(layero.css('top')) - ]; - ready.moveElem.css('cursor', 'move').show(); - } - }); - - resizeElem.on('mousedown', function(e){ - e.preventDefault(); - dict.resizeStart = true; - dict.offset = [e.clientX, e.clientY]; - dict.area = [ - layero.outerWidth() - ,layero.outerHeight() - ]; - ready.moveElem.css('cursor', 'se-resize').show(); - }); - - _DOC.on('mousemove', function(e){ - - //拖拽移动 - if(dict.moveStart){ - var X = e.clientX - dict.offset[0] - ,Y = e.clientY - dict.offset[1] - ,fixed = layero.css('position') === 'fixed'; - - e.preventDefault(); - - dict.stX = fixed ? 0 : win.scrollLeft(); - dict.stY = fixed ? 0 : win.scrollTop(); - - //控制元素不被拖出窗口外 - if(!config.moveOut){ - var setRig = win.width() - layero.outerWidth() + dict.stX - ,setBot = win.height() - layero.outerHeight() + dict.stY; - X < dict.stX && (X = dict.stX); - X > setRig && (X = setRig); - Y < dict.stY && (Y = dict.stY); - Y > setBot && (Y = setBot); - } - - layero.css({ - left: X - ,top: Y - }); - } - - //Resize - if(config.resize && dict.resizeStart){ - var X = e.clientX - dict.offset[0] - ,Y = e.clientY - dict.offset[1]; - - e.preventDefault(); - - layer.style(that.index, { - width: dict.area[0] + X - ,height: dict.area[1] + Y - }) - dict.isResize = true; - config.resizing && config.resizing(layero); - } - }).on('mouseup', function(e){ - if(dict.moveStart){ - delete dict.moveStart; - ready.moveElem.hide(); - config.moveEnd && config.moveEnd(layero); - } - if(dict.resizeStart){ - delete dict.resizeStart; - ready.moveElem.hide(); - } - }); - - return that; -}; - -Class.pt.callback = function(){ - var that = this, layero = that.layero, config = that.config; - that.openLayer(); - if(config.success){ - if(config.type == 2){ - layero.find('iframe').on('load', function(){ - config.success(layero, that.index); - }); - } else { - config.success(layero, that.index); - } - } - layer.ie == 6 && that.IE6(layero); - - //按钮 - layero.find('.'+ doms[6]).children('a').on('click', function(){ - var index = $(this).index(); - if(index === 0){ - if(config.yes){ - config.yes(that.index, layero) - } else if(config['btn1']){ - config['btn1'](that.index, layero) - } else { - layer.close(that.index); - } - } else { - var close = config['btn'+(index+1)] && config['btn'+(index+1)](that.index, layero); - close === false || layer.close(that.index); - } - }); - - //取消 - function cancel(){ - var close = config.cancel && config.cancel(that.index, layero); - close === false || layer.close(that.index); - } - - //右上角关闭回调 - layero.find('.'+ doms[7]).on('click', cancel); - - //点遮罩关闭 - if(config.shadeClose){ - $('#layui-layer-shade'+ that.index).on('click', function(){ - layer.close(that.index); - }); - } - - //最小化 - layero.find('.layui-layer-min').on('click', function(){ - var min = config.min && config.min(layero); - min === false || layer.min(that.index, config); - }); - - //全屏/还原 - layero.find('.layui-layer-max').on('click', function(){ - if($(this).hasClass('layui-layer-maxmin')){ - layer.restore(that.index); - config.restore && config.restore(layero); - } else { - layer.full(that.index, config); - setTimeout(function(){ - config.full && config.full(layero); - }, 100); - } - }); - - config.end && (ready.end[that.index] = config.end); -}; - -//for ie6 恢复select -ready.reselect = function(){ - $.each($('select'), function(index , value){ - var sthis = $(this); - if(!sthis.parents('.'+doms[0])[0]){ - (sthis.attr('layer') == 1 && $('.'+doms[0]).length < 1) && sthis.removeAttr('layer').show(); - } - sthis = null; - }); -}; - -Class.pt.IE6 = function(layero){ - //隐藏select - $('select').each(function(index , value){ - var sthis = $(this); - if(!sthis.parents('.'+doms[0])[0]){ - sthis.css('display') === 'none' || sthis.attr({'layer' : '1'}).hide(); - } - sthis = null; - }); -}; - -//需依赖原型的对外方法 -Class.pt.openLayer = function(){ - var that = this; - - //置顶当前窗口 - layer.zIndex = that.config.zIndex; - layer.setTop = function(layero){ - var setZindex = function(){ - layer.zIndex++; - layero.css('z-index', layer.zIndex + 1); - }; - layer.zIndex = parseInt(layero[0].style.zIndex); - layero.on('mousedown', setZindex); - return layer.zIndex; - }; -}; - -ready.record = function(layero){ - var area = [ - layero.width(), - layero.height(), - layero.position().top, - layero.position().left + parseFloat(layero.css('margin-left')) - ]; - layero.find('.layui-layer-max').addClass('layui-layer-maxmin'); - layero.attr({area: area}); -}; - -ready.rescollbar = function(index){ - if(doms.html.attr('layer-full') == index){ - if(doms.html[0].style.removeProperty){ - doms.html[0].style.removeProperty('overflow'); - } else { - doms.html[0].style.removeAttribute('overflow'); - } - doms.html.removeAttr('layer-full'); - } -}; - -/** 内置成员 */ - -window.layer = layer; - -//获取子iframe的DOM -layer.getChildFrame = function(selector, index){ - index = index || $('.'+doms[4]).attr('times'); - return $('#'+ doms[0] + index).find('iframe').contents().find(selector); -}; - -//得到当前iframe层的索引,子iframe时使用 -layer.getFrameIndex = function(name){ - return $('#'+ name).parents('.'+doms[4]).attr('times'); -}; - -//iframe层自适应宽高 -layer.iframeAuto = function(index){ - if(!index) return; - var heg = layer.getChildFrame('html', index).outerHeight(); - var layero = $('#'+ doms[0] + index); - var titHeight = layero.find(doms[1]).outerHeight() || 0; - var btnHeight = layero.find('.'+doms[6]).outerHeight() || 0; - layero.css({height: heg + titHeight + btnHeight}); - layero.find('iframe').css({height: heg}); -}; - -//重置iframe url -layer.iframeSrc = function(index, url){ - $('#'+ doms[0] + index).find('iframe').attr('src', url); -}; - -//设定层的样式 -layer.style = function(index, options, limit){ - var layero = $('#'+ doms[0] + index) - ,contElem = layero.find('.layui-layer-content') - ,type = layero.attr('type') - ,titHeight = layero.find(doms[1]).outerHeight() || 0 - ,btnHeight = layero.find('.'+doms[6]).outerHeight() || 0 - ,minLeft = layero.attr('minLeft'); - - if(type === ready.type[3] || type === ready.type[4]){ - return; - } - - if(!limit){ - if(parseFloat(options.width) <= 260){ - options.width = 260; - }; - - if(parseFloat(options.height) - titHeight - btnHeight <= 64){ - options.height = 64 + titHeight + btnHeight; - }; - } - - layero.css(options); - btnHeight = layero.find('.'+doms[6]).outerHeight(); - - if(type === ready.type[2]){ - layero.find('iframe').css({ - height: parseFloat(options.height) - titHeight - btnHeight - }); - } else { - contElem.css({ - height: parseFloat(options.height) - titHeight - btnHeight - - parseFloat(contElem.css('padding-top')) - - parseFloat(contElem.css('padding-bottom')) - }) - } -}; - -//最小化 -layer.min = function(index, options){ - var layero = $('#'+ doms[0] + index) - ,titHeight = layero.find(doms[1]).outerHeight() || 0 - ,left = layero.attr('minLeft') || (181*ready.minIndex)+'px' - ,position = layero.css('position'); - - ready.record(layero); - - if(ready.minLeft[0]){ - left = ready.minLeft[0]; - ready.minLeft.shift(); - } - - layero.attr('position', position); - - layer.style(index, { - width: 180 - ,height: titHeight - ,left: left - ,top: win.height() - titHeight - ,position: 'fixed' - ,overflow: 'hidden' - }, true); - - layero.find('.layui-layer-min').hide(); - layero.attr('type') === 'page' && layero.find(doms[4]).hide(); - ready.rescollbar(index); - - if(!layero.attr('minLeft')){ - ready.minIndex++; - } - layero.attr('minLeft', left); -}; - -//还原 -layer.restore = function(index){ - var layero = $('#'+ doms[0] + index), area = layero.attr('area').split(','); - var type = layero.attr('type'); - layer.style(index, { - width: parseFloat(area[0]), - height: parseFloat(area[1]), - top: parseFloat(area[2]), - left: parseFloat(area[3]), - position: layero.attr('position'), - overflow: 'visible' - }, true); - layero.find('.layui-layer-max').removeClass('layui-layer-maxmin'); - layero.find('.layui-layer-min').show(); - layero.attr('type') === 'page' && layero.find(doms[4]).show(); - ready.rescollbar(index); -}; - -//全屏 -layer.full = function(index){ - var layero = $('#'+ doms[0] + index), timer; - ready.record(layero); - if(!doms.html.attr('layer-full')){ - doms.html.css('overflow','hidden').attr('layer-full', index); - } - clearTimeout(timer); - timer = setTimeout(function(){ - var isfix = layero.css('position') === 'fixed'; - layer.style(index, { - top: isfix ? 0 : win.scrollTop(), - left: isfix ? 0 : win.scrollLeft(), - width: win.width(), - height: win.height() - }, true); - layero.find('.layui-layer-min').hide(); - }, 100); -}; - -//改变title -layer.title = function(name, index){ - var title = $('#'+ doms[0] + (index||layer.index)).find(doms[1]); - title.html(name); -}; - -//关闭layer总方法 -layer.close = function(index){ - var layero = $('#'+ doms[0] + index), type = layero.attr('type'), closeAnim = 'layer-anim-close'; - if(!layero[0]) return; - var WRAP = 'layui-layer-wrap', remove = function(){ - if(type === ready.type[1] && layero.attr('conType') === 'object'){ - layero.children(':not(.'+ doms[5] +')').remove(); - var wrap = layero.find('.'+WRAP); - for(var i = 0; i < 2; i++){ - wrap.unwrap(); - } - wrap.css('display', wrap.data('display')).removeClass(WRAP); - } else { - //低版本IE 回收 iframe - if(type === ready.type[2]){ - try { - var iframe = $('#'+doms[4]+index)[0]; - iframe.contentWindow.document.write(''); - iframe.contentWindow.close(); - layero.find('.'+doms[5])[0].removeChild(iframe); - } catch(e){} - } - layero[0].innerHTML = ''; - layero.remove(); - } - typeof ready.end[index] === 'function' && ready.end[index](); - delete ready.end[index]; - }; - - if(layero.data('isOutAnim')){ - layero.addClass('layer-anim '+ closeAnim); - } - - $('#layui-layer-moves, #layui-layer-shade' + index).remove(); - layer.ie == 6 && ready.reselect(); - ready.rescollbar(index); - if(layero.attr('minLeft')){ - ready.minIndex--; - ready.minLeft.push(layero.attr('minLeft')); - } - - if((layer.ie && layer.ie < 10) || !layero.data('isOutAnim')){ - remove() - } else { - setTimeout(function(){ - remove(); - }, 200); - } -}; - -//关闭所有层 -layer.closeAll = function(type){ - $.each($('.'+doms[0]), function(){ - var othis = $(this); - var is = type ? (othis.attr('type') === type) : 1; - is && layer.close(othis.attr('times')); - is = null; - }); -}; - -/** - - 拓展模块,layui开始合并在一起 - - */ - -var cache = layer.cache||{}, skin = function(type){ - return (cache.skin ? (' ' + cache.skin + ' ' + cache.skin + '-'+type) : ''); -}; - -//仿系统prompt -layer.prompt = function(options, yes){ - var style = ''; - options = options || {}; - - if(typeof options === 'function') yes = options; - - if(options.area){ - var area = options.area; - style = 'style="width: '+ area[0] +'; height: '+ area[1] + ';"'; - delete options.area; - } - var prompt, content = options.formType == 2 ? '' : function(){ - return ''; - }(); - - var success = options.success; - delete options.success; - - return layer.open($.extend({ - type: 1 - ,btn: ['确定','取消'] - ,content: content - ,skin: 'layui-layer-prompt' + skin('prompt') - ,maxWidth: win.width() - ,success: function(layero){ - prompt = layero.find('.layui-layer-input'); - prompt.focus(); - typeof success === 'function' && success(layero); - } - ,resize: false - ,yes: function(index){ - var value = prompt.val(); - if(value === ''){ - prompt.focus(); - } else if(value.length > (options.maxlength||500)) { - layer.tips('最多输入'+ (options.maxlength || 500) +'个字数', prompt, {tips: 1}); - } else { - yes && yes(value, index, prompt); - } - } - }, options)); -}; - -//tab层 -layer.tab = function(options){ - options = options || {}; - - var tab = options.tab || {} - ,THIS = 'layui-this' - ,success = options.success; - - delete options.success; - - return layer.open($.extend({ - type: 1, - skin: 'layui-layer-tab' + skin('tab'), - resize: false, - title: function(){ - var len = tab.length, ii = 1, str = ''; - if(len > 0){ - str = ''+ tab[0].title +''; - for(; ii < len; ii++){ - str += ''+ tab[ii].title +''; - } - } - return str; - }(), - content: '
                  '+ function(){ - var len = tab.length, ii = 1, str = ''; - if(len > 0){ - str = '
                • '+ (tab[0].content || 'no content') +'
                • '; - for(; ii < len; ii++){ - str += '
                • '+ (tab[ii].content || 'no content') +'
                • '; - } - } - return str; - }() +'
                ', - success: function(layero){ - var btn = layero.find('.layui-layer-title').children(); - var main = layero.find('.layui-layer-tabmain').children(); - btn.on('mousedown', function(e){ - e.stopPropagation ? e.stopPropagation() : e.cancelBubble = true; - var othis = $(this), index = othis.index(); - othis.addClass(THIS).siblings().removeClass(THIS); - main.eq(index).show().siblings().hide(); - typeof options.change === 'function' && options.change(index); - }); - typeof success === 'function' && success(layero); - } - }, options)); -}; - -//相册层 -layer.photos = function(options, loop, key){ - var dict = {}; - options = options || {}; - if(!options.photos) return; - var type = options.photos.constructor === Object; - var photos = type ? options.photos : {}, data = photos.data || []; - var start = photos.start || 0; - dict.imgIndex = (start|0) + 1; - - options.img = options.img || 'img'; - - var success = options.success; - delete options.success; - - if(!type){ //页面直接获取 - var parent = $(options.photos), pushData = function(){ - data = []; - parent.find(options.img).each(function(index){ - var othis = $(this); - othis.attr('layer-index', index); - data.push({ - alt: othis.attr('alt'), - pid: othis.attr('layer-pid'), - src: othis.attr('layer-src') || othis.attr('src'), - thumb: othis.attr('src') - }); - }) - }; - - pushData(); - - if (data.length === 0) return; - - loop || parent.on('click', options.img, function(){ - var othis = $(this), index = othis.attr('layer-index'); - layer.photos($.extend(options, { - photos: { - start: index, - data: data, - tab: options.tab - }, - full: options.full - }), true); - pushData(); - }) - - //不直接弹出 - if(!loop) return; - - } else if (data.length === 0){ - return layer.msg('没有图片'); - } - - //上一张 - dict.imgprev = function(key){ - dict.imgIndex--; - if(dict.imgIndex < 1){ - dict.imgIndex = data.length; - } - dict.tabimg(key); - }; - - //下一张 - dict.imgnext = function(key,errorMsg){ - dict.imgIndex++; - if(dict.imgIndex > data.length){ - dict.imgIndex = 1; - if (errorMsg) {return}; - } - dict.tabimg(key) - }; - - //方向键 - dict.keyup = function(event){ - if(!dict.end){ - var code = event.keyCode; - event.preventDefault(); - if(code === 37){ - dict.imgprev(true); - } else if(code === 39) { - dict.imgnext(true); - } else if(code === 27) { - layer.close(dict.index); - } - } - } - - //切换 - dict.tabimg = function(key){ - if(data.length <= 1) return; - photos.start = dict.imgIndex - 1; - layer.close(dict.index); - return layer.photos(options, true, key); - setTimeout(function(){ - layer.photos(options, true, key); - }, 200); - } - - //一些动作 - dict.event = function(){ - dict.bigimg.hover(function(){ - dict.imgsee.show(); - }, function(){ - dict.imgsee.hide(); - }); - - dict.bigimg.find('.layui-layer-imgprev').on('click', function(event){ - event.preventDefault(); - dict.imgprev(); - }); - - dict.bigimg.find('.layui-layer-imgnext').on('click', function(event){ - event.preventDefault(); - dict.imgnext(); - }); - - $(document).on('keyup', dict.keyup); - }; - - //图片预加载 - function loadImage(url, callback, error) { - var img = new Image(); - img.src = url; - if(img.complete){ - return callback(img); - } - img.onload = function(){ - img.onload = null; - callback(img); - }; - img.onerror = function(e){ - img.onerror = null; - error(e); - }; - }; - - dict.loadi = layer.load(1, { - shade: 'shade' in options ? false : 0.9, - scrollbar: false - }); - - loadImage(data[start].src, function(img){ - layer.close(dict.loadi); - dict.index = layer.open($.extend({ - type: 1, - id: 'layui-layer-photos', - area: function(){ - var imgarea = [img.width, img.height]; - var winarea = [$(window).width() - 100, $(window).height() - 100]; - - //如果 实际图片的宽或者高比 屏幕大(那么进行缩放) - if(!options.full && (imgarea[0]>winarea[0]||imgarea[1]>winarea[1])){ - var wh = [imgarea[0]/winarea[0],imgarea[1]/winarea[1]];//取宽度缩放比例、高度缩放比例 - if(wh[0] > wh[1]){//取缩放比例最大的进行缩放 - imgarea[0] = imgarea[0]/wh[0]; - imgarea[1] = imgarea[1]/wh[0]; - } else if(wh[0] < wh[1]){ - imgarea[0] = imgarea[0]/wh[1]; - imgarea[1] = imgarea[1]/wh[1]; - } - } - - return [imgarea[0]+'px', imgarea[1]+'px']; - }(), - title: false, - shade: 0.9, - shadeClose: true, - closeBtn: false, - move: '.layui-layer-phimg img', - moveType: 1, - scrollbar: false, - moveOut: true, - //anim: Math.random()*5|0, - isOutAnim: false, - skin: 'layui-layer-photos' + skin('photos'), - content: '
                ' - +''+ (data[start].alt||'') +'' - +'
                ' - +(data.length > 1 ? '' : '') - +'
                '+ (data[start].alt||'') +''+ dict.imgIndex +'/'+ data.length +'
                ' - +'
                ' - +'
                ', - success: function(layero, index){ - dict.bigimg = layero.find('.layui-layer-phimg'); - dict.imgsee = layero.find('.layui-layer-imguide,.layui-layer-imgbar'); - dict.event(layero); - options.tab && options.tab(data[start], layero); - typeof success === 'function' && success(layero); - }, end: function(){ - dict.end = true; - $(document).off('keyup', dict.keyup); - } - }, options)); - }, function(){ - layer.close(dict.loadi); - layer.msg('当前图片地址异常
                是否继续查看下一张?', { - time: 30000, - btn: ['下一张', '不看了'], - yes: function(){ - data.length > 1 && dict.imgnext(true,true); - } - }); - }); -}; - -//主入口 -ready.run = function(_$){ - $ = _$; - win = $(window); - doms.html = $('html'); - layer.open = function(deliver){ - var o = new Class(deliver); - return o.index; - }; -}; - -//加载方式 -window.layui && layui.define ? ( - layer.ready() - ,layui.define('jquery', function(exports){ //layui加载 - layer.path = layui.cache.dir; - ready.run(layui.$); - - //暴露模块 - window.layer = layer; - exports('layer', layer); - }) -) : ( - (typeof define === 'function' && define.amd) ? define('layer',['jquery'], function(){ //requirejs加载 - ready.run(window.jQuery); - return layer; - }) : function(){ //普通script标签加载 - ready.run(window.jQuery); - layer.ready(); - }() -); - -}(window); - +/*! layer-v3.1.1 Web弹层组件 MIT License http://layer.layui.com/ By 贤心 */ + ;!function(e,t){"use strict";var i,n,a=e.layui&&layui.define,o={getPath:function(){var e=document.currentScript?document.currentScript.src:function(){for(var e,t=document.scripts,i=t.length-1,n=i;n>0;n--)if("interactive"===t[n].readyState){e=t[n].src;break}return e||t[i].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),config:{},end:{},minIndex:0,minLeft:[],btn:["确定","取消"],type:["dialog","page","iframe","loading","tips"],getStyle:function(t,i){var n=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](i)},link:function(t,i,n){if(r.path){var a=document.getElementsByTagName("head")[0],s=document.createElement("link");"string"==typeof i&&(n=i);var l=(n||t).replace(/\.|\//g,""),f="layuicss-"+l,c=0;s.rel="stylesheet",s.href=r.path+t,s.id=f,document.getElementById(f)||a.appendChild(s),"function"==typeof i&&!function u(){return++c>80?e.console&&console.error("layer.css: Invalid"):void(1989===parseInt(o.getStyle(document.getElementById(f),"width"))?i():setTimeout(u,100))}()}}},r={v:"3.1.1",ie:function(){var t=navigator.userAgent.toLowerCase();return!!(e.ActiveXObject||"ActiveXObject"in e)&&((t.match(/msie\s(\d+)/)||[])[1]||"11")}(),index:e.layer&&e.layer.v?1e5:0,path:o.getPath,config:function(e,t){return e=e||{},r.cache=o.config=i.extend({},o.config,e),r.path=o.config.path||r.path,"string"==typeof e.extend&&(e.extend=[e.extend]),o.config.path&&r.ready(),e.extend?(a?layui.addcss("modules/layer/"+e.extend):o.link("theme/"+e.extend),this):this},ready:function(e){var t="layer",i="",n=(a?"modules/layer/":"theme/")+"default/layer.css?v="+r.v+i;return a?layui.addcss(n,e,t):o.link(n,e,t),this},alert:function(e,t,n){var a="function"==typeof t;return a&&(n=t),r.open(i.extend({content:e,yes:n},a?{}:t))},confirm:function(e,t,n,a){var s="function"==typeof t;return s&&(a=n,n=t),r.open(i.extend({content:e,btn:o.btn,yes:n,btn2:a},s?{}:t))},msg:function(e,n,a){var s="function"==typeof n,f=o.config.skin,c=(f?f+" "+f+"-msg":"")||"layui-layer-msg",u=l.anim.length-1;return s&&(a=n),r.open(i.extend({content:e,time:3e3,shade:!1,skin:c,title:!1,closeBtn:!1,btn:!1,resize:!1,end:a},s&&!o.config.skin?{skin:c+" layui-layer-hui",anim:u}:function(){return n=n||{},(n.icon===-1||n.icon===t&&!o.config.skin)&&(n.skin=c+" "+(n.skin||"layui-layer-hui")),n}()))},load:function(e,t){return r.open(i.extend({type:3,icon:e||0,resize:!1,shade:.01},t))},tips:function(e,t,n){return r.open(i.extend({type:4,content:[e,t],closeBtn:!1,time:3e3,shade:!1,resize:!1,fixed:!1,maxWidth:210},n))}},s=function(e){var t=this;t.index=++r.index,t.config=i.extend({},t.config,o.config,e),document.body?t.creat():setTimeout(function(){t.creat()},30)};s.pt=s.prototype;var l=["layui-layer",".layui-layer-title",".layui-layer-main",".layui-layer-dialog","layui-layer-iframe","layui-layer-content","layui-layer-btn","layui-layer-close"];l.anim=["layer-anim-00","layer-anim-01","layer-anim-02","layer-anim-03","layer-anim-04","layer-anim-05","layer-anim-06"],s.pt.config={type:0,shade:.3,fixed:!0,move:l[1],title:"信息",offset:"auto",area:"auto",closeBtn:1,time:0,zIndex:19891014,maxWidth:360,anim:0,isOutAnim:!0,icon:-1,moveType:1,resize:!0,scrollbar:!0,tips:2},s.pt.vessel=function(e,t){var n=this,a=n.index,r=n.config,s=r.zIndex+a,f="object"==typeof r.title,c=r.maxmin&&(1===r.type||2===r.type),u=r.title?'
                '+(f?r.title[0]:r.title)+"
                ":"";return r.zIndex=s,t([r.shade?'
                ':"",'
                '+(e&&2!=r.type?"":u)+'
                '+(0==r.type&&r.icon!==-1?'':"")+(1==r.type&&e?"":r.content||"")+'
                '+function(){var e=c?'':"";return r.closeBtn&&(e+=''),e}()+""+(r.btn?function(){var e="";"string"==typeof r.btn&&(r.btn=[r.btn]);for(var t=0,i=r.btn.length;t'+r.btn[t]+"";return'
                '+e+"
                "}():"")+(r.resize?'':"")+"
                "],u,i('
                ')),n},s.pt.creat=function(){var e=this,t=e.config,a=e.index,s=t.content,f="object"==typeof s,c=i("body");if(!t.id||!i("#"+t.id)[0]){switch("string"==typeof t.area&&(t.area="auto"===t.area?["",""]:[t.area,""]),t.shift&&(t.anim=t.shift),6==r.ie&&(t.fixed=!1),t.type){case 0:t.btn="btn"in t?t.btn:o.btn[0],r.closeAll("dialog");break;case 2:var s=t.content=f?t.content:[t.content||"http://layer.layui.com","auto"];t.content='';break;case 3:delete t.title,delete t.closeBtn,t.icon===-1&&0===t.icon,r.closeAll("loading");break;case 4:f||(t.content=[t.content,"body"]),t.follow=t.content[1],t.content=t.content[0]+'',delete t.title,t.tips="object"==typeof t.tips?t.tips:[t.tips,!0],t.tipsMore||r.closeAll("tips")}if(e.vessel(f,function(n,r,u){c.append(n[0]),f?function(){2==t.type||4==t.type?function(){i("body").append(n[1])}():function(){s.parents("."+l[0])[0]||(s.data("display",s.css("display")).show().addClass("layui-layer-wrap").wrap(n[1]),i("#"+l[0]+a).find("."+l[5]).before(r))}()}():c.append(n[1]),i(".layui-layer-move")[0]||c.append(o.moveElem=u),e.layero=i("#"+l[0]+a),t.scrollbar||l.html.css("overflow","hidden").attr("layer-full",a)}).auto(a),i("#layui-layer-shade"+e.index).css({"background-color":t.shade[1]||"#000",opacity:t.shade[0]||t.shade}),2==t.type&&6==r.ie&&e.layero.find("iframe").attr("src",s[0]),4==t.type?e.tips():e.offset(),t.fixed&&n.on("resize",function(){e.offset(),(/^\d+%$/.test(t.area[0])||/^\d+%$/.test(t.area[1]))&&e.auto(a),4==t.type&&e.tips()}),t.time<=0||setTimeout(function(){r.close(e.index)},t.time),e.move().callback(),l.anim[t.anim]){var u="layer-anim "+l.anim[t.anim];e.layero.addClass(u).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",function(){i(this).removeClass(u)})}t.isOutAnim&&e.layero.data("isOutAnim",!0)}},s.pt.auto=function(e){var t=this,a=t.config,o=i("#"+l[0]+e);""===a.area[0]&&a.maxWidth>0&&(r.ie&&r.ie<8&&a.btn&&o.width(o.innerWidth()),o.outerWidth()>a.maxWidth&&o.width(a.maxWidth));var s=[o.innerWidth(),o.innerHeight()],f=o.find(l[1]).outerHeight()||0,c=o.find("."+l[6]).outerHeight()||0,u=function(e){e=o.find(e),e.height(s[1]-f-c-2*(0|parseFloat(e.css("padding-top"))))};switch(a.type){case 2:u("iframe");break;default:""===a.area[1]?a.maxHeight>0&&o.outerHeight()>a.maxHeight?(s[1]=a.maxHeight,u("."+l[5])):a.fixed&&s[1]>=n.height()&&(s[1]=n.height(),u("."+l[5])):u("."+l[5])}return t},s.pt.offset=function(){var e=this,t=e.config,i=e.layero,a=[i.outerWidth(),i.outerHeight()],o="object"==typeof t.offset;e.offsetTop=(n.height()-a[1])/2,e.offsetLeft=(n.width()-a[0])/2,o?(e.offsetTop=t.offset[0],e.offsetLeft=t.offset[1]||e.offsetLeft):"auto"!==t.offset&&("t"===t.offset?e.offsetTop=0:"r"===t.offset?e.offsetLeft=n.width()-a[0]:"b"===t.offset?e.offsetTop=n.height()-a[1]:"l"===t.offset?e.offsetLeft=0:"lt"===t.offset?(e.offsetTop=0,e.offsetLeft=0):"lb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=0):"rt"===t.offset?(e.offsetTop=0,e.offsetLeft=n.width()-a[0]):"rb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=n.width()-a[0]):e.offsetTop=t.offset),t.fixed||(e.offsetTop=/%$/.test(e.offsetTop)?n.height()*parseFloat(e.offsetTop)/100:parseFloat(e.offsetTop),e.offsetLeft=/%$/.test(e.offsetLeft)?n.width()*parseFloat(e.offsetLeft)/100:parseFloat(e.offsetLeft),e.offsetTop+=n.scrollTop(),e.offsetLeft+=n.scrollLeft()),i.attr("minLeft")&&(e.offsetTop=n.height()-(i.find(l[1]).outerHeight()||0),e.offsetLeft=i.css("left")),i.css({top:e.offsetTop,left:e.offsetLeft})},s.pt.tips=function(){var e=this,t=e.config,a=e.layero,o=[a.outerWidth(),a.outerHeight()],r=i(t.follow);r[0]||(r=i("body"));var s={width:r.outerWidth(),height:r.outerHeight(),top:r.offset().top,left:r.offset().left},f=a.find(".layui-layer-TipsG"),c=t.tips[0];t.tips[1]||f.remove(),s.autoLeft=function(){s.left+o[0]-n.width()>0?(s.tipLeft=s.left+s.width-o[0],f.css({right:12,left:"auto"})):s.tipLeft=s.left},s.where=[function(){s.autoLeft(),s.tipTop=s.top-o[1]-10,f.removeClass("layui-layer-TipsB").addClass("layui-layer-TipsT").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left+s.width+10,s.tipTop=s.top,f.removeClass("layui-layer-TipsL").addClass("layui-layer-TipsR").css("border-bottom-color",t.tips[1])},function(){s.autoLeft(),s.tipTop=s.top+s.height+10,f.removeClass("layui-layer-TipsT").addClass("layui-layer-TipsB").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left-o[0]-10,s.tipTop=s.top,f.removeClass("layui-layer-TipsR").addClass("layui-layer-TipsL").css("border-bottom-color",t.tips[1])}],s.where[c-1](),1===c?s.top-(n.scrollTop()+o[1]+16)<0&&s.where[2]():2===c?n.width()-(s.left+s.width+o[0]+16)>0||s.where[3]():3===c?s.top-n.scrollTop()+s.height+o[1]+16-n.height()>0&&s.where[0]():4===c&&o[0]+16-s.left>0&&s.where[1](),a.find("."+l[5]).css({"background-color":t.tips[1],"padding-right":t.closeBtn?"30px":""}),a.css({left:s.tipLeft-(t.fixed?n.scrollLeft():0),top:s.tipTop-(t.fixed?n.scrollTop():0)})},s.pt.move=function(){var e=this,t=e.config,a=i(document),s=e.layero,l=s.find(t.move),f=s.find(".layui-layer-resize"),c={};return t.move&&l.css("cursor","move"),l.on("mousedown",function(e){e.preventDefault(),t.move&&(c.moveStart=!0,c.offset=[e.clientX-parseFloat(s.css("left")),e.clientY-parseFloat(s.css("top"))],o.moveElem.css("cursor","move").show())}),f.on("mousedown",function(e){e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],c.area=[s.outerWidth(),s.outerHeight()],o.moveElem.css("cursor","se-resize").show()}),a.on("mousemove",function(i){if(c.moveStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1],l="fixed"===s.css("position");if(i.preventDefault(),c.stX=l?0:n.scrollLeft(),c.stY=l?0:n.scrollTop(),!t.moveOut){var f=n.width()-s.outerWidth()+c.stX,u=n.height()-s.outerHeight()+c.stY;af&&(a=f),ou&&(o=u)}s.css({left:a,top:o})}if(t.resize&&c.resizeStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1];i.preventDefault(),r.style(e.index,{width:c.area[0]+a,height:c.area[1]+o}),c.isResize=!0,t.resizing&&t.resizing(s)}}).on("mouseup",function(e){c.moveStart&&(delete c.moveStart,o.moveElem.hide(),t.moveEnd&&t.moveEnd(s)),c.resizeStart&&(delete c.resizeStart,o.moveElem.hide())}),e},s.pt.callback=function(){function e(){var e=a.cancel&&a.cancel(t.index,n);e===!1||r.close(t.index)}var t=this,n=t.layero,a=t.config;t.openLayer(),a.success&&(2==a.type?n.find("iframe").on("load",function(){a.success(n,t.index)}):a.success(n,t.index)),6==r.ie&&t.IE6(n),n.find("."+l[6]).children("a").on("click",function(){var e=i(this).index();if(0===e)a.yes?a.yes(t.index,n):a.btn1?a.btn1(t.index,n):r.close(t.index);else{var o=a["btn"+(e+1)]&&a["btn"+(e+1)](t.index,n);o===!1||r.close(t.index)}}),n.find("."+l[7]).on("click",e),a.shadeClose&&i("#layui-layer-shade"+t.index).on("click",function(){r.close(t.index)}),n.find(".layui-layer-min").on("click",function(){var e=a.min&&a.min(n);e===!1||r.min(t.index,a)}),n.find(".layui-layer-max").on("click",function(){i(this).hasClass("layui-layer-maxmin")?(r.restore(t.index),a.restore&&a.restore(n)):(r.full(t.index,a),setTimeout(function(){a.full&&a.full(n)},100))}),a.end&&(o.end[t.index]=a.end)},o.reselect=function(){i.each(i("select"),function(e,t){var n=i(this);n.parents("."+l[0])[0]||1==n.attr("layer")&&i("."+l[0]).length<1&&n.removeAttr("layer").show(),n=null})},s.pt.IE6=function(e){i("select").each(function(e,t){var n=i(this);n.parents("."+l[0])[0]||"none"===n.css("display")||n.attr({layer:"1"}).hide(),n=null})},s.pt.openLayer=function(){var e=this;r.zIndex=e.config.zIndex,r.setTop=function(e){var t=function(){r.zIndex++,e.css("z-index",r.zIndex+1)};return r.zIndex=parseInt(e[0].style.zIndex),e.on("mousedown",t),r.zIndex}},o.record=function(e){var t=[e.width(),e.height(),e.position().top,e.position().left+parseFloat(e.css("margin-left"))];e.find(".layui-layer-max").addClass("layui-layer-maxmin"),e.attr({area:t})},o.rescollbar=function(e){l.html.attr("layer-full")==e&&(l.html[0].style.removeProperty?l.html[0].style.removeProperty("overflow"):l.html[0].style.removeAttribute("overflow"),l.html.removeAttr("layer-full"))},e.layer=r,r.getChildFrame=function(e,t){return t=t||i("."+l[4]).attr("times"),i("#"+l[0]+t).find("iframe").contents().find(e)},r.getFrameIndex=function(e){return i("#"+e).parents("."+l[4]).attr("times")},r.iframeAuto=function(e){if(e){var t=r.getChildFrame("html",e).outerHeight(),n=i("#"+l[0]+e),a=n.find(l[1]).outerHeight()||0,o=n.find("."+l[6]).outerHeight()||0;n.css({height:t+a+o}),n.find("iframe").css({height:t})}},r.iframeSrc=function(e,t){i("#"+l[0]+e).find("iframe").attr("src",t)},r.style=function(e,t,n){var a=i("#"+l[0]+e),r=a.find(".layui-layer-content"),s=a.attr("type"),f=a.find(l[1]).outerHeight()||0,c=a.find("."+l[6]).outerHeight()||0;a.attr("minLeft");s!==o.type[3]&&s!==o.type[4]&&(n||(parseFloat(t.width)<=260&&(t.width=260),parseFloat(t.height)-f-c<=64&&(t.height=64+f+c)),a.css(t),c=a.find("."+l[6]).outerHeight(),s===o.type[2]?a.find("iframe").css({height:parseFloat(t.height)-f-c}):r.css({height:parseFloat(t.height)-f-c-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom"))}))},r.min=function(e,t){var a=i("#"+l[0]+e),s=a.find(l[1]).outerHeight()||0,f=a.attr("minLeft")||181*o.minIndex+"px",c=a.css("position");o.record(a),o.minLeft[0]&&(f=o.minLeft[0],o.minLeft.shift()),a.attr("position",c),r.style(e,{width:180,height:s,left:f,top:n.height()-s,position:"fixed",overflow:"hidden"},!0),a.find(".layui-layer-min").hide(),"page"===a.attr("type")&&a.find(l[4]).hide(),o.rescollbar(e),a.attr("minLeft")||o.minIndex++,a.attr("minLeft",f)},r.restore=function(e){var t=i("#"+l[0]+e),n=t.attr("area").split(",");t.attr("type");r.style(e,{width:parseFloat(n[0]),height:parseFloat(n[1]),top:parseFloat(n[2]),left:parseFloat(n[3]),position:t.attr("position"),overflow:"visible"},!0),t.find(".layui-layer-max").removeClass("layui-layer-maxmin"),t.find(".layui-layer-min").show(),"page"===t.attr("type")&&t.find(l[4]).show(),o.rescollbar(e)},r.full=function(e){var t,a=i("#"+l[0]+e);o.record(a),l.html.attr("layer-full")||l.html.css("overflow","hidden").attr("layer-full",e),clearTimeout(t),t=setTimeout(function(){var t="fixed"===a.css("position");r.style(e,{top:t?0:n.scrollTop(),left:t?0:n.scrollLeft(),width:n.width(),height:n.height()},!0),a.find(".layui-layer-min").hide()},100)},r.title=function(e,t){var n=i("#"+l[0]+(t||r.index)).find(l[1]);n.html(e)},r.close=function(e){var t=i("#"+l[0]+e),n=t.attr("type"),a="layer-anim-close";if(t[0]){var s="layui-layer-wrap",f=function(){if(n===o.type[1]&&"object"===t.attr("conType")){t.children(":not(."+l[5]+")").remove();for(var a=t.find("."+s),r=0;r<2;r++)a.unwrap();a.css("display",a.data("display")).removeClass(s)}else{if(n===o.type[2])try{var f=i("#"+l[4]+e)[0];f.contentWindow.document.write(""),f.contentWindow.close(),t.find("."+l[5])[0].removeChild(f)}catch(c){}t[0].innerHTML="",t.remove()}"function"==typeof o.end[e]&&o.end[e](),delete o.end[e]};t.data("isOutAnim")&&t.addClass("layer-anim "+a),i("#layui-layer-moves, #layui-layer-shade"+e).remove(),6==r.ie&&o.reselect(),o.rescollbar(e),t.attr("minLeft")&&(o.minIndex--,o.minLeft.push(t.attr("minLeft"))),r.ie&&r.ie<10||!t.data("isOutAnim")?f():setTimeout(function(){f()},200)}},r.closeAll=function(e){i.each(i("."+l[0]),function(){var t=i(this),n=e?t.attr("type")===e:1;n&&r.close(t.attr("times")),n=null})};var f=r.cache||{},c=function(e){return f.skin?" "+f.skin+" "+f.skin+"-"+e:""};r.prompt=function(e,t){var a="";if(e=e||{},"function"==typeof e&&(t=e),e.area){var o=e.area;a='style="width: '+o[0]+"; height: "+o[1]+';"',delete e.area}var s,l=2==e.formType?'":function(){return''}(),f=e.success;return delete e.success,r.open(i.extend({type:1,btn:["确定","取消"],content:l,skin:"layui-layer-prompt"+c("prompt"),maxWidth:n.width(),success:function(e){s=e.find(".layui-layer-input"),s.focus(),"function"==typeof f&&f(e)},resize:!1,yes:function(i){var n=s.val();""===n?s.focus():n.length>(e.maxlength||500)?r.tips("最多输入"+(e.maxlength||500)+"个字数",s,{tips:1}):t&&t(n,i,s)}},e))},r.tab=function(e){e=e||{};var t=e.tab||{},n="layui-this",a=e.success;return delete e.success,r.open(i.extend({type:1,skin:"layui-layer-tab"+c("tab"),resize:!1,title:function(){var e=t.length,i=1,a="";if(e>0)for(a=''+t[0].title+"";i"+t[i].title+"";return a}(),content:'
                  '+function(){var e=t.length,i=1,a="";if(e>0)for(a='
                • '+(t[0].content||"no content")+"
                • ";i'+(t[i].content||"no content")+"";return a}()+"
                ",success:function(t){var o=t.find(".layui-layer-title").children(),r=t.find(".layui-layer-tabmain").children();o.on("mousedown",function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0;var a=i(this),o=a.index();a.addClass(n).siblings().removeClass(n),r.eq(o).show().siblings().hide(),"function"==typeof e.change&&e.change(o)}),"function"==typeof a&&a(t)}},e))},r.photos=function(t,n,a){function o(e,t,i){var n=new Image;return n.src=e,n.complete?t(n):(n.onload=function(){n.onload=null,t(n)},void(n.onerror=function(e){n.onerror=null,i(e)}))}var s={};if(t=t||{},t.photos){var l=t.photos.constructor===Object,f=l?t.photos:{},u=f.data||[],d=f.start||0;s.imgIndex=(0|d)+1,t.img=t.img||"img";var y=t.success;if(delete t.success,l){if(0===u.length)return r.msg("没有图片")}else{var p=i(t.photos),h=function(){u=[],p.find(t.img).each(function(e){var t=i(this);t.attr("layer-index",e),u.push({alt:t.attr("alt"),pid:t.attr("layer-pid"),src:t.attr("layer-src")||t.attr("src"),thumb:t.attr("src")})})};if(h(),0===u.length)return;if(n||p.on("click",t.img,function(){var e=i(this),n=e.attr("layer-index");r.photos(i.extend(t,{photos:{start:n,data:u,tab:t.tab},full:t.full}),!0),h()}),!n)return}s.imgprev=function(e){s.imgIndex--,s.imgIndex<1&&(s.imgIndex=u.length),s.tabimg(e)},s.imgnext=function(e,t){s.imgIndex++,s.imgIndex>u.length&&(s.imgIndex=1,t)||s.tabimg(e)},s.keyup=function(e){if(!s.end){var t=e.keyCode;e.preventDefault(),37===t?s.imgprev(!0):39===t?s.imgnext(!0):27===t&&r.close(s.index)}},s.tabimg=function(e){if(!(u.length<=1))return f.start=s.imgIndex-1,r.close(s.index),r.photos(t,!0,e)},s.event=function(){s.bigimg.hover(function(){s.imgsee.show()},function(){s.imgsee.hide()}),s.bigimg.find(".layui-layer-imgprev").on("click",function(e){e.preventDefault(),s.imgprev()}),s.bigimg.find(".layui-layer-imgnext").on("click",function(e){e.preventDefault(),s.imgnext()}),i(document).on("keyup",s.keyup)},s.loadi=r.load(1,{shade:!("shade"in t)&&.9,scrollbar:!1}),o(u[d].src,function(n){r.close(s.loadi),s.index=r.open(i.extend({type:1,id:"layui-layer-photos",area:function(){var a=[n.width,n.height],o=[i(e).width()-100,i(e).height()-100];if(!t.full&&(a[0]>o[0]||a[1]>o[1])){var r=[a[0]/o[0],a[1]/o[1]];r[0]>r[1]?(a[0]=a[0]/r[0],a[1]=a[1]/r[0]):r[0]'+(u[d].alt||
                '+(u.length>1?'':"")+'
                '+(u[d].alt||"")+""+s.imgIndex+"/"+u.length+"
            ",success:function(e,i){s.bigimg=e.find(".layui-layer-phimg"),s.imgsee=e.find(".layui-layer-imguide,.layui-layer-imgbar"),s.event(e),t.tab&&t.tab(u[d],e),"function"==typeof y&&y(e)},end:function(){s.end=!0,i(document).off("keyup",s.keyup)}},t))},function(){r.close(s.loadi),r.msg("当前图片地址异常
            是否继续查看下一张?",{time:3e4,btn:["下一张","不看了"],yes:function(){u.length>1&&s.imgnext(!0,!0)}})})}},o.run=function(t){i=t,n=i(e),l.html=i("html"),r.open=function(e){var t=new s(e);return t.index}},e.layui&&layui.define?(r.ready(),layui.define("jquery",function(t){r.path=layui.cache.dir,o.run(layui.$),e.layer=r,t("layer",r)})):"function"==typeof define&&define.amd?define('layer',["jquery"],function(){return o.run(e.jQuery),r}):function(){o.run(e.jQuery),r.ready()}()}(window); /* * Toastr * Copyright 2012-2015 @@ -2124,8 +818,7 @@ define('fast',['jquery', 'bootstrap', 'toastr', 'layer', 'lang'], function ($, u options.area = [top.$(".tab-pane.active").width() + "px", top.$(".tab-pane.active").height() + "px"]; options.offset = [top.$(".tab-pane.active").scrollTop() + "px", "0px"]; } - Layer.open(options); - return false; + return Layer.open(options); }, //关闭窗口并回传数据 close: function (data) { @@ -2330,3 +1023,6 @@ define('frontend',['fast'], function (Fast) { return Frontend; }); +define('frontend-init',['frontend'], function (Frontend) { + +}); diff --git a/public/assets/js/require-table.js b/public/assets/js/require-table.js index d9f444ad..ac7151bb 100644 --- a/public/assets/js/require-table.js +++ b/public/assets/js/require-table.js @@ -1,4 +1,4 @@ -define(['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table', 'bootstrap-table-lang', 'bootstrap-table-mobile', 'bootstrap-table-export', 'bootstrap-table-commonsearch', 'bootstrap-table-template'], function ($, undefined, Moment) { +define(['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table', 'bootstrap-table-lang', 'bootstrap-table-export', 'bootstrap-table-commonsearch', 'bootstrap-table-template'], function ($, undefined, Moment) { var Table = { list: {}, // Bootstrap-table 基础配置 @@ -32,7 +32,6 @@ define(['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table paginationPreText: __("Previous"), paginationNextText: __("Next"), paginationLastText: __("Last"), - mobileResponsive: true, //是否自适应移动端 cardView: false, //卡片视图 checkOnInit: true, //是否在初始化时判断 escape: true, //是否对内容进行转义 @@ -152,7 +151,7 @@ define(['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table } }); // 处理选中筛选框后按钮的状态统一变更 - table.on('check.bs.table uncheck.bs.table check-all.bs.table uncheck-all.bs.table fa.event.check', function () { + table.on('check.bs.table uncheck.bs.table check-all.bs.table uncheck-all.bs.table', function () { var ids = Table.api.selectedids(table); $(Table.config.disabledbtn, toolbar).toggleClass('disabled', !ids.length); }); @@ -176,7 +175,7 @@ define(['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table Fast.api.ajax({ url: options.extend.import_url, data: {file: data.url}, - }, function () { + }, function (data, ret) { table.bootstrapTable('refresh'); }); }); @@ -217,7 +216,8 @@ define(['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table $("tbody", table).dragsort({ itemSelector: 'tr:visible', dragSelector: "a.btn-dragsort", - dragEnd: function () { + dragEnd: function (a, b) { + var element = $("a.btn-dragsort", this); var data = table.bootstrapTable('getData'); var current = data[parseInt($(this).data("index"))]; var options = table.bootstrapTable('getOptions'); @@ -238,7 +238,21 @@ define(['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table table: options.extend.table } }; - Fast.api.ajax(params, function (data) { + Fast.api.ajax(params, function (data, ret) { + var success = $(element).data("success") || $.noop; + if (typeof success === 'function') { + if (false === success.call(element, data, ret)) { + return false; + } + } + table.bootstrapTable('refresh'); + }, function () { + var error = $(element).data("error") || $.noop; + if (typeof error === 'function') { + if (false === error.call(element, data, ret)) { + return false; + } + } table.bootstrapTable('refresh'); }); }, @@ -246,7 +260,9 @@ define(['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table }); }); $(table).on("click", "input[data-id][name='checkbox']", function (e) { - table.trigger('fa.event.check'); + var ids = $(this).data("id"); + var row = Table.api.getrowbyid(ids); + table.trigger('check.bs.table', [row, this]); }); $(table).on("click", "[data-id].btn-change", function (e) { e.preventDefault(); @@ -255,14 +271,7 @@ define(['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table $(table).on("click", "[data-id].btn-edit", function (e) { e.preventDefault(); var ids = $(this).data("id"); - var row = {}; - var options = table.bootstrapTable("getOptions"); - $.each(table.bootstrapTable('getData'), function (i, j) { - if (j[options.pk] == ids) { - row = j; - return false; - } - }); + var row = Table.api.getrowbyid(ids); row.ids = ids; var url = Table.api.replaceurl(options.extend.edit_url, row, table); Fast.api.open(url, __('Edit'), $(this).data() || {}); @@ -293,8 +302,21 @@ define(['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table url = this.replaceurl(url, {ids: ids}, table); var params = typeof data.params !== "undefined" ? (typeof data.params == 'object' ? $.param(data.params) : data.params) : ''; var options = {url: url, data: {action: action, ids: ids, params: params}}; - Fast.api.ajax(options, function (data) { + Fast.api.ajax(options, function (data, ret) { + var success = $(element).data("success") || $.noop; + if (typeof success === 'function') { + if (false === success.call(element, data, ret)) { + return false; + } + } table.bootstrapTable('refresh'); + }, function (data, ret) { + var error = $(element).data("error") || $.noop; + if (typeof error === 'function') { + if (false === error.call(element, data, ret)) { + return false; + } + } }); }, // 单元格元素事件 @@ -521,6 +543,22 @@ define(['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table index = parseInt(index); var data = table.bootstrapTable('getData'); return typeof data[index] !== 'undefined' ? data[index] : null; + }, + // 根据行索引获取行数据 + getrowbyindex: function (table, index) { + return Table.api.getrowdata(table, index); + }, + // 根据主键ID获取行数据 + getrowbyid: function (table, id) { + var row = {}; + var options = table.bootstrapTable("getOptions"); + $.each(table.bootstrapTable('getData'), function (i, j) { + if (j[options.pk] == id) { + row = j; + return false; + } + }); + return row; } }, }; diff --git a/public/assets/js/require.min.js b/public/assets/js/require.min.js new file mode 100644 index 00000000..b812dea8 --- /dev/null +++ b/public/assets/js/require.min.js @@ -0,0 +1,2 @@ +var requirejs,require,define;!function(global,setTimeout){function commentReplace(e,t){return t||""}function isFunction(e){return"[object Function]"===ostring.call(e)}function isArray(e){return"[object Array]"===ostring.call(e)}function each(e,t){if(e){var i;for(i=0;i-1&&(!e[i]||!t(e[i],i,e));i-=1);}}function hasProp(e,t){return hasOwn.call(e,t)}function getOwn(e,t){return hasProp(e,t)&&e[t]}function eachProp(e,t){var i;for(i in e)if(hasProp(e,i)&&t(e[i],i))break}function mixin(e,t,i,r){return t&&eachProp(t,function(t,n){!i&&hasProp(e,n)||(!r||"object"!=typeof t||!t||isArray(t)||isFunction(t)||t instanceof RegExp?e[n]=t:(e[n]||(e[n]={}),mixin(e[n],t,i,r)))}),e}function bind(e,t){return function(){return t.apply(e,arguments)}}function scripts(){return document.getElementsByTagName("script")}function defaultOnError(e){throw e}function getGlobal(e){if(!e)return e;var t=global;return each(e.split("."),function(e){t=t[e]}),t}function makeError(e,t,i,r){var n=new Error(t+"\nhttp://requirejs.org/docs/errors.html#"+e);return n.requireType=e,n.requireModules=r,i&&(n.originalError=i),n}function newContext(e){function t(e){var t,i;for(t=0;t0&&(e.splice(t-1,2),t-=2)}}function i(e,i,r){var n,o,a,s,u,c,d,p,f,l,h,m,g=i&&i.split("/"),v=y.map,x=v&&v["*"];if(e&&(e=e.split("/"),d=e.length-1,y.nodeIdCompat&&jsSuffixRegExp.test(e[d])&&(e[d]=e[d].replace(jsSuffixRegExp,"")),"."===e[0].charAt(0)&&g&&(m=g.slice(0,g.length-1),e=m.concat(e)),t(e),e=e.join("/")),r&&v&&(g||x)){a=e.split("/");e:for(s=a.length;s>0;s-=1){if(c=a.slice(0,s).join("/"),g)for(u=g.length;u>0;u-=1)if(o=getOwn(v,g.slice(0,u).join("/")),o&&(o=getOwn(o,c))){p=o,f=s;break e}!l&&x&&getOwn(x,c)&&(l=getOwn(x,c),h=s)}!p&&l&&(p=l,f=h),p&&(a.splice(0,f,p),e=a.join("/"))}return n=getOwn(y.pkgs,e),n?n:e}function r(e){isBrowser&&each(scripts(),function(t){if(t.getAttribute("data-requiremodule")===e&&t.getAttribute("data-requirecontext")===q.contextName)return t.parentNode.removeChild(t),!0})}function n(e){var t=getOwn(y.paths,e);if(t&&isArray(t)&&t.length>1)return t.shift(),q.require.undef(e),q.makeRequire(null,{skipMap:!0})([e]),!0}function o(e){var t,i=e?e.indexOf("!"):-1;return i>-1&&(t=e.substring(0,i),e=e.substring(i+1,e.length)),[t,e]}function a(e,t,r,n){var a,s,u,c,d=null,p=t?t.name:null,f=e,l=!0,h="";return e||(l=!1,e="_@r"+(T+=1)),c=o(e),d=c[0],e=c[1],d&&(d=i(d,p,n),s=getOwn(j,d)),e&&(d?h=s&&s.normalize?s.normalize(e,function(e){return i(e,p,n)}):e.indexOf("!")===-1?i(e,p,n):e:(h=i(e,p,n),c=o(h),d=c[0],h=c[1],r=!0,a=q.nameToUrl(h))),u=!d||s||r?"":"_unnormalized"+(A+=1),{prefix:d,name:h,parentMap:t,unnormalized:!!u,url:a,originalName:f,isDefine:l,id:(d?d+"!"+h:h)+u}}function s(e){var t=e.id,i=getOwn(S,t);return i||(i=S[t]=new q.Module(e)),i}function u(e,t,i){var r=e.id,n=getOwn(S,r);!hasProp(j,r)||n&&!n.defineEmitComplete?(n=s(e),n.error&&"error"===t?i(n.error):n.on(t,i)):"defined"===t&&i(j[r])}function c(e,t){var i=e.requireModules,r=!1;t?t(e):(each(i,function(t){var i=getOwn(S,t);i&&(i.error=e,i.events.error&&(r=!0,i.emit("error",e)))}),r||req.onError(e))}function d(){globalDefQueue.length&&(each(globalDefQueue,function(e){var t=e[0];"string"==typeof t&&(q.defQueueMap[t]=!0),O.push(e)}),globalDefQueue=[])}function p(e){delete S[e],delete k[e]}function f(e,t,i){var r=e.map.id;e.error?e.emit("error",e.error):(t[r]=!0,each(e.depMaps,function(r,n){var o=r.id,a=getOwn(S,o);!a||e.depMatched[n]||i[o]||(getOwn(t,o)?(e.defineDep(n,j[o]),e.check()):f(a,t,i))}),i[r]=!0)}function l(){var e,t,i=1e3*y.waitSeconds,o=i&&q.startTime+i<(new Date).getTime(),a=[],s=[],u=!1,d=!0;if(!x){if(x=!0,eachProp(k,function(e){var i=e.map,c=i.id;if(e.enabled&&(i.isDefine||s.push(e),!e.error))if(!e.inited&&o)n(c)?(t=!0,u=!0):(a.push(c),r(c));else if(!e.inited&&e.fetched&&i.isDefine&&(u=!0,!i.prefix))return d=!1}),o&&a.length)return e=makeError("timeout","Load timeout for modules: "+a,null,a),e.contextName=q.contextName,c(e);d&&each(s,function(e){f(e,{},{})}),o&&!t||!u||!isBrowser&&!isWebWorker||w||(w=setTimeout(function(){w=0,l()},50)),x=!1}}function h(e){hasProp(j,e[0])||s(a(e[0],null,!0)).init(e[1],e[2])}function m(e,t,i,r){e.detachEvent&&!isOpera?r&&e.detachEvent(r,t):e.removeEventListener(i,t,!1)}function g(e){var t=e.currentTarget||e.srcElement;return m(t,q.onScriptLoad,"load","onreadystatechange"),m(t,q.onScriptError,"error"),{node:t,id:t&&t.getAttribute("data-requiremodule")}}function v(){var e;for(d();O.length;){if(e=O.shift(),null===e[0])return c(makeError("mismatch","Mismatched anonymous define() module: "+e[e.length-1]));h(e)}q.defQueueMap={}}var x,b,q,E,w,y={waitSeconds:7,baseUrl:"./",paths:{},bundles:{},pkgs:{},shim:{},config:{}},S={},k={},M={},O=[],j={},P={},R={},T=1,A=1;return E={require:function(e){return e.require?e.require:e.require=q.makeRequire(e.map)},exports:function(e){if(e.usingExports=!0,e.map.isDefine)return e.exports?j[e.map.id]=e.exports:e.exports=j[e.map.id]={}},module:function(e){return e.module?e.module:e.module={id:e.map.id,uri:e.map.url,config:function(){return getOwn(y.config,e.map.id)||{}},exports:e.exports||(e.exports={})}}},b=function(e){this.events=getOwn(M,e.id)||{},this.map=e,this.shim=getOwn(y.shim,e.id),this.depExports=[],this.depMaps=[],this.depMatched=[],this.pluginMaps={},this.depCount=0},b.prototype={init:function(e,t,i,r){r=r||{},this.inited||(this.factory=t,i?this.on("error",i):this.events.error&&(i=bind(this,function(e){this.emit("error",e)})),this.depMaps=e&&e.slice(0),this.errback=i,this.inited=!0,this.ignore=r.ignore,r.enabled||this.enabled?this.enable():this.check())},defineDep:function(e,t){this.depMatched[e]||(this.depMatched[e]=!0,this.depCount-=1,this.depExports[e]=t)},fetch:function(){if(!this.fetched){this.fetched=!0,q.startTime=(new Date).getTime();var e=this.map;return this.shim?void q.makeRequire(this.map,{enableBuildCallback:!0})(this.shim.deps||[],bind(this,function(){return e.prefix?this.callPlugin():this.load()})):e.prefix?this.callPlugin():this.load()}},load:function(){var e=this.map.url;P[e]||(P[e]=!0,q.load(this.map.id,e))},check:function(){if(this.enabled&&!this.enabling){var e,t,i=this.map.id,r=this.depExports,n=this.exports,o=this.factory;if(this.inited){if(this.error)this.emit("error",this.error);else if(!this.defining){if(this.defining=!0,this.depCount<1&&!this.defined){if(isFunction(o)){if(this.events.error&&this.map.isDefine||req.onError!==defaultOnError)try{n=q.execCb(i,o,r,n)}catch(t){e=t}else n=q.execCb(i,o,r,n);if(this.map.isDefine&&void 0===n&&(t=this.module,t?n=t.exports:this.usingExports&&(n=this.exports)),e)return e.requireMap=this.map,e.requireModules=this.map.isDefine?[this.map.id]:null,e.requireType=this.map.isDefine?"define":"require",c(this.error=e)}else n=o;if(this.exports=n,this.map.isDefine&&!this.ignore&&(j[i]=n,req.onResourceLoad)){var a=[];each(this.depMaps,function(e){a.push(e.normalizedMap||e)}),req.onResourceLoad(q,this.map,a)}p(i),this.defined=!0}this.defining=!1,this.defined&&!this.defineEmitted&&(this.defineEmitted=!0,this.emit("defined",this.exports),this.defineEmitComplete=!0)}}else hasProp(q.defQueueMap,i)||this.fetch()}},callPlugin:function(){var e=this.map,t=e.id,r=a(e.prefix);this.depMaps.push(r),u(r,"defined",bind(this,function(r){var n,o,d,f=getOwn(R,this.map.id),l=this.map.name,h=this.map.parentMap?this.map.parentMap.name:null,m=q.makeRequire(e.parentMap,{enableBuildCallback:!0});return this.map.unnormalized?(r.normalize&&(l=r.normalize(l,function(e){return i(e,h,!0)})||""),o=a(e.prefix+"!"+l,this.map.parentMap),u(o,"defined",bind(this,function(e){this.map.normalizedMap=o,this.init([],function(){return e},null,{enabled:!0,ignore:!0})})),d=getOwn(S,o.id),void(d&&(this.depMaps.push(o),this.events.error&&d.on("error",bind(this,function(e){this.emit("error",e)})),d.enable()))):f?(this.map.url=q.nameToUrl(f),void this.load()):(n=bind(this,function(e){this.init([],function(){return e},null,{enabled:!0})}),n.error=bind(this,function(e){this.inited=!0,this.error=e,e.requireModules=[t],eachProp(S,function(e){0===e.map.id.indexOf(t+"_unnormalized")&&p(e.map.id)}),c(e)}),n.fromText=bind(this,function(i,r){var o=e.name,u=a(o),d=useInteractive;r&&(i=r),d&&(useInteractive=!1),s(u),hasProp(y.config,t)&&(y.config[o]=y.config[t]);try{req.exec(i)}catch(e){return c(makeError("fromtexteval","fromText eval for "+t+" failed: "+e,e,[t]))}d&&(useInteractive=!0),this.depMaps.push(u),q.completeLoad(o),m([o],n)}),void r.load(e.name,m,n,y))})),q.enable(r,this),this.pluginMaps[r.id]=r},enable:function(){k[this.map.id]=this,this.enabled=!0,this.enabling=!0,each(this.depMaps,bind(this,function(e,t){var i,r,n;if("string"==typeof e){if(e=a(e,this.map.isDefine?this.map:this.map.parentMap,!1,!this.skipMap),this.depMaps[t]=e,n=getOwn(E,e.id))return void(this.depExports[t]=n(this));this.depCount+=1,u(e,"defined",bind(this,function(e){this.undefed||(this.defineDep(t,e),this.check())})),this.errback?u(e,"error",bind(this,this.errback)):this.events.error&&u(e,"error",bind(this,function(e){this.emit("error",e)}))}i=e.id,r=S[i],hasProp(E,i)||!r||r.enabled||q.enable(e,this)})),eachProp(this.pluginMaps,bind(this,function(e){var t=getOwn(S,e.id);t&&!t.enabled&&q.enable(e,this)})),this.enabling=!1,this.check()},on:function(e,t){var i=this.events[e];i||(i=this.events[e]=[]),i.push(t)},emit:function(e,t){each(this.events[e],function(e){e(t)}),"error"===e&&delete this.events[e]}},q={config:y,contextName:e,registry:S,defined:j,urlFetched:P,defQueue:O,defQueueMap:{},Module:b,makeModuleMap:a,nextTick:req.nextTick,onError:c,configure:function(e){if(e.baseUrl&&"/"!==e.baseUrl.charAt(e.baseUrl.length-1)&&(e.baseUrl+="/"),"string"==typeof e.urlArgs){var t=e.urlArgs;e.urlArgs=function(e,i){return(i.indexOf("?")===-1?"?":"&")+t}}var i=y.shim,r={paths:!0,bundles:!0,config:!0,map:!0};eachProp(e,function(e,t){r[t]?(y[t]||(y[t]={}),mixin(y[t],e,!0,!0)):y[t]=e}),e.bundles&&eachProp(e.bundles,function(e,t){each(e,function(e){e!==t&&(R[e]=t)})}),e.shim&&(eachProp(e.shim,function(e,t){isArray(e)&&(e={deps:e}),!e.exports&&!e.init||e.exportsFn||(e.exportsFn=q.makeShimExports(e)),i[t]=e}),y.shim=i),e.packages&&each(e.packages,function(e){var t,i;e="string"==typeof e?{name:e}:e,i=e.name,t=e.location,t&&(y.paths[i]=e.location),y.pkgs[i]=e.name+"/"+(e.main||"main").replace(currDirRegExp,"").replace(jsSuffixRegExp,"")}),eachProp(S,function(e,t){e.inited||e.map.unnormalized||(e.map=a(t,null,!0))}),(e.deps||e.callback)&&q.require(e.deps||[],e.callback)},makeShimExports:function(e){function t(){var t;return e.init&&(t=e.init.apply(global,arguments)),t||e.exports&&getGlobal(e.exports)}return t},makeRequire:function(t,n){function o(i,r,u){var d,p,f;return n.enableBuildCallback&&r&&isFunction(r)&&(r.__requireJsBuild=!0),"string"==typeof i?isFunction(r)?c(makeError("requireargs","Invalid require call"),u):t&&hasProp(E,i)?E[i](S[t.id]):req.get?req.get(q,i,t,o):(p=a(i,t,!1,!0),d=p.id,hasProp(j,d)?j[d]:c(makeError("notloaded",'Module name "'+d+'" has not been loaded yet for context: '+e+(t?"":". Use require([])")))):(v(),q.nextTick(function(){v(),f=s(a(null,t)),f.skipMap=n.skipMap,f.init(i,r,u,{enabled:!0}),l()}),o)}return n=n||{},mixin(o,{isBrowser:isBrowser,toUrl:function(e){var r,n=e.lastIndexOf("."),o=e.split("/")[0],a="."===o||".."===o;return n!==-1&&(!a||n>1)&&(r=e.substring(n,e.length),e=e.substring(0,n)),q.nameToUrl(i(e,t&&t.id,!0),r,!0)},defined:function(e){return hasProp(j,a(e,t,!1,!0).id)},specified:function(e){return e=a(e,t,!1,!0).id,hasProp(j,e)||hasProp(S,e)}}),t||(o.undef=function(e){d();var i=a(e,t,!0),n=getOwn(S,e);n.undefed=!0,r(e),delete j[e],delete P[i.url],delete M[e],eachReverse(O,function(t,i){t[0]===e&&O.splice(i,1)}),delete q.defQueueMap[e],n&&(n.events.defined&&(M[e]=n.events),p(e))}),o},enable:function(e){var t=getOwn(S,e.id);t&&s(e).enable()},completeLoad:function(e){var t,i,r,o=getOwn(y.shim,e)||{},a=o.exports;for(d();O.length;){if(i=O.shift(),null===i[0]){if(i[0]=e,t)break;t=!0}else i[0]===e&&(t=!0);h(i)}if(q.defQueueMap={},r=getOwn(S,e),!t&&!hasProp(j,e)&&r&&!r.inited){if(!(!y.enforceDefine||a&&getGlobal(a)))return n(e)?void 0:c(makeError("nodefine","No define call for "+e,null,[e]));h([e,o.deps||[],o.exportsFn])}l()},nameToUrl:function(e,t,i){var r,n,o,a,s,u,c,d=getOwn(y.pkgs,e);if(d&&(e=d),c=getOwn(R,e))return q.nameToUrl(c,t,i);if(req.jsExtRegExp.test(e))s=e+(t||"");else{for(r=y.paths,n=e.split("/"),o=n.length;o>0;o-=1)if(a=n.slice(0,o).join("/"),u=getOwn(r,a)){isArray(u)&&(u=u[0]),n.splice(0,o,u);break}s=n.join("/"),s+=t||(/^data\:|^blob\:|\?/.test(s)||i?"":".js"),s=("/"===s.charAt(0)||s.match(/^[\w\+\.\-]+:/)?"":y.baseUrl)+s}return y.urlArgs&&!/^blob\:/.test(s)?s+y.urlArgs(e,s):s},load:function(e,t){req.load(q,e,t)},execCb:function(e,t,i,r){return t.apply(r,i)},onScriptLoad:function(e){if("load"===e.type||readyRegExp.test((e.currentTarget||e.srcElement).readyState)){interactiveScript=null;var t=g(e);q.completeLoad(t.id)}},onScriptError:function(e){var t=g(e);if(!n(t.id)){var i=[];return eachProp(S,function(e,r){0!==r.indexOf("_@r")&&each(e.depMaps,function(e){if(e.id===t.id)return i.push(r),!0})}),c(makeError("scripterror",'Script error for "'+t.id+(i.length?'", needed by: '+i.join(", "):'"'),e,[t.id]))}}},q.require=q.makeRequire(),q}function getInteractiveScript(){return interactiveScript&&"interactive"===interactiveScript.readyState?interactiveScript:(eachReverse(scripts(),function(e){if("interactive"===e.readyState)return interactiveScript=e}),interactiveScript)}var req,s,head,baseElement,dataMain,src,interactiveScript,currentlyAddingScript,mainScript,subPath,version="2.3.2",commentRegExp=/\/\*[\s\S]*?\*\/|([^:"'=]|^)\/\/.*$/gm,cjsRequireRegExp=/[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g,jsSuffixRegExp=/\.js$/,currDirRegExp=/^\.\//,op=Object.prototype,ostring=op.toString,hasOwn=op.hasOwnProperty,isBrowser=!("undefined"==typeof window||"undefined"==typeof navigator||!window.document),isWebWorker=!isBrowser&&"undefined"!=typeof importScripts,readyRegExp=isBrowser&&"PLAYSTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/,defContextName="_",isOpera="undefined"!=typeof opera&&"[object Opera]"===opera.toString(),contexts={},cfg={},globalDefQueue=[],useInteractive=!1;if("undefined"==typeof define){if("undefined"!=typeof requirejs){if(isFunction(requirejs))return;cfg=requirejs,requirejs=void 0}"undefined"==typeof require||isFunction(require)||(cfg=require,require=void 0),req=requirejs=function(e,t,i,r){var n,o,a=defContextName;return isArray(e)||"string"==typeof e||(o=e,isArray(t)?(e=t,t=i,i=r):e=[]),o&&o.context&&(a=o.context),n=getOwn(contexts,a),n||(n=contexts[a]=req.s.newContext(a)),o&&n.configure(o),n.require(e,t,i)},req.config=function(e){return req(e)},req.nextTick="undefined"!=typeof setTimeout?function(e){setTimeout(e,4)}:function(e){e()},require||(require=req),req.version=version,req.jsExtRegExp=/^\/|:|\?|\.js$/,req.isBrowser=isBrowser,s=req.s={contexts:contexts,newContext:newContext},req({}),each(["toUrl","undef","defined","specified"],function(e){req[e]=function(){var t=contexts[defContextName];return t.require[e].apply(t,arguments)}}),isBrowser&&(head=s.head=document.getElementsByTagName("head")[0],baseElement=document.getElementsByTagName("base")[0],baseElement&&(head=s.head=baseElement.parentNode)),req.onError=defaultOnError,req.createNode=function(e,t,i){var r=e.xhtml?document.createElementNS("http://www.w3.org/1999/xhtml","html:script"):document.createElement("script");return r.type=e.scriptType||"text/javascript",r.charset="utf-8",r.async=!0,r},req.load=function(e,t,i){var r,n=e&&e.config||{};if(isBrowser)return r=req.createNode(n,t,i),r.setAttribute("data-requirecontext",e.contextName),r.setAttribute("data-requiremodule",t),!r.attachEvent||r.attachEvent.toString&&r.attachEvent.toString().indexOf("[native code")<0||isOpera?(r.addEventListener("load",e.onScriptLoad,!1),r.addEventListener("error",e.onScriptError,!1)):(useInteractive=!0,r.attachEvent("onreadystatechange",e.onScriptLoad)),r.src=i,n.onNodeCreated&&n.onNodeCreated(r,n,t,i),currentlyAddingScript=r,baseElement?head.insertBefore(r,baseElement):head.appendChild(r),currentlyAddingScript=null,r;if(isWebWorker)try{setTimeout(function(){},0),importScripts(i),e.completeLoad(t)}catch(r){e.onError(makeError("importscripts","importScripts failed for "+t+" at "+i,r,[t]))}},isBrowser&&!cfg.skipDataMain&&eachReverse(scripts(),function(e){if(head||(head=e.parentNode),dataMain=e.getAttribute("data-main"))return mainScript=dataMain,cfg.baseUrl||mainScript.indexOf("!")!==-1||(src=mainScript.split("/"),mainScript=src.pop(),subPath=src.length?src.join("/")+"/":"./",cfg.baseUrl=subPath),mainScript=mainScript.replace(jsSuffixRegExp,""),req.jsExtRegExp.test(mainScript)&&(mainScript=dataMain),cfg.deps=cfg.deps?cfg.deps.concat(mainScript):[mainScript],!0}),define=function(e,t,i){var r,n;"string"!=typeof e&&(i=t,t=e,e=null),isArray(t)||(i=t,t=null),!t&&isFunction(i)&&(t=[],i.length&&(i.toString().replace(commentRegExp,commentReplace).replace(cjsRequireRegExp,function(e,i){t.push(i)}),t=(1===i.length?["require"]:["require","exports","module"]).concat(t))),useInteractive&&(r=currentlyAddingScript||getInteractiveScript(),r&&(e||(e=r.getAttribute("data-requiremodule")),n=contexts[r.getAttribute("data-requirecontext")])),n?(n.defQueue.push([e,t,i]),n.defQueueMap[e]=!0):globalDefQueue.push([e,t,i])},define.amd={jQuery:!0},req.exec=function(text){return eval(text)},req(cfg)}}(this,"undefined"==typeof setTimeout?void 0:setTimeout); +//# sourceMappingURL=require.min.js.map \ No newline at end of file diff --git a/public/assets/less/backend.less b/public/assets/less/backend.less index 88acf163..106b0921 100644 --- a/public/assets/less/backend.less +++ b/public/assets/less/backend.less @@ -15,7 +15,7 @@ @import url("../libs/eonasdan-bootstrap-datetimepicker/build/css/bootstrap-datetimepicker.min.css"); @import url("../libs/bootstrap-daterangepicker/daterangepicker.css"); @import url("../libs/nice-validator/dist/jquery.validator.css"); -@import url("../libs/selectpage/selectpage.css"); +@import url("../libs/fastadmin-selectpage/selectpage.css"); @main-bg: #f1f4f6; @panel-intro-bg: darken(@main-bg,3%); @@ -54,7 +54,6 @@ body.is-dialog { } } } -.note-dialog .modal {z-index:1060;} .bootstrap-dialog .modal-dialog { /*width: 70%;*/ @@ -668,13 +667,16 @@ form.form-horizontal .control-label { background: #ecf0f1; overflow:hidden; a { - background-color: #95a5a6!important; - border-color: #95a5a6!important; + background-color: #95a5a6; + border-color: #95a5a6; color:#fff!important; + height:31px; + margin-top:0; + border: 1px solid transparent; } .layui-layer-btn0{ - background-color: #18bc9c!important; - border-color: #18bc9c!important; + background-color: #18bc9c; + border-color: #18bc9c; } } .layui-layer-footer { @@ -763,6 +765,14 @@ form.form-horizontal .control-label { position:absolute; } } +@media (min-width: 564px){ + body.is-dialog .daterangepicker { + min-width: 130px; + } + body.is-dialog .daterangepicker .ranges ul { + width: 130px; + } +} /*手机版样式*/ @media (max-width: @screen-phone) { @@ -774,6 +784,9 @@ form.form-horizontal .control-label { display:none; } } + .fixed .content-wrapper, .fixed .right-side { + padding-top: 50px; + } } /*平板样式*/ @media (max-width: @screen-tablet) { diff --git a/public/assets/less/frontend.less b/public/assets/less/frontend.less index 9f832204..5b2af716 100644 --- a/public/assets/less/frontend.less +++ b/public/assets/less/frontend.less @@ -61,15 +61,6 @@ body { .box-shadow(none); } -.layui-layer-fast { - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-duration: .3s; - animation-duration: .3s; - -webkit-animation-name: layer-bounceIn; - animation-name: layer-bounceIn; -} - /*修复nice-validator和summernote的编辑框冲突*/ .nice-validator .note-editor .note-editing-area .note-editable{ display:inherit; @@ -329,7 +320,7 @@ body { } } -footer.footer{width:100%;color: #aaa;background: #555;margin-top:25px;} +footer.footer{width:100%;color: #aaa;background: #555;margin-top:25px;position: fixed;bottom: 0;} footer.footer ul{margin:60px 0 30px 0;padding:0;} footer.footer ul li.f-tit{margin-bottom:10px;font-size: 14px;color: #fff;} footer.footer ul li{line-height: 26px;white-space: nowrap;list-style: none;margin:0;padding:0;}
    ").addClass("cw").text("#"));c.isBefore(f.clone().endOf("w"));)b.append(a("").addClass("dow").text(c.format("dd"))),c.add(1,"d");o.find(".datepicker-days thead").append(b)},N=function(a){return d.disabledDates[a.format("YYYY-MM-DD")]===!0},O=function(a){return d.enabledDates[a.format("YYYY-MM-DD")]===!0},P=function(a){return d.disabledHours[a.format("H")]===!0},Q=function(a){return d.enabledHours[a.format("H")]===!0},R=function(b,c){if(!b.isValid())return!1;if(d.disabledDates&&"d"===c&&N(b))return!1;if(d.enabledDates&&"d"===c&&!O(b))return!1;if(d.minDate&&b.isBefore(d.minDate,c))return!1;if(d.maxDate&&b.isAfter(d.maxDate,c))return!1;if(d.daysOfWeekDisabled&&"d"===c&&d.daysOfWeekDisabled.indexOf(b.day())!==-1)return!1;if(d.disabledHours&&("h"===c||"m"===c||"s"===c)&&P(b))return!1;if(d.enabledHours&&("h"===c||"m"===c||"s"===c)&&!Q(b))return!1;if(d.disabledTimeIntervals&&("h"===c||"m"===c||"s"===c)){var e=!1;if(a.each(d.disabledTimeIntervals,function(){if(b.isBetween(this[0],this[1]))return e=!0,!1}),e)return!1}return!0},S=function(){for(var b=[],c=f.clone().startOf("y").startOf("d");c.isSame(f,"y");)b.push(a("").attr("data-action","selectMonth").addClass("month").text(c.format("MMM"))),c.add(1,"M");o.find(".datepicker-months td").empty().append(b)},T=function(){var b=o.find(".datepicker-months"),c=b.find("th"),g=b.find("tbody").find("span");c.eq(0).find("span").attr("title",d.tooltips.prevYear),c.eq(1).attr("title",d.tooltips.selectYear),c.eq(2).find("span").attr("title",d.tooltips.nextYear),b.find(".disabled").removeClass("disabled"),R(f.clone().subtract(1,"y"),"y")||c.eq(0).addClass("disabled"),c.eq(1).text(f.year()),R(f.clone().add(1,"y"),"y")||c.eq(2).addClass("disabled"),g.removeClass("active"),e.isSame(f,"y")&&!m&&g.eq(e.month()).addClass("active"),g.each(function(b){R(f.clone().month(b),"M")||a(this).addClass("disabled")})},U=function(){var a=o.find(".datepicker-years"),b=a.find("th"),c=f.clone().subtract(5,"y"),g=f.clone().add(6,"y"),h="";for(b.eq(0).find("span").attr("title",d.tooltips.prevDecade),b.eq(1).attr("title",d.tooltips.selectDecade),b.eq(2).find("span").attr("title",d.tooltips.nextDecade),a.find(".disabled").removeClass("disabled"),d.minDate&&d.minDate.isAfter(c,"y")&&b.eq(0).addClass("disabled"),b.eq(1).text(c.year()+"-"+g.year()),d.maxDate&&d.maxDate.isBefore(g,"y")&&b.eq(2).addClass("disabled");!c.isAfter(g,"y");)h+=''+c.year()+"",c.add(1,"y");a.find("td").html(h)},V=function(){var a,c=o.find(".datepicker-decades"),g=c.find("th"),h=b({y:f.year()-f.year()%100-1}),i=h.clone().add(100,"y"),j=h.clone(),k=!1,l=!1,m="";for(g.eq(0).find("span").attr("title",d.tooltips.prevCentury),g.eq(2).find("span").attr("title",d.tooltips.nextCentury),c.find(".disabled").removeClass("disabled"),(h.isSame(b({y:1900}))||d.minDate&&d.minDate.isAfter(h,"y"))&&g.eq(0).addClass("disabled"),g.eq(1).text(h.year()+"-"+i.year()),(h.isSame(b({y:2e3}))||d.maxDate&&d.maxDate.isBefore(i,"y"))&&g.eq(2).addClass("disabled");!h.isAfter(i,"y");)a=h.year()+12,k=d.minDate&&d.minDate.isAfter(h,"y")&&d.minDate.year()<=a,l=d.maxDate&&d.maxDate.isAfter(h,"y")&&d.maxDate.year()<=a,m+=''+(h.year()+1)+" - "+(h.year()+12)+"",h.add(12,"y");m+="",c.find("td").html(m),g.eq(1).text(j.year()+1+"-"+h.year())},W=function(){var b,c,g,h=o.find(".datepicker-days"),i=h.find("th"),j=[],k=[];if(B()){for(i.eq(0).find("span").attr("title",d.tooltips.prevMonth),i.eq(1).attr("title",d.tooltips.selectMonth),i.eq(2).find("span").attr("title",d.tooltips.nextMonth),h.find(".disabled").removeClass("disabled"),i.eq(1).text(f.format(d.dayViewHeaderFormat)),R(f.clone().subtract(1,"M"),"M")||i.eq(0).addClass("disabled"),R(f.clone().add(1,"M"),"M")||i.eq(2).addClass("disabled"),b=f.clone().startOf("M").startOf("w").startOf("d"),g=0;g<42;g++)0===b.weekday()&&(c=a("
    '+b.week()+"'+b.date()+"
    '+c.format(h?"HH":"hh")+"
    '+c.format("mm")+"
    '+c.format("ss")+"