审查视图

public/assets/js/require-form.js 22.6 KB
1
define(['jquery', 'bootstrap', 'upload', 'validator'], function ($, undefined, Upload, Validator) {
Karson authored
2 3
    var Form = {
        config: {
4
            fieldlisttpl: '<dd class="form-inline"><input type="text" name="<%=name%>[<%=index%>][key]" class="form-control" value="<%=row.key%>" size="10" /> <input type="text" name="<%=name%>[<%=index%>][value]" class="form-control" value="<%=row.value%>" size="30" /> <span class="btn btn-sm btn-danger btn-remove"><i class="fa fa-times"></i></span> <span class="btn btn-sm btn-primary btn-dragsort"><i class="fa fa-arrows"></i></span></dd>'
Karson authored
5
        },
Karson authored
6 7
        events: {
            validator: function (form, success, error, submit) {
Karson authored
8 9
                if (!form.is("form"))
                    return;
10
                //绑定表单事件
11
                form.validator($.extend({
12 13 14 15 16 17
                    validClass: 'has-success',
                    invalidClass: 'has-error',
                    bindClassTo: '.form-group',
                    formClass: 'n-default n-bootstrap',
                    msgClass: 'n-right',
                    stopOnError: true,
18 19 20
                    display: function (elem) {
                        return $(elem).closest('.form-group').find(".control-label").text().replace(/\:/, '');
                    },
21 22 23 24 25 26 27
                    dataFilter: function (data) {
                        if (data.code === 1) {
                            return "";
                        } else {
                            return data.msg;
                        }
                    },
28
                    target: function (input) {
29 30 31 32
                        var target = $(input).data("target");
                        if (target && $(target).size() > 0) {
                            return $(target);
                        }
33
                        var $formitem = $(input).closest('.form-group'),
34
                            $msgbox = $formitem.find('span.msg-box');
35
                        if (!$msgbox.length) {
36
                            return [];
37 38 39
                        }
                        return $msgbox;
                    },
40
                    valid: function (ret) {
Karson authored
41 42 43
                        var that = this, submitBtn = $(".layer-footer [type=submit]", form);
                        that.holdSubmit();
                        $(".layer-footer [type=submit]", form).addClass("disabled");
Karson authored
44
                        //验证通过提交表单
Karson authored
45
                        Form.api.submit($(ret), function (data, ret) {
Karson authored
46 47
                            that.holdSubmit(false);
                            submitBtn.removeClass("disabled");
48 49 50
                            if (false === $(this).triggerHandler("success.form", [data, ret])) {
                                return false;
                            }
Karson authored
51
                            if (typeof success === 'function') {
52
                                if (false === success.call($(this), data, ret)) {
Karson authored
53 54 55 56
                                    return false;
                                }
                            }
                            //提示及关闭当前窗口
Karson authored
57 58
                            var msg = ret.hasOwnProperty("msg") && ret.msg !== "" ? ret.msg : __('Operation completed');
                            parent.Toastr.success(msg);
Karson authored
59 60 61
                            parent.$(".btn-refresh").trigger("click");
                            var index = parent.Layer.getFrameIndex(window.name);
                            parent.Layer.close(index);
Karson authored
62
                            return false;
Karson authored
63 64
                        }, function (data, ret) {
                            that.holdSubmit(false);
65 66 67
                            if (false === $(this).triggerHandler("error.form", [data, ret])) {
                                return false;
                            }
Karson authored
68 69
                            submitBtn.removeClass("disabled");
                            if (typeof error === 'function') {
70
                                if (false === error.call($(this), data, ret)) {
Karson authored
71 72 73 74
                                    return false;
                                }
                            }
                        }, submit);
Karson authored
75 76
                        return false;
                    }
77
                }, form.data("validator-options") || {}));
Karson authored
78
79
                //移除提交按钮的disabled类
Karson authored
80
                $(".layer-footer [type=submit],.fixed-footer [type=submit],.normal-footer [type=submit]", form).removeClass("disabled");
Karson authored
81 82
            },
            selectpicker: function (form) {
Karson authored
83 84
                //绑定select元素事件
                if ($(".selectpicker", form).size() > 0) {
85
                    require(['bootstrap-select', 'bootstrap-select-lang'], function () {
Karson authored
86 87 88
                        $('.selectpicker', form).selectpicker();
                    });
                }
Karson authored
89 90
            },
            selectpage: function (form) {
Karson authored
91 92 93 94
                //绑定selectpage元素事件
                if ($(".selectpage", form).size() > 0) {
                    require(['selectpage'], function () {
                        $('.selectpage', form).selectPage({
95 96 97 98 99
                            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;
                            }
100
                        });
Karson authored
101
                    });
102
                    //给隐藏的元素添加上validate验证触发事件
103
                    $(document).on("change", ".sp_hidden", function () {
104 105
                        $(this).trigger("validate");
                    });
106 107 108 109 110 111 112 113
                    $(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);
                    });
Karson authored
114
                }
Karson authored
115 116
            },
            cxselect: function (form) {
Karson authored
117
                //绑定cxselect元素事件
Karson authored
118
                if ($("[data-toggle='cxselect']", form).size() > 0) {
Karson authored
119 120 121 122
                    require(['cxselect'], function () {
                        $.cxSelect.defaults.jsonName = 'name';
                        $.cxSelect.defaults.jsonValue = 'value';
                        $.cxSelect.defaults.jsonSpace = 'data';
Karson authored
123
                        $("[data-toggle='cxselect']", form).cxSelect();
Karson authored
124 125
                    });
                }
Karson authored
126 127 128 129
            },
            citypicker: function (form) {
                //绑定城市远程插件
                if ($("[data-toggle='city-picker']", form).size() > 0) {
130 131
                    require(['citypicker'], function () {
                    });
Karson authored
132 133 134
                }
            },
            datetimepicker: function (form) {
Karson authored
135 136 137
                //绑定日期时间元素事件
                if ($(".datetimepicker", form).size() > 0) {
                    require(['bootstrap-datetimepicker'], function () {
Karson authored
138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
                        var options = {
                            format: 'YYYY-MM-DD HH:mm:ss',
                            icons: {
                                time: 'fa fa-clock-o',
                                date: 'fa fa-calendar',
                                up: 'fa fa-chevron-up',
                                down: 'fa fa-chevron-down',
                                previous: 'fa fa-chevron-left',
                                next: 'fa fa-chevron-right',
                                today: 'fa fa-history',
                                clear: 'fa fa-trash',
                                close: 'fa fa-remove'
                            },
                            showTodayButton: true,
                            showClose: true
                        };
Karson authored
154
                        $('.datetimepicker', form).parent().css('position', 'relative');
Karson authored
155
                        $('.datetimepicker', form).datetimepicker(options);
Karson authored
156 157
                    });
                }
Karson authored
158
            },
159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
            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);
                        });
                    });
                }
            },
