-module(spectator@internal@components@ets_table_live). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -export([app/0]). -export_type([model/0, msg/0]). -type model() :: {model, gleam@option:option(gleam@erlang@process:subject(msg())), gleam@option:option(spectator@internal@api:table()), gleam@option:option(spectator@internal@api:table_data()), gleam@option:option(integer()), spectator@internal@api:sort_direction()}. -opaque msg() :: refresh | {created_subject, gleam@erlang@process:subject(msg())} | {heading_clicked, gleam@option:option(integer())}. -file("/Users/jonas/Projects/spectator/src/spectator/internal/components/ets_table_live.gleam", 39). -spec get_ets_table_info_from_list(gleam@erlang@atom:atom_()) -> {ok, spectator@internal@api:table()} | {error, nil}. get_ets_table_info_from_list(Table_name) -> gleam@result:'try'( spectator_ffi:list_ets_tables(), fun(Tables) -> _pipe = gleam@list:find( Tables, fun(T) -> erlang:element(3, T) =:= Table_name end ), gleam@result:replace_error(_pipe, nil) end ). -file("/Users/jonas/Projects/spectator/src/spectator/internal/components/ets_table_live.gleam", 45). -spec get_initial_data(list({binary(), binary()})) -> {ok, model()} | {error, nil}. get_initial_data(Params) -> gleam@result:'try'( spectator@internal@common:get_param(Params, <<"table_name"/utf8>>), fun(Table_name) -> gleam@result:'try'( begin _pipe = gleam_erlang_ffi:atom_from_string(Table_name), gleam@result:replace_error(_pipe, nil) end, fun(Table_atom) -> gleam@result:'try'( gleam@result:lazy_or( spectator_ffi:get_ets_table_info(Table_atom), fun() -> get_ets_table_info_from_list(Table_atom) end ), fun(Table) -> Table_data = begin _pipe@1 = spectator@internal@api:get_ets_data( Table ), gleam@option:from_result(_pipe@1) end, {ok, {model, none, {some, Table}, Table_data, none, descending}} end ) end ) end ). -file("/Users/jonas/Projects/spectator/src/spectator/internal/components/ets_table_live.gleam", 65). -spec init(list({binary(), binary()})) -> {model(), lustre@effect:effect(msg())}. init(Params) -> case get_initial_data(Params) of {ok, Model} -> {Model, spectator@internal@common:emit_after( 1000, refresh, none, fun(Field@0) -> {created_subject, Field@0} end )}; {error, _} -> {{model, none, none, none, none, descending}, lustre@effect:none()} end. -file("/Users/jonas/Projects/spectator/src/spectator/internal/components/ets_table_live.gleam", 83). -spec do_refresh(model()) -> model(). do_refresh(Model) -> case erlang:element(3, Model) of {some, T} -> case {spectator@internal@api:get_ets_data(T), erlang:element(5, Model)} of {{ok, Data}, {some, Sort_column_index}} -> Sorted = spectator@internal@api:sort_table_data( Data, Sort_column_index, erlang:element(6, Model) ), erlang:setelement(4, Model, {some, Sorted}); {{ok, Data@1}, none} -> erlang:setelement(4, Model, {some, Data@1}); {{error, _}, _} -> {model, none, none, none, none, descending} end; _ -> Model end. -file("/Users/jonas/Projects/spectator/src/spectator/internal/components/ets_table_live.gleam", 102). -spec update(model(), msg()) -> {model(), lustre@effect:effect(msg())}. update(Model, Msg) -> case Msg of refresh -> {do_refresh(Model), spectator@internal@common:emit_after( 1000, refresh, erlang:element(2, Model), fun(Field@0) -> {created_subject, Field@0} end )}; {created_subject, Subject} -> {erlang:setelement(2, Model, {some, Subject}), lustre@effect:none()}; {heading_clicked, Column} -> case Column of _ when Column =:= erlang:element(5, Model) -> {begin _pipe = erlang:setelement( 6, Model, spectator@internal@api:invert_sort_direction( erlang:element(6, Model) ) ), do_refresh(_pipe) end, lustre@effect:none()}; C -> {begin _pipe@1 = erlang:setelement(5, Model, C), do_refresh(_pipe@1) end, lustre@effect:none()} end end. -file("/Users/jonas/Projects/spectator/src/spectator/internal/components/ets_table_live.gleam", 147). -spec render_table_data( model(), spectator@internal@api:table(), spectator@internal@api:table_data() ) -> lustre@internals@vdom:element(msg()). render_table_data(Model, Table, Data) -> case erlang:element(3, Data) =:= 0 of true -> lustre@element@html:'div'( [lustre@attribute:class(<<"ets-table-error"/utf8>>)], [lustre@element@html:text(<<"No data in table "/utf8>>), spectator@internal@views@display:atom( erlang:element(3, Table) )] ); false -> lustre@element@html:table( [lustre@attribute:class(<<"ets-data"/utf8>>)], [lustre@element@html:thead( [], [lustre@element@html:tr( [], begin _pipe = gleam@list:range( 0, erlang:element(3, Data) - 1 ), gleam@list:map( _pipe, fun(I) -> spectator@internal@views@table:heading( gleam@int:to_string(I), gleam@int:to_string(I), {some, I}, erlang:element(5, Model), erlang:element(6, Model), fun(Field@0) -> {heading_clicked, Field@0} end, false ) end ) end )] ), lustre@element@html:tbody( [], spectator@internal@views@table:map_rows( erlang:element(2, Data), fun(Row) -> lustre@element@html:tr( [lustre@attribute:class(<<"ets-row"/utf8>>)], gleam@list:map( Row, fun(Cell) -> lustre@element@html:td( [], [spectator@internal@views@display:inspect( Cell )] ) end ) ) end ) )] ) end. -file("/Users/jonas/Projects/spectator/src/spectator/internal/components/ets_table_live.gleam", 186). -spec render_not_found() -> lustre@internals@vdom:element(any()). render_not_found() -> lustre@element@html:'div'( [lustre@attribute:class(<<"component-error"/utf8>>)], [lustre@element@html:text( <<"The referenced table could not be loaded."/utf8>> )] ). -file("/Users/jonas/Projects/spectator/src/spectator/internal/components/ets_table_live.gleam", 140). -spec view(model()) -> lustre@internals@vdom:element(msg()). view(Model) -> case {erlang:element(3, Model), erlang:element(4, Model)} of {{some, Table}, {some, Data}} -> render_table_data(Model, Table, Data); {_, _} -> render_not_found() end. -file("/Users/jonas/Projects/spectator/src/spectator/internal/components/ets_table_live.gleam", 20). -spec app() -> lustre:app(list({binary(), binary()}), model(), msg()). app() -> lustre:application(fun init/1, fun update/2, fun view/1).