# listing-query-manager

> This utility allows you to handle repetitive tasks related to fetching data for listing: state management, url parsing, validation.

Latest version **1.2.0** (published 2017-01-27) · 0 weekly downloads

## Install

```sh
npm install listing-query-manager
pnpm add listing-query-manager
yarn add listing-query-manager
bun add listing-query-manager
```

## Health

**Score 15/100 (F)** — status: abandoned.

Positive: no vulnerabilities.

Warnings: low downloads; no types; no esm support.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 1.2.0 |
| Published | 2017-01-27 |
| First published | 2017-01-04 |
| Weekly downloads | 0 |
| TypeScript types | none |
| Module format | CommonJS |
| Dependencies | 5 |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Maintainers | nieziemski |

## Links

- npm: https://www.npmjs.com/package/listing-query-manager
- npm.io page: https://npm.io/package/listing-query-manager

## Dependencies (5)

- [react](https://npm.io/package/react.md) ^15.0.0 || ^0.14.0
- [lodash](https://npm.io/package/lodash.md) ^4.17.2
- [react-dom](https://npm.io/package/react-dom.md) ^15.0.0 || ^0.14.0
- [react-router](https://npm.io/package/react-router.md) next
- [simpl-schema](https://npm.io/package/simpl-schema.md) ^0.0.3

## Recent versions

- 1.2.0 (latest) — 2017-01-27
- 1.1.0 — 2017-01-17
- 1.0.0 — 2017-01-04

## README

# Listing Query Manager
This utility allows you to handle repetitive tasks related to fetching data for listing: state management, url parsing, validation. It keeps state in url, and transforms it to two additional formats:

1. Url - pretty and customizable formating
e.g.
```
    /my-listing?sort=created-desc&name=Donald%20T
```

2. Params - ready to pass as argument to server call. Only allowed fields will pass
e.g.
```javascript
    MyQuery.toQuery();
    // => {
    //     sort: 'created-desc',
    //     filter: {
    //         name: 'Donald T'
    //     }
    // }
```

2. Mongo query - ready to pass to mongo find(). Define your default regex pattern once and use it across whole project e.g.
```javascript
    MyQuery.toMongo();
    // => {
    //     sort: {
    //         createdAt: -1
    //     },
    //     filter: {
    //         name: {$regex: `^.*Donald T.*$`}
    //     }
    // }
```

# Usage
```javascript
import {QueryManager} from 'listing-query-manager';

// client and server: Define query
const ItemsQuery = QueryManager.define({
    filter: {
        title: 'regex',
        authorId: 'eq'
    },
    sort: {
        created: 'createdAt',
        title: 'title',
    }
});


// client: subscribe and get data
Meteor.subscribe('items', {
    query: ItemsQuery.toQuery()
}, function () {
    const {filter, sort} = ItemsQuery.toMongo();

    Items.find(filter, {sort});
});

// server: get data
Meteor.publish('items', function ({query}) {

    const {filter, sort} = ItemsQuery.toMongo({query});

    Items.find(filter, {sort});

    return cursor;
});

// client: handle sorting by render clickable labels
class Listing extends React.Component {
    render () {
        return (
            <ClickToSort name="name" queryParams={queryParams}>
                Name
            </ClickToSort>
            <ClickToSort name="createdAt" queryParams={queryParams}>
                Created At
            </ClickToSort>
        );
    }
}

// client: handle filtering

ItemsQuery.setFilter({
    name: 'Donald T'
});

```

# API
```javascript
// long form
Listing.define({
    filter: {
        name: ({name, value}) => {
            return {
                name: {$regex: `^.*${value}.*$`}
            }
        },
        itemId: ({name, value}) => {
            return {
                itemId: value
            }
        }
    },
    sort: {
        created: 'createdAt',
        title: 'title',
    }
});
```

---
_Source: https://npm.io/package/listing-query-manager · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
