From fb2b5a919f3a2170a9924454a1f7df612a5826a8 Mon Sep 17 00:00:00 2001 From: avasilyevartyem Date: Tue, 31 Mar 2026 01:07:29 +0300 Subject: [PATCH 1/4] [EIS-1] add MetersPage with Table and pagination, Meters Api, MobX Store, favicon, tanstack router, pre-commit hook husky, loader --- .husky/pre-commit | 1 + README.md | 122 +- index.html | 25 +- package-lock.json | 1023 ++++++++++++++++- package.json | 18 +- public/favicon.png | Bin 0 -> 2986 bytes public/favicon.svg | 1 - public/icons.svg | 24 - public/interview-eis-result.jpg | Bin 0 -> 107019 bytes src/App.css | 184 --- src/App.tsx | 121 +- src/assets/ColdWaterIcon.svg | 3 + src/assets/CursorPointerIcon.svg | 20 + src/assets/ElectricityDailyIcon.svg | 4 + src/assets/HotWaterIcon.svg | 3 + src/assets/ThermalEnergyIcon.svg | 4 + src/assets/TrashIcon.svg | 5 + src/assets/hero.png | Bin 44919 -> 0 bytes src/assets/react.svg | 1 - src/assets/vite.svg | 1 - src/components/Loader/Loader.css | 46 + src/components/Loader/Loader.tsx | 35 + src/components/Loader/index.ts | 1 + src/components/MetersTable/MetersTable.css | 156 +++ src/components/MetersTable/MetersTable.tsx | 63 + .../MetersTable/Pagination/Pagination.css | 130 +++ .../MetersTable/Pagination/Pagination.tsx | 108 ++ .../MetersTable/Pagination/buildPages.ts | 28 + .../MetersTable/TableRow/TableRow.css | 49 + .../MetersTable/TableRow/TableRow.tsx | 70 ++ .../MetersTable/icons/MeterTypeIcon.tsx | 16 + src/components/MetersTable/index.ts | 1 + src/index.css | 115 +- src/pages/MetersPage/MetersPage.css | 19 + src/pages/MetersPage/MetersPage.tsx | 12 + src/pages/MetersPage/index.ts | 1 + src/router.ts | 13 + src/routes/__root.tsx | 13 + src/routes/index.tsx | 9 + src/stores/MetersStore.ts | 202 ++++ src/vite-env.d.ts | 2 + tsconfig.app.json | 8 +- vite.config.ts | 25 +- 43 files changed, 2171 insertions(+), 511 deletions(-) create mode 100644 .husky/pre-commit create mode 100644 public/favicon.png delete mode 100644 public/favicon.svg delete mode 100644 public/icons.svg create mode 100644 public/interview-eis-result.jpg delete mode 100644 src/App.css create mode 100644 src/assets/ColdWaterIcon.svg create mode 100644 src/assets/CursorPointerIcon.svg create mode 100644 src/assets/ElectricityDailyIcon.svg create mode 100644 src/assets/HotWaterIcon.svg create mode 100644 src/assets/ThermalEnergyIcon.svg create mode 100644 src/assets/TrashIcon.svg delete mode 100644 src/assets/hero.png delete mode 100644 src/assets/react.svg delete mode 100644 src/assets/vite.svg create mode 100644 src/components/Loader/Loader.css create mode 100644 src/components/Loader/Loader.tsx create mode 100644 src/components/Loader/index.ts create mode 100644 src/components/MetersTable/MetersTable.css create mode 100644 src/components/MetersTable/MetersTable.tsx create mode 100644 src/components/MetersTable/Pagination/Pagination.css create mode 100644 src/components/MetersTable/Pagination/Pagination.tsx create mode 100644 src/components/MetersTable/Pagination/buildPages.ts create mode 100644 src/components/MetersTable/TableRow/TableRow.css create mode 100644 src/components/MetersTable/TableRow/TableRow.tsx create mode 100644 src/components/MetersTable/icons/MeterTypeIcon.tsx create mode 100644 src/components/MetersTable/index.ts create mode 100644 src/pages/MetersPage/MetersPage.css create mode 100644 src/pages/MetersPage/MetersPage.tsx create mode 100644 src/pages/MetersPage/index.ts create mode 100644 src/router.ts create mode 100644 src/routes/__root.tsx create mode 100644 src/routes/index.tsx create mode 100644 src/stores/MetersStore.ts create mode 100644 src/vite-env.d.ts diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 0000000..2312dc5 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1 @@ +npx lint-staged diff --git a/README.md b/README.md index 7dbf7eb..4e6268d 100644 --- a/README.md +++ b/README.md @@ -1,73 +1,75 @@ -# React + TypeScript + Vite +# Тестовое задание на позицию Frontend-разработчик в ООО Единая Информационная Система ЖКХ -This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. +# Техническое задание -Currently, two official plugins are available: +Создать приложение для отображения списка счётчиков горячей и холодной воды. +Дизайн: +https://www.figma.com/design/gxVXNv5MEY8RQ1KXRVvkUT/%D0%A2%D0%B5%D1%81 +%D1%82-(%D1%84%D1%80%D0%BE%D0%BD%D1%82)?node-id=0-1&t=QQ9ijj1biJPPjj7 +s-0 +1. Список счётчиков. +Счётчики получать запросом GET +http://showroom.eis24.me/c300/api/v4/test/meters/ Параметры limit=20 и offset +(выводить по 20 на страницу). +Данные должны выводиться на странице с внутренним скроллом +(«шапка» фиксированная, табличка скроллится внутри). -- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Oxc](https://oxc.rs) -- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) -## React Compiler +Колонки: -The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). +1. Порядковый номер. +2. Тип (ColdWaterAreaMeter — ХВС, HotWaterAreaMeter — ГВС). +3. Дата установки в формате дд.мм.гггг. +4. Автоматический ли он (is_automatic). +5. Значение (initial_values). +6. Адреc. +7. Примечание (description). -## Expanding the ESLint configuration -If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules: + 2. Адрес счётчика. + Адреса получать параллельным запросом + GET http://showroom.eis24.me/c300/api/v4/test/areas/ с параметром списка айди id in. + Продумать оптимизацию, не запрашивать уже известные адреса. + Выводить улицу, дом, номер квартиры. + 3. Удаление счётчика. + При наведении на строку должна появляться кнопка удаления, инициирующая + удаление счётчика (DELETE + http://showroom.eis24.me/c300/api/v4/test/meters/:meterId/). На странице при этом + всегда должно оставаться 20 элементов. -```js -export default defineConfig([ - globalIgnores(['dist']), - { - files: ['**/*.{ts,tsx}'], - extends: [ - // Other configs... +Стек технологий: +Использовать React, TypeScript, mobx-state-tree — обязательно, +styled-components — по желанию. +Конфиг Prettier +trailingComma: "es5" +tabWidth: 2 +semi: true +singleQuote: true +printWidth: 80 +Проект выложить на github. - // Remove tseslint.configs.recommended and replace with this - tseslint.configs.recommendedTypeChecked, - // Alternatively, use this for stricter rules - tseslint.configs.strictTypeChecked, - // Optionally, add this for stylistic rules - tseslint.configs.stylisticTypeChecked, +## Для запуска проекта используйте следующие команды - // Other configs... - ], - languageOptions: { - parserOptions: { - project: ['./tsconfig.node.json', './tsconfig.app.json'], - tsconfigRootDir: import.meta.dirname, - }, - // other options... - }, - }, -]) +``` +git clone https://github.com/southatelove/interview-eis.git ``` -You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules: - -```js -// eslint.config.js -import reactX from 'eslint-plugin-react-x' -import reactDom from 'eslint-plugin-react-dom' - -export default defineConfig([ - globalIgnores(['dist']), - { - files: ['**/*.{ts,tsx}'], - extends: [ - // Other configs... - // Enable lint rules for React - reactX.configs['recommended-typescript'], - // Enable lint rules for React DOM - reactDom.configs.recommended, - ], - languageOptions: { - parserOptions: { - project: ['./tsconfig.node.json', './tsconfig.app.json'], - tsconfigRootDir: import.meta.dirname, - }, - // other options... - }, - }, -]) ``` +npm i +``` + +``` +npm run dev +``` + +## Стек: + +- **TypeScript** +- **React** +- **Mobx-state-tree** +- **Vite** + +## Итог + +![alt text](/public/interview-eis-result.jpg) + diff --git a/index.html b/index.html index df8e01e..c489bac 100644 --- a/index.html +++ b/index.html @@ -1,13 +1,16 @@ - - - - - interview-eis - - -
- - - + + + + + + interview-eis + + + +
+ + + + \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 5be9585..921118c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "interview-eis", "version": "0.0.0", "dependencies": { + "@tanstack/react-router": "^1.168.8", "mobx": "^6.15.0", "mobx-react-lite": "^4.1.1", "mobx-state-tree": "^7.1.0", @@ -24,10 +25,13 @@ "eslint-plugin-react-hooks": "^7.0.1", "eslint-plugin-react-refresh": "^0.5.2", "globals": "^17.4.0", + "husky": "^9.1.7", + "lint-staged": "^16.4.0", "prettier": "^3.8.1", "typescript": "~5.9.3", "typescript-eslint": "^8.57.0", - "vite": "^8.0.1" + "vite": "^8.0.1", + "vite-plugin-svgr": "^5.0.0" } }, "node_modules/@babel/code-frame": { @@ -875,6 +879,340 @@ "dev": true, "license": "MIT" }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@tanstack/history": { + "version": "1.161.6", + "resolved": "https://registry.npmjs.org/@tanstack/history/-/history-1.161.6.tgz", + "integrity": "sha512-NaOGLRrddszbQj9upGat6HG/4TKvXLvu+osAIgfxPYA+eIvYKv8GKDJOrY2D3/U9MRnKfMWD7bU4jeD4xmqyIg==", + "license": "MIT", + "engines": { + "node": ">=20.19" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-router": { + "version": "1.168.8", + "resolved": "https://registry.npmjs.org/@tanstack/react-router/-/react-router-1.168.8.tgz", + "integrity": "sha512-t0S0QueXubBKmI9eLPcN/A1sLQgTu8/yHerjrvvsGeD12zMdw0uJPKwEKpStQF2OThQtw64cs34uUSYXBUTSNw==", + "license": "MIT", + "dependencies": { + "@tanstack/history": "1.161.6", + "@tanstack/react-store": "^0.9.3", + "@tanstack/router-core": "1.168.7", + "isbot": "^5.1.22" + }, + "engines": { + "node": ">=20.19" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": ">=18.0.0 || >=19.0.0", + "react-dom": ">=18.0.0 || >=19.0.0" + } + }, + "node_modules/@tanstack/react-store": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@tanstack/react-store/-/react-store-0.9.3.tgz", + "integrity": "sha512-y2iHd/N9OkoQbFJLUX1T9vbc2O9tjH0pQRgTcx1/Nz4IlwLvkgpuglXUx+mXt0g5ZDFrEeDnONPqkbfxXJKwRg==", + "license": "MIT", + "dependencies": { + "@tanstack/store": "0.9.3", + "use-sync-external-store": "^1.6.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@tanstack/router-core": { + "version": "1.168.7", + "resolved": "https://registry.npmjs.org/@tanstack/router-core/-/router-core-1.168.7.tgz", + "integrity": "sha512-z4UEdlzMrFaKBsG4OIxlZEm+wsYBtEp//fnX6kW18jhQpETNcM6u2SXNdX+bcIYp6AaR7ERS3SBENzjC/xxwQQ==", + "license": "MIT", + "dependencies": { + "@tanstack/history": "1.161.6", + "cookie-es": "^2.0.0", + "seroval": "^1.4.2", + "seroval-plugins": "^1.4.2" + }, + "bin": { + "intent": "bin/intent.js" + }, + "engines": { + "node": ">=20.19" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/store": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@tanstack/store/-/store-0.9.3.tgz", + "integrity": "sha512-8reSzl/qGWGGVKhBoxXPMWzATSbZLZFWhwBAFO9NAyp0TxzfBP0mIrGb8CP8KrQTmvzXlR/vFPPUrHTLBGyFyw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, "node_modules/@tybys/wasm-util": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", @@ -1291,6 +1629,35 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ansi-escapes": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", + "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -1389,6 +1756,19 @@ "node": ">=6" } }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001782", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001782.tgz", @@ -1427,6 +1807,39 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.2.0.tgz", + "integrity": "sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^8.0.0", + "string-width": "^8.2.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1447,6 +1860,23 @@ "dev": true, "license": "MIT" }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1461,6 +1891,39 @@ "dev": true, "license": "MIT" }, + "node_modules/cookie-es": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-2.0.0.tgz", + "integrity": "sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -1518,6 +1981,17 @@ "node": ">=8" } }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/electron-to-chromium": { "version": "1.5.328", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.328.tgz", @@ -1525,6 +1999,49 @@ "dev": true, "license": "ISC" }, + "node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -1722,6 +2239,13 @@ "node": ">=4.0" } }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -1732,6 +2256,13 @@ "node": ">=0.10.0" } }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "dev": true, + "license": "MIT" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -1847,6 +2378,19 @@ "node": ">=6.9.0" } }, + "node_modules/get-east-asian-width": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", + "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -1900,6 +2444,22 @@ "hermes-estree": "0.25.1" } }, + "node_modules/husky": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", + "dev": true, + "license": "MIT", + "bin": { + "husky": "bin.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -1937,6 +2497,13 @@ "node": ">=0.8.19" } }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -1944,7 +2511,23 @@ "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-glob": { @@ -1960,6 +2543,15 @@ "node": ">=0.10.0" } }, + "node_modules/isbot": { + "version": "5.1.36", + "resolved": "https://registry.npmjs.org/isbot/-/isbot-5.1.36.tgz", + "integrity": "sha512-C/ZtXyJqDPZ7G7JPr06ApWyYoHjYexQbS6hPYD4WYCzpv2Qes6Z+CCEfTX4Owzf+1EJ933PoI2p+B9v7wpGZBQ==", + "license": "Unlicense", + "engines": { + "node": ">=18" + } + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -2007,6 +2599,13 @@ "dev": true, "license": "MIT" }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -2331,6 +2930,55 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lint-staged": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.4.0.tgz", + "integrity": "sha512-lBWt8hujh/Cjysw5GYVmZpFHXDCgZzhrOm8vbcUdobADZNOK/bRshr2kM3DfgrrtR1DQhfupW9gnIXOfiFi+bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^14.0.3", + "listr2": "^9.0.5", + "picomatch": "^4.0.3", + "string-argv": "^0.3.2", + "tinyexec": "^1.0.4", + "yaml": "^2.8.2" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": ">=20.17" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/listr2": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz", + "integrity": "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^5.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -2354,6 +3002,66 @@ "dev": true, "license": "MIT" }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -2364,6 +3072,19 @@ "yallist": "^3.0.2" } }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/minimatch": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", @@ -2457,6 +3178,17 @@ "dev": true, "license": "MIT" }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, "node_modules/node-releases": { "version": "2.0.36", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", @@ -2464,6 +3196,22 @@ "dev": true, "license": "MIT" }, + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -2527,6 +3275,25 @@ "node": ">=6" } }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -2547,6 +3314,16 @@ "node": ">=8" } }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -2663,6 +3440,30 @@ "node": ">=4" } }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, "node_modules/rolldown": { "version": "1.0.0-rc.12", "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.12.tgz", @@ -2720,6 +3521,27 @@ "semver": "bin/semver.js" } }, + "node_modules/seroval": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.5.1.tgz", + "integrity": "sha512-OwrZRZAfhHww0WEnKHDY8OM0U/Qs8OTfIDWhUD4BLpNJUfXK4cGmjiagGze086m+mhI+V2nD0gfbHEnJjb9STA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/seroval-plugins": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.5.1.tgz", + "integrity": "sha512-4FbuZ/TMl02sqv0RTFexu0SP6V+ywaIe5bAWCCEik0fk17BhALgwvUDVF7e3Uvf9pxmwCEJsRPmlkUE6HdzLAw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "seroval": "^1.0" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -2743,6 +3565,60 @@ "node": ">=8" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slice-ansi": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-8.0.0.tgz", + "integrity": "sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.3", + "is-fullwidth-code-point": "^5.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -2753,6 +3629,49 @@ "node": ">=0.10.0" } }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-width": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.0.tgz", + "integrity": "sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -2779,6 +3698,23 @@ "node": ">=8" } }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.4.tgz", + "integrity": "sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/tinyglobby": { "version": "0.2.15", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", @@ -2828,8 +3764,7 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "license": "0BSD", - "optional": true + "license": "0BSD" }, "node_modules/type-check": { "version": "0.4.0", @@ -3017,6 +3952,21 @@ } } }, + "node_modules/vite-plugin-svgr": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/vite-plugin-svgr/-/vite-plugin-svgr-5.0.0.tgz", + "integrity": "sha512-CZFWDtbWSLnF6C+uv8u7E5Ao6UVQYBpJrS6212XsEod/Lm4ErhOoFc01/po4ie5hqvMCr5KYrlMrSGQQEtMtBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.2.0", + "@svgr/core": "^8.1.0", + "@svgr/plugin-jsx": "^8.1.0" + }, + "peerDependencies": { + "vite": ">=3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -3043,6 +3993,55 @@ "node": ">=0.10.0" } }, + "node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -3050,6 +4049,22 @@ "dev": true, "license": "ISC" }, + "node_modules/yaml": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", + "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 1a68aba..03228ab 100644 --- a/package.json +++ b/package.json @@ -8,15 +8,26 @@ "build": "tsc -b && vite build", "lint": "eslint .", "preview": "vite preview", - "format": "prettier --write ." + "format": "prettier --write .", + "prepare": "husky" }, "dependencies": { + "@tanstack/react-router": "^1.168.8", "mobx": "^6.15.0", "mobx-react-lite": "^4.1.1", "mobx-state-tree": "^7.1.0", "react": "^19.2.4", "react-dom": "^19.2.4" }, + "lint-staged": { + "*.{ts,tsx}": [ + "prettier --write", + "eslint --fix" + ], + "*.css": [ + "prettier --write" + ] + }, "devDependencies": { "@eslint/js": "^9.39.4", "@types/node": "^24.12.0", @@ -27,9 +38,12 @@ "eslint-plugin-react-hooks": "^7.0.1", "eslint-plugin-react-refresh": "^0.5.2", "globals": "^17.4.0", + "husky": "^9.1.7", + "lint-staged": "^16.4.0", "prettier": "^3.8.1", "typescript": "~5.9.3", "typescript-eslint": "^8.57.0", - "vite": "^8.0.1" + "vite": "^8.0.1", + "vite-plugin-svgr": "^5.0.0" } } diff --git a/public/favicon.png b/public/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..014763829cee462e701b7777daff0e5179c873c8 GIT binary patch literal 2986 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 giu_ZzWBaxIKhj-Ar1)n+I{*Lx07*qoM6N<$f \ No newline at end of file diff --git a/public/icons.svg b/public/icons.svg deleted file mode 100644 index e952219..0000000 --- a/public/icons.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/interview-eis-result.jpg b/public/interview-eis-result.jpg new file mode 100644 index 0000000000000000000000000000000000000000..38ff4cfe029b4d9c9d6c58e14eef0c09092fa306 GIT binary patch literal 107019 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 literal 0 HcmV?d00001 diff --git a/src/App.css b/src/App.css deleted file mode 100644 index f90339d..0000000 --- a/src/App.css +++ /dev/null @@ -1,184 +0,0 @@ -.counter { - font-size: 16px; - padding: 5px 10px; - border-radius: 5px; - color: var(--accent); - background: var(--accent-bg); - border: 2px solid transparent; - transition: border-color 0.3s; - margin-bottom: 24px; - - &:hover { - border-color: var(--accent-border); - } - &:focus-visible { - outline: 2px solid var(--accent); - outline-offset: 2px; - } -} - -.hero { - position: relative; - - .base, - .framework, - .vite { - inset-inline: 0; - margin: 0 auto; - } - - .base { - width: 170px; - position: relative; - z-index: 0; - } - - .framework, - .vite { - position: absolute; - } - - .framework { - z-index: 1; - top: 34px; - height: 28px; - transform: perspective(2000px) rotateZ(300deg) rotateX(44deg) rotateY(39deg) - scale(1.4); - } - - .vite { - z-index: 0; - top: 107px; - height: 26px; - width: auto; - transform: perspective(2000px) rotateZ(300deg) rotateX(40deg) rotateY(39deg) - scale(0.8); - } -} - -#center { - display: flex; - flex-direction: column; - gap: 25px; - place-content: center; - place-items: center; - flex-grow: 1; - - @media (max-width: 1024px) { - padding: 32px 20px 24px; - gap: 18px; - } -} - -#next-steps { - display: flex; - border-top: 1px solid var(--border); - text-align: left; - - & > div { - flex: 1 1 0; - padding: 32px; - @media (max-width: 1024px) { - padding: 24px 20px; - } - } - - .icon { - margin-bottom: 16px; - width: 22px; - height: 22px; - } - - @media (max-width: 1024px) { - flex-direction: column; - text-align: center; - } -} - -#docs { - border-right: 1px solid var(--border); - - @media (max-width: 1024px) { - border-right: none; - border-bottom: 1px solid var(--border); - } -} - -#next-steps ul { - list-style: none; - padding: 0; - display: flex; - gap: 8px; - margin: 32px 0 0; - - .logo { - height: 18px; - } - - a { - color: var(--text-h); - font-size: 16px; - border-radius: 6px; - background: var(--social-bg); - display: flex; - padding: 6px 12px; - align-items: center; - gap: 8px; - text-decoration: none; - transition: box-shadow 0.3s; - - &:hover { - box-shadow: var(--shadow); - } - .button-icon { - height: 18px; - width: 18px; - } - } - - @media (max-width: 1024px) { - margin-top: 20px; - flex-wrap: wrap; - justify-content: center; - - li { - flex: 1 1 calc(50% - 8px); - } - - a { - width: 100%; - justify-content: center; - box-sizing: border-box; - } - } -} - -#spacer { - height: 88px; - border-top: 1px solid var(--border); - @media (max-width: 1024px) { - height: 48px; - } -} - -.ticks { - position: relative; - width: 100%; - - &::before, - &::after { - content: ''; - position: absolute; - top: -4.5px; - border: 5px solid transparent; - } - - &::before { - left: 0; - border-left-color: var(--border); - } - &::after { - right: 0; - border-right-color: var(--border); - } -} diff --git a/src/App.tsx b/src/App.tsx index 46a5992..ced5696 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,121 +1,8 @@ -import { useState } from 'react' -import reactLogo from './assets/react.svg' -import viteLogo from './assets/vite.svg' -import heroImg from './assets/hero.png' -import './App.css' +import { RouterProvider } from '@tanstack/react-router'; +import { router } from '@/router'; function App() { - const [count, setCount] = useState(0) - - return ( - <> -
-
- - React logo - Vite logo -
-
-

