반응형
반응형
반응형
반응형
반응형
  • new Date(new Date().getTime() ± 1000*60*60*24*n) = new Date(new Date().valueOf() ± 1000*60*60*24*n)
  • ( d => new Date(d.setDate(d.getDate() - 1)) ) (new Date())
반응형
반응형

data.sort((a, b) => a.price - b.price || a.name.localeCompare(b.name)); // 가격이 낮은 순으로 정렬하고, 가격이 같으면 이름순으로 정렬

반응형
반응형

csPortal: react-scripts -> webpack

{
  "name": "asc_portal",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "start:webapp:local": "curl -X POST localhost:8090/language/login > src/language-login.json | npx --max_old_space_size=8192 webpack serve --mode development --env PRODUCT=portal TITLE=\"# LOCAL\" --config webpack.localhost.js",
    "build:webapp:development": "curl -X POST https://gcsportaltest.lge.com/api/language/login > src/language-login.json | npx webpack --mode development --env PRODUCT=portal TITLE=\"DEV.WORLD\" --config webpack.development.js",
    "build:webapp:production": "curl -X POST https://csportaltest.lge.com/api/language/login > src/language-login.json | npx webpack --mode production --env PRODUCT=portal TITLE=\"LG CS Portal\" --config webpack.production.js",
    "start": "react-scripts start",
    "build": "npx webpack --mode production --env PRODUCT=portal TITLE=\"LG CS Portal\" --config webpack.production.js",
    "build:dev": "env-cmd -f .env.test react-scripts build",
    "build:2nd": "env-cmd -f .env.test.2nd react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "dependencies": {
    "@ag-grid-community/core": "^30.0.2",
    "@ag-grid-community/react": "^30.0.2",
    "@ag-grid-community/styles": "^30.0.2",
    "@ckeditor/ckeditor5-build-classic": "^38.0.0",
    "@ckeditor/ckeditor5-react": "^7.0.0",
    "@ckpro/ckeditor5-upload-adapter": "^2.0.1",
    "@testing-library/jest-dom": "^5.16.5",
    "@testing-library/react": "^13.4.0",
    "@testing-library/user-event": "^13.5.0",
    "ag-grid-community": "^30.0.6",
    "ag-grid-react": "^30.0.2",
    "axios": "^0.21.2",
    "bootstrap": "^5.3.1",
    "buffer": "^6.0.3",
    "chart.js": "^4.3.0",
    "chartjs-plugin-datalabels": "^2.2.0",
    "crypto-js": "^4.1.1",
    "date-fns": "^2.30.0",
    "dotenv": "^16.0.3",
    "env-cmd": "^10.1.0",
    "http-proxy-middleware": "^2.0.6",
    "i18next": "^22.5.1",
    "jquery": "^3.7.0",
    "js-logger": "^1.6.1",
    "json-beautify": "^1.1.1",
    "jwt-decode": "^3.1.2",
    "mobx": "^6.12.0",
    "mobx-react": "^9.1.1",
    "moment": "^2.29.4",
    "node-html-parser": "^6.1.12",
    "numeral": "^2.0.6",
    "query-string": "^9.0.0",
    "react": "^18.2.0",
    "react-bootstrap": "^2.8.0",
    "react-chartjs-2": "^5.2.0",
    "react-csv": "^2.2.2",
    "react-datepicker": "^4.14.0",
    "react-dom": "^18.2.0",
    "react-drag-list": "^1.1.0",
    "react-dropzone": "^14.2.3",
    "react-helmet": "^6.1.0",
    "react-hook-form": "^7.46.1",
    "react-i18next": "^12.3.1",
    "react-js-pagination": "^3.0.3",
    "react-quick-pinch-zoom": "^5.1.0",
    "react-responsive": "^9.0.2",
    "react-router-dom": "^6.11.1",
    "react-scripts": "5.0.1",
    "react-select": "^5.7.3",
    "react-slick": "^0.29.0",
    "react-zendesk": "^0.1.13",
    "read-excel-file": "^5.6.1",
    "slick-carousel": "^1.8.1",
    "styled-components": "^6.0.0-rc.3",
    "web-vitals": "^2.1.4"
  },
  "devDependencies": {
    "@babel/plugin-transform-react-jsx": "^7.23.4",
    "@svgr/webpack": "^8.1.0",
    "@webpack-cli/serve": "^2.0.5",
    "css-loader": "^6.11.0",
    "dotenv-webpack": "^8.1.0",
    "file-loader": "^6.2.0",
    "html-loader": "^5.0.0",
    "html-webpack-plugin": "^5.6.0",
    "msw": "^2.2.13",
    "prettier": "^3.2.5",
    "resolve-url-loader": "^5.0.0",
    "sass": "^1.74.1",
    "sass-loader": "^14.1.1",
    "style-loader": "^3.3.4",
    "svg-url-loader": "^8.0.0",
    "webpack": "^5.91.0",
    "webpack-bundle-analyzer": "^4.10.2",
    "webpack-cli": "^5.1.4",
    "webpack-merge": "^5.10.0"
  },
  "msw": {
    "workerDirectory": [
      "public"
    ]
  },
  "babel": {
    "plugins": [
      "@babel/plugin-transform-react-jsx"
    ]
  },
  "eslintConfig": {
    "extends": [
      "react-app",
      "react-app/jest"
    ]
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  }
}
"scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "build:dev": "env-cmd -f .env.test react-scripts build",
    "build:2nd": "env-cmd -f .env.test.2nd react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": [
      "react-app",
      "react-app/jest"
    ]
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  }

