diff --git a/.gitignore b/.gitignore index 01b664dc9..81038519e 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,7 @@ .pnp.js # testing -/coverage +coverage/ # production /build diff --git a/package-lock.json b/package-lock.json index 643ee1ab0..525ce2bc7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "rmg", - "version": "5.20.11", + "version": "5.21.0-0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "rmg", - "version": "5.20.11", + "version": "5.21.0-0", "license": "GPL-3.0-only", "dependencies": { "@chakra-ui/react": "2.10.9", @@ -31,7 +31,6 @@ "react-router-dom": "^7.9.6" }, "devDependencies": { - "@eslint/eslintrc": "^3.3.1", "@eslint/js": "^9.39.1", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.0", @@ -42,6 +41,7 @@ "@types/react-router-dom": "^5.3.3", "@vitejs/plugin-legacy": "^7.2.1", "@vitejs/plugin-react": "^5.1.1", + "@vitest/coverage-v8": "^4.0.10", "eslint": "^9.39.1", "eslint-plugin-prettier": "^5.5.4", "eslint-plugin-react": "^7.37.5", @@ -1685,6 +1685,16 @@ "node": ">=6.9.0" } }, + "node_modules/@bcoe/v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", + "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/@chakra-ui/anatomy": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/@chakra-ui/anatomy/-/anatomy-2.3.6.tgz", @@ -3840,6 +3850,38 @@ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, + "node_modules/@vitest/coverage-v8": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.0.10.tgz", + "integrity": "sha512-g+brmtoKa/sAeIohNJnnWhnHtU6GuqqVOSQ4SxDIPcgZWZyhJs5RmF5LpqXs8Kq64lANP+vnbn5JLzhLj/G56g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^1.0.2", + "@vitest/utils": "4.0.10", + "ast-v8-to-istanbul": "^0.3.8", + "debug": "^4.4.3", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^5.0.6", + "istanbul-reports": "^3.2.0", + "magicast": "^0.5.1", + "std-env": "^3.10.0", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@vitest/browser": "4.0.10", + "vitest": "4.0.10" + }, + "peerDependenciesMeta": { + "@vitest/browser": { + "optional": true + } + } + }, "node_modules/@vitest/expect": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.10.tgz", @@ -4227,6 +4269,25 @@ "node": ">=12" } }, + "node_modules/ast-v8-to-istanbul": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.8.tgz", + "integrity": "sha512-szgSZqUxI5T8mLKvS7WTjF9is+MVbOeLADU73IseOcrqhxr/VAvy6wfoVE39KnKzA7JRhjF5eUagNlHwvZPlKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.31", + "estree-walker": "^3.0.3", + "js-tokens": "^9.0.1" + } + }, + "node_modules/ast-v8-to-istanbul/node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, + "license": "MIT" + }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -5873,6 +5934,13 @@ "node": ">=18" } }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, "node_modules/html-parse-stringify": { "version": "3.0.1", "license": "MIT", @@ -6431,6 +6499,60 @@ "dev": true, "license": "ISC" }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/iterator.prototype": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", @@ -6686,6 +6808,47 @@ "@jridgewell/sourcemap-codec": "^1.5.5" } }, + "node_modules/magicast": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.1.tgz", + "integrity": "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "source-map-js": "^1.2.1" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -8827,6 +8990,7 @@ "integrity": "sha512-2Fqty3MM9CDwOVet/jaQalYlbcjATZwPYGcqpiYQqgQ/dLC7GuHdISKgTYIVF/kaishKxLzleKWWfbSDklyIKg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vitest/expect": "4.0.10", "@vitest/mocker": "4.0.10", @@ -10195,6 +10359,12 @@ "@babel/helper-validator-identifier": "^7.28.5" } }, + "@bcoe/v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", + "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", + "dev": true + }, "@chakra-ui/anatomy": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/@chakra-ui/anatomy/-/anatomy-2.3.6.tgz", @@ -11449,6 +11619,25 @@ "react-refresh": "^0.18.0" } }, + "@vitest/coverage-v8": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.0.10.tgz", + "integrity": "sha512-g+brmtoKa/sAeIohNJnnWhnHtU6GuqqVOSQ4SxDIPcgZWZyhJs5RmF5LpqXs8Kq64lANP+vnbn5JLzhLj/G56g==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^1.0.2", + "@vitest/utils": "4.0.10", + "ast-v8-to-istanbul": "^0.3.8", + "debug": "^4.4.3", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^5.0.6", + "istanbul-reports": "^3.2.0", + "magicast": "^0.5.1", + "std-env": "^3.10.0", + "tinyrainbow": "^3.0.3" + } + }, "@vitest/expect": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.10.tgz", @@ -11713,6 +11902,25 @@ "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true }, + "ast-v8-to-istanbul": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.8.tgz", + "integrity": "sha512-szgSZqUxI5T8mLKvS7WTjF9is+MVbOeLADU73IseOcrqhxr/VAvy6wfoVE39KnKzA7JRhjF5eUagNlHwvZPlKQ==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.31", + "estree-walker": "^3.0.3", + "js-tokens": "^9.0.1" + }, + "dependencies": { + "js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true + } + } + }, "available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -12816,6 +13024,12 @@ "whatwg-encoding": "^3.1.1" } }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, "html-parse-stringify": { "version": "3.0.1", "requires": { @@ -13146,6 +13360,44 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true + }, + "istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + } + }, + "istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" + } + }, + "istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, "iterator.prototype": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", @@ -13334,6 +13586,34 @@ "@jridgewell/sourcemap-codec": "^1.5.5" } }, + "magicast": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.1.tgz", + "integrity": "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==", + "dev": true, + "requires": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "source-map-js": "^1.2.1" + } + }, + "make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "requires": { + "semver": "^7.5.3" + }, + "dependencies": { + "semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true + } + } + }, "math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -14669,6 +14949,7 @@ "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.10.tgz", "integrity": "sha512-2Fqty3MM9CDwOVet/jaQalYlbcjATZwPYGcqpiYQqgQ/dLC7GuHdISKgTYIVF/kaishKxLzleKWWfbSDklyIKg==", "dev": true, + "peer": true, "requires": { "@vitest/expect": "4.0.10", "@vitest/mocker": "4.0.10", diff --git a/package.json b/package.json index 295dec66a..2e4c76d52 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,6 @@ "react-router-dom": "^7.9.6" }, "devDependencies": { - "@eslint/eslintrc": "^3.3.1", "@eslint/js": "^9.39.1", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.0", @@ -40,6 +39,7 @@ "@types/react-router-dom": "^5.3.3", "@vitejs/plugin-legacy": "^7.2.1", "@vitejs/plugin-react": "^5.1.1", + "@vitest/coverage-v8": "^4.0.10", "eslint": "^9.39.1", "eslint-plugin-prettier": "^5.5.4", "eslint-plugin-react": "^7.37.5", @@ -54,10 +54,10 @@ "scripts": { "dev": "vite --host", "build": "tsc && vite build", - "test": "vitest", + "test": "vitest run --coverage", "lint": "eslint ./src", "lint:fix": "eslint ./src --fix", "preview": "vite preview" }, - "version": "5.20.11" + "version": "5.21.0-0" } diff --git a/src/components/side-panel/style-side-panel/design-section.tsx b/src/components/side-panel/style-side-panel/design-section.tsx index 0d04bca9a..94e1eb15e 100644 --- a/src/components/side-panel/style-side-panel/design-section.tsx +++ b/src/components/side-panel/style-side-panel/design-section.tsx @@ -11,13 +11,14 @@ import { setLineNum, setPanelType, setPlatform, + setPsdLabel, setPsdNum, setSpanLineNum, setTheme, staggerStationNames, toggleLineNameBeforeDestination, } from '../../../redux/param/param-slice'; -import { PanelTypeGZMTR, PanelTypeShmetro, RmgStyle, ShortDirection } from '../../../constants/constants'; +import { PanelTypeGZMTR, PanelTypeShmetro, PsdLabel, RmgStyle, ShortDirection } from '../../../constants/constants'; import { MdSwapVert } from 'react-icons/md'; import { RmgButtonGroup, RmgFields, RmgFieldsField } from '@railmapgen/rmg-components'; import { useTranslation } from 'react-i18next'; @@ -37,6 +38,7 @@ export default function DesignSection() { direction, platform_num: platformNum, psd_num: psdNum, + psdLabel, coachNum, namePosMTR, customiseMTRDest, @@ -149,6 +151,22 @@ export default function DesignSection() { onChange: value => dispatch(setPsdNum(value)), hidden: ![RmgStyle.GZMTR].includes(style), }, + { + type: 'custom', + label: t('Platform door label'), + component: ( + dispatch(setPsdLabel(label))} + /> + ), + hidden: ![RmgStyle.GZMTR].includes(style), + minW: 260, + }, { type: 'input', label: t('Coach number'), diff --git a/src/constants/constants.ts b/src/constants/constants.ts index e038d7027..ef2e2b56c 100644 --- a/src/constants/constants.ts +++ b/src/constants/constants.ts @@ -52,6 +52,11 @@ export enum ShortDirection { right = 'r', } +export enum PsdLabel { + screen = 'screen', + platform = 'platform', +} + export enum BranchStyle { through = 'through', nonThrough = 'nonthrough', @@ -252,6 +257,7 @@ export interface RMGParam { line_num: string; spanLineNum?: boolean; psd_num: string; + psdLabel: PsdLabel; coachNum: string; info_panel_type: PanelTypeGZMTR | PanelTypeShmetro; notesGZMTR?: Note[]; diff --git a/src/i18n/translations/zh-Hans.json b/src/i18n/translations/zh-Hans.json index b7f930b10..2941d351c 100644 --- a/src/i18n/translations/zh-Hans.json +++ b/src/i18n/translations/zh-Hans.json @@ -275,6 +275,7 @@ "Open selected": "打开选中项目", "Open template": "打开模板", "Paid area": "付费区换乘", + "Platform door label": "站台门标签", "Project": "项目", "Project selected is invalid or corrupted.": "选中的项目无效或已损坏。", "Project Selector": "项目选择器", diff --git a/src/i18n/translations/zh-Hant.json b/src/i18n/translations/zh-Hant.json index 6bd308d59..45d68f690 100644 --- a/src/i18n/translations/zh-Hant.json +++ b/src/i18n/translations/zh-Hant.json @@ -267,6 +267,7 @@ "Open selected": "開啟所選專案", "Open template": "開啟範本", "Paid area": "付費區轉車", + "Platform door label": "幕門標籤", "Project": "專案", "Project selected is invalid or corrupted.": "所選專案無效或者已損壞。", "Project Selector": "專案選擇器", diff --git a/src/redux/param/param-slice.ts b/src/redux/param/param-slice.ts index 452ee65cc..9c97d848b 100644 --- a/src/redux/param/param-slice.ts +++ b/src/redux/param/param-slice.ts @@ -5,6 +5,7 @@ import { Note, PanelTypeGZMTR, PanelTypeShmetro, + PsdLabel, RMGParam, RmgStyle, ShortDirection, @@ -84,6 +85,10 @@ const paramSlice = createSlice({ state.psd_num = action.payload; }, + setPsdLabel: (state, action: PayloadAction) => { + state.psdLabel = action.payload; + }, + setCoachNum: (state, action: PayloadAction) => { state.coachNum = action.payload; }, @@ -190,6 +195,7 @@ export const { setLineNum, setSpanLineNum, setPsdNum, + setPsdLabel, setCoachNum, setPanelType, addNote, diff --git a/src/redux/param/util.ts b/src/redux/param/util.ts index 8abc5637f..26648c472 100644 --- a/src/redux/param/util.ts +++ b/src/redux/param/util.ts @@ -2,6 +2,7 @@ import { Name, PanelTypeGZMTR, PanelTypeShmetro, + PsdLabel, RMGParam, RmgStyle, Services, @@ -115,6 +116,7 @@ export const initParam = (style: RmgStyle, language: LanguageCode): RMGParam => line_num: '1', spanLineNum: true, psd_num: '1', + psdLabel: PsdLabel.platform, coachNum: '1', info_panel_type: style === RmgStyle.SHMetro ? PanelTypeShmetro.sh : PanelTypeGZMTR.gz1, direction_gz_x: 40, diff --git a/src/svgs/gzmtr/psd-number.tsx b/src/svgs/gzmtr/psd-number.tsx index e2066f1e7..076a75d32 100644 --- a/src/svgs/gzmtr/psd-number.tsx +++ b/src/svgs/gzmtr/psd-number.tsx @@ -1,14 +1,15 @@ import { MonoColour } from '@railmapgen/rmg-palette-resources'; import { SVGProps } from 'react'; +import { PsdLabel } from '../../constants/constants'; interface PsdNumberProps extends SVGProps { num: string; + psdLabel: PsdLabel; inStrip?: boolean; - showAsPlatformDoor?: boolean; } export default function PsdNumber(props: PsdNumberProps) { - const { num, inStrip, showAsPlatformDoor, ...others } = props; + const { num, psdLabel, inStrip, ...others } = props; return ( @@ -16,7 +17,7 @@ export default function PsdNumber(props: PsdNumberProps) { {num} - {showAsPlatformDoor ? ( + {psdLabel === PsdLabel.platform ? ( <> 站台门 diff --git a/src/svgs/gzmtr/rail-map/railmap-gzmtr.tsx b/src/svgs/gzmtr/rail-map/railmap-gzmtr.tsx index e6a4ed90b..c42ae66c5 100644 --- a/src/svgs/gzmtr/rail-map/railmap-gzmtr.tsx +++ b/src/svgs/gzmtr/rail-map/railmap-gzmtr.tsx @@ -17,6 +17,7 @@ const RailMapGZMTR = () => { svg_height: svgHeight, direction, psd_num: psdNumber, + psdLabel, info_panel_type: infoPanelType, notesGZMTR: notes, current_stn_idx: currentStationIndex, @@ -42,6 +43,7 @@ const RailMapGZMTR = () => { variant={infoPanelType} isShowLight={infoPanelType === PanelTypeGZMTR.gz2otis} isShowPSD={infoPanelType === PanelTypeGZMTR.gz2otis && psdNumber} + psdLabel={psdLabel} /> {!loop && diff --git a/src/svgs/gzmtr/runin/runin-gzmtr.tsx b/src/svgs/gzmtr/runin/runin-gzmtr.tsx index 83019f82c..13b70e381 100644 --- a/src/svgs/gzmtr/runin/runin-gzmtr.tsx +++ b/src/svgs/gzmtr/runin/runin-gzmtr.tsx @@ -19,6 +19,7 @@ export default function RunInGZMTR() { info_panel_type: infoPanelType, platform_num: platformNumber, psd_num: psdNumber, + psdLabel, coachNum, theme, } = useRootSelector(store => store.param); @@ -42,6 +43,7 @@ export default function RunInGZMTR() { variant={infoPanelType} isShowLight={infoPanelType !== PanelTypeGZMTR.gz2otis} isShowPSD={infoPanelType !== PanelTypeGZMTR.gz2otis && psdNumber} + psdLabel={psdLabel} /> diff --git a/src/svgs/gzmtr/strip-gzmtr.tsx b/src/svgs/gzmtr/strip-gzmtr.tsx index 4aa75bbd9..90bd282bc 100644 --- a/src/svgs/gzmtr/strip-gzmtr.tsx +++ b/src/svgs/gzmtr/strip-gzmtr.tsx @@ -1,4 +1,4 @@ -import { PanelTypeGZMTR, PanelTypeShmetro } from '../../constants/constants'; +import { PanelTypeGZMTR, PanelTypeShmetro, PsdLabel } from '../../constants/constants'; import PsdNumber from './psd-number'; import { memo, useMemo } from 'react'; @@ -6,6 +6,7 @@ interface Props { variant: PanelTypeGZMTR | PanelTypeShmetro; isShowLight: boolean; isShowPSD: false | string; + psdLabel: PsdLabel; } const StripGZMTR = (props: Props) => { @@ -132,8 +133,8 @@ const PSD = memo( return ( ); }, - (prevProps, nextProps) => prevProps.variant === nextProps.variant && prevProps.isShowPSD === nextProps.isShowPSD + (prevProps, nextProps) => + prevProps.variant === nextProps.variant && + prevProps.isShowPSD === nextProps.isShowPSD && + prevProps.psdLabel === nextProps.psdLabel ); diff --git a/src/util/param-updater-utils.ts b/src/util/param-updater-utils.ts index bd18280d4..1bbc19ef9 100644 --- a/src/util/param-updater-utils.ts +++ b/src/util/param-updater-utils.ts @@ -1,7 +1,16 @@ import { MonoColour, Theme, updateTheme } from '@railmapgen/rmg-palette-resources'; import rmgRuntime, { logger } from '@railmapgen/rmg-runtime'; import { nanoid } from 'nanoid'; -import { CanvasType, InterchangeGroup, Name, Note, RMGParam, RmgStyle, StationInfo } from '../constants/constants'; +import { + CanvasType, + InterchangeGroup, + Name, + Note, + PsdLabel, + RMGParam, + RmgStyle, + StationInfo, +} from '../constants/constants'; export const updateParam = (param: { [x: string]: any }) => { // Version 0.10 @@ -252,6 +261,7 @@ export const updateParam = (param: { [x: string]: any }) => { v5_10_updateInterchangeGroup(param); v5_17_updateLocalisedName(param); v5_18_addStationNameSpacingAndSvgWidthPlatform(param); + v5_21_addPsdLabel(param); sanitiseParam(param); return param; @@ -312,6 +322,12 @@ export const v5_18_addStationNameSpacingAndSvgWidthPlatform = (param: Record) => { + if (!('psdLabel' in param)) { + param.psdLabel = PsdLabel.screen; + } +}; + interface MatchedThemeWithPaths { path: string; value: Theme; diff --git a/vite.config.mts b/vite.config.mts index 6c5f7fb59..f462d39b6 100644 --- a/vite.config.mts +++ b/vite.config.mts @@ -1,24 +1,23 @@ -/// - import { defineConfig } from 'vite'; import react from '@vitejs/plugin-react'; -import legacy from '@vitejs/plugin-legacy'; +import { coverageConfigDefaults } from 'vitest/config'; // https://vitejs.dev/config export default defineConfig({ base: '/rmg/', - plugins: [ - react(), - legacy({ - targets: ['defaults', '>0.2%', 'not dead'], - modernPolyfills: true, - }), - ], + plugins: [react()], build: { rollupOptions: { output: { manualChunks: { - react: ['react', 'react-dom', 'react-router-dom', '@reduxjs/toolkit', 'react-redux', 'react-i18next'], + react: [ + 'react', + 'react-dom', + 'react-router-dom', + '@reduxjs/toolkit', + 'react-redux', + 'react-i18next', + ], chakra: ['@chakra-ui/react', '@emotion/react', '@emotion/styled', 'framer-motion', 'react-icons'], 'ag-grid-community': ['ag-grid-community'], 'ag-grid-react': ['ag-grid-react'], @@ -39,11 +38,11 @@ export default defineConfig({ globals: true, environment: 'jsdom', setupFiles: './src/setupTests.ts', - server: { - deps: { - fallbackCJS: false, - }, - }, watch: false, + coverage: { + provider: 'v8', + exclude: coverageConfigDefaults.exclude, + skipFull: true, + }, }, });