Browse Source

新增daterangepicker插件
新增operate的RANGE值配置
修复后台删除时的错误
优化语言包

Karson 7 years ago
parent
commit
c29e0accc7

+ 10 - 0
application/admin/lang/zh-cn.php

@@ -29,7 +29,17 @@ return [
     'Article'                                               => '文章',
     'Page'                                                  => '单页',
     'OK'                                                    => '确定',
+    'Apply'                                                 => '应用',
     'Cancel'                                                => '取消',
+    'Clear'                                                 => '清空',
+    'Custom Range'                                          => '自定义',
+    'Cancel'                                                => '取消',
+    'Today'                                                 => '今天',
+    'Yesterday'                                             => '昨天',
+    'Last 7 days'                                           => '最近7天',
+    'Last 30 days'                                          => '最近30天',
+    'Last month'                                            => '上月',
+    'This month'                                            => '本月',
     'Loading'                                               => '加载中',
     'More'                                                  => '更多',
     'Yes'                                                   => '是',

+ 1 - 1
application/admin/library/traits/Backend.php

@@ -154,7 +154,7 @@ trait Backend
             }
             else
             {
-                $count = $this->model->destory($ids);
+                $count = $this->model->destroy($ids);
             }
             if ($count)
             {

+ 8 - 0
application/common/controller/Backend.php

@@ -300,6 +300,14 @@ class Backend extends Controller
                     }
                     $where[] = [$k, $sym, $arr];
                     break;
+                case 'RANGE':
+                case 'NOT RANGE':
+                    $v = str_replace(' - ', ',', $v);
+                    $arr = array_slice(explode(',', $v), 0, 2);
+                    if (stripos($v, ',') === false || !array_filter($arr))
+                        continue;
+                    $where[] = [$k, str_replace('RANGE', 'BETWEEN', $sym) . ' time', $arr];
+                    break;
                 case 'LIKE':
                 case 'LIKE %...%':
                     $where[] = [$k, 'LIKE', "%{$v}%"];

+ 2 - 1
bower.json

@@ -30,7 +30,8 @@
     "Sortable": "^1.5.0",
     "nice-validator": "^1.1.1",
     "art-template": "^3.0.1",
-    "requirejs-plugins": "^1.0.3"
+    "requirejs-plugins": "^1.0.3",
+    "bootstrap-daterangepicker": "^2.1.25"
   },
   "devDependencies": {
     "dragsort": "https://github.com/karsonzhang/dragsort.git",

+ 7 - 0
public/assets/css/backend.css

@@ -7,6 +7,7 @@
 @import url("../libs/layer/build/skin/default/layer.css");
 @import url("../libs/bootstrap-table/dist/bootstrap-table.min.css");
 @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");
 body {
@@ -77,6 +78,12 @@ html.ios-fix body {
   height: 100%;
   width: 100%;
 }
+.row-between .col-xs-6 + .col-xs-6:before {
+  content: "-";
+  position: absolute;
+  left: -2%;
+  top: 6px;
+}
 @media only screen and (min-width: 481px) {
   .row-flex {
     display: flex;

File diff suppressed because it is too large
+ 1 - 1
public/assets/css/backend.min.css


+ 46 - 18
public/assets/js/bootstrap-table-commonsearch.js

@@ -3,7 +3,7 @@
  * @version: v0.0.1
  *
  * @update 2017-05-07 <http://git.oschina.net/pp/fastadmin>
- * @update 2017-09-09 <http://git.oschina.net/karson/fastadmin>
+ * @update 2017-09-17 <http://git.oschina.net/karson/fastadmin>
  */
 
 !function ($) {
@@ -46,6 +46,46 @@
                 });
             });
         }
