forked from anotheranotherhoon/fe-sprint-my-agora-states
-
Notifications
You must be signed in to change notification settings - Fork 0
/
script.js
155 lines (125 loc) · 5.67 KB
/
script.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
// index.html을 열어서 agoraStatesDiscussions 배열 요소를 확인하세요.
console.log(agoraStatesDiscussions);
// convertToDiscussion은 아고라 스테이츠 데이터를 DOM으로 바꿔줍니다.
const convertToDiscussion = (obj) => {
const li = document.createElement("li"); // li 요소 생성
li.className = "discussion__container";
li.classList.add('discussion__card') // 클래스 이름 지정
const discussionInformation = document.createElement("div")
discussionInformation.className = "discussion__information";
const avatarWrapper = document.createElement("div");
avatarWrapper.className = "discussion__avatar--wrapper";
const discussionContent = document.createElement("div");
discussionContent.className = "discussion__content";
const discussionAnswered = document.createElement("div");
discussionAnswered.className = "discussion__answered";
// TODO: 객체 하나에 담긴 정보를 DOM에 적절히 넣어주세요.
const avatarImg = document.createElement('img');//프로필사진
avatarImg.src = obj.avatarUrl;
avatarImg.alt = 'avatar of ' + obj.author;
avatarImg.setAttribute('class','discussion__avatar--image');
avatarWrapper.append(avatarImg);
const discussionAuthor = document.createElement("p");//author
discussionAuthor.className = "discussion_author";
discussionAuthor.textContent = obj.author;
const discussionDate = document.createElement("p");//date
discussionDate.className = "discussion_date";
discussionDate.textContent = new Date().toDateString();
discussionInformation.append(avatarWrapper, discussionAuthor, discussionDate);
const discussionLine = document.createElement('hr');
discussionLine.className = "disscusion__card--hr";
const checked = document.createElement('img');
checked.src = obj.answer ? './img/icon_answered.svg' : './img/icon_question.svg';
discussionAnswered.append(checked);
const discussionTitle = document.createElement('h2'); //타이틀
discussionTitle.className = "discussion__title"
const discussionTitleLink = document.createElement('a'); //타이틀링크
discussionTitleLink.textContent = obj.title;
discussionTitleLink.setAttribute('href', obj.url);
discussionTitle.append(discussionTitleLink);
discussionContent.append(discussionAnswered, discussionTitle)
li.append(discussionInformation, discussionLine,discussionContent);
return li;
};
// agoraStatesDiscussions 배열의 모든 데이터를 화면에 렌더링하는 함수입니다.
const render = (element) => {
for (let i = 0; i < agoraStatesDiscussions.length; i += 1) {
//여기서 convertToDiscussion의 전달인자가 입력 ( obj = agroaStatesDiscussion[i] )
element.append(convertToDiscussion(agoraStatesDiscussions[i]));
}
return;
};
// ul 요소에 agoraStatesDiscussions 배열의 모든 데이터를 화면에 렌더링합니다.
const ul = document.querySelector("ul.discussions__container");
render(ul);
//form 요소 가져오기
const form = document.querySelector("form.form");
const author = form.querySelector("div.form__input--name > input");
const title = form.querySelector("div.form__input--title > input");
const textbox = form.querySelector("div.form__textbox > textarea");
// submit form data 가져오기
form.addEventListener("submit", (event) => {
event.preventDefault(); //서브밋 이벤트로 사용시 꼭 함께 사용해주어야함
const newDiscussion = {
id: "unique value",
createdAt: new Date().toDateString(),
title: title.value,
url: "https://github.com/codestates-seb/agora-states-fe/discussions",
author: author.value,
bodyHTML: textbox.value,
avatarUrl: "https://avatars.githubusercontent.com/u/124783124?s=400&u=4d629ec2d4bec32bf069cb21fa71c8245f41d8ad&v=4"
};
ul.prepend(convertToDiscussion(newDiscussion));
modal.style.display = 'none'; //팝업 끄기
form.reset(); // 입력 리셋
})
//모달팝업 창
const btn = document.getElementById('popupBtn');
const modal = document.getElementById('modalWrap');
const closeBtn = document.getElementById('closeBtn');
btn.onclick = () => {
modal.style.display = 'flex';
}
closeBtn.onclick = () => {
modal.style.display = 'none';
}
window.onclick = e => {
if (e.target == modal) {
modal.style.display = "none";
}
}
//페이지네이션
const itemsPerPage = 15; // 각 페이지에 표시할 항목의 수
const paginationContainer = document.createElement("div"); // 페이지 버튼이 표시될 div 요소
const numPages = Math.ceil(ul.children.length / itemsPerPage); // 전체 페이지 수
for (let i = 1; i <= numPages; i++) {
const button = document.createElement("button");
button.textContent = i;
button.addEventListener("click", () => {
// 해당 페이지의 항목을 보여주는 함수를 호출
showPage(i);
});
paginationContainer.appendChild(button);
}
function showPage(pageNumber) {
// 해당 페이지에 표시될 첫 번째 항목의 인덱스
const startIndex = (pageNumber - 1) * itemsPerPage;
// 해당 페이지에 표시될 마지막 항목의 인덱스
const endIndex = startIndex + itemsPerPage - 1;
// 모든 항목을 숨김
for (let i = 0; i < ul.children.length; i++) {
ul.children[i].style.display = "none";
}
// 해당 페이지에 속한 항목을 표시
for (let i = startIndex; i <= endIndex && i < ul.children.length; i++) {
ul.children[i].style.display = "block";
}
}
showPage(1);// 페이지 버튼을 누르기 전에는 페이지 1 유지
ul.parentNode.insertBefore(paginationContainer, ul.nextSibling);
//textarea 사용자 입력에 맞춰 늘어나기
const textarea = document.querySelector('#story');
function resize() {
textarea.style.height = "1px";
textarea.style.hegiht = (20 + textarea.scrollHeight)+"px";
}