@econnect/webcomponents-library
Documentation
Styleguide
Documentation
Styleguide
  • Getting Started

    • Installation
    • Patch Notes
    • Styleguide
  • Styling

    • e-connect colors
  • UI Components

    • Form

      • Search Field
      • Form Field
      • Forms
    • Filter

      • Filter
      • Search Filter
    • Grid

      • Grid
      • Grid Row
    • Inputs

      • File Input
      • Input Checkbox
      • Input Dropdown
      • Input Date
      • Input Date Time
      • Input Date Time Local
      • Input File
      • Input Label
      • Input Multi Select
      • Input Number
      • Input Radio
      • Input Range
      • Input Select
      • Input Switch
      • Input Slider
      • Input Text
      • Input TextArea
      • Input Time
      • Input Time Range
    • Controls

      • Booleans
      • Button
      • Checkboxes
      • Date Displays
      • Dropdown Lists
      • Text Displays
    • Headers

      • e-header
    • Cards

      • e-card
    • Images

      • Icon
      • Images
      • Flag Image
      • Hamburger
    • Iframe
    • Pager
    • Settings
    • Document Validation
    • Navigation

      • Navigation
      • Navigation Menu
      • Navigation Footer
      • Navigation Button
      • Navigation Button Item
      • Navigation Search Item

Forms Unavailable

The <e-form> component is a component that can be used for displaying a variety of forms.

Usage

An e-form has attributes that must be provided.

<e-form
  :model="formData"
  @update:value="updateLocalData"
  @submit="formSubmitted"
/>

Attributes

model | Type: EFormModel | required
submitText | Type: String | Default: ''
theme | Type: Theme | Default: gray

Examples

test form uit library

text inputs

boolean inputs

option inputs

sliders

50
40-60

date / time. inputs

etc. inputs

form data :form data: { }
form json :
title: form-jsonicon: assignmenthasDividers: truesections: []
test model :
id: 1title: test form uit libraryicon: assignmenthasDividers: true
sections :
0 :
id: 1title: text inputsicon: invoicetheme: gray
fields :
0 :
type: textid: 1-1value: label: text labelplaceholder: vul in..required: truehidden: false
1 :
type: numberid: 1-2value: label: number labelplaceholder: vul in..required: truehidden: false
2 :
type: emailid: 1-3value: label: email labelplaceholder: vul in..required: truehidden: false
meta :
autoComplete: false
3 :
type: passwordid: 1-4value: label: password labelplaceholder: vul in..required: truehidden: false
meta :
autoComplete: new-password
4 :
type: searchid: 1-5value: label: search labelplaceholder: vul in..required: truehidden: false
5 :
type: telid: 1-6value: label: tel labelplaceholder: vul in..required: truehidden: false
6 :
type: textareaid: 1-7value: een of andere tekstlabel: textarea labelplaceholder: vul in..required: truehidden: false
meta :
duoColumn: true
1 :
id: 2title: boolean inputsicon: invoicetheme: gray
fields :
0 :
type: switchid: 2-1value: truelabel: switch labelplaceholder: zet aan..required: truehidden: false
1 :
type: checkboxid: 2-2value: truelabel: Hierbij geef ik toestemming voor het verwerken van mijn gegevensplaceholder: zou er ook niet moeten staanrequired: truehidden: false
meta :
duoColumn: false
2 :
id: 3title: option inputsicon: invoicetheme: gray
fields :
0 :
type: dropdownid: 3-1value: derde optielabel: dropdown labelplaceholder: selecteer..required: truehidden: false
options :
0 :
id: 1text: eerste optievalue: eerste optiedisabled: false
1 :
id: 2text: tweede optievalue: tweede optiedisabled: false
2 :
id: 3text: derde optievalue: derde optiedisabled: false
3 :
id: 4text: laatste optievalue: laatste optiedisabled: false
1 :
type: selectid: 3-2value: derde optielabel: select labelplaceholder: selecteer..required: truehidden: false
options :
0 :
id: 1text: eerste optievalue: eerste optiedisabled: false
1 :
id: 2text: tweede optievalue: tweede optiedisabled: false
2 :
id: 3text: derde optievalue: derde optiedisabled: false
3 :
id: 4text: laatste optievalue: laatste optiedisabled: false
meta :
options :
0 :
id: 1text: eerste optievalue: eerste optiedisabled: false
1 :
id: 2text: tweede optievalue: tweede optiedisabled: false
2 :
id: 3text: derde optievalue: derde optiedisabled: false
3 :
id: 4text: laatste optievalue: laatste optiedisabled: false
2 :
type: multi-selectid: 3-3value: derde optielabel: multi-select labelplaceholder: selecteer..required: truehidden: false
options :
0 :
id: 1text: eerste optievalue: eerste optiedisabled: false
1 :
id: 2text: tweede optievalue: tweede optiedisabled: false
2 :
id: 3text: derde optievalue: derde optiedisabled: false
3 :
id: 4text: laatste optievalue: laatste optiedisabled: false
meta :
options :
0 :
id: 1text: eerste optievalue: eerste optiedisabled: false
1 :
id: 2text: tweede optievalue: tweede optiedisabled: false
2 :
id: 3text: derde optievalue: derde optiedisabled: false
3 :
id: 4text: laatste optievalue: laatste optiedisabled: false
3 :
type: radioid: 3-4value: derde optielabel: radio labelplaceholder: selecteer..required: truehidden: false
options :
0 :
id: 1text: eerste optievalue: eerste optiedisabled: false
1 :
id: 2text: tweede optievalue: tweede optiedisabled: false
2 :
id: 3text: derde optievalue: derde optiedisabled: false
3 :
id: 4text: laatste optievalue: laatste optiedisabled: false
meta :
duoColumn: true
3 :
id: 4title: slidersicon: invoicetheme: gray
fields :
0 :
type: sliderid: 4-1value: 50label: sliderplaceholder: required: truehidden: false
meta :
min: 0max: 100steps: 1
1 :
type: rangeid: 4-2value: 40-60label: rangeplaceholder: required: truehidden: false
meta :
min: 0max: 100steps: 1
meta :
duoColumn: false
4 :
id: 5title: date / time. inputsicon: invoicetheme: gray
fields :
0 :
type: dateid: 5-1value: label: dateplaceholder: required: truehidden: false
1 :
type: datetimeid: 5-2value: label: date timeplaceholder: required: truehidden: false
meta :
disabled: falsetimeDisabled: falserequireTime: false
2 :
type: datetime-localid: 5-3value: label: date time localplaceholder: required: truehidden: false
3 :
type: monthid: 5-4value: label: monthplaceholder: required: truehidden: false
4 :
type: timeid: 5-5value: label: timeplaceholder: required: truehidden: false
5 :
type: weekid: 5-6value: label: weekplaceholder: required: truehidden: false
6 :
type: timerangeid: 5-7value: label: timerangeplaceholder: required: truehidden: false
meta :
duoColumn: false
5 :
id: 6title: etc. inputsicon: invoicetheme: gray
fields :
0 :
type: colorid: 6-1value: label: colorplaceholder: color placeholderrequired: truehidden: false
1 :
type: fileid: 6-2value: label: fileplaceholder: file placeholderrequired: truehidden: false
2 :
type: imageid: 6-3value: label: image labelplaceholder: image placeholderrequired: truehidden: false
3 :
type: labelid: 6-4value: een of ander labellabel: zou er niet moeten staanplaceholder: zou er ook niet moeten staanrequired: truehidden: false
4 :
type: buttonid: 6-5value: een of ander knoplabel: button labelplaceholder: zou er niet moeten staanrequired: truehidden: false
meta :
buttonTitle: button titelbuttonType: buttondisabled: falsetheme: secondaryinvert: false
meta :
duoColumn: false

