Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
62d3f0e
Move shapefile parsing and handling code to fdm-rvo
BoraIneviNMI Mar 31, 2026
865a264
Remove shpjs from fdm-app
BoraIneviNMI Mar 31, 2026
54d54c0
Add shpjs import back
BoraIneviNMI Mar 31, 2026
86524f7
Merge branch 'development' into FDM533
BoraIneviNMI Apr 3, 2026
d86e15a
Remove shpjs dependency from fdm-app
BoraIneviNMI Apr 3, 2026
7b562d7
Test shapefile.ts
BoraIneviNMI Apr 7, 2026
e59d08f
Improve coverage
BoraIneviNMI Apr 7, 2026
8f7a21d
Separate functionality better in shapefile.ts
BoraIneviNMI Apr 7, 2026
00d9f25
Merge branch 'development' into FDM533
BoraIneviNMI Apr 7, 2026
c8401dd
Add back deleted tests
BoraIneviNMI Apr 7, 2026
4d355b4
Fix fdm-app imports
BoraIneviNMI Apr 7, 2026
f40f643
Make the rvo feature flag true by default just like the gerrit flag
BoraIneviNMI Apr 10, 2026
fa72a25
Add buffer strip checkboxes to the Shapefile import
BoraIneviNMI Apr 10, 2026
c07e1c6
Simplify buffer strip checkbox implementation
BoraIneviNMI Apr 15, 2026
b493879
Merge branch 'development' into FDM533
BoraIneviNMI Apr 15, 2026
70534e1
Fix client-side bundling issue with fdm-rvo/shapefile
BoraIneviNMI Apr 15, 2026
ec1a2c8
Fix hidden column logic
BoraIneviNMI Apr 15, 2026
cf1e7b2
Enable back-navigation in shapefile upload
BoraIneviNMI Apr 15, 2026
08b6680
Remove unused import
BoraIneviNMI Apr 15, 2026
6ae3a24
b_bufferstrip_info_available default value
BoraIneviNMI Apr 15, 2026
7e09651
Nitpicks
BoraIneviNMI Apr 15, 2026
b74c4f2
Add shapefile upload button to the dashboard
BoraIneviNMI Apr 15, 2026
a316380
Use a state instead of returnUrl to let unloads occur without prompti…
BoraIneviNMI Apr 16, 2026
dd8c32b
Improve user facing messages
BoraIneviNMI Apr 16, 2026
7991579
Add default user choices for NEW_LOCAL and EXPIRED_LOCAL
BoraIneviNMI Apr 16, 2026
5eb19ff
Process RVO imported fields concurrently
BoraIneviNMI Apr 16, 2026
b833be6
Use transactioning for shapefile uploads
BoraIneviNMI Apr 17, 2026
1160fe6
Change misleading MijnPercelen upload animation
BoraIneviNMI Apr 17, 2026
40aa1e2
Nitpicks
BoraIneviNMI Apr 17, 2026
b74bcd7
Each request's uploads go into a separate folder
BoraIneviNMI Apr 17, 2026
244bacd
Add guards for NEW_LOCAL
BoraIneviNMI Apr 17, 2026
019d1df
Improve onFieldAdded invocation
BoraIneviNMI Apr 17, 2026
0cc75d1
Delete leftover shapefile upload folders after upload finishes
BoraIneviNMI Apr 20, 2026
6736c4a
Merge branch 'development' into FDM533
BoraIneviNMI Apr 23, 2026
27f51c1
Address nitpicks
BoraIneviNMI Apr 23, 2026
3ea4cd2
Get rid of rvo feature flag default value
BoraIneviNMI Apr 23, 2026
8c4d2b9
Make NMI API request sequential
BoraIneviNMI Apr 29, 2026
e2fd724
Add default user choice for RVO shapefile conflicts
BoraIneviNMI Apr 29, 2026
04f2039
fix: hide the Bedrijf > part in the header on small screens
BoraIneviNMI Apr 29, 2026
7bdbd80
Make farm dashboard button consistent Dutch
BoraIneviNMI Apr 29, 2026
2e2567d
Add fake RVO ending date for EXPIRED_LOCAL review items
BoraIneviNMI Apr 29, 2026
58640f3
Fix issue with spinner disappearing before navigation happens
BoraIneviNMI Apr 29, 2026
f0166ab
Merge branch 'development' into FDM533
BoraIneviNMI Apr 29, 2026
49fba45
Update stale documentation comment
BoraIneviNMI Apr 30, 2026
133f140
refactor: set dependencies
SvenVw Apr 30, 2026
c75b353
Make requested changes
BoraIneviNMI Apr 30, 2026
69054e5
Address nitpicks
BoraIneviNMI Apr 30, 2026
bc7ea62
nitpicks
SvenVw Apr 30, 2026
91de3b1
Use exterior ring length for Shapefile field perimeter calculation
BoraIneviNMI Apr 30, 2026
04ef8bc
Merge remote-tracking branch 'origin/development' into FDM533
SvenVw Apr 30, 2026
ae4d715
Merge branch 'FDM533' of https://github.com/nmi-agro/fdm into FDM533
SvenVw Apr 30, 2026
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
47 changes: 17 additions & 30 deletions fdm-app/app/components/blocks/mijnpercelen/form-upload.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,9 @@ import {
FlaskConical,
} from "lucide-react"
import { useEffect, useRef, useState } from "react"
import { useWatch } from "react-hook-form"
import { Form, NavLink, useActionData, useNavigation } from "react-router"
import { RemixFormProvider, useRemixForm } from "remix-hook-form"
import { parseDbf } from "shpjs"
import { toast as notify } from "sonner"
import { z } from "zod"
import { cn } from "@/app/lib/utils"
import { Dropzone } from "~/components/custom/dropzone"
Expand All @@ -36,7 +35,6 @@ import {
FormMessage,
} from "~/components/ui/form"
import { Spinner } from "~/components/ui/spinner"

