134 lines
7.7 KiB
C++
134 lines
7.7 KiB
C++
#include "adminive/adminive.hpp"
|
|
#include "adminive/adapters/nlohmann_json.hpp"
|
|
#include <cassert>
|
|
#include <stdexcept>
|
|
#include <string>
|
|
namespace view_test {
|
|
using Json = nlohmann::json;
|
|
struct Config {
|
|
std::string name{"Alpha"};
|
|
int count{3};
|
|
bool enabled{true};
|
|
std::string color{"#336699"};
|
|
};
|
|
}
|
|
namespace adminive {
|
|
template <>
|
|
struct Type_Descriptor<view_test::Config> {
|
|
static auto get() {
|
|
using T = view_test::Config;
|
|
return object<T>("view_config", "View Config", ADMINIVE_FIELD(T, name).editable().creatable().label("Name").text_input(), ADMINIVE_FIELD(T, count).editable().creatable().label("Count").number_input(), ADMINIVE_FIELD(T, enabled).editable().creatable().label("Enabled").boolean_input(), ADMINIVE_FIELD(T, color).editable().creatable().label("Color").color_input());
|
|
}
|
|
};
|
|
template <>
|
|
struct Type_View_Descriptor<view_test::Config> {
|
|
static Form_View edit() {
|
|
using T = view_test::Config;
|
|
return edit_form<T>(vertical(group("Identity", horizontal(use<&T::name>(), use<&T::enabled>())), grid(2, use<&T::count>(), card("Appearance", use<&T::color>())), flow(card("Name Card", use<&T::name>()), card("Count Card", use<&T::count>())), tabs(tab("General", use<&T::name>(), use<&T::count>()), tab("Visual", use<&T::color>())))).submit("Save");
|
|
}
|
|
static Table_View table() {
|
|
using T = view_test::Config;
|
|
return table_view<T>(column<&T::name>("Name").search().fix(Table_Fixed::left), column<&T::count>("Count").sort(), column<&T::enabled>("Enabled").filter(), column<&T::color>("Color")).titled("Configs").default_sort("count", true).create_layout(grid(2, use<&T::name>(), use<&T::count>(), use<&T::enabled>(), use<&T::color>())).edit_layout(vertical(use<&T::name>(), horizontal(use<&T::count>(), use<&T::enabled>()), use<&T::color>()));
|
|
}
|
|
};
|
|
}
|
|
int main() {
|
|
using view_test::Config;
|
|
using view_test::Json;
|
|
const auto descriptor = adminive::to_descriptor_json<Json, Config>();
|
|
assert(descriptor.at("fields").at(0).at("presentation").at("label") == "Name");
|
|
assert(descriptor.at("fields").at(0).at("presentation").at("control") == "text");
|
|
assert(!descriptor.at("fields").at(0).contains("sortable"));
|
|
const auto form_view = adminive::describe_edit_view<Config>();
|
|
adminive::validate_form_view<Config>(form_view);
|
|
const auto form_json = adminive::to_view_json<Json, Config>(form_view);
|
|
assert(form_json.at("kind") == "form");
|
|
assert(form_json.at("body").at("kind") == "vertical");
|
|
assert(form_json.at("body").at("children").at(0).at("kind") == "group");
|
|
assert(form_json.at("body").at("children").at(1).at("kind") == "grid");
|
|
assert(form_json.at("body").at("children").at(2).at("kind") == "flow");
|
|
assert(form_json.at("body").at("children").at(3).at("kind") == "tabs");
|
|
Config config;
|
|
const auto form_amis = adminive::to_amis_form_schema<Json>(config, form_view, "/config/data");
|
|
assert(form_amis.at("type") == "form");
|
|
assert(form_amis.at("actions").at(1).at("label") == "Save");
|
|
assert(form_amis.at("body").at(0).at("type") == "fieldset");
|
|
assert(form_amis.at("body").at(1).at("type") == "grid");
|
|
assert(form_amis.at("body").at(2).at("type") == "flex");
|
|
assert(form_amis.at("body").at(2).at("items").at(0).at("type") == "container");
|
|
assert(form_amis.at("body").at(2).at("items").at(1).at("type") == "container");
|
|
assert(form_amis.at("body").at(2).at("items").at(0).at("body").at(0).at("type") == "card");
|
|
assert(form_amis.at("body").at(3).at("type") == "tabs");
|
|
const auto table_view = adminive::describe_table_view<Config>();
|
|
adminive::validate_table_view<Config>(table_view);
|
|
const auto table_json = adminive::to_view_json<Json, Config>(table_view);
|
|
assert(table_json.at("kind") == "table");
|
|
assert(table_json.at("columns").at(0).at("searchable") == true);
|
|
assert(table_json.at("columns").at(0).at("fixed") == "left");
|
|
assert(table_json.at("columns").at(1).at("sortable") == true);
|
|
assert(table_json.at("columns").at(2).at("filterable") == true);
|
|
assert(table_json.at("default_order_by") == "count");
|
|
assert(table_json.at("default_order_dir") == "desc");
|
|
const auto composition = adminive::composition_view("config_page", adminive::compose::vertical(adminive::compose::heading("Config Page").accent("#123456"), adminive::compose::horizontal(adminive::compose::slot("form"), adminive::compose::slot("table"))));
|
|
const auto composition_json = adminive::to_view_json<Json>(composition);
|
|
assert(composition_json.at("kind") == "composition");
|
|
assert(composition_json.at("body").at("children").at(0).at("kind") == "heading");
|
|
const auto composition_amis = adminive::to_amis_composition_schema<Json>(composition, {{"form", form_amis}, {"table", Json{{"type", "tpl"}, {"tpl", "table"}}}});
|
|
assert(composition_amis.at("body").at(0).at("type") == "tpl");
|
|
assert(composition_amis.at("body").at(1).at("type") == "grid");
|
|
const auto flow_composition = adminive::composition_view("flow_page", adminive::compose::flow(adminive::compose::slot("left"), adminive::compose::slot("right")));
|
|
const auto flow_amis = adminive::to_amis_composition_schema<Json>(flow_composition, {{"left", Json{{"type", "tpl"}, {"tpl", "left"}}}, {"right", Json{{"type", "tpl"}, {"tpl", "right"}}}});
|
|
assert(flow_amis.at("body").at(0).at("type") == "flex");
|
|
assert(flow_amis.at("body").at(0).at("items").at(0).at("type") == "container");
|
|
assert(flow_amis.at("body").at(0).at("items").at(1).at("type") == "container");
|
|
const auto table_amis = adminive::to_amis_table_schema<Json, Config>("/configs", table_view);
|
|
assert(table_amis.at("type") == "page");
|
|
assert(table_amis.at("body").at(0).at("columns").at(1).at("searchable") == true);
|
|
assert(table_amis.at("body").at(0).at("columns").at(2).at("sortable") == true);
|
|
assert(table_amis.at("body").at(0).at("columns").at(3).at("filterable") == true);
|
|
adminive::Collection_Service<Config, Json, adminive::No_Lock> collection("/configs", {Config{"Alpha", 3, true, "#111111"}, Config{"Beta", 7, false, "#222222"}, Config{"Alphabet", 5, true, "#333333"}});
|
|
adminive::Collection_Query query;
|
|
query.fields["name"] = "alpha";
|
|
auto response = collection.list_response(query);
|
|
assert(response.status == 200);
|
|
assert(response.body.at("data").at("total") == 2);
|
|
assert(response.body.at("data").at("items").at(0).at("count") == 5);
|
|
query = {};
|
|
query.fields["enabled"] = "true";
|
|
response = collection.list_response(query);
|
|
assert(response.status == 200);
|
|
assert(response.body.at("data").at("total") == 2);
|
|
query = {};
|
|
query.order_by = "count";
|
|
query.order_dir = "asc";
|
|
response = collection.list_response(query);
|
|
assert(response.status == 200);
|
|
assert(response.body.at("data").at("items").at(0).at("count") == 3);
|
|
query = {};
|
|
query.fields["color"] = "#111111";
|
|
response = collection.list_response(query);
|
|
assert(response.status == 400);
|
|
bool invalid_grid{};
|
|
try {
|
|
adminive::validate_form_view<Config>(adminive::edit_form<Config>(adminive::grid(0, adminive::use<&Config::name>())));
|
|
} catch(const std::invalid_argument&) {
|
|
invalid_grid = true;
|
|
}
|
|
assert(invalid_grid);
|
|
bool invalid_tabs{};
|
|
try {
|
|
adminive::validate_form_view<Config>(adminive::edit_form<Config>(adminive::tabs(adminive::use<&Config::name>())));
|
|
} catch(const std::invalid_argument&) {
|
|
invalid_tabs = true;
|
|
}
|
|
assert(invalid_tabs);
|
|
bool invalid_sort{};
|
|
try {
|
|
adminive::validate_table_view<Config>(adminive::table_view<Config>(adminive::column<&Config::name>()).default_sort("name"));
|
|
} catch(const std::invalid_argument&) {
|
|
invalid_sort = true;
|
|
}
|
|
assert(invalid_sort);
|
|
return 0;
|
|
}
|