jens-scheffler-bosch commented on code in PR #27063:
URL: https://github.com/apache/airflow/pull/27063#discussion_r1088336825


##########
airflow/www/templates/airflow/trigger.html:
##########
@@ -27,11 +27,93 @@
   <link rel="stylesheet" type="text/css" href="{{ url_for_asset('switch.css') 
}}">
 {% endblock %}
 
+{% macro form_element(form_key, form_details) %}
+<tr>
+  <td class="col-lg-2">
+    <label for="element_{{ form_key }}" control-label="">
+      {%- if "title" in form_details.schema and form_details.schema.title -%}
+        {{ form_details.schema.title }}
+      {%- else -%}
+        {{ form_key }}
+      {%- endif -%}
+      {%- if form_details.schema and form_details.schema.type and not "null" 
in form_details.schema.type and not "boolean" in form_details.schema.type -%}
+        <strong style="color: red"> *</strong>
+      {%- endif -%}
+    : </label>
+  </td>
+  <td>
+    {% if "custom_html_form" in form_details.schema %}
+      {{ form_details.schema.custom_html_form | replace("{name}", "element_" + 
form_key) | replace("{value}", form_details.value) }}
+    {% elif "type" in form_details.schema and form_details.schema.type == 
"boolean" %}
+      <label for="element_{{ form_key }}" control-label="">
+        <input class="switch-input" name="element_{{ form_key }}" 
id="element_{{ form_key }}" type="checkbox"
+          {%- if form_details.value %} checked="checked"{%- endif -%}/>
+        <span class="switch" aria-hidden="true"></span>
+      </label>

Review Comment:
   These lines render a boolean switch.
   
![image](https://user-images.githubusercontent.com/95105677/214949669-fc25cca3-b3e5-44f5-9932-61902d685222.png)
   



##########
airflow/www/templates/airflow/trigger.html:
##########
@@ -27,11 +27,93 @@
   <link rel="stylesheet" type="text/css" href="{{ url_for_asset('switch.css') 
}}">
 {% endblock %}
 
+{% macro form_element(form_key, form_details) %}
+<tr>
+  <td class="col-lg-2">
+    <label for="element_{{ form_key }}" control-label="">
+      {%- if "title" in form_details.schema and form_details.schema.title -%}
+        {{ form_details.schema.title }}
+      {%- else -%}
+        {{ form_key }}
+      {%- endif -%}
+      {%- if form_details.schema and form_details.schema.type and not "null" 
in form_details.schema.type and not "boolean" in form_details.schema.type -%}
+        <strong style="color: red"> *</strong>
+      {%- endif -%}
+    : </label>
+  </td>
+  <td>
+    {% if "custom_html_form" in form_details.schema %}
+      {{ form_details.schema.custom_html_form | replace("{name}", "element_" + 
form_key) | replace("{value}", form_details.value) }}
+    {% elif "type" in form_details.schema and form_details.schema.type == 
"boolean" %}
+      <label for="element_{{ form_key }}" control-label="">
+        <input class="switch-input" name="element_{{ form_key }}" 
id="element_{{ form_key }}" type="checkbox"
+          {%- if form_details.value %} checked="checked"{%- endif -%}/>
+        <span class="switch" aria-hidden="true"></span>
+      </label>
+    {% elif "format" in form_details.schema and "date-time" in 
form_details.schema.format %}
+      <div class="input-group datetime datetimepicker">
+        <span class="input-group-addon"><span class="material-icons 
cursor-hand">calendar_today</span></span>
+        <input class="form-control" name="element_{{ form_key }}" 
id="element_{{ form_key }}" type="text" valuetype="date"
+          {%- if not "null" in form_details.schema.type %} required=""{%- 
endif %} value="{% if form_details.value %}{{ form_details.value }}{% endif %}" 
/>
+      </div>

Review Comment:
   These lines render a date-time picker (Unfortunately I'm not able to 
screen-capture the pupp of the date/time picker but it is the same like on 
other UI parts:
   
![image](https://user-images.githubusercontent.com/95105677/214950315-971300b7-9448-4630-a83d-7a359ae7346b.png)
   



##########
airflow/www/templates/airflow/trigger.html:
##########
@@ -27,11 +27,93 @@
   <link rel="stylesheet" type="text/css" href="{{ url_for_asset('switch.css') 
}}">
 {% endblock %}
 
+{% macro form_element(form_key, form_details) %}
+<tr>
+  <td class="col-lg-2">
+    <label for="element_{{ form_key }}" control-label="">
+      {%- if "title" in form_details.schema and form_details.schema.title -%}
+        {{ form_details.schema.title }}
+      {%- else -%}
+        {{ form_key }}
+      {%- endif -%}
+      {%- if form_details.schema and form_details.schema.type and not "null" 
in form_details.schema.type and not "boolean" in form_details.schema.type -%}
+        <strong style="color: red"> *</strong>
+      {%- endif -%}
+    : </label>
+  </td>

Review Comment:
   This block renders the form label, either using the key or the display label 
if given. A red star is added if field is required to have content before 
submit:
   
![image](https://user-images.githubusercontent.com/95105677/214949400-ef4b614d-7c59-4e02-90d2-0fce08f801df.png)
   



##########
airflow/www/templates/airflow/trigger.html:
##########
@@ -27,11 +27,93 @@
   <link rel="stylesheet" type="text/css" href="{{ url_for_asset('switch.css') 
}}">
 {% endblock %}
 
