@aibsweb/faceted-search-biccn
Version:
A generalized faceted search application. Used for BICCN
134 lines (98 loc) • 4.63 kB
Markdown
# Faceted Search #
A generalized faceted search for use across all of the allen institute sites. It has these components:
- data-table
- checkbox-filter
- filter-box-list
- filter-box
- text-search
- data-store-[and associated data stuff]
exports all data-store, data-tables, filter-box, text-search
## Setup ##
1. `git clone http://brandonb@stash.corp.alleninstitute.org/scm/aib/faceted-search.git`
1. `npm i`
2. `npm run start`
## Process ##
Please use pull requests when adding features or making changes.
If you need to update data-tables don't forget that it is used without faceted search in several places, so don't go breakin' things.
## Configuration ##
The FacetedSearch application uses a composite config to provide configuration values to each of the components in addition to providing the necessary information to make a query on that components behalf. The next few sections will detail each of the discreet configs within the composite.
const config = {
}
### Component Configs
Each component config within the root config should be defined following this pattern:
const config = {
'my-component': {
componentDefinition: 'my-component',
componentProp: 'prop-values'
}
}
componentDefinition: This is a reference to one of the definitions located in the componentDefinition file. This allows us to create different queryBuilder, dataTransform, and component compositions to support a wide variety of requests and data models.
componentProp: Using this config you can pass component props directly to the component. As an example:
const config = {
'counts': {
componentDefinition: 'counts',
position: 'right'
}
}
Here we're passing the property/value `position: 'right'` directly to the counts components indicating that it should render its individual counts from right to left.
_gotchas:_
* Providing a property named `data` will throw an error.
#### Network
The network section of the config is used to define how and where we make a graphql connections. Currently this contains only one value: `uri`
const config = {
'network': {
uri: 'http://my-graphql-server.org/'
}
}
#### Unit Counts
The unit counts section provides values indicating which units to watch and where to position the counts within the widget.
const config = {
'counts': {
componentDefinition: 'counts',
unitsToWatch: ['brains', 'cells'],
position: 'left'
},
}
componentDefinition: see Component Configs.
unitsToWatch: These are the units to request the counts for. I.e. Brains, cells, or whatever (future).
position: this property gets passed directly to the component and determines how the counts are arranged inside the component
#### Data Table
The data table takes in several properties that allow us to shape the table and indicate what it should display.
const config = {
'data-table': {
componentDefinition: 'data-table',
schema: [
{
column: 'Species',
type: 'string',
key: 'genusSpecies.name'
},
{
column: 'Grant',
type: 'string',
key: 'grant.name'
}
],
},
}
All of these properties can be found in the styleguide.
schema: This is a description of which columns to render such as data type, key, and friendly name.
order-by: no longer available here, this has been moved to the state store's config (see below)
data: static data is not supported by the faceted search
#### Filter Box
The Filter Box takes in several properties only one of which is available on the config.
const config = {
'filter-box': {
componentDefinition: 'filter-box',
showFilterTextSearch: true
}
}
showFilterTextSearch: A bool indicating if the user should be able to search the filters using a text box.
#### State Store
The state store allows you to specify a default ordering for query results
const config = {
'state-store': {
order-by: ['genusSpecies', 'grant', 'principalInvestigator', 'modality', 'technique']
}
}
orderBy: A list of graphql property names to sort by. This will act like SQL where whatever is in spot [0] takes precedence over anything with a higher indice value. Example: using the above `sort-by` mice will always be grouped and humans will always be grouped.