From 2ba6f63924e1258d613dae351796f62d08a6f84e Mon Sep 17 00:00:00 2001 From: Artur Frait Date: Tue, 10 Nov 2026 00:43:28 +0100 Subject: [PATCH 1/6] add task solution --- .github/workflows/test.yml-template | 29 +++++ README.md | 6 +- package-lock.json | 181 +--------------------------- package.json | 2 +- src/scripts/main.js | 33 +++++ 5 files changed, 71 insertions(+), 180 deletions(-) create mode 100644 .github/workflows/test.yml-template diff --git a/.github/workflows/test.yml-template b/.github/workflows/test.yml-template new file mode 100644 index 000000000..44ac4e963 --- /dev/null +++ b/.github/workflows/test.yml-template @@ -0,0 +1,29 @@ +name: Test + +on: + pull_request: + branches: [ master ] + +jobs: + build: + + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [20.x] + + steps: + - uses: actions/checkout@v2 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + - run: npm install + - run: npm start & sleep 5 && npm test + - name: Upload tests report(cypress mochaawesome merged HTML report) + if: ${{ always() }} + uses: actions/upload-artifact@v2 + with: + name: report + path: reports diff --git a/README.md b/README.md index 294f077fb..d3e5df481 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ 1. Replace `` with your Github username in the link - - [DEMO LINK](https://.github.io/js_task_parse_list_DOM/) + - [DEMO LINK](https://Arturchukk.github.io/js_task_parse_list_DOM/) 2. Follow [this instructions](https://mate-academy.github.io/layout_task-guideline/) - Run `npm run test` command to test your code; - Run `npm run test:only -- -n` to run fast test ignoring linter; @@ -10,14 +10,14 @@ Hey there! Can you parse data from the list and sort it based on data attributes? Your task: Sort list by salary in descending order. -Get an array of employees. Write two functions: +Get an array of employees. Write two functions: - first, which sorts the list by salary from data attributes - second, which returns an array of objects, where objects are employees. The schema for the employee: ``` { - name, + name, position, salary, age diff --git a/package-lock.json b/package-lock.json index c3a278e3e..955f8a18e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@linthtml/linthtml": "^0.9.6", "@mate-academy/eslint-config": "latest", "@mate-academy/linthtml-config": "latest", - "@mate-academy/scripts": "^1.8.5", + "@mate-academy/scripts": "^2.1.3", "@mate-academy/stylelint-config": "latest", "@parcel/transformer-sass": "^2.12.0", "cypress": "^13.13.0", @@ -1497,10 +1497,11 @@ "dev": true }, "node_modules/@mate-academy/scripts": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@mate-academy/scripts/-/scripts-1.8.5.tgz", - "integrity": "sha512-mHRY2FkuoYCf5U0ahIukkaRo5LSZsxrTSgMJheFoyf3VXsTvfM9OfWcZIDIDB521kdPrScHHnRp+JRNjCfUO5A==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@mate-academy/scripts/-/scripts-2.1.3.tgz", + "integrity": "sha512-a07wHTj/1QUK2Aac5zHad+sGw4rIvcNl5lJmJpAD7OxeSbnCdyI6RXUHwXhjF5MaVo9YHrJ0xVahyERS2IIyBQ==", "dev": true, + "license": "MIT", "dependencies": { "@octokit/rest": "^17.11.2", "@types/get-port": "^4.2.0", @@ -5757,87 +5758,6 @@ "node": ">=12 || >=16" } }, - "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-select/node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/css-select/node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/css-select/node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/css-select/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/css-tree": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", @@ -5875,45 +5795,6 @@ "node": ">=4" } }, - "node_modules/csso": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "css-tree": "~2.2.0" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/csso/node_modules/css-tree": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "mdn-data": "2.0.28", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/csso/node_modules/mdn-data": { - "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", - "dev": true, - "optional": true, - "peer": true - }, "node_modules/cypress": { "version": "13.13.1", "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.13.1.tgz", @@ -12625,20 +12506,6 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, - "node_modules/srcset": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/srcset/-/srcset-5.0.1.tgz", - "integrity": "sha512-/P1UYbGfJVlxZag7aABNRrulEXAwCSDo7fklafOQrantuPTDmYgijJMks2zusPCVzgW9+4P69mq7w6pYuZpgxw==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/sshpk": { "version": "1.18.0", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", @@ -13111,44 +12978,6 @@ "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", "dev": true }, - "node_modules/svgo": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", - "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^5.1.0", - "css-tree": "^2.3.1", - "css-what": "^6.1.0", - "csso": "^5.0.5", - "picocolors": "^1.0.0" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/svgo" - } - }, - "node_modules/svgo/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">= 10" - } - }, "node_modules/synckit": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", diff --git a/package.json b/package.json index 8e38597e8..a43a43f70 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "@linthtml/linthtml": "^0.9.6", "@mate-academy/eslint-config": "latest", "@mate-academy/linthtml-config": "latest", - "@mate-academy/scripts": "^1.8.5", + "@mate-academy/scripts": "^2.1.3", "@mate-academy/stylelint-config": "latest", "@parcel/transformer-sass": "^2.12.0", "cypress": "^13.13.0", diff --git a/src/scripts/main.js b/src/scripts/main.js index a765fdb1d..fa5437186 100644 --- a/src/scripts/main.js +++ b/src/scripts/main.js @@ -1,3 +1,36 @@ 'use strict'; // write code here + +const list = document.querySelector('ul'); + +function sortList(employeesList) { + const array = Array.from(employeesList.querySelectorAll('li')); + + array.sort(function (a, b) { + return Number(b.dataset.salary) - Number(a.dataset.salary); + }); + + list.append(...array); +} + +function getEmployees(employeesList) { + const li = employeesList.querySelectorAll('li'); + const employees = []; + + for (const l of li) { + const employee = { + name: l.dataset.name, + position: l.dataset.position, + salary: Number(l.dataset.salary), + age: Number(l.dataset.age), + }; + + employees.push(employee); + } + + return employees; +} + +sortList(list); +getEmployees(list); From f16b3458e608c1c7a8e8321fd029e5cd2d7b9745 Mon Sep 17 00:00:00 2001 From: Artur Frait Date: Thu, 12 Nov 2026 00:29:28 +0100 Subject: [PATCH 2/6] add task solution --- src/scripts/main.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/scripts/main.js b/src/scripts/main.js index fa5437186..d1ff11e03 100644 --- a/src/scripts/main.js +++ b/src/scripts/main.js @@ -4,14 +4,19 @@ const list = document.querySelector('ul'); +// Helper function +function parseSalary(salaryString) { + return Number(salaryString); +} + function sortList(employeesList) { const array = Array.from(employeesList.querySelectorAll('li')); array.sort(function (a, b) { - return Number(b.dataset.salary) - Number(a.dataset.salary); + return parseSalary(b.dataset.salary) - parseSalary(a.dataset.salary); }); - list.append(...array); + employeesList.append(...array); } function getEmployees(employeesList) { @@ -22,7 +27,7 @@ function getEmployees(employeesList) { const employee = { name: l.dataset.name, position: l.dataset.position, - salary: Number(l.dataset.salary), + salary: parseSalary(l.dataset.salary), age: Number(l.dataset.age), }; From 6588c3cc1838b457a2981374480d3a32a7a68188 Mon Sep 17 00:00:00 2001 From: Artur Frait Date: Thu, 12 Nov 2026 00:36:44 +0100 Subject: [PATCH 3/6] add task solution --- src/scripts/main.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/scripts/main.js b/src/scripts/main.js index d1ff11e03..ba26bc7e1 100644 --- a/src/scripts/main.js +++ b/src/scripts/main.js @@ -4,7 +4,6 @@ const list = document.querySelector('ul'); -// Helper function function parseSalary(salaryString) { return Number(salaryString); } @@ -12,7 +11,7 @@ function parseSalary(salaryString) { function sortList(employeesList) { const array = Array.from(employeesList.querySelectorAll('li')); - array.sort(function (a, b) { + array.sort((a, b) => { return parseSalary(b.dataset.salary) - parseSalary(a.dataset.salary); }); From 3622b809ff2b5f4faa07293dd19f9998a90cd186 Mon Sep 17 00:00:00 2001 From: Artur Frait Date: Thu, 12 Nov 2026 00:41:39 +0100 Subject: [PATCH 4/6] add task solution --- src/scripts/main.js | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/scripts/main.js b/src/scripts/main.js index ba26bc7e1..c8ee061d2 100644 --- a/src/scripts/main.js +++ b/src/scripts/main.js @@ -9,13 +9,18 @@ function parseSalary(salaryString) { } function sortList(employeesList) { - const array = Array.from(employeesList.querySelectorAll('li')); + const employees = [...employeesList.querySelectorAll('li')]; - array.sort((a, b) => { - return parseSalary(b.dataset.salary) - parseSalary(a.dataset.salary); + employees.sort((a, b) => { + const salaryA = parseSalary(a.dataset.salary); + const salaryB = parseSalary(b.dataset.salary); + + return salaryB - salaryA; }); - employeesList.append(...array); + employees.forEach(employee => { + employeesList.appendChild(employee); + }); } function getEmployees(employeesList) { @@ -23,14 +28,12 @@ function getEmployees(employeesList) { const employees = []; for (const l of li) { - const employee = { + employees.push({ name: l.dataset.name, position: l.dataset.position, salary: parseSalary(l.dataset.salary), age: Number(l.dataset.age), - }; - - employees.push(employee); + }); } return employees; From 41f52bfd9f47202bc7365440d46c942dcb321f46 Mon Sep 17 00:00:00 2001 From: Artur Frait Date: Thu, 12 Nov 2026 00:47:49 +0100 Subject: [PATCH 5/6] add task solution --- src/scripts/main.js | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/scripts/main.js b/src/scripts/main.js index c8ee061d2..f60720c76 100644 --- a/src/scripts/main.js +++ b/src/scripts/main.js @@ -9,18 +9,13 @@ function parseSalary(salaryString) { } function sortList(employeesList) { - const employees = [...employeesList.querySelectorAll('li')]; + const employees = Array.from(employeesList.querySelectorAll('li')); employees.sort((a, b) => { - const salaryA = parseSalary(a.dataset.salary); - const salaryB = parseSalary(b.dataset.salary); - - return salaryB - salaryA; + return parseSalary(b.dataset.salary) - parseSalary(a.dataset.salary); }); - employees.forEach(employee => { - employeesList.appendChild(employee); - }); + employeesList.replaceChildren(...employees); } function getEmployees(employeesList) { @@ -28,12 +23,14 @@ function getEmployees(employeesList) { const employees = []; for (const l of li) { - employees.push({ + const employee = { name: l.dataset.name, position: l.dataset.position, salary: parseSalary(l.dataset.salary), age: Number(l.dataset.age), - }); + }; + + employees.push(employee); } return employees; From 9b83543d1e7873814afadcbe91e5cf6685b870eb Mon Sep 17 00:00:00 2001 From: Artur Frait Date: Thu, 12 Nov 2026 00:59:17 +0100 Subject: [PATCH 6/6] add task solution --- src/scripts/main.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/scripts/main.js b/src/scripts/main.js index f60720c76..136c26961 100644 --- a/src/scripts/main.js +++ b/src/scripts/main.js @@ -1,6 +1,5 @@ 'use strict'; -// write code here const list = document.querySelector('ul');