macros.html 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477
  1. {%- macro field_label(field) -%}
  2. <label for="{{ field.id }}">{{ field.label.text }}</label>
  3. {% endmacro %}
  4. {%- macro field_description(field) -%}
  5. {% if field.description %}
  6. <span class="help-block">{{ field.description|safe }}</span>
  7. {% endif %}
  8. {%- endmacro -%}
  9. {%- macro field_errors(field) -%}
  10. {% if field.errors %}
  11. {%- for error in field.errors -%}
  12. <span class="help-block">{{error}}</span>
  13. {%- endfor -%}
  14. {% endif %}
  15. {%- endmacro -%}
  16. {%- macro render_quickreply(field, rows, cols, div_class='') -%}
  17. {%- if kwargs['required'] or field.flags.required -%}
  18. {% if div_class %}
  19. {{ field(class=div_class, required="required", cols=cols, rows=rows, placeholder=field.label.text, **kwargs) }}
  20. {% else %}
  21. {{ field(class="new-message", required="required", cols=cols, rows=row, placeholder=field.label.text, **kwargs) }}
  22. {% endif %}
  23. {%- else -%}
  24. {% if div_class %}
  25. {{ field(class=div_class, cols=cols, rows=row, placeholder=field.label.text, **kwargs) }}
  26. {% else %}
  27. {{ field(class="new-message", cols=cols, rows=row, placeholder=field.label.text, **kwargs) }}
  28. {% endif %}
  29. {%- endif -%}
  30. {{ field_description(field) }}
  31. {{ field_errors(field) }}
  32. {%- endmacro -%}
  33. {# Renders a non bootstrap input field #}
  34. {%- macro render_input_field(field, div_class='', placeholder='') -%}
  35. {%- if div_class -%}
  36. <div class="{{ div_class }}">
  37. {%- endif -%}
  38. {%- if placeholder -%}
  39. {% set field_placeholder = placeholder %}
  40. {%- else -%}
  41. {% set field_placeholder = field.label.text %}
  42. {%- endif -%}
  43. {%- if kwargs['required'] or field.flags.required -%}
  44. {{ field(required="required", placeholder=field_placeholder) }}
  45. {%- else -%}
  46. {{ field(placeholder=field_placeholder) }}
  47. {% endif %}
  48. {%- if div_class -%}
  49. </div>
  50. {%- endif -%}
  51. {{ field_description(field) }}
  52. {{ field_errors(field) }}
  53. {%- endmacro -%}
  54. {%- macro render_boolean_field(field, inline=False) -%}
  55. <div class="checkbox{% if inline %}inline{% endif %}{% if field.errors %}has-error{% endif %}">
  56. <label>
  57. {{ field(**kwargs) }}
  58. {{ field.label.text }}
  59. </label>
  60. {{ field_description(field) }}
  61. {{ field_errors(field) }}
  62. </div>
  63. {%- endmacro -%}
  64. {%- macro render_select_field(field, div_class='', select_class="form-control") -%}
  65. <div class="form-group">
  66. {% if div_class %}
  67. <div class="{{ div_class }}">
  68. {% else %}
  69. <div class="col-sm-5">
  70. {% endif %}
  71. <label>{{ field.label.text }}</label>
  72. {% if field.type == 'QuerySelectMultipleField' or field.type == 'SelectMultipleField' %}
  73. {{ field(multiple=True, class=select_class) }}
  74. {% else %}
  75. {{ field(class=select_class) }}
  76. {%- endif -%}
  77. {{ field_description(field) }}
  78. {{ field_errors(field) }}
  79. </div>
  80. </div>
  81. {%- endmacro -%}
  82. {%- macro render_submit_field(field, div_class='', input_class='') -%}
  83. {% if div_class %}
  84. <div class="{{ div_class }}">
  85. {% endif %}
  86. {{ field(class=input_class or 'btn btn-success') }}
  87. {% if div_class %}
  88. </div>
  89. {% endif %}
  90. {%- endmacro -%}
  91. {%- macro render_field(field, with_label=True, div_class='', rows='') -%}
  92. <div class="form-group{%- if field.errors %} has-error{%- endif %}">
  93. <div class="{%- if div_class -%}{{ div_class }}{%- else -%}col-sm-5{%- endif -%}">
  94. {% if with_label %}
  95. <label>{{ field.label.text }}</label>
  96. {% endif %}
  97. {%- if kwargs['required'] or field.flags.required -%}
  98. {% if rows %}
  99. {{ field(class="form-control", required="required", rows=rows, placeholder=field.label.text, **kwargs) }}
  100. {% else %}
  101. {{ field(class="form-control", required="required", placeholder=field.label.text, **kwargs) }}
  102. {% endif %}
  103. {%- else -%}
  104. {% if rows %}
  105. {{ field(class="form-control", rows=rows, placeholder=field.label.text, **kwargs) }}
  106. {% else %}
  107. {{ field(class="form-control", placeholder=field.label.text, **kwargs) }}
  108. {% endif %}
  109. {%- endif -%}
  110. {{ field_description(field) }}
  111. {{ field_errors(field) }}
  112. </div>
  113. </div>
  114. {%- endmacro -%}
  115. {%- macro inline_field(field, label_text='', label_class='') -%}
  116. <div class="form-group {%- if field.errors %} has-error{%- endif %}">
  117. {{field.label(class="sr-only")}}
  118. <div class="col-sm-4">
  119. {%- if kwargs['required'] or field.flags.required -%}
  120. {% if label_text %}
  121. {{field(class='form-control', placeholder=label_text, required="required", **kwargs)}}
  122. {% else %}
  123. {{field(class='form-control', placeholder=field.label.text, required="required", **kwargs)}}
  124. {% endif %}
  125. {%- else -%}
  126. {% if label_text %}
  127. {{field(class='form-control', placeholder=label_text, **kwargs)}}
  128. {% else %}
  129. {{field(class='form-control', placeholder=field.label.text, **kwargs)}}
  130. {% endif %}
  131. {%- endif -%}
  132. {{ field_description(field) }}
  133. {{ field_errors(field) }}
  134. </div>
  135. </div>
  136. {%- endmacro -%}
  137. {%- macro group_field(field, label_text='', label_class='', css_class='form-control form-grouped') -%}
  138. <div class="form-group {%- if field.errors %} has-error{%- endif %}" style="margin-bottom: 0px;">
  139. {{field.label(class="sr-only")}}
  140. {%- if kwargs['required'] or field.flags.required -%}
  141. {% if label_text %}
  142. {{field(class=css_class, placeholder=label_text, required="required", **kwargs)}}
  143. {% else %}
  144. {{field(class=css_class, placeholder=field.label.text, required="required", **kwargs)}}
  145. {% endif %}
  146. {%- else -%}
  147. {% if label_text %}
  148. {{field(class=css_class, placeholder=label_text, **kwargs)}}
  149. {% else %}
  150. {{field(class=css_class, placeholder=field.label.text, **kwargs)}}
  151. {% endif %}
  152. {%- endif -%}
  153. {{ field_description(field) }}
  154. {{ field_errors(field) }}
  155. </div>
  156. {%- endmacro -%}
  157. {%- macro input_group_field(field, label_text='', css_class='form-control') -%}
  158. {%- if kwargs['required'] or field.flags.required -%}
  159. {% if label_text %}
  160. {{field(class=css_class, placeholder=label_text, required="required", **kwargs)}}
  161. {% else %}
  162. {{field(class=css_class, placeholder=field.label.text, required="required", **kwargs)}}
  163. {% endif %}
  164. {%- else -%}
  165. {% if label_text %}
  166. {{field(class=css_class, placeholder=label_text, **kwargs)}}
  167. {% else %}
  168. {{field(class=css_class, placeholder=field.label.text, **kwargs)}}
  169. {% endif %}
  170. {%- endif -%}
  171. {%- endmacro -%}
  172. {%- macro horizontal_select_field(field, div_class='', label_class='', select_class="form-control", surrounded_div="col-sm-4") -%}
  173. <div class="form-group row {%- if field.errors %} has-error{%- endif %}">
  174. {% if label_class %}
  175. {{ field.label(class=label_class) }}
  176. {% else %}
  177. {{ field.label(class="col-sm-3 control-label") }}
  178. {% endif %}
  179. {% if div_class %}
  180. <div class="{{ div_class }}">
  181. {% else %}
  182. <div class="col-sm-5">
  183. {% endif %}
  184. <div class="row">
  185. {% if field.type == 'QuerySelectMultipleField' or field.type == 'SelectMultipleField' %}
  186. {{ field(multiple=True, class=select_class, surrounded_div=surrounded_div) }}
  187. {% else %}
  188. {{ field(class=select_class, surrounded_div=surrounded_div) }}
  189. {%- endif -%}
  190. </div>
  191. {{ field_description(field) }}
  192. {{ field_errors(field) }}
  193. </div>
  194. </div>
  195. {%- endmacro -%}
  196. {%- macro horizontal_boolean_field(field, div_class='') -%}
  197. <div class="{%- if div_class -%}{{ div_class }}{%- else -%}col-sm-offset-3 col-sm-3{%- endif -%}">
  198. {{ render_boolean_field(field, **kwargs) }}
  199. </div>
  200. {%- endmacro -%}
  201. {%- macro horizontal_submit_field(field, div_class='', input_class='') -%}
  202. <div class="{%- if div_class -%}{{ div_class }}{%- else -%}col-sm-offset-3 col-sm-3{%- endif -%}">
  203. {{ field(class=input_class or 'btn btn-success') }}
  204. </div>
  205. {%- endmacro -%}
  206. {%- macro horizontal_field(field, label_text='', label_class='', div_class='', input_class='') -%}
  207. <div class="form-group row {%- if field.errors %} has-error{%- endif %}">
  208. {% if field.type == "BooleanField" or field.type == "SubmitField" %}
  209. {% if field.type == "BooleanField" %}
  210. {{ horizontal_boolean_field(field, div_class) }}
  211. {% else %}
  212. {{ horizontal_submit_field(field, div_class) }}
  213. {% endif %}
  214. {% else %}
  215. {% if label_class %}
  216. {{ field.label(class=label_class) }}
  217. {% else %}
  218. {{ field.label(class="col-sm-3 control-label") }}
  219. {% endif %}
  220. {% if div_class %}
  221. <div class="{{ div_class }}">
  222. {% else %}
  223. <div class="col-sm-4">
  224. {% endif %}
  225. {%- if kwargs['required'] or field.flags.required -%}
  226. {% if label_text %}
  227. {{ field(class='form-control', placeholder=label_text, required="required", **kwargs) }}
  228. {% else %}
  229. {{ field(class='form-control', placeholder=field.label.text, required="required", **kwargs) }}
  230. {% endif %}
  231. {%- else -%}
  232. {% if label_text %}
  233. {{ field(class='form-control', placeholder=label_text, **kwargs) }}
  234. {% else %}
  235. {{ field(class='form-control', placeholder=field.label.text, **kwargs) }}
  236. {% endif %}
  237. {%- endif -%}
  238. </div> <!-- end div_class -->
  239. {% endif %}
  240. {{ field_description(field) }}
  241. {{ field_errors(field) }}
  242. </div> <!-- end form-group -->
  243. {%- endmacro -%}
  244. {% macro topnav(endpoint, name, icon='', id='', active=False) %}
  245. <li {% if id %}id={{id}}{% endif %} {% if endpoint == request.endpoint or active == True %}class="active"{% endif %}>
  246. <a href={{ url_for(endpoint) }}>
  247. {% if icon %}<i class="{{ icon }}"></i> {% endif %}{{ name }}
  248. </a>
  249. </li>
  250. {% endmacro %}
  251. {% macro is_active(endpoint, active=False) %}
  252. {%- if endpoint == request.endpoint or active == True -%}
  253. active
  254. {%- endif -%}
  255. {% endmacro %}
  256. {% macro navlink(endpoint, name, icon='', active='', urlforkwargs=None) %}
  257. <li {% if endpoint == request.endpoint or endpoint == active or active == True %}class="active"{% endif %}>
  258. <a href="{% if urlforkwargs %}{{ url_for(endpoint, **urlforkwargs) }}{% else %}{{ url_for(endpoint) }}{% endif %}">
  259. {% if icon %}<i class="{{ icon }}"></i> {% endif %} {{ name }}
  260. </a>
  261. </li>
  262. {% endmacro %}
  263. {% macro externalnavlink(uri, name, icon='') %}
  264. <li>
  265. <a href="{{uri}}">{% if icon %}<i class="{{ icon }}"></i> {% endif %} {{ name }}</a>
  266. </li>
  267. {% endmacro %}
  268. {% macro navtext(text, icon="", cls="") %}
  269. <li{% if cls %} class="{{ cls }}"{% endif %}><a href="#">{% if icon %}<i class="{{ icon }}"></i> {% endif %}{{ text }}</a></li>
  270. {% endmacro %}
  271. {% macro navheader(text, icon="", cls="nav-header") %}
  272. {{ navtext(text, icon, cls) }}
  273. {% endmacro %}
  274. {% macro navdivider() %}
  275. <li class="nav-divider"></li>
  276. {% endmacro %}
  277. {% macro sidebar(items, extra_class="") %}
  278. {% if items %}
  279. <ul class="nav {% if extra_class %}{{ extra_class }}{% endif %}">
  280. {{ sidebaritems(items) }}
  281. </ul>
  282. {% endif %}
  283. {% endmacro %}
  284. {% macro sidebaritems(items) %}
  285. {% for item in items %}
  286. {% if item.content_type == NavigationContentType.link %}
  287. {{ navlink(item.endpoint, item.name, item.icon, item.active, item.urlforkwargs) }}
  288. {% elif item.content_type == NavigationContentType.external_link %}
  289. {{ externalnavlink(item.uri, item.name, item.icon) }}
  290. {% elif item.content_type == NavigationContentType.header %}
  291. {{ navheader(item.text, cls="sidenav-header") }}
  292. {% elif item.content_type == NavigationContentType.divider %}
  293. {{ navdivider() }}
  294. {% else %}
  295. {# skip unknown #}
  296. {% endif %}
  297. {% endfor %}
  298. {% endmacro %}
  299. {% macro tablink_href(endpoint, name, active=False) %}
  300. <li {% if endpoint == request.endpoint or active %}class="active"{% endif %} >
  301. <a href={{ endpoint }} role="tab" data-toggle="tab">{{ name }}</a>
  302. </li>
  303. {% endmacro %}
  304. {% macro render_pagination(page_obj, url, ul_class='', sort_by=None, asc=True) %}
  305. <ul class='{%- if ul_class -%}{{ ul_class }}{%- else -%}pagination{%- endif -%}'>
  306. {% set ordering = 'asc' if asc == True else 'desc' %}
  307. {% set sorting = '&sort_by='+(sort_by|urlencode)+'&order_by='+ordering if sort_by is string else '' %}
  308. <li class="disabled"><a href="#"><span class="pages-label">{% trans %}Pages{% endtrans %}:</span></a></li>
  309. {%- for page in page_obj.iter_pages() %}
  310. {% if page %}
  311. {% if page != page_obj.page %}
  312. <li><a href="{{ url }}?page={{ page }}{{ sorting }}">{{ page }}</a></li>
  313. {% else %}
  314. <li class="active"><a href="#">{{ page }}</a></li>
  315. {% endif %}
  316. {% endif %}
  317. {%- else -%}
  318. <li class="active"><a href="#">1</a></li>
  319. {%- endfor %}
  320. {% if page_obj.has_next %}
  321. <li><a href="{{ url }}?page={{ page_obj.next_num }}{{ sorting }}">&raquo;</a></li>
  322. {% endif %}
  323. </ul>
  324. {% endmacro %}
  325. {% macro render_topic_pagination(page_obj, url) %}
  326. <ul class="pagination pagelink pull-left">
  327. <li class="disabled"><a><span class="pages-label">Pages: </span></a></li>
  328. {%- for page in page_obj.iter_pages() %}
  329. {% if page %}
  330. {% if page != page_obj.page %}
  331. <li><a href="{{ url }}?page={{ page }}">{{ page }}</a></li>
  332. {% else %}
  333. <li class="disabled"><a href="#">{{ page }}</a></li>
  334. {% endif %}
  335. {% endif %}
  336. {%- else -%}
  337. <li class="disabled"><a href="#">1</a></li>
  338. {%- endfor %}
  339. {% if page_obj.has_next %}
  340. <li><a href="{{ url }}?page={{ page_obj.next_num }}">Next</a></li>
  341. {% endif %}
  342. </ul>
  343. {% endmacro %}
  344. {% macro message_pagination(page_obj, url) %}
  345. <ul class='{%- if ul_class -%}{{ ul_class }}{%- else -%}pagination pagination-sm{%- endif -%}'>
  346. {%- for page in page_obj.iter_pages() %}
  347. {% if page %}
  348. {% if page != page_obj.page %}
  349. <li><a href="{{ url }}?page={{ page }}">{{ page }}</a></li>
  350. {% else %}
  351. <li class="active"><a href="#">{{ page }}</a></li>
  352. {% endif %}
  353. {% endif %}
  354. {%- else -%}
  355. <li class="active"><a href="#">1</a></li>
  356. {%- endfor %}
  357. {% if page_obj.has_next %}
  358. <li><a href="{{ url }}?page={{ page_obj.next_num }}">&raquo;</a></li>
  359. {% endif %}
  360. </ul>
  361. {% endmacro %}
  362. {# Generates a some kind of pagination for the posts in topic in the forum view. #}
  363. {%- macro topic_pages(topic_obj, per_page=10) -%}
  364. {% set pages = (topic_obj.post_count / per_page)|round(method='ceil')|int %}
  365. {% set max_pages = 4 %}
  366. {% set page_count = pages if pages <= max_pages else max_pages %}
  367. {%- if pages > 1 -%}
  368. [
  369. {%- for page in range(1, page_count+1) -%}
  370. {% if pages > max_pages and page == max_pages-1 %}
  371. <a href="{{ url_for('forum.view_topic', topic_id=topic_obj.id) }}?page={{ page }}">{{ page }}</a> ...
  372. {% elif pages > max_pages and loop.last %}
  373. <a href="{{ url_for('forum.view_topic', topic_id=topic_obj.id) }}?page={{ pages }}">{{ pages }}</a>
  374. {% else %}
  375. <a href="{{ url_for('forum.view_topic', topic_id=topic_obj.id) }}?page={{ page }}">{{ page }}</a>
  376. {% endif %}
  377. {%- endfor -%}
  378. ]
  379. {%- endif -%}
  380. {%- endmacro -%}
  381. {#
  382. Generates a topic url with an anchor to the post
  383. XXX: Rename to generate_anchor_url to make it universally useful
  384. #}
  385. {%- macro generate_post_url(topic, post, page) -%}
  386. {%- if page > 1 -%}
  387. {{ topic.url }}?page={{ page }}#pid{{ post.id }}
  388. {%- else -%}
  389. {{ topic.url }}#pid{{ post.id }}
  390. {%- endif -%}
  391. {%- endmacro -%}
  392. {#
  393. Generates the pagination object id in a list.
  394. For example, on id should continue with 11 on page 2 if per_page is set to 10
  395. #}
  396. {%- macro generate_obj_id(obj, page, per_page) -%}
  397. {%- if obj.page == 1 -%}
  398. {{ page }}
  399. {%- else -%}
  400. {{ page + (obj.page - 1) * per_page }}
  401. {%- endif -%}
  402. {%- endmacro -%}