farmOS: react-app-rewired

"scripts": {
    "start": "set PORT=3007 && react-app-rewired start",
    "build": "react-app-rewired --max-old-space-size=32768 build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": "react-app"
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  }
반응형

'js > node, npm' 카테고리의 다른 글

npm  (0) 2022.07.21
nodejs를 이용한 mock server 구성  (0) 2022.06.14
반응형

 

export const getTimeString = (time) => {
  const milliSeconds = new Date() - time;
  const seconds = milliSeconds / 1000;
  if (seconds < 60) return `방금 전`;
  const minutes = seconds / 60;
  if (minutes < 60) return `${Math.floor(minutes)}분 전`;
  const hours = minutes / 60;
  if (hours < 24) return `${Math.floor(hours)}시간 전`;
  return time?.toLocaleString();
  const days = hours / 24;
  if (days < 7) return `${Math.floor(days)}일 전`;
  const weeks = days / 7;
  if (weeks < 5) return `${Math.floor(weeks)}주 전`;
  const months = days / 30;
  if (months < 12) return `${Math.floor(months)}개월 전`;
  const years = days / 365;
  return `${Math.floor(years)}년 전`;
}

 

 

반응형
반응형

https://codepen.io/vitaly-zdanevich/pen/MaEJga

<form>
  <input id="phone" 
         type="tel" 
         name="phone" 
         value="+375 (__) ___-__-__" 
         pattern="^\+375 \((17|29|33|44)\) [0-9]{3}-[0-9]{2}-[0-9]{2}$" 
         required>

    <button>Push</button>
</form>
// angelwatt.com/coding/masked_input.php

window.onload = function() {
   MaskedInput({
      elm: document.getElementById('phone'),
      format: '+375 (__) ___-__-__',
      separator: '+375 ()-'
   });
};

