Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

two projects of star rating and one of sorting table #199

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"liveServer.settings.port": 5501
}
13 changes: 13 additions & 0 deletions sortable-table/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Sorted-table</title>
<link rel="stylesheet" href="styles.css">
<script src="script.js" defer></script>
</head>
<body>
<div id="sortableTable"></div>
</body>
</html>
138 changes: 138 additions & 0 deletions sortable-table/script.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
const data = [
{
id: 1,
title: 'iPhone 9',
price: 549,
inStock: true,
category: 'smartphones',
},
{
id: 2,
title: 'iPhone X',
price: 899,
inStock: true,
category: 'smartphones',
},
{

id: 3,
title: 'Samsung Universe 9',
price: 1249,
inStock: true,
category: 'smartphones',
},
{
id: 4,
title: 'Huawei P30',
price: 499,
inStock: false,
category: 'smartphones',
},
{
id: 5,
title: 'OPPOF19',
price: 280,
inStock: false,
category: 'smartphones',
},
{
id: 6,
title: 'MacBook Pro',
price: 1749,
inStock: true,
category: 'laptops',
},
{
id: 7,
title: 'Samsung Galaxy Book',
price: 1499,
inStock: false,
category: 'laptops'
},
{
id: 8,
title: 'Microsoft Surface Laptop 4',
price: 1499,
inStock: false,
category: 'laptops',
},
{
id: 9,
title: 'HP Pavilion 15-DK1056WM',
price: 1099,
inStock: true,
category: 'laptops',
},
{

id: 10,
title: 'Infinix INBOOK',
price: 1099,
inStock: true,
category: 'laptops',
}
];


const createTable = productData => {
const tableElem = document.createElement('table');
const tableHead = document.createElement('thead');
const tableBody = document.createElement('tbody');

const headers = Object.keys(productData[0]);
tableHead.appendChild(createHeaderRow(headers));

productData.forEach(rowData => {
tableBody.appendChild(createProductRow(rowData));
})

tableElem.appendChild(tableHead);
tableElem.appendChild(tableBody);

return tableElem;
}

const createHeaderRow = columnNames => {
const tr = document.createElement('tr');
columnNames.forEach(columnName => {
const th = document.createElement('th');
th.textContent = columnName[0].toUpperCase() + columnName.slice(1);
const searchUp = document.createElement('span');
searchUp.textContent = '🔼';
const searchDown = document.createElement('span');
searchDown.textContent = '🔽';

searchUp.onclick = () => sortDataBy(columnName, 'ASC');
searchDown.onclick = () => sortDataBy(columnName, 'DESC');

th.appendChild(searchDown);
th.appendChild(searchUp);
tr.appendChild(th);
})

return tr;
}

const createProductRow = product => {
const tr = document.createElement('tr');
Object.values(product).forEach(value => {
const td = document.createElement('td');
td.textContent = value;
tr.appendChild(td);
});

return tr;
}

const sortDataBy = (columnName, direction) => {
const sortedASCData = [...data.sort((a, b) => a[columnName] > b[columnName] ? 1 : -1)];
const sortedDESCData = [...data.sort((a, b) => a[columnName] < b[columnName] ? 1 : -1)];
renderTable(direction === 'ASC' ? sortedASCData : sortedDESCData);
};

const renderTable = productData => {
const sortableTableElement = document.getElementById('sortableTable');
sortableTableElement.innerHTML = '';
sortableTableElement.appendChild(createTable(productData));
};
renderTable(data);
12 changes: 12 additions & 0 deletions sortable-table/styles.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
body{
font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;

}
table, th{
text-align: left;
border: 1px solid black;
}
th>span{
margin: 2.5rem;
cursor: pointer;
}
13 changes: 13 additions & 0 deletions star-rating/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="styles.css">
<script src="script.js" defer></script>
</head>
<body>
<div id="ratings"></div>
</body>
</html>
67 changes: 67 additions & 0 deletions star-rating/script.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
const initialQuestions = [
{
label: 'Friendliness',
rating: 0,
},
{
label: 'Cleanliness',
rating: 0,
},
{
label: 'Food',
rating: 0,
},
{
label: 'Service',
rating: 0,
},
];

const storedQuestions = JSON.parse(localStorage.getItem('storedQuestions'));

const questions = storedQuestions || initialQuestions;

const makeStarRating = question => {
const container = document.createElement('div');
const label = document.createElement('label');
label.textContent = question.label;
container.appendChild(label);
container.appendChild(makeStars(5, question));

return container;
};

const makeStars = (maxValue, question) => {
const starContainer = document.createElement('div');

for (let starPosition = 1; starPosition <= maxValue; starPosition++) {
const starElement = document.createElement('span');
starContainer.appendChild(starElement);
if (starPosition <= question.rating) {
starElement.classList.add('filled');
} else {
starElement.classList.add('empty');
}

starElement.onclick = () => {
for (let i = 0; i < maxValue; i++) {
if (i < starPosition) {
starContainer.children[i].classList.add('filled');
} else {
starContainer.children[i].classList.remove('filled');
starContainer.children[i].classList.add('empty');
}
}
question.rating = starPosition;
localStorage.setItem('storedQuestions', JSON.stringify(questions));
}
}

return starContainer;
}

const ratingsElement = document.getElementById('ratings');

questions.forEach(question => {
ratingsElement.appendChild(makeStarRating(question))
});
24 changes: 24 additions & 0 deletions star-rating/styles.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
body {
font-family: sans-serif;
}

#ratings {
display: flex;
flex-direction: column;
gap: 1rem;
border: 2px solid black;
padding: 1rem;
width: 100px;
}

.empty::before {
content: '☆';
cursor: pointer;
}

.filled::before {
content: '★';
cursor: pointer;
}

/* ☆★ */