fdnd-agency / drop-and-heal

MIT License
0 stars 4 forks source link

gepersonaliseerd programma d.m.v vragenlijst / page #66

Open lisavanmansom opened 1 week ago

lisavanmansom commented 1 week ago

Gepersonaliseerd programma d.m.v vragenlijst / page

De vragenlijst pagina wordt gebouwd d.m.v atomic design.

Component: Ontwerp en bouw voor de opdrachtgever een robuust, goed werkend component, waarin de belangen van de eindgebruiker centraal staan.

Takenlijst:

  1. Analyseren: Inventariseer het componenten
  2. Ontwerpen: Onderzoek variaties voor jouw component met behulp van een morphological chart.
  3. Werk verschillende versie van je component uit in Figma.
  4. Breakdownschets met de HTML, CSS en JS code voor het component. Schets responsive, progressive enhancement, performance en toegankelijkheid.
  5. Bouwen: Maak het component in Sveltekit.
  6. Testen: Test het component regelmatig op toegankelijkheid, responsive design en performance en verwerk de feedack.

Gekoppelde issues aan deze taak:

  1. https://github.com/fdnd-agency/drop-and-heal/issues/59
  2. https://github.com/fdnd-agency/drop-and-heal/issues/67
  3. https://github.com/fdnd-agency/drop-and-heal/issues/68
  4. https://github.com/fdnd-agency/drop-and-heal/issues/69
  5. https://github.com/fdnd-agency/drop-and-heal/issues/70
  6. https://github.com/fdnd-agency/drop-and-heal/issues/73
  7. https://github.com/fdnd-agency/drop-and-heal/issues/74
  8. https://github.com/fdnd-agency/drop-and-heal/issues/75

Definition of done

lisavanmansom commented 1 week ago

Inventariseer het component / Analyseren / #59

Het component is een vragenlijst (form). De huidige schets komt vanuit de opdrachtgever. Momenteel is het per vraag in een one-pager layout, het is beter om het geheel op 1 pagina te maken en daarna code te splitten.

Image

Update component

Image

Componenten identificeren

Mijn page bestaat uit 3 componenten:

  1. Form
  2. Input
  3. Link

Image

lisavanmansom commented 1 week ago

Verschillende versie component / Breakdownschets / responsive schets / progressive enhancement schets / performance en toegankelijkheid schets. / #67

Onderzoek / maak variaties d.m.v. een morphological chart

morphological chart

Ik heb de opties van de form verkent d.m.v. een morphological chart. De uitkomst is: radio / _blank / post.

Image

Werk verschillende versie uit

Wij hebben een ontwerp ontvangen van de opdrachtgever, momenteel is het per vraag in een one-pager layout, het is beter om het geheel op 1 pagina te maken en daarna code te splitten. Door dit te doen is het makkelijker om het PE / toegankelijk te maken.

Orginele schets

Image

Update schets

Image

Breakdownschets met de HTML, CSS en JS code voor het component

Image

Responsive

Qua responsive is er niet echt verschil met desktop en mobile. Het design is een lijst met vragen wat gecentreerd is in het midden van het scherm.

Mobile

Image

Desktop

Image

Schets progressive enhancement

Ik ga het eerst als form in geheel maken. Als enhancement wil ik 1 vraag hebben op de page. Om zoiets als resultaat te krijgen heb je JS nodig, als de JS uitstaat zou je het gehele form te zien moeten krijgen.

PE design

Image

Schets performance

Om de performance score hoog te houden wil ik het eerst coderen zonder animaties. In de achtergrond zou ik wel een rustige bewegend element willen hebben om de user experience te verhogen. Dit verlaagt wel de performance, om die reden ga ik dit later toevoegen zodat het eenvoudig blijft om de componenten en de rest te testen en verbeteren op performance

Image

Schets toegankelijkheid

Kleurcontrast

Ik heb het design getest op kleurcontrasten. De input / radio heeft een border die niet in het juiste kleurcontrast staat. Aangezien wit vaker terugkomt is dat een passende kleur die ik ga gebruiken ipv deze grijze kleur.

Image Image

Kleurcontrast verbeterd

In de verbeterde versie heb ik de border lichter gemaakt. Om het verschil te zien heb ik de onderste 2 niet aangepast.

Image Image

States

Door verschillende states te gebruiken ga ik feedback geven aan de gebruiker. Momenteel is de hover / active state het belangrijkste.

Image

lisavanmansom commented 3 days ago

Componenten / bouw-fase

Input component

Ik heb van de input een een aparte component gemaakt. De input heeft een name, value en een bindGroup, dit wordt ingeladen vanuit de form component waar deze data in een array staat. De input wordt ingeladen in het fieldset component. Ik maak gebruik van $props() wat refereert naar properties, dit zit in Svelte5.

<script>
  let {name, value, labelText, bindGroup, ...others} = $props();
</script>

<label>
  <input type="radio" name={name} value={value} bind:group={bindGroup} />
  {labelText}
</label>

Fieldset component

In het Fieldset component importeer ik het input-component. In dit component maak ik ook gebruik van $props() en wordt de props-data ingeladen vanuit het form-component.

<script>
  import QuestionOption from './question-option.svelte';
  let {name, value, labelText,selectedOption, options, legend, ...others} = $props();
</script>

