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