We have updated Flexmonster Software License Agreement, effective as of September 30, 2024. Learn more about what’s changed.
All documentation
  • Introduction
  • Connecting to data source
    1. Supported data sources
    2. Connecting to other data sources
  • Browser compatibility
  • Documentation for older versions
  • Implementing the server filter

    The server filter can be used to limit which data is shown on the grid depending on custom filtering conditions received from Flexmonster Pivot. It allows filtering the data right on the application’s back end, so Flexmonster Pivot receives and shows only the subset of the data that meets filtering conditions.

    In this guide, we describe the concept of the server filter and its structure, and provide an example implementation.

    Note Knowledge of core C# concepts is required to fully understand this guide.

    The general idea of the server filter

    The main advantage of the server filter is that it can be used as a data access management tool. Using the server filter, Flexmonster.DataServer.Core.dll will filter the data based on custom filtering conditions received from Flexmonster Pivot.

    Here is a possible server-side filtering implementation:

    1. When Flexmonster Pivot sends a request for data to the server, custom conditions can be included in the request headers with customizeAPIRequest. This method allows editing the headers before the request is sent to the server.
    2. After the Data Server accepts the request, the request headers can be read. Depending on the received conditions and their values, the DLL can apply the appropriate filter to the data.
    3. The resulting subset of data is sent to Flexmonster Pivot. The component gets the dataset specific to the sent conditions and values.

    To see how the server filter can be implemented, refer to the Example section.

    Example of a server filter

    To simplify the server filter’s implementation, we prepared a sample ASP.NET Core application using Flexmonster.DataServer.Core.dll. This application contains an example server filter, which filters data based on a user's role. The filter's implementation can be viewed in the FlexmonsterAPIController.cs file.

    To create a new ASP.NET Core application with the Data Server or to embed the DLL in an existing project, refer to the guide on Flexmonster.DataServer.Core.dll.

    Defining user roles on the server side

    In the sample, the data is filtered based on the user's region token sent by the component. A dictionary defines which subset of data should correlate to the received token. The dictionary contains all possible region tokens and field members corresponding to them:

    private static Dictionary<string, List<object>> _userPermissions =
    new Dictionary<string, List<object>>()
    {
    /* A user with the "AdminToken" token will see
    the report on all the countries */
    {"AdminToken", null },

    /* A user with the "EuropeToken" token will see
    details about Germany and France */
    {"EuropeToken", new List(){ "Germany","France" } },

    /* A user with the "AmericaToken" token will see
    highlights about USA and Canada */
    {"AmericaToken", new List(){ "USA","Canada" } },

    /* A user with the "AustraliaToken" token will see
    info about Australia */
    {"AustraliaToken", new List(){ "Australia" } },
    };

    See the full code on GitHub.

    Configuring the server filter

    In the sample project, the server filter is defined in a separate function. First, a user token is read from the request headers, and then the filter is applied:

    private ServerFilter GetServerFilter()
    {
    // Get the user token from the request headers
    HttpContext.Request.Headers.TryGetValue("UserToken", out StringValues userRole);
    if (userRole.Count == 1)
    {
    // Create a server filter
    ServerFilter serverFilter = new ServerFilter();
    // Specify a field to filter
    serverFilter.Field = new Field() {
    UniqueName = "Country",
    Type = ColumnType.stringType
    };
    // Include the members that correspond to the user token
    serverFilter.Include = _userPermissions[userRole[0]];
    return serverFilter;
    }
    return null;
    }

    To learn more about the server filter’s parameters and their types, see the server filter structure

    Applying the server filter

    After the filter is specified, it is passed as a parameter to GetMembers() and GetAggregatedData() methods, for example:

    public MembersResponse PostMembers([FromBody]MembersRequest request)
    {
    var response = _apiService.GetMembers(request, GetServerFilter());
    return new JsonResult(response);
    }

    Now the server will filter the data before sending it in the response.

    Note To apply several server filters, add them to an IEnumerable<ServerFilter> collection and pass it to GetMembers() or GetAggregatedData() methods.

    Sending user roles from the client side

    The user's region token is specified in the request headers using the customizeAPIRequest method for Flexmonster Pivot:

    const pivot = new Flexmonster({
    container: "pivotContainer",
    componentFolder: "https://cdn.flexmonster.com/",
    toolbar: true,
    report: report,
    customizeAPIRequest: (req) => {
    req.requestHeaders = {
    "UserToken": $("#country").val()
    };
    return req;
    }
    });

    See the full code on GitHub.

    The server filter structure

    The server filter has the following structure:

    public class ServerFilter
    {
    public Field Field { get; set; }
    public List<object> Include { get; set; }
    public List<object> Exclude { get; set; }
    }

    Below is a detailed description of the filter parameters:

    Parameter/TypeDescription
    Field
    Field
    The field to filter. If a non-existent field is specified, Flexmonster.DataServer.Core.dll throws an exception.
    Include
    List<object>
    Field members to include in the server’s response.
    Exclude
    List<object>
    Field members to exclude from the server’s response.

    Here is an example of how the server filter can be created:

    ServerFilter serverFilter = new ServerFilter();
    serverFilter.Field = new Field() {
    UniqueName = "Country",
    Type = ColumnType.stringType
    };
    serverFilter.Include = new List<object>(){ "USA", "Canada" };

    What's next?

    You may be interested in the following articles: