Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
e7264f8
Setup page for fertilizers
SvenVw Mar 26, 2025
6d161c0
Setup a table for fertilizers
SvenVw Mar 26, 2025
404250b
Add header options
SvenVw Mar 26, 2025
4e5bf7a
Add button to go to page with details about fertilizer
SvenVw Mar 26, 2025
1bacbc2
Add page for to see details of fertilizer
SvenVw Mar 26, 2025
542f55b
When farm is created enable fertilizer catalogue with custom fertiliz…
SvenVw Mar 26, 2025
7e66231
Add function `hashFertilizer` to create hash for fertilizer
SvenVw Mar 26, 2025
c240486
Adapt function `addFertilizerToCatalogue` to add custom fertilizers f…
SvenVw Mar 27, 2025
a259ff6
Add to the output of `getFertilizer` the values for `p_type_*`
SvenVw Mar 27, 2025
a52796a
Add function `updateFertilizerFromCatalogue` to alter properties of c…
SvenVw Mar 27, 2025
d8ae3d0
Fix
SvenVw Mar 27, 2025
1218ab7
Add `hashCultivation` to get the hash of a cultivation item
SvenVw Mar 27, 2025
2ef3870
Improve syncing
SvenVw Mar 27, 2025
226a3cc
Extend the output
SvenVw Mar 28, 2025
17acee3
Improve layout of cards
SvenVw Mar 28, 2025
47b4c80
Add submit buttons
SvenVw Mar 28, 2025
4e1e38f
Fix missing output
SvenVw Mar 28, 2025
5c97d58
Extend schema with min and max values
SvenVw Mar 28, 2025
b5f2693
Typo
SvenVw Mar 28, 2025
6bd5f87
Include p_id_catalogue
SvenVw Mar 28, 2025
cbef8d4
Export updateFertilizerFromCatalogue
SvenVw Mar 28, 2025
e0a0954
Add header for fertilizers
SvenVw Mar 28, 2025
7c8e657
Move form into component
SvenVw Mar 28, 2025
8fa1afa
Move button
SvenVw Mar 28, 2025
3e746ff
Fix
SvenVw Mar 28, 2025
f6920b8
Improve table with fertilizers
SvenVw Mar 28, 2025
9d0db16
Add page to add fertilizer
SvenVw Mar 28, 2025
b5afe8b
Add changesets
SvenVw Mar 28, 2025
b5f3838
Improve unit tests
SvenVw Mar 28, 2025
8b81fbf
Add unit test for hash functions
SvenVw Mar 28, 2025
fc56101
Improve type definition
SvenVw Mar 28, 2025
19f1b5c
Add try catch around sync functions
SvenVw Mar 28, 2025
2b9050f
Remove getting p_id
SvenVw Mar 28, 2025
0bf833d
Improve hash consistency
SvenVw Mar 28, 2025
7d9fa98
Handle async initialization more explicitly
SvenVw Mar 28, 2025
3e1c722
Nitpicks
SvenVw Mar 28, 2025
39d3cee
Fix
SvenVw Mar 28, 2025
5f4cf20
Extend test coverage
SvenVw Mar 28, 2025
297753f
Fixes
SvenVw Mar 28, 2025
2b7afc9
Update fdm-data/src/cultivations/hash.ts
SvenVw Mar 28, 2025
88a469d
Update fdm-data/src/fertilizers/hash.ts
SvenVw Mar 28, 2025
dc1643a
Update fdm-app/app/components/custom/fertilizer/columns.tsx
SvenVw Mar 28, 2025
d515bc8
Update fdm-core/src/fertilizer.ts
SvenVw Mar 28, 2025
14020c4
Fix type
SvenVw Mar 28, 2025
942c211
Fix
SvenVw Mar 28, 2025
deb8b87
Add missing properties
SvenVw Mar 31, 2025
10f34a3
Update fdm-core/src/fertilizer.ts
SvenVw Mar 31, 2025
7ffafcf
Merge remote-tracking branch 'origin/add-custom-fertilizer' into add-…
SvenVw Mar 31, 2025
c2b2614
Fix
SvenVw Mar 31, 2025
e9926cb
Rename `p_cl_cr` to `p_cl_rt` as the previous name was a typo
SvenVw Mar 31, 2025
5b7a189
Fix async
SvenVw Mar 31, 2025
657e10f
Restore unit test to original
SvenVw Mar 31, 2025
9051ddc
fix?
SvenVw Mar 31, 2025
87d98f7
Remove not needed logs
SvenVw Mar 31, 2025
f505c0e
Fix error propagation
SvenVw Mar 31, 2025
1240a14
Improve documentation
SvenVw Mar 31, 2025
4431fe0
Merge branch 'development' into add-custom-fertilizer
SvenVw Mar 31, 2025
5a3d4b5
Merge branch 'development' into add-custom-fertilizer
SvenVw Apr 1, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/bright-buckets-rush.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@svenvw/fdm-core": minor
---