+{% macro form_element(form_key, form_details) %}
+<tr>
+  <td class="col-lg-2">
+    <label for="element_{{ form_key }}" control-label="">
+      {%- if "title" in form_details.schema and form_details.schema.title -%}
+        {{ form_details.schema.title }}
+      {%- else -%}
+        {{ form_key }}
+      {%- endif -%}
+      {%- if form_details.schema and form_details.schema.type and not "null" 
in form_details.schema.type and not "boolean" in form_details.schema.type -%}
+        <strong style="color: red"> *</strong>
+      {%- endif -%}
+    : </label>
+  </td>
+  <td>
+    {% if "custom_html_form" in form_details.schema %}
+      {{ form_details.schema.custom_html_form | replace("{name}", "element_" + 
form_key) | replace("{value}", form_details.value) }}
+    {% elif "type" in form_details.schema and form_details.schema.type == 
"boolean" %}
+      <label for="element_{{ form_key }}" control-label="">
+        <input class="switch-input" name="element_{{ form_key }}" 
id="element_{{ form_key }}" type="checkbox"
+          {%- if form_details.value %} checked="checked"{%- endif -%}/>
+        <span class="switch" aria-hidden="true"></span>
+      </label>
+    {% elif "format" in form_details.schema and "date-time" in 
form_details.schema.format %}
+      <div class="input-group datetime datetimepicker">
+        <span class="input-group-addon"><span class="material-icons 
cursor-hand">calendar_today</span></span>
+        <input class="form-control" name="element_{{ form_key }}" 
id="element_{{ form_key }}" type="text" valuetype="date"
+          {%- if not "null" in form_details.schema.type %} required=""{%- 
endif %} value="{% if form_details.value %}{{ form_details.value }}{% endif %}" 
/>
+      </div>
+    {% elif "format" in form_details.schema and "date" in 
form_details.schema.format %}
+      <div class="input-group datetime datepicker">
+        <span class="input-group-addon"><span class="material-icons 
cursor-hand">calendar_today</span></span>
+        <input class="form-control" name="element_{{ form_key }}" 
id="element_{{ form_key }}" type="text" valuetype="date"
+          {%- if not "null" in form_details.schema.type %} required=""{%- 
endif %} value="{% if form_details.value %}{{ form_details.value }}{% endif %}" 
/>
+      </div>
+    {% elif "format" in form_details.schema and "time" in 
form_details.schema.format %}
+      <div class="input-group datetime timepicker">
+        <span class="input-group-addon"><span class="material-icons 
cursor-hand">calendar_today</span></span>
+        <input class="form-control" name="element_{{ form_key }}" 
id="element_{{ form_key }}" type="text" valuetype="date"
+          {%- if not "null" in form_details.schema.type %} required=""{%- 
endif %}
+          value="{% if form_details.value %}{{ form_details.value[0:2] 
}}00-01-01 {{ form_details.value }}{% endif %}" />
+      </div>
+    {% elif "enum" in form_details.schema and form_details.schema.enum %}
+      <select class="my_select2 form-control" name="element_{{ form_key }}" 
id="element_{{ form_key }}" data-placeholder="Select Value"
+        value="{% if form_details.value %}{{ form_details.value }}{% endif %}" 
onchange="updateJSONconf();"
+        {%- if not "null" in form_details.schema.type %} required=""{% endif 
%}>
+        {% for option in form_details.schema.enum -%}
+        <option>{{ option }}</option>
+        {% endfor -%}
+      </select>
+    {% elif form_details.schema and "array" in form_details.schema.type %}
+      <textarea class="form-control" name="element_{{ form_key }}" 
id="element_{{ form_key }}" valuetype="array" rows="6"
+        {%- if not "null" in form_details.schema.type %} required=""{% endif 
-%}>
+        {%- for txt in form_details.value -%}
+          {{ txt }}{{ "\n" }}
+        {%- endfor -%}
+      </textarea>

Review Comment:
   These lines generate a text list which will be used for array of strings:
   
![image](https://user-images.githubusercontent.com/95105677/214950963-8a381d7c-24b0-4696-992c-f4cf4104db90.png)
   



##########
airflow/www/templates/airflow/trigger.html:
##########
@@ -27,11 +27,93 @@
   <link rel="stylesheet" type="text/css" href="{{ url_for_asset('switch.css') 
}}">
 {% endblock %}
 
+{% macro form_element(form_key, form_details) %}
+<tr>
+  <td class="col-lg-2">
+    <label for="element_{{ form_key }}" control-label="">
+      {%- if "title" in form_details.schema and form_details.schema.title -%}
+        {{ form_details.schema.title }}
+      {%- else -%}
+        {{ form_key }}
+      {%- endif -%}
+      {%- if form_details.schema and form_details.schema.type and not "null" 
in form_details.schema.type and not "boolean" in form_details.schema.type -%}
+        <strong style="color: red"> *</strong>
+      {%- endif -%}
+    : </label>
+  </td>
+  <td>
+    {% if "custom_html_form" in form_details.schema %}
+      {{ form_details.schema.custom_html_form | replace("{name}", "element_" + 
form_key) | replace("{value}", form_details.value) }}
+    {% elif "type" in form_details.schema and form_details.schema.type == 
"boolean" %}
+      <label for="element_{{ form_key }}" control-label="">
+        <input class="switch-input" name="element_{{ form_key }}" 
id="element_{{ form_key }}" type="checkbox"
+          {%- if form_details.value %} checked="checked"{%- endif -%}/>
+        <span class="switch" aria-hidden="true"></span>
+      </label>
+    {% elif "format" in form_details.schema and "date-time" in 
form_details.schema.format %}
+      <div class="input-group datetime datetimepicker">
+        <span class="input-group-addon"><span class="material-icons 
cursor-hand">calendar_today</span></span>
+        <input class="form-control" name="element_{{ form_key }}" 
id="element_{{ form_key }}" type="text" valuetype="date"
+          {%- if not "null" in form_details.schema.type %} required=""{%- 
endif %} value="{% if form_details.value %}{{ form_details.value }}{% endif %}" 
/>
+      </div>
+    {% elif "format" in form_details.schema and "date" in 
form_details.schema.format %}
+      <div class="input-group datetime datepicker">
+        <span class="input-group-addon"><span class="material-icons 
cursor-hand">calendar_today</span></span>
+        <input class="form-control" name="element_{{ form_key }}" 
id="element_{{ form_key }}" type="text" valuetype="date"
+          {%- if not "null" in form_details.schema.type %} required=""{%- 
endif %} value="{% if form_details.value %}{{ form_details.value }}{% endif %}" 
/>
+      </div>
+    {% elif "format" in form_details.schema and "time" in 
form_details.schema.format %}
+      <div class="input-group datetime timepicker">
+        <span class="input-group-addon"><span class="material-icons 
cursor-hand">calendar_today</span></span>
+        <input class="form-control" name="element_{{ form_key }}" 
id="element_{{ form_key }}" type="text" valuetype="date"
+          {%- if not "null" in form_details.schema.type %} required=""{%- 
endif %}
+          value="{% if form_details.value %}{{ form_details.value[0:2] 
}}00-01-01 {{ form_details.value }}{% endif %}" />
+      </div>

Review Comment:
   Time picker (w/o date):
   
