lib.html 8.4 KB

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