ng-advanced-search

A search field with advaned options. Made for Angular, with Angular Material components.

Usage no npm install needed!

<script type="module">
  import ngAdvancedSearch from 'https://cdn.skypack.dev/ng-advanced-search';
</script>

README

ng-advanced-search

This is an Angular Component, made with Angular Material input elements that makes advanced filtering easy to use, both by the user and the code.

Example can be seen here

Features

It has two main parts:

  • Basic search
  • Advanced search

The basic search provides a simple text input for the user. With the advanced search the user can add a number of rules, each having the following properties:

  • The column to apply the rule on
  • Whether the rule should be negated
  • The rule criteria (contains, equals, larger than, smaller than)
  • The rule search-term

Additionally, the user can choose if the relationship between the rules should be AND or OR.

If an input array is provided for the component, it will apply the search terms on them, and provide the resulted array as an output array. Additionally, the component also outputs the search term, so a custom filter can be used.

When the filtering is left to the component, it behaves like so:

  • Basic search compares every property value of an array item (as a lowercase string), against the lowercase basic search term. If at least one property includes the search term, the item passes.
  • Advanced search compares the item property of the key chosen in the rule (as a lowercase string), against the rules search term. It compares them based on the criteries choosen for the rule. Depending on the relationship selected, the item passes if all or at least one rule passes.

The component also has some unused space, where custom elements can be used (eg: column-toggle buttons).

Usage

Install

The compoent can be installed from npm

npm install ng-advanced-search

Import

Add the component to your imports in app.module.ts:

import { NgAdvancedSearchModule } from 'ng-advanced-search';

@NgModule({
   imports: [
      ...
      NgAdvancedSearchModule,
      ...
   ],

Include dependency stylesheets

Add these lines to your styles.scss:

@import '../node_modules/bootstrap/scss/bootstrap.scss';
@import '../node_modules/@fortawesome/fontawesome-free/css/all.min.css';

Use

Add the component to your template:

   <ng-advanced-search [headers]="headers" [simpleFieldLabel]="Search items"
      [defaultTerm]="default" (selectedTerm)="termChanged($event)"
      [inputArray]="inputArray" (outputArray)="outputChanged($event)">

      Optional custom content

   </ng-advanced-search>

Inputs |Name|Type|Description|Required?| |----|----|-----------|---------| | headers | NgAsHeader[ ] | An array that defines what columns the user can choose from for advanced rules | Yes | | simpleFieldLabel | string | Placeholder text for the basic search term fiels | No | | defaultTerm | NgAsSearchTerm | Search terms to apply by default | No | | inputArray | any[ ] | Array to perform filtering on | No |

Outputs |Name|Type|Description| |----|----|-----------| | selectedTerm | NgAsSearchTerm | Search term applied by user | | outputArray | any[ ] | If an input array was provided, this will have the search term applied to it

Styling

The input fileds are Angular Material components, refer to that documentation for styling. The rest of the components use two colors, which can be overriden by inculding this in your styles.scss:

:root {
    --ngas-primary-color: [your-color-here];
    --ngas-danger-color: [your-color-here];
}

Types

export interface NgAsSearchTerm {
    searchMode: 'simple' | 'advanced';

    simpleSearchTerm: string;
    
    advancedSearchLink: 'and' | 'or';
    advancedTerms: NgAsAdvancedSearchTerm[];
}

export interface NgAsAdvancedSearchTerm {
    id: number;
    fieldName?: string;
    action?: 'contains' | 'equals' | 'larger than' | 'smaller than';
    searchTerm?: string;
    isNegated?: boolean;
}

export interface NgAsHeader {
    id: string;
    displayText: string;
}