Karson authored
201
            plupload: function (form) {
Karson authored
202 203
                //绑定plupload上传元素事件
                if ($(".plupload", form).size() > 0) {
Karson authored
204
                    Upload.api.plupload($(".plupload", form));
Karson authored
205
                }
Karson authored
206 207
            },
            faselect: function (form) {
208 209
                //绑定fachoose选择附件事件
                if ($(".fachoose", form).size() > 0) {
Karson authored
210
                    $(".fachoose", form).on('click', function () {
Karson authored
211
                        var that = this;
212 213
                        var multiple = $(this).data("multiple") ? $(this).data("multiple") : false;
                        var mimetype = $(this).data("mimetype") ? $(this).data("mimetype") : '';
Karson authored
214 215
                        parent.Fast.api.open("general/attachment/select?element_id=" + $(this).attr("id") + "&multiple=" + multiple + "&mimetype=" + mimetype, __('Choose'), {
                            callback: function (data) {
Karson authored
216 217 218 219 220
                                var button = $("#" + $(that).attr("id"));
                                var maxcount = $(button).data("maxcount");
                                var input_id = $(button).data("input-id") ? $(button).data("input-id") : "";
                                maxcount = typeof maxcount !== "undefined" ? maxcount : 0;
                                if (input_id && data.multiple) {
Karson authored
221 222
                                    var urlArr = [];
                                    var inputObj = $("#" + input_id);
Karson authored
223 224
                                    var value = $.trim(inputObj.val());
                                    if (value !== "") {
Karson authored
225 226
                                        urlArr.push(inputObj.val());
                                    }
Karson authored
227 228 229 230 231 232 233 234 235 236 237 238
                                    urlArr.push(data.url)
                                    var result = urlArr.join(",");
                                    if (maxcount > 0) {
                                        var nums = value === '' ? 0 : value.split(/\,/).length;
                                        var files = data.url !== "" ? data.url.split(/\,/) : [];
                                        var remains = maxcount - nums;
                                        if (files.length > remains) {
                                            Toastr.error(__('You can choose up to %d file%s', remains));
                                            return false;
                                        }
                                    }
                                    inputObj.val(result).trigger("change");
Karson authored
239 240 241 242 243
                                } else {
                                    $("#" + input_id).val(data.url).trigger("change");
                                }
                            }
                        });
244 245
                        return false;
                    });
Karson authored
246 247
                }
            },
