import { AbstractControl, UntypedFormBuilder, FormsModule, ReactiveFormsModule, ValidationErrors, ValidatorFn, Validators, } from "@angular/forms"; import { Meta, moduleMetadata, Story } from "@storybook/angular"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { AsyncActionsModule } from "../async-actions"; import { ButtonModule } from "../button"; import { CheckboxModule } from "../checkbox"; import { IconButtonModule } from "../icon-button"; import { InputModule } from "../input/input.module"; import { RadioButtonModule } from "../radio-button"; import { SelectModule } from "../select"; import { I18nMockService } from "../utils/i18n-mock.service"; import { BitFormFieldComponent } from "./form-field.component"; import { FormFieldModule } from "./form-field.module"; export default { title: "Component Library/Form/Field", component: BitFormFieldComponent, decorators: [ moduleMetadata({ imports: [ FormsModule, ReactiveFormsModule, FormFieldModule, InputModule, ButtonModule, IconButtonModule, AsyncActionsModule, CheckboxModule, RadioButtonModule, SelectModule, ], providers: [ { provide: I18nService, useFactory: () => { return new I18nMockService({ selectPlaceholder: "-- Select --", required: "required", inputRequired: "Input is required.", inputEmail: "Input is not an email-address.", }); }, }, ], }), ], parameters: { design: { type: "figma", url: "https://www.figma.com/file/Zt3YSeb6E6lebAffrNLa0h/Tailwind-Component-Library?node-id=1881%3A17689", }, }, } as Meta; const fb = new UntypedFormBuilder(); const formObj = fb.group({ test: [""], required: ["", [Validators.required]], }); const defaultFormObj = fb.group({ name: ["", [Validators.required]], email: ["", [Validators.required, Validators.email, forbiddenNameValidator(/bit/i)]], terms: [false, [Validators.requiredTrue]], updates: ["yes"], }); // Custom error message, `message` is shown as the error message function forbiddenNameValidator(nameRe: RegExp): ValidatorFn { return (control: AbstractControl): ValidationErrors | null => { const forbidden = nameRe.test(control.value); return forbidden ? { forbiddenName: { message: "forbiddenName" } } : null; }; } function submit() { defaultFormObj.markAllAsTouched(); } const Template: Story = (args: BitFormFieldComponent) => ({ props: { formObj: defaultFormObj, submit: submit, ...args, }, template: `
Label Optional Hint
`, }); export const Default = Template.bind({}); Default.props = {}; const RequiredTemplate: Story = (args: BitFormFieldComponent) => ({ props: { formObj: formObj, ...args, }, template: ` Label FormControl `, }); export const Required = RequiredTemplate.bind({}); Required.props = {}; const HintTemplate: Story = (args: BitFormFieldComponent) => ({ props: { formObj: formObj, ...args, }, template: ` FormControl Long hint text `, }); export const Hint = HintTemplate.bind({}); Required.props = {}; const DisabledTemplate: Story = (args: BitFormFieldComponent) => ({ props: args, template: ` Label `, }); export const Disabled = DisabledTemplate.bind({}); Disabled.args = {}; const GroupTemplate: Story = (args: BitFormFieldComponent) => ({ props: args, template: ` Label $ USD `, }); export const InputGroup = GroupTemplate.bind({}); InputGroup.args = {}; const ButtonGroupTemplate: Story = (args: BitFormFieldComponent) => ({ props: args, template: ` `, }); export const ButtonInputGroup = ButtonGroupTemplate.bind({}); ButtonInputGroup.args = {}; const DisabledButtonInputGroupTemplate: Story = ( args: BitFormFieldComponent ) => ({ props: args, template: ` Label `, }); export const DisabledButtonInputGroup = DisabledButtonInputGroupTemplate.bind({}); DisabledButtonInputGroup.args = {}; const SelectTemplate: Story = (args: BitFormFieldComponent) => ({ props: args, template: ` Label `, }); export const Select = SelectTemplate.bind({}); Select.args = {}; const AdvancedSelectTemplate: Story = (args: BitFormFieldComponent) => ({ props: args, template: ` Label `, }); export const AdvancedSelect = AdvancedSelectTemplate.bind({}); AdvancedSelectTemplate.args = {}; const TextareaTemplate: Story = (args: BitFormFieldComponent) => ({ props: args, template: ` Textarea `, }); export const Textarea = TextareaTemplate.bind({}); Textarea.args = {};