A rapid admin generator for Elixir & Phoenix
Torch is a rapid admin generator for Phoenix applications. It creates custom templates and relies on the Phoenix HTML generator under the hood.
To install Torch, perform the following steps:
torchto your list of dependencies in
mix.exs. Then, run
mix deps.get:
def deps do [ {:torch, "~> 3.4"} ] end
Plug.Staticplug to your
endpoint.ex:
plug( Plug.Static, at: "/torch", from: {:torch, "priv/static"}, gzip: true, cache_control_for_etags: "public, max-age=86400" )
config.exs.
config :torch, otp_app: :my_app_name, template_format: "eex" || "slime"
mix torch.install
NOTE: You can also choose to use
slimetemplates, but you will need to first install Phoenix Slime and then update your configuration to specify
template_format: "slime".
Now you're ready to start generating your admin! :tada:
Torch uses Phoenix generators under the hood. Torch injects it's own custom templates into your
priv/staticdirectory, then runs the
mix phx.gen.htmltask with the options you passed in. Finally, it uninstalls the custom templates so they don't interfere with running the plain Phoenix generators.
In light of that fact, the
torch.gen.htmltask takes all the same arguments as the
phx.gen.html, but does some extra configuration on either end. Checkout
mix help phx.gen.htmlfor more details about the supported options and format.
For example, if we wanted to generate a blog with a
Postmodel we could run the following command:
$ mix torch.gen.html Blog Post posts title:string body:text published_at:datetime published:boolean views:integer
The output would look like:
Add the resource to your browser scope in lib/my_app_web/router.ex:resources "/posts", PostController
Ensure the following is added to your endpoint.ex:
plug( Plug.Static, at: "/torch", from: {:torch, "priv/static"}, gzip: true, cache_control_for_etags: "public, max-age=86400", headers: [{"access-control-allow-origin", "*"}] )
:fire: Torch generated html for Posts! :fire:
Torch also installed an admin layout into your
my_app_web/templates/layout/torch.html.eex. You will want to update it to include your new navigation link:
There may be times when you are adding Torch into an already existing system where your application already contains the modules and controllers and you just want to use the Torch admin interface. Since the
torch.genmix tasks are just wrappers around the existing
phx.gentasks, you can use most of the same flags. To add an admin interface for
Postsin the previous example, where the model and controller modules already exist, use the following command:
$ mix torch.gen.html Blog Post posts --no-schema --no-context --web Admin title:string body:text published_at:datetime published:boolean views:integer
Torch does not support association filters at this time. Filtrex does not yet support them.
You can checkout these two issues to see the latest updates:
https://github.com/rcdilorenzo/filtrex/issues/55
https://github.com/rcdilorenzo/filtrex/issues/38
However, that does not mean you can't roll your own.
Example
We have a
Accounts.Usermodel that
has_many :credentials, Accounts.Credentialand we want to support filtering users by
credentials.email.
Accountsdomain.
# accounts.ex ... defp do_paginate_users(filter, params) do credential_params = Map.get(params, "credentials") params = Map.drop(params, ["credentials"])User |> Filtrex.query(filter) |> credential_filters(credential_params) |> order_by(^sort(params)) |> paginate(Repo, params, @pagination) end
defp credential_filters(query, nil), do: query
defp credential_filters(query, params) do search_string = "%#{params["email"]}%"
from(u in query, join: c in assoc(u, :credentials), where: like(c.email, ^search_string), group_by: u.id ) end ...
# users/index.html.eex
Note: You'll need to install & import
Maybeinto your views
{:maybe, "~> 1.0.0"}for the above
eexto work.
Torch generates two CSS themes you can use:
base.css&
theme.css. The base styles are basically bare bones, and the theme styles look like the screenshot above. Just change the stylesheet link in the
torch.html.eexlayout.
If you want to use the theme, but override the colors, you'll need to include your own stylesheet with the specific overrides.
Torch comes with
.pofiles for several locales. If you are using Torch and can provide us with translation files for other languages, please submit a Pull Request with the translation file. We'd love to add as many translations as possible.
If you wish to add your own customized translations, you can configure Torch to use your own custom
MessagesBackendand adding it in your Torch configuration settings in
config.exs. You can find the all messages that can be customized in the default i18n/backend.ex file.
If you are customizing a backend for a "standard" spoken language, please submit back a proper
.potranslation file for us to include in the official Torch releases so other users can take advantage.
Example
defmodule MyApp.CustomMessagesBackend do def message("Contains"), do: "** CUSTOM Contains **" def message("Equals"), do: "** CUSTOM Equals ****" def message("< Prev"), do: ""), do: "-->"You can add a fallback so it won't break with newly added messages or
messages you did not customize
def message(text), do: Torch.I18n.Backend.message(text) end
# config.exs config :torch, otp_app: :my_app_name, i18n_backend: MyApp.CustomMessagesBackend template_format: "eex" || "slime"