Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
65 changes: 55 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ låne verktøy i nærheten i stedet for å kjøpe nytt.

| Visning | Slik kommer du dit | Hva du kan gjøre |
| -------------- | -------------------------------------------------- | ------------------------------------------------------------------------------------- |
| Katalog | Startsiden, «Katalog» i menyen eller navnet øverst | Se alle annonsene, søke og filtrere på kategori og gratis utlån |
| Katalog | Startsiden, «Katalog» i menyen eller navnet øverst | Se alle annonsene, søke, filtrere på kategori og gratis utlån og sortere på pris |
| Detaljvisning | Klikk på et annonsekort i katalogen | Se bilde, beskrivelse, tilstand, tilbehør og pris, velge datoer og se samlet pris |
| Lei ut verktøy | «Lei ut verktøy» i menyen | Fylle ut skjemaet for en ny annonse med tittel, kategori, beskrivelse, område og pris |

Expand All @@ -48,29 +48,74 @@ annonser viser for eksempel «150 kr/døgn», mens gratis annonser viser
Søk og filtre virker bare på eksempelannonsene i nettleseren, og det som
er fylt ut i skjemaene, forsvinner når siden lastes inn på nytt.

### Data

En annonse har i dag tittel, kategori, beskrivelse, område i Trondheim,
døgnpris, tilstand, tilbehør og bilde. Feltene er beskrevet under
[Datamodell og mockdata](#datamodell-og-mockdata).

I den ferdige løsningen ligger dataene i en database:

| Data | Innhold |
| ------------- | ---------------------------------------------------------------------- |
| Verktøymodell | Produktinformasjon som er lik for alle eksemplarer, for eksempel merke |
| Annonse | Ett fysisk eksemplar med eier, tilstand, pris, område og bilde |
| Bruker | Den som legger ut annonser eller sender leieforespørsler |
| Booking | Leieperiode og status: sendt, godkjent, avslått, utlevert eller levert |
| Vurdering | Leietakerens vurdering etter et gjennomført leieforhold |

Annonser, bookinger og vurderinger er de brukergenererte dataene som lagres.
For å teste søk og blaing i store resultatsett fyller vi databasen med
genererte eksempelannonser via et seed-skript. Om vi henter produktdata fra en
ekstern kilde, er ikke avklart.

### Planlagt videre

- **Backend og database:** En egen GraphQL-backend i Node og TypeScript med
PostgreSQL, som kjører på gruppens VM. Frontend henter data med Apollo
Client i stedet for fra mockdataene.
- **Søk i hele databasen:** Søk, filtre og sortering skjer på serveren, med
paginering av store resultatsett.
PostgreSQL. Begge kjører direkte på gruppens VM, uten Docker. Appen blir
tilgjengelig via Apache under `/project2`, og backenden på port 3001.
- **Søk i hele databasen:** Søk, filtre og sortering skjer på serveren, før
resultatet deles opp i sider. Katalogen får blaing med «Forrige» og
«Neste», og endrede valg starter på første side. Søket venter til brukeren
har sluttet å skrive (debouncing), og svar på utdaterte søk forkastes.
- **State:** Apollo Client henter og bufrer data fra backenden. Søk, filtre og
sortering ligger fortsatt i URL-en.
- **Innlogging og egne annonser:** Brukere kan opprette, redigere og
deaktivere egne annonser. Serveren sjekker at bare eieren kan endre dem.
- **Booking:** Eieren godkjenner eller avslår leieforespørsler, og begge
parter ser sine leieforhold. Godkjente bookinger kan ikke overlappe for
samme verktøy. Utlevering og retur registreres, og leietakeren kan gi en
vurdering etterpå. Gratis utlån bruker samme flyt.

Betaling, depositum, frakt og chat er ikke en del av planen.
- **Tilgjengelighet:** Semantisk HTML, tastaturnavigasjon, synlig fokus og
kontrast etter WCAG 2.1 er på plass allerede. Senere kommer test med
skjermleser og en manuell brukertest.
- **Bærekraft:** Små bilder som lastes når de trengs, systemfont, buffring og
spørringer som bare henter feltene som vises. Vi måler datamengde og antall
forespørsler.
- **Testing:** Komponenttester med Vitest finnes allerede. Senere kommer
API-tester mot en testdatabase og en ende-til-ende-test med Playwright av en
hel leieflyt.

Betaling, depositum, frakt og chat er ikke en del av planen. Hvis kjernen blir
ferdig og testet, vurderer vi prosjektlister, for eksempel «Bygg en
bokhylle», med verktøyene som trengs.

### Dette ønsker vi tilbakemelding på

- Er idéen og forskjellen på leie og gratis utlån lett å forstå?
- Mangler katalogen filtre eller sorteringer du ville brukt, for eksempel
område eller ledige datoer?
- Er det tydelig hvordan en leieforespørsel fungerer?
- Er det noe i datamodellen over som virker unødvendig, eller som mangler?

## Krav

- Node.js 24 (LTS). Versjonen står i `.nvmrc`, så med nvm holder det å kjøre
`nvm use`.
- Node.js 24.15 eller nyere (LTS). Versjonen står i `.nvmrc`, så med nvm holder
det å kjøre `nvm use`.
- npm 10 eller nyere (følger med Node).

`engines` i `package.json` angir minstekrav (Node 22.22 og npm 10), men npm
`engines` i `package.json` angir minstekrav: Node 22.22.2 eller 24.15 og
npm 10. Lavere versjoner støttes ikke av `jsdom`, som testene bruker. npm
stopper ikke installasjonen hvis versjonen er feil. Sjekk selv med
`node -v` og `npm -v`.

Expand Down
1 change: 1 addition & 0 deletions docs/ki-bruk.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,4 @@ ser hva vi bør være oppmerksomme på.
| #20 | Skrev avsnittene om idé, visninger, mockup og planer i README | Teksten ble sjekket mot appen. Sortering ble utelatt til #16 var merget |
| #7 | Satte opp Vitest og skrev 79 tester, og kontrollerte ren installasjon, bredder og tastatur | En test sjekket påkrevde felt med `toBeInvalid()` og ville bestått uansett. Byttet til `aria-invalid`. Nettleserkontrollene var automatiserte, se [testing.md](testing.md) |
| #3 | Skrev prosjektstandard, maler for issues og pull requests og dette dokumentet | Standarden ble sjekket mot commit-historikken og reglene i repoet |
| #21 | Kjørte sluttkontrollen før innlevering 1 og rettet det den fant | Fant at `engines` tillot Node-versjoner som `jsdom` ikke støtter, og at favicon manglet. Begge er rettet. PR-er, review og merge til `main` gjøres av gruppen |
23 changes: 21 additions & 2 deletions docs/testing.md
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,27 @@ utleieskjemaet.
- Annonsekort åpnes med Enter.
- Etter en innsending med feil havner fokus på første ugyldige felt.

### Sluttkontroll før innlevering 1

Kontrollert 1. oktober 2026 på `dev` etter at alle issues i milestonen var
merget, med en ny klone, Node 24.21 og npm 11.19.

| Kontroll | Resultat |
| ----------------------------------------------------------------- | -------- |
| `npm ci` og `npm run dev` etter README | OK |
| typecheck, lint, format:check, test (79) og build | OK |
| `engines` i `package.json` og `package-lock.json` er like | OK |
| Katalog, detaljvisning og utleieskjema nås med bare tastatur | OK |
| Betalt leie og gratis utlån skilles med tekst på kort og detaljer | OK |
| Bare to knapper sender inn, og begge er merket «(demo)» | OK |
| Ingen feil i nettleserkonsollen | OK |

Kontrollen fant to feil som er rettet:

- `engines` tillot Node-versjoner som `jsdom` ikke støtter. Kravet er nå
Node 22.22.2 eller 24.15 og nyere.
- Favicon manglet, så nettleseren logget en 404. Appen har nå et eget ikon.

## Gjenstående kontroller

Kontroller som ikke er gjort ennå. Kryss av og skriv dato og hvem når de er
Expand All @@ -126,5 +147,3 @@ gjort, og flytt resultatet opp i dokumentet.
- **Ingen ende-til-ende-tester eller API-tester ennå.** De kommer når
backenden finnes. Testene for appen rendrer hele `App` i en `MemoryRouter`,
men kjører i jsdom og sjekker ikke layout.
- **`favicon.ico` mangler**, så nettleseren logger en 404 i konsollen. Det
påvirker ikke appen.
1 change: 1 addition & 0 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
name="description"
content="Lei og lån verktøy av andre i Trondheim."
/>
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<title>Verktøyutlån Trondheim</title>
</head>
<body>
Expand Down
2 changes: 1 addition & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"version": "0.0.0",
"type": "module",
"engines": {
"node": ">=22.22.0",
"node": "^22.22.2 || >=24.15.0",
"npm": ">=10"
},
"scripts": {
Expand Down
7 changes: 7 additions & 0 deletions public/favicon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.