npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

form-stepper

v1.2.1

Published

form stepper with formik and material ui

Downloads

7

Readme

Form Stepper Component Library

A dynamic and customizable form stepper component library built with React and TypeScript. This library allows users to define form steps and fields through a configuration object, and it generates the corresponding forms automatically.

Table of Contents

Installation

Install the package via NPM or Yarn:

npm install from-stepper

or

yarn add form-stepper

Usage

Here's an example of how to use the `FormStepper` component from this package:

import { FormStepper, IFormInitialValues, ITab } from "form-stepper";
import * as yup from "yup";
const tabs: ITab[] = [
  {
    name: "First Tab",
    fields: [
      {
        label: "Text Field",
        name: "text_field",
        type: "text",
        initialValues: "Sample text",
        validations: yup.string().required("Text field is required"),
        disabled: false,
        hidden: false,
        info: "Enter some text",
        imageExample: "https://via.placeholder.com/150",
      },
      {
        label: "Number Field",
        name: "number_field",
        type: "number",
        initialValues: 42,
        validations: yup.number().required("Number field is required"),
        info: "Enter a number",
      },
      {
        label: "Email Field",
        name: "email_field",
        type: "email",
        validations: yup
          .string()
          .email("Invalid email format")
          .required("Email field is required"),
        info: "Enter your email address",
      },
      {
        label: "Password Field",
        name: "password_field",
        type: "password",
        validations: yup.string().required("Password field is required"),
        info: "Enter your password",
      },
      {
        label: "Date Field",
        name: "date_field",
        type: "date",
        initialValues: new Date(),
        validations: yup.date().required("Date field is required"),
        info: "Select a date",
      },
      {
        label: "Time Field",
        name: "time_field",
        type: "time",
        validations: yup.string().required("Time field is required"),
        info: "Select a time",
      },
      {
        label: "Select Field",
        name: "select_field",
        type: "select",
        options: ["Option 1", "Option 2", "Option 3"],
        validations: yup.string().required("Select field is required"),
        info: "Select an option",
      },
      {
        label: "Radio Field",
        name: "radio_field",
        type: "radio",
        options: ["Option A", "Option B", "Option C"],
        validations: yup.string().required("Radio field is required"),
        info: "Select an option",
      },
      {
        label: "Checkbox Field",
        name: "checkbox_field",
        type: "checkbox",
        options: ["Option X", "Option Y", "Option Z"],
        validations: yup
          .array()
          .of(yup.string())
          .min(1, "Select at least one option"),
        info: "Select one or more options",
      },
      {
        label: "Textarea Field",
        name: "textarea_field",
        type: "textarea",
        validations: yup.string().required("Textarea field is required"),
        info: "Enter text",
      },
      {
        label: "Multi-Select Field",
        name: "multi_select_field",
        type: "multi-select",
        options: ["Option 1", "Option 2", "Option 3"],
        validations: yup
          .array()
          .of(yup.string())
          .min(1, "Select at least one option"),
        info: "Select one or more options",
      },
      {
        label: "File Upload Field",
        name: "file_upload_field",
        type: "file",
        validations: yup.mixed().required("File upload field is required"),
        info: "Upload a file",
        maxFileSize: 1024 * 1024, // 1MB
        supportedFormats: ["image/jpeg", "image/png"],
        fileUploadText: "Upload your file",
        fileRemoveText: "Remove the file",
      },
      {
        label: "Multi-Input Field",
        name: "multi_input_field",
        type: "multi-input",
        validations: yup
          .array()
          .of(yup.string())
          .min(1, "Enter at least one input"),
        info: "Enter multiple inputs",
        maxInputFields: 5,
      },
      {
        label: "Autocomplete Field",
        name: "autocomplete_field",
        type: "auto-complete",
        options: ["Option 1", "Option 2", "Option 3"],
        validations: yup.string().required("Autocomplete field is required"),
        info: "Start typing to see suggestions",
      },
      {
        label: "Conditional Select Field",
        name: "conditional_select_field",
        type: "conditional-select",
        options: ["Option 1", "Option 2", "Option 3"],
        validations: yup
          .string()
          .required("Conditional select field is required"),
        info: "Select an option",
      },
      {
        label: "Search Field",
        name: "search_field",
        type: "search",
        validations: yup.string().required("Search field is required"),
        info: "Enter search term",
        searchHandler: (search) => console.log(search),
        searchDebounceMs: 300,
      },
    ],
  },
  {
    name: "Second Tab",
    fields: [
      {
        label: "Username",
        name: "username",
        type: "text",
        validations: yup.string().required("Username is required"),
        info: "Enter your username",
      },
    ],
  },
];