![image](https://user-images.githubusercontent.com/95105677/214950524-cddc0f65-0855-4104-bf52-1015df3f6dd6.png)
   



##########
airflow/www/templates/airflow/trigger.html:
##########
@@ -27,11 +27,93 @@
   <link rel="stylesheet" type="text/css" href="{{ url_for_asset('switch.css') 
}}">
 {% endblock %}
 
+{% macro form_element(form_key, form_details) %}
+<tr>
+  <td class="col-lg-2">
+    <label for="element_{{ form_key }}" control-label="">
+      {%- if "title" in form_details.schema and form_details.schema.title -%}
+        {{ form_details.schema.title }}
+      {%- else -%}
+        {{ form_key }}
+      {%- endif -%}
+      {%- if form_details.schema and form_details.schema.type and not "null" 
in form_details.schema.type and not "boolean" in form_details.schema.type -%}
+        <strong style="color: red"> *</strong>
+      {%- endif -%}
+    : </label>
+  </td>
+  <td>
+    {% if "custom_html_form" in form_details.schema %}
+      {{ form_details.schema.custom_html_form | replace("{name}", "element_" + 
form_key) | replace("{value}", form_details.value) }}
+    {% elif "type" in form_details.schema and form_details.schema.type == 
"boolean" %}
+      <label for="element_{{ form_key }}" control-label="">
+        <input class="switch-input" name="element_{{ form_key }}" 
id="element_{{ form_key }}" type="checkbox"
+          {%- if form_details.value %} checked="checked"{%- endif -%}/>
+        <span class="switch" aria-hidden="true"></span>
+      </label>
+    {% elif "format" in form_details.schema and "date-time" in 
form_details.schema.format %}
+      <div class="input-group datetime datetimepicker">
+        <span class="input-group-addon"><span class="material-icons 
cursor-hand">calendar_today</span></span>
+        <input class="form-control" name="element_{{ form_key }}" 
id="element_{{ form_key }}" type="text" valuetype="date"
+          {%- if not "null" in form_details.schema.type %} required=""{%- 
endif %} value="{% if form_details.value %}{{ form_details.value }}{% endif %}" 
/>
+      </div>
+    {% elif "format" in form_details.schema and "date" in 
form_details.schema.format %}
+      <div class="input-group datetime datepicker">
+        <span class="input-group-addon"><span class="material-icons 
cursor-hand">calendar_today</span></span>
+        <input class="form-control" name="element_{{ form_key }}" 
id="element_{{ form_key }}" type="text" valuetype="date"
+          {%- if not "null" in form_details.schema.type %} required=""{%- 
endif %} value="{% if form_details.value %}{{ form_details.value }}{% endif %}" 
/>
+      </div>
+    {% elif "format" in form_details.schema and "time" in 
form_details.schema.format %}
+      <div class="input-group datetime timepicker">
+        <span class="input-group-addon"><span class="material-icons 
cursor-hand">calendar_today</span></span>
+        <input class="form-control" name="element_{{ form_key }}" 
id="element_{{ form_key }}" type="text" valuetype="date"
+          {%- if not "null" in form_details.schema.type %} required=""{%- 
endif %}
+          value="{% if form_details.value %}{{ form_details.value[0:2] 
}}00-01-01 {{ form_details.value }}{% endif %}" />
+      </div>
+    {% elif "enum" in form_details.schema and form_details.schema.enum %}
+      <select class="my_select2 form-control" name="element_{{ form_key }}" 
id="element_{{ form_key }}" data-placeholder="Select Value"
+        value="{% if form_details.value %}{{ form_details.value }}{% endif %}" 
onchange="updateJSONconf();"
+        {%- if not "null" in form_details.schema.type %} required=""{% endif 
%}>
+        {% for option in form_details.schema.enum -%}
+        <option>{{ option }}</option>
+        {% endfor -%}
+      </select>

Review Comment:
   These lines generate a drop-down select:
   Shot 1 - view:
   
![image](https://user-images.githubusercontent.com/95105677/214950812-cd440798-62a2-43c3-a30f-33c10762f601.png)
   
   Shot 2 - dowp down open incl. filter - same linke on other select boxes in 
UI:
   
![image](https://user-images.githubusercontent.com/95105677/214950761-94d22897-09f0-48f0-a1f2-7af7f4fb7d24.png)
   



##########
airflow/www/templates/airflow/trigger.html:
##########
@@ -27,11 +27,93 @@
   <link rel="stylesheet" type="text/css" href="{{ url_for_asset('switch.css') 
}}">
 {% endblock %}
 
