diff --git a/.env b/.env.development similarity index 100% rename from .env rename to .env.development diff --git a/.env.docker b/.env.docker new file mode 100644 index 0000000..e82c617 --- /dev/null +++ b/.env.docker @@ -0,0 +1 @@ +VITE_API_URL=/api diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 29ee2c4..c0f58f6 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -18,6 +18,8 @@ services: environment: - NODE_ENV=development - CHOKIDAR_USEPOLLING=true + env_file: + - .env.docker networks: - lawn-scheduler-dev-network diff --git a/package-lock.json b/package-lock.json index f746c89..4b8504d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,18 +1,18 @@ { "name": "lawn-mowing-scheduler", - "version": "0.0.0", + "version": "0.2.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "lawn-mowing-scheduler", - "version": "0.0.0", + "version": "0.2.5", "dependencies": { "@libsql/client": "^0.4.0", "cors": "^2.8.5", "express": "^4.18.2", "lucide-react": "^0.344.0", - "multer": "^1.4.5-lts.1", + "multer": "^2.0.1", "react": "^18.3.1", "react-dom": "^18.3.1", "react-router-dom": "^6.26.0" @@ -2329,17 +2329,17 @@ "dev": true }, "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", "engines": [ - "node >= 0.8" + "node >= 6.0" ], "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", - "readable-stream": "^2.2.2", + "readable-stream": "^3.0.2", "typedarray": "^0.0.6" } }, @@ -2505,12 +2505,6 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "license": "MIT" }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" - }, "node_modules/cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", @@ -3725,12 +3719,6 @@ "node": ">=0.12.0" } }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -4100,22 +4088,21 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/multer": { - "version": "1.4.5-lts.2", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.2.tgz", - "integrity": "sha512-VzGiVigcG9zUAoCNU+xShztrlr1auZOlurXynNvO9GiWD1/mTBbUljOKY+qMeazBqXgRnjzeEgJI/wyjJUHg9A==", - "deprecated": "Multer 1.x is impacted by a number of vulnerabilities, which have been patched in 2.x. You should upgrade to the latest 2.x version.", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.1.tgz", + "integrity": "sha512-Ug8bXeTIUlxurg8xLTEskKShvcKDZALo1THEX5E41pYCD2sCVub5/kIRIGqWNoqV6szyLyQKV6mD4QUrWE5GCQ==", "license": "MIT", "dependencies": { "append-field": "^1.0.0", - "busboy": "^1.0.0", - "concat-stream": "^1.5.2", - "mkdirp": "^0.5.4", + "busboy": "^1.6.0", + "concat-stream": "^2.0.0", + "mkdirp": "^0.5.6", "object-assign": "^4.1.1", - "type-is": "^1.6.4", - "xtend": "^4.0.0" + "type-is": "^1.6.18", + "xtend": "^4.0.2" }, "engines": { - "node": ">= 6.0.0" + "node": ">= 10.16.0" } }, "node_modules/mz": { @@ -4621,12 +4608,6 @@ "node": ">= 0.8.0" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" - }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -4789,26 +4770,19 @@ } }, "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -5224,20 +5198,14 @@ } }, "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "license": "MIT", "dependencies": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.2.0" } }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, "node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", diff --git a/package.json b/package.json index daeee91..f7fe8f1 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "lawn-mowing-scheduler", "private": true, - "version": "0.2.5", + "version": "0.3.0", "type": "module", "scripts": { "dev": "concurrently \"npm run server\" \"npm run client\"", @@ -16,7 +16,7 @@ "cors": "^2.8.5", "express": "^4.18.2", "lucide-react": "^0.344.0", - "multer": "^1.4.5-lts.1", + "multer": "^2.0.1", "react": "^18.3.1", "react-dom": "^18.3.1", "react-router-dom": "^6.26.0" diff --git a/src/components/BulkMowingModal.tsx b/src/components/BulkMowingModal.tsx index bfba797..9e401fb 100644 --- a/src/components/BulkMowingModal.tsx +++ b/src/components/BulkMowingModal.tsx @@ -169,7 +169,7 @@ const BulkMowingModal: React.FC = ({ {/* Zone Selection */}
{zones.map(zone => ( @@ -320,7 +320,7 @@ const BulkMowingModal: React.FC = ({

- {activityType === 'trimming' ? 'Trimming' : 'Mowing'} Time Distribution Preview + {activityType === 'trimming' ? 'Подравнивание' : 'Покос'} Time Distribution Preview

{timeDistribution.map(({ zone, proportion, allocatedTime }) => ( diff --git a/src/components/Dashboard.tsx b/src/components/Dashboard.tsx index 54a5a20..d31f141 100644 --- a/src/components/Dashboard.tsx +++ b/src/components/Dashboard.tsx @@ -1,5 +1,5 @@ import React, { useState, useEffect } from 'react'; -import { Plus, Filter, Calendar, Scissors, AlertTriangle, Square, CheckCircle, Clock, Map, History, Zap } from './Icons'; +import { Plus, Filter, Calendar, Scissors, AlertTriangle, Square, CheckCircle, Clock, Map, History } from './Icons'; import { Zone, MowingFormData, BulkMowingFormData } from '../types/zone'; import { api } from '../services/api'; import ZoneCard from './ZoneCard'; @@ -176,10 +176,6 @@ const Dashboard: React.FC = () => { .filter(zone => zone.status === 'ok') .reduce((sum, zone) => sum + zone.area, 0); - const remainingArea = zones - .filter(zone => zone.status === 'due' || zone.status === 'overdue' || zone.status === 'new') - .reduce((sum, zone) => sum + zone.area, 0); - const mowedPercentage = totalArea > 0 ? (mowedArea / totalArea) * 100 : 0; // Check if there are zones that need mowing for bulk action @@ -245,30 +241,6 @@ const Dashboard: React.FC = () => { История
- - {/* Bulk Mowing Button */} - {view === 'dashboard' && zonesNeedingMowing.length > 0 && ( -
-{/* - -*/} - - -
- )} -
- +
+ + +
)} diff --git a/src/components/HistoryView.tsx b/src/components/HistoryView.tsx index ce20d60..03d91c4 100644 --- a/src/components/HistoryView.tsx +++ b/src/components/HistoryView.tsx @@ -123,7 +123,7 @@ const HistoryView: React.FC = ({ zones }) => { }; const getActivityLabel = (activityType?: string) => { - return activityType === 'trimming' ? 'Trimming' : 'Mowing'; + return activityType === 'trimming' ? 'Подравнивание' : 'Покос'; }; // Group history entries by session @@ -365,7 +365,7 @@ const HistoryView: React.FC = ({ zones }) => { )}

- Массовая {getActivityLabel(session.entries[0]?.activityType)} сессия + Массовая сессия - {getActivityLabel(session.entries[0]?.activityType)}