From efdb99f8cecc4afb592afad79c761081d5d5cf22 Mon Sep 17 00:00:00 2001
From: lee <4766465@qq.com>
Date: Wed, 18 Dec 2024 13:27:00 +0800
Subject: [PATCH] init

---
 xxl-job/xxl-job-admin/src/main/resources/static/js/jobinfo.index.1.js |  739 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 739 insertions(+), 0 deletions(-)

diff --git a/xxl-job/xxl-job-admin/src/main/resources/static/js/jobinfo.index.1.js b/xxl-job/xxl-job-admin/src/main/resources/static/js/jobinfo.index.1.js
new file mode 100644
index 0000000..b479e97
--- /dev/null
+++ b/xxl-job/xxl-job-admin/src/main/resources/static/js/jobinfo.index.1.js
@@ -0,0 +1,739 @@
+$(function() {
+
+	// init date tables
+	var jobTable = $("#job_list").dataTable({
+		"deferRender": true,
+		"processing" : true,
+	    "serverSide": true,
+		"ajax": {
+			url: base_url + "/jobinfo/pageList",
+			type:"post",
+	        data : function ( d ) {
+	        	var obj = {};
+	        	obj.jobGroup = $('#jobGroup').val();
+                obj.triggerStatus = $('#triggerStatus').val();
+                obj.jobDesc = $('#jobDesc').val();
+	        	obj.executorHandler = $('#executorHandler').val();
+                obj.author = $('#author').val();
+	        	obj.start = d.start;
+	        	obj.length = d.length;
+                return obj;
+            }
+	    },
+	    "searching": false,
+	    "ordering": false,
+	    //"scrollX": true,	// scroll x,close self-adaption
+	    "columns": [
+	                {
+	                	"data": 'id',
+						"bSortable": false,
+						"visible" : true,
+						"width":'7%'
+					},
+	                {
+	                	"data": 'jobGroup',
+	                	"visible" : false,
+	                	"render": function ( data, type, row ) {
+	            			var groupMenu = $("#jobGroup").find("option");
+	            			for ( var index in $("#jobGroup").find("option")) {
+	            				if ($(groupMenu[index]).attr('value') == data) {
+									return $(groupMenu[index]).html();
+								}
+							}
+	            			return data;
+	            		}
+            		},
+	                {
+	                	"data": 'jobDesc',
+						"visible" : true,
+						"width":'25%'
+					},
+					{
+						"data": 'scheduleType',
+						"visible" : true,
+						"width":'13%',
+						"render": function ( data, type, row ) {
+							if (row.scheduleConf) {
+								return row.scheduleType + ':'+ row.scheduleConf;
+							} else {
+								return row.scheduleType;
+							}
+						}
+					},
+					{
+						"data": 'glueType',
+						"width":'25%',
+						"visible" : true,
+						"render": function ( data, type, row ) {
+							var glueTypeTitle = findGlueTypeTitle(row.glueType);
+                            if (row.executorHandler) {
+                                return glueTypeTitle +":" + row.executorHandler;
+                            } else {
+                                return glueTypeTitle;
+                            }
+						}
+					},
+	                { "data": 'executorParam', "visible" : false},
+	                {
+	                	"data": 'addTime',
+	                	"visible" : false,
+	                	"render": function ( data, type, row ) {
+	                		return data?moment(new Date(data)).format("YYYY-MM-DD HH:mm:ss"):"";
+	                	}
+	                },
+	                {
+	                	"data": 'updateTime',
+	                	"visible" : false,
+	                	"render": function ( data, type, row ) {
+	                		return data?moment(new Date(data)).format("YYYY-MM-DD HH:mm:ss"):"";
+	                	}
+	                },
+	                { "data": 'author', "visible" : true, "width":'10%'},
+	                { "data": 'alarmEmail', "visible" : false},
+	                {
+	                	"data": 'triggerStatus',
+						"width":'10%',
+	                	"visible" : true,
+	                	"render": function ( data, type, row ) {
+                            // status
+                            if (1 == data) {
+                                return '<small class="label label-success" >RUNNING</small>';
+                            } else {
+                                return '<small class="label label-default" >STOP</small>';
+                            }
+	                		return data;
+	                	}
+	                },
+	                {
+						"data": I18n.system_opt ,
+						"width":'10%',
+	                	"render": function ( data, type, row ) {
+	                		return function(){
+
+                                // status
+                                var start_stop_div = "";
+                                if (1 == row.triggerStatus ) {
+                                    start_stop_div = '<li><a href="javascript:void(0);" class="job_operate" _type="job_pause" >'+ I18n.jobinfo_opt_stop +'</a></li>\n';
+                                } else {
+                                    start_stop_div = '<li><a href="javascript:void(0);" class="job_operate" _type="job_resume" >'+ I18n.jobinfo_opt_start +'</a></li>\n';
+                                }
+
+                                // job_next_time_html
+								var job_next_time_html = '';
+								if (row.scheduleType == 'CRON' || row.scheduleType == 'FIX_RATE') {
+									job_next_time_html = '<li><a href="javascript:void(0);" class="job_next_time" >' + I18n.jobinfo_opt_next_time + '</a></li>\n';
+								}
+
+                                // log url
+                                var logHref = base_url +'/joblog?jobId='+ row.id;
+
+                                // code url
+                                var codeBtn = "";
+                                if ('BEAN' != row.glueType) {
+                                    var codeUrl = base_url +'/jobcode?jobId='+ row.id;
+                                    codeBtn = '<li><a href="'+ codeUrl +'" target="_blank" >GLUE IDE</a></li>\n';
+                                    codeBtn += '<li class="divider"></li>\n';
+                                }
+
+                                // data
+                                tableData['key'+row.id] = row;
+
+                                // opt
+                                var html = '<div class="btn-group">\n' +
+                                    '     <button type="button" class="btn btn-primary btn-sm">'+ I18n.system_opt +'</button>\n' +
+                                    '     <button type="button" class="btn btn-primary btn-sm dropdown-toggle" data-toggle="dropdown">\n' +
+                                    '       <span class="caret"></span>\n' +
+                                    '       <span class="sr-only">Toggle Dropdown</span>\n' +
+                                    '     </button>\n' +
+                                    '     <ul class="dropdown-menu" role="menu" _id="'+ row.id +'" >\n' +
+                                    '       <li><a href="javascript:void(0);" class="job_trigger" >'+ I18n.jobinfo_opt_run +'</a></li>\n' +
+                                    '       <li><a href="'+ logHref +'">'+ I18n.jobinfo_opt_log +'</a></li>\n' +
+                                    '       <li><a href="javascript:void(0);" class="job_registryinfo" >' + I18n.jobinfo_opt_registryinfo + '</a></li>\n' +
+									job_next_time_html +
+                                    '       <li class="divider"></li>\n' +
+                                    codeBtn +
+                                    start_stop_div +
+                                    '       <li><a href="javascript:void(0);" class="update" >'+ I18n.system_opt_edit +'</a></li>\n' +
+                                    '       <li><a href="javascript:void(0);" class="job_operate" _type="job_del" >'+ I18n.system_opt_del +'</a></li>\n' +
+									'       <li><a href="javascript:void(0);" class="job_copy" >'+ I18n.system_opt_copy +'</a></li>\n' +
+                                    '     </ul>\n' +
+                                    '   </div>';
+
+	                			return html;
+							};
+	                	}
+	                }
+	            ],
+		"language" : {
+			"sProcessing" : I18n.dataTable_sProcessing ,
+			"sLengthMenu" : I18n.dataTable_sLengthMenu ,
+			"sZeroRecords" : I18n.dataTable_sZeroRecords ,
+			"sInfo" : I18n.dataTable_sInfo ,
+			"sInfoEmpty" : I18n.dataTable_sInfoEmpty ,
+			"sInfoFiltered" : I18n.dataTable_sInfoFiltered ,
+			"sInfoPostFix" : "",
+			"sSearch" : I18n.dataTable_sSearch ,
+			"sUrl" : "",
+			"sEmptyTable" : I18n.dataTable_sEmptyTable ,
+			"sLoadingRecords" : I18n.dataTable_sLoadingRecords ,
+			"sInfoThousands" : ",",
+			"oPaginate" : {
+				"sFirst" : I18n.dataTable_sFirst ,
+				"sPrevious" : I18n.dataTable_sPrevious ,
+				"sNext" : I18n.dataTable_sNext ,
+				"sLast" : I18n.dataTable_sLast
+			},
+			"oAria" : {
+				"sSortAscending" : I18n.dataTable_sSortAscending ,
+				"sSortDescending" : I18n.dataTable_sSortDescending
+			}
+		}
+	});
+
+    // table data
+    var tableData = {};
+
+	// search btn
+	$('#searchBtn').on('click', function(){
+		jobTable.fnDraw();
+	});
+
+	// jobGroup change
+	$('#jobGroup').on('change', function(){
+        //reload
+        var jobGroup = $('#jobGroup').val();
+        window.location.href = base_url + "/jobinfo?jobGroup=" + jobGroup;
+    });
+
+	// job operate
+	$("#job_list").on('click', '.job_operate',function() {
+		var typeName;
+		var url;
+		var needFresh = false;
+
+		var type = $(this).attr("_type");
+		if ("job_pause" == type) {
+			typeName = I18n.jobinfo_opt_stop ;
+			url = base_url + "/jobinfo/stop";
+			needFresh = true;
+		} else if ("job_resume" == type) {
+			typeName = I18n.jobinfo_opt_start ;
+			url = base_url + "/jobinfo/start";
+			needFresh = true;
+		} else if ("job_del" == type) {
+			typeName = I18n.system_opt_del ;
+			url = base_url + "/jobinfo/remove";
+			needFresh = true;
+		} else {
+			return;
+		}
+
+		var id = $(this).parents('ul').attr("_id");
+
+		layer.confirm( I18n.system_ok + typeName + '?', {
+			icon: 3,
+			title: I18n.system_tips ,
+            btn: [ I18n.system_ok, I18n.system_cancel ]
+		}, function(index){
+			layer.close(index);
+
+			$.ajax({
+				type : 'POST',
+				url : url,
+				data : {
+					"id" : id
+				},
+				dataType : "json",
+				success : function(data){
+					if (data.code == 200) {
+                        layer.msg( typeName + I18n.system_success );
+                        if (needFresh) {
+                            //window.location.reload();
+                            jobTable.fnDraw(false);
+                        }
+					} else {
+                        layer.msg( data.msg || typeName + I18n.system_fail );
+					}
+				}
+			});
+		});
+	});
+
+    // job trigger
+    $("#job_list").on('click', '.job_trigger',function() {
+        var id = $(this).parents('ul').attr("_id");
+        var row = tableData['key'+id];
+
+        $("#jobTriggerModal .form input[name='id']").val( row.id );
+        $("#jobTriggerModal .form textarea[name='executorParam']").val( row.executorParam );
+
+        $('#jobTriggerModal').modal({backdrop: false, keyboard: false}).modal('show');
+    });
+    $("#jobTriggerModal .ok").on('click',function() {
+        $.ajax({
+            type : 'POST',
+            url : base_url + "/jobinfo/trigger",
+            data : {
+                "id" : $("#jobTriggerModal .form input[name='id']").val(),
+                "executorParam" : $("#jobTriggerModal .textarea[name='executorParam']").val(),
+				"addressList" : $("#jobTriggerModal .textarea[name='addressList']").val()
+            },
+            dataType : "json",
+            success : function(data){
+                if (data.code == 200) {
+                    $('#jobTriggerModal').modal('hide');
+
+                    layer.msg( I18n.jobinfo_opt_run + I18n.system_success );
+                } else {
+                    layer.msg( data.msg || I18n.jobinfo_opt_run + I18n.system_fail );
+                }
+            }
+        });
+    });
+    $("#jobTriggerModal").on('hide.bs.modal', function () {
+        $("#jobTriggerModal .form")[0].reset();
+    });
+
+
+    // job registryinfo
+    $("#job_list").on('click', '.job_registryinfo',function() {
+        var id = $(this).parents('ul').attr("_id");
+        var row = tableData['key'+id];
+
+        var jobGroup = row.jobGroup;
+
+        $.ajax({
+            type : 'POST',
+            url : base_url + "/jobgroup/loadById",
+            data : {
+                "id" : jobGroup
+            },
+            dataType : "json",
+            success : function(data){
+
+                var html = '<div>';
+                if (data.code == 200 && data.content.registryList) {
+                    for (var index in data.content.registryList) {
+                        html += (parseInt(index)+1) + '. <span class="badge bg-green" >' + data.content.registryList[index] + '</span><br>';
+                    }
+                }
+                html += '</div>';
+
+                layer.open({
+                    title: I18n.jobinfo_opt_registryinfo ,
+                    btn: [ I18n.system_ok ],
+                    content: html
+                });
+
+            }
+        });
+
+    });
+
+    // job_next_time
+    $("#job_list").on('click', '.job_next_time',function() {
+        var id = $(this).parents('ul').attr("_id");
+        var row = tableData['key'+id];
+
+        $.ajax({
+            type : 'POST',
+            url : base_url + "/jobinfo/nextTriggerTime",
+            data : {
+                "scheduleType" : row.scheduleType,
+				"scheduleConf" : row.scheduleConf
+            },
+            dataType : "json",
+            success : function(data){
+
+            	if (data.code != 200) {
+                    layer.open({
+                        title: I18n.jobinfo_opt_next_time ,
+                        btn: [ I18n.system_ok ],
+                        content: data.msg
+                    });
+				} else {
+                    var html = '<center>';
+                    if (data.code == 200 && data.content) {
+                        for (var index in data.content) {
+                            html += '<span>' + data.content[index] + '</span><br>';
+                        }
+                    }
+                    html += '</center>';
+
+                    layer.open({
+                        title: I18n.jobinfo_opt_next_time ,
+                        btn: [ I18n.system_ok ],
+                        content: html
+                    });
+				}
+
+            }
+        });
+
+    });
+
+	// add
+	$(".add").click(function(){
+
+		// init-cronGen
+        $("#addModal .form input[name='schedule_conf_CRON']").show().siblings().remove();
+        $("#addModal .form input[name='schedule_conf_CRON']").cronGen({});
+
+		// 》init scheduleType
+		$("#updateModal .form select[name=scheduleType]").change();
+
+		// 》init glueType
+		$("#updateModal .form select[name=glueType]").change();
+
+		$('#addModal').modal({backdrop: false, keyboard: false}).modal('show');
+	});
+	var addModalValidate = $("#addModal .form").validate({
+		errorElement : 'span',
+        errorClass : 'help-block',
+        focusInvalid : true,
+        rules : {
+			jobDesc : {
+				required : true,
+				maxlength: 50
+			},
+			author : {
+				required : true
+			}/*,
+            executorTimeout : {
+                digits:true
+            },
+            executorFailRetryCount : {
+                digits:true
+            }*/
+        },
+        messages : {
+            jobDesc : {
+            	required : I18n.system_please_input + I18n.jobinfo_field_jobdesc
+            },
+            author : {
+            	required : I18n.system_please_input + I18n.jobinfo_field_author
+            }/*,
+            executorTimeout : {
+                digits: I18n.system_please_input + I18n.system_digits
+            },
+            executorFailRetryCount : {
+                digits: I18n.system_please_input + I18n.system_digits
+            }*/
+        },
+		highlight : function(element) {
+            $(element).closest('.form-group').addClass('has-error');
+        },
+        success : function(label) {
+            label.closest('.form-group').removeClass('has-error');
+            label.remove();
+        },
+        errorPlacement : function(error, element) {
+            element.parent('div').append(error);
+        },
+        submitHandler : function(form) {
+
+			// process executorTimeout+executorFailRetryCount
+            var executorTimeout = $("#addModal .form input[name='executorTimeout']").val();
+            if(!/^\d+$/.test(executorTimeout)) {
+                executorTimeout = 0;
+			}
+            $("#addModal .form input[name='executorTimeout']").val(executorTimeout);
+            var executorFailRetryCount = $("#addModal .form input[name='executorFailRetryCount']").val();
+            if(!/^\d+$/.test(executorFailRetryCount)) {
+                executorFailRetryCount = 0;
+            }
+            $("#addModal .form input[name='executorFailRetryCount']").val(executorFailRetryCount);
+
+            // process schedule_conf
+			var scheduleType = $("#addModal .form select[name='scheduleType']").val();
+			var scheduleConf;
+			if (scheduleType == 'CRON') {
+				scheduleConf = $("#addModal .form input[name='cronGen_display']").val();
+			} else if (scheduleType == 'FIX_RATE') {
+				scheduleConf = $("#addModal .form input[name='schedule_conf_FIX_RATE']").val();
+			} else if (scheduleType == 'FIX_DELAY') {
+				scheduleConf = $("#addModal .form input[name='schedule_conf_FIX_DELAY']").val();
+			}
+			$("#addModal .form input[name='scheduleConf']").val( scheduleConf );
+
+        	$.post(base_url + "/jobinfo/add",  $("#addModal .form").serialize(), function(data, status) {
+    			if (data.code == "200") {
+					$('#addModal').modal('hide');
+					layer.open({
+						title: I18n.system_tips ,
+                        btn: [ I18n.system_ok ],
+						content: I18n.system_add_suc ,
+						icon: '1',
+						end: function(layero, index){
+							jobTable.fnDraw();
+							//window.location.reload();
+						}
+					});
+    			} else {
+					layer.open({
+						title: I18n.system_tips ,
+                        btn: [ I18n.system_ok ],
+						content: (data.msg || I18n.system_add_fail),
+						icon: '2'
+					});
+    			}
+    		});
+		}
+	});
+	$("#addModal").on('hide.bs.modal', function () {
+        addModalValidate.resetForm();
+		$("#addModal .form")[0].reset();
+		$("#addModal .form .form-group").removeClass("has-error");
+		$(".remote_panel").show();	// remote
+
+		$("#addModal .form input[name='executorHandler']").removeAttr("readonly");
+	});
+
+	// scheduleType change
+	$(".scheduleType").change(function(){
+		var scheduleType = $(this).val();
+		$(this).parents("form").find(".schedule_conf").hide();
+		$(this).parents("form").find(".schedule_conf_" + scheduleType).show();
+
+	});
+
+    // glueType change
+    $(".glueType").change(function(){
+		// executorHandler
+        var $executorHandler = $(this).parents("form").find("input[name='executorHandler']");
+        var glueType = $(this).val();
+        if ('BEAN' != glueType) {
+            $executorHandler.val("");
+            $executorHandler.attr("readonly","readonly");
+        } else {
+            $executorHandler.removeAttr("readonly");
+        }
+    });
+
+	$("#addModal .glueType").change(function(){
+		// glueSource
+		var glueType = $(this).val();
+		if ('GLUE_GROOVY'==glueType){
+			$("#addModal .form textarea[name='glueSource']").val( $("#addModal .form .glueSource_java").val() );
+		} else if ('GLUE_SHELL'==glueType){
+			$("#addModal .form textarea[name='glueSource']").val( $("#addModal .form .glueSource_shell").val() );
+		} else if ('GLUE_PYTHON'==glueType){
+			$("#addModal .form textarea[name='glueSource']").val( $("#addModal .form .glueSource_python").val() );
+		} else if ('GLUE_PHP'==glueType){
+            $("#addModal .form textarea[name='glueSource']").val( $("#addModal .form .glueSource_php").val() );
+        } else if ('GLUE_NODEJS'==glueType){
+			$("#addModal .form textarea[name='glueSource']").val( $("#addModal .form .glueSource_nodejs").val() );
+		} else if ('GLUE_POWERSHELL'==glueType){
+            $("#addModal .form textarea[name='glueSource']").val( $("#addModal .form .glueSource_powershell").val() );
+        } else {
+            $("#addModal .form textarea[name='glueSource']").val("");
+		}
+	});
+
+	// update
+	$("#job_list").on('click', '.update',function() {
+
+        var id = $(this).parents('ul').attr("_id");
+        var row = tableData['key'+id];
+
+		// fill base
+		$("#updateModal .form input[name='id']").val( row.id );
+		$('#updateModal .form select[name=jobGroup] option[value='+ row.jobGroup +']').prop('selected', true);
+		$("#updateModal .form input[name='jobDesc']").val( row.jobDesc );
+		$("#updateModal .form input[name='author']").val( row.author );
+		$("#updateModal .form input[name='alarmEmail']").val( row.alarmEmail );
+
+		// fill trigger
+		$('#updateModal .form select[name=scheduleType] option[value='+ row.scheduleType +']').prop('selected', true);
+		$("#updateModal .form input[name='scheduleConf']").val( row.scheduleConf );
+		if (row.scheduleType == 'CRON') {
+			$("#updateModal .form input[name='schedule_conf_CRON']").val( row.scheduleConf );
+		} else if (row.scheduleType == 'FIX_RATE') {
+			$("#updateModal .form input[name='schedule_conf_FIX_RATE']").val( row.scheduleConf );
+		} else if (row.scheduleType == 'FIX_DELAY') {
+			$("#updateModal .form input[name='schedule_conf_FIX_DELAY']").val( row.scheduleConf );
+		}
+
+		// 》init scheduleType
+		$("#updateModal .form select[name=scheduleType]").change();
+
+		// fill job
+		$('#updateModal .form select[name=glueType] option[value='+ row.glueType +']').prop('selected', true);
+		$("#updateModal .form input[name='executorHandler']").val( row.executorHandler );
+		$("#updateModal .form textarea[name='executorParam']").val( row.executorParam );
+
+		// 》init glueType
+		$("#updateModal .form select[name=glueType]").change();
+
+		// 》init-cronGen
+		$("#updateModal .form input[name='schedule_conf_CRON']").show().siblings().remove();
+		$("#updateModal .form input[name='schedule_conf_CRON']").cronGen({});
+
+		// fill advanced
+		$('#updateModal .form select[name=executorRouteStrategy] option[value='+ row.executorRouteStrategy +']').prop('selected', true);
+		$("#updateModal .form input[name='childJobId']").val( row.childJobId );
+		$('#updateModal .form select[name=misfireStrategy] option[value='+ row.misfireStrategy +']').prop('selected', true);
+		$('#updateModal .form select[name=executorBlockStrategy] option[value='+ row.executorBlockStrategy +']').prop('selected', true);
+		$("#updateModal .form input[name='executorTimeout']").val( row.executorTimeout );
+        $("#updateModal .form input[name='executorFailRetryCount']").val( row.executorFailRetryCount );
+
+		// show
+		$('#updateModal').modal({backdrop: false, keyboard: false}).modal('show');
+	});
+	var updateModalValidate = $("#updateModal .form").validate({
+		errorElement : 'span',
+        errorClass : 'help-block',
+        focusInvalid : true,
+
+		rules : {
+			jobDesc : {
+				required : true,
+				maxlength: 50
+			},
+			author : {
+				required : true
+			}
+		},
+		messages : {
+			jobDesc : {
+                required : I18n.system_please_input + I18n.jobinfo_field_jobdesc
+			},
+			author : {
+				required : I18n.system_please_input + I18n.jobinfo_field_author
+			}
+		},
+		highlight : function(element) {
+            $(element).closest('.form-group').addClass('has-error');
+        },
+        success : function(label) {
+            label.closest('.form-group').removeClass('has-error');
+            label.remove();
+        },
+        errorPlacement : function(error, element) {
+            element.parent('div').append(error);
+        },
+        submitHandler : function(form) {
+
+            // process executorTimeout + executorFailRetryCount
+            var executorTimeout = $("#updateModal .form input[name='executorTimeout']").val();
+            if(!/^\d+$/.test(executorTimeout)) {
+                executorTimeout = 0;
+            }
+            $("#updateModal .form input[name='executorTimeout']").val(executorTimeout);
+            var executorFailRetryCount = $("#updateModal .form input[name='executorFailRetryCount']").val();
+            if(!/^\d+$/.test(executorFailRetryCount)) {
+                executorFailRetryCount = 0;
+            }
+            $("#updateModal .form input[name='executorFailRetryCount']").val(executorFailRetryCount);
+
+
+			// process schedule_conf
+			var scheduleType = $("#updateModal .form select[name='scheduleType']").val();
+			var scheduleConf;
+			if (scheduleType == 'CRON') {
+				scheduleConf = $("#updateModal .form input[name='cronGen_display']").val();
+			} else if (scheduleType == 'FIX_RATE') {
+				scheduleConf = $("#updateModal .form input[name='schedule_conf_FIX_RATE']").val();
+			} else if (scheduleType == 'FIX_DELAY') {
+				scheduleConf = $("#updateModal .form input[name='schedule_conf_FIX_DELAY']").val();
+			}
+			$("#updateModal .form input[name='scheduleConf']").val( scheduleConf );
+
+			// post
+    		$.post(base_url + "/jobinfo/update", $("#updateModal .form").serialize(), function(data, status) {
+    			if (data.code == "200") {
+					$('#updateModal').modal('hide');
+					layer.open({
+						title: I18n.system_tips ,
+                        btn: [ I18n.system_ok ],
+						content: I18n.system_update_suc ,
+						icon: '1',
+						end: function(layero, index){
+							//window.location.reload();
+							jobTable.fnDraw();
+						}
+					});
+    			} else {
+					layer.open({
+						title: I18n.system_tips ,
+                        btn: [ I18n.system_ok ],
+						content: (data.msg || I18n.system_update_fail ),
+						icon: '2'
+					});
+    			}
+    		});
+		}
+	});
+	$("#updateModal").on('hide.bs.modal', function () {
+        updateModalValidate.resetForm();
+        $("#updateModal .form")[0].reset();
+        $("#updateModal .form .form-group").removeClass("has-error");
+	});
+
+    /**
+	 * find title by name, GlueType
+     */
+	function findGlueTypeTitle(glueType) {
+		var glueTypeTitle;
+        $("#addModal .form select[name=glueType] option").each(function () {
+            var name = $(this).val();
+            var title = $(this).text();
+            if (glueType == name) {
+                glueTypeTitle = title;
+                return false
+            }
+        });
+        return glueTypeTitle;
+    }
+
+    // job_copy
+	$("#job_list").on('click', '.job_copy',function() {
+
+		var id = $(this).parents('ul').attr("_id");
+		var row = tableData['key'+id];
+
+		// fill base
+		$('#addModal .form select[name=jobGroup] option[value='+ row.jobGroup +']').prop('selected', true);
+		$("#addModal .form input[name='jobDesc']").val( row.jobDesc );
+		$("#addModal .form input[name='author']").val( row.author );
+		$("#addModal .form input[name='alarmEmail']").val( row.alarmEmail );
+
+		// fill trigger
+		$('#addModal .form select[name=scheduleType] option[value='+ row.scheduleType +']').prop('selected', true);
+		$("#addModal .form input[name='scheduleConf']").val( row.scheduleConf );
+		if (row.scheduleType == 'CRON') {
+			$("#addModal .form input[name='schedule_conf_CRON']").val( row.scheduleConf );
+		} else if (row.scheduleType == 'FIX_RATE') {
+			$("#addModal .form input[name='schedule_conf_FIX_RATE']").val( row.scheduleConf );
+		} else if (row.scheduleType == 'FIX_DELAY') {
+			$("#addModal .form input[name='schedule_conf_FIX_DELAY']").val( row.scheduleConf );
+		}
+
+		// 》init scheduleType
+		$("#addModal .form select[name=scheduleType]").change();
+
+		// fill job
+		$('#addModal .form select[name=glueType] option[value='+ row.glueType +']').prop('selected', true);
+		$("#addModal .form input[name='executorHandler']").val( row.executorHandler );
+		$("#addModal .form textarea[name='executorParam']").val( row.executorParam );
+
+		// 》init glueType
+		$("#addModal .form select[name=glueType]").change();
+
+		// 》init-cronGen
+		$("#addModal .form input[name='schedule_conf_CRON']").show().siblings().remove();
+		$("#addModal .form input[name='schedule_conf_CRON']").cronGen({});
+
+		// fill advanced
+		$('#addModal .form select[name=executorRouteStrategy] option[value='+ row.executorRouteStrategy +']').prop('selected', true);
+		$("#addModal .form input[name='childJobId']").val( row.childJobId );
+		$('#addModal .form select[name=misfireStrategy] option[value='+ row.misfireStrategy +']').prop('selected', true);
+		$('#addModal .form select[name=executorBlockStrategy] option[value='+ row.executorBlockStrategy +']').prop('selected', true);
+		$("#addModal .form input[name='executorTimeout']").val( row.executorTimeout );
+		$("#addModal .form input[name='executorFailRetryCount']").val( row.executorFailRetryCount );
+
+		// show
+		$('#addModal').modal({backdrop: false, keyboard: false}).modal('show');
+	});
+
+});

--
Gitblit v1.9.3