+{% macro form_element(form_key, form_details) %}
+<tr>
+  <td class="col-lg-2">
+    <label for="element_{{ form_key }}" control-label="">
+      {%- if "title" in form_details.schema and form_details.schema.title -%}
+        {{ form_details.schema.title }}
+      {%- else -%}
+        {{ form_key }}
+      {%- endif -%}
+      {%- if form_details.schema and form_details.schema.type and not "null" 
in form_details.schema.type and not "boolean" in form_details.schema.type -%}
+        <strong style="color: red"> *</strong>
+      {%- endif -%}
+    : </label>
+  </td>
+  <td>
+    {% if "custom_html_form" in form_details.schema %}
+      {{ form_details.schema.custom_html_form | replace("{name}", "element_" + 
form_key) | replace("{value}", form_details.value) }}
+    {% elif "type" in form_details.schema and form_details.schema.type == 
"boolean" %}
+      <label for="element_{{ form_key }}" control-label="">
+        <input class="switch-input" name="element_{{ form_key }}" 
id="element_{{ form_key }}" type="checkbox"
+          {%- if form_details.value %} checked="checked"{%- endif -%}/>
+        <span class="switch" aria-hidden="true"></span>
+      </label>
+    {% elif "format" in form_details.schema and "date-time" in 
form_details.schema.format %}
+      <div class="input-group datetime datetimepicker">
+        <span class="input-group-addon"><span class="material-icons 
cursor-hand">calendar_today</span></span>
+        <input class="form-control" name="element_{{ form_key }}" 
id="element_{{ form_key }}" type="text" valuetype="date"
+          {%- if not "null" in form_details.schema.type %} required=""{%- 
endif %} value="{% if form_details.value %}{{ form_details.value }}{% endif %}" 
/>
+      </div>
+    {% elif "format" in form_details.schema and "date" in 
form_details.schema.format %}
+      <div class="input-group datetime datepicker">
+        <span class="input-group-addon"><span class="material-icons 
cursor-hand">calendar_today</span></span>
+        <input class="form-control" name="element_{{ form_key }}" 
id="element_{{ form_key }}" type="text" valuetype="date"
+          {%- if not "null" in form_details.schema.type %} required=""{%- 
endif %} value="{% if form_details.value %}{{ form_details.value }}{% endif %}" 
/>
+      </div>
+    {% elif "format" in form_details.schema and "time" in 
form_details.schema.format %}
+      <div class="input-group datetime timepicker">
+        <span class="input-group-addon"><span class="material-icons 
cursor-hand">calendar_today</span></span>
+        <input class="form-control" name="element_{{ form_key }}" 
id="element_{{ form_key }}" type="text" valuetype="date"
+          {%- if not "null" in form_details.schema.type %} required=""{%- 
endif %}
+          value="{% if form_details.value %}{{ form_details.value[0:2] 
}}00-01-01 {{ form_details.value }}{% endif %}" />
+      </div>
+    {% elif "enum" in form_details.schema and form_details.schema.enum %}
+      <select class="my_select2 form-control" name="element_{{ form_key }}" 
id="element_{{ form_key }}" data-placeholder="Select Value"
+        value="{% if form_details.value %}{{ form_details.value }}{% endif %}" 
onchange="updateJSONconf();"
+        {%- if not "null" in form_details.schema.type %} required=""{% endif 
%}>
+        {% for option in form_details.schema.enum -%}
+        <option>{{ option }}</option>
+        {% endfor -%}
+      </select>
+    {% elif form_details.schema and "array" in form_details.schema.type %}
+      <textarea class="form-control" name="element_{{ form_key }}" 
id="element_{{ form_key }}" valuetype="array" rows="6"
+        {%- if not "null" in form_details.schema.type %} required=""{% endif 
-%}>
+        {%- for txt in form_details.value -%}
+          {{ txt }}{{ "\n" }}
+        {%- endfor -%}
+      </textarea>
+    {% elif form_details.schema and "object" in form_details.schema.type %}
+      <textarea class="form-control" name="element_{{ form_key }}" 
id="element_{{ form_key }}" valuetype="object" rows="6"
+        {%- if not "null" in form_details.schema.type %} required=""{% endif 
-%}>
+        {{- form_details.value | tojson() -}}
+      </textarea>

Review Comment:
   If some data is an object/dict then we render a text box here which is 
converted to a JSON entry box during page open:
   
![image](https://user-images.githubusercontent.com/95105677/214951102-1abcfe98-e74c-4816-91aa-b14445666466.png)
   



##########
airflow/www/templates/airflow/trigger.html:
##########
@@ -27,11 +27,93 @@
   <link rel="stylesheet" type="text/css" href="{{ url_for_asset('switch.css') 
}}">
 {% endblock %}
 
+{% macro form_element(form_key, form_details) %}
+<tr>
+  <td class="col-lg-2">
+    <label for="element_{{ form_key }}" control-label="">
+      {%- if "title" in form_details.schema and form_details.schema.title -%}
+        {{ form_details.schema.title }}
+      {%- else -%}
+        {{ form_key }}
+      {%- endif -%}
+      {%- if form_details.schema and form_details.schema.type and not "null" 
in form_details.schema.type and not "boolean" in form_details.schema.type -%}
+        <strong style="color: red"> *</strong>
+      {%- endif -%}
+    : </label>
+  </td>
+  <td>
+    {% if "custom_html_form" in form_details.schema %}
+      {{ form_details.schema.custom_html_form | replace("{name}", "element_" + 
form_key) | replace("{value}", form_details.value) }}
+    {% elif "type" in form_details.schema and form_details.schema.type == 
"boolean" %}
+      <label for="element_{{ form_key }}" control-label="">
+        <input class="switch-input" name="element_{{ form_key }}" 
id="element_{{ form_key }}" type="checkbox"
+          {%- if form_details.value %} checked="checked"{%- endif -%}/>
+        <span class="switch" aria-hidden="true"></span>
+      </label>
+    {% elif "format" in form_details.schema and "date-time" in 
form_details.schema.format %}
+      <div class="input-group datetime datetimepicker">
+        <span class="input-group-addon"><span class="material-icons 
cursor-hand">calendar_today</span></span>
+        <input class="form-control" name="element_{{ form_key }}" 
id="element_{{ form_key }}" type="text" valuetype="date"
+          {%- if not "null" in form_details.schema.type %} required=""{%- 
endif %} value="{% if form_details.value %}{{ form_details.value }}{% endif %}" 
/>
+      </div>
+    {% elif "format" in form_details.schema and "date" in 
form_details.schema.format %}
+      <div class="input-group datetime datepicker">
+        <span class="input-group-addon"><span class="material-icons 
cursor-hand">calendar_today</span></span>
+        <input class="form-control" name="element_{{ form_key }}" 
id="element_{{ form_key }}" type="text" valuetype="date"
+          {%- if not "null" in form_details.schema.type %} required=""{%- 
endif %} value="{% if form_details.value %}{{ form_details.value }}{% endif %}" 
/>
+      </div>
+    {% elif "format" in form_details.schema and "time" in 
form_details.schema.format %}
+      <div class="input-group datetime timepicker">
+        <span class="input-group-addon"><span class="material-icons 
cursor-hand">calendar_today</span></span>
+        <input class="form-control" name="element_{{ form_key }}" 
id="element_{{ form_key }}" type="text" valuetype="date"
+          {%- if not "null" in form_details.schema.type %} required=""{%- 
endif %}
+          value="{% if form_details.value %}{{ form_details.value[0:2] 
}}00-01-01 {{ form_details.value }}{% endif %}" />
+      </div>
+    {% elif "enum" in form_details.schema and form_details.schema.enum %}
+      <select class="my_select2 form-control" name="element_{{ form_key }}" 
id="element_{{ form_key }}" data-placeholder="Select Value"
+        value="{% if form_details.value %}{{ form_details.value }}{% endif %}" 
onchange="updateJSONconf();"
+        {%- if not "null" in form_details.schema.type %} required=""{% endif 
%}>
+        {% for option in form_details.schema.enum -%}
+        <option>{{ option }}</option>
+        {% endfor -%}
+      </select>
+    {% elif form_details.schema and "array" in form_details.schema.type %}
+      <textarea class="form-control" name="element_{{ form_key }}" 
id="element_{{ form_key }}" valuetype="array" rows="6"
+        {%- if not "null" in form_details.schema.type %} required=""{% endif 
-%}>
+        {%- for txt in form_details.value -%}
+          {{ txt }}{{ "\n" }}
+        {%- endfor -%}
+      </textarea>
+    {% elif form_details.schema and "object" in form_details.schema.type %}
+      <textarea class="form-control" name="element_{{ form_key }}" 
id="element_{{ form_key }}" valuetype="object" rows="6"
+        {%- if not "null" in form_details.schema.type %} required=""{% endif 
-%}>
+        {{- form_details.value | tojson() -}}
+      </textarea>
+    {% elif form_details.schema and ("integer" in form_details.schema.type or 
"number" in form_details.schema.type) %}
+      <input class="form-control" name="element_{{ form_key }}" id="element_{{ 
form_key }}" placeholder="" valuetype="number" type="number"
+        value="{% if form_details.value %}{{ form_details.value }}{% endif %}"
+        {%- if form_details.schema.minimum %} min="{{ 
form_details.schema.minimum }}"{% endif %}
+        {%- if form_details.schema.maximum %} max="{{ 
form_details.schema.maximum }}"{% endif %}
+        {%- if form_details.schema.type and not "null" in 
form_details.schema.type %} required=""{% endif %} />
+    {% else %}
+      <input class="form-control" name="element_{{ form_key }}" id="element_{{ 
form_key }}" placeholder="" type="text"
+        value="{% if form_details.value %}{{ form_details.value }}{% endif %}"
+        {%- if form_details.schema and form_details.schema.minLength %} 
minlength="{{ form_details.schema.minLength }}"{% endif %}
+        {%- if form_details.schema and form_details.schema.maxLength %} 
maxlength="{{ form_details.schema.maxLength }}"{% endif %}
+        {%- if form_details.schema and form_details.schema.type and not "null" 
in form_details.schema.type %} required=""{% endif %} />
+    {% endif %}
+    {% if form_details.description -%}
+      <span class="help-block">{{ form_details.description }}</span>

