rectangular-forms
TypeScript icon, indicating that this package has built-in type declarations

1.0.27 • Public • Published

RectAngular Forms

This library adapt Angular Reactive Forms to being use on React. This library depends on rxjs.

Installation

npm install rxjs --save

npm install rectangular-forms --save

Basic Example

import { useEffect } from "react";
import {
  FormControl,
  FormGroup,
  useFormConfig,
  WControlData,
  WForm,
  WFormControl,
} from "rectangular-forms";

export const Basic = () => {
  const formConfig = useFormConfig({
    createForm: (data) => {
      const form = new FormGroup({
        name: new FormControl(),
        lastname: new FormControl(),
        document: new FormGroup({
          type: new FormControl(),
          number: new FormControl(),
        }),
      });
      form.patchValue(data);
      return form;
    },
  });
  const { loadSucceed } = formConfig;

  useEffect(() => {
    loadSucceed({
      name: "Jhon",
      lastname: "Doe",
      document: {
        type: "PASSPORT",
        number: "2345656",
      },
    });
  }, [loadSucceed]);

  return (
    <WForm formConfig={formConfig}>
      <WControlData />
      {/* <WControlData/> show the data of this context */}

      <WFormControl name="name">
        {({ control }) => {
          const { value, onChange, onBlur, disabled } = control;
          return (
            <input
              value={value || ""}
              onChange={onChange}
              onBlur={onBlur}
              disabled={disabled}
            />
          );
        }}
      </WFormControl>

      <WFormControl name="type.document">
        {({ control }) => {
          const { value, onChange, onBlur, disabled } = control;
          return (
            <input
              value={value || ""}
              onChange={onChange}
              onBlur={onBlur}
              disabled={disabled}
            />
          );
        }}
      </WFormControl>
    </WForm>
  );
};

Array With Nested Object Example

import { useEffect } from "react";
import {
  FormArray,
  FormControl,
  FormGroup,
  useFormConfig,
  WControlData,
  WForm,
  WFormArrayElement,
  WFormControl,
  WFormGroup,
} from "rectangular-forms";

const createLineForm = () => {
  const form = new FormGroup({
    price: new FormControl(),
    quantity: new FormControl(),
  });
  return form;
};

export const Input = (props) => {
  const { control } = props;
  const { value, onChange, onBlur, disabled } = control;
  return (
    <input
      value={value || ""}
      onChange={onChange}
      onBlur={onBlur}
      disabled={disabled}
    />
  );
};

export const Array = () => {
  const formConfig = useFormConfig({
    createForm: (data) => {
      const lines: FormGroup[] = [];
      for (let index = 0; index < data.lines.length; index++) {
        lines.push(createLineForm());
      }
      const form = new FormGroup({
        name: new FormControl(),
        lastname: new FormControl(),
        document: new FormGroup({
          type: new FormControl(),
          number: new FormControl(),
        }),
        lines: new FormArray(lines),
      });
      form.patchValue(data);
      return form;
    },
  });
  const { loadSucceed } = formConfig;

  useEffect(() => {
    loadSucceed({
      name: "Jhon",
      lastname: "Doe",
      document: {
        type: "PASSPORT",
        number: "2345656",
      },
      lines: [
        { price: 2, quantity: 20 },
        { price: 4, quantity: 10 },
      ],
    });
  }, [loadSucceed]);

  return (
    <WForm formConfig={formConfig}>
      <WControlData />
      {/* <WControlData/> show the data of this context */}
      <WFormControl name="name">
        <Input />
      </WFormControl>

      <WFormControl name="type.document">
        <Input />
      </WFormControl>

      <table>
        <thead>
          <th>quantity</th>
          <th>price</th>
          <th>Add Line</th>
          <th>Remove Line</th>
        </thead>
        <tbody>
          <WFormArrayElement name="lines">
            <tr>
              <td>
                <WFormControl name="quantity">
                  <Input />
                </WFormControl>
              </td>
              <td>
                <WFormControl name="price">
                  <Input />
                </WFormControl>
              </td>
              <td>
                <WFormGroup>
                  {/* here the context is implicit   */}
                  {({ control }) => {
                    return (
                      <button
                        onClick={() => {
                          const linesFormArray = control.parent as FormArray;
                          linesFormArray.push(createLineForm());
                        }}
                      />
                    );
                  }}
                </WFormGroup>
              </td>
              <td>
                <WFormGroup>
                  {/* here the context is implicit   */}
                  {({ control, index }) => {
                    return (
                      <button
                        onClick={() => {
                          const linesFormArray = control.parent as FormArray;
                          linesFormArray.removeAt(index);
                        }}
                      />
                    );
                  }}
                </WFormGroup>
              </td>
            </tr>
          </WFormArrayElement>
        </tbody>
      </table>
    </WForm>
  );
};

License

MIT

Versions

Current Tags

VersionDownloads (Last 7 Days)Tag
1.0.2713latest

Version History

VersionDownloads (Last 7 Days)Published
1.0.2713
1.0.260
1.0.250
1.0.240
1.0.232
1.0.220
1.0.210
1.0.200
1.0.190
1.0.181
1.0.170
1.0.162
1.0.150
1.0.140
1.0.130
1.0.122
1.0.110
1.0.100
1.0.90
1.0.80
1.0.70
1.0.60
1.0.50
1.0.40
1.0.30
1.0.20
1.0.10
1.0.00
0.1.00

Package Sidebar

Install

npm i rectangular-forms

Weekly Downloads

20

Version

1.0.27

License

MIT

Unpacked Size

1.04 MB

Total Files

157

Last publish

Collaborators

  • welldonesolutions-wds