-module(spectator@internal@components@ets_overview_live). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/spectator/internal/components/ets_overview_live.gleam"). -export([app/0]). -export_type([model/0, msg/0]). -if(?OTP_RELEASE >= 27). -define(MODULEDOC(Str), -moduledoc(Str)). -define(DOC(Str), -doc(Str)). -else. -define(MODULEDOC(Str), -compile([])). -define(DOC(Str), -compile([])). -endif. ?MODULEDOC(false). -type model() :: {model, gleam@option:option(gleam@erlang@atom:atom_()), list({binary(), binary()}), gleam@option:option(gleam@erlang@process:subject(msg())), integer(), list(spectator@internal@api:table()), integer(), spectator@internal@api:table_sort_criteria(), spectator@internal@api:sort_direction()}. -opaque msg() :: refresh | {heading_clicked, spectator@internal@api:table_sort_criteria()} | {created_subject, gleam@erlang@process:subject(msg())}. -file("src/spectator/internal/components/ets_overview_live.gleam", 37). ?DOC(false). -spec init(list({binary(), binary()})) -> {model(), lustre@effect:effect(msg())}. init(Params) -> Node = spectator@internal@api:node_from_params(Params), Defaul_sort_criteria = sort_by_table_size, Defaul_sort_direction = descending, Refresh_interval = spectator@internal@common:get_refresh_interval(Params), Word_size = gleam@result:unwrap(spectator_ffi:get_word_size(Node), 8), {{model, Node, spectator@internal@common:sanitize_params(Params), none, Refresh_interval, [], Word_size, Defaul_sort_criteria, Defaul_sort_direction}, lustre@effect:from(fun(Dispatch) -> Dispatch(refresh) end)}. -file("src/spectator/internal/components/ets_overview_live.gleam", 69). ?DOC(false). -spec get_sorted_tables( gleam@option:option(gleam@erlang@atom:atom_()), spectator@internal@api:table_sort_criteria(), spectator@internal@api:sort_direction() ) -> list(spectator@internal@api:table()). get_sorted_tables(Node, Sort_criteria, Sort_direction) -> _pipe = gleam@result:unwrap(spectator_ffi:list_ets_tables(Node), []), spectator@internal@api:sort_table_list(_pipe, Sort_criteria, Sort_direction). -file("src/spectator/internal/components/ets_overview_live.gleam", 78). ?DOC(false). -spec update(model(), msg()) -> {model(), lustre@effect:effect(msg())}. update(Model, Msg) -> case Msg of refresh -> {{model, erlang:element(2, Model), erlang:element(3, Model), erlang:element(4, Model), erlang:element(5, Model), get_sorted_tables( erlang:element(2, Model), erlang:element(8, Model), erlang:element(9, Model) ), erlang:element(7, Model), erlang:element(8, Model), erlang:element(9, 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} -> {{model, erlang:element(2, Model), erlang:element(3, Model), {some, Subject}, erlang:element(5, Model), erlang:element(6, Model), erlang:element(7, Model), erlang:element(8, Model), erlang:element(9, Model)}, lustre@effect:none()}; {heading_clicked, Criteria} -> case Criteria of C when C =:= erlang:element(8, Model) -> New_direction = spectator@internal@api:invert_sort_direction( erlang:element(9, Model) ), New_model = {model, erlang:element(2, Model), erlang:element(3, Model), erlang:element(4, Model), erlang:element(5, Model), get_sorted_tables( erlang:element(2, Model), C, New_direction ), erlang:element(7, Model), erlang:element(8, Model), New_direction}, {New_model, lustre@effect:none()}; C@1 -> New_model@1 = {model, erlang:element(2, Model), erlang:element(3, Model), erlang:element(4, Model), erlang:element(5, Model), get_sorted_tables( erlang:element(2, Model), C@1, erlang:element(9, Model) ), erlang:element(7, Model), C@1, erlang:element(9, Model)}, {New_model@1, lustre@effect:none()} end end. -file("src/spectator/internal/components/ets_overview_live.gleam", 264). ?DOC(false). -spec link_cell( spectator@internal@api:table(), list(lustre@vdom@vnode:element(msg())), list({binary(), binary()}) ) -> list(lustre@vdom@vnode:element(msg())). link_cell(T, Children, Params) -> [lustre@element@html:a( [lustre@attribute:href( <<<<"/ets/"/utf8, (gleam_stdlib:percent_encode( erlang:atom_to_binary(erlang:element(3, T)) ))/binary>>/binary, (spectator@internal@common:encode_params(Params))/binary>> )], Children )]. -file("src/spectator/internal/components/ets_overview_live.gleam", 128). ?DOC(false). -spec view(model()) -> lustre@vdom@vnode:element(msg()). view(Model) -> lustre@element@html:table( [], [lustre@element@html:thead( [], [lustre@element@html:tr( [], [spectator@internal@views@table:heading( <<"Name"/utf8>>, <<"Table Name"/utf8>>, sort_by_table_name, erlang:element(8, Model), erlang:element(9, Model), fun(Field@0) -> {heading_clicked, Field@0} end, false ), spectator@internal@views@table:heading( <<"Type"/utf8>>, <<"Table Type"/utf8>>, sort_by_table_type, erlang:element(8, Model), erlang:element(9, Model), fun(Field@0) -> {heading_clicked, Field@0} end, false ), spectator@internal@views@table:heading( <<"Size"/utf8>>, <<"Table Size"/utf8>>, sort_by_table_size, erlang:element(8, Model), erlang:element(9, Model), fun(Field@0) -> {heading_clicked, Field@0} end, true ), spectator@internal@views@table:heading( <<"Memory"/utf8>>, <<"Table Memory"/utf8>>, sort_by_table_memory, erlang:element(8, Model), erlang:element(9, Model), fun(Field@0) -> {heading_clicked, Field@0} end, true ), spectator@internal@views@table:heading( <<"Owner"/utf8>>, <<"Table Owner"/utf8>>, sort_by_table_owner, erlang:element(8, Model), erlang:element(9, Model), fun(Field@0) -> {heading_clicked, Field@0} end, true ), spectator@internal@views@table:heading( <<"Protection"/utf8>>, <<"Table Protection"/utf8>>, sort_by_table_protection, erlang:element(8, Model), erlang:element(9, Model), fun(Field@0) -> {heading_clicked, Field@0} end, true ), spectator@internal@views@table:heading( <<"Read Conc."/utf8>>, <<"Table Read Concurrency"/utf8>>, sort_by_table_read_concurrency, erlang:element(8, Model), erlang:element(9, Model), fun(Field@0) -> {heading_clicked, Field@0} end, true ), spectator@internal@views@table:heading( <<"Write Conc."/utf8>>, <<"Table Write Concurrency"/utf8>>, sort_by_table_write_concurrency, erlang:element(8, Model), erlang:element(9, Model), fun(Field@0) -> {heading_clicked, Field@0} end, true )] )] ), lustre@element@html:tbody( [], spectator@internal@views@table:map_rows( erlang:element(6, Model), fun(T) -> lustre@element@html:tr( [], [lustre@element@html:td( [lustre@attribute:class( <<"link-cell"/utf8>> )], link_cell( T, [spectator@internal@views@display:atom( erlang:element(3, T) )], erlang:element(3, Model) ) ), lustre@element@html:td( [lustre@attribute:class( <<"link-cell"/utf8>> )], link_cell( T, [spectator@internal@views@display:atom( erlang:element(4, T) )], erlang:element(3, Model) ) ), lustre@element@html:td( [lustre@attribute:class( <<"cell-right link-cell"/utf8>> )], link_cell( T, [spectator@internal@views@display:number( erlang:element(5, T) ), lustre@element@html:text( <<" items"/utf8>> )], erlang:element(3, Model) ) ), lustre@element@html:td( [lustre@attribute:class( <<"cell-right link-cell"/utf8>> )], link_cell( T, [spectator@internal@views@display:storage_words( erlang:element(6, T), erlang:element(7, Model) )], erlang:element(3, Model) ) ), lustre@element@html:td( [lustre@attribute:class( <<"cell-right link-cell"/utf8>> )], [spectator@internal@views@display:system_primitive( erlang:element(7, T), erlang:element(3, Model) )] ), lustre@element@html:td( [lustre@attribute:class( <<"cell-right link-cell"/utf8>> )], link_cell( T, [spectator@internal@views@display:atom( erlang:element(8, T) )], erlang:element(3, Model) ) ), lustre@element@html:td( [lustre@attribute:class( <<"cell-right link-cell"/utf8>> )], link_cell( T, [spectator@internal@views@display:bool( erlang:element(9, T) )], erlang:element(3, Model) ) ), lustre@element@html:td( [lustre@attribute:class( <<"cell-right link-cell"/utf8>> )], link_cell( T, [spectator@internal@views@display:bool( erlang:element(10, T) )], erlang:element(3, Model) ) )] ) end ) ), lustre@element@html:tfoot( [], [lustre@element@html:tr( [], [lustre@element@html:td( [lustre@attribute:attribute( <<"colspan"/utf8>>, <<"8"/utf8>> )], [lustre@element@html:'div'( [lustre@attribute:class( <<"footer-placeholder"/utf8>> )], [lustre@element@html:text( <<"Click on a table to view data"/utf8>> )] )] )] )] )] ). -file("src/spectator/internal/components/ets_overview_live.gleam", 18). ?DOC(false). -spec app() -> lustre@runtime@app:app(list({binary(), binary()}), model(), msg()). app() -> lustre:application(fun init/1, fun update/2, fun view/1).