formscreen.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. import { fullscreen } from "./fullscreen.js";
  2. export class formscreen extends fullscreen {
  3. #form;
  4. #result;
  5. constructor() {
  6. super();
  7. this.#form = null;
  8. this.#result = null;
  9. }
  10. get _name() {
  11. throw new TypeError("This is virtual getter!");
  12. }
  13. _process() {
  14. this._error = "This is abstract, and must be overwriten.";
  15. }
  16. _build_form() {
  17. throw new TypeError("This is virtual method!");
  18. }
  19. _get_input(name) {
  20. return this.get_query("input[name=\"" + name + "\"]");
  21. }
  22. _build_node() {
  23. const center = document.createElement("div");
  24. center.classList.add("center");
  25. const title = document.createElement("div");
  26. title.classList.add("title");
  27. center.appendChild(title);
  28. const title_content = document.createElement("h3");
  29. title_content.innerText = this._name;
  30. title.appendChild(title_content);
  31. const form = document.createElement("form");
  32. center.appendChild(form);
  33. form.addEventListener("click", () => {
  34. this._clear_results();
  35. });
  36. this.#form = document.createElement("div");
  37. this.#form.classList.add("content");
  38. form.appendChild(this.#form);
  39. this.#result = document.createElement("div");
  40. this.#result.classList.add("result");
  41. form.appendChild(this.#result);
  42. const bottom = document.createElement("div");
  43. bottom.classList.add("bottom");
  44. form.appendChild(bottom);
  45. const close_button = document.createElement("button");
  46. close_button.classList.add("close");
  47. close_button.classList.add("material-icons");
  48. close_button.innerText = "close";
  49. close_button.type = "button";
  50. bottom.appendChild(close_button);
  51. const send_button = document.createElement("button");
  52. send_button.classList.add("send");
  53. send_button.classList.add("material-icons");
  54. send_button.innerText = "send";
  55. send_button.type = "submit";
  56. bottom.appendChild(send_button);
  57. close_button.addEventListener("click", () => {
  58. this.hide();
  59. });
  60. form.addEventListener("submit", (target) => {
  61. target.preventDefault();
  62. this._process();
  63. });
  64. this._build_form();
  65. return center;
  66. }
  67. _create_input(name, label_text, placeholder, worker = null) {
  68. const container = document.createElement("div");
  69. container.classList.add("input-container");
  70. container.classList.add("input-" + name);
  71. const label = document.createElement("label");
  72. label.htmlFor = name;
  73. label.innerText = label_text;
  74. container.appendChild(label);
  75. const input = document.createElement("input");
  76. input.type = "text";
  77. input.placeholder = placeholder;
  78. input.name = name;
  79. input.id = name;
  80. container.appendChild(input);
  81. if (worker !== null) {
  82. worker(input);
  83. }
  84. if (!this.#form) {
  85. throw new Error("Screen is not visible yet!");
  86. }
  87. this.#form.appendChild(container);
  88. return () => {
  89. return input.value;
  90. };
  91. }
  92. _clear_results() {
  93. if (!this.#result) {
  94. return;
  95. }
  96. while (this.#result.lastChild) {
  97. this.#result.lastChild.remove();
  98. }
  99. }
  100. set _info(target) {
  101. this._clear_results();
  102. const info = document.createElement("p");
  103. info.classList.add("info");
  104. info.innerText = target;
  105. if (this.#result) {
  106. this.#result.appendChild(info);
  107. }
  108. }
  109. set _error(target) {
  110. this._clear_results();
  111. const info = document.createElement("p");
  112. info.classList.add("error");
  113. info.innerText = target;
  114. if (this.#result) {
  115. this.#result.appendChild(info);
  116. }
  117. }
  118. set _success(target) {
  119. this._clear_results();
  120. const info = document.createElement("p");
  121. info.classList.add("success");
  122. info.innerText = target;
  123. if (this.#result) {
  124. this.#result.appendChild(info);
  125. }
  126. }
  127. }