// masked_input_1.4-min.js
(function(a){a.MaskedInput=function(f){if(!f||!f.elm||!f.format){return null}if(!(this instanceof a.MaskedInput)){return new a.MaskedInput(f)}var o=this,d=f.elm,s=f.format,i=f.allowed||"0123456789",h=f.allowedfx||function(){return true},p=f.separator||"/:-",n=f.typeon||"_YMDhms",c=f.onbadkey||function(){},q=f.onfilled||function(){},w=f.badkeywait||0,A=f.hasOwnProperty("preserve")?!!f.preserve:true,l=true,y=false,t=s,j=(function(){if(window.addEventListener){return function(E,C,D,B){E.addEventListener(C,D,(B===undefined)?false:B)}}if(window.attachEvent){return function(D,B,C){D.attachEvent("on"+B,C)}}return function(D,B,C){D["on"+B]=C}}()),u=function(){for(var B=d.value.length-1;B>=0;B--){for(var D=0,C=n.length;D<C;D++){if(d.value[B]===n[D]){return false}}}return true},x=function(C){try{C.focus();if(C.selectionStart>=0){return C.selectionStart}if(document.selection){var B=document.selection.createRange();return -B.moveStart("character",-C.value.length)}return -1}catch(D){return -1}},b=function(C,E){try{if(C.selectionStart){C.focus();C.setSelectionRange(E,E)}else{if(C.createTextRange){var B=C.createTextRange();B.move("character",E);B.select()}}}catch(D){return false}return true},m=function(D){D=D||window.event;var C="",E=D.which,B=D.type;if(E===undefined||E===null){E=D.keyCode}if(E===undefined||E===null){return""}switch(E){case 8:C="bksp";break;case 46:C=(B==="keydown")?"del":".";break;case 16:C="shift";break;case 0:case 9:case 13:C="etc";break;case 37:case 38:case 39:case 40:C=(!D.shiftKey&&(D.charCode!==39&&D.charCode!==undefined))?"etc":String.fromCharCode(E);break;default:C=String.fromCharCode(E);break}return C},v=function(B,C){if(B.preventDefault){B.preventDefault()}B.returnValue=C||false},k=function(B){var D=x(d),F=d.value,E="",C=true;switch(C){case (i.indexOf(B)!==-1):D=D+1;if(D>s.length){return false}while(p.indexOf(F.charAt(D-1))!==-1&&D<=s.length){D=D+1}if(!h(B,D)){c(B);return false}E=F.substr(0,D-1)+B+F.substr(D);if(i.indexOf(F.charAt(D))===-1&&n.indexOf(F.charAt(D))===-1){D=D+1}break;case (B==="bksp"):D=D-1;if(D<0){return false}while(i.indexOf(F.charAt(D))===-1&&n.indexOf(F.charAt(D))===-1&&D>1){D=D-1}E=F.substr(0,D)+s.substr(D,1)+F.substr(D+1);break;case (B==="del"):if(D>=F.length){return false}while(p.indexOf(F.charAt(D))!==-1&&F.charAt(D)!==""){D=D+1}E=F.substr(0,D)+s.substr(D,1)+F.substr(D+1);D=D+1;break;case (B==="etc"):return true;default:return false}d.value="";d.value=E;b(d,D);return false},g=function(B){if(i.indexOf(B)===-1&&B!=="bksp"&&B!=="del"&&B!=="etc"){var C=x(d);y=true;c(B);setTimeout(function(){y=false;b(d,C)},w);return false}return true},z=function(C){if(!l){return true}C=C||event;if(y){v(C);return false}var B=m(C);if((C.metaKey||C.ctrlKey)&&(B==="X"||B==="V")){v(C);return false}if(C.metaKey||C.ctrlKey){return true}if(d.value===""){d.value=s;b(d,0)}if(B==="bksp"||B==="del"){k(B);v(C);return false}return true},e=function(C){if(!l){return true}C=C||event;if(y){v(C);return false}var B=m(C);if(B==="etc"||C.metaKey||C.ctrlKey||C.altKey){return true}if(B!=="bksp"&&B!=="del"&&B!=="shift"){if(!g(B)){v(C);return false}if(k(B)){if(u()){q()}v(C,true);return true}if(u()){q()}v(C);return false}return false},r=function(){if(!d.tagName||(d.tagName.toUpperCase()!=="INPUT"&&d.tagName.toUpperCase()!=="TEXTAREA")){return null}if(!A||d.value===""){d.value=s}j(d,"keydown",function(B){z(B)});j(d,"keypress",function(B){e(B)});j(d,"focus",function(){t=d.value});j(d,"blur",function(){if(d.value!==t&&d.onchange){d.onchange()}});return o};o.resetField=function(){d.value=s};o.setAllowed=function(B){i=B;o.resetField()};o.setFormat=function(B){s=B;o.resetField()};o.setSeparator=function(B){p=B;o.resetField()};o.setTypeon=function(B){n=B;o.resetField()};o.setEnabled=function(B){l=B};return r()}}(window));

 

https://codepen.io/_marcba/pen/JjXRNbV

<label>IP Address</label>
<input type="text" class="form-input" id="ipv4" name="ipv4" placeholder="xxx.xxx.xxx.xxx"/>
//input mask bundle ip address
var ipv4_address = $('#ipv4');
ipv4_address.inputmask({
    alias: "ip",
    greedy: false //The initial mask shown will be "" instead of "-____".
});
반응형
반응형

{...{id:1,value:일},id:2} ->뒤에 오는 2를 사용함, 앞에 위치한 값은 없어짐

뒤가 중요

반응형
반응형
반응형
반응형
Intl.NumberFormat().format(n.cost)

 

    function numberWithCommas(str) {
        // console.log(str)
        // 주어진 문자열이 숫자로만 구성되어 있는지 확인합니다.
        const isNumeric = /^\d+$/.test(str);
   
        // 숫자로만 구성되어 있을 경우에만 변환합니다.
        if (isNumeric) {
            // 숫자의 길이를 구합니다.
            const length = str.length;
   
            // 숫자의 길이가 4 이상이면, 통화 구분 기호를 넣습니다.
            if (length >= 4) {
                return str.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
            }
   
            // 숫자의 길이가 4 미만이면, 통화 구분 기호를 넣지 않습니다.
            return str;
        }
   
        // 숫자로만 구성되어 있지 않으면 그대로 반환합니다.
        return str;
    }
반응형

+ Recent posts