Review Comment:
   This makes the help text/description either as markup (if it is HTML) or 
plain text:
   
![image](https://user-images.githubusercontent.com/95105677/214951601-2efa51b2-5787-4351-851f-806706956767.png)
   



##########
airflow/www/templates/airflow/trigger.html:
##########
@@ -27,11 +27,93 @@
   <link rel="stylesheet" type="text/css" href="{{ url_for_asset('switch.css') 
}}">
 {% endblock %}
 
+{% macro form_element(form_key, form_details) %}
+<tr>
+  <td class="col-lg-2">
+    <label for="element_{{ form_key }}" control-label="">
+      {%- if "title" in form_details.schema and form_details.schema.title -%}
+        {{ form_details.schema.title }}
+      {%- else -%}
+        {{ form_key }}
+      {%- endif -%}
+      {%- if form_details.schema and form_details.schema.type and not "null" 
in form_details.schema.type and not "boolean" in form_details.schema.type -%}
+        <strong style="color: red"> *</strong>
+      {%- endif -%}
+    : </label>
+  </td>
+  <td>
+    {% if "custom_html_form" in form_details.schema %}
+      {{ form_details.schema.custom_html_form | replace("{name}", "element_" + 
form_key) | replace("{value}", form_details.value) }}
+    {% elif "type" in form_details.schema and form_details.schema.type == 
"boolean" %}
+      <label for="element_{{ form_key }}" control-label="">
+        <input class="switch-input" name="element_{{ form_key }}" 
id="element_{{ form_key }}" type="checkbox"
+          {%- if form_details.value %} checked="checked"{%- endif -%}/>
+        <span class="switch" aria-hidden="true"></span>
+      </label>
+    {% elif "format" in form_details.schema and "date-time" in 
form_details.schema.format %}
+      <div class="input-group datetime datetimepicker">
+        <span class="input-group-addon"><span class="material-icons 
cursor-hand">calendar_today</span></span>
+        <input class="form-control" name="element_{{ form_key }}" 
id="element_{{ form_key }}" type="text" valuetype="date"
+          {%- if not "null" in form_details.schema.type %} required=""{%- 
endif %} value="{% if form_details.value %}{{ form_details.value }}{% endif %}" 
/>
+      </div>
+    {% elif "format" in form_details.schema and "date" in 
form_details.schema.format %}
+      <div class="input-group datetime datepicker">
+        <span class="input-group-addon"><span class="material-icons 
cursor-hand">calendar_today</span></span>
+        <input class="form-control" name="element_{{ form_key }}" 
id="element_{{ form_key }}" type="text" valuetype="date"
+          {%- if not "null" in form_details.schema.type %} required=""{%- 
endif %} value="{% if form_details.value %}{{ form_details.value }}{% endif %}" 
/>
+      </div>
+    {% elif "format" in form_details.schema and "time" in 
form_details.schema.format %}
+      <div class="input-group datetime timepicker">
+        <span class="input-group-addon"><span class="material-icons 
cursor-hand">calendar_today</span></span>
+        <input class="form-control" name="element_{{ form_key }}" 
id="element_{{ form_key }}" type="text" valuetype="date"
+          {%- if not "null" in form_details.schema.type %} required=""{%- 
endif %}
+          value="{% if form_details.value %}{{ form_details.value[0:2] 
}}00-01-01 {{ form_details.value }}{% endif %}" />
+      </div>
+    {% elif "enum" in form_details.schema and form_details.schema.enum %}
+      <select class="my_select2 form-control" name="element_{{ form_key }}" 
id="element_{{ form_key }}" data-placeholder="Select Value"
+        value="{% if form_details.value %}{{ form_details.value }}{% endif %}" 
onchange="updateJSONconf();"
+        {%- if not "null" in form_details.schema.type %} required=""{% endif 
%}>
+        {% for option in form_details.schema.enum -%}
+        <option>{{ option }}</option>
+        {% endfor -%}
+      </select>
+    {% elif form_details.schema and "array" in form_details.schema.type %}
+      <textarea class="form-control" name="element_{{ form_key }}" 
id="element_{{ form_key }}" valuetype="array" rows="6"
+        {%- if not "null" in form_details.schema.type %} required=""{% endif 
-%}>
+        {%- for txt in form_details.value -%}
+          {{ txt }}{{ "\n" }}
+        {%- endfor -%}
+      </textarea>
+    {% elif form_details.schema and "object" in form_details.schema.type %}
+      <textarea class="form-control" name="element_{{ form_key }}" 
id="element_{{ form_key }}" valuetype="object" rows="6"
+        {%- if not "null" in form_details.schema.type %} required=""{% endif 
-%}>
+        {{- form_details.value | tojson() -}}
+      </textarea>
+    {% elif form_details.schema and ("integer" in form_details.schema.type or 
"number" in form_details.schema.type) %}
+      <input class="form-control" name="element_{{ form_key }}" id="element_{{ 
form_key }}" placeholder="" valuetype="number" type="number"
+        value="{% if form_details.value %}{{ form_details.value }}{% endif %}"
+        {%- if form_details.schema.minimum %} min="{{ 
form_details.schema.minimum }}"{% endif %}
+        {%- if form_details.schema.maximum %} max="{{ 
form_details.schema.maximum }}"{% endif %}
+        {%- if form_details.schema.type and not "null" in 
form_details.schema.type %} required=""{% endif %} />
+    {% else %}
+      <input class="form-control" name="element_{{ form_key }}" id="element_{{ 
form_key }}" placeholder="" type="text"
+        value="{% if form_details.value %}{{ form_details.value }}{% endif %}"
+        {%- if form_details.schema and form_details.schema.minLength %} 
minlength="{{ form_details.schema.minLength }}"{% endif %}
+        {%- if form_details.schema and form_details.schema.maxLength %} 
maxlength="{{ form_details.schema.maxLength }}"{% endif %}
+        {%- if form_details.schema and form_details.schema.type and not "null" 
in form_details.schema.type %} required=""{% endif %} />

