Nota: Esta versión se ha actualizado para admitir tanto Ecto 1.1 como Ecto 2.0. Consulte Instalación para obtener más información.
ExAdmin es un paquete de administración automática para Elixir y Phoenix Framework, una adaptación/inspiración de ActiveAdmin para Ruby on Rails.
Consulte la demostración en vivo. El código fuente se puede encontrar en ExAdmin Demo.
Consulte esta demostración en vivo adicional para ver ejemplos de relaciones de muchos a muchos, atributos anidados y autenticación.
Consulte los documentos y la Wiki para obtener más información.
ExAdmin es un complemento para una aplicación que utiliza Phoenix Framework para crear una herramienta de administración CRUD con poco o ningún código. Al ejecutar algunas tareas de mezcla para definir qué modelos Ecto desea administrar, tendrá algo que funciona sin código adicional.
Antes de utilizar ExAdmin, necesitará un proyecto Phoenix y un modelo Ecto creado.
Agregue ex_admin a sus departamentos:
mezcla.exs
los departamentos de defp hacen... {:ex_admin, "~> 0.8"}, ... fin
mezcla.exs
los departamentos de defp hacen ... {:ex_admin, github: "smpallen99/ex_admin"}, ... fin
Agregue alguna configuración de administrador y los módulos de administración al archivo de configuración
config/config.exs
configuración: ex_admin, repositorio: MiProyecto.Repo, módulo: MiProyecto, # MiProyecto.Web para Phoenix >= 1.3.0-rc módulos: [MyProject.ExAdmin.Dashboard, ]
Obtener y compilar la dependencia.
mix do deps.get, deps.compile
Configurar ExAdmin:
mix admin.install
Agregar las rutas de administrador
web/enrutador.ex
defmodule MyProject.Router hacer utilizar MyProject.Web, :enrutador utilizar ExAdmin.Router ... alcance "/", MiProyecto hacer... fin # configurar las rutas ExAdmin en /admin alcance "/admin", ExAdmin dopipe_through :browseradmin_routes() fin
Agregar la configuración de paginación
lib/mi_proyecto/repo.ex
defmodule MyProject.Repo use Ecto.Repo, otp_app: :my_projectuse Scrivener, page_size: 10 fin
Edite su archivo brunch-config.js y siga las instrucciones que el instalador adjuntó a este archivo. Esto requiere que copie 2 bloques y reemplace los bloques existentes.
Inicie la aplicación con iex -S mix phoenix.server
Visita http://localhost:4000/admin
Deberías ver la página del Panel predeterminada.
Para agregar un modelo, use la tarea mixta admin.gen.resource
:
mix admin.gen.resource MyModel
Agregue el nuevo módulo al archivo de configuración:
config/config.exs
configuración: ex_admin, repositorio: MiProyecto.Repo, módulo: Mi Proyecto, módulos: [MyProject.ExAdmin.Dashboard,MyProject.ExAdmin.MyModel, ]
Inicie el servidor Phoenix nuevamente y vaya a http://localhost:4000/admin/my_model
Ahora puede enumerar/agregar/editar/eliminar MyModel
s.
ExAdmin utilizará los conjuntos de cambios de su esquema. De forma predeterminada, llamamos a la función changeset
en su esquema, aunque puede configurar el conjunto de cambios que usamos para actualizar y crear por separado.
conjunto de cambios personalizado:
defmodule TestExAdmin.ExAdmin.Simple hacer utilizar ExAdmin.Register Register_resource TestExAdmin.Simple doupdate_changeset:changeset_updatecreate_changeset:changeset_create final
Admitimos muchos a muchos y tenemos muchas relaciones según lo dispuesto por Ecto. Recomendamos usar cast_assoc para relaciones de muchos a muchos y put_assoc para relaciones con muchos. Puede ver conjuntos de cambios de ejemplo en nuestros esquemas de prueba.
Cuando pasamos resultados de un formulario para relaciones, aplicamos cierta coerción para que sea más fácil trabajar con ellos en su conjunto de cambios. Para las casillas de verificación de colección, pasaremos una serie de identificadores de opciones seleccionadas a su conjunto de cambios para que pueda obtenerlos y usar put_assoc como se ve aquí.
Para admitir muchas eliminaciones, necesita configurar un atributo virtual en su esquema. En el esquema relacionado deberá agregar un atributo virtual _destroy para que podamos rastrear la propiedad de destrucción en el formulario. También necesitarás incluir esto en tu conjunto de cambios. A continuación se muestra un conjunto de cambios de ejemplo. En este escenario, un usuario tiene muchos productos y los productos se pueden eliminar. También tenemos muchos roles asociados.
defmodule TestExAdmin.Usuario hacer importar Ecto.Changeset utilizar Ecto.Schema importar Ecto.Query esquema "usuarios" dofield :nombre, :stringfield :correo electrónico, :stringfield :activo, :booleano, predeterminado: truehas_many :productos, TestExAdmin.Product, on_replace: :deletemany_to_many :roles, TestExAdmin.Role, join_through: TestExAdmin.UserRole, on_replace: :borrar fin @fields ~w(nombre de correo electrónico activo) def conjunto de cambios(modelo, params %{}) domodel|> cast(params, @fields)|> validar_required([:correo electrónico, :nombre])|> cast_assoc(:productos, requerido: falso)|> add_roles(params) fin def add_roles(changeset, params) doif Enum.count(Map.get(params, :roles, [])) > 0 do ids = params[:roles] roles = TestExAdmin.Repo.all(desde r en TestExAdmin.Role, donde: r.id en ^ids) put_assoc(conjunto de cambios, :roles, roles)de lo contrario conjunto de cambios endenddefmodule TestExAdmin.Role hacer utilizar Ecto.Schema importar Ecto.Changeset alias TestExAdmin.Repo esquema "roles" dofield :nombre, :stringhas_many :uses_roles, TestExAdmin.UserRolemany_to_many :usuarios, TestExAdmin.User, join_through: TestExAdmin.UserRole fin @campos ~w(nombre) def conjunto de cambios(modelo, params %{}) domodel|> cast(params, @fields) endenddefmodule TestExAdmin.Product hacer utilizar Ecto.Schema importar Ecto.Changeset esquema "productos" dofield :_destroy, :boolean, virtual: truefield :title, :stringfield :price, :decimalbelongs_to :user, TestExAdmin.User fin def changeset(schema, params %{}) doschema|> cast(params, ~w(precio del título user_id))|> validar_required(~w(precio del título))|> mark_for_deletion fin defp mark_for_deletion(changeset) do# Si se configuró eliminar y es verdadero, cambiemos la acciónif get_change(changeset, :_destroy) do %{changeset | acción: :eliminar}de lo contrario cambiar establecer tendencia final
Existe una buena publicación en el blog de Platformatec que describe cómo funcionan estas relaciones: http://blog.plataformatec.com.br/2015/08/working-with-ecto-associations-and-embeds/
Utilice el comando index do
para definir los campos que se mostrarán.
admin/mi_modelo.ex
defmodule MyProject.ExAdmin.MyModel hacer utilizar ExAdmin.Register Register_resource MyProject.MyModel doindex do selectable_column() columna :id columna :nombre acciones() # muestra el final de columna de acciones predeterminadas final
El siguiente ejemplo muestra cómo personalizar el formulario con la macro form
:
defmodule MyProject.ExAdmin.Contact hacer utilizar ExAdmin.Register Register_resource MyProject.Contact doform contact do inputs doinput contact, :first_nameinput contact, :last_nameinput contact, :emailinput contact, :register_date, escriba: Fecha # si usa Ecto :date escriba en su esquema de contacto de entrada, :categoría, colección: MyProject.Category .todas las entradas finales "Grupos" hacen entradas: grupos, como:: casillas de verificación, colección: MiProyecto.Grupo.todo final final
El siguiente ejemplo ilustra cómo modificar la página de presentación.
defmodule MyProject.ExAdmin.Question hacer utilizar ExAdmin.Register Register_resource MyProject.Question domenu prioridad: 3mostrar pregunta hacer atributos_table # mostrar los atributos predeterminados # crear un panel para enumerar las opciones de la pregunta panel "Opciones" dotable_for(question.choices) hacer columna :clave columna :nombreend fin final
La compatibilidad con tipos de campos personalizados se realiza en dos áreas: campos de representación y controles de entrada.
Utilice el protocolo ExAdmin.Render.to_string/
para tipos de representación que no son compatibles con ExAdmin.
Por ejemplo, para admitir la representación de una tupla, agregue el siguiente archivo a su proyecto:
# lib/render.exdefimpl ExAdmin.Render, para: Tupla do def to_string(tupla), hacer: inspeccionar(tupla)end
Utilice el elemento de configuración :field_type_matching
para establecer el tipo de entrada.
Por ejemplo, dado el siguiente proyecto:
defmodule ElixirLangMoscow.SpeakerSlug hacer utilice EctoAutoslugField.Slug, desde: [:nombre, :empresa], hasta: :slugenddefmodule ElixirLangMoscow.Speaker do utilizar ElixirLangMoscow.Web, :modelo utilizar Arc.Ecto.Model alias ElixirLangMoscow.SpeakerSlug esquema "altavoces" dofield :slug, SpeakerSlug.Typefield :avatar, ElixirLangMoscow.Avatar.Type final
Agregue lo siguiente a la configuración de su proyecto:
configuración: ex_admin, #... field_type_matching: %{ElixirLangMoscow.SpeakerSlug.Type => :cadena,ElixirLangMoscow.Avatar.Type => :archivo }
ExAdmin admite 2 temas. El nuevo tema AdminLte2 está habilitado de forma predeterminada. El antiguo tema ActiveAdmin también es compatible para aquellos que desean compatibilidad con versiones anteriores.
Para cambiar el tema a ActiveAdmin, haga lo siguiente en su archivo config/config.exs
:
config/config.exs
configuración: ex_admin, tema: ExAdmin.Theme.ActiveAdmin, ...
El tema AdminLte2 tiene varios colores de piel diferentes, incluidos azul, negro, morado, verde, rojo, amarillo, luz azul, luz negra, luz violeta, luz verde, luz roja y luz amarilla.
Para cambiar el color de la piel a, por ejemplo, violeta:
config/config.exs
configuración: ex_admin, color_piel: :púrpura, ...
Puede agregar un selector de temas en la parte superior derecha de la barra de menú agregando lo siguiente a su archivo config/config.exs
:
config/config.exs
configuración: ex_admin, theme_selector: [{"AdminLte", ExAdmin.Theme.AdminLte2},{"ActiveAdmin", ExAdmin.Theme.ActiveAdmin} ], ...
Puede anular el nombre de un modelo definiendo una función model_name/0
en el módulo. Esto es útil si desea utilizar un módulo diferente para algunas de sus acciones.
admin/mi_modelo.ex
def nombre_modelo hacer "nombre_personalizado"fin
ExAdmin deja el trabajo de autenticación a paquetes de terceros. Para ver un ejemplo del uso de Coherence, consulte el Proyecto de demostración de contacto.
Visite la Wiki para obtener más información sobre cómo agregar autenticación.
Agradecemos cualquier contribución a ExAdmin. Consulte nuestras guías CODE_OF_CONDUCT.md y CONTRIBUTING.md para obtener más información. Normalmente mantenemos una lista de características y errores en el rastreador de problemas.
Ejemplo detallado de demostración de ExAdmin
Para obtener un breve tutorial, visite el Tutorial de encuesta de Elixir
Demostración en vivo
Documentos
ex_admin
es Copyright (c) 2015-2016 E-MetroTel
El código fuente se publica bajo la licencia MIT.
Consulte LICENCIA para obtener más información.