Current section
Files
Jump to
Current section
Files
src/spectator@internal@components@ets_table_live.erl
-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@atom:atom_()),
list({binary(), binary()}),
gleam@option:option(gleam@erlang@process:subject(msg())),
integer(),
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", 40).
-spec get_ets_table_info_from_list(
gleam@option:option(gleam@erlang@atom:atom_()),
gleam@erlang@atom:atom_()
) -> {ok, spectator@internal@api:table()} |
{error, spectator@internal@api:erlang_error()}.
get_ets_table_info_from_list(Node, Table_name) ->
gleam@result:'try'(
spectator_ffi:list_ets_tables(Node),
fun(Tables) ->
_pipe = gleam@list:find(
Tables,
fun(T) -> erlang:element(3, T) =:= Table_name end
),
gleam@result:replace_error(_pipe, returned_undefined_error)
end
).
-file("/Users/jonas/Projects/spectator/src/spectator/internal/components/ets_table_live.gleam", 46).
-spec get_initial_data(list({binary(), binary()})) -> {ok, model()} |
{error, spectator@internal@api:erlang_error()}.
get_initial_data(Params) ->
Node = spectator@internal@api:node_from_params(Params),
gleam@result:'try'(
begin
_pipe = spectator@internal@common:get_param(
Params,
<<"table_name"/utf8>>
),
gleam@result:replace_error(_pipe, returned_undefined_error)
end,
fun(Table_name) ->
gleam@result:'try'(
begin
_pipe@1 = gleam_erlang_ffi:atom_from_string(Table_name),
gleam@result:replace_error(
_pipe@1,
returned_undefined_error
)
end,
fun(Table_atom) ->
gleam@result:'try'(
gleam@result:lazy_or(
spectator_ffi:get_ets_table_info(Node, Table_atom),
fun() ->
get_ets_table_info_from_list(Node, Table_atom)
end
),
fun(Table) ->
Refresh_interval = spectator@internal@common:get_refresh_interval(
Params
),
Table_data = begin
_pipe@2 = spectator@internal@api:get_ets_data(
Node,
Table
),
gleam@option:from_result(_pipe@2)
end,
{ok,
{model,
Node,
spectator@internal@common:sanitize_params(
Params
),
none,
Refresh_interval,
{some, Table},
Table_data,
none,
descending}}
end
)
end
)
end
).
-file("/Users/jonas/Projects/spectator/src/spectator/internal/components/ets_table_live.gleam", 77).
-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(
erlang:element(5, Model),
refresh,
none,
fun(Field@0) -> {created_subject, Field@0} end
)};
{error, _} ->
{{model, none, [], none, 1000, none, none, none, descending},
lustre@effect:none()}
end.
-file("/Users/jonas/Projects/spectator/src/spectator/internal/components/ets_table_live.gleam", 107).
-spec do_refresh(model()) -> model().
do_refresh(Model) ->
case erlang:element(6, Model) of
{some, T} ->
case {spectator@internal@api:get_ets_data(
erlang:element(2, Model),
T
),
erlang:element(8, Model)} of
{{ok, Data}, {some, Sort_column_index}} ->
Sorted = spectator@internal@api:sort_table_data(
Data,
Sort_column_index,
erlang:element(9, Model)
),
erlang:setelement(7, Model, {some, Sorted});
{{ok, Data@1}, none} ->
erlang:setelement(7, Model, {some, Data@1});
{{error, _}, _} ->
{model, none, [], none, 1000, none, none, none, descending}
end;
_ ->
Model
end.
-file("/Users/jonas/Projects/spectator/src/spectator/internal/components/ets_table_live.gleam", 136).
-spec update(model(), msg()) -> {model(), lustre@effect:effect(msg())}.
update(Model, Msg) ->
case Msg of
refresh ->
{do_refresh(Model),
spectator@internal@common:emit_after(
erlang:element(5, Model),
refresh,
erlang:element(4, Model),
fun(Field@0) -> {created_subject, Field@0} end
)};
{created_subject, Subject} ->
{erlang:setelement(4, Model, {some, Subject}), lustre@effect:none()};
{heading_clicked, Column} ->
case Column of
_ when Column =:= erlang:element(8, Model) ->
{begin
_pipe = erlang:setelement(
9,
Model,
spectator@internal@api:invert_sort_direction(
erlang:element(9, Model)
)
),
do_refresh(_pipe)
end,
lustre@effect:none()};
C ->
{begin
_pipe@1 = erlang:setelement(8, 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", 181).
-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(<<"component-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(
erlang:integer_to_binary(I),
erlang:integer_to_binary(I),
{some, I},
erlang:element(8, Model),
erlang:element(9, 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", 220).
-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", 174).
-spec view(model()) -> lustre@internals@vdom:element(msg()).
view(Model) ->
case {erlang:element(6, Model), erlang:element(7, 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", 19).
-spec app() -> lustre:app(list({binary(), binary()}), model(), msg()).
app() ->
lustre:application(fun init/1, fun update/2, fun view/1).