lib.html 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. {% import 'admin/static.html' as admin_static with context %}
  2. {# ---------------------- Pager -------------------------- #}
  3. {% macro pager(page, pages, generator) -%}
  4. {% if pages > 1 %}
  5. <ul class="pagination">
  6. {% set min = page - 3 %}
  7. {% set max = page + 3 + 1 %}
  8. {% if min < 0 %}
  9. {% set max = max - min %}
  10. {% endif %}
  11. {% if max >= pages %}
  12. {% set min = min - max + pages %}
  13. {% endif %}
  14. {% if min < 0 %}
  15. {% set min = 0 %}
  16. {% endif %}
  17. {% if max >= pages %}
  18. {% set max = pages %}
  19. {% endif %}
  20. {% if min > 0 %}
  21. <li>
  22. <a href="{{ generator(0) }}">&laquo;</a>
  23. </li>
  24. {% else %}
  25. <li class="disabled">
  26. <a href="javascript:void(0)">&laquo;</a>
  27. </li>
  28. {% endif %}
  29. {% if page > 0 %}
  30. <li>
  31. <a href="{{ generator(page-1) }}">&lt;</a>
  32. </li>
  33. {% else %}
  34. <li class="disabled">
  35. <a href="javascript:void(0)">&lt;</a>
  36. </li>
  37. {% endif %}
  38. {% for p in range(min, max) %}
  39. {% if page == p %}
  40. <li class="active">
  41. <a href="javascript:void(0)">{{ p + 1 }}</a>
  42. </li>
  43. {% else %}
  44. <li>
  45. <a href="{{ generator(p) }}">{{ p + 1 }}</a>
  46. </li>
  47. {% endif %}
  48. {% endfor %}
  49. {% if page + 1 < pages %}
  50. <li>
  51. <a href="{{ generator(page + 1) }}">&gt;</a>
  52. </li>
  53. {% else %}
  54. <li class="disabled">
  55. <a href="javascript:void(0)">&gt;</a>
  56. </li>
  57. {% endif %}
  58. {% if max < pages %}
  59. <li>
  60. <a href="{{ generator(pages - 1) }}">&raquo;</a>
  61. </li>
  62. {% else %}
  63. <li class="disabled">
  64. <a href="javascript:void(0)">&raquo;</a>
  65. </li>
  66. {% endif %}
  67. </ul>
  68. {% endif %}
  69. {%- endmacro %}
  70. {% macro simple_pager(page, have_next, generator) -%}
  71. <ul class="pagination">
  72. {% if page > 0 %}
  73. <li>
  74. <a href="{{ generator(page - 1) }}">&lt;</a>
  75. </li>
  76. {% else %}
  77. <li class="disabled">
  78. <a href="{{ generator(0) }}">&lt;</a>
  79. </li>
  80. {% endif %}
  81. {% if have_next %}
  82. <li>
  83. <a href="{{ generator(page + 1) }}">&gt;</a>
  84. </li>
  85. {% else %}
  86. <li class="disabled">
  87. <a href="{{ generator(page) }}">&gt;</a>
  88. </li>
  89. {% endif %}
  90. </ul>
  91. {%- endmacro %}
  92. {# ---------------------- Modal Window ------------------- #}
  93. {% macro add_modal_window(modal_window_id='fa_modal_window', modal_label_id='fa_modal_label') %}
  94. <div class="modal fade" id="{{ modal_window_id }}" tabindex="-1" role="dialog" aria-labelledby="{{ modal_label_id }}">
  95. <div class="modal-dialog" role="document">
  96. {# bootstrap version > 3.1.0 required for this to work #}
  97. <div class="modal-content">
  98. </div>
  99. </div>
  100. </div>
  101. {% endmacro %}
  102. {% macro add_modal_button(url='', title='', content='', modal_window_id='fa_modal_window', btn_class='icon') %}
  103. <a class="{{ btn_class }}" data-target="#{{ modal_window_id }}" title="{{ title }}" href="{{ url }}" data-toggle="modal">
  104. {{ content|safe }}
  105. </a>
  106. {% endmacro %}
  107. {# ---------------------- Forms -------------------------- #}
  108. {% macro render_field(form, field, kwargs={}, caller=None) %}
  109. {% set direct_error = h.is_field_error(field.errors) %}
  110. <div class="form-group{{ ' has-error' if direct_error else '' }}">
  111. <label for="{{ field.id }}" class="col-md-2 control-label">{{ field.label.text }}
  112. {% if h.is_required_form_field(field) %}
  113. <strong style="color: red">&#42;</strong>
  114. {%- else -%}
  115. &nbsp;
  116. {%- endif %}
  117. </label>
  118. <div class="{{ kwargs.get('column_class', 'col-md-10') }}">
  119. {% set _dummy = kwargs.setdefault('class', 'form-control') %}
  120. {{ field(**kwargs)|safe }}
  121. {% if field.description %}
  122. <p class="help-block">{{ field.description|safe }}</p>
  123. {% endif %}
  124. {% if direct_error %}
  125. <ul class="help-block input-errors">
  126. {% for e in field.errors if e is string %}
  127. <li>{{ e }}</li>
  128. {% endfor %}
  129. </ul>
  130. {% endif %}
  131. </div>
  132. {% if caller %}
  133. {{ caller(form, field, direct_error, kwargs) }}
  134. {% endif %}
  135. </div>
  136. {% endmacro %}
  137. {% macro render_header(form, text) %}
  138. <h3>{{ text }}</h3>
  139. {% endmacro %}
  140. {% macro render_form_fields(form, form_opts=None) %}
  141. {% if form.hidden_tag is defined %}
  142. {{ form.hidden_tag() }}
  143. {% else %}
  144. {% if csrf_token %}
  145. <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
  146. {% endif %}
  147. {% for f in form if f.widget.input_type == 'hidden' %}
  148. {{ f }}
  149. {% endfor %}
  150. {% endif %}
  151. {% if form_opts and form_opts.form_rules %}
  152. {% for r in form_opts.form_rules %}
  153. {{ r(form, form_opts=form_opts) }}
  154. {% endfor %}
  155. {% else %}
  156. {% for f in form if f.widget.input_type != 'hidden' %}
  157. {% if form_opts %}
  158. {% set kwargs = form_opts.widget_args.get(f.short_name, {}) %}
  159. {% else %}
  160. {% set kwargs = {} %}
  161. {% endif %}
  162. {{ render_field(form, f, kwargs) }}
  163. {% endfor %}
  164. {% endif %}
  165. {% endmacro %}
  166. {% macro form_tag(form=None, action=None) %}
  167. <form action="{{ action or '' }}" method="POST" role="form" class="admin-form form-horizontal" enctype="multipart/form-data">
  168. {{ caller() }}
  169. </form>
  170. {% endmacro %}
  171. {% macro render_form_buttons(cancel_url, extra=None, is_modal=False) %}
  172. <hr>
  173. <div class="form-group">
  174. <div class="col-md-offset-2 col-md-10 submit-row">
  175. <input type="submit" class="btn btn-primary" value="{{ _gettext('Save') }}" />
  176. {% if extra %}
  177. {{ extra }}
  178. {% endif %}
  179. {% if cancel_url %}
  180. <a href="{{ cancel_url }}" class="btn btn-danger" role="button" {% if is_modal %}data-dismiss="modal"{% endif %}>{{ _gettext('Cancel') }}</a>
  181. {% endif %}
  182. </div>
  183. </div>
  184. {% endmacro %}
  185. {% macro render_form(form, cancel_url, extra=None, form_opts=None, action=None, is_modal=False) -%}
  186. {% call form_tag(action=action) %}
  187. {{ render_form_fields(form, form_opts=form_opts) }}
  188. {{ render_form_buttons(cancel_url, extra, is_modal) }}
  189. {% endcall %}
  190. {% endmacro %}
  191. {% macro form_css() %}
  192. <link href="{{ admin_static.url(filename='vendor/select2/select2.css', v='3.5.2') }}" rel="stylesheet">
  193. <link href="{{ admin_static.url(filename='vendor/select2/select2-bootstrap3.css', v='1.4.6') }}" rel="stylesheet">
  194. <link href="{{ admin_static.url(filename='vendor/bootstrap-daterangepicker/daterangepicker-bs3.css', v='1.3.22') }}" rel="stylesheet">
  195. {% if config.MAPBOX_MAP_ID %}
  196. <link href="{{ admin_static.url(filename='vendor/leaflet/leaflet.css', v='1.0.0') }}" rel="stylesheet">
  197. <link href="{{ admin_static.url(filename='vendor/leaflet/leaflet.draw.css', v='0.3.2') }}" rel="stylesheet">
  198. {% endif %}
  199. {% if editable_columns %}
  200. <link href="{{ admin_static.url(filename='vendor/x-editable/css/bootstrap3-editable.css', v='1.5.1.1') }}" rel="stylesheet">
  201. {% endif %}
  202. {% endmacro %}
  203. {% macro form_js() %}
  204. {% if config.MAPBOX_MAP_ID %}
  205. <script>
  206. window.MAPBOX_MAP_ID = "{{ config.MAPBOX_MAP_ID }}";
  207. {% if config.MAPBOX_ACCESS_TOKEN %}
  208. window.MAPBOX_ACCESS_TOKEN = "{{ config.MAPBOX_ACCESS_TOKEN }}";
  209. {% endif %}
  210. </script>
  211. <script src="{{ admin_static.url(filename='vendor/leaflet/leaflet.js', v='1.0.0') }}"></script>
  212. <script src="{{ admin_static.url(filename='vendor/leaflet/leaflet.draw.js', v='0.3.2') }}"></script>
  213. {% if config.MAPBOX_SEARCH %}
  214. <script>
  215. window.MAPBOX_SEARCH = "{{ config.MAPBOX_SEARCH }}";
  216. </script>
  217. <script src="https://maps.googleapis.com/maps/api/js?v=3&libraries=places&key={{ config.get('GOOGLE_MAPS_API_KEY') }}"></script>
  218. {% endif %}
  219. {% endif %}
  220. <script src="{{ admin_static.url(filename='vendor/bootstrap-daterangepicker/daterangepicker.js', v='1.3.22') }}"></script>
  221. {% if editable_columns %}
  222. <script src="{{ admin_static.url(filename='vendor/x-editable/js/bootstrap3-editable.min.js', v='1.5.1.1') }}"></script>
  223. {% endif %}
  224. <script src="{{ admin_static.url(filename='admin/js/form.js', v='1.0.1') }}"></script>
  225. {% endmacro %}
  226. {% macro extra() %}
  227. {% if admin_view.can_create %}
  228. <input name="_add_another" type="submit" class="btn btn-default" value="{{ _gettext('Save and Add Another') }}" />
  229. {% endif %}
  230. {% if admin_view.can_edit %}
  231. <input name="_continue_editing" type="submit" class="btn btn-default" value="{{ _gettext('Save and Continue Editing') }}" />
  232. {% endif %}
  233. {% endmacro %}