Giter VIP home page Giter VIP logo

turbo_ecto's Introduction

Turbo Ecto

Build Status Coverage Status Module Version Hex Docs Total Download License Last Updated

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, "~> 1.0.1"}
  ]
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

Post 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",
      "page" = 0,
      "per_page" => 20
     }

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

The 2 more commonly used API are as follows:

Turbo.Ecto.turbo(queryable, params, opts \\ [])

  • 1 queryable: receives a schema object or an Ecto.Query.t() object

  • 2 params: supports 4 parameters.

    • q or filter to receive pattern matching information, e.g. params = %{"q" ⇒ %{"name_like" ⇒ "elixir"}} or params = %{"filter" ⇒ %{"name_like" ⇒ "elixir"}
    • s or sort Receive sort information. e.g. params = %{"sort" ⇒ "position+asc"} or params = %{"s" ⇒ "inserted_at+desc"}
    • page Receive query page number. e.g. params = %{"page" ⇒ 1}
    • per_page Receive the number of pages. e.g. params = %{"per_page" ⇒ 20}
  • 3 opts: currently receives the following information:

    • paginate_name: sets the pagination key value of the returned result
    • entry_name: sets the key value of the returned result object
    • prefix: table prefix
    • with_paginate: whether to include pagination information, default true
    • callback: callback processing for queryable

Turbo.Ecto.turboq(queryable, params, opts)

Returns an Ecto.Query.t() object

More example pls move: docs

Search Matchers

List of all possible search_types:

Predicate Description Note
*_eq equal SQL: col = 'value'
*_not_eq not equal SQL: col != 'value'
*_lt less than SQL: col < 1024
*_lteq less than or equal SQL: col <= 1024
*_gt greater than SQL: col > 1024
*_gteq greater than or equal SQL: col >= 1024
*_is_present not null and not empty Only compatible with string columns. e.g.: q[name_present ]=1 SQL: col is not null AND col != ''
*_is_null is null true or false SQL: col is null or col is not null
*_like contains value SQL: col LIKE '%value%'
*_ilike contains any of SQL: col ILIKE '%value%'
*_is_true is true or false SQL: col is true or col is false
*_is_not_true is true or false SQL: col is not true or col is false
*_is_false is true or false SQL: col is false
*_is_not_false is true or false SQL: col is not false
*_is_null is null SQL: col is nil
*_is_not_null is not null SQL: col is not nil
*_in match any values in array e.g.: q[name_in][]=Alice&q[name_in][]=Bob SQL: name in ('Alice', 'Bob')
*_not_in not contains SQL: col not in ('Alice', 'Bob')
*_start_with start with values SQL: col LIKE '%value'
*_not_start_with not start with values SQL: col not LIKE '%value'
*_end_with end with values SQL: col LIKE 'value%'
*_not_end_with not end with values e.g.: q[name_not_end_with][]=Alice SQL: col not LIKE 'value%'
*_between begin < between < end e.g.: q[price_between][]=100&q[price_between][]=200 SQL: 100 <= price and price <= 200)

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.

Copyright and License

Copyright (c) 2018 Zven Wang

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

Credits

turbo_ecto's People

Contributors

zven21 avatar dependabot-preview[bot] avatar zgohr avatar docjerem avatar kianmeng avatar redmar avatar vtm9 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.