반응형

eiSettings

import { useForm } from "react-hook-form";
  const { setValue, handleSubmit, control } = useForm({ mode: "all", reValidateMode: "onChange", defaultValues: { groups: [] } });
 setValue("groups", []);
        const date = searchDate === "undefined" ? "" : searchDate;
        setIsLoading(true);
        const origin = await request({ ...getEiSet, body: { corporationCode: userStore.user?.corporationCode, searchDate: date, centerType, evType: codes[centerType][evType] } });
        const data = origin?.settings?.length ? origin.settings.map((item) => (item.divisions ? item : { ...item, divisions: getDefaultValue(centerType, evType).divisions })) : [getDefaultValue(centerType, evType)];
        setApplyDate({ month: origin?.baseMonth ? moment(origin.baseMonth).format("YYYY.MM") : "undefined", start: origin?.startDay ? moment(origin.startDay).format("YYYY.MM.DD") : "", end: origin?.endDay ? moment(origin.endDay).format("YYYY.MM.DD") : "" });
        if (origin?.baseMonth) setSearchDate(moment(origin.baseMonth).format("YYYY-MM"));
        setOverIncentiveVolume(origin?.overIncentiveVolume);
        setOverIncentiveVal(origin?.overIncentiveVal);
        let levelObj = {};
        origin?.levelSetting?.forEach((n) => (levelObj[n.levelCode] = n.levelIncentiveVal));
        setLevels(levelObj);
        setValue("groups", data);
반응형
반응형
반응형
반응형

var(--LG-Red)

src/scss/mobilecommon.scss

 

https://www.w3schools.com/css/css3_variables.asp

 

 

variables.scss, $변수를 사용할 수도 있음

$primary-color-red: #bb0841;
$primary-color-red-hover: #82072e;
$primary-color-grey: #323232;

$secondary-color-gery: #fbfbfb;
$border-color-gery: #d5d5d5;
$border-color-deep: #cccccc;
$hover-color-pink: #faf1f4;
$board-color-grey: #f6f6f6;
$board-color-txt: #5f5f5f;
$backgorund-color-grey: #888888;
$line-color-grey: #d8d8d8;
$btn-color-pink: #ed5c7d;
$btn-color-grey: #828282;

$txt-color-edit: #2468c4;
$txt-color-content: #666666;

$chart-color-pink: #faf1f4;
$chart-color-grey: #d7d7d7;
 
$primary-color-grey: #f4f4f4;
$primary-color-black: #262626;
$primary-color-red: #a50034;
$primary-color-pink: #fff8fb;

$LG-Red: #a50034;
$Mid1-Red: #c5597b;
$Mid2-Red: #d2809a;
$Light1-Red: #ffedf3;
$Dark-Mid2-Red: #7c0328;
$White: #ffffff;
$Dark-Gray1: #333333;
$Dark-Gray2: #262626;
$Dark-Gray3: #1a1a1a;
$Mid-Gray1: #cbc8c2;
$Mid-Gray2: #7e7c77;
$Mid-Gray3: #4a4946;
$Light-Gray1: #f6f3eb;
$Light-Gray2: #f0ece4;
$Light-Gray3: #e6e1d6;
$Light-Gray-BG: #f4f4f4;
$Light-Pink-BG: #fff8fb;
$Light-Linen-BG: #ffece2;
$Light-Red-BG: #fde8e8;
$Light-Yellow-BG: #fff4d6;
$Light-Green-BG: #e9f2e5;
$Orange-Point: #ce3c0b;
$Brown-Point: #9c6800;
$Active-Red: #ea1917;
$Green: #287d00;

common.scss

