0.1.67 • Published 7 months ago

react-item-filters v0.1.67

Weekly downloads
-
License
MIT
Repository
-
Last release
7 months ago

React Item Filters

GitHub NPM Package Easily create components that offer product filtering in client side react. Created as a way to simply add filtering to a list of items. Currently only usable client side access with hooks.

Note: This is a hobby project in early stage. There is no doubt it has unexpected errors from unforseen edge cases. If you plan on using this, consider testing thoroughly with your use case.

Table of Contents

Installation

To install this React addon, you can use either npm or yarn. Run the following command in your project directory:

npm install react-item-filters

or

yarn add react-item-filters

Usage

Import the necessary components from the react-item-filters package and include them in your code. For example using the checkbox filter ...

import { useEffect, useState } from "react";
import {
  CheckboxFilterProps,
  FilterProvider,
  useCheckboxFilter,
  useFilter,
} from "react-item-filters/src";

function CheckboxElement(props: CheckboxFilterProps) {
  const [checked, setChecked] = useState(
    props.preloadedCheckedLabels.includes(props.label)
  );
  useEffect(() => {
    //must return a function to clear the event listeners or you will have memory leaks.
    const clearingFunction = props.subscribe("filterClear", () => {
      setChecked(false);
    });
    const updateClearFunction = props.subscribe("filterUpdate", () =>
      console.log("Filter updated.")
    );
    return () => {
      clearingFunction();
      updateClearFunction();
    };
  }, [props.onFilterClear]);
  return (
    <div>
      <input
        id={props.label}
        type="checkbox"
        onChange={(e) => {
          props.setChecked(props.label, checked);
        }}
      />
      <label htmlFor={props.label}>{props.label}</label>
    </div>
  );
}
function App() {
  const [products, setProducts] = useState([]);

  useEffect(() => {
    //fetch data
    setProducts(someData);
    //or
    setProducts([
      { color: "Red", weight: 0.2 },
      { color: "Blue", weight: 0.3 },
    ]);
  }, []);

  const checkboxSelectorFunction = (element) => element.color;

  const { filteredData, onFiltersCleared } = useFilter();

  const colorCheckboxes = useCheckboxFilter({
    selectorFunction: checkboxSelectorFunction,
    name: "ColorCheckboxFilter",
    prettyLabels: true,
    serializeToHistory: true,
  });

  const checkboxLabels = colorCheckboxes.labels ?? [];

  return (
    <FilterProvider initialData={products}>
      <div>
        <h1>Colors:</h1>
        {checkboxLabels.map((label) =>
          label ? (
            <CheckboxElement
              key={label}
              label={label}
              subscribe={colorCheckboxes.subscribe}
              setChecked={colorCheckboxes.setChecked}
              preloadedCheckedLabels={colorCheckboxes.preloadedCheckedLabels}
            />
          ) : null
        )}
      </div>
      <div>
        <h1>Item List</h1>
        {filteredData.map((e) => (
          <DataComponent data={e} />
        ))}
      </div>
    </FilterProvider>
  );
}

export default App;

Docs

Link to Documentation or can be generated using:

npm run docs

Plans

Future plans are to increase robustness and usability of the library and possibly add some other features like ...

  • Add range selector filter
  • Add sorting functionality

Contributing

Contributions are welcome! If you have any ideas, suggestions, or bug reports, please open an issue.

License

This project is licensed under the MIT License. Feel free to use and modify the code as per the terms of the license.

0.1.64

8 months ago

0.1.65

8 months ago

0.1.66

8 months ago

0.1.67

7 months ago

0.1.63

8 months ago

0.1.52

11 months ago

0.1.41

1 year ago

0.1.42

12 months ago

0.1.61

10 months ago

0.1.62

10 months ago

0.1.51

11 months ago

0.1.4

1 year ago

0.1.6

10 months ago

0.1.5

12 months ago

0.1.32

1 year ago

0.1.31

1 year ago

0.1.3

1 year ago

0.1.2

1 year ago

0.1.1

1 year ago

0.1.0

1 year ago