Nui
Loading...
Searching...
No Matches
table.hpp
Go to the documentation of this file.
1#pragma once
2
11
12#include <string>
13#include <functional>
14#include <vector>
15
16namespace Nui::Components
17{
18 template <template <typename...> typename ContainerT, typename ElementT, typename... OtherArgs>
20 {
22 Nui::Observed<ContainerT<ElementT, OtherArgs...>>& tableModel;
23
25 std::variant<std::monostate, std::string, Nui::Observed<std::string> const*> caption = std::monostate{};
26
28 std::function<Nui::ElementRenderer()> headerRenderer = {};
29
31 std::function<Nui::ElementRenderer(long long i, ElementT const&)> rowRenderer = {};
32
34 std::function<Nui::ElementRenderer()> footerRenderer = {};
35
37 std::vector<Attribute> tableAttributes = {};
38
40 std::vector<Attribute> captionAttributes = {};
41
43 std::vector<Attribute> headerAttributes = {};
44
46 std::vector<Attribute> bodyAttributes = {};
47
49 std::vector<Attribute> footerAttributes = {};
50 };
51
57 template <typename ModelT>
58 class Table : public Table<std::vector<ModelT>>
59 {
60 using Table<std::vector<ModelT>>::Table;
61 };
62 template <template <typename...> typename ContainerT, typename ElementT, typename... OtherArgs>
63 class Table<ContainerT<ElementT, OtherArgs...>>
64 {
65 public:
67 : tableParams_{std::move(args)}
68 {}
69
71 {
72 using namespace Elements;
73
74 // clang-format off
75 return table{tableParams_.tableAttributes}(
76 // caption
77 [cap = std::move(tableParams_.caption), capAttributes = std::move(tableParams_.captionAttributes)]() -> Nui::ElementRenderer {
78 return visitOverloaded(cap,
79 [](std::monostate) -> Nui::ElementRenderer{
80 return nil();
81 },
82 [&capAttributes](std::string const& content) -> Nui::ElementRenderer{
83 return caption{capAttributes}(content);
84 },
85 [&capAttributes](Observed<std::string> const* model) -> Nui::ElementRenderer{
86 return caption{capAttributes}(*model);
87 }
88 );
89 }(),
90 // header
91 [headerRenderer = std::move(tableParams_.headerRenderer), headerAttributes = std::move(tableParams_.headerAttributes)]() -> Nui::ElementRenderer {
92 if (headerRenderer)
93 return thead{headerAttributes}(headerRenderer());
94 else
95 return nil();
96 }(),
97 // body
98 tbody{tableParams_.bodyAttributes}(
99 range(tableParams_.tableModel),
100 [renderer = std::move(tableParams_.rowRenderer)](long i, auto const& row) -> Nui::ElementRenderer {
101 using namespace std::string_literals;
102
103 if (renderer)
104 return renderer(i, row);
105 else
106 return nil();
107 }
108 ),
109 // footer
110 [footerRenderer = std::move(tableParams_.footerRenderer), footerAttributes = std::move(tableParams_.footerAttributes)]() -> Nui::ElementRenderer {
111 if (footerRenderer)
112 return
113 tfoot{footerAttributes}(footerRenderer());
114 else
115 return nil();
116 }()
117 );
118 // clang-format on
119 }
120
121 private:
122 TableArguments<ContainerT, ElementT, OtherArgs...> tableParams_;
123 };
124
125 template <template <typename...> typename ContainerT, typename ElementT, typename... OtherArgs>
126 Table(TableArguments<ContainerT, ElementT, OtherArgs...>&& args) -> Table<ContainerT<ElementT, OtherArgs...>>;
127}
constexpr Table(TableArguments< ContainerT, ElementT, OtherArgs... > &&args)
Definition table.hpp:66
Nui::ElementRenderer operator()() &&
Definition table.hpp:70
A wrapper around the html table elements.
Definition table.hpp:59
Definition observed_value.hpp:1283
Definition dialog.hpp:10
static auto nil()
Definition nil.hpp:7
auto visitOverloaded(std::variant< VariantTypes... > const &variant, VisitFunctionTypes &&... visitFunctions)
Definition visit_overloaded.hpp:10
std::function< std::shared_ptr< Dom::Element >(Dom::Element &, Renderer const &)> ElementRenderer
Definition element_renderer.hpp:11
ObservedRange< ObservedValue > range(ObservedValue &observedValues)
Definition range.hpp:83
Definition table.hpp:20
std::vector< Attribute > tableAttributes
Attributes to be forwarded to the table element.
Definition table.hpp:37
std::function< Nui::ElementRenderer()> footerRenderer
The renderer for the footer. Can be empty.
Definition table.hpp:34
std::vector< Attribute > footerAttributes
Attributes to be forwarded to the footer element.
Definition table.hpp:49
std::vector< Attribute > bodyAttributes
Attributes to be forwarded to the body element.
Definition table.hpp:46
std::function< Nui::ElementRenderer()> headerRenderer
The renderer for the header. Can be empty.
Definition table.hpp:28
std::vector< Attribute > captionAttributes
Attributes to be forwarded to the caption element.
Definition table.hpp:40
Nui::Observed< ContainerT< ElementT, OtherArgs... > > & tableModel
Contains the data to be displayed in the table.
Definition table.hpp:22
std::function< Nui::ElementRenderer(long long i, ElementT const &)> rowRenderer
The renderer for each row.
Definition table.hpp:31
std::variant< std::monostate, std::string, Nui::Observed< std::string > const * > caption
The caption of the table. Can be static, observed or off.
Definition table.hpp:25
std::vector< Attribute > headerAttributes
Attributes to be forwarded to the header element.
Definition table.hpp:43