diff --git a/core/frameworks/pixel/components/switch.ex b/core/frameworks/pixel/components/switch.ex new file mode 100644 index 000000000..f1483d7a1 --- /dev/null +++ b/core/frameworks/pixel/components/switch.ex @@ -0,0 +1,81 @@ +defmodule Frameworks.Pixel.Switch do + use CoreWeb, :live_component_fabric + use Fabric.LiveComponent + + alias Frameworks.Pixel + + # Handle Selector Update + @impl true + def update(%{active_item_id: status, selector_id: :selector}, socket) do + {:ok, socket |> update_status(status)} + end + + @impl true + def update( + %{id: id, on_text: on_text, off_text: off_text, opt_in?: opt_in?, status: status}, + socket + ) do + { + :ok, + socket + |> assign( + id: id, + on_text: on_text, + off_text: off_text, + opt_in?: opt_in?, + status: status + ) + |> compose_child(:selector) + } + end + + defp update_status(%{assigns: %{status: status}} = socket, new_status) + when status != new_status do + socket + |> assign(status: new_status) + |> send_event(:parent, "switch", %{status: new_status}) + end + + defp update_status(socket, _status) do + socket + end + + @impl true + def compose(:selector, %{ + id: id, + on_text: on_text, + off_text: off_text, + opt_in?: opt_in?, + status: status + }) do + off = %{id: :off, value: off_text, active: status == :off} + on = %{id: :on, value: on_text, active: status == :on} + + items = + if opt_in? do + [off, on] + else + [on, off] + end + + %{ + module: Pixel.Selector, + params: %{ + grid_options: "flex flex-row gap-8", + items: items, + type: :radio, + optional?: false, + parent: %{id: id, type: __MODULE__} + } + } + end + + @impl true + def render(assigns) do + ~H""" +
+ <.stack fabric={@fabric} /> +
+ """ + end +end diff --git a/core/priv/gettext/en/LC_MESSAGES/eyra-assignment.po b/core/priv/gettext/en/LC_MESSAGES/eyra-assignment.po index 299a60a4d..f00fd7731 100644 --- a/core/priv/gettext/en/LC_MESSAGES/eyra-assignment.po +++ b/core/priv/gettext/en/LC_MESSAGES/eyra-assignment.po @@ -94,14 +94,6 @@ msgstr "Settings" msgid "settings.data_storage.title" msgstr "Storage" -#, elixir-autogen, elixir-format -msgid "panel.title" -msgstr "Panel" - -#, elixir-autogen, elixir-format, fuzzy -msgid "panel.label" -msgstr "Select your panel" - #, elixir-autogen, elixir-format, fuzzy msgid "connect.button" msgstr "Set up connection" @@ -173,3 +165,19 @@ msgstr "
Copy the url below and hand it over to your contact person at I&O R #, elixir-autogen, elixir-format, fuzzy msgid "panel.liss.connection.annotation" msgstr "
Copy the url below and hand it over to your contact person at LISS. They use this url to send participants to this assignment.
" + +#, elixir-autogen, elixir-format +msgid "gdpr_form.off.label" +msgstr "Skip consent" + +#, elixir-autogen, elixir-format +msgid "gdpr_form.on.label" +msgstr "Show consent" + +#, elixir-autogen, elixir-format, fuzzy +msgid "settings.consent.body" +msgstr "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. " + +#, elixir-autogen, elixir-format, fuzzy +msgid "settings.consent.title" +msgstr "Consent" diff --git a/core/priv/gettext/en/LC_MESSAGES/eyra-project.po b/core/priv/gettext/en/LC_MESSAGES/eyra-project.po index 0c3c48d88..ec4288cab 100644 --- a/core/priv/gettext/en/LC_MESSAGES/eyra-project.po +++ b/core/priv/gettext/en/LC_MESSAGES/eyra-project.po @@ -23,14 +23,6 @@ msgstr "Settings" msgid "tabbar.item.config.forward" msgstr "Go to Settings" -#, elixir-autogen, elixir-format -msgid "tabbar.item.panel" -msgstr "Panel" - -#, elixir-autogen, elixir-format -msgid "tabbar.item.panel.forward" -msgstr "Go to Panel" - #, elixir-autogen, elixir-format msgid "tabbar.item.monitor" msgstr "Monitor" @@ -159,14 +151,6 @@ msgstr "Support" msgid "tabbar.item.support.forward" msgstr "Go to Support" -#, elixir-autogen, elixir-format, fuzzy -msgid "tabbar.item.gdpr" -msgstr "Consent" - -#, elixir-autogen, elixir-format, fuzzy -msgid "tabbar.item.gdpr.forward" -msgstr "Go to Consent" - #, elixir-autogen, elixir-format, fuzzy msgid "tabbar.item.settings" msgstr "Settings" @@ -174,11 +158,3 @@ msgstr "Settings" #, elixir-autogen, elixir-format, fuzzy msgid "tabbar.item.settings.forward" msgstr "Go to Settings" - -#, elixir-autogen, elixir-format, fuzzy -msgid "tabbar.item.invite" -msgstr "Panel" - -#, elixir-autogen, elixir-format, fuzzy -msgid "tabbar.item.invite.forward" -msgstr "Go to Settings" diff --git a/core/priv/gettext/eyra-assignment.pot b/core/priv/gettext/eyra-assignment.pot index ca27d3fca..66a4d7e74 100644 --- a/core/priv/gettext/eyra-assignment.pot +++ b/core/priv/gettext/eyra-assignment.pot @@ -94,14 +94,6 @@ msgstr "" msgid "settings.data_storage.title" msgstr "" -#, elixir-autogen, elixir-format -msgid "panel.title" -msgstr "" - -#, elixir-autogen, elixir-format -msgid "panel.label" -msgstr "" - #, elixir-autogen, elixir-format msgid "connect.button" msgstr "" @@ -173,3 +165,19 @@ msgstr "" #, elixir-autogen, elixir-format msgid "panel.liss.connection.annotation" msgstr "" + +#, elixir-autogen, elixir-format +msgid "gdpr_form.off.label" +msgstr "" + +#, elixir-autogen, elixir-format +msgid "gdpr_form.on.label" +msgstr "" + +#, elixir-autogen, elixir-format +msgid "settings.consent.body" +msgstr "" + +#, elixir-autogen, elixir-format +msgid "settings.consent.title" +msgstr "" diff --git a/core/priv/gettext/eyra-project.pot b/core/priv/gettext/eyra-project.pot index 94192cb46..7fc0f4c9c 100644 --- a/core/priv/gettext/eyra-project.pot +++ b/core/priv/gettext/eyra-project.pot @@ -23,14 +23,6 @@ msgstr "" msgid "tabbar.item.config.forward" msgstr "" -#, elixir-autogen, elixir-format -msgid "tabbar.item.panel" -msgstr "" - -#, elixir-autogen, elixir-format -msgid "tabbar.item.panel.forward" -msgstr "" - #, elixir-autogen, elixir-format msgid "tabbar.item.monitor" msgstr "" @@ -159,14 +151,6 @@ msgstr "" msgid "tabbar.item.support.forward" msgstr "" -#, elixir-autogen, elixir-format -msgid "tabbar.item.gdpr" -msgstr "" - -#, elixir-autogen, elixir-format -msgid "tabbar.item.gdpr.forward" -msgstr "" - #, elixir-autogen, elixir-format msgid "tabbar.item.settings" msgstr "" @@ -174,11 +158,3 @@ msgstr "" #, elixir-autogen, elixir-format msgid "tabbar.item.settings.forward" msgstr "" - -#, elixir-autogen, elixir-format -msgid "tabbar.item.invite" -msgstr "" - -#, elixir-autogen, elixir-format -msgid "tabbar.item.invite.forward" -msgstr "" diff --git a/core/priv/gettext/nl/LC_MESSAGES/eyra-assignment.po b/core/priv/gettext/nl/LC_MESSAGES/eyra-assignment.po index ef16a9c7a..2cf3cb428 100644 --- a/core/priv/gettext/nl/LC_MESSAGES/eyra-assignment.po +++ b/core/priv/gettext/nl/LC_MESSAGES/eyra-assignment.po @@ -94,14 +94,6 @@ msgstr "Instellingen" msgid "settings.data_storage.title" msgstr "Opslag van deelnemers data" -#, elixir-autogen, elixir-format -msgid "panel.title" -msgstr "Panel" - -#, elixir-autogen, elixir-format, fuzzy -msgid "panel.label" -msgstr "Selecteer jou panel" - #, elixir-autogen, elixir-format, fuzzy msgid "connect.button" msgstr "Koppeling maken" @@ -173,3 +165,19 @@ msgstr "

I&O Research

Lorem ipsum dolor sit amet, consectetur adipis #, elixir-autogen, elixir-format, fuzzy msgid "panel.liss.connection.annotation" msgstr "

LISS

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam.
Ga naar www.lissdata.nl voor meer informatie.
" + +#, elixir-autogen, elixir-format +msgid "gdpr_form.off.label" +msgstr "Consent overslaan" + +#, elixir-autogen, elixir-format +msgid "gdpr_form.on.label" +msgstr "Consent tonen" + +#, elixir-autogen, elixir-format, fuzzy +msgid "settings.consent.body" +msgstr "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. " + +#, elixir-autogen, elixir-format, fuzzy +msgid "settings.consent.title" +msgstr "Toestemming" diff --git a/core/priv/gettext/nl/LC_MESSAGES/eyra-project.po b/core/priv/gettext/nl/LC_MESSAGES/eyra-project.po index 8cf2a8835..983cfc72a 100644 --- a/core/priv/gettext/nl/LC_MESSAGES/eyra-project.po +++ b/core/priv/gettext/nl/LC_MESSAGES/eyra-project.po @@ -23,14 +23,6 @@ msgstr "Instellingen" msgid "tabbar.item.config.forward" msgstr "Ga naar Instellingen" -#, elixir-autogen, elixir-format -msgid "tabbar.item.panel" -msgstr "Uitnodigen" - -#, elixir-autogen, elixir-format -msgid "tabbar.item.panel.forward" -msgstr "Ga naar Uitnodigen" - #, elixir-autogen, elixir-format msgid "tabbar.item.monitor" msgstr "Monitor" @@ -159,14 +151,6 @@ msgstr "Support" msgid "tabbar.item.support.forward" msgstr "Ga naar Support" -#, elixir-autogen, elixir-format, fuzzy -msgid "tabbar.item.gdpr" -msgstr "Consent" - -#, elixir-autogen, elixir-format, fuzzy -msgid "tabbar.item.gdpr.forward" -msgstr "Ga naar Consent" - #, elixir-autogen, elixir-format, fuzzy msgid "tabbar.item.settings" msgstr "Instellingen" @@ -174,11 +158,3 @@ msgstr "Instellingen" #, elixir-autogen, elixir-format, fuzzy msgid "tabbar.item.settings.forward" msgstr "Ga naar Instellingen" - -#, elixir-autogen, elixir-format, fuzzy -msgid "tabbar.item.invite" -msgstr "Uitnodigen" - -#, elixir-autogen, elixir-format, fuzzy -msgid "tabbar.item.invite.forward" -msgstr "Ga naar Instellingen" diff --git a/core/systems/assignment/_public.ex b/core/systems/assignment/_public.ex index 5287fa452..67fc12cf4 100644 --- a/core/systems/assignment/_public.ex +++ b/core/systems/assignment/_public.ex @@ -232,6 +232,14 @@ defmodule Systems.Assignment.Public do Core.Persister.save(assignment, changeset) end + def update_consent_agreement(assignment, consent_agreement) do + changeset = + Assignment.Model.changeset(assignment, %{}) + |> Ecto.Changeset.put_assoc(:consent_agreement, consent_agreement) + + Core.Persister.save(assignment, changeset) + end + def is_owner?(assignment, user) do Core.Authorization.user_has_role?(user, assignment, :owner) end diff --git a/core/systems/assignment/content_page_builder.ex b/core/systems/assignment/content_page_builder.ex index a3a607f86..36df51be8 100644 --- a/core/systems/assignment/content_page_builder.ex +++ b/core/systems/assignment/content_page_builder.ex @@ -154,7 +154,7 @@ defmodule Systems.Assignment.ContentPageBuilder do end defp get_tab_keys() do - [:config, :gdpr, :items, :invite] + [:config, :items] end defp create_tab( @@ -246,28 +246,6 @@ defmodule Systems.Assignment.ContentPageBuilder do } end - defp create_tab( - :gdpr, - %{consent_agreement: consent_agreement}, - show_errors, - _assigns - ) do - ready? = false - - %{ - id: :gdpr_form, - ready: ready?, - show_errors: show_errors, - title: dgettext("eyra-project", "tabbar.item.gdpr"), - forward_title: dgettext("eyra-project", "tabbar.item.gdpr.forward"), - type: :fullpage, - live_component: Assignment.GdprForm, - props: %{ - entity: consent_agreement - } - } - end - defp create_tab( :support, assignment, @@ -286,29 +264,6 @@ defmodule Systems.Assignment.ContentPageBuilder do } end - defp create_tab( - :invite, - assignment, - show_errors, - %{uri_origin: uri_origin} - ) do - ready? = false - - %{ - id: :panel_form, - ready: ready?, - show_errors: show_errors, - title: dgettext("eyra-project", "tabbar.item.panel"), - forward_title: dgettext("eyra-project", "tabbar.item.panel.forward"), - type: :fullpage, - live_component: Assignment.PanelForm, - props: %{ - uri_origin: uri_origin, - entity: assignment - } - } - end - defp create_tab( :monitor, assignment, diff --git a/core/systems/assignment/crew_page_builder.ex b/core/systems/assignment/crew_page_builder.ex index 1fe0e65ed..88a0e87b4 100644 --- a/core/systems/assignment/crew_page_builder.ex +++ b/core/systems/assignment/crew_page_builder.ex @@ -34,10 +34,13 @@ defmodule Systems.Assignment.CrewPageBuilder do consent_view(assignment, assigns), work_view(assignment, assigns) ] + |> Enum.filter(&(&1 != nil)) end defp current_flow(%{fabric: %{children: children}}), do: children + defp consent_view(%{consent_agreement: nil}, _), do: nil + defp consent_view(%{consent_agreement: consent_agreement}, %{current_user: user, fabric: fabric}) do revision = Consent.Public.latest_revision(consent_agreement) diff --git a/core/systems/assignment/gdpr_form.ex b/core/systems/assignment/gdpr_form.ex index 890a4f40f..856fb6784 100644 --- a/core/systems/assignment/gdpr_form.ex +++ b/core/systems/assignment/gdpr_form.ex @@ -1,9 +1,10 @@ defmodule Systems.Assignment.GdprForm do - use CoreWeb, :live_component + use CoreWeb, :live_component_fabric + use Fabric.LiveComponent - alias Systems.{ - Consent - } + alias Frameworks.Pixel + alias Systems.Assignment + alias Systems.Consent @impl true def update(%{id: id, entity: entity}, socket) do @@ -14,31 +15,78 @@ defmodule Systems.Assignment.GdprForm do id: id, entity: entity ) - |> update_consent_agreement() + |> compose_child(:switch) + |> compose_child(:consent_revision_form) } end - defp update_consent_agreement(%{assigns: %{entity: entity}} = socket) do - revision = Consent.Public.latest_unlocked_revision_safe(entity) + @impl true + def compose(:switch, %{entity: %{consent_agreement: consent_agreement}}) do + %{ + module: Pixel.Switch, + params: %{ + opt_in?: false, + on_text: dgettext("eyra-assignment", "gdpr_form.on.label"), + off_text: dgettext("eyra-assignment", "gdpr_form.off.label"), + status: + if consent_agreement do + :on + else + :off + end + } + } + end + + @impl true + def compose(:consent_revision_form, %{entity: %{consent_agreement: nil}}) do + nil + end - consent_revision_form = %{ - id: :consent_revision, + @impl true + def compose(:consent_revision_form, %{entity: %{consent_agreement: consent_agreement}}) do + %{ module: Consent.RevisionForm, - entity: revision + params: %{ + entity: Consent.Public.latest_unlocked_revision_safe(consent_agreement) + } + } + end + + @impl true + def handle_event( + "switch", + %{status: :on}, + %{assigns: %{entity: %{auth_node: auth_node} = assignment}} = socket + ) do + consent_agreement = %Consent.AgreementModel{auth_node: auth_node} + Assignment.Public.update_consent_agreement(assignment, consent_agreement) + + { + :noreply, + socket + |> compose_child(:consent_revision_form) } + end - assign(socket, consent_revision_form: consent_revision_form) + @impl true + def handle_event("switch", %{status: :off}, %{assigns: %{entity: assignment}} = socket) do + Assignment.Public.update_consent_agreement(assignment, nil) + + { + :noreply, + socket + |> hide_child(:consent_revision_form) + } end @impl true def render(assigns) do ~H"""
- - - Consent - <.live_component {@consent_revision_form} /> - + <.child id={:switch} fabric={@fabric} /> + <.spacing value="S" /> + <.child id={:consent_revision_form} fabric={@fabric} />
""" end diff --git a/core/systems/assignment/model.ex b/core/systems/assignment/model.ex index dd60e27bf..d709a8039 100644 --- a/core/systems/assignment/model.ex +++ b/core/systems/assignment/model.ex @@ -20,7 +20,7 @@ defmodule Systems.Assignment.Model do field(:status, Ecto.Enum, values: Assignment.Status.values(), default: :concept) field(:external_panel, Ecto.Enum, values: Assignment.ExternalPanelIds.values()) - belongs_to(:consent_agreement, Consent.AgreementModel) + belongs_to(:consent_agreement, Consent.AgreementModel, on_replace: :update) belongs_to(:info, Assignment.InfoModel) belongs_to(:storage_endpoint, Storage.EndpointModel, on_replace: :delete) belongs_to(:workflow, Workflow.Model) diff --git a/core/systems/assignment/panel_form.ex b/core/systems/assignment/panel_form.ex deleted file mode 100644 index 876288db5..000000000 --- a/core/systems/assignment/panel_form.ex +++ /dev/null @@ -1,104 +0,0 @@ -defmodule Systems.Assignment.PanelForm do - use CoreWeb.LiveForm - - alias Frameworks.Pixel.Selector - - alias Systems.{ - Assignment - } - - # Handle Selector Update - @impl true - def update( - %{active_item_id: panel_id, selector_id: :panel_selector}, - %{assigns: %{entity: assignment}} = socket - ) do - changeset = Assignment.Model.changeset(assignment, %{external_panel: panel_id}) - - { - :ok, - socket - |> save(changeset) - |> update_panel_selector() - |> update_panel_view() - } - end - - @impl true - def update(%{id: id, uri_origin: uri_origin, entity: entity}, socket) do - { - :ok, - socket - |> assign( - id: id, - uri_origin: uri_origin, - entity: entity - ) - |> update_panel_selector() - |> update_panel_view() - } - end - - defp update_panel_selector( - %{assigns: %{id: id, entity: %{external_panel: external_panel}}} = socket - ) do - items = - Assignment.ExternalPanelIds.labels( - external_panel, - Assignment.Private.allowed_external_panel_ids() - ) - - panel_selector = %{ - module: Selector, - id: :panel_selector, - grid_options: "flex flex-col gap-3", - items: items, - type: :radio, - parent: %{type: __MODULE__, id: id} - } - - assign(socket, panel_selector: panel_selector) - end - - defp update_panel_view(%{assigns: %{entity: %{external_panel: nil}}} = socket) do - assign(socket, panel_view: nil) - end - - defp update_panel_view(%{assigns: %{entity: assignment, uri_origin: uri_origin}} = socket) do - panel_view = - if function = Assignment.Private.panel_function_component(assignment) do - %{ - function: function, - props: %{ - assignment: assignment, - uri_origin: uri_origin - } - } - else - nil - end - - assign(socket, panel_view: panel_view) - end - - @impl true - def render(assigns) do - ~H""" -
- - - <%= dgettext("eyra-assignment", "panel.title") %> - <%= dgettext("eyra-assignment", "panel.label") %> - <.spacing value="XS" /> -
- <.live_component {@panel_selector} /> -
- <%= if @panel_view do %> - <.spacing value="XS" /> - <.function_component {@panel_view} /> - <% end %> -
-
- """ - end -end diff --git a/core/systems/assignment/settings_view.ex b/core/systems/assignment/settings_view.ex index 0f9db4009..9a6cf0b78 100644 --- a/core/systems/assignment/settings_view.ex +++ b/core/systems/assignment/settings_view.ex @@ -16,35 +16,46 @@ defmodule Systems.Assignment.SettingsView do entity: assignment, uri_origin: uri_origin ) - |> update_storage_connector() - |> update_panel_connector() + |> compose_child(:consent) + |> compose_child(:panel_connector) + |> compose_child(:storage_connector) } end - defp update_storage_connector( - %{assigns: %{entity: assignment, uri_origin: uri_origin}} = socket - ) do - child = - prepare_child(socket, :storage_connector, Assignment.ConnectorView, %{ - assignment: assignment, - connection: assignment.storage_endpoint, - type: :storage, - uri_origin: uri_origin - }) - - show_child(socket, child) + @impl true + def compose(:consent, %{entity: assignment}) do + %{ + module: Assignment.GdprForm, + params: %{ + entity: assignment + } + } end - defp update_panel_connector(%{assigns: %{entity: assignment, uri_origin: uri_origin}} = socket) do - child = - prepare_child(socket, :panel_connector, Assignment.ConnectorView, %{ + @impl true + def compose(:panel_connector, %{entity: assignment, uri_origin: uri_origin}) do + %{ + module: Assignment.ConnectorView, + params: %{ assignment: assignment, connection: assignment.external_panel, type: :panel, uri_origin: uri_origin - }) + } + } + end - show_child(socket, child) + @impl true + def compose(:storage_connector, %{entity: assignment, uri_origin: uri_origin}) do + %{ + module: Assignment.ConnectorView, + params: %{ + assignment: assignment, + connection: assignment.storage_endpoint, + type: :storage, + uri_origin: uri_origin + } + } end @impl true @@ -59,17 +70,40 @@ defmodule Systems.Assignment.SettingsView do <%= dgettext("eyra-assignment", "settings.title") %> - - <%= dgettext("eyra-assignment", "settings.panel.title") %> - <%= dgettext("eyra-assignment", "settings.panel.body") %> - <.spacing value="M" /> - <.child id={:panel_connector} fabric={@fabric}/> <.spacing value="L" /> - <%= dgettext("eyra-assignment", "settings.data_storage.title") %> - <%= dgettext("eyra-assignment", "settings.data_storage.body") %> - <.spacing value="M" /> - <.child id={:storage_connector} fabric={@fabric}/> + <.child id={:consent} fabric={@fabric} > + <:header> + <%= dgettext("eyra-assignment", "settings.consent.title") %> + <%= dgettext("eyra-assignment", "settings.consent.body") %> + <.spacing value="M" /> + + <:footer> + <.spacing value="L" /> + + + + <.child id={:panel_connector} fabric={@fabric}> + <:header> + <%= dgettext("eyra-assignment", "settings.panel.title") %> + <%= dgettext("eyra-assignment", "settings.panel.body") %> + <.spacing value="M" /> + + <:footer> + <.spacing value="L" /> + + + + <.child id={:storage_connector} fabric={@fabric}> + <:header> + <%= dgettext("eyra-assignment", "settings.data_storage.title") %> + <%= dgettext("eyra-assignment", "settings.data_storage.body") %> + <.spacing value="M" /> + + <:footer> + <.spacing value="L" /> + +
diff --git a/core/systems/benchmark/content_page_builder.ex b/core/systems/benchmark/content_page_builder.ex index de3747bc8..aa6427b73 100644 --- a/core/systems/benchmark/content_page_builder.ex +++ b/core/systems/benchmark/content_page_builder.ex @@ -215,27 +215,4 @@ defmodule Systems.Benchmark.ContentPageBuilder do } } end - - defp create_tab( - :invite, - assignment, - show_errors, - %{uri_origin: uri_origin} - ) do - ready? = false - - %{ - id: :invite_form, - ready: ready?, - show_errors: show_errors, - title: dgettext("eyra-project", "tabbar.item.invite"), - forward_title: dgettext("eyra-project", "tabbar.item.invite.forward"), - type: :fullpage, - live_component: Assignment.PanelForm, - props: %{ - uri_origin: uri_origin, - entity: assignment - } - } - end end diff --git a/core/systems/consent/revision_form.ex b/core/systems/consent/revision_form.ex index 35b28f3c4..419359bb3 100644 --- a/core/systems/consent/revision_form.ex +++ b/core/systems/consent/revision_form.ex @@ -1,5 +1,6 @@ defmodule Systems.Consent.RevisionForm do - use CoreWeb.LiveForm + use CoreWeb.LiveForm, :fabric + use Fabric.LiveComponent alias Systems.{ Consent