+        if ($(".datetimerange", form).size() > 0) {
+            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 callback = function (start, end) {
+                $(this.element).val(start.format(options.locale.format) + " - " + end.format(options.locale.format));
+            };
+            var column, index;
+            require(['bootstrap-daterangepicker'], function () {
+                $(".datetimerange").each(function () {
+                    $(this).on('apply.daterangepicker', function (ev, picker) {
+                        callback.call(picker, picker.startDate, picker.endDate);
+                    });
+                    $(this).on('cancel.daterangepicker', function (ev, picker) {
+                        $(this).val('');
+                    });
+                    index = $(this).data("index");
+                    column = pColumns[index];
+                    $(this).daterangepicker($.extend({}, options, column.options || {}), callback);
+                });
+            });
+        }
 
         // 表单提交
         form.on("submit", function (event) {
@@ -64,7 +104,7 @@
 
     var createFormCommon = function (pColumns, that) {
         var htmlForm = [];
-        var opList = ['=', '>', '>=', '<', '<=', '!=', 'LIKE', 'LIKE %...%', 'NOT LIKE', 'IN', 'NOT IN', 'IN(...)', 'NOT IN(...)', 'BETWEEN', 'NOT BETWEEN', 'IS NULL', 'IS NOT NULL'];
+        var opList = ['=', '>', '>=', '<', '<=', '!=', 'LIKE', 'LIKE %...%', 'NOT LIKE', 'IN', 'NOT IN', 'IN(...)', 'NOT IN(...)', 'BETWEEN', 'NOT BETWEEN', 'RANGE', 'NOT RANGE', 'IS NULL', 'IS NOT NULL'];
         htmlForm.push(sprintf('<form class="form-horizontal form-commonsearch" action="%s" >', that.options.actionForm));
         htmlForm.push('<fieldset>');
         if (that.options.titleForm.length > 0)
@@ -130,16 +170,12 @@
                     var defaultValue = typeof vObjCol.defaultValue === 'undefined' ? '' : vObjCol.defaultValue;
                     if (/BETWEEN$/.test(vObjCol.operate)) {
                         var defaultValueArr = /^.+|.+$/.test(defaultValue) ? defaultValue.split('|') : ['', ''];
-                        htmlForm.push(sprintf('<input type="%s" class="%s" name="%s" value="%s" placeholder="%s" id="%s" %s %s>', type, addclass, vObjCol.field, defaultValueArr[0], placeholder, vObjCol.field, style, data));
-
-                        htmlForm.push('</div>');
+                        htmlForm.push('<div class="row row-between">');
+                        htmlForm.push(sprintf('<div class="col-xs-6"><input type="%s" class="%s" name="%s" value="%s" placeholder="%s" id="%s" data-index="%s" %s %s></div>', type, addclass, vObjCol.field, defaultValueArr[0], placeholder, vObjCol.field, i, style, data));
+                        htmlForm.push(sprintf('<div class="col-xs-6"><input type="%s" class="%s" name="%s" value="%s" placeholder="%s" id="%s" data-index="%s" %s %s></div>', type, addclass, vObjCol.field, defaultValueArr[1], placeholder, vObjCol.field, i, style, data));
                         htmlForm.push('</div>');
-                        htmlForm.push('<div class="form-group col-xs-12 col-sm-6 col-md-4 col-lg-3">');
-                        htmlForm.push(sprintf('<label for="%s" class="control-label col-xs-4">%s</label>', vObjCol.field, "-"));
-                        htmlForm.push('<div class="col-xs-8">');
-                        htmlForm.push(sprintf('<input type="%s" class="%s" name="%s" value="%s" placeholder="%s" id="%s" %s %s>', type, addclass, vObjCol.field, defaultValueArr[1], placeholder, vObjCol.field, style, data));
                     } else {
-                        htmlForm.push(sprintf('<input type="%s" class="%s" name="%s" value="%s" placeholder="%s" id="%s" %s %s>', type, addclass, vObjCol.field, defaultValue, placeholder, vObjCol.field, style, data));
+                        htmlForm.push(sprintf('<input type="%s" class="%s" name="%s" value="%s" placeholder="%s" id="%s" data-index="%s" %s %s>', type, addclass, vObjCol.field, defaultValue, placeholder, vObjCol.field, i, style, data));
                     }
                 }
 
@@ -196,13 +232,6 @@
                         if (typeof vObjCol.process === 'function') {
                             value_begin = vObjCol.process(value_begin, 'begin');
                             value_end = vObjCol.process(value_end, 'end');
-                        } else if ($("[name='" + name + "']:first", that.$commonsearch).attr('type') === 'datetime') { //datetime类型字段转换成时间戳
-                            var Hms = Moment(value_begin).format("HH:mm:ss");
-                            value_begin = value_begin ? parseInt(Moment(value_begin) / 1000) : '';
-                            value_end = value_end ? parseInt(Moment(value_end) / 1000) : '';
-                            if (value_begin === value_end && '00:00:00' === Hms) {
-                                value_end += 86399;
-                            }
                         }
                         value = value_begin + ',' + value_end;
                     } else {
@@ -266,7 +295,6 @@
         'common-search.bs.table': 'onCommonSearch',
         'post-common-search.bs.table': 'onPostCommonSearch'
     });
-
     $.extend($.fn.bootstrapTable.locales[$.fn.bootstrapTable.defaults.locale], {
         formatCommonSearch: function () {
             return "Common search";

+ 1 - 0
public/assets/js/require-backend.js

@@ -26,6 +26,7 @@ require.config({
         'jquery': '../libs/jquery/dist/jquery.min',
         'bootstrap': '../libs/bootstrap/dist/js/bootstrap.min',
         'bootstrap-datetimepicker': '../libs/eonasdan-bootstrap-datetimepicker/build/js/bootstrap-datetimepicker.min',
+        'bootstrap-daterangepicker': '../libs/bootstrap-daterangepicker/daterangepicker',
         'bootstrap-select': '../libs/bootstrap-select/dist/js/bootstrap-select.min',
         'bootstrap-select-lang': '../libs/bootstrap-select/dist/js/i18n/defaults-zh_CN',
         'bootstrap-table': '../libs/bootstrap-table/dist/bootstrap-table.min',

File diff suppressed because it is too large
+ 1674 - 18
public/assets/js/require-backend.min.js


+ 10 - 0
public/assets/less/backend.less

@@ -13,6 +13,7 @@
 @import url("../libs/layer/build/skin/default/layer.css");
 @import url("../libs/bootstrap-table/dist/bootstrap-table.min.css");
 @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");
 
@@ -97,6 +98,15 @@ html.ios-fix,html.ios-fix body {
     }
 }
 
+.row-between{
+    .col-xs-6 + .col-xs-6:before {
+        content: "-";
+        position: absolute;
+        left: -2%;
+        top: 6px;
+    }
+}
+
 @media only screen and (min-width : 481px) {
     .row-flex {
         display: flex;