A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://docs.laravel-enso.com/backend/tables below:

Website Navigation


Tables | Laravel Enso

# Tables

Data Table package with server-side processing, unlimited exporting and VueJS components. Quickly build any complex table based on a JSON template.

This package can work independently of the Enso ecosystem.

The front end assets that utilize this API are present in the tables package.

For live examples and demos, you may visit laravel-enso.com

click on the photo to view a short demo in compatible browsers

click on the photo to view an export demo in compatible browsers

# Installation

Comes pre-installed in Enso.

To install outside of Enso:

  1. install the package composer require laravel-enso/tables

  2. if needed, publish and customize the config: php artisan vendor:publish --tag=tables-config

  3. install front end for the API implementation for the package - tables . Be sure to check out the front end's docs here .

# Features # In the future # Usage

The VueJS Data Table component works by pulling its configuration through an initialization request. After loading its configuration through that first request, it makes another request for pulling in its data, based on its configuration.

If UI changes occur that require the reload of the data (such as when searching, sorting, etc) or the loading of additional data, such as when changing to the next page of results, another request for data is made.

This means that the configuration is not re-read as long as the component is not re-drawn.

Note: In order to make the above requests, named routes are required.

Steps:

  1. Create the JSON table configuration template.

Example: permissions.json

  1. Create the init table controller which specifies which table builder class is to be used.

    Example: TableController.php

    Note the use of the Init trait that should be imported from the LaravelEnso\Tables package.

  2. Create the table data controller which is used to fetch the data for the front-end:

    Example: TableData.php

    The $tableClass value used here is the same as the one from the previous step.

    Note the use of the Data trait that should be imported from the LaravelEnso\Tables package.

  3. OPTIONAL: If you plan to have the data from the table exportable from the interface, you may create a third controller used in this case:

  4. Create the table builder class, which must implement the Table contract, thus requiring the query() and the templatePath() methods.

    In the example below we're using a pattern where we're also utilizing a $templatePath constant for better readability as well as making it easier to extend the class, if required.

Example: PermissionTable

  1. Declare the route(s) in your routes file, to make available your controller's methods

    Example: api.php

  2. Import and place place the VueTable VueJS component in your page/component and pass it the necessary properties. Within the Enso ecosystem, you may use instead the EnsoTable component which requires fewer parameters as it uses Enso specific defaults.

EnsoTable example: index.vue

VueTable example: index.blade.php

# Advanced Usage

For most use cases, if you want to filter the results in your tables, it is enough to add the desired columns in your template, mark them as searchable, and start typing in the UI search box.

In a similar fashion, if you want to compute totals for numeric columns, mark the desired columns as having totals and you're set.

For both cases, totals are applied, results are filtered and the row count is properly computed.

For more complex scenarios, where you might need to alter the query depending on other parameters, use complicated raw queries, etc. there are optional interfaces available for the table builder class.

# CustomFilter

There will be cases when you'll want to add filters for a table and perform a query with extra clauses, depending on what the user chooses for those filters.

You could, conditionally build your main table query (the one from your query() method) depending on what parameters you get in your request, but in that case the Tables package logic wouldn't know you're actually applying a filter, since you'd be modifying the query; as consequence, the reported count would be incorrect.

The proper way to apply filters is to have your builder class implement the CustomFilter interface, and the two required methods:

The filterApplies(Obj $params): bool method receives the $params property from the request and should check return true when filters are to be applied.

For example:

The filter(Builder $query, Obj $params) receives the resulted query builder from the main query() method as well as the request params, and should be used to actually add the filters.

For example:

# RawTotal

The RawTotal interface demands the implementation of the rawTotal(Obj $column): string public method.

The method should return a raw query string that would compute the desired total.

The Tables logic will then use this query string and apply it at the proper moment in the data request lifecycle.

Note that in this case, you'll also want to add the "rawTotal" value to the "meta" section of you column's json configuration template.

# AuthenticatesOnExport

The AuthenticatesOnExport marker interface is to be used on table builder classes where it is mandatory to have available the user requesting the export within the export flow. This could be useful in cases where the export is different depending on the principal user.

# DynamicTemplate

The DynamicTemplate interface demands the implementation of the cachePrefix(): string method and is to be used on table builder classes where the utilized template depends on other factors, such as the principal user, and where you want to show different sets of data.

This is required when caching the template because it would mean that the cached template would be available for all users irrespective of what columns they otherwise should or should not see.

# Configuration

The package comes with a publishable configuration file which you may update in order to fit your project requirements. The various options are explained below.