Karson authored
248
            fieldlist: function (form) {
249
                //绑定fieldlist
Karson authored
250
                if ($(".fieldlist", form).size() > 0) {
251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288
                    require(['dragsort', 'template'], function (undefined, Template) {
                        //刷新隐藏textarea的值
                        var refresh = function (name) {
                            var data = {};
                            var textarea = $("textarea[name='" + name + "']", form);
                            var container = textarea.closest("dl");
                            var template = container.data("template");
                            console.log(name, container);
                            $.each($("input,select", container).serializeArray(), function (i, j) {
                                var reg = /\[(\w+)\]\[(\w+)\]$/g;
                                var match = reg.exec(j.name);
                                if (!match)
                                    return true;
                                match[1] = "x" + parseInt(match[1]);
                                if (typeof data[match[1]] == 'undefined') {
                                    data[match[1]] = {};
                                }
                                data[match[1]][match[2]] = j.value;
                            });
                            var result = template ? [] : {};
                            $.each(data, function (i, j) {
                                if (j) {
                                    if (!template) {
                                        if (j.key != '') {
                                            result[j.key] = j.value;
                                        }
                                    } else {
                                        result.push(j);
                                    }
                                }
                            });
                            textarea.val(JSON.stringify(result));
                        };
                        //监听文本框改变事件
                        $(document).on('change keyup', ".fieldlist input,.fieldlist textarea,.fieldlist select", function () {
                            refresh($(this).closest("dl").data("name"));
                        });
                        //追加控制
289
                        $(".fieldlist", form).on("click", ".btn-append,.append", function (e, row) {
290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309
                            var container = $(this).closest("dl");
                            var index = container.data("index");
                            var name = container.data("name");
                            var template = container.data("template");
                            var data = container.data();
                            index = index ? parseInt(index) : 0;
                            container.data("index", index + 1);
                            var row = row ? row : {};
                            var vars = {index: index, name: name, data: data, row: row};
                            var html = template ? Template(template, vars) : Template.render(Form.config.fieldlisttpl, vars);
                            $(html).insertBefore($(this).closest("dd"));
                            $(this).trigger("fa.event.appendfieldlist", $(this).closest("dd").prev());
                        });
                        //移除控制
                        $(".fieldlist", form).on("click", "dd .btn-remove", function () {
                            var container = $(this).closest("dl");
                            $(this).closest("dd").remove();
                            refresh(container.data("name"));
                        });
                        //拖拽排序
Karson authored
310 311
                        $("dl.fieldlist", form).dragsort({
                            itemSelector: 'dd',
312
                            dragSelector: ".btn-dragsort",
Karson authored
313
                            dragEnd: function () {
314
                                refresh($(this).closest("dl").data("name"));
Karson authored
315 316 317
                            },
                            placeHolderTemplate: "<dd></dd>"
                        });
318 319 320 321 322 323 324 325
                        //渲染数据
                        $(".fieldlist", form).each(function () {
                            var container = this;
                            var textarea = $("textarea[name='" + $(this).data("name") + "']", form);
                            if (textarea.val() == '') {
                                return true;
                            }
                            var template = $(this).data("template");
326 327 328 329 330 331 332
                            var json = {};
                            try {
                                json = JSON.parse(textarea.val());
                            } catch (e) {
                            }
                            $.each(json, function (i, j) {
                                $(".btn-append,.append", container).trigger('click', template ? j : {
333 334 335 336 337
                                    key: i,
                                    value: j
                                });
                            });
                        });
Karson authored
338 339 340
                    });
                }
            },
