getone.mak 15KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. <%inherit file="local:templates.master_authenticated_left_treeview_right_toolbar"/>
  2. <%namespace name="TIM" file="tracim.templates.pod"/>
  3. <%namespace name="TOOLBAR" file="tracim.templates.workspace.toolbar"/>
  4. <%namespace name="FORMS" file="tracim.templates.user_workspace_forms"/>
  5. <%namespace name="LEFT_MENU" file="tracim.templates.widgets.left_menu"/>
  6. <%namespace name="WIDGETS" file="tracim.templates.user_workspace_widgets"/>
  7. <%namespace name="BUTTON" file="tracim.templates.widgets.button"/>
  8. <%namespace name="ICON" file="tracim.templates.widgets.icon"/>
  9. <%namespace name="P" file="tracim.templates.widgets.paragraph"/>
  10. <%namespace name="TITLE" file="tracim.templates.widgets.title"/>
  11. <%namespace name="TABLE_ROW" file="tracim.templates.widgets.table_row"/>
  12. <%namespace name="UI" file="tracim.templates.widgets.ui"/>
  13. <%def name="title()">${result.workspace.label}</%def>
  14. <%def name="SIDEBAR_LEFT_CONTENT()">
  15. ${LEFT_MENU.TREEVIEW('sidebar-left-menu', 'workspace_{}__'.format(result.workspace.id))}
  16. </%def>
  17. <%def name="SIDEBAR_RIGHT_CONTENT()">
  18. ## {TOOLBAR.SECURED_FOLDER(fake_api.current_user, result.folder.workspace, result.folder)}
  19. </%def>
  20. <%def name="REQUIRED_DIALOGS()">
  21. ${TIM.MODAL_DIALOG('folder-edit-modal-dialog')}
  22. ${TIM.MODAL_DIALOG('folder-move-modal-dialog')}
  23. ${TIM.MODAL_DIALOG('file-new-modal-dialog')}
  24. ${TIM.MODAL_DIALOG('folder-new-modal-dialog')}
  25. ## TODO-DYNAMIC-CONTENT-HERE
  26. </%def>
  27. ############################################################################
  28. ##
  29. ## PAGE CONTENT BELOW
  30. ##
  31. ############################################################################
  32. <div class="t-page-header-row bg-secondary">
  33. <div class="main">
  34. <h1 class="page-header t-less-visible-border">
  35. <i class="fa fa-fw fa-lg fa-bank t-less-visible"></i>
  36. ${result.workspace.label}
  37. </h1>
  38. <div style="margin: -1.5em auto -1.5em auto;" class="t-less-visible">
  39. <% created_localized = h.get_with_timezone(result.workspace.created) %>
  40. <p>${_('workspace created on {date} at {time}').format(date=h.date(created_localized), time=h.time(created_localized))|n}</p>
  41. </div>
  42. </div>
  43. </div>
  44. <div class="workspace__detail__wrapper">
  45. %if fake_api.last_unread.nb > 0:
  46. <% workspace_id = result.workspace.id %>
  47. <a href="${tg.url('/workspaces/{ws_id}/mark_read'.format(ws_id = workspace_id))}" class="workspace__detail__wrapper__btnTagAsRead btn btn-default">
  48. <i class="fa fa-check-circle-o"></i>
  49. ${_('Mark this workspace as read')}
  50. </a>
  51. %endif
  52. ${TITLE.H3(_('Detail'), 'fa-align-justify', 'workspace-members')}
  53. % if result.workspace.description:
  54. <p>${result.workspace.description}</p>
  55. % else:
  56. <p class="t-less-visible">${_('No description available')}</p>
  57. % endif
  58. <% member_nb = len(result.workspace.members) %>
  59. <% viewable_members = h.get_viewable_members_for_role(fake_api.current_user_workspace_role, result.workspace.members) %>
  60. <% viewable_member_nb = len(viewable_members) %>
  61. % if member_nb<=0:
  62. ${P.EMPTY_CONTENT(_('There are no members in this workspace'))}
  63. % else:
  64. <p>
  65. % if member_nb == 1:
  66. ${_('This workspace has {a_open}one member{a_close}').format(a_open='<a data-toggle="collapse" href="#memberList" aria-expanded="false" aria-controls="memberList">', a_close='</a>')|n}
  67. % else:
  68. ${_('This workspace has {a_open}{member_nb} members{a_close}').format(a_open='<a data-toggle="collapse" href="#memberList" aria-expanded="false" aria-controls="memberList">', member_nb=member_nb, a_close='</a>')|n}
  69. % if viewable_member_nb != member_nb:
  70. <span id="members-whose" style="display: none;">${ _('whose') }:</span>
  71. % endif
  72. % endif
  73. </p>
  74. <div class="collapse" id="memberList">
  75. <table class="table">
  76. % for member in viewable_members:
  77. <tr>
  78. <td><strong>${member.name}</strong></td>
  79. <td>
  80. ${TIM.ICO_FA_BADGED('fa fa-fw fa-flag', member.role_description, member.style)}
  81. ${member.role_description}
  82. </td>
  83. </tr>
  84. % endfor
  85. </table>
  86. </div>
  87. <script>
  88. $(document).ready(function(){
  89. $('#memberList').on('show.bs.collapse', function() {
  90. $('#members-whose').show();
  91. });
  92. $('#memberList').on('hide.bs.collapse', function() {
  93. $('#members-whose').hide();
  94. });
  95. });
  96. </script>
  97. % endif
  98. % if result.workspace.calendar_enabled:
  99. <p>
  100. ${_('This workspace has {a_open}an associated calendar{a_close}').format(a_open='<a data-toggle="collapse" href="#calendarConfig" aria-expanded="false" aria-controls="calendarConfig">', a_close='</a>')|n}
  101. </p>
  102. <div class="collapse" id="calendarConfig">
  103. <p>${_('You can access the calendar using your own software: Outlook, Thunderbird, etc.')}</p>
  104. <p>${_('The url to setup is the following one:')}</p>
  105. <p class="form-control">${result.workspace.calendar_url}</p>
  106. </div>
  107. % endif
  108. <p>
  109. ${_('You can browse the content of this workspace {a_open}in your file explorer (webdav){a_close}').format(a_open='<a data-toggle="collapse" href="#webdavConfig" aria-expanded="false" aria-controls="webdavConfig">', a_close='</a>')|n}
  110. </p>
  111. <div class="collapse" id="webdavConfig">
  112. <div class="row">
  113. <div class="col-md-6">
  114. <div class="input-group">
  115. <span class="input-group-addon" style="width: 8em;"><i class="fa fa-fw fa-windows"></i> Windows</span>
  116. <input class="form-control webdavconfig__input" value="http://${webdav_url}" readonly />
  117. </div>
  118. <p></p>
  119. <div class="input-group">
  120. <span class="input-group-addon" style="width: 8em;"><i class="fa fa-fw fa-linux"></i> Linux</span>
  121. <input class="form-control webdavconfig__input" value="dav://${webdav_url}" readonly />
  122. </div>
  123. </div>
  124. <div class="col-md-6">
  125. <div class="alert alert-warning">
  126. <p>
  127. <i class="fa fa-fw fa-info"></i>
  128. ${_('Tracim implements a <a href="https://fr.wikipedia.org/wiki/WebDAV">webdav interface</a>.')|n}
  129. </p>
  130. <p>${_('You can configure your file explorer to use this interface and browse tracim content through it.')}</p>
  131. </div>
  132. </div>
  133. </div>
  134. </div>
  135. <div class="t-half-spacer-above t-less-visible"></div>
  136. <div class="">
  137. <div class="t-half-spacer-above">
  138. <% user_role = h.user_role(fake_api.current_user, result.workspace) %>
  139. ${TITLE.H3(_('Content'), 'fa-copy', 'workspace-content')}
  140. <div class="col-md-4 col-sx-12">
  141. % if user_role > 1:
  142. <div class="btn-group" role="group">
  143. <button type="button" class="btn btn-success dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
  144. <i class="fa fa-plus"></i> ${_('New ...')}
  145. <span class="caret"></span>
  146. </button>
  147. <ul class="dropdown-menu" role="menu">
  148. % for content_type in result.workspace.allowed_content_types:
  149. % if content_type.id == 'folder' and user_role > 2:
  150. ## Only show 'new folder' to content managers
  151. <%
  152. new_form_content_url = tg.url('/workspaces/{}/folders/new'.format(result.workspace.id), params={'workspace_id': result.workspace.id, 'parent_id': None})
  153. modal_dialog_id = '{content_type}-new-modal-dialog'.format(content_type=content_type.id)
  154. icon_classes = content_type.icon+' '+content_type.color
  155. %>
  156. <li>${BUTTON.DATA_TARGET_AS_TEXT_AND_ICON_MODAL_WITH_REMOTE_CONTENT(modal_dialog_id, content_type.label, new_form_content_url, icon_classes)}</li>
  157. % else:
  158. <li>${BUTTON.DATA_TARGET_AS_TEXT_AND_ICON_MODAL_WITH_REMOTE_CONTENT('', _('You are not allowed to create content'), '', 't-less-visible fa fa-ban')}</li>
  159. ## Show new content entries in the menu is currently not available at root of a workspace
  160. ## TODO - D.A. - 2015-08-20 - Allow to put content at root (and show related entry in the menu
  161. ## % if user_role == 2:
  162. ## ## Only show 'new folder' to content managers
  163. ## <%
  164. ## new_form_content_url = tg.url('/workspaces/{}/folders/{}/{}s/new'.format(result.folder.workspace.id, result.folder.id, content_type.id), params={'workspace_id': result.folder.workspace.id, 'parent_id': result.folder.id})
  165. ## modal_dialog_id = '{content_type}-new-modal-dialog'.format(content_type=content_type.id)
  166. ## icon_classes = content_type.icon+' '+content_type.color
  167. ## %>
  168. ## <li>${BUTTON.DATA_TARGET_AS_TEXT_AND_ICON_MODAL_WITH_REMOTE_CONTENT(modal_dialog_id, content_type.label, new_form_content_url, icon_classes)}</li>
  169. ## % endif
  170. % endif
  171. % endfor
  172. </ul>
  173. </div>
  174. % endif
  175. </div>
  176. <div class="col-md-8 text-right">
  177. <div class="btn-group" role="group" aria-label="...">
  178. ${BUTTON.TEXT('', 'btn btn-default disabled', _('hide...'))}
  179. % for content_type in result.workspace.allowed_content_types:
  180. ${BUTTON.TEXT('toggle-{type}-visibility'.format(type=content_type.id), 'btn btn-default t-active-color disabled-has-priority', content_type.label)}
  181. % endfor
  182. </div>
  183. <p></p>
  184. ${UI.GENERIC_DISPLAY_VIEW_BUTTONS_CONTAINER(tg.url('/workspaces/{}'.format(result.workspace.id)))}
  185. <p></p>
  186. <div class="btn-group pull-right" role="group" aria-label="...">
  187. <input id="filtering" type="text" class="form-control t-bg-grey" placeholder="${_('filter...')}" aria-describedby="basic-addon1">
  188. </div>
  189. </div>
  190. </div>
  191. <div class="t-spacer-above">
  192. % if len(fake_api.sub_items) <= 0:
  193. ${P.EMPTY_CONTENT(_('This folder has not yet content.'))}
  194. % else:
  195. <table class="table table-striped table-hover tablesorter" id="current-workspace-content-list">
  196. <thead>
  197. <tr>
  198. <th>${_('Type')}</th>
  199. <th>${_('Title')}</th>
  200. <th>${_('Status')}</th>
  201. <th>${_('Remarques')}</th>
  202. </tr>
  203. </thead>
  204. <tbody>
  205. % for content in fake_api.sub_items:
  206. ${TABLE_ROW.CONTENT(content)}
  207. % endfor
  208. </tbody>
  209. </table>
  210. % endif
  211. ## % if h.user_role(fake_api.current_user, result.workspace)<=2: # User must be a content manager to be allowed to create folders
  212. ## ${WIDGETS.SECURED_SECTION_TITLE(fake_api.current_user, result.workspace, 'sub-folders', _('Folders'))}
  213. ## % else:
  214. ## ${WIDGETS.SECURED_SECTION_TITLE(fake_api.current_user, result.workspace, 'sub-folders', _('Folders'), 'folder-new', _('Add a folder...'))}
  215. ## {FORMS.NEW_FOLDER_FORM('folder-new', result.workspace.id)}
  216. ## % endif
  217. ##
  218. ## <p>
  219. ## ${WIDGETS.FOLDER_LIST('subfolder-list', result.workspace.id, fake_api.current_workspace_folders)}
  220. ## </p>
  221. ## % if len(fake_api.current_workspace_folders)<=0 and fake_api.current_user:
  222. ## % if h.user_role(fake_api.current_user, result.workspace)>2: # User must be a content manager to be allowed to create folders
  223. ## <p>
  224. ## ${_('You need folders to organize your content.')}
  225. ## <a class="btn btn-small btn-primary" data-toggle="collapse" data-target="#folder-new"><i class="fa fa-check"></i> <b>${_('Create a folder now')}</b></a>
  226. ## </p>
  227. ## % endif
  228. ## % endif
  229. </div>
  230. </div>
  231. </div>
  232. <script>
  233. $(document).ready(function() {
  234. $("#current-workspace-content-list").DataTable({
  235. sDom: '',
  236. pageLength: -1
  237. });
  238. });
  239. $(document).ready(function() {
  240. $("#toggle-file-visibility").click(function() {
  241. $('.t-table-row-file').toggle();
  242. $('#toggle-file-visibility').toggleClass('t-active-color');
  243. $('#toggle-file-visibility').toggleClass('t-inactive-color');
  244. });
  245. $("#toggle-thread-visibility").click(function() {
  246. $('.t-table-row-thread').toggle();
  247. $('#toggle-thread-visibility').toggleClass('t-active-color');
  248. $('#toggle-thread-visibility').toggleClass('t-inactive-color');
  249. });
  250. $("#toggle-folder-visibility").click(function() {
  251. $('.t-table-row-folder').toggle();
  252. $('#toggle-folder-visibility').toggleClass('t-active-color');
  253. $('#toggle-folder-visibility').toggleClass('t-inactive-color');
  254. });
  255. $("#toggle-page-visibility").click(function() {
  256. $('.t-table-row-page').toggle();
  257. $('#toggle-page-visibility').toggleClass('t-active-color');
  258. $('#toggle-page-visibility').toggleClass('t-inactive-color');
  259. });
  260. });
  261. $(document).ready(function() {
  262. $("#filtering").on('keyup click', function() {
  263. $("#current-workspace-content-list").DataTable().search(
  264. $("#filtering").val()
  265. ).draw();
  266. });
  267. });
  268. </script>