/** * @author 최정우 * @since 2019.12.06 * * 공통 자바스크립트 Util입니다. */ const COMMON_UTIL = (function () { var _utils = { yesterday: function () { let date = new Date(); let sel_day = -1; //-1이면 하루전/ +1이면 내일 date.setDate(date.getDate() + sel_day); let yesterday = new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).toISOString().substring(0, 10); return yesterday; }, today: function () { let date = new Date(); let today = new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).toISOString().substring(0, 10); return today; }, /** * 일주일전 년-월-일 구하기 */ oneWeekAgo: function () { let date = new Date(); // 현재 날짜에서 7일을 빼줍니다. let oneWeekAgoDate = new Date(date.getTime() - (6 * 24 * 60 * 60 * 1000) - (date.getTimezoneOffset() * 60000)).toISOString().substring(0, 10); return oneWeekAgoDate; }, /** * 한달전 년-월-일 구하기 */ oneMonthAgo: function (today) { let date = new Date(today); let oneMonthAgo = new Date(date.setMonth(date.getMonth() - 1) - (date.getTimezoneOffset() * 60000)).toISOString().substring(0, 10); return oneMonthAgo; }, /** * 한달후 년-월-일 구하기 */ oneMonthLater: function (today) { let date = new Date(today); let oneMonthLater = new Date(date.setMonth(date.getMonth() + 1) - (date.getTimezoneOffset() * 60000)).toISOString().substring(0, 10); return oneMonthLater; }, /** * 일시에서 시,분,초 자르기 */ yyyymmdd: function (data) { if (data === null || data === "") { return "-"; } else { let date = data.substr(0, 10); return date; } }, /** * 전화번호 출력 시 '-'을 추가하여 출력 */ HyphenMinus: function (phoneNumber) { if (!phoneNumber) return phoneNumber; phoneNumber = phoneNumber.replace(/[^0-9]/g, ""); let tmp = ""; if (phoneNumber.length < 4) { return phoneNumber; } else if (phoneNumber.length < 7) { tmp += phoneNumber.substr(0, 3); tmp += "-"; tmp += phoneNumber.substr(3); return tmp; } else if (phoneNumber.length == 8) { tmp += phoneNumber.substr(0, 4); tmp += "-"; tmp += phoneNumber.substr(4); return tmp; } else if (phoneNumber.length < 10) { if (phoneNumber.substr(0, 2) == "02") { //02-123-5678 tmp += phoneNumber.substr(0, 2); tmp += "-"; tmp += phoneNumber.substr(2, 3); tmp += "-"; tmp += phoneNumber.substr(5); return tmp; } } else if (phoneNumber.length < 11) { if (phoneNumber.substr(0, 2) == "02") { //02-1234-5678 tmp += phoneNumber.substr(0, 2); tmp += "-"; tmp += phoneNumber.substr(2, 4); tmp += "-"; tmp += phoneNumber.substr(6); return tmp; } else { //010-123-4567 tmp += phoneNumber.substr(0, 3); tmp += "-"; tmp += phoneNumber.substr(3, 3); tmp += "-"; tmp += phoneNumber.substr(6); return tmp; } } else { //010-1234-5678 tmp += phoneNumber.substr(0, 3); tmp += "-"; tmp += phoneNumber.substr(3, 4); tmp += "-"; tmp += phoneNumber.substr(7); return tmp; } }, /** * 전화번호 자동 '-' 삽입 */ //전화번호 입력 시 자동 '-' 삽입 getMask: function (phoneNumber) { if (!phoneNumber) return phoneNumber; phoneNumber = phoneNumber.replace(/[^0-9]/g, ""); let res = ""; if (phoneNumber.length < 3) { res = phoneNumber; } else { if (phoneNumber.substr(0, 2) == "02") { if (phoneNumber.length <= 5) { //02-123-5678 res = phoneNumber.substr(0, 2) + "-" + phoneNumber.substr(2, 3); } else if (phoneNumber.length > 5 && phoneNumber.length <= 9) { //02-123-5678 res = phoneNumber.substr(0, 2) + "-" + phoneNumber.substr(2, 3) + "-" + phoneNumber.substr(5); } else if (phoneNumber.length > 9) { //02-1234-5678 res = phoneNumber.substr(0, 2) + "-" + phoneNumber.substr(2, 4) + "-" + phoneNumber.substr(6); } } else { if (phoneNumber.length < 8) { res = phoneNumber; } else if (phoneNumber.length == 8) { res = phoneNumber.substr(0, 4) + "-" + phoneNumber.substr(4); } else if (phoneNumber.length == 9) { res = phoneNumber.substr(0, 3) + "-" + phoneNumber.substr(3, 3) + "-" + phoneNumber.substr(6); } else if (phoneNumber.length == 10) { res = phoneNumber.substr(0, 3) + "-" + phoneNumber.substr(3, 3) + "-" + phoneNumber.substr(6); } else if (phoneNumber.length > 10) { //010-1234-5678 res = phoneNumber.substr(0, 3) + "-" + phoneNumber.substr(3, 4) + "-" + phoneNumber.substr(7); } } } return res; }, /** * 비밀번호 일치 체크 */ checkPassword: function (pw, pwC) { if (pw != pwC) return false; return true; }, /** * 휴대폰 번호 정규식 */ checkPhone: function (data) { let regExp = /^01([0|1|6|7|8|9]?)-?([0-9]{3,4})-?([0-9]{4})$/; if (regExp.test(data) === true) return true; return false; }, /** * 사용자명 정규식 */ checkName: function (data) { let validateEmail = /^[가-힣a-zA-Z]{1,20}$/; if (validateEmail.test(data) === true) return true; return false; }, /** * 이메일 정규식 */ checkEmail: function (data) { // 이메일 형식 검사 let validateEmail = /^[A-Za-z0-9_\\.\\-]+@[A-Za-z0-9\\-]+\.[A-Za-z0-9\\-\\.]+$/; if (validateEmail.test(data) === true) return true; return false; }, /** * 사업자번호 정규식(10자리) */ businessNumber: function (data) { let validateBusinessNumber = /^\d{10}$/; if (validateBusinessNumber.test(data) === true) return true; return false; }, /** * 키워드 정규식 */ kewordCheck: function (data) { let validateKeword = /^#[A-Za-z0-9_]+$/; if (validateKeword.test(data) === true) return true; return false; }, /** * 아이디 정규식(5~20자의 영문 소문자, 숫자와 특수기호(_),(-)만 사용) */ idCheck: function (data) { let validateId = /^[a-z0-9_-]{5,20}$/; if (validateId.test(data) === true) return true; return false; }, /** * 비밀번호 정규식(대문자, 소문자, 숫자, 특수문자를 포함한 8자 이상이어야 합니다.) */ pwCheck: function (data) { let validatePw = /^(?=.*[A-Za-z])(?=.*\d)(?=.*[@$!%*#?&])[A-Za-z\d@$!%*#?&]{6,20}$/; if (validatePw.test(data) === true) return true; return false; }, /** * 빈 객체 여부 */ isEmpty: function (data) { if ( data === undefined || data === null || data === "" || data.length === 0 || (data.constructor == Object && Object.keys(data).length === 0) ) { if (typeof data === "number") { return true; } else { return false; } } else { return true; } }, /** * empty to null */ toNull: function (data) { if (data === undefined || data === "") { try { data = null; return data; } catch (e) { // console.log("commonUtil.js - empty to null convert error : ", e); return data; } } else { return data; } }, /** * string to JSON */ toJson: function (data) { if ("string" === typeof data) { try { return JSON.parse(data); } catch (e) { // console.log("commonUtil.js - string to json convert error : ", e); return data; } } else { return data; } }, /** * string to JSON */ toJson: function (data) { if ("string" === typeof data) { try { return JSON.parse(data); } catch (e) { // console.log("commonUtil.js - string to json convert error : ", e); return data; } } else { return data; } }, /** * JSON to string */ toString: function (data) { try { return JSON.parse(data); } catch (e) { // console.log("commonUtil.js - json to string convert error : ", e); return data; } }, /** * 다중 separator split */ split: function (text, separator) { var words = []; if ( this.isEmpty(text) == false && this.isEmpty(separator) == false && separator.length > 0 ) { words.push(text); for (var i = 0; i < separator.length; i++) { var subWords = []; for (var j = 0; j < words.length; j++) { if ( this.isEmpty(words[j]) == false && this.isEmpty(separator[i]) == false ) { subWords = subWords.concat(words[j].split(separator[i])); } else { if (words[j] == false) { subWords.push(words[j]); } else { continue; } } } words = subWords; } return words; } else { if (this.isEmpty(text) == false) { words.push(text); } return words; } }, /** * 객체 깊은 복사 */ copyObject: function (obj) { if (obj === null || typeof obj !== "object") return obj; try { return JSON.parse(JSON.stringify(obj)); } catch (e) { // console.log("commonUtil.js - copyObject error : ", e); return null; } }, /** * 날짜 + 시간 구하기 * * */ getDateTime: function () { return this.getDate() + " " + this.getFullTime(); }, /** * 날짜 구하기 * * param 설명 * * options = { * addYear(Integer), * addMonth(Integer), * addDay(Integer), * separator(String) * } */ getDate: function (options) { if (this.isEmpty(options) == true) { options = { addYear: 0, addMonth: 0, addDay: 0, separator: "-", }; } else { options.addYear = options.addYear || 0; options.addMonth = options.addMonth || 0; options.addDay = options.addDay || 0; options.separator = options.separator || "-"; } var date = new Date(); date.setFullYear(date.getFullYear() + options.addYear); date.setMonth(date.getMonth() + options.addMonth); date.setDate(date.getDate() + options.addDay); var yyyy = date.getFullYear(); var mm = date.getMonth() + 1; var dd = date.getDate(); return ( yyyy + options.separator + this.prefixZero(mm, 2) + options.separator + this.prefixZero(dd, 2) ); }, /** * 현재 년도 조회 */ getYear: function () { var date = new Date(); return date.getFullYear(); }, /** * 현재 월 조회 */ getMonth: function () { var date = new Date(); return date.getMonth() + 1; }, /** * 현재 월 조회 */ getFullMonth: function () { var date = new Date(); return this.prefixZero(date.getMonth() + 1, 2); }, /** * 현재 일 조회 */ getDay: function () { var date = new Date(); return date.getDate(); }, /** * 현재 일 조회 */ getFullDay: function () { var date = new Date(); return this.prefixZero(date.getDate(), 2); }, /** * 현재 시간 조회 */ getHour: function () { var date = new Date(); return date.getFullYear(); }, /** * 현재 분 조회 */ getMinute: function () { var date = new Date(); return date.getMinutes() + 1; }, /** * 현재 초 조회 */ getSeconds: function () { var date = new Date(); return date.getSeconds(); }, /** * 시간 구하기 * * param 설명 * * options = { * addHour(Integer), * addMinute(Integer), * addSeconds(Integer), * separator(String) * } */ getFullTime: function (options) { if (this.isEmpty(options) == true) { options = { addHour: 0, addMinute: 0, addSeconds: 0, separator: "-", }; } else { options.addHour = options.addHour || 0; options.addMinute = options.addMinute || 0; options.addSeconds = options.addSeconds || 0; options.separator = options.separator || ":"; } var date = new Date(); date.setHours(date.getHours() + options.addHour); date.setMinutes(date.getMinutes() + options.addMinute); date.setSeconds(date.getSeconds() + options.addSeconds); var h = date.getHours(); var m = date.getMinutes(); var s = date.getSeconds(); return ( this.prefixZero(h, 2) + ":" + this.prefixZero(m, 2) + ":" + this.prefixZero(s, 2) ); }, /** * 시간 구하기 * * param 설명 * * options = { * addHour(Integer), * addMinute(Integer), * separator(String) * } */ getTime: function (options) { if (this.isEmpty(options) == true) { options = { addHour: 0, addMinute: 0, separator: "-", }; } else { options.addHour = options.addHour || 0; options.addMinute = options.addMinute || 0; options.separator = options.separator || ":"; } var date = new Date(); date.setHours(date.getHours() + options.addHour); date.setMinutes(date.getMinutes() + options.addMinute); var h = date.getHours(); var m = date.getMinutes(); return this.prefixZero(h, 2) + ":" + this.prefixZero(m, 2); }, /** * 특정 길이만큼 앞에'0' 붙이기 * * param 설명 * * text(String or Integer): 맨 뒤에 붙일 문자열(숫자든 문자든 상관웞음) * length(Integer): 해당 값 만큼 '0'을 붙임 (단, text의 문자열 길이를 뺌) * ex) this.prefixZero(2, 5) => 00002, this.prefixZero(20, 5) => 00020 * */ prefixZero: function (text, length) { var zero = ""; var suffix = text; if (typeof text === "number") { suffix = text.toString(); } if (suffix.length < length) { for (let i = 0; i < length - suffix.length; i++) { zero += "0"; } } return zero + suffix; }, /** * Date => text */ dateToText: function (date) { var d = new Date(date); var yyyy = d.getFullYear(); var mm = d.getMonth() + 1; var dd = d.getDate(); return yyyy + "-" + this.prefixZero(mm, 2) + "-" + this.prefixZero(dd, 2); }, /** * 최솟값은 포함, 최댓값은 제외한 정수 난수 생성(최솟값 ~ 최댓값 - 1) * * param 설명 * * min(Integer): 난수 생성시, 최소값 * max(Integer): 난수 생성시, 최대값 * * ex) getRandomInt(2, 5) => 2~5사이의 정수 난수 값 리턴 */ getRandomInt: function (min, max) { min = Math.ceil(min); max = Math.floor(max); return Math.floor(Math.random() * (max - min)) + min; }, /** * 현재 시스템의 URL 조회 * * ex) http://localohst:8080, https://www.naver.com */ getSystemURL: function () { var url = window.location.protocol + "//" + window.location.host; return url; }, /** * 현재 시스템의 URL 경로 조회 * * ex) http://localohst:8080/dataset/datasetPostList => /dataset/datasetPostList */ getSystemPath: function () { var path = window.location.pathname; return path; }, /** * 3글자 마다 콤마 찍기 (돈) * * ex) 10000 => 10,000 */ comma: function (text) { try { return text.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); } catch (e) { if (this.isEmpty(text) == true) { return "-"; } else { return text; } } }, removeTag: function (data) { // HTML 태그 제거 data = data.replace(/<[^>]+>/g, ''); // HTML 엔티티 제거 data = data.replace(/&[^;]+;/g, ''); return data; }, /** * 3글자 마다 콤마 찍기 (돈) * * ex) 10,000 => 10000 */ removeComma: function (text) { try { return text.toString().replace(/,/g, ""); } catch (e) { if (this.isEmpty(text) == true) { return "-"; } else { return text; } } }, /** * json 데이터 가지고 오기 (외부 JSON 파일 PATH or URL) (동기 요청) */ getJsonByPromise: function (url, isAsync) { if (this.isEmpty(url) == true) { new Error( "COMMON_UTIL - getJson(url, isAsync) Error : url(parameter) is empty" ); } if (this.isEmpty(isAsync) == true) { isAsync = true; } return new Promise(function (resolve, reject) { var xhr = new XMLHttpRequest(); xhr.onload = function (e) { if (xhr.readyState === 4) { if (xhr.status === 200) { resolve(JSON.parse(this.responseText)); } else { reject(this); } } }; xhr.onerror = function (e) { reject(this); }; xhr.open("GET", url, isAsync); //xhr.responseType='json'; xhr.send(null); }); }, /** * json 데이터 가지고 오기 (동기 요청) (외부 JSON 파일 PATH or URL) */ getJsonBySync: function (url) { var result = {}; if (this.isEmpty(url) == true) { new Error( "COMMON_UTIL - getJson(url, isAsync) Error : url(parameter) is empty" ); return result; } var xhr = new XMLHttpRequest(); xhr.onload = function (e) { if (xhr.readyState === 4) { if (xhr.status === 200) { result = JSON.parse(this.responseText); } else { console.error(this); } } }; xhr.onerror = function (e) { console.error(this); }; xhr.open("GET", url, false); xhr.send(null); return result; }, /** * 포커스 가능한 요소 가져오기 */ getFocusableElements(container = document) { return Array.from( container.querySelectorAll( 'a, button, input, textarea, select, details, [tabindex]:not([tabindex="-1"])' ) ).filter(el => !el.hasAttribute('disabled')); } }; //초기화 function init() { //console.info('commonUtil.js initialized.'); return _utils; } return init(); })(); export default COMMON_UTIL;