Karson authored
341
            bindevent: function (form) {
342
Karson authored
343 344 345 346 347 348 349
            }
        },
        api: {
            submit: function (form, success, error, submit) {
                if (form.size() === 0)
                    return Toastr.error("表单未初始化完成,无法提交");
                if (typeof submit === 'function') {
350
                    if (false === submit.call(form)) {
Karson authored
351 352
                        return false;
                    }
353
                }
Karson authored
354 355 356 357
                var type = form.attr("method").toUpperCase();
                type = type && (type === 'GET' || type === 'POST') ? type : 'GET';
                url = form.attr("action");
                url = url ? url : location.href;
358 359
                //修复当存在多选项元素时提交的BUG
                var params = {};
360
                var multipleList = $("[name$='[]']", form);
361 362 363 364 365 366 367 368 369 370
                if (multipleList.size() > 0) {
                    var postFields = form.serializeArray().map(function (obj) {
                        return $(obj).prop("name");
                    });
                    $.each(multipleList, function (i, j) {
                        if (postFields.indexOf($(this).prop("name")) < 0) {
                            params[$(this).prop("name")] = '';
                        }
                    });
                }
Karson authored
371 372 373 374
                //调用Ajax请求方法
                Fast.api.ajax({
                    type: type,
                    url: url,
375
                    data: form.serialize() + (Object.keys(params).length > 0 ? '&' + $.param(params) : ''),
376 377 378 379 380 381 382
                    dataType: 'json',
                    complete: function (xhr) {
                        var token = xhr.getResponseHeader('__token__');
                        if (token) {
                            $("input[name='__token__']", form).val(token);
                        }
                    }
Karson authored
383 384
                }, function (data, ret) {
                    $('.form-group', form).removeClass('has-feedback has-success has-error');
385 386 387 388 389 390 391 392 393
                    if (data && typeof data === 'object') {
                        //刷新客户端token
                        if (typeof data.token !== 'undefined') {
                            $("input[name='__token__']", form).val(data.token);
                        }
                        //调用客户端事件
                        if (typeof data.callback !== 'undefined' && typeof data.callback === 'function') {
                            data.callback.call(form, data);
                        }
Karson authored
394 395
                    }
                    if (typeof success === 'function') {
396
                        if (false === success.call(form, data, ret)) {
Karson authored
397 398 399 400 401 402 403 404
                            return false;
                        }
                    }
                }, function (data, ret) {
                    if (data && typeof data === 'object' && typeof data.token !== 'undefined') {
                        $("input[name='__token__']", form).val(data.token);
                    }
                    if (typeof error === 'function') {
405
                        if (false === error.call(form, data, ret)) {
Karson authored
406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423
                            return false;
                        }
                    }
                });
                return false;
            },
            bindevent: function (form, success, error, submit) {

                form = typeof form === 'object' ? form : $(form);

                var events = Form.events;

                events.bindevent(form);

                events.validator(form, success, error, submit);

                events.selectpicker(form);
424 425
                events.daterangepicker(form);
Karson authored
426 427 428 429 430 431 432 433 434 435 436
                events.selectpage(form);

                events.cxselect(form);

                events.citypicker(form);

                events.datetimepicker(form);

                events.plupload(form);

                events.faselect(form);
Karson authored
437 438

                events.fieldlist(form);
Karson authored
439 440 441 442 443 444
            },
            custom: {}
        },
    };
    return Form;
});