Merge pull request #20 from navikt/oppdaterFeil
✨ Oppdater feilmeldinger fra frontend
This commit is contained in:
commit
0edfd3ac1f
11 changed files with 164 additions and 21 deletions
|
@ -5,6 +5,7 @@ import no.nav.helse.sprik.db.FeilmeldingTable.arbeidsstatus
|
||||||
import no.nav.helse.sprik.db.FeilmeldingTable.beskrivelse
|
import no.nav.helse.sprik.db.FeilmeldingTable.beskrivelse
|
||||||
import no.nav.helse.sprik.db.FeilmeldingTable.dato
|
import no.nav.helse.sprik.db.FeilmeldingTable.dato
|
||||||
import no.nav.helse.sprik.db.FeilmeldingTable.haster
|
import no.nav.helse.sprik.db.FeilmeldingTable.haster
|
||||||
|
import no.nav.helse.sprik.db.FeilmeldingTable.id
|
||||||
import no.nav.helse.sprik.db.FeilmeldingTable.tittel
|
import no.nav.helse.sprik.db.FeilmeldingTable.tittel
|
||||||
import no.nav.helse.sprik.modell.Feilmelding
|
import no.nav.helse.sprik.modell.Feilmelding
|
||||||
import org.jetbrains.exposed.sql.*
|
import org.jetbrains.exposed.sql.*
|
||||||
|
@ -28,6 +29,7 @@ class FeilmeldingRepository {
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun radTilFeilmelding(rad: ResultRow) = Feilmelding(
|
private fun radTilFeilmelding(rad: ResultRow) = Feilmelding(
|
||||||
|
id = rad[id],
|
||||||
tittel = rad[tittel],
|
tittel = rad[tittel],
|
||||||
beskrivelse = rad[beskrivelse],
|
beskrivelse = rad[beskrivelse],
|
||||||
dato = rad[dato],
|
dato = rad[dato],
|
||||||
|
@ -47,4 +49,13 @@ class FeilmeldingRepository {
|
||||||
.map(::radTilFeilmelding)
|
.map(::radTilFeilmelding)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun hentFeilmelding(id: String) = transaction {
|
||||||
|
TODO()
|
||||||
|
FeilmeldingTable.id
|
||||||
|
}
|
||||||
|
|
||||||
|
fun oppdaterFeilmelding(id: String): Nothing = transaction {
|
||||||
|
TODO()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@ import org.jetbrains.exposed.sql.Table
|
||||||
import org.jetbrains.exposed.sql.javatime.datetime
|
import org.jetbrains.exposed.sql.javatime.datetime
|
||||||
|
|
||||||
object FeilmeldingTable : Table("feilmelding") {
|
object FeilmeldingTable : Table("feilmelding") {
|
||||||
|
val id = integer("id")
|
||||||
val tittel = text("tittel")
|
val tittel = text("tittel")
|
||||||
val beskrivelse = text("beskrivelse")
|
val beskrivelse = text("beskrivelse")
|
||||||
val dato = datetime("dato")
|
val dato = datetime("dato")
|
||||||
|
|
|
@ -14,6 +14,7 @@ import java.time.LocalDateTime
|
||||||
* */
|
* */
|
||||||
@Serializable
|
@Serializable
|
||||||
class Feilmelding(
|
class Feilmelding(
|
||||||
|
val id: Int?,
|
||||||
val tittel: String,
|
val tittel: String,
|
||||||
val beskrivelse: String,
|
val beskrivelse: String,
|
||||||
val dato: LocalDateTime, //Krever en spesiallaget serialiserer i KotlinX
|
val dato: LocalDateTime, //Krever en spesiallaget serialiserer i KotlinX
|
||||||
|
|
|
@ -23,6 +23,7 @@ fun configureRouting(): ApplicationEngine = embeddedServer(CIO, applicationEngin
|
||||||
anyHost()
|
anyHost()
|
||||||
allowMethod(HttpMethod.Get)
|
allowMethod(HttpMethod.Get)
|
||||||
allowMethod(HttpMethod.Post)
|
allowMethod(HttpMethod.Post)
|
||||||
|
allowMethod(HttpMethod.Put)
|
||||||
allowNonSimpleContentTypes = true
|
allowNonSimpleContentTypes = true
|
||||||
}
|
}
|
||||||
install(ContentNegotiation) {
|
install(ContentNegotiation) {
|
||||||
|
@ -61,6 +62,11 @@ fun configureRouting(): ApplicationEngine = embeddedServer(CIO, applicationEngin
|
||||||
val sokeresultat = feilmeldingRepository.hentSokteFeilmeldinger(sokestreng)
|
val sokeresultat = feilmeldingRepository.hentSokteFeilmeldinger(sokestreng)
|
||||||
call.respond(status = HttpStatusCode.Created, message = sokeresultat)
|
call.respond(status = HttpStatusCode.Created, message = sokeresultat)
|
||||||
}
|
}
|
||||||
|
put("/api/oppdaterfeil/{id}") {
|
||||||
|
val id = call.parameters["id"]
|
||||||
|
val oppdatertFeilmelding = call.receive<Feilmelding>()
|
||||||
|
call.respond(status = HttpStatusCode.Created, message = "Feilmelding oppdatert")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
connector {
|
connector {
|
||||||
|
|
|
@ -22,10 +22,10 @@ fun main() {
|
||||||
|
|
||||||
private fun oppretteMockData() {
|
private fun oppretteMockData() {
|
||||||
val feilmeldingRepository = FeilmeldingRepository()
|
val feilmeldingRepository = FeilmeldingRepository()
|
||||||
feilmeldingRepository.lagre(Feilmelding("Mangel på hensyn til tariffoppgjør", "Det har vært ett tariffoppgjør og speil sier sykepengene må tilbakekreves, noe som er feil. (sier vi.. har ikke domenekunnskap)", LocalDateTime.of(2023, 1, 1, 8, 0, 0), 0, false))
|
feilmeldingRepository.lagre(Feilmelding(null, "Mangel på hensyn til tariffoppgjør", "Det har vært ett tariffoppgjør og speil sier sykepengene må tilbakekreves, noe som er feil. (sier vi.. har ikke domenekunnskap)", LocalDateTime.of(2023, 1, 1, 8, 0, 0), 0, false))
|
||||||
feilmeldingRepository.lagre(Feilmelding("Speil sier NAV må tilbakekreve sykepenger på feil grunnlag", "Beskrivelse Test2", LocalDateTime.of(2023, 2, 1, 8, 0, 0), 1, true))
|
feilmeldingRepository.lagre(Feilmelding(null, "Speil sier NAV må tilbakekreve sykepenger på feil grunnlag", "Beskrivelse Test2", LocalDateTime.of(2023, 2, 1, 8, 0, 0), 1, true))
|
||||||
feilmeldingRepository.lagre(Feilmelding("Feil A", "Lorem Ipsum", LocalDateTime.of(2023, 3, 1, 8, 0, 0), 2, false))
|
feilmeldingRepository.lagre(Feilmelding(null, "Feil A", "Lorem Ipsum", LocalDateTime.of(2023, 3, 1, 8, 0, 0), 2, false))
|
||||||
feilmeldingRepository.lagre(Feilmelding("Feil B", "Lorem Ipsum", LocalDateTime.of(2023, 4, 1, 8, 0, 0), 1, true))
|
feilmeldingRepository.lagre(Feilmelding(null, "Feil B", "Lorem Ipsum", LocalDateTime.of(2023, 4, 1, 8, 0, 0), 1, true))
|
||||||
feilmeldingRepository.lagre(Feilmelding("Feil C", "Lorem Ipsum", LocalDateTime.of(2023, 5, 1, 8, 0, 0), 1, true))
|
feilmeldingRepository.lagre(Feilmelding(null, "Feil C", "Lorem Ipsum", LocalDateTime.of(2023, 5, 1, 8, 0, 0), 1, true))
|
||||||
feilmeldingRepository.lagre(Feilmelding("Feil D", "Lorem Ipsum", LocalDateTime.of(2023, 6, 1, 8, 0, 0), 0, false))
|
feilmeldingRepository.lagre(Feilmelding(null, "Feil D", "Lorem Ipsum", LocalDateTime.of(2023, 6, 1, 8, 0, 0), 0, false))
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,8 +21,8 @@ import org.jetbrains.exposed.sql.Database as ExposedDatabase
|
||||||
class FeilmeldingTest {
|
class FeilmeldingTest {
|
||||||
private val database = Database(dbconfig()).configureFlyway()
|
private val database = Database(dbconfig()).configureFlyway()
|
||||||
private val feilmeldingRepository = FeilmeldingRepository()
|
private val feilmeldingRepository = FeilmeldingRepository()
|
||||||
private val feilmelding = Feilmelding("Test", "Testesen", LocalDateTime.of(2023,1,1,8,0), 0, true)
|
private val feilmelding = Feilmelding(1, "Test", "Testesen", LocalDateTime.of(2023,1,1,8,0), 0, true)
|
||||||
private val feilmelding2 = Feilmelding("Tittel", "Beskrivelse", LocalDateTime.of(2023,2,1,8,0), 1, false)
|
private val feilmelding2 = Feilmelding(2, "Tittel", "Beskrivelse", LocalDateTime.of(2023,2,1,8,0), 1, false)
|
||||||
|
|
||||||
@BeforeAll
|
@BeforeAll
|
||||||
fun setup() {
|
fun setup() {
|
||||||
|
@ -101,4 +101,9 @@ class FeilmeldingTest {
|
||||||
assertEquals("Test", sokeresultat[0].tittel)
|
assertEquals("Test", sokeresultat[0].tittel)
|
||||||
assertEquals("Testesen", sokeresultat[0].beskrivelse)
|
assertEquals("Testesen", sokeresultat[0].beskrivelse)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `Oppdaterer en feilmelding`() {
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -16,6 +16,7 @@ const CardsContainer = (props: ICardsContainer) => {
|
||||||
{props.feilmeldinger.map((feilMelding) => (
|
{props.feilmeldinger.map((feilMelding) => (
|
||||||
<FeilKort
|
<FeilKort
|
||||||
key={props.feilmeldinger.indexOf(feilMelding)}
|
key={props.feilmeldinger.indexOf(feilMelding)}
|
||||||
|
id={feilMelding.id}
|
||||||
tittel={feilMelding.tittel}
|
tittel={feilMelding.tittel}
|
||||||
beskrivelse={feilMelding.beskrivelse}
|
beskrivelse={feilMelding.beskrivelse}
|
||||||
dato={new Date()}
|
dato={new Date()}
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
import "@navikt/ds-css";
|
import "@navikt/ds-css";
|
||||||
import { Heading, Modal, Tag } from "@navikt/ds-react";
|
import { Button, Heading, Modal, Radio, RadioGroup, Tag, TextField, Textarea } from "@navikt/ds-react";
|
||||||
import { IFeilmelding } from "../interface";
|
import { Feilmelding, IFeilmelding } from "../interface";
|
||||||
import FeilModal from "./FeilModal";
|
import FeilModal from "./FeilModal";
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
|
import { FloppydiskIcon, PencilIcon, XMarkIcon } from "@navikt/aksel-icons";
|
||||||
|
import axios from "axios";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* En konteiner som inneholder all informasjon og funksjonalitet for å vise og interagere med en feilmelding.
|
* En konteiner som inneholder all informasjon og funksjonalitet for å vise og interagere med en feilmelding.
|
||||||
|
@ -14,13 +16,46 @@ import { useEffect, useState } from "react";
|
||||||
interface IFeilKort extends IFeilmelding {
|
interface IFeilKort extends IFeilmelding {
|
||||||
key: number
|
key: number
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export const FeilKort = (props: IFeilKort) => {
|
export const FeilKort = (props: IFeilKort) => {
|
||||||
const [visModal, setVisModal] = useState<boolean>(false)
|
const [visModal, setVisModal] = useState<boolean>(false)
|
||||||
|
const [redigeringsmodus, setRedigeringsmodus] = useState(false)
|
||||||
|
const [tittel, setTittel] = useState(props.tittel)
|
||||||
|
const [beskrivelse, setBeskrivelse] = useState(props.beskrivelse)
|
||||||
|
const [arbeidsstatus, setArbeidsstatus] = useState(props.arbeidsstatus)
|
||||||
|
const [haster, setHaster] = useState(props.haster)
|
||||||
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
Modal.setAppElement(document.getElementById('root'));
|
Modal.setAppElement(document.getElementById('root'));
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
const lagreEndringer = () => {
|
||||||
|
setRedigeringsmodus(false)
|
||||||
|
|
||||||
|
const fields = {
|
||||||
|
id: props.id,
|
||||||
|
tittel: tittel,
|
||||||
|
beskrivelse: beskrivelse,
|
||||||
|
dato: props.dato,
|
||||||
|
arbeidsstatus: arbeidsstatus,
|
||||||
|
haster: haster
|
||||||
|
}
|
||||||
|
|
||||||
|
const endretFeilmelding = new Feilmelding(fields)
|
||||||
|
|
||||||
|
axios.put(`/api/oppdaterfeil/${props.id}`, endretFeilmelding, {
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
}
|
||||||
|
}).then((response) => {
|
||||||
|
console.log(response);
|
||||||
|
}).catch((error) => {
|
||||||
|
console.log(error);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
return(
|
return(
|
||||||
<>
|
<>
|
||||||
<div
|
<div
|
||||||
|
@ -32,6 +67,7 @@ export const FeilKort = (props: IFeilKort) => {
|
||||||
onClick={() => setVisModal(true)}
|
onClick={() => setVisModal(true)}
|
||||||
>
|
>
|
||||||
<FeilkortHeader
|
<FeilkortHeader
|
||||||
|
id={props.id}
|
||||||
tittel={props.tittel}
|
tittel={props.tittel}
|
||||||
beskrivelse={props.beskrivelse}
|
beskrivelse={props.beskrivelse}
|
||||||
dato={props.dato}
|
dato={props.dato}
|
||||||
|
@ -40,15 +76,92 @@ export const FeilKort = (props: IFeilKort) => {
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<FeilModal open={visModal} setOpen={setVisModal} >
|
<FeilModal open={visModal} setOpen={setVisModal} >
|
||||||
|
{redigeringsmodus ?
|
||||||
|
|
||||||
|
<div className="flex justify-between">
|
||||||
|
<div className="flex flex-col gap-4 w-1/2">
|
||||||
|
<TextField
|
||||||
|
label="Tittel"
|
||||||
|
value={tittel}
|
||||||
|
onChange={e => setTittel(e.target.value)}
|
||||||
|
/>
|
||||||
|
<Textarea
|
||||||
|
label="Beskrivelse"
|
||||||
|
value={beskrivelse}
|
||||||
|
onChange={e => setBeskrivelse(e.target.value)}
|
||||||
|
/>
|
||||||
|
<RadioGroup
|
||||||
|
legend="Velg arbeidsstatus for feil"
|
||||||
|
onChange={(arbeidsstatus: number) => {setArbeidsstatus(arbeidsstatus)}}
|
||||||
|
value={arbeidsstatus}
|
||||||
|
>
|
||||||
|
<Radio value={0}>Ikke påbegynt</Radio>
|
||||||
|
<Radio value={1}>Feilen jobbes med</Radio>
|
||||||
|
<Radio value={2}>Feilen er fikset</Radio>
|
||||||
|
</RadioGroup>
|
||||||
|
<RadioGroup
|
||||||
|
legend="Hvor vil du sitte?"
|
||||||
|
onChange={(haster: boolean) => {setHaster(haster)}}
|
||||||
|
value={haster}
|
||||||
|
>
|
||||||
|
<Radio value={true}>Ja</Radio>
|
||||||
|
<Radio value={false}>Nei</Radio>
|
||||||
|
</RadioGroup>
|
||||||
|
</div>
|
||||||
|
<div className="flex gap-4 items-start">
|
||||||
|
<Button
|
||||||
|
variant="primary"
|
||||||
|
icon={<FloppydiskIcon/>}
|
||||||
|
onClick={() => lagreEndringer()}
|
||||||
|
>
|
||||||
|
Lagre
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
variant="danger"
|
||||||
|
icon={<XMarkIcon/>}
|
||||||
|
onClick={() => {
|
||||||
|
setRedigeringsmodus(false)
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
Avbryt
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
:
|
||||||
|
<div>
|
||||||
|
<div className="flex justify-between">
|
||||||
<FeilkortHeader
|
<FeilkortHeader
|
||||||
|
id={props.id}
|
||||||
tittel={props.tittel}
|
tittel={props.tittel}
|
||||||
beskrivelse={props.beskrivelse}
|
beskrivelse={props.beskrivelse}
|
||||||
dato={props.dato}
|
dato={props.dato}
|
||||||
haster={props.haster}
|
haster={props.haster}
|
||||||
arbeidsstatus={props.arbeidsstatus}
|
arbeidsstatus={props.arbeidsstatus}
|
||||||
/>
|
/>
|
||||||
|
<div className="flex gap-4 items-start">
|
||||||
|
<Button
|
||||||
|
variant="secondary"
|
||||||
|
icon={<PencilIcon/>}
|
||||||
|
onClick={() => setRedigeringsmodus(true)}
|
||||||
|
>
|
||||||
|
Rediger
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
icon={<XMarkIcon/>}
|
||||||
|
onClick={() => {
|
||||||
|
setVisModal(false)
|
||||||
|
setRedigeringsmodus(false)
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
Lukk
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div className="h-2 bg-gray-200 my-4 rounded-lg"></div>
|
<div className="h-2 bg-gray-200 my-4 rounded-lg"></div>
|
||||||
{/* TODO: HER KOMMER CONTENT */}
|
{/* TODO: HER KOMMER CONTENT */}
|
||||||
|
</div>
|
||||||
|
}
|
||||||
</FeilModal>
|
</FeilModal>
|
||||||
</>
|
</>
|
||||||
)
|
)
|
||||||
|
|
|
@ -16,6 +16,7 @@ const FeilModal = (props: modalInterface) => {
|
||||||
aria-label={" modal"}
|
aria-label={" modal"}
|
||||||
onClose={() => props.setOpen(false)}
|
onClose={() => props.setOpen(false)}
|
||||||
aria-labelledby="modal-heading"
|
aria-labelledby="modal-heading"
|
||||||
|
closeButton={false}
|
||||||
>
|
>
|
||||||
<Modal.Content>
|
<Modal.Content>
|
||||||
{props.children}
|
{props.children}
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
|
|
||||||
export interface IFeilmelding {
|
export interface IFeilmelding {
|
||||||
|
id: number,
|
||||||
tittel: string,
|
tittel: string,
|
||||||
beskrivelse: string
|
beskrivelse: string
|
||||||
dato: Date
|
dato: Date
|
||||||
|
@ -12,6 +13,7 @@ export interface IFeilmelding {
|
||||||
}
|
}
|
||||||
|
|
||||||
export class Feilmelding implements IFeilmelding {
|
export class Feilmelding implements IFeilmelding {
|
||||||
|
id: number = 0
|
||||||
tittel: string = "default tittel"
|
tittel: string = "default tittel"
|
||||||
beskrivelse: string = "default beskrivelse"
|
beskrivelse: string = "default beskrivelse"
|
||||||
dato: Date = new Date()
|
dato: Date = new Date()
|
||||||
|
@ -24,8 +26,9 @@ export class Feilmelding implements IFeilmelding {
|
||||||
*/
|
*/
|
||||||
public constructor(
|
public constructor(
|
||||||
fields: {
|
fields: {
|
||||||
tittel: string,
|
id: number
|
||||||
beskrivelse: string,
|
tittel: string
|
||||||
|
beskrivelse: string
|
||||||
dato: Date
|
dato: Date
|
||||||
haster: boolean
|
haster: boolean
|
||||||
arbeidsstatus: number
|
arbeidsstatus: number
|
||||||
|
|
|
@ -12,6 +12,7 @@ export default function Feil() {
|
||||||
const [tittel, setTittel] = useState("");
|
const [tittel, setTittel] = useState("");
|
||||||
const [beskrivelse, setBeskrivelse] = useState("");
|
const [beskrivelse, setBeskrivelse] = useState("");
|
||||||
const [status, setStatus] = useState(0)
|
const [status, setStatus] = useState(0)
|
||||||
|
//const [haster, setHaster] = useState(false)
|
||||||
|
|
||||||
const handleSubmit = () => {
|
const handleSubmit = () => {
|
||||||
|
|
||||||
|
|
Reference in a new issue