form.html 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. {%- macro field_label(field) -%}
  2. {# don't render labels for buttons and radio fields #}
  3. {% if field.type != "SubmitField" and field.type != "BooleanField" %}
  4. {% set css_class = kwargs['class'] if kwargs['class'] else 'form-label' %}
  5. <label class="{{ css_class }}" for="{{ field.id }}">{{ field.label.text }}</label>
  6. {% endif %}
  7. {% endmacro %}
  8. {%- macro field_description(field) -%}
  9. {% if field.description %}
  10. <div class="form-text">{{ field.description|safe }}</div>
  11. {% endif %}
  12. {%- endmacro -%}
  13. {%- macro field_errors(field) -%}
  14. {% if field.errors %}
  15. {%- for error in field.errors -%}
  16. <div class="invalid-feedback">
  17. {{error}}
  18. </div>
  19. {%- endfor -%}
  20. {% endif %}
  21. {%- endmacro -%}
  22. {%- macro render_input_field(field, div_class='') -%}
  23. {% if div_class %}
  24. <div class="{{ div_class }}">
  25. {% endif %}
  26. {% set placeholder = kwargs['placeholder']|length or field.label.text %}
  27. {% set css_error = ' is-invalid' if field.errors else '' %}
  28. {% set css_class = kwargs['class'] if kwargs['class'] else 'form-control' %}
  29. {% set css_class = css_class + css_error if css_error else css_class %}
  30. {{ field(class=css_class, placeholder=placeholder, **kwargs) }}
  31. {{ field_description(field) }}
  32. {{ field_errors(field) }}
  33. {% if div_class %}
  34. </div>
  35. {% endif %}
  36. {%- endmacro -%}
  37. {%- macro render_boolean_field(field, div_class='') -%}
  38. {% if div_class %}
  39. <div class="{{ div_class }}">
  40. {% endif %}
  41. {% set css_error = ' is-invalid' if field.errors else '' %}
  42. {% set css_class = kwargs['class'] if kwargs['class'] else 'form-check-input' %}
  43. {% set css_class = css_class + css_error if css_error else css_class %}
  44. <div class="form-check">
  45. {{ field(class=css_class, **kwargs) }}
  46. <label class="form-check-label" for="{{ field.id }}">
  47. {{ field.label.text }}
  48. </label>
  49. {{ field_description(field) }}
  50. {{ field_errors(field) }}
  51. </div>
  52. {% if div_class %}
  53. </div>
  54. {% endif %}
  55. {%- endmacro -%}
  56. {%- macro render_select_field(field, div_class='') -%}
  57. {% if div_class %}
  58. <div class="{{ div_class }}">
  59. {% endif %}
  60. {% set css_error = ' is-invalid' if field.errors else '' %}
  61. {% set css_class = kwargs['class'] if kwargs['class'] else 'form-select' %}
  62. {% set css_class = css_class + css_error if css_error else css_class %}
  63. {% if field.type == 'QuerySelectMultipleField' or field.type == 'SelectMultipleField' %}
  64. {{ field(multiple=True, class=css_class) }}
  65. {% else %}
  66. {{ field(class=css_class) }}
  67. {%- endif -%}
  68. {{ field_description(field) }}
  69. {{ field_errors(field) }}
  70. {% if div_class %}
  71. </div>
  72. {% endif %}
  73. {%- endmacro -%}
  74. {%- macro render_editor_field(field, div_class='') -%}
  75. {% if div_class %}
  76. <div class="{{ div_class }}">
  77. {% endif %}
  78. {% set placeholder = kwargs['placeholder']|length or field.label.text %}
  79. {% set css_error = ' is-invalid' if field.errors else '' %}
  80. {% set css_class = kwargs['class'] if kwargs['class'] else 'flaskbb-editor form-control border-0 rounded-0' %}
  81. {% set css_class = css_class + css_error if css_error else css_class %}
  82. <div class="card">
  83. <div class="card-header">
  84. <div class="btn-toolbar">
  85. <markdown-toolbar for="{{ field.id }}">
  86. <div class="btn-group btn-group-sm me-2">
  87. <md-header class="btn btn-white" data-tooltip="tooltip" title="Heading"><span class="fas fa-heading"></span></md-header>
  88. <md-bold class="btn btn-white" data-tooltip="tooltip" title="Bold"><span class="fas fa-bold"></span></md-bold>
  89. <md-italic class="btn btn-white" data-tooltip="tooltip" title="Italic"><span class="fas fa-italic"></span></md-italic>
  90. <md-strikethrough class="btn btn-white" data-tooltip="tooltip" title="Strikethrough"><span class="fas fa-strikethrough"></span></md-strikethrough>
  91. </div>
  92. <div class="btn-group btn-group-sm me-2">
  93. <md-quote class="btn btn-white" data-tooltip="tooltip" title="Quote"><span class="fas fa-quote-left"></span></md-quote>
  94. <md-code class="btn btn-white" data-tooltip="tooltip" title="Code"><span class="fas fa-code"></span></md-code>
  95. <md-link class="btn btn-white" data-tooltip="tooltip" title="Insert Link"><span class="fas fa-link"></span></md-link>
  96. <md-image class="btn btn-white" data-tooltip="tooltip" title="Insert Image"><span class="fas fa-image"></span></md-image>
  97. </div>
  98. <div class="btn-group btn-group-sm me-2">
  99. <md-unordered-list class="btn btn-white" data-tooltip="tooltip" title="Unordered List"><span class="fas fa-list-ul"></span></md-unordered-list>
  100. <md-ordered-list class="btn btn-white" data-tooltip="tooltip" title="Ordered List"><span class="fas fa-list-ol"></span></md-ordered-list>
  101. <md-mention class="btn btn-white" data-tooltip="tooltip" title="Mention"><span class="fas fa-at"></span></md-mention>
  102. </div>
  103. </markdown-toolbar>
  104. <button class="btn btn-sm btn-primary me-2" for="{{ field.id }}">Preview</button>
  105. <button class="btn btn-sm btn-success"><span class="fas fa-question"></span></button>
  106. </div>
  107. </div>
  108. {{ field(class=css_class, placeholder=placeholder, **kwargs) }}
  109. </div>
  110. {{ field_description(field) }}
  111. {{ field_errors(field) }}
  112. {% if div_class %}
  113. </div>
  114. {% endif %}
  115. {%- endmacro -%}
  116. {%- macro render_submit_field(field, div_class='') -%}
  117. {% if div_class %}
  118. <div class="{{ div_class }}">
  119. {% endif %}
  120. {% set css_class = kwargs['class'] if kwargs['class'] else 'btn btn-success' %}
  121. {{ field(class=css_class) }}
  122. {% if div_class %}
  123. </div>
  124. {% endif %}
  125. {%- endmacro -%}
  126. {%- macro render_field(field, div_class='mb-3 col-12') -%}
  127. {% if div_class %}
  128. <div class="{{ div_class }}">
  129. {% endif %}
  130. {{ field_label(field) }}
  131. {% if field.type == "BooleanField" %}
  132. {{ render_boolean_field(field, **kwargs) }}
  133. {% elif field.type == "SelectField" or field.type == "QuerySelectMultipleField" or field.type == "SelectMultipleField" %}
  134. {{ render_select_field(field, **kwargs) }}
  135. {% elif field.type == "SubmitField" %}
  136. {{ render_submit_field(field, **kwargs) }}
  137. {% elif field.type == "TextAreaField" %}
  138. {{ render_editor_field(field, **kwargs) }}
  139. {% else %}
  140. {{ render_input_field(field, **kwargs) }}
  141. {% endif %}
  142. {% if div_class %}
  143. </div>
  144. {% endif %}
  145. {%- endmacro -%}
  146. {%- macro horizontal_field(field, label_class='col-3 form-label text-end', div_class='col-4') -%}
  147. <div class="row mb-3">
  148. {{ field_label(field, class=label_class) }}
  149. <div class="{{ div_class }}">
  150. {% if field.type == "BooleanField" %}
  151. {{ render_boolean_field(field, **kwargs) }}
  152. {% elif field.type == "SelectField" or field.type == "QuerySelectMultipleField" or field.type == "SelectMultipleField" %}
  153. {{ render_select_field(field, **kwargs) }}
  154. {% elif field.type == "SubmitField" %}
  155. {{ render_submit_field(field, **kwargs) }}
  156. {% elif field.type == "TextAreaField" %}
  157. {{ render_editor_field(field, **kwargs) }}
  158. {% else %}
  159. {{ render_input_field(field, **kwargs) }}
  160. {% endif %}
  161. </div>
  162. </div>
  163. {%- endmacro -%}
  164. {% macro action_confirm(id, url, title, icon='', btn='btn btn-icon', icon_only=True) %}
  165. <form class="d-inline" id="{{ id }}" method="post" action="{{ url }}">
  166. <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
  167. <button type="button" class="{{ btn }}" data-bs-toggle="modal" data-bs-target="#confirmModal">
  168. {% if icon_only %}
  169. <span class="{{ icon }}" data-bs-toggle="tooltip" title="{{ title }}"></span>
  170. {% else %}
  171. <span class="{{ icon }}"></span> {{ title }}
  172. {% endif %}
  173. </button>
  174. </form>
  175. {% endmacro %}