:root {
  --primary-color-red: #{$primary-color-red};
  --primary-color-red-hover: #{$primary-color-red-hover};
  --primary-color-grey: #{$primary-color-grey};

  --secondary-color-gery: #{$secondary-color-gery};
  --border-color-gery: #{$border-color-gery};
  --border-color-deep: #{$border-color-deep};
  --hover-color-pink: #{$hover-color-pink};
  --board-color-grey: #{$board-color-grey};
  --backgorund-color-grey: #{$backgorund-color-grey};
  --line-color-grey: #{$line-color-grey};

  --txt-color-edit: #{$txt-color-edit};
  --txt-color-content: #{$txt-color-content};

  --chart-color-pink: #{$chart-color-pink};
  --chart-color-grey: #{$chart-color-grey};

  --LG-Red: #{$LG-Red};
  --Mid1-Red: #{$Mid1-Red};
  --Mid2-Red: #{$Mid2-Red};
  --Light1-Red: #{$Light1-Red};
  --Dark-Mid2-Red: #{$Dark-Mid2-Red};
  --White: #{$White};
  --Dark-Gray1: #{$Dark-Gray1};
  --Dark-Gray2: #{$Dark-Gray2};
  --Dark-Gray3: #{$Dark-Gray3};
  --Mid-Gray1: #{$Mid-Gray1};
  --Mid-Gray2: #{$Mid-Gray2};
  --Mid-Gray3: #{$Mid-Gray3};
  --Light-Gray1: #{$Light-Gray1};
  --Light-Gray2: #{$Light-Gray2};
  --Light-Gray3: #{$Light-Gray3};
  --Light-Gray-BG: #{$Light-Gray-BG};
  --Light-Pink-BG: #{$Light-Pink-BG};
  --Light-Linen-BG: #{$Light-Linen-BG};
  --Light-Red-BG: #{$Light-Red-BG};
  --Light-Yellow-BG: #{$Light-Yellow-BG};
  --Light-Green-BG: #{$Light-Green-BG};
  --Orange-Point: #{$Orange-Point};
  --Brown-Point: #{$Brown-Point};
  --Active-Red: #{$Active-Red};
  --Green: #{$Green};
}
반응형
반응형

반응형
반응형

    input + input {
      margin-top: 10px;
    }

반응형
반응형

input is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`

반응형
반응형

https://codesandbox.io/s/explorer-l44v98?file=/index.js

 

Explorer - CodeSandbox

Explorer by fir0j using antd, react, react-dom, react-icons, react-scripts, styled-components

codesandbox.io

 

위 소스는 자식이 2개 이상 있으면 2개가 한꺼번에 오픈되는 에러 있음, 아래는 에러 수정한 버젼

import React, { Fragment, useEffect, useState } from "react";
import { IoMdArrowDropright } from "react-icons/io";
import { MdArrowDropDown } from "react-icons/md";
import styled from "styled-components";

const SelectParent = styled.div`
  padding: 7px 7px;
  background-color: darkblue;
  width: max-content;
  border-radius: 4px;
  margin-top: 4px;
  font-weight: bolder;
  color: white;
  cursor: pointer;
`;

const Selectname = styled.div`
  margin-top: 5px;
  padding: 7px 7px;
  width: fit-content;
  border-radius: 4px;
  cursor: default;
  color: darkblue;
  :hover {
    background-color: #bdbaba3c;
  }
