/turbo_ecto

A rich ecto component, including search sort and paginate.

Primary LanguageElixirMIT LicenseMIT

Turbo Ecto

Build Status Coverage Status

Turbo is a very rich ecto component,including search sort and paginate. Inspiration by ruby ransack and learn from rummage_ecto

Phoenix support turbo_html, check this repos.

Table of contents

Getting started

  • The package can be installed by adding turbo_ecto to your list of dependencies in mix.exs:
def deps do
  [
    {:turbo_ecto, "~> 0.4.3"}
  ]
end
  • Add the Repo of your app and the desired per_page to the turbo_ecto configuration in config.exs:
config :turbo_ecto, Turbo.Ecto,
  repo: MyApp.Repo,
  per_page: 10

You can also define other configurations with entry_name and pagenate_name in config.exs.

Examples

  • Category Table Structure

    Field Type Comment
    name string
  • Product Table Structure

    Field Type Comment
    name string
    body text
    price float
    category_id integer
    available boolean
  iex> params = %{"q" => %{"name_and_category_name_like" => "elixir"}, "s" => "inserted_at+asc", "per_page" => 20}

  iex> Turbo.Ecto.turbo(Turbo.Ecto.Product, params)
  %{
    datas: [%Turbo.Ecto.Product{}],
    paginate: %{
      current_page: 10,
      next_page: 11,
      per_page: 20,
      prev_page: 9,
      total_count: 100,
      total_pages: 20
    }
  }

  iex> params2 = %{"filter" => %{"name_like" => "elixir"}, "sort" => "inserted_at+asc"}}
  iex> Turbo.Ecto.turbo(Turbo.Ecto.Product, params2, [entry_name: "entries"])
  %{
    entries: [%Turbo.Ecto.Product{}],
    paginate: %{}
  }

More example pls move: docs

Search Matchers

List of all possible search_types

Predicate Description Finish Note
*_eq equal Y (SQL: col = 'value')
*_not_eq not equal Y (SQL: col != 'value')
*_lt less than Y (SQL: col < 1024)
*_lteq less than or equal Y (SQL: col <= 1024)
*_gt greater than Y (SQL: col > 1024)
*_gteq greater than or equal Y greater than or equal. (SQL: col >= 1024)
*_present not null and not empty Y Only compatible with string columns. Example: q[name_present]=1 (SQL: col is not null AND col != '')
*_null is null true or false Y (SQL: col is null or col is not null)
*_in match any values in array Y e.g. q[name_in][]=Alice&q[name_in][]=Bob (SQL: name in ('Alice', 'Bob'))
*_like Contains value Y (SQL: col LIKE '%value%')
*_ilike Contains any of Y (SQL: col ILIKE '%value%')
*_true is true or false Y (SQL: col is true or col is false)
*_between begin < between < end Y e.g. q[price_between][]=100&q[price_between][]=200 (SQL: 100 <= price <= 200)

Demo

The dummy app shows a simple turbo_ecto example.

Clone the repository.

https://github.com/zven21/turbo_ecto.git

Change directory

$ cd dummy

Run mix

$ mix deps.get && yarn --cwd=assets

Preparing database

$ mix ecto.setup

Start the Phoenix server

$ ./script/server

Open your browser, and visit http://localhost:4000

Contributing

Bug report or pull request are welcome.

Make a pull request

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request

Please write unit test with your code if necessary.

License

The gem is available as open source under the terms of the MIT License.

Credits