Source Code

e-form.vue
<script setup lang="ts">
import { computed, ref } from 'vue';

import { EFormModel, Theme, EConnectFormThemes, ValueUpdate } from 'types';

import EHeader from '../e-header/e-header.vue';
import EFormSection from '../e-form-section/e-form-section.vue';
import EDivider from '../e-divider/e-divider.vue';
import ESubmitButton from '../e-submit-button/e-submit-button.vue';

export type Props = {
  model: EFormModel;
  submitText?: string;
  theme?: Theme | EConnectFormThemes;
};
const props = withDefaults(defineProps<Props>(), {
  submitText: 'submit',
  theme: Theme.Default
});

const emit = defineEmits<{
  (e: 'update:value', data: ValueUpdate): void;
  (e: 'submit', event: SubmitEvent): void;
}>();

const formRef = ref<HTMLFormElement>();

const formClasses = computed(() => {
  return [props.theme];
});

function emitUpdate(data: ValueUpdate): void {
  emit('update:value', data);
}
</script>

<template>
  <div class="e-form-container">
    <form
      ref="formRef"
      class="e-form"
      :class="formClasses"
    >
      <div
        v-if="model.title || model.icon"
        class="e-form-header"
      >
        <e-header
          :icon="model.icon"
          :text="model.title"
        />
      </div>

      <div
        class="e-form-content"
        :class="{
          'has-dividers': model.hasDividers
        }"
      >
        <template
          v-for="(section, key) in model.sections"
          :key="key"
        >
          <e-form-section
            :model="section"
            @update:value="emitUpdate"
          />

          <e-divider
            v-if="model.hasDividers"
            :theme="section.theme"
          />
        </template>
      </div>

      <div class="e-form-footer">
        <slot name="footer">
          <div class="default-form-footer">
            <e-submit-button
              :form="formRef"
              :text="submitText"
              :name="submitText"
              @submit="emit('submit', $event)"
            />
          </div>
        </slot>
      </div>
    </form>
  </div>
</template>

<style scoped lang="scss">
@mixin add-form-theme($background-color: var(--e-white)) {
  & {
    background-color: $background-color;
  }
}

.e-form {
  width: 100%;
  border-radius: 15px;
  box-shadow: 7px 7px 7px 1px var(--e-box-shadow-color);
  padding: 50px 40px 50px 40px;

  .e-form-header {
    margin: 0;
  }

  .e-form-content {
    display: flex;
    flex-direction: column;
    gap: 15px;

    .e-divider {
      margin: 0;
    }

    &.has-dividers {
      > :last-child {
        display: none;
      }
    }
  }

  .e-form-footer {
    .default-form-footer {
      display: flex;
      justify-content: flex-end;
      padding: 10px 0 0 0;
      gap: 10px;
    }
  }

  @include add-form-theme();

  &.primary {
    @include add-form-theme(var(--e-primary-blockquote-background));
  }

  &.secondary {
    @include add-form-theme(var(--e-secondary-blockquote-background));
  }

  &.accent {
    @include add-form-theme(var(--e-accent-blockquote-background));
  }

  &.violet {
    @include add-form-theme(var(--e-violet-blockquote-background));
  }

  &.red {
    @include add-form-theme(var(--e-red-blockquote-background));
  }

  &.gray {
    @include add-form-theme(var(--e-gray-blockquote-background));
  }
}
</style>
Last Updated:: 10/22/24, 1:04 PM
Contributors: Antony Elfferich, Roeland Krijgsman, AzureAD\MarcelLommers, Justin Berghahn, Marcel Lommers
Prev
Form Field