investigators.f7.html 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. <template>
  2. <div class="page">
  3. <div class="page no-navbar">
  4. <div class="page-content">
  5. <div class="block-title">{{js "this.type=='reader'?'Readers':'Investigators'"}}</div>
  6. <div class="block block-strong">
  7. <form class="list inline-labels no-hairlines-md" id="form-user" style="margin:0;" autocomplete="off">
  8. <ul>
  9. <li class="item-content item-input" style="border-bottom: 1px solid lightgray">
  10. <div class="item-inner">
  11. <div class="item-title" style="width: 150px;">Select action:</div>
  12. <div class="item-input-wrap">
  13. <select name="userIdx" @change="actionChange">
  14. <option value="-1" data-ID="0">Create new investigator</option>
  15. {{#each users}}
  16. <option value="{{@index}}" data-ID="{{ID}}">Edit {{firstname}} {{lastname}}</option>
  17. {{/each}}
  18. </select>
  19. </div>
  20. </div>
  21. </li>
  22. <div class="block-title" style="font-size: 16px; font-weight: 600;">Organization settings</div>
  23. <li class="item-content item-input" style="border-bottom: 1px solid lightgray">
  24. <div class="item-inner">
  25. <div class="item-title" style="width: 150px;">Center <span style="color:red">*</span></div>
  26. <div class="item-input-wrap">
  27. <select name="centerID" required validate>
  28. {{#each organizations}}
  29. <option value="{{center_ID}}">{{org_name}} / {{probe_name}}</option>
  30. {{/each}}
  31. </select>
  32. </div>
  33. </div>
  34. </li>
  35. <div class="block-title" style="font-size: 16px; font-weight: 600;">Investigator settings</div>
  36. <li class="item-content item-input">
  37. <div class="item-inner">
  38. <div class="item-title" style="width: 150px;">E-mail <span style="color:red">*</span></div>
  39. <div class="item-input-wrap">
  40. <input type="email" name="email" placeholder="E-mail" value="">
  41. </div>
  42. </div>
  43. </li>
  44. <li class="item-content item-input">
  45. <div class="item-inner">
  46. <div class="item-title" style="width: 150px;">Firstname <span style="color:red">*</span></div>
  47. <div class="item-input-wrap">
  48. <input type="text" name="firstname" placeholder="Firstname" value="">
  49. </div>
  50. </div>
  51. </li>
  52. <li class="item-content item-input">
  53. <div class="item-inner">
  54. <div class="item-title" style="width: 150px;">Lastname <span style="color:red">*</span></div>
  55. <div class="item-input-wrap">
  56. <input type="text" name="lastname" placeholder="Lastname" value="">
  57. </div>
  58. </div>
  59. </li>
  60. <li class="item-content item-input">
  61. <div class="item-inner">
  62. <div class="item-title" style="width: 150px;">Phone <span style="color:red">*</span></div>
  63. <div class="item-input-wrap">
  64. <input type="tel" name="phone" placeholder="Phone number" value="">
  65. </div>
  66. </div>
  67. </li>
  68. <li class="item-content item-input" style="border-bottom: 1px solid lightgray;">
  69. <div class="item-inner">
  70. <div class="item-title" style="width: 150px;">Active</div>
  71. <div class="item-input-wrap" style="display:flex; flex-shrink:1;">
  72. <label class="toggle toggle-init">
  73. <input name="active" type="checkbox" checked />
  74. <span class="toggle-icon"></span>
  75. </label>
  76. </div>
  77. </div>
  78. </li>
  79. </ul>
  80. </form>
  81. <div class="row" style="justify-content: center; margin-top:16px;">
  82. <div>
  83. <button class="button button-fill" @click="add">Save</button>
  84. </div>
  85. </div>
  86. </div>
  87. </div>
  88. </div>
  89. </div>
  90. </template>
  91. <script>
  92. export default {
  93. on: {
  94. pageInit: function() {
  95. }
  96. },
  97. methods: {
  98. actionChange: function() {
  99. let idx = $$('select[name="userIdx"]').val();
  100. console.log(idx);
  101. console.log(this);
  102. if(idx==-1) {
  103. $$('#form-user')[0].reset();
  104. $$('input[name="active"]').prop('checked',true);
  105. }
  106. else {
  107. $$('select[name="centerID"]').val(this.users[idx].fk_center);
  108. $$('input[name="email"]').val(this.users[idx].email);
  109. $$('input[name="firstname"]').val(this.users[idx].firstname);
  110. $$('input[name="lastname"]').val(this.users[idx].lastname);
  111. $$('input[name="phone"]').val(this.users[idx].phone);
  112. $$('input[name="active"]').prop('checked',this.users[idx].active==1?true:false);
  113. }
  114. },
  115. add: function() {
  116. let p = app.form.convertToData('#form-user');
  117. if(p.email=='' || p.firstname=='' || p.lastname=='' || p.phone=='') {
  118. app.dialog.alert('Please fill the form.');
  119. }
  120. else if(!global.tools.validateEmail(p.email)) {
  121. app.dialog.alert('Invalid email.');
  122. }
  123. else {
  124. let idx = $$('select[name="userIdx"]').val();
  125. p.active = p.active.length?1:0;
  126. var postData = {
  127. apiKey: '',
  128. userID: idx==-1?0:this.users[idx].ID,
  129. user: p,
  130. type: 'investigator'
  131. };
  132. console.log(postData);
  133. app.preloader.show();
  134. app.request.post(app.data.config.apiBaseURL + '/ct_admin/users/?apiKey=', postData, function (data) {
  135. // Refresh token if needed
  136. app.methods.refreshToken(data);
  137. // Process response
  138. console.log("ct_admin/users", data);
  139. app.preloader.hide();
  140. if (data.result == 'ERROR') {
  141. switch (data.reason) {
  142. case 'denied':
  143. app.methods.signout('Access revoked. Please signin again.');
  144. break;
  145. case 'internal_error':
  146. app.dialog.alert("Internal error.");
  147. break;
  148. }
  149. }
  150. else {
  151. if(parseInt(postData.userID)==0) {
  152. var passwordLink = app.data.config.appBaseURL.replace('cro','www') + '/?password_token=' + data.password_token;
  153. console.log('passwordLink', passwordLink);
  154. // Mail
  155. let message = "Dear "+p.lastname+" "+p.firstname+",<br/><br/>Your INVESTIGATOR account has been created.<br>Please follow the link below in order to choose your password:<br/>##passwordLink<br/><br/>Thank you!";
  156. var data = {
  157. to: p.email,
  158. from: app.data.user.email,
  159. subject: "Account validation",
  160. message: message.replace('##passwordLink', passwordLink),
  161. apiKey: '',
  162. }
  163. app.preloader.show();
  164. app.request.post(app.data.config.apiBaseURL + '/mailer/send/', data, function (data) {
  165. console.log('mailer/send', data);
  166. app.preloader.hide();
  167. if (data.result == 'OK') {
  168. app.dialog.alert("E-mail sent to the new investigator.");
  169. app.views.workspaceView.router.navigate('/investigators/', { reloadCurrent: true, ignoreCache: true });
  170. }
  171. else {
  172. app.dialog.alert("Mail error (" + data.message + ").");
  173. }
  174. }, function (data) {
  175. console.log('error', data);
  176. }, 'json');
  177. }
  178. else {
  179. app.views.workspaceView.router.navigate('/investigators/', { reloadCurrent: true, ignoreCache: true });
  180. }
  181. }
  182. }, function (data) {
  183. console.log('error', data);
  184. app.preloader.hide();
  185. app.dialog.alert("Server unavailable.");
  186. }, 'json');
  187. }
  188. }
  189. }
  190. }
  191. </script>