Review Comment:
   ...aaaand final leftover, if not any specific type then a simple text field 
is rendered incl. optional min/max length:
   
![image](https://user-images.githubusercontent.com/95105677/214951414-fc24570b-f4fa-44d2-aa65-4fa38c3aa3fa.png)
   



##########
airflow/www/templates/airflow/trigger.html:
##########
@@ -27,11 +27,93 @@
   <link rel="stylesheet" type="text/css" href="{{ url_for_asset('switch.css') 
}}">
 {% endblock %}
 
+{% macro form_element(form_key, form_details) %}
+<tr>
+  <td class="col-lg-2">
+    <label for="element_{{ form_key }}" control-label="">
+      {%- if "title" in form_details.schema and form_details.schema.title -%}
+        {{ form_details.schema.title }}
+      {%- else -%}
+        {{ form_key }}
+      {%- endif -%}
+      {%- if form_details.schema and form_details.schema.type and not "null" 
in form_details.schema.type and not "boolean" in form_details.schema.type -%}
+        <strong style="color: red"> *</strong>
+      {%- endif -%}
+    : </label>
+  </td>
+  <td>
+    {% if "custom_html_form" in form_details.schema %}
+      {{ form_details.schema.custom_html_form | replace("{name}", "element_" + 
form_key) | replace("{value}", form_details.value) }}
+    {% elif "type" in form_details.schema and form_details.schema.type == 
"boolean" %}
+      <label for="element_{{ form_key }}" control-label="">
+        <input class="switch-input" name="element_{{ form_key }}" 
id="element_{{ form_key }}" type="checkbox"
+          {%- if form_details.value %} checked="checked"{%- endif -%}/>
+        <span class="switch" aria-hidden="true"></span>
+      </label>
+    {% elif "format" in form_details.schema and "date-time" in 
form_details.schema.format %}
+      <div class="input-group datetime datetimepicker">
+        <span class="input-group-addon"><span class="material-icons 
cursor-hand">calendar_today</span></span>
+        <input class="form-control" name="element_{{ form_key }}" 
id="element_{{ form_key }}" type="text" valuetype="date"
+          {%- if not "null" in form_details.schema.type %} required=""{%- 
endif %} value="{% if form_details.value %}{{ form_details.value }}{% endif %}" 
/>
+      </div>
+    {% elif "format" in form_details.schema and "date" in 
form_details.schema.format %}
+      <div class="input-group datetime datepicker">
+        <span class="input-group-addon"><span class="material-icons 
cursor-hand">calendar_today</span></span>
+        <input class="form-control" name="element_{{ form_key }}" 
id="element_{{ form_key }}" type="text" valuetype="date"
+          {%- if not "null" in form_details.schema.type %} required=""{%- 
endif %} value="{% if form_details.value %}{{ form_details.value }}{% endif %}" 
/>
+      </div>
+    {% elif "format" in form_details.schema and "time" in 
form_details.schema.format %}
+      <div class="input-group datetime timepicker">
+        <span class="input-group-addon"><span class="material-icons 
cursor-hand">calendar_today</span></span>
+        <input class="form-control" name="element_{{ form_key }}" 
id="element_{{ form_key }}" type="text" valuetype="date"
+          {%- if not "null" in form_details.schema.type %} required=""{%- 
endif %}
+          value="{% if form_details.value %}{{ form_details.value[0:2] 
}}00-01-01 {{ form_details.value }}{% endif %}" />
+      </div>
+    {% elif "enum" in form_details.schema and form_details.schema.enum %}
+      <select class="my_select2 form-control" name="element_{{ form_key }}" 
id="element_{{ form_key }}" data-placeholder="Select Value"
+        value="{% if form_details.value %}{{ form_details.value }}{% endif %}" 
onchange="updateJSONconf();"
+        {%- if not "null" in form_details.schema.type %} required=""{% endif 
%}>
+        {% for option in form_details.schema.enum -%}
+        <option>{{ option }}</option>
+        {% endfor -%}
+      </select>
+    {% elif form_details.schema and "array" in form_details.schema.type %}
+      <textarea class="form-control" name="element_{{ form_key }}" 
id="element_{{ form_key }}" valuetype="array" rows="6"
+        {%- if not "null" in form_details.schema.type %} required=""{% endif 
-%}>
+        {%- for txt in form_details.value -%}
+          {{ txt }}{{ "\n" }}
+        {%- endfor -%}
+      </textarea>
+    {% elif form_details.schema and "object" in form_details.schema.type %}
+      <textarea class="form-control" name="element_{{ form_key }}" 
id="element_{{ form_key }}" valuetype="object" rows="6"
+        {%- if not "null" in form_details.schema.type %} required=""{% endif 
-%}>
+        {{- form_details.value | tojson() -}}
+      </textarea>
+    {% elif form_details.schema and ("integer" in form_details.schema.type or 
"number" in form_details.schema.type) %}
+      <input class="form-control" name="element_{{ form_key }}" id="element_{{ 
form_key }}" placeholder="" valuetype="number" type="number"
+        value="{% if form_details.value %}{{ form_details.value }}{% endif %}"
+        {%- if form_details.schema.minimum %} min="{{ 
form_details.schema.minimum }}"{% endif %}
+        {%- if form_details.schema.maximum %} max="{{ 
form_details.schema.maximum }}"{% endif %}
+        {%- if form_details.schema.type and not "null" in 
form_details.schema.type %} required=""{% endif %} />

