main

mattermost/focalboard

Last updated at: 28/12/2023 01:42

filterGroup.ts

TLDR

This file contains code for creating and manipulating filter groups. A filter group is a collection of filter clauses or other filter groups, which can be combined using logical operators 'and' or 'or'.

Methods

createFilterGroup

This method creates a filter group based on the provided object. The method takes an optional parameter o of type FilterGroup. If o is provided, the method creates a new filter group based on its values. If o is not provided or null, the method creates an empty filter group. The method recursively creates filter groups or filter clauses for each filter or group in the o object.

isAFilterGroupInstance

This is a helper function that checks if an object is an instance of FilterGroup. It returns true if the object has properties 'operation' and 'filters', indicating that it is a filter group.

END

// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import {FilterClause, createFilterClause} from './filterClause'

type FilterGroupOperation = 'and' | 'or'

// A FilterGroup has 2 forms: (A or B or C) OR (A and B and C)
type FilterGroup = {
    operation: FilterGroupOperation
    filters: Array<FilterClause | FilterGroup>
}

function isAFilterGroupInstance(object: (FilterClause | FilterGroup)): object is FilterGroup {
    return 'operation' in object && 'filters' in object
}

function createFilterGroup(o?: FilterGroup): FilterGroup {
    let filters: Array<FilterClause | FilterGroup> = []
    if (o?.filters) {
        filters = o.filters.map((p: (FilterClause | FilterGroup)) => {
            if (isAFilterGroupInstance(p)) {
                return createFilterGroup(p)
            }
            return createFilterClause(p)
        })
    }
    return {
        operation: o?.operation || 'and',
        filters,
    }
}

export {FilterGroup, FilterGroupOperation, createFilterGroup, isAFilterGroupInstance}