Add format attribute with AutoConnectText

pull/57/head
Hieromon Ikasamo 6 years ago
parent ff04fde1af
commit d210181e5d
  1. 7
      examples/FileUpload/FileUpload.ino
  2. 4
      src/AutoConnectElementBasis.h
  3. 17
      src/AutoConnectElementBasisImpl.h
  4. 4
      src/AutoConnectElementJson.h
  5. 5
      src/AutoConnectElementJsonImpl.h

@ -73,12 +73,13 @@ static const char PAGE_BROWSE[] PROGMEM = R"(
}, },
{ {
"name": "size", "name": "size",
"type": "ACText" "type": "ACText",
"format": "%s bytes uploaded"
}, },
{ {
"name": "content_type", "name": "content_type",
"type": "ACText", "type": "ACText",
"value": "Content: " "format": "Content: %s"
} }
] ]
} }
@ -108,7 +109,7 @@ String postUpload(AutoConnectAux& aux, PageArgument& args) {
String content; String content;
String filename = auxUpload.getElement<AutoConnectFile>("filename").value; String filename = auxUpload.getElement<AutoConnectFile>("filename").value;
aux.getElement<AutoConnectText>("filename").value = filename; aux.getElement<AutoConnectText>("filename").value = filename;
aux.getElement<AutoConnectText>("size").value = String(auxUpload.getElement<AutoConnectFile>("filename").size) + String("bytes uploaded"); aux.getElement<AutoConnectText>("size").value = String(auxUpload.getElement<AutoConnectFile>("filename").size);
String contentType = auxUpload.getElement<AutoConnectFile>("filename").mimeType; String contentType = auxUpload.getElement<AutoConnectFile>("filename").mimeType;
aux.getElement<AutoConnectText>("content_type").value = contentType; aux.getElement<AutoConnectText>("content_type").value = contentType;
if (contentType.indexOf("text/") >= 0) { if (contentType.indexOf("text/") >= 0) {

@ -233,18 +233,20 @@ class AutoConnectSubmitBasis : virtual public AutoConnectElementBasis {
* @param name Text name string. * @param name Text name string.
* @param value Text value string. * @param value Text value string.
* @param style A string of style-code for decoration, optionally. * @param style A string of style-code for decoration, optionally.
* @param format C string that contains the value to be formatted.
* An arrangement text would be placed with <div> contains. A string * An arrangement text would be placed with <div> contains. A string
* of style-codes are given for '<div style=>'. * of style-codes are given for '<div style=>'.
*/ */
class AutoConnectTextBasis : virtual public AutoConnectElementBasis { class AutoConnectTextBasis : virtual public AutoConnectElementBasis {
public: public:
explicit AutoConnectTextBasis(const char* name = "", const char* value = "", const char* style = "") : AutoConnectElementBasis(name, value), style(String(style)) { explicit AutoConnectTextBasis(const char* name = "", const char* value = "", const char* style = "", const char* format = "") : AutoConnectElementBasis(name, value), style(String(style)), format(String(format)) {
_type = AC_Text; _type = AC_Text;
} }
virtual ~AutoConnectTextBasis() {} virtual ~AutoConnectTextBasis() {}
const String toHTML(void) const override; const String toHTML(void) const override;
String style; /**< CSS style modifier native code */ String style; /**< CSS style modifier native code */
String format; /**< C string that contains the text to be written */
}; };
#endif // _AUTOCONNECTELEMENTBASIS_H_ #endif // _AUTOCONNECTELEMENTBASIS_H_

@ -10,12 +10,14 @@
#ifndef _AUTOCONNECTELEMENTBASISIMPL_H_ #ifndef _AUTOCONNECTELEMENTBASISIMPL_H_
#define _AUTOCONNECTELEMENTBASISIMPL_H_ #define _AUTOCONNECTELEMENTBASISIMPL_H_
#include "AutoConnectElementBasis.h" #include <stdlib.h>
#include <stdio.h>
#if defined(ARDUINO_ARCH_ESP8266) #if defined(ARDUINO_ARCH_ESP8266)
#include <regex.h> #include <regex.h>
#elif defined(ARDUINO_ARCH_ESP32) #elif defined(ARDUINO_ARCH_ESP32)
#include <regex> #include <regex>
#endif #endif
#include "AutoConnectElementBasis.h"
/** /**
* Generate an HTML <button> element. The onclick behavior depends on * Generate an HTML <button> element. The onclick behavior depends on
@ -251,10 +253,21 @@ const String AutoConnectSubmitBasis::toHTML(void) const {
*/ */
const String AutoConnectTextBasis::toHTML(void) const { const String AutoConnectTextBasis::toHTML(void) const {
String html = String("<div"); String html = String("<div");
String value_f = value;
if (style.length()) if (style.length())
html += String(F(" style=\"")) + style + String("\""); html += String(F(" style=\"")) + style + String("\"");
html += String(">") + value + String(F("</div>")); html += String(">");
if (format.length()) {
int buflen = (value.length() + format.length() + 16 + 1) & (~0xf);
char* buffer;
if ((buffer = (char*)malloc(buflen))) {
snprintf(buffer, buflen, format.c_str(), value.c_str());
value_f = String(buffer);
free(buffer);
}
}
html += value_f + String(F("</div>"));
return html; return html;
} }

@ -17,6 +17,7 @@
#define AUTOCONNECT_JSON_KEY_ARRANGE "arrange" #define AUTOCONNECT_JSON_KEY_ARRANGE "arrange"
#define AUTOCONNECT_JSON_KEY_CHECKED "checked" #define AUTOCONNECT_JSON_KEY_CHECKED "checked"
#define AUTOCONNECT_JSON_KEY_ELEMENT "element" #define AUTOCONNECT_JSON_KEY_ELEMENT "element"
#define AUTOCONNECT_JSON_KEY_FORMAT "format"
#define AUTOCONNECT_JSON_KEY_LABEL "label" #define AUTOCONNECT_JSON_KEY_LABEL "label"
#define AUTOCONNECT_JSON_KEY_MENU "menu" #define AUTOCONNECT_JSON_KEY_MENU "menu"
#define AUTOCONNECT_JSON_KEY_NAME "name" #define AUTOCONNECT_JSON_KEY_NAME "name"
@ -234,10 +235,11 @@ class AutoConnectSubmitJson : public AutoConnectElementJson, public AutoConnectS
*/ */
class AutoConnectTextJson : public AutoConnectElementJson, public AutoConnectTextBasis { class AutoConnectTextJson : public AutoConnectElementJson, public AutoConnectTextBasis {
public: public:
explicit AutoConnectTextJson(const char* name = "", const char* value = "", const char* style = "") { explicit AutoConnectTextJson(const char* name = "", const char* value = "", const char* style = "", const char* format = "") {
AutoConnectTextBasis::name = String(name); AutoConnectTextBasis::name = String(name);
AutoConnectTextBasis::value = String(value); AutoConnectTextBasis::value = String(value);
AutoConnectTextBasis::style = String(style); AutoConnectTextBasis::style = String(style);
AutoConnectTextBasis::format = String(format);
} }
~AutoConnectTextJson() {} ~AutoConnectTextJson() {}
size_t getObjectSize(void) const override; size_t getObjectSize(void) const override;

@ -394,7 +394,7 @@ void AutoConnectSubmitJson::serialize(JsonObject& json) {
* @return An object size for JsonBuffer. * @return An object size for JsonBuffer.
*/ */
size_t AutoConnectTextJson::getObjectSize() const { size_t AutoConnectTextJson::getObjectSize() const {
return AutoConnectElementJson::getObjectSize() + JSON_OBJECT_SIZE(1); return AutoConnectElementJson::getObjectSize() + JSON_OBJECT_SIZE(2);
} }
/** /**
@ -409,6 +409,8 @@ bool AutoConnectTextJson::loadMember(const JsonObject& json) {
_setMember(json); _setMember(json);
if (json.containsKey(F(AUTOCONNECT_JSON_KEY_STYLE))) if (json.containsKey(F(AUTOCONNECT_JSON_KEY_STYLE)))
style = json.get<String>(F(AUTOCONNECT_JSON_KEY_STYLE)); style = json.get<String>(F(AUTOCONNECT_JSON_KEY_STYLE));
if (json.containsKey(F(AUTOCONNECT_JSON_KEY_FORMAT)))
format = json.get<String>(F(AUTOCONNECT_JSON_KEY_FORMAT));
return true; return true;
} }
return false; return false;
@ -423,6 +425,7 @@ void AutoConnectTextJson::serialize(JsonObject& json) {
json.set(F(AUTOCONNECT_JSON_KEY_TYPE), F(AUTOCONNECT_JSON_TYPE_ACTEXT)); json.set(F(AUTOCONNECT_JSON_KEY_TYPE), F(AUTOCONNECT_JSON_TYPE_ACTEXT));
json.set(F(AUTOCONNECT_JSON_KEY_VALUE), value); json.set(F(AUTOCONNECT_JSON_KEY_VALUE), value);
json.set(F(AUTOCONNECT_JSON_KEY_STYLE), style); json.set(F(AUTOCONNECT_JSON_KEY_STYLE), style);
json.set(F(AUTOCONNECT_JSON_KEY_FORMAT), format);
} }
#endif // _AUTOCONNECTELEMENTJSONIMPL_H_ #endif // _AUTOCONNECTELEMENTJSONIMPL_H_

Loading…
Cancel
Save