# ⚡ Motor Admin ⚡
Low-code Admin panel and Business intelligence Rails engine **(no DSL - configurable from the UI)**.
🤓 [Demo App](https://motor-admin.herokuapp.com/demo) | 👀 [Features overview](https://www.youtube.com/watch?v=ngVoci8Hll4&list=PLu7llEMh0KcOkR3Uy_RJT0cXPZQKAYVsq&index=1) | ⭐ [Pro](https://www.getmotoradmin.com/pro)
[](https://motor-admin.herokuapp.com/demo)
## Installation
Add this line to your application's Gemfile:
```ruby
gem 'motor-admin'
```
And then execute:
```bash
$ bundle install
```
Create and run migration:
```bash
$ rails motor:install && rake db:migrate
```
## Features
* [Customizable CRUD](#customizable-crud)
* [Custom actions](#custom-actions)
* [Virtual attributes](#virtual-attributes)
* [Forms builder](#forms-builder)
* [SQL queries](#sql-queries)
* [Data visualization](#data-visualization)
* [Dashboards](#dashboards)
* [Email alerts](#email-alerts)
* [Authorization](#authorization)
* [Intelligence search](#intelligence-search)
* [I18n](#i18n)
* [Optimized for mobile](#optimized-for-mobile)
* [Configurations sync between environments](#configurations-sync)
* [Authentication](#authentication)
## [Pro](https://www.getmotoradmin.com/pro)
* Multiple databases support
* Audit log
* Live collaboration
* Multi-factor authentication
* Custom styling
* Personalized report alerts via Slack
* Full-text search
* Stripe integration
* Shareable forms and reports
* [learn more](https://www.getmotoradmin.com/pro)
### Customizable CRUD


Everything in the admin panel can be configured using the intuitive settings UI, which can be opened via the icon in the top right corner.
Data displayed on the resource page can be completely customized via [SQL queries](#sql-queries) and [dashboards](#dashboards) attached to the resource as a tab. Usually, queries used to display resource data should contain `{{resource_name_id}}` [variable](#sql-queries).
[Learn more about resource customizations](https://github.com/motor-admin/motor-admin-rails/blob/master/guides/customizing_resource_table.md)
### Custom Actions

Custom resource actions can be added via Active Record method call, API endpoint, or [custom forms](#forms-builder). Also, it's possible to override default create/update/delete actions.
### Virtual attributes
Any ActiveRecord model method or attribute can be exposed to the admin panel by adding a new column with the name that matches the method name from the resource model:
```ruby
class Customer < ApplicationRecord
has_many :orders
def lifetime_value
orders.sum(&:total_price)
end
end
```

### Forms Builder

Values from the form fields can be used in API path via `{field_name}` syntax: `/api/some-endpoint/{resource_id}/apply`.
[Learn more about custom forms builder](https://github.com/motor-admin/motor-admin-rails/blob/master/guides/building_custom_forms.md)
### SQL Queries

Queries can include embedded variables via `{{variable}}` syntax ([mustache](https://mustache.github.io)). `{{#variable}} ... {{/variable}}` syntax allows to decide if conditions inside the scope should be included in the query.
### Data Visualization

Data from the SQL query can be represented as: [table](https://motor-admin.herokuapp.com/demo/queries/12), [number](https://motor-admin.herokuapp.com/demo/queries/6), [line chart](https://motor-admin.herokuapp.com/demo/queries/3), [bar chart](https://motor-admin.herokuapp.com/demo/queries/1), [pie chart](https://motor-admin.herokuapp.com/demo/queries/9), [funnel](https://motor-admin.herokuapp.com/demo/queries/7), [markdown](https://motor-admin.herokuapp.com/demo/queries/8)
### Dashboards

SQL queries can be organized into dashboards to create a convenient representation of the data.
### Email Alerts

Query data can be sent via email periodically using the alerts feature. Interval of the alert email can be specified using natural language, e.g., `every day at midnight`, `every Monday at 8 PM`, `every weekday at 6AM and 6PM`, `every minute`.
Sender address can be specified using `MOTOR_ALERTS_FROM_ADDRESS` environment variable.
### Intelligence Search

Intelligence search can be opened via the top right corner button or using Cmd + P shortcut.
### Authorization
Motor Admin allows to set row-level and column-level permissions via [cancan](https://github.com/CanCanCommunity/cancancan) gem. Admin UI permissions should be defined in `app/models/motor/ability.rb` file in `Motor::Ability` class. See [Motor Admin guide](https://github.com/motor-admin/motor-admin-rails/blob/master/guides/defining_permissions.md) and [CanCan documentation](https://github.com/CanCanCommunity/cancancan/blob/develop/docs/Defining-Abilities.md) to learn how to define user permissions.
### I18n
Motor Admin can use Rails ActiveRecord i18n keys to render resource translations:
```yml
es:
activerecord:
models:
customer:
one: Cliente
other: Clientes
attributes:
customer:
name: Nombre
scopes:
customer:
enabled: Activado
```
### Optimized for Mobile

### Configurations Sync
All admin panel configurations are automatically stored in the `config/motor.yml` file. It's recommended to include this file in the application git repository to always have the admin panel configurations in sync across different local and remote environments.
It's possible to sync local development admin panel configurations with remote production application via `rake motor:sync` task:
```bash
MOTOR_SYNC_REMOTE_URL=https://remote-app-url/ MOTOR_SYNC_API_KEY=secure-random-string rake motor:sync
```
## Authentication
Admin panel can be secured with 'Basic authentication' by specifying `MOTOR_AUTH_USERNAME` and `MOTOR_AUTH_PASSWORD` environment variables.
Alternatively, it can be secured with [devise](https://github.com/heartcombo/devise/wiki/How-To:-Define-resource-actions-that-require-authentication-using-routes.rb) or any other authentication library used by the application:
```ruby
authenticate :admin_user do
mount Motor::Admin => '/admin'
end
```
## Development
Start webpack dev server:
```bash
yarn install && yarn serve
```
Setup development database:
```bash
rake app:db:create && rake app:db:setup
```
Start example application in development mode:
```bash
MOTOR_DEVELOPMENT=true rails s
```
## License
The gem is available as open source under the terms of the [MIT License](https://github.com/motor-admin/motor-admin-rails/blob/master/LICENSE).