pod.mak 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. <%def name="IconCssClass(psNodeType)" >
  2. % if psNodeType=='data':
  3. fa fa-file-text-o
  4. % elif psNodeType=='folder':
  5. fa fa-folder-open
  6. % elif psNodeType=='node':
  7. fa fa-file-text-o
  8. % elif psNodeType=='file':
  9. fa fa-paperclip
  10. % elif psNodeType=='event':
  11. fa fa-calendar
  12. % elif psNodeType=='contact':
  13. fa fa-user
  14. % elif psNodeType=='comment':
  15. fa fa-comments-o
  16. % endif
  17. </%def>
  18. <%def name="DocumentTypeLabel(psNodeType)" ><%
  19. labels = dict()
  20. labels['data'] = 'document'
  21. labels['folder'] = 'folder'
  22. labels['node'] = 'node'
  23. labels['file'] = 'file'
  24. labels['event'] = 'event'
  25. labels['contact'] = 'contact'
  26. labels['comment'] = 'comment'
  27. return labels[psNodeType]
  28. %></%def>
  29. <%def name="DocumentUrl(piNodeId, psHighlight)" >${tg.url('/document/%i?highlight=%s'%(piNodeId, psHighlight))}</%def>
  30. <%def name="DocumentUrlWithAnchor(piNodeId, psHighlight, psAnchor)" >${tg.url('/document/%i?highlight=%s#%s'%(piNodeId, psHighlight, psAnchor))}</%def>
  31. <%def name="Button(piId, pbWithLabel, psButtonCssClass, psButtonTitle, psButtonIcon, psButtonLabel)" >
  32. <button id='${piId}' type="button" class="${psButtonCssClass}" title="${psButtonTitle}"><i class="${psButtonIcon}"></i>${'' if (pbWithLabel==False) else ' %s'%(psButtonLabel)}</button>
  33. </%def>
  34. <%def name="SaveButton(piId, pbWithLabel=False, psLabel='Save')" >
  35. ## FIXME - Make the default value use _() in order to be translated
  36. ${Button(piId, pbWithLabel, 'btn btn-small btn-success', psLabel, ' icon-g-ok-2 icon-g-white', psLabel)}
  37. </%def>
  38. <%def name="EditButton(piId, pbWithLabel=False)" >
  39. ${Button(piId, pbWithLabel, 'btn btn-small', _('Edit'), 'fa fa-edit', _('Edit'))}
  40. </%def>
  41. <%def name='CancelButton(piId, pbWithLabel=False)'>
  42. ${Button(piId, pbWithLabel, 'btn btn-small', _('Cancel'), 'icon-g-ban', _('Cancel'))}
  43. </%def>
  44. <%def name='AddButton(piId, pbWithLabel=False, psLabel=None, pbIsCallToAction=True)'>
  45. % if pbIsCallToAction:
  46. ${Button(piId, pbWithLabel, 'btn btn-small btn-success', psLabel or _('New'), 'fa fa-plus', psLabel or _('New'))}
  47. % else:
  48. ${Button(piId, pbWithLabel, 'btn btn-small', psLabel or _('New'), 'fa fa-plus', psLabel or _('New'))}
  49. % endif
  50. </%def>
  51. ###
  52. ##
  53. ## GREEN CALL-TO-ACTION BUTTONS IN THE INTERFACE
  54. ##
  55. ##
  56. <%def name="OpenModalButton(psModalAnchor, psLabel)">
  57. <a href="#${psModalAnchor}" role="button" class="btn btn-success btn-small" data-toggle="modal"><i class="fa fa-plus"></i> ${psLabel}</a>
  58. </%def>
  59. <%def name="OpenLinkButton(psModalAnchor, psLabel)">
  60. <a href="#${psModalAnchor}" class="btn btn-success btn-small"><i class="fa fa-plus"></i> ${psLabel}</a>
  61. </%def>
  62. ## END OF GREEN CALL-TO-ACTION BUTTONS
  63. <%def name='Badge(psLabel, psCssClass="")'>
  64. <span class='badge ${psCssClass}'>${psLabel}</span>
  65. </%def>
  66. <%def name='ItemNb(plItemList)'>
  67. % if len(plItemList)>0:
  68. <sup class="pod-item-nb-sup-block"> ${len(plItemList)}</sup>
  69. % endif
  70. </%def>
  71. <%def name='SignUpForm(psCssMinHeight="1em")'>
  72. <div class="span3 offset4">
  73. <form class="well" method="POST" style="min-height: ${psCssMinHeight};" action="${tg.url('/public_api/create_account')}">
  74. <fieldset>
  75. <legend>${_('Create an account')}</legend>
  76. <input type="text" name="real_name" id="real_name" placeholder="Name"><br/>
  77. <input type="text" name="email" id="email" placeholder="Email"><br/>
  78. <input type="password" name="password" id="password" placeholder="Password"><br/>
  79. <input type="password" name="retyped_password" id="retyped_password" placeholder="Retype your password"><br/>
  80. <input type="submit" id="submit" value="Create account" class="btn btn-success" style="width: 95%;"/><br/>
  81. </fieldset>
  82. </form>
  83. </div>
  84. </%def>
  85. <%def name='RichTextEditorToolbar(psRichTextEditorNodeId, psMenuOptions="styles|boldanditalic|lists|justifiers|links|images|undoredo|fullscreen")'>
  86. <div class="btn-toolbar" data-role="${psRichTextEditorNodeId}-toolbar" data-target="${psRichTextEditorNodeId}">
  87. % if psMenuOptions.find('styles')>=0:
  88. <div class="btn-group">
  89. <a class="btn dropdown-toggle" data-toggle="dropdown" href="#">
  90. <i class="fa fa-font"></i>
  91. <span class="caret"></span>
  92. </a>
  93. <ul class="dropdown-menu">
  94. <!-- dropdown menu links -->
  95. <li><a data-edit="formatBlock p" title="Normal paragraph"><p style="margin: 0">text body</p></a></li>
  96. <li><a data-edit="formatBlock pre" title="Fixed width (code)"><pre style="margin: 0">quote</pre></a></li>
  97. <li><a data-edit="formatBlock h1" title="Title - level 1"><h1 style="margin: 0">heading 1</h1></a></li>
  98. <li><a data-edit="formatBlock h2" title="Title - level 2"><h2 style="margin: 0">heading 2</h2></a></li>
  99. <li><a data-edit="formatBlock h3" title="Title - level 3"><h3 style="margin: 0">heading 3</h3></a></li>
  100. <li><a data-edit="formatBlock h4" title="Title - level 4"><h4 style="margin: 0">heading 4</h4></a></li>
  101. <li><a data-edit="formatBlock h5" title="Title - level 5"><h5 style="margin: 0">heading 5</h5></a></li>
  102. <li><a data-edit="formatBlock h6" title="Title - level 6"><h6 style="margin: 0">heading 6</h6></a></li>
  103. </ul>
  104. </div>
  105. % endif
  106. % if psMenuOptions.find('boldanditalic')>=0:
  107. <div class="btn-group">
  108. <a class="btn" data-edit="bold" title="Bold (Ctrl/Cmd+B)"><i class="fa fa-bold"></i></a>
  109. <a class="btn" data-edit="italic" title="Italic (Ctrl/Cmd+I)"><i class="fa fa-italic"></i></a>
  110. <a class="btn" data-edit="strikethrough" title="Strikethrough"><i class="fa fa-strikethrough"></i></a>
  111. <a class="btn" data-edit="underline" title="Underline (Ctrl/Cmd+U)"><i class="fa fa-underline"></i></a>
  112. </div>
  113. % endif
  114. % if psMenuOptions.find('lists')>=0:
  115. <div class="btn-group">
  116. <a class="btn" data-edit="insertunorderedlist" title="Bullet list"><i class="fa fa-list-ul"></i></a>
  117. <a class="btn" data-edit="insertorderedlist" title="Number list"><i class="fa fa-list-ol"></i></a>
  118. <a class="btn" data-edit="outdent" title="Reduce indent (Shift+Tab)"><i class="fa fa-outdent"></i></a>
  119. <a class="btn" data-edit="indent" title="Indent (Tab)"><i class="fa fa-indent"></i></a>
  120. </div>
  121. % endif
  122. % if psMenuOptions.find('justifiers')>=0:
  123. <div class="btn-group">
  124. <a class="btn" data-edit="justifyleft" title="Align Left (Ctrl/Cmd+L)"><i class="fa fa-align-left"></i></a>
  125. <a class="btn" data-edit="justifycenter" title="Center (Ctrl/Cmd+E)"><i class="fa fa-align-center"></i></a>
  126. <a class="btn" data-edit="justifyright" title="Align Right (Ctrl/Cmd+R)"><i class="fa fa-align-right"></i></a>
  127. <a class="btn" data-edit="justifyfull" title="Justify (Ctrl/Cmd+J)"><i class="fa fa-align-justify"></i></a>
  128. </div>
  129. % endif
  130. #######
  131. ##
  132. ## LINK MENU ; NOT WORKING FOR NOW (links are auto-generated at render time)
  133. ##
  134. ## % if psMenuOptions.find('links')>=0:
  135. ## <div class="btn-group">
  136. ## <a class="btn dropdown-toggle" data-toggle="dropdown" title="Hyperlink"><i class="fa fa-link"></i></a>
  137. ## <div class="dropdown-menu input-append">
  138. ## <input class="span2" placeholder="URL" type="text" data-edit="createLink"/>
  139. ## <button class="btn" type="button">Add</button>
  140. ## </div>
  141. ## <a class="btn" data-edit="unlink" title="Remove Hyperlink"><i class="fa fa-cut"></i></a>
  142. ## </div>
  143. ## % endif
  144. #######
  145. ##
  146. ## IMAGES MENU ; NOT WORKING FOR NOW
  147. ##
  148. ## % if psMenuOptions.find('images')>=0:
  149. ## <div class="btn-group">
  150. ## <a class="btn" title="Insert picture (or just drag & drop)" id="pictureBtn"><i class="fa fa-picture-o"></i></a>
  151. ## <input type="file" data-role="magic-overlay" data-target="#pictureBtn" data-edit="insertImage" />
  152. ## </div>
  153. ## % endif
  154. % if psMenuOptions.find('undoredo')>=0:
  155. <div class="btn-group">
  156. <a class="btn" data-edit="undo" title="Undo (Ctrl/Cmd+Z)"><i class="fa fa-undo"></i></a>
  157. <a class="btn" data-edit="redo" title="Redo (Ctrl/Cmd+Y)"><i class="fa fa-repeat"></i></a>
  158. </div>
  159. % endif
  160. % if psMenuOptions.find('fullscreen')>=0:
  161. <div class="btn-group">
  162. <a class="btn btn-success pod-toggle-full-screen-button"
  163. title="Toggle fullscreen"
  164. onclick="toggleFullScreen('#${psRichTextEditorNodeId}-widget', '#${psRichTextEditorNodeId}-widget-inner')"
  165. >
  166. ## TODO - D.A. - 2013-11-13 - Use jQuery instead of static JS call
  167. ## >The previous button "onclick" should be replaced by a jquery dynamic link finding parent node with the right id
  168. <i class="fa fa-expand"></i>
  169. </a>
  170. </div>
  171. % endif
  172. ##
  173. ## FIXME - D.A. - 2013-11-15 - FIX THIS
  174. ## The voiceBtn button input field is visible in case we add the rich text editor multiple times in the same page
  175. ## This is probably due to the use of #voiceBtn id (which should be unique... and which is not)
  176. ## This fix will be required for mobile phone compatible user interface
  177. ## See bug #13 - https://bitbucket.org/lebouquetin/pod/issue/13/voicebtn-input-widget-shown-in-meta-data
  178. ## <input type="text" data-edit="inserttext" id="voiceBtn" x-webkit-speech="">
  179. </div>
  180. </%def>
  181. <%def name='RichTextEditor(psRichTextEditorNodeId, psRichTextEditorContent="", psMenuOptions="styles|boldanditalic|lists|justifiers|links|images|undoredo|fullscreen")'>
  182. <div id="${psRichTextEditorNodeId}-widget" class="rich-text-editor-widget">
  183. ${RichTextEditorToolbar(psRichTextEditorNodeId, psMenuOptions)}
  184. <div id="${psRichTextEditorNodeId}-widget-inner" class="rich-text-editor-widget-inner">
  185. <div id="${psRichTextEditorNodeId}-alert-container"></div>
  186. <div id="${psRichTextEditorNodeId}" class="pod-rich-text-zone pod-input-like-shadow">
  187. ${psRichTextEditorContent|n}
  188. </div>
  189. </div>
  190. <script>
  191. ##########################
  192. ##
  193. ## Initializes the rich text editor widget with toolbar
  194. ##
  195. $(document).ready(function() {
  196. initToolbarBootstrapBindings('#${psRichTextEditorNodeId}');
  197. $('#${psRichTextEditorNodeId}').wysiwyg({
  198. ## FIXME - 2013-11-13 - D.A.
  199. ## The selector is now based on the id of the toolbar div
  200. ## according to the following bug report:
  201. ## https://github.com/mindmup/bootstrap-wysiwyg/issues/52
  202. ## // toolbarSelector: '#${psRichTextEditorNodeId} [data-role=editor-toolbar]',
  203. toolbarSelector: '[data-role=${psRichTextEditorNodeId}-toolbar]',
  204. fileUploadError: showErrorAlert
  205. });
  206. window.prettyPrint && prettyPrint();
  207. });
  208. </script>
  209. </div>
  210. </%def>
  211. <%def name="AddDocumentModalFormId(poNode)">add-document-modal-form-${poNode.node_id if poNode!=None else ''}</%def>