mirror of
https://github.com/esphome/esphome.git
synced 2024-11-17 10:55:36 +01:00
Expose select on Frontend web_server:
(#2245)
This commit is contained in:
parent
63a186bdf9
commit
8a2b1d9359
@ -25,7 +25,8 @@ namespace web_server {
|
|||||||
|
|
||||||
static const char *const TAG = "web_server";
|
static const char *const TAG = "web_server";
|
||||||
|
|
||||||
void write_row(AsyncResponseStream *stream, Nameable *obj, const std::string &klass, const std::string &action) {
|
void write_row(AsyncResponseStream *stream, Nameable *obj, const std::string &klass, const std::string &action,
|
||||||
|
const std::function<void(AsyncResponseStream &stream, Nameable *obj)> &action_func = nullptr) {
|
||||||
if (obj->is_internal())
|
if (obj->is_internal())
|
||||||
return;
|
return;
|
||||||
stream->print("<tr class=\"");
|
stream->print("<tr class=\"");
|
||||||
@ -38,6 +39,9 @@ void write_row(AsyncResponseStream *stream, Nameable *obj, const std::string &kl
|
|||||||
stream->print(obj->get_name().c_str());
|
stream->print(obj->get_name().c_str());
|
||||||
stream->print("</td><td></td><td>");
|
stream->print("</td><td></td><td>");
|
||||||
stream->print(action.c_str());
|
stream->print(action.c_str());
|
||||||
|
if (action_func) {
|
||||||
|
action_func(*stream, obj);
|
||||||
|
}
|
||||||
stream->print("</td>");
|
stream->print("</td>");
|
||||||
stream->print("</tr>");
|
stream->print("</tr>");
|
||||||
}
|
}
|
||||||
@ -219,7 +223,17 @@ void WebServer::handle_index_request(AsyncWebServerRequest *request) {
|
|||||||
|
|
||||||
#ifdef USE_SELECT
|
#ifdef USE_SELECT
|
||||||
for (auto *obj : App.get_selects())
|
for (auto *obj : App.get_selects())
|
||||||
write_row(stream, obj, "select", "");
|
write_row(stream, obj, "select", "", [](AsyncResponseStream &stream, Nameable *obj) {
|
||||||
|
select::Select *select = (select::Select *) obj;
|
||||||
|
stream.print("<select>");
|
||||||
|
stream.print("<option></option>");
|
||||||
|
for (auto const &option : select->traits.get_options()) {
|
||||||
|
stream.print("<option>");
|
||||||
|
stream.print(option.c_str());
|
||||||
|
stream.print("</option>");
|
||||||
|
}
|
||||||
|
stream.print("</select>");
|
||||||
|
});
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
stream->print(F("</tbody></table><p>See <a href=\"https://esphome.io/web-api/index.html\">ESPHome Web API</a> for "
|
stream->print(F("</tbody></table><p>See <a href=\"https://esphome.io/web-api/index.html\">ESPHome Web API</a> for "
|
||||||
@ -648,10 +662,29 @@ void WebServer::handle_select_request(AsyncWebServerRequest *request, const UrlM
|
|||||||
continue;
|
continue;
|
||||||
if (obj->get_object_id() != match.id)
|
if (obj->get_object_id() != match.id)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (request->method() == HTTP_GET) {
|
||||||
std::string data = this->select_json(obj, obj->state);
|
std::string data = this->select_json(obj, obj->state);
|
||||||
request->send(200, "text/json", data.c_str());
|
request->send(200, "text/json", data.c_str());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (match.method != "set") {
|
||||||
|
request->send(404);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto call = obj->make_call();
|
||||||
|
|
||||||
|
if (request->hasParam("option")) {
|
||||||
|
String option = request->getParam("option")->value();
|
||||||
|
call.set_option(option.c_str()); // NOLINT(clang-diagnostic-deprecated-declarations)
|
||||||
|
}
|
||||||
|
|
||||||
|
this->defer([call]() mutable { call.perform(); });
|
||||||
|
request->send(200);
|
||||||
|
return;
|
||||||
|
}
|
||||||
request->send(404);
|
request->send(404);
|
||||||
}
|
}
|
||||||
std::string WebServer::select_json(select::Select *obj, const std::string &value) {
|
std::string WebServer::select_json(select::Select *obj, const std::string &value) {
|
||||||
@ -721,7 +754,7 @@ bool WebServer::canHandle(AsyncWebServerRequest *request) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef USE_SELECT
|
#ifdef USE_SELECT
|
||||||
if (request->method() == HTTP_GET && match.domain == "select")
|
if ((request->method() == HTTP_POST || request->method() == HTTP_GET) && match.domain == "select")
|
||||||
return true;
|
return true;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user