Review Comment:
   If the data type is a number then a HTML number field is generated - see the 
spinner on the right side. Min/Max can be checked here optionally:
   
![image](https://user-images.githubusercontent.com/95105677/214951278-c990187a-d06f-476e-aafe-9ba8a3e05fd9.png)
   



##########
airflow/www/templates/airflow/trigger.html:
##########
@@ -47,22 +129,90 @@ <h2>Trigger DAG: {{ dag_id }}</h2>
         <input type="text" class="form-control" placeholder="Run ID" 
name="run_id">
       </div>
     </div>
+    {% if recent_confs|length > 0 %}
     <div class="form-group row">
       <div class="col-md-2">
-        <label for="recent_configs">Recent Configurations</label>
+        <label for="recent_configs">Select Recent Configurations</label>
         <select class="form-control" name="recent_configs" id="recent_configs">
-          <option value="">empty config</option>
-          {% for conf in recent_confs %}
-          <option value="{{ conf }}">{{ conf }}</option>
+          <option value="{{ conf }}">Default parameters</option>
+          {% for run_id, recent_conf in recent_confs.items() %}
+          <option value="{{ recent_conf }}">{{ run_id }}: {{ recent_conf 
}}</option>
           {% endfor %}

Review Comment:
   This section is the select of the recent configs which can be applied to the 
form:
   
![image](https://user-images.githubusercontent.com/95105677/214951905-5b12c900-106f-4f71-91b6-941401d2746f.png)
   



##########
airflow/www/templates/airflow/trigger.html:
##########
@@ -47,22 +129,90 @@ <h2>Trigger DAG: {{ dag_id }}</h2>
         <input type="text" class="form-control" placeholder="Run ID" 
name="run_id">
       </div>
     </div>
+    {% if recent_confs|length > 0 %}
     <div class="form-group row">
       <div class="col-md-2">
-        <label for="recent_configs">Recent Configurations</label>
+        <label for="recent_configs">Select Recent Configurations</label>
         <select class="form-control" name="recent_configs" id="recent_configs">
-          <option value="">empty config</option>
-          {% for conf in recent_confs %}
-          <option value="{{ conf }}">{{ conf }}</option>
+          <option value="{{ conf }}">Default parameters</option>
+          {% for run_id, recent_conf in recent_confs.items() %}
+          <option value="{{ recent_conf }}">{{ run_id }}: {{ recent_conf 
}}</option>
           {% endfor %}
         </select>
       </div>
     </div>
-    <label for="conf">Configuration JSON (Optional, must be a dict 
object)</label>
-    <textarea class="form-control" name="conf" id="json">{{ conf }}</textarea>
+    {% endif %}
+    {%- if form_fields %}
+    <div class="panel panel-primary ">
+      <div class="panel-heading">
+        <h4 class="panel-title">DAG conf Parameters</h4>
+      </div>
+      <textarea style="display: none;" id="json_start" name="json_start">
+        {{- conf -}}
+      </textarea>
+      <textarea style="display: none;" id="form_sections" name="form_sections">
+        {{- form_fields.values() | map(attribute="schema.section", default="") 
| reject("equalto", "") | unique() | join(",") | lower() | replace(" ", "_") -}}
+      </textarea>
+      <div class="panel-body">
 
-    <br />
+        <table class="table table-hover table-bordered">
+          <tbody>
+            {% for form_key, form_details in form_fields.items() %}
+            {% if ("section" not in form_details.schema or not 
form_details.schema.section) and ("const" not in form_details.schema or not 
form_details.schema.const) %}
+            {{ form_element(form_key, form_details) }}
+            {% endif %}
+            {% endfor %}
+          </tbody>
+        </table>
 
+        {% for form_section, form_items in form_fields.values() | 
groupby(attribute="schema.section", default="") %}
+        {% if form_section %}
+        <div class="panel-group" id="accordion_section_{{ form_section | 
lower() | replace(' ', '_') }}">
+          <div class="panel panel-default">
+            <div class="panel-heading">
+              <h4 class="panel-title">
+                <a class="accordion-toggle" data-toggle="collapse" 
data-parent="#accordion_section_{{ form_section | lower() | replace(' ', '_') 
}}" href="#accordion_section_{{ form_section | lower() | replace(' ', '_') 
}}_href"
+                  data-original-title="" title="" id="{{ form_section | 
lower() | replace(' ', '_') }}_toggle">{{ form_section }}<span 
class="caret"></span></a>
+              </h4>
+            </div>
+            <div id="accordion_section_{{ form_section | lower() | replace(' 
', '_') }}_href" class="panel-collapse collapse">
+              <div class="panel-body">
+                <table class="table table-hover table-bordered">
+                  <tbody>
+                    {% for form_key, form_details in form_fields.items() %}
+                    {% if form_details.schema.section == form_section and not 
form_details.schema.const %}
+                    {{ form_element(form_key, form_details) }}
+                    {% endif %}
+                    {% endfor %}
+                  </tbody>
+                </table>
+              </div>
+            </div>
+          </div>
+        </div>
+        {% endif %}
+        {% endfor %}
+
+        <div class="panel-group" id="accordion_json_conf">
+          <div class="panel panel-default">
+            <div class="panel-heading">
+              <h4 class="panel-title">
+                <a class="accordion-toggle" data-toggle="collapse" 
data-parent="#accordion_json_conf" href="#accordion_json_conf_href" 
data-original-title="" title="" id="generated_json_toggle">Generated 
Configuration JSON<span class="caret"></span></a>
+              </h4>
+            </div>
+            <div id="accordion_json_conf_href" class="panel-collapse collapse">
+              <div class="panel-body">
+                <textarea name="conf" id="json">{{ conf }}</textarea>
+              </div>
+            </div>
+          </div>
+        </div>

