新增SelectPage插件
新增CRUD生成Swith类型的Checkbox,支持tinyint和char 移除Typeahead、Tagsinput、Bootstrap-select-ajax插件 修复快捷搜索不能使用关联表字段的BUG
正在显示
21 个修改的文件
包含
278 行增加
和
221 行删除
@@ -17,6 +17,72 @@ class Crud extends Command | @@ -17,6 +17,72 @@ class Crud extends Command | ||
17 | 17 | ||
18 | protected $stubList = []; | 18 | protected $stubList = []; |
19 | 19 | ||
20 | + /** | ||
21 | + * Selectpage搜索字段关联 | ||
22 | + */ | ||
23 | + protected $fieldSelectpageMap = [ | ||
24 | + 'nickname' => ['user_id', 'user_ids', 'admin_id', 'admin_ids'] | ||
25 | + ]; | ||
26 | + | ||
27 | + /** | ||
28 | + * Enum类型识别为单选框的结尾字符,默认会识别为单选下拉列表 | ||
29 | + */ | ||
30 | + protected $enumRadioSuffix = 'data'; | ||
31 | + | ||
32 | + /** | ||
33 | + * Set类型识别为复选框的结尾字符,默认会识别为多选下拉列表 | ||
34 | + */ | ||
35 | + protected $setCheckboxSuffix = 'data'; | ||
36 | + | ||
37 | + /** | ||
38 | + * Int类型识别为日期时间的结尾字符,默认会识别为数字文本框 | ||
39 | + */ | ||
40 | + protected $intDateSuffix = 'time'; | ||
41 | + | ||
42 | + /** | ||
43 | + * 开头后缀 | ||
44 | + */ | ||
45 | + protected $switchSuffix = 'switch'; | ||
46 | + | ||
47 | + /** | ||
48 | + * 以指定字符结尾的字段格式化函数 | ||
49 | + */ | ||
50 | + protected $fieldFormatterSuffix = [ | ||
51 | + 'status' => 'status', | ||
52 | + 'icon' => 'icon', | ||
53 | + 'flag' => 'flag', | ||
54 | + 'url' => 'url', | ||
55 | + 'url' => 'url', | ||
56 | + 'image' => 'image', | ||
57 | + 'images' => 'images', | ||
58 | + 'time' => ['type' => ['int', 'timestamp'], 'name' => 'datetime'] | ||
59 | + ]; | ||
60 | + | ||
61 | + /** | ||
62 | + * 识别为图片字段 | ||
63 | + */ | ||
64 | + protected $imageField = ['image', 'images', 'avatar', 'avatars']; | ||
65 | + | ||
66 | + /** | ||
67 | + * 识别为文件字段 | ||
68 | + */ | ||
69 | + protected $fileField = ['file', 'files']; | ||
70 | + | ||
71 | + /** | ||
72 | + * 保留字段 | ||
73 | + */ | ||
74 | + protected $reservedField = ['createtime', 'updatetime']; | ||
75 | + | ||
76 | + /** | ||
77 | + * 排序字段 | ||
78 | + */ | ||
79 | + protected $sortField = 'weigh'; | ||
80 | + | ||
81 | + /** | ||
82 | + * 编辑器的Class | ||
83 | + */ | ||
84 | + protected $editorClass = 'summernote'; | ||
85 | + | ||
20 | protected function configure() | 86 | protected function configure() |
21 | { | 87 | { |
22 | $this | 88 | $this |
@@ -286,7 +352,7 @@ class Crud extends Command | @@ -286,7 +352,7 @@ class Crud extends Command | ||
286 | } | 352 | } |
287 | $inputType = ''; | 353 | $inputType = ''; |
288 | //createtime和updatetime是保留字段不能修改和添加 | 354 | //createtime和updatetime是保留字段不能修改和添加 |
289 | - if ($v['COLUMN_KEY'] != 'PRI' && !in_array($field, ['createtime', 'updatetime'])) | 355 | + if ($v['COLUMN_KEY'] != 'PRI' && !in_array($field, $this->reservedField)) |
290 | { | 356 | { |
291 | $inputType = $this->getFieldType($v); | 357 | $inputType = $this->getFieldType($v); |
292 | 358 | ||
@@ -381,34 +447,72 @@ class Crud extends Command | @@ -381,34 +447,72 @@ class Crud extends Command | ||
381 | } | 447 | } |
382 | else if ($inputType == 'textarea') | 448 | else if ($inputType == 'textarea') |
383 | { | 449 | { |
384 | - $cssClassArr[] = substr($field, -7) == 'content' ? 'summernote' : ''; | 450 | + $cssClassArr[] = substr($field, -7) == 'content' ? $this->editorClass : ''; |
385 | $attrArr['class'] = implode(' ', $cssClassArr); | 451 | $attrArr['class'] = implode(' ', $cssClassArr); |
386 | $attrArr['rows'] = 5; | 452 | $attrArr['rows'] = 5; |
387 | $formAddElement = Form::textarea($fieldName, $defaultValue, $attrArr); | 453 | $formAddElement = Form::textarea($fieldName, $defaultValue, $attrArr); |
388 | $formEditElement = Form::textarea($fieldName, $editValue, $attrArr); | 454 | $formEditElement = Form::textarea($fieldName, $editValue, $attrArr); |
389 | } | 455 | } |
390 | - else if ($field == 'category_id' || $field == 'category_ids') | 456 | + else if ($inputType == 'switch') |
391 | { | 457 | { |
392 | - $type = $table; | ||
393 | - if ($field == 'category_ids') | 458 | + if ($defaultValue === '1' || $defaultValue === 'Y') |
394 | { | 459 | { |
395 | - $attrArr['multiple'] = ''; | 460 | + $yes = $defaultValue; |
461 | + $no = $defaultValue === '1' ? '0' : 'N'; | ||
462 | + } | ||
463 | + else | ||
464 | + { | ||
465 | + $no = $defaultValue; | ||
466 | + $yes = $defaultValue === '0' ? '1' : 'Y'; | ||
396 | } | 467 | } |
397 | - $attrStr = $this->getArrayString($attrArr); | ||
398 | - $formAddElement = "{:build_category_select('{$fieldName}', '{$type}', '{$defaultValue}', [{$attrStr}])}"; | ||
399 | - $formEditElement = "{:build_category_select('{$fieldName}', '{$type}', \$row.{$field}, [{$attrStr}])}"; | 468 | + $formAddElement = $formEditElement = Form::hidden($fieldName, $no, array_merge(['checked' => ''], $attrArr)); |
469 | + $attrArr['id'] = $fieldName . "-switch"; | ||
470 | + $formAddElement .= sprintf(Form::label("{$attrArr['id']}", "%s abcdefg"), Form::checkbox($fieldName, $yes, $defaultValue === $yes, $attrArr)); | ||
471 | + $formEditElement .= sprintf(Form::label("{$attrArr['id']}", "%s abcdefg"), Form::checkbox($fieldName, $yes, 0, $attrArr)); | ||
472 | + $formEditElement = str_replace('type="checkbox"', 'type="checkbox" {in name="' . "\$row.{$field}" . '" value="' . $yes . '"}checked{/in}', $formEditElement); | ||
400 | } | 473 | } |
401 | else | 474 | else |
402 | { | 475 | { |
403 | - //CSS类名 | ||
404 | - $cssClassArr[] = substr($field, -3) == '_id' ? 'typeahead' : ''; | ||
405 | - $cssClassArr[] = substr($field, -4) == '_ids' ? 'tagsinput' : ''; | ||
406 | - $cssClassArr = array_filter($cssClassArr); | 476 | + $search = $replace = ''; |
477 | + //特殊字段为关联搜索 | ||
478 | + if (substr($field, -3) == '_id' || substr($field, -4) == '_ids') | ||
479 | + { | ||
480 | + $inputType = 'text'; | ||
481 | + $defaultValue = ''; | ||
482 | + $attrArr['data-rule'] = 'required'; | ||
483 | + $cssClassArr[] = 'selectpage'; | ||
484 | + $attrArr['data-db-table'] = substr($field, 0, strripos($field, '_')); | ||
485 | + if ($attrArr['data-db-table'] == 'category') | ||
486 | + { | ||
487 | + $attrArr['data-params'] = '##replacetext##'; | ||
488 | + $search = '"##replacetext##"'; | ||
489 | + $replace = '\'{"custom[type]":"' . $table . '"}\''; | ||
490 | + } | ||
491 | + if (substr($field, -4) == '_ids') | ||
492 | + { | ||
493 | + $attrArr['data-multiple'] = 'true'; | ||
494 | + } | ||
495 | + foreach ($this->fieldSelectpageMap as $m => $n) | ||
496 | + { | ||
497 | + if (in_array($field, $n)) | ||
498 | + { | ||
499 | + $attrArr['data-field'] = $m; | ||
500 | + break; | ||
501 | + } | ||
502 | + } | ||
503 | + } | ||
407 | //因为有自动完成可输入其它内容 | 504 | //因为有自动完成可输入其它内容 |
408 | - $step = array_intersect($cssClassArr, ['typeahead', 'tagsinput']) ? 0 : $step; | 505 | + $step = array_intersect($cssClassArr, ['selectpage']) ? 0 : $step; |
409 | $attrArr['class'] = implode(' ', $cssClassArr); | 506 | $attrArr['class'] = implode(' ', $cssClassArr); |
410 | - | ||
411 | - $isUpload = in_array(substr($field, -4), ['file']) || in_array(substr($field, -5), ['files', 'image']) || in_array(substr($field, -6), ['images', 'avatar']) || in_array(substr($field, -7), ['avatars']) ? TRUE : FALSE; | 507 | + $isUpload = false; |
508 | + foreach (array_merge($this->imageField, $this->fileField) as $m => $n) | ||
509 | + { | ||
510 | + if (preg_match("/{$n}$/i", $field)) | ||
511 | + { | ||
512 | + $isUpload = true; | ||
513 | + break; | ||
514 | + } | ||
515 | + } | ||
412 | //如果是步长则加上步长 | 516 | //如果是步长则加上步长 |
413 | if ($step) | 517 | if ($step) |
414 | { | 518 | { |
@@ -422,7 +526,11 @@ class Crud extends Command | @@ -422,7 +526,11 @@ class Crud extends Command | ||
422 | 526 | ||
423 | $formAddElement = Form::input($inputType, $fieldName, $defaultValue, $attrArr); | 527 | $formAddElement = Form::input($inputType, $fieldName, $defaultValue, $attrArr); |
424 | $formEditElement = Form::input($inputType, $fieldName, $editValue, $attrArr); | 528 | $formEditElement = Form::input($inputType, $fieldName, $editValue, $attrArr); |
425 | - | 529 | + if ($search && $replace) |
530 | + { | ||
531 | + $formAddElement = str_replace($search, $replace, $formAddElement); | ||
532 | + $formEditElement = str_replace($search, $replace, $formEditElement); | ||
533 | + } | ||
426 | //如果是图片或文件 | 534 | //如果是图片或文件 |
427 | if ($isUpload) | 535 | if ($isUpload) |
428 | { | 536 | { |
@@ -450,8 +558,8 @@ class Crud extends Command | @@ -450,8 +558,8 @@ class Crud extends Command | ||
450 | { | 558 | { |
451 | $javascriptList[] = $this->getJsColumn($field, $v['DATA_TYPE'], '_text'); | 559 | $javascriptList[] = $this->getJsColumn($field, $v['DATA_TYPE'], '_text'); |
452 | } | 560 | } |
453 | - //排序方式,如果有weigh则按weigh,否则按主键排序 | ||
454 | - $order = $field == 'weigh' ? 'weigh' : $order; | 561 | + //排序方式,如果有指定排序字段,否则按主键排序 |
562 | + $order = $field == $this->sortField ? $this->sortField : $order; | ||
455 | } | 563 | } |
456 | } | 564 | } |
457 | 565 | ||
@@ -579,7 +687,7 @@ class Crud extends Command | @@ -579,7 +687,7 @@ class Crud extends Command | ||
579 | } | 687 | } |
580 | catch (\think\exception\ErrorException $e) | 688 | catch (\think\exception\ErrorException $e) |
581 | { | 689 | { |
582 | - throw new Exception("Code: " . $e->getCode() . "\nLine: " . $e->getLine() . "\nMessage: " . $e->getMessage()); | 690 | + throw new Exception("Code: " . $e->getCode() . "\nLine: " . $e->getLine() . "\nMessage: " . $e->getMessage() . "\nFile: " . $e->getFile()); |
583 | } | 691 | } |
584 | $output->info("Build Successed"); | 692 | $output->info("Build Successed"); |
585 | } | 693 | } |
@@ -846,21 +954,26 @@ EOD; | @@ -846,21 +954,26 @@ EOD; | ||
846 | break; | 954 | break; |
847 | } | 955 | } |
848 | $fieldsName = $v['COLUMN_NAME']; | 956 | $fieldsName = $v['COLUMN_NAME']; |
849 | - // 如果后缀以time结尾说明也是个时间字段 | ||
850 | - if (substr($fieldsName, -4) == 'time') | 957 | + // 指定后缀说明也是个时间字段 |
958 | + if (preg_match("/{$this->intDateSuffix}$/i", $fieldsName)) | ||
851 | { | 959 | { |
852 | $inputType = 'datetime'; | 960 | $inputType = 'datetime'; |
853 | } | 961 | } |
854 | - // 如果后缀以data结尾且类型为enum,说明是个单选框 | ||
855 | - if (substr($fieldsName, -4) == 'data' && $v['DATA_TYPE'] == 'enum') | 962 | + // 指定后缀结尾且类型为enum,说明是个单选框 |
963 | + if (preg_match("/{$this->enumRadioSuffix}$/i", $fieldsName) && $v['DATA_TYPE'] == 'enum') | ||
856 | { | 964 | { |
857 | $inputType = "radio"; | 965 | $inputType = "radio"; |
858 | } | 966 | } |
859 | - // 如果后缀以data结尾且类型为set,说明是个复选框 | ||
860 | - if (substr($fieldsName, -4) == 'data' && $v['DATA_TYPE'] == 'set') | 967 | + // 指定后缀结尾且类型为set,说明是个复选框 |
968 | + if (preg_match("/{$this->setCheckboxSuffix}$/i", $fieldsName) && $v['DATA_TYPE'] == 'set') | ||
861 | { | 969 | { |
862 | $inputType = "checkbox"; | 970 | $inputType = "checkbox"; |
863 | } | 971 | } |
972 | + // 指定后缀结尾且类型为char或tinyint且长度为1,说明是个Switch复选框 | ||
973 | + if (preg_match("/{$this->switchSuffix}$/i", $fieldsName) && ($v['COLUMN_TYPE'] == 'tinyint(1)' || $v['COLUMN_TYPE'] == 'char(1)') && $v['COLUMN_DEFAULT'] !== '' && $v['COLUMN_DEFAULT'] !== null) | ||
974 | + { | ||
975 | + $inputType = "switch"; | ||
976 | + } | ||
864 | return $inputType; | 977 | return $inputType; |
865 | } | 978 | } |
866 | 979 | ||
@@ -891,7 +1004,15 @@ EOD; | @@ -891,7 +1004,15 @@ EOD; | ||
891 | */ | 1004 | */ |
892 | protected function getImageUpload($field, $content) | 1005 | protected function getImageUpload($field, $content) |
893 | { | 1006 | { |
894 | - $filter = substr($field, -4) == 'avatar' || substr($field, -5) == 'image' || substr($field, -6) == 'images' ? ' data-mimetype="image/*"' : ""; | 1007 | + $filter = ''; |
1008 | + foreach ($this->imageField as $k => $v) | ||
1009 | + { | ||
1010 | + if (preg_match("/{$v}$/i", $field)) | ||
1011 | + { | ||
1012 | + $filter = ' data-mimetype="image/*"'; | ||
1013 | + break; | ||
1014 | + } | ||
1015 | + } | ||
895 | $multiple = substr($field, -1) == 's' ? ' data-multiple="true"' : ' data-multiple="false"'; | 1016 | $multiple = substr($field, -1) == 's' ? ' data-multiple="true"' : ' data-multiple="false"'; |
896 | $preview = $filter ? ' data-preview-id="p-' . $field . '"' : ''; | 1017 | $preview = $filter ? ' data-preview-id="p-' . $field . '"' : ''; |
897 | $previewcontainer = $preview ? '<ul class="row list-inline plupload-preview" id="p-' . $field . '"></ul>' : ''; | 1018 | $previewcontainer = $preview ? '<ul class="row list-inline plupload-preview" id="p-' . $field . '"></ul>' : ''; |
@@ -914,22 +1035,26 @@ EOD; | @@ -914,22 +1035,26 @@ EOD; | ||
914 | { | 1035 | { |
915 | $lang = ucfirst($field); | 1036 | $lang = ucfirst($field); |
916 | $html = str_repeat(" ", 24) . "{field: '{$field}{$extend}', title: __('{$lang}')"; | 1037 | $html = str_repeat(" ", 24) . "{field: '{$field}{$extend}', title: __('{$lang}')"; |
917 | - $field = stripos($field, ".") !== false ? substr($field, stripos($field, '.') + 1) : $field; | ||
918 | $formatter = ''; | 1038 | $formatter = ''; |
919 | - if ($field == 'status') | ||
920 | - $formatter = 'status'; | ||
921 | - else if ($field == 'icon') | ||
922 | - $formatter = 'icon'; | ||
923 | - else if ($field == 'flag') | ||
924 | - $formatter = 'flag'; | ||
925 | - else if (substr($field, -4) == 'time' && in_array($datatype, ['int', 'timestamp'])) | ||
926 | - $formatter = 'datetime'; | ||
927 | - else if (substr($field, -3) == 'url' || substr($field, -4) == 'file') | ||
928 | - $formatter = 'url'; | ||
929 | - else if (substr($field, -5) == 'image') | ||
930 | - $formatter = 'image'; | ||
931 | - else if (substr($field, -6) == 'images') | ||
932 | - $formatter = 'images'; | 1039 | + foreach ($this->fieldFormatterSuffix as $k => $v) |
1040 | + { | ||
1041 | + if (preg_match("/{$k}$/i", $field)) | ||
1042 | + { | ||
1043 | + if (is_array($v)) | ||
1044 | + { | ||
1045 | + if (in_array($datatype, $v['type'])) | ||
1046 | + { | ||
1047 | + $formatter = $v['name']; | ||
1048 | + break; | ||
1049 | + } | ||
1050 | + } | ||
1051 | + else | ||
1052 | + { | ||
1053 | + $formatter = $v; | ||
1054 | + break; | ||
1055 | + } | ||
1056 | + } | ||
1057 | + } | ||
933 | if ($extend) | 1058 | if ($extend) |
934 | $html .= ", operate:false"; | 1059 | $html .= ", operate:false"; |
935 | if ($formatter && !$extend) | 1060 | if ($formatter && !$extend) |
@@ -62,6 +62,78 @@ class Ajax extends Backend | @@ -62,6 +62,78 @@ class Ajax extends Backend | ||
62 | } | 62 | } |
63 | 63 | ||
64 | /** | 64 | /** |
65 | + * SelectPage通用下拉列表搜索 | ||
66 | + */ | ||
67 | + public function selectpage() | ||
68 | + { | ||
69 | + //搜索关键词,客户端输入以空格分开,这里接收为数组 | ||
70 | + $word = $this->request->request("q_word/a"); | ||
71 | + //当前页 | ||
72 | + $page = $this->request->request("pageNumber"); | ||
73 | + //分页大小 | ||
74 | + $pagesize = $this->request->request("pageSize"); | ||
75 | + //搜索条件 | ||
76 | + $andor = $this->request->request("and_or"); | ||
77 | + //排序方式 | ||
78 | + $orderby = $this->request->request("order_by/a"); | ||
79 | + //表名 | ||
80 | + $table = $this->request->request("db_table"); | ||
81 | + //显示的字段 | ||
82 | + $field = $this->request->request("field"); | ||
83 | + //主键 | ||
84 | + $primarykey = $this->request->request("pkey_name"); | ||
85 | + //主键值 | ||
86 | + $primaryvalue = $this->request->request("pkey_value"); | ||
87 | + //搜索字段 | ||
88 | + $searchfield = $this->request->request("search_field/a"); | ||
89 | + //自定义搜索条件 | ||
90 | + $custom = $this->request->request("custom/a"); | ||
91 | + $order = []; | ||
92 | + foreach ($orderby as $k => $v) | ||
93 | + { | ||
94 | + $order[$v[0]] = $v[1]; | ||
95 | + } | ||
96 | + $field = $field ? $field : 'name'; | ||
97 | + | ||
98 | + //如果不使用ajax/selectpage这个页面提供结果,则是自己的控制器单独写搜索条件,$where按自己的需求写即可 | ||
99 | + //这里只是能用考虑,所以搜索条件写得比较复杂 | ||
100 | + //如果有primaryvalue,说明当前是初始化传值 | ||
101 | + if ($primaryvalue) | ||
102 | + { | ||
103 | + $where = [$primarykey => ['in', $primaryvalue]]; | ||
104 | + } | ||
105 | + else | ||
106 | + { | ||
107 | + $where = function($query) use($word, $andor, $field, $searchfield, $custom) { | ||
108 | + $where = $andor == "OR" ? "whereOr" : "where"; | ||
109 | + foreach ($word as $k => $v) | ||
110 | + { | ||
111 | + foreach ($searchfield as $m => $n) | ||
112 | + { | ||
113 | + $query->{$where}($n, "like", "%{$v}%"); | ||
114 | + } | ||
115 | + } | ||
116 | + if ($custom && is_array($custom)) | ||
117 | + { | ||
118 | + foreach ($custom as $k => $v) | ||
119 | + { | ||
120 | + $query->where($k, '=', $v); | ||
121 | + } | ||
122 | + } | ||
123 | + }; | ||
124 | + } | ||
125 | + $list = []; | ||
126 | + $total = Db::name($table)->where($where)->count(); | ||
127 | + if ($total > 0) | ||
128 | + { | ||
129 | + $list = Db::name($table)->where($where)->order($order)->page($page, $pagesize)->field("{$primarykey},{$field}")->select(); | ||
130 | + } | ||
131 | + | ||
132 | + //这里一定要返回有list这个字段,total是可选的,如果total<=list的数量,则会隐藏分页按钮 | ||
133 | + return json(['list' => $list, 'total' => $total]); | ||
134 | + } | ||
135 | + | ||
136 | + /** | ||
65 | * 加载语言包 | 137 | * 加载语言包 |
66 | */ | 138 | */ |
67 | public function lang() | 139 | public function lang() |
@@ -27,6 +27,7 @@ class Relationmodel extends Backend | @@ -27,6 +27,7 @@ class Relationmodel extends Backend | ||
27 | public function index() | 27 | public function index() |
28 | { | 28 | { |
29 | $this->relationSearch = true; | 29 | $this->relationSearch = true; |
30 | + $this->searchFields = "admin.username,id"; | ||
30 | if ($this->request->isAjax()) | 31 | if ($this->request->isAjax()) |
31 | { | 32 | { |
32 | list($where, $sort, $order, $offset, $limit) = $this->buildparams(); | 33 | list($where, $sort, $order, $offset, $limit) = $this->buildparams(); |
@@ -2,7 +2,7 @@ | @@ -2,7 +2,7 @@ | ||
2 | <div class="form-group"> | 2 | <div class="form-group"> |
3 | <label for="c-category_id" class="control-label col-xs-12 col-sm-2">{:__('Category_id')}:</label> | 3 | <label for="c-category_id" class="control-label col-xs-12 col-sm-2">{:__('Category_id')}:</label> |
4 | <div class="col-xs-12 col-sm-8"> | 4 | <div class="col-xs-12 col-sm-8"> |
5 | - <input id="c-category_id" class="form-control typeahead" name="row[category_id]" type="text" value="0" data-rule="required"> | 5 | + <input id="c-category_id" class="form-control selectpage" data-db-table="category" data-params='{"custom[type]":"page"}' name="row[category_id]" type="text" value="" data-rule="required"> |
6 | </div> | 6 | </div> |
7 | </div> | 7 | </div> |
8 | <div class="form-group"> | 8 | <div class="form-group"> |
@@ -3,7 +3,7 @@ | @@ -3,7 +3,7 @@ | ||
3 | <div class="form-group"> | 3 | <div class="form-group"> |
4 | <label for="c-category_id" class="control-label col-xs-12 col-sm-2">{:__('Category_id')}:</label> | 4 | <label for="c-category_id" class="control-label col-xs-12 col-sm-2">{:__('Category_id')}:</label> |
5 | <div class="col-xs-12 col-sm-8"> | 5 | <div class="col-xs-12 col-sm-8"> |
6 | - <input id="c-category_id" class="form-control typeahead" name="row[category_id]" type="text" value="{$row.category_id}" data-rule="required"> | 6 | + <input id="c-category_id" class="form-control selectpage" data-db-table="category" data-params='{"custom[type]":"page"}' name="row[category_id]" type="text" value="{$row.category_id}" data-rule="required"> |
7 | </div> | 7 | </div> |
8 | </div> | 8 | </div> |
9 | <div class="form-group"> | 9 | <div class="form-group"> |
@@ -2,7 +2,7 @@ | @@ -2,7 +2,7 @@ | ||
2 | <div class="form-group"> | 2 | <div class="form-group"> |
3 | <label for="c-user_id" class="control-label col-xs-12 col-sm-2">{:__('User_id')}:</label> | 3 | <label for="c-user_id" class="control-label col-xs-12 col-sm-2">{:__('User_id')}:</label> |
4 | <div class="col-xs-12 col-sm-8"> | 4 | <div class="col-xs-12 col-sm-8"> |
5 | - <input type="text" name="row[user_id]" value="0" id="c-user_id" class="form-control typeahead " /> | 5 | + <input type="text" name="row[user_id]" value="0" id="c-user_id" class="form-control" /> |
6 | </div> | 6 | </div> |
7 | </div> | 7 | </div> |
8 | <div class="form-group"> | 8 | <div class="form-group"> |
@@ -3,7 +3,7 @@ | @@ -3,7 +3,7 @@ | ||
3 | <div class="form-group"> | 3 | <div class="form-group"> |
4 | <label for="c-user_id" class="control-label col-xs-12 col-sm-2">{:__('User_id')}:</label> | 4 | <label for="c-user_id" class="control-label col-xs-12 col-sm-2">{:__('User_id')}:</label> |
5 | <div class="col-xs-12 col-sm-8"> | 5 | <div class="col-xs-12 col-sm-8"> |
6 | - <input type="text" name="row[user_id]" value="{$row.user_id}" id="c-user_id" class="form-control typeahead " /> | 6 | + <input type="text" name="row[user_id]" value="{$row.user_id}" id="c-user_id" class="form-control" /> |
7 | </div> | 7 | </div> |
8 | </div> | 8 | </div> |
9 | <div class="form-group"> | 9 | <div class="form-group"> |
@@ -2,25 +2,25 @@ | @@ -2,25 +2,25 @@ | ||
2 | <div class="form-group"> | 2 | <div class="form-group"> |
3 | <label for="c-partner_id" class="control-label col-xs-12 col-sm-2">{:__('Partner_id')}:</label> | 3 | <label for="c-partner_id" class="control-label col-xs-12 col-sm-2">{:__('Partner_id')}:</label> |
4 | <div class="col-xs-12 col-sm-8"> | 4 | <div class="col-xs-12 col-sm-8"> |
5 | - <input type="text" name="row[partner_id]" value="" id="c-partner_id" class="form-control typeahead "required /> | 5 | + <input type="text" name="row[partner_id]" value="" id="c-partner_id" class="form-control "required /> |
6 | </div> | 6 | </div> |
7 | </div> | 7 | </div> |
8 | <div class="form-group"> | 8 | <div class="form-group"> |
9 | <label for="c-role_id" class="control-label col-xs-12 col-sm-2">{:__('Role_id')}:</label> | 9 | <label for="c-role_id" class="control-label col-xs-12 col-sm-2">{:__('Role_id')}:</label> |
10 | <div class="col-xs-12 col-sm-8"> | 10 | <div class="col-xs-12 col-sm-8"> |
11 | - <input type="text" name="row[role_id]" value="0" id="c-role_id" class="form-control typeahead " /> | 11 | + <input type="text" name="row[role_id]" value="0" id="c-role_id" class="form-control " /> |
12 | </div> | 12 | </div> |
13 | </div> | 13 | </div> |
14 | <div class="form-group"> | 14 | <div class="form-group"> |
15 | <label for="c-area_id" class="control-label col-xs-12 col-sm-2">{:__('Area_id')}:</label> | 15 | <label for="c-area_id" class="control-label col-xs-12 col-sm-2">{:__('Area_id')}:</label> |
16 | <div class="col-xs-12 col-sm-8"> | 16 | <div class="col-xs-12 col-sm-8"> |
17 | - <input type="text" name="row[area_id]" value="0" id="c-area_id" class="form-control typeahead " /> | 17 | + <input type="text" name="row[area_id]" value="0" id="c-area_id" class="form-control " /> |
18 | </div> | 18 | </div> |
19 | </div> | 19 | </div> |
20 | <div class="form-group"> | 20 | <div class="form-group"> |
21 | <label for="c-editor_id" class="control-label col-xs-12 col-sm-2">{:__('Editor_id')}:</label> | 21 | <label for="c-editor_id" class="control-label col-xs-12 col-sm-2">{:__('Editor_id')}:</label> |
22 | <div class="col-xs-12 col-sm-8"> | 22 | <div class="col-xs-12 col-sm-8"> |
23 | - <input type="text" name="row[editor_id]" value="0" id="c-editor_id" class="form-control typeahead " /> | 23 | + <input type="text" name="row[editor_id]" value="0" id="c-editor_id" class="form-control " /> |
24 | </div> | 24 | </div> |
25 | </div> | 25 | </div> |
26 | <div class="form-group"> | 26 | <div class="form-group"> |
@@ -3,25 +3,25 @@ | @@ -3,25 +3,25 @@ | ||
3 | <div class="form-group"> | 3 | <div class="form-group"> |
4 | <label for="c-partner_id" class="control-label col-xs-12 col-sm-2">{:__('Partner_id')}:</label> | 4 | <label for="c-partner_id" class="control-label col-xs-12 col-sm-2">{:__('Partner_id')}:</label> |
5 | <div class="col-xs-12 col-sm-8"> | 5 | <div class="col-xs-12 col-sm-8"> |
6 | - <input type="text" name="row[partner_id]" value="{$row.partner_id}" id="c-partner_id" class="form-control typeahead "required /> | 6 | + <input type="text" name="row[partner_id]" value="{$row.partner_id}" id="c-partner_id" class="form-control "required /> |
7 | </div> | 7 | </div> |
8 | </div> | 8 | </div> |
9 | <div class="form-group"> | 9 | <div class="form-group"> |
10 | <label for="c-role_id" class="control-label col-xs-12 col-sm-2">{:__('Role_id')}:</label> | 10 | <label for="c-role_id" class="control-label col-xs-12 col-sm-2">{:__('Role_id')}:</label> |
11 | <div class="col-xs-12 col-sm-8"> | 11 | <div class="col-xs-12 col-sm-8"> |
12 | - <input type="text" name="row[role_id]" value="{$row.role_id}" id="c-role_id" class="form-control typeahead " /> | 12 | + <input type="text" name="row[role_id]" value="{$row.role_id}" id="c-role_id" class="form-control " /> |
13 | </div> | 13 | </div> |
14 | </div> | 14 | </div> |
15 | <div class="form-group"> | 15 | <div class="form-group"> |
16 | <label for="c-area_id" class="control-label col-xs-12 col-sm-2">{:__('Area_id')}:</label> | 16 | <label for="c-area_id" class="control-label col-xs-12 col-sm-2">{:__('Area_id')}:</label> |
17 | <div class="col-xs-12 col-sm-8"> | 17 | <div class="col-xs-12 col-sm-8"> |
18 | - <input type="text" name="row[area_id]" value="{$row.area_id}" id="c-area_id" class="form-control typeahead " /> | 18 | + <input type="text" name="row[area_id]" value="{$row.area_id}" id="c-area_id" class="form-control " /> |
19 | </div> | 19 | </div> |
20 | </div> | 20 | </div> |
21 | <div class="form-group"> | 21 | <div class="form-group"> |
22 | <label for="c-editor_id" class="control-label col-xs-12 col-sm-2">{:__('Editor_id')}:</label> | 22 | <label for="c-editor_id" class="control-label col-xs-12 col-sm-2">{:__('Editor_id')}:</label> |
23 | <div class="col-xs-12 col-sm-8"> | 23 | <div class="col-xs-12 col-sm-8"> |
24 | - <input type="text" name="row[editor_id]" value="{$row.editor_id}" id="c-editor_id" class="form-control typeahead " /> | 24 | + <input type="text" name="row[editor_id]" value="{$row.editor_id}" id="c-editor_id" class="form-control " /> |
25 | </div> | 25 | </div> |
26 | </div> | 26 | </div> |
27 | <div class="form-group"> | 27 | <div class="form-group"> |
@@ -215,7 +215,7 @@ class Backend extends Controller | @@ -215,7 +215,7 @@ class Backend extends Controller | ||
215 | $searchlist = []; | 215 | $searchlist = []; |
216 | foreach ($searcharr as $k => $v) | 216 | foreach ($searcharr as $k => $v) |
217 | { | 217 | { |
218 | - $searchlist[] = "{$modelName}`{$v}` LIKE '%{$search}%'"; | 218 | + $searchlist[] = (stripos($v, ".") !== false ? $v : "{$modelName}`{$v}`") . " LIKE '%{$search}%'"; |
219 | } | 219 | } |
220 | $where[] = "(" . implode(' OR ', $searchlist) . ")"; | 220 | $where[] = "(" . implode(' OR ', $searchlist) . ")"; |
221 | } | 221 | } |
@@ -30,16 +30,14 @@ | @@ -30,16 +30,14 @@ | ||
30 | "jquery-slimscroll": "slimscroll#^1.3.8", | 30 | "jquery-slimscroll": "slimscroll#^1.3.8", |
31 | "jquery.cookie": "^1.4.1", | 31 | "jquery.cookie": "^1.4.1", |
32 | "Sortable": "^1.5.0", | 32 | "Sortable": "^1.5.0", |
33 | - "typeahead.js": "^0.11.1", | ||
34 | - "bootstrap-tagsinput": "^0.8.0", | ||
35 | "nice-validator": "^1.0.10", | 33 | "nice-validator": "^1.0.10", |
36 | - "art-template": "^3.0.1", | ||
37 | - "ajax-bootstrap-select": "^1.3.8" | 34 | + "art-template": "^3.0.1" |
38 | }, | 35 | }, |
39 | "devDependencies": { | 36 | "devDependencies": { |
40 | "dragsort": "https://github.com/karsonzhang/dragsort.git", | 37 | "dragsort": "https://github.com/karsonzhang/dragsort.git", |
41 | "jquery-addtabs": "https://github.com/karsonzhang/jquery-addtabs.git", | 38 | "jquery-addtabs": "https://github.com/karsonzhang/jquery-addtabs.git", |
42 | - "jquery-cxselect": "https://github.com/karsonzhang/cxSelect.git#", | ||
43 | - "jqcron": "https://github.com/karsonzhang/jqcron.git#" | 39 | + "jquery-cxselect": "https://github.com/karsonzhang/cxSelect.git", |
40 | + "jqcron": "https://github.com/karsonzhang/jqcron.git", | ||
41 | + "selectpage": "https://github.com/karsonzhang/selectpage.git" | ||
44 | } | 42 | } |
45 | } | 43 | } |
@@ -8,6 +8,7 @@ | @@ -8,6 +8,7 @@ | ||
8 | @import url("../libs/bootstrap-table/dist/bootstrap-table.min.css"); | 8 | @import url("../libs/bootstrap-table/dist/bootstrap-table.min.css"); |
9 | @import url("../libs/eonasdan-bootstrap-datetimepicker/build/css/bootstrap-datetimepicker.min.css"); | 9 | @import url("../libs/eonasdan-bootstrap-datetimepicker/build/css/bootstrap-datetimepicker.min.css"); |
10 | @import url("../libs/nice-validator/dist/jquery.validator.css"); | 10 | @import url("../libs/nice-validator/dist/jquery.validator.css"); |
11 | +@import url("../libs/selectpage/selectpage.css"); | ||
11 | body { | 12 | body { |
12 | background: #f1f4f6; | 13 | background: #f1f4f6; |
13 | } | 14 | } |
此 diff 太大无法显示。
@@ -6,7 +6,7 @@ require.config({ | @@ -6,7 +6,7 @@ require.config({ | ||
6 | main: 'moment' | 6 | main: 'moment' |
7 | }], | 7 | }], |
8 | //在打包压缩时将会把include中的模块合并到主文件中 | 8 | //在打包压缩时将会把include中的模块合并到主文件中 |
9 | - include: ['css', 'layer', 'toastr', 'backend', 'table', 'form', 'dragsort', 'drag', 'drop', 'addtabs'], | 9 | + include: ['css', 'layer', 'toastr', 'backend', 'table', 'form', 'dragsort', 'drag', 'drop', 'addtabs', 'selectpage'], |
10 | paths: { | 10 | paths: { |
11 | 'lang': "empty:", | 11 | 'lang': "empty:", |
12 | 'form': 'require-form', | 12 | 'form': 'require-form', |
@@ -24,18 +24,13 @@ require.config({ | @@ -24,18 +24,13 @@ require.config({ | ||
24 | 'jquery': '../libs/jquery/dist/jquery.min', | 24 | 'jquery': '../libs/jquery/dist/jquery.min', |
25 | 'bootstrap': '../libs/bootstrap/dist/js/bootstrap.min', | 25 | 'bootstrap': '../libs/bootstrap/dist/js/bootstrap.min', |
26 | 'bootstrap-validator': '../libs/bootstrap-validator/dist/validator.min', | 26 | 'bootstrap-validator': '../libs/bootstrap-validator/dist/validator.min', |
27 | - 'bootstrap-typeahead': '../libs/bootstrap3-typeahead/bootstrap3-typeahead.min', | ||
28 | - 'bootstrap-tagsinput': '../libs/bootstrap-tagsinput/dist/bootstrap-tagsinput.min', | ||
29 | 'bootstrap-dialog': '../libs/bootstrap3-dialog/dist/js/bootstrap-dialog.min', | 27 | 'bootstrap-dialog': '../libs/bootstrap3-dialog/dist/js/bootstrap-dialog.min', |
30 | 'bootstrap-datetimepicker': '../libs/eonasdan-bootstrap-datetimepicker/build/js/bootstrap-datetimepicker.min', | 28 | 'bootstrap-datetimepicker': '../libs/eonasdan-bootstrap-datetimepicker/build/js/bootstrap-datetimepicker.min', |
31 | 'bootstrap-select': '../libs/bootstrap-select/dist/js/bootstrap-select.min', | 29 | 'bootstrap-select': '../libs/bootstrap-select/dist/js/bootstrap-select.min', |
32 | - 'bootstrap-select-ajax': '../libs/ajax-bootstrap-select/dist/js/ajax-bootstrap-select.min', | ||
33 | 'bootstrap-table': '../libs/bootstrap-table/dist/bootstrap-table.min', | 30 | 'bootstrap-table': '../libs/bootstrap-table/dist/bootstrap-table.min', |
34 | 'bootstrap-table-export': '../libs/bootstrap-table/dist/extensions/export/bootstrap-table-export.min', | 31 | 'bootstrap-table-export': '../libs/bootstrap-table/dist/extensions/export/bootstrap-table-export.min', |
35 | 'bootstrap-table-mobile': '../libs/bootstrap-table/dist/extensions/mobile/bootstrap-table-mobile', | 32 | 'bootstrap-table-mobile': '../libs/bootstrap-table/dist/extensions/mobile/bootstrap-table-mobile', |
36 | 'bootstrap-table-lang': '../libs/bootstrap-table/dist/locale/bootstrap-table-zh-CN', | 33 | 'bootstrap-table-lang': '../libs/bootstrap-table/dist/locale/bootstrap-table-zh-CN', |
37 | - 'typeahead': '../libs/typeahead.js/dist/typeahead.jquery.min', | ||
38 | - 'bloodhound': '../libs/typeahead.js/dist/bloodhound.min', | ||
39 | 'tableexport': '../libs/tableExport.jquery.plugin/tableExport.min', | 34 | 'tableexport': '../libs/tableExport.jquery.plugin/tableExport.min', |
40 | 'dropzone': '../libs/dropzone/dist/min/dropzone-amd-module.min', | 35 | 'dropzone': '../libs/dropzone/dist/min/dropzone-amd-module.min', |
41 | 'less': '../libs/less/dist/less.min', | 36 | 'less': '../libs/less/dist/less.min', |
@@ -54,6 +49,7 @@ require.config({ | @@ -54,6 +49,7 @@ require.config({ | ||
54 | 'cookie': '../libs/jquery.cookie/jquery.cookie', | 49 | 'cookie': '../libs/jquery.cookie/jquery.cookie', |
55 | 'cxselect': '../libs/jquery-cxselect/js/jquery.cxselect', | 50 | 'cxselect': '../libs/jquery-cxselect/js/jquery.cxselect', |
56 | 'template': '../libs/art-template/dist/template-native', | 51 | 'template': '../libs/art-template/dist/template-native', |
52 | + 'selectpage': '../libs/selectpage/selectpage', | ||
57 | }, | 53 | }, |
58 | // shim依赖配置 | 54 | // shim依赖配置 |
59 | shim: { | 55 | shim: { |
@@ -97,12 +93,6 @@ require.config({ | @@ -97,12 +93,6 @@ require.config({ | ||
97 | deps: ['bootstrap', 'slimscroll'], | 93 | deps: ['bootstrap', 'slimscroll'], |
98 | exports: '$.AdminLTE' | 94 | exports: '$.AdminLTE' |
99 | }, | 95 | }, |
100 | - 'typeahead': { | ||
101 | - deps: ['jquery'], | ||
102 | - init: function ($) { | ||
103 | - return require.s.contexts._.registry['typeahead.js'].factory($); | ||
104 | - } | ||
105 | - }, | ||
106 | 'crontab': ['../libs/jqcron/src/jqCron', 'css!../libs/jqcron/src/jqCron.css'], | 96 | 'crontab': ['../libs/jqcron/src/jqCron', 'css!../libs/jqcron/src/jqCron.css'], |
107 | 'bootstrap-checkbox': ['jquery'], | 97 | 'bootstrap-checkbox': ['jquery'], |
108 | 'bootstrap-radio': ['jquery'], | 98 | 'bootstrap-radio': ['jquery'], |
@@ -112,12 +102,6 @@ require.config({ | @@ -112,12 +102,6 @@ require.config({ | ||
112 | 'moment/locale/zh-cn', | 102 | 'moment/locale/zh-cn', |
113 | // 'css!../libs/eonasdan-bootstrap-datetimepicker/build/css/bootstrap-datetimepicker.min.css', | 103 | // 'css!../libs/eonasdan-bootstrap-datetimepicker/build/css/bootstrap-datetimepicker.min.css', |
114 | ], | 104 | ], |
115 | - 'bootstrap-tagsinput': [ | ||
116 | - 'css!../libs/bootstrap-tagsinput/dist/bootstrap-tagsinput-typeahead.css', | ||
117 | - 'css!../libs/bootstrap-tagsinput/dist/bootstrap-tagsinput.css', | ||
118 | - 'jquery', | ||
119 | - 'typeahead' | ||
120 | - ], | ||
121 | 'bootstrap-select': ['css!../libs/bootstrap-select/dist/css/bootstrap-select.min.css', ], | 105 | 'bootstrap-select': ['css!../libs/bootstrap-select/dist/css/bootstrap-select.min.css', ], |
122 | 'summernote': ['../libs/summernote/dist/summernote.min', 'css!../libs/summernote/dist/summernote.css'], | 106 | 'summernote': ['../libs/summernote/dist/summernote.min', 'css!../libs/summernote/dist/summernote.css'], |
123 | // 'toastr': ['css!../libs/toastr/toastr.min.css'], | 107 | // 'toastr': ['css!../libs/toastr/toastr.min.css'], |
@@ -129,6 +113,7 @@ require.config({ | @@ -129,6 +113,7 @@ require.config({ | ||
129 | // 'layer': ['css!../libs/layer/build/skin/default/layer.css'], | 113 | // 'layer': ['css!../libs/layer/build/skin/default/layer.css'], |
130 | // 'validator-core': ['css!../libs/nice-validator/dist/jquery.validator.css'], | 114 | // 'validator-core': ['css!../libs/nice-validator/dist/jquery.validator.css'], |
131 | 'validator-lang': ['validator-core'], | 115 | 'validator-lang': ['validator-core'], |
116 | +// 'selectpage': ['css!../libs/selectpage/selectpage.css'], | ||
132 | }, | 117 | }, |
133 | baseUrl: requirejs.s.contexts._.config.config.site.cdnurl + '/assets/js/', //资源基础路径 | 118 | baseUrl: requirejs.s.contexts._.config.config.site.cdnurl + '/assets/js/', //资源基础路径 |
134 | map: { | 119 | map: { |
此 diff 太大无法显示。
@@ -105,43 +105,16 @@ define(['jquery', 'bootstrap', 'backend', 'toastr', 'upload', 'validator'], func | @@ -105,43 +105,16 @@ define(['jquery', 'bootstrap', 'backend', 'toastr', 'upload', 'validator'], func | ||
105 | 105 | ||
106 | //绑定select元素事件 | 106 | //绑定select元素事件 |
107 | if ($(".selectpicker", form).size() > 0) { | 107 | if ($(".selectpicker", form).size() > 0) { |
108 | - require(['bootstrap-select', 'bootstrap-select-ajax'], function () { | ||
109 | - var selectlist = $('.selectpicker', form).selectpicker(); | ||
110 | - $.each(selectlist, function () { | ||
111 | - var that = this; | ||
112 | - if ($(this).data("live-search")) { | ||
113 | - $(this).ajaxSelectPicker({ | ||
114 | - ajax: { | ||
115 | - url: 'ajax/selectpicker', | ||
116 | - beforeSend: function (xhr, setting) { | ||
117 | - setting.url = Backend.api.fixurl(setting.url); | ||
118 | - }, | ||
119 | - data: function () { | ||
120 | - var params = { | ||
121 | - search: '{{{q}}}', | ||
122 | - field: $(that).attr("name") | ||
123 | - }; | ||
124 | - return params; | ||
125 | - }, | ||
126 | - dataType: 'json' | ||
127 | - }, | ||
128 | - locale: { | ||
129 | - emptyTitle: 'Search...' | ||
130 | - }, | ||
131 | - preprocessData: function (ret) { | ||
132 | - var list = []; | ||
133 | - if (ret.hasOwnProperty('data') && ret.data) { | ||
134 | - var len = ret.data.length; | ||
135 | - for (var i = 0; i < len; i++) { | ||
136 | - var curr = ret.data[i]; | ||
137 | - list.push(curr); | ||
138 | - } | ||
139 | - } | ||
140 | - return list; | ||
141 | - }, | ||
142 | - preserveSelected: true | ||
143 | - }); | ||
144 | - } | 108 | + require(['bootstrap-select'], function () { |
109 | + $('.selectpicker', form).selectpicker(); | ||
110 | + }); | ||
111 | + } | ||
112 | + | ||
113 | + //绑定selectpage元素事件 | ||
114 | + if ($(".selectpage", form).size() > 0) { | ||
115 | + require(['selectpage'], function () { | ||
116 | + $('.selectpage', form).selectPage({ | ||
117 | + source: 'ajax/selectpage', | ||
145 | }); | 118 | }); |
146 | }); | 119 | }); |
147 | } | 120 | } |
@@ -156,74 +129,6 @@ define(['jquery', 'bootstrap', 'backend', 'toastr', 'upload', 'validator'], func | @@ -156,74 +129,6 @@ define(['jquery', 'bootstrap', 'backend', 'toastr', 'upload', 'validator'], func | ||
156 | }); | 129 | }); |
157 | } | 130 | } |
158 | 131 | ||
159 | - if ($(".typeahead").size() > 0 || $(".tagsinput").size() > 0) { | ||
160 | - require(['bloodhound'], function () { | ||
161 | - var remotesource = function (input) { | ||
162 | - var url = $(input).data("url") ? $(input).data("url") : "ajax/typeahead"; | ||
163 | - return new Bloodhound({ | ||
164 | - datumTokenizer: Bloodhound.tokenizers.obj.whitespace('name'), | ||
165 | - queryTokenizer: Bloodhound.tokenizers.whitespace, | ||
166 | - remote: { | ||
167 | - url: url + '?search=%QUERY&field=' + $(input).attr("name"), | ||
168 | - wildcard: '%QUERY', | ||
169 | - transform: function (ret) { | ||
170 | - return ret.data.searchlist; | ||
171 | - } | ||
172 | - } | ||
173 | - }); | ||
174 | - }; | ||
175 | - | ||
176 | - //绑定typeahead事件 | ||
177 | - if ($(".typeahead", form).size() > 0) { | ||
178 | - require(['typeahead'], function () { | ||
179 | - $(".typeahead", form).each(function () { | ||
180 | - $(this).typeahead({ | ||
181 | - hint: true, | ||
182 | - highlight: true, | ||
183 | - minLength: 0 | ||
184 | - }, { | ||
185 | - name: 'typeahead', | ||
186 | - limit: 20, | ||
187 | - displayKey: 'id', | ||
188 | - source: remotesource(this), | ||
189 | - templates: { | ||
190 | - empty: '<li class="notfound">' + __('No matches found') + '</li>', | ||
191 | - suggestion: function (item) { | ||
192 | - return '<li>' + item.name + '</li>'; | ||
193 | - } | ||
194 | - } | ||
195 | - }); | ||
196 | - }); | ||
197 | - }); | ||
198 | - } | ||
199 | - | ||
200 | - //绑定tagsinput事件 | ||
201 | - if ($(".tagsinput", form).size() > 0) { | ||
202 | - require(['bootstrap-tagsinput'], function () { | ||
203 | - $('.tagsinput', form).each(function () { | ||
204 | - $(this).tagsinput({ | ||
205 | - freeInput: false, | ||
206 | - itemValue: 'id', | ||
207 | - itemText: 'name', | ||
208 | - typeaheadjs: { | ||
209 | - name: 'tagsinput', | ||
210 | - limit: 20, | ||
211 | - displayKey: 'name', | ||
212 | - source: remotesource(this), | ||
213 | - templates: { | ||
214 | - empty: '<li class="notfound">' + __('No matches found') + '</li>', | ||
215 | - suggestion: function (item) { | ||
216 | - return '<li>' + item.name + '</li>'; | ||
217 | - } | ||
218 | - } | ||
219 | - } | ||
220 | - }); | ||
221 | - }); | ||
222 | - }); | ||
223 | - } | ||
224 | - }); | ||
225 | - } | ||
226 | - | ||
227 | //绑定日期时间元素事件 | 132 | //绑定日期时间元素事件 |
228 | if ($(".datetimepicker", form).size() > 0) { | 133 | if ($(".datetimepicker", form).size() > 0) { |
229 | require(['bootstrap-datetimepicker'], function () { | 134 | require(['bootstrap-datetimepicker'], function () { |
@@ -23,8 +23,6 @@ require.config({ | @@ -23,8 +23,6 @@ require.config({ | ||
23 | 'jquery': '../libs/jquery/dist/jquery.min', | 23 | 'jquery': '../libs/jquery/dist/jquery.min', |
24 | 'bootstrap': '../libs/bootstrap/dist/js/bootstrap.min', | 24 | 'bootstrap': '../libs/bootstrap/dist/js/bootstrap.min', |
25 | 'bootstrap-validator': '../libs/bootstrap-validator/dist/validator.min', | 25 | 'bootstrap-validator': '../libs/bootstrap-validator/dist/validator.min', |
26 | - 'bootstrap-typeahead': '../libs/bootstrap3-typeahead/bootstrap3-typeahead.min', | ||
27 | - 'bootstrap-tagsinput': '../libs/bootstrap-tagsinput/dist/bootstrap-tagsinput.min', | ||
28 | 'bootstrap-dialog': '../libs/bootstrap3-dialog/dist/js/bootstrap-dialog.min', | 26 | 'bootstrap-dialog': '../libs/bootstrap3-dialog/dist/js/bootstrap-dialog.min', |
29 | 'bootstrap-datetimepicker': '../libs/eonasdan-bootstrap-datetimepicker/build/js/bootstrap-datetimepicker.min', | 27 | 'bootstrap-datetimepicker': '../libs/eonasdan-bootstrap-datetimepicker/build/js/bootstrap-datetimepicker.min', |
30 | 'bootstrap-select': '../libs/bootstrap-select/dist/js/bootstrap-select.min', | 28 | 'bootstrap-select': '../libs/bootstrap-select/dist/js/bootstrap-select.min', |
@@ -32,8 +30,6 @@ require.config({ | @@ -32,8 +30,6 @@ require.config({ | ||
32 | 'bootstrap-table-export': '../libs/bootstrap-table/dist/extensions/export/bootstrap-table-export.min', | 30 | 'bootstrap-table-export': '../libs/bootstrap-table/dist/extensions/export/bootstrap-table-export.min', |
33 | 'bootstrap-table-mobile': '../libs/bootstrap-table/dist/extensions/mobile/bootstrap-table-mobile', | 31 | 'bootstrap-table-mobile': '../libs/bootstrap-table/dist/extensions/mobile/bootstrap-table-mobile', |
34 | 'bootstrap-table-lang': '../libs/bootstrap-table/dist/locale/bootstrap-table-zh-CN', | 32 | 'bootstrap-table-lang': '../libs/bootstrap-table/dist/locale/bootstrap-table-zh-CN', |
35 | - 'typeahead': '../libs/typeahead.js/dist/typeahead.jquery.min', | ||
36 | - 'bloodhound': '../libs/typeahead.js/dist/bloodhound.min', | ||
37 | 'tableexport': '../libs/tableExport.jquery.plugin/tableExport.min', | 33 | 'tableexport': '../libs/tableExport.jquery.plugin/tableExport.min', |
38 | 'dropzone': '../libs/dropzone/dist/min/dropzone-amd-module.min', | 34 | 'dropzone': '../libs/dropzone/dist/min/dropzone-amd-module.min', |
39 | 'less': '../libs/less/dist/less.min', | 35 | 'less': '../libs/less/dist/less.min', |
@@ -90,12 +86,6 @@ require.config({ | @@ -90,12 +86,6 @@ require.config({ | ||
90 | deps: ['bootstrap', 'slimscroll'], | 86 | deps: ['bootstrap', 'slimscroll'], |
91 | exports: '$.AdminLTE' | 87 | exports: '$.AdminLTE' |
92 | }, | 88 | }, |
93 | - 'typeahead': { | ||
94 | - deps: ['jquery'], | ||
95 | - init: function ($) { | ||
96 | - return require.s.contexts._.registry['typeahead.js'].factory($); | ||
97 | - } | ||
98 | - }, | ||
99 | 'crontab': ['../libs/jqcron/src/jqCron', 'css!../libs/jqcron/src/jqCron.css'], | 89 | 'crontab': ['../libs/jqcron/src/jqCron', 'css!../libs/jqcron/src/jqCron.css'], |
100 | 'bootstrap-checkbox': ['jquery'], | 90 | 'bootstrap-checkbox': ['jquery'], |
101 | 'bootstrap-radio': ['jquery'], | 91 | 'bootstrap-radio': ['jquery'], |
@@ -105,12 +95,6 @@ require.config({ | @@ -105,12 +95,6 @@ require.config({ | ||
105 | 'css!../libs/eonasdan-bootstrap-datetimepicker/build/css/bootstrap-datetimepicker.min.css', | 95 | 'css!../libs/eonasdan-bootstrap-datetimepicker/build/css/bootstrap-datetimepicker.min.css', |
106 | 'moment/locale/zh-cn', | 96 | 'moment/locale/zh-cn', |
107 | ], | 97 | ], |
108 | - 'bootstrap-tagsinput': [ | ||
109 | - 'css!../libs/bootstrap-tagsinput/dist/bootstrap-tagsinput-typeahead.css', | ||
110 | - 'css!../libs/bootstrap-tagsinput/dist/bootstrap-tagsinput.css', | ||
111 | - 'jquery', | ||
112 | - 'typeahead' | ||
113 | - ], | ||
114 | 'bootstrap-select': ['css!../libs/bootstrap-select/dist/css/bootstrap-select.min.css', ], | 98 | 'bootstrap-select': ['css!../libs/bootstrap-select/dist/css/bootstrap-select.min.css', ], |
115 | 'summernote': ['../libs/summernote/dist/summernote.min', 'css!../libs/summernote/dist/summernote.css'], | 99 | 'summernote': ['../libs/summernote/dist/summernote.min', 'css!../libs/summernote/dist/summernote.css'], |
116 | // 'toastr': ['css!../libs/toastr/toastr.min.css'], | 100 | // 'toastr': ['css!../libs/toastr/toastr.min.css'], |
@@ -37,8 +37,6 @@ require.config({ | @@ -37,8 +37,6 @@ require.config({ | ||
37 | 'jquery': '../libs/jquery/dist/jquery.min', | 37 | 'jquery': '../libs/jquery/dist/jquery.min', |
38 | 'bootstrap': '../libs/bootstrap/dist/js/bootstrap.min', | 38 | 'bootstrap': '../libs/bootstrap/dist/js/bootstrap.min', |
39 | 'bootstrap-validator': '../libs/bootstrap-validator/dist/validator.min', | 39 | 'bootstrap-validator': '../libs/bootstrap-validator/dist/validator.min', |
40 | - 'bootstrap-typeahead': '../libs/bootstrap3-typeahead/bootstrap3-typeahead.min', | ||
41 | - 'bootstrap-tagsinput': '../libs/bootstrap-tagsinput/dist/bootstrap-tagsinput.min', | ||
42 | 'bootstrap-dialog': '../libs/bootstrap3-dialog/dist/js/bootstrap-dialog.min', | 40 | 'bootstrap-dialog': '../libs/bootstrap3-dialog/dist/js/bootstrap-dialog.min', |
43 | 'bootstrap-datetimepicker': '../libs/eonasdan-bootstrap-datetimepicker/build/js/bootstrap-datetimepicker.min', | 41 | 'bootstrap-datetimepicker': '../libs/eonasdan-bootstrap-datetimepicker/build/js/bootstrap-datetimepicker.min', |
44 | 'bootstrap-select': '../libs/bootstrap-select/dist/js/bootstrap-select.min', | 42 | 'bootstrap-select': '../libs/bootstrap-select/dist/js/bootstrap-select.min', |
@@ -46,8 +44,6 @@ require.config({ | @@ -46,8 +44,6 @@ require.config({ | ||
46 | 'bootstrap-table-export': '../libs/bootstrap-table/dist/extensions/export/bootstrap-table-export.min', | 44 | 'bootstrap-table-export': '../libs/bootstrap-table/dist/extensions/export/bootstrap-table-export.min', |
47 | 'bootstrap-table-mobile': '../libs/bootstrap-table/dist/extensions/mobile/bootstrap-table-mobile', | 45 | 'bootstrap-table-mobile': '../libs/bootstrap-table/dist/extensions/mobile/bootstrap-table-mobile', |
48 | 'bootstrap-table-lang': '../libs/bootstrap-table/dist/locale/bootstrap-table-zh-CN', | 46 | 'bootstrap-table-lang': '../libs/bootstrap-table/dist/locale/bootstrap-table-zh-CN', |
49 | - 'typeahead': '../libs/typeahead.js/dist/typeahead.jquery.min', | ||
50 | - 'bloodhound': '../libs/typeahead.js/dist/bloodhound.min', | ||
51 | 'tableexport': '../libs/tableExport.jquery.plugin/tableExport.min', | 47 | 'tableexport': '../libs/tableExport.jquery.plugin/tableExport.min', |
52 | 'dropzone': '../libs/dropzone/dist/min/dropzone-amd-module.min', | 48 | 'dropzone': '../libs/dropzone/dist/min/dropzone-amd-module.min', |
53 | 'less': '../libs/less/dist/less.min', | 49 | 'less': '../libs/less/dist/less.min', |
@@ -104,12 +100,6 @@ require.config({ | @@ -104,12 +100,6 @@ require.config({ | ||
104 | deps: ['bootstrap', 'slimscroll'], | 100 | deps: ['bootstrap', 'slimscroll'], |
105 | exports: '$.AdminLTE' | 101 | exports: '$.AdminLTE' |
106 | }, | 102 | }, |
107 | - 'typeahead': { | ||
108 | - deps: ['jquery'], | ||
109 | - init: function ($) { | ||
110 | - return require.s.contexts._.registry['typeahead.js'].factory($); | ||
111 | - } | ||
112 | - }, | ||
113 | 'crontab': ['../libs/jqcron/src/jqCron', 'css!../libs/jqcron/src/jqCron.css'], | 103 | 'crontab': ['../libs/jqcron/src/jqCron', 'css!../libs/jqcron/src/jqCron.css'], |
114 | 'bootstrap-checkbox': ['jquery'], | 104 | 'bootstrap-checkbox': ['jquery'], |
115 | 'bootstrap-radio': ['jquery'], | 105 | 'bootstrap-radio': ['jquery'], |
@@ -119,12 +109,6 @@ require.config({ | @@ -119,12 +109,6 @@ require.config({ | ||
119 | 'css!../libs/eonasdan-bootstrap-datetimepicker/build/css/bootstrap-datetimepicker.min.css', | 109 | 'css!../libs/eonasdan-bootstrap-datetimepicker/build/css/bootstrap-datetimepicker.min.css', |
120 | 'moment/locale/zh-cn', | 110 | 'moment/locale/zh-cn', |
121 | ], | 111 | ], |
122 | - 'bootstrap-tagsinput': [ | ||
123 | - 'css!../libs/bootstrap-tagsinput/dist/bootstrap-tagsinput-typeahead.css', | ||
124 | - 'css!../libs/bootstrap-tagsinput/dist/bootstrap-tagsinput.css', | ||
125 | - 'jquery', | ||
126 | - 'typeahead' | ||
127 | - ], | ||
128 | 'bootstrap-select': ['css!../libs/bootstrap-select/dist/css/bootstrap-select.min.css', ], | 112 | 'bootstrap-select': ['css!../libs/bootstrap-select/dist/css/bootstrap-select.min.css', ], |
129 | 'summernote': ['../libs/summernote/dist/summernote.min', 'css!../libs/summernote/dist/summernote.css'], | 113 | 'summernote': ['../libs/summernote/dist/summernote.min', 'css!../libs/summernote/dist/summernote.css'], |
130 | // 'toastr': ['css!../libs/toastr/toastr.min.css'], | 114 | // 'toastr': ['css!../libs/toastr/toastr.min.css'], |
@@ -271,14 +271,16 @@ define(['jquery', 'bootstrap', 'backend', 'toastr', 'moment', 'bootstrap-table', | @@ -271,14 +271,16 @@ define(['jquery', 'bootstrap', 'backend', 'toastr', 'moment', 'bootstrap-table', | ||
271 | //渲染fontawesome图标 | 271 | //渲染fontawesome图标 |
272 | return '<i class="' + value + '"></i> ' + value; | 272 | return '<i class="' + value + '"></i> ' + value; |
273 | }, | 273 | }, |
274 | - image: function (value, row, index) { | ||
275 | - return '<img class="img-rounded img-sm" src="' + Backend.api.cdnurl(value) + '" />'; | 274 | + image: function (value, row, index, custom) { |
275 | + var classname = typeof custom !== 'undefined' ? custom : 'img-rounded img-sm'; | ||
276 | + return '<img class="' + classname + '" src="' + Backend.api.cdnurl(value) + '" />'; | ||
276 | }, | 277 | }, |
277 | - images: function (value, row, index) { | 278 | + images: function (value, row, index, custom) { |
279 | + var classname = typeof custom !== 'undefined' ? custom : 'img-rounded img-sm'; | ||
278 | var arr = value.split(','); | 280 | var arr = value.split(','); |
279 | var html = []; | 281 | var html = []; |
280 | $.each(arr, function (i, value) { | 282 | $.each(arr, function (i, value) { |
281 | - html.push('<img class="img-rounded img-sm" src="' + Backend.api.cdnurl(value) + '" />'); | 283 | + html.push('<img class="' + classname + '" src="' + Backend.api.cdnurl(value) + '" />'); |
282 | }); | 284 | }); |
283 | return html.join(' '); | 285 | return html.join(' '); |
284 | }, | 286 | }, |
@@ -343,7 +345,6 @@ define(['jquery', 'bootstrap', 'backend', 'toastr', 'moment', 'bootstrap-table', | @@ -343,7 +345,6 @@ define(['jquery', 'bootstrap', 'backend', 'toastr', 'moment', 'bootstrap-table', | ||
343 | var html = []; | 345 | var html = []; |
344 | if (showweigh) | 346 | if (showweigh) |
345 | html.push('<a href="javascript:;" class="btn btn-primary btn-dragsort btn-xs"><i class="fa fa-arrows"></i></a>'); | 347 | html.push('<a href="javascript:;" class="btn btn-primary btn-dragsort btn-xs"><i class="fa fa-arrows"></i></a>'); |
346 | - | ||
347 | if (showedit) | 348 | if (showedit) |
348 | html.push('<a href="javascript:;" class="btn btn-success btn-editone btn-xs"><i class="fa fa-pencil"></i></a>'); | 349 | html.push('<a href="javascript:;" class="btn btn-success btn-editone btn-xs"><i class="fa fa-pencil"></i></a>'); |
349 | if (showdel) | 350 | if (showdel) |
@@ -14,6 +14,7 @@ | @@ -14,6 +14,7 @@ | ||
14 | @import url("../libs/bootstrap-table/dist/bootstrap-table.min.css"); | 14 | @import url("../libs/bootstrap-table/dist/bootstrap-table.min.css"); |
15 | @import url("../libs/eonasdan-bootstrap-datetimepicker/build/css/bootstrap-datetimepicker.min.css"); | 15 | @import url("../libs/eonasdan-bootstrap-datetimepicker/build/css/bootstrap-datetimepicker.min.css"); |
16 | @import url("../libs/nice-validator/dist/jquery.validator.css"); | 16 | @import url("../libs/nice-validator/dist/jquery.validator.css"); |
17 | +@import url("../libs/selectpage/selectpage.css"); | ||
17 | 18 | ||
18 | .clearfix() { | 19 | .clearfix() { |
19 | &:before, | 20 | &:before, |
selectpage.min.js
0 → 100644
-
请 注册 或 登录 后发表评论