Skip to content

shurygindv/bs-rsuite-ui-react

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

ReasonML bindings for Rsuite UI React library

npm version bs rsuite ui CI

Official overview (bindings according it)

p.s bindings from an enthusiast πŸ™‚

Deprecated: https://www.npmjs.com/package/@sdv-studio/bs-rsuite-ui-react

use npm i bs-rsuite-ui-react instead npm i @sdv-studio/bs-rsuite-ui-react

Plans

  1. Cover all documented components βœ…
  2. Compare with official GitHub repo
  3. Check TODOs, fixes βŒ›
  4. Example project βœ…
  5. Improve DX (reuse, variants instead string as possible and etc.) βŒ›
  6. Tests, codegen

Roadmap

βœ… = done
πŸŒ“ = not full support (temp)
πŸ›‘ = unimplemented

Type Component Status
General <Button />; <ButtonGroup /> βœ…
General <Icon />; <IconButton /> βœ…
General <Tooltip /> βœ…
General <Popover />;<Whisper /> βœ…
General Alert module βœ…
General Notification module βœ…
General <Message /> βœ…
General <Loader /> βœ…
General <Modal /> βœ…
General <Drawer /> βœ…
General <Alert /> βœ…
General <Divider /> βœ…
General <Progress /> βœ…
General <Placeholder /> βœ…
:-: ------------------------------------
Navigation <Dropdown /> βœ…
Navigation <Nav /> βœ…
Navigation <Navbar /> βœ…
Navigation <Sidenav /> βœ…
Navigation <Steps /> βœ…
Navigation <Pagination /> βœ…
Navigation <Breadcrumb /> βœ…
:-: ------------------------------------ :-:
Data Entry <Form /> πŸŒ“
Data Entry <ControlLabel /> βœ…
Data Entry <FormGroup /> βœ…
Data Entry <FormControl /> βœ…
Data Entry <HelpBlock /> βœ…
Data Entry <Checkbox /> βœ…
Data Entry <Radio />; <RadioGroup /> βœ…
Data Entry <Input /> βœ…
Data Entry <InputNumber /> βœ…
Data Entry <AutoComplete /> βœ…
Data Entry <Toggle /> βœ…
Data Entry <InputPicker /> βœ…
Data Entry <TagPicker /> βœ…
Data Entry <SelectPicker /> βœ…
Data Entry <CheckPicker /> βœ…
Data Entry <Toggle /> βœ…
Data Entry <TreePicker /> βœ…
Data Entry <CheckTreePicker /> βœ…
Data Entry <Cascader /> βœ…
Data Entry <MultiCascader /> βœ…
Data Entry <DatePicker /> βœ…
Data Entry <DateRangePicker /> βœ…
Data Entry <Slider /> βœ…
Data Entry <Uploader /> βœ…
:-: ------------------------------------ :-:
Data Display <Avatar /> βœ…
Data Display <Badge /> βœ…
Data Display <Table /> + Cell/Column/Header βœ…
Data Display <Tree /> βœ…
Data Display <CheckTree /> βœ…
Data Display <Panel /> βœ…
Data Display <Timeline /> βœ…
Data Display <Tag />;<TagGroup/> βœ…
Data Display <List /> βœ…
Data Display <Calendar /> βœ…
Data Display <Carousel /> βœ…
:-: ------------------------------------ :-:
Layout <Grid />; <Row />; <Col /> βœ…
Layout <FlexboxGrid /> βœ…
Layout <Container /> βœ…
:-: ------------------------------------ :-:
Utils <Animation /> βœ…
Utils <Portal /> βœ…
Utils Schema module πŸ›‘
Utils DOMHelper module βœ…
:-: ------------------------------------ :-:
Undocumented <SafeAnchor /> βœ…

Installation

I. Add bs-rsuite-ui-react binding as dependency

npm i bs-rsuite-ui-react
or
yarn add bs-rsuite-ui-react
or
yarn add "https://github.com/shurygindv/bs-rsuite-ui-react.git"

II. Also we need to say bsb: heey, look! Seems, bs-rsuite-ui-react perfectly complements you, let's add it to bs-dependencies

...somewhere in your bsconfig.json:

  ...
      "bs-dependencies": [
        "reason-react",
        ...,
        "bs-rsuite-ui-react"
    ],
  ...

