diff --git a/.cursor/goal/archive/scratchpad-20260721T123448.md b/.cursor/goal/archive/scratchpad-20260721T123448.md deleted file mode 100644 index bb751f121..000000000 --- a/.cursor/goal/archive/scratchpad-20260721T123448.md +++ /dev/null @@ -1,56 +0,0 @@ ---- -iteration: 2 -max_iterations: 10 -status: active -goal: "Maximize the downloads widget by leveraging every mantine-datatable feature, adding hover tooltips with stats, click-to-expand rich detail rows, toggleable global stats, and comprehensive customization options" -success_criteria: - - "Leverage all mantine-datatable features: row expansion, column toggling, custom row styling, striped rows, scroll area tracking, pinned columns, and context menus" - - "Add hover tooltips on rows showing additional stats (size, speed, ETA, ratio, category)" - - "Implement click-to-expand row details with comprehensive download info" - - "Add toggleable global stats bar showing total speeds, ratios, queue counts, and queue size (disk usage not available from integration API)" - - "Use every relevant DataTable prop from the mantine-datatable docs" - - "Typecheck passes with pnpm turbo typecheck --filter=@homarr/widgets" - - "No regressions in existing functionality (context menu, sorting, filtering still work)" -last_verdict: null -last_reason: null -last_next: null -engine: cursor ---- - -## Progress log - -### Iteration 1 -- Added hover tooltips on name column showing size, state, speeds, ETA, ratio, category -- Added toggleable global stats bar with overall progress, total size, speeds, ratio, status counts -- Enhanced row expansion with RingProgress, SimpleGrid layout, collapse on click -- Added striped rows, highlightOnHover colors, rowBackgroundColor for failed/paused -- Added defaultColumnProps with noWrap and dynamic cellsStyle -- Added collapseProps for smooth expansion animation -- Added onScroll to auto-close context menu -- Added new translations for stats bar -- TypeCheck: PASS - -### Iteration 2 -- Migrated to `useDataTableColumns` hook with toggleable, draggable, resizable, pinnable columns -- Added `storeColumnsKey` for localStorage column preference persistence -- Added `pinFirstColumn`, `pinLastColumn`, `textSelectionDisabled`, `withColumnBorders` -- Added `scrollAreaProps`, `customRowAttributes`, enhanced scroll tracking (`onScroll`, `onScrollToTop`, `onScrollToBottom`) -- Added column settings menu in footer with reset visibility/order/width/pinning -- Added scroll position indicator badge when scrolled -- Explicit `rowExpansion.trigger: "click"` -- Updated docs and translations for column controls -- TypeCheck: PASS - -## Blockers -None - -## Verification -- pnpm turbo typecheck --filter=@homarr/widgets: PASS (exit code 0) -- Context menu: preserved via onRowContextMenu -- Sorting: preserved via sortStatus/onSortStatusChange -- Filtering: preserved in WidgetFooter -- Column toggling/reordering/resizing/pinning: via useDataTableColumns + header UI - -## Task - -Maximize the downloads widget by leveraging every mantine-datatable feature, adding hover tooltips with stats, click-to-expand rich detail rows, toggleable global stats, and comprehensive customization options diff --git a/apps/docs/docs/widgets/downloads/index.ts b/apps/docs/docs/widgets/downloads/index.ts index b5f66f5ca..4245af310 100644 --- a/apps/docs/docs/widgets/downloads/index.ts +++ b/apps/docs/docs/widgets/downloads/index.ts @@ -18,7 +18,7 @@ const columnsList = [ "index", "type", ]; -const sortColumns = columnsList.filter((c) => !["state", "category"].includes(c)); +const sortColumns = columnsList.filter((c) => !["state", "category", "integration"].includes(c)); export const downloadsWidget: WidgetDefinition = { icon: IconDownload, diff --git a/packages/request-handler/src/weather.ts b/packages/request-handler/src/weather.ts index 24e51a735..5f5a097a4 100644 --- a/packages/request-handler/src/weather.ts +++ b/packages/request-handler/src/weather.ts @@ -9,7 +9,7 @@ export const weatherRequestHandler = createWidgetRequestHandler({ async requestAsync(input: { latitude: number; longitude: number }) { const res = await withTimeoutAsync(async (signal) => { return await fetchWithTrustedCertificatesAsync( - `https://api.open-meteo.com/v1/forecast?latitude=${input.latitude}&longitude=${input.longitude}&daily=weathercode,temperature_2m_max,temperature_2m_min,sunrise,sunset,wind_speed_10m_max,wind_gusts_10m_max,relative_humidity_2m¤t_weather=true&timezone=auto`, + `https://api.open-meteo.com/v1/forecast?latitude=${input.latitude}&longitude=${input.longitude}&daily=weathercode,temperature_2m_max,temperature_2m_min,sunrise,sunset,wind_speed_10m_max,wind_gusts_10m_max¤t_weather=true&timezone=auto`, { signal }, ); }); @@ -27,7 +27,6 @@ export const weatherRequestHandler = createWidgetRequestHandler({ sunset: weather.daily.sunset[index], maxWindSpeed: weather.daily.wind_speed_10m_max[index], maxWindGusts: weather.daily.wind_gusts_10m_max[index], - humidity: weather.daily.relative_humidity_2m[index], }; }), } satisfies Weather; @@ -49,7 +48,6 @@ const atLocationOutput = z.object({ sunset: z.array(z.string()), wind_speed_10m_max: z.array(z.number()), wind_gusts_10m_max: z.array(z.number()), - relative_humidity_2m: z.array(z.number()), }), }); @@ -68,6 +66,5 @@ export interface Weather { sunset: string | undefined; maxWindSpeed: number | undefined; maxWindGusts: number | undefined; - humidity: number | undefined; }[]; } diff --git a/packages/translation/src/lang/en.json b/packages/translation/src/lang/en.json index b109bcdd3..08d1be3b2 100644 --- a/packages/translation/src/lang/en.json +++ b/packages/translation/src/lang/en.json @@ -2257,8 +2257,7 @@ "sunrise": "Sunrise", "sunset": "Sunset", "maxWindSpeed": "Max wind speed: {maxWindSpeed} {unit}", - "maxWindGusts": "Max wind gusts: {maxWindGusts} {unit}", - "humidity": "Humidity: {humidity}%" + "maxWindGusts": "Max wind gusts: {maxWindGusts} {unit}" }, "kind": { "clear": "Clear", diff --git a/packages/widgets/src/weather/component.tsx b/packages/widgets/src/weather/component.tsx index 27ab5d19e..6e76ef8f2 100644 --- a/packages/widgets/src/weather/component.tsx +++ b/packages/widgets/src/weather/component.tsx @@ -1,7 +1,7 @@ "use client"; import { Box, Group, HoverCard, Stack, Text } from "@mantine/core"; -import { IconArrowDownRight, IconArrowUpRight, IconDroplets, IconMapPin, IconWind } from "@tabler/icons-react"; +import { IconArrowDownRight, IconArrowUpRight, IconMapPin, IconWind } from "@tabler/icons-react"; import combineClasses from "clsx"; import dayjs from "dayjs"; @@ -87,12 +87,6 @@ const DailyWeather = ({ options, weather }: WeatherProps) => { )} - {weather.daily[0]?.humidity !== undefined && ( - - - {t("dailyForecast.humidity", { humidity: weather.daily[0].humidity })} - - )} @@ -210,7 +204,6 @@ function Forecast({ weather, options }: WeatherProps) { sunset={dayjs(dayWeather.sunset).format("HH:mm")} maxWindSpeed={dayWeather.maxWindSpeed} maxWindGusts={dayWeather.maxWindGusts} - humidity={dayWeather.humidity} /> diff --git a/packages/widgets/src/weather/icon.tsx b/packages/widgets/src/weather/icon.tsx index 6153484f0..fe4ad92b0 100644 --- a/packages/widgets/src/weather/icon.tsx +++ b/packages/widgets/src/weather/icon.tsx @@ -5,7 +5,6 @@ import { IconCloudRain, IconCloudSnow, IconCloudStorm, - IconDroplets, IconMoon, IconQuestionMark, IconSnowflake, @@ -52,7 +51,6 @@ interface WeatherDescriptionProps { sunset?: string; maxWindSpeed?: number; maxWindGusts?: number; - humidity?: number; } /** @@ -80,7 +78,6 @@ export const WeatherDescription = ({ sunset, maxWindSpeed, maxWindGusts, - humidity, }: WeatherDescriptionProps) => { const t = useScopedI18n("widget.weather"); const tCommon = useScopedI18n("common"); @@ -100,9 +97,6 @@ export const WeatherDescription = ({ }>{`${tCommon("information.min")}: ${minTemp}`} }>{`${t("dailyForecast.sunrise")}: ${sunrise}`} }>{`${t("dailyForecast.sunset")}: ${sunset}`} - {humidity !== undefined && ( - }>{t("dailyForecast.humidity", { humidity })} - )} {maxWindSpeed !== undefined && ( }> {t("dailyForecast.maxWindSpeed", {