Get started

-

- Edit src/App.tsx and save to test HMR -

-
- -
- -
- -
- -
-
- - ) + return ; } -export default App +export default App; diff --git a/src/assets/ColdWaterIcon.svg b/src/assets/ColdWaterIcon.svg new file mode 100644 index 0000000..0e35c51 --- /dev/null +++ b/src/assets/ColdWaterIcon.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/CursorPointerIcon.svg b/src/assets/CursorPointerIcon.svg new file mode 100644 index 0000000..4b6ca69 --- /dev/null +++ b/src/assets/CursorPointerIcon.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/ElectricityDailyIcon.svg b/src/assets/ElectricityDailyIcon.svg new file mode 100644 index 0000000..f5b1480 --- /dev/null +++ b/src/assets/ElectricityDailyIcon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/HotWaterIcon.svg b/src/assets/HotWaterIcon.svg new file mode 100644 index 0000000..c5f138a --- /dev/null +++ b/src/assets/HotWaterIcon.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/ThermalEnergyIcon.svg b/src/assets/ThermalEnergyIcon.svg new file mode 100644 index 0000000..76979c0 --- /dev/null +++ b/src/assets/ThermalEnergyIcon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/TrashIcon.svg b/src/assets/TrashIcon.svg new file mode 100644 index 0000000..e862ec7 --- /dev/null +++ b/src/assets/TrashIcon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/hero.png b/src/assets/hero.png deleted file mode 100644 index cc51a3d20ad4bc961b596a6adfd686685cd84bb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44919 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 JPDHLkV1myZcL)Fg diff --git a/src/assets/react.svg b/src/assets/react.svg deleted file mode 100644 index 6c87de9..0000000 --- a/src/assets/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/assets/vite.svg b/src/assets/vite.svg deleted file mode 100644 index 5101b67..0000000 --- a/src/assets/vite.svg +++ /dev/null @@ -1 +0,0 @@ -Vite diff --git a/src/components/Loader/Loader.css b/src/components/Loader/Loader.css new file mode 100644 index 0000000..65fbc38 --- /dev/null +++ b/src/components/Loader/Loader.css @@ -0,0 +1,46 @@ +.loader { + position: absolute; + inset: 0; + z-index: 3; + display: flex; + align-items: center; + justify-content: center; + background-color: rgba(255, 255, 255, 0.7); + backdrop-filter: blur(1px); +} + +.loader__spinner { + animation: loader-rotate 0.9s linear infinite; +} + +.loader__track { + stroke: #e0e5eb; +} + +.loader__arc { + stroke: #3698fa; + stroke-dasharray: 80 45; + animation: loader-dash 1.4s ease-in-out infinite; +} + +@keyframes loader-rotate { + to { + transform: rotate(360deg); + transform-origin: center; + } +} + +@keyframes loader-dash { + 0% { + stroke-dasharray: 1 124; + stroke-dashoffset: 0; + } + 50% { + stroke-dasharray: 90 34; + stroke-dashoffset: -35; + } + 100% { + stroke-dasharray: 90 34; + stroke-dashoffset: -124; + } +} diff --git a/src/components/Loader/Loader.tsx b/src/components/Loader/Loader.tsx new file mode 100644 index 0000000..1339010 --- /dev/null +++ b/src/components/Loader/Loader.tsx @@ -0,0 +1,35 @@ +import './Loader.css'; + +interface LoaderProps { + size?: number; + label?: string; +} + +export function Loader({ size = 44, label = 'Загрузка…' }: LoaderProps) { + return ( +
+ + + + +
+ ); +} diff --git a/src/components/Loader/index.ts b/src/components/Loader/index.ts new file mode 100644 index 0000000..d702788 --- /dev/null +++ b/src/components/Loader/index.ts @@ -0,0 +1 @@ +export { Loader } from './Loader'; diff --git a/src/components/MetersTable/MetersTable.css b/src/components/MetersTable/MetersTable.css new file mode 100644 index 0000000..d67adcb --- /dev/null +++ b/src/components/MetersTable/MetersTable.css @@ -0,0 +1,156 @@ +.meters-table-wrap { + display: flex; + flex-direction: column; + flex: 1; + min-height: 0; + border: 1px solid #e0e5eb; + border-radius: 12px; + overflow: hidden; + background-color: #fff; +} + +.meters-table-content-wrap { + flex: 1; + min-height: 0; + position: relative; +} + +.meters-table-scroll { + height: 100%; + overflow-x: auto; + display: flex; + flex-direction: column; +} + +.meters-table { + width: 100%; + display: flex; + flex-direction: column; + flex: 1; + min-height: 0; +} + +.meters-table-content-wrap .loader { + top: 36px; +} + +.col-num { + width: 48px; + text-align: center !important; +} +.col-type { + width: 120px; +} +.col-date { + width: 160px; +} +.col-auto { + width: 128px; +} +.col-reading { + width: 146px; +} +.col-address { + width: auto; + min-width: 430px; +} +.col-notes { + width: auto; + min-width: 1px; +} +.col-actions { + width: 64px; +} + +.meters-table thead { + background-color: #f0f3f7; +} + +.meters-table thead tr { + display: table; + width: 100%; + table-layout: fixed; +} + +.meters-table thead th { + box-sizing: border-box; + background-color: #f0f3f7; + padding: 8px 12px; + font-weight: 500; + font-size: 13px; + line-height: 16px; + color: #697180; + text-align: left; + white-space: nowrap; +} + +.meters-table tbody { + overflow-y: scroll; + overflow-x: hidden; + scrollbar-width: thin; + scrollbar-color: rgba(94, 102, 116, 0.5) #f8f9fa; +} + +.meters-table tbody tr { + display: table; + width: 100%; + table-layout: fixed; +} + +.meters-table td { + padding: 6px 12px; + font-weight: 400; + font-size: 14px; + line-height: 20px; + color: #1f2939; + vertical-align: middle; + white-space: nowrap; + height: 52px; + box-sizing: border-box; +} + +.td-num { + color: #5e6674; + text-align: center; +} + +.td-type { + display: flex; + align-items: center; + gap: 8px; + width: 100%; + color: #1d2432; +} + +.td-secondary { + color: #5e6674; +} + +.td-ellipsis { + overflow: hidden; + text-overflow: ellipsis; + max-width: 0; +} + +.col-actions { + text-align: center; +} + +.td-status { + text-align: center; + padding: 48px 12px; + color: #697180; + font-style: italic; +} + +.td-error { + color: #c53030; + font-style: normal; +} + +.visually-hidden { + position: absolute; + width: 1px; + height: 1px; + overflow: hidden; +} diff --git a/src/components/MetersTable/MetersTable.tsx b/src/components/MetersTable/MetersTable.tsx new file mode 100644 index 0000000..3c12286 --- /dev/null +++ b/src/components/MetersTable/MetersTable.tsx @@ -0,0 +1,63 @@ +import { useEffect } from 'react'; +import { observer } from 'mobx-react-lite'; +import { metersStore } from '@/stores/MetersStore'; +import { TableRow } from './TableRow/TableRow'; +import { Pagination } from './Pagination/Pagination'; +import { Loader } from '@/components/Loader'; +import './MetersTable.css'; + +export const MetersTable = observer(function MetersTable() { + useEffect(() => { + metersStore.fetchPage(1); + }, []); + + const { meters, isLoading, error, currentPage, pageCount } = metersStore; + + return ( +
+
+ {isLoading && } + +
+ + + + + + + + + + + + + + + {!isLoading && error && ( + + + + )} + {meters.map((meter, index) => ( + + ))} + +
ТипДата установкиАвтоматическийТекущие показанияАдресПримечание + Действия +
{error}
+
+
+ + metersStore.setPage(page)} + /> +
+ ); +}); diff --git a/src/components/MetersTable/Pagination/Pagination.css b/src/components/MetersTable/Pagination/Pagination.css new file mode 100644 index 0000000..1d1f606 --- /dev/null +++ b/src/components/MetersTable/Pagination/Pagination.css @@ -0,0 +1,130 @@ +.pagination { + display: flex; + justify-content: flex-end; + padding: 8px 16px; + border-top: 1px solid #eef0f4; +} + +.pagination__list { + display: flex; + gap: 8px; + list-style: none; + margin: 0; +} + +.pagination__btn { + display: flex; + align-items: center; + justify-content: center; + min-width: 32px; + height: 32px; + padding: 8px 12px; + font-size: 14px; + color: #1f2939; + background-color: #fff; + border: 1px solid #ced5de; + border-radius: 6px; + transition: background-color 0.15s ease; +} + +.pagination__btn:hover:not(:disabled) { + background-color: #f2f5f8; +} + +.pagination__btn--active, +.pagination__btn:disabled { + background-color: #f2f5f8; + cursor: default; +} + +.pagination__btn:focus-visible { + outline: 2px solid #3698fa; + outline-offset: 2px; +} + +.pagination__gap-item { + position: relative; +} + +.pagination__ellipsis { + display: flex; + align-items: center; + justify-content: center; + width: 32px; + height: 32px; + padding: 8px 12px; + font-size: 14px; + color: #697180; + border: 1px solid #ced5de; + border-radius: 6px; + background-color: #fff; + transition: + background-color 0.15s ease, + color 0.15s ease; +} + +.pagination__ellipsis:hover, +.pagination__ellipsis--open { + background-color: #f2f5f8; + color: #1f2939; +} + +.pagination__ellipsis:focus-visible { + outline: 2px solid #3698fa; + outline-offset: 2px; +} + +.pagination__backdrop { + position: fixed; + inset: 0; + z-index: 9; +} + +.pagination__gap-popup { + position: absolute; + bottom: calc(100% + 6px); + left: 50%; + transform: translateX(-50%); + z-index: 10; + + display: flex; + flex-wrap: wrap; + gap: 4px; + padding: 8px; + + max-width: 200px; + max-height: 160px; + overflow-x: hidden; + overflow-y: auto; + + background-color: #fff; + border: 1px solid #ced5de; + border-radius: 8px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12); + + scrollbar-width: thin; + scrollbar-color: rgba(94, 102, 116, 0.5) #f8f9fa; +} + +.pagination__gap-popup::-webkit-scrollbar { + width: 8px; +} + +.pagination__gap-popup::-webkit-scrollbar-track { + background-color: #f8f9fa; +} + +.pagination__gap-popup::-webkit-scrollbar-thumb { + background-color: rgba(94, 102, 116, 0.5); + border-radius: 4px; +} + +.pagination__gap-popup::-webkit-scrollbar-thumb:hover { + background-color: rgba(94, 102, 116, 0.75); +} + +.pagination__gap-popup__btn { + min-width: 32px; + padding: 4px 6px; + flex-shrink: 0; +} diff --git a/src/components/MetersTable/Pagination/Pagination.tsx b/src/components/MetersTable/Pagination/Pagination.tsx new file mode 100644 index 0000000..af50300 --- /dev/null +++ b/src/components/MetersTable/Pagination/Pagination.tsx @@ -0,0 +1,108 @@ +import { useState } from 'react'; +import { buildPages, type Gap } from './buildPages'; +import './Pagination.css'; + +interface PaginationProps { + current: number; + total: number; + disabled?: boolean; + onPageChange: (page: number) => void; +} + +interface GapPopupProps { + gap: Gap; + disabled: boolean; + onSelect: (page: number) => void; +} + +function GapPopup({ gap, disabled, onSelect }: GapPopupProps) { + return ( +
+ {gap.pages.map((p) => ( + + ))} +
+ ); +} + +export function Pagination({ + current, + total, + disabled = false, + onPageChange, +}: PaginationProps) { + const [openGapIdx, setOpenGapIdx] = useState(null); + + if (total <= 1) return null; + + const pages = buildPages(current, total); + + return ( + + ); +} diff --git a/src/components/MetersTable/Pagination/buildPages.ts b/src/components/MetersTable/Pagination/buildPages.ts new file mode 100644 index 0000000..4caf6fd --- /dev/null +++ b/src/components/MetersTable/Pagination/buildPages.ts @@ -0,0 +1,28 @@ +export type Gap = { type: 'gap'; pages: number[] }; +export type PageItem = number | Gap; + +const range = (from: number, to: number): number[] => + Array.from({ length: to - from + 1 }, (_, i) => from + i); + +export function buildPages(current: number, total: number): PageItem[] { + if (total <= 1) return []; + + const WINDOW = 2; + const visible = new Set([ + 1, + total, + ...range(Math.max(1, current - WINDOW), Math.min(total, current + WINDOW)), + ]); + + const sorted = [...visible].sort((a, b) => a - b); + + return sorted.flatMap((page, i) => { + if (i > 0 && page - sorted[i - 1] > 1) { + return [ + { type: 'gap' as const, pages: range(sorted[i - 1] + 1, page - 1) }, + page, + ]; + } + return [page]; + }); +} diff --git a/src/components/MetersTable/TableRow/TableRow.css b/src/components/MetersTable/TableRow/TableRow.css new file mode 100644 index 0000000..186a2b3 --- /dev/null +++ b/src/components/MetersTable/TableRow/TableRow.css @@ -0,0 +1,49 @@ +.table-row { + border-bottom: 1px solid #e0e5eb; +} + +.table-row:hover { + background-color: #f7f8f9; + cursor: + url('../../../assets/CursorPointerIcon.svg') 4 1, + pointer; +} + +.table-row__delete-btn { + display: flex; + align-items: center; + justify-content: center; + width: 40px; + height: 40px; + padding: 0; + background-color: #fee3e3; + border: none; + border-radius: 8px; + cursor: pointer; + opacity: 0; + color: #c53030; + transition: + opacity 0.15s ease, + background-color 0.15s ease, + color 0.15s ease; +} + +.table-row:hover .table-row__delete-btn { + opacity: 1; +} + +.table-row__delete-btn:hover { + background-color: #fed7d7; + color: #9b2c2c; +} + +.table-row__delete-btn:disabled { + cursor: not-allowed; + opacity: 0.5; +} + +.table-row__delete-btn:focus-visible { + outline: 2px solid #c53030; + outline-offset: 2px; + opacity: 1; +} diff --git a/src/components/MetersTable/TableRow/TableRow.tsx b/src/components/MetersTable/TableRow/TableRow.tsx new file mode 100644 index 0000000..56c5aff --- /dev/null +++ b/src/components/MetersTable/TableRow/TableRow.tsx @@ -0,0 +1,70 @@ +import { observer } from 'mobx-react-lite'; +import type { Instance } from 'mobx-state-tree'; +import { metersStore } from '@/stores/MetersStore'; +import { MeterTypeIcon } from '@/components/MetersTable/icons/MeterTypeIcon'; +import TrashIcon from '@/assets/TrashIcon.svg?react'; +import './TableRow.css'; + +type MeterInstance = Instance[number]; + +interface TableRowProps { + meter: MeterInstance; + rowNum: number; +} + +export const TableRow = observer(function TableRow({ + meter, + rowNum, +}: TableRowProps) { + const { deletingId, deleteMeter, getAreaAddress } = metersStore; + + const address = getAreaAddress(meter.area.id); + const isDeleting = deletingId === meter.id; + + function handleDelete() { + deleteMeter(meter.id); + } + + return ( + + {rowNum} + + +
+ + {meter.meterType} +
+ + + {meter.formattedDate} + + + {meter.is_automatic === null ? '—' : meter.is_automatic ? 'да' : 'нет'} + + + {meter.currentReading} + + + {address} + + + + {meter.description ?? '—'} + + + + + + + ); +}); diff --git a/src/components/MetersTable/icons/MeterTypeIcon.tsx b/src/components/MetersTable/icons/MeterTypeIcon.tsx new file mode 100644 index 0000000..073bd7d --- /dev/null +++ b/src/components/MetersTable/icons/MeterTypeIcon.tsx @@ -0,0 +1,16 @@ +import ColdWaterIcon from '@/assets/ColdWaterIcon.svg?react'; +import HotWaterIcon from '@/assets/HotWaterIcon.svg?react'; +import ElectricityDailyIcon from '@/assets/ElectricityDailyIcon.svg?react'; +import ThermalEnergyIcon from '@/assets/ThermalEnergyIcon.svg?react'; + +interface MeterTypeIconProps { + type: string; +} + +export function MeterTypeIcon({ type }: MeterTypeIconProps) { + if (type === 'ХВС') return ; + if (type === 'ГВС') return ; + if (type === 'ЭЛДТ') return ; + if (type === 'ТПЛ') return ; + return null; +} diff --git a/src/components/MetersTable/index.ts b/src/components/MetersTable/index.ts new file mode 100644 index 0000000..e214414 --- /dev/null +++ b/src/components/MetersTable/index.ts @@ -0,0 +1 @@ +export { MetersTable } from './MetersTable'; diff --git a/src/index.css b/src/index.css index 5fb3313..6f7c9ab 100644 --- a/src/index.css +++ b/src/index.css @@ -1,111 +1,26 @@ -:root { - --text: #6b6375; - --text-h: #08060d; - --bg: #fff; - --border: #e5e4e7; - --code-bg: #f4f3ec; - --accent: #aa3bff; - --accent-bg: rgba(170, 59, 255, 0.1); - --accent-border: rgba(170, 59, 255, 0.5); - --social-bg: rgba(244, 243, 236, 0.5); - --shadow: - rgba(0, 0, 0, 0.1) 0 10px 15px -3px, rgba(0, 0, 0, 0.05) 0 4px 6px -2px; - - --sans: system-ui, 'Segoe UI', Roboto, sans-serif; - --heading: system-ui, 'Segoe UI', Roboto, sans-serif; - --mono: ui-monospace, Consolas, monospace; - - font: 18px/145% var(--sans); - letter-spacing: 0.18px; - color-scheme: light dark; - color: var(--text); - background: var(--bg); - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - - @media (max-width: 1024px) { - font-size: 16px; - } -} - -@media (prefers-color-scheme: dark) { - :root { - --text: #9ca3af; - --text-h: #f3f4f6; - --bg: #16171d; - --border: #2e303a; - --code-bg: #1f2028; - --accent: #c084fc; - --accent-bg: rgba(192, 132, 252, 0.15); - --accent-border: rgba(192, 132, 252, 0.5); - --social-bg: rgba(47, 48, 58, 0.5); - --shadow: - rgba(0, 0, 0, 0.4) 0 10px 15px -3px, rgba(0, 0, 0, 0.25) 0 4px 6px -2px; - } - - #social .button-icon { - filter: invert(1) brightness(2); - } -} - -#root { - width: 1126px; - max-width: 100%; - margin: 0 auto; - text-align: center; - border-inline: 1px solid var(--border); - min-height: 100svh; - display: flex; - flex-direction: column; - box-sizing: border-box; -} +@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@400;500&display=swap'); +html, body { margin: 0; + height: 100%; + font-family: 'Roboto', sans-serif; } -h1, -h2 { - font-family: var(--heading); - font-weight: 500; - color: var(--text-h); +a, +button:not(:disabled), +[role='button'], +label[for], +[tabindex]:not([tabindex='-1']) { + cursor: + url('./assets/CursorPointerIcon.svg') 4 1, + pointer; } -h1 { - font-size: 56px; - letter-spacing: -1.68px; - margin: 32px 0; - @media (max-width: 1024px) { - font-size: 36px; - margin: 20px 0; - } -} -h2 { - font-size: 24px; - line-height: 118%; - letter-spacing: -0.24px; - margin: 0 0 8px; - @media (max-width: 1024px) { - font-size: 20px; - } +#root { + height: 100%; } + p { margin: 0; } - -code, -.counter { - font-family: var(--mono); - display: inline-flex; - border-radius: 4px; - color: var(--text-h); -} - -code { - font-size: 15px; - line-height: 135%; - padding: 4px 8px; - background: var(--code-bg); -} diff --git a/src/pages/MetersPage/MetersPage.css b/src/pages/MetersPage/MetersPage.css new file mode 100644 index 0000000..8baf866 --- /dev/null +++ b/src/pages/MetersPage/MetersPage.css @@ -0,0 +1,19 @@ +.meters-page { + display: flex; + flex-direction: column; + gap: 16px; + padding: 16px; + height: 100%; + background-color: #f8f9fa; + box-sizing: border-box; + overflow: hidden; +} + +.meters-page__title { + font-weight: 500; + font-size: 24px; + line-height: 32px; + color: #1f2939; + margin: 0; + flex-shrink: 0; +} diff --git a/src/pages/MetersPage/MetersPage.tsx b/src/pages/MetersPage/MetersPage.tsx new file mode 100644 index 0000000..cb337f9 --- /dev/null +++ b/src/pages/MetersPage/MetersPage.tsx @@ -0,0 +1,12 @@ +import { MetersTable } from '@/components/MetersTable'; +import './MetersPage.css'; + +export function MetersPage() { + return ( +
+ Список счётчиков +

Список счётчиков

+ +
+ ); +} diff --git a/src/pages/MetersPage/index.ts b/src/pages/MetersPage/index.ts new file mode 100644 index 0000000..26be90c --- /dev/null +++ b/src/pages/MetersPage/index.ts @@ -0,0 +1 @@ +export { MetersPage } from './MetersPage'; diff --git a/src/router.ts b/src/router.ts new file mode 100644 index 0000000..a8b6787 --- /dev/null +++ b/src/router.ts @@ -0,0 +1,13 @@ +import { createRouter } from '@tanstack/react-router'; +import { rootRoute } from '@/routes/__root'; +import { indexRoute } from '@/routes/index'; + +const routeTree = rootRoute.addChildren([indexRoute]); + +export const router = createRouter({ routeTree }); + +declare module '@tanstack/react-router' { + interface Register { + router: typeof router; + } +} diff --git a/src/routes/__root.tsx b/src/routes/__root.tsx new file mode 100644 index 0000000..3383625 --- /dev/null +++ b/src/routes/__root.tsx @@ -0,0 +1,13 @@ +import { createRootRoute, Outlet, notFound } from '@tanstack/react-router'; + +export const rootRoute = createRootRoute({ + component: () => , + + notFoundComponent: () => ( +
+

404 — Страница не найдена

+
+ ), +}); + +export { notFound }; diff --git a/src/routes/index.tsx b/src/routes/index.tsx new file mode 100644 index 0000000..792345e --- /dev/null +++ b/src/routes/index.tsx @@ -0,0 +1,9 @@ +import { createRoute } from '@tanstack/react-router'; +import { rootRoute } from '@/routes/__root'; +import { MetersPage } from '@/pages/MetersPage'; + +export const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: MetersPage, +}); diff --git a/src/stores/MetersStore.ts b/src/stores/MetersStore.ts new file mode 100644 index 0000000..11c39c9 --- /dev/null +++ b/src/stores/MetersStore.ts @@ -0,0 +1,202 @@ +import { types, flow, cast } from 'mobx-state-tree'; +import type { Instance } from 'mobx-state-tree'; + +const PAGE_SIZE = 20; +const BASE_URL = '/api'; + +interface RawArea { + id: string; + number: number | null; + str_number_full: string | null; + str_number: string | null; + house: { id: string; address: string; fias_addrobjs: string[] } | null; +} + +interface RawMeter { + id: string; + _type: string[]; + area: { id: string }; + is_automatic: boolean | null; + description: string | null; + installation_date: string | null; + initial_values: number[]; + serial_number: string; + model_name: string | null; + brand_name: string | null; + communication: string; +} + +interface PagedResponse { + count: number; + next: string | null; + previous: string | null; + results: T[]; +} + +const HouseModel = types.model('House', { + id: types.string, + address: types.string, + fias_addrobjs: types.array(types.string), +}); + +const AreaModel = types.model('Area', { + id: types.identifier, + number: types.maybeNull(types.number), + str_number_full: types.maybeNull(types.string), + str_number: types.maybeNull(types.string), + house: types.maybeNull(HouseModel), +}); + +const MeterAreaRefModel = types.model('MeterAreaRef', { + id: types.string, +}); + +const MeterModel = types + .model('Meter', { + id: types.identifier, + _type: types.array(types.string), + area: MeterAreaRefModel, + is_automatic: types.maybeNull(types.boolean), + description: types.maybeNull(types.string), + installation_date: types.maybeNull(types.string), + initial_values: types.array(types.number), + serial_number: types.string, + model_name: types.maybeNull(types.string), + brand_name: types.maybeNull(types.string), + communication: types.string, + }) + .views((self) => ({ + get meterType(): string { + if (self._type.includes('ColdWaterAreaMeter')) return 'ХВС'; + if (self._type.includes('HotWaterAreaMeter')) return 'ГВС'; + if (self._type.includes('ElectricityDailyAreaMeter')) return 'ЭЛДТ'; + if (self._type.includes('ThermalEnergyAreaMeter')) return 'ТПЛ'; + return self._type[0] ?? '—'; + }, + + get formattedDate(): string { + if (!self.installation_date) return '—'; + const d = new Date(self.installation_date); + return d.toLocaleDateString('ru-RU', { + day: '2-digit', + month: '2-digit', + year: 'numeric', + }); + }, + + get currentReading(): string { + if (!self.initial_values.length) return '—'; + return self.initial_values + .map((v) => v.toLocaleString('ru-RU')) + .join(', '); + }, + })); + +const MetersStoreModel = types + .model('MetersStore', { + meters: types.array(MeterModel), + areas: types.map(AreaModel), + totalCount: types.optional(types.number, 0), + currentPage: types.optional(types.number, 1), + isLoading: types.optional(types.boolean, false), + deletingId: types.maybeNull(types.string), + error: types.maybeNull(types.string), + }) + .views((self) => ({ + get pageCount(): number { + return Math.max(1, Math.ceil(self.totalCount / PAGE_SIZE)); + }, + + getAreaAddress(areaId: string): string { + const area = self.areas.get(areaId); + if (!area) return '—'; + const house = area.house?.address ?? ''; + const apt = area.str_number_full ? `, ${area.str_number_full}` : ''; + return `${house}${apt}`; + }, + })) + .actions((self) => { + const fetchAreas = flow(function* (areaIds: string[]) { + const unknownIds = [...new Set(areaIds)].filter( + (id) => !self.areas.has(id) + ); + if (!unknownIds.length) return; + + const params = new URLSearchParams(); + unknownIds.forEach((id) => params.append('id__in', id)); + + const response: Response = yield fetch(`${BASE_URL}/areas/?${params}`); + if (!response.ok) + throw new Error(`Ошибка загрузки адресов: ${response.status}`); + + const data: PagedResponse = yield response.json(); + data.results.forEach((area) => + self.areas.set(area.id, area as Parameters[1]) + ); + }); + + const fetchPage = flow(function* (page: number) { + self.isLoading = true; + self.error = null; + try { + const offset = (page - 1) * PAGE_SIZE; + const params = new URLSearchParams({ + limit: String(PAGE_SIZE), + offset: String(offset), + }); + + const response: Response = yield fetch(`${BASE_URL}/meters/?${params}`); + if (!response.ok) + throw new Error(`Ошибка загрузки счётчиков: ${response.status}`); + + const data: PagedResponse = yield response.json(); + self.meters = cast(data.results); + self.totalCount = data.count; + self.currentPage = page; + + yield fetchAreas(data.results.map((m) => m.area.id)); + } catch (err) { + self.error = err instanceof Error ? err.message : 'Неизвестная ошибка'; + } finally { + self.isLoading = false; + } + }); + + const deleteMeter = flow(function* (meterId: string) { + self.deletingId = meterId; + try { + const response: Response = yield fetch( + `${BASE_URL}/meters/${meterId}/`, + { + method: 'DELETE', + } + ); + + if (!response.ok) { + throw new Error(`Ошибка удаления: ${response.status}`); + } + + const newTotal = self.totalCount - 1; + const targetPage = + self.currentPage > Math.ceil(newTotal / PAGE_SIZE) + ? Math.max(1, self.currentPage - 1) + : self.currentPage; + + yield fetchPage(targetPage); + } catch (err) { + self.error = err instanceof Error ? err.message : 'Ошибка удаления'; + } finally { + self.deletingId = null; + } + }); + + const setPage = (page: number) => { + void fetchPage(page); + }; + + return { fetchPage, deleteMeter, setPage }; + }); + +export type MetersStoreType = Instance; + +export const metersStore = MetersStoreModel.create({}); diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 0000000..b1f45c7 --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/tsconfig.app.json b/tsconfig.app.json index af516fc..221caff 100644 --- a/tsconfig.app.json +++ b/tsconfig.app.json @@ -22,7 +22,13 @@ "noUnusedParameters": true, "erasableSyntaxOnly": true, "noFallthroughCasesInSwitch": true, - "noUncheckedSideEffectImports": true + "noUncheckedSideEffectImports": true, + + /* Absolute imports */ + "baseUrl": ".", + "paths": { + "@/*": ["src/*"] + } }, "include": ["src"] } diff --git a/vite.config.ts b/vite.config.ts index 8b0f57b..1a17f41 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,7 +1,22 @@ -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react' +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; +import svgr from 'vite-plugin-svgr'; +import { resolve } from 'node:path'; -// https://vite.dev/config/ export default defineConfig({ - plugins: [react()], -}) + plugins: [react(), svgr()], + resolve: { + alias: { + '@': resolve(__dirname, 'src'), + }, + }, + server: { + proxy: { + '/api': { + target: 'https://showroom.eis24.me', + changeOrigin: true, + rewrite: (path) => path.replace(/^\/api/, '/c300/api/v4/test'), + }, + }, + }, +}); From 6e72ae8f88c94db91d868bca0793056faddb7484 Mon Sep 17 00:00:00 2001 From: avasilyevartyem Date: Tue, 31 Mar 2026 12:52:15 +0300 Subject: [PATCH 2/4] [EIS-1] add vitest for tests, add Pipeline CI/CD with lint, build, tests --- .github/workflows/ci.yml | 30 ++ package-lock.json | 353 +++++++++++++++++- package.json | 4 +- .../MetersTable/Pagination/buildPages.test.ts | 72 ++++ .../MetersTable/Pagination/buildPages.ts | 2 +- .../MetersTable/icons/MeterTypeIcon.tsx | 17 +- vite.config.ts | 5 +- 7 files changed, 474 insertions(+), 9 deletions(-) create mode 100644 .github/workflows/ci.yml create mode 100644 src/components/MetersTable/Pagination/buildPages.test.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..891932d --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,30 @@ +name: CI + +on: + push: + +jobs: + ci: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + + - name: Install dependencies + run: npm ci + + - name: Lint + run: npm run lint + + - name: Build + run: npm run build + + - name: Test + run: npm test -- --run diff --git a/package-lock.json b/package-lock.json index 921118c..4c347b0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,7 +31,8 @@ "typescript": "~5.9.3", "typescript-eslint": "^8.57.0", "vite": "^8.0.1", - "vite-plugin-svgr": "^5.0.0" + "vite-plugin-svgr": "^5.0.0", + "vitest": "^4.1.2" } }, "node_modules/@babel/code-frame": { @@ -902,6 +903,13 @@ } } }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, "node_modules/@svgr/babel-plugin-add-jsx-attribute": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", @@ -1224,6 +1232,24 @@ "tslib": "^2.4.0" } }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -1589,6 +1615,129 @@ } } }, + "node_modules/@vitest/expect": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.2.tgz", + "integrity": "sha512-gbu+7B0YgUJ2nkdsRJrFFW6X7NTP44WlhiclHniUhxADQJH5Szt9mZ9hWnJPJ8YwOK5zUOSSlSvyzRf0u1DSBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.1.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.1.2", + "@vitest/utils": "4.1.2", + "chai": "^6.2.2", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.2.tgz", + "integrity": "sha512-Ize4iQtEALHDttPRCmN+FKqOl2vxTiNUhzobQFFt/BM1lRUTG7zRCLOykG/6Vo4E4hnUdfVLo5/eqKPukcWW7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.1.2", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/mocker/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/@vitest/pretty-format": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.2.tgz", + "integrity": "sha512-dwQga8aejqeuB+TvXCMzSQemvV9hNEtDDpgUKDzOmNQayl2OG241PSWeJwKRH3CiC+sESrmoFd49rfnq7T4RnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.2.tgz", + "integrity": "sha512-Gr+FQan34CdiYAwpGJmQG8PgkyFVmARK8/xSijia3eTFgVfpcpztWLuP6FttGNfPLJhaZVP/euvujeNYar36OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.1.2", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.2.tgz", + "integrity": "sha512-g7yfUmxYS4mNxk31qbOYsSt2F4m1E02LFqO53Xpzg3zKMhLAPZAjjfyl9e6z7HrW6LvUdTwAQR3HHfLjpko16A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.2", + "@vitest/utils": "4.1.2", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.2.tgz", + "integrity": "sha512-DU4fBnbVCJGNBwVA6xSToNXrkZNSiw59H8tcuUspVMsBDBST4nfvsPsEHDHGtWRRnqBERBQu7TrTKskmjqTXKA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.2.tgz", + "integrity": "sha512-xw2/TiX82lQHA06cgbqRKFb5lCAy3axQ4H4SoUFhUsg+wztiet+co86IAMDtF6Vm1hc7J6j09oh/rgDn+JdKIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.2", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, "node_modules/acorn": { "version": "8.16.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", @@ -1681,6 +1830,16 @@ "dev": true, "license": "Python-2.0" }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -1790,6 +1949,16 @@ ], "license": "CC-BY-4.0" }, + "node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -2042,6 +2211,13 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/es-module-lexer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", + "dev": true, + "license": "MIT" + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -2263,6 +2439,16 @@ "dev": true, "license": "MIT" }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -3072,6 +3258,16 @@ "yallist": "^3.0.2" } }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, "node_modules/mimic-function": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", @@ -3196,6 +3392,17 @@ "dev": true, "license": "MIT" }, + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, "node_modules/onetime": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", @@ -3324,6 +3531,13 @@ "node": ">=8" } }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -3565,6 +3779,13 @@ "node": ">=8" } }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, "node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", @@ -3629,6 +3850,20 @@ "node": ">=0.10.0" } }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.0.0.tgz", + "integrity": "sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==", + "dev": true, + "license": "MIT" + }, "node_modules/string-argv": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", @@ -3705,6 +3940,13 @@ "dev": true, "license": "MIT" }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, "node_modules/tinyexec": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.4.tgz", @@ -3732,6 +3974,16 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/tinyrainbow": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/ts-api-utils": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", @@ -3967,6 +4219,88 @@ "vite": ">=3.0.0" } }, + "node_modules/vitest": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.2.tgz", + "integrity": "sha512-xjR1dMTVHlFLh98JE3i/f/WePqJsah4A0FK9cc8Ehp9Udk0AZk6ccpIZhh1qJ/yxVWRZ+Q54ocnD8TXmkhspGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.1.2", + "@vitest/mocker": "4.1.2", + "@vitest/pretty-format": "4.1.2", + "@vitest/runner": "4.1.2", + "@vitest/snapshot": "4.1.2", + "@vitest/spy": "4.1.2", + "@vitest/utils": "4.1.2", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.1.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.2", + "@vitest/browser-preview": "4.1.2", + "@vitest/browser-webdriverio": "4.1.2", + "@vitest/ui": "4.1.2", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false + } + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -3983,6 +4317,23 @@ "node": ">= 8" } }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", diff --git a/package.json b/package.json index 03228ab..1ee6d87 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "build": "tsc -b && vite build", "lint": "eslint .", "preview": "vite preview", + "test": "vitest", "format": "prettier --write .", "prepare": "husky" }, @@ -44,6 +45,7 @@ "typescript": "~5.9.3", "typescript-eslint": "^8.57.0", "vite": "^8.0.1", - "vite-plugin-svgr": "^5.0.0" + "vite-plugin-svgr": "^5.0.0", + "vitest": "^4.1.2" } } diff --git a/src/components/MetersTable/Pagination/buildPages.test.ts b/src/components/MetersTable/Pagination/buildPages.test.ts new file mode 100644 index 0000000..3683d28 --- /dev/null +++ b/src/components/MetersTable/Pagination/buildPages.test.ts @@ -0,0 +1,72 @@ +import { describe, it, expect } from 'vitest'; +import { buildPages, range } from './buildPages'; +import type { Gap } from './buildPages'; + +const gap = (pages: number[]): Gap => ({ type: 'gap', pages }); + +describe('buildPages', () => { + describe('edge cases', () => { + it('returns [] when total is 0', () => { + expect(buildPages(1, 0)).toEqual([]); + }); + + it('returns [] when total is 1', () => { + expect(buildPages(1, 1)).toEqual([]); + }); + + it('returns all pages when total is small enough to fit without gaps', () => { + expect(buildPages(3, 5)).toEqual([1, 2, 3, 4, 5]); + }); + }); + + describe('range', () => { + it('returns a single-element array when from equals to', () => { + expect(range(3, 3)).toEqual([3]); + }); + + it('returns consecutive numbers from start to end inclusive', () => { + expect(range(1, 5)).toEqual([1, 2, 3, 4, 5]); + }); + + it('works with arbitrary start value', () => { + expect(range(7, 10)).toEqual([7, 8, 9, 10]); + }); + }); + + describe('gaps', () => { + it('inserts a right gap when current page is near the start', () => { + const result = buildPages(2, 10); + expect(result).toEqual([1, 2, 3, 4, gap([5, 6, 7, 8, 9]), 10]); + }); + + it('inserts a left gap when current page is near the end', () => { + const result = buildPages(9, 10); + expect(result).toEqual([1, gap([2, 3, 4, 5, 6]), 7, 8, 9, 10]); + }); + + it('inserts gaps on both sides when current page is in the middle', () => { + const result = buildPages(7, 20); + expect(result).toEqual([ + 1, + gap([2, 3, 4]), + 5, + 6, + 7, + 8, + 9, + gap([10, 11, 12, 13, 14, 15, 16, 17, 18, 19]), + 20, + ]); + }); + + it('does not insert a gap when window touches the first page', () => { + const result = buildPages(3, 10); + expect(result).toEqual([1, 2, 3, 4, 5, gap([6, 7, 8, 9]), 10]); + }); + + it('does not insert a gap when window touches the last page', () => { + const result = buildPages(8, 10); + expect(result).toEqual([1, gap([2, 3, 4, 5]), 6, 7, 8, 9, 10]); + }); + }); +}); diff --git a/src/components/MetersTable/Pagination/buildPages.ts b/src/components/MetersTable/Pagination/buildPages.ts index 4caf6fd..9d85fe0 100644 --- a/src/components/MetersTable/Pagination/buildPages.ts +++ b/src/components/MetersTable/Pagination/buildPages.ts @@ -1,7 +1,7 @@ export type Gap = { type: 'gap'; pages: number[] }; export type PageItem = number | Gap; -const range = (from: number, to: number): number[] => +export const range = (from: number, to: number): number[] => Array.from({ length: to - from + 1 }, (_, i) => from + i); export function buildPages(current: number, total: number): PageItem[] { diff --git a/src/components/MetersTable/icons/MeterTypeIcon.tsx b/src/components/MetersTable/icons/MeterTypeIcon.tsx index 073bd7d..6dfca88 100644 --- a/src/components/MetersTable/icons/MeterTypeIcon.tsx +++ b/src/components/MetersTable/icons/MeterTypeIcon.tsx @@ -8,9 +8,16 @@ interface MeterTypeIconProps { } export function MeterTypeIcon({ type }: MeterTypeIconProps) { - if (type === 'ХВС') return ; - if (type === 'ГВС') return ; - if (type === 'ЭЛДТ') return ; - if (type === 'ТПЛ') return ; - return null; + switch (type) { + case 'ХВС': + return ; + case 'ГВС': + return ; + case 'ЭЛДТ': + return ; + case 'ТПЛ': + return ; + default: + return null; + } } diff --git a/vite.config.ts b/vite.config.ts index 1a17f41..ac7a4a1 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,4 +1,4 @@ -import { defineConfig } from 'vite'; +import { defineConfig } from 'vitest/config'; import react from '@vitejs/plugin-react'; import svgr from 'vite-plugin-svgr'; import { resolve } from 'node:path'; @@ -10,6 +10,9 @@ export default defineConfig({ '@': resolve(__dirname, 'src'), }, }, + test: { + globals: true, + }, server: { proxy: { '/api': { From 1523965fded0166f72259797dfb251d4860413c0 Mon Sep 17 00:00:00 2001 From: avasilyevartyem Date: Tue, 31 Mar 2026 13:29:45 +0300 Subject: [PATCH 3/4] [EIS-1][F] update README.md --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4e6268d..2dc1ffa 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ printWidth: 80 ## Для запуска проекта используйте следующие команды ``` -git clone https://github.com/southatelove/interview-eis.git +git clone https://github.com/avasilyevartyem/interview-eis.git ``` ``` @@ -67,6 +67,10 @@ npm run dev - **TypeScript** - **React** - **Mobx-state-tree** +- **Tanstack** +- **Husky** +- **Github Actions** +- **Vitest** - **Vite** ## Итог From 0a130a043c1810227b22ddae49cae364812ea04f Mon Sep 17 00:00:00 2001 From: avasilyevartyem Date: Tue, 31 Mar 2026 13:33:08 +0300 Subject: [PATCH 4/4] [EIS-1][F] fix router --- src/routes/__root.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/routes/__root.tsx b/src/routes/__root.tsx index 3383625..b14f4d7 100644 --- a/src/routes/__root.tsx +++ b/src/routes/__root.tsx @@ -1,4 +1,4 @@ -import { createRootRoute, Outlet, notFound } from '@tanstack/react-router'; +import { createRootRoute, Outlet } from '@tanstack/react-router'; export const rootRoute = createRootRoute({ component: () => , @@ -9,5 +9,3 @@ export const rootRoute = createRootRoute({ ), }); - -export { notFound };
- -
- -

Connect with us

-

Join the Vite community

- -
-