# cache

A few cache-related options are available:

If using caching, please also take a look at the Advanced Usage / DynamicTemplate section above so that you don't run into any data security issues.

# validations

is a string, values may be always/local/yourEnvironment, default local. When parsing the template, the given options are validated because we want to avoid misconfiguration leading to unexpected results. It makes sense to run the validator just during development, however, if you want to also run it in production, you may configure that here.

# dtRowId

is a string, default is 'id'. This is the id attribute's name used internally by the table package, and is required for routing and actions.

# labels

is an array of options for the header names of the implicit columns. Note that these labels are also translated if a translation function is given to the VueJS component, through the i18n parameter. Options:

is an array of numbers, default [10, 15, 20, 25, 30] representing the pagination options for the table. For each table's JSON template, the lengthMenu parameter is also available, and, if given, it will have higher priority over the global configuration. This allows for some tables to have a different pagination than the default.

# buttons

is an array of button configurations, with 2 types:

# style

is an array of style configurations, with 3 sections:

# controls

is an array, with the types of controls available for all tables. By default all controls are present:

# export

is an array of configuration options for exporting the contents of a file. Note: The export process takes into account your current sorting and filtering. Also keep in mind that the export uses Jobs and Queues hence the need for a couple of the following options.

Available options:

# queues

Here you may configure the queues used for the export process: Available options:

# dateFormat

is a string, default 'd-m-Y', the date format for date columns, which will be used when displaying date values

# debounce

is a number, default 350, the interval value used for the server-side requests (in milliseconds)

# fullInfoRecordLimit

is a numeric limit, default 1000000, representing the top result set limit beyond which the computation of the filtered & totals functionality becomes disabled by default and is made available on-demand.

# responsive

is a boolean, default true, determines if the table is responsive (automatically hides columns when its width it wider than available)

# method

is a string, default is 'GET', values can be either 'GET' or 'POST'. If you're working with larger tables sometimes the URI can get too long and you may run into a 414 Exception. This option allows to configure the request method for fetching data in a local table. If specified in the table template, the local value will have higher priority over the global configuration.

# dataRouteSuffix

is a string, default is 'tableData', the data route suffix used for all tables. Similar to fullInfoRecordLimit, you may override the global configuration by specifying this same parameter in the 'local' table template.

# comparisonOperator

is a string, default is 'LIKE', the default comparison operator used when searching. You may override the global configuration by specifying this same parameter in the 'local' table template. Valid values are LIKE, ILIKE.

# searchModes

is an array, default is ['full', 'startsWith', 'endsWith'], configures the type of searching available to the user when typing a search string into table's search box.

# searchMode

is a string, default is 'startsWith', represents the default search mode and must be enabled in the above configuration. It can be overridden within each 'local' table template.

# Template

Options:

# Buttons

There are several type of buttons, depending on how you classify them.

By configuration:

By position:

By action:

The most common configuration options for buttons are, as follows:

Depending on the chosen options, other parameters could be required:

# Columns

The columns configuration attribute is required, and expects an array of configuration objects. Each configuration object may have the following attributes:

# The name attribute and nested properties

Since the 1.5.7 package version, it has become possible to use nested models properties for the name attribute. For example, for the users table template , you could update the entity section to:

and in the table builder class update the select query to:

You may notice a few things here:

# Notes on exporting (Excel)

The new exporting feature used in this package allows for the export of practically unlimited number or rows (or, to be more accurate, the number of rows is limited by the xlsx format).

In order to achieve this, Laravel queues, jobs and mails are used, so it is mandatory to:

Enso provides this in its current state, with the mention that you, as user, don't have to remain on the exporting page until is done. Once the export is ready you receive both push/toastr and email notifications.

To download the generated export:

# The query

In your Table implementation, the query must look like this:

Keep in mind that at this stage, we're returning a QueryBuilder not a collection of results.

If you need custom logic based on the request, you may declare a constructor for your class, with the following signature, where you'll have access to the various data you may need:

The type of the above parameters is LaravelEnso\Helpers\app\Classes\Obj;

# Actions

While you may have action buttons on each table row, sometimes you may wish to have custom actions, for the entire result set of the table.

It is important to note that the action will be applied for ALL the FILTERED results, even the ones that might not be visible on the current page of the table (if there is more than one page).

Also, keep in mind that if the selectable option is active in table template, the selection is decoupled from the actions, so, same as before, the action is applied to all the filtered table results.

# In-depth example - global custom action

