diff --git a/package.json b/package.json index 0f52d7b..f2720ad 100755 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "fredy", - "version": "14.3.1", + "version": "14.3.2", "description": "[F]ind [R]eal [E]states [d]amn eas[y].", "scripts": { "prepare": "husky", @@ -56,13 +56,13 @@ "Firefox ESR" ], "dependencies": { - "@douyinfe/semi-icons": "^2.86.0", - "@douyinfe/semi-ui": "2.86.0", + "@douyinfe/semi-icons": "^2.87.1", + "@douyinfe/semi-ui": "2.87.1", "@sendgrid/mail": "8.1.6", "@visactor/react-vchart": "^2.0.5", "@visactor/vchart": "^2.0.5", "@visactor/vchart-semi-theme": "^1.12.2", - "@vitejs/plugin-react": "5.0.4", + "@vitejs/plugin-react": "5.1.0", "better-sqlite3": "^12.4.1", "body-parser": "2.2.0", "cheerio": "^1.1.2", @@ -72,39 +72,39 @@ "nanoid": "5.1.6", "node-cron": "^4.2.1", "node-fetch": "3.3.2", - "node-mailjet": "6.0.9", + "node-mailjet": "6.0.11", "p-throttle": "^8.0.0", "package-up": "^5.0.0", - "puppeteer": "^24.24.0", + "puppeteer": "^24.27.0", "puppeteer-extra": "^3.3.6", "puppeteer-extra-plugin-stealth": "^2.11.2", "query-string": "9.3.1", "react": "18.3.1", "react-dom": "18.3.1", - "react-router": "7.9.4", - "react-router-dom": "7.9.4", + "react-router": "7.9.5", + "react-router-dom": "7.9.5", "restana": "5.1.0", "semver": "^7.7.3", "serve-static": "2.2.0", "slack": "11.0.2", - "vite": "7.1.9", + "vite": "7.1.12", "x-var": "^3.0.1", "zustand": "^5.0.8" }, "devDependencies": { - "@babel/core": "7.28.4", - "@babel/eslint-parser": "7.28.4", - "@babel/preset-env": "7.28.3", - "@babel/preset-react": "7.27.1", + "@babel/core": "7.28.5", + "@babel/eslint-parser": "7.28.5", + "@babel/preset-env": "7.28.5", + "@babel/preset-react": "7.28.5", "chai": "6.2.0", - "eslint": "9.37.0", + "eslint": "9.39.0", "eslint-config-prettier": "10.1.8", "eslint-plugin-react": "7.37.5", "esmock": "2.7.3", "history": "5.3.0", "husky": "9.1.7", "less": "4.4.2", - "lint-staged": "16.2.4", + "lint-staged": "16.2.6", "mocha": "11.7.4", "nodemon": "^3.1.10", "prettier": "3.6.2" diff --git a/ui/src/components/footer/FredyFooter.less b/ui/src/components/footer/FredyFooter.less index ba18de8..c0558b2 100644 --- a/ui/src/components/footer/FredyFooter.less +++ b/ui/src/components/footer/FredyFooter.less @@ -5,6 +5,8 @@ justify-content: space-between; align-items: center; height: 1.7rem; + border-radius: .3rem; + border-top: 1px solid #45464b; &__version { padding-left: .5rem; diff --git a/ui/src/components/navigation/Navigation.jsx b/ui/src/components/navigation/Navigation.jsx index 7c553a8..86371de 100644 --- a/ui/src/components/navigation/Navigation.jsx +++ b/ui/src/components/navigation/Navigation.jsx @@ -22,7 +22,7 @@ export default function Navigation({ isAdmin }) { if (isAdmin) { items.push({ itemKey: '/users', text: 'User Management', icon: }); - items.push({ itemKey: '/generalSettings', text: 'Settings', icon: }); + items.push({ itemKey: '/generalSettings', text: 'General Settings', icon: }); } function parsePathName(name) { diff --git a/ui/src/components/table/listings/ListingsTable.jsx b/ui/src/components/table/listings/ListingsTable.jsx index 31fa101..4eecbee 100644 --- a/ui/src/components/table/listings/ListingsTable.jsx +++ b/ui/src/components/table/listings/ListingsTable.jsx @@ -14,8 +14,8 @@ import ListingsFilter from './ListingsFilter.jsx'; const columns = [ { - title: '#', - width: 100, + title: 'Watchlist', + width: 110, dataIndex: 'isWatched', sorter: true, render: (id, row) => { @@ -180,6 +180,7 @@ export default function ListingsTable() { const [activityFilter, setActivityFilter] = useState(null); const [providerFilter, setProviderFilter] = useState(null); + const [imageWidth, setImageWidth] = useState('100%'); const handlePageChange = (_page) => { setPage(_page); }; @@ -208,14 +209,29 @@ export default function ListingsTable() { const handleFilterChange = useMemo(() => debounce((value) => setFreeTextFilter(value), 500), []); + useEffect(() => { + return () => { + // cleanup debounced handler to avoid memory leaks + handleFilterChange.cancel && handleFilterChange.cancel(); + }; + }, [handleFilterChange]); + const expandRowRender = (record) => { return (
{record.image_url == null ? ( - + ) : ( - + { + setImageWidth('180px'); + }} + fallback={} + /> )}
@@ -226,7 +242,7 @@ export default function ListingsTable() { - + Link to Listing diff --git a/ui/src/views/jobs/ProcessingTimes.jsx b/ui/src/views/jobs/ProcessingTimes.jsx index 7332576..044d0b8 100644 --- a/ui/src/views/jobs/ProcessingTimes.jsx +++ b/ui/src/views/jobs/ProcessingTimes.jsx @@ -1,16 +1,32 @@ import React from 'react'; import { format } from '../../services/time/timeService'; import { Button, Card, Col, Row, Toast } from '@douyinfe/semi-ui'; -import { IconPlayCircle } from '@douyinfe/semi-icons'; +import { + IconClock, + IconDoubleChevronLeft, + IconDoubleChevronRight, + IconPlayCircle, + IconSearch, +} from '@douyinfe/semi-icons'; import { xhrPost } from '../../services/xhr.js'; import './ProsessingTimes.less'; +import { useScreenWidth } from '../../hooks/screenWidth.js'; -function InfoCard({ title, value }) { +function InfoCard({ title, value, icon }) { + const { Meta } = Card; return ( - - {value} - +
+ +
); } @@ -18,32 +34,57 @@ export default function ProcessingTimes({ processingTimes = {} }) { if (Object.keys(processingTimes).length === 0) { return null; } + const width = useScreenWidth(); + const invisible = width <= 1180; + + if (invisible) { + return null; + } + return ( - + } + /> {processingTimes.lastRun && ( <> - + } + value={format(processingTimes.lastRun)} + /> - + } + value={format(processingTimes.lastRun + processingTimes.interval * 60000)} + /> )} } value={