III. We would be to see a sea of colors, sky and sun, there are two ways to achieve it, import:

LESS

[%bs.raw {|require('rsuite/lib/styles/index.less')|}];

or as plain CSS

[%bs.raw {|require('rsuite/dist/styles/rsuite-default.css')|}];

Usage

All bindings are in RsuiteUi namespace, let's try! Some examples

Notification

 RsuiteUi.Notification._open(props); // props is RsuiteUi.Notification.Props.t
 RsuiteUi.Notification.closeAll();

 RsuiteUi.Notification.success(RsuiteUi.Notification.Props.make(
   ~title = React.string("I'm title"),
   ~description = React.string("I'm desc"),
   ~placement="bottomStart",
   ()
 ));

CheckPicker

 let item = RsuiteUi.RsuiteTypes.DataItemType.make(
  ~value = "value",
  ~label = React.string("value"),
  ()
 );

 <RsuiteUi.CheckPicker data={[|item|]} />

Animation

  let (isVisible, setVisibility) = React.useState(_ => false);

  React.useEffect0(_ => {
    Js.Global.setTimeout(_ => {
      setVisibility(_ => true);
    }, 200);
    None
  });

  <RsuiteUi.Animation.Bounce
    _in={isVisible}
  >
    <div>
      {React.string("look at me")}
    </div>
  </RsuiteUi.Animation.Bounce>

Table

  let items = [|{
    "name": "some name",
    "description": "some description"
  }, {
    "name": "some name",
    "description": "some description"
  }|];

  // where `dataKey` is keyof items (<Table.Cell dataKey={..}>)
  RsuiteUi.(
      <Table
          height={420}
          data={items}
          onSortColumn={(sortColumn, _sortType) => {
            Js.log(sortColumn);
          }}
        >
          <Table.Column width={50} align=`center>
            <Table.HeaderCell>
              {React.string("Name")}
            </Table.HeaderCell>

            <Table.Cell dataKey="name" />
          </Table.Column>

          <Table.Column width={100} flexGrow={2}>
            <Table.HeaderCell>
               {React.string("Description")}
            </Table.HeaderCell>

            <Table.Cell dataKey="description" />
          </Table.Column>
      </Table>
    );

Modal

  <RsuiteUi.Modal show={true}>
      <RsuiteUi.Modal.Header>
         {React.string("Header")}
      </RsuiteUi.Modal.Header>

       <RsuiteUi.Modal.Title>
         {React.string("Title")}
      </RsuiteUi.Modal.Title>

       <RsuiteUi.Modal.Body>
        {React.string("Body")}
      </RsuiteUi.Modal.Body>

      <RsuiteUi.Modal.Footer>
       {React.string("Footer")}
      </RsuiteUi.Modal.Footer>
  </RsuiteUi.Modal>

Caveats

I. Next components: <MultiCascader />, <Cascader />, <DatePicker />, Notification module have _open prop instead open

Example:

  <MultiCascader _open={true} />
  <Cascader _open={true} />
  <DatePicker _open={true} />


   Notification._open(...); // instead Notification.open()

II. _in instead in prop

   <RsuiteUi.Animation.Bounce _in={isVisible} />

   <RsuiteUi.Animation.Transition _in={isVisible} />

   <RsuiteUi.Animation.Slide _in={isVisible} />

III. Similar situation with <FlexboxGrid />; Sometimes we would be to use prop justify with end value, but we should use end_ instead

Example

  <FlexboxGrid justify=`end_ />
  <FlexboxGrid justify=`spaceAround />
  <FlexboxGrid justify=`center />

Contributions

It would be great, make our world better! All contributions are welcomed.

FAQ (just to save time...)

1. How can we pass Component as prop?

2. What the different between ReasonReact.string and React.string?

3. How can we pass string as child?

  • Use React.string("example") instead "example"

4. What _type, _open, _val, _in mean as Component prop?

5. Why do we use an array structure instead of a immutable list everywhere?

  • ReasonML lists are represented as nested 2-element arrays in JavaScript (an encoding of cons pairs).

And many other useful details about Reason React here! See: https://github.com/reasonml/reason-react/tree/master/docs

Good luck! πŸ™‚