본문 바로가기
Project/축구모임 홈페이지개발

[축구모임 홈페이지개발] 04/24 개발일지 Nodejs / tooltip 직접 만들기

by 한33 2024. 4. 24.

어제 그제, bootstrap 으로 tooltip 을 구현하는데에 실패했다.

 

내 코드 안에서는 아무리 해도 구현이 안되었다.

 

그래도 그 과정에서 bootstrap 의 css 코드와 js 코드를 가져오는 방법을 더 자세히 알게 되었고,

 

tooltip 이나 popovers 그리고 그 둘을 사용하지 않을 때에 용량을 줄이기 위한 따로 불러오는 코드를 알았다.

 

버전도 신경써야한다는 것을 알았다.

    <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.8/dist/umd/popper.min.js" integrity="sha384-I7E8VVD/ismYTF4hNIPjVp/Zjvgyol6VFvRkX/vR+Vc4jQkC+hVqc2pM8ODewa9r" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.min.js" integrity="sha384-0pUGZvbkm6XF6gxjEnlmuGrJXVbNuzT9qBBavbLwCsOGabYfZo0T0to5eqruptLy" crossorigin="anonymous"></script>

 

우선 시간적으로 여유가 없어서 내가 직접 tooltip 을 만들기로 했다.

 

내 목표는 경기일정 탭에서 승패 이미지 영역인 match-result-logo 영역을 클릭 시에 아래에 해당 경기 때의 mvp 의 이름이 

 

나오도록 설정할 것이다.

 

 

위에 WIN 버튼에 마우스를 갖다 대면 아래에 tooltip 이 뜨면서 MVP 이름이 나오게 할 거다.

 

          <div class="match-result-resultlogo match-result-tooltip">
            <%-result[i].resultlogo%>
            <div class="match-result-tooltip-content">
              이름
            </div>
          </div>

 

마우스를 갖다 댈 영역 안에 tooltip 영역을 하나 만들어주고, 

 

.match-result-tooltip {
    position: relative;
    margin: auto;
    width: 20%;
}
.match-result-tooltip .match-result-tooltip-content {
    visibility: hidden;
    height: 80%;
    width: 50%;
    font-size: 100%;
    background-color: #ff3ca0;
    padding: 0;
    color: white;
    text-align: center;
    position: absolute;
    z-index: 1;
    top: 80%;
    right: 25%;
    opacity: 0;
    transition: opacity 0.3s ease;
}
.match-result-tooltip:hover .match-result-tooltip-content { visibility: visible; opacity: 1 }

 

다음과 같이 css 코드를 짜줬다.

 

match-result-tooltip 에 hover 를 붙여서 visibility 속성을 visible 로 맞춰줬고,

 

서서히 드러나게 하기 위해서 opacity 속성도 이용해줬다.

 

 

마우스를 갖다댈 때마다 이처럼 아래 영역이 생기고 그 곳에 MVP 이름이 뜰 공간이 만들어졌다.

 

이제 DB 에서 관리를 해줘야하는데,

 

우선 MVP 를 등록하는 내 서버코드가 이미 존재한다.

 

이를 이용해서 경기결과 DB 에 하나의 항목을 더 만들고  MVP 가 선정이 되면  그 항목을 업데이트 해 나간다음,

 

그 데이터를 경기결과 탭에 가져와서 띄우게 할 계획이다.

 

선정이 안되어있는 상태에서는 미정 이라는 문구를 띄울 것이다.

 

( 최근 밖에서 돌아다니면서 생각해낸 방법. 제일 베스트라고 아직까지 생각 중 )

 

근데 문제가 있다.

 

기존에 나는 MVP 를 선정하고 해당 날짜와 홈 화면에서 이미지를 띄우기 위해 이미지 코드만 DB 로 전송시켜서 저장했었다.

 

 

하지만 이제 이름 값도 전달을 받아야하고 이름은 result 탭에 mvp 이름 으로 업데이트 시키는 식으로 해야한다

 

업데이트 로 하는 이유는 보통, 경기가 끝나고 경기결과를 올리는 시간 이후에 MVP 투표 후 MVP 선정되기까지

 

사이에 텀이 존재하기 때문이다.

 

var MVP_Name;
case 'ㅇㅇㅇ':
          var MVP_Name = 'ㅇㅇㅇ'
          var selectedMVP = `<div class="overlay-text">${month}.${day}</div><div class="mvp-area"><img
          </div>`
          break

 

MVP_Name 변수를 추가로 전달하기 위해서 만들어주고 변수를 선언, option 이 선택되었을 때 해당 변수에 그 이름이 들어가도록 값을 설정,

 

      location.href = `/mvp?val=${encodeURIComponent(selectedMVP)}&month=${encodeURIComponent(month)}&day=${encodeURIComponent(day)}&MVP_Name=${encodeURIComponent(MVP_Name)}`;
 

 

/mvp 엔드포인트로 데이터 값 전달.


 

데이터를 전달 받기 전에 사이에 텀에 사용자들에게 MVP 가 "미정" 이라고 알려주기 위해서, 또 그 위치로 업데이트 하기  

 

위해서 경기결과 등록 때

 

app.get('/result', async (req, res) => {
  let result = db.collection('result').insertOne({
    month: req.query.month,
    day: req.query.day,
    day2: req.query.day2,
    time: req.query.time,
    place: req.query.place,
    homescore: req.query.homescore,
    awayscore: req.query.awayscore,
    awayname: req.query.awayname,
    resultlogo: req.query.resultlogo,
    home_resultlogo: req.query.home_resultlogo,
    mvp_name : '미정'
  })
  res.redirect('/match-result')
})

 

이처럼 미정 값을 넣어줬다.

 

app.get('/mvp', async (req, res) => {
  // MVP 추가
  let result = await db.collection('mvp').insertOne({
    mvp: req.query.val,
    month: req.query.month,
    day: req.query.day,
    mvp_name : req.query.MVP_Name
  });

    let query = { month: req.query.month, day: req.query.day };

    let updateResult = await db.collection('result').updateOne(query, { $set: { mvp_name: req.query.MVP_Name } });

    if(updateResult.modifiedCount === 1) {
      console.log("업데이트 성공");
    } else {
      console.log("업데이트된 문서가 없음.");
    }
 
  res.redirect('/');
});

 

그 다음 위처럼 result 안에서 month 와 day 가 같은 곳을 찾아서 mvp_name 항목을 업데이트 해줬다.

 


이제  ejs 파일로 돌아와서 

 

<div class="match-result-resultlogo match-result-tooltip">
            <%-result[i].resultlogo%>
            <div class="match-result-tooltip-content">
              <%=result[i].mvp_name%>
            </div>
          </div>

 

이름이 들어갈 자리에 데이터 값을 넣어줬는데

 

 

잘 뜬다.

 

이거 년도 23년도 이거 뭐야; 

 

해결해야겠다 이것도. 내일 출근해야하니까 내일한다.