external-accounts.html 8.3 KB

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