Review Comment:
   Below the form the generated JSON can be seen - if you want to re-use this 
for future reference:
   
![image](https://user-images.githubusercontent.com/95105677/214952362-28966bd8-423a-48ce-8440-c309d3e439b0.png)
   



##########
airflow/www/templates/airflow/trigger.html:
##########
@@ -47,22 +129,90 @@ <h2>Trigger DAG: {{ dag_id }}</h2>
         <input type="text" class="form-control" placeholder="Run ID" 
name="run_id">
       </div>
     </div>
+    {% if recent_confs|length > 0 %}
     <div class="form-group row">
       <div class="col-md-2">
-        <label for="recent_configs">Recent Configurations</label>
+        <label for="recent_configs">Select Recent Configurations</label>
         <select class="form-control" name="recent_configs" id="recent_configs">
-          <option value="">empty config</option>
-          {% for conf in recent_confs %}
-          <option value="{{ conf }}">{{ conf }}</option>
+          <option value="{{ conf }}">Default parameters</option>
+          {% for run_id, recent_conf in recent_confs.items() %}
+          <option value="{{ recent_conf }}">{{ run_id }}: {{ recent_conf 
}}</option>
           {% endfor %}
         </select>
       </div>
     </div>
-    <label for="conf">Configuration JSON (Optional, must be a dict 
object)</label>
-    <textarea class="form-control" name="conf" id="json">{{ conf }}</textarea>
+    {% endif %}
+    {%- if form_fields %}
+    <div class="panel panel-primary ">
+      <div class="panel-heading">
+        <h4 class="panel-title">DAG conf Parameters</h4>
+      </div>
+      <textarea style="display: none;" id="json_start" name="json_start">
+        {{- conf -}}
+      </textarea>
+      <textarea style="display: none;" id="form_sections" name="form_sections">
+        {{- form_fields.values() | map(attribute="schema.section", default="") 
| reject("equalto", "") | unique() | join(",") | lower() | replace(" ", "_") -}}
+      </textarea>
+      <div class="panel-body">
 
-    <br />
+        <table class="table table-hover table-bordered">
+          <tbody>
+            {% for form_key, form_details in form_fields.items() %}
+            {% if ("section" not in form_details.schema or not 
form_details.schema.section) and ("const" not in form_details.schema or not 
form_details.schema.const) %}
+            {{ form_element(form_key, form_details) }}
+            {% endif %}
+            {% endfor %}
+          </tbody>
+        </table>
 
+        {% for form_section, form_items in form_fields.values() | 
groupby(attribute="schema.section", default="") %}
+        {% if form_section %}
+        <div class="panel-group" id="accordion_section_{{ form_section | 
lower() | replace(' ', '_') }}">
+          <div class="panel panel-default">
+            <div class="panel-heading">
+              <h4 class="panel-title">
+                <a class="accordion-toggle" data-toggle="collapse" 
data-parent="#accordion_section_{{ form_section | lower() | replace(' ', '_') 
}}" href="#accordion_section_{{ form_section | lower() | replace(' ', '_') 
}}_href"
+                  data-original-title="" title="" id="{{ form_section | 
lower() | replace(' ', '_') }}_toggle">{{ form_section }}<span 
class="caret"></span></a>
+              </h4>
+            </div>

Review Comment:
   If the form defines multiple sections, this generate a new section header - 
each section is folded by default and can be un-folded:
   
![image](https://user-images.githubusercontent.com/95105677/214952183-4a9f23bc-4b71-409d-8888-4001cf6d93b3.png)
   



##########
airflow/www/templates/airflow/trigger.html:
##########
@@ -27,11 +27,93 @@
   <link rel="stylesheet" type="text/css" href="{{ url_for_asset('switch.css') 
}}">
 {% endblock %}
 
+{% macro form_element(form_key, form_details) %}
+<tr>
+  <td class="col-lg-2">
+    <label for="element_{{ form_key }}" control-label="">
+      {%- if "title" in form_details.schema and form_details.schema.title -%}
+        {{ form_details.schema.title }}
+      {%- else -%}
+        {{ form_key }}
+      {%- endif -%}
+      {%- if form_details.schema and form_details.schema.type and not "null" 
in form_details.schema.type and not "boolean" in form_details.schema.type -%}
+        <strong style="color: red"> *</strong>
+      {%- endif -%}
+    : </label>
+  </td>
+  <td>
+    {% if "custom_html_form" in form_details.schema %}
+      {{ form_details.schema.custom_html_form | replace("{name}", "element_" + 
form_key) | replace("{value}", form_details.value) }}
+    {% elif "type" in form_details.schema and form_details.schema.type == 
"boolean" %}
+      <label for="element_{{ form_key }}" control-label="">
+        <input class="switch-input" name="element_{{ form_key }}" 
id="element_{{ form_key }}" type="checkbox"
+          {%- if form_details.value %} checked="checked"{%- endif -%}/>
+        <span class="switch" aria-hidden="true"></span>
+      </label>
+    {% elif "format" in form_details.schema and "date-time" in 
form_details.schema.format %}
+      <div class="input-group datetime datetimepicker">
+        <span class="input-group-addon"><span class="material-icons 
cursor-hand">calendar_today</span></span>
+        <input class="form-control" name="element_{{ form_key }}" 
id="element_{{ form_key }}" type="text" valuetype="date"
+          {%- if not "null" in form_details.schema.type %} required=""{%- 
endif %} value="{% if form_details.value %}{{ form_details.value }}{% endif %}" 
/>
+      </div>
+    {% elif "format" in form_details.schema and "date" in 
form_details.schema.format %}
+      <div class="input-group datetime datepicker">
+        <span class="input-group-addon"><span class="material-icons 
cursor-hand">calendar_today</span></span>
+        <input class="form-control" name="element_{{ form_key }}" 
id="element_{{ form_key }}" type="text" valuetype="date"
+          {%- if not "null" in form_details.schema.type %} required=""{%- 
endif %} value="{% if form_details.value %}{{ form_details.value }}{% endif %}" 
/>
+      </div>

Review Comment:
   Date picker (without time):
   
![image](https://user-images.githubusercontent.com/95105677/214950428-e61454c4-5932-499f-8f07-41090500da27.png)
   



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to