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@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) ->
gleam@io:debug(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", 84).
-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", 103).
-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", 148).
-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", 187).
-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", 141).
-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).