import { MijnPercelenUploadAnimation } from "./upload-animation"

type UploadState = "idle" | "animating" | "success" | "error"
Expand All @@ -46,11 +44,12 @@ const ANIMATION_ENABLED = true // Switch for the animation
export function MijnPercelenUploadForm({
b_id_farm,
calendar,
backUrl = `/farm/create/${b_id_farm}/${calendar}`,
}: {
b_id_farm: string
calendar: string
backUrl?: string
}) {
const [fieldNames, setFieldNames] = useState<string[]>([])
const [uploadState, setUploadState] = useState<UploadState>("idle")
const uploadStartTime = useRef<number | null>(null)

Expand All @@ -60,6 +59,7 @@ export function MijnPercelenUploadForm({
mode: "onTouched",
resolver: zodResolver(FormSchema),
defaultValues: {
intent: "upload",
shapefile: [],
},
})
Expand Down Expand Up @@ -111,7 +111,11 @@ export function MijnPercelenUploadForm({
}
}, [uploadState, form.reset])

const selectedFiles = form.watch("shapefile")
const selectedFiles = useWatch({
control: form.control,
name: "shapefile",
defaultValue: [],
})

const selectedFileExtensions = selectedFiles.map((file) =>
getFileExtension(file.name),
Expand All @@ -129,29 +133,6 @@ export function MijnPercelenUploadForm({
const handleFilesSet = async (validFiles: File[]) => {
form.setValue("shapefile", validFiles)
setUploadState("idle")

const dbfFile = validFiles.find(
(file) => getFileExtension(file.name) === ".dbf",
)
if (dbfFile) {
try {
const dbfBuffer = await dbfFile.arrayBuffer()
const dbfData = parseDbf(dbfBuffer) as any[]
let unnamedCount = 0
const names = dbfData.map((row) => {
const trimmedNaam =
typeof row?.NAAM === "string" ? row.NAAM.trim() : ""
return trimmedNaam || `Naamloos perceel ${++unnamedCount}`
})
setFieldNames(names)
} catch (error) {
console.error("Failed to parse DBF file:", error)
notify.error("Kon het DBF bestand niet verwerken")
setFieldNames([])
}
} else {
setFieldNames([])
}
}

const disabledForm = (
Expand Down Expand Up @@ -240,7 +221,7 @@ export function MijnPercelenUploadForm({
return (
<div className="flex justify-center">
{uploadState === "animating" && ANIMATION_ENABLED ? (
<MijnPercelenUploadAnimation fieldNames={fieldNames}>
<MijnPercelenUploadAnimation>
{disabledForm}
</MijnPercelenUploadAnimation>
) : uploadState === "animating" && !ANIMATION_ENABLED ? (
Expand Down Expand Up @@ -271,6 +252,11 @@ export function MijnPercelenUploadForm({
encType="multipart/form-data"
>
<fieldset disabled={isSubmitting}>
<input
name="intent"
type="hidden"
value="upload"
/>
<div className="space-y-6">
<div className="grid grid-cols-1 gap-4">
<FormField
Expand Down Expand Up @@ -399,7 +385,7 @@ export function MijnPercelenUploadForm({
)}
</Button>
<NavLink
to={`/farm/create/${b_id_farm}/${calendar}`}
to={backUrl}
className="w-full"
>
<Button
Expand Down Expand Up @@ -457,6 +443,7 @@ function RequiredFilesStatus({

const fileSizeLimit = 5 * 1024 * 1024 // 5MB
export const FormSchema = z.object({
intent: z.string().optional(),
shapefile: z
.array(z.instanceof(File))
.refine(
Expand Down
Loading
Loading