external-accounts.html 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. {% extends '../layout-growi/base/layout.html' %}
  2. {% block html_title %}{{ customTitle(t('user_management.external_account')) }}{% endblock %}
  3. {% block content_header %}
  4. <div class="header-wrap">
  5. <header id="page-header">
  6. <h1 class="title" id="">{{ t('user_management.external_account') }}</h1>
  7. </header>
  8. </div>
  9. {% endblock %}
  10. {% block content_main %}
  11. <div class="content-main">
  12. <ul class="nav nav-tabs">
  13. <li><a href="/me"><i class="icon-user"></i> {{ t('User Information') }}</a></li>
  14. <li class="active"><a href="/me/external-accounts"><i class="icon-share-alt"></i> {{ t('External Accounts') }}</a></li>
  15. <li><a href="/me/password"><i class="icon-lock"></i> {{ t('Password Settings') }}</a></li>
  16. <li><a href="/me/apiToken"><i class="icon-paper-plane"></i> {{ t('API Settings') }}</a></li>
  17. </ul>
  18. <div class="tab-content">
  19. {% set couldntDisassociateError = req.flash('couldntDisassociateError') %}
  20. {% if couldntDisassociateError != null %}
  21. <div class="alert alert-danger m-t-10">
  22. <b>Couldn't disassociate External Account</b><br>
  23. You have not set a password and have only one External Account.
  24. </div>
  25. {% endif %}
  26. {% set error = req.flash('errorMessage') %}
  27. {% if error.length %}
  28. {% for e in error %}
  29. <div class="alert alert-danger m-t-10">
  30. <b>Server Error occured:</b><br>
  31. {{ e }}
  32. </div>
  33. {% endfor %}
  34. {% endif %}
  35. {% set warn = req.flash('warningMessage') %}
  36. {% if warn.length %}
  37. {% for w in warn %}
  38. <div class="alert alert-warning m-t-10">
  39. {{ w }}
  40. </div>
  41. {% endfor %}
  42. {% endif %}
  43. {% set message = req.flash('successMessage') %}
  44. {% if message.length %}
  45. <div class="alert alert-success m-t-10">
  46. <b>{{ message }}</b>
  47. </div>
  48. {% endif %}
  49. <legend class="m-t-20" style="line-height: 1.7em;">
  50. <button class="btn btn-default btn-sm pull-right" data-target="#create-external-account" data-toggle="modal">
  51. <i class="icon-plus" aria-hidden="true"></i>
  52. Add
  53. </button>
  54. {{ t('External Accounts') }}
  55. </legend>
  56. <div class="row">
  57. <div class="col-md-12">
  58. <table class="table table-bordered table-user-list">
  59. <thead>
  60. <tr>
  61. <th width="120px">Authentication Provider</th>
  62. <th>
  63. <code>accountId</code>
  64. </th>
  65. <th width="200px">{{ t('Created') }}</th>
  66. <th width="150px">{{ t('Admin') }}</th>
  67. </tr>
  68. </thead>
  69. <tbody>
  70. {% for account in externalAccounts %}
  71. <tr>
  72. <td>{{ account.providerType }}</td>
  73. <td>
  74. <strong>{{ account.accountId }}</strong>
  75. </td>
  76. <td>{{ account.createdAt|date('Y-m-d', account.createdAt.getTimezoneOffset()) }}</td>
  77. <td class="text-center">
  78. <button class="btn btn-default btn-sm btn-danger"
  79. data-toggle="modal" data-target="#diassociate-external-account" data-provider-type="{{ account.providerType }}" data-account-id="{{ account.accountId }}">
  80. <i class="ti-unlink"></i>
  81. {{ t('Diassociate') }}
  82. </button>
  83. </td>
  84. </tr>
  85. {% endfor %}
  86. </tbody>
  87. </table>
  88. </div>
  89. </div>
  90. {# modal #}
  91. <style>
  92. .modal.create-external-account .modal-dialog {
  93. width: 750px;
  94. }
  95. </style>
  96. <div class="modal create-external-account" id="create-external-account">
  97. <div class="modal-dialog">
  98. <div class="modal-content">
  99. <div class="modal-header bg-info">
  100. <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
  101. <div class="modal-title">{{ t('Create External Account') }}</div>
  102. </div>
  103. <div class="modal-body">
  104. <ul class="nav nav-tabs passport-settings" role="tablist">
  105. <li class="active">
  106. <a href="#passport-ldap" data-toggle="tab" role="tab"><i class="icon-organization"></i> LDAP</a>
  107. </li>
  108. <li>
  109. <a href="#passport-google-oauth" data-toggle="tab" role="tab"><i class="icon-social-google"></i> Google OAuth</a>
  110. </li>
  111. <li>
  112. <a href="#passport-facebook" data-toggle="tab" role="tab"><i class="icon-social-facebook"></i> Facebook</a>
  113. </li>
  114. <li>
  115. <a href="#passport-twitter" data-toggle="tab" role="tab"><i class="icon-social-twitter"></i> Twitter</a>
  116. </li>
  117. <li>
  118. <a href="#passport-github" data-toggle="tab" role="tab"><i class="icon-social-github"></i> Github</a>
  119. </li>
  120. </ul>
  121. <div class="tab-content passport-settings m-t-15">
  122. <div id="passport-ldap" class="tab-pane active" role="tabpanel" >
  123. <div id="formLdapAssociationContainer">
  124. {% include '../widget/passport/ldap-association-tester.html' %}
  125. <div class="clearfix">
  126. <button type="button" class="btn btn-info pull-right" onclick="associateLdap()">
  127. <i class="fa fa-plus-circle" aria-hidden="true"></i>
  128. {{ t('Add') }}
  129. </button>
  130. </div>
  131. </div>
  132. </div>
  133. <div id="passport-google-oauth" class="tab-pane" role="tabpanel">
  134. (TBD)
  135. </div>
  136. <div id="passport-facebook" class="tab-pane" role="tabpanel">
  137. (TBD)
  138. </div>
  139. <div id="passport-twitter" class="tab-pane" role="tabpanel">
  140. (TBD)
  141. </div>
  142. <div id="passport-github" class="tab-pane" role="tabpanel">
  143. (TBD)
  144. </div>
  145. </div><!-- /.tab-content -->
  146. </div><!-- /.modal-body -->
  147. </div><!-- /.modal-content -->
  148. </div><!-- /.modal-dialog -->
  149. <script>
  150. /**
  151. * associate (submit the form)
  152. */
  153. function associateLdap() {
  154. var $form = $('#formLdapAssociationContainer > form');
  155. var $action = '/me/external-accounts/associateLdap';
  156. $form.attr('action', $action);
  157. $form.submit();
  158. }
  159. </script>
  160. </div><!-- /.modal -->
  161. <div class="modal diassociate-external-account" id="diassociate-external-account">
  162. <div class="modal-dialog">
  163. <div class="modal-content">
  164. <div class="modal-header">
  165. <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
  166. <div class="modal-title">{{ t('Diassociate External Account') }}</div>
  167. </div>
  168. <div class="modal-body">
  169. <div class="row">
  170. <div class="col-md-12">
  171. <p><b>
  172. Are you sure to diassociate the
  173. <span class="diassociate-provider-type"></span> account
  174. <code class="diassociate-account-id"></code>?
  175. </b></p>
  176. </div>
  177. </div>
  178. </div>
  179. <div class="modal-footer">
  180. <form action="/me/external-accounts/disassociate" method="post">
  181. <input type="hidden" name="_csrf" value="{{ csrf() }}">
  182. <input type="hidden" name="providerType">
  183. <input type="hidden" name="accountId">
  184. <button type="button" class="btn btn-sm btn-default" data-dismiss="modal">
  185. {{ t('Cancel') }}
  186. </button>
  187. <button type="submit" class="btn btn-sm btn-danger">
  188. <i class="ti-unlink"></i>
  189. {{ t('Diassociate') }}
  190. </button>
  191. </form>
  192. </div>
  193. </div><!-- /.modal-content -->
  194. </div><!-- /.modal-dialog -->
  195. <script>
  196. $('#diassociate-external-account').on('show.bs.modal', function (event) {
  197. var modal = $(this);
  198. var button = $(event.relatedTarget); // Button that triggered the modal
  199. // get data-*
  200. var providerType = button.data('provider-type');
  201. var accountId = button.data('account-id');
  202. // set labels
  203. modal.find('.diassociate-provider-type').text(providerType);
  204. modal.find('.diassociate-account-id').text(accountId);
  205. // set hidden inputs
  206. modal.find('input:hidden[name="providerType"]').val(providerType);
  207. modal.find('input:hidden[name="accountId"]').val(accountId);
  208. })
  209. </script>
  210. </div><!-- /.modal -->
  211. </div>
  212. {% endblock content_main %}
  213. {% block content_footer %}
  214. {% endblock %}
  215. {% block layout_footer %}
  216. {% endblock %}