defmodule AshHqWeb.Pages.Home do @moduledoc "The home page" use Surface.LiveComponent alias AshHqWeb.Components.{CalloutText, CodeExample, Feature, SearchBar} alias Surface.Components.Form alias Surface.Components.Form.{Field, Submit, TextInput} import AshHqWeb.Components.CodeExample, only: [to_code: 1] import AshHqWeb.Tails prop(device_brand, :string) data(signed_up, :boolean, default: false) data(email_form, :any) data(theme, :atom, default: :default) def render(assigns) do ~F"""
Model your domain,
Build applications with a tool-chain.
<:description> building blocks that scale with the complexity of your application. <:icon> <:description> Easily create rich, customizable, full featured backed by Absinthe. <:icon> <:description> Create JSON:API spec compliant apis in , not days. <:icon> alt-curly <:description> Effortless authentication with and out of the box. <:icon> <:description> Add row and field level policies to to data. <:icon> <:description> for splitting your application by tenant. <:icon> <:description> Postgres, Ets, Mnesia, CSV and <:icon> <:description> A you can drop right into your application. <:icon> <:description> A suite of tools for you to extensions and DSLs. <:icon> """ end attr(:class_overrides, :string, default: "") def testimonial(assigns) do ~F"""

"{@text}"

{@author}

{@title}

""" end def mount(socket) do {:ok, assign( socket, signed_up: false, email_form: AshPhoenix.Form.for_create(AshHq.MailingList.Email, :create, api: AshHq.MailingList, upsert?: true, upsert_identity: :unique_email ) )} end def handle_event("toggle-theme", _, socket) do if socket.assigns.theme == :default do {:noreply, assign(socket, :theme, :dark)} else {:noreply, assign(socket, :theme, :default)} end end def handle_event("validate_email_form", %{"form" => form}, socket) do {:noreply, assign(socket, email_form: AshPhoenix.Form.validate(socket.assigns.email_form, form))} end def handle_event("submit_email_form", _, socket) do case AshPhoenix.Form.submit(socket.assigns.email_form) do {:ok, _} -> {:noreply, assign(socket, :signed_up, true)} {:error, form} -> {:noreply, assign(socket, email_form: form)} end end @changeset_example """ post = Example.Post.create!(%{ text: "Declarative programming is fun!" }) Example.Post.react!(post, %{type: :like}) Example.Post |> Ash.Query.filter(likes > 10) |> Ash.Query.sort(likes: :desc) |> Example.read!() """ |> to_code() defp changeset_example do @changeset_example end @live_view_example """ def mount(_params, _session, socket) do form = AshPhoenix.Form.for_create(Example.Post, :create) {:ok, assign(socket, :form, form)} end def handle_event("validate", %{"form" => input}, socket) do form = AshPhoenix.Form.validate(socket.assigns.form, input) {:ok, assign(socket, :form, form)} end def handle_event("submit", _, socket) do case AshPhoenix.Form.submit(socket.assigns.form) do {:ok, post} -> {:ok, redirect_to_post(socket, post)} {:error, form_with_errors} -> {:noreply, assign(socket, :form, form_with_errors)} end end """ |> to_code() defp live_view_example do @live_view_example end @graphql_example """ graphql do type :post queries do get :get_post, :read list :feed, :read end mutations do create :create_post, :create update :react_to_post, :react end end """ |> to_code() defp graphql_example do @graphql_example end @policies_example """ policies do policy action_type(:read) do authorize_if expr(visibility == :everyone) authorize_if relates_to_actor_via([:author, :friends]) end end """ |> to_code() defp policies_example do @policies_example end @notifier_example """ pub_sub do module ExampleEndpoint prefix "post" publish_all :create, ["created"] publish :react, ["reaction", :id] event: "reaction" end """ |> to_code() defp notifier_example do @notifier_example end @aggregate_example """ aggregates do count :likes, :reactions do filter expr(type == :like) end count :dislikes, :reactions do filter expr(type == :dislike) end end calculations do calculate :like_ratio, :float do expr(likes / (likes + dislikes)) end end """ |> to_code() defp aggregate_example do @aggregate_example end @post_example """ defmodule Example.Post do use Ash.Resource, data_layer: AshPostgres.DataLayer resource do description "A post is the primary sharable entity in our system" end postgres do table "posts" repo Example.Repo end attributes do attribute :text, :string do allow_nil? false description "The body of the text" end attribute :visibility, :atom do constraints [ one_of: [:friends, :everyone] ] description "Which set of users this post should be visible to" end end actions do update :react do argument :type, Example.Types.ReactionType do allow_nil? false end change manage_relationship( :type, :reactions, type: :append ) end end relationships do belongs_to :author, Example.User do allow_nil? true end has_many :reactions, Example.Reaction end end """ |> to_code() defp post_example do @post_example end end