yourteam 封裝套件引入
This commit is contained in:
		
							parent
							
								
									006f100c9c
								
							
						
					
					
						commit
						a738e27b22
					
				@ -2061,7 +2061,7 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li
 | 
				
			|||||||
    <script src="lib/datagrid/datatables/datatables.bundle.js"></script>
 | 
					    <script src="lib/datagrid/datatables/datatables.bundle.js"></script>
 | 
				
			||||||
    <script>
 | 
					    <script>
 | 
				
			||||||
          
 | 
					          
 | 
				
			||||||
        $("#app").load("dashboard.html");
 | 
					        $("#app").load("_dashboard.html");
 | 
				
			||||||
            
 | 
					            
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    </script>
 | 
					    </script>
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										4435
									
								
								Frontend/js/bootstrap.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4435
									
								
								Frontend/js/bootstrap.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										48
									
								
								Frontend/js/yourteam/plugins/yt-tab.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								Frontend/js/yourteam/plugins/yt-tab.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,48 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var _ytTabInited = []
 | 
				
			||||||
 | 
					$(function () {
 | 
				
			||||||
 | 
					    $("[data-tabname][data-target]:not([data-tabrole='child'])").each(function (index, value) {
 | 
				
			||||||
 | 
					        let tabName = $(value).data("tabname");
 | 
				
			||||||
 | 
					        if (_ytTabInited.indexOf(tabName) == -1) { 
 | 
				
			||||||
 | 
					            var ytTab = new YTTab({ tabName: tabName })     
 | 
				
			||||||
 | 
					            _ytTabInited.push(tabName);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class YTTab {
 | 
				
			||||||
 | 
					    constructor(option = {}) {
 | 
				
			||||||
 | 
					        this.tabName = option.tabName ?? null;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    init();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    init() {
 | 
				
			||||||
 | 
					        $(`[data-tabname=${this.tabName}][data-target][data-tabrole='child']`).css("display", "none");
 | 
				
			||||||
 | 
					        $(`[data-tabname=${this.tabName}][data-target][data-tabrole='child']`).first().show();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        this.event();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    event() {
 | 
				
			||||||
 | 
					        // custom tab
 | 
				
			||||||
 | 
					        // example : 
 | 
				
			||||||
 | 
					        // <button id="test" data-target="#okDiv" data-tabname="tab1"></button>
 | 
				
			||||||
 | 
					        // <div id="okDiv" data-tabrole="child" data-tabname="tab1"></div>
 | 
				
			||||||
 | 
					        $("body").on("click", `[data-tabname=${this.tabName}][data-target]`, function () {
 | 
				
			||||||
 | 
					            let target = $(this).data("target");
 | 
				
			||||||
 | 
					            let obj = this;
 | 
				
			||||||
 | 
					            let tabName = $(target).data("tabname");
 | 
				
			||||||
 | 
					            if (tabName) {
 | 
				
			||||||
 | 
					                if ($(target).data("tabrole") == "child") {
 | 
				
			||||||
 | 
					                    $(obj).trigger("yt:tab:show");
 | 
				
			||||||
 | 
					                    $(`[data-tabname='${tabName}'][data-tabrole='child']`).css("opacity", 0).hide();
 | 
				
			||||||
 | 
					                    $(target).show().animate({ opacity: 1 }, 200, function () {
 | 
				
			||||||
 | 
					                        $(obj).trigger("yt:tab:shown");
 | 
				
			||||||
 | 
					                    });
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										108
									
								
								Frontend/js/yourteam/plugins/yt-tooltip.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								Frontend/js/yourteam/plugins/yt-tooltip.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,108 @@
 | 
				
			|||||||
 | 
					$.fn.YTTooltip = function (option) {
 | 
				
			||||||
 | 
					    let eleArr = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    this.each(function (index, value) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let obj = {
 | 
				
			||||||
 | 
					            ele: value,
 | 
				
			||||||
 | 
					            isShowArr: [],
 | 
				
			||||||
 | 
					            html: $(option.html) || '',
 | 
				
			||||||
 | 
					            tooltipDiv: null,
 | 
				
			||||||
 | 
					            direction: option.direction || 'bottom',
 | 
				
			||||||
 | 
					            toggle: "click",
 | 
				
			||||||
 | 
					            hideTooltipEvent: hideTooltipEvent,
 | 
				
			||||||
 | 
					            onShow: option.onShow || null,
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (obj.toggle == "hover") {
 | 
				
			||||||
 | 
					            obj.toggle == "mouseenter"
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $(obj.ele).on(obj.toggle, function () {
 | 
				
			||||||
 | 
					            let tooId = $(this).data("yttooltipid");
 | 
				
			||||||
 | 
					            let display = "flex";
 | 
				
			||||||
 | 
					            //顯示 tooltip 程序 及 存入已顯示紀錄arr
 | 
				
			||||||
 | 
					            if (!tooId || obj.isShowArr.indexOf(tooId) == -1) {
 | 
				
			||||||
 | 
					                let ranId = Math.floor((Math.random() * (9999999 - 1000000)) + 1000000);
 | 
				
			||||||
 | 
					                obj.isShowArr.push(ranId);
 | 
				
			||||||
 | 
					                let clone = $(obj.html);
 | 
				
			||||||
 | 
					                //body 元素 高寬
 | 
				
			||||||
 | 
					                let bodyWidth = $("body")[0].offsetWidth;
 | 
				
			||||||
 | 
					                let bodyHeight = $("body")[0].offsetHeight;
 | 
				
			||||||
 | 
					                //計算引用元素 offset
 | 
				
			||||||
 | 
					                let offset = $(this).offset();
 | 
				
			||||||
 | 
					                //引用元素 高寬
 | 
				
			||||||
 | 
					                let width = $(this)[0].offsetWidth;
 | 
				
			||||||
 | 
					                let height = $(this)[0].offsetHeight;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                $(this).data("yttooltipid", ranId);
 | 
				
			||||||
 | 
					                $(clone).attr("id", "yt_tooltip_" + ranId)
 | 
				
			||||||
 | 
					                $("body").append(clone);
 | 
				
			||||||
 | 
					                obj.tooltipDiv = clone;
 | 
				
			||||||
 | 
					                //顯示 tooltip
 | 
				
			||||||
 | 
					                $(clone).css({ "display": display, "position": "absolute" });
 | 
				
			||||||
 | 
					                obj.onShow ? obj.onShow(clone,obj) : "";
 | 
				
			||||||
 | 
					                //tooltip 高寬
 | 
				
			||||||
 | 
					                let toolWidth = $(clone)[0].offsetWidth;
 | 
				
			||||||
 | 
					                let toolHeight = $(clone)[0].offsetHeight;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                let left = offset.left + width + toolWidth > bodyWidth ? offset.left - toolWidth : offset.left + width;
 | 
				
			||||||
 | 
					                let top = offset.top + height + toolHeight > bodyHeight ? offset.top - toolHeight : offset.top + height;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                //計算 位置
 | 
				
			||||||
 | 
					                if (obj.direction == "left") {
 | 
				
			||||||
 | 
					                    left = offset.left < toolWidth ? offset.left + width + 5 : offset.left - toolWidth - 10;
 | 
				
			||||||
 | 
					                } else if (obj.direction == "right") {
 | 
				
			||||||
 | 
					                    left = offset.left + toolWidth + width > bodyWidth ? offset.left - toolWidth - 10 : offset.left + width + 10;
 | 
				
			||||||
 | 
					                } else if (obj.direction == "bottom") {
 | 
				
			||||||
 | 
					                    top = offset.top + toolHeight + height > bodyHeight ? offset.top - toolHeight - 10 : offset.top + height + 10;
 | 
				
			||||||
 | 
					                } else if (obj.direction == "top") {
 | 
				
			||||||
 | 
					                    top = offset.top < toolHeight ? offset.top + height + 5 : offset.top - toolHeight - 10;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (obj.direction == "left" || obj.direction == "right") {
 | 
				
			||||||
 | 
					                    $(clone).css({ left: left, top: offset.top });
 | 
				
			||||||
 | 
					                } else if (obj.direction == "top" || obj.direction == "bottom"){
 | 
				
			||||||
 | 
					                    $(clone).css({ left: offset.left, top: top});
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                obj.hideTooltipEvent(tooId);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (obj.toggle == "hover") {
 | 
				
			||||||
 | 
					                $(obj.tooltipDiv).off("mouseover").on("mouseover", function () {
 | 
				
			||||||
 | 
					                    $(this).css("display", "flex");
 | 
				
			||||||
 | 
					                })
 | 
				
			||||||
 | 
					                $(obj.tooltipDiv).off("mouseleave").on("mouseleave", function () {
 | 
				
			||||||
 | 
					                    let tooId = $(this).attr("id").split("yt_tooltip_")[1];
 | 
				
			||||||
 | 
					                    obj.hideTooltipEvent(tooId);
 | 
				
			||||||
 | 
					                })
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (obj.toggle == "hover") {
 | 
				
			||||||
 | 
					            $(obj.ele).on("mouseleave", function (e) {
 | 
				
			||||||
 | 
					                let tooId = $(this).data("yttooltipid");
 | 
				
			||||||
 | 
					                hideTooltipEvent(tooId);
 | 
				
			||||||
 | 
					                e.stopPropagation();
 | 
				
			||||||
 | 
					            })
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        function hideTooltipEvent(tooId) {
 | 
				
			||||||
 | 
					            $("#yt_tooltip_" + tooId).hide();
 | 
				
			||||||
 | 
					            setTimeout(function () {
 | 
				
			||||||
 | 
					                if ($("#yt_tooltip_" + tooId).css("display") == "none") {
 | 
				
			||||||
 | 
					                    obj.isShowArr.splice($.inArray(tooId, obj.isShowArr), 1);
 | 
				
			||||||
 | 
					                    $("#yt_tooltip_" + tooId).remove();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }, 100)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        eleArr.push(obj);
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let result = eleArr.filter(x => this.toArray().findIndex(y => y == x.ele) != -1)[0];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return result;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										250
									
								
								Frontend/js/yourteam/yourteam.ajax.class.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										250
									
								
								Frontend/js/yourteam/yourteam.ajax.class.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,250 @@
 | 
				
			|||||||
 | 
					var YourTeam = YourTeam || {};
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * This is a description of the Ajax constructor function.
 | 
				
			||||||
 | 
					 * @class Ajax
 | 
				
			||||||
 | 
					 * @classdesc This is a description of the Ajax class.
 | 
				
			||||||
 | 
					 * @author Darren Chen @2021/02/06
 | 
				
			||||||
 | 
					 * @copyright Darren Chen @Your Team Co., Ltd. 2021
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					class Ajax {
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * constructor
 | 
				
			||||||
 | 
					    * @constructor
 | 
				
			||||||
 | 
					    *  @param {String} apiUrl API URL. def="".
 | 
				
			||||||
 | 
					    *  @param {String} sendData the data object which you will be send. def= null.
 | 
				
			||||||
 | 
					    *  @param {Fcnction} successFunction successFunction. def=null.(use def successFunction)
 | 
				
			||||||
 | 
					    *  @param {Fcnction} errorFunction errorFunction. def=null.(use def successFunction)
 | 
				
			||||||
 | 
					    *  @param {String} type HTTP METHOD. def="GET".
 | 
				
			||||||
 | 
					    *  @param {Object} conType content type
 | 
				
			||||||
 | 
					    *  @param {String} dataType data format. def="JSON".
 | 
				
			||||||
 | 
					    *  @param {String} isAsync the api synchronization. def=false.
 | 
				
			||||||
 | 
					    *  @return {Object} this
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    constructor(apiUrl = "", sendData = null, successFunction = null, errorFunction = null, type = "GET", isAsync = false, conType = this.contentType.Json, dataType = "JSON") {
 | 
				
			||||||
 | 
					        this.conType = conType;
 | 
				
			||||||
 | 
					        this.apiUrl = apiUrl;
 | 
				
			||||||
 | 
					        this.isAsync = isAsync;
 | 
				
			||||||
 | 
					        this.type = type;
 | 
				
			||||||
 | 
					        this.dataType = dataType;
 | 
				
			||||||
 | 
					        this.sendData = sendData;
 | 
				
			||||||
 | 
					        if (successFunction) this.successFunction = successFunction;
 | 
				
			||||||
 | 
					        if (errorFunction) this.errorFunction = errorFunction;
 | 
				
			||||||
 | 
					        return this;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * dataToString
 | 
				
			||||||
 | 
					    * @description convert the data object to string
 | 
				
			||||||
 | 
					    *  @param {Object} data API URL. def="".
 | 
				
			||||||
 | 
					    *  @return {String} strJsonData
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    dataToString = function (data) {
 | 
				
			||||||
 | 
					        let strJsonData = data ? (data.Data ? JSON.stringify(data.Data) : null) : null;
 | 
				
			||||||
 | 
					        return strJsonData;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * beforeSendFunction
 | 
				
			||||||
 | 
					    * @description beforeSendFunction
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    beforeSendFunction = function () {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * successFunction
 | 
				
			||||||
 | 
					    * @description successFunction
 | 
				
			||||||
 | 
					    * @param {Object} data the data object from the api return
 | 
				
			||||||
 | 
					    * @return {Object} data
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    successFunction = function (data) {
 | 
				
			||||||
 | 
					        return data;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * errorFunction
 | 
				
			||||||
 | 
					    * @description errorFunction
 | 
				
			||||||
 | 
					    * @param {Object} xhr HTTP STATUS
 | 
				
			||||||
 | 
					    * @param {Object} ajaxOptions the ajax option message
 | 
				
			||||||
 | 
					    * @param {String} thrownError the error message
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    errorFunction = function (xhr, ajaxOptions, thrownError) {
 | 
				
			||||||
 | 
					        if (xhr.status != "201" && xhr.status != "204") {
 | 
				
			||||||
 | 
					            console.log(xhr.status);
 | 
				
			||||||
 | 
					            console.log(thrownError);
 | 
				
			||||||
 | 
					            window.alert("執行失敗,請聯絡客服人員。");
 | 
				
			||||||
 | 
					        } else if (xhr.status == "401") {
 | 
				
			||||||
 | 
					            window.alert("登入時間超時,請重新登入!");
 | 
				
			||||||
 | 
					            location.href = "~/Login/Login";
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * completeFunction
 | 
				
			||||||
 | 
					    * @description completeFunction
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    completeFunction = function () {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * content type
 | 
				
			||||||
 | 
					    * @description content type
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    contentType = {
 | 
				
			||||||
 | 
					        Json: 1,
 | 
				
			||||||
 | 
					        FormData : 2
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * enum 
 | 
				
			||||||
 | 
					    * @description enum
 | 
				
			||||||
 | 
					    * @param {Object} eo object
 | 
				
			||||||
 | 
					    * @return {Object} enum
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    enums(eo) {
 | 
				
			||||||
 | 
					        var enums = function () { };
 | 
				
			||||||
 | 
					        for (var key in eo) {
 | 
				
			||||||
 | 
					            var enumObject = new enums();
 | 
				
			||||||
 | 
					            enums[key] = eo[key];
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return enums;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * send
 | 
				
			||||||
 | 
					    * @description send
 | 
				
			||||||
 | 
					    * @param {Object} conType content type
 | 
				
			||||||
 | 
					    * @param {Object} sendData send data
 | 
				
			||||||
 | 
					    * @param {Function} successFunction the ajax success function
 | 
				
			||||||
 | 
					    * @param {Function} errorFunction the ajax error function
 | 
				
			||||||
 | 
					    * @return {Object} this
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    send = function (conType = this.contentType.Json, sendData = null, successFunction = null, errorFunction = null) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!CheckMultiSend(this.apiUrl, this.type, this.dataToString(this.sendData))) { //連點防呆
 | 
				
			||||||
 | 
					            return false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (sendData) {
 | 
				
			||||||
 | 
					            this.sendData = sendData;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (successFunction) {
 | 
				
			||||||
 | 
					            this.successFunction = successFunction;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (errorFunction) {
 | 
				
			||||||
 | 
					            this.errorFunction = errorFunction;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (conType === this.contentType.Json) {
 | 
				
			||||||
 | 
					            $.ajax({
 | 
				
			||||||
 | 
					                url: this.apiUrl,
 | 
				
			||||||
 | 
					                async: this.isAsync,
 | 
				
			||||||
 | 
					                type: this.type,
 | 
				
			||||||
 | 
					                dataType: this.dataType,
 | 
				
			||||||
 | 
					                traditional: true,
 | 
				
			||||||
 | 
					                contentType: "application/json; charset=utf-8",
 | 
				
			||||||
 | 
					                data: this.dataToString(this.sendData),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                //cache: false,
 | 
				
			||||||
 | 
					                //processData: false,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                beforeSend: this.beforeSendFunction,
 | 
				
			||||||
 | 
					                success: this.successFunction,
 | 
				
			||||||
 | 
					                error: this.errorFunction,
 | 
				
			||||||
 | 
					                complete: this.completeFunction,
 | 
				
			||||||
 | 
					                statusCode: {
 | 
				
			||||||
 | 
					                    201: this.successFunction
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else if (conType === this.contentType.FormData) {
 | 
				
			||||||
 | 
					            $.ajax({
 | 
				
			||||||
 | 
					                url: this.apiUrl,
 | 
				
			||||||
 | 
					                async: this.isAsync,
 | 
				
			||||||
 | 
					                type: this.type,
 | 
				
			||||||
 | 
					                dataType: this.dataType,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                traditional: true,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                contentType: false,
 | 
				
			||||||
 | 
					                enctype: 'multipart/form-data',
 | 
				
			||||||
 | 
					                data: this.sendData,
 | 
				
			||||||
 | 
					                cache: false,
 | 
				
			||||||
 | 
					                processData: false,
 | 
				
			||||||
 | 
					                beforeSend: this.beforeSendFunction,
 | 
				
			||||||
 | 
					                success: this.successFunction,
 | 
				
			||||||
 | 
					                error: this.errorFunction,
 | 
				
			||||||
 | 
					                complete: this.completeFunction
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            alert(conType);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else {
 | 
				
			||||||
 | 
					            console.error("the content type is null.");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return this;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					YourTeam.Ajax = YourTeam.Ajax || Ajax;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var ckeckMultiSendArr = [];
 | 
				
			||||||
 | 
					function CheckMultiSend(url, type, data) {
 | 
				
			||||||
 | 
					    //根據 url type data 
 | 
				
			||||||
 | 
					    let text = String(url) + String(type);
 | 
				
			||||||
 | 
					    if (type != "GET") {
 | 
				
			||||||
 | 
					        if (ckeckMultiSendArr.indexOf(text) == -1) {
 | 
				
			||||||
 | 
					            ckeckMultiSendArr.unshift(text);
 | 
				
			||||||
 | 
					            let timer = setInterval(function () {
 | 
				
			||||||
 | 
					                ckeckMultiSendArr.splice(0);
 | 
				
			||||||
 | 
					                clearInterval(timer);
 | 
				
			||||||
 | 
					            }, 500)
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            return false
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					//var YourTeamAjax = {
 | 
				
			||||||
 | 
					//    apiUrl: "",
 | 
				
			||||||
 | 
					//    isAsync: false,
 | 
				
			||||||
 | 
					//    type: "GET",
 | 
				
			||||||
 | 
					//    dataType: "JSON",
 | 
				
			||||||
 | 
					//    sendData: null,
 | 
				
			||||||
 | 
					//    dataToString: function (data) {
 | 
				
			||||||
 | 
					//        let strJsonData = data ? (data.Data ? JSON.stringify(data.Data) : null) : null;
 | 
				
			||||||
 | 
					//        return strJsonData;
 | 
				
			||||||
 | 
					//    },
 | 
				
			||||||
 | 
					//    beforeSendFunction: function () {
 | 
				
			||||||
 | 
					//        $.blockUI({ message: '<h1><img src="/Content/img/loading.gif" style="width:200px;" /> Loding...</h1>' });
 | 
				
			||||||
 | 
					//    },
 | 
				
			||||||
 | 
					//    successFunction: function (data) {
 | 
				
			||||||
 | 
					//        return data;
 | 
				
			||||||
 | 
					//    },
 | 
				
			||||||
 | 
					//    errorFunction: function (xhr, ajaxOptions, thrownError) {
 | 
				
			||||||
 | 
					//        if (xhr.status != "201") {
 | 
				
			||||||
 | 
					//            console.log(xhr.status);
 | 
				
			||||||
 | 
					//            console.log(thrownError);
 | 
				
			||||||
 | 
					//            window.alert("執行失敗,請聯絡YourTeam客服人員。");
 | 
				
			||||||
 | 
					//        }
 | 
				
			||||||
 | 
					//    },
 | 
				
			||||||
 | 
					//    completeFunction: function () {
 | 
				
			||||||
 | 
					//        $.unblockUI();
 | 
				
			||||||
 | 
					//    },
 | 
				
			||||||
 | 
					//    send: function (sendData = null, successFunction = null, errorFunction = null) {
 | 
				
			||||||
 | 
					//        if (sendData) {
 | 
				
			||||||
 | 
					//            this.sendData = sendData;
 | 
				
			||||||
 | 
					//        }
 | 
				
			||||||
 | 
					//        if (successFunction) {
 | 
				
			||||||
 | 
					//            this.successFunction = successFunction;
 | 
				
			||||||
 | 
					//        }
 | 
				
			||||||
 | 
					//        if (errorFunction) {
 | 
				
			||||||
 | 
					//            this.errorFunction = errorFunction;
 | 
				
			||||||
 | 
					//        }
 | 
				
			||||||
 | 
					//        $.ajax({
 | 
				
			||||||
 | 
					//            url: this.apiUrl,
 | 
				
			||||||
 | 
					//            async: this.isAsync,
 | 
				
			||||||
 | 
					//            type: this.type,
 | 
				
			||||||
 | 
					//            dataType: this.dataType,
 | 
				
			||||||
 | 
					//            traditional: true,
 | 
				
			||||||
 | 
					//            contentType: "application/json; charset=utf-8",
 | 
				
			||||||
 | 
					//            data: this.dataToString(this.sendData),
 | 
				
			||||||
 | 
					//            beforeSend: this.beforeSendFunction,
 | 
				
			||||||
 | 
					//            success: this.successFunction,
 | 
				
			||||||
 | 
					//            error: this.errorFunction,
 | 
				
			||||||
 | 
					//            complete: this.completeFunction,
 | 
				
			||||||
 | 
					//            statusCode: {
 | 
				
			||||||
 | 
					//                201: this.successFunction
 | 
				
			||||||
 | 
					//            }
 | 
				
			||||||
 | 
					//        });
 | 
				
			||||||
 | 
					//    }
 | 
				
			||||||
 | 
					//};
 | 
				
			||||||
							
								
								
									
										320
									
								
								Frontend/js/yourteam/yourteam.chartjs.class.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										320
									
								
								Frontend/js/yourteam/yourteam.chartjs.class.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,320 @@
 | 
				
			|||||||
 | 
					var YourTeam = YourTeam || {};
 | 
				
			||||||
 | 
					YourTeam.Chartjs = YourTeam.Chartjs || {};
 | 
				
			||||||
 | 
					class Bar {
 | 
				
			||||||
 | 
					    constructor() {
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /*
 | 
				
			||||||
 | 
					    * @deprecated since version 0.1
 | 
				
			||||||
 | 
					    * @description 初始化Bar基本圖表
 | 
				
			||||||
 | 
					    * @param {String} cvsId the canvas`s id    
 | 
				
			||||||
 | 
					    * @param {Array} aryLabelsX X軸標籤值(String Array)
 | 
				
			||||||
 | 
					    * @param {Array} aryVluesY Y軸量值(Integer Array)
 | 
				
			||||||
 | 
					    * @param {String} strTitle the title of the chart;def value = null
 | 
				
			||||||
 | 
					    * @returns {Object} chart element
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    initBasesss(cvsId, aryLabels, aryVlues, strTitle = null) {
 | 
				
			||||||
 | 
					        //function newDate(days) {
 | 
				
			||||||
 | 
					        //    return new YourTeam.Utility.DateHelper().getChangeDateTime(false, '/', 0, 0, days);
 | 
				
			||||||
 | 
					        //}
 | 
				
			||||||
 | 
					        let myDatasets = [];
 | 
				
			||||||
 | 
					        let objJson = {};
 | 
				
			||||||
 | 
					        for (let i = 0; i < aryVlues.length; i++) {
 | 
				
			||||||
 | 
					            objJson = {};
 | 
				
			||||||
 | 
					            objJson.label = aryLabels[i];
 | 
				
			||||||
 | 
					            objJson.data = [aryVlues[i]];
 | 
				
			||||||
 | 
					            objJson.borderColor = "rgba(220,20,20,1)";
 | 
				
			||||||
 | 
					            objJson.backgroundColor = "rgba(220,20,20,0.5)";
 | 
				
			||||||
 | 
					            myDatasets.push(objJson);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let config = {
 | 
				
			||||||
 | 
					            type: "bar",
 | 
				
			||||||
 | 
					            data: {
 | 
				
			||||||
 | 
					                //labels: [newDate(-5), newDate(-4), newDate(-3), newDate(-2), newDate(-1), newDate(0)],
 | 
				
			||||||
 | 
					                labels: aryLabels,
 | 
				
			||||||
 | 
					                datasets: myDatasets
 | 
				
			||||||
 | 
					                //datasets: [{
 | 
				
			||||||
 | 
					                //    //data: [2, 5, 3, 4, 7, 3],
 | 
				
			||||||
 | 
					                //    data: aryVlues,
 | 
				
			||||||
 | 
					                //    borderColor: "rgba(220,20,20,1)",
 | 
				
			||||||
 | 
					                //    backgroundColor: "rgba(220,20,20,0.5)"
 | 
				
			||||||
 | 
					                //}]
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            options: {
 | 
				
			||||||
 | 
					                legend: {
 | 
				
			||||||
 | 
					                    display: true,
 | 
				
			||||||
 | 
					                    labels: {
 | 
				
			||||||
 | 
					                        fontColor: 'rgb(255, 99, 132)'
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                scales: {
 | 
				
			||||||
 | 
					                    xAxes: [{
 | 
				
			||||||
 | 
					                        type: "category",
 | 
				
			||||||
 | 
					                        labels: aryLabels
 | 
				
			||||||
 | 
					                    }],
 | 
				
			||||||
 | 
					                    yAxes: [{
 | 
				
			||||||
 | 
					                        ticks: {
 | 
				
			||||||
 | 
					                            beginAtZero: true
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }]
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                title: {
 | 
				
			||||||
 | 
					                    display: (strTitle) ? true : false,
 | 
				
			||||||
 | 
					                    text: (strTitle) ? strTitle : ""
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        let ctx = document.getElementById(cvsId).getContext("2d");
 | 
				
			||||||
 | 
					        //window.myLine = new Chart(ctx, config);
 | 
				
			||||||
 | 
					        return new Chart(ctx, config);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /*
 | 
				
			||||||
 | 
					    * @deprecated since version 0.1
 | 
				
			||||||
 | 
					    * @description 初始化Bar基本圖表
 | 
				
			||||||
 | 
					    * @param {String} cvsId the canvas`s id    
 | 
				
			||||||
 | 
					    * @param {Array} aryLabelsX X軸標籤值(String Array)
 | 
				
			||||||
 | 
					    * @param {Array} aryVluesY Y軸量值(Integer Array)
 | 
				
			||||||
 | 
					    * @param {String} strTitle the title of the chart;def value = null
 | 
				
			||||||
 | 
					    * @param {String} type the chart is vertical or horizontal ;def value = "bar" (vertical), "horizontalBar" (horizontal)
 | 
				
			||||||
 | 
					    * @returns {Object} chart element
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    initBase(cvsId, aryLabels, aryVlues, strLabel = null, strTitle = null, chart = null,type="bar",animation = null) {
 | 
				
			||||||
 | 
					        //function newDate(days) {
 | 
				
			||||||
 | 
					        //    return new YourTeam.Utility.DateHelper().getChangeDateTime(false, '/', 0, 0, days);
 | 
				
			||||||
 | 
					        //}
 | 
				
			||||||
 | 
					        if (chart !== null) {
 | 
				
			||||||
 | 
					            chart.destroy();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        let myDatasets = [];
 | 
				
			||||||
 | 
					        let objJson = {};
 | 
				
			||||||
 | 
					        let valLabelObj = {};
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					        objJson.backgroundColor = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        objJson.label = strLabel ?? "";
 | 
				
			||||||
 | 
					        for (let i = 0; i < aryVlues.length; i++) {
 | 
				
			||||||
 | 
					            objJson.borderColor = "rgba(220,20,20,1)";
 | 
				
			||||||
 | 
					            objJson.backgroundColor.push("rgba(" + random(0, 255) + "," + random(0, 255) + "," + random(0, 255) + ",0.5)");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        objJson.data = aryVlues;
 | 
				
			||||||
 | 
					        myDatasets.push(objJson);
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					       
 | 
				
			||||||
 | 
					        let config = {
 | 
				
			||||||
 | 
					            type: type,
 | 
				
			||||||
 | 
					            data: {
 | 
				
			||||||
 | 
					                //labels: [newDate(-5), newDate(-4), newDate(-3), newDate(-2), newDate(-1), newDate(0)],
 | 
				
			||||||
 | 
					                labels: aryLabels,
 | 
				
			||||||
 | 
					                datasets: myDatasets
 | 
				
			||||||
 | 
					                //datasets: [{
 | 
				
			||||||
 | 
					                //    //data: [2, 5, 3, 4, 7, 3],
 | 
				
			||||||
 | 
					                //    data: aryVlues,
 | 
				
			||||||
 | 
					                //    borderColor: "rgba(220,20,20,1)",
 | 
				
			||||||
 | 
					                //    backgroundColor: "rgba(220,20,20,0.5)"
 | 
				
			||||||
 | 
					                //}]
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            options: {
 | 
				
			||||||
 | 
					                indexAxis: 'y',
 | 
				
			||||||
 | 
					                legend: {
 | 
				
			||||||
 | 
					                    labels: {
 | 
				
			||||||
 | 
					                        generateLabels: function (chart) {
 | 
				
			||||||
 | 
					                            let labels = chart.data.labels;
 | 
				
			||||||
 | 
					                            let dataset = chart.data.datasets[0];
 | 
				
			||||||
 | 
					                            let legend = labels.map(function (label, index) {
 | 
				
			||||||
 | 
					                                return {
 | 
				
			||||||
 | 
					                                    datasetIndex: 0,
 | 
				
			||||||
 | 
					                                    fillStyle: dataset.backgroundColor && dataset.backgroundColor[index],
 | 
				
			||||||
 | 
					                                    strokeStyle: dataset.borderColor && dataset.borderColor[index],
 | 
				
			||||||
 | 
					                                    lineWidth: 0,
 | 
				
			||||||
 | 
					                                    text: label
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					                            });
 | 
				
			||||||
 | 
					                            return legend;
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    onClick: null
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					                scales: {
 | 
				
			||||||
 | 
					                    xAxes: [{
 | 
				
			||||||
 | 
					                        
 | 
				
			||||||
 | 
					                        ticks: {
 | 
				
			||||||
 | 
					                            beginAtZero: true,
 | 
				
			||||||
 | 
					                            callback: function (value, index, values) {
 | 
				
			||||||
 | 
					                                if (value.length > 10) {
 | 
				
			||||||
 | 
					                                    value = value.substring(0, 10) + "...";
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					                                return value;
 | 
				
			||||||
 | 
					                            },
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                    }],
 | 
				
			||||||
 | 
					                    yAxes: [{
 | 
				
			||||||
 | 
					                        ticks: {
 | 
				
			||||||
 | 
					                            beginAtZero: true
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }],
 | 
				
			||||||
 | 
					                   
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                animation: animation,
 | 
				
			||||||
 | 
					                title: {
 | 
				
			||||||
 | 
					                    display: (strTitle) ? true : false,
 | 
				
			||||||
 | 
					                    text: (strTitle) ? strTitle : ""
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                tooltips: {
 | 
				
			||||||
 | 
					                    callbacks: {
 | 
				
			||||||
 | 
					                        //label: function (tooltipItem) {
 | 
				
			||||||
 | 
					                        //    console.log(tooltipItem)
 | 
				
			||||||
 | 
					                        //    return tooltipItem.yLabel;
 | 
				
			||||||
 | 
					                        //},
 | 
				
			||||||
 | 
					                        //title: function (tooltipItem) {
 | 
				
			||||||
 | 
					                        //    console.log(tooltipItem)
 | 
				
			||||||
 | 
					                        //    return tooltipItem.xLabel
 | 
				
			||||||
 | 
					                        //}
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					           
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        let ctx = document.getElementById(cvsId).getContext("2d");
 | 
				
			||||||
 | 
					        //window.myLine = new Chart(ctx, config);
 | 
				
			||||||
 | 
					        return new Chart(ctx, config);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /*
 | 
				
			||||||
 | 
					    * @deprecated since version 0.1
 | 
				
			||||||
 | 
					    * @description 初始化Bar日期基本圖表
 | 
				
			||||||
 | 
					    * @param {String} cvsId the canvas`s id    
 | 
				
			||||||
 | 
					    * @param {Array} aryLabelsX X軸標籤值(Date Array)
 | 
				
			||||||
 | 
					    * @param {Array} aryVluesY Y軸量值(Integer Array)
 | 
				
			||||||
 | 
					    * @param {String} strTitle the title of the chart;def value = null
 | 
				
			||||||
 | 
					    * @returns {Object} chart element
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    initBaseDate(cvsId, aryLabels, aryVlues, strTitle = null, chart = null) {
 | 
				
			||||||
 | 
					        //function newDate(days) {
 | 
				
			||||||
 | 
					        //    return new YourTeam.Utility.DateHelper().getChangeDateTime(false, '/', 0, 0, days);
 | 
				
			||||||
 | 
					        //}
 | 
				
			||||||
 | 
					        if (chart !== null) {
 | 
				
			||||||
 | 
					            chart.destroy();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        let config = {
 | 
				
			||||||
 | 
					            type: "bar",
 | 
				
			||||||
 | 
					            data: {
 | 
				
			||||||
 | 
					                //labels: [newDate(-5), newDate(-4), newDate(-3), newDate(-2), newDate(-1), newDate(0)],
 | 
				
			||||||
 | 
					                labels: aryLabels,
 | 
				
			||||||
 | 
					                datasets: [{
 | 
				
			||||||
 | 
					                    //data: [2, 5, 3, 4, 7, 3],
 | 
				
			||||||
 | 
					                    data: aryVlues,
 | 
				
			||||||
 | 
					                    borderColor: "rgba(220,20,20,1)",
 | 
				
			||||||
 | 
					                    backgroundColor: "rgba(220,20,20,0.5)"
 | 
				
			||||||
 | 
					                }]
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            options: {
 | 
				
			||||||
 | 
					                scales: {
 | 
				
			||||||
 | 
					                    xAxes: [{
 | 
				
			||||||
 | 
					                        type: "time",
 | 
				
			||||||
 | 
					                        time: {
 | 
				
			||||||
 | 
					                            unit: "day",
 | 
				
			||||||
 | 
					                            round: "day",
 | 
				
			||||||
 | 
					                            displayFormats: {
 | 
				
			||||||
 | 
					                                day: "YYYY/MM/DD"
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }],
 | 
				
			||||||
 | 
					                    yAxes: [{
 | 
				
			||||||
 | 
					                        ticks: {
 | 
				
			||||||
 | 
					                            beginAtZero: true
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }]
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                title: {
 | 
				
			||||||
 | 
					                    display: (strTitle) ? true : false,
 | 
				
			||||||
 | 
					                    text: (strTitle) ? strTitle : ""
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        let ctx = document.getElementById(cvsId).getContext("2d");
 | 
				
			||||||
 | 
					        //window.myLine = new Chart(ctx, config);
 | 
				
			||||||
 | 
					        return new Chart(ctx, config);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					YourTeam.Chartjs.Bar = YourTeam.Chartjs.BarHelper || Bar;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Pie {
 | 
				
			||||||
 | 
					    constructor() {
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /*
 | 
				
			||||||
 | 
					    * @deprecated since version 0.1
 | 
				
			||||||
 | 
					    * @description 初始化Pie基本圖表
 | 
				
			||||||
 | 
					    * @param {String} cvsId the canvas`s id    
 | 
				
			||||||
 | 
					    * @param {Array} aryLabels 標籤值(String Array)
 | 
				
			||||||
 | 
					    * @param {Array} aryVlues  量值(Integer Array)
 | 
				
			||||||
 | 
					    * @param {String} strTitle the title of the chart;def value = null
 | 
				
			||||||
 | 
					    * @param {Integer} borderWidth the width of the border;def value = 1
 | 
				
			||||||
 | 
					    * @param {Array} aryStrBgColor the rgba or color code with the backaround;def value = null
 | 
				
			||||||
 | 
					    * @param {Array} aryStrBorderColor the rgba or color code with the border;def value = null
 | 
				
			||||||
 | 
					    * @returns {Object} chart element
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    initBase(cvsId, aryLabels, aryVlues, strTitle = null, chart = null, borderWidth = 1, aryStrBgColor = null, aryStrBorderColor = null)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (chart !== null) {
 | 
				
			||||||
 | 
					            chart.destroy();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (!aryStrBgColor) {
 | 
				
			||||||
 | 
					            aryStrBgColor = [];
 | 
				
			||||||
 | 
					            for (let i = 0; i < aryVlues.length; i++) {
 | 
				
			||||||
 | 
					                aryStrBgColor.push('rgb(' + random(0, 255) + ', ' + random(0, 255) + ', ' + random(0, 255) + ')');
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (!aryStrBorderColor) {
 | 
				
			||||||
 | 
					            aryStrBorderColor = [];
 | 
				
			||||||
 | 
					            for (let i = 0; i < aryVlues.length; i++) {
 | 
				
			||||||
 | 
					                aryStrBorderColor.push('rgb(255,255,255)');
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        let config = {
 | 
				
			||||||
 | 
					            type: (aryVlues.length % 2) ? "doughnut" :"doughnut",
 | 
				
			||||||
 | 
					            data: {
 | 
				
			||||||
 | 
					                labels: aryLabels,
 | 
				
			||||||
 | 
					                datasets: [{
 | 
				
			||||||
 | 
					                    data: aryVlues,
 | 
				
			||||||
 | 
					                    backgroundColor: aryStrBgColor,
 | 
				
			||||||
 | 
					                    borderColor: aryStrBorderColor,
 | 
				
			||||||
 | 
					                    borderWidth: borderWidth
 | 
				
			||||||
 | 
					                }]                
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            options: {
 | 
				
			||||||
 | 
					                //cutoutPercentage: 40,
 | 
				
			||||||
 | 
					                cutoutPercentage: 60,
 | 
				
			||||||
 | 
					                maintainAspectRatio: false,
 | 
				
			||||||
 | 
					                responsive: false,
 | 
				
			||||||
 | 
					                legend: {
 | 
				
			||||||
 | 
					                    display: false,
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                title: {
 | 
				
			||||||
 | 
					                    display: (strTitle) ? true : false,
 | 
				
			||||||
 | 
					                    text: (strTitle) ? strTitle : ""
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                tooltips: {
 | 
				
			||||||
 | 
					                    position: 'nearest',
 | 
				
			||||||
 | 
					                    xAlign: "left",
 | 
				
			||||||
 | 
					                    yAlign: 'center'
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        let ctx = document.getElementById(cvsId).getContext("2d");        
 | 
				
			||||||
 | 
					        //window.myLine = new Chart(ctx, config);
 | 
				
			||||||
 | 
					        return new Chart(ctx, config);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					YourTeam.Chartjs.Pie = YourTeam.Chartjs.PieHelper || Pie;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function random(min, max) {
 | 
				
			||||||
 | 
					    return Math.floor(Math.random() * max) + min;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										211
									
								
								Frontend/js/yourteam/yourteam.ckeditor5.init.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										211
									
								
								Frontend/js/yourteam/yourteam.ckeditor5.init.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,211 @@
 | 
				
			|||||||
 | 
					var editor = [];
 | 
				
			||||||
 | 
					$(function () {
 | 
				
			||||||
 | 
					    initCkeditor()
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*  --Uplaod Adapater   */
 | 
				
			||||||
 | 
					//class MyUploadAdapter {
 | 
				
			||||||
 | 
					//    constructor(loader) {
 | 
				
			||||||
 | 
					//        this.loader = loader;
 | 
				
			||||||
 | 
					//    }
 | 
				
			||||||
 | 
					//    // start upload methods
 | 
				
			||||||
 | 
					//    upload() {
 | 
				
			||||||
 | 
					//        return new Promise((resolve, reject) => {
 | 
				
			||||||
 | 
					//            // 使用 FileReader() 物件讀取檔案
 | 
				
			||||||
 | 
					//            const reader = this.reader = new window.FileReader();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//            // 觸發錯誤事件,以 reject 丟回 Promise 失敗原因
 | 
				
			||||||
 | 
					//            reader.addEventListener('error', err => {
 | 
				
			||||||
 | 
					//                reject(err);
 | 
				
			||||||
 | 
					//            });
 | 
				
			||||||
 | 
					//            // 觸發 abort 事件時,以 reject() ,使 Promise 失敗
 | 
				
			||||||
 | 
					//            reader.addEventListener('abort', () => {
 | 
				
			||||||
 | 
					//                reject();
 | 
				
			||||||
 | 
					//            });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//            // 告訴 FileReader 物件用 url 格式讀取,用於設定 img.src 性質
 | 
				
			||||||
 | 
					//            this.loader.file.then(file => {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//                console.log(file)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//                // 觸發 load 事件後,resolve 丟回物件完成 Promise
 | 
				
			||||||
 | 
					//                reader.addEventListener('load', () => {
 | 
				
			||||||
 | 
					//                    //file.src = reader.result;
 | 
				
			||||||
 | 
					//                    let myFile = new BICYCLER.Utility.File();
 | 
				
			||||||
 | 
					//                    let myMath = new BICYCLER.Utility.Math();
 | 
				
			||||||
 | 
					//                    let strExtName = "", strOrgName = "", strSaveName = ""
 | 
				
			||||||
 | 
					//                    strSaveName = myMath.guid().replace(' ', '');
 | 
				
			||||||
 | 
					//                    strExtName = myFile.getFileExtension(file.name);
 | 
				
			||||||
 | 
					//                    strOrgName = (strExtName === null || strExtName === "") ? file.name : file.name.replace('.' + strExtName, '');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//                    editorImage.push(file)
 | 
				
			||||||
 | 
					//                    resolve({
 | 
				
			||||||
 | 
					//                        filename: file.name,
 | 
				
			||||||
 | 
					//                        orgname: strOrgName,
 | 
				
			||||||
 | 
					//                        savename: strSaveName,
 | 
				
			||||||
 | 
					//                        extname: strExtName,
 | 
				
			||||||
 | 
					//                        size: file.size,
 | 
				
			||||||
 | 
					//                        urls: {
 | 
				
			||||||
 | 
					//                            default: reader.result
 | 
				
			||||||
 | 
					//                        }
 | 
				
			||||||
 | 
					//                    });
 | 
				
			||||||
 | 
					//                });
 | 
				
			||||||
 | 
					//                reader.readAsDataURL(file);
 | 
				
			||||||
 | 
					//            });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//            //this.loader.read().then(data => {
 | 
				
			||||||
 | 
					//            //    editor.editing.view.change(writer => {
 | 
				
			||||||
 | 
					//            //        writer.setAttribute('src', data, viewImg);
 | 
				
			||||||
 | 
					//            //    });
 | 
				
			||||||
 | 
					//            //});
 | 
				
			||||||
 | 
					//        });
 | 
				
			||||||
 | 
					//    }
 | 
				
			||||||
 | 
					//    // start abort()
 | 
				
			||||||
 | 
					//    abort() {
 | 
				
			||||||
 | 
					//        //  觸發 FileReader abort 事件
 | 
				
			||||||
 | 
					//        this.reader.abort();
 | 
				
			||||||
 | 
					//    }
 | 
				
			||||||
 | 
					//}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function initCkeditor() {
 | 
				
			||||||
 | 
					    return new Promise((resolve) => {
 | 
				
			||||||
 | 
					        let toolbar = {
 | 
				
			||||||
 | 
					            toolbar: {
 | 
				
			||||||
 | 
					                items: [
 | 
				
			||||||
 | 
					                    'heading',
 | 
				
			||||||
 | 
					                    '|',
 | 
				
			||||||
 | 
					                    'fontfamily', 'fontsize', 'fontColor', 'fontBackgroundColor',
 | 
				
			||||||
 | 
					                    '|',
 | 
				
			||||||
 | 
					                    'bold', 'italic', 'underline', 'strikethrough',
 | 
				
			||||||
 | 
					                    '-',
 | 
				
			||||||
 | 
					                    'alignment', 'numberedList', 'bulletedList',
 | 
				
			||||||
 | 
					                    '|',
 | 
				
			||||||
 | 
					                    'indent', 'outdent',
 | 
				
			||||||
 | 
					                    '|',
 | 
				
			||||||
 | 
					                    'link', 'blockquote', /*'ckfinder ,'*/ 'insertTable',
 | 
				
			||||||
 | 
					                    '|',
 | 
				
			||||||
 | 
					                    'undo', 'redo',
 | 
				
			||||||
 | 
					                    '|',
 | 
				
			||||||
 | 
					                    'fullScreen'
 | 
				
			||||||
 | 
					                ],
 | 
				
			||||||
 | 
					                shouldNotGroupWhenFull: true,
 | 
				
			||||||
 | 
					                language: "zh",
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            image: {
 | 
				
			||||||
 | 
					                toolbar: [
 | 
				
			||||||
 | 
					                    'toggleImageCaption', 'linkImage',
 | 
				
			||||||
 | 
					                    '|',
 | 
				
			||||||
 | 
					                    'imageStyle:alignBlockLeft', 'imageStyle:alignCenter', 'imageStyle:alignBlockRight', 'imageStyle:wrapText',
 | 
				
			||||||
 | 
					                    "|",
 | 
				
			||||||
 | 
					                    'resizeImage:original', 'resizeImage:25', 'resizeImage:50', 'resizeImage:75'
 | 
				
			||||||
 | 
					                ],
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            table: {
 | 
				
			||||||
 | 
					                contentToolbar: ['tableProperties', 'tableCellProperties', 'tableRow', 'tableColumn', 'mergeTableCells']
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            //image介面刪除callback
 | 
				
			||||||
 | 
					            //imageRemoveEvent: {
 | 
				
			||||||
 | 
					            //    additionalElementTypes: null, 
 | 
				
			||||||
 | 
					            //    callback: (imagesSrc, nodeObjects) => {
 | 
				
			||||||
 | 
					            //        console.log('callback called', imagesSrc, nodeObjects)
 | 
				
			||||||
 | 
					            //    }
 | 
				
			||||||
 | 
					            //},
 | 
				
			||||||
 | 
					            ckfinder: {
 | 
				
			||||||
 | 
					                //ckfinder 連接器
 | 
				
			||||||
 | 
					                uploadUrl: '/By_Admin/CKfinder/CKfinder/connector?command=Init&type=Images&lang=zh-tw&langCode=zh-tw',
 | 
				
			||||||
 | 
					                options: {
 | 
				
			||||||
 | 
					                    language: 'zh-tw',
 | 
				
			||||||
 | 
					                    resourceType: 'Images'
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $("[data-toggle^=ckeditor]").each((index, value) => {
 | 
				
			||||||
 | 
					            //取得原有element class
 | 
				
			||||||
 | 
					            let oriWidth = $(value).css("width");
 | 
				
			||||||
 | 
					            let oriMaxWidth = $(value).css("max-width");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            ClassicEditor.create(value, toolbar)
 | 
				
			||||||
 | 
					                .then(NewEditor => {
 | 
				
			||||||
 | 
					                    if ($("[data-toggle^=ckeditor]").length == 1) {
 | 
				
			||||||
 | 
					                        editor = NewEditor;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        //讀進來的Source element disabled時,該CKEditor => enableReadOnlyMode('secret string')
 | 
				
			||||||
 | 
					                        if ($(value).prop("disabled") == true) {
 | 
				
			||||||
 | 
					                            editor.enableReadOnlyMode('bicycler');
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        //剪貼簿讀進來不呈現樣式
 | 
				
			||||||
 | 
					                        //const plugin = editor.plugins.get('Clipboard');
 | 
				
			||||||
 | 
					                        //plugin.on('inputTransformation', (evt, data) => {
 | 
				
			||||||
 | 
					                        //    const dataTransfer = data.dataTransfer;
 | 
				
			||||||
 | 
					                        //    data.content = editor.data.processor.toView(regexTextToHtml(dataTransfer.getData('text/plain')));
 | 
				
			||||||
 | 
					                        //})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        //上傳照片(非CKfinder)配置UploadAdapter
 | 
				
			||||||
 | 
					                        //editor.plugins.get('FileRepository').createUploadAdapter = loader => {
 | 
				
			||||||
 | 
					                        //    console.log(editor.plugins.get('FileRepository'))
 | 
				
			||||||
 | 
					                        //    return new MyUploadAdapter(loader)
 | 
				
			||||||
 | 
					                        //}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        //放入原有col- class 
 | 
				
			||||||
 | 
					                        $(editor.ui.view.element).css("width", oriWidth);
 | 
				
			||||||
 | 
					                        $(editor.ui.view.element).css("max-width", oriMaxWidth);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        resolve();
 | 
				
			||||||
 | 
					                    } else {
 | 
				
			||||||
 | 
					                        let sub = $(value).data("toggle").split("ckeditor")[1];
 | 
				
			||||||
 | 
					                        editor[sub] = NewEditor
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        //讀進來的Source element disabled時,該CKEditor => enableReadOnlyMode('secret string')
 | 
				
			||||||
 | 
					                        if ($(value).prop("disabled") == true) {
 | 
				
			||||||
 | 
					                            editor[sub].enableReadOnlyMode('2421ww');
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        //貼上時指文字呈現
 | 
				
			||||||
 | 
					                        //const plugin = editor[sub].plugins.get('Clipboard');
 | 
				
			||||||
 | 
					                        //plugin.on('inputTransformation', (evt, data) => {
 | 
				
			||||||
 | 
					                        //    const dataTransfer = data.dataTransfer;
 | 
				
			||||||
 | 
					                        //    data.content = editor[sub].data.processor.toView(regexTextToHtml(dataTransfer.getData('text/plain')));
 | 
				
			||||||
 | 
					                        //})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        //上傳照片(非CKfinder)配置UploadAdapter
 | 
				
			||||||
 | 
					                        editor[sub].plugins.get('FileRepository').createUploadAdapter = loader => {
 | 
				
			||||||
 | 
					                            console.log(editor[sub].plugins.get('FileRepository'))
 | 
				
			||||||
 | 
					                            return new MyUploadAdapter(loader)
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        //放入原有col- class 
 | 
				
			||||||
 | 
					                        $(editor[sub].ui.view.element).css("width", oriWidth);
 | 
				
			||||||
 | 
					                        $(editor[sub].ui.view.element).css("max-width", oriMaxWidth);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        resolve();
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                })
 | 
				
			||||||
 | 
					                .catch(err => {
 | 
				
			||||||
 | 
					                    console.error(err.stack);
 | 
				
			||||||
 | 
					                    resolve();
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function regexTextToHtml(text) {
 | 
				
			||||||
 | 
					    let data = text;
 | 
				
			||||||
 | 
					    data = data.replace(/\r/gm, "");
 | 
				
			||||||
 | 
					    data = data.replace(/\n\n/gm, "\n");
 | 
				
			||||||
 | 
					    data = data.replace(/^/gm, "<p>");
 | 
				
			||||||
 | 
					    data = data.replace(/\n|\n\n/gm, "</p>");
 | 
				
			||||||
 | 
					    return data;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function regexHtmlToText(html) {
 | 
				
			||||||
 | 
					    let data = html;
 | 
				
			||||||
 | 
					    data = data.replace(/<p>/gm, "");
 | 
				
			||||||
 | 
					    data = data.replace(/<\/p>/gm, "\n");
 | 
				
			||||||
 | 
					    data = data.replace(/ /gm, " ");
 | 
				
			||||||
 | 
					    data = data.replace(/ /gm, " ");
 | 
				
			||||||
 | 
					    data = data.replace(/ /gm, " ");
 | 
				
			||||||
 | 
					    return data;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										644
									
								
								Frontend/js/yourteam/yourteam.jquery.datatables.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										644
									
								
								Frontend/js/yourteam/yourteam.jquery.datatables.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,644 @@
 | 
				
			|||||||
 | 
					var YourTeam = YourTeam || {};
 | 
				
			||||||
 | 
					YourTeam.JqDataTables = YourTeam.JqDataTables || {};
 | 
				
			||||||
 | 
					/* @deprecated since version 0.2
 | 
				
			||||||
 | 
					*  @description change datatables prototype language
 | 
				
			||||||
 | 
					*  @author Darren Chen
 | 
				
			||||||
 | 
					*  @date   2018/04/18
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					$.fn.dataTable.defaults.oLanguage = {
 | 
				
			||||||
 | 
					    "sProcessing": "等待中...",
 | 
				
			||||||
 | 
					    "sLengthMenu": "顯示 _MENU_ 項結果",
 | 
				
			||||||
 | 
					    "sZeroRecords": "沒有匹配結果",
 | 
				
			||||||
 | 
					    "sInfo": "顯示第 _START_ 至 _END_ 項結果,共 _TOTAL_ 項",
 | 
				
			||||||
 | 
					    "sInfoEmpty": "顯示第 0 至 0 項結果,共 0 項",
 | 
				
			||||||
 | 
					    "sInfoFiltered": "(由 _MAX_ 項結果過濾)",
 | 
				
			||||||
 | 
					    "sInfoPostFix": "",
 | 
				
			||||||
 | 
					    "sSearch": "搜索:",
 | 
				
			||||||
 | 
					    "sUrl": "",
 | 
				
			||||||
 | 
					    "sThousands": "",
 | 
				
			||||||
 | 
					    "sEmptyTable": "表中數據為空",
 | 
				
			||||||
 | 
					    "sLoadingRecords": "載入中...",
 | 
				
			||||||
 | 
					    "sInfoThousands": ",",
 | 
				
			||||||
 | 
					    "oPaginate": {
 | 
				
			||||||
 | 
					        "sFirst": "首頁",
 | 
				
			||||||
 | 
					        "sPrevious": "上頁",
 | 
				
			||||||
 | 
					        "sNext": "下頁",
 | 
				
			||||||
 | 
					        "sLast": "末頁"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "oAria": {
 | 
				
			||||||
 | 
					        "sSortAscending": ": 以升序排列此列",
 | 
				
			||||||
 | 
					        "sSortDescending": ": 以降序排列此列"
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* @deprecated since version 0.1
 | 
				
			||||||
 | 
					*  @description init the jq datatables no data with the page ui
 | 
				
			||||||
 | 
					*  @param {String} tag jq datatables id(#id) or class(.class)
 | 
				
			||||||
 | 
					*  @param {Array} colnum_defs these is colnum def. with init the table
 | 
				
			||||||
 | 
					*  @param {function} initComplete after init complete run a function
 | 
				
			||||||
 | 
					*  @param {function} drawCallback after draw complete run a function
 | 
				
			||||||
 | 
					*  @author Darren Chen
 | 
				
			||||||
 | 
					*  @date   2020/12/10
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					function fnInitJqDataTablesNoData(tag, dataSet = null, columns = null, columnDefs = null, initComplete = null, drawCallback = null, rowsGroup = null, rowGroup = null, dom = '<"toolbar">frtipl' ) {
 | 
				
			||||||
 | 
					    let fnDrawCallBack = function () {
 | 
				
			||||||
 | 
					        drawCallback != null ? drawCallback() : "";
 | 
				
			||||||
 | 
					        let api = this.api();
 | 
				
			||||||
 | 
					        $(".dataTables_scrollBody").css("overflow", "auto");
 | 
				
			||||||
 | 
					        if (api.rows().data().length <= 1) {
 | 
				
			||||||
 | 
					            $(".dataTables_scrollBody").css("overflow", "visible");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    let table = null;
 | 
				
			||||||
 | 
					    let oTable = {
 | 
				
			||||||
 | 
					        "sDom": dom,
 | 
				
			||||||
 | 
					        "data": dataSet,
 | 
				
			||||||
 | 
					        "autoWidth": true,
 | 
				
			||||||
 | 
					        "processing": true,
 | 
				
			||||||
 | 
					        "columns": columns,
 | 
				
			||||||
 | 
					        "aoColumnDefs": columnDefs,
 | 
				
			||||||
 | 
					        "stateSave": true,
 | 
				
			||||||
 | 
					        "pagingType": "full_numbers_custom",
 | 
				
			||||||
 | 
					        "destroy": false,
 | 
				
			||||||
 | 
					        "initComplete": initComplete,
 | 
				
			||||||
 | 
					        "drawCallback": fnDrawCallBack,
 | 
				
			||||||
 | 
					        "rowsGroup": rowsGroup,
 | 
				
			||||||
 | 
					        "rowGroup": rowGroup,
 | 
				
			||||||
 | 
					        "retrieve": true,
 | 
				
			||||||
 | 
					        "responsive": {
 | 
				
			||||||
 | 
					            details: {
 | 
				
			||||||
 | 
					           
 | 
				
			||||||
 | 
					                target: '.dt-mobile-btn',
 | 
				
			||||||
 | 
					                type: "column",
 | 
				
			||||||
 | 
					                renderer: function (api, rowIdx, columns) {
 | 
				
			||||||
 | 
					                    var data = $.map(columns, function (col, i) {
 | 
				
			||||||
 | 
					                        return col.hidden ?
 | 
				
			||||||
 | 
					                            '<tr data-dt-row="' + col.rowIndex + '" data-dt-column="' + col.columnIndex + '">' +
 | 
				
			||||||
 | 
					                            '<td>' + col.title + ':' + '</td> ' +
 | 
				
			||||||
 | 
					                            '<td>' + col.data + '</td>' +
 | 
				
			||||||
 | 
					                            '</tr>' :
 | 
				
			||||||
 | 
					                            '';
 | 
				
			||||||
 | 
					                    }).join('');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    return data ?
 | 
				
			||||||
 | 
					                        $('<table/>').append(data) :
 | 
				
			||||||
 | 
					                        false;
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					              
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let time = 0;
 | 
				
			||||||
 | 
					    table = $(tag).DataTable(oTable);
 | 
				
			||||||
 | 
					    table.on('processing', function (e, settings, processing) {
 | 
				
			||||||
 | 
					        //過100ms的讀取才秀出loading
 | 
				
			||||||
 | 
					        setTimeout(function () {
 | 
				
			||||||
 | 
					            time == 1 ? loadingSetting("show", "dtProcessing") : "";
 | 
				
			||||||
 | 
					        }, 100);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (processing && time == 0) {  //第一次讀取processing = true
 | 
				
			||||||
 | 
					            time = 1;
 | 
				
			||||||
 | 
					        } else if (!processing && time == 1 ) {   //結束讀取後processing = false
 | 
				
			||||||
 | 
					            loadingSetting("hide", "dtProcessing");
 | 
				
			||||||
 | 
					            time = 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					    table.on('responsive-display', function (e, datatable, row, showHide, update ) {
 | 
				
			||||||
 | 
					        table.columns.adjust();
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    return table;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function fnInitJqDataTables(tag, colnum_defs = null, initComplete = null, drawCallback = null) {
 | 
				
			||||||
 | 
					    return $(tag).DataTable({
 | 
				
			||||||
 | 
					        "dom": '<"toolbar"><"wrapper"ti>',
 | 
				
			||||||
 | 
					        //"responsive": true,
 | 
				
			||||||
 | 
					        "autoWidth": true,
 | 
				
			||||||
 | 
					        //"aoColumns": columns,
 | 
				
			||||||
 | 
					        "aoColumnDefs": colnum_defs,
 | 
				
			||||||
 | 
					        "initComplete": initComplete,
 | 
				
			||||||
 | 
					        "drawCallback": drawCallback,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* @deprecated since version 1.1
 | 
				
			||||||
 | 
					*  @description init jq datatables use jQuery AJAX
 | 
				
			||||||
 | 
					*  @param {String} API url
 | 
				
			||||||
 | 
					*  @param {String} table id (#id)
 | 
				
			||||||
 | 
					*  @param {Object} data
 | 
				
			||||||
 | 
					*  @param {Object} columns 
 | 
				
			||||||
 | 
					*  @param {Object} columns_def
 | 
				
			||||||
 | 
					*  @param {Object} order
 | 
				
			||||||
 | 
					*  @param {String} table header button id (#id)
 | 
				
			||||||
 | 
					*  @param {String} html tag string with the header
 | 
				
			||||||
 | 
					*  @return {String} JSON string
 | 
				
			||||||
 | 
					*  @author Darren Chen
 | 
				
			||||||
 | 
					*  @date   2020/12/11
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					function fnInitJqDataTablesAjax(apiUrl, tag, sendData = null, columns, columns_def, initComplete = null, drawCallback = null, rowsGroup = null, rowGroup = null ,order = null, btn = null, dom = null) {
 | 
				
			||||||
 | 
					    //$(tag).dataTable().fnClearTable();
 | 
				
			||||||
 | 
					    //let sData = data ? (data.Data ? JSON.stringify(data.Data) : null) : null;  
 | 
				
			||||||
 | 
					    if (sendData == null) { 
 | 
				
			||||||
 | 
					        sendData = function (json) {
 | 
				
			||||||
 | 
					            console.log("讀取列表", json)
 | 
				
			||||||
 | 
					            return json;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let fnDrawCallBack = function () {
 | 
				
			||||||
 | 
					        drawCallback != null ? drawCallback() : "";
 | 
				
			||||||
 | 
					        let api = this.api();
 | 
				
			||||||
 | 
					        $(".dataTables_scrollBody").css("overflow", "auto");
 | 
				
			||||||
 | 
					        if (api.rows().data().length <= 1) {
 | 
				
			||||||
 | 
					            $(".dataTables_scrollBody").css("overflow", "visible");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    let table = null;
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					        let oTable = {
 | 
				
			||||||
 | 
					            "ajax": {
 | 
				
			||||||
 | 
					                method: "GET",
 | 
				
			||||||
 | 
					                url: apiUrl,
 | 
				
			||||||
 | 
					                cache: true,
 | 
				
			||||||
 | 
					                async:false,
 | 
				
			||||||
 | 
					                dataSrc: sendData,
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "responsive": {
 | 
				
			||||||
 | 
					                details: {
 | 
				
			||||||
 | 
					                    target: '.dt-mobile-btn',
 | 
				
			||||||
 | 
					                    renderer: function (api, rowIdx, columns) {
 | 
				
			||||||
 | 
					                        var data = $.map(columns, function (col, i) {
 | 
				
			||||||
 | 
					                            return col.hidden ?
 | 
				
			||||||
 | 
					                                '<tr data-dt-row="' + col.rowIndex + '" data-dt-column="' + col.columnIndex + '">' +
 | 
				
			||||||
 | 
					                                '<td>' + col.title + ':' + '</td> ' +
 | 
				
			||||||
 | 
					                                '<td>' + col.data + '</td>' +
 | 
				
			||||||
 | 
					                                '</tr>' :
 | 
				
			||||||
 | 
					                                '';
 | 
				
			||||||
 | 
					                        }).join('');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        return data ?
 | 
				
			||||||
 | 
					                            $('<table/>').append(data) :
 | 
				
			||||||
 | 
					                            false;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "data": null,
 | 
				
			||||||
 | 
					            "EmptyTable": true,
 | 
				
			||||||
 | 
					            "destroy": true,
 | 
				
			||||||
 | 
					            "processing": false,
 | 
				
			||||||
 | 
					            "sDom":'<"toolbar">frtipl',
 | 
				
			||||||
 | 
					            "pagingType": $(window).width() < 768 ? "simple" : "full_numbers_custom",
 | 
				
			||||||
 | 
					            //"responsive": true,
 | 
				
			||||||
 | 
					            "autoWidth": true,
 | 
				
			||||||
 | 
					            "aoColumns": columns,
 | 
				
			||||||
 | 
					            "aoColumnDefs": columns_def,
 | 
				
			||||||
 | 
					            "deferRender": true,
 | 
				
			||||||
 | 
					            "fixedColumns": true,
 | 
				
			||||||
 | 
					            "stateSave": true,
 | 
				
			||||||
 | 
					            "scrollX": true,
 | 
				
			||||||
 | 
					            "scrollY": "700px",
 | 
				
			||||||
 | 
					            "scrollCollapse": true,
 | 
				
			||||||
 | 
					            "autoWidth": true,
 | 
				
			||||||
 | 
					            //"sScrollY": "480px",
 | 
				
			||||||
 | 
					            "orderMulti": true,
 | 
				
			||||||
 | 
					            "header": "#liaison_header",
 | 
				
			||||||
 | 
					            "initComplete": initComplete,
 | 
				
			||||||
 | 
					            "drawCallback": fnDrawCallBack,
 | 
				
			||||||
 | 
					            "rowGroup": rowGroup,
 | 
				
			||||||
 | 
					            "rowsGroup": rowsGroup,
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					        if (order) {
 | 
				
			||||||
 | 
					            oTable.order = order;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (dom) {
 | 
				
			||||||
 | 
					            oTable.dom = dom;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let time = 0;
 | 
				
			||||||
 | 
					        table = $(tag).DataTable(oTable);
 | 
				
			||||||
 | 
					        table.on('processing', function (e, settings, processing) {
 | 
				
			||||||
 | 
					            //過100ms的讀取才秀出loading
 | 
				
			||||||
 | 
					            setTimeout(function () {
 | 
				
			||||||
 | 
					                time == 1 ? loadingSetting("show", "dtProcessing") : "";
 | 
				
			||||||
 | 
					            }, 100);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (processing && time != 1) {  //第一次讀取processing = true
 | 
				
			||||||
 | 
					                time = 1;
 | 
				
			||||||
 | 
					            } else if (!processing && time == 1) {  //結束讀取後processing = false
 | 
				
			||||||
 | 
					                loadingSetting("hide", "dtProcessing");
 | 
				
			||||||
 | 
					                time = 0;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    catch (e) {
 | 
				
			||||||
 | 
					        console.error(e);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return table;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function fnInitJqDataTablesOdata(apiUrl, tag, sendData, columns, columns_def, drawCallback = null, order = null) {
 | 
				
			||||||
 | 
					    //$(tag).dataTable().fnClearTable();
 | 
				
			||||||
 | 
					    //let sData = data ? (data.Data ? JSON.stringify(data.Data) : null) : null;    
 | 
				
			||||||
 | 
					    let table = null;
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					        let oTable = {
 | 
				
			||||||
 | 
					            "sAjaxSource": apiUrl,
 | 
				
			||||||
 | 
					            "iODataVersion": 3,
 | 
				
			||||||
 | 
					            "aoColumns": columns,
 | 
				
			||||||
 | 
					            "aoColumnDefs": columns_def,
 | 
				
			||||||
 | 
					            "fnServerData": fnServerOData, // required
 | 
				
			||||||
 | 
					            "bProcessing": true,
 | 
				
			||||||
 | 
					            "bServerSide": true,  // optional
 | 
				
			||||||
 | 
					            "bDestroy": true,
 | 
				
			||||||
 | 
					            "bUseODataViaJSONP": false,  // set to true if using cross-domain requests
 | 
				
			||||||
 | 
					            "sDom": '<"toolbar">f<"selector">rtipl',
 | 
				
			||||||
 | 
					            "stateSave": true,
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					        if (order) {
 | 
				
			||||||
 | 
					            oTable.order = order;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        table = $(tag).DataTable(oTable);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    catch (e) {
 | 
				
			||||||
 | 
					        console.error(e);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return table;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function fnInitJqDataTablesServerSideAjax(apiUrl, tag, sendData, columns, columns_def, initComplete = null, drawCallback = null, rowsGroup = null, rowGroup = null, order = null, btn = null, dom = null) {
 | 
				
			||||||
 | 
					    //$(tag).dataTable().fnClearTable();
 | 
				
			||||||
 | 
					    //let sData = data ? (data.Data ? JSON.stringify(data.Data) : null) : null;    
 | 
				
			||||||
 | 
					    let table = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let fnDrawCallBack = function () {
 | 
				
			||||||
 | 
					        let api = this.api();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        drawCallback != null ? drawCallback(api) : "";
 | 
				
			||||||
 | 
					        //若只有一列 overflow改為 visible (tooltip/popover 不會阻擋)
 | 
				
			||||||
 | 
					        $(".dataTables_scrollBody").css("overflow", "auto");
 | 
				
			||||||
 | 
					        if (api.rows().data().length <= 1) {
 | 
				
			||||||
 | 
					            $(".dataTables_scrollBody").css("overflow", "visible");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					        let oTable = {
 | 
				
			||||||
 | 
					            "sAjaxSource": apiUrl,
 | 
				
			||||||
 | 
					            //"ajax": {
 | 
				
			||||||
 | 
					            //    "method":"POST",
 | 
				
			||||||
 | 
					            //    "url": apiUrl,
 | 
				
			||||||
 | 
					            //},
 | 
				
			||||||
 | 
					            "responsive": {
 | 
				
			||||||
 | 
					                details: {
 | 
				
			||||||
 | 
					                    renderer: function (api, rowIdx, columns) {
 | 
				
			||||||
 | 
					                        var data = $.map(columns, function (col, i) {
 | 
				
			||||||
 | 
					                            return col.hidden ?
 | 
				
			||||||
 | 
					                                '<tr data-dt-row="' + col.rowIndex + '" data-dt-column="' + col.columnIndex + '">' +
 | 
				
			||||||
 | 
					                                '<td>' + col.title + ':' + '</td> ' +
 | 
				
			||||||
 | 
					                                '<td>' + col.data + '</td>' +
 | 
				
			||||||
 | 
					                                '</tr>' :
 | 
				
			||||||
 | 
					                                '';
 | 
				
			||||||
 | 
					                        }).join('');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        return data ?
 | 
				
			||||||
 | 
					                            $('<table/>').append(data) :
 | 
				
			||||||
 | 
					                            false;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "fnServerParams": sendData,
 | 
				
			||||||
 | 
					            "data": null,
 | 
				
			||||||
 | 
					            "EmptyTable": true,
 | 
				
			||||||
 | 
					            "destroy": true,
 | 
				
			||||||
 | 
					            "processing": false,
 | 
				
			||||||
 | 
					            "sDom": '<"toolbar">f<"selector">rtipl',
 | 
				
			||||||
 | 
					            "paging": true,
 | 
				
			||||||
 | 
					            "pagingType": $(window).width() < 768 ? "simple" : "full_numbers_custom",
 | 
				
			||||||
 | 
					            //"responsive": true,
 | 
				
			||||||
 | 
					            "autoWidth": true,
 | 
				
			||||||
 | 
					            "aoColumns": columns,
 | 
				
			||||||
 | 
					            "aoColumnDefs": columns_def,
 | 
				
			||||||
 | 
					            "deferRender": true,
 | 
				
			||||||
 | 
					            "fixedColumns": true,
 | 
				
			||||||
 | 
					            "stateSave": true,
 | 
				
			||||||
 | 
					            "stateSaveParams": function (settings, data) {
 | 
				
			||||||
 | 
					                //紀錄該頁是否有篩選Filter
 | 
				
			||||||
 | 
					                if ($(".column_filter")) {
 | 
				
			||||||
 | 
					                    let saveFilterArr = [];
 | 
				
			||||||
 | 
					                    
 | 
				
			||||||
 | 
					                    $(".column_filter input:checkbox:checked").each(function (i, v) {
 | 
				
			||||||
 | 
					                        let id = $(v)[0].id;
 | 
				
			||||||
 | 
					                        saveFilterArr.push(id);
 | 
				
			||||||
 | 
					                    })
 | 
				
			||||||
 | 
					                    data.CustomFilter = JSON.stringify(saveFilterArr);  //把勾選的篩選儲存到datatable state
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "scrollX": true,
 | 
				
			||||||
 | 
					            "scrollY": "700px",
 | 
				
			||||||
 | 
					            "scrollCollapse": true,
 | 
				
			||||||
 | 
					            "autoWidth": true,
 | 
				
			||||||
 | 
					            //"sScrollY": "480px",
 | 
				
			||||||
 | 
					            "orderMulti": true,
 | 
				
			||||||
 | 
					            "bServerSide": true,
 | 
				
			||||||
 | 
					            "header": "#liaison_header",
 | 
				
			||||||
 | 
					            "initComplete": initComplete,
 | 
				
			||||||
 | 
					            "drawCallback": fnDrawCallBack,
 | 
				
			||||||
 | 
					            "rowGroup": rowGroup,
 | 
				
			||||||
 | 
					            "rowsGroup": rowsGroup,
 | 
				
			||||||
 | 
					           
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					        if (order) {
 | 
				
			||||||
 | 
					            oTable.order = order;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (dom) {
 | 
				
			||||||
 | 
					            oTable.dom = dom;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let time = 0;
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        table = $(tag).DataTable(oTable);
 | 
				
			||||||
 | 
					        $.fn.DataTable.ext.pager.numbers_length = 9;
 | 
				
			||||||
 | 
					       
 | 
				
			||||||
 | 
					        console.log($.fn.DataTable.ext.pager)
 | 
				
			||||||
 | 
					        table.on('processing', function (e, settings, processing) {
 | 
				
			||||||
 | 
					            //過100ms的讀取才秀出loading
 | 
				
			||||||
 | 
					            setTimeout(function () {
 | 
				
			||||||
 | 
					                time == 1 ? loadingSetting("show", "pageload") : "";
 | 
				
			||||||
 | 
					            }, 100);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (processing && time == 0) {  //第一次讀取processing = true
 | 
				
			||||||
 | 
					                time = 1;
 | 
				
			||||||
 | 
					            } else if (!processing && time == 1 && tableStatus != 2){   //結束讀取後processing = false
 | 
				
			||||||
 | 
					                loadingSetting("hide", "pageload");
 | 
				
			||||||
 | 
					                time = 0;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        table.on('xhr', function (e, settings, json, xhr) {
 | 
				
			||||||
 | 
					            console.log("讀取列表", json.aaData);
 | 
				
			||||||
 | 
					           
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        table.on('page', function (e, setting) {
 | 
				
			||||||
 | 
					            $(`${tag}_wrapper .dataTables_scrollBody`).scrollTop(0);
 | 
				
			||||||
 | 
					            pageScrollPos = 0;
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    catch (e) {
 | 
				
			||||||
 | 
					        console.error(e);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return table;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					YourTeam.JqDataTables.getTableByOdata = fnInitJqDataTablesOdata;
 | 
				
			||||||
 | 
					YourTeam.JqDataTables.getTableByAjax = fnInitJqDataTablesAjax;
 | 
				
			||||||
 | 
					YourTeam.JqDataTables.getTableByServerSideAjax = fnInitJqDataTablesServerSideAjax;
 | 
				
			||||||
 | 
					YourTeam.JqDataTables.getTableByStatic = fnInitJqDataTablesNoData;
 | 
				
			||||||
 | 
					YourTeam.JqDataTables.getTableByNoAjax = fnInitJqDataTables;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* @deprecated since version 1.1
 | 
				
			||||||
 | 
					*  @description add one new row  with the jq datatables
 | 
				
			||||||
 | 
					*  @param {Object} table the jq datatables
 | 
				
			||||||
 | 
					*  @param {Object} item one JSON item with the data Object
 | 
				
			||||||
 | 
					*  @param {Object} data the data Object
 | 
				
			||||||
 | 
					*  @return
 | 
				
			||||||
 | 
					*  @author Darren Chen
 | 
				
			||||||
 | 
					*  @date   2020/12/11
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					function fnJqDataTablesNewRow(table, itemSpace) {
 | 
				
			||||||
 | 
					    let isSuccess = false;
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					        table.row.add(itemSpace).draw(false);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    catch (e) {
 | 
				
			||||||
 | 
					        console.error(e);
 | 
				
			||||||
 | 
					        return isSuccess;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return isSuccess;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					YourTeam.JqDataTables.newRow = fnJqDataTablesNewRow;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* @deprecated since version 1.1
 | 
				
			||||||
 | 
					*  @description add one row and data with the jq datatables
 | 
				
			||||||
 | 
					*  @param {Object} table the jq datatables
 | 
				
			||||||
 | 
					*  @param {Object} item one JSON item with the data Object
 | 
				
			||||||
 | 
					*  @param {Object} data the data Object
 | 
				
			||||||
 | 
					*  @return 
 | 
				
			||||||
 | 
					*  @author Darren Chen
 | 
				
			||||||
 | 
					*  @date   2020/12/11
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					function fnJqDataTablesAddRow(table, item) {
 | 
				
			||||||
 | 
					    let isSuccess = false;
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					        if (table && item) {
 | 
				
			||||||
 | 
					            table.row.add(item).draw(false);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    catch (e) {
 | 
				
			||||||
 | 
					        console.error(e);
 | 
				
			||||||
 | 
					        return isSuccess;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return isSuccess;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					YourTeam.JqDataTables.addRow = fnJqDataTablesAddRow;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* @deprecated since version 1.1
 | 
				
			||||||
 | 
					*  @description remove one row and data with the jq datatables
 | 
				
			||||||
 | 
					*  @param {String} tableId the datatables`s id
 | 
				
			||||||
 | 
					*  @param {String} elementSelector the jq selector with remove row element
 | 
				
			||||||
 | 
					*  @return {Bollean} isSuccess
 | 
				
			||||||
 | 
					*  @author Darren Chen
 | 
				
			||||||
 | 
					*  @date   2020/12/11
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					function fnJqDataTablesRemoveRow(tableId, elementSelector) {
 | 
				
			||||||
 | 
					    let isSuccess = false;
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					        $('#' + tableId + ' tbody').on('click', elementSelector, function () {
 | 
				
			||||||
 | 
					            table.row($(this).parents('tr')).remove().draw(false);
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        isSuccess = true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    catch (e) {
 | 
				
			||||||
 | 
					        console.error(e);
 | 
				
			||||||
 | 
					        return isSuccess;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return isSuccess;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					YourTeam.JqDataTables.removeRow = fnJqDataTablesRemoveRow;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* @deprecated since version 0.3
 | 
				
			||||||
 | 
					*  @description display buton 
 | 
				
			||||||
 | 
					*  @param {Boolean} have create power?
 | 
				
			||||||
 | 
					*  @param {Boolean} have edit power?
 | 
				
			||||||
 | 
					*  @param {Boolean} have delete power?
 | 
				
			||||||
 | 
					*  @param {Boolean} have print power?
 | 
				
			||||||
 | 
					*  @return {String}
 | 
				
			||||||
 | 
					*  @author Darren Chen
 | 
				
			||||||
 | 
					*  @date   2018/04/18
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					function showControlItem(Create, Edit, Delete, Print) {
 | 
				
			||||||
 | 
					    if (Create) {
 | 
				
			||||||
 | 
					        $("#btnCreat").show();
 | 
				
			||||||
 | 
					        $("#ERP_insert").show();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else {
 | 
				
			||||||
 | 
					        $("#btnCreat").hide();
 | 
				
			||||||
 | 
					        $("#ERP_insert").hide();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (Edit) {
 | 
				
			||||||
 | 
					        $("a.green").show();
 | 
				
			||||||
 | 
					        $("#date_check").show();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else {
 | 
				
			||||||
 | 
					        $("a.green").hide();
 | 
				
			||||||
 | 
					        $("#date_check").hide();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (Delete) {
 | 
				
			||||||
 | 
					        $("#checkDelete").show();
 | 
				
			||||||
 | 
					        $("#date_check").show();
 | 
				
			||||||
 | 
					        $("a.red").show();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else {
 | 
				
			||||||
 | 
					        $("#checkDelete").hide();
 | 
				
			||||||
 | 
					        $("#date_check").hide();
 | 
				
			||||||
 | 
					        $("a.red").hide();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (Print) {
 | 
				
			||||||
 | 
					        $("a[name='print']").show();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else {
 | 
				
			||||||
 | 
					        $("a[name='print']").hide();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let hide_star = "********";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* @deprecated since version 0.2
 | 
				
			||||||
 | 
					*  @description replace the field
 | 
				
			||||||
 | 
					*  @param {String} the element id
 | 
				
			||||||
 | 
					*  @param {Boolean} ready only
 | 
				
			||||||
 | 
					*  @author Darren Chen
 | 
				
			||||||
 | 
					*  @date   2018/04/18
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					function hide_field(tag, is_readonly = null) {
 | 
				
			||||||
 | 
					    var text = "";
 | 
				
			||||||
 | 
					    $(tag).each(function () {
 | 
				
			||||||
 | 
					        if ($(this).prop("tagName").toLowerCase() === "input") {
 | 
				
			||||||
 | 
					            text = $(this).val().toString();
 | 
				
			||||||
 | 
					            if (text === "-999999999") {
 | 
				
			||||||
 | 
					                $(this).val(hide_star);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else if ($(this).prop("tagName").toLowerCase() === "div") {
 | 
				
			||||||
 | 
					            text = $(this).text().toString();
 | 
				
			||||||
 | 
					            if (text === "-999999999") {
 | 
				
			||||||
 | 
					                $(this).text(hide_star);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else if ($(this).prop("tagName").toLowerCase() === "td") {
 | 
				
			||||||
 | 
					            text = $(this).text().toString();
 | 
				
			||||||
 | 
					            if (text === "-999999999") {
 | 
				
			||||||
 | 
					                $(this).text(hide_star);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (is_readonly) {
 | 
				
			||||||
 | 
					            $(this).prop("readonly", true);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* @deprecated since version 0.1
 | 
				
			||||||
 | 
					*  @description 阻止ServerSide Datatable 在特定時間內傳出大量值
 | 
				
			||||||
 | 
					*  @author JunHao Lin
 | 
				
			||||||
 | 
					*  @date   2021/12/22
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					function serverSideExecLimit() {
 | 
				
			||||||
 | 
					    let lastTime;
 | 
				
			||||||
 | 
					    $($.fn.dataTable.tables(true)).on('order.dt page.dt search.dt xhr.dt', function (e, settings, ordArr) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        //排序時Callback會回傳兩次,所以判斷時間差只抓取一次
 | 
				
			||||||
 | 
					        //(時間差之內的排序執行 || 換頁執行 || 搜尋執行)
 | 
				
			||||||
 | 
					        if (settings.oInit.bServerSide == true) {
 | 
				
			||||||
 | 
					            if (((e.timeStamp - lastTime <= 300 && (e.handleObj.origType == "order") || e.handleObj.origType == "page" || e.handleObj.origType == "search")) && settings.oAjaxData != undefined  && (settings.oAjaxData).length != 0) {
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					                if (tableStatus == 0) {   //tableStatus = 0 | 還沒觸發執行
 | 
				
			||||||
 | 
					                    tableStatus = 1  //tableStatus = 1 | 已觸發執行,可接受執行  
 | 
				
			||||||
 | 
					                    calEventTime = setInterval(function () {   //計數五秒
 | 
				
			||||||
 | 
					                        if (timeNum == 5) {   //若到第五秒
 | 
				
			||||||
 | 
					                            pageEventNum = searchEventNum = orderEventNum = 0  //執行次數復歸
 | 
				
			||||||
 | 
					                            timeNum = 0  //秒數歸零
 | 
				
			||||||
 | 
					                            tableStatus = 0  //狀態復歸
 | 
				
			||||||
 | 
					                            clearInterval(calEventTime)  //計數關閉
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        timeNum++;   //秒數++
 | 
				
			||||||
 | 
					                    }, 1000)
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                //在五秒之內,排序執行超過五次
 | 
				
			||||||
 | 
					                if (timeNum < 5 && orderEventNum >= 5 && e.handleObj.origType == "order" && tableStatus == 1) {
 | 
				
			||||||
 | 
					                    tableStatus = 2;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                //在五秒之內,搜尋執行超過五次
 | 
				
			||||||
 | 
					                if (timeNum < 5 && searchEventNum >= 10 && e.handleObj.origType == "search" && tableStatus == 1) {
 | 
				
			||||||
 | 
					                    tableStatus = 2;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                //在五秒之內,換頁執行超過五次
 | 
				
			||||||
 | 
					                if (timeNum < 5 && pageEventNum >= 5 && e.handleObj.origType == "page" && tableStatus == 1) {
 | 
				
			||||||
 | 
					                    tableStatus = 2;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                //執行次數++
 | 
				
			||||||
 | 
					                switch (e.handleObj.origType) {
 | 
				
			||||||
 | 
					                    case "order":
 | 
				
			||||||
 | 
					                        orderEventNum++;
 | 
				
			||||||
 | 
					                        break;
 | 
				
			||||||
 | 
					                    case "search":
 | 
				
			||||||
 | 
					                        searchEventNum++;
 | 
				
			||||||
 | 
					                        break;
 | 
				
			||||||
 | 
					                    case "page":
 | 
				
			||||||
 | 
					                        pageEventNum++;
 | 
				
			||||||
 | 
					                        break;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                //tableStatus = 2 | 已觸發執行,不可接受執行(超出執行條件)  
 | 
				
			||||||
 | 
					                if (tableStatus == 2) {
 | 
				
			||||||
 | 
					                    showAlert("danger", "執行次數過多!")
 | 
				
			||||||
 | 
					                    loadingSetting("show","dtServerSide");    //出現loading
 | 
				
			||||||
 | 
					                    setTimeout(function () {
 | 
				
			||||||
 | 
					                        loadingSetting("hide", "dtServerSide");
 | 
				
			||||||
 | 
					                        pageEventNum = searchEventNum = orderEventNum = 0   //執行次數復歸
 | 
				
			||||||
 | 
					                        timeNum = 0  //秒數歸零
 | 
				
			||||||
 | 
					                        tableStatus = 0   //狀態復歸
 | 
				
			||||||
 | 
					                        clearInterval(calEventTime)   //計數關閉
 | 
				
			||||||
 | 
					                    }, 5000)
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        lastTime = e.timeStamp;  //時間差
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }).DataTable()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					YourTeam.JqDataTables.limitServerSideExec = serverSideExecLimit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function sortNumbersIgnoreText(a, b, high) {
 | 
				
			||||||
 | 
					    var reg = /[+-]?((\d+(\.\d*)?)|\.\d+)([eE][+-]?[0-9]+)?/;
 | 
				
			||||||
 | 
					    a = a.match(reg);
 | 
				
			||||||
 | 
					    a = a !== null ? parseFloat(a[0]) : high;
 | 
				
			||||||
 | 
					    b = b.match(reg);
 | 
				
			||||||
 | 
					    b = b !== null ? parseFloat(b[0]) : high;
 | 
				
			||||||
 | 
					    return ((a < b) ? -1 : ((a > b) ? 1 : 0));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					jQuery.extend(jQuery.fn.dataTableExt.oSort, {
 | 
				
			||||||
 | 
					    "sort-numbers-ignore-text-asc": function (a, b) {
 | 
				
			||||||
 | 
					        return sortNumbersIgnoreText(a, b, Number.POSITIVE_INFINITY);
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "sort-numbers-ignore-text-desc": function (a, b) {
 | 
				
			||||||
 | 
					        return sortNumbersIgnoreText(a, b, Number.NEGATIVE_INFINITY) * -1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
							
								
								
									
										946
									
								
								Frontend/js/yourteam/yourteam.utility.class.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										946
									
								
								Frontend/js/yourteam/yourteam.utility.class.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,946 @@
 | 
				
			|||||||
 | 
					var YourTeam = YourTeam || {};
 | 
				
			||||||
 | 
					YourTeam.Utility = YourTeam.Utility || {};
 | 
				
			||||||
 | 
					class UrlHelper {
 | 
				
			||||||
 | 
					    constructor() {
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /* @deprecated since version 0.2
 | 
				
			||||||
 | 
					    *  @description get the param value
 | 
				
			||||||
 | 
					    *  @param {String} sName url param name
 | 
				
			||||||
 | 
					    *  @return {String}
 | 
				
			||||||
 | 
					    *  @author Darren Chen
 | 
				
			||||||
 | 
					    *  @date   2018/04/18
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    param = function (sName) {
 | 
				
			||||||
 | 
					        this._sName = sName;
 | 
				
			||||||
 | 
					        let sReg = new RegExp("(^|&)" + _sName + "=([^&]*)(&|$)"); //創建一個含有目標参数的正則表達式對象
 | 
				
			||||||
 | 
					        let sMatchTarget = window.location.search.substr(1).match(sReg);  //匹配目標参數
 | 
				
			||||||
 | 
					        if (sMatchTarget !== null) {
 | 
				
			||||||
 | 
					            return unescape(sMatchTarget[2]);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return null; //返回参數值
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /* @deprecated since version 0.2 
 | 
				
			||||||
 | 
					    *  @description get the param value form the page`s url
 | 
				
			||||||
 | 
					    *  @param {String} sName url param name
 | 
				
			||||||
 | 
					    *  @param {String} sPageName url page name
 | 
				
			||||||
 | 
					    *  @return {String}
 | 
				
			||||||
 | 
					    *  @author Darren Chen
 | 
				
			||||||
 | 
					    *  @date   2018/04/18
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    paramForPage = function (sName, sPageName) {
 | 
				
			||||||
 | 
					        this.prototype = fnGetUrlParam;
 | 
				
			||||||
 | 
					        let str = this.prototype(sName);
 | 
				
			||||||
 | 
					        this._sPageName = sPageName;
 | 
				
			||||||
 | 
					        if (str !== null && window.location.href.indexOf(_sPageName) !== -1) {
 | 
				
			||||||
 | 
					            return str;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        //if (location.pathname) {
 | 
				
			||||||
 | 
					        //    var sReg = new RegExp("(^|&)" + sName + "=([^&]*)(&|$)"); //創建一個含有目標参数的正則表達式對象
 | 
				
			||||||
 | 
					        //    var sMatchTarget = window.location.search.substr(1).match(sReg);  //匹配目標参數
 | 
				
			||||||
 | 
					        //    if (sMatchTarget !== null && window.location.href.indexOf(sPageName) !== -1) {
 | 
				
			||||||
 | 
					        //        return unescape(sMatchTarget[2]);
 | 
				
			||||||
 | 
					        //    }
 | 
				
			||||||
 | 
					        //}
 | 
				
			||||||
 | 
					        return null; //返回参數值
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					YourTeam.Utility.Url = YourTeam.Utility.Url || UrlHelper;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class UIOperat {
 | 
				
			||||||
 | 
					    constructor() {
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /* @deprecated since version 0.1 
 | 
				
			||||||
 | 
					    *  @description disabled all element in the page (close out some element)
 | 
				
			||||||
 | 
					    *  @param {Array} aOutElementId close out element array
 | 
				
			||||||
 | 
					    *  @return 
 | 
				
			||||||
 | 
					    *  @author Darren Chen
 | 
				
			||||||
 | 
					    *  @date   2018/04/22
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    disabledAllElement = function (aOutElementId) {
 | 
				
			||||||
 | 
					        let aElement = document.getElementsByTagName("input");
 | 
				
			||||||
 | 
					        fnSetAllElementDisabled(aElement, aOutElementId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        aElement = document.getElementsByTagName("textarea");
 | 
				
			||||||
 | 
					        fnSetAllElementDisabled(aElement, aOutElementId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        aElement = document.getElementsByTagName("select");
 | 
				
			||||||
 | 
					        fnSetAllElementDisabled(aElement, aOutElementId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        aElement = document.getElementsByTagName("button");
 | 
				
			||||||
 | 
					        fnSetAllElementDisabled(aElement, aOutElementId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        //aElement = document.getElementsByTagName("label");
 | 
				
			||||||
 | 
					        //for (var i = 0; i < aElement.length; i++) {
 | 
				
			||||||
 | 
					        //    for (var ii = 0; ii < aOutElementId.length; ii++) {
 | 
				
			||||||
 | 
					        //        if (aElement[i] != aOutElementId[ii])
 | 
				
			||||||
 | 
					        //            aElement[i].setAttribute("style", "pointer-events:none;display:block;");
 | 
				
			||||||
 | 
					        //    }
 | 
				
			||||||
 | 
					        //}
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /* @deprecated since version 0.1 
 | 
				
			||||||
 | 
					    *  @description  set all element disabled (close out some element)
 | 
				
			||||||
 | 
					    *  @param {Array} aElement element array
 | 
				
			||||||
 | 
					    *  @param {Array} aOutElementId close out element array
 | 
				
			||||||
 | 
					    *  @return 
 | 
				
			||||||
 | 
					    *  @author Darren Chen
 | 
				
			||||||
 | 
					    *  @date   2018/04/22
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    setAllElementDisabled = function (aElement, aOutElementId) {
 | 
				
			||||||
 | 
					        for (let i = 0; i < aElement.length; i++) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            for (let ii = 0; ii < aOutElementId.length; ii++) {
 | 
				
			||||||
 | 
					                if (aElement[i] !== aOutElementId[ii])
 | 
				
			||||||
 | 
					                    aElement[i].disabled = true;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* @deprecated since version 0.1 
 | 
				
			||||||
 | 
					    *  @description get checked checkboxs (array) for this project
 | 
				
			||||||
 | 
					    *  @param {string} checkBoxName  the delete checkbox`s element name
 | 
				
			||||||
 | 
					    *  @return 
 | 
				
			||||||
 | 
					    *  @author Darren Chen
 | 
				
			||||||
 | 
					    *  @date   2018/07/24
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    getCheckedArray(checkBoxName = "id") {
 | 
				
			||||||
 | 
					        return $('input:checkbox[name=' + checkBoxName + ']:checked').map(function () {
 | 
				
			||||||
 | 
					            return $(this).val();
 | 
				
			||||||
 | 
					        }).get();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					YourTeam.Utility.UIOperat = YourTeam.Utility.UIOperat || UIOperat;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class UIData {
 | 
				
			||||||
 | 
					    constructor() {
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /* @deprecated since version 0.1 
 | 
				
			||||||
 | 
					    *  @description get checked checkboxs 
 | 
				
			||||||
 | 
					    *  @param {String} checkBoxName  the delete checkbox`s element name
 | 
				
			||||||
 | 
					    *  @return ex."551,676,991,188,457,125"
 | 
				
			||||||
 | 
					    *  @author Darren Chen
 | 
				
			||||||
 | 
					    *  @date   2018/07/24
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    checkBoxValueJoin = function (checkBoxName) {
 | 
				
			||||||
 | 
					        return $('input:checkbox[name=' + checkBoxName + ']:checked').map(function () {
 | 
				
			||||||
 | 
					            return $(this).val();
 | 
				
			||||||
 | 
					        }).get().join(',');
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /* @deprecated since version 0.1 
 | 
				
			||||||
 | 
					    *  @description get checked checkboxs 
 | 
				
			||||||
 | 
					    *  @param {String} checkBoxName  the delete checkbox`s element name
 | 
				
			||||||
 | 
					    *  @return ex."551,676,991,188,457,125"
 | 
				
			||||||
 | 
					    *  @author Darren Chen
 | 
				
			||||||
 | 
					    *  @date   2018/07/24
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    checkBoxValueArray = function (checkBoxName) {
 | 
				
			||||||
 | 
					        let ary = [];
 | 
				
			||||||
 | 
					        $('input:checkbox[name=' + checkBoxName + ']:checked').each(function (index, element) {
 | 
				
			||||||
 | 
					            ary.push($(element).val());
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        return ary;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /* @deprecated since version 0.1
 | 
				
			||||||
 | 
					    *  @description Convrt Int To Float
 | 
				
			||||||
 | 
					    *  @param {String} number ori number
 | 
				
			||||||
 | 
					    *  @param {String} keepNum keep number after .
 | 
				
			||||||
 | 
					    *  @return {String}
 | 
				
			||||||
 | 
					    *  @author Darren Chen
 | 
				
			||||||
 | 
					    *  @date   2019/12/31
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    convrtIntToFloat = function (number, keepNum) {
 | 
				
			||||||
 | 
					        let zeroNumber = fnPaddingRight("1", keepNum + 1, "0");
 | 
				
			||||||
 | 
					        zeroNumber = parseInt(zeroNumber);
 | 
				
			||||||
 | 
					        return Math.round(parseFloat(number) * zeroNumber) / zeroNumber;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /* @deprecated since version 0.1
 | 
				
			||||||
 | 
					    *  @description The string Padding Left char
 | 
				
			||||||
 | 
					    *  @param {String} str ori string
 | 
				
			||||||
 | 
					    *  @param {Number} lenght will get string`s lenght
 | 
				
			||||||
 | 
					    *  @param {String} add char
 | 
				
			||||||
 | 
					    *  @return {String}
 | 
				
			||||||
 | 
					    *  @author Darren Chen
 | 
				
			||||||
 | 
					    *  @date   2019/12/31
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    paddingLeft = function (str, lenght, char) {
 | 
				
			||||||
 | 
					        if (str.length >= lenght)
 | 
				
			||||||
 | 
					            return str;
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					            return fnPaddingLeft(char + str, lenght);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /* @deprecated since version 0.1
 | 
				
			||||||
 | 
					    *  @description The string Padding Right char
 | 
				
			||||||
 | 
					    *  @param {String} str ori string
 | 
				
			||||||
 | 
					    *  @param {Number} lenght will get string`s lenght
 | 
				
			||||||
 | 
					    *  @param {String} add char 
 | 
				
			||||||
 | 
					    *  @return {String}
 | 
				
			||||||
 | 
					    *  @author Darren Chen
 | 
				
			||||||
 | 
					    *  @date   2019/12/31
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    paddingRight = function (str, lenght, char) {
 | 
				
			||||||
 | 
					        if (str.length >= lenght)
 | 
				
			||||||
 | 
					            return str;
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					            return fnPaddingRight(str + char, lenght);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					YourTeam.Utility.UIData = YourTeam.Utility.UIData || UIData;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class CookieHelper {
 | 
				
			||||||
 | 
					    constructor() {
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /* @deprecated since version 0.1 
 | 
				
			||||||
 | 
					    *  @description Create a simple cookie  (The duration is preset to 2 days)
 | 
				
			||||||
 | 
					    *  @param {String} name  name with the cookie
 | 
				
			||||||
 | 
					    *  @param {String} value  value with the cookie
 | 
				
			||||||
 | 
					    *  @return 
 | 
				
			||||||
 | 
					    *  @author Darren Chen
 | 
				
			||||||
 | 
					    *  @date   2018/07/24
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    create = function (name, value) {
 | 
				
			||||||
 | 
					        let expires = new Date();
 | 
				
			||||||
 | 
					        //有效時間保存 2 天 2*24*60*60*1000
 | 
				
			||||||
 | 
					        expires.setTime(expires.getTime() + 172800000);
 | 
				
			||||||
 | 
					        document.cookie = name + "=" + escape(value) + ";expires=" + expires.toGMTString();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /* @deprecated since version 0.1 
 | 
				
			||||||
 | 
					    *  @description Get the cookie value by cookie name
 | 
				
			||||||
 | 
					    *  @param {String} name  name with the cookie
 | 
				
			||||||
 | 
					    *  @return {String}
 | 
				
			||||||
 | 
					    *  @author Darren Chen
 | 
				
			||||||
 | 
					    *  @date   2018/07/24
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    get(name) {
 | 
				
			||||||
 | 
					        let arg = escape(name) + "=";
 | 
				
			||||||
 | 
					        let nameLen = arg.length;
 | 
				
			||||||
 | 
					        let cookieLen = document.cookie.length;
 | 
				
			||||||
 | 
					        let i = 0;
 | 
				
			||||||
 | 
					        while (i < cookieLen) {
 | 
				
			||||||
 | 
					            let j = i + nameLen;
 | 
				
			||||||
 | 
					            if (document.cookie.substring(i, j) === arg) return this.getByIndex(j);
 | 
				
			||||||
 | 
					            i = document.cookie.indexOf(" ", i) + 1;
 | 
				
			||||||
 | 
					            if (i === 0) break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return null;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /* @deprecated since version 0.1 
 | 
				
			||||||
 | 
					    *  @description Get the cookie value by index
 | 
				
			||||||
 | 
					    *  @param {Number} index  name with the cookie
 | 
				
			||||||
 | 
					    *  @return {String}
 | 
				
			||||||
 | 
					    *  @author Darren Chen
 | 
				
			||||||
 | 
					    *  @date   2018/07/24
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    getByIndex(startIndex) {
 | 
				
			||||||
 | 
					        let endIndex = document.cookie.indexOf(";", startIndex);
 | 
				
			||||||
 | 
					        if (endIndex === -1) endIndex = document.cookie.length;
 | 
				
			||||||
 | 
					        return unescape(document.cookie.substring(startIndex, endIndex));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* @deprecated since version 0.1
 | 
				
			||||||
 | 
					    *  @description Remove the cookie by cookie name
 | 
				
			||||||
 | 
					    *  @param {String} name  name with the cookie
 | 
				
			||||||
 | 
					    *  @return {Boolean}
 | 
				
			||||||
 | 
					    *  @author Darren Chen
 | 
				
			||||||
 | 
					    *  @date   2021/05/27
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    remove(name) {
 | 
				
			||||||
 | 
					        document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:01 GMT;";
 | 
				
			||||||
 | 
					        if (this.get(name) === null || this.get(name) === "undefined") {
 | 
				
			||||||
 | 
					            return true;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					YourTeam.Utility.Cookie = YourTeam.Utility.Cookie || CookieHelper;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var mathHelperRandomNotRepeatNum = [];
 | 
				
			||||||
 | 
					class MathHelper {
 | 
				
			||||||
 | 
					    constructor() {
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /*
 | 
				
			||||||
 | 
					    * @deprecated since version 0.1
 | 
				
			||||||
 | 
					    * @description 取得隨機值
 | 
				
			||||||
 | 
					    * @param {Number} min 最小值
 | 
				
			||||||
 | 
					    * @param {Number} max 最大值
 | 
				
			||||||
 | 
					    * @returns {Number} 
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    random(min, max) {
 | 
				
			||||||
 | 
					        return Math.floor(Math.random() * max) + min;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    /*
 | 
				
			||||||
 | 
					    * @deprecated since version 0.1
 | 
				
			||||||
 | 
					    * @description 取得GUID
 | 
				
			||||||
 | 
					    * @param {String} str 分隔符號,預設值'-'。
 | 
				
			||||||
 | 
					    * @param {Boolean} isUpperCase 是否大寫,預設值true。
 | 
				
			||||||
 | 
					    * @returns {String} 
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    guid(str = null, isUpperCase = true) {
 | 
				
			||||||
 | 
					        let strGuid = 'xxxxxxxx-xxxx-0xxx-yxyx-xxxxxxxxxxxx';
 | 
				
			||||||
 | 
					        if (str) {
 | 
				
			||||||
 | 
					            strGuid = strGuid.replace('-', str);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        strGuid = strGuid.replace(/[xy]/g, function (c) {
 | 
				
			||||||
 | 
					            var string = Math.random() * 16 | 0, v = c === 'x' ? string : (string & 0x3 | 0x8);
 | 
				
			||||||
 | 
					            return string.toString(16);
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        if (isUpperCase) {
 | 
				
			||||||
 | 
					            strGuid.toUpperCase();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return strGuid;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /*
 | 
				
			||||||
 | 
					    * @deprecated since version 0.1
 | 
				
			||||||
 | 
					    * @description 四捨五入取小數點後2位
 | 
				
			||||||
 | 
					    * @param {Number} num 數值
 | 
				
			||||||
 | 
					    * @returns {Number} 
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    roundRight2p(num) {
 | 
				
			||||||
 | 
					        return +(Math.round(num + "e+2") + "e-2");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /*
 | 
				
			||||||
 | 
					    * @deprecated since version 0.1
 | 
				
			||||||
 | 
					    * @description 四捨五入取小數點後2位
 | 
				
			||||||
 | 
					    * @param {Number} num 數值
 | 
				
			||||||
 | 
					    * @returns {Number} 
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    roundRight2p2(num) {
 | 
				
			||||||
 | 
					        let m = Number((Math.abs(num) * 100).toPrecision(15));
 | 
				
			||||||
 | 
					        return Math.round(m) / 100 * Math.sign(num);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					YourTeam.Utility.Math = YourTeam.Utility.Math || MathHelper;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class DateHelper {
 | 
				
			||||||
 | 
					    constructor() {
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /*
 | 
				
			||||||
 | 
					    * @deprecated since version 0.1
 | 
				
			||||||
 | 
					    * @description 取得現在時間(yyyy-MM-dd)
 | 
				
			||||||
 | 
					    * @param {Boolean} isTwYear it`s Taiwan year?
 | 
				
			||||||
 | 
					    * @returns {String} 
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    getNow = function (isTwYear = false) {
 | 
				
			||||||
 | 
					        let d = new Date();
 | 
				
			||||||
 | 
					        let year = isTwYear ? d.getFullYear() - 1911 : d.getFullYear();
 | 
				
			||||||
 | 
					        let month = d.getMonth() + 1;
 | 
				
			||||||
 | 
					        let day = d.getDate();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let now = year + '-' +
 | 
				
			||||||
 | 
					            (month < 10 ? '0' : '') + month + '-' +
 | 
				
			||||||
 | 
					            (day < 10 ? '0' : '') + day;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return now;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /*
 | 
				
			||||||
 | 
					    * @deprecated since version 0.1
 | 
				
			||||||
 | 
					    * @description 取得日期時間(2020/02/02 PM 18:05:25)
 | 
				
			||||||
 | 
					    * @param {Boolean} isTwYear it`s Taiwan year?
 | 
				
			||||||
 | 
					    * @param {String} dateInterval 最小值
 | 
				
			||||||
 | 
					    * @param {Boolean} isPadZero 最大值
 | 
				
			||||||
 | 
					    * @param {Number} timeTagType 時間前戳標記 1:AM/PM  2:上午/下午
 | 
				
			||||||
 | 
					    * @returns {String} 
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    getNowHaveTimeTag = function (isTwYear = false, dateInterval = '/', isPadZero = true, timeTagType = 1) {
 | 
				
			||||||
 | 
					        let now = new Date();
 | 
				
			||||||
 | 
					        let years = isTwYear ? now.getFullYear() - 1911 : now.getFullYear();
 | 
				
			||||||
 | 
					        let months = now.getMonth();
 | 
				
			||||||
 | 
					        let days = now.getDay();
 | 
				
			||||||
 | 
					        let hours = now.getHours();
 | 
				
			||||||
 | 
					        let minutes = now.getMinutes();
 | 
				
			||||||
 | 
					        let seconds = now.getSeconds();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let dateValue = years;
 | 
				
			||||||
 | 
					        let timeValue = ((hours >= 12) ? "下午 " : "上午 ");
 | 
				
			||||||
 | 
					        if (timeTagType === 2) timeValue = ((hours >= 12) ? "AM " : "PM ");
 | 
				
			||||||
 | 
					        if (isPadZero) {
 | 
				
			||||||
 | 
					            dateValue += (dateInterval + ((months < 10) ? "0" : "") + months);
 | 
				
			||||||
 | 
					            dateValue += (dateInterval + ((days < 10) ? "0" : "") + days);
 | 
				
			||||||
 | 
					            timeValue += ((hours > 12) ? "0" + (hours - 12) : hours);
 | 
				
			||||||
 | 
					            timeValue += ((minutes < 10) ? ":0" : ":") + minutes;
 | 
				
			||||||
 | 
					            timeValue += ((seconds < 10) ? ":0" : ":") + seconds;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else {
 | 
				
			||||||
 | 
					            dateValue += (dateInterval + months);
 | 
				
			||||||
 | 
					            dateValue += (dateInterval + days);
 | 
				
			||||||
 | 
					            timeValue += ((hours > 12) ? hours - 12 : hours);
 | 
				
			||||||
 | 
					            timeValue += minutes;
 | 
				
			||||||
 | 
					            timeValue += seconds;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return dateValue + " " + timeValue;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /*
 | 
				
			||||||
 | 
					    * @deprecated since version 0.1
 | 
				
			||||||
 | 
					    * @description 取得日期時間(2020/02/02 18:05:25)
 | 
				
			||||||
 | 
					    * @param {Boolean} isTwYear it`s Taiwan year?
 | 
				
			||||||
 | 
					    * @param {String} dateInterval 日期間隔字元
 | 
				
			||||||
 | 
					    * @param {Boolean} isPadZero   是否補0
 | 
				
			||||||
 | 
					    * @returns {String} 回傳時間字串
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    getNowChangeInterval = function (isTwYear = false, dateInterval = '/', isPadZero = true) {
 | 
				
			||||||
 | 
					        let today = new Date();
 | 
				
			||||||
 | 
					        let year = isTwYear ? today.getFullYear() - 1911 : today.getFullYear();
 | 
				
			||||||
 | 
					        let currentDateTime =
 | 
				
			||||||
 | 
					            year + dateInterval + ((isPadZero && today.getMonth() + 1 < 10) ? '0' : '') +
 | 
				
			||||||
 | 
					            (today.getMonth() + 1) + dateInterval + ((isPadZero && today.getDate() < 10) ? '0' : '') +
 | 
				
			||||||
 | 
					            today.getDate() + ' ' + ((isPadZero && today.getHours() < 10) ? '0' : '') +
 | 
				
			||||||
 | 
					            today.getHours() + ':' + ((isPadZero && today.getMinutes() < 10) ? '0' : '') +
 | 
				
			||||||
 | 
					            today.getMinutes();
 | 
				
			||||||
 | 
					        return currentDateTime;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /*
 | 
				
			||||||
 | 
					    * @deprecated since version 0.1
 | 
				
			||||||
 | 
					    * @description 取得加減的日期時間(2020/02/02 18:05:25)
 | 
				
			||||||
 | 
					    * @param {Boolean} isTwYear it`s Taiwan year?
 | 
				
			||||||
 | 
					    * @param {String} dateInterval 日期間隔字元
 | 
				
			||||||
 | 
					    * @param {Boolean} isPadZero   是否補0
 | 
				
			||||||
 | 
					    * @returns {String} 回傳時間字串
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    getChangeDateTime(isTwYear = false, dateInterval = '/', addYears = 0, addMonths = 0, addDays = 0, isPadZero = true) {
 | 
				
			||||||
 | 
					        let today = new Date();
 | 
				
			||||||
 | 
					        let year = isTwYear ? today.getFullYear() - 1911 : today.getFullYear();
 | 
				
			||||||
 | 
					        if (addYears > year || addMonths > today.getMonth() || addDays > today.getDate()) {
 | 
				
			||||||
 | 
					            return false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        let date =
 | 
				
			||||||
 | 
					            (year + addYears) + dateInterval + ((isPadZero && today.getMonth() + addMonths + 1 < 10) ? '0' : '') +
 | 
				
			||||||
 | 
					            (today.getMonth() + addMonths + 1) + dateInterval + ((isPadZero && today.getDate() + addDays < 10) ? '0' : '') +
 | 
				
			||||||
 | 
					            (today.getDate() + addDays);
 | 
				
			||||||
 | 
					        return date;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /*
 | 
				
			||||||
 | 
					    * @deprecated since version 0.1
 | 
				
			||||||
 | 
					    * @description 取得禮拜/週幾(禮拜五)
 | 
				
			||||||
 | 
					    * @param {String} dayPreString 前置詞 (禮拜/週/周)
 | 
				
			||||||
 | 
					    * @returns {String} 回傳時間字串
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    getWeekDay(dayPreString = "") {
 | 
				
			||||||
 | 
					        let day = "";
 | 
				
			||||||
 | 
					        let day_list = ['日', '一', '二', '三', '四', '五', '六'];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let today = new Date();
 | 
				
			||||||
 | 
					        let dayGet = today.getDay(); // or "new Date().getDay()";
 | 
				
			||||||
 | 
					        if (dayPreString === "") {
 | 
				
			||||||
 | 
					            day = "(" + day_list[dayGet] + ")";
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            day = dayPreString + day_list[dayGet];
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return day;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /*
 | 
				
			||||||
 | 
					    * @deprecated since version 0.1
 | 
				
			||||||
 | 
					    * @description 取得月份天數
 | 
				
			||||||
 | 
					    * @param {Number} year 年份 (def null)
 | 
				
			||||||
 | 
					    * @param {Number} month 月份 (def null)
 | 
				
			||||||
 | 
					    * @returns {Number} 回傳月份天數
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    getMonthDayCount(year=null,month=null) {
 | 
				
			||||||
 | 
					        let myYear = year;
 | 
				
			||||||
 | 
					        let myMonth = month;
 | 
				
			||||||
 | 
					        let myDate,myDayCount;
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        if (!myYear) {
 | 
				
			||||||
 | 
					            myYear = new Date().getFullYear();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (!myMonth) {
 | 
				
			||||||
 | 
					            myMonth = new Date().getMonth();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        //宣告日期物件
 | 
				
			||||||
 | 
					        myDate = new Date(myYear, myMonth+1, 0);
 | 
				
			||||||
 | 
					        //取得天數
 | 
				
			||||||
 | 
					        myDayCount = myDate.getDate();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return daycount;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /*
 | 
				
			||||||
 | 
					    * @deprecated since version 0.1
 | 
				
			||||||
 | 
					    * @description 取得月份最後一天的日期字串
 | 
				
			||||||
 | 
					    * @param {Number} year 年份 (def null)
 | 
				
			||||||
 | 
					    * @param {Number} month 月份 (def null)
 | 
				
			||||||
 | 
					    * @returns {String} 回傳月份天數字串
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    getMonthLastDateStr(year = null, month = null) {
 | 
				
			||||||
 | 
					        let myYear = year;
 | 
				
			||||||
 | 
					        let myMonth = month;
 | 
				
			||||||
 | 
					        let daycount;
 | 
				
			||||||
 | 
					        if (!myYear) {
 | 
				
			||||||
 | 
					            myYear = new Date().getFullYear();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (!myMonth) {
 | 
				
			||||||
 | 
					            myMonth = new Date().getMonth();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        daycount = this.getMonthDayCount(year, month);
 | 
				
			||||||
 | 
					        let myMonthLastDate = myYear + "/"
 | 
				
			||||||
 | 
					            + (myMonth < 10) ? "0" : "" + myMonth + "/"
 | 
				
			||||||
 | 
					            + (daycount < 10) ? "0" : "" + daycount;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return myMonthLastDate;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					YourTeam.Utility.DateHelper = YourTeam.Utility.DateHelper || DateHelper;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class File {
 | 
				
			||||||
 | 
					    constructor() {
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    readAndPreviewImages(files, containerId, imgWidth = null, imgHeight = null, frontHtml = null, backHtml = null, funDoSomeThing = null, limitMaxSize = null, limitMinSize = 0,limitFun = null) {
 | 
				
			||||||
 | 
					        let htmlImg = "";
 | 
				
			||||||
 | 
					        let container = document.getElementById(containerId);
 | 
				
			||||||
 | 
					        let width = imgWidth ? imgWidth + "px" : "auto";
 | 
				
			||||||
 | 
					        let height = imgHeight ? imgHeight + "px" : "auto";
 | 
				
			||||||
 | 
					        let myMath = new YourTeam.Utility.Math();
 | 
				
			||||||
 | 
					        let myFile = new YourTeam.Utility.File();
 | 
				
			||||||
 | 
					        let strExtName = "",strOrgName="";
 | 
				
			||||||
 | 
					        for (let i = 0; i < files.length; i++) {
 | 
				
			||||||
 | 
					            let file = files[i];
 | 
				
			||||||
 | 
					            if (limitMaxSize != null) {
 | 
				
			||||||
 | 
					                if (file.size / 1024 < limitMinSize || file.size / 1024 > limitMaxSize) {
 | 
				
			||||||
 | 
					                    limitFun ? limitFun() : "";
 | 
				
			||||||
 | 
					                    return false
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            htmlImg = "";
 | 
				
			||||||
 | 
					            if (/\.(jpe?g|png|gif)$/i.test(file.name)) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                let reader = new FileReader();
 | 
				
			||||||
 | 
					                reader.addEventListener("load", function () {
 | 
				
			||||||
 | 
					                    let image = new Image();
 | 
				
			||||||
 | 
					                    let src = this.result;
 | 
				
			||||||
 | 
					                    image.src = this.result;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    image.onload = function () {
 | 
				
			||||||
 | 
					                        strExtName = myFile.getFileExtension(file.name);
 | 
				
			||||||
 | 
					                        strOrgName = (strExtName === null || strExtName === "") ? file.name : file.name.replace('.' + strExtName, '');
 | 
				
			||||||
 | 
					                        htmlImg = frontHtml + '<img data-filename="' + file.name + '" data-orgname="' + strOrgName + '" data-savename="' + myMath.guid().replace(' ', '') + '" data-extname="' + strExtName
 | 
				
			||||||
 | 
					                            + '" data-size="' + file.size + '" width="' + width + '" height="' + height + '" src="' + src + '">'
 | 
				
			||||||
 | 
					                            + backHtml;
 | 
				
			||||||
 | 
					                        container.insertAdjacentHTML("afterBegin", htmlImg);
 | 
				
			||||||
 | 
					                        //$("[name=" + removeClickTagName + "]").on("click", function (e) {
 | 
				
			||||||
 | 
					                        //    e.preventDefault();
 | 
				
			||||||
 | 
					                        //    $(this).closest(removeTag).remove();
 | 
				
			||||||
 | 
					                        //});
 | 
				
			||||||
 | 
					                        if (i === files.length - 1 && funDoSomeThing) {
 | 
				
			||||||
 | 
					                            funDoSomeThing();
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					                reader.readAsDataURL(file);
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                if (showAlert) { 
 | 
				
			||||||
 | 
					                    showAlert("danger", "只支援圖片格式");
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                else {
 | 
				
			||||||
 | 
					                    alert("只支援圖片格式");
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    readAndPreviewFiles(files, containerId, imgWidth = null, imgHeight = null, frontHtml = null, backHtml = null, funDoSomeThing = null) {
 | 
				
			||||||
 | 
					        let htmlImg = "";
 | 
				
			||||||
 | 
					        let container = document.getElementById(containerId);
 | 
				
			||||||
 | 
					        let width = imgWidth ? imgWidth + "px" : "128px";
 | 
				
			||||||
 | 
					        let height = imgHeight ? imgHeight + "px" : "86px";
 | 
				
			||||||
 | 
					        let myMath = new YourTeam.Utility.Math();
 | 
				
			||||||
 | 
					        let myFile = new YourTeam.Utility.File();
 | 
				
			||||||
 | 
					        let strExtName = "", strOrgName = "", strSaveName = "";
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        for (let i = 0; i < files.length; i++) {
 | 
				
			||||||
 | 
					            let file = files[i];
 | 
				
			||||||
 | 
					            htmlImg = "";
 | 
				
			||||||
 | 
					            //alert(/\.(xls?x|doc?x|ptt?x|pdf|zip|rar|7zip|txt|odt|xml|rtf|ods|odp|pps?x)$/i.test(file.name));
 | 
				
			||||||
 | 
					            if (/\.(xls?x|doc?x|ptt?x|pdf|zip|rar|7zip|txt|odt|xml|rtf|ods|odp|pps?x)$/i.test(file.name)) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (file.size == 0) {  //檔案大小為0時不會產生base64,需防呆
 | 
				
			||||||
 | 
					                    showAlert("danger", "無法上傳大小為0的檔案");
 | 
				
			||||||
 | 
					                    return false;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                //先新增a標籤 在套上src 可能解決多檔案上傳時無法讀取到最後上傳檔案的問題
 | 
				
			||||||
 | 
					                strSaveName = myMath.guid().replace(' ', '');
 | 
				
			||||||
 | 
					                strExtName = myFile.getFileExtension(file.name);
 | 
				
			||||||
 | 
					                strOrgName = (strExtName === null || strExtName === "") ? file.name : file.name.replace('.' + strExtName, '');
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					                htmlImg = frontHtml + '<a id="' + strSaveName +'" data-filename="' + file.name + '" data-orgname="' + strOrgName + '" data-savename="' + strSaveName + '" data-extname="' + strExtName
 | 
				
			||||||
 | 
					                    + '" data-size="' + file.size + '" width="' + width + '" height="' + height +'" download="' + strOrgName + '.' + strExtName + '" target="_blank">' + strOrgName + '.' + strExtName + '</a>'
 | 
				
			||||||
 | 
					                    + backHtml;
 | 
				
			||||||
 | 
					                container.insertAdjacentHTML("afterBegin", htmlImg);
 | 
				
			||||||
 | 
					                let reader = new FileReader();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                reader.addEventListener("load", function (event) {
 | 
				
			||||||
 | 
					                    $($(container).find("a")[i]).attr("href", this.result);
 | 
				
			||||||
 | 
					                    if (i === files.length - 1 && funDoSomeThing) {
 | 
				
			||||||
 | 
					                        funDoSomeThing();
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					                reader.readAsDataURL(file);
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                if (showAlert) {
 | 
				
			||||||
 | 
					                    showAlert("danger", "只支援文件格式");
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    alert("只支援文件格式");
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    async getBase64Image(path, callback) {
 | 
				
			||||||
 | 
					        //生成canvas  
 | 
				
			||||||
 | 
					        var canvas = document.createElement('canvas');
 | 
				
			||||||
 | 
					        var ctx = canvas.getContext('2d');
 | 
				
			||||||
 | 
					        var img = new Image();
 | 
				
			||||||
 | 
					        img.src = path;
 | 
				
			||||||
 | 
					        img.setAttribute("crossOrigin", "Anonymous");
 | 
				
			||||||
 | 
					        img.onload = await function () {
 | 
				
			||||||
 | 
					            return new Promise((resolve) => { 
 | 
				
			||||||
 | 
					                //默認按比例壓縮  
 | 
				
			||||||
 | 
					                var w = this.width,
 | 
				
			||||||
 | 
					                    h = this.height;
 | 
				
			||||||
 | 
					                var quality = 0.95; // 默認圖片質量為0.7  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // 創建屬性節點  
 | 
				
			||||||
 | 
					                canvas.setAttribute("width", w);
 | 
				
			||||||
 | 
					                canvas.setAttribute("height", h);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                ctx.drawImage(this, 0, 0, w, h);
 | 
				
			||||||
 | 
					                // quality值越小,所繪制出的圖像越模糊  
 | 
				
			||||||
 | 
					                var base64 = canvas.toDataURL('image/jpeg', quality);
 | 
				
			||||||
 | 
					                // 回調函數返回base64的值  
 | 
				
			||||||
 | 
					                callback(base64);
 | 
				
			||||||
 | 
					                resolve();
 | 
				
			||||||
 | 
					            })
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    getFileExtension(filename) {
 | 
				
			||||||
 | 
					        return filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2).toLowerCase();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					YourTeam.Utility.File = YourTeam.Utility.File || File;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* @deprecated since version 0.1 
 | 
				
			||||||
 | 
					*  @description jQuery Ajax Cors Setings (JSONP)
 | 
				
			||||||
 | 
					*  @return 
 | 
				
			||||||
 | 
					*  @author Darren Chen
 | 
				
			||||||
 | 
					*  @date   2018/07/24
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					///// <reference path="/Scripts/YourTeam/js/yourteam.jq.ajax.cors.js" />
 | 
				
			||||||
 | 
					//var script = document.createElement("script"); //Make a script DOM node
 | 
				
			||||||
 | 
					//script.src = "/Scripts/YourTeam/js/yourteam.jq.ajax.cors.js"; //Set it's src to the provided URL
 | 
				
			||||||
 | 
					//document.head.appendChild(script); //Add it to the end of the head section of the page (could change 'head' to 'body' to add it to the end of the body section instead)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					///* @deprecated since version 0.2
 | 
				
			||||||
 | 
					//*  @description get the param value
 | 
				
			||||||
 | 
					//*  @param {String} sName url param name
 | 
				
			||||||
 | 
					//*  @return {String}
 | 
				
			||||||
 | 
					//*  @author Darren Chen
 | 
				
			||||||
 | 
					//*  @date   2018/04/18
 | 
				
			||||||
 | 
					//*/
 | 
				
			||||||
 | 
					//function fnGetUrlParam(sName) {
 | 
				
			||||||
 | 
					//    this._sName = sName;
 | 
				
			||||||
 | 
					//    let sReg = new RegExp("(^|&)" + _sName + "=([^&]*)(&|$)"); //創建一個含有目標参数的正則表達式對象
 | 
				
			||||||
 | 
					//    let sMatchTarget = window.location.search.substr(1).match(sReg);  //匹配目標参數
 | 
				
			||||||
 | 
					//    if (sMatchTarget !== null) {
 | 
				
			||||||
 | 
					//        return unescape(sMatchTarget[2]);
 | 
				
			||||||
 | 
					//    }
 | 
				
			||||||
 | 
					//    return null; //返回参數值
 | 
				
			||||||
 | 
					//}
 | 
				
			||||||
 | 
					///* @deprecated since version 0.2 
 | 
				
			||||||
 | 
					//*  @description get the param value form the page`s url
 | 
				
			||||||
 | 
					//*  @param {String} sName url param name
 | 
				
			||||||
 | 
					//*  @param {String} sPageName url page name
 | 
				
			||||||
 | 
					//*  @return {String}
 | 
				
			||||||
 | 
					//*  @author Darren Chen
 | 
				
			||||||
 | 
					//*  @date   2018/04/18
 | 
				
			||||||
 | 
					//*/
 | 
				
			||||||
 | 
					//function fnGetUrlParamForPage(sName, sPageName) {
 | 
				
			||||||
 | 
					//    this.prototype = fnGetUrlParam;
 | 
				
			||||||
 | 
					//    let str = this.prototype(sName);
 | 
				
			||||||
 | 
					//    this._sPageName = sPageName;
 | 
				
			||||||
 | 
					//    if (str !== null && window.location.href.indexOf(_sPageName) !== -1) {
 | 
				
			||||||
 | 
					//        return str;
 | 
				
			||||||
 | 
					//    }
 | 
				
			||||||
 | 
					//    //if (location.pathname) {
 | 
				
			||||||
 | 
					//    //    var sReg = new RegExp("(^|&)" + sName + "=([^&]*)(&|$)"); //創建一個含有目標参数的正則表達式對象
 | 
				
			||||||
 | 
					//    //    var sMatchTarget = window.location.search.substr(1).match(sReg);  //匹配目標参數
 | 
				
			||||||
 | 
					//    //    if (sMatchTarget !== null && window.location.href.indexOf(sPageName) !== -1) {
 | 
				
			||||||
 | 
					//    //        return unescape(sMatchTarget[2]);
 | 
				
			||||||
 | 
					//    //    }
 | 
				
			||||||
 | 
					//    //}
 | 
				
			||||||
 | 
					//    return null; //返回参數值
 | 
				
			||||||
 | 
					//}
 | 
				
			||||||
 | 
					///* @deprecated since version 0.1 
 | 
				
			||||||
 | 
					//*  @description disabled all element in the page (close out some element)
 | 
				
			||||||
 | 
					//*  @param {Array} aOutElementId close out element array
 | 
				
			||||||
 | 
					//*  @return 
 | 
				
			||||||
 | 
					//*  @author Darren Chen
 | 
				
			||||||
 | 
					//*  @date   2018/04/22
 | 
				
			||||||
 | 
					//*/
 | 
				
			||||||
 | 
					//function fnDisabledAllElement(aOutElementId) {
 | 
				
			||||||
 | 
					//    let aElement = document.getElementsByTagName("input");
 | 
				
			||||||
 | 
					//    fnSetAllElementDisabled(aElement, aOutElementId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//    aElement = document.getElementsByTagName("textarea");
 | 
				
			||||||
 | 
					//    fnSetAllElementDisabled(aElement, aOutElementId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//    aElement = document.getElementsByTagName("select");
 | 
				
			||||||
 | 
					//    fnSetAllElementDisabled(aElement, aOutElementId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//    aElement = document.getElementsByTagName("button");
 | 
				
			||||||
 | 
					//    fnSetAllElementDisabled(aElement, aOutElementId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//    //aElement = document.getElementsByTagName("label");
 | 
				
			||||||
 | 
					//    //for (var i = 0; i < aElement.length; i++) {
 | 
				
			||||||
 | 
					//    //    for (var ii = 0; ii < aOutElementId.length; ii++) {
 | 
				
			||||||
 | 
					//    //        if (aElement[i] != aOutElementId[ii])
 | 
				
			||||||
 | 
					//    //            aElement[i].setAttribute("style", "pointer-events:none;display:block;");
 | 
				
			||||||
 | 
					//    //    }
 | 
				
			||||||
 | 
					//    //}
 | 
				
			||||||
 | 
					//}
 | 
				
			||||||
 | 
					///* @deprecated since version 0.1 
 | 
				
			||||||
 | 
					//*  @description  set all element disabled (close out some element)
 | 
				
			||||||
 | 
					//*  @param {Array} aElement element array
 | 
				
			||||||
 | 
					//*  @param {Array} aOutElementId close out element array
 | 
				
			||||||
 | 
					//*  @return 
 | 
				
			||||||
 | 
					//*  @author Darren Chen
 | 
				
			||||||
 | 
					//*  @date   2018/04/22
 | 
				
			||||||
 | 
					//*/
 | 
				
			||||||
 | 
					//function fnSetAllElementDisabled(aElement, aOutElementId) {
 | 
				
			||||||
 | 
					//    for (let i = 0; i < aElement.length; i++) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//        for (let ii = 0; ii < aOutElementId.length; ii++) {
 | 
				
			||||||
 | 
					//            if (aElement[i] !== aOutElementId[ii])
 | 
				
			||||||
 | 
					//                aElement[i].disabled = true;
 | 
				
			||||||
 | 
					//        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//    }
 | 
				
			||||||
 | 
					//}
 | 
				
			||||||
 | 
					///* @deprecated since version 0.1 
 | 
				
			||||||
 | 
					//*  @description get checked checkboxs 
 | 
				
			||||||
 | 
					//*  @param {String} checkBoxName  the delete checkbox`s element name
 | 
				
			||||||
 | 
					//*  @return 
 | 
				
			||||||
 | 
					//*  @author Darren Chen
 | 
				
			||||||
 | 
					//*  @date   2018/07/24
 | 
				
			||||||
 | 
					//*/
 | 
				
			||||||
 | 
					//function fnGetCheckedValue(checkBoxName) {
 | 
				
			||||||
 | 
					//    return $('input:checkbox[name=' + checkBoxName + ']:checked').map(function () {
 | 
				
			||||||
 | 
					//        return $(this).val();
 | 
				
			||||||
 | 
					//    }).get().join(',');
 | 
				
			||||||
 | 
					//}
 | 
				
			||||||
 | 
					///* @deprecated since version 0.1 
 | 
				
			||||||
 | 
					//*  @description Create a simple cookie  (The duration is preset to 2 days)
 | 
				
			||||||
 | 
					//*  @param {String} name  name with the cookie
 | 
				
			||||||
 | 
					//*  @param {String} value  value with the cookie
 | 
				
			||||||
 | 
					//*  @return 
 | 
				
			||||||
 | 
					//*  @author Darren Chen
 | 
				
			||||||
 | 
					//*  @date   2018/07/24
 | 
				
			||||||
 | 
					//*/
 | 
				
			||||||
 | 
					//function fnCreateCookie(name, value) {
 | 
				
			||||||
 | 
					//    let expires = new Date();
 | 
				
			||||||
 | 
					//    //有效時間保存 2 天 2*24*60*60*1000
 | 
				
			||||||
 | 
					//    expires.setTime(expires.getTime() + 172800000);
 | 
				
			||||||
 | 
					//    document.cookie = name + "=" + escape(value) + ";expires=" + expires.toGMTString();
 | 
				
			||||||
 | 
					//}
 | 
				
			||||||
 | 
					///* @deprecated since version 0.1 
 | 
				
			||||||
 | 
					//*  @description Get the cookie value by cookie name
 | 
				
			||||||
 | 
					//*  @param {String} name  name with the cookie
 | 
				
			||||||
 | 
					//*  @return 
 | 
				
			||||||
 | 
					//*  @author Darren Chen
 | 
				
			||||||
 | 
					//*  @date   2018/07/24
 | 
				
			||||||
 | 
					//*/
 | 
				
			||||||
 | 
					//function fnGetCookie(name) {
 | 
				
			||||||
 | 
					//    let arg = escape(name) + "=";
 | 
				
			||||||
 | 
					//    let nameLen = arg.length;
 | 
				
			||||||
 | 
					//    let cookieLen = document.cookie.length;
 | 
				
			||||||
 | 
					//    let i = 0;
 | 
				
			||||||
 | 
					//    while (i < cookieLen) {
 | 
				
			||||||
 | 
					//        let j = i + nameLen;
 | 
				
			||||||
 | 
					//        if (document.cookie.substring(i, j) === arg) return getCookieValueByIndex(j);
 | 
				
			||||||
 | 
					//        i = document.cookie.indexOf(" ", i) + 1;
 | 
				
			||||||
 | 
					//        if (i === 0) break;
 | 
				
			||||||
 | 
					//    }
 | 
				
			||||||
 | 
					//    return null;
 | 
				
			||||||
 | 
					//}
 | 
				
			||||||
 | 
					///* @deprecated since version 0.1 
 | 
				
			||||||
 | 
					//*  @description Get the cookie value by index
 | 
				
			||||||
 | 
					//*  @param {Number} index  name with the cookie
 | 
				
			||||||
 | 
					//*  @return 
 | 
				
			||||||
 | 
					//*  @author Darren Chen
 | 
				
			||||||
 | 
					//*  @date   2018/07/24
 | 
				
			||||||
 | 
					//*/
 | 
				
			||||||
 | 
					//function fnGetCookieValueByIndex(startIndex) {
 | 
				
			||||||
 | 
					//    let endIndex = document.cookie.indexOf(";", startIndex);
 | 
				
			||||||
 | 
					//    if (endIndex === -1) endIndex = document.cookie.length;
 | 
				
			||||||
 | 
					//    return unescape(document.cookie.substring(startIndex, endIndex));
 | 
				
			||||||
 | 
					//}
 | 
				
			||||||
 | 
					///*
 | 
				
			||||||
 | 
					//* @deprecated since version 0.1
 | 
				
			||||||
 | 
					//* @description 取得隨機值
 | 
				
			||||||
 | 
					//* @param {Number} min 最小值
 | 
				
			||||||
 | 
					//* @param {Number} max 最大值
 | 
				
			||||||
 | 
					//* @returns {Number} 
 | 
				
			||||||
 | 
					//*/
 | 
				
			||||||
 | 
					//function fnGetRandom(min, max) {
 | 
				
			||||||
 | 
					//    return Math.floor(Math.random() * max) + min;
 | 
				
			||||||
 | 
					//}
 | 
				
			||||||
 | 
					///*
 | 
				
			||||||
 | 
					// * @deprecated since version 0.1
 | 
				
			||||||
 | 
					// * @description 取得現在時間(yyyy-MM-dd)
 | 
				
			||||||
 | 
					// * @param {Boolean} isTwYear it`s Taiwan year?
 | 
				
			||||||
 | 
					// * @returns {String} 
 | 
				
			||||||
 | 
					// */
 | 
				
			||||||
 | 
					//function fnGetNow(isTwYear = false) {
 | 
				
			||||||
 | 
					//    let d = new Date();
 | 
				
			||||||
 | 
					//    let year = isTwYear ? d.getFullYear() - 1911 : d.getFullYear();
 | 
				
			||||||
 | 
					//    let month = d.getMonth() + 1;
 | 
				
			||||||
 | 
					//    let day = d.getDate();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//    let now = year + '-' +
 | 
				
			||||||
 | 
					//        (month < 10 ? '0' : '') + month + '-' +
 | 
				
			||||||
 | 
					//        (day < 10 ? '0' : '') + day;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//    return now;
 | 
				
			||||||
 | 
					//}
 | 
				
			||||||
 | 
					///*
 | 
				
			||||||
 | 
					// * @deprecated since version 0.1
 | 
				
			||||||
 | 
					// * @description 取得日期時間(2020/02/02 PM 18:05:25)
 | 
				
			||||||
 | 
					// * @param {Boolean} isTwYear it`s Taiwan year?
 | 
				
			||||||
 | 
					// * @param {String} dateInterval 最小值
 | 
				
			||||||
 | 
					// * @param {Boolean} isPadZero 最大值
 | 
				
			||||||
 | 
					// * @param {Number} timeTagType 時間前戳標記 1:AM/PM  2:上午/下午
 | 
				
			||||||
 | 
					// * @returns {String} 
 | 
				
			||||||
 | 
					// */
 | 
				
			||||||
 | 
					//function fnShowDateTimeNow(isTwYear = false, dateInterval = '/', isPadZero = true, timeTagType = 1) {
 | 
				
			||||||
 | 
					//    let now = new Date();
 | 
				
			||||||
 | 
					//    let years = isTwYear ? now.getFullYear() - 1911 : now.getFullYear();
 | 
				
			||||||
 | 
					//    let months = now.getMonth();
 | 
				
			||||||
 | 
					//    let days = now.getDay();
 | 
				
			||||||
 | 
					//    let hours = now.getHours();
 | 
				
			||||||
 | 
					//    let minutes = now.getMinutes();
 | 
				
			||||||
 | 
					//    let seconds = now.getSeconds();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//    let dateValue = years;
 | 
				
			||||||
 | 
					//    let timeValue = ((hours >= 12) ? "下午 " : "上午 ");
 | 
				
			||||||
 | 
					//    if (timeTagType === 2) timeValue = ((hours >= 12) ? "AM " : "PM ");
 | 
				
			||||||
 | 
					//    if (isPadZero) {
 | 
				
			||||||
 | 
					//        dateValue += (dateInterval + ((months < 10) ? "0" : "") + months);
 | 
				
			||||||
 | 
					//        dateValue += (dateInterval + ((days < 10) ? "0" : "") + days);
 | 
				
			||||||
 | 
					//        timeValue += ((hours > 12) ? "0" + (hours - 12) : hours);
 | 
				
			||||||
 | 
					//        timeValue += ((minutes < 10) ? ":0" : ":") + minutes;
 | 
				
			||||||
 | 
					//        timeValue += ((seconds < 10) ? ":0" : ":") + seconds;
 | 
				
			||||||
 | 
					//    }
 | 
				
			||||||
 | 
					//    else {
 | 
				
			||||||
 | 
					//        dateValue += (dateInterval + months);
 | 
				
			||||||
 | 
					//        dateValue += (dateInterval + days);
 | 
				
			||||||
 | 
					//        timeValue += ((hours > 12) ? hours - 12 : hours);
 | 
				
			||||||
 | 
					//        timeValue += minutes;
 | 
				
			||||||
 | 
					//        timeValue += seconds;
 | 
				
			||||||
 | 
					//    }
 | 
				
			||||||
 | 
					//    return dateValue + " " + timeValue;
 | 
				
			||||||
 | 
					//}
 | 
				
			||||||
 | 
					///*
 | 
				
			||||||
 | 
					// * @deprecated since version 0.1
 | 
				
			||||||
 | 
					// * @description 取得日期時間(2020/02/02 18:05:25)
 | 
				
			||||||
 | 
					// * @param {Boolean} isTwYear it`s Taiwan year?
 | 
				
			||||||
 | 
					// * @param {String} dateInterval 日期間隔字元
 | 
				
			||||||
 | 
					// * @param {Boolean} isPadZero   是否補0
 | 
				
			||||||
 | 
					// * @returns {string} 回傳時間字串
 | 
				
			||||||
 | 
					// */
 | 
				
			||||||
 | 
					//function fnGetDateTimeNow(isTwYear = false, dateInterval = '/', isPadZero = true) {
 | 
				
			||||||
 | 
					//    let today = new Date();
 | 
				
			||||||
 | 
					//    let year = isTwYear ? today.getFullYear() - 1911 : today.getFullYear();
 | 
				
			||||||
 | 
					//    let currentDateTime =
 | 
				
			||||||
 | 
					//        year + dateInterval + ((isPadZero && today.getMonth() + 1 < 10) ? '0' : '') +
 | 
				
			||||||
 | 
					//        (today.getMonth() + 1) + dateInterval + ((isPadZero && today.getDate() < 10) ? '0' : '') +
 | 
				
			||||||
 | 
					//        today.getDate() + ' ' + ((isPadZero && today.getHours() < 10) ? '0' : '') +
 | 
				
			||||||
 | 
					//        today.getHours() + ':' + ((isPadZero && today.getMinutes() < 10) ? '0' : '') +
 | 
				
			||||||
 | 
					//        today.getMinutes();
 | 
				
			||||||
 | 
					//    return currentDateTime;
 | 
				
			||||||
 | 
					//}
 | 
				
			||||||
 | 
					///*
 | 
				
			||||||
 | 
					// * @deprecated since version 0.1
 | 
				
			||||||
 | 
					// * @description 取得加減的日期時間(2020/02/02 18:05:25)
 | 
				
			||||||
 | 
					// * @param {Boolean} isTwYear it`s Taiwan year?
 | 
				
			||||||
 | 
					// * @param {String} dateInterval 日期間隔字元
 | 
				
			||||||
 | 
					// * @param {Boolean} isPadZero   是否補0
 | 
				
			||||||
 | 
					// * @returns {string} 回傳時間字串
 | 
				
			||||||
 | 
					// */
 | 
				
			||||||
 | 
					//function fnGetDate(isTwYear = false, dateInterval = '/', addYears = 0, addMonths = 0, addDays = 0, isPadZero = true) {
 | 
				
			||||||
 | 
					//    let today = new Date();
 | 
				
			||||||
 | 
					//    let year = isTwYear ? today.getFullYear() - 1911 : today.getFullYear();
 | 
				
			||||||
 | 
					//    if (addYears > year || addMonths > today.getMonth() || addDays > today.getDate()) {
 | 
				
			||||||
 | 
					//        return false;
 | 
				
			||||||
 | 
					//    }
 | 
				
			||||||
 | 
					//    let date =
 | 
				
			||||||
 | 
					//        (year + addYears) + dateInterval + ((isPadZero && today.getMonth() + addMonths + 1 < 10) ? '0' : '') +
 | 
				
			||||||
 | 
					//        (today.getMonth() + addMonths + 1) + dateInterval + ((isPadZero && today.getDate() + addDays < 10) ? '0' : '') +
 | 
				
			||||||
 | 
					//        (today.getDate() + addDays);
 | 
				
			||||||
 | 
					//    return date;
 | 
				
			||||||
 | 
					//}
 | 
				
			||||||
 | 
					///*
 | 
				
			||||||
 | 
					// * @deprecated since version 0.1
 | 
				
			||||||
 | 
					// * @description 取得禮拜/週幾(禮拜五)
 | 
				
			||||||
 | 
					// * @param {String} dayPreString 前置詞 (禮拜/週/周)
 | 
				
			||||||
 | 
					// * @returns {string} 回傳時間字串
 | 
				
			||||||
 | 
					// */
 | 
				
			||||||
 | 
					//function fnGetDay(dayPreString = "") {
 | 
				
			||||||
 | 
					//    let day = "";
 | 
				
			||||||
 | 
					//    let day_list = ['日', '一', '二', '三', '四', '五', '六'];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//    let today = new Date();
 | 
				
			||||||
 | 
					//    let dayGet = today.getDay(); // or "new Date().getDay()";
 | 
				
			||||||
 | 
					//    if (dayPreString === "") {
 | 
				
			||||||
 | 
					//        day = "(" + day_list[dayGet] + ")";
 | 
				
			||||||
 | 
					//    } else {
 | 
				
			||||||
 | 
					//        day = dayPreString + day_list[dayGet];
 | 
				
			||||||
 | 
					//    }
 | 
				
			||||||
 | 
					//    return day;
 | 
				
			||||||
 | 
					//}
 | 
				
			||||||
 | 
					///* @deprecated since version 0.1
 | 
				
			||||||
 | 
					//*  @description Convrt Int To Float
 | 
				
			||||||
 | 
					//*  @param {String} number ori number
 | 
				
			||||||
 | 
					//*  @param {String} keepNum keep number after .
 | 
				
			||||||
 | 
					//*  @return {String}
 | 
				
			||||||
 | 
					//*  @author Darren Chen
 | 
				
			||||||
 | 
					//*  @date   2019/12/31
 | 
				
			||||||
 | 
					//*/
 | 
				
			||||||
 | 
					//function fnConvrtIntToFloat(number, keepNum) {
 | 
				
			||||||
 | 
					//    let zeroNumber = fnPaddingRight("1", keepNum + 1, "0");
 | 
				
			||||||
 | 
					//    zeroNumber = parseInt(zeroNumber);
 | 
				
			||||||
 | 
					//    return Math.round(parseFloat(number) * zeroNumber) / zeroNumber;
 | 
				
			||||||
 | 
					//}
 | 
				
			||||||
 | 
					///* @deprecated since version 0.1
 | 
				
			||||||
 | 
					//*  @description The string Padding Left char
 | 
				
			||||||
 | 
					//*  @param {String} str ori string
 | 
				
			||||||
 | 
					//*  @param {Number} lenght will get string`s lenght
 | 
				
			||||||
 | 
					//*  @param {String} add char
 | 
				
			||||||
 | 
					//*  @return {String}
 | 
				
			||||||
 | 
					//*  @author Darren Chen
 | 
				
			||||||
 | 
					//*  @date   2019/12/31
 | 
				
			||||||
 | 
					//*/
 | 
				
			||||||
 | 
					//function fnPaddingLeft(str, lenght, char) {
 | 
				
			||||||
 | 
					//    if (str.length >= lenght)
 | 
				
			||||||
 | 
					//        return str;
 | 
				
			||||||
 | 
					//    else
 | 
				
			||||||
 | 
					//        return fnPaddingLeft(char + str, lenght);
 | 
				
			||||||
 | 
					//}
 | 
				
			||||||
 | 
					///* @deprecated since version 0.1
 | 
				
			||||||
 | 
					//*  @description The string Padding Right char
 | 
				
			||||||
 | 
					//*  @param {String} str ori string
 | 
				
			||||||
 | 
					//*  @param {Number} lenght will get string`s lenght
 | 
				
			||||||
 | 
					//*  @param {String} add char 
 | 
				
			||||||
 | 
					//*  @return {String}
 | 
				
			||||||
 | 
					//*  @author Darren Chen
 | 
				
			||||||
 | 
					//*  @date   2019/12/31
 | 
				
			||||||
 | 
					//*/
 | 
				
			||||||
 | 
					//function fnPaddingRight(str, lenght, char) {
 | 
				
			||||||
 | 
					//    if (str.length >= lenght)
 | 
				
			||||||
 | 
					//        return str;
 | 
				
			||||||
 | 
					//    else
 | 
				
			||||||
 | 
					//        return fnPaddingRight(str + char, lenght);
 | 
				
			||||||
 | 
					//}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user