`;

const Explorer = ({ parent = [], onParentClick, onNameClick /*expandOnHover = false*/ }) => {
  const [newData, setNewData] = useState([]);

  useEffect(() => {
    setNewData(parent.map((n) => ({ ...n, expand: false })));
  }, [parent]);

  const handleClickOnParent = (e, data) => {
    e.stopPropagation();
    if (onParentClick && onParentClick instanceof Function) onParentClick(data);

    const clickIdx = newData.findIndex((n) => data.name === n.name);
    const clickItem = newData.find((n) => data.name === n.name);

    setNewData([...newData.slice(0, clickIdx), { ...clickItem, expand: !clickItem.expand }, ...newData.slice(clickIdx + 1, newData.length)]);
  };

  const handleClickOnName = (e, data) => {
    e.stopPropagation();

    if (onNameClick && onNameClick instanceof Function) onNameClick(data);
  };

  return (
    <>
      {newData.map((item) => (
        <Fragment key={item.name}>
          {item.children && item.children.length ? (
            <Fragment /*key={index}*/>
              <SelectParent /*onMouseOver={() => (expandOnHover ? setExpand(true) : {})}*/ onClick={(e) => handleClickOnParent(e, item)}>
                {item.name} <span>{!item.expand ? <IoMdArrowDropright /> : <MdArrowDropDown />} </span>
              </SelectParent>

              {item.expand ? (
                <div style={{ paddingLeft: "1.5rem" }}>
                  <Explorer parent={item.children} onParentClick={onParentClick} onNameClick={onNameClick} /*expandOnHover={expandOnHover}*/ />
                </div>
              ) : null}
            </Fragment>
          ) : (
            <Selectname onClick={(e) => handleClickOnName(e, item)}>{item.name}</Selectname>
          )}
        </Fragment>
      ))}
    </>
  );
};

export default Explorer;
반응형
반응형

rowspan 사용예제

<table>
  <tr>
    <th>Month</th>
    <th>Savings</th>
    <th>Savings for holiday!</th>
  </tr>
  <tr>
    <td rowspan="2">January</td>
    <td>1</td>
    <td>2</td>
  </tr>
  <tr>
    <td>3</td>
    <td>4</td>
  </tr>
  <tr>
    <td rowspan="2">February</td>
    <td>11</td>
    <td>22</td>
  </tr>
  <tr>
    <td>33</td>
    <td>44</td>
  </tr>
</table>

 

https://www.w3schools.com/tags/tryit.asp?filename=tryhtml_td_rowspan

 

https://www.w3schools.com/tags/tryit.asp?filename=tryhtml_td_colspan

반응형
반응형
.popupModal [class="image"] {
    text-align: center;
  }
반응형
반응형
반응형
반응형

const a = arg||'default' 주로 이렇게 초기화용도로 쓰는데 0, ''도 정상값일 경우는 ??를 쓰면 됨

 

Nullish coalescing operator

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing

 

Logical or operator

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_OR

 

 

반응형
반응형

style={{width: n.position?.width||'100%'}} 로 구지 안해도 style={{width: n.position?.width}} 만 하면 됨, n.position이 null이면 n.position?.width는 undefined가 되므로

반응형
반응형

TypeError: Cannot convert undefined or null to object
    at Function.keys (<anonymous>)
    at editorwatchdog.js:179:1
    at async u._initializeEditor (index.js:5:4518)
    at async u.componentDidMount (index.js:5:3736) {phase: 'initialization', willEditorRestart: false}phase: "initialization"willEditorRestart: false[[Prototype]]: Object
(anonymous) @ index.js:5
Promise.catch (async)
_initializeEditor @ index.js:5
await in _initializeEditor (async)
componentDidMount @ index.js:5
commitLayoutEffectOnFiber @ react-dohttp://m.development.js:23349
commitLayoutMountEffects_complete @ react-dohttp://m.development.js:24727
commitLayoutEffects_begin @ react-dohttp://m.development.js:24713
commitLayoutEffects_begin @ react-dohttp://m.development.js:24695
commitLayoutEffects @ react-dohttp://m.development.js:24651
commitRootImpl @ react-dohttp://m.development.js:26862
commitRoot @ react-dohttp://m.development.js:26721
performSyncWorkOnRoot @ react-dohttp://m.development.js:26156
flushSyncCallbacks @ react-dohttp://m.development.js:12042
(anonymous) @ react-dohttp://m.development.js:25690
Show 13 more frames
Show less

 

 

Cannot read properties of null (reading 'model') TypeError: Cannot read properties of null (reading 'model') at http://localhost:3000/app.2d361dd0ad882d7da2b1.min.js:289211:20

 

 

 

https://github.com/ckeditor/ckeditor5-react/issues/442

 

TypeError: Cannot read properties of null (reading 'model') · Issue #442 · ckeditor/ckeditor5-react

I'm trying to implement CKEditor 5 to my Nextjs project using this guide: https://ckeditor.com/docs/ckeditor5/latest/installation/integrations/next-js.html However when I try to run the webpage sho...

github.com

 

반응형
반응형

import { parse } from "node-html-parser";
dangerouslySetInnerHTML={{ __html: parse(n.content)?.toString() }} 원래 소스에는 parse를 적용했는데 안해도 나왔음

반응형
반응형

react-dom.development.js:86 Warning: A component is changing a controlled input to be uncontrolled. This is likely caused by the value changing from a defined to undefined, which should not happen. Decide between using a controlled or uncontrolled input element for the lifetime of the component. More info: https://reactjs.org/link/controlled-components

 

 

react-dom.development.js:86 Warning: `value` prop on `input` should not be null. Consider using an empty string to clear the component or `undefined` for uncontrolled components.

반응형
반응형

서버에 올리면 onLoad, onError event 둘다 안탈때가 있음 왜그런지는?

반응형
반응형

반응형
반응형

 

<label class="required">Name:</label>
<input type="text">

<style>
  .required:after {
    content:" *";
    color: red;
  }
</style>

https://stackoverflow.com/questions/11197671/use-css-to-automatically-add-required-field-asterisk-to-form-inputs

반응형
반응형

 

{route.path === "/board/viewimage" && (
              <>
                <meta name="viewport" content="initial-scale=1,width=device-width,user-scalable=1" />
              </>
            )}

반응형
반응형

반응형
반응형

 

TypeError: Cannot convert undefined or null to object
    at Function.keys (<anonymous>)
    at editorwatchdog.js:179:1
    at async u._initializeEditor (index.js:5:4518)
    at async u.componentDidMount (index.js:5:3736) {phase: 'initialization', willEditorRestart: false}

 
TypeError: Cannot read properties of null (reading 'model') at editorwatchdog.js:228:1

 

반응형
반응형

context 생성: import { createContext } from "react"

import { createContext } from "react";

// 기본값으로는 null을 넣어준다.
export const ThemeContext = createContext(null);

context 연결 <ThemeContext.Provider value={{ isDark, setIsDark }}>

import { useState } from "react";
import "./App.css";
import Page from "./Compopnents/Page";
import { ThemeContext } from "./context/ThemeContext";

function App() {
  const [isDark, setIsDark] = useState(false);

  return (
    // 📌
    <ThemeContext.Provider value={{ isDark, setIsDark }}>
      <Page />
    </ThemeContext.Provider>
  );
}
export default App;

 

context 사용 & 변경

  • import { useContext } from "react"
  • const { isDark, setIsDark } = useContext(ThemeContext);이때 setIsDark 콜하면 전체화면 refresh됨
import { useContext } from "react";
 // 📌 
import { ThemeContext } from "../context/ThemeContext";

const Header = () => {
  // 📌 
  const { isDark, setIsDark } = useContext(ThemeContext);////////////////////////
  return (
    <header
      className="header"
      style={{
        backgroundColor: isDark ? "black" : "lightgray",
        color: isDark ? "white" : "black",
      }}
    >
      <h1>Welcome 홍길동!</h1>
    </header>
  );
};

export default Header;

 

context를 가장 상위에서 불러와서 쓰기 때문에 전체 화면 refresh되는 것인지?

context를 state전용, dispatch전용으로 나누어써야 불필요한 렌더링 막을수 있다고 하는 예제https://velog.io/@shin6403/React-ContextAPI-%EC%9D%B4%EB%A0%87%EA%B2%8C-%EC%8D%A8%EB%B3%B4%EC%9E%90

 

[React] ContextAPI 이렇게 써보자

어느날 구글링을 하다가 어떠한 글을 보았다.Context API는 왜 안쓰나요?ContextAPI를 쓰는 글쓴이에게 굉장히 관심이 가는 글이었고, 내용을 결론은 소규모 프로젝트에서는 ContextAPI가 좋지만 성능 때

velog.io

useReducer, useCallback, memo등을 같이 사용하고 있음

반응형
반응형

처음 적용하고 됐는데 새 컴퓨터에 설치하니 경로이동이 안되었음 - jsconfig.json 파일을 그냥 고치고나서 해보니 다시 됨

 

{
  "compilerOptions": {
    //"module": "commonjs",
    //"target": "es6",
    "baseUrl": ".",
    "paths": {
      //"@/*/*": ["./src/*"] //not working
      "@components/*": ["./src/components/*"],
      "@component/*": ["./src/component/*"],
      "@views/*": ["./src/views/*"],
      "@page/*": ["./src/page/*"],
      "@store/*": ["./src/store/*"],
      "@hooks/*": ["./src/hooks/*"],
      "@utils/*": ["./src/utils/*"],
      "@assets/*": ["./src/assets/*"],
      "@scss/*": ["./src/scss/*"]
    }
  },
  "exclude/*": ["node_modules"]
}

 

import { useAlert, useResponsive } from "@hooks";

이 경우는 @hooks/* 로 커버안됨,

"@hooks": ["./src/hooks"], 추가해줘야함
반응형
반응형

반응형
반응형

 

 

에러발생해서 아래 블로그 발견

https://m.blog.naver.com/theonlyoneu/221981154881

 

mst devtools mobx-react@6 버전 deprecated

#mst #mobx-state-tree #mobx-react-devtools #mobx-react@6 #mobx-devtools mst 공부하면서 mobx-react-de...

blog.naver.com

 

https://github.com/mobxjs/mobx-devtools 로 가서 npm install mobx-devtools설치하고 크롬 플러그인 설치 후 npm run start webapp:local 했으나 아래 아래 발생

 

 

ERROR in ./src/store/ParamStore.js 2:0-48
Module not found: Error: Can't resolve 'mobx-devtools-mst' in 'C:\dev\csportalfront\src\store'
resolve 'mobx-devtools-mst' in 'C:\dev\csportalfront\src\store'
  Parsed request is a module
  using description file: C:\dev\csportalfront\package.json (relative path: ./src/store)
    Field 'browser' doesn't contain a valid alias configuration
    resolve as module

 

 

다시 해보니advanceds는 설치실패 그냥은 성공

반응형
반응형

JSON.stringify(user[n]) 해줘야 이렇게 확인가능

 

user[n]만 하면 object[object]로 "US"는 그냥 US로 나옴

반응형
반응형

mariaDB driver세팅이 안됬다는 에러가 나는데 mariaDB jdbc connector를 직접 다운로드 받아서 연결시켜줘야함

 

아래에서 connector jar (mariadb-java-client-3.3.3.jar) 다운로드 가능

https://mariadb.com/downloads/connectors/connectors-data-access/java8-connector

 

다운로드 받아서 아래와 같이 연결시켜줘야함

 

 

https://jnote.tistory.com/41

 

DBeaver offline 설치 및 mariadb 연결

오늘 반나절 삽질한 후기를 기록 DBeaver가 괜찮은 sql 툴인데, 인터넷 환경이 아닌 곳에 설치하려니 애로사항이 꽃 핀다. 프로그램은 단순히 설치만 하면 상관 없는데, jdbc를 이용해서 db를 연결하

jnote.tistory.com

 

반응형
반응형
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.10.1:compile (default-compile) on project cs_portal_api: Compilation failure: Compilation failure:
[ERROR] /sorc001/jenkins/workspace/DevCsPortalApi/cs_portal_api/src/main/java/com/lge/cs/online/login/controller/LoginController.java:[49,18] package nl.captcha does not exist
[ERROR] /sorc001/jenkins/workspace/DevCsPortalApi/cs_portal_api/src/main/java/com/lge/cs/online/login/service/LoginServiceImpl.java:[55,18] package nl.captcha does not exist
[ERROR] /sorc001/jenkins/workspace/DevCsPortalApi/cs_portal_api/src/main/java/com/lge/cs/common/captcha/CaptchaUtil.java:[7,18] package nl.captcha does not exist
[ERROR] /sorc001/jenkins/workspace/DevCsPortalApi/cs_portal_api/src/main/java/com/lge/cs/common/captcha/CaptchaUtil.java:[8,30] package nl.captcha.backgrounds does not exist
[ERROR] /sorc001/jenkins/workspace/DevCsPortalApi/cs_portal_api/src/main/java/com/lge/cs/common/captcha/CaptchaUtil.java:[9,26] package nl.captcha.servlet does not exist
[ERROR] /sorc001/jenkins/workspace/DevCsPortalApi/cs_portal_api/src/main/java/com/lge/cs/common/captcha/CaptchaUtil.java:[10,32] package nl.captcha.text.producer does not exist

 

 

pom.xml -> pom_live.xml로 고치니 수정됨

pom_live.xml에는 아래와 같은 부분이 들어있었음

		<dependency>
			<groupId>com</groupId>
			<artifactId>simple-captcha</artifactId>
			<version>1.2.1</version>
			<scope>system</scope>
			<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/com/simple-captcha/1.2.1/simplecaptcha-1.2.1.jar</systemPath>
		</dependency>
반응형
반응형
  • remote branch: 말 그대로 진짜 remote에 있는 거
    • git remote show origin했을 때 나오는 remote branch목록은 진짜 remote인듯, 실시간으로 보여주므로
  • remote tracking branch: remote를 local에 복사해놓은 복사본, 일종의 캐슁이라고 생각할수도 있음
    • git branch -a했을 때 remotes/origin/master로 나오는것들인듯, git fetch나 git remote update하기 전에는 remote에 새로생긴 branch를 보여주지 않는것으로 보아
  • tracking branch: remote tracking을 따라가면서 관리하는 local branch
  • tracking안하는 branch:그냥 local에 만들기만 하고 연결 안시켜놓은애

 

Merge branch 'dev2nd' of http://10.97.24.150:8099/csPortalGroup/csportalfront into dev2nd 
git pull 안받고 commit한 상태에서 pull하면 merge가 되는데 그때 위 커밋메세지로 된  merge commit이 자동생성됨

 

! [rejected]        master     -> origin/master  (non-fast-forward)
remote branch와 remote tracking branch는 항상 fast-forward관계를 유지해야 하는데 그게 깨진 상태에서 git fetch하면 위와 같은 에러 메세지가 나옴

 

git remote update = git fetch --all 과 동일한 효과라고 함

git fetch는 git pull/push와는 달리 tracking하는 전체 branch의 remote와 sync를 맞춤, 근데 여기서 tracking한다는 개념이 아직 헷갈림

 

git pull/push는 특정 branch하나랑만 이루어지는 작업이며 어떤 branch와 작업이 이루어지는지 생략이 된 상태, 어떻게 생략이 되었는지 알기 위해서는 git remote show origin 해봐서 pull/push작업에 대해 각각 어떻게 연결(configured for라고 표현됨)되었는지 알수 있음

참고) remote tracking branch로도 checkout 가능한지 확인해보려고 git checkout origin/master했더니 detached HEAD상태가 됨

 

https://devcamus.tistory.com/9

 

[git] 원격저장소 업데이트 명령어 3가지의 차이점 비교 -git remote update , git fetch , git pull 의 차이.

이전 포스트를 작성하면서 궁금한 점이 생겨서 곧바로 찾아보았다. [git] 새로 만든 원격 브랜치로 checkout이 안될 때. - error: pathspec did not match any file(s) known to git 해결 상황 : 기존 프로젝트를 리팩

devcamus.tistory.com

 

반응형
반응형
반응형

+ Recent posts