const handleSubmit = (values: IFormInitialValues) => {
  console.log(values);
};
const messageHandler = (message: string) => {
  alert(message);
};

function App() {
  return (
    <>
      <FormStepper
        tabs={tabs}
        submitFunction={handleSubmit}
        submitText="Submit"
        nextText="Next"
        useCache={true}
        messageHandler={messageHandler}
      />
    </>
  );
}

export default App;

Configuration

The `FormStepper` component takes a configuration object that defines the tabs and fields for the form. The configuration object should follow this structure:

interface IField {
  label: string;
  name: string;
  type: string;
  initialValues?: any;
  options?: any[];
  validations?: any;
  disabled?: boolean;
  hidden?: boolean;
  info?: string;
  imageExample?: string;
  fileUploader?: (file: File) => void;
  fileDelete?: (fileUrl: string) => void;
  maxFileSize?: number;
  supportedFormats?: string[];
}

interface ITab {
  name: string;
  fields: IField[];
}

interface IForm {
  tabs: ITab[];
  submitFunction: (values: any) => void;
  messageHandler?: (message: string) => void;
  submitText?: string;
  nextText?: string;
  useCache?: boolean;
}

Components

FormStepper

The `FormStepper` component dynamically generates form steps based on the provided configuration object.

Props

| Prop Name | Type | Description | | ------------------ | ------------ | ----------------------------------------- | | `tabs` | `ITab[]` | An array of tab objects containing fields | | `submitFunction` | `function` | Function to handle form submission | | `messageHandler` | `function` | Function to handle messages | | `submitText` | `string` | Text for the submit button | | `nextText` | `string` | Text for the next button | | `useCache` | `boolean` | Whether to use cache for form values |

DynamicField

The `DynamicField` component renders different form fields based on the field type.

Props

| Prop Name | Type | Description | | ------------------ | --------------------------- | ----------------------------------------------------------------- | | label | string | The label for the field. | | name | string | The name identifier for the field. | | type | IFieldTypes | The type of the field (e.g., text, number, email, etc.). | | initialValues | IFieldInitalValues | The initial value(s) for the field. | | options | IFieldOptions[] | Array of options for select, radio, or similar fields. | | validations | yup.AnySchema | Validation schema for the field using Yup. | | disabled | boolean | If true, the field will be disabled. | | hidden | boolean | If true, the field will be hidden. | | info | string | Additional information or tooltip text for the field. | | imageExample | string | URL to an image example related to the field. | | fileUploader | (file: File) => void | Function to handle file uploads for file-type fields. | | fileDelete | (fileUrl: string) => void | Function to handle file deletion for file-type fields. | | searchHandler | (search: string) => void | Function to handle search queries for search-type fields. | | searchDebounceMs | number | Debounce delay in milliseconds for the search handler. | | maxInputFields | number | Maximum number of input fields allowed for multi-input fields. | | maxSelectFields | number | Maximum number of select options allowed for multi-select fields. | | fileUploadText | string | Custom text to display during file upload for file-type fields. | | fileRemoveText | string | Custom text to display for file removal for file-type fields. | | maxFileSize | number | Maximum file size allowed for file-type fields (in bytes). | | supportedFormats | string[] | Array of supported file formats for file-type fields. |

Field Components

Each field component is dynamically rendered by the `DynamicField` component based on the type specified in the configuration.

FormMultiSelectField

A multi-select field component.

FormAutocompleteField

An autocomplete field component.

FormMultiInputField

A multi-input field component.

FormFileUploadField

A file upload field component.

FormConditionalSelectField

A conditional select field component.

FormAsyncSearchField

An async search field component.

FormRadioField

A radio button field component.

FormTextField

A text input field component.

Utilities

  • `generateValidationSchema.ts`: Utility to generate validation schemas for the form fields.
  • `generateInitialValues.ts`: Utility to generate initial values for the form fields.
  • `localStorageUtils.ts`: Utility to handle local storage for form values.

Contributing

Contributions are welcome! Please open an issue or submit a pull request for any changes.

License

This project is licensed under the MIT License.