In order to achieve this functionality, we've included an example below, where we add a new button for the owners table:

  1. Update your table JSON template, to include the button(s) for the action(s)

Customize the attributes as required, keeping in mind:

Note that, if needed, you may define several buttons in a similar fashion.

  1. Add a route for your new action and configure its permissions:
  1. Add a new Action implementation class, where you actually process the results.

This needs to extend the abstract LaravelEnso\Tables\app\Services\Action class, and implement the process method. The process method will be called for each available row of data.

Depending on your requirements, you may do the processing here or even generate jobs that will do the processing asynchronously.

  1. Add a new controller for the action

The controller manages the VueJS component's action request. You require:

Note that you may also reuse your TableData if you prefer and have only one 'action' for a given table.

# Additional Advanced Details

The Action trait defines an action method that is a bit of a wrapper, and looks like this:

If for any reason you want to handle more than one action through the same controller, you may declare multiple actionClasses and create multiple action methods in conjunction with the proper routes.

1.Add the new route

Remember to place the route nested correctly, considering the possible uri and route name prefixes, as well as the controller namespace.

In this example, the url called for the UserGroups table will be 'system/permissions/myAction' and the name of the route will be 'system.permissions.myAction'.

  1. Create the new permission. Navigate in the app to system/permissions and add the new system/permissions/myAction permission.

That's it.

# The default action button

If you take a look the package config file, you'll notice that there already is a global action button defined. If you want to use it, you make skip the definition of a button at #1 step above, instead just declare "action" and continue with the other steps, taking into account the changed suffix (the route and permissions need to be altered).

# Defining reusable action buttons

Similarly to the default action button, you may define other 'global' action buttons in the datable configuration, that can then be used as needed in any table templates in your project.

# In-depth example - per row custom action

A common scenario is when you want to define a per row custom action, on top of the default ones.

Most of the time, you'll want to perform the custom action for the model that's represented on the row so you'll need to be able to identify the model. For that, you can use the id attribute.

If you're displaying data gathered from multiple tables, make sure that the identifiers you require are present in the select and in the template. If you don't want to display them to the user, you may use rogue columns.

In this example, we'll assume id is sufficient.

  1. Build the query in the table builder

  2. Declare the custom action button in the template:

We've named the event details.

Remember that the icon you set for the custom action button must be available (imported) in the page (component) where you're displaying the datatable.

  1. In the page, catch the event on the datatable Vue component:
  1. Process the event as desired:

The event payload is the entire table row, so you have access to the id and any other attributes you've added.

# Configurable huge result set management

When you have huge result sets, the table component will take longer to respond to the user input. In order to improve the user experience, when we have more results than the limit set in the configuration (in the fullInfoRecordLimit key), the back-end builder no longer computes the number of filtered records and totals for that table.

However, a blue information icon becomes available in the list of table buttons, which allows the user to request this computed information.

Since this is an extreme case with big tables and is a seldom situation, the configuration for the limit is global.

# Caching support

We've had cases in production where we need to work with over 2 million results and every performance bit we can get is welcome.

When the table displays data, if we want to show pagination, we need to execute the main query twice: once to retrieve the current chunk of data, and then once more to count the results.

By caching the number of results we can skip counting the results and save time for each request. The more records you work with, the bigger the gain the difference.

Once activated, on the next request, if the total count information is not in the cache, it will be computed and also cached.

In order to activate this feature, as well as configure the other related options, you should review the the cache paragraph from the above configuration section.

You should always use this only in combination with the TableCache trait on the table's main model. The trait will handle the cache invalidation when a model is created or deleted. To do so just add the trait.

# (Row) Preview support

There might be cases where you need to optionally display extra information related to a row, render a preview representation or something similar.

For such cases, you may activate the table row's preview functionality by adding the "preview": true option in the table's template.

This will activate the preview table column, where you can add your own content, via the preview slot:

In the snippet above we're just printing the row but you can obviously add your own logic or components.

Note that the preview row is also used when the table contents (columns) does not fit the browser. When the preview row is already active and you're also adding your own content via the slot, the custom content is added after the other columns.

# Further Examples

You may see the vue data table in action, with the code for the UserGroups page, right here:

Feel free to look around at the various packages in the laravel-enso repository, to find more examples.

# Commands

If using the caching functionality (see the cache notes from the Configuration section), you should add this command to one of your production deployment stages so as to ensure the latest template versions are used after deploy.

# Publishes # External dependencies # Contributions

are welcome. Pull requests are great, but issues are good too.

# License

This package is released under the MIT license.


RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4