Adapt function `addFertilizerToCatalogue` to add custom fertilizers for a farm
6 changes: 6 additions & 0 deletions .changeset/chubby-bushes-burn.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@svenvw/fdm-core": patch
"@svenvw/fdm-data": patch
---

Rename `p_cl_cr` to `p_cl_rt` as the previous name was a typo
5 changes: 5 additions & 0 deletions .changeset/cute-tires-type.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@svenvw/fdm-app": minor
---

Add page to show the list of fertilizers available on the farm
5 changes: 5 additions & 0 deletions .changeset/dirty-pumas-cry.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@svenvw/fdm-data": minor
---

Add function `hashFertilizer` to create hash for fertilizer
5 changes: 5 additions & 0 deletions .changeset/eleven-dancers-brush.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@svenvw/fdm-data": minor
---

Add `hashCultivation` to get the hash of a cultivation item
5 changes: 5 additions & 0 deletions .changeset/forty-parts-bet.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@svenvw/fdm-app": minor
---

Add page to show details of a fertilizer, and if applicable, to update the values
5 changes: 5 additions & 0 deletions .changeset/funny-dancers-rush.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@svenvw/fdm-core": minor
---

Add function `updateFertilizerFromCatalogue` to alter properties of custom fertilizer
5 changes: 5 additions & 0 deletions .changeset/light-rockets-fly.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@svenvw/fdm-app": minor
---

When farm is created enable fertilizer catalogue with custom fertilizers for that specific farm
5 changes: 5 additions & 0 deletions .changeset/red-oranges-drop.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@svenvw/fdm-core": minor
---

Add to the output of `getFertilizer` and `getFertilizers` the values for `p_type_*` and `p_source`
5 changes: 5 additions & 0 deletions .changeset/vast-lies-go.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@svenvw/fdm-app": minor
---

Add page to add new fertilizer for a farm
57 changes: 57 additions & 0 deletions fdm-app/app/components/custom/farm/farm-header.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import { ChevronDown } from "lucide-react"
import { NavLink } from "react-router"
import type {
FarmOptions,
FertilizerOption,
FieldOptions,
HeaderAction,
LayerKey,
Expand All @@ -33,6 +34,8 @@ interface FarmHeaderProps {
b_id: string | undefined
layerOptions: LayerOptions[]
layerSelected: LayerKey | undefined
fertilizerOptions: FertilizerOption[] | undefined
p_id: string | undefined
action: HeaderAction
}

Expand All @@ -43,6 +46,8 @@ export function FarmHeader({
b_id,
layerOptions,
layerSelected,
fertilizerOptions,
p_id,
action,
}: FarmHeaderProps) {
return (
Expand Down Expand Up @@ -178,6 +183,58 @@ export function FarmHeader({
</BreadcrumbItem>
</>
) : null}
{fertilizerOptions &&
fertilizerOptions.length > 0 ? (
<>
<BreadcrumbSeparator />
<BreadcrumbItem className="hidden md:block">
<BreadcrumbLink
href={`/farm/${b_id_farm}/fertilizers`}
>
Meststof
</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbSeparator />
<BreadcrumbItem>
<DropdownMenu>
<DropdownMenuTrigger className="flex items-center gap-1">
{p_id && fertilizerOptions
? (fertilizerOptions.find(
(option) =>
option.p_id ===
p_id,
)?.p_name_nl ??
"Unknown fertilizer")
: "Kies een meststof"}
<ChevronDown />
</DropdownMenuTrigger>
<DropdownMenuContent align="start">
{fertilizerOptions.map(
(option) => (
<DropdownMenuCheckboxItem
checked={
p_id ===
option.p_id
}
key={
option.p_name_nl
}
>
<NavLink
to={`/farm/${b_id_farm}/fertilizers/${option.p_id}`}
>
{
option.p_name_nl
}
</NavLink>
</DropdownMenuCheckboxItem>
),
)}
</DropdownMenuContent>
</DropdownMenu>
</BreadcrumbItem>
</>
) : null}
</>
) : null}
</BreadcrumbList>
Expand Down
5 changes: 5 additions & 0 deletions fdm-app/app/components/custom/farm/farm.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,11 @@ export interface LayerOption {

export type LayerOptions = LayerOption[]

export interface FertilizerOption {
p_id: string
p_name_nl: string
}

export interface HeaderAction {
label: string
to: string
Expand Down
66 changes: 66 additions & 0 deletions fdm-app/app/components/custom/fertilizer/column-header.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import type { Column } from "@tanstack/react-table"
import { ArrowDown, ArrowUp, ChevronsUpDown, EyeOff } from "lucide-react"

import { cn } from "@/lib/utils"
import { Button } from "@/components/ui/button"
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuSeparator,
DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu"

interface DataTableColumnHeaderProps<TData, TValue>
extends React.HTMLAttributes<HTMLDivElement> {
column: Column<TData, TValue>
title: string
}

export function DataTableColumnHeader<TData, TValue>({
column,
title,
className,
}: DataTableColumnHeaderProps<TData, TValue>) {
if (!column.getCanSort()) {
return <div className={cn(className)}>{title}</div>
}

return (
<div className={cn("flex items-center space-x-2", className)}>
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button
variant="ghost"
size="sm"
className="-ml-3 h-8 data-[state=open]:bg-accent"
>
<span>{title}</span>
{column.getIsSorted() === "desc" ? (
<ArrowDown />
) : column.getIsSorted() === "asc" ? (
<ArrowUp />
) : (
<ChevronsUpDown />
)}
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent align="start">
<DropdownMenuItem onClick={() => column.toggleSorting(false)}>
<ArrowUp className="h-3.5 w-3.5 text-muted-foreground/70" />
Oplopend
</DropdownMenuItem>
<DropdownMenuItem onClick={() => column.toggleSorting(true)}>
<ArrowDown className="h-3.5 w-3.5 text-muted-foreground/70" />
Aflopend
</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuItem onClick={() => column.toggleVisibility(false)}>
<EyeOff className="h-3.5 w-3.5 text-muted-foreground/70" />
Verberg
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
</div>
)
}
118 changes: 118 additions & 0 deletions fdm-app/app/components/custom/fertilizer/columns.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
import type { ColumnDef } from "@tanstack/react-table"
import { ArrowRight, Pencil, SquareArrowOutUpRight } from "lucide-react"
import { DataTableColumnHeader } from "./column-header"
import {
Tooltip,
TooltipContent,
TooltipProvider,
TooltipTrigger,
} from "@/components/ui/tooltip"
import { NavLink } from "react-router-dom"
import { Badge } from "@/components/ui/badge"

export type Fertilizer = {
p_id: string
p_name_nl: string
p_n_rt?: number | null
p_p_rt?: number | null
p_k_rt?: number | null
p_type_manure?: boolean
p_type_compost?: boolean
p_type_mineral?: boolean
p_eoc?: number | null
p_source?: string
p_n_wc?: number | null
p_om?: number | null
p_s_rt?: number | null
p_ca_rt?: number | null
p_mg_rt?: number | null
}

export const columns: ColumnDef<Fertilizer>[] = [
// {
// accessorKey: "p_id",
// header: "ID",
// },
{
accessorKey: "p_name_nl",
header: "Naam",
},
{
accessorKey: "p_n_rt",
header: ({ column }) => {
return <DataTableColumnHeader column={column} title="N" />
},
},
{
accessorKey: "p_p_rt",
header: ({ column }) => {
return <DataTableColumnHeader column={column} title="P2O5" />
},
},
{
accessorKey: "p_k_rt",
header: ({ column }) => {
return <DataTableColumnHeader column={column} title="K2O" />
},
},
{
accessorKey: "p_eoc",
header: ({ column }) => {
return <DataTableColumnHeader column={column} title="EOC" />
},
},
{
accessorKey: "Type",
cell: ({ row }) => {
const fertilizer = row.original

return (
<span className="flex items-center gap-2">
{fertilizer.p_type_manure ? (
<Badge
className="bg-amber-600 text-white hover:bg-amber-700"
variant="default"
>
Mest
</Badge>
) : null}
{fertilizer.p_type_compost ? (
<Badge
className="bg-green-600 text-white hover:bg-green-700"
variant="default"
>
Compost
</Badge>
) : null}
{fertilizer.p_type_mineral ? (
<Badge
className="bg-blue-600 text-white hover:bg-blue-700"
variant="default"
>
Kunstmest
</Badge>
) : null}
</span>
)
},
},
{
accessorKey: "Details",
cell: ({ row }) => {
const fertilizer = row.original

return (
<TooltipProvider>
<Tooltip>
<TooltipTrigger className=" text-sm text-muted-foreground/70">
<NavLink to={`./${fertilizer.p_id}`}>
<ArrowRight className="text-sm" />
</NavLink>
</TooltipTrigger>
<TooltipContent>{`Bekijk details over ${fertilizer.p_name_nl}`}</TooltipContent>
</Tooltip>
</TooltipProvider>
)
},
},
]
Loading