<fieldset>
  <legend>{legend}</legend>
  {#each options as option}
  <!-- Question option / input component-->
    <QuestionOption
      name={name}
      value={option.value}
      labelText={option.labelText}
      bindGroup={selectedOption} 
    />
  {/each}
</fieldset>

Form component

In het form element wordt de fieldset-component ingeladen en staat de 'data' van het gehele form wat wordt ingeladen in andere componenten en in dit component. De form heeft een POST en een submit waardoor je geredirect kan worden naar een andere page based on de gegeven antwoorden.

<script>
  import QuestionSet from './question-set.svelte';

  // content form
  let questions = [{
    legend: "Hoe denk je over het verlies?",
    name: "question1",
    options: [
      {value: "f1-i-1", labelText: "Ik voel intens verdriet of pijn wanneer ik aan het verlies denk."},
      {value: "f1-i-2", labelText: "Het voelt nog steeds onwerkelijk, alsof het niet echt is gebeurd."},
      {value: "f1-i-3", labelText: "Ik probeer manieren te vinden om mijn dagelijkse leven aan te passen."},
      {value: "f1-i-4", labelText: "Ik begin de persoon een plek te geven in mijn herinneringen en probeer door te gaan."}
    ]
  },
  {
    legend: "Hoe vaak ervaar je emotionele pijn gerelateerd aan het verlies?",
    name: "question2",
    options: [
      { value: "f2-i-1", labelText: "Vrijwel constant voel ik verdriet en rouw."},
      { value: "f2-i-2", labelText: "Soms voel ik pijn, maar ik probeer verder te gaan."},
      { value: "f2-i-3", labelText: "Het wordt minder intens en ik vind troost in herinneringen."},
      { value: "f2-i-4", labelText: "Ik voel geen sterke emoties over het verlies, meer verwarring."}
    ]
  },
  {
    legend: "Hoe kijk je naar een toekomst zonder je dierbare?",
    name: "question3",
    options: [
      { value: "f3-i-1", labelText: "Ik kan me een toekomst zonder hen niet voorstellen."},
      { value: "f3-i-2", labelText: "Ik probeer nieuwe routines te ontwikkelen zonder hen."},
      { value: "f3-i-3", labelText: "Ik begin hoop te zien voor de toekomst en herinner me hen met liefde."},
      { value: "f3-i-4", labelText: "Ik voel me overweldigd door het verdriet en kan niet aan de toekomst denken."}
    ]
  }]
</script>

<!-- form component-->
<form method="POST" action="?/submit"> <!-- form submission / native-->
  {#each questions as question}
    <!-- QuestionSet / fieldsets-->
    <QuestionSet
      legend={question.legend}
      name={question.name}
      options={question.options}
    />
  {/each}
  <button type="submit">Submit</button>
</form>

redirect to new page after submit

Via een page.server.js wordt je geredirect naar een andere pagina gebaseerd op de gegeven antwoorden in het form. Deze code is nog niet helemaal geoptimaliseerd maar het is momenteel wel werkend. Ik heb momenteel 4 pagina's waarnaar je geredirect kan worden maar ik wil dat veranderen naar 1 aangezien het dezelfde pagina is alleen dan met andere inhoud.

import { redirect } from '@sveltejs/kit';

export const actions = {
  submit: async ({ request }) => {
    const formData = await request.formData();
    const selectedAnswers = {
      question1: formData.get('question1'),
      question2: formData.get('question2'),
      question3: formData.get('question3'),
    };

    // Via selectedAnswers is the result calculated and redirection
    if (selectedAnswers.question1 === 'f1-i-1' && selectedAnswers.question2 === 'f2-i-1') {
      throw redirect(303, '/form-redirect/redirect-rt-1'); 
    } else if (selectedAnswers.question1 === 'f1-i-4' && selectedAnswers.question3 === 'f3-i-3') {
      throw redirect(303, '/form-redirect/redirect-rt-2'); 
    } else if (selectedAnswers.question2 === 'f2-i-3') {
      throw redirect(303, '/form-redirect/redirect-rt-3'); 
    } else {
      throw redirect(303, '/form-redirect/redirect-rt-4'); 
    }
  }
};

CSS added

Image

CSS Blur

Om het component vaker te kunnen gebruiken heb ik de onderstaande code gebruikt.

<script>
import { page } from '$app/stores';
export let pageStyle = 'default';
</script>

<img 
src="/gradients/Meshgrad-pink.png" 
alt="" 
width="100" height="100" 
class={`blurred-image ${pageStyle}`}/>

<style>

    <!-- dynamic class -->
    .blurred-image.form-page {
        transform: scale(2);
    }

</style>

File met component ingeladen

Door een pageStyle="" toe te voegen komt die class van het component alleen op deze pagina.

  <div aria-hidden="true">
    <BlurgradPink pageStyle="form-page" />
  </div>
lisavanmansom commented 3 days ago

Testen before CSS

Voordat ik verder ga met CSS test doe ik eerst de gebruikelijke testen zodat ik eenvoudig de voortgang van test-uitslagen bij kan houden.

JS uit

Om te checken of het werkt zonder JS heb ik het form ingevuld en gesubmit met JS uit. Met JS uit werkt het submitten nogsteeds.

Image Image

Performance

Image

Accessiblity

Tijdens de lighthouse test kwam er een 1 accessibility error naar voren, dit wordt opgelost wanneer er een styling wordt toegevoegd.

Image

HTML validator

Image

Testen after CSS was added

Accessibility

Image

Performance desktop / mobile

Image Image